Fix pr78725

PR tree-optimization/78725
	* tree-ssa-loop-split.c (split_at_bb_p): Check for overflow and
	at correct use point.

testsuite/
	PR tree-optimization/78725
	* gcc.dg/pr78725.c: New test.
	* gcc.dg/pr78725-2.c: New test.

From-SVN: r243606
This commit is contained in:
Michael Matz 2016-12-13 14:14:41 +00:00 committed by Michael Matz
parent 5594a028fe
commit 9042295c44
5 changed files with 55 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2016-12-13 Michael Matz <matz@suse.de>
PR tree-optimization/78725
* tree-ssa-loop-split.c (split_at_bb_p): Check for overflow and
at correct use point.
2016-12-13 Martin Liska <mliska@suse.cz>
* asan.c (asan_expand_mark_ifn): Use renamed

View File

@ -1,3 +1,9 @@
2016-12-13 Michael Matz <matz@suse.de>
PR tree-optimization/78725
* gcc.dg/pr78725.c: New test.
* gcc.dg/pr78725-2.c: New test.
2016-12-13 Richard Biener <rguenther@suse.de>
PR middle-end/78742

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-options "-O3 -fsplit-loops" } */
int a, b, c;
int main ()
{
int d;
for (; c < 1; c++)
for (d = 0; d < 3; d++)
for (b = 0; b < 1; b++)
if (c >= d)
a = 1;
if (a != 1)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
/* { dg-options "-O3 -fsplit-loops" } */
int fn1 (int b, int c)
{
return c < 0 || c > 31 ? 0 : b >> c;
}
unsigned char d = 255;
int e, f;
int main ()
{
for (; f < 2; f++)
e = fn1 (1, d++);
if (e != 1)
__builtin_abort ();
return 0;
}

View File

@ -102,10 +102,11 @@ split_at_bb_p (struct loop *loop, basic_block bb, tree *border, affine_iv *iv)
tree op0 = gimple_cond_lhs (stmt);
tree op1 = gimple_cond_rhs (stmt);
struct loop *useloop = loop_containing_stmt (stmt);
if (!simple_iv (loop, loop, op0, iv, false))
if (!simple_iv (loop, useloop, op0, iv, false))
return NULL_TREE;
if (!simple_iv (loop, loop, op1, &iv2, false))
if (!simple_iv (loop, useloop, op1, &iv2, false))
return NULL_TREE;
/* Make it so that the first argument of the condition is
@ -122,6 +123,8 @@ split_at_bb_p (struct loop *loop, basic_block bb, tree *border, affine_iv *iv)
return NULL_TREE;
if (!integer_zerop (iv2.step))
return NULL_TREE;
if (!iv->no_overflow)
return NULL_TREE;
if (dump_file && (dump_flags & TDF_DETAILS))
{