[llvm] [SPIR-V] Fix an undefined behaviour in the SPIRV emit-intrinsics pass (PR #123620)
Vyacheslav Levytskyy via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 20 06:51:56 PST 2025
https://github.com/VyacheslavLevytskyy updated https://github.com/llvm/llvm-project/pull/123620
>From b16900fe3ab9974792bf8d3cdeb83de09e236dc1 Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Mon, 20 Jan 2025 06:17:02 -0800
Subject: [PATCH 1/2] Fix an undefined behaviour in the SPIRV emit-intrinsics
pass
---
llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index 1c1acd29ee0e6a..c77b9af4652b95 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -2475,8 +2475,10 @@ void SPIRVEmitIntrinsics::parseFunDeclarations(Module &M) {
if (DemangledName.empty())
continue;
// allow only OpGroupAsyncCopy use case at the moment
- auto [Grp, Opcode, ExtNo] =
- SPIRV::mapBuiltinToOpcode(DemangledName, InstrSet);
+ auto [Grp, Opcode, ExtNo] = SPIRV::mapBuiltinToOpcode(
+ DemangledName, TM->getSubtarget<SPIRVSubtarget>(F).isOpenCLEnv()
+ ? SPIRV::InstructionSet::OpenCL_std
+ : SPIRV::InstructionSet::GLSL_std_450);
if (Opcode != SPIRV::OpGroupAsyncCopy)
continue;
// find pointer arguments
>From df2134d881bdb85a3fb863ec5ba9ea23653bf8fb Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Mon, 20 Jan 2025 06:51:25 -0800
Subject: [PATCH 2/2] apply a code review suggestion
---
llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
index c77b9af4652b95..51e7f9fffff03a 100644
--- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp
@@ -74,7 +74,6 @@ class SPIRVEmitIntrinsics
DenseMap<Instruction *, Constant *> AggrConsts;
DenseMap<Instruction *, Type *> AggrConstTypes;
DenseSet<Instruction *> AggrStores;
- SPIRV::InstructionSet::InstructionSet InstrSet;
// map of function declarations to <pointer arg index => element type>
DenseMap<Function *, SmallVector<std::pair<unsigned, Type *>>> FDeclPtrTys;
@@ -896,8 +895,10 @@ bool SPIRVEmitIntrinsics::deduceOperandElementTypeCalledFunction(
getOclOrSpirvBuiltinDemangledName(CalledF->getName());
if (DemangledName.length() > 0 &&
!StringRef(DemangledName).starts_with("llvm.")) {
- auto [Grp, Opcode, ExtNo] =
- SPIRV::mapBuiltinToOpcode(DemangledName, InstrSet);
+ auto [Grp, Opcode, ExtNo] = SPIRV::mapBuiltinToOpcode(
+ DemangledName, TM->getSubtarget<SPIRVSubtarget>(*CalledF).isOpenCLEnv()
+ ? SPIRV::InstructionSet::OpenCL_std
+ : SPIRV::InstructionSet::GLSL_std_450);
if (Opcode == SPIRV::OpGroupAsyncCopy) {
for (unsigned i = 0, PtrCnt = 0; i < CI->arg_size() && PtrCnt < 2; ++i) {
Value *Op = CI->getArgOperand(i);
@@ -2316,10 +2317,6 @@ bool SPIRVEmitIntrinsics::runOnFunction(Function &Func) {
return false;
const SPIRVSubtarget &ST = TM->getSubtarget<SPIRVSubtarget>(Func);
- GR = ST.getSPIRVGlobalRegistry();
- InstrSet = ST.isOpenCLEnv() ? SPIRV::InstructionSet::OpenCL_std
- : SPIRV::InstructionSet::GLSL_std_450;
-
if (!CurrF)
HaveFunPtrs =
ST.canUseExtension(SPIRV::Extension::SPV_INTEL_function_pointers);
More information about the llvm-commits
mailing list