@@ -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
31513161Register SPIRVInstructionSelector::buildPointerToResource (
0 commit comments