diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24efa857d85..62a4e883724 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-04-11 Richard Guenther + + PR rtl-optimization/52881 + * ifcvt.c (find_if_case_2): Avoid speculating loop latches. + 2012-04-11 Richard Guenther PR tree-optimization/52912 diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index e4e13abe0aa..79e27380283 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -3927,6 +3927,11 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) edge else_succ; int then_prob, else_prob; + /* We do not want to speculate (empty) loop latches. */ + if (current_loops + && else_bb->loop_father->latch == else_bb) + return FALSE; + /* If we are partitioning hot/cold basic blocks, we don't want to mess up unconditional or indirect jumps that cross between hot and cold sections. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 08293166910..7176e6a1f75 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-04-11 Richard Guenther + + PR rtl-optimization/52881 + * gcc.dg/torture/pr52881.c: New testcase. + * gcc.dg/torture/pr52913.c: Likewise. + 2012-04-11 Richard Guenther PR tree-optimization/52912 diff --git a/gcc/testsuite/gcc.dg/torture/pr52881.c b/gcc/testsuite/gcc.dg/torture/pr52881.c new file mode 100644 index 00000000000..c101c80338d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr52881.c @@ -0,0 +1,35 @@ +/* { dg-do compile } */ + +int a, b, c, d, e, f, h, i, j, k, l, m, n, o; +static int g; +int +fn1 () { + for (;; ++f) + if (e) + break; + return 0; +} +unsigned char fn2 (); +void +fn3 () { +lbl_220: + if (j) { +lbl_221: + l = (g || b) <= fn1 (); + for (;;) { + g = 0; + fn2 (); + if (k) + goto lbl_220; + break; + } + if (l) + goto lbl_221; + } +} +unsigned char +fn2 () { + o = d ? 0 : c; + h = m | a % o != n; + return i; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr52913.c b/gcc/testsuite/gcc.dg/torture/pr52913.c new file mode 100644 index 00000000000..ad99884bfed --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr52913.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +int a, b, c, d, e; +void +fn1 () +{ +lbl_101: + e = 0; +lbl_274: + for (c = 0; c < 1; c = a) + if (d) + if (b) + goto lbl_101; + else + break; + d = 1; + goto lbl_274; +}