| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
| |
llvm-svn: 122444
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
| |
llvm-svn: 121872
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
| |
This method returns the set of loops with uses that are candidates for
splitting.
llvm-svn: 121870
|
|
|
|
| |
llvm-svn: 118742
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
| |
llvm-svn: 118193
|
|
|
|
|
|
|
|
|
|
|
|
| |
source, and let rewrite() clean it up.
This way, kill flags on the inserted copies are fixed as well during rewrite().
We can't just assume that all the copies we insert are going to be kills since
critical edges into loop headers sometimes require both source and dest to be
live out of a block.
llvm-svn: 117980
|
|
|
|
| |
llvm-svn: 117959
|
|
|
|
|
|
| |
a basic block.
llvm-svn: 117764
|
|
|
|
| |
llvm-svn: 117673
|
|
|
|
| |
llvm-svn: 117671
|
|
|
|
| |
llvm-svn: 117669
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
in SSAUpdaterImpl.h
Verifying live intervals revealed that the old method was completely wrong, and
we need an iterative approach to calculating PHI placemant. Fortunately, we have
MachineDominators available, so we don't have to compute that over and over
like SSAUpdaterImpl.h must.
Live-out values are cached between calls to mapValue() and computed in a greedy
way, so most calls will be working with very small block sets.
Thanks to Bob for explaining how this should work.
llvm-svn: 117599
|
|
|
|
|
|
|
|
|
| |
proper SSA updating.
This doesn't cause MachineDominators to be recomputed since we are already
requiring MachineLoopInfo which uses dominators as well.
llvm-svn: 117598
|
|
|
|
|
|
|
|
|
| |
live out.
This doesn't prevent us from inserting a loop preheader later on, if that is
better.
llvm-svn: 117424
|
|
|
|
|
|
|
|
| |
Critical edges going into a loop are not as bad as critical exits. We can handle
them by splitting the critical edge, or by having both inside and outside
registers live out of the predecessor.
llvm-svn: 117423
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the remainder register.
Example:
bb0:
x = 1
bb1:
use(x)
...
x = 2
jump bb1
When x is isolated in bb1, the inner part breaks into two components, x1 and x2:
bb0:
x0 = 1
bb1:
x1 = x0
use(x1)
...
x2 = 2
x0 = x2
jump bb1
llvm-svn: 117408
|
|
|
|
|
|
| |
necessary to get correct hasPHIKill flags.
llvm-svn: 117406
|
|
|
|
| |
llvm-svn: 117405
|
|
|
|
|
|
|
|
|
|
|
| |
When a block has exactly two uses and the register is both live-in and live-out,
don't isolate the block. We would be inserting two copies, so we haven't really
made any progress.
If the live-in and live-out values separate into disconnected components after
splitting, we would be making progress. We can't detect that for now.
llvm-svn: 117169
|
|
|
|
|
|
|
|
| |
An exit block with a critical edge must only have predecessors in the loop, or
just before the loop. This guarantees that the inserted copies in the loop
predecessors dominate the exit block.
llvm-svn: 117144
|
|
|
|
| |
llvm-svn: 117143
|
|
|
|
|
|
| |
Parent - union(Y, ...). Doh.
llvm-svn: 117042
|
|
|
|
| |
llvm-svn: 116547
|
|
|
|
|
|
|
|
|
|
| |
All registers created during splitting or spilling are assigned to the same
stack slot as the parent register.
When splitting or rematting, we may not spill at all. In that case the stack
slot is still assigned, but it will be dead.
llvm-svn: 116546
|
|
|
|
|
|
|
|
|
| |
splitting or spillling, and to help with rematerialization.
Use LiveRangeEdit in InlineSpiller and SplitKit. This will eventually make it
possible to share remat code between InlineSpiller and SplitKit.
llvm-svn: 116543
|
|
|
|
|
|
|
|
|
|
| |
Before we would also split around a loop if any peripheral block had multiple
uses. This could cause repeated splitting when splitting a different live range
would insert uses into the periphery.
Now -spiller=inline passes the nightly test suite again.
llvm-svn: 116494
|
|
|
|
|
|
|
|
|
| |
functions: computeRemainder and rewrite.
When the remainder breaks up into multiple components, remember to rewrite those
uses as well.
llvm-svn: 116121
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
connected components. These components should be allocated different virtual
registers because there is no reason for them to be allocated together.
Add the ConnectedVNInfoEqClasses class to calculate the connected components,
and move values to new LiveIntervals.
Use it from SplitKit::rewrite by creating new virtual registers for the
components.
llvm-svn: 116006
|
|
|
|
| |
llvm-svn: 115951
|
|
|
|
| |
llvm-svn: 115950
|
|
|
|
|
|
| |
do one find().
llvm-svn: 115929
|
|
|
|
| |
llvm-svn: 115928
|
|
|
|
| |
llvm-svn: 115710
|
|
|
|
|
|
|
| |
reusable, but that is no longer relevant since a split will always replace the
original.
llvm-svn: 115709
|
|
|
|
| |
llvm-svn: 115708
|
|
|
|
| |
llvm-svn: 115696
|
|
|
|
|
|
|
|
|
|
| |
never kept after splitting.
Keeping the original interval made sense when the split region doesn't modify
the register, and the original is spilled. We can get the same effect by
detecting reloaded values when spilling around copies.
llvm-svn: 115695
|
|
|
|
| |
llvm-svn: 115694
|
|
|
|
|
|
| |
erasing it from the visited set. That ensures we create the right phi defs.
llvm-svn: 115666
|
|
|
|
|
|
|
|
|
|
|
| |
Insert copy after defining instruction.
Fix LiveIntervalMap::extendTo to properly handle live segments starting before
the current basic block.
Make sure the open live range is extended to the inserted copy's use slot.
llvm-svn: 115665
|
|
|
|
|
|
| |
whether LiveIntervals::getInstructionFromIndex(def) returns NULL.
llvm-svn: 114791
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
creating it before and subtracting split ranges.
This way, the SSA update code in LiveIntervalMap can properly create and use new
phi values in dupli. Now it is possible to create split regions where a value
escapes along two different CFG edges, creating phi values outside the split
region.
This is a work in progress and probably quite broken.
llvm-svn: 114492
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
great deal because we don't have to worry about maintaining SSA form.
Unconditionally copy back to dupli when the register is live out of the split
range, even if the live-out value was defined outside the range. Skipping the
back-copy only makes sense when the live range is going to spill outside the
split range, and we don't know that it will. Besides, this was a hack to avoid
SSA update issues.
Clear up some confusion about the end point of a half-open LiveRange. Methinks
LiveRanges need to be closed so both start and end are included in the range.
The low bits of a SlotIndex are symbolic, so a half-open range doesn't really
make sense. This would be a pervasive change, though.
llvm-svn: 114043
|
|
|
|
|
|
| |
edited without actually using LiveIntervalMap functionality.
llvm-svn: 113816
|