| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
| |
live range splitting around loops guided by register pressure.
So far, trySplit() simply prints a lot of debug output.
llvm-svn: 121918
|
|
|
|
|
|
|
|
| |
A MachineLoopRange contains the intervals of slot indexes covered by the blocks
in a loop. This representation of the loop blocks is more efficient to compare
against interfering registers during register coalescing.
llvm-svn: 121917
|
|
|
|
| |
llvm-svn: 121903
|
|
|
|
|
|
|
| |
function so that it can live in Analysis instead of
VMCore.
llvm-svn: 121885
|
|
|
|
| |
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
|
|
|
|
|
|
| |
a wider mul if the wider mul is legal.
llvm-svn: 121848
|
|
|
|
|
|
| |
result, the top bits are truncated off anyway, just use SRL.
llvm-svn: 121846
|
|
|
|
| |
llvm-svn: 121807
|
|
|
|
| |
llvm-svn: 121806
|
|
|
|
| |
llvm-svn: 121805
|
|
|
|
| |
llvm-svn: 121801
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
regB = move RCX
regA = op regB, regC
RAX = move regA
where both regB and regC are killed. If regB is constrainted to non-compatible
physical registers but regC is not constrainted at all, then it's better to
commute the instruction.
movl %edi, %eax
shlq $32, %rcx
leaq (%rcx,%rax), %rax
=>
movl %edi, %eax
shlq $32, %rcx
orq %rcx, %rax
rdar://8762995
llvm-svn: 121793
|
|
|
|
|
|
| |
warning in the opt build.
llvm-svn: 121791
|
|
|
|
| |
llvm-svn: 121783
|
|
|
|
|
|
| |
LiveIntervalUnions.
llvm-svn: 121781
|
|
|
|
| |
llvm-svn: 121774
|
|
|
|
| |
llvm-svn: 121741
|
|
|
|
|
|
|
|
| |
spill weight. Filter out fixed registers instead.
Add support for reassigning an interference that was assigned to an alias.
llvm-svn: 121737
|
|
|
|
| |
llvm-svn: 121736
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
when the wider type is legal. This allows us to compile:
define zeroext i16 @test1(i16 zeroext %x) nounwind {
entry:
%div = udiv i16 %x, 33
ret i16 %div
}
into:
test1: # @test1
movzwl 4(%esp), %eax
imull $63551, %eax, %eax # imm = 0xF83F
shrl $21, %eax
ret
instead of:
test1: # @test1
movw $-1985, %ax # imm = 0xFFFFFFFFFFFFF83F
mulw 4(%esp)
andl $65504, %edx # imm = 0xFFE0
movl %edx, %eax
shrl $5, %eax
ret
Implementing rdar://8760399 and example #4 from:
http://blog.regehr.org/archives/320
We should implement the same thing for [su]mul_hilo, but I don't
have immediate plans to do this.
llvm-svn: 121696
|
|
|
|
|
|
|
|
|
|
|
| |
for each constant pool entry. Using WriteTypeSymbolic here takes time
proportional to the size of the module, for each constant pool entry.
This speeds up -verbose-asm llc on 252.eon (a random testcase at my disposal)
from 4.4s to 2.137s. llc takes 2.11s with asm-verbose off, so this is now a
pretty reasonable cost for verbose comments.
llvm-svn: 121691
|
|
|
|
| |
llvm-svn: 121662
|
|
|
|
|
|
|
| |
catch this here rather than later after accessing uninitialized memory
etc. Fires when compiling the testcase in PR8237.
llvm-svn: 121635
|
|
|
|
| |
llvm-svn: 121604
|
|
|
|
| |
llvm-svn: 121599
|
|
|
|
|
|
| |
Fix build breakage.
llvm-svn: 121596
|
|
|
|
|
|
| |
lib/CodeGen/RegAllocGreedy.cpp:233: error: unused variable 'TRC' [-Wunused-variable]
llvm-svn: 121594
|
|
|
|
|
|
|
| |
Soon, RegAllocGreedy will start splitting live ranges, and then deferred
spilling won't work anyway.
llvm-svn: 121591
|
|
|
|
|
|
|
|
| |
The spiller should only spill. The register allocator will drive live range
splitting, it has the needed information about register pressure and
interferences.
llvm-svn: 121590
|
|
|
|
| |
llvm-svn: 121584
|
|
|
|
|
|
| |
interference check.
llvm-svn: 121519
|
|
|
|
|
|
|
|
|
|
|
| |
registers for a given virtual register.
Reserved registers are filtered from the allocation order, and any valid hint is
returned as the first suggestion.
For target dependent hints, a number of arcane target hooks are invoked.
llvm-svn: 121497
|
|
|
|
| |
llvm-svn: 121471
|
|
|
|
| |
llvm-svn: 121461
|
|
|
|
|
|
|
|
|
|
|
| |
f:
.cfi_startproc
nop
.cfi_endproc
assembled (on ELF).
llvm-svn: 121434
|
|
|
|
|
|
| |
Necessary for byval support on ARM. Radar 7662569.
llvm-svn: 121412
|
|
|
|
| |
llvm-svn: 121411
|
|
|
|
| |
llvm-svn: 121410
|
|
|
|
|
|
|
| |
heuristic to reshuffle register assignments when we can't find an
available reg.
llvm-svn: 121388
|
|
|
|
| |
llvm-svn: 121356
|
|
|
|
|
|
|
|
|
|
|
| |
references instead.
Similarly, IntervalMap::begin() is almost as expensive as find(), so use find(x)
instead of begin().advanceTo(x);
This makes RegAllocBasic run another 5% faster.
llvm-svn: 121344
|
|
|
|
|
|
|
|
| |
instead.
This fixes radar 8730409.
llvm-svn: 121323
|
|
|
|
| |
llvm-svn: 121319
|
|
|
|
|
|
|
| |
The hint is simply tried first and then forgotten if it couldn't be allocated
immediately.
llvm-svn: 121306
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
abstract priority queue interface in subclasses that want to override the
priority calculations.
Subclasses must provide a getPriority() implementation instead.
This approach requires less code as long as priorities are expressable as simple
floats, and it avoids the dangers of defining potentially expensive priority
comparison functions.
It also should speed up priority_queue operations since they no longer have to
chase pointers when comparing registers. This is not measurable, though.
Preferably, we shouldn't use floats to guide code generation. The use of floats
here is derived from the use of floats for spill weights. Spill weights have a
dynamic range that doesn't lend itself easily to a fixpoint implementation.
When someone invents a stable spill weight representation, it can be reused for
allocation priorities.
llvm-svn: 121294
|
|
|
|
| |
llvm-svn: 121293
|
|
|
|
| |
llvm-svn: 121285
|
|
|
|
| |
llvm-svn: 121283
|