aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-09-04 09:28:58 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-09-04 09:28:58 +0000
commita8886f7d1859cebce5db37598c4bae54cc51db1d (patch)
treefa175b9596e8734f22e4875c7fe68cff105f80e9 /gcc
parentcee8f252d70e664c198070ef60ddc15d06176dad (diff)
downloadgcc-a8886f7d1859cebce5db37598c4bae54cc51db1d.zip
gcc-a8886f7d1859cebce5db37598c4bae54cc51db1d.tar.gz
gcc-a8886f7d1859cebce5db37598c4bae54cc51db1d.tar.bz2
re PR tree-optimization/54458 (ICE get_loop_body, at cfgloop.c:830)
2012-09-04 Richard Guenther <rguenther@suse.de> PR tree-optimization/54458 * tree-ssa-threadupdate.c (thread_through_loop_header): If we turn the loop into one with multiple latches mark it so. * gcc.dg/torture/pr54458.c: New testcase. From-SVN: r190918
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr54458.c20
-rw-r--r--gcc/tree-ssa-threadupdate.c10
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 70aecdd..5ba70bf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-04 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54458
+ * tree-ssa-threadupdate.c (thread_through_loop_header): If we
+ turn the loop into one with multiple latches mark it so.
+
2012-09-04 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
PR target/54220
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4a05321..b7354f4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-09-04 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54458
+ * gcc.dg/torture/pr54458.c: New testcase.
+
2012-09-04 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/arm/neon-vext.c: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr54458.c b/gcc/testsuite/gcc.dg/torture/pr54458.c
new file mode 100644
index 0000000..3d2e12f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr54458.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+unsigned int a, b, c;
+
+void
+foo (unsigned int x)
+{
+ do
+ {
+ if (a == 0 ? 1 : 1 % a)
+ for (; b; b--)
+ lab:;
+ else
+ while (x)
+ ;
+ if (c)
+ goto lab;
+ }
+ while (1);
+}
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index 86ad74f..30336a1 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -1037,11 +1037,21 @@ thread_through_loop_header (struct loop *loop, bool may_peel_loop_headers)
}
free (bblocks);
+ /* If the new header has multiple latches mark it so. */
+ FOR_EACH_EDGE (e, ei, loop->header->preds)
+ if (e->src->loop_father == loop
+ && e->src != loop->latch)
+ {
+ loop->latch = NULL;
+ loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
+ }
+
/* Cancel remaining threading requests that would make the
loop a multiple entry loop. */
FOR_EACH_EDGE (e, ei, header->preds)
{
edge e2;
+
if (e->aux == NULL)
continue;