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 >