mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-24 09:29:42 +00:00
We would attempt to replace a fptrunc of an frem with an identical fptrunc. This would cause the new fptrunc to be added to the worklist. Of course, this results in an infinite loop because we will keep visiting the newly created fptruncs. This fixes PR21576. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222040 91177308-0d34-0410-b5e6-96231b3b80d8
66 lines
1.5 KiB
LLVM
66 lines
1.5 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
|
|
}
|