mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
643bef9333
We would attempt to replace an frem's operand with the same operand. This would cause InstCombine to think real work was done, causing InstCombine to enter an infinite loop. This fixes the second part of PR21576. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222265 91177308-0d34-0410-b5e6-96231b3b80d8
76 lines
1.8 KiB
LLVM
76 lines
1.8 KiB
LLVM
; Test some floating point casting cases
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
|
|
define i8 @test1() {
|
|
%x = fptoui float 2.550000e+02 to i8 ; <i8> [#uses=1]
|
|
ret i8 %x
|
|
; CHECK: ret i8 -1
|
|
}
|
|
|
|
define i8 @test2() {
|
|
%x = fptosi float -1.000000e+00 to i8 ; <i8> [#uses=1]
|
|
ret i8 %x
|
|
; CHECK: ret i8 -1
|
|
}
|
|
|
|
; CHECK: test3
|
|
define half @test3(float %a) {
|
|
; CHECK: fptrunc
|
|
; CHECK: llvm.fabs.f16
|
|
%b = call float @llvm.fabs.f32(float %a)
|
|
%c = fptrunc float %b to half
|
|
ret half %c
|
|
}
|
|
|
|
; CHECK: test4
|
|
define half @test4(float %a) {
|
|
; CHECK: fptrunc
|
|
; CHECK: fsub
|
|
%b = fsub float -0.0, %a
|
|
%c = fptrunc float %b to half
|
|
ret half %c
|
|
}
|
|
|
|
; CHECK: test4-fast
|
|
define half @test4-fast(float %a) {
|
|
; CHECK: fptrunc
|
|
; CHECK: fsub fast
|
|
%b = fsub fast float -0.0, %a
|
|
%c = fptrunc float %b to half
|
|
ret half %c
|
|
}
|
|
|
|
; CHECK: test5
|
|
define half @test5(float %a, float %b, float %c) {
|
|
; CHECK: fcmp ogt
|
|
; CHECK: fptrunc
|
|
; CHECK: select
|
|
; CHECK: half 0xH3C00
|
|
%d = fcmp ogt float %a, %b
|
|
%e = select i1 %d, float %c, float 1.0
|
|
%f = fptrunc float %e to half
|
|
ret half %f
|
|
}
|
|
|
|
declare float @llvm.fabs.f32(float) nounwind readonly
|
|
|
|
define <1 x float> @test6(<1 x double> %V) {
|
|
%frem = frem <1 x double> %V, %V
|
|
%trunc = fptrunc <1 x double> %frem to <1 x float>
|
|
ret <1 x float> %trunc
|
|
; CHECK-LABEL: @test6
|
|
; CHECK-NEXT: %[[frem:.*]] = frem <1 x double> %V, %V
|
|
; CHECK-NEXT: %[[trunc:.*]] = fptrunc <1 x double> %[[frem]] to <1 x float>
|
|
; CHECK-NEXT: ret <1 x float> %trunc
|
|
}
|
|
|
|
define float @test7(double %V) {
|
|
%frem = frem double %V, 1.000000e+00
|
|
%trunc = fptrunc double %frem to float
|
|
ret float %trunc
|
|
; CHECK-LABEL: @test7
|
|
; CHECK-NEXT: %[[frem:.*]] = frem double %V, 1.000000e+00
|
|
; CHECK-NEXT: %[[trunc:.*]] = fptrunc double %frem to float
|
|
; CHECK-NEXT: ret float %trunc
|
|
}
|