#
b1b76adb |
| 09-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Move calcLiveBlockInfo() and the BlockInfo struct into SplitAnalysis.
No functional changes intended.
llvm-svn: 125231
|
#
f6e0394d |
| 09-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Ignore <undef> uses when analyzing and rewriting.
llvm-svn: 125226
|
#
17499351 |
| 08-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add SplitEditor::overlapIntv() to create small ranges where both registers are live.
If a live range is used by a terminator instruction, and that live range needs to leave the block on the stack or
Add SplitEditor::overlapIntv() to create small ranges where both registers are live.
If a live range is used by a terminator instruction, and that live range needs to leave the block on the stack or in a different register, it can be necessary to have both sides of the split live at the terminator instruction.
Example:
%vreg2 = COPY %vreg1 JMP %vreg1
Becomes after spilling %vreg2:
SPILL %vreg1 JMP %vreg1
The spill doesn't kill the register as is normally the case.
llvm-svn: 125102
show more ...
|
#
3d11c8ea |
| 08-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add assertion.
llvm-svn: 125101
|
#
096bd883 |
| 04-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add LiveIntervals::getLastSplitPoint().
A live range cannot be split everywhere in a basic block. A split must go before the first terminator, and if the variable is live into a landing pad, the spl
Add LiveIntervals::getLastSplitPoint().
A live range cannot be split everywhere in a basic block. A split must go before the first terminator, and if the variable is live into a landing pad, the split must happen before the call that can throw.
llvm-svn: 124894
show more ...
|
#
3295a99f |
| 04-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Skip unused values.
llvm-svn: 124842
|
#
d8f62e2a |
| 03-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add debug output and asserts to the phi-connecting code.
llvm-svn: 124813
|
#
8c025487 |
| 03-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Fix coloring bug when mapping values in the middle of a live-through block.
If the found value is not live-through the block, we should only add liveness up to the requested slot index. When the val
Fix coloring bug when mapping values in the middle of a live-through block.
If the found value is not live-through the block, we should only add liveness up to the requested slot index. When the value is live-through, the whole block should be colored.
Bug found by SSA verification in the machine code verifier.
llvm-svn: 124812
show more ...
|
#
f12e1207 |
| 03-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Return live range end points from SplitEditor::enter*/leave*.
These end points come from the inserted copies, and can be passed directly to useIntv. This simplifies the coloring code.
llvm-svn: 124
Return live range end points from SplitEditor::enter*/leave*.
These end points come from the inserted copies, and can be passed directly to useIntv. This simplifies the coloring code.
llvm-svn: 124799
show more ...
|
#
ede62679 |
| 03-Feb-2011 |
Eric Christopher <echristo@apple.com> |
Reapply this.
llvm-svn: 124779
|
#
21933539 |
| 03-Feb-2011 |
Eric Christopher <echristo@apple.com> |
Temporarily revert 124765 in an attempt to find the cycle breaking bootstrap.
llvm-svn: 124778
|
#
dca2917e |
| 03-Feb-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Defer SplitKit value mapping until all defs are available.
The greedy register allocator revealed some problems with the value mapping in SplitKit. We would sometimes start mapping values before all
Defer SplitKit value mapping until all defs are available.
The greedy register allocator revealed some problems with the value mapping in SplitKit. We would sometimes start mapping values before all defs were known, and that could change a value from a simple 1-1 mapping to a multi-def mapping that requires ssa update.
The new approach collects all defs and register assignments first without filling in any live intervals. Only when finish() is called, do we compute liveness and mapped values. At this time we know with certainty which values map to multiple values in a split range.
This also has the advantage that we can compute live ranges based on the remaining uses after rematerializing at split points.
The current implementation has many opportunities for compile time optimization.
llvm-svn: 124765
show more ...
|
#
b3089020 |
| 26-Jan-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Rename member variables to follow the rest of LLVM. No functional change.
llvm-svn: 124257
|
#
04e6b3bd |
| 20-Jan-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add LiveIntervalMap::dumpCache() to print out the cache used by the ssa update algorithm.
llvm-svn: 123925
|
#
9fb04015 |
| 19-Jan-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Implement RAGreedy::splitAroundRegion and remove loop splitting.
Region splitting includes loop splitting as a subset, and it is more generic. The splitting heuristics for variables that are live in
Implement RAGreedy::splitAroundRegion and remove loop splitting.
Region splitting includes loop splitting as a subset, and it is more generic. The splitting heuristics for variables that are live in more than one block are now:
1. Try to create a region that covers multiple basic blocks. 2. Try to create a new live range for each block with multiple uses. 3. Spill.
Steps 2 and 3 are similar to what the standard spiller is doing.
llvm-svn: 123853
show more ...
|
#
267f6c1a |
| 18-Jan-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add RAGreedy methods for splitting live ranges around regions.
Analyze the live range's behavior entering and leaving basic blocks. Compute an interference pattern for each allocation candidate, and
Add RAGreedy methods for splitting live ranges around regions.
Analyze the live range's behavior entering and leaving basic blocks. Compute an interference pattern for each allocation candidate, and use SpillPlacement to find an optimal region where that register can be live.
This code is still not enabled.
llvm-svn: 123774
show more ...
|
#
f96ae684 |
| 04-Jan-2011 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Turn the EdgeBundles class into a stand-alone machine CFG analysis pass.
The analysis will be needed by both the greedy register allocator and the X86FloatingPoint pass. It only needs to be computed
Turn the EdgeBundles class into a stand-alone machine CFG analysis pass.
The analysis will be needed by both the greedy register allocator and the X86FloatingPoint pass. It only needs to be computed once when the CFG doesn't change.
This pass is very fast, usually showing up as 0.0% wall time.
llvm-svn: 122832
show more ...
|
#
29836e65 |
| 22-Dec-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Include a shadow of the original CFG edges in the edge bundle graph.
llvm-svn: 122444
|
#
2530cd2a |
| 21-Dec-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Add EdgeBundles to SplitKit.
Edge bundles is an annotation on the CFG that turns it into a bipartite directed graph where each basic block is connected to an outgoing and an ingoing bundle. These bu
Add EdgeBundles to SplitKit.
Edge bundles is an annotation on the CFG that turns it into a bipartite directed graph where each basic block is connected to an outgoing and an ingoing bundle. These bundles are useful for identifying regions of the CFG for live range splitting.
llvm-svn: 122301
show more ...
|
#
7971a3ea |
| 18-Dec-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Check that the register is live-in to the loop header before inserting copies in the loop predecessors.
The register can be live-out from a predecessor without being live-in to the loop header if th
Check that the register is live-in to the loop header before inserting copies in the loop predecessors.
The register can be live-out from a predecessor without being live-in to the loop header if there is a critical edge from the predecessor.
llvm-svn: 122123
show more ...
|
#
1066ef6b |
| 15-Dec-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Fix build.
llvm-svn: 121872
|
#
28e769cc |
| 15-Dec-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Detect and enumerate bypass loops.
Bypass loops have the current live range live through, but contain no uses or defs. Splitting around a bypass loop can free registers for other uses inside the loo
Detect and enumerate bypass loops.
Bypass loops have the current live range live through, but contain no uses or defs. Splitting around a bypass loop can free registers for other uses inside the loop by spilling the split range.
llvm-svn: 121871
show more ...
|
#
4391f34a |
| 15-Dec-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Separate SplitAnalysis::getSplitLoops().
This method returns the set of loops with uses that are candidates for splitting.
llvm-svn: 121870
|
#
3cb87f4c |
| 10-Nov-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
No need to add liveness that's already there.
llvm-svn: 118742
|
#
6ee7d9aa |
| 10-Nov-2010 |
Jakob Stoklund Olesen <stoklund@2pi.dk> |
Basic rematerialization during splitting.
Whenever splitting wants to insert a copy, it checks if the value can be rematerialized cheaply instead.
Missing features: - Delete instructions when all u
Basic rematerialization during splitting.
Whenever splitting wants to insert a copy, it checks if the value can be rematerialized cheaply instead.
Missing features: - Delete instructions when all uses have been rematerialized. - Truncate live ranges to the remaining uses after rematerialization.
llvm-svn: 118702
show more ...
|