match.pd: Remove element_mode inside HONOR_*.
authorMarc Glisse <marc.glisse@inria.fr>
Mon, 6 Jul 2015 18:19:41 +0000 (20:19 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Mon, 6 Jul 2015 18:19:41 +0000 (18:19 +0000)
2015-07-06  Marc Glisse  <marc.glisse@inria.fr>

* match.pd: Remove element_mode inside HONOR_*.
(~ (-A) -> A - 1, ~ (A - 1) -> -A): Handle complex types.
(~X | X -> -1, ~X ^ X -> -1): Merge.
* tree.c (build_each_one_cst): New function.
* tree.h (build_each_one_cst): Likewise.

From-SVN: r225473

gcc/ChangeLog
gcc/match.pd
gcc/tree.c
gcc/tree.h

index 7c73d50d052497a0107e086e0815977711b06ea7..2eeb6c555a9ce7fb6d514459694cb5d766b7580c 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-06  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd: Remove element_mode inside HONOR_*.
+       (~ (-A) -> A - 1, ~ (A - 1) -> -A): Handle complex types.
+       (~X | X -> -1, ~X ^ X -> -1): Merge.
+       * tree.c (build_each_one_cst): New function.
+       * tree.h (build_each_one_cst): Likewise.
+
 2015-07-06  Steve Ellcey  <sellcey@imgtec.com>
 
        * config.gcc <mips*-*-*>: Add fused-madd.opt.
index f850d5232654a70a9801ff2779dc3379476c42ab..53e911a20aa649a2f4ea7e7754fd5a982c127d55 100644 (file)
@@ -101,23 +101,23 @@ along with GCC; see the file COPYING3.  If not see
    negative value by 0 gives -0, not +0.  */
 (simplify
  (mult @0 real_zerop@1)
- (if (!HONOR_NANS (type) && !HONOR_SIGNED_ZEROS (element_mode (type)))
+ (if (!HONOR_NANS (type) && !HONOR_SIGNED_ZEROS (type))
   @1))
 
 /* In IEEE floating point, x*1 is not equivalent to x for snans.
    Likewise for complex arithmetic with signed zeros.  */
 (simplify
  (mult @0 real_onep)
- (if (!HONOR_SNANS (element_mode (type))
-      && (!HONOR_SIGNED_ZEROS (element_mode (type))
+ (if (!HONOR_SNANS (type)
+      && (!HONOR_SIGNED_ZEROS (type)
           || !COMPLEX_FLOAT_TYPE_P (type)))
   (non_lvalue @0)))
 
 /* Transform x * -1.0 into -x.  */
 (simplify
  (mult @0 real_minus_onep)
-  (if (!HONOR_SNANS (element_mode (type))
-       && (!HONOR_SIGNED_ZEROS (element_mode (type))
+  (if (!HONOR_SNANS (type)
+       && (!HONOR_SIGNED_ZEROS (type)
            || !COMPLEX_FLOAT_TYPE_P (type)))
    (negate @0)))
 
@@ -165,7 +165,7 @@ along with GCC; see the file COPYING3.  If not see
  (rdiv @0 @0)
  (if (FLOAT_TYPE_P (type)
       && ! HONOR_NANS (type)
-      && ! HONOR_INFINITIES (element_mode (type)))
+      && ! HONOR_INFINITIES (type))
   { build_one_cst (type); }))
 
 /* Optimize -A / A to -1.0 if we don't care about
@@ -174,19 +174,19 @@ along with GCC; see the file COPYING3.  If not see
  (rdiv:c @0 (negate @0))
  (if (FLOAT_TYPE_P (type)
       && ! HONOR_NANS (type)
-      && ! HONOR_INFINITIES (element_mode (type)))
+      && ! HONOR_INFINITIES (type))
   { build_minus_one_cst (type); }))
 
 /* In IEEE floating point, x/1 is not equivalent to x for snans.  */
 (simplify
  (rdiv @0 real_onep)
- (if (!HONOR_SNANS (element_mode (type)))
+ (if (!HONOR_SNANS (type))
   (non_lvalue @0)))
 
 /* In IEEE floating point, x/-1 is not equivalent to -x for snans.  */
 (simplify
  (rdiv @0 real_minus_onep)
- (if (!HONOR_SNANS (element_mode (type)))
+ (if (!HONOR_SNANS (type))
   (negate @0)))
 
 /* If ARG1 is a constant, we can convert this to a multiply by the
@@ -297,9 +297,12 @@ along with GCC; see the file COPYING3.  If not see
   @1)
 
 /* ~x | x -> -1 */
-(simplify
- (bit_ior:c (convert? @0) (convert? (bit_not @0)))
- (convert { build_all_ones_cst (TREE_TYPE (@0)); }))
+/* ~x ^ x -> -1 */
+/* ~x + x -> -1 */
+(for op (bit_ior bit_xor plus)
+ (simplify
+  (op:c (convert? @0) (convert? (bit_not @0)))
+  (convert { build_all_ones_cst (TREE_TYPE (@0)); })))
 
 /* x ^ x -> 0 */
 (simplify
@@ -311,11 +314,6 @@ along with GCC; see the file COPYING3.  If not see
   (bit_xor @0 integer_all_onesp@1)
   (bit_not @0))
 
-/* ~X ^ X is -1.  */
-(simplify
- (bit_xor:c (bit_not @0) @0)
- { build_all_ones_cst (type); })
-
 /* x & ~0 -> x  */
 (simplify
  (bit_and @0 integer_all_onesp)
@@ -604,11 +602,11 @@ along with GCC; see the file COPYING3.  If not see
 (simplify
  (bit_not (convert? (negate @0)))
  (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
-  (convert (minus @0 { build_one_cst (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_onep)))
+ (bit_not (convert? (minus @0 integer_each_onep)))
  (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
   (convert (negate @0))))
 (simplify
index 6628a387f621d767eecec19f1ce3130258e4b4f9..c0e2b0a2f13a06e38a6adea0ecf905f535deacd7 100644 (file)
@@ -1968,6 +1968,21 @@ build_complex (tree type, tree real, tree imag)
   return t;
 }
 
+/* Return the constant 1 in type TYPE.  If TYPE has several elements, each
+   element is set to 1.  In particular, this is 1 + i for complex types.  */
+
+tree
+build_each_one_cst (tree type)
+{
+  if (TREE_CODE (type) == COMPLEX_TYPE)
+    {
+      tree scalar = build_one_cst (TREE_TYPE (type));
+      return build_complex (type, scalar, scalar);
+    }
+  else
+    return build_one_cst (type);
+}
+
 /* Return a constant of arithmetic type TYPE which is the
    multiplicative identity of the set TYPE.  */
 
index 250f99d14b325c554e6ef0d9e1bd90b2da85aa69..6df22177fc22bb0209d119434c1931228908b59c 100644 (file)
@@ -3772,6 +3772,7 @@ extern tree build_constructor_from_list (tree, tree);
 extern tree build_constructor_va (tree, int, ...);
 extern tree build_real_from_int_cst (tree, const_tree);
 extern tree build_complex (tree, tree, tree);
+extern tree build_each_one_cst (tree);
 extern tree build_one_cst (tree);
 extern tree build_minus_one_cst (tree);
 extern tree build_all_ones_cst (tree);