Simplify X * C1 == C2 with undefined overflow
authorMarc Glisse <marc.glisse@inria.fr>
Tue, 4 Aug 2020 15:30:16 +0000 (17:30 +0200)
committerMarc Glisse <marc.glisse@inria.fr>
Tue, 4 Aug 2020 15:30:16 +0000 (17:30 +0200)
this transformation is quite straightforward, without overflow, 3*X==15 is
the same as X==5 and 3*X==5 cannot happen. Adding a single_use restriction
for the first case didn't seem necessary, although of course it can
slightly increase register pressure in some cases.

2020-08-04  Marc Glisse  <marc.glisse@inria.fr>

PR tree-optimization/95433
* match.pd (X * C1 == C2): New transformation.

* gcc.c-torture/execute/pr23135.c: Add -fwrapv to avoid
undefined behavior.
* gcc.dg/tree-ssa/pr95433.c: New file.

gcc/match.pd
gcc/testsuite/gcc.c-torture/execute/pr23135.c
gcc/testsuite/gcc.dg/tree-ssa/pr95433.c [new file with mode: 0644]

index a052c9e3dbcc49e32df6f0c39f68f9b725d317c3..1372f89daff52f4a8ebf31aa07c2b335d9598bd9 100644 (file)
@@ -3779,6 +3779,20 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
      (scmp @0 @2)
      (cmp @0 @2))))))
 
+/* For integral types with undefined overflow fold
+   x * C1 == C2 into x == C2 / C1 or false.  */
+(for cmp (eq ne)
+ (simplify
+  (cmp (mult @0 INTEGER_CST@1) INTEGER_CST@2)
+  (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
+       && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))
+       && wi::to_wide (@1) != 0)
+   (with { widest_int quot; }
+    (if (wi::multiple_of_p (wi::to_widest (@2), wi::to_widest (@1),
+                           TYPE_SIGN (TREE_TYPE (@0)), &quot))
+     (cmp @0 { wide_int_to_tree (TREE_TYPE (@0), quot); })
+     { constant_boolean_node (cmp == NE_EXPR, type); })))))
+
 /* Simplify comparison of something with itself.  For IEEE
    floating-point, we can only do some of these simplifications.  */
 (for cmp (eq ge le)
index e740ff52874edca601fb08c6547d0c7057ebec64..ef9b7efc9c4588b76e0b2664c8cba21d4ea6deed 100644 (file)
@@ -1,7 +1,7 @@
 /* Based on execute/simd-1.c, modified by joern.rennecke@st.com to
    trigger a reload bug.  Verified for gcc mainline from 20050722 13:00 UTC
    for sh-elf -m4 -O2.  */
-/* { dg-options "-Wno-psabi" } */
+/* { dg-options "-Wno-psabi -fwrapv" } */
 /* { dg-add-options stack_size } */
 
 #ifndef STACK_SIZE
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr95433.c b/gcc/testsuite/gcc.dg/tree-ssa/pr95433.c
new file mode 100644 (file)
index 0000000..4e161ee
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+int f(int x){return x*7==17;}
+int g(int x){return x*3==15;}
+
+/* { dg-final { scan-tree-dump "return 0;" "optimized" } } */
+/* { dg-final { scan-tree-dump "== 5;" "optimized" } } */