> 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
>