Index: llvm/trunk/lib/Target/X86/X86InstrFoldTables.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFoldTables.cpp +++ llvm/trunk/lib/Target/X86/X86InstrFoldTables.cpp @@ -340,6 +340,8 @@ { X86::TAILJMPr, X86::TAILJMPm, TB_FOLDED_LOAD }, { X86::TAILJMPr64, X86::TAILJMPm64, TB_FOLDED_LOAD }, { X86::TAILJMPr64_REX, X86::TAILJMPm64_REX, TB_FOLDED_LOAD }, + { X86::TCRETURNri, X86::TCRETURNmi, TB_FOLDED_LOAD | TB_NO_FORWARD }, + { X86::TCRETURNri64, X86::TCRETURNmi64, TB_FOLDED_LOAD | TB_NO_FORWARD }, { X86::TEST16ri, X86::TEST16mi, TB_FOLDED_LOAD }, { X86::TEST16rr, X86::TEST16mr, TB_FOLDED_LOAD }, { X86::TEST32ri, X86::TEST32mi, TB_FOLDED_LOAD }, Index: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp @@ -19,6 +19,7 @@ #include "X86Subtarget.h" #include "X86TargetMachine.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/Sequence.h" #include "llvm/CodeGen/LivePhysRegs.h" #include "llvm/CodeGen/LiveVariables.h" #include "llvm/CodeGen/MachineConstantPool.h" @@ -4652,6 +4653,32 @@ } } +static void updateOperandRegConstraints(MachineFunction &MF, + MachineInstr &NewMI, + const TargetInstrInfo &TII) { + MachineRegisterInfo &MRI = MF.getRegInfo(); + const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo(); + + for (int Idx : llvm::seq(0, NewMI.getNumOperands())) { + MachineOperand &MO = NewMI.getOperand(Idx); + // We only need to update constraints on virtual register operands. + if (!MO.isReg()) + continue; + unsigned Reg = MO.getReg(); + if (!TRI.isVirtualRegister(Reg)) + continue; + + auto *NewRC = MRI.constrainRegClass( + Reg, TII.getRegClass(NewMI.getDesc(), Idx, &TRI, MF)); + if (!NewRC) { + LLVM_DEBUG( + dbgs() << "WARNING: Unable to update register constraint for operand " + << Idx << " of instruction:\n"; + NewMI.dump(); dbgs() << "\n"); + } + } +} + static MachineInstr *FuseTwoAddrInst(MachineFunction &MF, unsigned Opcode, ArrayRef MOs, MachineBasicBlock::iterator InsertPt, @@ -4675,6 +4702,8 @@ MIB.add(MO); } + updateOperandRegConstraints(MF, *NewMI, TII); + MachineBasicBlock *MBB = InsertPt->getParent(); MBB->insert(InsertPt, NewMI); @@ -4701,6 +4730,8 @@ } } + updateOperandRegConstraints(MF, *NewMI, TII); + MachineBasicBlock *MBB = InsertPt->getParent(); MBB->insert(InsertPt, NewMI);