]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/37456 (ICE: verify_flow_info failed: control flow in the middle...
authorRichard Guenther <rguenther@suse.de>
Thu, 18 Sep 2008 11:28:18 +0000 (11:28 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 18 Sep 2008 11:28:18 +0000 (11:28 +0000)
2008-09-18  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/37456
* tree-ssa-reassoc.c (build_and_add_sum): If the stmt we
want to insert after ends a BB insert on the single fallthru
outgoing edge.

* testsuite/g++.dg/torture/pr37456.C: New testcase.

From-SVN: r140449

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

index bad3a253eb9462ac0a03c1a0d0aab034eae3c63e..7d0282997d75250a81fcbc3b9d4ea49ba37f8868 100644 (file)
@@ -1,3 +1,10 @@
+2008-09-18  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/37456
+       * tree-ssa-reassoc.c (build_and_add_sum): If the stmt we
+       want to insert after ends a BB insert on the single fallthru
+       outgoing edge.
+
 2008-09-18  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * doc/invoke.texi: Document -mhard-dfp, -mno-hard-dfp.
index 7bbee66143a963a9dfeaebb202bd86147162363b..cebd6736e5d0df7dae7611f4a2d377b3f2d10438 100644 (file)
@@ -1,3 +1,8 @@
+2008-09-18  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/37456
+       * testsuite/g++.dg/torture/pr37456.C: New testcase.
+
 2008-09-18  Uros Bizjak  <ubizjak@gmail.com>
 
        PR rtl-optimization/37544
diff --git a/gcc/testsuite/g++.dg/torture/pr37456.C b/gcc/testsuite/g++.dg/torture/pr37456.C
new file mode 100644 (file)
index 0000000..cf2021b
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+int zot(int);
+struct bar {
+  ~bar() { }
+};
+int x;
+void doit(int a, int b, int c)
+{
+  bar pn;
+  int b1 = zot(a) * c;
+  int b2 = zot(b) * c;
+  x = b1 + b2;
+}
index e4e7db69d2ea2dadfa1ff0126c77d20dcd1b3ab0..bfe909d67384213b60dedfc0434ea887d1ae4c85 100644 (file)
@@ -859,8 +859,20 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode)
        }
       else
        {
-         gsi = gsi_for_stmt (op2def);
-         gsi_insert_after (&gsi, sum, GSI_NEW_STMT);
+         if (!stmt_ends_bb_p (op2def))
+           {
+             gsi = gsi_for_stmt (op2def);
+             gsi_insert_after (&gsi, sum, GSI_NEW_STMT);
+           }
+         else
+           {
+             edge e;
+             edge_iterator ei;
+
+             FOR_EACH_EDGE (e, ei, gimple_bb (op2def)->succs)
+               if (e->flags & EDGE_FALLTHRU)
+                 gsi_insert_on_edge_immediate (e, sum);
+           }
        }
     }
   else
@@ -872,8 +884,20 @@ build_and_add_sum (tree tmpvar, tree op1, tree op2, enum tree_code opcode)
        }
       else
        {
-         gsi = gsi_for_stmt (op1def);
-         gsi_insert_after (&gsi, sum, GSI_NEW_STMT);
+         if (!stmt_ends_bb_p (op1def))
+           {
+             gsi = gsi_for_stmt (op1def);
+             gsi_insert_after (&gsi, sum, GSI_NEW_STMT);
+           }
+         else
+           {
+             edge e;
+             edge_iterator ei;
+
+             FOR_EACH_EDGE (e, ei, gimple_bb (op1def)->succs)
+               if (e->flags & EDGE_FALLTHRU)
+                 gsi_insert_on_edge_immediate (e, sum);
+           }
        }
     }
   update_stmt (sum);