aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2012-11-20 18:28:09 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2012-11-20 18:28:09 +0000
commit7139194bf9ee6158e94d4ddfb47dcfcdb338eae4 (patch)
tree68389f4eeee19e630e626e651160bf036340c454
parent7100b5616c1998a115ad2b398a61c6daed5b3b88 (diff)
downloadgcc-7139194bf9ee6158e94d4ddfb47dcfcdb338eae4.zip
gcc-7139194bf9ee6158e94d4ddfb47dcfcdb338eae4.tar.gz
gcc-7139194bf9ee6158e94d4ddfb47dcfcdb338eae4.tar.bz2
re PR tree-optimization/55350 (verify_gimple failed with invalid (pointer) operands to plus/minus)
PR tree-optimization/55350 * gimple-ssa-strength-reduction.c (replace_dependent): Handle POINTER_{PLUS,MINUS}_EXPR correctly. From-SVN: r193672
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimple-ssa-strength-reduction.c15
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr55350.c8
3 files changed, 26 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cc6441c..09ab535 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-11-20 Aldy Hernandez <aldyh@redhat.com>
+
+ PR tree-optimization/55350
+ * gimple-ssa-strength-reduction.c (replace_dependent): Handle
+ POINTER_PLUS_EXPR correctly.
+
2012-11-20 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (fix_trunc<MODEF:mode><SWI48:mode>_sse): Macroize
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index 8e2a247..65fc6b1 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -1643,10 +1643,19 @@ replace_dependent (slsr_cand_t c, enum tree_code cand_code)
basis = lookup_cand (c->basis);
basis_name = gimple_assign_lhs (basis->cand_stmt);
- incr_type = TREE_TYPE (gimple_assign_rhs1 (c->cand_stmt));
- code = PLUS_EXPR;
+ if (cand_code == POINTER_PLUS_EXPR)
+ {
+ incr_type = sizetype;
+ code = cand_code;
+ }
+ else
+ {
+ incr_type = TREE_TYPE (gimple_assign_rhs1 (c->cand_stmt));
+ code = PLUS_EXPR;
+ }
- if (bump.is_negative ())
+ if (bump.is_negative ()
+ && cand_code != POINTER_PLUS_EXPR)
{
code = MINUS_EXPR;
bump = -bump;
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr55350.c b/gcc/testsuite/gcc.c-torture/compile/pr55350.c
new file mode 100644
index 0000000..f10daea
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr55350.c
@@ -0,0 +1,8 @@
+void
+foo (__INTPTR_TYPE__ x, __INTPTR_TYPE__ y)
+{
+ int i;
+ void **a = (void *) (8UL * (x / 8UL));
+ for (i = 0; i < x; i++)
+ a[i] = (void *) y;
+}