LLVM: lib/Target/AMDGPU/AMDGPURegBankSelect.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

26

27#define DEBUG_TYPE "amdgpu-regbankselect"

28

29using namespace llvm;

30using namespace AMDGPU;

31

32namespace {

33

35public:

36 static char ID;

37

39

41

42 StringRef getPassName() const override {

43 return "AMDGPU Register Bank Select";

44 }

45

46 void getAnalysisUsage(AnalysisUsage &AU) const override {

51 }

52

53

54

57 }

58};

59

60}

61

63 "AMDGPU Register Bank Select", false, false)

69

70char AMDGPURegBankSelect::ID = 0;

71

73

75 return new AMDGPURegBankSelect();

76}

77

87

88public:

93 : B(B), MRI(*B.getMRI()), ILMA(ILMA), MUI(MUI), TRI(TRI),

94 SgprRB(&RBI.getRegBank(AMDGPU::SGPRRegBankID)),

95 VgprRB(&RBI.getRegBank(AMDGPU::VGPRRegBankID)),

96 VccRB(&RBI.getRegBank(AMDGPU::VCCRegBankID)) {}

97

98

99

100

101

102

103

106 if (MI->isCopy() || MI->getNumImplicitOperands() != 1)

107 return false;

108

109 return MI->implicit_operands().begin()->getReg() == TRI.getExec();

110 }

111

114 (MUI.isUniform(Reg) || ILMA.isS32S64LaneMask(Reg)))

115 return SgprRB;

117 return VccRB;

118 return VgprRB;

119 }

120

121

122

123

124

125

126

127

128

131

132

133

134

136 LLT Ty = MRI.getType(Reg);

137 Register NewReg = MRI.createVirtualRegister({RB, Ty});

138 DefOP.setReg(NewReg);

139

140 auto &MBB = *MI.getParent();

141 B.setInsertPt(MBB, MBB.SkipPHIsAndLabels(std::next(MI.getIterator())));

142 B.buildCopy(Reg, NewReg);

143

144

145

146

147

148

149

150

151

152

153

155 if (UseMI.isPreISelOpcode()) {

157 if (Op.isReg() && Op.getReg() == Reg)

158 Op.setReg(NewReg);

159 }

160 }

161 }

162 }

163

164

165

166

167

171

172 LLT Ty = MRI.getType(Reg);

173 Register NewReg = MRI.createVirtualRegister({RB, Ty});

174 UseOP.setReg(NewReg);

175

176 if (MI.isPHI()) {

177 auto DefMI = MRI.getVRegDef(Reg)->getIterator();

180 } else {

181 B.setInstr(MI);

182 }

183

184 B.buildCopy(NewReg, Reg);

185 }

186};

187

189 if (Op.isReg())

190 return {};

191

192

194 if (Reg.isVirtual())

195 return {};

196

197 return Reg;

198}

199

200bool AMDGPURegBankSelect::runOnMachineFunction(MachineFunction &MF) {

202 return false;

203

204

205 const TargetPassConfig &TPC = getAnalysis();

206 GISelCSEAnalysisWrapper &Wrapper =

207 getAnalysis().getCSEWrapper();

209 GISelObserverWrapper Observer;

211

212 CSEMIRBuilder B(MF);

213 B.setCSEInfo(&CSEInfo);

214 B.setChangeObserver(Observer);

215

216 RAIIDelegateInstaller DelegateInstaller(MF, &Observer);

217 RAIIMFObserverInstaller MFObserverInstaller(MF, Observer);

218

219 IntrinsicLaneMaskAnalyzer ILMA(MF);

221 getAnalysis().getUniformityInfo();

222 MachineRegisterInfo &MRI = *B.getMRI();

223 const GCNSubtarget &ST = MF.getSubtarget();

224 RegBankSelectHelper RBSHelper(B, ILMA, MUI, *ST.getRegisterInfo(),

225 *ST.getRegBankInfo());

226

227

228

229

230 for (MachineBasicBlock &MBB : MF) {

231 for (MachineInstr &MI : MBB) {

232

233

234 if (MI.isCopy()) {

236 if (!DefReg.isValid() || MRI.getRegClassOrNull(DefReg))

237 continue;

238

239 assert(MRI.getRegBankOrNull(DefReg));

240 MRI.setRegBank(DefReg, *RBSHelper.getRegBankToAssign(DefReg));

241 continue;

242 }

243

244 if (MI.isPreISelOpcode())

245 continue;

246

247

248

249

250

251

252

253

254

255

256

257 for (MachineOperand &DefOP : MI.defs()) {

260 continue;

261

262 const RegisterBank *RB = RBSHelper.getRegBankToAssign(DefReg);

263 if (MRI.getRegClassOrNull(DefReg))

264 RBSHelper.reAssignRegBankOnDef(MI, DefOP, RB);

265 else {

266 assert(MRI.getRegBankOrNull(DefReg));

267 MRI.setRegBank(DefReg, *RB);

268 }

269 }

270

271

272

273 for (MachineOperand &UseOP : MI.uses()) {

276 continue;

277

278

279 if (MRI.getRegClassOrNull(UseReg) ||

280 MRI.getVRegDef(UseReg)->isPreISelOpcode())

281 continue;

282

283

284 const RegisterBank *RB = RBSHelper.getRegBankToAssign(UseReg);

285 RBSHelper.constrainRegBankUse(MI, UseOP, RB);

286 }

287 }

288 }

289

290 return true;

291}

unsigned const MachineRegisterInfo * MRI

MachineInstrBuilder & UseMI

MachineInstrBuilder MachineInstrBuilder & DefMI

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

amdgpu aa AMDGPU Address space based Alias Analysis Wrapper

static Register getVReg(MachineOperand &Op)

Definition AMDGPURegBankSelect.cpp:188

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

Provides analysis for continuously CSEing during GISel passes.

This file implements a version of MachineIRBuilder which CSEs insts within a MachineBasicBlock.

AMD GCN specific subclass of TargetSubtarget.

static Register UseReg(const MachineOperand &MO)

Machine IR instance of the generic uniformity analysis.

Promote Memory to Register

#define INITIALIZE_PASS_DEPENDENCY(depName)

#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)

#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)

Target-Independent Code Generator Pass Configuration Options pass.

const RegisterBank * getRegBankToAssign(Register Reg)

Definition AMDGPURegBankSelect.cpp:112

void reAssignRegBankOnDef(MachineInstr &MI, MachineOperand &DefOP, const RegisterBank *RB)

Definition AMDGPURegBankSelect.cpp:129

RegBankSelectHelper(MachineIRBuilder &B, AMDGPU::IntrinsicLaneMaskAnalyzer &ILMA, const MachineUniformityInfo &MUI, const SIRegisterInfo &TRI, const RegisterBankInfo &RBI)

Definition AMDGPURegBankSelect.cpp:89

bool isTemporalDivergenceCopy(Register Reg)

Definition AMDGPURegBankSelect.cpp:104

void constrainRegBankUse(MachineInstr &MI, MachineOperand &UseOP, const RegisterBank *RB)

Definition AMDGPURegBankSelect.cpp:168

Represent the analysis usage information of a pass.

AnalysisUsage & addRequired()

FunctionPass class - This class is used to implement most global optimizations.

The actual analysis pass wrapper.

void addObserver(GISelChangeObserver *O)

static constexpr LLT scalar(unsigned SizeInBits)

Get a low-level scalar or aggregate "bag of bits".

LLVM_ABI iterator SkipPHIsAndLabels(iterator I)

Return the first instruction in MBB after I that is not a PHI or a label.

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.

Properties which a MachineFunction may have at a given point in time.

const TargetSubtargetInfo & getSubtarget() const

getSubtarget - Return the subtarget for which this machine code is being compiled.

const MachineFunctionProperties & getProperties() const

Get the function properties.

Helper class to build MachineInstr.

Representation of each machine instruction.

MachineOperand class - Representation of each machine instruction operand.

LLVM_ABI void setReg(Register Reg)

Change the register this operand corresponds to.

Register getReg() const

getReg - Returns the register number.

MachineRegisterInfo - Keep track of information for virtual and physical registers,...

Legacy analysis pass which computes a MachineUniformityInfo.

Holds all the information related to register banks.

This class implements the register bank concept.

Wrapper class representing virtual and physical registers.

constexpr bool isValid() const

StringRef - Represent a constant reference to a string, i.e.

Target-Independent Code Generator Pass Configuration Options.

virtual std::unique_ptr< CSEConfigBase > getCSEConfig() const

Returns the CSEConfig object to use for the current optimization level.

unsigned ID

LLVM IR allows to use arbitrary numbers as calling convention identifiers.

This is an optimization pass for GlobalISel generic memory operations.

GenericUniformityInfo< MachineSSAContext > MachineUniformityInfo

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...

char & AMDGPURegBankSelectID

Definition AMDGPURegBankSelect.cpp:72

FunctionPass * createAMDGPURegBankSelectPass()

Definition AMDGPURegBankSelect.cpp:74

DWARFExpression::Operation Op