[llvm] e60b633 - [SPIR-V] Consistent handling of TargetExtTypes in emit-intrinsics (#135682)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 29 15:00:20 PDT 2025
Author: Cassandra Beckley
Date: 2025-05-29T18:00:16-04:00
New Revision: e60b6330ac413682b3824603cb274528a67d58c9
URL: https://github.com/llvm/llvm-project/commit/e60b6330ac413682b3824603cb274528a67d58c9
DIFF: https://github.com/llvm/llvm-project/commit/e60b6330ac413682b3824603cb274528a67d58c9.diff
LOG: [SPIR-V] Consistent handling of TargetExtTypes in emit-intrinsics (#135682)
TargetExtType values are replaced with calls to
`llvm.spv.track.constant`, with a `poison` value, but
`llvm.spv.assign.type` was called with their original value. This PR
updates the `assign.type` call to be consistent with the
`track.constant` call.
Fixes #134417.
---------
Co-authored-by: Steven Perron <stevenperron at google.com>
Added:
llvm/test/CodeGen/SPIRV/inline/type.undef.ll
Modified:
llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index 7a29237789d18..cc95fde6a516d 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -1961,10 +1961,16 @@ void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I,
GR->buildAssignPtr(B, ElemTy ? ElemTy : deduceElementType(Op, true),
Op);
} else {
+ Value *OpTyVal = Op;
+ if (OpTy->isTargetExtTy()) {
+ // We need to do this in order to be consistent with how target ext
+ // types are handled in `processInstrAfterVisit`
+ OpTyVal = getNormalizedPoisonValue(OpTy);
+ }
CallInst *AssignCI =
buildIntrWithMD(Intrinsic::spv_assign_type, {OpTy},
- getNormalizedPoisonValue(OpTy), Op, {}, B);
- GR->addAssignPtrTypeInstr(Op, AssignCI);
+ getNormalizedPoisonValue(OpTy), OpTyVal, {}, B);
+ GR->addAssignPtrTypeInstr(OpTyVal, AssignCI);
}
}
}
@@ -2075,22 +2081,14 @@ void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I,
BPrepared = true;
}
Type *OpTy = Op->getType();
- Value *OpTyVal = Op;
- if (OpTy->isTargetExtTy())
- OpTyVal = getNormalizedPoisonValue(OpTy);
Type *OpElemTy = GR->findDeducedElementType(Op);
Value *NewOp = Op;
if (OpTy->isTargetExtTy()) {
+ // Since this value is replaced by poison, we need to do the same in
+ // `insertAssignTypeIntrs`.
+ Value *OpTyVal = getNormalizedPoisonValue(OpTy);
NewOp = buildIntrWithMD(Intrinsic::spv_track_constant,
{OpTy, OpTyVal->getType()}, Op, OpTyVal, {}, B);
- if (isPointerTy(OpTy)) {
- if (OpElemTy) {
- GR->buildAssignPtr(B, OpElemTy, NewOp);
- } else {
- insertTodoType(NewOp);
- GR->buildAssignPtr(B, OpTy, NewOp);
- }
- }
}
if (!IsConstComposite && isPointerTy(OpTy) && OpElemTy != nullptr &&
OpElemTy != IntegerType::getInt8Ty(I->getContext())) {
diff --git a/llvm/test/CodeGen/SPIRV/inline/type.undef.ll b/llvm/test/CodeGen/SPIRV/inline/type.undef.ll
new file mode 100644
index 0000000000000..8cb90007c9aba
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/inline/type.undef.ll
@@ -0,0 +1,20 @@
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - | spirv-as - -o - | spirv-val %}
+
+%literal_32 = type target("spirv.Literal", 32)
+%literal_true = type target("spirv.Literal", 1)
+
+; CHECK-DAG: OpUnknown(21, 4) [[int_t:%[0-9]+]] 32 1
+%int_t = type target("spirv.Type", %literal_32, %literal_true, 21, 4, 32)
+
+; CHECK-DAG: {{%[0-9]+}} = OpTypeFunction [[int_t]]
+define %int_t @foo() {
+entry:
+ %v = alloca %int_t
+ %i = load %int_t, ptr %v
+
+; CHECK-DAG: [[i:%[0-9]+]] = OpUndef [[int_t]]
+; CHECK-DAG: OpReturnValue [[i]]
+ ret %int_t %i
+}
More information about the llvm-commits
mailing list