@@ -203,6 +203,30 @@ static void validateGroupWaitEventsPtr(const SPIRVSubtarget &STI,
203
203
doInsertBitcast (STI, MRI, GR, I, OpReg, OpIdx, NewPtrType);
204
204
}
205
205
206
+ static void validateLifetimeStart (const SPIRVSubtarget &STI,
207
+ MachineRegisterInfo *MRI,
208
+ SPIRVGlobalRegistry &GR, MachineInstr &I) {
209
+ Register PtrReg = I.getOperand (0 ).getReg ();
210
+ MachineFunction *MF = I.getParent ()->getParent ();
211
+ Register PtrTypeReg = getTypeReg (MRI, PtrReg);
212
+ SPIRVType *PtrType = GR.getSPIRVTypeForVReg (PtrTypeReg, MF);
213
+ SPIRVType *PonteeElemType = PtrType ? GR.getPointeeType (PtrType) : nullptr ;
214
+ if (!PonteeElemType || PonteeElemType->getOpcode () == SPIRV::OpTypeVoid ||
215
+ (PonteeElemType->getOpcode () == SPIRV::OpTypeInt &&
216
+ PonteeElemType->getOperand (1 ).getImm () == 8 ))
217
+ return ;
218
+ // To keep the code valid a bitcast must be inserted
219
+ SPIRV::StorageClass::StorageClass SC =
220
+ static_cast <SPIRV::StorageClass::StorageClass>(
221
+ PtrType->getOperand (1 ).getImm ());
222
+ MachineIRBuilder MIB (I);
223
+ LLVMContext &Context = MF->getMMI ().getModule ()->getContext ();
224
+ SPIRVType *ElemType =
225
+ GR.getOrCreateSPIRVType (IntegerType::getInt8Ty (Context), MIB);
226
+ SPIRVType *NewPtrType = GR.getOrCreateSPIRVPointerType (ElemType, MIB, SC);
227
+ doInsertBitcast (STI, MRI, GR, I, PtrReg, 0 , NewPtrType);
228
+ }
229
+
206
230
static void validateGroupAsyncCopyPtr (const SPIRVSubtarget &STI,
207
231
MachineRegisterInfo *MRI,
208
232
SPIRVGlobalRegistry &GR, MachineInstr &I,
@@ -413,6 +437,11 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
413
437
SPIRV::OpTypeBool))
414
438
MI.setDesc (STI.getInstrInfo ()->get (SPIRV::OpLogicalNotEqual));
415
439
break ;
440
+ case SPIRV::OpLifetimeStart:
441
+ case SPIRV::OpLifetimeStop:
442
+ if (MI.getOperand (1 ).getImm () > 0 )
443
+ validateLifetimeStart (STI, MRI, GR, MI);
444
+ break ;
416
445
case SPIRV::OpGroupAsyncCopy:
417
446
validateGroupAsyncCopyPtr (STI, MRI, GR, MI, 3 );
418
447
validateGroupAsyncCopyPtr (STI, MRI, GR, MI, 4 );
0 commit comments