Commit 13a7578b by Richard Guenther Committed by Richard Biener

re PR middle-end/52881 (ICE due to null pointer deref in cfgloop.c)

2012-04-11  Richard Guenther  <rguenther@suse.de>

	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
parent 12df9a2f
2012-04-11 Richard Guenther <rguenther@suse.de> 2012-04-11 Richard Guenther <rguenther@suse.de>
PR rtl-optimization/52881
* ifcvt.c (find_if_case_2): Avoid speculating loop latches.
2012-04-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/52912 PR tree-optimization/52912
* tree-ssa-threadupdate.c (thread_block): Tell the cfg * tree-ssa-threadupdate.c (thread_block): Tell the cfg
manipulation code we are threading through a loop header manipulation code we are threading through a loop header
......
...@@ -3927,6 +3927,11 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) ...@@ -3927,6 +3927,11 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
edge else_succ; edge else_succ;
int then_prob, else_prob; 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 /* If we are partitioning hot/cold basic blocks, we don't want to
mess up unconditional or indirect jumps that cross between hot mess up unconditional or indirect jumps that cross between hot
and cold sections. and cold sections.
......
2012-04-11 Richard Guenther <rguenther@suse.de> 2012-04-11 Richard Guenther <rguenther@suse.de>
PR rtl-optimization/52881
* gcc.dg/torture/pr52881.c: New testcase.
* gcc.dg/torture/pr52913.c: Likewise.
2012-04-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/52912 PR tree-optimization/52912
* gcc.dg/torture/pr52912.c: New testcase. * gcc.dg/torture/pr52912.c: New testcase.
......
/* { 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;
}
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment