re PR tree-optimization/48134 (ICE: in refs_may_alias_p_1, at tree-ssa-alias.c:1085...
authorRichard Guenther <rguenther@suse.de>
Thu, 17 Mar 2011 14:59:00 +0000 (14:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Mar 2011 14:59:00 +0000 (14:59 +0000)
2011-03-17  Richard Guenther  <rguenther@suse.de>

PR middle-end/48134
* tree-ssa.c (insert_debug_temp_for_var_def): If we propagated
a value make sure to fold the statement.

* gcc.dg/pr48134.c: New testcase.

From-SVN: r171098

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr48134.c [new file with mode: 0644]
gcc/tree-ssa.c

index bc80f7ab8fb0f246fba169173bf650b8223aa0eb..298815dc35319902ccb762264d43ca2e2942add3 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-17  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/48134
+       * tree-ssa.c (insert_debug_temp_for_var_def): If we propagated
+       a value make sure to fold the statement.
+
 2011-03-17  Chung-Lin Tang  <cltang@codesourcery.com>
 
        PR target/43872
index a7d874981d3ce293aa91b2381db6d61ffd376426..20ba8d6a6a129c81b296fb67b59a46428c7350a1 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-17  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/48134
+       * gcc.dg/pr48134.c: New testcase.
+
 2011-03-17  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/48165
diff --git a/gcc/testsuite/gcc.dg/pr48134.c b/gcc/testsuite/gcc.dg/pr48134.c
new file mode 100644 (file)
index 0000000..8dc5a6d
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fstack-check=specific -fno-tree-dse -fno-tree-fre -fno-tree-loop-optimize -g" } */
+
+struct S
+{
+  int w, z;
+};
+struct T
+{
+  struct S s;
+};
+
+int i;
+
+static inline struct S
+bar (struct S x)
+{
+  i++;
+  return x;
+}
+
+int
+foo (struct T t, struct S s)
+{
+  struct S *c = &s;
+  if (i)
+    c = &t.s;
+  t.s.w = 3;
+  s = bar (*c);
+  return t.s.w;
+}
index e7e3edcf6f1f9db85b751671427b5898c7cb84a3..d542e0a253a1c2ed5e21ab760bb4d53f0d100113 100644 (file)
@@ -455,13 +455,19 @@ insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
        continue;
 
       if (value)
-       FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
-         /* unshare_expr is not needed here.  vexpr is either a
-            SINGLE_RHS, that can be safely shared, some other RHS
-            that was unshared when we found it had a single debug
-            use, or a DEBUG_EXPR_DECL, that can be safely
-            shared.  */
-         SET_USE (use_p, value);
+       {
+         FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
+           /* unshare_expr is not needed here.  vexpr is either a
+              SINGLE_RHS, that can be safely shared, some other RHS
+              that was unshared when we found it had a single debug
+              use, or a DEBUG_EXPR_DECL, that can be safely
+              shared.  */
+           SET_USE (use_p, value);
+         /* If we didn't replace uses with a debug decl fold the
+            resulting expression.  Otherwise we end up with invalid IL.  */
+         if (TREE_CODE (value) != DEBUG_EXPR_DECL)
+           fold_stmt_inplace (stmt);
+       }
       else
        gimple_debug_bind_reset_value (stmt);