@@ -274,10 +274,10 @@ class SPIRVInstructionSelector : public InstructionSelector {
274
274
bool selectHandleFromBinding (Register &ResVReg, const SPIRVType *ResType,
275
275
MachineInstr &I) const ;
276
276
277
- void selectReadImageIntrinsic (Register &ResVReg, const SPIRVType *ResType,
277
+ bool selectReadImageIntrinsic (Register &ResVReg, const SPIRVType *ResType,
278
278
MachineInstr &I) const ;
279
279
280
- void selectImageWriteIntrinsic (MachineInstr &I) const ;
280
+ bool selectImageWriteIntrinsic (MachineInstr &I) const ;
281
281
282
282
// Utilities
283
283
std::pair<Register, bool >
@@ -305,7 +305,7 @@ class SPIRVInstructionSelector : public InstructionSelector {
305
305
Register IndexReg, bool IsNonUniform,
306
306
MachineIRBuilder MIRBuilder) const ;
307
307
SPIRVType *widenTypeToVec4 (const SPIRVType *Type, MachineInstr &I) const ;
308
- void extractSubvector (Register &ResVReg, const SPIRVType *ResType,
308
+ bool extractSubvector (Register &ResVReg, const SPIRVType *ResType,
309
309
Register &ReadReg, MachineInstr &InsertionPoint) const ;
310
310
bool BuildCOPY (Register DestReg, Register SrcReg, MachineInstr &I) const ;
311
311
bool loadVec3BuiltinInputID (SPIRV::BuiltIn::BuiltIn BuiltInValue,
@@ -3002,12 +3002,10 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
3002
3002
return selectHandleFromBinding (ResVReg, ResType, I);
3003
3003
}
3004
3004
case Intrinsic::spv_resource_store_typedbuffer: {
3005
- selectImageWriteIntrinsic (I);
3006
- return true ;
3005
+ return selectImageWriteIntrinsic (I);
3007
3006
}
3008
3007
case Intrinsic::spv_resource_load_typedbuffer: {
3009
- selectReadImageIntrinsic (ResVReg, ResType, I);
3010
- return true ;
3008
+ return selectReadImageIntrinsic (ResVReg, ResType, I);
3011
3009
}
3012
3010
case Intrinsic::spv_discard: {
3013
3011
return selectDiscard (ResVReg, ResType, I);
@@ -3049,7 +3047,7 @@ bool SPIRVInstructionSelector::selectHandleFromBinding(Register &ResVReg,
3049
3047
.constrainAllUses (TII, TRI, RBI);
3050
3048
}
3051
3049
3052
- void SPIRVInstructionSelector::selectReadImageIntrinsic (
3050
+ bool SPIRVInstructionSelector::selectReadImageIntrinsic (
3053
3051
Register &ResVReg, const SPIRVType *ResType, MachineInstr &I) const {
3054
3052
3055
3053
// If the load of the image is in a different basic block, then
@@ -3064,35 +3062,40 @@ void SPIRVInstructionSelector::selectReadImageIntrinsic(
3064
3062
3065
3063
uint64_t ResultSize = GR.getScalarOrVectorComponentCount (ResType);
3066
3064
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))
3068
3067
.addDef (ResVReg)
3069
3068
.addUse (GR.getSPIRVTypeID (ResType))
3070
3069
.addUse (ImageReg)
3071
- .addUse (I.getOperand (3 ).getReg ());
3072
- return ;
3070
+ .addUse (I.getOperand (3 ).getReg ())
3071
+ . constrainAllUses (TII, TRI, RBI) ;
3073
3072
}
3074
3073
3075
3074
SPIRVType *ReadType = widenTypeToVec4 (ResType, I);
3076
3075
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 ;
3082
3085
3083
3086
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))
3086
3089
.addDef (ResVReg)
3087
3090
.addUse (GR.getSPIRVTypeID (ResType))
3088
3091
.addUse (ReadReg)
3089
- .addImm (0 );
3090
- return ;
3092
+ .addImm (0 )
3093
+ . constrainAllUses (TII, TRI, RBI) ;
3091
3094
}
3092
- extractSubvector (ResVReg, ResType, ReadReg, I);
3095
+ return extractSubvector (ResVReg, ResType, ReadReg, I);
3093
3096
}
3094
3097
3095
- void SPIRVInstructionSelector::extractSubvector (
3098
+ bool SPIRVInstructionSelector::extractSubvector (
3096
3099
Register &ResVReg, const SPIRVType *ResType, Register &ReadReg,
3097
3100
MachineInstr &InsertionPoint) const {
3098
3101
SPIRVType *InputType = GR.getResultType (ReadReg);
@@ -3108,12 +3111,16 @@ void SPIRVInstructionSelector::extractSubvector(
3108
3111
const TargetRegisterClass *ScalarRegClass = GR.getRegClass (ScalarType);
3109
3112
for (uint64_t I = 0 ; I < ResultSize; I++) {
3110
3113
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 ;
3117
3124
ComponentRegisters.emplace_back (ComponentReg);
3118
3125
}
3119
3126
@@ -3125,9 +3132,10 @@ void SPIRVInstructionSelector::extractSubvector(
3125
3132
3126
3133
for (Register ComponentReg : ComponentRegisters)
3127
3134
MIB.addUse (ComponentReg);
3135
+ return MIB.constrainAllUses (TII, TRI, RBI);
3128
3136
}
3129
3137
3130
- void SPIRVInstructionSelector::selectImageWriteIntrinsic (
3138
+ bool SPIRVInstructionSelector::selectImageWriteIntrinsic (
3131
3139
MachineInstr &I) const {
3132
3140
// If the load of the image is in a different basic block, then
3133
3141
// this will generate invalid code. A proper solution is to move
@@ -3142,10 +3150,12 @@ void SPIRVInstructionSelector::selectImageWriteIntrinsic(
3142
3150
Register DataReg = I.getOperand (3 ).getReg ();
3143
3151
assert (GR.getResultType (DataReg)->getOpcode () == SPIRV::OpTypeVector);
3144
3152
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))
3146
3155
.addUse (ImageReg)
3147
3156
.addUse (CoordinateReg)
3148
- .addUse (DataReg);
3157
+ .addUse (DataReg)
3158
+ .constrainAllUses (TII, TRI, RBI);
3149
3159
}
3150
3160
3151
3161
Register SPIRVInstructionSelector::buildPointerToResource (
0 commit comments