Skip to content

Commit cd9768b

Browse files
simplify pre- and post-legalizer logics; fix wrong v-reg class in grp builtins
1 parent 9e0a5a1 commit cd9768b

File tree

2 files changed

+14
-37
lines changed

2 files changed

+14
-37
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,15 @@ static Register buildScopeReg(Register CLScopeRegister,
587587
return buildConstantIntReg32(Scope, MIRBuilder, GR);
588588
}
589589

590+
static void setRegClassIfNull(Register Reg, MachineRegisterInfo *MRI,
591+
SPIRVGlobalRegistry *GR) {
592+
if (MRI->getRegClassOrNull(Reg))
593+
return;
594+
SPIRVType *SpvType = GR->getSPIRVTypeForVReg(Reg);
595+
MRI->setRegClass(Reg,
596+
SpvType ? GR->getRegClass(SpvType) : &SPIRV::iIDRegClass);
597+
}
598+
590599
static Register buildMemSemanticsReg(Register SemanticsRegister,
591600
Register PtrRegister, unsigned &Semantics,
592601
MachineIRBuilder &MIRBuilder,
@@ -1164,7 +1173,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
11641173
MIRBuilder.buildInstr(TargetOpcode::G_BUILD_VECTOR).addDef(VecReg);
11651174
for (unsigned i = 1; i < Call->Arguments.size(); i++) {
11661175
MIB.addUse(Call->Arguments[i]);
1167-
MRI->setRegClass(Call->Arguments[i], &SPIRV::iIDRegClass);
1176+
setRegClassIfNull(Call->Arguments[i], MRI, GR);
11681177
}
11691178
insertAssignInstr(VecReg, nullptr, VecType, GR, MIRBuilder,
11701179
MIRBuilder.getMF().getRegInfo());
@@ -1180,7 +1189,7 @@ static bool generateGroupInst(const SPIRV::IncomingCall *Call,
11801189
MIB.addImm(GroupBuiltin->GroupOperation);
11811190
if (Call->Arguments.size() > 0) {
11821191
MIB.addUse(Arg0.isValid() ? Arg0 : Call->Arguments[0]);
1183-
MRI->setRegClass(Call->Arguments[0], &SPIRV::iIDRegClass);
1192+
setRegClassIfNull(Call->Arguments[0], MRI, GR);
11841193
if (VecReg.isValid())
11851194
MIB.addUse(VecReg);
11861195
else

llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ static SPIRVType *propagateSPIRVType(MachineInstr *MI, SPIRVGlobalRegistry *GR,
287287
SpvType = GR->getSPIRVTypeForVReg(Reg);
288288
if (!SpvType) {
289289
switch (MI->getOpcode()) {
290+
case TargetOpcode::G_FCONSTANT:
290291
case TargetOpcode::G_CONSTANT: {
291292
MIB.setInsertPt(*MI->getParent(), MI);
292293
Type *Ty = MI->getOperand(1).getCImm()->getType();
@@ -455,15 +456,6 @@ Register insertAssignInstr(Register Reg, Type *Ty, SPIRVType *SpvType,
455456

456457
void processInstr(MachineInstr &MI, MachineIRBuilder &MIB,
457458
MachineRegisterInfo &MRI, SPIRVGlobalRegistry *GR) {
458-
assert(MI.getNumDefs() > 0 && MRI.hasOneUse(MI.getOperand(0).getReg()));
459-
MachineInstr &AssignTypeInst =
460-
*(MRI.use_instr_begin(MI.getOperand(0).getReg()));
461-
SPIRVType *SpvTypeRes = GR->getSPIRVTypeForVReg(MI.getOperand(0).getReg());
462-
auto NewReg =
463-
createNewIdReg(SpvTypeRes, MI.getOperand(0).getReg(), MRI, *GR).first;
464-
GR->assignSPIRVTypeToVReg(SpvTypeRes, NewReg, MIB.getMF());
465-
AssignTypeInst.getOperand(1).setReg(NewReg);
466-
MI.getOperand(0).setReg(NewReg);
467459
MIB.setInsertPt(*MI.getParent(), MI.getIterator());
468460
for (auto &Op : MI.operands()) {
469461
if (!Op.isReg() || Op.isDef())
@@ -676,34 +668,10 @@ static void processInstrsWithTypeFolding(MachineFunction &MF,
676668
SPIRVGlobalRegistry *GR,
677669
MachineIRBuilder MIB) {
678670
MachineRegisterInfo &MRI = MF.getRegInfo();
679-
for (MachineBasicBlock &MBB : MF) {
680-
for (MachineInstr &MI : MBB) {
671+
for (MachineBasicBlock &MBB : MF)
672+
for (MachineInstr &MI : MBB)
681673
if (isTypeFoldingSupported(MI.getOpcode()))
682674
processInstr(MI, MIB, MRI, GR);
683-
}
684-
}
685-
686-
for (MachineBasicBlock &MBB : MF) {
687-
for (MachineInstr &MI : MBB) {
688-
// We need to rewrite dst types for ASSIGN_TYPE instrs to be able
689-
// to perform tblgen'erated selection and we can't do that on Legalizer
690-
// as it operates on gMIR only.
691-
if (MI.getOpcode() != SPIRV::ASSIGN_TYPE)
692-
continue;
693-
Register SrcReg = MI.getOperand(1).getReg();
694-
unsigned Opcode = MRI.getVRegDef(SrcReg)->getOpcode();
695-
if (!isTypeFoldingSupported(Opcode))
696-
continue;
697-
Register DstReg = MI.getOperand(0).getReg();
698-
// Don't need to reset type of register holding constant and used in
699-
// G_ADDRSPACE_CAST, since it breaks legalizer.
700-
if (Opcode == TargetOpcode::G_CONSTANT && MRI.hasOneUse(DstReg)) {
701-
MachineInstr &UseMI = *MRI.use_instr_begin(DstReg);
702-
if (UseMI.getOpcode() == TargetOpcode::G_ADDRSPACE_CAST)
703-
continue;
704-
}
705-
}
706-
}
707675
}
708676

709677
static Register

0 commit comments

Comments
 (0)