]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix PR45297: handle ADDR_EXPR in interpret_rhs_expr as in follow_ssa_edge_expr.
authorSebastian Pop <sebastian.pop@amd.com>
Thu, 2 Dec 2010 20:13:11 +0000 (20:13 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Thu, 2 Dec 2010 20:13:11 +0000 (20:13 +0000)
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.

From-SVN: r167390

gcc/ChangeLog
gcc/tree-scalar-evolution.c

index 5dd3477562d6c748c5294ff0e801218a253fcab6..ec354d6c6f3babf5ab81137dbfd997267ad2794c 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-02  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-02  Joseph Myers  <joseph@codesourcery.com>
 
        * config/i386/linux.h, config/m32r/linux.h, config/m68k/linux.h,
index 8a5797eb827f4a8f606cd850c0597c351f6bf4e3..4a4bda9d9257c29709eb3e21c0cc7e36ec3652a1 100644 (file)
@@ -1715,12 +1715,22 @@ 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;
+       }
+
+      rhs2 = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1);
+      rhs1 = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0);
+      /* Fall through.  */
+
     case POINTER_PLUS_EXPR:
       chrec1 = analyze_scalar_evolution (loop, rhs1);
       chrec2 = analyze_scalar_evolution (loop, rhs2);