[PATCH] D49717: [x86] Teach the x86 backend that it can fold between TCRETURNm* and TCRETURNr* and fix latent bugs with register class updates.
Chandler Carruth via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 24 12:04:57 PDT 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL337845: [x86] Teach the x86 backend that it can fold between TCRETURNm* and TCRETURNr*… (authored by chandlerc, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D49717?vs=157008&id=157100#toc
Repository:
rL LLVM
https://reviews.llvm.org/D49717
Files:
llvm/trunk/lib/Target/X86/X86InstrFoldTables.cpp
llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
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<int>(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<MachineOperand> 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);
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 },
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49717.157100.patch
Type: text/x-patch
Size: 2931 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180724/9b2d5648/attachment.bin>
More information about the llvm-commits
mailing list