re PR tree-optimization/71563 (Regression in GCC-7.0.0's optimizer.)
authorJakub Jelinek <jakub@redhat.com>
Wed, 4 Jan 2017 09:07:33 +0000 (10:07 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 4 Jan 2017 09:07:33 +0000 (10:07 +0100)
PR tree-optimization/71563
* match.pd: Simplify X << Y into X if Y is known to be 0 or
out of range value - has low bits known to be zero.

* gcc.dg/tree-ssa/pr71563.c: New test.

From-SVN: r244050

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr71563.c [new file with mode: 0644]

index 06021eed5def4e01a11092b136e8a5cf3dfbc8cd..864c30b9ccd2c05b004ca1099eb85fff24c3df97 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/71563
+       * match.pd: Simplify X << Y into X if Y is known to be 0 or
+       out of range value - has low bits known to be zero.
+
 2017-01-04  Alan Modra  <amodra@gmail.com>
 
        * Makefile.in (aclocal_deps): Update and order as per aclocal.m4.
index 8791e57ea212b1edb5d12beb8380e6f49140e044..7b9680094730bf793c6a65597184f0d54e0635fa 100644 (file)
@@ -1515,6 +1515,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
     (if (tem)
      (shiftrotate @0 { tem; }))))))
 
+/* Simplify X << Y where Y's low width bits are 0 to X, as only valid
+   Y is 0.  Similarly for X >> Y.  */
+#if GIMPLE
+(for shift (lshift rshift)
+ (simplify
+  (shift @0 SSA_NAME@1)
+   (if (INTEGRAL_TYPE_P (TREE_TYPE (@1)))
+    (with {
+      int width = ceil_log2 (element_precision (TREE_TYPE (@0)));
+      int prec = TYPE_PRECISION (TREE_TYPE (@1));
+     }
+     (if ((get_nonzero_bits (@1) & wi::mask (width, false, prec)) == 0)
+      @0)))))
+#endif
+
 /* Rewrite an LROTATE_EXPR by a constant into an
    RROTATE_EXPR by a new constant.  */
 (simplify
index 4a1caa7bb04fd9730a88eea2fba87d1fb1ef7c95..9e7cae4141956110ce6a1e084acd6fe31a97eb4b 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/71563
+       * gcc.dg/tree-ssa/pr71563.c: New test.
+
 2017-01-04  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR fortran/78534
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr71563.c b/gcc/testsuite/gcc.dg/tree-ssa/pr71563.c
new file mode 100644 (file)
index 0000000..f01291d
--- /dev/null
@@ -0,0 +1,23 @@
+/* PR tree-optimization/71563 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void link_error (void);
+
+void
+foo (int k)
+{
+  int t = 1 << ((1 / k) << 8);
+  if (t != 1)
+    link_error ();
+}
+
+void
+bar (int k, int l)
+{
+  int t = l << (k << 8);
+  if (t != l)
+    link_error ();
+}
+
+/* { dg-final { scan-tree-dump-not "link_error" "optimized" } } */