1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00

Add README entry; based on testcase from Bill Hart.

llvm-svn: 105878
This commit is contained in:
Eli Friedman 2010-06-12 05:54:27 +00:00
parent e7cbed3e37
commit b4ac3e405c

View File

@ -1863,3 +1863,47 @@ LLVM prefers comparisons with zero over non-zero in general, but in this
case it choses instead to keep the max operation obvious.
//===---------------------------------------------------------------------===//
Take the following testcase on x86-64 (similar testcases exist for all targets
with addc/adde):
define void @a(i64* nocapture %s, i64* nocapture %t, i64 %a, i64 %b,
i64 %c) nounwind {
entry:
%0 = zext i64 %a to i128 ; <i128> [#uses=1]
%1 = zext i64 %b to i128 ; <i128> [#uses=1]
%2 = add i128 %1, %0 ; <i128> [#uses=2]
%3 = zext i64 %c to i128 ; <i128> [#uses=1]
%4 = shl i128 %3, 64 ; <i128> [#uses=1]
%5 = add i128 %4, %2 ; <i128> [#uses=1]
%6 = lshr i128 %5, 64 ; <i128> [#uses=1]
%7 = trunc i128 %6 to i64 ; <i64> [#uses=1]
store i64 %7, i64* %s, align 8
%8 = trunc i128 %2 to i64 ; <i64> [#uses=1]
store i64 %8, i64* %t, align 8
ret void
}
Generated code:
addq %rcx, %rdx
movl $0, %eax
adcq $0, %rax
addq %r8, %rax
movq %rax, (%rdi)
movq %rdx, (%rsi)
ret
Expected code:
addq %rcx, %rdx
adcq $0, %r8
movq %r8, (%rdi)
movq %rdx, (%rsi)
ret
The generated SelectionDAG has an ADD of an ADDE, where both operands of the
ADDE are zero. Replacing one of the operands of the ADDE with the other operand
of the ADD, and replacing the ADD with the ADDE, should give the desired result.
(That said, we are doing a lot better than gcc on this testcase. :) )
//===---------------------------------------------------------------------===//