real.h (HONOR_SNANS, [...]): Replace macros with 3 overloaded declarations.
authorMarc Glisse <marc.glisse@inria.fr>
Fri, 12 Dec 2014 10:46:00 +0000 (11:46 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Fri, 12 Dec 2014 10:46:00 +0000 (10:46 +0000)
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.

From-SVN: r218663

14 files changed:
gcc/ChangeLog
gcc/builtins.c
gcc/fold-const.c
gcc/gimple-fold.c
gcc/ifcvt.c
gcc/omp-low.c
gcc/real.c
gcc/real.h
gcc/rtlanal.c
gcc/simplify-rtx.c
gcc/tree-ssa-dom.c
gcc/tree-ssa-phiopt.c
gcc/tree-ssa-reassoc.c
gcc/tree-ssa-uncprop.c

index a1cdd712373fbbd5f85090066cb0e5baa121ce6d..e62a1e4e518a81a42c155f46f16ed6d310dea6bc 100644 (file)
@@ -1,3 +1,26 @@
+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.
+
 2014-12-12  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa-inline.c (ipa_inline): Fix condition on when
index 0d3198118c0b0d1ae6161f6f4cc603c53bba60bc..445bff2009854d7d7465a61ab5867c009a66679b 100644 (file)
@@ -7678,7 +7678,7 @@ fold_builtin_cproj (location_t loc, tree arg, tree 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.  */
@@ -8949,7 +8949,7 @@ fold_builtin_signbit (location_t loc, tree arg, tree type)
     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)));
@@ -9143,12 +9143,12 @@ fold_builtin_fmin_fmax (location_t loc, tree arg0, tree arg1,
         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);
 
@@ -9559,7 +9559,7 @@ fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index)
   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)
@@ -9608,7 +9608,7 @@ fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index)
 
     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)
index 7b68bea18ab805fa7661300cc3967a2a3eb30c5b..ec5ad980430608306e4a246aa84c2a66af79c399 100644 (file)
@@ -2800,7 +2800,7 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
          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.  */
@@ -9165,7 +9165,7 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
 
          /* 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);
@@ -12808,7 +12808,7 @@ fold_binary_loc (location_t loc,
       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)))))
        {
index e71e0954f6cab2a140158a450076bd2e492f6228..a8ca53da796fb75c1e59cdb7ffe15c9db5e5fde4 100644 (file)
@@ -5832,7 +5832,7 @@ gimple_val_nonnegative_real_p (tree val)
            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;
index f0159c18a88b5233a82112e73d50647adc816c71..90586da835bbe30c63242f228f2f425cc480c150 100644 (file)
@@ -1078,7 +1078,7 @@ noce_try_move (struct noce_if_info *if_info)
   /* 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
@@ -1969,7 +1969,7 @@ noce_try_minmax (struct noce_if_info *if_info)
   /* ??? 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;
 
@@ -2063,7 +2063,7 @@ noce_try_abs (struct noce_if_info *if_info)
   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
index ef143ab5651c90ff0903336c94a545ea6f36a44c..a2e4737915b8fc09a751bee0e4d12cb2dc916f15 100644 (file)
@@ -3039,7 +3039,7 @@ omp_reduction_init (tree clause, tree type)
       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);
@@ -3058,7 +3058,7 @@ omp_reduction_init (tree clause, tree type)
       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));
index 9ba847a6869468fb4ff37d5b350dd0cc79d9e943..bee42456bcade45bc8fb237b57f60b984c8267fe 100644 (file)
@@ -5003,6 +5003,88 @@ HONOR_NANS (const_tree 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 bfdd1e619e0534cdfb8da8a02fe313af6774e2f7..aa312ad9d1eb88727fc41732ca5eafc5581d1d76 100644 (file)
@@ -195,6 +195,8 @@ extern const struct real_format *
   (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
@@ -205,24 +207,27 @@ 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 *,
index e04dea8574102c5b6c5dee0b1e2c73b0a8dafba0..2fad919b08975448bb600fe52983f0ce534fbf76 100644 (file)
@@ -2526,7 +2526,7 @@ may_trap_p_1 (const_rtx x, unsigned flags)
     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;
@@ -2563,11 +2563,11 @@ may_trap_p_1 (const_rtx x, unsigned flags)
 
     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;
 
index 5afbc023d923ddfcba8529970495dc1bd4dbfb90..8ec416e9cc0f0887d93b18f04f23c19facfc87b5 100644 (file)
@@ -4757,7 +4757,7 @@ simplify_const_relational_operation (enum rtx_code code,
   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);
index bd37226c856a80acc941ef48fa8dc934e015c730..7842b79b770994b011815e0c125518c49992fce6 100644 (file)
@@ -1659,7 +1659,7 @@ record_equality (tree x, tree y)
      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;
@@ -1900,7 +1900,7 @@ record_edge_info (basic_block bb)
               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;
 
@@ -1930,7 +1930,7 @@ record_edge_info (basic_block bb)
               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;
 
index b4febee06eca2b229fedaddb5af5e5d4ef276063..be1becb964df03219b38499250a001e932765728 100644 (file)
@@ -749,7 +749,7 @@ value_replacement (basic_block cond_bb, basic_block middle_bb,
 
   /* 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
@@ -1182,7 +1182,7 @@ abs_replacement (basic_block cond_bb, basic_block middle_bb,
 
   /* 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
index 81502925cbd1d41abda47d441fb8223058ea13a3..52a4cae558e4ec716b73c63d1a76e3bb4b5112c7 100644 (file)
@@ -967,7 +967,7 @@ eliminate_using_constants (enum tree_code opcode,
          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)
@@ -983,7 +983,7 @@ eliminate_using_constants (enum tree_code opcode,
            }
          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)
index ecddef4925011a83f3a6e5cd6afa956c100987ee..fd7ee3f04a4aa75621d82d5afd958ab1a975bb15 100644 (file)
@@ -160,7 +160,7 @@ associate_equivalences_with_edges (void)
                     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;