| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
fixed stack slots.
llvm-svn: 47529
|
| |
|
|
| |
llvm-svn: 47527
|
| |
|
|
| |
llvm-svn: 47525
|
| |
|
|
| |
llvm-svn: 47513
|
| |
|
|
| |
llvm-svn: 47501
|
| |
|
|
| |
llvm-svn: 47476
|
| |
|
|
|
|
|
|
| |
instead of with mmx registers. This horribleness is apparently
done by gcc to avoid having to insert emms in places that really
should have it. This is the second half of rdar://5741668.
llvm-svn: 47474
|
| |
|
|
|
|
|
|
|
|
| |
GCC apparently does this, and code depends on not having to do
emms when this happens. This is x86-64 only so far, second half
should handle x86-32.
rdar://5741668
llvm-svn: 47470
|
| |
|
|
|
|
|
|
|
| |
any, we force sdisel to do all regalloc for an asm. This
leads to gross but correct codegen.
This fixes the rest of PR2078.
llvm-svn: 47454
|
| |
|
|
| |
llvm-svn: 47432
|
| |
|
|
| |
llvm-svn: 47427
|
| |
|
|
|
|
|
|
|
|
| |
inline asms.
Fix PR2078 by marking aliases of registers used when a register is
marked used. This prevents EAX from being allocated when AX is listed
in the clobber set for the asm.
llvm-svn: 47426
|
| |
|
|
| |
llvm-svn: 47355
|
| |
|
|
| |
llvm-svn: 47331
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This compiles test-nofold.ll into:
_test:
movl $15, %ecx
andl 4(%esp), %ecx
testl %ecx, %ecx
movl $42, %eax
cmove %ecx, %eax
ret
instead of:
_test:
movl 4(%esp), %eax
movl %eax, %ecx
andl $15, %ecx
testl $15, %eax
movl $42, %eax
cmove %ecx, %eax
ret
llvm-svn: 47330
|
| |
|
|
|
|
| |
instruction.
llvm-svn: 47329
|
| |
|
|
| |
llvm-svn: 47325
|
| |
|
|
| |
llvm-svn: 47308
|
| |
|
|
|
|
| |
llc: for the -info-output-file option: requires a value!
llvm-svn: 47306
|
| |
|
|
| |
llvm-svn: 47302
|
| |
|
|
| |
llvm-svn: 47296
|
| |
|
|
|
|
|
|
| |
check if it's essentially a SCALAR_TO_VECTOR. Avoid turning (v8i16) <10, u, u, u> to <10, 0, u, u, u, u, u, u>. Instead, simply convert it to a SCALAR_TO_VECTOR of the proper type.
- X86 now normalize SCALAR_TO_VECTOR to (BIT_CONVERT (v4i32 SCALAR_TO_VECTOR)). Get rid of X86ISD::S2VEC.
llvm-svn: 47290
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
has plain one-result scalar integer multiplication instructions.
This avoids expanding such instructions into MUL_LOHI sequences that
must be special-cased at isel time, and avoids the problem with that
code that provented memory operands from being folded.
This fixes PR1874, addressesing the most common case. The uncommon
cases of optimizing multiply-high operations will require work
in DAGCombiner.
llvm-svn: 47277
|
| |
|
|
| |
llvm-svn: 47238
|
| |
|
|
| |
llvm-svn: 47204
|
| |
|
|
| |
llvm-svn: 47189
|
| |
|
|
| |
llvm-svn: 47128
|
| |
|
|
| |
llvm-svn: 47106
|
| |
|
|
| |
llvm-svn: 47102
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
CTTZ and CTPOP. The expansion code differs from
that in LegalizeDAG in that it chooses to take the
CTLZ/CTTZ count from the Hi/Lo part depending on
whether the Hi/Lo value is zero, not on whether
CTLZ/CTTZ of Hi/Lo returned 32 (or whatever the
width of the type is) for it. I made this change
because the optimizers may well know that Hi/Lo
is zero and exploit it. The promotion code for
CTTZ also differs from that in LegalizeDAG: it
uses an "or" to get the right result when the
original value is zero, rather than using a compare
and select. This also means the value doesn't
need to be zero extended.
llvm-svn: 47075
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
node as soon as we create it in SDISel. Previously we would lower it in
legalize. The problem with this is that it only exposes the argument
loads implied by FORMAL_ARGUMENTs after legalize, so that only dag combine 2
can hack on them. This causes us to miss some optimizations because
datatype expansion also happens here.
Exposing the loads early allows us to do optimizations on them. For example
we now compile arg-cast.ll to:
_foo:
movl $2147483647, %eax
andl 8(%esp), %eax
ret
where we previously produced:
_foo:
subl $12, %esp
movsd 16(%esp), %xmm0
movsd %xmm0, (%esp)
movl $2147483647, %eax
andl 4(%esp), %eax
addl $12, %esp
ret
It might also make sense to do this for ISD::CALL nodes, which have implicit
stores on many targets.
llvm-svn: 47054
|
| |
|
|
| |
llvm-svn: 47049
|
| |
|
|
| |
llvm-svn: 47047
|
| |
|
|
| |
llvm-svn: 47018
|
| |
|
|
| |
llvm-svn: 47017
|
| |
|
|
| |
llvm-svn: 46998
|
| |
|
|
|
|
| |
rather than trying to undo the kill marker afterwards.
llvm-svn: 46953
|
| |
|
|
|
|
|
| |
whether SSE is present, on Darwin anyway. Make it
explicit.
llvm-svn: 46909
|
| |
|
|
|
|
| |
the load address first to make sure it's 16 byte aligned.
llvm-svn: 46893
|
| |
|
|
| |
llvm-svn: 46866
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
mode.
Before:
_main:
subq $8, %rsp
leaq _X(%rip), %rax
movsd 8(%rax), %xmm1
movss _X(%rip), %xmm0
call _t
xorl %ecx, %ecx
movl %ecx, %eax
addq $8, %rsp
ret
Now:
_main:
subq $8, %rsp
movsd _X+8(%rip), %xmm1
movss _X(%rip), %xmm0
call _t
xorl %ecx, %ecx
movl %ecx, %eax
addq $8, %rsp
ret
Notice there is another idiotic codegen issue that needs to be fixed asap:
xorl %ecx, %ecx
movl %ecx, %eax
llvm-svn: 46850
|
| |
|
|
| |
llvm-svn: 46825
|
| |
|
|
| |
llvm-svn: 46821
|
| |
|
|
| |
llvm-svn: 46776
|
| |
|
|
|
|
| |
visited earlier, then it is not killed in the def block (i.e. not dead).
llvm-svn: 46763
|
| |
|
|
|
|
| |
expand the result of this operator!" (node: ctlz).
llvm-svn: 46713
|
| |
|
|
|
|
| |
this operator's operand" (node: extract_subvector).
llvm-svn: 46712
|
| |
|
|
| |
llvm-svn: 46711
|
| |
|
|
|
|
|
|
|
| |
any bugs in the future since to get the crash you also
need hacked in fake libcall support (which creates odd
but legal trees), but since adding it doesn't hurt...
Thanks to Chris for this ultimately reduced version.
llvm-svn: 46706
|
| |
|
|
| |
llvm-svn: 46646
|