> Am 18.02.2025 um 17:04 schrieb Konstantinos Eleftheriou 
> <konstantinos.elefther...@vrull.eu>:
> 
> From: kelefth <konstantinos.elefther...@vrull.eu>
> 
> The pass rejects the transformation when there are instructions in the
> sequence that might throw an exception. This was added due to having
> cases that the load instruction contains a REG_EH_REGION note and
> moving it before the store instructions caused an error, as it was
> no longer the last instruction in the basic block.
> 
> This patch handles those cases by moving a possible REG_EH_REGION
> note from the load instruction of the store-load sequence to the
> last instruction of the basic block.

But that’s not a correct transform and will lead to bogus exception handling?  
You’d need to move the note and split the block, possibly updating the EH info 
on the side.

Richard 

> gcc/ChangeLog:
> 
>    * avoid-store-forwarding.cc (process_store_forwarding):
>    (store_forwarding_analyzer::avoid_store_forwarding):
>    Move a possible REG_EH_REGION note from the load instruction
>    to the last instruction of the basic block.
> ---
> gcc/avoid-store-forwarding.cc | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/gcc/avoid-store-forwarding.cc b/gcc/avoid-store-forwarding.cc
> index 34a7bba4043..05c91bb1a82 100644
> --- a/gcc/avoid-store-forwarding.cc
> +++ b/gcc/avoid-store-forwarding.cc
> @@ -400,6 +400,17 @@ process_store_forwarding (vec<store_fwd_info> &stores, 
> rtx_insn *load_insn,
>   if (load_elim)
>     delete_insn (load_insn);
> 
> +  /* Find possible REG_EH_REGION note in the load instruction and move it
> +     into the last instruction of the basic block.  */
> +  rtx reg_eh_region_note = find_reg_note (load_insn, REG_EH_REGION, 
> NULL_RTX);
> +  if (reg_eh_region_note != NULL_RTX)
> +    {
> +      remove_note (load_insn, reg_eh_region_note);
> +      basic_block load_bb = BLOCK_FOR_INSN (load_insn);
> +      add_reg_note (BB_END (load_bb), REG_EH_REGION,
> +            XEXP (reg_eh_region_note, 0));
> +    }
> +
>   return true;
> }
> 
> @@ -425,7 +436,7 @@ store_forwarding_analyzer::avoid_store_forwarding 
> (basic_block bb)
> 
>       rtx set = single_set (insn);
> 
> -      if (!set || insn_could_throw_p (insn))
> +      if (!set)
>    {
>      store_exprs.truncate (0);
>      continue;
> --
> 2.47.0
> 

Reply via email to