forked from OSchip/llvm-project
Add -unroll-allow-partial command line option that enabled the loop unroller to
partially unroll a loop when fully unrolling would not fit under the threshold. Patch by Mikael Lepistö. llvm-svn: 54160
This commit is contained in:
parent
fd3070459b
commit
98b5c16e3b
|
@ -33,6 +33,11 @@ static cl::opt<unsigned>
|
|||
UnrollCount("unroll-count", cl::init(0), cl::Hidden,
|
||||
cl::desc("Use this unroll count for all loops, for testing purposes"));
|
||||
|
||||
static cl::opt<bool>
|
||||
UnrollAllowPartial("unroll-allow-partial", cl::init(false), cl::Hidden,
|
||||
cl::desc("Allows loops to be partially unrolled until "
|
||||
"-unroll-threshold loop size is reached."));
|
||||
|
||||
namespace {
|
||||
class VISIBILITY_HIDDEN LoopUnroll : public LoopPass {
|
||||
public:
|
||||
|
@ -122,7 +127,8 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
if (Count == 0) {
|
||||
// Conservative heuristic: if we know the trip count, see if we can
|
||||
// completely unroll (subject to the threshold, checked below); otherwise
|
||||
// don't unroll.
|
||||
// try to find greatest modulo of the trip count which is still under
|
||||
// threshold value.
|
||||
if (TripCount != 0) {
|
||||
Count = TripCount;
|
||||
} else {
|
||||
|
@ -136,9 +142,25 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
DOUT << " Loop Size = " << LoopSize << "\n";
|
||||
uint64_t Size = (uint64_t)LoopSize*Count;
|
||||
if (TripCount != 1 && Size > UnrollThreshold) {
|
||||
DOUT << " TOO LARGE TO UNROLL: "
|
||||
<< Size << ">" << UnrollThreshold << "\n";
|
||||
return false;
|
||||
DOUT << " Too large to fully unroll with count: " << Count
|
||||
<< " because size: " << Size << ">" << UnrollThreshold << "\n";
|
||||
if (UnrollAllowPartial) {
|
||||
// Reduce unroll count to be modulo of TripCount for partial unrolling
|
||||
Count = UnrollThreshold / LoopSize;
|
||||
while (Count != 0 && TripCount%Count != 0) {
|
||||
Count--;
|
||||
}
|
||||
if (Count < 2) {
|
||||
DOUT << " could not unroll partially\n";
|
||||
return false;
|
||||
} else {
|
||||
DOUT << " partially unrolling with count: " << Count << "\n";
|
||||
}
|
||||
} else {
|
||||
DOUT << " will not try to unroll partially because "
|
||||
<< "-unroll-allow-partial not given\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
; RUN: llvm-as < %s | opt -debug -loop-unroll |& grep {will not try to unroll partially because}
|
||||
; RUN: llvm-as < %s | opt -debug -loop-unroll -unroll-allow-partial |& grep {partially unrolling with count}
|
||||
; RUN: llvm-as < %s | opt -debug -loop-unroll -unroll-allow-partial -unroll-threshold=3 |& grep {could not unroll partially}
|
||||
|
||||
define i32 @main() {
|
||||
entry:
|
||||
br label %no_exit
|
||||
no_exit: ; preds = %no_exit, %entry
|
||||
%indvar = phi i32 [ 0, %entry ], [ %indvar.next, %no_exit ] ; <i32> [#uses=1]
|
||||
%indvar.next = add i32 %indvar, 1 ; <i32> [#uses=2]
|
||||
%exitcond = icmp ne i32 %indvar.next, 100 ; <i1> [#uses=1]
|
||||
br i1 %exitcond, label %no_exit, label %loopexit
|
||||
loopexit: ; preds = %no_exit
|
||||
ret i32 0
|
||||
}
|
Loading…
Reference in New Issue