On Thu, 27 Nov 2025, Jakub Jelinek wrote:

> On Wed, Nov 26, 2025 at 09:52:50AM +0100, Richard Biener wrote:
> > I wonder if it makes sense to wrap
> > get_range_query (cfun)->range_of_expr (r, @0, gimple_match_ctx (@4))
> > into sth like gimple_match_range_of_expr (r, @0, @4)?
> 
> It does make sense, so the following patch implements that.
> Note, gimple-match.h is a bad location for that helper, because
> lots of users use it without having value-range.h included and
> it is for APIs to use the gimple folders, not for match.pd helpers
> themselves, so I've moved there gimple_match_ctx as well.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

> 2025-11-27  Jakub Jelinek  <[email protected]>
> 
>       PR tree-optimization/119683
>       * gimple-match.h (gimple_match_ctx): Move to ...
>       * gimple-match-head.cc (gimple_match_ctx): ... here.  Make static.
>       (gimple_match_range_of_expr): New static inline.
>       * match.pd ((mult (plus:s (mult:s @0 @1) @2) @3)): Use
>       gimple_match_range_of_expr.
>       ((plus (mult:s (plus:s @0 @1) @2) @3): Likewise.
>       ((t * u) / u -> t): Likewise.
>       ((t * u) / v -> t * (u / v)): Likewise.
>       ((X + M*N) / N -> X / N + M): Likewise.
>       ((X - M*N) / N -> X / N - M): Likewise.
>       ((X + C) / N -> X / N + C / N): Likewise.
>       (((T)(A)) + CST -> (T)(A + CST)): Likewise
>       (x_5 == cstN ? cst4 : cst3): Likewise.  Do r.set_varying
>       even when gimple_match_range_of_expr failed.
> 
> --- gcc/gimple-match.h.jj     2025-11-26 10:57:29.339204790 +0100
> +++ gcc/gimple-match.h        2025-11-26 11:41:16.137194895 +0100
> @@ -427,17 +427,4 @@ bool directly_supported_p (code_helper,
>  
>  internal_fn get_conditional_internal_fn (code_helper, tree);
>  
> -/* If OP is a SSA_NAME with SSA_NAME_DEF_STMT in the IL, return that
> -   stmt, otherwise NULL.  For use in range_of_expr calls.  */
> -
> -inline gimple *
> -gimple_match_ctx (tree op)
> -{
> -  if (TREE_CODE (op) == SSA_NAME
> -      && SSA_NAME_DEF_STMT (op)
> -      && gimple_bb (SSA_NAME_DEF_STMT (op)))
> -    return SSA_NAME_DEF_STMT (op);
> -  return NULL;
> -}
> -
>  #endif  /* GCC_GIMPLE_MATCH_H */
> --- gcc/gimple-match-head.cc.jj       2025-04-08 14:08:51.645276381 +0200
> +++ gcc/gimple-match-head.cc  2025-11-26 11:42:01.122414073 +0100
> @@ -507,3 +507,29 @@ match_cond_with_binary_phi (gphi *phi, t
>  
>    return cond;
>  }
> +
> +/* If OP is a SSA_NAME with SSA_NAME_DEF_STMT in the IL, return that
> +   stmt, otherwise NULL.  For use in range_of_expr calls.  */
> +
> +static inline gimple *
> +gimple_match_ctx (tree op)
> +{
> +  if (TREE_CODE (op) == SSA_NAME
> +      && SSA_NAME_DEF_STMT (op)
> +      && gimple_bb (SSA_NAME_DEF_STMT (op)))
> +    return SSA_NAME_DEF_STMT (op);
> +  return NULL;
> +}
> +
> +/* Helper to shorten range queries in match.pd.  R is the range to
> +   be queried, OP tree on which it should be queried and CTX is some
> +   capture on which gimple_match_ctx should be called, or NULL for
> +   global range.  */
> +
> +static inline bool
> +gimple_match_range_of_expr (vrange &r, tree op, tree ctx = NULL_TREE)
> +{
> +  return get_range_query (cfun)->range_of_expr (r, op,
> +                                             ctx ? gimple_match_ctx (ctx)
> +                                             : NULL);
> +}
> --- gcc/match.pd.jj   2025-11-26 10:57:29.339986214 +0100
> +++ gcc/match.pd      2025-11-26 11:36:22.901286265 +0100
> @@ -661,8 +661,7 @@ (define_operator_list SYNC_FETCH_AND_AND
>  #if GIMPLE
>        int_range_max vr0;
>        if (ovf1 == wi::OVF_NONE && ovf2 == wi::OVF_NONE
> -       && get_range_query (cfun)->range_of_expr (vr0, @4,
> -                                                 gimple_match_ctx (@5))
> +       && gimple_match_range_of_expr (vr0, @4, @5)
>         && !vr0.varying_p () && !vr0.undefined_p ())
>       {
>         wide_int wmin0 = vr0.lower_bound ();
> @@ -703,8 +702,7 @@ (define_operator_list SYNC_FETCH_AND_AND
>  #if GIMPLE
>        int_range_max vr0;
>        if (ovf1 == wi::OVF_NONE && ovf2 == wi::OVF_NONE
> -       && get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                                 gimple_match_ctx (@4))
> +       && gimple_match_range_of_expr (vr0, @0, @4)
>         && !vr0.varying_p () && !vr0.undefined_p ())
>       {
>         wide_int wmin0 = vr0.lower_bound ();
> @@ -1025,10 +1023,8 @@ (define_operator_list SYNC_FETCH_AND_AND
>  #if GIMPLE
>      (with {int_range_max vr0, vr1;}
>       (if (INTEGRAL_TYPE_P (type)
> -       && get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                                 gimple_match_ctx (@2))
> -       && get_range_query (cfun)->range_of_expr (vr1, @1,
> -                                                 gimple_match_ctx (@2))
> +       && gimple_match_range_of_expr (vr0, @0, @2)
> +       && gimple_match_range_of_expr (vr1, @1, @2)
>         && range_op_handler (MULT_EXPR).overflow_free_p (vr0, vr1))
>        @0))
>  #endif
> @@ -1042,9 +1038,8 @@ (define_operator_list SYNC_FETCH_AND_AND
>     (if (TYPE_OVERFLOW_UNDEFINED (type) && !TYPE_OVERFLOW_SANITIZED (type))
>      (mult @0 (div! @1 @2))
>      (with {int_range_max vr0, vr1;}
> -     (if (get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                              gimple_match_ctx (@3))
> -       && get_range_query (cfun)->range_of_expr (vr1, @1)
> +     (if (gimple_match_range_of_expr (vr0, @0, @3)
> +       && gimple_match_range_of_expr (vr1, @1)
>         && range_op_handler (MULT_EXPR).overflow_free_p (vr0, vr1))
>        (mult @0 (div! @1 @2))))
>     )))
> @@ -1058,10 +1053,9 @@ (define_operator_list SYNC_FETCH_AND_AND
>      (div @1 @2)
>  #if GIMPLE
>      (with {int_range_max vr0, vr1, vr2;}
> -     (if (get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                              gimple_match_ctx (@3))
> -       && get_range_query (cfun)->range_of_expr (vr1, @1)
> -       && get_range_query (cfun)->range_of_expr (vr2, @2)
> +     (if (gimple_match_range_of_expr (vr0, @0, @3)
> +       && gimple_match_range_of_expr (vr1, @1)
> +       && gimple_match_range_of_expr (vr2, @2)
>         && range_op_handler (MULT_EXPR).overflow_free_p (vr0, vr1)
>         && range_op_handler (MULT_EXPR).overflow_free_p (vr0, vr2))
>        (div @1 @2)))
> @@ -1075,19 +1069,15 @@ (define_operator_list SYNC_FETCH_AND_AND
>    (div (plus:c@4 @0 (mult:c@3 @1 @2)) @2)
>    (with {int_range_max vr0, vr1, vr2, vr3, vr4;}
>    (if (INTEGRAL_TYPE_P (type)
> -       && get_range_query (cfun)->range_of_expr (vr1, @1,
> -                                              gimple_match_ctx (@3))
> -       && get_range_query (cfun)->range_of_expr (vr2, @2,
> -                                              gimple_match_ctx (@3))
> +       && gimple_match_range_of_expr (vr1, @1, @3)
> +       && gimple_match_range_of_expr (vr2, @2, @3)
>         /* "N*M" doesn't overflow.  */
>         && range_op_handler (MULT_EXPR).overflow_free_p (vr1, vr2)
> -       && get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                              gimple_match_ctx (@4))
> -       && get_range_query (cfun)->range_of_expr (vr3, @3,
> -                                              gimple_match_ctx (@4))
> +       && gimple_match_range_of_expr (vr0, @0, @4)
> +       && gimple_match_range_of_expr (vr3, @3, @4)
>         /* "X+(N*M)" doesn't overflow.  */
>         && range_op_handler (PLUS_EXPR).overflow_free_p (vr0, vr3)
> -       && get_range_query (cfun)->range_of_expr (vr4, @4)
> +       && gimple_match_range_of_expr (vr4, @4)
>         && !vr4.undefined_p ()
>         /* "X+N*M" is not with opposite sign as "X".  */
>         && (TYPE_UNSIGNED (type)
> @@ -1100,19 +1090,15 @@ (define_operator_list SYNC_FETCH_AND_AND
>    (div (minus@4 @0 (mult:c@3 @1 @2)) @2)
>    (with {int_range_max vr0, vr1, vr2, vr3, vr4;}
>    (if (INTEGRAL_TYPE_P (type)
> -       && get_range_query (cfun)->range_of_expr (vr1, @1,
> -                                              gimple_match_ctx (@3))
> -       && get_range_query (cfun)->range_of_expr (vr2, @2,
> -                                              gimple_match_ctx (@3))
> +       && gimple_match_range_of_expr (vr1, @1, @3)
> +       && gimple_match_range_of_expr (vr2, @2, @3)
>         /* "N * M" doesn't overflow.  */
>         && range_op_handler (MULT_EXPR).overflow_free_p (vr1, vr2)
> -       && get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                              gimple_match_ctx (@4))
> -       && get_range_query (cfun)->range_of_expr (vr3, @3,
> -                                              gimple_match_ctx (@4))
> +       && gimple_match_range_of_expr (vr0, @0, @4)
> +       && gimple_match_range_of_expr (vr3, @3, @4)
>         /* "X - (N*M)" doesn't overflow.  */
>         && range_op_handler (MINUS_EXPR).overflow_free_p (vr0, vr3)
> -       && get_range_query (cfun)->range_of_expr (vr4, @4)
> +       && gimple_match_range_of_expr (vr4, @4)
>         && !vr4.undefined_p ()
>         /* "X-N*M" is not with opposite sign as "X".  */
>         && (TYPE_UNSIGNED (type)
> @@ -1138,13 +1124,12 @@ (define_operator_list SYNC_FETCH_AND_AND
>        int_range_max vr0, vr1, vr3;
>      }
>      (if (INTEGRAL_TYPE_P (type)
> -      && get_range_query (cfun)->range_of_expr (vr0, @0,
> -                                                gimple_match_ctx (@3)))
> +      && gimple_match_range_of_expr (vr0, @0, @3))
>       (if (exact_mod (c)
> -       && get_range_query (cfun)->range_of_expr (vr1, @1)
> +       && gimple_match_range_of_expr (vr1, @1)
>         /* "X+C" doesn't overflow.  */
>         && range_op_handler (PLUS_EXPR).overflow_free_p (vr0, vr1)
> -       && get_range_query (cfun)->range_of_expr (vr3, @3)
> +       && gimple_match_range_of_expr (vr3, @3)
>         && !vr3.undefined_p ()
>         /* "X+C" and "X" are not of opposite sign.  */
>         && (TYPE_UNSIGNED (type)
> @@ -4484,8 +4469,7 @@ (define_operator_list SYNC_FETCH_AND_AND
>                           TYPE_SIGN (inner_type));
>  
>       int_range_max vr;
> -     if (get_range_query (cfun)->range_of_expr (vr, @0,
> -                                                gimple_match_ctx (@2))
> +     if (gimple_match_range_of_expr (vr, @0, @2)
>           && !vr.varying_p () && !vr.undefined_p ())
>            {
>           wide_int wmin0 = vr.lower_bound ();
> @@ -6563,8 +6547,8 @@ (define_operator_list SYNC_FETCH_AND_AND
>             || wi::to_widest (@2) == wi::to_widest (@3) + 1))
>     (with {
>       int_range_max r;
> -     get_range_query (cfun)->range_of_expr (r, @0, gimple_match_ctx (@4));
> -     if (r.undefined_p ())
> +     if (!gimple_match_range_of_expr (r, @0, @4)
> +      || r.undefined_p ())
>         r.set_varying (TREE_TYPE (@0));
>  
>       wide_int min = r.lower_bound ();
> 
> 
>       Jakub
> 
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to