Index: llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp =================================================================== --- llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp +++ llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp @@ -394,7 +394,7 @@ if (ConstantInt *Const = dyn_cast(C)) { Inst.addOperand(MCOperand::createImm(Const->getZExtValue())); } else if (auto *CE = dyn_cast(C)) { - Register FuncReg = MAI->getFuncReg(CE->getName().str()); + Register FuncReg = MAI->getFuncReg(CE); assert(FuncReg.isValid()); Inst.addOperand(MCOperand::createReg(FuncReg)); } @@ -426,7 +426,7 @@ const Function &F = *FI; if (F.isDeclaration()) continue; - Register FReg = MAI->getFuncReg(F.getGlobalIdentifier()); + Register FReg = MAI->getFuncReg(&F); assert(FReg.isValid()); if (MDNode *Node = F.getMetadata("reqd_work_group_size")) outputExecutionModeFromMDNode(FReg, Node, @@ -466,7 +466,7 @@ if (!isa(AnnotatedVar)) llvm_unreachable("Unsupported value in llvm.global.annotations"); Function *Func = cast(AnnotatedVar); - Register Reg = MAI->getFuncReg(Func->getGlobalIdentifier()); + Register Reg = MAI->getFuncReg(Func); // The second field contains a pointer to a global annotation string. GlobalVariable *GV = Index: llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp =================================================================== --- llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -374,7 +374,7 @@ Register ResVReg = Info.OrigRet.Regs.empty() ? Register(0) : Info.OrigRet.Regs[0]; - std::string FuncName = Info.Callee.getGlobal()->getGlobalIdentifier(); + std::string FuncName = Info.Callee.getGlobal()->getName().str(); std::string DemangledName = getOclOrSpirvBuiltinDemangledName(FuncName); const auto *ST = static_cast(&MF.getSubtarget()); // TODO: check that it's OCL builtin, then apply OpenCL_std. Index: llvm/lib/Target/SPIRV/SPIRVMCInstLower.cpp =================================================================== --- llvm/lib/Target/SPIRV/SPIRVMCInstLower.cpp +++ llvm/lib/Target/SPIRV/SPIRVMCInstLower.cpp @@ -31,7 +31,7 @@ default: llvm_unreachable("unknown operand type"); case MachineOperand::MO_GlobalAddress: { - Register FuncReg = MAI->getFuncReg(MO.getGlobal()->getGlobalIdentifier()); + Register FuncReg = MAI->getFuncReg(dyn_cast(MO.getGlobal())); assert(FuncReg.isValid() && "Cannot find function Id"); MCOp = MCOperand::createReg(FuncReg); break; Index: llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h =================================================================== --- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h +++ llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h @@ -150,8 +150,12 @@ // The table maps MBB number to SPIR-V unique ID register. DenseMap BBNumToRegMap; - Register getFuncReg(std::string FuncName) { - auto FuncReg = FuncNameMap.find(FuncName); + Register getFuncReg(const Function *F) { + GlobalValue::LinkageTypes Linkage = F->getLinkage(); + StringRef Name = F->hasName() ? F->getName() : ".anonymous"; + StringRef ModuleFileName = F->getParent()->getSourceFileName(); + auto FuncReg = FuncNameMap.find( + GlobalValue::getGlobalIdentifier(Name, Linkage, ModuleFileName)); assert(FuncReg != FuncNameMap.end() && "Cannot find function Id"); return FuncReg->second; } Index: llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp =================================================================== --- llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp +++ llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp @@ -304,7 +304,11 @@ Register GlobalReg = MAI.getRegisterAlias(MI.getMF(), Reg); assert(GlobalReg.isValid()); // TODO: check that it does not conflict with existing entries. - MAI.FuncNameMap[F.getGlobalIdentifier()] = GlobalReg; + GlobalValue::LinkageTypes Linkage = F.getLinkage(); + StringRef Name = F.hasName() ? F.getName() : ".anonymous"; + StringRef ModuleFileName = F.getParent()->getSourceFileName(); + MAI.FuncNameMap[GlobalValue::getGlobalIdentifier( + Name, Linkage, ModuleFileName)] = GlobalReg; } } Index: llvm/test/CodeGen/SPIRV/function/internal-anonymous-function.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/SPIRV/function/internal-anonymous-function.ll @@ -0,0 +1,20 @@ +; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s + +; Types: +; CHECK-DAG: [[F32:%.+]] = OpTypeFloat 32 +; CHECK-DAG: [[FNF32:%.+]] = OpTypeFunction [[F32]] [[F32]] +; Function decl: +; CHECK: [[ANON:%.+]] = OpFunction [[F32]] None [[FNF32]] +; CHECK-NEXT: OpFunctionParameter [[F32]] +; CHECK-NEXT: OpLabel +; CHECK-NEXT: OpReturnValue +; CHECK-NEXT: OpFunctionEnd +define internal spir_func float @0(float %a) { + ret float %a +} + +; CHECK: OpFunctionCall [[F32]] [[ANON]] +define spir_kernel void @foo(float %a) { + %1 = call spir_func float @0(float %a) + ret void +}