Skip to content

Commit fac9941

Browse files
committed
AMDGPU: Fix ubsan error
Since register classes go up to 1024, 32 elements, all masks bits are needed and a 32-bit shift by 32 is illegal. We didn't have any instructions theoretically using a 32 element VGPR before d1dbb5e
1 parent b749af6 commit fac9941

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

llvm/lib/Target/AMDGPU/GCNRegBankReassign.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class GCNRegBankReassign : public MachineFunctionPass {
168168
// 8 banks for SGPRs.
169169
// Registers already processed and recorded in RegsUsed are excluded.
170170
// If Bank is not -1 assume Reg:SubReg to belong to that Bank.
171-
unsigned getRegBankMask(unsigned Reg, unsigned SubReg, int Bank);
171+
uint32_t getRegBankMask(unsigned Reg, unsigned SubReg, int Bank);
172172

173173
// Return number of stalls in the instructions.
174174
// UsedBanks has bits set for the banks used by all operands.
@@ -292,7 +292,7 @@ unsigned GCNRegBankReassign::getPhysRegBank(unsigned Reg) const {
292292
return Reg % NUM_SGPR_BANKS + SGPR_BANK_OFFSET;
293293
}
294294

295-
unsigned GCNRegBankReassign::getRegBankMask(unsigned Reg, unsigned SubReg,
295+
uint32_t GCNRegBankReassign::getRegBankMask(unsigned Reg, unsigned SubReg,
296296
int Bank) {
297297
if (Register::isVirtualRegister(Reg)) {
298298
if (!VRM->isAssignedReg(Reg))
@@ -313,15 +313,15 @@ unsigned GCNRegBankReassign::getRegBankMask(unsigned Reg, unsigned SubReg,
313313
if (TRI->hasVGPRs(RC)) {
314314
// VGPRs have 4 banks assigned in a round-robin fashion.
315315
Reg -= AMDGPU::VGPR0;
316-
unsigned Mask = (1 << Size) - 1;
316+
uint32_t Mask = maskTrailingOnes<uint32_t>(Size);
317317
unsigned Used = 0;
318318
// Bitmask lacks an extract method
319319
for (unsigned I = 0; I < Size; ++I)
320320
if (RegsUsed.test(Reg + I))
321321
Used |= 1 << I;
322322
RegsUsed.set(Reg, Reg + Size);
323323
Mask &= ~Used;
324-
Mask <<= (Bank == -1) ? Reg % NUM_VGPR_BANKS : unsigned(Bank);
324+
Mask <<= (Bank == -1) ? Reg % NUM_VGPR_BANKS : uint32_t(Bank);
325325
return (Mask | (Mask >> NUM_VGPR_BANKS)) & VGPR_BANK_MASK;
326326
}
327327

@@ -388,7 +388,7 @@ unsigned GCNRegBankReassign::analyzeInst(const MachineInstr& MI,
388388
}
389389
}
390390

391-
unsigned Mask = getRegBankMask(R, Op.getSubReg(),
391+
uint32_t Mask = getRegBankMask(R, Op.getSubReg(),
392392
(Reg == R) ? ShiftedBank : -1);
393393
StallCycles += countPopulation(UsedBanks & Mask);
394394
UsedBanks |= Mask;

0 commit comments

Comments
 (0)