[llvm] r228434 - Use estimated number of optimized insns in unroll-threshold computation.
Michael Zolotukhin
mzolotukhin at apple.com
Mon Feb 9 12:49:40 PST 2015
Hi Hal,
Could you please take a look at the attached test? Does it cover the new features enough, or did I miss anything?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: full-unroll-heuristics.ll
Type: application/octet-stream
Size: 3248 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150209/e772af35/attachment.obj>
-------------- next part --------------
Thanks,
Michael
> On Feb 6, 2015, at 12:31 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>
> As you stated in your follow-up e-mail ;) -- this needs a test case.
>
> -Hal
>
> ----- Original Message -----
>> From: "Michael Zolotukhin" <mzolotukhin at apple.com>
>> To: llvm-commits at cs.uiuc.edu
>> Sent: Friday, February 6, 2015 2:20:40 PM
>> Subject: [llvm] r228434 - Use estimated number of optimized insns in unroll-threshold computation.
>>
>> Author: mzolotukhin
>> Date: Fri Feb 6 14:20:40 2015
>> New Revision: 228434
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=228434&view=rev
>> Log:
>> Use estimated number of optimized insns in unroll-threshold
>> computation.
>>
>> If complete-unroll could help us to optimize away N% of instructions,
>> we
>> might want to do this even if the final size would exceed loop-unroll
>> threshold. However, we don't want to unroll huge loop, and we are add
>> AbsoluteThreshold to avoid that - this threshold will never be
>> crossed,
>> even if we expect to optimize 99% instructions after that.
>>
>> Modified:
>> llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>> llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
>>
>> Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h?rev=228434&r1=228433&r2=228434&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h (original)
>> +++ llvm/trunk/include/llvm/Analysis/TargetTransformInfo.h Fri Feb 6
>> 14:20:40 2015
>> @@ -217,6 +217,13 @@ public:
>> /// exceed this cost. Set this to UINT_MAX to disable the loop
>> body cost
>> /// restriction.
>> unsigned Threshold;
>> + /// If complete unrolling could help other optimizations (e.g.
>> InstSimplify)
>> + /// to remove N% of instructions, then we can go beyond unroll
>> threshold.
>> + /// This value set the minimal percent for allowing that.
>> + unsigned MinPercentOfOptimized;
>> + /// The absolute cost threshold. We won't go beyond this even if
>> complete
>> + /// unrolling could result in optimizing out 90% of
>> instructions.
>> + unsigned AbsoluteThreshold;
>> /// The cost threshold for the unrolled loop when optimizing for
>> size (set
>> /// to UINT_MAX to disable).
>> unsigned OptSizeThreshold;
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=228434&r1=228433&r2=228434&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Fri Feb 6
>> 14:20:40 2015
>> @@ -45,6 +45,17 @@ static cl::opt<unsigned> UnrollMaxIterat
>> cl::desc("Don't allow loop unrolling to simulate more than this
>> number of"
>> "iterations when checking full unroll profitability"));
>>
>> +static cl::opt<unsigned> UnrollMinPercentOfOptimized(
>> + "unroll-percent-of-optimized-for-complete-unroll", cl::init(20),
>> cl::Hidden,
>> + cl::desc("If complete unrolling could trigger further
>> optimizations, and, "
>> + "by that, remove the given percent of instructions,
>> perform the "
>> + "complete unroll even if it's beyond the threshold"));
>> +
>> +static cl::opt<unsigned> UnrollAbsoluteThreshold(
>> + "unroll-absolute-threshold", cl::init(2000), cl::Hidden,
>> + cl::desc("Don't unroll if the unrolled size is bigger than this
>> threshold,"
>> + " even if we can remove big portion of instructions
>> later."));
>> +
>> static cl::opt<unsigned>
>> UnrollCount("unroll-count", cl::init(0), cl::Hidden,
>> cl::desc("Use this unroll count for all loops including those with
>> "
>> @@ -70,11 +81,16 @@ namespace {
>> static char ID; // Pass ID, replacement for typeid
>> LoopUnroll(int T = -1, int C = -1, int P = -1, int R = -1) :
>> LoopPass(ID) {
>> CurrentThreshold = (T == -1) ? UnrollThreshold : unsigned(T);
>> + CurrentAbsoluteThreshold = UnrollAbsoluteThreshold;
>> + CurrentMinPercentOfOptimized = UnrollMinPercentOfOptimized;
>> CurrentCount = (C == -1) ? UnrollCount : unsigned(C);
>> CurrentAllowPartial = (P == -1) ? UnrollAllowPartial :
>> (bool)P;
>> CurrentRuntime = (R == -1) ? UnrollRuntime : (bool)R;
>>
>> UserThreshold = (T != -1) ||
>> (UnrollThreshold.getNumOccurrences() > 0);
>> + UserAbsoluteThreshold =
>> (UnrollAbsoluteThreshold.getNumOccurrences() > 0);
>> + UserPercentOfOptimized =
>> + (UnrollMinPercentOfOptimized.getNumOccurrences() > 0);
>> UserAllowPartial = (P != -1) ||
>> (UnrollAllowPartial.getNumOccurrences() >
>> 0);
>> UserRuntime = (R != -1) || (UnrollRuntime.getNumOccurrences()
>>> 0);
>> @@ -98,10 +114,16 @@ namespace {
>>
>> unsigned CurrentCount;
>> unsigned CurrentThreshold;
>> + unsigned CurrentAbsoluteThreshold;
>> + unsigned CurrentMinPercentOfOptimized;
>> bool CurrentAllowPartial;
>> bool CurrentRuntime;
>> bool UserCount; // CurrentCount is
>> user-specified.
>> bool UserThreshold; // CurrentThreshold is
>> user-specified.
>> + bool UserAbsoluteThreshold; // CurrentAbsoluteThreshold is
>> + // user-specified.
>> + bool UserPercentOfOptimized; // CurrentMinPercentOfOptimized
>> is
>> + // user-specified.
>> bool UserAllowPartial; // CurrentAllowPartial is
>> user-specified.
>> bool UserRuntime; // CurrentRuntime is
>> user-specified.
>>
>> @@ -133,6 +155,8 @@ namespace {
>> void getUnrollingPreferences(Loop *L, const TargetTransformInfo
>> &TTI,
>> TargetTransformInfo::UnrollingPreferences
>> &UP) {
>> UP.Threshold = CurrentThreshold;
>> + UP.AbsoluteThreshold = CurrentAbsoluteThreshold;
>> + UP.MinPercentOfOptimized = CurrentMinPercentOfOptimized;
>> UP.OptSizeThreshold = OptSizeUnrollThreshold;
>> UP.PartialThreshold = CurrentThreshold;
>> UP.PartialOptSizeThreshold = OptSizeUnrollThreshold;
>> @@ -160,13 +184,32 @@ namespace {
>> void selectThresholds(const Loop *L, bool HasPragma,
>> const
>> TargetTransformInfo::UnrollingPreferences
>> &UP,
>> unsigned &Threshold, unsigned
>> &PartialThreshold,
>> - unsigned NumberOfSimplifiedInstructions) {
>> + unsigned NumberOfOptimizedInstructions) {
>> // Determine the current unrolling threshold. While this is
>> // normally set from UnrollThreshold, it is overridden to a
>> // smaller value if the current function is marked as
>> // optimize-for-size, and the unroll threshold was not user
>> // specified.
>> Threshold = UserThreshold ? CurrentThreshold : UP.Threshold;
>> +
>> + // If we are allowed to completely unroll if we can remove M%
>> of
>> + // instructions, and we know that with complete unrolling
>> we'll be able
>> + // to kill N instructions, then we can afford to completely
>> unroll loops
>> + // with unrolled size up to N*100/M.
>> + // Adjust the threshold according to that:
>> + unsigned PercentOfOptimizedForCompleteUnroll =
>> + UserPercentOfOptimized ? CurrentMinPercentOfOptimized
>> + : UP.MinPercentOfOptimized;
>> + unsigned AbsoluteThreshold = UserAbsoluteThreshold
>> + ? CurrentAbsoluteThreshold
>> + : UP.AbsoluteThreshold;
>> + if (PercentOfOptimizedForCompleteUnroll)
>> + Threshold = std::max<unsigned>(Threshold,
>> + NumberOfOptimizedInstructions
>> * 100 /
>> +
>> PercentOfOptimizedForCompleteUnroll);
>> + // But don't allow unrolling loops bigger than absolute
>> threshold.
>> + Threshold = std::min<unsigned>(Threshold, AbsoluteThreshold);
>> +
>> PartialThreshold = UserThreshold ? CurrentThreshold :
>> UP.PartialThreshold;
>> if (!UserThreshold &&
>> L->getHeader()->getParent()->getAttributes().
>> @@ -186,7 +229,6 @@ namespace {
>> PartialThreshold =
>> std::max<unsigned>(PartialThreshold,
>> PragmaUnrollThreshold);
>> }
>> - Threshold += NumberOfSimplifiedInstructions;
>> }
>> };
>> }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
More information about the llvm-commits
mailing list