diff --git a/llvm/include/llvm/CodeGen/TargetInstrInfo.h b/llvm/include/llvm/CodeGen/TargetInstrInfo.h --- a/llvm/include/llvm/CodeGen/TargetInstrInfo.h +++ b/llvm/include/llvm/CodeGen/TargetInstrInfo.h @@ -382,6 +382,17 @@ /// to which instructions should be sunk. virtual bool shouldSink(const MachineInstr &MI) const { return true; } + /// Return false if the instruction should not be hoisted by MachineLICM. + /// + /// MachineLICM determines on its own whether the instruction is safe to + /// hoist; this gives the target a hook to extend this assessment and prevent + /// an instruction being hoisted from a given loop for target specific + /// reasons. + virtual bool shouldHoist(const MachineInstr &MI, + const MachineLoop *FromLoop) const { + return true; + } + /// Re-issue the specified 'original' instruction at the /// specific location targeting a new destination register. /// The register in Orig->getOperand(0).getReg() will be substituted by diff --git a/llvm/lib/CodeGen/MachineLICM.cpp b/llvm/lib/CodeGen/MachineLICM.cpp --- a/llvm/lib/CodeGen/MachineLICM.cpp +++ b/llvm/lib/CodeGen/MachineLICM.cpp @@ -999,6 +999,9 @@ if (I.isConvergent()) return false; + if (!TII->shouldHoist(I, CurLoop)) + return false; + return true; }