Index: include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h =================================================================== --- include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -84,13 +84,15 @@ addUseFromArg(MIB, Arg1); addUsesFromArgs(MIB, std::forward(Args)...); } + + bool InsertAfter; public: /// Some constructors for easy use. MachineIRBuilder() = default; MachineIRBuilder(MachineFunction &MF) { setMF(MF); } - MachineIRBuilder(MachineInstr &MI) + MachineIRBuilder(MachineInstr &MI, bool InsertAfter = false) : MachineIRBuilder(*MI.getParent()->getParent()) { - setInstr(MI); + setInstr(MI, InsertAfter); } /// Getter for the function we currently build. @@ -113,7 +115,7 @@ /// Set the insertion point before the specified position. /// \pre MBB must be in getMF(). /// \pre II must be a valid iterator in MBB. - void setInsertPt(MachineBasicBlock &MBB, MachineBasicBlock::iterator II); + void setInsertPt(MachineBasicBlock &MBB, MachineBasicBlock::iterator II, bool InsertAfter = false); /// @} /// \name Setters for the insertion point. @@ -127,7 +129,7 @@ /// Set the insertion point to before MI. /// \pre MI must be in getMF(). - void setInstr(MachineInstr &MI); + void setInstr(MachineInstr &MI, bool InsertAfter = false); /// @} /// \name Control where instructions we create are recorded (typically for Index: lib/CodeGen/GlobalISel/MachineIRBuilder.cpp =================================================================== --- lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -39,18 +39,21 @@ "Basic block is in a different function"); } -void MachineIRBuilder::setInstr(MachineInstr &MI) { +void MachineIRBuilder::setInstr(MachineInstr &MI, bool InsertAfter) { assert(MI.getParent() && "Instruction is not part of a basic block"); setMBB(*MI.getParent()); this->II = MI.getIterator(); + this->InsertAfter = InsertAfter; } void MachineIRBuilder::setInsertPt(MachineBasicBlock &MBB, - MachineBasicBlock::iterator II) { + MachineBasicBlock::iterator II, + bool InsertAfter) { assert(MBB.getParent() == &getMF() && "Basic block is in a different function"); this->MBB = &MBB; this->II = II; + this->InsertAfter = InsertAfter; } void MachineIRBuilder::recordInsertions( @@ -77,7 +80,12 @@ MachineInstrBuilder MachineIRBuilder::insertInstr(MachineInstrBuilder MIB) { - getMBB().insert(getInsertPt(), MIB); + auto &MBB = getMBB(); + if (!InsertAfter) + MBB.insert(getInsertPt(), MIB); + else + MBB.insertAfter(getInsertPt(), MIB); + if (InsertedInstr) InsertedInstr(MIB); return MIB;