From: Jakub Jelinek Date: Sat, 9 Apr 2016 11:23:51 +0000 (+0200) Subject: re PR tree-optimization/70586 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 32... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f55460af163cc791a59bed42aa8f152417150a7e;p=gcc.git 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 --- 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; }