]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/34241 (ICE in forward_propagate_into_cond)
authorRichard Guenther <rguenther@suse.de>
Tue, 27 Nov 2007 15:00:37 +0000 (15:00 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 27 Nov 2007 15:00:37 +0000 (15:00 +0000)
2007-11-27  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/34241
* tree-ssa-forwprop.c (forward_propagate_addr_expr): Make sure
to only delete real conversion chains.

* g++.dg/torture/pr34241.C: New testcase.

From-SVN: r130468

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr34241.C [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index da216cede43d4adf6235d195ff09ff7650f3820a..f7cf3afbdf612beead1b8a7176bf752cc5ee8770 100644 (file)
@@ -1,3 +1,9 @@
+2007-11-27  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/34241
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr): Make sure
+       to only delete real conversion chains.
+
 2007-11-27  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * config/s390/s390.opt (m31, m64, mesa, mzarch, msoft-float,
index a3c26bfce0cc76f6a4d4ce742a857139572a8335..4e14852e88ba2d130ae7c96d8e36c45cb7be0e4c 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-27  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/34241
+       * g++.dg/torture/pr34241.C: New testcase.
+
 2007-11-27  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/builtins-error.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/torture/pr34241.C b/gcc/testsuite/g++.dg/torture/pr34241.C
new file mode 100644 (file)
index 0000000..70f186c
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+inline void *operator  new (__SIZE_TYPE__, void *__p) throw ()
+{
+  return __p;
+}
+struct A
+{
+  A(int, double);
+  inline explicit A (int pattern, bool cs)
+  {
+    new (this) A (pattern, double(cs));
+  }
+};
+A test ()
+{
+  const A a (42, true);
+}
index 3e30454ab9f42eb8f03d4c23f56dd41739a88917..f368c3321c485180f20a0e49c3239bb3d51172f6 100644 (file)
@@ -685,6 +685,7 @@ forward_propagate_addr_expr (tree name, tree rhs)
   FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
     {
       bool result;
+      tree use_rhs;
 
       /* If the use is not in a simple assignment statement, then
         there is nothing we can do.  */
@@ -712,11 +713,13 @@ forward_propagate_addr_expr (tree name, tree rhs)
       pop_stmt_changes (&use_stmt);
 
       /* Remove intermediate now unused copy and conversion chains.  */
+      use_rhs = GIMPLE_STMT_OPERAND (use_stmt, 1);
       if (result
          && TREE_CODE (GIMPLE_STMT_OPERAND (use_stmt, 0)) == SSA_NAME
-         && (TREE_CODE (GIMPLE_STMT_OPERAND (use_stmt, 1)) == SSA_NAME
-             || TREE_CODE (GIMPLE_STMT_OPERAND (use_stmt, 1)) == NOP_EXPR
-             || TREE_CODE (GIMPLE_STMT_OPERAND (use_stmt, 1)) == CONVERT_EXPR))
+         && (TREE_CODE (use_rhs) == SSA_NAME
+             || ((TREE_CODE (use_rhs) == NOP_EXPR
+                  || TREE_CODE (use_rhs) == CONVERT_EXPR)
+                 && TREE_CODE (TREE_OPERAND (use_rhs, 0)) == SSA_NAME)))
        {
          block_stmt_iterator bsi = bsi_for_stmt (use_stmt);
          release_defs (use_stmt);