Re: [PATCH 2/5] Fix PR 101237: Remove element_type call when used with the functions from real

2021-07-05 Thread Richard Biener via Gcc-patches
On Sun, Jul 4, 2021 at 8:39 PM apinski--- via Gcc-patches
 wrote:
>
> From: Andrew Pinski 
>
> HONOR_SIGNED_ZEROS, HONOR_SIGN_DEPENDENT_ROUNDING, and HONOR_SNANS all
> have an overload for taking a tree type now, so we should do that instead.
>
> OK?  Bootstrapped and tested on x86_64-linux-gnu.

OK.

Thanks,
Richard.

> gcc/ChangeLog:
>
> PR middle-end/101237
> * fold-const.c (negate_expr_p): Remove call to element_mode
> and TREE_MODE/TREE_TYPE when calling HONOR_SIGNED_ZEROS,
> HONOR_SIGN_DEPENDENT_ROUNDING, and HONOR_SNANS.
> (fold_negate_expr_1): Likewise.
> (const_unop): Likewise.
> (fold_cond_expr_with_comparison): Likewise.
> (fold_binary_loc): Likewise.
> (fold_ternary_loc): Likewise.
> (tree_call_nonnegative_warnv_p): Likewise.
> * match.pd (-(A + B) -> (-B) - A): Likewise.
> ---
>  gcc/fold-const.c | 46 +++---
>  gcc/match.pd |  4 ++--
>  2 files changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/gcc/fold-const.c b/gcc/fold-const.c
> index dfccbaec683..e0cdb75fb26 100644
> --- a/gcc/fold-const.c
> +++ b/gcc/fold-const.c
> @@ -432,8 +432,8 @@ negate_expr_p (tree t)
>return negate_expr_p (TREE_OPERAND (t, 0));
>
>  case PLUS_EXPR:
> -  if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
> - || HONOR_SIGNED_ZEROS (element_mode (type))
> +  if (HONOR_SIGN_DEPENDENT_ROUNDING (type)
> + || HONOR_SIGNED_ZEROS (type)
>   || (ANY_INTEGRAL_TYPE_P (type)
>   && ! TYPE_OVERFLOW_WRAPS (type)))
> return false;
> @@ -445,8 +445,8 @@ negate_expr_p (tree t)
>
>  case MINUS_EXPR:
>/* We can't turn -(A-B) into B-A when we honor signed zeros.  */
> -  return !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
> -&& !HONOR_SIGNED_ZEROS (element_mode (type))
> +  return !HONOR_SIGN_DEPENDENT_ROUNDING (type)
> +&& !HONOR_SIGNED_ZEROS (type)
>  && (! ANY_INTEGRAL_TYPE_P (type)
>  || TYPE_OVERFLOW_WRAPS (type));
>
> @@ -468,7 +468,7 @@ negate_expr_p (tree t)
>/* Fall through.  */
>
>  case RDIV_EXPR:
> -  if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (TREE_TYPE (t
> +  if (! HONOR_SIGN_DEPENDENT_ROUNDING (t))
> return negate_expr_p (TREE_OPERAND (t, 1))
>|| negate_expr_p (TREE_OPERAND (t, 0));
>break;
> @@ -605,8 +605,8 @@ fold_negate_expr_1 (location_t loc, tree t)
>break;
>
>  case PLUS_EXPR:
> -  if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
> - && !HONOR_SIGNED_ZEROS (element_mode (type)))
> +  if (!HONOR_SIGN_DEPENDENT_ROUNDING (type)
> + && !HONOR_SIGNED_ZEROS (type))
> {
>   /* -(A + B) -> (-B) - A.  */
>   if (negate_expr_p (TREE_OPERAND (t, 1)))
> @@ -628,8 +628,8 @@ fold_negate_expr_1 (location_t loc, tree t)
>
>  case MINUS_EXPR:
>/* - (A - B) -> B - A  */
> -  if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
> - && !HONOR_SIGNED_ZEROS (element_mode (type)))
> +  if (!HONOR_SIGN_DEPENDENT_ROUNDING (type)
> + && !HONOR_SIGNED_ZEROS (type))
> return fold_build2_loc (loc, MINUS_EXPR, type,
> TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
>break;
> @@ -641,7 +641,7 @@ fold_negate_expr_1 (location_t loc, tree t)
>/* Fall through.  */
>
>  case RDIV_EXPR:
> -  if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type)))
> +  if (! HONOR_SIGN_DEPENDENT_ROUNDING (type))
> {
>   tem = TREE_OPERAND (t, 1);
>   if (negate_expr_p (tem))
> @@ -1725,7 +1725,7 @@ const_unop (enum tree_code code, tree type, tree arg0)
>/* Don't perform the operation, other than NEGATE and ABS, if
>   flag_signaling_nans is on and the operand is a signaling NaN.  */
>if (TREE_CODE (arg0) == REAL_CST
> -  && HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
> +  && HONOR_SNANS (arg0)
>&& REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0))
>&& code != NEGATE_EXPR
>&& code != ABS_EXPR
> @@ -2135,7 +2135,7 @@ fold_convert_const_real_from_real (tree type, 
> const_tree arg1)
>
>/* Don't perform the operation if flag_signaling_nans is on
>   and the operand is a signaling NaN.  */
> -  if (HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
> +  if (HONOR_SNANS (arg1)
>&& REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg1)))
>  return NULL_TREE;
>
> @@ -5773,7 +5773,7 @@ fold_cond_expr_with_comparison (location_t loc, tree 
> type,
>
>   Note that all these transformations are correct if A is
>   NaN, since the two alternatives (A and -A) are also NaNs.  */
> -  if (!HONOR_SIGNED_ZEROS (element_mode (type))
> +  if (!HONOR_SIGNED_ZEROS (type)
>&& (FLOAT_TYPE_P (TREE_TYPE (arg01))
>   ? real_zerop (arg01)
>   : integer_zerop (arg01))
> @@ 

[PATCH 2/5] Fix PR 101237: Remove element_type call when used with the functions from real

2021-07-04 Thread apinski--- via Gcc-patches
From: Andrew Pinski 

HONOR_SIGNED_ZEROS, HONOR_SIGN_DEPENDENT_ROUNDING, and HONOR_SNANS all
have an overload for taking a tree type now, so we should do that instead.

OK?  Bootstrapped and tested on x86_64-linux-gnu.

gcc/ChangeLog:

PR middle-end/101237
* fold-const.c (negate_expr_p): Remove call to element_mode
and TREE_MODE/TREE_TYPE when calling HONOR_SIGNED_ZEROS,
HONOR_SIGN_DEPENDENT_ROUNDING, and HONOR_SNANS.
(fold_negate_expr_1): Likewise.
(const_unop): Likewise.
(fold_cond_expr_with_comparison): Likewise.
(fold_binary_loc): Likewise.
(fold_ternary_loc): Likewise.
(tree_call_nonnegative_warnv_p): Likewise.
* match.pd (-(A + B) -> (-B) - A): Likewise.
---
 gcc/fold-const.c | 46 +++---
 gcc/match.pd |  4 ++--
 2 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index dfccbaec683..e0cdb75fb26 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -432,8 +432,8 @@ negate_expr_p (tree t)
   return negate_expr_p (TREE_OPERAND (t, 0));
 
 case PLUS_EXPR:
-  if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
- || HONOR_SIGNED_ZEROS (element_mode (type))
+  if (HONOR_SIGN_DEPENDENT_ROUNDING (type)
+ || HONOR_SIGNED_ZEROS (type)
  || (ANY_INTEGRAL_TYPE_P (type)
  && ! TYPE_OVERFLOW_WRAPS (type)))
return false;
@@ -445,8 +445,8 @@ negate_expr_p (tree t)
 
 case MINUS_EXPR:
   /* We can't turn -(A-B) into B-A when we honor signed zeros.  */
-  return !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
-&& !HONOR_SIGNED_ZEROS (element_mode (type))
+  return !HONOR_SIGN_DEPENDENT_ROUNDING (type)
+&& !HONOR_SIGNED_ZEROS (type)
 && (! ANY_INTEGRAL_TYPE_P (type)
 || TYPE_OVERFLOW_WRAPS (type));
 
@@ -468,7 +468,7 @@ negate_expr_p (tree t)
   /* Fall through.  */
 
 case RDIV_EXPR:
-  if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (TREE_TYPE (t
+  if (! HONOR_SIGN_DEPENDENT_ROUNDING (t))
return negate_expr_p (TREE_OPERAND (t, 1))
   || negate_expr_p (TREE_OPERAND (t, 0));
   break;
@@ -605,8 +605,8 @@ fold_negate_expr_1 (location_t loc, tree t)
   break;
 
 case PLUS_EXPR:
-  if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
- && !HONOR_SIGNED_ZEROS (element_mode (type)))
+  if (!HONOR_SIGN_DEPENDENT_ROUNDING (type)
+ && !HONOR_SIGNED_ZEROS (type))
{
  /* -(A + B) -> (-B) - A.  */
  if (negate_expr_p (TREE_OPERAND (t, 1)))
@@ -628,8 +628,8 @@ fold_negate_expr_1 (location_t loc, tree t)
 
 case MINUS_EXPR:
   /* - (A - B) -> B - A  */
-  if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
- && !HONOR_SIGNED_ZEROS (element_mode (type)))
+  if (!HONOR_SIGN_DEPENDENT_ROUNDING (type)
+ && !HONOR_SIGNED_ZEROS (type))
return fold_build2_loc (loc, MINUS_EXPR, type,
TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
   break;
@@ -641,7 +641,7 @@ fold_negate_expr_1 (location_t loc, tree t)
   /* Fall through.  */
 
 case RDIV_EXPR:
-  if (! HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type)))
+  if (! HONOR_SIGN_DEPENDENT_ROUNDING (type))
{
  tem = TREE_OPERAND (t, 1);
  if (negate_expr_p (tem))
@@ -1725,7 +1725,7 @@ const_unop (enum tree_code code, tree type, tree arg0)
   /* Don't perform the operation, other than NEGATE and ABS, if
  flag_signaling_nans is on and the operand is a signaling NaN.  */
   if (TREE_CODE (arg0) == REAL_CST
-  && HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
+  && HONOR_SNANS (arg0)
   && REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg0))
   && code != NEGATE_EXPR
   && code != ABS_EXPR
@@ -2135,7 +2135,7 @@ fold_convert_const_real_from_real (tree type, const_tree 
arg1)
 
   /* Don't perform the operation if flag_signaling_nans is on
  and the operand is a signaling NaN.  */
-  if (HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
+  if (HONOR_SNANS (arg1)
   && REAL_VALUE_ISSIGNALING_NAN (TREE_REAL_CST (arg1)))
 return NULL_TREE; 
 
@@ -5773,7 +5773,7 @@ fold_cond_expr_with_comparison (location_t loc, tree type,
 
  Note that all these transformations are correct if A is
  NaN, since the two alternatives (A and -A) are also NaNs.  */
-  if (!HONOR_SIGNED_ZEROS (element_mode (type))
+  if (!HONOR_SIGNED_ZEROS (type)
   && (FLOAT_TYPE_P (TREE_TYPE (arg01))
  ? real_zerop (arg01)
  : integer_zerop (arg01))
@@ -5842,7 +5842,7 @@ fold_cond_expr_with_comparison (location_t loc, tree type,
  both transformations are correct when A is NaN: A != 0
  is then true, and A == 0 is false.  */
 
-  if (!HONOR_SIGNED_ZEROS (element_mode (type))
+  if (!HONOR_SIGNED_ZEROS (type)
   && integer_zerop (arg01) &&