From 05453f6480d43cdf4c109426e2f44ad2ce64568c Mon Sep 17 00:00:00 2001 From: gregory Date: Fri, 5 Aug 2022 13:28:51 -0700 Subject: [PATCH 1/9] Fix an issue that causes a program containing ESIMD and non-ESIMD kernels to crash --- llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp | 4 +- llvm/tools/sycl-post-link/ModuleSplitter.cpp | 95 +++++++++++--------- 2 files changed, 56 insertions(+), 43 deletions(-) diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp index b3b337e0048aa..e0d8960bbff23 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp @@ -1643,7 +1643,9 @@ PreservedAnalyses SYCLLowerESIMDPass::run(Module &M, ModuleAnalysisManager &) { size_t AmountOfESIMDIntrCalls = 0; for (auto &F : M.functions()) { - AmountOfESIMDIntrCalls += this->runOnFunction(F, GVTS); + if (F.getMetadata("sycl_explicit_simd") != nullptr) { + AmountOfESIMDIntrCalls += this->runOnFunction(F, GVTS); + } } // TODO FIXME ESIMD figure out less conservative result diff --git a/llvm/tools/sycl-post-link/ModuleSplitter.cpp b/llvm/tools/sycl-post-link/ModuleSplitter.cpp index 08e2b7b4de637..cd6d0fec15ddc 100644 --- a/llvm/tools/sycl-post-link/ModuleSplitter.cpp +++ b/llvm/tools/sycl-post-link/ModuleSplitter.cpp @@ -136,6 +136,58 @@ bool isEntryPoint(const Function &F, bool EmitOnlyKernelsAsEntryPoints) { bool isESIMDFunction(const Function &F) { return F.getMetadata(ESIMD_MARKER_MD) != nullptr; } +// Represents a call graph between functions in a module. Nodes are functions, +// edges are "calls" relation. +class CallGraph { +public: + using FunctionSet = SmallPtrSet; + +private: + std::unordered_map Graph; + SmallPtrSet EmptySet; + FunctionSet AddrTakenFunctions; + +public: + CallGraph(const Module &M) { + for (const auto &F : M) { + for (const Value *U : F.users()) { + if (const auto *I = dyn_cast(U)) { + if (I->getCalledFunction() == &F) { + const Function *F1 = I->getFunction(); + Graph[F1].insert(&F); + } + } + } + if (F.hasAddressTaken()) { + AddrTakenFunctions.insert(&F); + } + } + } + + iterator_range + successors(const Function *F) const { + auto It = Graph.find(F); + return (It == Graph.end()) + ? make_range(EmptySet.begin(), EmptySet.end()) + : make_range(It->second.begin(), It->second.end()); + } + + iterator_range addrTakenFunctions() const { + return make_range(AddrTakenFunctions.begin(), AddrTakenFunctions.end()); + } +}; + +bool isESIMDFunctionInCallChain(const Function *F, const CallGraph &Deps) { + if (isESIMDFunction(*F)) { + return true; + } + for (const Function *F1 : Deps.successors(F)) { + if (isESIMDFunctionInCallChain(F1, Deps)) { + return true; + } + } + return false; +} // This function makes one or two groups depending on kernel types (SYCL, ESIMD) EntryPointGroupVec @@ -151,7 +203,7 @@ groupEntryPointsByKernelType(const ModuleDesc &MD, !MD.isEntryPointCandidate(F)) continue; - if (isESIMDFunction(F)) + if (isESIMDFunctionInCallChain(&F, CallGraph{M})) EntryPointMap[ESIMD_SCOPE_NAME].insert(&F); else EntryPointMap[SYCL_SCOPE_NAME].insert(&F); @@ -280,47 +332,6 @@ groupEntryPointsByAttribute(const ModuleDesc &MD, StringRef AttrName, return EntryPointGroups; } -// Represents a call graph between functions in a module. Nodes are functions, -// edges are "calls" relation. -class CallGraph { -public: - using FunctionSet = SmallPtrSet; - -private: - std::unordered_map Graph; - SmallPtrSet EmptySet; - FunctionSet AddrTakenFunctions; - -public: - CallGraph(const Module &M) { - for (const auto &F : M) { - for (const Value *U : F.users()) { - if (const auto *I = dyn_cast(U)) { - if (I->getCalledFunction() == &F) { - const Function *F1 = I->getFunction(); - Graph[F1].insert(&F); - } - } - } - if (F.hasAddressTaken()) { - AddrTakenFunctions.insert(&F); - } - } - } - - iterator_range - successors(const Function *F) const { - auto It = Graph.find(F); - return (It == Graph.end()) - ? make_range(EmptySet.begin(), EmptySet.end()) - : make_range(It->second.begin(), It->second.end()); - } - - iterator_range addrTakenFunctions() const { - return make_range(AddrTakenFunctions.begin(), AddrTakenFunctions.end()); - } -}; - void collectFunctionsToExtract(SetVector &GVs, const EntryPointGroup &ModuleEntryPoints, const CallGraph &Deps) { From 4e9185573e37e6833df20cc7883d01055361516f Mon Sep 17 00:00:00 2001 From: gregory Date: Tue, 9 Aug 2022 22:55:36 -0700 Subject: [PATCH 2/9] Address test failures --- llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp index e0d8960bbff23..01c7caf3a0839 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp @@ -1215,6 +1215,7 @@ translateSpirvGlobalUses(LoadInst *LI, StringRef SpirvGlobalName, // TODO: Implement support for the following intrinsics: // uint32_t __spirv_BuiltIn NumSubgroups; // uint32_t __spirv_BuiltIn SubgroupId; + // uint32_t __spirv_BuiltIn GlobalLinearId // Translate those loads from _scalar_ SPIRV globals that can be replaced with // a const value here. @@ -1227,6 +1228,8 @@ translateSpirvGlobalUses(LoadInst *LI, StringRef SpirvGlobalName, SpirvGlobalName == "SubgroupMaxSize") { NewInst = llvm::Constant::getIntegerValue(LI->getType(), llvm::APInt(32, 1, true)); + } else if (SpirvGlobalName == "GlobalLinearId") { + NewInst = llvm::Constant::getNullValue(LI->getType()); } if (NewInst) { LI->replaceAllUsesWith(NewInst); @@ -1643,9 +1646,7 @@ PreservedAnalyses SYCLLowerESIMDPass::run(Module &M, ModuleAnalysisManager &) { size_t AmountOfESIMDIntrCalls = 0; for (auto &F : M.functions()) { - if (F.getMetadata("sycl_explicit_simd") != nullptr) { - AmountOfESIMDIntrCalls += this->runOnFunction(F, GVTS); - } + AmountOfESIMDIntrCalls += this->runOnFunction(F, GVTS); } // TODO FIXME ESIMD figure out less conservative result From 323b9559c659057cdbc67c68d3c031e773fc76a0 Mon Sep 17 00:00:00 2001 From: gregory Date: Mon, 15 Aug 2022 14:43:17 -0700 Subject: [PATCH 3/9] Optimize the implementation by limiting number of functions checked for ESIMD attribute. --- llvm/tools/sycl-post-link/ModuleSplitter.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/llvm/tools/sycl-post-link/ModuleSplitter.cpp b/llvm/tools/sycl-post-link/ModuleSplitter.cpp index cd6d0fec15ddc..7f7bdd71b8f58 100644 --- a/llvm/tools/sycl-post-link/ModuleSplitter.cpp +++ b/llvm/tools/sycl-post-link/ModuleSplitter.cpp @@ -185,6 +185,11 @@ bool isESIMDFunctionInCallChain(const Function *F, const CallGraph &Deps) { if (isESIMDFunctionInCallChain(F1, Deps)) { return true; } + // Optimization to reduce recursion depth. + // No need to check function calls beyond kernel function. + if (isEntryPoint(*F1, true)) { + return false; + } } return false; } From 385d0e0b102997cde80566d1a7435bebc4572937 Mon Sep 17 00:00:00 2001 From: gregory Date: Wed, 17 Aug 2022 23:36:26 -0700 Subject: [PATCH 4/9] Reimplement the fix as a compiler pass --- .../llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h | 3 + .../llvm/SYCLLowerIR/ESIMD/LowerESIMD.h | 6 + llvm/lib/Passes/PassRegistry.def | 282 ++++++++---------- llvm/lib/SYCLLowerIR/CMakeLists.txt | 17 +- llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp | 7 +- .../ESIMD/LowerESIMDKernelAttrs.cpp | 39 +++ llvm/tools/sycl-post-link/ModuleSplitter.cpp | 100 +++---- llvm/tools/sycl-post-link/sycl-post-link.cpp | 4 + 8 files changed, 231 insertions(+), 227 deletions(-) create mode 100644 llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp diff --git a/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h b/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h index 109753fb3b3a1..6d5de877d3518 100644 --- a/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h +++ b/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h @@ -16,6 +16,7 @@ namespace llvm { namespace esimd { constexpr char ATTR_DOUBLE_GRF[] = "esimd-double-grf"; +constexpr char ATTR_ESIMD_KERNEL[] = "sycl_explicit_simd"; using CallGraphNodeAction = std::function; void traverseCallgraphUp(llvm::Function *F, CallGraphNodeAction NodeF, @@ -34,6 +35,8 @@ void traverseCallgraphUp(Function *F, CallGraphNodeActionF ActionF, // Tells whether given function is a ESIMD kernel. bool isESIMDKernel(const Function &F); +// Tells whether given function is a ESIMD function. +bool isESIMD(const Function &F); /// Reports and error with the message \p Msg concatenated with the optional /// \p OptMsg if \p Condition is false. diff --git a/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h b/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h index a40667d07b6fa..ed1749dc78f96 100644 --- a/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h +++ b/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h @@ -76,6 +76,12 @@ class SYCLLowerESIMDKernelPropsPass PreservedAnalyses run(Module &M, ModuleAnalysisManager &); }; +// Fixes ESIMD Kernel attributes for wrapper functions for ESIMD kernels +class SYCLLowerESIMDKernelAttrPass + : public PassInfoMixin { +public: + PreservedAnalyses run(Module &M, ModuleAnalysisManager &); +}; } // namespace llvm #endif // LLVM_SYCLLOWERIR_LOWERESIMD_H diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 07be606d3a292..387b6c7281f24 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -66,11 +66,12 @@ MODULE_PASS("globalsplit", GlobalSplitPass()) MODULE_PASS("hotcoldsplit", HotColdSplittingPass()) MODULE_PASS("inferattrs", InferFunctionAttrsPass()) MODULE_PASS("inliner-wrapper", ModuleInlinerWrapperPass()) -MODULE_PASS("inliner-ml-advisor-release", ModuleInlinerWrapperPass(getInlineParams(), true, {}, InliningAdvisorMode::Release, 0)) +MODULE_PASS("inliner-ml-advisor-release", + ModuleInlinerWrapperPass(getInlineParams(), true, {}, + InliningAdvisorMode::Release, 0)) MODULE_PASS("print", InlineAdvisorAnalysisPrinterPass(dbgs())) -MODULE_PASS("inliner-wrapper-no-mandatory-first", ModuleInlinerWrapperPass( - getInlineParams(), - false)) +MODULE_PASS("inliner-wrapper-no-mandatory-first", + ModuleInlinerWrapperPass(getInlineParams(), false)) MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass()) MODULE_PASS("instrorderfile", InstrOrderFilePass()) MODULE_PASS("instrprof", InstrProfiling()) @@ -95,7 +96,8 @@ MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs())) MODULE_PASS("print", PrintModulePass(dbgs())) MODULE_PASS("print-lcg", LazyCallGraphPrinterPass(dbgs())) MODULE_PASS("print-lcg-dot", LazyCallGraphDOTPrinterPass(dbgs())) -MODULE_PASS("print-must-be-executed-contexts", MustBeExecutedContextPrinterPass(dbgs())) +MODULE_PASS("print-must-be-executed-contexts", + MustBeExecutedContextPrinterPass(dbgs())) MODULE_PASS("print-stack-safety", StackSafetyGlobalPrinterPass(dbgs())) MODULE_PASS("print", ModuleDebugInfoPrinterPass(dbgs())) MODULE_PASS("recompute-globalsaa", RecomputeGlobalsAAPass()) @@ -105,7 +107,8 @@ MODULE_PASS("rewrite-symbols", RewriteSymbolPass()) MODULE_PASS("rpo-function-attrs", ReversePostOrderFunctionAttrsPass()) MODULE_PASS("sample-profile", SampleProfileLoaderPass()) MODULE_PASS("scc-oz-module-inliner", - buildInlinerPipeline(OptimizationLevel::Oz, ThinOrFullLTOPhase::None)) + buildInlinerPipeline(OptimizationLevel::Oz, + ThinOrFullLTOPhase::None)) MODULE_PASS("strip", StripSymbolsPass()) MODULE_PASS("strip-dead-debug-info", StripDeadDebugInfoPass()) MODULE_PASS("pseudo-probe", SampleProfileProbePass(TM)) @@ -135,34 +138,30 @@ MODULE_PASS("SYCLMutatePrintfAddrspace", SYCLMutatePrintfAddrspacePass()) MODULE_PASS("SPIRITTAnnotations", SPIRITTAnnotationsPass()) MODULE_PASS("deadargelim-sycl", DeadArgumentEliminationSYCLPass()) MODULE_PASS("sycllowerwglocalmemory", SYCLLowerWGLocalMemoryPass()) +MODULE_PASS("lower-esimd-kernel-attrs", SYCLLowerESIMDKernelAttrPass()) #undef MODULE_PASS #ifndef MODULE_PASS_WITH_PARAMS #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -MODULE_PASS_WITH_PARAMS("loop-extract", - "LoopExtractorPass", - [](bool Single) { - if (Single) - return LoopExtractorPass(1); - return LoopExtractorPass(); - }, - parseLoopExtractorPassOptions, - "single") -MODULE_PASS_WITH_PARAMS("hwasan", - "HWAddressSanitizerPass", - [](HWAddressSanitizerOptions Opts) { - return HWAddressSanitizerPass(Opts); - }, - parseHWASanPassOptions, - "kernel;recover") -MODULE_PASS_WITH_PARAMS("asan-module", - "ModuleAddressSanitizerPass", - [](AddressSanitizerOptions Opts) { - return ModuleAddressSanitizerPass(Opts); - }, - parseASanPassOptions, - "kernel") +MODULE_PASS_WITH_PARAMS( + "loop-extract", "LoopExtractorPass", + [](bool Single) { + if (Single) + return LoopExtractorPass(1); + return LoopExtractorPass(); + }, + parseLoopExtractorPassOptions, "single") +MODULE_PASS_WITH_PARAMS( + "hwasan", "HWAddressSanitizerPass", + [](HWAddressSanitizerOptions Opts) { return HWAddressSanitizerPass(Opts); }, + parseHWASanPassOptions, "kernel;recover") +MODULE_PASS_WITH_PARAMS( + "asan-module", "ModuleAddressSanitizerPass", + [](AddressSanitizerOptions Opts) { + return ModuleAddressSanitizerPass(Opts); + }, + parseASanPassOptions, "kernel") #undef MODULE_PASS_WITH_PARAMS #ifndef CGSCC_ANALYSIS @@ -187,20 +186,14 @@ CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass()) #ifndef CGSCC_PASS_WITH_PARAMS #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -CGSCC_PASS_WITH_PARAMS("inline", - "InlinerPass", - [](bool OnlyMandatory) { - return InlinerPass(OnlyMandatory); - }, - parseInlinerPassOptions, - "only-mandatory") -CGSCC_PASS_WITH_PARAMS("coro-split", - "CoroSplitPass", - [](bool OptimizeFrame) { - return CoroSplitPass(OptimizeFrame); - }, - parseCoroSplitPassOptions, - "reuse-storage") +CGSCC_PASS_WITH_PARAMS( + "inline", "InlinerPass", + [](bool OnlyMandatory) { return InlinerPass(OnlyMandatory); }, + parseInlinerPassOptions, "only-mandatory") +CGSCC_PASS_WITH_PARAMS( + "coro-split", "CoroSplitPass", + [](bool OptimizeFrame) { return CoroSplitPass(OptimizeFrame); }, + parseCoroSplitPassOptions, "reuse-storage") #undef CGSCC_PASS_WITH_PARAMS #ifndef FUNCTION_ANALYSIS @@ -227,8 +220,10 @@ FUNCTION_ANALYSIS("regions", RegionInfoAnalysis()) FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis()) FUNCTION_ANALYSIS("opt-remark-emit", OptimizationRemarkEmitterAnalysis()) FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis()) -FUNCTION_ANALYSIS("should-not-run-function-passes", ShouldNotRunFunctionPassesAnalysis()) -FUNCTION_ANALYSIS("should-run-extra-vector-passes", ShouldRunExtraVectorPasses()) +FUNCTION_ANALYSIS("should-not-run-function-passes", + ShouldNotRunFunctionPassesAnalysis()) +FUNCTION_ANALYSIS("should-run-extra-vector-passes", + ShouldRunExtraVectorPasses()) FUNCTION_ANALYSIS("stack-safety-local", StackSafetyAnalysis()) FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis()) FUNCTION_ANALYSIS("targetir", @@ -348,7 +343,7 @@ FUNCTION_PASS("print", DominanceFrontierPrinterPass(dbgs())) FUNCTION_PASS("print", FunctionPropertiesPrinterPass(dbgs())) FUNCTION_PASS("print", InlineCostAnnotationPrinterPass(dbgs())) FUNCTION_PASS("print", - InlineSizeEstimatorAnalysisPrinterPass(dbgs())) + InlineSizeEstimatorAnalysisPrinterPass(dbgs())) FUNCTION_PASS("print", LoopPrinterPass(dbgs())) FUNCTION_PASS("print", MemorySSAPrinterPass(dbgs())) FUNCTION_PASS("print", MemorySSAWalkerPrinterPass(dbgs())) @@ -366,7 +361,8 @@ FUNCTION_PASS("redundant-dbg-inst-elim", RedundantDbgInstEliminationPass()) FUNCTION_PASS("reg2mem", RegToMemPass()) FUNCTION_PASS("scalarize-masked-mem-intrin", ScalarizeMaskedMemIntrinPass()) FUNCTION_PASS("scalarizer", ScalarizerPass()) -FUNCTION_PASS("separate-const-offset-from-gep", SeparateConstOffsetFromGEPPass()) +FUNCTION_PASS("separate-const-offset-from-gep", + SeparateConstOffsetFromGEPPass()) FUNCTION_PASS("sccp", SCCPPass()) FUNCTION_PASS("sink", SinkingPass()) FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass()) @@ -398,99 +394,74 @@ FUNCTION_PASS("ESIMDLowerLoadStore", ESIMDLowerLoadStorePass()) #ifndef FUNCTION_PASS_WITH_PARAMS #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -FUNCTION_PASS_WITH_PARAMS("early-cse", - "EarlyCSEPass", - [](bool UseMemorySSA) { - return EarlyCSEPass(UseMemorySSA); - }, - parseEarlyCSEPassOptions, - "memssa") -FUNCTION_PASS_WITH_PARAMS("ee-instrument", - "EntryExitInstrumenterPass", - [](bool PostInlining) { - return EntryExitInstrumenterPass(PostInlining); - }, - parseEntryExitInstrumenterPassOptions, - "post-inline") -FUNCTION_PASS_WITH_PARAMS("lower-matrix-intrinsics", - "LowerMatrixIntrinsicsPass", - [](bool Minimal) { - return LowerMatrixIntrinsicsPass(Minimal); - }, - parseLowerMatrixIntrinsicsPassOptions, - "minimal") -FUNCTION_PASS_WITH_PARAMS("loop-unroll", - "LoopUnrollPass", - [](LoopUnrollOptions Opts) { - return LoopUnrollPass(Opts); - }, - parseLoopUnrollOptions, - "O0;O1;O2;O3;full-unroll-max=N;" - "no-partial;partial;" - "no-peeling;peeling;" - "no-profile-peeling;profile-peeling;" - "no-runtime;runtime;" - "no-upperbound;upperbound") -FUNCTION_PASS_WITH_PARAMS("msan", - "MemorySanitizerPass", - [](MemorySanitizerOptions Opts) { - return MemorySanitizerPass(Opts); - }, - parseMSanPassOptions, - "recover;kernel;eager-checks;track-origins=N") -FUNCTION_PASS_WITH_PARAMS("simplifycfg", - "SimplifyCFGPass", - [](SimplifyCFGOptions Opts) { - return SimplifyCFGPass(Opts); - }, - parseSimplifyCFGOptions, - "no-forward-switch-cond;forward-switch-cond;" - "no-switch-range-to-icmp;switch-range-to-icmp;" - "no-switch-to-lookup;switch-to-lookup;" - "no-keep-loops;keep-loops;" - "no-hoist-common-insts;hoist-common-insts;" - "no-sink-common-insts;sink-common-insts;" - "bonus-inst-threshold=N" - ) -FUNCTION_PASS_WITH_PARAMS("loop-vectorize", - "LoopVectorizePass", - [](LoopVectorizeOptions Opts) { - return LoopVectorizePass(Opts); - }, - parseLoopVectorizeOptions, - "no-interleave-forced-only;interleave-forced-only;" - "no-vectorize-forced-only;vectorize-forced-only") -FUNCTION_PASS_WITH_PARAMS("mldst-motion", - "MergedLoadStoreMotionPass", - [](MergedLoadStoreMotionOptions Opts) { - return MergedLoadStoreMotionPass(Opts); - }, - parseMergedLoadStoreMotionOptions, - "no-split-footer-bb;split-footer-bb") -FUNCTION_PASS_WITH_PARAMS("gvn", - "GVNPass", - [](GVNOptions Opts) { - return GVNPass(Opts); - }, - parseGVNOptions, - "no-pre;pre;" - "no-load-pre;load-pre;" - "no-split-backedge-load-pre;split-backedge-load-pre;" - "no-memdep;memdep") -FUNCTION_PASS_WITH_PARAMS("print", - "StackLifetimePrinterPass", - [](StackLifetime::LivenessType Type) { - return StackLifetimePrinterPass(dbgs(), Type); - }, - parseStackLifetimeOptions, - "may;must") -FUNCTION_PASS_WITH_PARAMS("print", - "DependenceAnalysisPrinterPass", - [](bool NormalizeResults) { - return DependenceAnalysisPrinterPass(dbgs(), NormalizeResults); - }, - parseDependenceAnalysisPrinterOptions, - "normalized-results") +FUNCTION_PASS_WITH_PARAMS( + "early-cse", "EarlyCSEPass", + [](bool UseMemorySSA) { return EarlyCSEPass(UseMemorySSA); }, + parseEarlyCSEPassOptions, "memssa") +FUNCTION_PASS_WITH_PARAMS( + "ee-instrument", "EntryExitInstrumenterPass", + [](bool PostInlining) { return EntryExitInstrumenterPass(PostInlining); }, + parseEntryExitInstrumenterPassOptions, "post-inline") +FUNCTION_PASS_WITH_PARAMS( + "lower-matrix-intrinsics", "LowerMatrixIntrinsicsPass", + [](bool Minimal) { return LowerMatrixIntrinsicsPass(Minimal); }, + parseLowerMatrixIntrinsicsPassOptions, "minimal") +FUNCTION_PASS_WITH_PARAMS( + "loop-unroll", "LoopUnrollPass", + [](LoopUnrollOptions Opts) { return LoopUnrollPass(Opts); }, + parseLoopUnrollOptions, + "O0;O1;O2;O3;full-unroll-max=N;" + "no-partial;partial;" + "no-peeling;peeling;" + "no-profile-peeling;profile-peeling;" + "no-runtime;runtime;" + "no-upperbound;upperbound") +FUNCTION_PASS_WITH_PARAMS( + "msan", "MemorySanitizerPass", + [](MemorySanitizerOptions Opts) { return MemorySanitizerPass(Opts); }, + parseMSanPassOptions, "recover;kernel;eager-checks;track-origins=N") +FUNCTION_PASS_WITH_PARAMS( + "simplifycfg", "SimplifyCFGPass", + [](SimplifyCFGOptions Opts) { return SimplifyCFGPass(Opts); }, + parseSimplifyCFGOptions, + "no-forward-switch-cond;forward-switch-cond;" + "no-switch-range-to-icmp;switch-range-to-icmp;" + "no-switch-to-lookup;switch-to-lookup;" + "no-keep-loops;keep-loops;" + "no-hoist-common-insts;hoist-common-insts;" + "no-sink-common-insts;sink-common-insts;" + "bonus-inst-threshold=N") +FUNCTION_PASS_WITH_PARAMS( + "loop-vectorize", "LoopVectorizePass", + [](LoopVectorizeOptions Opts) { return LoopVectorizePass(Opts); }, + parseLoopVectorizeOptions, + "no-interleave-forced-only;interleave-forced-only;" + "no-vectorize-forced-only;vectorize-forced-only") +FUNCTION_PASS_WITH_PARAMS( + "mldst-motion", "MergedLoadStoreMotionPass", + [](MergedLoadStoreMotionOptions Opts) { + return MergedLoadStoreMotionPass(Opts); + }, + parseMergedLoadStoreMotionOptions, "no-split-footer-bb;split-footer-bb") +FUNCTION_PASS_WITH_PARAMS( + "gvn", "GVNPass", [](GVNOptions Opts) { return GVNPass(Opts); }, + parseGVNOptions, + "no-pre;pre;" + "no-load-pre;load-pre;" + "no-split-backedge-load-pre;split-backedge-load-pre;" + "no-memdep;memdep") +FUNCTION_PASS_WITH_PARAMS( + "print", "StackLifetimePrinterPass", + [](StackLifetime::LivenessType Type) { + return StackLifetimePrinterPass(dbgs(), Type); + }, + parseStackLifetimeOptions, "may;must") +FUNCTION_PASS_WITH_PARAMS( + "print", "DependenceAnalysisPrinterPass", + [](bool NormalizeResults) { + return DependenceAnalysisPrinterPass(dbgs(), NormalizeResults); + }, + parseDependenceAnalysisPrinterOptions, "normalized-results") #undef FUNCTION_PASS_WITH_PARAMS #ifndef LOOPNEST_PASS @@ -543,25 +514,18 @@ LOOP_PASS("loop-versioning-licm", LoopVersioningLICMPass()) #ifndef LOOP_PASS_WITH_PARAMS #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -LOOP_PASS_WITH_PARAMS("simple-loop-unswitch", - "SimpleLoopUnswitchPass", - [](std::pair Params) { - return SimpleLoopUnswitchPass(Params.first, Params.second); - }, - parseLoopUnswitchOptions, - "nontrivial;no-nontrivial;trivial;no-trivial") +LOOP_PASS_WITH_PARAMS( + "simple-loop-unswitch", "SimpleLoopUnswitchPass", + [](std::pair Params) { + return SimpleLoopUnswitchPass(Params.first, Params.second); + }, + parseLoopUnswitchOptions, "nontrivial;no-nontrivial;trivial;no-trivial") -LOOP_PASS_WITH_PARAMS("licm", "LICMPass", - [](LICMOptions Params) { - return LICMPass(Params); - }, - parseLICMOptions, - "allowspeculation"); +LOOP_PASS_WITH_PARAMS( + "licm", "LICMPass", [](LICMOptions Params) { return LICMPass(Params); }, + parseLICMOptions, "allowspeculation"); -LOOP_PASS_WITH_PARAMS("lnicm", "LNICMPass", - [](LICMOptions Params) { - return LNICMPass(Params); - }, - parseLICMOptions, - "allowspeculation"); +LOOP_PASS_WITH_PARAMS( + "lnicm", "LNICMPass", [](LICMOptions Params) { return LNICMPass(Params); }, + parseLICMOptions, "allowspeculation"); #undef LOOP_PASS_WITH_PARAMS diff --git a/llvm/lib/SYCLLowerIR/CMakeLists.txt b/llvm/lib/SYCLLowerIR/CMakeLists.txt index 57aa236f53083..23654c39e7f76 100644 --- a/llvm/lib/SYCLLowerIR/CMakeLists.txt +++ b/llvm/lib/SYCLLowerIR/CMakeLists.txt @@ -1,4 +1,4 @@ -if(${CMAKE_VERSION} VERSION_LESS 3.14) +if (${CMAKE_VERSION} VERSION_LESS 3.14) macro(FetchContent_MakeAvailable NAME) FetchContent_GetProperties(${NAME}) if(NOT ${NAME}_POPULATED) @@ -8,14 +8,14 @@ if(${CMAKE_VERSION} VERSION_LESS 3.14) endmacro() endif() -# Lowering of SYCL ESIMD kernels depends on vc-intrinsics -# NOTE: could have been added earlier from llvm/projects +#Lowering of SYCL ESIMD kernels depends on vc - intrinsics +#NOTE : could have been added earlier from llvm / projects if (NOT TARGET LLVMGenXIntrinsics) if (NOT DEFINED LLVMGenXIntrinsics_SOURCE_DIR) set(LLVMGenXIntrinsics_GIT_REPO https://github.com/intel/vc-intrinsics.git) - # Author: Haohai Wen - # Date: Fri Jun 10 03:46:22 2022 +0000 - # Format InstructionSimplify names +#Author : Haohai Wen < haohai.wen @intel.com> +#Date : Fri Jun 10 03 : 46 : 22 2022 + 0000 +#Format InstructionSimplify names set(LLVMGenXIntrinsics_GIT_TAG abce9184b7a3a7fe1b02289b9285610d9dc45465) message(STATUS "vc-intrinsics repo is missing. Will try to download it from ${LLVMGenXIntrinsics_GIT_REPO}") @@ -30,7 +30,7 @@ if (NOT TARGET LLVMGenXIntrinsics) set(LLVMGenXIntrinsics_SOURCE_DIR ${vc-intrinsics_SOURCE_DIR}) set(LLVMGenXIntrinsics_BINARY_DIR ${vc-intrinsics_BINARY_DIR}) else (NOT DEFINED LLVMGenXIntrinsics_SOURCE_DIR) - # -DLLVMGenXIntrinsics_SOURCE_DIR is provided +#- DLLVMGenXIntrinsics_SOURCE_DIR is provided message(STATUS "vc-intrinsics are added manually ${LLVMGenXIntrinsics_SOURCE_DIR}") set(LLVMGenXIntrinsics_BINARY_DIR ${CMAKE_BINARY_DIR}/vc-intrinsics-build) @@ -53,6 +53,7 @@ add_llvm_component_library(LLVMSYCLLowerIR ESIMD/LowerESIMDVecArg.cpp ESIMD/ESIMDUtils.cpp ESIMD/ESIMDVerifier.cpp + ESIMD/LowerESIMDKernelAttrs.cpp LowerInvokeSimd.cpp LowerWGScope.cpp LowerWGLocalMemory.cpp @@ -77,7 +78,7 @@ add_llvm_component_library(LLVMSYCLLowerIR LLVMGenXIntrinsics LLVMDemangle LLVMTransformUtils - + LINK_COMPONENTS Analysis Core diff --git a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp index a2ddc06d1fa06..5be29125e77bb 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp @@ -69,9 +69,12 @@ void traverseCallgraphUp(llvm::Function *F, CallGraphNodeAction ActionF, } } +bool isESIMD(const Function &F) { + return F.getMetadata(ATTR_ESIMD_KERNEL) != nullptr; +} + bool isESIMDKernel(const Function &F) { - return (F.getCallingConv() == CallingConv::SPIR_KERNEL) && - (F.getMetadata("sycl_explicit_simd") != nullptr); + return (F.getCallingConv() == CallingConv::SPIR_KERNEL) && isESIMD(F); } } // namespace esimd diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp new file mode 100644 index 0000000000000..ae521bed7b2da --- /dev/null +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp @@ -0,0 +1,39 @@ +//===---- LowerESIMDKernelAttrs - lower __esimd_set_kernel_attributes ---===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// Finds and adds sycl_explicit_simd attributes to wrapper functions that wrap +// ESIMD kernel functions + +#include "llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h" +#include "llvm/SYCLLowerIR/ESIMD/LowerESIMD.h" + +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" + +#define DEBUG_TYPE "LowerESIMDKernelAttrs" + +using namespace llvm; + +namespace llvm { +PreservedAnalyses +SYCLLowerESIMDKernelAttrPass::run(Module &M, ModuleAnalysisManager &MAM) { + bool Modified = false; + for (Function &F : M) { + if (llvm::esimd::isESIMD(F)) { + llvm::esimd::traverseCallgraphUp(&F, [&](Function *GraphNode) { + if (!llvm::esimd::isESIMD(*GraphNode)) { + GraphNode->setMetadata( + llvm::esimd::ATTR_ESIMD_KERNEL, + llvm::MDNode::get(GraphNode->getContext(), {})); + Modified = true; + } + }); + } + } + return Modified ? PreservedAnalyses::none() : PreservedAnalyses::all(); +} +} // namespace llvm diff --git a/llvm/tools/sycl-post-link/ModuleSplitter.cpp b/llvm/tools/sycl-post-link/ModuleSplitter.cpp index 7f7bdd71b8f58..08e2b7b4de637 100644 --- a/llvm/tools/sycl-post-link/ModuleSplitter.cpp +++ b/llvm/tools/sycl-post-link/ModuleSplitter.cpp @@ -136,63 +136,6 @@ bool isEntryPoint(const Function &F, bool EmitOnlyKernelsAsEntryPoints) { bool isESIMDFunction(const Function &F) { return F.getMetadata(ESIMD_MARKER_MD) != nullptr; } -// Represents a call graph between functions in a module. Nodes are functions, -// edges are "calls" relation. -class CallGraph { -public: - using FunctionSet = SmallPtrSet; - -private: - std::unordered_map Graph; - SmallPtrSet EmptySet; - FunctionSet AddrTakenFunctions; - -public: - CallGraph(const Module &M) { - for (const auto &F : M) { - for (const Value *U : F.users()) { - if (const auto *I = dyn_cast(U)) { - if (I->getCalledFunction() == &F) { - const Function *F1 = I->getFunction(); - Graph[F1].insert(&F); - } - } - } - if (F.hasAddressTaken()) { - AddrTakenFunctions.insert(&F); - } - } - } - - iterator_range - successors(const Function *F) const { - auto It = Graph.find(F); - return (It == Graph.end()) - ? make_range(EmptySet.begin(), EmptySet.end()) - : make_range(It->second.begin(), It->second.end()); - } - - iterator_range addrTakenFunctions() const { - return make_range(AddrTakenFunctions.begin(), AddrTakenFunctions.end()); - } -}; - -bool isESIMDFunctionInCallChain(const Function *F, const CallGraph &Deps) { - if (isESIMDFunction(*F)) { - return true; - } - for (const Function *F1 : Deps.successors(F)) { - if (isESIMDFunctionInCallChain(F1, Deps)) { - return true; - } - // Optimization to reduce recursion depth. - // No need to check function calls beyond kernel function. - if (isEntryPoint(*F1, true)) { - return false; - } - } - return false; -} // This function makes one or two groups depending on kernel types (SYCL, ESIMD) EntryPointGroupVec @@ -208,7 +151,7 @@ groupEntryPointsByKernelType(const ModuleDesc &MD, !MD.isEntryPointCandidate(F)) continue; - if (isESIMDFunctionInCallChain(&F, CallGraph{M})) + if (isESIMDFunction(F)) EntryPointMap[ESIMD_SCOPE_NAME].insert(&F); else EntryPointMap[SYCL_SCOPE_NAME].insert(&F); @@ -337,6 +280,47 @@ groupEntryPointsByAttribute(const ModuleDesc &MD, StringRef AttrName, return EntryPointGroups; } +// Represents a call graph between functions in a module. Nodes are functions, +// edges are "calls" relation. +class CallGraph { +public: + using FunctionSet = SmallPtrSet; + +private: + std::unordered_map Graph; + SmallPtrSet EmptySet; + FunctionSet AddrTakenFunctions; + +public: + CallGraph(const Module &M) { + for (const auto &F : M) { + for (const Value *U : F.users()) { + if (const auto *I = dyn_cast(U)) { + if (I->getCalledFunction() == &F) { + const Function *F1 = I->getFunction(); + Graph[F1].insert(&F); + } + } + } + if (F.hasAddressTaken()) { + AddrTakenFunctions.insert(&F); + } + } + } + + iterator_range + successors(const Function *F) const { + auto It = Graph.find(F); + return (It == Graph.end()) + ? make_range(EmptySet.begin(), EmptySet.end()) + : make_range(It->second.begin(), It->second.end()); + } + + iterator_range addrTakenFunctions() const { + return make_range(AddrTakenFunctions.begin(), AddrTakenFunctions.end()); + } +}; + void collectFunctionsToExtract(SetVector &GVs, const EntryPointGroup &ModuleEntryPoints, const CallGraph &Deps) { diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index 6aa1e8f2b61d1..660c727648e0e 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -665,6 +665,10 @@ processInputModule(std::unique_ptr M) { // if none were made. bool Modified = false; + // Propagate ESIMD attribute to wrapper functions to prevent + // spurious splits and kernel link errors. + Modified |= runModulePass(*M); + // After linking device bitcode "llvm.used" holds references to the kernels // that are defined in the device image. But after splitting device image into // separate kernels we may end up with having references to kernel declaration From c2085f339bcef40cd4898f1449e06d4778703dd5 Mon Sep 17 00:00:00 2001 From: gregory Date: Thu, 18 Aug 2022 11:43:51 -0700 Subject: [PATCH 5/9] Fix test failure --- .../ESIMD/LowerESIMDKernelAttrs.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp index ae521bed7b2da..26de794189f54 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp @@ -24,14 +24,17 @@ SYCLLowerESIMDKernelAttrPass::run(Module &M, ModuleAnalysisManager &MAM) { bool Modified = false; for (Function &F : M) { if (llvm::esimd::isESIMD(F)) { - llvm::esimd::traverseCallgraphUp(&F, [&](Function *GraphNode) { - if (!llvm::esimd::isESIMD(*GraphNode)) { - GraphNode->setMetadata( - llvm::esimd::ATTR_ESIMD_KERNEL, - llvm::MDNode::get(GraphNode->getContext(), {})); - Modified = true; - } - }); + llvm::esimd::traverseCallgraphUp( + &F, + [&](Function *GraphNode) { + if (!llvm::esimd::isESIMD(*GraphNode)) { + GraphNode->setMetadata( + llvm::esimd::ATTR_ESIMD_KERNEL, + llvm::MDNode::get(GraphNode->getContext(), {})); + Modified = true; + } + }, + false); } } return Modified ? PreservedAnalyses::none() : PreservedAnalyses::all(); From 73c200d7e56bb73122ae0c24028e2d7a19e78d5a Mon Sep 17 00:00:00 2001 From: gregory Date: Thu, 18 Aug 2022 13:40:37 -0700 Subject: [PATCH 6/9] Address PR comments --- .../llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h | 2 +- .../llvm/SYCLLowerIR/ESIMD/LowerESIMD.h | 4 +- llvm/lib/Passes/PassRegistry.def | 283 ++++++++++-------- llvm/lib/SYCLLowerIR/CMakeLists.txt | 15 +- llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp | 2 +- .../ESIMD/LowerESIMDKernelAttrs.cpp | 5 +- llvm/tools/sycl-post-link/sycl-post-link.cpp | 2 +- 7 files changed, 175 insertions(+), 138 deletions(-) diff --git a/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h b/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h index 6d5de877d3518..8a2df48e780a8 100644 --- a/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h +++ b/llvm/include/llvm/SYCLLowerIR/ESIMD/ESIMDUtils.h @@ -16,7 +16,7 @@ namespace llvm { namespace esimd { constexpr char ATTR_DOUBLE_GRF[] = "esimd-double-grf"; -constexpr char ATTR_ESIMD_KERNEL[] = "sycl_explicit_simd"; +constexpr char ESIMD_MARKER_MD[] = "sycl_explicit_simd"; using CallGraphNodeAction = std::function; void traverseCallgraphUp(llvm::Function *F, CallGraphNodeAction NodeF, diff --git a/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h b/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h index ed1749dc78f96..72fc59fcd8932 100644 --- a/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h +++ b/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h @@ -77,8 +77,8 @@ class SYCLLowerESIMDKernelPropsPass }; // Fixes ESIMD Kernel attributes for wrapper functions for ESIMD kernels -class SYCLLowerESIMDKernelAttrPass - : public PassInfoMixin { +class SYCLFixupESIMDKernelWrapperAttrPass + : public PassInfoMixin { public: PreservedAnalyses run(Module &M, ModuleAnalysisManager &); }; diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 387b6c7281f24..120b7e4c3c722 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -66,12 +66,11 @@ MODULE_PASS("globalsplit", GlobalSplitPass()) MODULE_PASS("hotcoldsplit", HotColdSplittingPass()) MODULE_PASS("inferattrs", InferFunctionAttrsPass()) MODULE_PASS("inliner-wrapper", ModuleInlinerWrapperPass()) -MODULE_PASS("inliner-ml-advisor-release", - ModuleInlinerWrapperPass(getInlineParams(), true, {}, - InliningAdvisorMode::Release, 0)) +MODULE_PASS("inliner-ml-advisor-release", ModuleInlinerWrapperPass(getInlineParams(), true, {}, InliningAdvisorMode::Release, 0)) MODULE_PASS("print", InlineAdvisorAnalysisPrinterPass(dbgs())) -MODULE_PASS("inliner-wrapper-no-mandatory-first", - ModuleInlinerWrapperPass(getInlineParams(), false)) +MODULE_PASS("inliner-wrapper-no-mandatory-first", ModuleInlinerWrapperPass( + getInlineParams(), + false)) MODULE_PASS("insert-gcov-profiling", GCOVProfilerPass()) MODULE_PASS("instrorderfile", InstrOrderFilePass()) MODULE_PASS("instrprof", InstrProfiling()) @@ -96,8 +95,7 @@ MODULE_PASS("print-callgraph", CallGraphPrinterPass(dbgs())) MODULE_PASS("print", PrintModulePass(dbgs())) MODULE_PASS("print-lcg", LazyCallGraphPrinterPass(dbgs())) MODULE_PASS("print-lcg-dot", LazyCallGraphDOTPrinterPass(dbgs())) -MODULE_PASS("print-must-be-executed-contexts", - MustBeExecutedContextPrinterPass(dbgs())) +MODULE_PASS("print-must-be-executed-contexts", MustBeExecutedContextPrinterPass(dbgs())) MODULE_PASS("print-stack-safety", StackSafetyGlobalPrinterPass(dbgs())) MODULE_PASS("print", ModuleDebugInfoPrinterPass(dbgs())) MODULE_PASS("recompute-globalsaa", RecomputeGlobalsAAPass()) @@ -107,8 +105,7 @@ MODULE_PASS("rewrite-symbols", RewriteSymbolPass()) MODULE_PASS("rpo-function-attrs", ReversePostOrderFunctionAttrsPass()) MODULE_PASS("sample-profile", SampleProfileLoaderPass()) MODULE_PASS("scc-oz-module-inliner", - buildInlinerPipeline(OptimizationLevel::Oz, - ThinOrFullLTOPhase::None)) + buildInlinerPipeline(OptimizationLevel::Oz, ThinOrFullLTOPhase::None)) MODULE_PASS("strip", StripSymbolsPass()) MODULE_PASS("strip-dead-debug-info", StripDeadDebugInfoPass()) MODULE_PASS("pseudo-probe", SampleProfileProbePass(TM)) @@ -138,30 +135,35 @@ MODULE_PASS("SYCLMutatePrintfAddrspace", SYCLMutatePrintfAddrspacePass()) MODULE_PASS("SPIRITTAnnotations", SPIRITTAnnotationsPass()) MODULE_PASS("deadargelim-sycl", DeadArgumentEliminationSYCLPass()) MODULE_PASS("sycllowerwglocalmemory", SYCLLowerWGLocalMemoryPass()) -MODULE_PASS("lower-esimd-kernel-attrs", SYCLLowerESIMDKernelAttrPass()) +MODULE_PASS("lower-esimd-kernel-attrs", SYCLFixupESIMDKernelWrapperAttrPass()) #undef MODULE_PASS #ifndef MODULE_PASS_WITH_PARAMS #define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -MODULE_PASS_WITH_PARAMS( - "loop-extract", "LoopExtractorPass", - [](bool Single) { - if (Single) - return LoopExtractorPass(1); - return LoopExtractorPass(); - }, - parseLoopExtractorPassOptions, "single") -MODULE_PASS_WITH_PARAMS( - "hwasan", "HWAddressSanitizerPass", - [](HWAddressSanitizerOptions Opts) { return HWAddressSanitizerPass(Opts); }, - parseHWASanPassOptions, "kernel;recover") -MODULE_PASS_WITH_PARAMS( - "asan-module", "ModuleAddressSanitizerPass", - [](AddressSanitizerOptions Opts) { - return ModuleAddressSanitizerPass(Opts); - }, - parseASanPassOptions, "kernel") +MODULE_PASS_WITH_PARAMS("loop-extract", + "LoopExtractorPass", + [](bool Single) { + if (Single) + return LoopExtractorPass(1); + return LoopExtractorPass(); + }, + parseLoopExtractorPassOptions, + "single") +MODULE_PASS_WITH_PARAMS("hwasan", + "HWAddressSanitizerPass", + [](HWAddressSanitizerOptions Opts) { + return HWAddressSanitizerPass(Opts); + }, + parseHWASanPassOptions, + "kernel;recover") +MODULE_PASS_WITH_PARAMS("asan-module", + "ModuleAddressSanitizerPass", + [](AddressSanitizerOptions Opts) { + return ModuleAddressSanitizerPass(Opts); + }, + parseASanPassOptions, + "kernel") #undef MODULE_PASS_WITH_PARAMS #ifndef CGSCC_ANALYSIS @@ -186,14 +188,20 @@ CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass()) #ifndef CGSCC_PASS_WITH_PARAMS #define CGSCC_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -CGSCC_PASS_WITH_PARAMS( - "inline", "InlinerPass", - [](bool OnlyMandatory) { return InlinerPass(OnlyMandatory); }, - parseInlinerPassOptions, "only-mandatory") -CGSCC_PASS_WITH_PARAMS( - "coro-split", "CoroSplitPass", - [](bool OptimizeFrame) { return CoroSplitPass(OptimizeFrame); }, - parseCoroSplitPassOptions, "reuse-storage") +CGSCC_PASS_WITH_PARAMS("inline", + "InlinerPass", + [](bool OnlyMandatory) { + return InlinerPass(OnlyMandatory); + }, + parseInlinerPassOptions, + "only-mandatory") +CGSCC_PASS_WITH_PARAMS("coro-split", + "CoroSplitPass", + [](bool OptimizeFrame) { + return CoroSplitPass(OptimizeFrame); + }, + parseCoroSplitPassOptions, + "reuse-storage") #undef CGSCC_PASS_WITH_PARAMS #ifndef FUNCTION_ANALYSIS @@ -220,10 +228,8 @@ FUNCTION_ANALYSIS("regions", RegionInfoAnalysis()) FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis()) FUNCTION_ANALYSIS("opt-remark-emit", OptimizationRemarkEmitterAnalysis()) FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis()) -FUNCTION_ANALYSIS("should-not-run-function-passes", - ShouldNotRunFunctionPassesAnalysis()) -FUNCTION_ANALYSIS("should-run-extra-vector-passes", - ShouldRunExtraVectorPasses()) +FUNCTION_ANALYSIS("should-not-run-function-passes", ShouldNotRunFunctionPassesAnalysis()) +FUNCTION_ANALYSIS("should-run-extra-vector-passes", ShouldRunExtraVectorPasses()) FUNCTION_ANALYSIS("stack-safety-local", StackSafetyAnalysis()) FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis()) FUNCTION_ANALYSIS("targetir", @@ -343,7 +349,7 @@ FUNCTION_PASS("print", DominanceFrontierPrinterPass(dbgs())) FUNCTION_PASS("print", FunctionPropertiesPrinterPass(dbgs())) FUNCTION_PASS("print", InlineCostAnnotationPrinterPass(dbgs())) FUNCTION_PASS("print", - InlineSizeEstimatorAnalysisPrinterPass(dbgs())) + InlineSizeEstimatorAnalysisPrinterPass(dbgs())) FUNCTION_PASS("print", LoopPrinterPass(dbgs())) FUNCTION_PASS("print", MemorySSAPrinterPass(dbgs())) FUNCTION_PASS("print", MemorySSAWalkerPrinterPass(dbgs())) @@ -361,8 +367,7 @@ FUNCTION_PASS("redundant-dbg-inst-elim", RedundantDbgInstEliminationPass()) FUNCTION_PASS("reg2mem", RegToMemPass()) FUNCTION_PASS("scalarize-masked-mem-intrin", ScalarizeMaskedMemIntrinPass()) FUNCTION_PASS("scalarizer", ScalarizerPass()) -FUNCTION_PASS("separate-const-offset-from-gep", - SeparateConstOffsetFromGEPPass()) +FUNCTION_PASS("separate-const-offset-from-gep", SeparateConstOffsetFromGEPPass()) FUNCTION_PASS("sccp", SCCPPass()) FUNCTION_PASS("sink", SinkingPass()) FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass()) @@ -394,74 +399,99 @@ FUNCTION_PASS("ESIMDLowerLoadStore", ESIMDLowerLoadStorePass()) #ifndef FUNCTION_PASS_WITH_PARAMS #define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -FUNCTION_PASS_WITH_PARAMS( - "early-cse", "EarlyCSEPass", - [](bool UseMemorySSA) { return EarlyCSEPass(UseMemorySSA); }, - parseEarlyCSEPassOptions, "memssa") -FUNCTION_PASS_WITH_PARAMS( - "ee-instrument", "EntryExitInstrumenterPass", - [](bool PostInlining) { return EntryExitInstrumenterPass(PostInlining); }, - parseEntryExitInstrumenterPassOptions, "post-inline") -FUNCTION_PASS_WITH_PARAMS( - "lower-matrix-intrinsics", "LowerMatrixIntrinsicsPass", - [](bool Minimal) { return LowerMatrixIntrinsicsPass(Minimal); }, - parseLowerMatrixIntrinsicsPassOptions, "minimal") -FUNCTION_PASS_WITH_PARAMS( - "loop-unroll", "LoopUnrollPass", - [](LoopUnrollOptions Opts) { return LoopUnrollPass(Opts); }, - parseLoopUnrollOptions, - "O0;O1;O2;O3;full-unroll-max=N;" - "no-partial;partial;" - "no-peeling;peeling;" - "no-profile-peeling;profile-peeling;" - "no-runtime;runtime;" - "no-upperbound;upperbound") -FUNCTION_PASS_WITH_PARAMS( - "msan", "MemorySanitizerPass", - [](MemorySanitizerOptions Opts) { return MemorySanitizerPass(Opts); }, - parseMSanPassOptions, "recover;kernel;eager-checks;track-origins=N") -FUNCTION_PASS_WITH_PARAMS( - "simplifycfg", "SimplifyCFGPass", - [](SimplifyCFGOptions Opts) { return SimplifyCFGPass(Opts); }, - parseSimplifyCFGOptions, - "no-forward-switch-cond;forward-switch-cond;" - "no-switch-range-to-icmp;switch-range-to-icmp;" - "no-switch-to-lookup;switch-to-lookup;" - "no-keep-loops;keep-loops;" - "no-hoist-common-insts;hoist-common-insts;" - "no-sink-common-insts;sink-common-insts;" - "bonus-inst-threshold=N") -FUNCTION_PASS_WITH_PARAMS( - "loop-vectorize", "LoopVectorizePass", - [](LoopVectorizeOptions Opts) { return LoopVectorizePass(Opts); }, - parseLoopVectorizeOptions, - "no-interleave-forced-only;interleave-forced-only;" - "no-vectorize-forced-only;vectorize-forced-only") -FUNCTION_PASS_WITH_PARAMS( - "mldst-motion", "MergedLoadStoreMotionPass", - [](MergedLoadStoreMotionOptions Opts) { - return MergedLoadStoreMotionPass(Opts); - }, - parseMergedLoadStoreMotionOptions, "no-split-footer-bb;split-footer-bb") -FUNCTION_PASS_WITH_PARAMS( - "gvn", "GVNPass", [](GVNOptions Opts) { return GVNPass(Opts); }, - parseGVNOptions, - "no-pre;pre;" - "no-load-pre;load-pre;" - "no-split-backedge-load-pre;split-backedge-load-pre;" - "no-memdep;memdep") -FUNCTION_PASS_WITH_PARAMS( - "print", "StackLifetimePrinterPass", - [](StackLifetime::LivenessType Type) { - return StackLifetimePrinterPass(dbgs(), Type); - }, - parseStackLifetimeOptions, "may;must") -FUNCTION_PASS_WITH_PARAMS( - "print", "DependenceAnalysisPrinterPass", - [](bool NormalizeResults) { - return DependenceAnalysisPrinterPass(dbgs(), NormalizeResults); - }, - parseDependenceAnalysisPrinterOptions, "normalized-results") +FUNCTION_PASS_WITH_PARAMS("early-cse", + "EarlyCSEPass", + [](bool UseMemorySSA) { + return EarlyCSEPass(UseMemorySSA); + }, + parseEarlyCSEPassOptions, + "memssa") +FUNCTION_PASS_WITH_PARAMS("ee-instrument", + "EntryExitInstrumenterPass", + [](bool PostInlining) { + return EntryExitInstrumenterPass(PostInlining); + }, + parseEntryExitInstrumenterPassOptions, + "post-inline") +FUNCTION_PASS_WITH_PARAMS("lower-matrix-intrinsics", + "LowerMatrixIntrinsicsPass", + [](bool Minimal) { + return LowerMatrixIntrinsicsPass(Minimal); + }, + parseLowerMatrixIntrinsicsPassOptions, + "minimal") +FUNCTION_PASS_WITH_PARAMS("loop-unroll", + "LoopUnrollPass", + [](LoopUnrollOptions Opts) { + return LoopUnrollPass(Opts); + }, + parseLoopUnrollOptions, + "O0;O1;O2;O3;full-unroll-max=N;" + "no-partial;partial;" + "no-peeling;peeling;" + "no-profile-peeling;profile-peeling;" + "no-runtime;runtime;" + "no-upperbound;upperbound") +FUNCTION_PASS_WITH_PARAMS("msan", + "MemorySanitizerPass", + [](MemorySanitizerOptions Opts) { + return MemorySanitizerPass(Opts); + }, + parseMSanPassOptions, + "recover;kernel;eager-checks;track-origins=N") +FUNCTION_PASS_WITH_PARAMS("simplifycfg", + "SimplifyCFGPass", + [](SimplifyCFGOptions Opts) { + return SimplifyCFGPass(Opts); + }, + parseSimplifyCFGOptions, + "no-forward-switch-cond;forward-switch-cond;" + "no-switch-range-to-icmp;switch-range-to-icmp;" + "no-switch-to-lookup;switch-to-lookup;" + "no-keep-loops;keep-loops;" + "no-hoist-common-insts;hoist-common-insts;" + "no-sink-common-insts;sink-common-insts;" + "bonus-inst-threshold=N" + ) +FUNCTION_PASS_WITH_PARAMS("loop-vectorize", + "LoopVectorizePass", + [](LoopVectorizeOptions Opts) { + return LoopVectorizePass(Opts); + }, + parseLoopVectorizeOptions, + "no-interleave-forced-only;interleave-forced-only;" + "no-vectorize-forced-only;vectorize-forced-only") +FUNCTION_PASS_WITH_PARAMS("mldst-motion", + "MergedLoadStoreMotionPass", + [](MergedLoadStoreMotionOptions Opts) { + return MergedLoadStoreMotionPass(Opts); + }, + parseMergedLoadStoreMotionOptions, + "no-split-footer-bb;split-footer-bb") +FUNCTION_PASS_WITH_PARAMS("gvn", + "GVNPass", + [](GVNOptions Opts) { + return GVNPass(Opts); + }, + parseGVNOptions, + "no-pre;pre;" + "no-load-pre;load-pre;" + "no-split-backedge-load-pre;split-backedge-load-pre;" + "no-memdep;memdep") +FUNCTION_PASS_WITH_PARAMS("print", + "StackLifetimePrinterPass", + [](StackLifetime::LivenessType Type) { + return StackLifetimePrinterPass(dbgs(), Type); + }, + parseStackLifetimeOptions, + "may;must") +FUNCTION_PASS_WITH_PARAMS("print", + "DependenceAnalysisPrinterPass", + [](bool NormalizeResults) { + return DependenceAnalysisPrinterPass(dbgs(), NormalizeResults); + }, + parseDependenceAnalysisPrinterOptions, + "normalized-results") #undef FUNCTION_PASS_WITH_PARAMS #ifndef LOOPNEST_PASS @@ -514,18 +544,25 @@ LOOP_PASS("loop-versioning-licm", LoopVersioningLICMPass()) #ifndef LOOP_PASS_WITH_PARAMS #define LOOP_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) #endif -LOOP_PASS_WITH_PARAMS( - "simple-loop-unswitch", "SimpleLoopUnswitchPass", - [](std::pair Params) { - return SimpleLoopUnswitchPass(Params.first, Params.second); - }, - parseLoopUnswitchOptions, "nontrivial;no-nontrivial;trivial;no-trivial") +LOOP_PASS_WITH_PARAMS("simple-loop-unswitch", + "SimpleLoopUnswitchPass", + [](std::pair Params) { + return SimpleLoopUnswitchPass(Params.first, Params.second); + }, + parseLoopUnswitchOptions, + "nontrivial;no-nontrivial;trivial;no-trivial") -LOOP_PASS_WITH_PARAMS( - "licm", "LICMPass", [](LICMOptions Params) { return LICMPass(Params); }, - parseLICMOptions, "allowspeculation"); +LOOP_PASS_WITH_PARAMS("licm", "LICMPass", + [](LICMOptions Params) { + return LICMPass(Params); + }, + parseLICMOptions, + "allowspeculation"); -LOOP_PASS_WITH_PARAMS( - "lnicm", "LNICMPass", [](LICMOptions Params) { return LNICMPass(Params); }, - parseLICMOptions, "allowspeculation"); +LOOP_PASS_WITH_PARAMS("lnicm", "LNICMPass", + [](LICMOptions Params) { + return LNICMPass(Params); + }, + parseLICMOptions, + "allowspeculation"); #undef LOOP_PASS_WITH_PARAMS diff --git a/llvm/lib/SYCLLowerIR/CMakeLists.txt b/llvm/lib/SYCLLowerIR/CMakeLists.txt index 23654c39e7f76..8ad96a6690d2d 100644 --- a/llvm/lib/SYCLLowerIR/CMakeLists.txt +++ b/llvm/lib/SYCLLowerIR/CMakeLists.txt @@ -1,4 +1,4 @@ -if (${CMAKE_VERSION} VERSION_LESS 3.14) +if(${CMAKE_VERSION} VERSION_LESS 3.14) macro(FetchContent_MakeAvailable NAME) FetchContent_GetProperties(${NAME}) if(NOT ${NAME}_POPULATED) @@ -8,14 +8,14 @@ if (${CMAKE_VERSION} VERSION_LESS 3.14) endmacro() endif() -#Lowering of SYCL ESIMD kernels depends on vc - intrinsics -#NOTE : could have been added earlier from llvm / projects +# Lowering of SYCL ESIMD kernels depends on vc-intrinsics +# NOTE: could have been added earlier from llvm/projects if (NOT TARGET LLVMGenXIntrinsics) if (NOT DEFINED LLVMGenXIntrinsics_SOURCE_DIR) set(LLVMGenXIntrinsics_GIT_REPO https://github.com/intel/vc-intrinsics.git) -#Author : Haohai Wen < haohai.wen @intel.com> -#Date : Fri Jun 10 03 : 46 : 22 2022 + 0000 -#Format InstructionSimplify names + # Author: Haohai Wen + # Date: Fri Jun 10 03:46:22 2022 +0000 + # Format InstructionSimplify names set(LLVMGenXIntrinsics_GIT_TAG abce9184b7a3a7fe1b02289b9285610d9dc45465) message(STATUS "vc-intrinsics repo is missing. Will try to download it from ${LLVMGenXIntrinsics_GIT_REPO}") @@ -30,7 +30,7 @@ if (NOT TARGET LLVMGenXIntrinsics) set(LLVMGenXIntrinsics_SOURCE_DIR ${vc-intrinsics_SOURCE_DIR}) set(LLVMGenXIntrinsics_BINARY_DIR ${vc-intrinsics_BINARY_DIR}) else (NOT DEFINED LLVMGenXIntrinsics_SOURCE_DIR) -#- DLLVMGenXIntrinsics_SOURCE_DIR is provided + # -DLLVMGenXIntrinsics_SOURCE_DIR is provided message(STATUS "vc-intrinsics are added manually ${LLVMGenXIntrinsics_SOURCE_DIR}") set(LLVMGenXIntrinsics_BINARY_DIR ${CMAKE_BINARY_DIR}/vc-intrinsics-build) @@ -73,7 +73,6 @@ add_llvm_component_library(LLVMSYCLLowerIR LLVMGenXIntrinsics LLVMDemangle LLVMTransformUtils - LINK_LIBS LLVMGenXIntrinsics LLVMDemangle diff --git a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp index 5be29125e77bb..ccfa154166827 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp @@ -70,7 +70,7 @@ void traverseCallgraphUp(llvm::Function *F, CallGraphNodeAction ActionF, } bool isESIMD(const Function &F) { - return F.getMetadata(ATTR_ESIMD_KERNEL) != nullptr; + return F.getMetadata(ESIMD_MARKER_MD) != nullptr; } bool isESIMDKernel(const Function &F) { diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp index 26de794189f54..ead4dee8737f8 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp @@ -20,7 +20,8 @@ using namespace llvm; namespace llvm { PreservedAnalyses -SYCLLowerESIMDKernelAttrPass::run(Module &M, ModuleAnalysisManager &MAM) { +SYCLFixupESIMDKernelWrapperAttrPass::run(Module &M, + ModuleAnalysisManager &MAM) { bool Modified = false; for (Function &F : M) { if (llvm::esimd::isESIMD(F)) { @@ -29,7 +30,7 @@ SYCLLowerESIMDKernelAttrPass::run(Module &M, ModuleAnalysisManager &MAM) { [&](Function *GraphNode) { if (!llvm::esimd::isESIMD(*GraphNode)) { GraphNode->setMetadata( - llvm::esimd::ATTR_ESIMD_KERNEL, + llvm::esimd::ESIMD_MARKER_MD, llvm::MDNode::get(GraphNode->getContext(), {})); Modified = true; } diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index 660c727648e0e..dcf517f7ad2a5 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -667,7 +667,7 @@ processInputModule(std::unique_ptr M) { // Propagate ESIMD attribute to wrapper functions to prevent // spurious splits and kernel link errors. - Modified |= runModulePass(*M); + Modified |= runModulePass(*M); // After linking device bitcode "llvm.used" holds references to the kernels // that are defined in the device image. But after splitting device image into From 917b2bbdcb841be78b31d54a774106649ce1dcc6 Mon Sep 17 00:00:00 2001 From: gregory Date: Fri, 19 Aug 2022 10:10:32 -0700 Subject: [PATCH 7/9] Address PR comments --- llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h | 4 ++-- llvm/lib/Passes/PassRegistry.def | 2 +- llvm/lib/SYCLLowerIR/CMakeLists.txt | 2 +- llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp | 3 +-- llvm/tools/sycl-post-link/sycl-post-link.cpp | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h b/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h index 72fc59fcd8932..fb59621add194 100644 --- a/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h +++ b/llvm/include/llvm/SYCLLowerIR/ESIMD/LowerESIMD.h @@ -77,8 +77,8 @@ class SYCLLowerESIMDKernelPropsPass }; // Fixes ESIMD Kernel attributes for wrapper functions for ESIMD kernels -class SYCLFixupESIMDKernelWrapperAttrPass - : public PassInfoMixin { +class SYCLFixupESIMDKernelWrapperMDPass + : public PassInfoMixin { public: PreservedAnalyses run(Module &M, ModuleAnalysisManager &); }; diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 120b7e4c3c722..0202b23c6aa92 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -135,7 +135,7 @@ MODULE_PASS("SYCLMutatePrintfAddrspace", SYCLMutatePrintfAddrspacePass()) MODULE_PASS("SPIRITTAnnotations", SPIRITTAnnotationsPass()) MODULE_PASS("deadargelim-sycl", DeadArgumentEliminationSYCLPass()) MODULE_PASS("sycllowerwglocalmemory", SYCLLowerWGLocalMemoryPass()) -MODULE_PASS("lower-esimd-kernel-attrs", SYCLFixupESIMDKernelWrapperAttrPass()) +MODULE_PASS("lower-esimd-kernel-attrs", SYCLFixupESIMDKernelWrapperMDPass()) #undef MODULE_PASS #ifndef MODULE_PASS_WITH_PARAMS diff --git a/llvm/lib/SYCLLowerIR/CMakeLists.txt b/llvm/lib/SYCLLowerIR/CMakeLists.txt index 8ad96a6690d2d..c8af40596224e 100644 --- a/llvm/lib/SYCLLowerIR/CMakeLists.txt +++ b/llvm/lib/SYCLLowerIR/CMakeLists.txt @@ -77,7 +77,7 @@ add_llvm_component_library(LLVMSYCLLowerIR LLVMGenXIntrinsics LLVMDemangle LLVMTransformUtils - + LINK_COMPONENTS Analysis Core diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp index ead4dee8737f8..91b969fcd106f 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMDKernelAttrs.cpp @@ -20,8 +20,7 @@ using namespace llvm; namespace llvm { PreservedAnalyses -SYCLFixupESIMDKernelWrapperAttrPass::run(Module &M, - ModuleAnalysisManager &MAM) { +SYCLFixupESIMDKernelWrapperMDPass::run(Module &M, ModuleAnalysisManager &MAM) { bool Modified = false; for (Function &F : M) { if (llvm::esimd::isESIMD(F)) { diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index dcf517f7ad2a5..3926248b8bfeb 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -667,7 +667,7 @@ processInputModule(std::unique_ptr M) { // Propagate ESIMD attribute to wrapper functions to prevent // spurious splits and kernel link errors. - Modified |= runModulePass(*M); + Modified |= runModulePass(*M); // After linking device bitcode "llvm.used" holds references to the kernels // that are defined in the device image. But after splitting device image into From 37ac50c66ac024df81dd6eaa7bd1f172c4464040 Mon Sep 17 00:00:00 2001 From: gregory Date: Fri, 19 Aug 2022 10:14:36 -0700 Subject: [PATCH 8/9] Remove spurious change --- llvm/lib/SYCLLowerIR/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/llvm/lib/SYCLLowerIR/CMakeLists.txt b/llvm/lib/SYCLLowerIR/CMakeLists.txt index c8af40596224e..21a5786bde3d7 100644 --- a/llvm/lib/SYCLLowerIR/CMakeLists.txt +++ b/llvm/lib/SYCLLowerIR/CMakeLists.txt @@ -73,6 +73,7 @@ add_llvm_component_library(LLVMSYCLLowerIR LLVMGenXIntrinsics LLVMDemangle LLVMTransformUtils + LINK_LIBS LLVMGenXIntrinsics LLVMDemangle From e1656794e05df97b3d41f67d6af7034d4680b59d Mon Sep 17 00:00:00 2001 From: gregory Date: Fri, 19 Aug 2022 14:32:47 -0700 Subject: [PATCH 9/9] Fix test failure --- llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp index ccfa154166827..2f45a8407197b 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDUtils.cpp @@ -54,9 +54,10 @@ void traverseCallgraphUp(llvm::Function *F, CallGraphNodeAction ActionF, } else { auto *CI = cast(FCall); - if ((CI->getCalledFunction() != CurF) && ErrorOnNonCallUse) { + if ((CI->getCalledFunction() != CurF)) { // CurF is used in a call, but not as the callee. - llvm::report_fatal_error(ErrMsg); + if (ErrorOnNonCallUse) + llvm::report_fatal_error(ErrMsg); } else { auto FCaller = CI->getFunction();