loop-invariant: Treat inline-asm conditional trapping [PR102150]

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:

	PR rtl-optimization/102150
	* 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_apinski@quicinc.com>
This commit is contained in:
Andrew Pinski 2025-02-11 21:00:06 -08:00
parent aa972d0274
commit 8598a84bf5

View file

@ -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 conditionally trap. */
if (!always_reached && asm_noperands (PATTERN (insn)) >= 0)
return;
depends_on = BITMAP_ALLOC (NULL);
if (!check_dependencies (insn, depends_on))
{