From 7139194bf9ee6158e94d4ddfb47dcfcdb338eae4 Mon Sep 17 00:00:00 2001
From: Aldy Hernandez <aldyh@redhat.com>
Date: Tue, 20 Nov 2012 18:28:09 +0000
Subject: [PATCH] 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
---
 gcc/ChangeLog                                 |  6 ++++++
 gcc/gimple-ssa-strength-reduction.c           | 15 ++++++++++++---
 gcc/testsuite/gcc.c-torture/compile/pr55350.c |  8 ++++++++
 3 files changed, 26 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr55350.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cc6441c657bd..09ab535d6a69 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 8e2a24758ddc..65fc6b148593 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 000000000000..f10daeae5020
--- /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;
+}
-- 
GitLab