From f952bc05fda6647bedadf552c5aa5b00672861fc Mon Sep 17 00:00:00 2001 From: Alexandros Lamprineas Date: Thu, 22 Dec 2022 17:44:06 +0000 Subject: [PATCH] [IPSCCP] Create a Pass parameter to control specialization of functions. Required for D140210 in order to disable FuncSpec at {Os, Oz} optimization levels. Differential Revision: https://reviews.llvm.org/D140564 --- llvm/include/llvm/Transforms/IPO/SCCP.h | 26 +++++++++++++++++++ llvm/lib/Passes/PassBuilder.cpp | 17 ++++++++++++ llvm/lib/Passes/PassRegistry.def | 8 +++++- llvm/lib/Transforms/IPO/SCCP.cpp | 19 +++++++------- .../bug52821-use-after-free.ll | 2 +- .../bug55000-read-uninitialized-value.ll | 2 +- .../compiler-crash-58759.ll | 2 +- .../function-specialization-always-inline.ll | 2 +- ...tion-specialization-constant-expression.ll | 2 +- ...ion-specialization-constant-expression2.ll | 2 +- ...ion-specialization-constant-expression3.ll | 2 +- ...ion-specialization-constant-expression4.ll | 2 +- ...ion-specialization-constant-expression5.ll | 2 +- ...nction-specialization-constant-integers.ll | 2 +- .../function-specialization-loop.ll | 2 +- .../function-specialization-minsize.ll | 2 +- .../function-specialization-minsize2.ll | 2 +- .../function-specialization-minsize3.ll | 2 +- .../function-specialization-nodup.ll | 2 +- .../function-specialization-nodup2.ll | 2 +- .../function-specialization-noexec.ll | 2 +- .../function-specialization-nonconst-glob.ll | 6 ++--- .../function-specialization-poison.ll | 2 +- .../function-specialization-recursive.ll | 6 ++--- .../function-specialization-recursive2.ll | 2 +- .../function-specialization-recursive3.ll | 2 +- .../function-specialization-recursive4.ll | 2 +- .../function-specialization-stats.ll | 2 +- .../function-specialization.ll | 10 ++++++- .../function-specialization2.ll | 8 +++--- .../function-specialization3.ll | 6 ++--- .../function-specialization4.ll | 4 +-- .../function-specialization5.ll | 2 +- .../get-possible-constants.ll | 2 +- .../FunctionSpecialization/global-rank.ll | 2 +- .../identical-specializations.ll | 2 +- .../FunctionSpecialization/literal-const.ll | 4 +-- .../no-spec-unused-arg.ll | 2 +- .../FunctionSpecialization/noinline.ll | 2 +- .../remove-dead-recursive-function.ll | 2 +- .../specialization-order.ll | 2 +- .../specialize-multiple-arguments.ll | 8 +++--- 42 files changed, 119 insertions(+), 63 deletions(-) diff --git a/llvm/include/llvm/Transforms/IPO/SCCP.h b/llvm/include/llvm/Transforms/IPO/SCCP.h index 3c40d44ca9de..c80a4bc75722 100644 --- a/llvm/include/llvm/Transforms/IPO/SCCP.h +++ b/llvm/include/llvm/Transforms/IPO/SCCP.h @@ -26,10 +26,36 @@ namespace llvm { class Module; +/// A set of parameters to control various transforms performed by IPSCCP pass. +/// Each of the boolean parameters can be set to: +/// true - enabling the transformation. +/// false - disabling the transformation. +/// Intended use is to create a default object, modify parameters with +/// additional setters and then pass it to IPSCCP. +struct IPSCCPOptions { + bool AllowFuncSpec; + + IPSCCPOptions(bool AllowFuncSpec = false) : AllowFuncSpec(AllowFuncSpec) {} + + /// Enables or disables Specialization of Functions. + IPSCCPOptions &setFuncSpec(bool FuncSpec) { + AllowFuncSpec = FuncSpec; + return *this; + } +}; + /// Pass to perform interprocedural constant propagation. class IPSCCPPass : public PassInfoMixin { + IPSCCPOptions Options; + public: + IPSCCPPass() = default; + + IPSCCPPass(IPSCCPOptions Options) : Options(Options) {} + PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + + bool isFuncSpecEnabled() const { return Options.AllowFuncSpec; } }; } // end namespace llvm diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 9093b65bbc06..f9182eea98a5 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -835,6 +835,23 @@ Expected parseGVNOptions(StringRef Params) { return Result; } +Expected parseIPSCCPOptions(StringRef Params) { + IPSCCPOptions Result; + while (!Params.empty()) { + StringRef ParamName; + std::tie(ParamName, Params) = Params.split(';'); + + bool Enable = !ParamName.consume_front("no-"); + if (ParamName == "func-spec") + Result.setFuncSpec(Enable); + else + return make_error( + formatv("invalid IPSCCP pass parameter '{0}' ", ParamName).str(), + inconvertibleErrorCode()); + } + return Result; +} + Expected parseSROAOptions(StringRef Params) { if (Params.empty() || Params == "modify-cfg") return SROAOptions::ModifyCFG; diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 4aec1b85c27b..64824b76e59e 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -75,7 +75,6 @@ MODULE_PASS("instrorderfile", InstrOrderFilePass()) MODULE_PASS("instrprof", InstrProfiling()) MODULE_PASS("internalize", InternalizePass()) MODULE_PASS("invalidate", InvalidateAllAnalysesPass()) -MODULE_PASS("ipsccp", IPSCCPPass()) MODULE_PASS("iroutliner", IROutlinerPass()) MODULE_PASS("print-ir-similarity", IRSimilarityAnalysisPrinterPass(dbgs())) MODULE_PASS("lower-global-dtors", LowerGlobalDtorsPass()) @@ -161,6 +160,13 @@ MODULE_PASS_WITH_PARAMS("msan", }, parseMSanPassOptions, "recover;kernel;eager-checks;track-origins=N") +MODULE_PASS_WITH_PARAMS("ipsccp", + "IPSCCPPass", + [](IPSCCPOptions Opts) { + return IPSCCPPass(Opts); + }, + parseIPSCCPOptions, + "no-func-spec;func-spec") #undef MODULE_PASS_WITH_PARAMS #ifndef CGSCC_ANALYSIS diff --git a/llvm/lib/Transforms/IPO/SCCP.cpp b/llvm/lib/Transforms/IPO/SCCP.cpp index 341550a7d5a0..b5df5a1ae1c2 100644 --- a/llvm/lib/Transforms/IPO/SCCP.cpp +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -42,9 +42,6 @@ STATISTIC(NumDeadBlocks , "Number of basic blocks unreachable"); STATISTIC(NumInstReplaced, "Number of instructions replaced with (simpler) instruction"); -static cl::opt SpecializeFunctions("specialize-functions", - cl::init(false), cl::Hidden, cl::desc("Enable function specialization")); - static cl::opt FuncSpecializationMaxIters( "func-specialization-max-iters", cl::init(1), cl::Hidden, cl::desc( "The maximum number of iterations function specialization is run")); @@ -114,7 +111,8 @@ static bool runIPSCCP( std::function GetTLI, std::function GetTTI, std::function GetAC, - function_ref getAnalysis) { + function_ref getAnalysis, + bool IsFuncSpecEnabled) { SCCPSolver Solver(DL, GetTLI, M.getContext()); FunctionSpecializer Specializer(Solver, M, FAM, GetTLI, GetTTI, GetAC); @@ -158,7 +156,7 @@ static bool runIPSCCP( // Solve for constants. Solver.solveWhileResolvedUndefsIn(M); - if (SpecializeFunctions) { + if (IsFuncSpecEnabled) { unsigned Iters = 0; while (Iters++ < FuncSpecializationMaxIters && Specializer.run()); } @@ -225,7 +223,7 @@ static bool runIPSCCP( NumInstRemoved, NumInstReplaced); } - DomTreeUpdater DTU = SpecializeFunctions && Specializer.isClonedFunction(&F) + DomTreeUpdater DTU = IsFuncSpecEnabled && Specializer.isClonedFunction(&F) ? DomTreeUpdater(DomTreeUpdater::UpdateStrategy::Lazy) : Solver.getDTU(F); @@ -391,15 +389,16 @@ PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) { auto GetAC = [&FAM](Function &F) -> AssumptionCache & { return FAM.getResult(F); }; - auto getAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn { + auto getAnalysis = [&FAM, this](Function &F) -> AnalysisResultsForFn { DominatorTree &DT = FAM.getResult(F); return { std::make_unique(F, DT, FAM.getResult(F)), &DT, FAM.getCachedResult(F), - SpecializeFunctions ? &FAM.getResult(F) : nullptr }; + isFuncSpecEnabled() ? &FAM.getResult(F) : nullptr }; }; - if (!runIPSCCP(M, DL, &FAM, GetTLI, GetTTI, GetAC, getAnalysis)) + if (!runIPSCCP(M, DL, &FAM, GetTLI, GetTTI, GetAC, getAnalysis, + isFuncSpecEnabled())) return PreservedAnalyses::all(); PreservedAnalyses PA; @@ -450,7 +449,7 @@ public: nullptr}; }; - return runIPSCCP(M, DL, nullptr, GetTLI, GetTTI, GetAC, getAnalysis); + return runIPSCCP(M, DL, nullptr, GetTLI, GetTTI, GetAC, getAnalysis, false); } void getAnalysisUsage(AnalysisUsage &AU) const override { diff --git a/llvm/test/Transforms/FunctionSpecialization/bug52821-use-after-free.ll b/llvm/test/Transforms/FunctionSpecialization/bug52821-use-after-free.ll index b2f284653b02..3892273aac8a 100644 --- a/llvm/test/Transforms/FunctionSpecialization/bug52821-use-after-free.ll +++ b/llvm/test/Transforms/FunctionSpecialization/bug52821-use-after-free.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -S < %s | FileCheck %s %mystruct = type { i32, [2 x i64] } diff --git a/llvm/test/Transforms/FunctionSpecialization/bug55000-read-uninitialized-value.ll b/llvm/test/Transforms/FunctionSpecialization/bug55000-read-uninitialized-value.ll index 664c152203be..bae203a202c8 100644 --- a/llvm/test/Transforms/FunctionSpecialization/bug55000-read-uninitialized-value.ll +++ b/llvm/test/Transforms/FunctionSpecialization/bug55000-read-uninitialized-value.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-max-iters=2 -func-specialization-max-clones=1 -function-specialization-for-literal-constant=true -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-max-iters=2 -func-specialization-max-clones=1 -function-specialization-for-literal-constant=true -S < %s | FileCheck %s declare hidden i1 @compare(ptr) align 2 declare hidden { i8, ptr } @getType(ptr) align 2 diff --git a/llvm/test/Transforms/FunctionSpecialization/compiler-crash-58759.ll b/llvm/test/Transforms/FunctionSpecialization/compiler-crash-58759.ll index fa04d15e1b83..98dfb6ed05d0 100644 --- a/llvm/test/Transforms/FunctionSpecialization/compiler-crash-58759.ll +++ b/llvm/test/Transforms/FunctionSpecialization/compiler-crash-58759.ll @@ -1,4 +1,4 @@ -; RUN: opt -S --passes='default' -specialize-functions < %s | FileCheck %s +; RUN: opt -S --passes="default,ipsccp" < %s | FileCheck %s define dso_local i32 @g0(i32 noundef %x) local_unnamed_addr { entry: diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-always-inline.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-always-inline.ll index 2d5b3bf1a5f4..bac810cf4215 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-always-inline.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-always-inline.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-avg-iters-cost=3 -func-specialization-size-threshold=10 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-avg-iters-cost=3 -func-specialization-size-threshold=10 -S < %s | FileCheck %s ; CHECK-NOT: foo.{{[0-9]+}} diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll index 5f57cfddf153..0950cac7be80 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll @@ -4,7 +4,7 @@ ; Note that this test case shows that function specialization pass would ; transform the function even if no specialization happened. -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s %struct = type { i8, i16, i32, i64, i64} @Global = internal constant %struct {i8 0, i16 1, i32 2, i64 3, i64 4} diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression2.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression2.ll index 726d8dfc664f..edd68e27b515 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression2.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression2.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; Check that we don't crash and specialise on a constant expression. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression3.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression3.ll index f3c63ec8844d..5e6feec776eb 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression3.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression3.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s define i32 @main() { ; CHECK-LABEL: @main( diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression4.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression4.ll index 7f5afd40f720..6b22858c7e19 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression4.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression4.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; Check that we don't crash and specialise on a function call with byval attribute. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression5.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression5.ll index 2c555abf3ed1..cc70df6b9fe2 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression5.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression5.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-on-address -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-on-address -S < %s | FileCheck %s ; Check that we don't crash and specialise on a scalar global variable with byval attribute. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-integers.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-integers.ll index bda21178a307..80a10ac35bc5 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-integers.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-integers.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -function-specialization-for-literal-constant=true -func-specialization-size-threshold=10 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -function-specialization-for-literal-constant=true -func-specialization-size-threshold=10 -S < %s | FileCheck %s ; Check that the literal constant parameter could be specialized. ; CHECK: @foo.1( diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-loop.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-loop.ll index c4f905edc28a..cb4674502ccf 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-loop.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-avg-iters-cost=5 -func-specialization-size-threshold=10 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-avg-iters-cost=5 -func-specialization-size-threshold=10 -S < %s | FileCheck %s ; Check that the loop depth results in a larger specialization bonus. ; CHECK: @foo.1( diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize.ll index 4e84a843bde9..6cc35403cc4e 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -S < %s | FileCheck %s ; CHECK-NOT: @compute.1 ; CHECK-NOT: @compute.2 diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll index 9430d4fd3ac4..6129a6ef5e6a 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize2.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-size-threshold=3 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-size-threshold=3 -S < %s | FileCheck %s ; Checks for callsites that have been annotated with MinSize. No specialisation ; expected here: diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll index 89f55d567c95..ae8b1b6e53fe 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-minsize3.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-size-threshold=3 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-size-threshold=3 -S < %s | FileCheck %s ; Checks for callsites that have been annotated with MinSize. We only expect ; specialisation for the call that does not have the attribute: diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup.ll index c6af1ec87f3d..8b0878477367 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; Function @foo has function attribute 'noduplicate', so check that we don't ; specialize it: diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup2.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup2.ll index 26115c5e8727..04e49e6e869d 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup2.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-nodup2.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; Check that function foo does not gets specialised as it contains an intrinsic ; that is marked as NoDuplicate. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-noexec.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-noexec.ll index e399d9eff303..90e76217ab92 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-noexec.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-noexec.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; The if.then block is not executed, so check that we don't specialise here. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll index 51cefe4c32d2..345bf952a12d 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-nonconst-glob.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-on-address=0 -S < %s | FileCheck %s -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-on-address=1 -S < %s | FileCheck %s --check-prefix=ON-ADDRESS +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-on-address=0 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-on-address=1 -S < %s | FileCheck %s --check-prefix=ON-ADDRESS ; Global B is not constant. We do not specialise on addresses unless we ; enable that: diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-poison.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-poison.ll index 7f2711ddac2a..1617f86aaa1f 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-poison.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-poison.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; Check that we don't crash and specialise on a poison value. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive.ll index 64d7a9c0e87a..c12e02e1ecc9 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive.ll @@ -1,6 +1,6 @@ -; RUN: opt -passes=ipsccp,inline,instcombine -specialize-functions -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s --check-prefix=ITERS2 -; RUN: opt -passes=ipsccp,inline,instcombine -specialize-functions -force-function-specialization -func-specialization-max-iters=3 -S < %s | FileCheck %s --check-prefix=ITERS3 -; RUN: opt -passes=ipsccp,inline,instcombine -specialize-functions -force-function-specialization -func-specialization-max-iters=4 -S < %s | FileCheck %s --check-prefix=ITERS4 +; RUN: opt -passes="ipsccp,inline,instcombine" -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s --check-prefix=ITERS2 +; RUN: opt -passes="ipsccp,inline,instcombine" -force-function-specialization -func-specialization-max-iters=3 -S < %s | FileCheck %s --check-prefix=ITERS3 +; RUN: opt -passes="ipsccp,inline,instcombine" -force-function-specialization -func-specialization-max-iters=4 -S < %s | FileCheck %s --check-prefix=ITERS4 @low = internal constant i32 0, align 4 @high = internal constant i32 6, align 4 diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive2.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive2.ll index c28b029728b0..9ab2328452d6 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive2.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive2.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s ; Volatile store preventing recursive specialisation: ; diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive3.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive3.ll index 6e6a64178e86..9956fe1fb963 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive3.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive3.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s ; Duplicate store preventing recursive specialisation: ; diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive4.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive4.ll index 53509f128f0b..6e3f6762d11a 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive4.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive4.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s ; Alloca is not an integer type: ; diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll index d380e38cfa75..42a7676cb54f 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll @@ -1,5 +1,5 @@ ; REQUIRES: asserts -; RUN: opt -stats -passes=ipsccp -specialize-functions -S -force-function-specialization < %s 2>&1 | FileCheck %s +; RUN: opt -stats -passes="ipsccp" -S -force-function-specialization < %s 2>&1 | FileCheck %s ; CHECK: 2 function-specialization - Number of functions specialized diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization.ll index afd1334fdd64..90b1aedc37a4 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization.ll @@ -1,4 +1,5 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-size-threshold=3 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-size-threshold=3 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-size-threshold=3 -S < %s | FileCheck %s --check-prefix=NOFSPEC define i64 @main(i64 %x, i1 %flag) { ; @@ -16,6 +17,10 @@ define i64 @main(i64 %x, i1 %flag) { ; CHECK-NEXT: ret i64 [[TMP2]] ; CHECK-NEXT: } ; +; NOFSPEC-LABEL: @main(i64 %x, i1 %flag) { +; NOFSPEC-NOT: call i64 @compute.{{[0-9]+}}( +; NOFSPEC: call i64 @compute( +; entry: br i1 %flag, label %plus, label %minus @@ -46,6 +51,9 @@ merge: ; CHECK-NEXT: ret i64 [[TMP0]] ; CHECK-NEXT: } ; +; NOFSPEC: define internal i64 @compute( +; NOFSPEC-NOT: define internal i64 @compute.{{[0-9]+}}( +; define internal i64 @compute(i64 %x, ptr %binop) { entry: %tmp0 = call i64 %binop(i64 %x) diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization2.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization2.ll index bf50e8501a91..d3344fdbfe27 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization2.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization2.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp,deadargelim -specialize-functions -force-function-specialization -S < %s | FileCheck %s -; RUN: opt -passes=ipsccp,deadargelim -specialize-functions -func-specialization-max-iters=1 -force-function-specialization -S < %s | FileCheck %s -; RUN: opt -passes=ipsccp,deadargelim -specialize-functions -func-specialization-max-iters=0 -force-function-specialization -S < %s | FileCheck %s --check-prefix=DISABLED -; RUN: opt -passes=ipsccp,deadargelim -specialize-functions -func-specialization-avg-iters-cost=1 -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp,deadargelim" -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp,deadargelim" -func-specialization-max-iters=1 -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp,deadargelim" -func-specialization-max-iters=0 -force-function-specialization -S < %s | FileCheck %s --check-prefix=DISABLED +; RUN: opt -passes="ipsccp,deadargelim" -func-specialization-avg-iters-cost=1 -force-function-specialization -S < %s | FileCheck %s ; DISABLED-NOT: @func.1( ; DISABLED-NOT: @func.2( diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization3.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization3.ll index 1ed1a8bf90b3..8625a82a07e9 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization3.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization3.ll @@ -1,8 +1,8 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-avg-iters-cost=3 -S < %s | \ +; RUN: opt -passes="ipsccp" -func-specialization-avg-iters-cost=3 -S < %s | \ ; RUN: FileCheck %s --check-prefixes=COMMON,DISABLED -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | \ +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | \ ; RUN: FileCheck %s --check-prefixes=COMMON,FORCE -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-avg-iters-cost=3 -force-function-specialization -S < %s | \ +; RUN: opt -passes="ipsccp" -func-specialization-avg-iters-cost=3 -force-function-specialization -S < %s | \ ; RUN: FileCheck %s --check-prefixes=COMMON,FORCE ; Test for specializing a constant global. diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization4.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization4.ll index 5d388e813855..8c00a466611b 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization4.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization4.ll @@ -1,7 +1,7 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization \ +; RUN: opt -passes="ipsccp" -force-function-specialization \ ; RUN: -func-specialization-max-clones=2 -S < %s | FileCheck %s -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization \ +; RUN: opt -passes="ipsccp" -force-function-specialization \ ; RUN: -func-specialization-max-clones=1 -S < %s | FileCheck %s --check-prefix=CONST1 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization5.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization5.ll index c4c4212d76b7..fd0557a9e27d 100644 --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization5.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization5.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s ; There's nothing to specialize here as both calls are the same, so check that: ; diff --git a/llvm/test/Transforms/FunctionSpecialization/get-possible-constants.ll b/llvm/test/Transforms/FunctionSpecialization/get-possible-constants.ll index 0d817f4e1cb7..9b14db5399f3 100644 --- a/llvm/test/Transforms/FunctionSpecialization/get-possible-constants.ll +++ b/llvm/test/Transforms/FunctionSpecialization/get-possible-constants.ll @@ -1,4 +1,4 @@ -; RUN: opt -S --passes=ipsccp -specialize-functions < %s | FileCheck %s +; RUN: opt -S --passes="ipsccp" < %s | FileCheck %s define dso_local i32 @p0(i32 noundef %x) { entry: %add = add nsw i32 %x, 1 diff --git a/llvm/test/Transforms/FunctionSpecialization/global-rank.ll b/llvm/test/Transforms/FunctionSpecialization/global-rank.ll index db799d6ce923..055a82003dba 100644 --- a/llvm/test/Transforms/FunctionSpecialization/global-rank.ll +++ b/llvm/test/Transforms/FunctionSpecialization/global-rank.ll @@ -1,4 +1,4 @@ -; RUN: opt -S --passes=ipsccp -specialize-functions -func-specialization-max-clones=1 < %s | FileCheck %s +; RUN: opt -S --passes="ipsccp" -func-specialization-max-clones=1 < %s | FileCheck %s define internal i32 @f(i32 noundef %x, ptr nocapture noundef readonly %p, ptr nocapture noundef readonly %q) noinline { entry: %call = tail call i32 %p(i32 noundef %x) diff --git a/llvm/test/Transforms/FunctionSpecialization/identical-specializations.ll b/llvm/test/Transforms/FunctionSpecialization/identical-specializations.ll index ff8341a58406..d2c6de3a8c03 100644 --- a/llvm/test/Transforms/FunctionSpecialization/identical-specializations.ll +++ b/llvm/test/Transforms/FunctionSpecialization/identical-specializations.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -force-function-specialization -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -force-function-specialization -S < %s | FileCheck %s define i64 @main(i64 %x, i64 %y, i1 %flag) { ; CHECK-LABEL: @main( diff --git a/llvm/test/Transforms/FunctionSpecialization/literal-const.ll b/llvm/test/Transforms/FunctionSpecialization/literal-const.ll index fb64b857a65c..824c719285a3 100644 --- a/llvm/test/Transforms/FunctionSpecialization/literal-const.ll +++ b/llvm/test/Transforms/FunctionSpecialization/literal-const.ll @@ -1,6 +1,6 @@ -; RUN: opt -S --passes=ipsccp -specialize-functions \ +; RUN: opt -S --passes="ipsccp" \ ; RUN: -force-function-specialization < %s | FileCheck %s -check-prefix CHECK-NOLIT -; RUN: opt -S --passes=ipsccp -specialize-functions \ +; RUN: opt -S --passes="ipsccp" \ ; RUN: -function-specialization-for-literal-constant \ ; RUN: -force-function-specialization < %s | FileCheck %s -check-prefix CHECK-LIT diff --git a/llvm/test/Transforms/FunctionSpecialization/no-spec-unused-arg.ll b/llvm/test/Transforms/FunctionSpecialization/no-spec-unused-arg.ll index a3698181e70f..17dfe9aa4066 100644 --- a/llvm/test/Transforms/FunctionSpecialization/no-spec-unused-arg.ll +++ b/llvm/test/Transforms/FunctionSpecialization/no-spec-unused-arg.ll @@ -1,4 +1,4 @@ -; RUN: opt -S --passes=ipsccp -specialize-functions -force-function-specialization -function-specialization-for-literal-constant < %s | FileCheck %s +; RUN: opt -S --passes="ipsccp" -force-function-specialization -function-specialization-for-literal-constant < %s | FileCheck %s define internal i32 @f(i32 %x, i32 %y) noinline { ret i32 %x } diff --git a/llvm/test/Transforms/FunctionSpecialization/noinline.ll b/llvm/test/Transforms/FunctionSpecialization/noinline.ll index fae5db2dfa29..863e6e74eb23 100644 --- a/llvm/test/Transforms/FunctionSpecialization/noinline.ll +++ b/llvm/test/Transforms/FunctionSpecialization/noinline.ll @@ -1,4 +1,4 @@ -; RUN: opt -S --passes=ipsccp -specialize-functions < %s | FileCheck %s +; RUN: opt -S --passes="ipsccp" < %s | FileCheck %s define dso_local i32 @p0(i32 noundef %x) { entry: %add = add nsw i32 %x, 1 diff --git a/llvm/test/Transforms/FunctionSpecialization/remove-dead-recursive-function.ll b/llvm/test/Transforms/FunctionSpecialization/remove-dead-recursive-function.ll index 2be6cd9d4085..6563f3b79e03 100644 --- a/llvm/test/Transforms/FunctionSpecialization/remove-dead-recursive-function.ll +++ b/llvm/test/Transforms/FunctionSpecialization/remove-dead-recursive-function.ll @@ -1,4 +1,4 @@ -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-size-threshold=3 -S < %s | FileCheck %s +; RUN: opt -passes="ipsccp" -func-specialization-size-threshold=3 -S < %s | FileCheck %s define i64 @main(i64 %x, i1 %flag) { entry: diff --git a/llvm/test/Transforms/FunctionSpecialization/specialization-order.ll b/llvm/test/Transforms/FunctionSpecialization/specialization-order.ll index 0ce526a6efe7..e8622f07f633 100644 --- a/llvm/test/Transforms/FunctionSpecialization/specialization-order.ll +++ b/llvm/test/Transforms/FunctionSpecialization/specialization-order.ll @@ -1,4 +1,4 @@ -; RUN: opt -S --passes=ipsccp,deadargelim -specialize-functions -force-function-specialization < %s | FileCheck %s +; RUN: opt -S --passes="ipsccp,deadargelim" -force-function-specialization < %s | FileCheck %s define dso_local i32 @add(i32 %x, i32 %y) { entry: %add = add nsw i32 %y, %x diff --git a/llvm/test/Transforms/FunctionSpecialization/specialize-multiple-arguments.ll b/llvm/test/Transforms/FunctionSpecialization/specialize-multiple-arguments.ll index 6ef938739262..35b65828052e 100644 --- a/llvm/test/Transforms/FunctionSpecialization/specialize-multiple-arguments.ll +++ b/llvm/test/Transforms/FunctionSpecialization/specialize-multiple-arguments.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-max-clones=0 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=NONE -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-max-clones=1 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=ONE -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-max-clones=2 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=TWO -; RUN: opt -passes=ipsccp -specialize-functions -func-specialization-max-clones=3 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=THREE +; RUN: opt -passes="ipsccp" -func-specialization-max-clones=0 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=NONE +; RUN: opt -passes="ipsccp" -func-specialization-max-clones=1 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=ONE +; RUN: opt -passes="ipsccp" -func-specialization-max-clones=2 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=TWO +; RUN: opt -passes="ipsccp" -func-specialization-max-clones=3 -func-specialization-size-threshold=14 -S < %s | FileCheck %s --check-prefix=THREE ; Make sure that we iterate correctly after sorting the specializations: ; FnSpecialization: Specializations for function compute -- 2.34.1