diff --git a/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h b/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h --- a/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h +++ b/llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h @@ -64,6 +64,7 @@ Optional AllowRuntime; Optional AllowUpperBound; Optional AllowProfileBasedPeeling; + Optional Threshold; Optional FullUnrollMaxCount; int OptLevel; @@ -120,6 +121,12 @@ return *this; } + // Sets "cost threshold" tuning parameter for loop unrolling. + LoopUnrollOptions &setThreshold(unsigned T) { + Threshold = T; + return *this; + } + // Sets the max full unroll count. LoopUnrollOptions &setFullUnrollMaxCount(unsigned O) { FullUnrollMaxCount = O; 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 @@ -536,6 +536,15 @@ UnrollOpts.setOptLevel(OptLevel); continue; } + if (ParamName.consume_front("threshold=")) { + unsigned Threshold; + if (ParamName.getAsInteger(0, Threshold)) + return make_error( + formatv("invalid LoopUnrollPass parameter '{0}' ", ParamName).str(), + inconvertibleErrorCode()); + UnrollOpts.setThreshold(Threshold); + continue; + } if (ParamName.consume_front("full-unroll-max=")) { int Count; if (ParamName.getAsInteger(0, Count)) 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 @@ -401,7 +401,7 @@ return LoopUnrollPass(Opts); }, parseLoopUnrollOptions, - "O0;O1;O2;O3;full-unroll-max=N;" + "O0;O1;O2;O3;threshold=N;full-unroll-max=N;" "no-partial;partial;" "no-peeling;peeling;" "no-profile-peeling;profile-peeling;" diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp --- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -1602,8 +1602,8 @@ LoopUnrollResult Result = tryToUnrollLoop( &L, DT, &LI, SE, TTI, AC, ORE, BFI, PSI, /*PreserveLCSSA*/ true, UnrollOpts.OptLevel, UnrollOpts.OnlyWhenForced, - UnrollOpts.ForgetSCEV, /*Count*/ None, - /*Threshold*/ None, UnrollOpts.AllowPartial, UnrollOpts.AllowRuntime, + UnrollOpts.ForgetSCEV, /*Count*/ None, UnrollOpts.Threshold, + UnrollOpts.AllowPartial, UnrollOpts.AllowRuntime, UnrollOpts.AllowUpperBound, LocalAllowPeeling, UnrollOpts.AllowProfileBasedPeeling, UnrollOpts.FullUnrollMaxCount); Changed |= Result != LoopUnrollResult::Unmodified; @@ -1641,6 +1641,8 @@ if (UnrollOpts.AllowProfileBasedPeeling != None) OS << (UnrollOpts.AllowProfileBasedPeeling.getValue() ? "" : "no-") << "profile-peeling;"; + if (UnrollOpts.Threshold != None) + OS << "threshold=" << UnrollOpts.Threshold << ";"; if (UnrollOpts.FullUnrollMaxCount != None) OS << "full-unroll-max=" << UnrollOpts.FullUnrollMaxCount << ";"; OS << "O" << UnrollOpts.OptLevel; diff --git a/llvm/test/Other/new-pm-print-pipeline.ll b/llvm/test/Other/new-pm-print-pipeline.ll --- a/llvm/test/Other/new-pm-print-pipeline.ll +++ b/llvm/test/Other/new-pm-print-pipeline.ll @@ -31,8 +31,8 @@ ; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(lower-matrix-intrinsics<>,lower-matrix-intrinsics)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-9 ; CHECK-9: function(lower-matrix-intrinsics<>,lower-matrix-intrinsics) -; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(loop-unroll<>,loop-unroll,loop-unroll)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-10 -; CHECK-10: function(loop-unroll,loop-unroll,loop-unroll) +; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(loop-unroll<>,loop-unroll,loop-unroll)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-10 +; CHECK-10: function(loop-unroll,loop-unroll,loop-unroll) ; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(gvn<>,gvn,gvn)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-11 ; CHECK-11: function(gvn<>,gvn,gvn) diff --git a/llvm/test/Other/print-passes.ll b/llvm/test/Other/print-passes.ll --- a/llvm/test/Other/print-passes.ll +++ b/llvm/test/Other/print-passes.ll @@ -13,7 +13,7 @@ ; CHECK: Function passes: ; CHECK: no-op-function ; CHECK: Function passes with params: -; CHECK: loop-unroll +; CHECK: loop-unroll ; CHECK: Function analyses: ; CHECK: no-op-function ; CHECK: Function alias analyses: