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)
116 if (
MI.getOpcode() == NVPTX::MOV32_PARAM ||
117 MI.getOpcode() == NVPTX::MOV64_PARAM)
120 for (
auto *
MI : RemoveList)
121 MI->eraseFromParent();
133 NVPTXForwardParamsPass() : MachineFunctionPass(ID) {}
135 bool runOnMachineFunction(MachineFunction &MF)
override;
137 void getAnalysisUsage(AnalysisUsage &AU)
const override {
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.
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.
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.
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()