aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>2013-05-07 12:39:32 +0000
committerWilliam Schmidt <wschmidt@gcc.gnu.org>2013-05-07 12:39:32 +0000
commit291058682249995a72221087db43fe83f005556b (patch)
tree1d0bbc4d547189a109687e1d69c9430c4fbf958b /gcc
parent4095f9fa677f86c2471eb841c45a228ed2297888 (diff)
downloadgcc-291058682249995a72221087db43fe83f005556b.zip
gcc-291058682249995a72221087db43fe83f005556b.tar.gz
gcc-291058682249995a72221087db43fe83f005556b.tar.bz2
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...
2013-05-07 Bill Schmidt <wschmidt@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. From-SVN: r198678
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimple-ssa-strength-reduction.c22
2 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 44a6008..533f934 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-05-07 Bill Schmidt <wschmidt@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.
+
2013-05-07 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
* config/aarch64/aarch64.md
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index 01e35dc..02eae2d 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -413,15 +413,31 @@ cand_chain_hasher::equal (const value_type *chain1, const compare_type *chain2)
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;
+
+ /* If we've commuted the operands (so "y + z" is represented as
+ "z + (1 * y)"), we don't have the pattern we're looking for.
+ Bail out to avoid doing a wrong replacement downstream. */
+ 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 +581,7 @@ alloc_cand_and_find_basis (enum cand_kind kind, gimple gs, tree base,
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);