From f55460af163cc791a59bed42aa8f152417150a7e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 9 Apr 2016 13:23:51 +0200 Subject: [PATCH] re PR tree-optimization/70586 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 32-bit and 64-bit modes) PR tree-optimization/70586 * tree-ssa-ifcombine.c (bb_no_side_effects_p): Return false for any calls. * gcc.c-torture/execute/pr70586.c: New test. From-SVN: r234849 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/execute/pr70586.c | 30 +++++++++++++++++++ gcc/tree-ssa-ifcombine.c | 9 +++++- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr70586.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da9cfd85a9e..7f2180d232a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-04-09 Jakub Jelinek + + PR tree-optimization/70586 + * tree-ssa-ifcombine.c (bb_no_side_effects_p): Return false + for any calls. + 2016-04-08 Cesar Philippidis PR lto/70289 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 48eb4528d01..51fcbc90c45 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-09 Jakub Jelinek + + PR tree-optimization/70586 + * gcc.c-torture/execute/pr70586.c: New test. + 2016-04-09 Dominique d'Humieres PR sanitizer/70573 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr70586.c b/gcc/testsuite/gcc.c-torture/execute/pr70586.c new file mode 100644 index 00000000000..32e9e502cac --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr70586.c @@ -0,0 +1,30 @@ +/* PR tree-optimization/70586 */ + +int a, e, f; +short b, c, d; + +int +foo (int x, int y) +{ + return (y == 0 || (x && y == 1)) ? x : x % y; +} + +static short +bar (void) +{ + int i = foo (c, f); + f = foo (d, 2); + int g = foo (b, c); + int h = foo (g > 0, c); + c = (3 >= h ^ 7) <= foo (i, c); + if (foo (e, 1)) + return a; + return 0; +} + +int +main () +{ + bar (); + return 0; +} diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index 22b8b78a83f..79fe3a8b2d0 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -125,7 +125,14 @@ bb_no_side_effects_p (basic_block bb) if (gimple_has_side_effects (stmt) || gimple_uses_undefined_value_p (stmt) || gimple_could_trap_p (stmt) - || gimple_vuse (stmt)) + || gimple_vuse (stmt) + /* const calls don't match any of the above, yet they could + still have some side-effects - they could contain + gimple_could_trap_p statements, like floating point + exceptions or integer division by zero. See PR70586. + FIXME: perhaps gimple_has_side_effects or gimple_could_trap_p + should handle this. */ + || is_gimple_call (stmt)) return false; }