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

--- Comment #8 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 25 Nov 2025, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119683
> 
> --- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> Right now I see 3 spots which use get_global_range_query ()->range_of_expr
> (vrY, @X)
> and then various other spots that use get_range_query (cfun)->range_of_expr
> (vrY, @X)
> I wonder if the outermost stmt is the right context though.
> When we have say
> (mult (plus:s (mult:s@4 @0 INTEGER_CST@1) INTEGER_CST@2) INTEGER_CST@3)
> and want to query range of @4, shouldn't we be querying it on the plus stmt?
> I.e. add @5 to it
> (mult (plus:s@5 (mult:s@4 @0 INTEGER_CST@1) INTEGER_CST@2) INTEGER_CST@3)
> and have some helper function which checks whether @5 is SSA_NAME with
> SSA_NAME_DEF_STMT non-NULL and in some bb (would that be sufficient to avoid
> the problems with queries on expressions or stmts not in the IL)?
> And let the helper function return NULL if it can't figure the stmt or
> something to pass to get_range_query (cfun)->range_of_expr as the third
> statement, so it will be
> get_range_query (cfun)->range_of_expr (vr0, @4, stmt_ctx (@5))
> ?

Sure, I think for this case it should be the context of the add.

> As an untested POC
> --- gcc/match.pd.jj     2025-11-25 10:03:25.201911338 +0100
> +++ gcc/match.pd        2025-11-25 15:02:40.524540362 +0100
> @@ -4432,7 +4432,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>  /* ((T)(A)) + CST -> (T)(A + CST)  */
>  #if GIMPLE
>    (simplify
> -   (plus (convert:s SSA_NAME@0) INTEGER_CST@1)
> +   (plus (convert:s@2 SSA_NAME@0) INTEGER_CST@1)
>      (if (TREE_CODE (TREE_TYPE (@0)) == INTEGER_TYPE
>           && TREE_CODE (type) == INTEGER_TYPE
>           && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0))
> @@ -4450,7 +4450,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>                             TYPE_SIGN (inner_type));
> 
>         int_range_max vr;
> -       if (get_global_range_query ()->range_of_expr (vr, @0)
> +       gimple *stmt_ctx = NULL;
> +       if (TREE_CODE (@2) == SSA_NAME
> +           && SSA_NAME_DEF_STMT (@2)
> +           && gimple_bb (SSA_NAME_DEF_STMT (@2)))
> +         stmt_ctx = SSA_NAME_DEF_STMT (@2);
> +       if (get_range_query (cfun)->range_of_expr (vr, @0, stmt_ctx)
>             && !vr.varying_p () && !vr.undefined_p ())
>            {
>             wide_int wmin0 = vr.lower_bound ();
> fixes the testcase.
> 
>

Reply via email to