diff --git a/llvm/include/llvm/Transforms/IPO/SCCP.h b/llvm/include/llvm/Transforms/IPO/SCCP.h --- a/llvm/include/llvm/Transforms/IPO/SCCP.h +++ b/llvm/include/llvm/Transforms/IPO/SCCP.h @@ -26,10 +26,36 @@ 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 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -835,6 +835,23 @@ 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 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -75,7 +75,6 @@ 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 @@ }, 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 --- a/llvm/lib/Transforms/IPO/SCCP.cpp +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -42,9 +42,6 @@ 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 @@ 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 @@ // Solve for constants. Solver.solveWhileResolvedUndefsIn(M); - if (SpecializeFunctions) { + if (IsFuncSpecEnabled) { unsigned Iters = 0; while (Iters++ < FuncSpecializationMaxIters && Specializer.run()); } @@ -225,7 +223,7 @@ 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 @@ 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 @@ 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 @@ ; 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 @@ ; 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- 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