Simplify -x<0 to x>0
Richard Biener
richard.guenther@gmail.com
Tue May 26 09:21:00 GMT 2015
On Sun, May 24, 2015 at 3:33 PM, Marc Glisse <marc.glisse@inria.fr> wrote:
> Hello,
>
> I noticed we were only doing this transformation for floats and not for
> integers, so I took the chance to move it to match.pd. Regtested on
> ppc64le-redhat-linux.
Ok.
Thanks,
Richard.
> 2015-05-25 Marc Glisse <marc.glisse@inria.fr>
>
> * match.pd (swapped_tcc_comparison): New operator list.
> (-A CMP -B): New simplification.
> * fold-const.c (fold_comparison): Remove corresponding code.
>
> --
> Marc Glisse
> Index: gcc/fold-const.c
> ===================================================================
> --- gcc/fold-const.c (revision 223630)
> +++ gcc/fold-const.c (working copy)
> @@ -9176,38 +9176,25 @@ fold_comparison (location_t loc, enum tr
>
> if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype))
> newtype = TREE_TYPE (targ1);
>
> /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */
> if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0)))
> return fold_build2_loc (loc, code, type,
> fold_convert_loc (loc, newtype, targ0),
> fold_convert_loc (loc, newtype, targ1));
>
> - /* (-a) CMP (-b) -> b CMP a */
> - if (TREE_CODE (arg0) == NEGATE_EXPR
> - && TREE_CODE (arg1) == NEGATE_EXPR)
> - return fold_build2_loc (loc, code, type, TREE_OPERAND (arg1, 0),
> - TREE_OPERAND (arg0, 0));
> -
> if (TREE_CODE (arg1) == REAL_CST)
> {
> REAL_VALUE_TYPE cst;
> cst = TREE_REAL_CST (arg1);
>
> - /* (-a) CMP CST -> a swap(CMP) (-CST) */
> - if (TREE_CODE (arg0) == NEGATE_EXPR)
> - return fold_build2_loc (loc, swap_tree_comparison (code), type,
> - TREE_OPERAND (arg0, 0),
> - build_real (TREE_TYPE (arg1),
> - real_value_negate (&cst)));
> -
> /* IEEE doesn't distinguish +0 and -0 in comparisons. */
> /* a CMP (-0) -> a CMP 0 */
> if (REAL_VALUE_MINUS_ZERO (cst))
> return fold_build2_loc (loc, code, type, arg0,
> build_real (TREE_TYPE (arg1), dconst0));
>
> /* x != NaN is always true, other ops are always false. */
> if (REAL_VALUE_ISNAN (cst)
> && ! HONOR_SNANS (arg1))
> {
> Index: gcc/match.pd
> ===================================================================
> --- gcc/match.pd (revision 223630)
> +++ gcc/match.pd (working copy)
> @@ -31,20 +31,22 @@ along with GCC; see the file COPYING3.
> CONSTANT_CLASS_P
> tree_expr_nonnegative_p)
>
> /* Operator lists. */
> (define_operator_list tcc_comparison
> lt le eq ne ge gt unordered ordered unlt unle ungt unge uneq
> ltgt)
> (define_operator_list inverted_tcc_comparison
> ge gt ne eq lt le ordered unordered ge gt le lt ltgt
> uneq)
> (define_operator_list inverted_tcc_comparison_with_nans
> unge ungt ne eq unlt unle ordered unordered ge gt le lt ltgt
> uneq)
> +(define_operator_list swapped_tcc_comparison
> + gt ge eq ne le lt unordered ordered ungt unge unlt unle uneq
> ltgt)
>
>
> /* Simplifications of operations with one constant operand and
> simplifications to constants or single values. */
>
> (for op (plus pointer_plus minus bit_ior bit_xor)
> (simplify
> (op @0 integer_zerop)
> (non_lvalue @0)))
>
> @@ -973,20 +975,38 @@ along with GCC; see the file COPYING3.
> (bit_and (ordered @0 @0) (ordered @1 @1))
> (if (types_match (@0, @1))
> (ordered @0 @1)))
> (simplify
> (bit_ior:c (unordered @0 @0) (unordered:c@2 @0 @1))
> @2)
> (simplify
> (bit_and:c (ordered @0 @0) (ordered:c@2 @0 @1))
> @2)
>
> +/* -A CMP -B -> B CMP A. */
> +(for cmp (tcc_comparison)
> + scmp (swapped_tcc_comparison)
> + (simplify
> + (cmp (negate @0) (negate @1))
> + (if (FLOAT_TYPE_P (TREE_TYPE (@0))
> + || (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
> + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))))
> + (scmp @0 @1)))
> + (simplify
> + (cmp (negate @0) CONSTANT_CLASS_P@1)
> + (if (FLOAT_TYPE_P (TREE_TYPE (@0))
> + || (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
> + && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))))
> + (with { tree tem = fold_unary (NEGATE_EXPR, TREE_TYPE (@0), @1); }
> + (if (tem && !TREE_OVERFLOW (tem))
> + (scmp @0 { tem; }))))))
> +
> /* Simplification of math builtins. */
>
> (define_operator_list LOG BUILT_IN_LOGF BUILT_IN_LOG BUILT_IN_LOGL)
> (define_operator_list EXP BUILT_IN_EXPF BUILT_IN_EXP BUILT_IN_EXPL)
> (define_operator_list LOG2 BUILT_IN_LOG2F BUILT_IN_LOG2 BUILT_IN_LOG2L)
> (define_operator_list EXP2 BUILT_IN_EXP2F BUILT_IN_EXP2 BUILT_IN_EXP2L)
> (define_operator_list LOG10 BUILT_IN_LOG10F BUILT_IN_LOG10 BUILT_IN_LOG10L)
> (define_operator_list EXP10 BUILT_IN_EXP10F BUILT_IN_EXP10 BUILT_IN_EXP10L)
> (define_operator_list POW BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL)
> (define_operator_list POW10 BUILT_IN_POW10F BUILT_IN_POW10 BUILT_IN_POW10L)
>
More information about the Gcc-patches
mailing list