This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Clean-ups in match.pd


On Sat, Jul 4, 2015 at 4:34 PM, Marc Glisse <marc.glisse@inria.fr> wrote:
> Hello,
>
> these are just some minor changes. I believe I had already promised a build_
> function to match integer_each_onep.
>
> Bootstrap+testsuite on powerpc64le-unknown-linux-gnu (it looks like
> *-match.c takes about 10 minutes to compile in stage2 these days).

Ouch.  I have some changes to the code generation in the queue which
also supports a more natural "if" structure (else and elif).  Eventually
that helps a bit but I suppose the main issue is simply from the large
functions.  They can be split quite easily I think, but passing down
all relevant state might turn out to be tricky unless we start using
nested functions here ... (and IIRC those are not supported in C++)



Richard.

> 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.
>
> --
> Marc Glisse
> Index: match.pd
> ===================================================================
> --- match.pd    (revision 225411)
> +++ match.pd    (working copy)
> @@ -101,7 +101,7 @@
>     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.
> @@ -108,8 +108,8 @@
>     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)))
>
> @@ -116,8 +116,8 @@
>  /* 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 @@
>   (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 @@
>   (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,10 @@
>    @1)
>
>  /* ~x | x -> -1 */

Please also adjust this comment.  Ok with that change.

Thanks,
Richard.

> -(simplify
> - (bit_ior:c (convert? @0) (convert? (bit_not @0)))
> - (convert { build_all_ones_cst (TREE_TYPE (@0)); }))
> +(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 +312,6 @@
>    (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)
> @@ -603,11 +599,11 @@
>  (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: tree.c
> ===================================================================
> --- tree.c      (revision 225411)
> +++ tree.c      (working copy)
> @@ -1968,6 +1968,21 @@
>    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: tree.h
> ===================================================================
> --- tree.h      (revision 225411)
> +++ tree.h      (working copy)
> @@ -3772,6 +3772,7 @@
>  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);
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]