------- Comment #51 from bergner at gcc dot gnu dot org 2008-04-08 18:50 ------- Ok, I dug into this a little deeper. For the following test case:
int array[1024]; void clear_table (unsigned int n) { unsigned int i; for (i = 0; i < n; i++) array[i] = 0; } compiling this with -O1 (it's ok with -O2 or above) on powerpc{,64}-linux, during expand, we call swap_commutative_operands_p with a SYMBOL_REF and a REG which currently prefers the REG first. Later, break_out_memory_refs forces the SYMBOL_REF into a register (with the REG_POINTER attribute set), but we're already done swapping, so we get the wrong operand ordering. Paolo, I wonder if this patch instead of the rtlanal.c hunk might be better. It does fix my problem: Index: explow.c =================================================================== --- explow.c (revision 134095) +++ explow.c (working copy) @@ -305,7 +305,7 @@ break_out_memory_refs (rtx x) rtx op1 = break_out_memory_refs (XEXP (x, 1)); if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) - x = gen_rtx_fmt_ee (GET_CODE (x), Pmode, op0, op1); + x = simplify_gen_binary (GET_CODE (x), Pmode, op0, op1); } return x; -- bergner at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Resolution|FIXED | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28690