On Wed, Feb 12, 2025 at 9:41 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> So inline-asm is known not to trap BUT it can have undefined behavior
> if made executed speculatively. This fixes the loop invariant pass to
> treat it similarly as trapping cases. If the inline-asm could be executed
> always, then it will be pulled out of the loop; otherwise it will be kept
> inside the loop.
>
> Bootstrapped and tested on x86_64-linux-gnu.
>
> gcc/ChangeLog:
>
>         * loop-invariant.cc (find_invariant_insn): Treat inline-asm similar to
>         trapping instruction and only move them if always executed.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/loop-invariant.cc | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/gcc/loop-invariant.cc b/gcc/loop-invariant.cc
> index bcb52bb9c76..79a4c39dfb0 100644
> --- a/gcc/loop-invariant.cc
> +++ b/gcc/loop-invariant.cc
> @@ -1123,6 +1123,11 @@ find_invariant_insn (rtx_insn *insn, bool 
> always_reached, bool always_executed)
>    if (may_trap_or_fault_p (PATTERN (insn)) && !always_reached)
>      return;
>
> +  /* inline-asm that is not always executed cannot be moved
> +     as it might trap. */

as it might conditionally trap?

OK.

Thanks,
Richard.

> +  if (!always_reached && asm_noperands (PATTERN (insn)) >= 0)
> +    return;
> +
>    depends_on = BITMAP_ALLOC (NULL);
>    if (!check_dependencies (insn, depends_on))
>      {
> --
> 2.43.0
>

Reply via email to