| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
| |
llvm-svn: 22315
|
| |
|
|
|
|
| |
than just the pointer being loaded or stored
llvm-svn: 22311
|
| |
|
|
|
|
|
| |
integer types. Add a couple checks to not perform these kinds of transform
on floating point values.
llvm-svn: 22228
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
long %bar(long %X) {
%Y = mul long %X, 4294967297
ret long %Y
}
to this:
l1_bar:
mov %EAX, DWORD PTR [%ESP + 4]
mov %EDX, %EAX
add %EDX, DWORD PTR [%ESP + 8]
ret
instead of:
l1_bar:
mov %ECX, DWORD PTR [%ESP + 4]
mov %EDX, 1
mov %EAX, %ECX
mul %EDX
add %EDX, %ECX
add %EDX, DWORD PTR [%ESP + 8]
mov %EAX, %ECX
ret
llvm-svn: 22044
|
| |
|
|
|
|
| |
codepath
llvm-svn: 22019
|
| |
|
|
| |
llvm-svn: 22018
|
| |
|
|
| |
llvm-svn: 22016
|
| |
|
|
| |
llvm-svn: 22015
|
| |
|
|
|
|
| |
special case hacks.
llvm-svn: 22014
|
| |
|
|
| |
llvm-svn: 22011
|
| |
|
|
| |
llvm-svn: 22009
|
| |
|
|
| |
llvm-svn: 21957
|
| |
|
|
| |
llvm-svn: 21917
|
| |
|
|
| |
llvm-svn: 21915
|
| |
|
|
| |
llvm-svn: 21888
|
| |
|
|
| |
llvm-svn: 21882
|
| |
|
|
| |
llvm-svn: 21871
|
| |
|
|
| |
llvm-svn: 21855
|
| |
|
|
| |
llvm-svn: 21838
|
| |
|
|
| |
llvm-svn: 21824
|
| |
|
|
|
|
| |
arithmetic lowering.
llvm-svn: 21818
|
| |
|
|
|
|
| |
being stored/loaded through!
llvm-svn: 21806
|
| |
|
|
| |
llvm-svn: 21805
|
| |
|
|
| |
llvm-svn: 21803
|
| |
|
|
|
|
|
|
|
| |
population (ctpop). Generic lowering is implemented, however only promotion
is implemented for SelectionDAG at the moment.
More coming soon.
llvm-svn: 21676
|
| |
|
|
| |
llvm-svn: 21605
|
| |
|
|
|
|
|
|
| |
enables one to use alias analysis in the backends.
(TRUNK)Stores and (EXT|ZEXT|SEXT)Loads have an extra SDOperand which is a SrcValueSDNode which contains the Value*. Note that if the operation is introduced by the backend, it will still have the operand, but the value* will be null.
llvm-svn: 21599
|
| |
|
|
| |
llvm-svn: 21552
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
int foo1(int x, int y) {
int t1 = x >= 0;
int t2 = y >= 0;
return t1 & t2;
}
int foo2(int x, int y) {
int t1 = x == -1;
int t2 = y == -1;
return t1 & t2;
}
produces:
_foo1:
or r2, r4, r3
srwi r2, r2, 31
xori r3, r2, 1
blr
_foo2:
and r2, r4, r3
addic r2, r2, 1
li r2, 0
addze r3, r2
blr
instead of:
_foo1:
srwi r2, r4, 31
xori r2, r2, 1
srwi r3, r3, 31
xori r3, r3, 1
and r3, r2, r3
blr
_foo2:
addic r2, r4, 1
li r2, 0
addze r2, r2
addic r3, r3, 1
li r3, 0
addze r3, r3
and r3, r2, r3
blr
llvm-svn: 21547
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
_foo:
or r2, r4, r3
srwi r3, r2, 31
blr
instead of:
_foo:
srwi r2, r4, 31
srwi r3, r3, 31
or r3, r2, r3
blr
llvm-svn: 21544
|
| |
|
|
| |
llvm-svn: 21439
|
| |
|
|
| |
llvm-svn: 21420
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
bool %test(int %X) {
%Y = and int %X, 8
%Z = setne int %Y, 0
ret bool %Z
}
we now generate this:
rlwinm r2, r3, 0, 28, 28
srwi r3, r2, 3
instead of this:
rlwinm r2, r3, 0, 28, 28
srwi r2, r2, 3
rlwinm r3, r2, 0, 31, 31
I'll leave it to Nate to get it down to one instruction. :)
---------------------------------------------------------------------
llvm-svn: 21391
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This turns this PPC code:
rlwinm r2, r3, 0, 28, 28
cmpwi cr7, r2, 8
mfcr r2
rlwinm r3, r2, 31, 31, 31
into this:
rlwinm r2, r3, 0, 28, 28
srwi r2, r2, 3
rlwinm r3, r2, 0, 31, 31
Next up, nuking the extra and.
llvm-svn: 21390
|
| |
|
|
| |
llvm-svn: 21319
|
| |
|
|
| |
llvm-svn: 21318
|
| |
|
|
| |
llvm-svn: 21317
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
// (X != 0) | (Y != 0) -> (X|Y != 0)
// (X == 0) & (Y == 0) -> (X|Y == 0)
Compiling this:
int %bar(int %a, int %b) {
entry:
%tmp.1 = setne int %a, 0
%tmp.2 = setne int %b, 0
%tmp.3 = or bool %tmp.1, %tmp.2
%retval = cast bool %tmp.3 to int
ret int %retval
}
to this:
_bar:
or r2, r3, r4
addic r3, r2, -1
subfe r3, r3, r2
blr
instead of:
_bar:
addic r2, r3, -1
subfe r2, r2, r3
addic r3, r4, -1
subfe r3, r3, r4
or r3, r2, r3
blr
llvm-svn: 21316
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
eliminating an and for Nate's testcase:
int %bar(int %a, int %b) {
entry:
%tmp.1 = setne int %a, 0
%tmp.2 = setne int %b, 0
%tmp.3 = or bool %tmp.1, %tmp.2
%retval = cast bool %tmp.3 to int
ret int %retval
}
generating:
_bar:
addic r2, r3, -1
subfe r2, r2, r3
addic r3, r4, -1
subfe r3, r3, r4
or r3, r2, r3
blr
instead of:
_bar:
addic r2, r3, -1
subfe r2, r2, r3
addic r3, r4, -1
subfe r3, r3, r4
or r2, r2, r3
rlwinm r3, r2, 0, 31, 31
blr
llvm-svn: 21315
|
| |
|
|
|
|
| |
in the PPC Pattern ISel
llvm-svn: 21297
|
| |
|
|
|
|
|
|
| |
Move the transform for select (a < 0) ? b : 0 into the dag from ppc isel
Enable the dag to fold and (setcc, 1) -> setcc for targets where setcc
always produces zero or one.
llvm-svn: 21291
|
| |
|
|
| |
llvm-svn: 21289
|
| |
|
|
| |
llvm-svn: 21288
|
| |
|
|
|
|
| |
with != 0 comparisons vanishing.
llvm-svn: 21287
|
| |
|
|
| |
llvm-svn: 21273
|
| |
|
|
| |
llvm-svn: 21272
|
| |
|
|
|
|
| |
instead. OVerall, this increases the amount of folding we can do.
llvm-svn: 21265
|
| |
|
|
| |
llvm-svn: 21262
|
| |
|
|
|
|
| |
Make llvm undef values generate ISD::UNDEF nodes
llvm-svn: 21261
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
compile this:
int foo (unsigned long a, unsigned long long g) {
return a >= g;
}
To:
foo:
movl 8(%esp), %eax
cmpl %eax, 4(%esp)
setae %al
cmpl $0, 12(%esp)
sete %cl
andb %al, %cl
movzbl %cl, %eax
ret
instead of:
foo:
movl 8(%esp), %eax
cmpl %eax, 4(%esp)
setae %al
movzbw %al, %cx
movl 12(%esp), %edx
cmpl $0, %edx
sete %al
movzbw %al, %ax
cmpl $0, %edx
cmove %cx, %ax
movzbl %al, %eax
ret
llvm-svn: 21244
|