diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86InstructionSelector.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86InstructionSelector.cpp | 87 |
1 files changed, 5 insertions, 82 deletions
diff --git a/llvm/lib/Target/X86/X86InstructionSelector.cpp b/llvm/lib/Target/X86/X86InstructionSelector.cpp index 01620b7b64c9..3f9d626ff912 100644 --- a/llvm/lib/Target/X86/X86InstructionSelector.cpp +++ b/llvm/lib/Target/X86/X86InstructionSelector.cpp @@ -34,6 +34,7 @@ #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/InstrTypes.h" +#include "llvm/IR/IntrinsicsX86.h" #include "llvm/Support/AtomicOrdering.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Debug.h" @@ -111,8 +112,6 @@ private: bool materializeFP(MachineInstr &I, MachineRegisterInfo &MRI, MachineFunction &MF) const; bool selectImplicitDefOrPHI(MachineInstr &I, MachineRegisterInfo &MRI) const; - bool selectShift(MachineInstr &I, MachineRegisterInfo &MRI, - MachineFunction &MF) const; bool selectDivRem(MachineInstr &I, MachineRegisterInfo &MRI, MachineFunction &MF) const; bool selectIntrinsicWSideEffects(MachineInstr &I, MachineRegisterInfo &MRI, @@ -342,7 +341,7 @@ bool X86InstructionSelector::select(MachineInstr &I) { case TargetOpcode::G_STORE: case TargetOpcode::G_LOAD: return selectLoadStoreOp(I, MRI, MF); - case TargetOpcode::G_GEP: + case TargetOpcode::G_PTR_ADD: case TargetOpcode::G_FRAME_INDEX: return selectFrameIndexOrGep(I, MRI, MF); case TargetOpcode::G_GLOBAL_VALUE: @@ -380,10 +379,6 @@ bool X86InstructionSelector::select(MachineInstr &I) { case TargetOpcode::G_IMPLICIT_DEF: case TargetOpcode::G_PHI: return selectImplicitDefOrPHI(I, MRI); - case TargetOpcode::G_SHL: - case TargetOpcode::G_ASHR: - case TargetOpcode::G_LSHR: - return selectShift(I, MRI, MF); case TargetOpcode::G_SDIV: case TargetOpcode::G_UDIV: case TargetOpcode::G_SREM: @@ -482,7 +477,7 @@ static void X86SelectAddress(const MachineInstr &I, assert(MRI.getType(I.getOperand(0).getReg()).isPointer() && "unsupported type."); - if (I.getOpcode() == TargetOpcode::G_GEP) { + if (I.getOpcode() == TargetOpcode::G_PTR_ADD) { if (auto COff = getConstantVRegVal(I.getOperand(2).getReg(), MRI)) { int64_t Imm = *COff; if (isInt<32>(Imm)) { // Check for displacement overflow. @@ -566,7 +561,7 @@ bool X86InstructionSelector::selectFrameIndexOrGep(MachineInstr &I, MachineFunction &MF) const { unsigned Opc = I.getOpcode(); - assert((Opc == TargetOpcode::G_FRAME_INDEX || Opc == TargetOpcode::G_GEP) && + assert((Opc == TargetOpcode::G_FRAME_INDEX || Opc == TargetOpcode::G_PTR_ADD) && "unexpected instruction"); const Register DefReg = I.getOperand(0).getReg(); @@ -1225,7 +1220,7 @@ bool X86InstructionSelector::emitExtractSubreg(unsigned DstReg, unsigned SrcReg, if (!RBI.constrainGenericRegister(SrcReg, *SrcRC, MRI) || !RBI.constrainGenericRegister(DstReg, *DstRC, MRI)) { - LLVM_DEBUG(dbgs() << "Failed to constrain G_TRUNC\n"); + LLVM_DEBUG(dbgs() << "Failed to constrain EXTRACT_SUBREG\n"); return false; } @@ -1519,78 +1514,6 @@ bool X86InstructionSelector::selectImplicitDefOrPHI( return true; } -// Currently GlobalIsel TableGen generates patterns for shift imm and shift 1, -// but with shiftCount i8. In G_LSHR/G_ASHR/G_SHL like LLVM-IR both arguments -// has the same type, so for now only shift i8 can use auto generated -// TableGen patterns. -bool X86InstructionSelector::selectShift(MachineInstr &I, - MachineRegisterInfo &MRI, - MachineFunction &MF) const { - - assert((I.getOpcode() == TargetOpcode::G_SHL || - I.getOpcode() == TargetOpcode::G_ASHR || - I.getOpcode() == TargetOpcode::G_LSHR) && - "unexpected instruction"); - - Register DstReg = I.getOperand(0).getReg(); - const LLT DstTy = MRI.getType(DstReg); - const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); - - const static struct ShiftEntry { - unsigned SizeInBits; - unsigned OpLSHR; - unsigned OpASHR; - unsigned OpSHL; - } OpTable[] = { - {8, X86::SHR8rCL, X86::SAR8rCL, X86::SHL8rCL}, // i8 - {16, X86::SHR16rCL, X86::SAR16rCL, X86::SHL16rCL}, // i16 - {32, X86::SHR32rCL, X86::SAR32rCL, X86::SHL32rCL}, // i32 - {64, X86::SHR64rCL, X86::SAR64rCL, X86::SHL64rCL} // i64 - }; - - if (DstRB.getID() != X86::GPRRegBankID) - return false; - - auto ShiftEntryIt = std::find_if( - std::begin(OpTable), std::end(OpTable), [DstTy](const ShiftEntry &El) { - return El.SizeInBits == DstTy.getSizeInBits(); - }); - if (ShiftEntryIt == std::end(OpTable)) - return false; - - unsigned Opcode = 0; - switch (I.getOpcode()) { - case TargetOpcode::G_SHL: - Opcode = ShiftEntryIt->OpSHL; - break; - case TargetOpcode::G_ASHR: - Opcode = ShiftEntryIt->OpASHR; - break; - case TargetOpcode::G_LSHR: - Opcode = ShiftEntryIt->OpLSHR; - break; - default: - return false; - } - - Register Op0Reg = I.getOperand(1).getReg(); - Register Op1Reg = I.getOperand(2).getReg(); - - assert(MRI.getType(Op1Reg).getSizeInBits() == 8); - - BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(TargetOpcode::COPY), - X86::CL) - .addReg(Op1Reg); - - MachineInstr &ShiftInst = - *BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(Opcode), DstReg) - .addReg(Op0Reg); - - constrainSelectedInstRegOperands(ShiftInst, TII, TRI, RBI); - I.eraseFromParent(); - return true; -} - bool X86InstructionSelector::selectDivRem(MachineInstr &I, MachineRegisterInfo &MRI, MachineFunction &MF) const { |