From: Michael Matz Date: Tue, 13 Dec 2016 14:14:41 +0000 (+0000) Subject: Fix pr78725 X-Git-Tag: upstream/12.2.0~42530 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9042295c44dad698b9f9758c79185879511e8dee;p=platform%2Fupstream%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05ddb30..b53704c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-12-13 Michael Matz + + 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 * asan.c (asan_expand_mark_ifn): Use renamed diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ad28bf..118d01e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-12-13 Michael Matz + + PR tree-optimization/78725 + * gcc.dg/pr78725.c: New test. + * gcc.dg/pr78725-2.c: New test. + 2016-12-13 Richard Biener PR middle-end/78742 diff --git a/gcc/testsuite/gcc.dg/pr78725-2.c b/gcc/testsuite/gcc.dg/pr78725-2.c new file mode 100644 index 0000000..9de489e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr78725-2.c @@ -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; +} diff --git a/gcc/testsuite/gcc.dg/pr78725.c b/gcc/testsuite/gcc.dg/pr78725.c new file mode 100644 index 0000000..ed95790 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr78725.c @@ -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; +} diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c index dac68e6..84c0627 100644 --- a/gcc/tree-ssa-loop-split.c +++ b/gcc/tree-ssa-loop-split.c @@ -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)) {