Skip to content

Commit 34ba84f

Browse files
authored
[SPIRV] Return success when selecting reads and writes. (#122162)
The function `selectImageWriteIntrinsic` and `selectReadImageIntrinsic` are void functions. The should return true if they succeed, and false otherwise. This commit updates the code to do this.
1 parent ab6c89c commit 34ba84f

File tree

1 file changed

+41
-31
lines changed

1 file changed

+41
-31
lines changed

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -274,10 +274,10 @@ class SPIRVInstructionSelector : public InstructionSelector {
274274
bool selectHandleFromBinding(Register &ResVReg, const SPIRVType *ResType,
275275
MachineInstr &I) const;
276276

277-
void selectReadImageIntrinsic(Register &ResVReg, const SPIRVType *ResType,
277+
bool selectReadImageIntrinsic(Register &ResVReg, const SPIRVType *ResType,
278278
MachineInstr &I) const;
279279

280-
void selectImageWriteIntrinsic(MachineInstr &I) const;
280+
bool selectImageWriteIntrinsic(MachineInstr &I) const;
281281

282282
// Utilities
283283
std::pair<Register, bool>
@@ -305,7 +305,7 @@ class SPIRVInstructionSelector : public InstructionSelector {
305305
Register IndexReg, bool IsNonUniform,
306306
MachineIRBuilder MIRBuilder) const;
307307
SPIRVType *widenTypeToVec4(const SPIRVType *Type, MachineInstr &I) const;
308-
void extractSubvector(Register &ResVReg, const SPIRVType *ResType,
308+
bool extractSubvector(Register &ResVReg, const SPIRVType *ResType,
309309
Register &ReadReg, MachineInstr &InsertionPoint) const;
310310
bool BuildCOPY(Register DestReg, Register SrcReg, MachineInstr &I) const;
311311
bool loadVec3BuiltinInputID(SPIRV::BuiltIn::BuiltIn BuiltInValue,
@@ -3002,12 +3002,10 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
30023002
return selectHandleFromBinding(ResVReg, ResType, I);
30033003
}
30043004
case Intrinsic::spv_resource_store_typedbuffer: {
3005-
selectImageWriteIntrinsic(I);
3006-
return true;
3005+
return selectImageWriteIntrinsic(I);
30073006
}
30083007
case Intrinsic::spv_resource_load_typedbuffer: {
3009-
selectReadImageIntrinsic(ResVReg, ResType, I);
3010-
return true;
3008+
return selectReadImageIntrinsic(ResVReg, ResType, I);
30113009
}
30123010
case Intrinsic::spv_discard: {
30133011
return selectDiscard(ResVReg, ResType, I);
@@ -3049,7 +3047,7 @@ bool SPIRVInstructionSelector::selectHandleFromBinding(Register &ResVReg,
30493047
.constrainAllUses(TII, TRI, RBI);
30503048
}
30513049

3052-
void SPIRVInstructionSelector::selectReadImageIntrinsic(
3050+
bool SPIRVInstructionSelector::selectReadImageIntrinsic(
30533051
Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
30543052

30553053
// If the load of the image is in a different basic block, then
@@ -3064,35 +3062,40 @@ void SPIRVInstructionSelector::selectReadImageIntrinsic(
30643062

30653063
uint64_t ResultSize = GR.getScalarOrVectorComponentCount(ResType);
30663064
if (ResultSize == 4) {
3067-
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpImageRead))
3065+
return BuildMI(*I.getParent(), I, I.getDebugLoc(),
3066+
TII.get(SPIRV::OpImageRead))
30683067
.addDef(ResVReg)
30693068
.addUse(GR.getSPIRVTypeID(ResType))
30703069
.addUse(ImageReg)
3071-
.addUse(I.getOperand(3).getReg());
3072-
return;
3070+
.addUse(I.getOperand(3).getReg())
3071+
.constrainAllUses(TII, TRI, RBI);
30733072
}
30743073

30753074
SPIRVType *ReadType = widenTypeToVec4(ResType, I);
30763075
Register ReadReg = MRI->createVirtualRegister(GR.getRegClass(ReadType));
3077-
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpImageRead))
3078-
.addDef(ReadReg)
3079-
.addUse(GR.getSPIRVTypeID(ReadType))
3080-
.addUse(ImageReg)
3081-
.addUse(I.getOperand(3).getReg());
3076+
bool Succeed =
3077+
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpImageRead))
3078+
.addDef(ReadReg)
3079+
.addUse(GR.getSPIRVTypeID(ReadType))
3080+
.addUse(ImageReg)
3081+
.addUse(I.getOperand(3).getReg())
3082+
.constrainAllUses(TII, TRI, RBI);
3083+
if (!Succeed)
3084+
return false;
30823085

30833086
if (ResultSize == 1) {
3084-
BuildMI(*I.getParent(), I, I.getDebugLoc(),
3085-
TII.get(SPIRV::OpCompositeExtract))
3087+
return BuildMI(*I.getParent(), I, I.getDebugLoc(),
3088+
TII.get(SPIRV::OpCompositeExtract))
30863089
.addDef(ResVReg)
30873090
.addUse(GR.getSPIRVTypeID(ResType))
30883091
.addUse(ReadReg)
3089-
.addImm(0);
3090-
return;
3092+
.addImm(0)
3093+
.constrainAllUses(TII, TRI, RBI);
30913094
}
3092-
extractSubvector(ResVReg, ResType, ReadReg, I);
3095+
return extractSubvector(ResVReg, ResType, ReadReg, I);
30933096
}
30943097

3095-
void SPIRVInstructionSelector::extractSubvector(
3098+
bool SPIRVInstructionSelector::extractSubvector(
30963099
Register &ResVReg, const SPIRVType *ResType, Register &ReadReg,
30973100
MachineInstr &InsertionPoint) const {
30983101
SPIRVType *InputType = GR.getResultType(ReadReg);
@@ -3108,12 +3111,16 @@ void SPIRVInstructionSelector::extractSubvector(
31083111
const TargetRegisterClass *ScalarRegClass = GR.getRegClass(ScalarType);
31093112
for (uint64_t I = 0; I < ResultSize; I++) {
31103113
Register ComponentReg = MRI->createVirtualRegister(ScalarRegClass);
3111-
BuildMI(*InsertionPoint.getParent(), InsertionPoint,
3112-
InsertionPoint.getDebugLoc(), TII.get(SPIRV::OpCompositeExtract))
3113-
.addDef(ComponentReg)
3114-
.addUse(ScalarType->getOperand(0).getReg())
3115-
.addUse(ReadReg)
3116-
.addImm(I);
3114+
bool Succeed = BuildMI(*InsertionPoint.getParent(), InsertionPoint,
3115+
InsertionPoint.getDebugLoc(),
3116+
TII.get(SPIRV::OpCompositeExtract))
3117+
.addDef(ComponentReg)
3118+
.addUse(ScalarType->getOperand(0).getReg())
3119+
.addUse(ReadReg)
3120+
.addImm(I)
3121+
.constrainAllUses(TII, TRI, RBI);
3122+
if (!Succeed)
3123+
return false;
31173124
ComponentRegisters.emplace_back(ComponentReg);
31183125
}
31193126

@@ -3125,9 +3132,10 @@ void SPIRVInstructionSelector::extractSubvector(
31253132

31263133
for (Register ComponentReg : ComponentRegisters)
31273134
MIB.addUse(ComponentReg);
3135+
return MIB.constrainAllUses(TII, TRI, RBI);
31283136
}
31293137

3130-
void SPIRVInstructionSelector::selectImageWriteIntrinsic(
3138+
bool SPIRVInstructionSelector::selectImageWriteIntrinsic(
31313139
MachineInstr &I) const {
31323140
// If the load of the image is in a different basic block, then
31333141
// this will generate invalid code. A proper solution is to move
@@ -3142,10 +3150,12 @@ void SPIRVInstructionSelector::selectImageWriteIntrinsic(
31423150
Register DataReg = I.getOperand(3).getReg();
31433151
assert(GR.getResultType(DataReg)->getOpcode() == SPIRV::OpTypeVector);
31443152
assert(GR.getScalarOrVectorComponentCount(GR.getResultType(DataReg)) == 4);
3145-
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpImageWrite))
3153+
return BuildMI(*I.getParent(), I, I.getDebugLoc(),
3154+
TII.get(SPIRV::OpImageWrite))
31463155
.addUse(ImageReg)
31473156
.addUse(CoordinateReg)
3148-
.addUse(DataReg);
3157+
.addUse(DataReg)
3158+
.constrainAllUses(TII, TRI, RBI);
31493159
}
31503160

31513161
Register SPIRVInstructionSelector::buildPointerToResource(

0 commit comments

Comments
 (0)