Index: include/llvm/CodeGen/GlobalISel/LegalizerHelper.h =================================================================== --- include/llvm/CodeGen/GlobalISel/LegalizerHelper.h +++ include/llvm/CodeGen/GlobalISel/LegalizerHelper.h @@ -44,6 +44,11 @@ /// Some kind of error has occurred and we could not legalize this /// instruction. UnableToLegalize, + + /// Instruction has been replaced. To be erased after attempting + /// legalization on all new insts created by an inst + /// Mostly used by intrinsics + Erase, }; LegalizerHelper(MachineFunction &MF); Index: include/llvm/CodeGen/GlobalISel/LegalizerInfo.h =================================================================== --- include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -16,6 +16,7 @@ #define LLVM_CODEGEN_GLOBALISEL_MACHINELEGALIZER_H #include "llvm/ADT/DenseMap.h" +#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h" #include "llvm/CodeGen/LowLevelType.h" #include "llvm/Target/TargetOpcodes.h" @@ -192,6 +193,10 @@ MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder) const; + virtual LegalizerHelper::LegalizeResult + legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI, + MachineIRBuilder &MIRBuilder) const; + private: static const int FirstOp = TargetOpcode::PRE_ISEL_GENERIC_OPCODE_START; static const int LastOp = TargetOpcode::PRE_ISEL_GENERIC_OPCODE_END; Index: lib/CodeGen/GlobalISel/Legalizer.cpp =================================================================== --- lib/CodeGen/GlobalISel/Legalizer.cpp +++ lib/CodeGen/GlobalISel/Legalizer.cpp @@ -181,8 +181,11 @@ "unable to legalize instruction", *MI); return false; } + if (Res == LegalizerHelper::Erase) + MI->eraseFromParent(); - Changed |= Res == LegalizerHelper::Legalized; + Changed |= + (Res == LegalizerHelper::Legalized || Res == LegalizerHelper::Erase); } Index: lib/CodeGen/GlobalISel/LegalizerHelper.cpp =================================================================== --- lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -35,6 +35,10 @@ LegalizerHelper::LegalizeResult LegalizerHelper::legalizeInstrStep(MachineInstr &MI) { + if (TargetOpcode::G_INTRINSIC == MI.getOpcode() || + TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS == MI.getOpcode()) + return LI.legalizeIntrinsic(MI, MRI, MIRBuilder); + auto Action = LI.getAction(MI, MRI); switch (std::get<0>(Action)) { case LegalizerInfo::Legal: @@ -66,6 +70,7 @@ bool Changed = false; LegalizeResult Res; + bool Erased = false; unsigned Idx = 0; do { Res = legalizeInstrStep(*WorkList[Idx]); @@ -73,13 +78,14 @@ MIRBuilder.stopRecordingInsertions(); return UnableToLegalize; } + Erased |= Res == Erase; Changed |= Res == Legalized; ++Idx; } while (Idx < WorkList.size()); MIRBuilder.stopRecordingInsertions(); - return Changed ? Legalized : AlreadyLegal; + return Erased ? Erase : Changed ? Legalized : AlreadyLegal; } void LegalizerHelper::extractParts(unsigned Reg, LLT Ty, int NumParts, Index: lib/CodeGen/GlobalISel/LegalizerInfo.cpp =================================================================== --- lib/CodeGen/GlobalISel/LegalizerInfo.cpp +++ lib/CodeGen/GlobalISel/LegalizerInfo.cpp @@ -194,3 +194,8 @@ MachineIRBuilder &MIRBuilder) const { return false; } +LegalizerHelper::LegalizeResult +LegalizerInfo::legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI, + MachineIRBuilder &MIRBuilder) const { + return LegalizerHelper::LegalizeResult::AlreadyLegal; +}