llvm-6502/test/Transforms
Hal Finkel bebe48dbfe Add a loop rerolling pass
This adds a loop rerolling pass: the opposite of (partial) loop unrolling. The
transformation aims to take loops like this:

for (int i = 0; i < 3200; i += 5) {
  a[i]     += alpha * b[i];
  a[i + 1] += alpha * b[i + 1];
  a[i + 2] += alpha * b[i + 2];
  a[i + 3] += alpha * b[i + 3];
  a[i + 4] += alpha * b[i + 4];
}

and turn them into this:

for (int i = 0; i < 3200; ++i) {
  a[i] += alpha * b[i];
}

and loops like this:

for (int i = 0; i < 500; ++i) {
  x[3*i] = foo(0);
  x[3*i+1] = foo(0);
  x[3*i+2] = foo(0);
}

and turn them into this:

for (int i = 0; i < 1500; ++i) {
  x[i] = foo(0);
}

There are two motivations for this transformation:

  1. Code-size reduction (especially relevant, obviously, when compiling for
code size).

  2. Providing greater choice to the loop vectorizer (and generic unroller) to
choose the unrolling factor (and a better ability to vectorize). The loop
vectorizer can take vector lengths and register pressure into account when
choosing an unrolling factor, for example, and a pre-unrolled loop limits that
choice. This is especially problematic if the manual unrolling was optimized
for a machine different from the current target.

The current implementation is limited to single basic-block loops only. The
rerolling recognition should work regardless of how the loop iterations are
intermixed within the loop body (subject to dependency and side-effect
constraints), but the significant restriction is that the order of the
instructions in each iteration must be identical. This seems sufficient to
capture all current use cases.

This pass is not currently enabled by default at any optimization level.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194939 91177308-0d34-0410-b5e6-96231b3b80d8
2013-11-16 23:59:05 +00:00
..
ADCE
ArgumentPromotion ArgumentPromotion: correctly transfer TBAA tags and alignments. 2013-11-15 20:41:15 +00:00
BBVectorize
BranchFolding
CodeExtractor
CodeGenPrepare
ConstantMerge Corruptly merge constants with explicit and implicit alignments. 2013-11-12 20:21:43 +00:00
ConstProp
CorrelatedValuePropagation
DeadArgElim
DeadStoreElimination Fixing a heisenbug where the memory dependence analysis behaves differently 2013-11-14 01:10:52 +00:00
DebugIR
EarlyCSE
FunctionAttrs
GCOVProfiling
GlobalDCE
GlobalOpt
GVN Fix PR17952. 2013-11-11 22:00:23 +00:00
IndVarSimplify Add test case for PR12377, it was fixed by r194116. 2013-11-06 11:55:41 +00:00
Inline Rename testing case to use - instead of _. 2013-11-04 18:52:06 +00:00
InstCombine Apply the InstCombine fptrunc sqrt optimization to llvm.sqrt 2013-11-16 21:29:08 +00:00
InstSimplify
Internalize Use LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN instead of the "dso list". 2013-10-31 20:51:58 +00:00
IPConstantProp
JumpThreading
LCSSA
LICM
LoopDeletion
LoopIdiom
LoopReroll Add a loop rerolling pass 2013-11-16 23:59:05 +00:00
LoopRotate
LoopSimplify
LoopStrengthReduce Fix "existant" typos 2013-10-29 02:35:28 +00:00
LoopUnroll
LoopUnswitch
LoopVectorize LoopVectorizer: Use abi alignment for accesses with no alignment 2013-11-15 23:09:33 +00:00
LowerAtomic
LowerExpectIntrinsic
LowerInvoke
LowerSwitch
Mem2Reg
MemCpyOpt
MergeFunc Teach MergeFunctions about address spaces 2013-11-10 01:44:37 +00:00
MetaRenamer
ObjCARC [objc-arc] Convert the one directional retain/release relation assert to a conditional check + fail. 2013-11-05 16:02:40 +00:00
PhaseOrdering
PruneEH
Reassociate
Reg2Mem
SampleProfile SampleProfileLoader pass. Initial setup. 2013-11-13 12:22:21 +00:00
ScalarRepl Teach scalarrepl about address spaces 2013-10-30 22:54:58 +00:00
SCCP
SimplifyCFG FoldBranchToCommonDest merges branches into a single branch with or/and of the condition. It has a heuristics for estimating when some of the dependencies are processed by out-of-order processors. This patch adds another rule to the heuristics that says that if the "BonusInstruction" that we speculatively execute is used by the condition of the second branch then it is okay to hoist it. This change exposes more opportunities for other passes to transform the code. It does not matter that much that we if-convert the code because the selectiondag builder splits or/and branches into multiple branches when profitable. 2013-11-12 22:37:16 +00:00
Sink
SLPVectorizer Add llvm/test/Transforms/SLPVectorizer/ARM/lit.local.cfg. Tests there require ARM in targets. 2013-10-29 02:46:00 +00:00
SROA
StripSymbols
StructurizeCFG
TailCallElim
TailDup