1616
1717using namespace llvm ;
1818
19- // / Obtain a reference to the global wavefront-size dependent constants
20- // / based on \p wavefrontSize.
21- const GCNLaneMaskConstants *
22- GCNLaneMaskUtils::getConsts (unsigned WavefrontSize) {
23- static const GCNLaneMaskConstants Wave32 = {
24- AMDGPU::EXEC_LO, AMDGPU::VCC_LO, &AMDGPU::SReg_32RegClass,
25- AMDGPU::S_MOV_B32, AMDGPU::S_MOV_B32_term, AMDGPU::S_AND_B32,
26- AMDGPU::S_OR_B32, AMDGPU::S_XOR_B32, AMDGPU::S_ANDN2_B32,
27- AMDGPU::S_ORN2_B32, AMDGPU::S_CSELECT_B32,
28- };
29- static const GCNLaneMaskConstants Wave64 = {
30- AMDGPU::EXEC,
31- AMDGPU::VCC,
32- &AMDGPU::SReg_64RegClass,
33- AMDGPU::S_MOV_B64,
34- AMDGPU::S_MOV_B64_term,
35- AMDGPU::S_AND_B64,
36- AMDGPU::S_OR_B64,
37- AMDGPU::S_XOR_B64,
38- AMDGPU::S_ANDN2_B64,
39- AMDGPU::S_ORN2_B64,
40- AMDGPU::S_CSELECT_B64,
41- };
42- assert (WavefrontSize == 32 || WavefrontSize == 64 );
43- return WavefrontSize == 32 ? &Wave32 : &Wave64;
44- }
45-
46- // / Obtain a reference to the global wavefront-size dependent constants
47- // / based on the wavefront-size of \p function.
48- const GCNLaneMaskConstants *GCNLaneMaskUtils::getConsts (MachineFunction &MF) {
49- const GCNSubtarget &ST = MF.getSubtarget <GCNSubtarget>();
50- return getConsts (ST.getWavefrontSize ());
51- }
52-
5319// / Check whether the register could be a lane-mask register.
5420// /
5521// / It does not distinguish between lane-masks and scalar registers that happen
5622// / to have the right bitsize.
5723bool GCNLaneMaskUtils::maybeLaneMask (Register Reg) const {
58- MachineRegisterInfo &MRI = MF-> getRegInfo ();
59- const GCNSubtarget &ST = MF-> getSubtarget <GCNSubtarget>();
24+ MachineRegisterInfo &MRI = MF. getRegInfo ();
25+ const GCNSubtarget &ST = MF. getSubtarget <GCNSubtarget>();
6026 const SIInstrInfo *TII = ST.getInstrInfo ();
6127 return TII->getRegisterInfo ().isSGPRReg (MRI, Reg) &&
6228 TII->getRegisterInfo ().getRegSizeInBits (Reg, MRI) ==
@@ -66,7 +32,7 @@ bool GCNLaneMaskUtils::maybeLaneMask(Register Reg) const {
6632// / Determine whether the lane-mask register \p Reg is a wave-wide constant.
6733// / If so, the value is stored in \p Val.
6834bool GCNLaneMaskUtils::isConstantLaneMask (Register Reg, bool &Val) const {
69- MachineRegisterInfo &MRI = MF-> getRegInfo ();
35+ MachineRegisterInfo &MRI = MF. getRegInfo ();
7036
7137 const MachineInstr *MI;
7238 for (;;) {
@@ -90,7 +56,7 @@ bool GCNLaneMaskUtils::isConstantLaneMask(Register Reg, bool &Val) const {
9056 return false ;
9157 }
9258
93- if (MI->getOpcode () != Constants-> OpMov )
59+ if (MI->getOpcode () != LMC. MovOpc )
9460 return false ;
9561
9662 if (!MI->getOperand (1 ).isImm ())
@@ -111,8 +77,8 @@ bool GCNLaneMaskUtils::isConstantLaneMask(Register Reg, bool &Val) const {
11177
11278// / Create a virtual lanemask register.
11379Register GCNLaneMaskUtils::createLaneMaskReg () const {
114- MachineRegisterInfo &MRI = MF-> getRegInfo ();
115- return MRI.createVirtualRegister (Constants-> RegClass );
80+ MachineRegisterInfo &MRI = MF. getRegInfo ();
81+ return MRI.createVirtualRegister (LMC. LaneMaskRC );
11682}
11783
11884// / Insert the moral equivalent of
@@ -140,7 +106,7 @@ void GCNLaneMaskUtils::buildMergeLaneMasks(MachineBasicBlock &MBB,
140106 Register PrevReg, Register CurReg,
141107 GCNLaneMaskAnalysis *LMA,
142108 bool accumulating) const {
143- const GCNSubtarget &ST = MF-> getSubtarget <GCNSubtarget>();
109+ const GCNSubtarget &ST = MF. getSubtarget <GCNSubtarget>();
144110 const SIInstrInfo *TII = ST.getInstrInfo ();
145111 bool PrevVal = false ;
146112 bool PrevConstant = !PrevReg || isConstantLaneMask (PrevReg, PrevVal);
@@ -155,10 +121,10 @@ void GCNLaneMaskUtils::buildMergeLaneMasks(MachineBasicBlock &MBB,
155121 } else if (CurVal) {
156122 // If PrevReg is undef, prefer to propagate a full constant.
157123 BuildMI (MBB, I, DL, TII->get (AMDGPU::COPY), DstReg)
158- .addReg (PrevReg ? Constants-> RegExec : CurReg);
124+ .addReg (PrevReg ? LMC. ExecReg : CurReg);
159125 } else {
160- BuildMI (MBB, I, DL, TII->get (Constants-> OpXor ), DstReg)
161- .addReg (Constants-> RegExec )
126+ BuildMI (MBB, I, DL, TII->get (LMC. XorOpc ), DstReg)
127+ .addReg (LMC. ExecReg )
162128 .addImm (-1 );
163129 }
164130 return ;
@@ -174,9 +140,9 @@ void GCNLaneMaskUtils::buildMergeLaneMasks(MachineBasicBlock &MBB,
174140 } else {
175141 PrevMaskedReg = createLaneMaskReg ();
176142 PrevMaskedBuilt =
177- BuildMI (MBB, I, DL, TII->get (Constants-> OpAndN2 ), PrevMaskedReg)
143+ BuildMI (MBB, I, DL, TII->get (LMC. AndN2Opc ), PrevMaskedReg)
178144 .addReg (PrevReg)
179- .addReg (Constants-> RegExec );
145+ .addReg (LMC. ExecReg );
180146 }
181147 }
182148 if (!CurConstant) {
@@ -186,9 +152,9 @@ void GCNLaneMaskUtils::buildMergeLaneMasks(MachineBasicBlock &MBB,
186152 } else {
187153 CurMaskedReg = createLaneMaskReg ();
188154 CurMaskedBuilt =
189- BuildMI (MBB, I, DL, TII->get (Constants-> OpAnd ), CurMaskedReg)
155+ BuildMI (MBB, I, DL, TII->get (LMC. AndOpc ), CurMaskedReg)
190156 .addReg (CurReg)
191- .addReg (Constants-> RegExec );
157+ .addReg (LMC. ExecReg );
192158 }
193159 }
194160
@@ -208,13 +174,13 @@ void GCNLaneMaskUtils::buildMergeLaneMasks(MachineBasicBlock &MBB,
208174 BuildMI (MBB, I, DL, TII->get (AMDGPU::COPY), DstReg).addReg (PrevMaskedReg);
209175 }
210176 } else if (PrevConstant && PrevVal) {
211- BuildMI (MBB, I, DL, TII->get (Constants-> OpOrN2 ), DstReg)
177+ BuildMI (MBB, I, DL, TII->get (LMC. OrN2Opc ), DstReg)
212178 .addReg (CurMaskedReg)
213- .addReg (Constants-> RegExec );
179+ .addReg (LMC. ExecReg );
214180 } else {
215- BuildMI (MBB, I, DL, TII->get (Constants-> OpOr ), DstReg)
181+ BuildMI (MBB, I, DL, TII->get (LMC. OrOpc ), DstReg)
216182 .addReg (PrevMaskedReg)
217- .addReg (CurMaskedReg ? CurMaskedReg : Constants-> RegExec );
183+ .addReg (CurMaskedReg ? CurMaskedReg : LMC. ExecReg );
218184 }
219185}
220186
@@ -226,10 +192,11 @@ bool GCNLaneMaskAnalysis::isSubsetOfExec(Register Reg,
226192 unsigned RemainingDepth) {
227193 MachineRegisterInfo &MRI = LMU.function ()->getRegInfo ();
228194 MachineInstr *DefInstr = nullptr ;
195+ const AMDGPU::LaneMaskConstants &LMC = LMU.getLaneMaskConsts ();
229196
230197 for (;;) {
231198 if (!Register::isVirtualRegister (Reg)) {
232- if (Reg == LMU. consts (). RegExec &&
199+ if (Reg == LMC. ExecReg &&
233200 (!DefInstr || DefInstr->getParent () == &UseBlock))
234201 return true ;
235202 return false ;
@@ -241,7 +208,7 @@ bool GCNLaneMaskAnalysis::isSubsetOfExec(Register Reg,
241208 continue ;
242209 }
243210
244- if (DefInstr->getOpcode () == LMU. consts (). OpMov ) {
211+ if (DefInstr->getOpcode () == LMC. MovOpc ) {
245212 if (DefInstr->getOperand (1 ).isImm () &&
246213 DefInstr->getOperand (1 ).getImm () == 0 )
247214 return true ;
@@ -268,11 +235,11 @@ bool GCNLaneMaskAnalysis::isSubsetOfExec(Register Reg,
268235 if (!RemainingDepth--)
269236 return false ;
270237
271- bool LikeOr = DefInstr->getOpcode () == LMU. consts (). OpOr ||
272- DefInstr->getOpcode () == LMU. consts (). OpXor ||
273- DefInstr->getOpcode () == LMU. consts (). OpCSelect ;
274- bool IsAnd = DefInstr->getOpcode () == LMU. consts (). OpAnd ;
275- bool IsAndN2 = DefInstr->getOpcode () == LMU. consts (). OpAndN2 ;
238+ bool LikeOr = DefInstr->getOpcode () == LMC. OrOpc ||
239+ DefInstr->getOpcode () == LMC. XorOpc ||
240+ DefInstr->getOpcode () == LMC. CSelectOpc ;
241+ bool IsAnd = DefInstr->getOpcode () == LMC. AndOpc ;
242+ bool IsAndN2 = DefInstr->getOpcode () == LMC. AndN2Opc ;
276243 if ((LikeOr || IsAnd || IsAndN2) &&
277244 (DefInstr->getOperand (1 ).isReg () && DefInstr->getOperand (2 ).isReg ())) {
278245 bool FirstIsSubset = isSubsetOfExec (DefInstr->getOperand (1 ).getReg (),
@@ -301,7 +268,7 @@ bool GCNLaneMaskAnalysis::isSubsetOfExec(Register Reg,
301268void GCNLaneMaskUpdater::init (Register Reg) {
302269 Processed = false ;
303270 Blocks.clear ();
304- // SSAUpdater.Initialize(LMU.consts ().RegClass );
271+ // SSAUpdater.Initialize(LMU.getLaneMaskConsts ().LaneMaskRC );
305272 SSAUpdater.Initialize (Reg);
306273}
307274
@@ -451,7 +418,7 @@ void GCNLaneMaskUpdater::process() {
451418 // Prepare an all-zero value for the default and reset in accumulating mode.
452419 if (Accumulating && !ZeroReg) {
453420 ZeroReg = LMU.createLaneMaskReg ();
454- BuildMI (Entry, Entry.getFirstTerminator (), {}, TII->get (LMU.consts ().OpMov ),
421+ BuildMI (Entry, Entry.getFirstTerminator (), {}, TII->get (LMU.getLaneMaskConsts ().MovOpc ),
455422 ZeroReg)
456423 .addImm (0 );
457424 }
0 commit comments