mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	define double @foo(double %x, double %y, i1 %c) nounwind {
  %a = fdiv double %x, 3.2
  %z = select i1 %c, double %a, double %y
  ret double %z
}
Was:
_foo:
        divsd   LCPI0_0(%rip), %xmm0
        testb   $1, %dil
        jne     LBB0_2
        movaps  %xmm1, %xmm0
LBB0_2:
        ret
Now:
_foo:
        testb   $1, %dil
        je      LBB0_2
        divsd   LCPI0_0(%rip), %xmm0
        ret
LBB0_2:
        movaps  %xmm1, %xmm0
        ret
This avoids the divsd when early exit is taken.
rdar://8454886
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114372 91177308-0d34-0410-b5e6-96231b3b80d8
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: llc < %s -march=x86-64 | FileCheck %s
 | 
						|
 | 
						|
; Convert oeq and une to ole/oge/ule/uge when comparing with infinity
 | 
						|
; and negative infinity, because those are more efficient on x86.
 | 
						|
 | 
						|
; CHECK: oeq_inff:
 | 
						|
; CHECK: ucomiss
 | 
						|
; CHECK: jb
 | 
						|
define float @oeq_inff(float %x, float %y) nounwind readonly {
 | 
						|
  %t0 = fcmp oeq float %x, 0x7FF0000000000000
 | 
						|
  %t1 = select i1 %t0, float 1.0, float %y
 | 
						|
  ret float %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: oeq_inf:
 | 
						|
; CHECK: ucomisd
 | 
						|
; CHECK: jb
 | 
						|
define double @oeq_inf(double %x, double %y) nounwind readonly {
 | 
						|
  %t0 = fcmp oeq double %x, 0x7FF0000000000000
 | 
						|
  %t1 = select i1 %t0, double 1.0, double %y
 | 
						|
  ret double %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: une_inff:
 | 
						|
; CHECK: ucomiss
 | 
						|
; CHECK: jae
 | 
						|
define float @une_inff(float %x, float %y) nounwind readonly {
 | 
						|
  %t0 = fcmp une float %x, 0x7FF0000000000000
 | 
						|
  %t1 = select i1 %t0, float 1.0, float %y
 | 
						|
  ret float %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: une_inf:
 | 
						|
; CHECK: ucomisd
 | 
						|
; CHECK: jae
 | 
						|
define double @une_inf(double %x, double %y) nounwind readonly {
 | 
						|
  %t0 = fcmp une double %x, 0x7FF0000000000000
 | 
						|
  %t1 = select i1 %t0, double 1.0, double %y
 | 
						|
  ret double %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: oeq_neg_inff:
 | 
						|
; CHECK: ucomiss
 | 
						|
; CHECK: jb
 | 
						|
define float @oeq_neg_inff(float %x, float %y) nounwind readonly {
 | 
						|
  %t0 = fcmp oeq float %x, 0xFFF0000000000000
 | 
						|
  %t1 = select i1 %t0, float 1.0, float %y
 | 
						|
  ret float %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: oeq_neg_inf:
 | 
						|
; CHECK: ucomisd
 | 
						|
; CHECK: jb
 | 
						|
define double @oeq_neg_inf(double %x, double %y) nounwind readonly {
 | 
						|
  %t0 = fcmp oeq double %x, 0xFFF0000000000000
 | 
						|
  %t1 = select i1 %t0, double 1.0, double %y
 | 
						|
  ret double %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: une_neg_inff:
 | 
						|
; CHECK: ucomiss
 | 
						|
; CHECK: jae
 | 
						|
define float @une_neg_inff(float %x, float %y) nounwind readonly {
 | 
						|
  %t0 = fcmp une float %x, 0xFFF0000000000000
 | 
						|
  %t1 = select i1 %t0, float 1.0, float %y
 | 
						|
  ret float %t1
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: une_neg_inf:
 | 
						|
; CHECK: ucomisd
 | 
						|
; CHECK: jae
 | 
						|
define double @une_neg_inf(double %x, double %y) nounwind readonly {
 | 
						|
  %t0 = fcmp une double %x, 0xFFF0000000000000
 | 
						|
  %t1 = select i1 %t0, double 1.0, double %y
 | 
						|
  ret double %t1
 | 
						|
}
 |