| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
| |
llvm-svn: 67335
|
|
|
|
|
|
| |
start. Sorry, no small test case possible.
llvm-svn: 66129
|
|
|
|
|
|
| |
interval after its sub-register is coalesced with a virtual register.
llvm-svn: 64082
|
|
|
|
| |
llvm-svn: 63267
|
|
|
|
|
|
| |
sub-register indices as well.
llvm-svn: 62600
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
any of the physical register's sub-register live intervals overlaps with the virtual register. This is overly conservative. It prevents a extract_subreg from being coalesced away:
v1024 = EDI // not killed
=
= EDI
One possible solution is for the coalescer to examine the sub-register live intervals in the same manner as the physical register. Another possibility is to examine defs and uses (when needed) of sub-registers. Both solutions are too expensive. For now, look for "short virtual intervals" and scan instructions to look for conflict instead.
This is a small win on x86-64. e.g. It shaves 403.gcc by ~80 instructions.
llvm-svn: 61847
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
an input operand, it effectively extends the live range of the physical register. Currently we do not have a good way to represent this.
172 %ECX<def> = MOV32rr %reg1039<kill>
180 INLINEASM <es:subl $5,$1
sbbl $3,$0>, 10, %EAX<def>, 14, %ECX<earlyclobber,def>, 9, %EAX<kill>,
36, <fi#0>, 1, %reg0, 0, 9, %ECX<kill>, 36, <fi#1>, 1, %reg0, 0
188 %EAX<def> = MOV32rr %EAX<kill>
196 %ECX<def> = MOV32rr %ECX<kill>
204 %ECX<def> = MOV32rr %ECX<kill>
212 %EAX<def> = MOV32rr %EAX<kill>
220 %EAX<def> = MOV32rr %EAX
228 %reg1039<def> = MOV32rr %ECX<kill>
The early clobber operand ties ECX input to the ECX def.
The live interval of ECX is represented as this:
%reg20,inf = [46,47:1)[174,230:0) 0@174-(230) 1@46-(47)
The right way to represent this is something like
%reg20,inf = [46,47:2)[174,182:1)[181:230:0) 0@174-(182) 1@181-230 @2@46-(47)
Of course that won't work since that means overlapping live ranges defined by two val#.
The workaround for now is to add a bit to val# which says the val# is redefined by a early clobber def somewhere. This prevents the move at 228 from being optimized away by SimpleRegisterCoalescing::AdjustCopiesBackFrom.
llvm-svn: 61259
|
|
|
|
| |
llvm-svn: 60683
|
|
|
|
|
|
| |
constpool into a use, the rewrite happens at time of spill (not in VirtRegMap). Later on, if the GlobalBaseReg is spilled, the spiller can see the use uses GlobalBaseReg and do the right thing.
llvm-svn: 60596
|
|
|
|
| |
llvm-svn: 60592
|
|
|
|
| |
llvm-svn: 60586
|
|
|
|
| |
llvm-svn: 60487
|
|
|
|
|
|
|
| |
and the LiveInterval.h top-level comment and accordingly. This fixes blocks
having spurious live-in registers in boundary cases.
llvm-svn: 60092
|
|
|
|
| |
llvm-svn: 59841
|
|
|
|
|
|
| |
BitVector, instead of manually testing each bit.
llvm-svn: 59246
|
|
|
|
|
|
|
| |
coalescing as a separate pass rather than inside of
LiveIntervalAnalysis.
llvm-svn: 59146
|
|
|
|
|
|
|
| |
- Create and update spill slot live intervals.
- Lots of bug fixes.
llvm-svn: 58367
|
|
|
|
|
|
|
| |
can give it the same stack slot as the spilled interval if it is folded.
This prevents the fold/unfold code from pointing to the wrong register.
llvm-svn: 58255
|
|
|
|
|
|
| |
re-materializable val# (for now).
llvm-svn: 58068
|
|
|
|
| |
llvm-svn: 57766
|
|
|
|
| |
llvm-svn: 57765
|
|
|
|
| |
llvm-svn: 57259
|
|
|
|
|
|
| |
isReg, etc., from isRegister, etc.
llvm-svn: 57006
|
|
|
|
|
|
| |
amount of time to track down.
llvm-svn: 56889
|
|
|
|
| |
llvm-svn: 56848
|
|
|
|
|
|
|
|
|
|
| |
"If a re-materializable instruction has a register
operand, the spiller will change the register operand's
spill weight to HUGE_VAL to avoid it being spilled.
However, if the operand is already in the queue ready
to be spilled, avoid re-materializing it".
llvm-svn: 56837
|
|
|
|
|
|
| |
change the register operand's spill weight to HUGE_VAL to avoid it being spilled. However, if the operand is already in the queue ready to be spilled, avoid re-materializing it.
llvm-svn: 56835
|
|
|
|
|
|
|
|
|
|
| |
RA problem by expanding the live interval of an
earlyclobber def back one slot. Remove
overlap-earlyclobber throughout. Remove
earlyclobber bits and their handling from
live internals.
llvm-svn: 56539
|
|
|
|
|
|
|
|
| |
live-in indices
correct in the presence of things like EH labels.
llvm-svn: 56410
|
|
|
|
|
|
|
| |
and redo as linked list walk. Logic moved into RA.
Per review feedback.
llvm-svn: 56326
|
|
|
|
|
|
|
|
|
| |
with an earlyclobber operand elsewhere. Propagate
this bit and the earlyclobber bit through SDISel.
Change linear-scan RA not to allocate regs in a way
that conflicts with an earlyclobber. See also comments.
llvm-svn: 56290
|
|
|
|
|
|
|
|
|
| |
basic block, not at the first
instruction. Also, their valno's should have an unknown def. This has no effect currently, but was
causing issues when StrongPHIElimination was enabled.
llvm-svn: 56231
|
|
|
|
|
|
|
|
|
| |
isImmediate(), isRegister(), and friends, to avoid confusion
about having two different names with the same meaning. I'm
not attached to the longer names, and would be ok with
changing to the shorter names if others prefer it.
llvm-svn: 56189
|
|
|
|
|
|
| |
remat and splitting.
llvm-svn: 55012
|
|
|
|
|
|
|
|
|
| |
appropriate.
With this patch, all of MultiSource/Applications and all of SPEC2000/2006 pass with
the SimpleSpiller and this fast-path enabled.
llvm-svn: 55000
|
|
|
|
| |
llvm-svn: 54958
|
|
|
|
|
|
|
| |
1) Assign stack slots to new temporaries.
2) Don't insert an interval into the return vector more than once.
llvm-svn: 54956
|
|
|
|
|
|
|
|
| |
1) Remove an incorrect assertion.
2) Set the stack slot weight properly.
3) Resize the VirtRegMap when needed.
llvm-svn: 54949
|
|
|
|
|
|
| |
sorted by starting index.
llvm-svn: 54939
|
|
|
|
|
|
| |
MachineRegisterInfo::reg_iterator.
llvm-svn: 54930
|
|
|
|
|
|
|
|
|
| |
remat, or splitting. This code has been updated to current APIs
in so far as it compiles and, in theory, works, but does not take advantage of recent advancements. For instance, it could be improved by using
MachineRegisterInfo::use_iterator.
llvm-svn: 54924
|
|
|
|
| |
llvm-svn: 54766
|
|
|
|
| |
llvm-svn: 54765
|
|
|
|
|
|
|
|
| |
the r2iMap_ by value. This will prevent references to them from being invalidated
if the map is changed.
llvm-svn: 54763
|
|
|
|
| |
llvm-svn: 54425
|
|
|
|
| |
llvm-svn: 54420
|
|
|
|
|
|
| |
remapped.
llvm-svn: 54218
|
|
|
|
| |
llvm-svn: 54186
|
|
|
|
| |
llvm-svn: 54173
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
a new ilist_node class, and remove them. Unlike alist_node,
ilist_node doesn't attempt to manage storage itself, so it avoids
the associated problems, including being opaque in gdb.
Adjust the Recycler class so that it doesn't depend on alist_node.
Also, change it to use explicit Size and Align parameters, allowing
it to work when the largest-sized node doesn't have the greatest
alignment requirement.
Change MachineInstr's MachineMemOperand list from a pool-backed
alist to a std::list for now.
llvm-svn: 54146
|