match.pd: Relax some tree_nop_conversion_p
authorMarc Glisse <marc.glisse@inria.fr>
Mon, 23 May 2016 17:49:10 +0000 (19:49 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Mon, 23 May 2016 17:49:10 +0000 (17:49 +0000)
2016-05-23  Marc Glisse  <marc.glisse@inria.fr>

gcc/
* match.pd (a * (1 << b), ~x & ~y, ~X ^ ~Y, (X ^ Y) ^ Y, ~ (-A),
~ (A - 1), ~(~X >> Y), ~(~X >>r Y)): Relax constraints.

gcc/testsuite/
* gcc.dg/fold-notshift-2.c: Adjust.

From-SVN: r236601

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-notshift-2.c

index f48713933a23d7301d5c50a2a39e455e13d3bcc6..6091b6957029f8e2ee39d64a10a97df606a501f3 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-23  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd (a * (1 << b), ~x & ~y, ~X ^ ~Y, (X ^ Y) ^ Y, ~ (-A),
+       ~ (A - 1), ~(~X >> Y), ~(~X >>r Y)): Relax constraints.
+
 2016-05-23  Jeff Law  <law@redhat.com>
 
        * tree-ssa-threadbackward.c (profitable_jump_thread_path): New function
index f11ce7c9712f06a66783025272d103a731774107..8d05e86b7bf5eb0aec5606bbb5e4169aeb4ca440 100644 (file)
@@ -454,7 +454,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 (simplify
  (mult:c @0 (convert? (lshift integer_onep@1 @2)))
   (if (! FLOAT_TYPE_P (type)
-       && tree_nop_conversion_p (type, TREE_TYPE (@1)))
+       && (element_precision (type) <= element_precision (TREE_TYPE (@1))
+          || TYPE_UNSIGNED (TREE_TYPE (@1))))
    (lshift @0 @2)))
 
 /* Fold (C1/X)*C2 into (C1*C2)/X.  */
@@ -655,8 +656,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
      rop (bit_ior bit_and)
  (simplify
   (op (convert1? (bit_not @0)) (convert2? (bit_not @1)))
-  (if (tree_nop_conversion_p (type, TREE_TYPE (@0))
-       && tree_nop_conversion_p (type, TREE_TYPE (@1)))
+  (if (element_precision (type) <= element_precision (TREE_TYPE (@0))
+       && element_precision (type) <= element_precision (TREE_TYPE (@1)))
    (bit_not (rop (convert @0) (convert @1))))))
 
 /* If we are XORing or adding two BIT_AND_EXPR's, both of which are and'ing
@@ -681,8 +682,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 /* Convert ~X ^ ~Y to X ^ Y.  */
 (simplify
  (bit_xor (convert1? (bit_not @0)) (convert2? (bit_not @1)))
- (if (tree_nop_conversion_p (type, TREE_TYPE (@0))
-      && tree_nop_conversion_p (type, TREE_TYPE (@1)))
+ (if (element_precision (type) <= element_precision (TREE_TYPE (@0))
+      && element_precision (type) <= element_precision (TREE_TYPE (@1)))
   (bit_xor (convert @0) (convert @1))))
 
 /* Convert ~X ^ C to X ^ ~C.  */
@@ -722,8 +723,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 /* (X ^ Y) ^ Y -> X  */
 (simplify
  (bit_xor:c (convert? (bit_xor:c @0 @1)) (convert? @1))
- (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
-  (convert @0)))
+ (convert @0))
 /* (X & Y) & (X & Z) -> (X & Y) & Z
    (X | Y) | (X | Z) -> (X | Y) | Z  */
 (for op (bit_and bit_ior)
@@ -915,17 +915,20 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 /* Convert ~ (-A) to A - 1.  */
 (simplify
  (bit_not (convert? (negate @0)))
- (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
+ (if (element_precision (type) <= element_precision (TREE_TYPE (@0))
+      || !TYPE_UNSIGNED (TREE_TYPE (@0)))
   (convert (minus @0 { build_each_one_cst (TREE_TYPE (@0)); }))))
 
 /* Convert ~ (A - 1) or ~ (A + -1) to -A.  */
 (simplify
  (bit_not (convert? (minus @0 integer_each_onep)))
- (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
+ (if (element_precision (type) <= element_precision (TREE_TYPE (@0))
+      || !TYPE_UNSIGNED (TREE_TYPE (@0)))
   (convert (negate @0))))
 (simplify
  (bit_not (convert? (plus @0 integer_all_onesp)))
- (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
+ (if (element_precision (type) <= element_precision (TREE_TYPE (@0))
+      || !TYPE_UNSIGNED (TREE_TYPE (@0)))
   (convert (negate @0))))
 
 /* Part of convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify.  */
@@ -1505,9 +1508,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 (simplify
  (bit_not (convert1?:s (rshift:s (convert2?@0 (bit_not @1)) @2)))
   (if (!TYPE_UNSIGNED (TREE_TYPE (@0))
-       && element_precision (TREE_TYPE (@0))
-          <= element_precision (TREE_TYPE (@1))
-       && element_precision (type) <= element_precision (TREE_TYPE (@0)))
+       && (element_precision (TREE_TYPE (@0))
+          <= element_precision (TREE_TYPE (@1))
+          || !TYPE_UNSIGNED (TREE_TYPE (@1))))
    (with
     { tree shift_type = TREE_TYPE (@0); }
      (convert (rshift (convert:shift_type @1) @2)))))
@@ -1517,8 +1520,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 (for rotate (lrotate rrotate)
  (simplify
   (bit_not (convert1?:s (rotate:s (convert2?@0 (bit_not @1)) @2)))
-   (if (element_precision (TREE_TYPE (@0)) <= element_precision (TREE_TYPE (@1))
-        && element_precision (type) <= element_precision (TREE_TYPE (@0)))
+   (if ((element_precision (TREE_TYPE (@0))
+        <= element_precision (TREE_TYPE (@1))
+        || !TYPE_UNSIGNED (TREE_TYPE (@1)))
+        && (element_precision (type) <= element_precision (TREE_TYPE (@0))
+           || !TYPE_UNSIGNED (TREE_TYPE (@0))))
     (with
      { tree rotate_type = TREE_TYPE (@0); }
       (convert (rotate (convert:rotate_type @1) @2))))))
index 5a5c7b8515f6f9a19cd849ba94feaf32ee5c20f9..4d39198acd35a921b34abaf77be3afd5dbbc1116 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-23  Marc Glisse  <marc.glisse@inria.fr>
+
+       * gcc.dg/fold-notshift-2.c: Adjust.
+
 2016-05-23  Marek Polacek  <polacek@redhat.com>
 
        PR c/49859
index 32635f183d753b1b3f6a2d2449c3a37caaa664fa..f8aab2a005eada42aedc05dc9ecfc37c53c6863d 100644 (file)
@@ -15,17 +15,17 @@ sl (int a, int b)
   return ~((~a) << b);
 }
 
-typedef __INT32_TYPE__ int32_t;
+typedef unsigned __INT32_TYPE__ uint32_t;
 typedef __INT64_TYPE__ int64_t;
 
 int64_t
-asr_widen1 (int32_t a, int b)
+asr_widen1 (uint32_t a, int b)
 {
   return ~((int64_t)(~a) >> b);
 }
 
 int64_t
-asr_widen2 (int32_t a, int b)
+asr_widen2 (uint32_t a, int b)
 {
   return ~(int64_t)(~a >> b);
 }