| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
llvm-svn: 19930
|
| |
|
|
| |
llvm-svn: 19924
|
| |
|
|
| |
llvm-svn: 19880
|
| |
|
|
|
|
| |
truncated, e.g. (truncate:i8 something:i16) on a 32 or 64-bit RISC.
llvm-svn: 19879
|
| |
|
|
| |
llvm-svn: 19878
|
| |
|
|
|
|
| |
legalized, and actually return the correct result when we legalize the chain first.
llvm-svn: 19866
|
| |
|
|
| |
llvm-svn: 19797
|
| |
|
|
|
|
|
| |
registers. This information is computed directly by the register allocator
now.
llvm-svn: 19795
|
| |
|
|
| |
llvm-svn: 19793
|
| |
|
|
| |
llvm-svn: 19792
|
| |
|
|
| |
llvm-svn: 19791
|
| |
|
|
| |
llvm-svn: 19789
|
| |
|
|
| |
llvm-svn: 19787
|
| |
|
|
|
|
|
| |
The first half of correct chain insertion for libcalls. This is not enough
to fix Fhourstones yet though.
llvm-svn: 19781
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the new TLI that is available.
Implement support for handling out of range shifts. This allows us to
compile this code (a 64-bit rotate):
unsigned long long f3(unsigned long long x) {
return (x << 32) | (x >> (64-32));
}
into this:
f3:
mov %EDX, DWORD PTR [%ESP + 4]
mov %EAX, DWORD PTR [%ESP + 8]
ret
GCC produces this:
$ gcc t.c -masm=intel -O3 -S -o - -fomit-frame-pointer
..
f3:
push %ebx
mov %ebx, DWORD PTR [%esp+12]
mov %ecx, DWORD PTR [%esp+8]
mov %eax, %ebx
mov %edx, %ecx
pop %ebx
ret
The Simple ISEL produces (eww gross):
f3:
sub %ESP, 4
mov DWORD PTR [%ESP], %ESI
mov %EDX, DWORD PTR [%ESP + 8]
mov %ECX, DWORD PTR [%ESP + 12]
mov %EAX, 0
mov %ESI, 0
or %EAX, %ECX
or %EDX, %ESI
mov %ESI, DWORD PTR [%ESP]
add %ESP, 4
ret
llvm-svn: 19780
|
| |
|
|
| |
llvm-svn: 19779
|
| |
|
|
| |
llvm-svn: 19763
|
| |
|
|
|
|
| |
This fixes the return-address-not-being-saved problem in the Alpha backend.
llvm-svn: 19741
|
| |
|
|
| |
llvm-svn: 19739
|
| |
|
|
| |
llvm-svn: 19738
|
| |
|
|
| |
llvm-svn: 19737
|
| |
|
|
| |
llvm-svn: 19736
|
| |
|
|
| |
llvm-svn: 19735
|
| |
|
|
| |
llvm-svn: 19727
|
| |
|
|
|
|
| |
operations for 64-bit integers.
llvm-svn: 19724
|
| |
|
|
| |
llvm-svn: 19721
|
| |
|
|
| |
llvm-svn: 19715
|
| |
|
|
| |
llvm-svn: 19714
|
| |
|
|
| |
llvm-svn: 19712
|
| |
|
|
| |
llvm-svn: 19707
|
| |
|
|
| |
llvm-svn: 19704
|
| |
|
|
| |
llvm-svn: 19703
|
| |
|
|
| |
llvm-svn: 19701
|
| |
|
|
|
|
| |
independent of each other.
llvm-svn: 19700
|
| |
|
|
| |
llvm-svn: 19699
|
| |
|
|
| |
llvm-svn: 19698
|
| |
|
|
| |
llvm-svn: 19696
|
| |
|
|
|
|
|
| |
well as all of teh other stuff in livevar. This fixes the compiler crash
on fourinarow last night.
llvm-svn: 19695
|
| |
|
|
|
|
| |
instead of doing it manually.
llvm-svn: 19685
|
| |
|
|
|
|
|
|
| |
select operations or to shifts that are by a constant. This automatically
implements (with no special code) all of the special cases for shift by 32,
shift by < 32 and shift by > 32.
llvm-svn: 19679
|
| |
|
|
| |
llvm-svn: 19675
|
| |
|
|
|
|
| |
of zero and sign extends.
llvm-svn: 19671
|
| |
|
|
| |
llvm-svn: 19670
|
| |
|
|
|
|
|
|
|
| |
do it. This results in better code on X86 for floats (because if strict
precision is not required, we can elide some more expensive double -> float
conversions like the old isel did), and allows other targets to emit
CopyFromRegs that are not legal for arguments.
llvm-svn: 19668
|
| |
|
|
| |
llvm-svn: 19657
|
| |
|
|
| |
llvm-svn: 19656
|
| |
|
|
| |
llvm-svn: 19651
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
X86/reg-pressure.ll again, and allows us to do nice things in other cases.
For example, we now codegen this sort of thing:
int %loadload(int *%X, int* %Y) {
%Z = load int* %Y
%Y = load int* %X ;; load between %Z and store
%Q = add int %Z, 1
store int %Q, int* %Y
ret int %Y
}
Into this:
loadload:
mov %EAX, DWORD PTR [%ESP + 4]
mov %EAX, DWORD PTR [%EAX]
mov %ECX, DWORD PTR [%ESP + 8]
inc DWORD PTR [%ECX]
ret
where we weren't able to form the 'inc [mem]' before. This also lets the
instruction selector emit loads in any order it wants to, which can be good
for register pressure as well.
llvm-svn: 19644
|
| |
|
|
| |
llvm-svn: 19642
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the basic block that uses them if possible. This is a big win on X86, as it
lets us fold the argument loads into instructions and reduce register pressure
(by not loading all of the arguments in the entry block).
For this (contrived to show the optimization) testcase:
int %argtest(int %A, int %B) {
%X = sub int 12345, %A
br label %L
L:
%Y = add int %X, %B
ret int %Y
}
we used to produce:
argtest:
mov %ECX, DWORD PTR [%ESP + 4]
mov %EAX, 12345
sub %EAX, %ECX
mov %EDX, DWORD PTR [%ESP + 8]
.LBBargtest_1: # L
add %EAX, %EDX
ret
now we produce:
argtest:
mov %EAX, 12345
sub %EAX, DWORD PTR [%ESP + 4]
.LBBargtest_1: # L
add %EAX, DWORD PTR [%ESP + 8]
ret
This also fixes the FIXME in the code.
BTW, this occurs in real code. 164.gzip shrinks from 8623 to 8608 lines of
.s file. The stack frame in huft_build shrinks from 1644->1628 bytes,
inflate_codes shrinks from 116->108 bytes, and inflate_block from 2620->2612,
due to fewer spills.
Take that alkis. :-)
llvm-svn: 19639
|