Overload HONOR_INFINITIES, etc macros

Richard Biener richard.guenther@gmail.com
Fri Dec 12 09:15:00 GMT 2014


On Thu, Dec 11, 2014 at 9:47 PM, Marc Glisse <marc.glisse@inria.fr> wrote:
> Hello,
>
> after HONOR_NANS, I am turning the other HONOR_* macros into functions. As a
> reminder, the goal is both to make uses shorter and to fix the answer for
> non-native vector types.
>
> Bootstrap+testsuite on x86_64-linux-gnu.

Ok.

Thanks,
Richard.

> 2014-12-12  Marc Glisse  <marc.glisse@inria.fr>
>
>         * real.h (HONOR_SNANS, HONOR_INFINITIES, HONOR_SIGNED_ZEROS,
>         HONOR_SIGN_DEPENDENT_ROUNDING): Replace macros with 3 overloaded
>         declarations.
>         * real.c (HONOR_NANS): Fix indentation.
>         (HONOR_SNANS, HONOR_INFINITIES, HONOR_SIGNED_ZEROS,
>         HONOR_SIGN_DEPENDENT_ROUNDING): Define three overloads.
>         * builtins.c (fold_builtin_cproj, fold_builtin_signbit,
>         fold_builtin_fmin_fmax, fold_builtin_classify): Simplify argument
>         of HONOR_*.
>         * fold-const.c (operand_equal_p, fold_comparison, fold_binary_loc):
>         Likewise.
>         * gimple-fold.c (gimple_val_nonnegative_real_p): Likewise.
>         * ifcvt.c (noce_try_move, noce_try_minmax, noce_try_abs): Likewise.
>         * omp-low.c (omp_reduction_init): Likewise.
>         * rtlanal.c (may_trap_p_1): Likewise.
>         * simplify-rtx.c (simplify_const_relational_operation): Likewise.
>         * tree-ssa-dom.c (record_equality, record_edge_info): Likewise.
>         * tree-ssa-phiopt.c (value_replacement, abs_replacement): Likewise.
>         * tree-ssa-reassoc.c (eliminate_using_constants): Likewise.
>         * tree-ssa-uncprop.c (associate_equivalences_with_edges): Likewise.
>
>
> --
> Marc Glisse
> Index: gcc/builtins.c
> ===================================================================
> --- gcc/builtins.c      (revision 218639)
> +++ gcc/builtins.c      (working copy)
> @@ -7671,21 +7671,21 @@ build_complex_cproj (tree type, bool neg
>     return type.  Return NULL_TREE if no simplification can be made.  */
>
>  static tree
>  fold_builtin_cproj (location_t loc, tree arg, tree type)
>  {
>    if (!validate_arg (arg, COMPLEX_TYPE)
>        || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
>      return NULL_TREE;
>
>    /* If there are no infinities, return arg.  */
> -  if (! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (type))))
> +  if (! HONOR_INFINITIES (type))
>      return non_lvalue_loc (loc, arg);
>
>    /* Calculate the result when the argument is a constant.  */
>    if (TREE_CODE (arg) == COMPLEX_CST)
>      {
>        const REAL_VALUE_TYPE *real = TREE_REAL_CST_PTR (TREE_REALPART
> (arg));
>        const REAL_VALUE_TYPE *imag = TREE_REAL_CST_PTR (TREE_IMAGPART
> (arg));
>
>        if (real_isinf (real) || real_isinf (imag))
>         return build_complex_cproj (type, imag->sign);
> @@ -8942,21 +8942,21 @@ fold_builtin_signbit (location_t loc, tr
>        return (REAL_VALUE_NEGATIVE (c)
>               ? build_one_cst (type)
>               : build_zero_cst (type));
>      }
>
>    /* If ARG is non-negative, the result is always zero.  */
>    if (tree_expr_nonnegative_p (arg))
>      return omit_one_operand_loc (loc, type, integer_zero_node, arg);
>
>    /* If ARG's format doesn't have signed zeros, return "arg < 0.0".  */
> -  if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg))))
> +  if (!HONOR_SIGNED_ZEROS (arg))
>      return fold_convert (type,
>                          fold_build2_loc (loc, LT_EXPR, boolean_type_node,
> arg,
>                         build_real (TREE_TYPE (arg), dconst0)));
>
>    return NULL_TREE;
>  }
>
>  /* Fold function call to builtin copysign, copysignf or copysignl with
>     arguments ARG1 and ARG2.  Return NULL_TREE if no simplification can
>     be made.  */
> @@ -9136,26 +9136,26 @@ fold_builtin_fmin_fmax (location_t loc,
>        tree res = do_mpfr_arg2 (arg0, arg1, type, (max ? mpfr_max :
> mpfr_min));
>
>        if (res)
>         return res;
>
>        /* If either argument is NaN, return the other one.  Avoid the
>          transformation if we get (and honor) a signalling NaN.  Using
>          omit_one_operand() ensures we create a non-lvalue.  */
>        if (TREE_CODE (arg0) == REAL_CST
>           && real_isnan (&TREE_REAL_CST (arg0))
> -         && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
> +         && (! HONOR_SNANS (arg0)
>               || ! TREE_REAL_CST (arg0).signalling))
>         return omit_one_operand_loc (loc, type, arg1, arg0);
>        if (TREE_CODE (arg1) == REAL_CST
>           && real_isnan (&TREE_REAL_CST (arg1))
> -         && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
> +         && (! HONOR_SNANS (arg1)
>               || ! TREE_REAL_CST (arg1).signalling))
>         return omit_one_operand_loc (loc, type, arg0, arg1);
>
>        /* Transform fmin/fmax(x,x) -> x.  */
>        if (operand_equal_p (arg0, arg1, OEP_PURE_SAME))
>         return omit_one_operand_loc (loc, type, arg0, arg1);
>
>        /* Convert fmin/fmax to MIN_EXPR/MAX_EXPR.  C99 requires these
>          functions to return the numeric arg if the other one is NaN.
>          These tree codes don't honor that, so only transform if
> @@ -9552,21 +9552,21 @@ fold_builtin_classify (location_t loc, t
>  {
>    tree type = TREE_TYPE (TREE_TYPE (fndecl));
>    REAL_VALUE_TYPE r;
>
>    if (!validate_arg (arg, REAL_TYPE))
>      return NULL_TREE;
>
>    switch (builtin_index)
>      {
>      case BUILT_IN_ISINF:
> -      if (!HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
> +      if (!HONOR_INFINITIES (arg))
>         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
>
>        if (TREE_CODE (arg) == REAL_CST)
>         {
>           r = TREE_REAL_CST (arg);
>           if (real_isinf (&r))
>             return real_compare (GT_EXPR, &r, &dconst0)
>                    ? integer_one_node : integer_minus_one_node;
>           else
>             return integer_zero_node;
> @@ -9601,21 +9601,21 @@ fold_builtin_classify (location_t loc, t
>             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
>                                isinf_call, tmp,
>                                integer_zero_node);
>           }
>
>         return tmp;
>        }
>
>      case BUILT_IN_ISFINITE:
>        if (!HONOR_NANS (arg)
> -         && !HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
> +         && !HONOR_INFINITIES (arg))
>         return omit_one_operand_loc (loc, type, integer_one_node, arg);
>
>        if (TREE_CODE (arg) == REAL_CST)
>         {
>           r = TREE_REAL_CST (arg);
>           return real_isfinite (&r) ? integer_one_node : integer_zero_node;
>         }
>
>        return NULL_TREE;
>
> Index: gcc/fold-const.c
> ===================================================================
> --- gcc/fold-const.c    (revision 218639)
> +++ gcc/fold-const.c    (working copy)
> @@ -2793,21 +2793,21 @@ operand_equal_p (const_tree arg0, const_
>        case FIXED_CST:
>         return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (arg0),
>                                        TREE_FIXED_CST (arg1));
>
>        case REAL_CST:
>         if (REAL_VALUES_IDENTICAL (TREE_REAL_CST (arg0),
>                                    TREE_REAL_CST (arg1)))
>           return 1;
>
>
> -       if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg0))))
> +       if (!HONOR_SIGNED_ZEROS (arg0))
>           {
>             /* If we do not distinguish between signed and unsigned zero,
>                consider them equal.  */
>             if (real_zerop (arg0) && real_zerop (arg1))
>               return 1;
>           }
>         return 0;
>
>        case VECTOR_CST:
>         {
> @@ -9158,21 +9158,21 @@ fold_comparison (location_t loc, enum tr
>                                             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 (TYPE_MODE (TREE_TYPE (arg1))))
> +             && ! HONOR_SNANS (arg1))
>             {
>               tem = (code == NE_EXPR) ? integer_one_node :
> integer_zero_node;
>               return omit_one_operand_loc (loc, type, tem, arg0);
>             }
>
>           /* Fold comparisons against infinity.  */
>           if (REAL_VALUE_ISINF (cst)
>               && MODE_HAS_INFINITIES (TYPE_MODE (TREE_TYPE (arg1))))
>             {
>               tem = fold_inf_compare (loc, code, type, arg0, arg1);
> @@ -12801,21 +12801,21 @@ fold_binary_loc (location_t loc,
>      case LE_EXPR:
>      case GE_EXPR:
>        tem = fold_comparison (loc, code, type, op0, op1);
>        if (tem != NULL_TREE)
>         return tem;
>
>        /* Transform comparisons of the form X +- C CMP X.  */
>        if ((TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
>           && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
>           && ((TREE_CODE (TREE_OPERAND (arg0, 1)) == REAL_CST
> -              && !HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0))))
> +              && !HONOR_SNANS (arg0))
>               || (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
>                   && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))))
>         {
>           tree arg01 = TREE_OPERAND (arg0, 1);
>           enum tree_code code0 = TREE_CODE (arg0);
>           int is_positive;
>
>           if (TREE_CODE (arg01) == REAL_CST)
>             is_positive = REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg01)) ? -1 :
> 1;
>           else
> Index: gcc/gimple-fold.c
> ===================================================================
> --- gcc/gimple-fold.c   (revision 218639)
> +++ gcc/gimple-fold.c   (working copy)
> @@ -5825,21 +5825,21 @@ gimple_val_nonnegative_real_p (tree val)
>             CASE_FLT_FN (BUILT_IN_EXP2):
>             CASE_FLT_FN (BUILT_IN_FABS):
>             CASE_FLT_FN (BUILT_IN_FDIM):
>             CASE_FLT_FN (BUILT_IN_HYPOT):
>             CASE_FLT_FN (BUILT_IN_POW10):
>               return true;
>
>             CASE_FLT_FN (BUILT_IN_SQRT):
>               /* sqrt(-0.0) is -0.0, and sqrt is not defined over other
>                  nonnegative inputs.  */
> -             if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (val))))
> +             if (!HONOR_SIGNED_ZEROS (val))
>                 return true;
>
>               break;
>
>             CASE_FLT_FN (BUILT_IN_POWI):
>               /* True if the second argument is an even integer.  */
>               arg1 = gimple_call_arg (def_stmt, 1);
>
>               if (TREE_CODE (arg1) == INTEGER_CST
>                   && (TREE_INT_CST_LOW (arg1) & 1) == 0)
> Index: gcc/ifcvt.c
> ===================================================================
> --- gcc/ifcvt.c (revision 218639)
> +++ gcc/ifcvt.c (working copy)
> @@ -1056,21 +1056,21 @@ noce_try_move (struct noce_if_info *if_i
>    enum rtx_code code = GET_CODE (cond);
>    rtx y;
>    rtx_insn *seq;
>
>    if (code != NE && code != EQ)
>      return FALSE;
>
>    /* This optimization isn't valid if either A or B could be a NaN
>       or a signed zero.  */
>    if (HONOR_NANS (if_info->x)
> -      || HONOR_SIGNED_ZEROS (GET_MODE (if_info->x)))
> +      || HONOR_SIGNED_ZEROS (if_info->x))
>      return FALSE;
>
>    /* Check whether the operands of the comparison are A and in
>       either order.  */
>    if ((rtx_equal_p (if_info->a, XEXP (cond, 0))
>         && rtx_equal_p (if_info->b, XEXP (cond, 1)))
>        || (rtx_equal_p (if_info->a, XEXP (cond, 1))
>           && rtx_equal_p (if_info->b, XEXP (cond, 0))))
>      {
>        if (!rtx_interchangeable_p (if_info->a, if_info->b))
> @@ -1947,21 +1947,21 @@ static int
>  noce_try_minmax (struct noce_if_info *if_info)
>  {
>    rtx cond, target;
>    rtx_insn *earliest, *seq;
>    enum rtx_code code, op;
>    int unsignedp;
>
>    /* ??? Reject modes with NaNs or signed zeros since we don't know how
>       they will be resolved with an SMIN/SMAX.  It wouldn't be too hard
>       to get the target to tell us...  */
> -  if (HONOR_SIGNED_ZEROS (GET_MODE (if_info->x))
> +  if (HONOR_SIGNED_ZEROS (if_info->x)
>        || HONOR_NANS (if_info->x))
>      return FALSE;
>
>    cond = noce_get_alt_condition (if_info, if_info->a, &earliest);
>    if (!cond)
>      return FALSE;
>
>    /* Verify the condition is of the form we expect, and canonicalize
>       the comparison code.  */
>    code = GET_CODE (cond);
> @@ -2041,21 +2041,21 @@ noce_try_minmax (struct noce_if_info *if
>
>  static int
>  noce_try_abs (struct noce_if_info *if_info)
>  {
>    rtx cond, target, a, b, c;
>    rtx_insn *earliest, *seq;
>    int negate;
>    bool one_cmpl = false;
>
>    /* Reject modes with signed zeros.  */
> -  if (HONOR_SIGNED_ZEROS (GET_MODE (if_info->x)))
> +  if (HONOR_SIGNED_ZEROS (if_info->x))
>      return FALSE;
>
>    /* Recognize A and B as constituting an ABS or NABS.  The canonical
>       form is a branch around the negation, taken when the object is the
>       first operand of a comparison against 0 that evaluates to true.  */
>    a = if_info->a;
>    b = if_info->b;
>    if (GET_CODE (a) == NEG && rtx_equal_p (XEXP (a, 0), b))
>      negate = 0;
>    else if (GET_CODE (b) == NEG && rtx_equal_p (XEXP (b, 0), a))
> Index: gcc/omp-low.c
> ===================================================================
> --- gcc/omp-low.c       (revision 218639)
> +++ gcc/omp-low.c       (working copy)
> @@ -3032,40 +3032,40 @@ omp_reduction_init (tree clause, tree ty
>      case EQ_EXPR:
>        return fold_convert_loc (loc, type, integer_one_node);
>
>      case BIT_AND_EXPR:
>        return fold_convert_loc (loc, type, integer_minus_one_node);
>
>      case MAX_EXPR:
>        if (SCALAR_FLOAT_TYPE_P (type))
>         {
>           REAL_VALUE_TYPE max, min;
> -         if (HONOR_INFINITIES (TYPE_MODE (type)))
> +         if (HONOR_INFINITIES (type))
>             {
>               real_inf (&max);
>               real_arithmetic (&min, NEGATE_EXPR, &max, NULL);
>             }
>           else
>             real_maxval (&min, 1, TYPE_MODE (type));
>           return build_real (type, min);
>         }
>        else
>         {
>           gcc_assert (INTEGRAL_TYPE_P (type));
>           return TYPE_MIN_VALUE (type);
>         }
>
>      case MIN_EXPR:
>        if (SCALAR_FLOAT_TYPE_P (type))
>         {
>           REAL_VALUE_TYPE max;
> -         if (HONOR_INFINITIES (TYPE_MODE (type)))
> +         if (HONOR_INFINITIES (type))
>             real_inf (&max);
>           else
>             real_maxval (&max, 0, TYPE_MODE (type));
>           return build_real (type, max);
>         }
>        else
>         {
>           gcc_assert (INTEGRAL_TYPE_P (type));
>           return TYPE_MAX_VALUE (type);
>         }
> Index: gcc/real.c
> ===================================================================
> --- gcc/real.c  (revision 218639)
> +++ gcc/real.c  (working copy)
> @@ -4996,13 +4996,95 @@ HONOR_NANS (machine_mode m)
>
>  bool
>  HONOR_NANS (const_tree t)
>  {
>    return HONOR_NANS (element_mode (t));
>  }
>
>  bool
>  HONOR_NANS (const_rtx x)
>  {
> -    return HONOR_NANS (GET_MODE (x));
> +  return HONOR_NANS (GET_MODE (x));
>  }
>
> +/* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs).  */
> +
> +bool
> +HONOR_SNANS (machine_mode m)
> +{
> +  return flag_signaling_nans && HONOR_NANS (m);
> +}
> +
> +bool
> +HONOR_SNANS (const_tree t)
> +{
> +  return HONOR_SNANS (element_mode (t));
> +}
> +
> +bool
> +HONOR_SNANS (const_rtx x)
> +{
> +  return HONOR_SNANS (GET_MODE (x));
> +}
> +
> +/* As for HONOR_NANS, but true if the mode can represent infinity and
> +   the treatment of infinite values is important.  */
> +
> +bool
> +HONOR_INFINITIES (machine_mode m)
> +{
> +  return MODE_HAS_INFINITIES (m) && !flag_finite_math_only;
> +}
> +
> +bool
> +HONOR_INFINITIES (const_tree t)
> +{
> +  return HONOR_INFINITIES (element_mode (t));
> +}
> +
> +bool
> +HONOR_INFINITIES (const_rtx x)
> +{
> +  return HONOR_INFINITIES (GET_MODE (x));
> +}
> +
> +/* Like HONOR_NANS, but true if the given mode distinguishes between
> +   positive and negative zero, and the sign of zero is important.  */
> +
> +bool
> +HONOR_SIGNED_ZEROS (machine_mode m)
> +{
> +  return MODE_HAS_SIGNED_ZEROS (m) && flag_signed_zeros;
> +}
> +
> +bool
> +HONOR_SIGNED_ZEROS (const_tree t)
> +{
> +  return HONOR_SIGNED_ZEROS (element_mode (t));
> +}
> +
> +bool
> +HONOR_SIGNED_ZEROS (const_rtx x)
> +{
> +  return HONOR_SIGNED_ZEROS (GET_MODE (x));
> +}
> +
> +/* Like HONOR_NANS, but true if given mode supports sign-dependent
> rounding,
> +   and the rounding mode is important.  */
> +
> +bool
> +HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode m)
> +{
> +  return MODE_HAS_SIGN_DEPENDENT_ROUNDING (m) && flag_rounding_math;
> +}
> +
> +bool
> +HONOR_SIGN_DEPENDENT_ROUNDING (const_tree t)
> +{
> +  return HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (t));
> +}
> +
> +bool
> +HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx x)
> +{
> +  return HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (x));
> +}
> Index: gcc/real.h
> ===================================================================
> --- gcc/real.h  (revision 218639)
> +++ gcc/real.h  (working copy)
> @@ -188,48 +188,53 @@ extern const struct real_format *
>  #define MODE_HAS_NANS(MODE) \
>    (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_nans)
>  #define MODE_HAS_INFINITIES(MODE) \
>    (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_inf)
>  #define MODE_HAS_SIGNED_ZEROS(MODE) \
>    (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_signed_zero)
>  #define MODE_HAS_SIGN_DEPENDENT_ROUNDING(MODE) \
>    (FLOAT_MODE_P (MODE) \
>     && FLOAT_MODE_FORMAT (MODE)->has_sign_dependent_rounding)
>
> +/* Declare functions in real.c.  */
> +
>  /* True if the given mode has a NaN representation and the treatment of
>     NaN operands is important.  Certain optimizations, such as folding
>     x * 0 into 0, are not correct for NaN operands, and are normally
>     disabled for modes with NaNs.  The user can ask for them to be
>     done anyway using the -funsafe-math-optimizations switch.  */
>  extern bool HONOR_NANS (machine_mode);
>  extern bool HONOR_NANS (const_tree);
>  extern bool HONOR_NANS (const_rtx);
>
>  /* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs).  */
> -#define HONOR_SNANS(MODE) (flag_signaling_nans && HONOR_NANS (MODE))
> +extern bool HONOR_SNANS (machine_mode);
> +extern bool HONOR_SNANS (const_tree);
> +extern bool HONOR_SNANS (const_rtx);
>
>  /* As for HONOR_NANS, but true if the mode can represent infinity and
>     the treatment of infinite values is important.  */
> -#define HONOR_INFINITIES(MODE) \
> -  (MODE_HAS_INFINITIES (MODE) && !flag_finite_math_only)
> +extern bool HONOR_INFINITIES (machine_mode);
> +extern bool HONOR_INFINITIES (const_tree);
> +extern bool HONOR_INFINITIES (const_rtx);
>
>  /* Like HONOR_NANS, but true if the given mode distinguishes between
>     positive and negative zero, and the sign of zero is important.  */
> -#define HONOR_SIGNED_ZEROS(MODE) \
> -  (MODE_HAS_SIGNED_ZEROS (MODE) && flag_signed_zeros)
> +extern bool HONOR_SIGNED_ZEROS (machine_mode);
> +extern bool HONOR_SIGNED_ZEROS (const_tree);
> +extern bool HONOR_SIGNED_ZEROS (const_rtx);
>
>  /* Like HONOR_NANS, but true if given mode supports sign-dependent
> rounding,
>     and the rounding mode is important.  */
> -#define HONOR_SIGN_DEPENDENT_ROUNDING(MODE) \
> -  (MODE_HAS_SIGN_DEPENDENT_ROUNDING (MODE) && flag_rounding_math)
> -
> -/* Declare functions in real.c.  */
> +extern bool HONOR_SIGN_DEPENDENT_ROUNDING (machine_mode);
> +extern bool HONOR_SIGN_DEPENDENT_ROUNDING (const_tree);
> +extern bool HONOR_SIGN_DEPENDENT_ROUNDING (const_rtx);
>
>  /* Binary or unary arithmetic on tree_code.  */
>  extern bool real_arithmetic (REAL_VALUE_TYPE *, int, const REAL_VALUE_TYPE
> *,
>                              const REAL_VALUE_TYPE *);
>
>  /* Compare reals by tree_code.  */
>  extern bool real_compare (int, const REAL_VALUE_TYPE *, const
> REAL_VALUE_TYPE *);
>
>  /* Determine whether a floating-point value X is infinite.  */
>  extern bool real_isinf (const REAL_VALUE_TYPE *);
> Index: gcc/rtlanal.c
> ===================================================================
> --- gcc/rtlanal.c       (revision 218639)
> +++ gcc/rtlanal.c       (working copy)
> @@ -2519,21 +2519,21 @@ may_trap_p_1 (const_rtx x, unsigned flag
>                                         GET_MODE (x), code_changed);
>         }
>
>        return 0;
>
>        /* Division by a non-constant might trap.  */
>      case DIV:
>      case MOD:
>      case UDIV:
>      case UMOD:
> -      if (HONOR_SNANS (GET_MODE (x)))
> +      if (HONOR_SNANS (x))
>         return 1;
>        if (SCALAR_FLOAT_MODE_P (GET_MODE (x)))
>         return flag_trapping_math;
>        if (!CONSTANT_P (XEXP (x, 1)) || (XEXP (x, 1) == const0_rtx))
>         return 1;
>        break;
>
>      case EXPR_LIST:
>        /* An EXPR_LIST is used to represent a function call.  This
>          certainly may trap.  */
> @@ -2556,25 +2556,25 @@ may_trap_p_1 (const_rtx x, unsigned flag
>         return 1;
>        /* But often the compare has some CC mode, so check operand
>          modes as well.  */
>        if (HONOR_NANS (XEXP (x, 0))
>           || HONOR_NANS (XEXP (x, 1)))
>         return 1;
>        break;
>
>      case EQ:
>      case NE:
> -      if (HONOR_SNANS (GET_MODE (x)))
> +      if (HONOR_SNANS (x))
>         return 1;
>        /* Often comparison is CC mode, so check operand modes.  */
> -      if (HONOR_SNANS (GET_MODE (XEXP (x, 0)))
> -         || HONOR_SNANS (GET_MODE (XEXP (x, 1))))
> +      if (HONOR_SNANS (XEXP (x, 0))
> +         || HONOR_SNANS (XEXP (x, 1)))
>         return 1;
>        break;
>
>      case FIX:
>        /* Conversion of floating point might trap.  */
>        if (flag_trapping_math && HONOR_NANS (XEXP (x, 0)))
>         return 1;
>        break;
>
>      case NEG:
> Index: gcc/simplify-rtx.c
> ===================================================================
> --- gcc/simplify-rtx.c  (revision 218639)
> +++ gcc/simplify-rtx.c  (working copy)
> @@ -4750,21 +4750,21 @@ simplify_const_relational_operation (enu
>    if (! HONOR_NANS (mode) && code == UNORDERED)
>      return const0_rtx;
>
>    /* For modes without NaNs, if the two operands are equal, we know the
>       result except if they have side-effects.  Even with NaNs we know
>       the result of unordered comparisons and, if signaling NaNs are
>       irrelevant, also the result of LT/GT/LTGT.  */
>    if ((! HONOR_NANS (trueop0)
>         || code == UNEQ || code == UNLE || code == UNGE
>         || ((code == LT || code == GT || code == LTGT)
> -          && ! HONOR_SNANS (GET_MODE (trueop0))))
> +          && ! HONOR_SNANS (trueop0)))
>        && rtx_equal_p (trueop0, trueop1)
>        && ! side_effects_p (trueop0))
>      return comparison_result (code, CMP_EQ);
>
>    /* If the operands are floating-point constants, see if we can fold
>       the result.  */
>    if (CONST_DOUBLE_AS_FLOAT_P (trueop0)
>        && CONST_DOUBLE_AS_FLOAT_P (trueop1)
>        && SCALAR_FLOAT_MODE_P (GET_MODE (trueop0)))
>      {
> Index: gcc/tree-ssa-dom.c
> ===================================================================
> --- gcc/tree-ssa-dom.c  (revision 218639)
> +++ gcc/tree-ssa-dom.c  (working copy)
> @@ -1652,21 +1652,21 @@ record_equality (tree x, tree y)
>      y = prev_y;
>
>    /* After the swapping, we must have one SSA_NAME.  */
>    if (TREE_CODE (x) != SSA_NAME)
>      return;
>
>    /* For IEEE, -0.0 == 0.0, so we don't necessarily know the sign of a
>       variable compared against zero.  If we're honoring signed zeros,
>       then we cannot record this value unless we know that the value is
>       nonzero.  */
> -  if (HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (x)))
> +  if (HONOR_SIGNED_ZEROS (x)
>        && (TREE_CODE (y) != REAL_CST
>           || REAL_VALUES_EQUAL (dconst0, TREE_REAL_CST (y))))
>      return;
>
>    record_const_or_copy_1 (x, y, prev_x);
>  }
>
>  /* Returns true when STMT is a simple iv increment.  It detects the
>     following situation:
>
> @@ -1893,21 +1893,21 @@ record_edge_info (basic_block bb)
>                                      : boolean_true_node);
>                  }
>              }
>            else if (is_gimple_min_invariant (op0)
>                     && (TREE_CODE (op1) == SSA_NAME
>                         || is_gimple_min_invariant (op1)))
>              {
>                tree cond = build2 (code, boolean_type_node, op0, op1);
>                tree inverted = invert_truthvalue_loc (loc, cond);
>                bool can_infer_simple_equiv
> -                = !(HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op0)))
> +                = !(HONOR_SIGNED_ZEROS (op0)
>                      && real_zerop (op0));
>                struct edge_info *edge_info;
>
>                edge_info = allocate_edge_info (true_edge);
>                record_conditions (edge_info, cond, inverted);
>
>                if (can_infer_simple_equiv && code == EQ_EXPR)
>                  {
>                    edge_info->lhs = op1;
>                    edge_info->rhs = op0;
> @@ -1923,21 +1923,21 @@ record_edge_info (basic_block bb)
>                  }
>              }
>
>            else if (TREE_CODE (op0) == SSA_NAME
>                     && (TREE_CODE (op1) == SSA_NAME
>                         || is_gimple_min_invariant (op1)))
>              {
>                tree cond = build2 (code, boolean_type_node, op0, op1);
>                tree inverted = invert_truthvalue_loc (loc, cond);
>                bool can_infer_simple_equiv
> -                = !(HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op1)))
> +                = !(HONOR_SIGNED_ZEROS (op1)
>                      && (TREE_CODE (op1) == SSA_NAME || real_zerop (op1)));
>                struct edge_info *edge_info;
>
>                edge_info = allocate_edge_info (true_edge);
>                record_conditions (edge_info, cond, inverted);
>
>                if (can_infer_simple_equiv && code == EQ_EXPR)
>                  {
>                    edge_info->lhs = op0;
>                    edge_info->rhs = op1;
> Index: gcc/tree-ssa-phiopt.c
> ===================================================================
> --- gcc/tree-ssa-phiopt.c       (revision 218639)
> +++ gcc/tree-ssa-phiopt.c       (working copy)
> @@ -742,21 +742,21 @@ value_replacement (basic_block cond_bb,
>                    tree arg0, tree arg1)
>  {
>    gimple_stmt_iterator gsi;
>    gimple cond;
>    edge true_edge, false_edge;
>    enum tree_code code;
>    bool emtpy_or_with_defined_p = true;
>
>    /* If the type says honor signed zeros we cannot do this
>       optimization.  */
> -  if (HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
> +  if (HONOR_SIGNED_ZEROS (arg1))
>      return 0;
>
>    /* If there is a statement in MIDDLE_BB that defines one of the PHI
>       arguments, then adjust arg0 or arg1.  */
>    gsi = gsi_start_nondebug_after_labels_bb (middle_bb);
>    while (!gsi_end_p (gsi))
>      {
>        gimple stmt = gsi_stmt (gsi);
>        tree lhs;
>        gsi_next_nondebug (&gsi);
> @@ -1175,21 +1175,21 @@ abs_replacement (basic_block cond_bb, ba
>    gimple_stmt_iterator gsi;
>    edge true_edge, false_edge;
>    gimple assign;
>    edge e;
>    tree rhs, lhs;
>    bool negate;
>    enum tree_code cond_code;
>
>    /* If the type says honor signed zeros we cannot do this
>       optimization.  */
> -  if (HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
> +  if (HONOR_SIGNED_ZEROS (arg1))
>      return false;
>
>    /* OTHER_BLOCK must have only one executable statement which must have
> the
>       form arg0 = -arg1 or arg1 = -arg0.  */
>
>    assign = last_and_only_stmt (middle_bb);
>    /* If we did not find the proper negation assignment, then we can not
>       optimize.  */
>    if (assign == NULL)
>      return false;
> Index: gcc/tree-ssa-reassoc.c
> ===================================================================
> --- gcc/tree-ssa-reassoc.c      (revision 218639)
> +++ gcc/tree-ssa-reassoc.c      (working copy)
> @@ -960,37 +960,37 @@ eliminate_using_constants (enum tree_cod
>                     fprintf (dump_file, "Found | 0, removing\n");
>                   ops->pop ();
>                   reassociate_stats.ops_eliminated++;
>                 }
>             }
>           break;
>         case MULT_EXPR:
>           if (integer_zerop (oelast->op)
>               || (FLOAT_TYPE_P (type)
>                   && !HONOR_NANS (type)
> -                 && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))
> +                 && !HONOR_SIGNED_ZEROS (type)
>                   && real_zerop (oelast->op)))
>             {
>               if (ops->length () != 1)
>                 {
>                   if (dump_file && (dump_flags & TDF_DETAILS))
>                     fprintf (dump_file, "Found * 0, removing all other
> ops\n");
>
>                   reassociate_stats.ops_eliminated += ops->length () - 1;
>                   ops->truncate (1);
>                   ops->quick_push (oelast);
>                   return;
>                 }
>             }
>           else if (integer_onep (oelast->op)
>                    || (FLOAT_TYPE_P (type)
> -                      && !HONOR_SNANS (TYPE_MODE (type))
> +                      && !HONOR_SNANS (type)
>                        && real_onep (oelast->op)))
>             {
>               if (ops->length () != 1)
>                 {
>                   if (dump_file && (dump_flags & TDF_DETAILS))
>                     fprintf (dump_file, "Found * 1, removing\n");
>                   ops->pop ();
>                   reassociate_stats.ops_eliminated++;
>                   return;
>                 }
> Index: gcc/tree-ssa-uncprop.c
> ===================================================================
> --- gcc/tree-ssa-uncprop.c      (revision 218639)
> +++ gcc/tree-ssa-uncprop.c      (working copy)
> @@ -153,21 +153,21 @@ associate_equivalences_with_edges (void)
>               else if (TREE_CODE (op0) == SSA_NAME
>                        && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0)
>                        && (is_gimple_min_invariant (op1)
>                            || (TREE_CODE (op1) == SSA_NAME
>                                && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op1))))
>                 {
>                   /* For IEEE, -0.0 == 0.0, so we don't necessarily know
>                      the sign of a variable compared against zero.  If
>                      we're honoring signed zeros, then we cannot record
>                      this value unless we know that the value is nonzero.
> */
> -                 if (HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (op0)))
> +                 if (HONOR_SIGNED_ZEROS (op0)
>                       && (TREE_CODE (op1) != REAL_CST
>                           || REAL_VALUES_EQUAL (dconst0, TREE_REAL_CST
> (op1))))
>                     continue;
>
>                   equivalency = XNEW (struct edge_equivalency);
>                   equivalency->lhs = op0;
>                   equivalency->rhs = op1;
>                   if (code == EQ_EXPR)
>                     true_edge->aux = equivalency;
>                   else
>



More information about the Gcc-patches mailing list