This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR45297: handle ADDR_EXPR in interpret_rhs_expr as in follow_ssa_edge_expr.


Hi,

This fixes the compilation of the testcase of PR45297 on 32-bit
machines: the ICE occurs because we rewrite out-of-SSA a phi node for
which scev manages to analyze: in this code

<bb 3>:
  q_5 = &MEM[(void *)q_1 + 4294967288B];

<bb 4>:
  # q_1 = PHI <q_3(2), q_5(3)>
  if (q_1 != p_2(D))
    goto <bb 3>;
  else
    goto <bb 5>;

scev analysis is able to determine that q1 = {q_3, +, -8}_1 and in the
same time, scev fails to analyze q5.  And that triggers a rewrite of
q_5 out of SSA making the scev analysis of q1 impossible in the code
generator.

I am testing this patch on amd64-linux, ok for trunk after test?

Thanks,
Sebastian

2010-12-01  Sebastian Pop  <sebastian.pop@amd.com>

	PR middle-end/45297
	* tree-scalar-evolution.c (interpret_rhs_expr): Handle ADDR_EXPR
	with MEM_REFs as POINTER_PLUS_EXPR.
---
 gcc/ChangeLog               |    6 ++++++
 gcc/tree-scalar-evolution.c |   21 ++++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c9e7072..d38bc01 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
 2010-12-01  Sebastian Pop  <sebastian.pop@amd.com>
 
+	PR middle-end/45297
+	* tree-scalar-evolution.c (interpret_rhs_expr): Handle ADDR_EXPR
+	with MEM_REFs as POINTER_PLUS_EXPR.
+
+2010-12-01  Sebastian Pop  <sebastian.pop@amd.com>
+
 	* graphite-sese-to-poly.c (analyze_drs_in_stmts): Fix set but
 	unused warning.
 	(rewrite_cross_bb_scalar_deps_out_of_ssa): Same.
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 8a5797e..b65e295 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -1698,7 +1698,7 @@ static tree
 interpret_rhs_expr (struct loop *loop, gimple at_stmt,
 		    tree type, tree rhs1, enum tree_code code, tree rhs2)
 {
-  tree res, chrec1, chrec2;
+  tree res, chrec1, chrec2, expr;
 
   if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
     {
@@ -1715,12 +1715,27 @@ interpret_rhs_expr (struct loop *loop, gimple at_stmt,
 	  return chrec_convert (type, analyze_scalar_evolution (loop, rhs1),
 				at_stmt);
 	}
-
-      return chrec_dont_know;
     }
 
   switch (code)
     {
+    case ADDR_EXPR:
+      /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR.  */
+      if (TREE_CODE (TREE_OPERAND (rhs1, 0)) != MEM_REF)
+	{
+	  res = chrec_dont_know;
+	  break;
+	}
+
+      expr = TREE_OPERAND (rhs1, 0);
+      rhs1 = TREE_OPERAND (expr, 0);
+      rhs2 = TREE_OPERAND (expr, 1);
+      type = TREE_TYPE (rhs1);
+      STRIP_USELESS_TYPE_CONVERSION (rhs1);
+      STRIP_USELESS_TYPE_CONVERSION (rhs2);
+
+      /* Fall through.  */
+
     case POINTER_PLUS_EXPR:
       chrec1 = analyze_scalar_evolution (loop, rhs1);
       chrec2 = analyze_scalar_evolution (loop, rhs2);
-- 
1.7.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]