| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
| |
fixed_ IntervalPtrs. Reset them.
llvm-svn: 70378
|
|
|
|
|
|
| |
this changing codegen so no test case.
llvm-svn: 70351
|
|
|
|
|
|
| |
This fixes a very subtle bug. vr defined by an implicit_def is allowed overlap with any register since it doesn't actually modify anything. However, if it's used as a two-address use, its live range can be extended and it can be spilled. The spiller must take care not to emit a reload for the vn number that's defined by the implicit_def. This is both a correctness and performance issue.
llvm-svn: 69743
|
|
|
|
|
|
| |
- Find more reloads from SS.
llvm-svn: 69606
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
allocator spill an interval with multiple uses in the same basic block, it creates a different virtual register for each of the reloads. e.g.
%reg1498<def> = MOV32rm %reg1024, 1, %reg0, 12, %reg0, Mem:LD(4,4) [sunkaddr39 + 0]
%reg1506<def> = MOV32rm %reg1024, 1, %reg0, 8, %reg0, Mem:LD(4,4) [sunkaddr42 + 0]
%reg1486<def> = MOV32rr %reg1506
%reg1486<def> = XOR32rr %reg1486, %reg1498, %EFLAGS<imp-def,dead>
%reg1510<def> = MOV32rm %reg1024, 1, %reg0, 4, %reg0, Mem:LD(4,4) [sunkaddr45 + 0]
=>
%reg1498<def> = MOV32rm %reg2036, 1, %reg0, 12, %reg0, Mem:LD(4,4) [sunkaddr39 + 0]
%reg1506<def> = MOV32rm %reg2037, 1, %reg0, 8, %reg0, Mem:LD(4,4) [sunkaddr42 + 0]
%reg1486<def> = MOV32rr %reg1506
%reg1486<def> = XOR32rr %reg1486, %reg1498, %EFLAGS<imp-def,dead>
%reg1510<def> = MOV32rm %reg2038, 1, %reg0, 4, %reg0, Mem:LD(4,4) [sunkaddr45 + 0]
From linearscan's point of view, each of reg2036, 2037, and 2038 are separate registers, each is "killed" after a single use. The reloaded register is available and it's often clobbered right away. e.g. In thise case reg1498 is allocated EAX while reg2036 is allocated RAX. This means we end up with multiple reloads from the same stack slot in the same basic block.
Now linearscan recognize there are other reloads from same SS in the same BB. So it'll "downgrade" RAX (and its aliases) after reg2036 is allocated until the next reload (reg2037) is done. This greatly increase the likihood reloads from SS are reused.
This speeds up sha1 from OpenSSL by 5.8%. It is also an across the board win for SPEC2000 and 2006.
llvm-svn: 69585
|
|
|
|
|
|
|
|
|
|
|
| |
the super-register is in the register class we are trying to allocate. Then add the weight to all sub-registers of the super-register even if they are not aliases.
e.g. allocating for GR32, bh is not used, updating bl spill weight.
bl should get the same spill weight otherwise it will be choosen
as a spill candidate since spilling bh doesn't make ebx available.
This fix PR2866.
llvm-svn: 67574
|
|
|
|
| |
llvm-svn: 67544
|
|
|
|
| |
llvm-svn: 66870
|
|
|
|
|
|
| |
No (intended) functionality change.
llvm-svn: 66720
|
|
|
|
|
|
| |
sub-register indices as well.
llvm-svn: 62600
|
|
|
|
| |
llvm-svn: 62547
|
|
|
|
| |
llvm-svn: 61715
|
|
|
|
|
|
|
|
| |
point bug.
- If a def is spilt, remember its spill index to allow its reuse.
llvm-svn: 58375
|
|
|
|
|
|
|
| |
- Create and update spill slot live intervals.
- Lots of bug fixes.
llvm-svn: 58367
|
|
|
|
|
|
| |
splitting pass. It's handling simple cases and appear to do good things. Next: avoid splitting an interval multiple times; renumber registers when possible; record stack slot live intervals for coloring; rematerialize defs when possible.
llvm-svn: 58044
|
|
|
|
|
|
|
|
|
| |
instead of requiring all "short description" strings to begin with
two spaces. This makes these strings less mysterious, and it fixes
some cases where short description strings mistakenly did not
begin with two spaces.
llvm-svn: 57521
|
|
|
|
| |
llvm-svn: 57259
|
|
|
|
| |
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
|
|
|
|
|
|
| |
Check bits for preferred register.
llvm-svn: 56384
|
|
|
|
|
|
| |
around the live interval being allocated. Do not continue to try to spill another register, just grab the physical register and move on.
llvm-svn: 56381
|
|
|
|
|
|
| |
have previously been assigned conflicting physreg.
llvm-svn: 56364
|
|
|
|
|
|
|
| |
and redo as linked list walk. Logic moved into RA.
Per review feedback.
llvm-svn: 56326
|
|
|
|
| |
llvm-svn: 56314
|
|
|
|
|
|
|
|
|
| |
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
|
|
|
|
|
|
| |
preference register is not in the right register class. This can happen due to sub-register coalescing.
llvm-svn: 56006
|
|
|
|
| |
llvm-svn: 55779
|
|
|
|
|
|
| |
appropriate for cases where std::vector is still used.
llvm-svn: 54820
|
|
|
|
| |
llvm-svn: 54770
|
|
|
|
|
|
|
|
| |
the r2iMap_ by value. This will prevent references to them from being invalidated
if the map is changed.
llvm-svn: 54763
|
|
|
|
|
|
|
|
|
| |
forgot
to multiply the instruction count by a constant factor in a few places, which
caused the register allocator to require many more iterations.
llvm-svn: 53959
|
|
|
|
|
|
|
| |
live intervals itself to use an instruction count approximation that is
not affected by inserting empty indices.
llvm-svn: 53937
|
|
|
|
|
|
| |
as a questionable case, but the code isn't actually needed.
llvm-svn: 52657
|
|
|
|
|
|
|
|
| |
picking the register with the lowest spill weight. Consider (up to) 2 additional registers with spill weights that are close to the lowest spill weight. The one with fewest defs and uses that conflicts with the current interval (weighted by loop depth) is the spill candidate.
This is not always a win, but there are much more wins than loses and wins tend to be more noticeable.
llvm-svn: 52554
|
|
|
|
| |
llvm-svn: 52040
|
|
|
|
| |
llvm-svn: 51934
|
|
|
|
|
|
| |
backtracking.
llvm-svn: 49544
|
|
|
|
| |
llvm-svn: 49167
|
|
|
|
| |
llvm-svn: 48751
|
|
|
|
| |
llvm-svn: 48341
|
|
|
|
|
|
| |
around the def's and use's of the interval being allocated to make it possible for the interval to target a register and spill it right away and restore a register for uses. This likely generates terrible code but is before than aborting.
llvm-svn: 48218
|
|
|
|
| |
llvm-svn: 48204
|
|
|
|
| |
llvm-svn: 48175
|
|
|
|
|
|
|
|
| |
instead of init'ing it maximally to zeros on entry. getFreePhysReg
is pretty hot and only a few elements are typically used. This speeds
up linscan by 5% on 176.gcc.
llvm-svn: 47631
|
|
|
|
| |
llvm-svn: 47629
|
|
|
|
|
|
| |
would have been a Godsend here!
llvm-svn: 47625
|
|
|
|
| |
llvm-svn: 47375
|
|
|
|
| |
llvm-svn: 46930
|