55 switch (U.getOpcode()) {
59 case NVPTX::LDV_i16_v2:
60 case NVPTX::LDV_i16_v4:
61 case NVPTX::LDV_i32_v2:
62 case NVPTX::LDV_i32_v4:
63 case NVPTX::LDV_i64_v2:
64 case NVPTX::LDV_i64_v4: {
68 case NVPTX::cvta_local:
69 case NVPTX::cvta_local_64:
70 case NVPTX::cvta_to_local:
71 case NVPTX::cvta_to_local_64: {
72 for (
auto &U2 :
MRI.use_instructions(U.operands_begin()->getReg()))
93 RemoveList.
append(MaybeRemoveList);
99 constexpr unsigned LDInstBasePtrOpIdx = 5;
100 constexpr unsigned LDInstAddrSpaceOpIdx = 2;
101 for (
auto *LI : LoadInsts) {
102 (LI->uses().begin() + LDInstBasePtrOpIdx)
104 (LI->uses().begin() + LDInstAddrSpaceOpIdx)
105 ->ChangeToImmediate(NVPTX::AddressSpace::Param);
113 bool Changed =
false;
116 if (
MI.getOpcode() == NVPTX::MOV32_PARAM ||
117 MI.getOpcode() == NVPTX::MOV64_PARAM)
120 for (
auto *
MI : RemoveList)
121 MI->eraseFromParent();
143char NVPTXForwardParamsPass::ID = 0;
146 "NVPTX Forward Params",
false,
false)
153 return new NVPTXForwardParamsPass();
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool forwardDeviceParams(MachineFunction &MF)
static bool traverseMoveUse(MachineInstr &U, const MachineRegisterInfo &MRI, SmallVectorImpl< MachineInstr * > &RemoveList, SmallVectorImpl< MachineInstr * > &LoadInsts)
static bool eliminateMove(MachineInstr &Mov, const MachineRegisterInfo &MRI, SmallVectorImpl< MachineInstr * > &RemoveList)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the SmallVector class.
Represent the analysis usage information of a pass.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Representation of each machine instruction.
mop_iterator operands_begin()
mop_range uses()
Returns all operands which may be register uses.
MachineOperand class - Representation of each machine instruction operand.
bool isSymbol() const
isSymbol - Tests if this is a MO_ExternalSymbol operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
MachineFunctionPass * createNVPTXForwardParamsPass()