This fixes the following bug: On Mon, 2013-05-06 at 21:25 +0200, Jakub Jelinek wrote: > On Sun, May 05, 2013 at 03:45:17PM -0500, Bill Schmidt wrote: > > 2013-05-05 Bill Schmidt <wschm...@linux.vnet.ibm.com> > > > > * gimple-ssa-strength-reduction.c (slsr_process_phi): Re-enable. > > (find_candidates_in_block): Re-enable slsr_process_phi. > > (create_phi_basis): Fix double counting of candidate adjustment. > > This broke gcc.dg/pr33017.c testcase on i?86/x86_64 -m32. > ./cc1 -O2 -ftree-vectorize -m32 -mno-sse pr33017.c > difference between r19862{6,7} is: > --- pr33017.s1 2013-05-06 21:22:03.786745422 +0200 > +++ pr33017.s2 2013-05-06 21:22:16.844673015 +0200 > @@ -32,9 +32,9 @@ foo: > movb $87, var.1373+2(%eax) > je .L10 > cmpl $3, %edx > - movb $87, var.1373+3(%eax) > + movb $87, var.1373+2(%eax,%eax) > jne .L11 > - movb $87, var.1373+4(%eax) > + movb $87, var.1373+2(%eax,%eax,2) > movl $3, %ebp > movl $61, 28(%esp) > .L3: > > Jakub >
The pattern we seek for replacing a conditional candidate can be confused when a CAND_ADD with an index of 1 has its operands commuted in the analysis. (For x = y + z, we may record two CAND_ADDs, one for either ordering of the addends.) For a candidate with reversed addends in the analysis, don't attempt to find a hidden basis. Otherwise we make an invalid replacement later on. Verified this fixes the reported bug. Bootstrapped and tested on powerpc64-unknown-linux-gnu with no new regressions. Ok for trunk? Thanks, Bill 2013-05-06 Bill Schmidt <wschm...@linux.vnet.ibm.com> * gimple-ssa-strength-reduction.c (find_phi_def): Don't record a phi def as possibly hiding a basis for a CAND_ADD whose operands have been commuted in the analysis. (alloc_cand_and_find_basis): Add parms to call to find_phi_def. Index: gcc/gimple-ssa-strength-reduction.c =================================================================== --- gcc/gimple-ssa-strength-reduction.c (revision 198627) +++ gcc/gimple-ssa-strength-reduction.c (working copy) @@ -413,15 +413,29 @@ cand_chain_hasher::equal (const value_type *chain1 static hash_table <cand_chain_hasher> base_cand_map; /* Look in the candidate table for a CAND_PHI that defines BASE and - return it if found; otherwise return NULL. */ + return it if found; otherwise return NULL. GS is the candidate + statement with BASE, INDEX, and STRIDE. If GS is a CAND_ADD with + an index of 1 and an SSA name for STRIDE, we must be careful that + we haven't commuted the operands for this candidate. STRIDE must + correspond to the second addend of GS for the eventual transformation + to be legal. If not, return NULL. */ static cand_idx -find_phi_def (tree base) +find_phi_def (gimple gs, enum cand_kind kind, tree base, + double_int index, tree stride) { slsr_cand_t c; if (TREE_CODE (base) != SSA_NAME) return 0; + + /* Check for commutativity condition. */ + if (kind == CAND_ADD + && index.is_one () + && TREE_CODE (stride) == SSA_NAME + && gimple_assign_rhs_code (gs) == PLUS_EXPR + && stride != gimple_assign_rhs2 (gs)) + return 0; c = base_cand_from_table (base); @@ -565,7 +579,7 @@ alloc_cand_and_find_basis (enum cand_kind kind, gi c->next_interp = 0; c->dependent = 0; c->sibling = 0; - c->def_phi = find_phi_def (base); + c->def_phi = find_phi_def (gs, kind, base, index, stride); c->dead_savings = savings; cand_vec.safe_push (c);