From b16900fe3ab9974792bf8d3cdeb83de09e236dc1 Mon Sep 17 00:00:00 2001 From: "Levytskyy, Vyacheslav" 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 1c1acd29ee0e6..c77b9af4652b9 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(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" 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 c77b9af4652b9..51e7f9fffff03 100644 --- a/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVEmitIntrinsics.cpp @@ -74,7 +74,6 @@ class SPIRVEmitIntrinsics DenseMap AggrConsts; DenseMap AggrConstTypes; DenseSet AggrStores; - SPIRV::InstructionSet::InstructionSet InstrSet; // map of function declarations to element type> DenseMap>> 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(*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(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);