1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; Test some floating point casting cases
; RUN: opt < %s -instcombine -S | FileCheck %s
define i8 @test1() {
; CHECK-LABEL: @test1(
; CHECK-NEXT: ret i8 -1
;
%x = fptoui float 2.550000e+02 to i8
ret i8 %x
}
define i8 @test2() {
; CHECK-LABEL: @test2(
; CHECK-NEXT: ret i8 -1
;
%x = fptosi float -1.000000e+00 to i8
ret i8 %x
}
define half @test3(float %a) {
; CHECK-LABEL: @test3(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc float [[A:%.*]] to half
; CHECK-NEXT: [[C:%.*]] = call half @llvm.fabs.f16(half [[TMP1]])
; CHECK-NEXT: ret half [[C]]
;
%b = call float @llvm.fabs.f32(float %a)
%c = fptrunc float %b to half
ret half %c
}
define half @fneg_fptrunc(float %a) {
; CHECK-LABEL: @fneg_fptrunc(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc float [[A:%.*]] to half
; CHECK-NEXT: [[C:%.*]] = fneg half [[TMP1]]
; CHECK-NEXT: ret half [[C]]
;
%b = fsub float -0.0, %a
%c = fptrunc float %b to half
ret half %c
}
define half @unary_fneg_fptrunc(float %a) {
; CHECK-LABEL: @unary_fneg_fptrunc(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc float [[A:%.*]] to half
; CHECK-NEXT: [[C:%.*]] = fneg half [[TMP1]]
; CHECK-NEXT: ret half [[C]]
;
%b = fneg float %a
%c = fptrunc float %b to half
ret half %c
}
define <2 x half> @fneg_fptrunc_vec_undef(<2 x float> %a) {
; CHECK-LABEL: @fneg_fptrunc_vec_undef(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc <2 x float> [[A:%.*]] to <2 x half>
; CHECK-NEXT: [[C:%.*]] = fneg <2 x half> [[TMP1]]
; CHECK-NEXT: ret <2 x half> [[C]]
;
%b = fsub <2 x float> <float -0.0, float undef>, %a
%c = fptrunc <2 x float> %b to <2 x half>
ret <2 x half> %c
}
define <2 x half> @unary_fneg_fptrunc_vec(<2 x float> %a) {
; CHECK-LABEL: @unary_fneg_fptrunc_vec(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc <2 x float> [[A:%.*]] to <2 x half>
; CHECK-NEXT: [[C:%.*]] = fneg <2 x half> [[TMP1]]
; CHECK-NEXT: ret <2 x half> [[C]]
;
%b = fneg <2 x float> %a
%c = fptrunc <2 x float> %b to <2 x half>
ret <2 x half> %c
}
define half @test4-fast(float %a) {
; CHECK-LABEL: @test4-fast(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc float [[A:%.*]] to half
; CHECK-NEXT: [[C:%.*]] = fneg fast half [[TMP1]]
; CHECK-NEXT: ret half [[C]]
;
%b = fsub fast float -0.0, %a
%c = fptrunc float %b to half
ret half %c
}
define half @test4_unary_fneg-fast(float %a) {
; CHECK-LABEL: @test4_unary_fneg-fast(
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc float [[A:%.*]] to half
; CHECK-NEXT: [[C:%.*]] = fneg fast half [[TMP1]]
; CHECK-NEXT: ret half [[C]]
;
%b = fneg fast float %a
%c = fptrunc float %b to half
ret half %c
}
define half @test5(float %a, float %b, float %c) {
; CHECK-LABEL: @test5(
; CHECK-NEXT: [[D:%.*]] = fcmp ogt float [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[E:%.*]] = select i1 [[D]], float [[C:%.*]], float 1.000000e+00
; CHECK-NEXT: [[F:%.*]] = fptrunc float [[E]] to half
; CHECK-NEXT: ret half [[F]]
;
%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) {
; 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]]
;
%frem = frem <1 x double> %V, %V
%trunc = fptrunc <1 x double> %frem to <1 x float>
ret <1 x float> %trunc
}
define float @test7(double %V) {
; 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]]
;
%frem = frem double %V, 1.000000e+00
%trunc = fptrunc double %frem to float
ret float %trunc
}
define float @test8(float %V) {
; CHECK-LABEL: @test8(
; CHECK-NEXT: [[FEXT:%.*]] = fpext float [[V:%.*]] to double
; CHECK-NEXT: [[FREM:%.*]] = frem double [[FEXT]], 1.000000e-01
; CHECK-NEXT: [[TRUNC:%.*]] = fptrunc double [[FREM]] to float
; CHECK-NEXT: ret float [[TRUNC]]
;
%fext = fpext float %V to double
%frem = frem double %fext, 1.000000e-01
%trunc = fptrunc double %frem to float
ret float %trunc
}
define half @test_fptrunc_fptrunc(double %V) {
; CHECK-LABEL: @test_fptrunc_fptrunc(
; CHECK-NEXT: [[T1:%.*]] = fptrunc double [[V:%.*]] to float
; CHECK-NEXT: [[T2:%.*]] = fptrunc float [[T1]] to half
; CHECK-NEXT: ret half [[T2]]
;
%t1 = fptrunc double %V to float
%t2 = fptrunc float %t1 to half
ret half %t2
}
|