fold-const.c (fold_binary_loc): Move (X & C2) << C1 -> (X << C1) & (C2 << C1) simplif...
authorRichard Biener <rguenther@suse.de>
Tue, 7 Jul 2015 14:12:44 +0000 (14:12 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 7 Jul 2015 14:12:44 +0000 (14:12 +0000)
2015-07-07  Richard Biener  <rguenther@suse.de>

* fold-const.c (fold_binary_loc): Move
(X & C2) << C1 -> (X << C1) & (C2 << C1) simplification ...
* match.pd: ... here.
Add (X * C1) % C2 -> 0 simplification pattern derived from
extract_muldiv_1.

* gcc.dg/vect/vect-over-widen-3-big-array.c: Adjust.

From-SVN: r225517

gcc/ChangeLog
gcc/fold-const.c
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-over-widen-3-big-array.c

index 988fce307812a20fb2b23a64380e892d90db008b..b1b3f7f958929d5c528bbd14a97ffe8ec4250625 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-07  Richard Biener  <rguenther@suse.de>
+
+       * fold-const.c (fold_binary_loc): Move
+       (X & C2) << C1 -> (X << C1) & (C2 << C1) simplification ...
+       * match.pd: ... here.
+       Add (X * C1) % C2 -> 0 simplification pattern derived from
+       extract_muldiv_1.
+
 2015-07-07  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        PR target/66780
index d896d7a16750b80b7054ac61cb22832d2165938d..23ef423df7887e2875d2d6146f80b8d429ebda2c 100644 (file)
@@ -11194,27 +11194,6 @@ fold_binary_loc (location_t loc,
                             prec) == 0)
        return TREE_OPERAND (arg0, 0);
 
-      /* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
-             (X & C2) >> C1 into (X >> C1) & (C2 >> C1)
-        if the latter can be further optimized.  */
-      if ((code == LSHIFT_EXPR || code == RSHIFT_EXPR)
-         && TREE_CODE (arg0) == BIT_AND_EXPR
-         && TREE_CODE (arg1) == INTEGER_CST
-         && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
-       {
-         tree mask = fold_build2_loc (loc, code, type,
-                                  fold_convert_loc (loc, type,
-                                                    TREE_OPERAND (arg0, 1)),
-                                  arg1);
-         tree shift = fold_build2_loc (loc, code, type,
-                                   fold_convert_loc (loc, type,
-                                                     TREE_OPERAND (arg0, 0)),
-                                   arg1);
-         tem = fold_binary_loc (loc, BIT_AND_EXPR, type, shift, mask);
-         if (tem)
-           return tem;
-       }
-
       return NULL_TREE;
 
     case MIN_EXPR:
index 641148652b2f43fa99768fe50333b38f0daa0181..5e8fd32ed22638d5a6b0264c009094cb7e7dec40 100644 (file)
@@ -230,7 +230,14 @@ along with GCC; see the file COPYING3.  If not see
  /* (X % Y) % Y is just X % Y.  */
  (simplify
   (mod (mod@2 @0 @1) @1)
-  @2))
+  @2)
+ /* From extract_muldiv_1: (X * C1) % C2 is zero if C1 is a multiple of C2.  */
+ (simplify
+  (mod (mult @0 INTEGER_CST@1) INTEGER_CST@2)
+  (if (ANY_INTEGRAL_TYPE_P (type)
+       && TYPE_OVERFLOW_UNDEFINED (type)
+       && wi::multiple_of_p (@1, @2, TYPE_SIGN (type)))
+   { build_zero_cst (type); })))
 
 /* X % -C is the same as X % C.  */
 (simplify
@@ -992,6 +999,16 @@ along with GCC; see the file COPYING3.  If not see
           (if (shift_type == TREE_TYPE (@3))
            (bit_and @4 { newmaskt; }))))))))))))
 
+/* Fold (X & C2) << C1 into (X << C1) & (C2 << C1)
+   (X & C2) >> C1 into (X >> C1) & (C2 >> C1).  */
+(for shift (lshift rshift)
+ (simplify
+  (shift (convert? (bit_and @0 INTEGER_CST@2)) INTEGER_CST@1)
+  (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
+   (with { tree mask = int_const_binop (shift, fold_convert (type, @2), @1); }
+    (bit_and (shift (convert @0) @1) { mask; })))))
+
+
 /* Simplifications of conversions.  */
 
 /* Basic strip-useless-type-conversions / strip_nops.  */
index 72df6adee18aeeca47f33d6e8434cc0762ff64a4..d9fa97a3f655a4453dadedf62df6e6c8ea9e6ed7 100644 (file)
@@ -1,3 +1,7 @@
+2015-07-07  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/vect/vect-over-widen-3-big-array.c: Adjust.
+
 2015-07-07  Andrew Bennett  <andrew.bennett@imgtec.com>
 
        * gcc.target/mips/call-1.c: Allow testcase to match the jrc instruction.
index f5afc44c1157c12e693a86e166156fb5b5e8b974..1ca312829a723963e909d3507ef32cbc70b61dc5 100644 (file)
@@ -58,6 +58,6 @@ int main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "vect_recog_over_widening_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vect_recog_over_widening_pattern: detected" 2 "vect" } } */
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */