Skip to content

Commit 8a7436e

Browse files
emit valid Lifestart/Lifestop instructions
1 parent ce92b2f commit 8a7436e

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,30 @@ static void validateGroupWaitEventsPtr(const SPIRVSubtarget &STI,
203203
doInsertBitcast(STI, MRI, GR, I, OpReg, OpIdx, NewPtrType);
204204
}
205205

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+
206230
static void validateGroupAsyncCopyPtr(const SPIRVSubtarget &STI,
207231
MachineRegisterInfo *MRI,
208232
SPIRVGlobalRegistry &GR, MachineInstr &I,
@@ -413,6 +437,11 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
413437
SPIRV::OpTypeBool))
414438
MI.setDesc(STI.getInstrInfo()->get(SPIRV::OpLogicalNotEqual));
415439
break;
440+
case SPIRV::OpLifetimeStart:
441+
case SPIRV::OpLifetimeStop:
442+
if (MI.getOperand(1).getImm() > 0)
443+
validateLifetimeStart(STI, MRI, GR, MI);
444+
break;
416445
case SPIRV::OpGroupAsyncCopy:
417446
validateGroupAsyncCopyPtr(STI, MRI, GR, MI, 3);
418447
validateGroupAsyncCopyPtr(STI, MRI, GR, MI, 4);

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,9 +2067,7 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
20672067
: SPIRV::OpLifetimeStop;
20682068
int64_t Size = I.getOperand(I.getNumExplicitDefs() + 1).getImm();
20692069
Register PtrReg = I.getOperand(I.getNumExplicitDefs() + 2).getReg();
2070-
unsigned PonteeOpType = GR.getPointeeTypeOp(PtrReg);
2071-
bool IsNonvoidPtr = PonteeOpType != 0 && PonteeOpType != SPIRV::OpTypeVoid;
2072-
if (Size == -1 || IsNonvoidPtr)
2070+
if (Size == -1)
20732071
Size = 0;
20742072
BuildMI(BB, I, I.getDebugLoc(), TII.get(Op)).addUse(PtrReg).addImm(Size);
20752073
} break;

llvm/test/CodeGen/SPIRV/llvm-intrinsics/lifetime.ll

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3+
14
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
5+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
26

7+
; CHECK-DAG: %[[#Char:]] = OpTypeInt 8 0
8+
; CHECK-DAG: %[[#PtrChar:]] = OpTypePointer Function %[[#Char]]
39
; CHECK: OpFunction
4-
; CHECK: %[[FooArg:.*]] = OpVariable
5-
; CHECK: OpLifetimeStart %[[FooArg]], 0
10+
; CHECK: %[[#FooArg:]] = OpVariable
11+
; CHECK: %[[#Casted1:]] = OpBitcast %[[#PtrChar]] %[[#FooArg]]
12+
; CHECK: OpLifetimeStart %[[#Casted1]], 72
613
; CHECK: OpCopyMemorySized
714
; CHECK: OpBitcast
815
; CHECK: OpInBoundsPtrAccessChain
9-
; CHECK: OpLifetimeStop %[[FooArg]], 0
16+
; CHECK: %[[#Casted2:]] = OpBitcast %[[#PtrChar]] %[[#FooArg]]
17+
; CHECK: OpLifetimeStop %[[#Casted2]], 72
1018

1119
%tprange = type { %tparray }
1220
%tparray = type { [2 x i64] }

0 commit comments

Comments
 (0)