From 13a7578b180de6d8bb91a2f340817e71c61a9988 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 11 Apr 2012 08:13:37 +0000 Subject: [PATCH] re PR middle-end/52881 (ICE due to null pointer deref in cfgloop.c) 2012-04-11 Richard Guenther PR rtl-optimization/52881 * ifcvt.c (find_if_case_2): Avoid speculating loop latches. * gcc.dg/torture/pr52881.c: New testcase. * gcc.dg/torture/pr52913.c: Likewise. From-SVN: r186304 --- gcc/ChangeLog | 5 ++++ gcc/ifcvt.c | 5 ++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.dg/torture/pr52881.c | 35 ++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr52913.c | 18 +++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr52881.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr52913.c 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; +}