On Thu, Mar 17, 2011 at 12:54:44PM -0700, Richard Henderson wrote: > On 03/17/2011 11:46 AM, Jakub Jelinek wrote: > > - result = gen_rtx_PLUS (tmode, result, tmp); > > + { > > + if (swap_commutative_operands_p (result, tmp)) > > + result = gen_rtx_PLUS (tmode, tmp, result); > > + else > > + result = gen_rtx_PLUS (tmode, result, tmp); > > Hum. What about simplify_gen_binary (PLUS, tmode, result, tmp) > which will also do the swap?
You're right, that will magically handle even the hypothetical case when both result and tmp will be constants and handles even better this exact case (where result is (const_int 0) ). The following fixes the testcase in cross to hppa-* as well. I'll bootstrap/regtest it momentarily, ok if it passes? 2011-03-17 Richard Henderson <r...@redhat.com> Jakub Jelinek <ja...@redhat.com> PR bootstrap/48161 * expr.c (expand_expr_addr_expr_1): Use simplify_gen_binary instead of gen_rtx_PLUS if EXPAND_SUM or EXPAND_INITIALIZER. * gcc.c-torture/compile/pr48161.c: New test. --- gcc/expr.c.jj 2011-03-14 14:12:15.000000000 +0100 +++ gcc/expr.c 2011-03-17 16:49:01.000000000 +0100 @@ -6971,7 +6971,7 @@ expand_expr_addr_expr_1 (tree exp, rtx t tmp = convert_memory_address_addr_space (tmode, tmp, as); if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER) - result = gen_rtx_PLUS (tmode, result, tmp); + result = simplify_gen_binary (PLUS, tmode, result, tmp); else { subtarget = bitpos ? NULL_RTX : target; --- gcc/testsuite/gcc.c-torture/compile/pr48161.c.jj 2011-03-09 16:32:56.855000001 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr48161.c 2011-03-17 17:20:34.000000000 +0100 @@ -0,0 +1,24 @@ +/* PR bootstrap/48161 */ + +struct T { int u; }; +struct G { int l; int t; int r; }; +struct V { struct G v[10]; }; +struct { struct V b; } *h; +void bar (void); + +struct G * +baz (struct V *x, unsigned y) +{ + return &x->v[y]; +} + +int +foo (struct T *x, struct T *y) +{ + if ((baz (&h->b, y->u)->t ? baz (&h->b, y->u)->t : 0) + - baz (h ? &h->b : 0, x->u)->r + - (baz (h ? &h->b : 0, x->u)->t > 0 ? 5 : 0)) + return 1; + bar (); + return 0; +} Jakub