mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 23:32:27 +00:00
add some notes on really poor codegen.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41319 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
aabd0359a3
commit
9e43d6316f
@ -1134,3 +1134,47 @@ pop into a dummy register instead of using addl/subl of esp. Just don't pop
|
|||||||
into any return registers :)
|
into any return registers :)
|
||||||
|
|
||||||
//===---------------------------------------------------------------------===//
|
//===---------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
The X86 backend should fold (branch (or (setcc, setcc))) into multiple
|
||||||
|
branches. We generate really poor code for:
|
||||||
|
|
||||||
|
double testf(double a) {
|
||||||
|
return a == 0.0 ? 0.0 : (a > 0.0 ? 1.0 : -1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
For example, the entry BB is:
|
||||||
|
|
||||||
|
_testf:
|
||||||
|
subl $20, %esp
|
||||||
|
pxor %xmm0, %xmm0
|
||||||
|
movsd 24(%esp), %xmm1
|
||||||
|
ucomisd %xmm0, %xmm1
|
||||||
|
setnp %al
|
||||||
|
sete %cl
|
||||||
|
testb %cl, %al
|
||||||
|
jne LBB1_5 # UnifiedReturnBlock
|
||||||
|
LBB1_1: # cond_true
|
||||||
|
|
||||||
|
|
||||||
|
it would be better to replace the last four instructions with:
|
||||||
|
|
||||||
|
jp LBB1_1
|
||||||
|
je LBB1_5
|
||||||
|
LBB1_1:
|
||||||
|
|
||||||
|
We also codegen the inner ?: into a diamond:
|
||||||
|
|
||||||
|
cvtss2sd LCPI1_0(%rip), %xmm2
|
||||||
|
cvtss2sd LCPI1_1(%rip), %xmm3
|
||||||
|
ucomisd %xmm1, %xmm0
|
||||||
|
ja LBB1_3 # cond_true
|
||||||
|
LBB1_2: # cond_true
|
||||||
|
movapd %xmm3, %xmm2
|
||||||
|
LBB1_3: # cond_true
|
||||||
|
movapd %xmm2, %xmm0
|
||||||
|
ret
|
||||||
|
|
||||||
|
We should sink the load into xmm3 into the LBB1_2 block. This should
|
||||||
|
be pretty easy, and will nuke all the copies.
|
||||||
|
|
||||||
|
//===---------------------------------------------------------------------===//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user