On Mon, May 5, 2025 at 3:42 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> While fixing up how rewrite_to_defined_overflow works, gcc.dg/Wrestrict-22.c 
> started
> to fail. This is because `d p+ 2` would moved by LIM and then be rewritten 
> not using
> pointer plus. The rewriting part is correct behavior. It only recently 
> started to be
> moved out; due to r16-190-g6901d56fea2132.
> Which has the following comment:
> ```
> When we run before PRE and PRE is active hoist all expressions
> since PRE would do so anyway and we can preserve range info
> but PRE cannot.
> ```
> But LIM will not preserve range info when moving conditional executed
> statements out of the loop.  So it would be better not to override the cost 
> check
> for conditional executed statements in the first place.
>
> Bootstrapped and tested on x86_64-linux-gnu.
>
> gcc/ChangeLog:
>
>         * tree-ssa-loop-im.cc (compute_invariantness): Don't ignore the cost 
> for
>         conditional executed statements.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/tree-ssa-loop-im.cc | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc
> index a3ca5af3e3e..444ee31242f 100644
> --- a/gcc/tree-ssa-loop-im.cc
> +++ b/gcc/tree-ssa-loop-im.cc
> @@ -1244,8 +1244,13 @@ compute_invariantness (basic_block bb)
>        if (lim_data->cost >= LIM_EXPENSIVE
>           /* When we run before PRE and PRE is active hoist all expressions
>              since PRE would do so anyway and we can preserve range info
> -            but PRE cannot.  */
> -         || (flag_tree_pre && !in_loop_pipeline))
> +            but PRE cannot.  Except for conditional statements as those will 
> never
> +            preserve range info.  */
> +         || (flag_tree_pre && !in_loop_pipeline
> +             && ALWAYS_EXECUTED_IN (bb)
> +             && (ALWAYS_EXECUTED_IN (bb) == lim_data->max_loop

So that's not exactly the same condition as we use in the end - we should
be able to set profitability to the level the stmt is always executed in
instead by using set_level (stmt, gimple_bb (stmt)->loop_father,
ALWAYS_EXECUTED_IN (bb)),
of course only when lim_data->cost < LIM_EXPENSIVE, so I'd split up the
if into two cases, profitable cost-wise and the PRE exception.

> +                 || flow_loop_nested_p (ALWAYS_EXECUTED_IN (bb),
> +                                        lim_data->max_loop))))
>         set_profitable_level (stmt);
>      }
>  }
> --
> 2.34.1
>

Reply via email to