mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-28 07:05:03 +00:00
279c22e6da
Where previously LLVM might emit code like this: ucomisd %xmm1, %xmm0 setne %al setp %cl orb %al, %cl jne .LBB4_2 it now emits this: ucomisd %xmm1, %xmm0 jne .LBB4_2 jp .LBB4_2 It has fewer instructions and uses fewer registers, but it does have more branches. And in the case that this code is followed by a non-fallthrough edge, it may be followed by a jmp instruction, resulting in three branch instructions in sequence. Some effort is made to avoid this situation. To achieve this, X86ISelLowering.cpp now recognizes FCMP_OEQ and FCMP_UNE in lowered form, and replace them with code that emits two branches, except in the case where it would require converting a fall-through edge to an explicit branch. Also, X86InstrInfo.cpp's branch analysis and transform code now knows now to handle blocks with multiple conditional branches. It uses loops instead of having fixed checks for up to two instructions. It can now analyze and transform code generated from FCMP_OEQ and FCMP_UNE. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57873 91177308-0d34-0410-b5e6-96231b3b80d8
32 lines
655 B
LLVM
32 lines
655 B
LLVM
; llvm-as < %s | llc -march=x86 > %t
|
|
; not grep cmp %t
|
|
; not grep xor %t
|
|
; grep jne %t | count 1
|
|
; grep jp %t | count 1
|
|
; grep setnp %t | count 1
|
|
; grep sete %t | count 1
|
|
; grep and %t | count 1
|
|
; grep cvt %t | count 4
|
|
|
|
define i32 @isint_return(double %d) nounwind {
|
|
%i = fptosi double %d to i32
|
|
%e = sitofp i32 %i to double
|
|
%c = fcmp oeq double %d, %e
|
|
%z = zext i1 %c to i32
|
|
ret i32 %z
|
|
}
|
|
|
|
declare void @foo()
|
|
|
|
define void @isint_branch(double %d) nounwind {
|
|
%i = fptosi double %d to i32
|
|
%e = sitofp i32 %i to double
|
|
%c = fcmp oeq double %d, %e
|
|
br i1 %c, label %true, label %false
|
|
true:
|
|
call void @foo()
|
|
ret void
|
|
false:
|
|
ret void
|
|
}
|