LLVM API Documentation
This is a fast-path instruction selection class that generates poor code and doesn't support illegal types or non-trivial lowering, but runs quickly. More...
#include <FastISel.h>
Classes | |
struct | ArgListEntry |
struct | CallLoweringInfo |
struct | SavePoint |
Public Types | |
typedef std::vector< ArgListEntry > | ArgListTy |
Public Member Functions | |
MachineInstr * | getLastLocalValue () |
Return the position of the last instruction emitted for materializing constants for use in the current block. | |
void | setLastLocalValue (MachineInstr *I) |
Update the position of the last instruction emitted for materializing constants for use in the current block. | |
void | startNewBlock () |
Set the current block to which generated machine instructions will be appended, and clear the local CSE map. | |
DebugLoc | getCurDebugLoc () const |
Return current debug location information. | |
bool | lowerArguments () |
Do "fast" instruction selection for function arguments and append the machine instructions to the current block. Returns true when successful. | |
bool | selectInstruction (const Instruction *I) |
Do "fast" instruction selection for the given LLVM IR instruction and append the generated machine instructions to the current block. Returns true if selection was successful. | |
bool | selectOperator (const User *I, unsigned Opcode) |
Do "fast" instruction selection for the given LLVM IR operator (Instruction or ConstantExpr), and append generated machine instructions to the current block. Return true if selection was successful. | |
unsigned | getRegForValue (const Value *V) |
Create a virtual register and arrange for it to be assigned the value for the given LLVM value. | |
unsigned | lookUpRegForValue (const Value *V) |
Look up the value to see if its value is already cached in a register. It may be defined by instructions across blocks or defined locally. | |
std::pair< unsigned, bool > | getRegForGEPIndex (const Value *V) |
This is a wrapper around getRegForValue that also takes care of truncating or sign-extending the given getelementptr index value. | |
bool | tryToFoldLoad (const LoadInst *LI, const Instruction *FoldInst) |
We're checking to see if we can fold LI into FoldInst . Note that we could have a sequence where multiple LLVM IR instructions are folded into the same machineinstr. For example we could have: | |
virtual bool | tryToFoldLoadIntoMI (MachineInstr *, unsigned, const LoadInst *) |
The specified machine instr operand is a vreg, and that vreg is being provided by the specified load instruction. If possible, try to fold the load as an operand to the instruction, returning true if possible. | |
void | recomputeInsertPt () |
Reset InsertPt to prepare for inserting instructions into the current block. | |
void | removeDeadCode (MachineBasicBlock::iterator I, MachineBasicBlock::iterator E) |
Remove all dead instructions between the I and E. | |
SavePoint | enterLocalValueArea () |
Prepare InsertPt to begin inserting instructions into the local value area and return the old insert position. | |
void | leaveLocalValueArea (SavePoint Old) |
Reset InsertPt to the given old insert position. | |
virtual | ~FastISel () |
Protected Member Functions | |
FastISel (FunctionLoweringInfo &FuncInfo, const TargetLibraryInfo *LibInfo, bool SkipTargetIndependentISel=false) | |
virtual bool | fastSelectInstruction (const Instruction *I)=0 |
This method is called by target-independent code when the normal FastISel process fails to select an instruction. This gives targets a chance to emit code for anything that doesn't fit into FastISel's framework. It returns true if it was successful. | |
virtual bool | fastLowerArguments () |
This method is called by target-independent code to do target- specific argument lowering. It returns true if it was successful. | |
virtual bool | fastLowerCall (CallLoweringInfo &CLI) |
This method is called by target-independent code to do target- specific call lowering. It returns true if it was successful. | |
virtual bool | fastLowerIntrinsicCall (const IntrinsicInst *II) |
This method is called by target-independent code to do target- specific intrinsic lowering. It returns true if it was successful. | |
virtual unsigned | fastEmit_ (MVT VT, MVT RetVT, unsigned Opcode) |
This method is called by target-independent code to request that an instruction with the given type and opcode be emitted. | |
virtual unsigned | fastEmit_r (MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register operand be emitted. | |
virtual unsigned | fastEmit_rr (MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register operands be emitted. | |
virtual unsigned | fastEmit_ri (MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill, uint64_t Imm) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register and immediate. | |
virtual unsigned | fastEmit_rf (MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill, const ConstantFP *FPImm) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register and floating-point immediate operands be emitted. | |
virtual unsigned | fastEmit_rri (MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill, uint64_t Imm) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register and immediate operands be emitted. | |
unsigned | fastEmit_ri_ (MVT VT, unsigned Opcode, unsigned Op0, bool Op0IsKill, uint64_t Imm, MVT ImmType) |
This method is a wrapper of fastEmit_ri. | |
virtual unsigned | fastEmit_i (MVT VT, MVT RetVT, unsigned Opcode, uint64_t Imm) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and immediate operand be emitted. | |
virtual unsigned | fastEmit_f (MVT VT, MVT RetVT, unsigned Opcode, const ConstantFP *FPImm) |
This method is called by target-independent code to request that an instruction with the given type, opcode, and floating-point immediate operand be emitted. | |
unsigned | fastEmitInst_ (unsigned MachineInstOpcode, const TargetRegisterClass *RC) |
Emit a MachineInstr with no operands and a result register in the given register class. | |
unsigned | fastEmitInst_r (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill) |
Emit a MachineInstr with one register operand and a result register in the given register class. | |
unsigned | fastEmitInst_rr (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill) |
Emit a MachineInstr with two register operands and a result register in the given register class. | |
unsigned | fastEmitInst_rrr (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill, unsigned Op2, bool Op2IsKill) |
Emit a MachineInstr with three register operands and a result register in the given register class. | |
unsigned | fastEmitInst_ri (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, uint64_t Imm) |
Emit a MachineInstr with a register operand, an immediate, and a result register in the given register class. | |
unsigned | fastEmitInst_rii (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, uint64_t Imm1, uint64_t Imm2) |
Emit a MachineInstr with one register operand and two immediate operands. | |
unsigned | fastEmitInst_rf (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, const ConstantFP *FPImm) |
Emit a MachineInstr with two register operands and a result register in the given register class. | |
unsigned | fastEmitInst_rri (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill, uint64_t Imm) |
Emit a MachineInstr with two register operands, an immediate, and a result register in the given register class. | |
unsigned | fastEmitInst_rrii (unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill, uint64_t Imm1, uint64_t Imm2) |
Emit a MachineInstr with two register operands, two immediates operands, and a result register in the given register class. | |
unsigned | fastEmitInst_i (unsigned MachineInstrOpcode, const TargetRegisterClass *RC, uint64_t Imm) |
Emit a MachineInstr with a single immediate operand, and a result register in the given register class. | |
unsigned | fastEmitInst_ii (unsigned MachineInstrOpcode, const TargetRegisterClass *RC, uint64_t Imm1, uint64_t Imm2) |
Emit a MachineInstr with a two immediate operands. | |
unsigned | fastEmitInst_extractsubreg (MVT RetVT, unsigned Op0, bool Op0IsKill, uint32_t Idx) |
Emit a MachineInstr for an extract_subreg from a specified index of a superregister to a specified type. | |
unsigned | fastEmitZExtFromI1 (MVT VT, unsigned Op0, bool Op0IsKill) |
Emit MachineInstrs to compute the value of Op with all but the least significant bit set to zero. | |
void | fastEmitBranch (MachineBasicBlock *MBB, DebugLoc DL) |
Emit an unconditional branch to the given block, unless it is the immediate (fall-through) successor, and update the CFG. | |
void | updateValueMap (const Value *I, unsigned Reg, unsigned NumRegs=1) |
Update the value map to include the new mapping for this instruction, or insert an extra copy to get the result in a previous determined register. | |
unsigned | createResultReg (const TargetRegisterClass *RC) |
unsigned | constrainOperandRegClass (const MCInstrDesc &II, unsigned Op, unsigned OpNum) |
Try to constrain Op so that it is usable by argument OpNum of the provided MCInstrDesc. If this fails, create a new virtual register in the correct class and COPY the value there. | |
virtual unsigned | fastMaterializeConstant (const Constant *C) |
Emit a constant in a register using target-specific logic, such as constant pool loads. | |
virtual unsigned | fastMaterializeAlloca (const AllocaInst *C) |
Emit an alloca address in a register using target-specific logic. | |
virtual unsigned | fastMaterializeFloatZero (const ConstantFP *CF) |
Emit the floating-point constant +0.0 in a register using target- specific logic. | |
bool | canFoldAddIntoGEP (const User *GEP, const Value *Add) |
Check if Add is an add that can be safely folded into GEP . | |
bool | hasTrivialKill (const Value *V) |
Test whether the given value has exactly one use. | |
MachineMemOperand * | createMachineMemOperandFor (const Instruction *I) const |
Create a machine mem operand from the given instruction. | |
CmpInst::Predicate | optimizeCmpPredicate (const CmpInst *CI) const |
bool | lowerCallTo (const CallInst *CI, const char *SymName, unsigned NumArgs) |
bool | lowerCallTo (CallLoweringInfo &CLI) |
bool | isCommutativeIntrinsic (IntrinsicInst const *II) |
bool | lowerCall (const CallInst *I) |
bool | selectBinaryOp (const User *I, unsigned ISDOpcode) |
Select and emit code for a binary operator instruction, which has an opcode which directly corresponds to the given ISD opcode. | |
bool | selectFNeg (const User *I) |
Emit an FNeg operation. | |
bool | selectGetElementPtr (const User *I) |
bool | selectStackmap (const CallInst *I) |
bool | selectPatchpoint (const CallInst *I) |
bool | selectCall (const User *Call) |
bool | selectIntrinsicCall (const IntrinsicInst *II) |
bool | selectBitCast (const User *I) |
bool | selectCast (const User *I, unsigned Opcode) |
bool | selectExtractValue (const User *I) |
bool | selectInsertValue (const User *I) |
Protected Attributes | |
DenseMap< const Value *, unsigned > | LocalValueMap |
FunctionLoweringInfo & | FuncInfo |
MachineFunction * | MF |
MachineRegisterInfo & | MRI |
MachineFrameInfo & | MFI |
MachineConstantPool & | MCP |
DebugLoc | DbgLoc |
const TargetMachine & | TM |
const DataLayout & | DL |
const TargetInstrInfo & | TII |
const TargetLowering & | TLI |
const TargetRegisterInfo & | TRI |
const TargetLibraryInfo * | LibInfo |
bool | SkipTargetIndependentISel |
MachineInstr * | LastLocalValue |
The position of the last instruction for materializing constants for use in the current block. It resets to EmitStartPt when it makes sense (for example, it's usually profitable to avoid function calls between the definition and the use) | |
MachineInstr * | EmitStartPt |
The top most instruction in the current block that is allowed for emitting local variables. LastLocalValue resets to EmitStartPt when it makes sense (for example, on function calls) |
This is a fast-path instruction selection class that generates poor code and doesn't support illegal types or non-trivial lowering, but runs quickly.
Definition at line 30 of file FastISel.h.
typedef std::vector<ArgListEntry> llvm::FastISel::ArgListTy |
Definition at line 54 of file FastISel.h.
FastISel::~FastISel | ( | ) | [virtual] |
Definition at line 1583 of file FastISel.cpp.
FastISel::FastISel | ( | FunctionLoweringInfo & | FuncInfo, |
const TargetLibraryInfo * | LibInfo, | ||
bool | SkipTargetIndependentISel = false |
||
) | [explicit, protected] |
Definition at line 1572 of file FastISel.cpp.
Check if Add
is an add that can be safely folded into GEP
.
Add
can be folded into GEP
if:
Add
is an add,Add's
size matches GEP's
,Add
is in the same basic block as GEP
, andAdd
has a constant operand. Definition at line 2083 of file FastISel.cpp.
References DL, FuncInfo, getParent(), llvm::Value::getType(), llvm::DataLayout::getTypeSizeInBits(), llvm::FunctionLoweringInfo::MBB, and llvm::FunctionLoweringInfo::MBBMap.
unsigned FastISel::constrainOperandRegClass | ( | const MCInstrDesc & | II, |
unsigned | Op, | ||
unsigned | OpNum | ||
) | [protected] |
Try to constrain Op so that it is usable by argument OpNum of the provided MCInstrDesc. If this fails, create a new virtual register in the correct class and COPY the value there.
Definition at line 1676 of file FastISel.cpp.
References llvm::BuildMI(), llvm::MachineRegisterInfo::constrainRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::TargetInstrInfo::getRegClass(), llvm::FunctionLoweringInfo::InsertPt, llvm::TargetRegisterInfo::isVirtualRegister(), llvm::FunctionLoweringInfo::MBB, llvm::FunctionLoweringInfo::MF, MRI, TII, and TRI.
Referenced by fastEmitInst_r(), fastEmitInst_rf(), fastEmitInst_ri(), fastEmitInst_rii(), fastEmitInst_rr(), fastEmitInst_rri(), fastEmitInst_rrii(), and fastEmitInst_rrr().
MachineMemOperand * FastISel::createMachineMemOperandFor | ( | const Instruction * | I | ) | const [protected] |
Create a machine mem operand from the given instruction.
Definition at line 2100 of file FastISel.cpp.
References DL, FuncInfo, llvm::Instruction::getAAMetadata(), llvm::DataLayout::getABITypeAlignment(), llvm::TargetSubtargetInfo::getDataLayout(), llvm::MachineFunction::getMachineMemOperand(), llvm::Instruction::getMetadata(), llvm::TargetMachine::getSubtargetImpl(), llvm::DataLayout::getTypeStoreSize(), LI, llvm::LLVMContext::MD_range, llvm::FunctionLoweringInfo::MF, llvm::MachineMemOperand::MOInvariant, llvm::MachineMemOperand::MOLoad, llvm::MachineMemOperand::MONonTemporal, llvm::MachineMemOperand::MOStore, llvm::MachineMemOperand::MOVolatile, Ranges, and TM.
unsigned FastISel::createResultReg | ( | const TargetRegisterClass * | RC | ) | [protected] |
Definition at line 1672 of file FastISel.cpp.
References llvm::MachineRegisterInfo::createVirtualRegister(), and MRI.
Referenced by constrainOperandRegClass(), fastEmitInst_(), fastEmitInst_extractsubreg(), fastEmitInst_i(), fastEmitInst_ii(), fastEmitInst_r(), fastEmitInst_rf(), fastEmitInst_ri(), fastEmitInst_rii(), fastEmitInst_rr(), fastEmitInst_rri(), fastEmitInst_rrii(), fastEmitInst_rrr(), selectBitCast(), and selectPatchpoint().
Prepare InsertPt to begin inserting instructions into the local value area and return the old insert position.
Definition at line 362 of file FastISel.cpp.
References DbgLoc, FuncInfo, llvm::FunctionLoweringInfo::InsertPt, and recomputeInsertPt().
Referenced by getRegForValue().
unsigned FastISel::fastEmit_ | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type and opcode be emitted.
Definition at line 1593 of file FastISel.cpp.
Referenced by selectOperator().
unsigned FastISel::fastEmit_f | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
const ConstantFP * | FPImm | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and floating-point immediate operand be emitted.
Definition at line 1610 of file FastISel.cpp.
unsigned FastISel::fastEmit_i | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
uint64_t | Imm | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and immediate operand be emitted.
Definition at line 1606 of file FastISel.cpp.
Referenced by fastEmit_ri_().
unsigned FastISel::fastEmit_r | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
unsigned | Op0, | ||
bool | Op0IsKill | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register operand be emitted.
Definition at line 1595 of file FastISel.cpp.
Referenced by getRegForGEPIndex(), selectBitCast(), selectCast(), and selectFNeg().
unsigned FastISel::fastEmit_rf | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
const ConstantFP * | FPImm | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register and floating-point immediate operands be emitted.
Definition at line 1620 of file FastISel.cpp.
Referenced by selectBinaryOp().
unsigned FastISel::fastEmit_ri | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
uint64_t | Imm | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register and immediate.
Definition at line 1615 of file FastISel.cpp.
Referenced by fastEmit_ri_(), and fastEmitZExtFromI1().
unsigned FastISel::fastEmit_ri_ | ( | MVT | VT, |
unsigned | Opcode, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
uint64_t | Imm, | ||
MVT | ImmType | ||
) | [protected] |
This method is a wrapper of fastEmit_ri.
It first tries to emit an instruction with an immediate operand using fastEmit_ri. If that fails, it materializes the immediate into a register and try fastEmit_rr instead.
This method is a wrapper of fastEmit_ri. It first tries to emit an instruction with an immediate operand using fastEmit_ri. If that fails, it materializes the immediate into a register and try fastEmit_rr instead.
Definition at line 1636 of file FastISel.cpp.
References llvm::ISD::Constant, fastEmit_i(), fastEmit_ri(), fastEmit_rr(), llvm::FunctionLoweringInfo::Fn, FuncInfo, llvm::IntegerType::get(), llvm::ConstantInt::get(), llvm::Function::getContext(), getRegForValue(), llvm::MVT::getSizeInBits(), llvm::isPowerOf2_64(), llvm::Log2_64(), llvm::ISD::MUL, llvm::ISD::SHL, llvm::ISD::SRA, llvm::ISD::SRL, and llvm::ISD::UDIV.
Referenced by selectBinaryOp(), selectFNeg(), and selectGetElementPtr().
unsigned FastISel::fastEmit_rr | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
unsigned | Op1, | ||
bool | Op1IsKill | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register operands be emitted.
Definition at line 1600 of file FastISel.cpp.
Referenced by fastEmit_ri_(), selectBinaryOp(), and selectGetElementPtr().
unsigned FastISel::fastEmit_rri | ( | MVT | VT, |
MVT | RetVT, | ||
unsigned | Opcode, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
unsigned | Op1, | ||
bool | Op1IsKill, | ||
uint64_t | Imm | ||
) | [protected, virtual] |
This method is called by target-independent code to request that an instruction with the given type, opcode, and register and immediate operands be emitted.
Definition at line 1626 of file FastISel.cpp.
void FastISel::fastEmitBranch | ( | MachineBasicBlock * | MSucc, |
DebugLoc | DbgLoc | ||
) | [protected] |
Emit an unconditional branch to the given block, unless it is the immediate (fall-through) successor, and update the CFG.
Definition at line 1352 of file FastISel.cpp.
References llvm::MachineBasicBlock::addSuccessor(), llvm::FunctionLoweringInfo::BPI, FuncInfo, llvm::MachineBasicBlock::getBasicBlock(), llvm::BranchProbabilityInfo::getEdgeWeight(), llvm::TargetInstrInfo::InsertBranch(), llvm::MachineBasicBlock::isLayoutSuccessor(), llvm::FunctionLoweringInfo::MBB, llvm::BasicBlock::size(), and TII.
Referenced by selectOperator().
unsigned FastISel::fastEmitInst_ | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC | ||
) | [protected] |
Emit a MachineInstr with no operands and a result register in the given register class.
Definition at line 1693 of file FastISel.cpp.
References llvm::BuildMI(), createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_extractsubreg | ( | MVT | RetVT, |
unsigned | Op0, | ||
bool | Op0IsKill, | ||
uint32_t | Idx | ||
) | [protected] |
Emit a MachineInstr for an extract_subreg from a specified index of a superregister to a specified type.
Definition at line 1934 of file FastISel.cpp.
References llvm::BuildMI(), llvm::MachineRegisterInfo::constrainRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MachineRegisterInfo::getRegClass(), llvm::TargetLoweringBase::getRegClassFor(), llvm::TargetRegisterInfo::getSubClassWithSubReg(), llvm::FunctionLoweringInfo::InsertPt, llvm::TargetRegisterInfo::isVirtualRegister(), llvm::FunctionLoweringInfo::MBB, MRI, TII, TLI, and TRI.
unsigned FastISel::fastEmitInst_i | ( | unsigned | MachineInstrOpcode, |
const TargetRegisterClass * | RC, | ||
uint64_t | Imm | ||
) | [protected] |
Emit a MachineInstr with a single immediate operand, and a result register in the given register class.
Definition at line 1899 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::BuildMI(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_ii | ( | unsigned | MachineInstrOpcode, |
const TargetRegisterClass * | RC, | ||
uint64_t | Imm1, | ||
uint64_t | Imm2 | ||
) | [protected] |
Emit a MachineInstr with a two immediate operands.
Definition at line 1915 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::BuildMI(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_r | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill | ||
) | [protected] |
Emit a MachineInstr with one register operand and a result register in the given register class.
Definition at line 1702 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_rf | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
const ConstantFP * | FPImm | ||
) | [protected] |
Emit a MachineInstr with two register operands and a result register in the given register class.
Definition at line 1822 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addFPImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_ri | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
uint64_t | Imm | ||
) | [protected] |
Emit a MachineInstr with a register operand, an immediate, and a result register in the given register class.
Definition at line 1775 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_rii | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
uint64_t | Imm1, | ||
uint64_t | Imm2 | ||
) | [protected] |
Emit a MachineInstr with one register operand and two immediate operands.
Definition at line 1797 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_rr | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
unsigned | Op1, | ||
bool | Op1IsKill | ||
) | [protected] |
Emit a MachineInstr with two register operands and a result register in the given register class.
Definition at line 1723 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_rri | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
unsigned | Op1, | ||
bool | Op1IsKill, | ||
uint64_t | Imm | ||
) | [protected] |
Emit a MachineInstr with two register operands, an immediate, and a result register in the given register class.
Definition at line 1844 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_rrii | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
unsigned | Op1, | ||
bool | Op1IsKill, | ||
uint64_t | Imm1, | ||
uint64_t | Imm2 | ||
) | [protected] |
Emit a MachineInstr with two register operands, two immediates operands, and a result register in the given register class.
Definition at line 1870 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitInst_rrr | ( | unsigned | MachineInstOpcode, |
const TargetRegisterClass * | RC, | ||
unsigned | Op0, | ||
bool | Op0IsKill, | ||
unsigned | Op1, | ||
bool | Op1IsKill, | ||
unsigned | Op2, | ||
bool | Op2IsKill | ||
) | [protected] |
Emit a MachineInstr with three register operands and a result register in the given register class.
Definition at line 1747 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), constrainOperandRegClass(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::ImplicitDefs, llvm::FunctionLoweringInfo::InsertPt, llvm::FunctionLoweringInfo::MBB, and TII.
unsigned FastISel::fastEmitZExtFromI1 | ( | MVT | VT, |
unsigned | Op0, | ||
bool | Op0IsKill | ||
) | [protected] |
Emit MachineInstrs to compute the value of Op with all but the least significant bit set to zero.
Definition at line 1948 of file FastISel.cpp.
References llvm::ISD::AND, and fastEmit_ri().
bool FastISel::fastLowerArguments | ( | ) | [protected, virtual] |
This method is called by target-independent code to do target- specific argument lowering. It returns true if it was successful.
Definition at line 1585 of file FastISel.cpp.
Referenced by lowerArguments().
bool FastISel::fastLowerCall | ( | CallLoweringInfo & | CLI | ) | [protected, virtual] |
This method is called by target-independent code to do target- specific call lowering. It returns true if it was successful.
Definition at line 1587 of file FastISel.cpp.
Referenced by lowerCallTo().
bool FastISel::fastLowerIntrinsicCall | ( | const IntrinsicInst * | II | ) | [protected, virtual] |
This method is called by target-independent code to do target- specific intrinsic lowering. It returns true if it was successful.
Definition at line 1589 of file FastISel.cpp.
Referenced by selectIntrinsicCall().
virtual unsigned llvm::FastISel::fastMaterializeAlloca | ( | const AllocaInst * | C | ) | [inline, protected, virtual] |
Emit an alloca address in a register using target-specific logic.
Definition at line 475 of file FastISel.h.
virtual unsigned llvm::FastISel::fastMaterializeConstant | ( | const Constant * | C | ) | [inline, protected, virtual] |
Emit a constant in a register using target-specific logic, such as constant pool loads.
Definition at line 472 of file FastISel.h.
virtual unsigned llvm::FastISel::fastMaterializeFloatZero | ( | const ConstantFP * | CF | ) | [inline, protected, virtual] |
Emit the floating-point constant +0.0 in a register using target- specific logic.
Definition at line 479 of file FastISel.h.
virtual bool llvm::FastISel::fastSelectInstruction | ( | const Instruction * | I | ) | [protected, pure virtual] |
This method is called by target-independent code when the normal FastISel process fails to select an instruction. This gives targets a chance to emit code for anything that doesn't fit into FastISel's framework. It returns true if it was successful.
Referenced by selectInstruction().
DebugLoc llvm::FastISel::getCurDebugLoc | ( | ) | const [inline] |
Return current debug location information.
Definition at line 223 of file FastISel.h.
References DbgLoc.
MachineInstr* llvm::FastISel::getLastLocalValue | ( | ) | [inline] |
Return the position of the last instruction emitted for materializing constants for use in the current block.
Definition at line 209 of file FastISel.h.
References LastLocalValue.
Referenced by recomputeInsertPt().
std::pair< unsigned, bool > FastISel::getRegForGEPIndex | ( | const Value * | V | ) |
This is a wrapper around getRegForValue that also takes care of truncating or sign-extending the given getelementptr index value.
Definition at line 313 of file FastISel.cpp.
References llvm::EVT::bitsGT(), llvm::EVT::bitsLT(), fastEmit_r(), llvm::EVT::getEVT(), llvm::TargetLoweringBase::getPointerTy(), getRegForValue(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), hasTrivialKill(), llvm::ISD::SIGN_EXTEND, TLI, and llvm::ISD::TRUNCATE.
Referenced by selectGetElementPtr().
Create a virtual register and arrange for it to be assigned the value for the given LLVM value.
Definition at line 166 of file FastISel.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::count(), enterLocalValueArea(), FuncInfo, llvm::Value::getContext(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), llvm::TargetLoweringBase::getTypeToTransformTo(), llvm::TargetLoweringBase::getValueType(), llvm::MVT::i1, llvm::MVT::i16, llvm::MVT::i8, llvm::FunctionLoweringInfo::InitializeRegForValue(), llvm::EVT::isSimple(), llvm::TargetLoweringBase::isTypeLegal(), leaveLocalValueArea(), lookUpRegForValue(), llvm::FunctionLoweringInfo::StaticAllocaMap, and TLI.
Referenced by fastEmit_ri_(), getRegForGEPIndex(), selectBinaryOp(), selectBitCast(), selectCast(), selectFNeg(), selectGetElementPtr(), selectIntrinsicCall(), selectOperator(), selectPatchpoint(), and tryToFoldLoad().
bool FastISel::hasTrivialKill | ( | const Value * | V | ) | [protected] |
Test whether the given value has exactly one use.
Definition at line 133 of file FastISel.cpp.
References DL, llvm::dyn_cast(), llvm::DataLayout::getIntPtrType(), llvm::Instruction::getOpcode(), llvm::Instruction::getParent(), getParent(), llvm::Value::hasOneUse(), I, llvm::IntToPtr, lookUpRegForValue(), MRI, llvm::MachineRegisterInfo::use_empty(), and llvm::Value::user_begin().
Referenced by getRegForGEPIndex(), selectBinaryOp(), selectBitCast(), selectCast(), selectFNeg(), and selectGetElementPtr().
bool llvm::FastISel::isCommutativeIntrinsic | ( | IntrinsicInst const * | II | ) | [inline, protected] |
Definition at line 503 of file FastISel.h.
References llvm::IntrinsicInst::getIntrinsicID().
void FastISel::leaveLocalValueArea | ( | SavePoint | Old | ) |
Reset InsertPt to the given old insert position.
Definition at line 371 of file FastISel.cpp.
References llvm::MachineBasicBlock::begin(), DbgLoc, llvm::FastISel::SavePoint::DL, FuncInfo, llvm::FunctionLoweringInfo::InsertPt, llvm::FastISel::SavePoint::InsertPt, LastLocalValue, and llvm::FunctionLoweringInfo::MBB.
Referenced by getRegForValue().
Look up the value to see if its value is already cached in a register. It may be defined by instructions across blocks or defined locally.
Definition at line 283 of file FastISel.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::find(), FuncInfo, I, LocalValueMap, and llvm::FunctionLoweringInfo::ValueMap.
Referenced by getRegForValue(), hasTrivialKill(), and selectIntrinsicCall().
Do "fast" instruction selection for function arguments and append the machine instructions to the current block. Returns true when successful.
Definition at line 106 of file FastISel.cpp.
References llvm::Function::arg_begin(), llvm::Function::arg_end(), llvm::FunctionLoweringInfo::CanLowerReturn, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::end(), fastLowerArguments(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::find(), llvm::FunctionLoweringInfo::Fn, FuncInfo, I, LocalValueMap, and llvm::FunctionLoweringInfo::ValueMap.
bool FastISel::lowerCall | ( | const CallInst * | I | ) | [protected] |
Definition at line 983 of file FastISel.cpp.
References llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_begin(), llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_end(), llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_size(), llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledValue(), llvm::CallInst::getCalledValue(), llvm::SequentialType::getElementType(), llvm::Value::getType(), llvm::Type::isEmptyTy(), llvm::isInTailCallPosition(), llvm::CallInst::isTailCall(), lowerCallTo(), llvm::FastISel::ArgListEntry::setAttributes(), llvm::FastISel::CallLoweringInfo::setCallee(), TM, llvm::FastISel::ArgListEntry::Ty, and llvm::FastISel::ArgListEntry::Val.
Referenced by selectCall().
bool FastISel::lowerCallTo | ( | const CallInst * | CI, |
const char * | SymName, | ||
unsigned | NumArgs | ||
) | [protected] |
Definition at line 852 of file FastISel.cpp.
References llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledValue(), llvm::SequentialType::getElementType(), llvm::User::getOperand(), llvm::Value::getType(), llvm::Type::isEmptyTy(), llvm::FastISel::CallLoweringInfo::setCallee(), and llvm::FastISel::ArgListEntry::Val.
Referenced by lowerCall().
bool FastISel::lowerCallTo | ( | CallLoweringInfo & | CLI | ) | [protected] |
Definition at line 883 of file FastISel.cpp.
References llvm::ISD::InputArg::ArgVT, llvm::FastISel::CallLoweringInfo::Call, llvm::FastISel::CallLoweringInfo::CallConv, llvm::TargetLowering::CanLowerReturn(), llvm::FastISel::CallLoweringInfo::clearIns(), llvm::FastISel::CallLoweringInfo::clearOuts(), llvm::ComputeValueVTs(), llvm::FastISel::CallLoweringInfo::CS, DL, fastLowerCall(), llvm::ISD::InputArg::Flags, FuncInfo, llvm::TargetLowering::functionArgumentNeedsConsecutiveRegisters(), llvm::DataLayout::getABITypeAlignment(), llvm::FastISel::CallLoweringInfo::getArgs(), llvm::TargetLoweringBase::getByValTypeAlignment(), llvm::Type::getContext(), llvm::SequentialType::getElementType(), llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::TargetLoweringBase::getNumRegisters(), llvm::TargetLoweringBase::getRegisterType(), getReturnAttrs(), llvm::GetReturnInfo(), llvm::DataLayout::getTypeAllocSize(), I, llvm::FastISel::CallLoweringInfo::InRegs, llvm::FastISel::CallLoweringInfo::Ins, llvm::FastISel::CallLoweringInfo::IsInReg, llvm::FastISel::CallLoweringInfo::IsReturnValueUsed, llvm::FastISel::CallLoweringInfo::IsVarArg, llvm::FunctionLoweringInfo::MF, llvm::FastISel::CallLoweringInfo::NumResultRegs, llvm::FastISel::CallLoweringInfo::OutFlags, llvm::FastISel::CallLoweringInfo::OutVals, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), llvm::FastISel::CallLoweringInfo::ResultReg, llvm::FastISel::CallLoweringInfo::RetSExt, llvm::FastISel::CallLoweringInfo::RetTy, llvm::FastISel::CallLoweringInfo::RetZExt, llvm::ISD::ArgFlagsTy::setByVal(), llvm::ISD::ArgFlagsTy::setByValAlign(), llvm::ISD::ArgFlagsTy::setByValSize(), llvm::ISD::ArgFlagsTy::setInAlloca(), llvm::ISD::ArgFlagsTy::setInConsecutiveRegs(), llvm::ISD::ArgFlagsTy::setInReg(), llvm::ISD::ArgFlagsTy::setNest(), llvm::ISD::ArgFlagsTy::setOrigAlign(), llvm::MachineInstr::setPhysRegsDeadExcept(), llvm::ISD::ArgFlagsTy::setSExt(), llvm::ISD::ArgFlagsTy::setSRet(), llvm::ISD::ArgFlagsTy::setZExt(), llvm::SmallVectorTemplateCommon< T >::size(), TLI, TRI, updateValueMap(), llvm::ISD::InputArg::Used, and llvm::ISD::InputArg::VT.
CmpInst::Predicate FastISel::optimizeCmpPredicate | ( | const CmpInst * | CI | ) | const [protected] |
Definition at line 2146 of file FastISel.cpp.
References llvm::CmpInst::FCMP_FALSE, llvm::CmpInst::FCMP_OEQ, llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_ONE, llvm::CmpInst::FCMP_ORD, llvm::CmpInst::FCMP_TRUE, llvm::CmpInst::FCMP_UEQ, llvm::CmpInst::FCMP_UGE, llvm::CmpInst::FCMP_UGT, llvm::CmpInst::FCMP_ULE, llvm::CmpInst::FCMP_ULT, llvm::CmpInst::FCMP_UNE, llvm::CmpInst::FCMP_UNO, llvm::User::getOperand(), llvm::CmpInst::getPredicate(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, and llvm_unreachable.
void FastISel::recomputeInsertPt | ( | ) |
Reset InsertPt to prepare for inserting instructions into the current block.
Definition at line 336 of file FastISel.cpp.
References llvm::ISD::EH_LABEL, llvm::MachineBasicBlock::end(), FuncInfo, llvm::MachineBasicBlock::getFirstNonPHI(), getLastLocalValue(), llvm::FunctionLoweringInfo::InsertPt, and llvm::FunctionLoweringInfo::MBB.
Referenced by enterLocalValueArea(), removeDeadCode(), and selectInstruction().
Remove all dead instructions between the I and E.
Definition at line 350 of file FastISel.cpp.
References llvm::RegState::Dead, llvm::MachineInstr::eraseFromParent(), I, and recomputeInsertPt().
Referenced by selectInstruction().
bool FastISel::selectBinaryOp | ( | const User * | I, |
unsigned | ISDOpcode | ||
) | [protected] |
Select and emit code for a binary operator instruction, which has an opcode which directly corresponds to the given ISD opcode.
Definition at line 380 of file FastISel.cpp.
References llvm::ISD::AND, AND, fastEmit_rf(), fastEmit_ri_(), fastEmit_rr(), llvm::Value::getContext(), llvm::EVT::getEVT(), llvm::User::getOperand(), getRegForValue(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), llvm::TargetLoweringBase::getTypeToTransformTo(), hasTrivialKill(), I, llvm::MVT::i1, llvm::isPowerOf2_64(), llvm::EVT::isSimple(), llvm::TargetLoweringBase::isTypeLegal(), llvm::Log2_64(), llvm::ISD::OR, llvm::MVT::Other, llvm::ISD::SDIV, llvm::ISD::SRA, TLI, updateValueMap(), llvm::ISD::UREM, and llvm::ISD::XOR.
Referenced by selectOperator().
bool FastISel::selectBitCast | ( | const User * | I | ) | [protected] |
Definition at line 1242 of file FastISel.cpp.
References llvm::ISD::BITCAST, llvm::BuildMI(), llvm::TargetOpcode::COPY, createResultReg(), DbgLoc, fastEmit_r(), FuncInfo, llvm::MCInstrInfo::get(), llvm::User::getOperand(), llvm::TargetLoweringBase::getRegClassFor(), getRegForValue(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), llvm::TargetLoweringBase::getValueType(), hasTrivialKill(), llvm::FunctionLoweringInfo::InsertPt, llvm::TargetLoweringBase::isTypeLegal(), llvm::FunctionLoweringInfo::MBB, llvm::MVT::Other, TII, TLI, and updateValueMap().
Referenced by selectOperator().
bool FastISel::selectCall | ( | const User * | Call | ) | [protected] |
Definition at line 1023 of file FastISel.cpp.
References llvm::BuildMI(), llvm::Call, llvm::ComputeUsesVAFloatArgument(), DbgLoc, llvm::InlineAsm::Extra_HasSideEffects, llvm::InlineAsm::Extra_IsAlignStack, FuncInfo, llvm::MCInstrInfo::get(), llvm::CallInst::getCalledValue(), llvm::MachineFunction::getMMI(), I, llvm::TargetOpcode::INLINEASM, llvm::FunctionLoweringInfo::InsertPt, lowerCall(), llvm::FunctionLoweringInfo::MBB, llvm::FunctionLoweringInfo::MF, selectIntrinsicCall(), and TII.
Referenced by selectOperator().
bool FastISel::selectCast | ( | const User * | I, |
unsigned | Opcode | ||
) | [protected] |
Definition at line 1209 of file FastISel.cpp.
References fastEmit_r(), llvm::User::getOperand(), getRegForValue(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), llvm::TargetLoweringBase::getValueType(), hasTrivialKill(), llvm::EVT::isSimple(), llvm::TargetLoweringBase::isTypeLegal(), llvm::MVT::Other, TLI, and updateValueMap().
Referenced by selectOperator().
bool FastISel::selectExtractValue | ( | const User * | I | ) | [protected] |
Definition at line 1414 of file FastISel.cpp.
References llvm::ComputeLinearIndex(), llvm::ComputeValueVTs(), llvm::dyn_cast(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::find(), llvm::FunctionLoweringInfo::Fn, FuncInfo, llvm::Function::getContext(), llvm::ExtractValueInst::getIndices(), llvm::TargetLoweringBase::getNumRegisters(), llvm::User::getOperand(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), llvm::TargetLoweringBase::getValueType(), I, llvm::MVT::i1, if(), llvm::FunctionLoweringInfo::InitializeRegForValue(), llvm::EVT::isSimple(), llvm::TargetLoweringBase::isTypeLegal(), TLI, updateValueMap(), and llvm::FunctionLoweringInfo::ValueMap.
Referenced by selectOperator().
bool FastISel::selectFNeg | ( | const User * | I | ) | [protected] |
Emit an FNeg operation.
Definition at line 1371 of file FastISel.cpp.
References llvm::ISD::BITCAST, fastEmit_r(), fastEmit_ri_(), llvm::ISD::FNEG, llvm::Value::getContext(), llvm::BinaryOperator::getFNegArgument(), llvm::EVT::getIntegerVT(), getRegForValue(), llvm::EVT::getSimpleVT(), llvm::EVT::getSizeInBits(), llvm::Value::getType(), llvm::TargetLoweringBase::getValueType(), hasTrivialKill(), llvm::TargetLoweringBase::isTypeLegal(), TLI, updateValueMap(), and XOR.
Referenced by selectOperator().
bool FastISel::selectGetElementPtr | ( | const User * | I | ) | [protected] |
Definition at line 482 of file FastISel.cpp.
References llvm::ISD::ADD, DL, fastEmit_ri_(), fastEmit_rr(), llvm::tgtok::Field, llvm::StructLayout::getElementOffset(), llvm::User::getOperand(), llvm::TargetLoweringBase::getPointerTy(), getRegForGEPIndex(), getRegForValue(), llvm::DataLayout::getStructLayout(), llvm::Value::getType(), llvm::DataLayout::getTypeAllocSize(), hasTrivialKill(), llvm::ISD::MUL, N, llvm::User::op_begin(), llvm::User::op_end(), TLI, and updateValueMap().
Referenced by selectOperator().
bool llvm::FastISel::selectInsertValue | ( | const User * | I | ) | [protected] |
Do "fast" instruction selection for the given LLVM IR instruction and append the generated machine instructions to the current block. Returns true if selection was successful.
Definition at line 1291 of file FastISel.cpp.
References llvm::Call, DbgLoc, llvm::StringRef::empty(), F(), fastSelectInstruction(), FuncInfo, llvm::Instruction::getDebugLoc(), llvm::Function::getIntrinsicID(), llvm::TargetLibraryInfo::getLibFunc(), llvm::Value::getName(), llvm::Instruction::getOpcode(), llvm::Instruction::getParent(), llvm::TargetOptions::getTrapFunctionName(), llvm::GlobalValue::hasLocalLinkage(), llvm::Value::hasName(), llvm::TargetLibraryInfo::hasOptimizedCodeGen(), llvm::FunctionLoweringInfo::InsertPt, LibInfo, llvm::TargetMachine::Options, llvm::FunctionLoweringInfo::OrigNumPHINodesToUpdate, llvm::FunctionLoweringInfo::PHINodesToUpdate, recomputeInsertPt(), removeDeadCode(), selectOperator(), SkipTargetIndependentISel, and TM.
bool FastISel::selectIntrinsicCall | ( | const IntrinsicInst * | II | ) | [protected] |
Definition at line 1069 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addCImm(), llvm::MachineInstrBuilder::addFPImm(), llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMetadata(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::count(), llvm::MachineOperand::CreateFI(), llvm::MachineOperand::CreateReg(), llvm::TargetOpcode::DBG_VALUE, DbgLoc, llvm::dbgs(), DEBUG, fastLowerIntrinsicCall(), FuncInfo, llvm::MCInstrInfo::get(), llvm::ConstantInt::get(), llvm::DbgDeclareInst::getAddress(), llvm::CallInst::getArgOperand(), llvm::FunctionLoweringInfo::getArgumentFrameIndex(), llvm::IntrinsicInst::getIntrinsicID(), llvm::MachineFunction::getMMI(), llvm::DbgValueInst::getOffset(), llvm::MachineOperand::getReg(), getRegForValue(), llvm::Value::getType(), llvm::DbgValueInst::getValue(), llvm::DbgDeclareInst::getVariable(), llvm::DbgValueInst::getVariable(), llvm::MachineModuleInfo::hasDebugInfo(), llvm::FunctionLoweringInfo::InitializeRegForValue(), llvm::FunctionLoweringInfo::InsertPt, llvm::MachineOperand::isReg(), llvm::ConstantInt::isZero(), lookUpRegForValue(), llvm::FunctionLoweringInfo::MBB, llvm::FunctionLoweringInfo::MF, selectPatchpoint(), selectStackmap(), llvm::MachineOperand::setIsDebug(), llvm::FunctionLoweringInfo::StaticAllocaMap, TII, updateValueMap(), and llvm::Value::use_empty().
Referenced by selectCall().
bool FastISel::selectOperator | ( | const User * | I, |
unsigned | Opcode | ||
) |
Do "fast" instruction selection for the given LLVM IR operator (Instruction or ConstantExpr), and append generated machine instructions to the current block. Return true if selection was successful.
Definition at line 1454 of file FastISel.cpp.
References llvm::ISD::ADD, llvm::Alloca, llvm::ISD::AND, llvm::APIntOps::And(), llvm::EVT::bitsGT(), llvm::EVT::bitsLT(), llvm::Call, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::count(), llvm::ExtractValue, llvm::ISD::FADD, fastEmit_(), fastEmitBranch(), llvm::ISD::FDIV, llvm::ISD::FMUL, llvm::ISD::FP_TO_SINT, llvm::FPToSI, llvm::ISD::FREM, llvm::ISD::FSUB, FuncInfo, llvm::Instruction::getDebugLoc(), llvm::User::getOperand(), getRegForValue(), llvm::BranchInst::getSuccessor(), llvm::Value::getType(), llvm::TargetLoweringBase::getValueType(), I, llvm::IntToPtr, llvm::BinaryOperator::isFNeg(), llvm::BranchInst::isUnconditional(), llvm_unreachable, llvm::LShr, llvm::FunctionLoweringInfo::MBBMap, llvm::ISD::MUL, llvm::TargetMachine::Options, llvm::ISD::OR, llvm::APIntOps::Or(), llvm::MVT::Other, llvm::TargetOpcode::PHI, llvm::ISD::SDIV, selectBinaryOp(), selectBitCast(), selectCall(), selectCast(), selectExtractValue(), selectFNeg(), selectGetElementPtr(), llvm::SExt, llvm::ISD::SHL, llvm::ISD::SIGN_EXTEND, llvm::ISD::SINT_TO_FP, llvm::SIToFP, llvm::ISD::SRA, llvm::ISD::SREM, llvm::ISD::SRL, llvm::FunctionLoweringInfo::StaticAllocaMap, llvm::ISD::SUB, TLI, TM, llvm::ISD::TRAP, llvm::TargetOptions::TrapUnreachable, llvm::Trunc, llvm::ISD::TRUNCATE, llvm::ISD::UDIV, updateValueMap(), llvm::ISD::UREM, llvm::ISD::XOR, llvm::APIntOps::Xor(), and llvm::ISD::ZERO_EXTEND.
Referenced by selectInstruction().
bool FastISel::selectPatchpoint | ( | const CallInst * | I | ) | [protected] |
Definition at line 703 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addOperand(), llvm::CallingConv::AnyReg, llvm::BuildMI(), llvm::CallingConv::C, llvm::FastISel::CallLoweringInfo::Call, llvm::PatchPointOpers::CCPos, llvm::MachineOperand::CreateImm(), llvm::MachineOperand::CreateReg(), llvm::MachineOperand::CreateRegMask(), createResultReg(), DbgLoc, llvm::MachineInstr::eraseFromParent(), FuncInfo, llvm::MCInstrInfo::get(), llvm::CallInst::getArgOperand(), llvm::CallInst::getCallingConv(), llvm::TargetRegisterInfo::getCallPreservedMask(), llvm::MachineFunction::getFrameInfo(), llvm::CallInst::getNumArgOperands(), llvm::User::getOperand(), llvm::TargetLoweringBase::getRegClassFor(), getRegForValue(), llvm::TargetLowering::getScratchRegisters(), llvm::Value::getType(), llvm::MVT::i64, llvm::PatchPointOpers::IDPos, llvm::FastISel::CallLoweringInfo::InRegs, llvm::IntToPtr, llvm::Type::isVoidTy(), llvm_unreachable, llvm::FunctionLoweringInfo::MBB, llvm::FunctionLoweringInfo::MF, llvm::PatchPointOpers::NArgPos, llvm::PatchPointOpers::NBytesPos, llvm::FastISel::CallLoweringInfo::NumResultRegs, llvm::FastISel::CallLoweringInfo::OutRegs, llvm::TargetOpcode::PATCHPOINT, llvm::SmallVectorTemplateBase< T, isPodLike< T >::value >::push_back(), llvm::FastISel::CallLoweringInfo::ResultReg, llvm::MachineFrameInfo::setHasPatchPoint(), llvm::MachineInstr::setPhysRegsDeadExcept(), llvm::SmallVectorTemplateCommon< T, typename >::size(), llvm::PatchPointOpers::TargetPos, TII, TLI, TRI, and updateValueMap().
Referenced by selectIntrinsicCall().
bool FastISel::selectStackmap | ( | const CallInst * | I | ) | [protected] |
Definition at line 600 of file FastISel.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addOperand(), llvm::BuildMI(), llvm::MachineOperand::CreateImm(), llvm::MachineOperand::CreateReg(), DbgLoc, FuncInfo, llvm::MCInstrInfo::get(), llvm::CallInst::getCalledFunction(), llvm::TargetInstrInfo::getCallFrameDestroyOpcode(), llvm::TargetInstrInfo::getCallFrameSetupOpcode(), llvm::CallInst::getCallingConv(), llvm::MachineFunction::getFrameInfo(), llvm::User::getOperand(), llvm::Function::getReturnType(), llvm::TargetLowering::getScratchRegisters(), llvm::PatchPointOpers::IDPos, llvm::FunctionLoweringInfo::InsertPt, llvm::Type::isVoidTy(), llvm::FunctionLoweringInfo::MBB, llvm::FunctionLoweringInfo::MF, llvm::PatchPointOpers::NBytesPos, llvm::MachineFrameInfo::setHasStackMap(), llvm::TargetOpcode::STACKMAP, TII, and TLI.
Referenced by selectIntrinsicCall().
void llvm::FastISel::setLastLocalValue | ( | MachineInstr * | I | ) | [inline] |
Update the position of the last instruction emitted for materializing constants for use in the current block.
Definition at line 213 of file FastISel.h.
References EmitStartPt, I, and LastLocalValue.
void FastISel::startNewBlock | ( | ) |
Set the current block to which generated machine instructions will be appended, and clear the local CSE map.
Definition at line 94 of file FastISel.cpp.
References llvm::MachineBasicBlock::back(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT >::clear(), EmitStartPt, llvm::MachineBasicBlock::empty(), FuncInfo, LastLocalValue, LocalValueMap, and llvm::FunctionLoweringInfo::MBB.
bool FastISel::tryToFoldLoad | ( | const LoadInst * | LI, |
const Instruction * | FoldInst | ||
) |
We're checking to see if we can fold LI
into FoldInst
. Note that we could have a sequence where multiple LLVM IR instructions are folded into the same machineinstr. For example we could have:
A: x = load i32 *P B: y = icmp A, 42 C: br y, ...
In this scenario, LI
is "A", and FoldInst
is "C". We know about "B" (and any other folded instructions) because it is between A and C.
If we succeed folding, return true.
Definition at line 2027 of file FastISel.cpp.
References FuncInfo, llvm::MachineRegisterInfo::defusechain_iterator< ReturnUses, ReturnDefs, SkipDebug, ByOperand, ByInstr, ByBundle >::getOperandNo(), llvm::Instruction::getParent(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getParent(), getRegForValue(), llvm::Value::hasOneUse(), llvm::MachineRegisterInfo::hasOneUse(), llvm::FunctionLoweringInfo::InsertPt, llvm::LoadInst::isVolatile(), LI, llvm::FunctionLoweringInfo::MBB, MRI, llvm::MachineRegisterInfo::reg_begin(), tryToFoldLoadIntoMI(), and llvm::Instruction::user_back().
virtual bool llvm::FastISel::tryToFoldLoadIntoMI | ( | MachineInstr * | , |
unsigned | , | ||
const LoadInst * | |||
) | [inline, virtual] |
The specified machine instr operand is a vreg, and that vreg is being provided by the specified load instruction. If possible, try to fold the load as an operand to the instruction, returning true if possible.
This method should be implemented by targets.
Definition at line 273 of file FastISel.h.
Referenced by tryToFoldLoad().
void FastISel::updateValueMap | ( | const Value * | I, |
unsigned | Reg, | ||
unsigned | NumRegs = 1 |
||
) | [protected] |
Update the value map to include the new mapping for this instruction, or insert an extra copy to get the result in a previous determined register.
NOTE: This is only necessary because we might select a block that uses a value before we select the block that defines the value. It might be possible to fix this by selecting blocks in reverse postorder.
Definition at line 294 of file FastISel.cpp.
References FuncInfo, I, LocalValueMap, llvm::FunctionLoweringInfo::RegFixups, and llvm::FunctionLoweringInfo::ValueMap.
Referenced by lowerCallTo(), selectBinaryOp(), selectBitCast(), selectCast(), selectExtractValue(), selectFNeg(), selectGetElementPtr(), selectIntrinsicCall(), selectOperator(), and selectPatchpoint().
DebugLoc llvm::FastISel::DbgLoc [protected] |
Definition at line 186 of file FastISel.h.
Referenced by constrainOperandRegClass(), enterLocalValueArea(), fastEmitInst_(), fastEmitInst_extractsubreg(), fastEmitInst_i(), fastEmitInst_ii(), fastEmitInst_r(), fastEmitInst_rf(), fastEmitInst_ri(), fastEmitInst_rii(), fastEmitInst_rr(), fastEmitInst_rri(), fastEmitInst_rrii(), fastEmitInst_rrr(), getCurDebugLoc(), leaveLocalValueArea(), selectBitCast(), selectCall(), selectInstruction(), selectIntrinsicCall(), selectPatchpoint(), and selectStackmap().
const DataLayout& llvm::FastISel::DL [protected] |
Definition at line 188 of file FastISel.h.
Referenced by canFoldAddIntoGEP(), createMachineMemOperandFor(), hasTrivialKill(), lowerCallTo(), and selectGetElementPtr().
MachineInstr* llvm::FastISel::EmitStartPt [protected] |
The top most instruction in the current block that is allowed for emitting local variables. LastLocalValue resets to EmitStartPt when it makes sense (for example, on function calls)
Definition at line 204 of file FastISel.h.
Referenced by setLastLocalValue(), and startNewBlock().
FunctionLoweringInfo& llvm::FastISel::FuncInfo [protected] |
Definition at line 181 of file FastISel.h.
Referenced by canFoldAddIntoGEP(), constrainOperandRegClass(), createMachineMemOperandFor(), enterLocalValueArea(), fastEmit_ri_(), fastEmitBranch(), fastEmitInst_(), fastEmitInst_extractsubreg(), fastEmitInst_i(), fastEmitInst_ii(), fastEmitInst_r(), fastEmitInst_rf(), fastEmitInst_ri(), fastEmitInst_rii(), fastEmitInst_rr(), fastEmitInst_rri(), fastEmitInst_rrii(), fastEmitInst_rrr(), getRegForValue(), leaveLocalValueArea(), lookUpRegForValue(), lowerArguments(), lowerCallTo(), recomputeInsertPt(), selectBitCast(), selectCall(), selectExtractValue(), selectInstruction(), selectIntrinsicCall(), selectOperator(), selectPatchpoint(), selectStackmap(), startNewBlock(), tryToFoldLoad(), and updateValueMap().
MachineInstr* llvm::FastISel::LastLocalValue [protected] |
The position of the last instruction for materializing constants for use in the current block. It resets to EmitStartPt when it makes sense (for example, it's usually profitable to avoid function calls between the definition and the use)
Definition at line 199 of file FastISel.h.
Referenced by getLastLocalValue(), leaveLocalValueArea(), setLastLocalValue(), and startNewBlock().
const TargetLibraryInfo* llvm::FastISel::LibInfo [protected] |
Definition at line 192 of file FastISel.h.
Referenced by selectInstruction().
DenseMap<const Value *, unsigned> llvm::FastISel::LocalValueMap [protected] |
Definition at line 180 of file FastISel.h.
Referenced by lookUpRegForValue(), lowerArguments(), startNewBlock(), and updateValueMap().
MachineConstantPool& llvm::FastISel::MCP [protected] |
Definition at line 185 of file FastISel.h.
MachineFunction* llvm::FastISel::MF [protected] |
Definition at line 182 of file FastISel.h.
MachineFrameInfo& llvm::FastISel::MFI [protected] |
Definition at line 184 of file FastISel.h.
MachineRegisterInfo& llvm::FastISel::MRI [protected] |
Definition at line 183 of file FastISel.h.
Referenced by constrainOperandRegClass(), createResultReg(), fastEmitInst_extractsubreg(), hasTrivialKill(), and tryToFoldLoad().
bool llvm::FastISel::SkipTargetIndependentISel [protected] |
Definition at line 193 of file FastISel.h.
Referenced by selectInstruction().
const TargetInstrInfo& llvm::FastISel::TII [protected] |
Definition at line 189 of file FastISel.h.
Referenced by constrainOperandRegClass(), fastEmitBranch(), fastEmitInst_(), fastEmitInst_extractsubreg(), fastEmitInst_i(), fastEmitInst_ii(), fastEmitInst_r(), fastEmitInst_rf(), fastEmitInst_ri(), fastEmitInst_rii(), fastEmitInst_rr(), fastEmitInst_rri(), fastEmitInst_rrii(), fastEmitInst_rrr(), selectBitCast(), selectCall(), selectIntrinsicCall(), selectPatchpoint(), and selectStackmap().
const TargetLowering& llvm::FastISel::TLI [protected] |
Definition at line 190 of file FastISel.h.
Referenced by fastEmitInst_extractsubreg(), getRegForGEPIndex(), getRegForValue(), lowerCallTo(), selectBinaryOp(), selectBitCast(), selectCast(), selectExtractValue(), selectFNeg(), selectGetElementPtr(), selectOperator(), selectPatchpoint(), and selectStackmap().
const TargetMachine& llvm::FastISel::TM [protected] |
Definition at line 187 of file FastISel.h.
Referenced by createMachineMemOperandFor(), lowerCall(), selectInstruction(), and selectOperator().
const TargetRegisterInfo& llvm::FastISel::TRI [protected] |
Definition at line 191 of file FastISel.h.
Referenced by constrainOperandRegClass(), fastEmitInst_extractsubreg(), lowerCallTo(), and selectPatchpoint().