On 12/7/07, Alexander Monakov <[EMAIL PROTECTED]> wrote: > Hi. > > Attached is the patch that allows to save dependence info obtained on tree > level by data-reference analysis for usage on RTL level (for RTL memory > disambiguation and dependence graph construction for modulo scheduling). > It helps for RTL disambiguation on platforms without base+offset memory > addressing modes, and impact on SMS is described below. We would like to > see it in 4.4 mainline. > > We have tested this patch with modulo scheduling on ia64, using SPEC > CPU2000 benchmark suite. It allows to apply software pipelining to more > loops, resulting in ~1-2% speedup (compared to SMS without exported > info). The most frequent improvements are removal of cross-iteration > memory dependencies, as currently SMS adds such dependencies for all pair > of memory references, even in cases when they cannot alias (for example, > for different arrays or different fields of a struct). As I understand, > SMS does not use RTL alias analysis here because pairs that do not alias > within one iteration, but may alias when cross-iteration movement is > performed (like a[i] and a[i+1]), should be marked as dependent. So, SMS > data dependence analysis can be greatly improved even without > data-dependence export patch by using RTL-like memory disambiguation, but > without pointer arithmetic analysis. > > There are currently two miscompiled SPEC tests with this patch; in one of > them, the problem is related to generation of register moves in the > prologue of software pipelined loop (which was not pipelined without the > patch). The problem is reported and discussed with Revital Eres from IBM > Haifa. > > We would like to ask people interested in SMS performance on PowerPC and > Cell SPU to conduct tests with this patch. Any feedback is greatly > appreciated. >
I see a few random unrelated changes, like, for example: if (may_eliminate_iv (data, use, cand, &bound)) - { - elim_cost = force_var_cost (data, bound, &depends_on_elim); - /* The bound is a loop invariant, so it will be only computed - once. */ - elim_cost /= AVG_LOOP_NITER (data->current_loop); - } + elim_cost = force_var_cost (data, bound, &depends_on_elim); else elim_cost = INFTY; Please pull these out into separate patches or don't do them :) also, i see + /* We do not use operand_equal_p for ORIG_EXPRs because we need to + distinguish memory references at different points of the loop (which + would have different indices in SSA form, like a[i_1] and a[i_2], but + were later rewritten to same a[i]). */ + && (p->orig_expr == q->orig_expr)); This doesn't do enough to distinguish memory references at different points of the loop, while also eliminating from consideration that *are* the same. What if they are regular old VAR_DECL? This will still return true, but they may be different accesses at different points in the loop. In any case, this doesn't belong in mem_attrs_htab_eq, because if they are operand_equal_p, for purposes of memory attributes, they *are* equal. They may still be different accesses, which is something you have to discover later on. IE You should be doing this check somewhere else, not in a hashtable equality function :) DDR will mark them as data refs > Thanks. > > -- > Alexander Monakov >