| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
|
|
| |
UseSlots.
This allows us to always keep the smaller slot for an instruction which is what
we want when a register has early clobber defines.
Drop the UsingInstrs set and the UsingBlocks map. They are no longer needed.
llvm-svn: 128886
|
|
|
|
| |
llvm-svn: 128875
|
|
|
|
|
|
|
|
|
| |
inlined path for the common case.
Most basic blocks don't contain a call that may throw, so the last split point
os simply the first terminator.
llvm-svn: 128874
|
|
|
|
| |
llvm-svn: 128821
|
|
|
|
| |
llvm-svn: 128820
|
|
|
|
| |
llvm-svn: 127779
|
|
|
|
|
|
|
|
| |
LiveRangeEdit::eliminateDeadDefs() will eventually be used by coalescing,
splitting, and spilling for dead code elimination. It can delete chains of dead
instructions as long as there are no dependency loops.
llvm-svn: 127287
|
|
|
|
|
|
|
|
|
|
|
|
| |
The coalescer can in very rare cases leave too large live intervals around after
rematerializing cheap-as-a-move instructions.
Linear scan doesn't really care, but live range splitting gets very confused
when a live range is killed by a ghost instruction.
I will fix this properly in the coalescer after 2.9 branches.
llvm-svn: 127096
|
|
|
|
|
|
|
| |
This speeds up updateSSA() so it only accounts for 5% of the live range
splitting time.
llvm-svn: 126972
|
|
|
|
|
|
|
|
|
| |
time.
This speeds up the greedy register allocator by 15%.
DenseMap is not as fast as one might hope.
llvm-svn: 126921
|
|
|
|
|
|
| |
multiple splits.
llvm-svn: 126912
|
|
|
|
|
|
| |
No functional change.
llvm-svn: 126898
|
|
|
|
|
|
|
|
| |
Values that map to a single new value in a new interval after splitting don't
need new PHIDefs, and if the parent value was never rematerialized the live
range will be the same.
llvm-svn: 126894
|
|
|
|
| |
llvm-svn: 126893
|
|
|
|
|
|
|
|
|
| |
Extract the updateSSA() method from the too long extendRange().
LiveOutCache can be shared among all the new intervals since there is at most
one of the new ranges live out from each basic block.
llvm-svn: 126818
|
|
|
|
|
|
| |
Simplify the signature - The return value and ParentVNI are no longer needed.
llvm-svn: 126809
|
|
|
|
|
|
|
| |
This method could probably be used by LiveIntervalAnalysis::shrinkToUses, and
now it can use extendIntervalEndTo() which coalesces ranges.
llvm-svn: 126803
|
|
|
|
| |
llvm-svn: 126801
|
|
|
|
|
|
|
|
|
|
|
| |
The value map is currently not used, all values are 'complex mapped' and
LiveIntervalMap::mapValue is used to dig them out.
This is the first step in a series changes leading to the removal of
LiveIntervalMap. Its data structures can be shared among all the live intervals
created by a split, so it is wasteful to create a copy for each.
llvm-svn: 126800
|
|
|
|
|
|
|
| |
Local live range splitting is better driven by interference. This code was just
guessing.
llvm-svn: 126799
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
terminate.
An original endpoint is an instruction that killed or defined the original live
range before any live ranges were split.
When splitting global live ranges, avoid creating local live ranges without any
original endpoints. We may still create global live ranges without original
endpoints, but such a range won't be split again, and live range splitting still
terminates.
llvm-svn: 126151
|
|
|
|
| |
llvm-svn: 126005
|
|
|
|
| |
llvm-svn: 126003
|
|
|
|
|
|
|
|
| |
A local live range is live in a single basic block. If such a range fails to
allocate, try to find a sub-range that would get a larger spill weight than its
interference.
llvm-svn: 125764
|
|
|
|
|
|
|
| |
Loop splitting is better handled by the more generic global region splitting
based on the edge bundle graph.
llvm-svn: 125243
|
|
|
|
|
|
|
| |
This fixes a bug where splitSingleBlocks() could split a live range after a
terminator instruction.
llvm-svn: 125237
|
|
|
|
|
|
| |
No functional changes intended.
llvm-svn: 125231
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
| |
These end points come from the inserted copies, and can be passed directly to
useIntv. This simplifies the coloring code.
llvm-svn: 124799
|
|
|
|
| |
llvm-svn: 124779
|
|
|
|
| |
llvm-svn: 124778
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
| |
No functional change.
llvm-svn: 124257
|
|
|
|
|
|
| |
update algorithm.
llvm-svn: 123925
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
framework. It's purpose is not to improve register allocation per se,
but to make it easier to develop powerful live range splitting. I call
it the basic allocator because it is as simple as a global allocator
can be but provides the building blocks for sophisticated register
allocation with live range splitting.
A minimal implementation is provided that trivially spills whenever it
runs out of registers. I'm checking in now to get high-level design
and style feedback. I've only done minimal testing. The next step is
implementing a "greedy" allocation algorithm that does some register
reassignment and makes better splitting decisions.
llvm-svn: 117174
|
|
|
|
| |
llvm-svn: 117143
|
|
|
|
| |
llvm-svn: 116580
|
|
|
|
| |
llvm-svn: 116547
|
|
|
|
|
|
|
|
|
| |
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
|