https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126459

--- Comment #5 from Drea Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #4)
> Maybe even better
> --- a/gcc/match.pd    2026-10-03 21:28:13.092320517 +0200
> +++ b/gcc/match.pd    2026-10-06 21:51:21.966900769 +0200
> @@ -5369,9 +5369,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>      tree cst1 = uniform_integer_cst_p (@1);
>      tree cst2 = uniform_integer_cst_p (@3);
>      tree cst3 = uniform_integer_cst_p (@4);
> -  }
> -  (if (wi::to_wide (cst1) + wi::to_wide (cst2) == wi::to_wide (cst3))
> -   @2))))
> +    wi::overflow_type ovf;
> +   }
> +   (if (wi::add (wi::to_wide (cst1), wi::to_wide (cst2),
> +              TYPE_SIGN (TREE_TYPE (cst1)), &ovf) == wi::to_wide (cst3))
> +    (if (!ovf || TYPE_OVERFLOW_WRAPS (TREE_TYPE (cst1)))
> +     @2
> +     (with {
> +       tree utype = unsigned_type_for (type);
> +      }
> +      (convert (plus (convert:utype @0) (convert:utype @3)))))))))
>  
>  /* Simplifications of shift and rotates.  */


I was thinking that too. Just didnt get around to it yet. Jakub if you want to
take it over that is ok with me.

Reply via email to