fold-const.c (fold_binary_loc): Move (T)ptr & CST folding...
authorRichard Biener <rguenther@suse.de>
Fri, 3 Jul 2015 07:55:10 +0000 (07:55 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 3 Jul 2015 07:55:10 +0000 (07:55 +0000)
2015-07-03  Richard Biener  <rguenther@suse.de>

* fold-const.c (fold_binary_loc): Move (T)ptr & CST folding...
* match.pd: ... here.

From-SVN: r225368

gcc/ChangeLog
gcc/fold-const.c
gcc/match.pd

index 64cff098ed11f2abf9098ecb3df326391580776b..c2fa47d8378bdeaed25a3c54da8784875182eeaa 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-03  Richard Biener  <rguenther@suse.de>
+
+       * fold-const.c (fold_binary_loc): Move (T)ptr & CST folding...
+       * match.pd: ... here.
+
 2015-07-03  Gerald Pfeifer  <gerald@pfeifer.com>
 
        PR target/37072
index a02cfb7b1f012b444cfb5cb62f0f79dee3c7b64d..69ac19dfae07786f6ff5adfa07456eba4764f490 100644 (file)
@@ -11069,25 +11069,6 @@ fold_binary_loc (location_t loc,
              fold_convert_loc (loc, type, TREE_OPERAND (arg0, 0));
        }
 
-      /* If arg0 is derived from the address of an object or function, we may
-        be able to fold this expression using the object or function's
-        alignment.  */
-      if (POINTER_TYPE_P (TREE_TYPE (arg0)) && TREE_CODE (arg1) == INTEGER_CST)
-       {
-         unsigned int align;
-         unsigned HOST_WIDE_INT bitpos;
-
-         get_pointer_alignment_1 (arg0, &align, &bitpos);
-
-         /* This works because modulus is a power of 2.  If this weren't the
-            case, we'd have to replace it by its greatest power-of-2
-            divisor: modulus & -modulus.  */
-         if (wi::ltu_p (arg1, align / BITS_PER_UNIT))
-           return wide_int_to_tree (type,
-                                    wi::bit_and (arg1,
-                                                 bitpos / BITS_PER_UNIT));
-       }
-
       goto associate;
 
     case RDIV_EXPR:
index 6c138390acab094ab3b331bd8e290e3760aeeee2..5ac573a68e5ba6265fd8651a0a96fe8d75e68c18 100644 (file)
@@ -668,6 +668,21 @@ along with GCC; see the file COPYING3.  If not see
    (if (ptr_difference_const (@0, @1, &diff))
     { build_int_cst_type (type, diff); }))))
 
+/* If arg0 is derived from the address of an object or function, we may
+   be able to fold this expression using the object or function's
+   alignment.  */
+(simplify
+ (bit_and (convert? @0) INTEGER_CST@1)
+ (if (POINTER_TYPE_P (TREE_TYPE (@0))
+      && tree_nop_conversion_p (type, TREE_TYPE (@0)))
+  (with
+   {
+     unsigned int align;
+     unsigned HOST_WIDE_INT bitpos;
+     get_pointer_alignment_1 (@0, &align, &bitpos);
+   }
+   (if (wi::ltu_p (@1, align / BITS_PER_UNIT))
+    { wide_int_to_tree (type, wi::bit_and (@1, bitpos / BITS_PER_UNIT)); }))))
 
 
 /* We can't reassociate at all for saturating types.  */