re PR tree-optimization/70586 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 32...
authorJakub Jelinek <jakub@redhat.com>
Sat, 9 Apr 2016 11:23:51 +0000 (13:23 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 9 Apr 2016 11:23:51 +0000 (13:23 +0200)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr70586.c [new file with mode: 0644]
gcc/tree-ssa-ifcombine.c

index da9cfd8..7f2180d 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/70586
+       * tree-ssa-ifcombine.c (bb_no_side_effects_p): Return false
+       for any calls.
+
 2016-04-08  Cesar Philippidis  <cesar@codesourcery.com>
 
        PR lto/70289
index 48eb452..51fcbc9 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/70586
+       * gcc.c-torture/execute/pr70586.c: New test.
+
 2016-04-09  Dominique d'Humieres  <dominiq@lps.ens.fr>
 
        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 (file)
index 0000000..32e9e50
--- /dev/null
@@ -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;
+}
index 22b8b78..79fe3a8 100644 (file)
@@ -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;
     }