From 9042295c44dad698b9f9758c79185879511e8dee Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Tue, 13 Dec 2016 14:14:41 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/pr78725-2.c | 19 +++++++++++++++++++ gcc/testsuite/gcc.dg/pr78725.c | 19 +++++++++++++++++++ gcc/tree-ssa-loop-split.c | 7 +++++-- 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr78725-2.c create mode 100644 gcc/testsuite/gcc.dg/pr78725.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05ddb301d73..b53704c94df 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 6ad28bf9ce0..118d01e2f58 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 00000000000..9de489edda8 --- /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 00000000000..ed95790a447 --- /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 dac68e6723a..84c0627fb0b 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)) { -- 2.30.2