Transform (x >> cst) != 0 to x >= (1 << cst) and (x >> cst) == 0 to x < (1 << cst)

Prathamesh Kulkarni prathamesh.kulkarni@linaro.org
Tue Oct 3 19:54:00 GMT 2017


Hi,
This follow-up patch implements the patterns mentioned in $subject.
Bootstrap+test in progress on x86_64-unknown-linux-gnu and aarch64-linux-gnu.
OK to commit if passes ?

Thanks,
Prathamesh
-------------- next part --------------
2017-10-03  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

	* match.pd ((X >> CST) == 0 -> X < (1 << CST)): New pattern.
	((X >> CST) != 0 -> X >= (1 << CST)): Likewise.

testsuite/
	* gcc.dg/tree-ssa/cmpdiv.c: Add test-cases f3 and f4.

diff --git a/gcc/match.pd b/gcc/match.pd
index 43ab226a705..883ad5ba53c 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1287,6 +1287,18 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && (VECTOR_TYPE_P (type) || !VECTOR_TYPE_P (TREE_TYPE (@0))))
    (ocmp @0 @1))))
 
+/* Transform
+   (x >> cst) != 0 -> x >= (1 << cst)
+   (x >> cst) == 0 -> x < (1 << cst)
+   if x, cst are unsigned.  */
+(for cmp (eq ne)
+     ocmp (lt ge)
+ (simplify
+  (cmp (rshift @0 INTEGER_CST@1) integer_zerop)
+  (if (TYPE_UNSIGNED (TREE_TYPE (@0))
+      && (VECTOR_TYPE_P (type) || !VECTOR_TYPE_P (TREE_TYPE (@0))))
+   (ocmp @0 (lshift { build_int_cstu (TREE_TYPE (@0), 1); } @1)))))
+
 /* X == C - X can never be true if C is odd.  */
 (for cmp (eq ne)
  (simplify
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cmpdiv.c b/gcc/testsuite/gcc.dg/tree-ssa/cmpdiv.c
index 14161f5ea6f..fc5bc8c3674 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cmpdiv.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cmpdiv.c
@@ -15,4 +15,19 @@ _Bool f2(unsigned x, unsigned y)
   return t2;
 }
 
+_Bool f3(unsigned x)
+{
+  unsigned t1 = x >> 4;
+  _Bool t2 = (t1 != 0);
+  return t2;
+}
+
+_Bool f4(unsigned x)
+{
+  unsigned t1 = x >> 4;
+  _Bool t2 = (t1 == 0);
+  return t2;
+}
+
 /* { dg-final { scan-tree-dump-not "trunc_div_expr" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "rshift_expr" "optimized" } } */


More information about the Gcc-patches mailing list