forked from OSchip/llvm-project
fc02e3c363
Runtime unrolling will create a prologue to execute the extra iterations which is can't divided by the unroll factor. It generates an if-then-else sequence to jump into a factor -1 times unrolled loop body, like extraiters = tripcount % loopfactor if (extraiters == 0) jump Loop: if (extraiters == loopfactor) jump L1 if (extraiters == loopfactor-1) jump L2 ... L1: LoopBody; L2: LoopBody; ... if tripcount < loopfactor jump End Loop: ... End: It means if the unroll factor is 4, the loop body will be 7 times unrolled, 3 are in loop prologue, and 4 are in the loop. This commit is to use a loop to execute the extra iterations in prologue, like extraiters = tripcount % loopfactor if (extraiters == 0) jump Loop: else jump Prol Prol: LoopBody; extraiters -= 1 // Omitted if unroll factor is 2. if (extraiters != 0) jump Prol: // Omitted if unroll factor is 2. if (tripcount < loopfactor) jump End Loop: ... End: Then when unroll factor is 4, the loop body will be copied by only 5 times, 1 in the prologue loop, 4 in the original loop. And if the unroll factor is 2, new loop won't be created, just as the original solution. llvm-svn: 218604 |
||
---|---|---|
.. | ||
PowerPC | ||
X86 | ||
2004-05-13-DontUnrollTooMuch.ll | ||
2005-03-06-BadLoopInfoUpdate.ll | ||
2006-08-24-MultiBlockLoop.ll | ||
2007-04-16-PhiUpdate.ll | ||
2007-05-05-UnrollMiscomp.ll | ||
2007-05-09-UnknownTripCount.ll | ||
2007-11-05-Crash.ll | ||
2011-08-08-PhiUpdate.ll | ||
2011-08-09-IVSimplify.ll | ||
2011-08-09-PhiUpdate.ll | ||
2011-10-01-NoopTrunc.ll | ||
2012-04-09-unroll-indirectbr.ll | ||
basic.ll | ||
ephemeral.ll | ||
ignore-annotation-intrinsic-cost.ll | ||
loop-remarks.ll | ||
partial-unroll-optsize.ll | ||
pr10813.ll | ||
pr11361.ll | ||
pr14167.ll | ||
pr18861.ll | ||
runtime-loop.ll | ||
runtime-loop1.ll | ||
runtime-loop2.ll | ||
runtime-loop3.ll | ||
scevunroll.ll | ||
shifted-tripcount.ll | ||
unloop.ll | ||
unroll-pragmas-disabled.ll | ||
unroll-pragmas.ll |