- Feb 19, 2011
-
-
Jakob Stoklund Olesen authored
llvm-svn: 126003
-
- Feb 17, 2011
-
-
Jakob Stoklund Olesen authored
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
-
- Feb 10, 2011
-
-
Jakob Stoklund Olesen authored
Loop splitting is better handled by the more generic global region splitting based on the edge bundle graph. llvm-svn: 125243
-
Jakob Stoklund Olesen authored
This fixes a bug where splitSingleBlocks() could split a live range after a terminator instruction. llvm-svn: 125237
-
- Feb 09, 2011
-
-
Jakob Stoklund Olesen authored
No functional changes intended. llvm-svn: 125231
-
- Feb 08, 2011
-
-
Jakob Stoklund Olesen authored
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
-
- Feb 03, 2011
-
-
Jakob Stoklund Olesen authored
These end points come from the inserted copies, and can be passed directly to useIntv. This simplifies the coloring code. llvm-svn: 124799
-
Eric Christopher authored
llvm-svn: 124779
-
Eric Christopher authored
llvm-svn: 124778
-
Jakob Stoklund Olesen authored
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
-
- Jan 26, 2011
-
-
Jakob Stoklund Olesen authored
No functional change. llvm-svn: 124257
-
- Jan 20, 2011
-
-
Jakob Stoklund Olesen authored
llvm-svn: 123925
-
- Jan 18, 2011
-
-
Jakob Stoklund Olesen authored
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
-
- Jan 04, 2011
-
-
Jakob Stoklund Olesen authored
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
-
- Dec 21, 2010
-
-
Jakob Stoklund Olesen authored
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
-
- Dec 15, 2010
-
-
Jakob Stoklund Olesen authored
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
-
Jakob Stoklund Olesen authored
This method returns the set of loops with uses that are candidates for splitting. llvm-svn: 121870
-
- Nov 10, 2010
-
-
Jakob Stoklund Olesen authored
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
-
- Nov 02, 2010
-
-
Jakob Stoklund Olesen authored
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
-
- Oct 28, 2010
-
-
Jakob Stoklund Olesen authored
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
-
Jakob Stoklund Olesen authored
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
-
- Oct 27, 2010
-
-
Jakob Stoklund Olesen authored
live out. This doesn't prevent us from inserting a loop preheader later on, if that is better. llvm-svn: 117424
-
Jakob Stoklund Olesen authored
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
-
- Oct 23, 2010
-
-
Andrew Trick authored
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
-
- Oct 22, 2010
-
-
Jakob Stoklund Olesen authored
llvm-svn: 117143
-
- Oct 15, 2010
-
-
Jakob Stoklund Olesen authored
llvm-svn: 116580
-
Jakob Stoklund Olesen authored
llvm-svn: 116547
-
Jakob Stoklund Olesen authored
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
-
- Oct 09, 2010
-
-
Jakob Stoklund Olesen authored
functions: computeRemainder and rewrite. When the remainder breaks up into multiple components, remember to rewrite those uses as well. llvm-svn: 116121
-
- Oct 06, 2010
-
-
Jakob Stoklund Olesen authored
reusable, but that is no longer relevant since a split will always replace the original. llvm-svn: 115709
-
Jakob Stoklund Olesen authored
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
-
- Oct 05, 2010
-
-
Jakob Stoklund Olesen authored
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
-
- Sep 22, 2010
-
-
Jakob Stoklund Olesen authored
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
-
- Sep 16, 2010
-
-
Jakob Stoklund Olesen authored
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
-
- Sep 14, 2010
-
-
Jakob Stoklund Olesen authored
edited without actually using LiveIntervalMap functionality. llvm-svn: 113816
-
Jakob Stoklund Olesen authored
llvm-svn: 113815
-
- Aug 18, 2010
-
-
Jakob Stoklund Olesen authored
map discovers the iterated dominance frontier for free. llvm-svn: 111400
-
Jakob Stoklund Olesen authored
LiveIntervalMap maps values from a parent LiveInterval to a child interval that is a strict subset. It will create phi-def values as needed to preserve the VNInfo SSA form in the child interval. This leads to an algorithm very similar to the one in SSAUpdaterImpl.h, but with enough differences that the code can't be reused: - We don't need to manipulate PHI instructions. - LiveIntervals have kills. - We have MachineDominatorTree. - We can use df_iterator. llvm-svn: 111393
-
- Aug 14, 2010
-
-
Jakob Stoklund Olesen authored
The earliestStart argument is entirely specific to linear scan allocation, and can be easily calculated by RegAllocLinearScan. Replace std::vector with SmallVector. llvm-svn: 111055
-
- Aug 13, 2010
-
-
Jakob Stoklund Olesen authored
When a live range is contained a single block, we can split it around instruction clusters. The current approach is very primitive, splitting before and after the largest gap between uses. llvm-svn: 111043
-