xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/convert-from-fp16.ll (revision 8148c28fad4956b6fc785a5cf1d082eda56e1c6a)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
3
4; Verify that we don't crash with an assertion failure when constant folding
5; a call to intrinsic 'convert.from.fp16' if the return type is not 'float'.
6
7define float @fold_from_fp16_to_fp32() {
8; CHECK-LABEL: @fold_from_fp16_to_fp32(
9; CHECK-NEXT:    ret float 0.000000e+00
10;
11  %r = call float @llvm.convert.from.fp16.f32(i16 0)
12  ret float %r
13}
14
15define double @fold_from_fp16_to_fp64() {
16; CHECK-LABEL: @fold_from_fp16_to_fp64(
17; CHECK-NEXT:    ret double 0.000000e+00
18;
19  %r = call double @llvm.convert.from.fp16.f64(i16 0)
20  ret double %r
21}
22
23define x86_fp80 @fold_from_fp16_to_fp80() {
24; CHECK-LABEL: @fold_from_fp16_to_fp80(
25; CHECK-NEXT:    ret x86_fp80 0xK00000000000000000000
26;
27  %r = call x86_fp80 @llvm.convert.from.fp16.f80(i16 0)
28  ret x86_fp80 %r
29}
30
31define fp128 @fold_from_fp16_to_fp128() {
32; CHECK-LABEL: @fold_from_fp16_to_fp128(
33; CHECK-NEXT:    ret fp128 0xL00000000000000000000000000000000
34;
35  %r = call fp128 @llvm.convert.from.fp16.f128(i16 0)
36  ret fp128 %r
37}
38
39define ppc_fp128 @fold_from_fp16_to_ppcfp128() {
40; CHECK-LABEL: @fold_from_fp16_to_ppcfp128(
41; CHECK-NEXT:    ret ppc_fp128 0xM00000000000000000000000000000000
42;
43  %r = call ppc_fp128 @llvm.convert.from.fp16.ppcf128(i16 0)
44  ret ppc_fp128 %r
45}
46
47define float @fold_from_fp16_to_fp32_b() {
48; CHECK-LABEL: @fold_from_fp16_to_fp32_b(
49; CHECK-NEXT:    ret float 4.000000e+00
50;
51  %a = call i16 @llvm.convert.to.fp16.f64(double 4.0)
52  %r = call float @llvm.convert.from.fp16.f32(i16 %a)
53  ret float %r
54}
55
56define double @fold_from_fp16_to_fp64_b() {
57; CHECK-LABEL: @fold_from_fp16_to_fp64_b(
58; CHECK-NEXT:    ret double 4.000000e+00
59;
60  %a = call i16 @llvm.convert.to.fp16.f64(double 4.0)
61  %r = call double @llvm.convert.from.fp16.f64(i16 %a)
62  ret double %r
63}
64
65define x86_fp80 @fold_from_fp16_to_fp80_b() {
66; CHECK-LABEL: @fold_from_fp16_to_fp80_b(
67; CHECK-NEXT:    ret x86_fp80 0xK40018000000000000000
68;
69  %a = call i16 @llvm.convert.to.fp16.f64(double 4.0)
70  %r = call x86_fp80 @llvm.convert.from.fp16.f80(i16 %a)
71  ret x86_fp80 %r
72}
73
74define fp128 @fold_from_fp16_to_fp128_b() {
75; CHECK-LABEL: @fold_from_fp16_to_fp128_b(
76; CHECK-NEXT:    ret fp128 0xL00000000000000004001000000000000
77;
78  %a = call i16 @llvm.convert.to.fp16.f64(double 4.0)
79  %r = call fp128 @llvm.convert.from.fp16.f128(i16 %a)
80  ret fp128 %r
81}
82
83define ppc_fp128 @fold_from_fp16_to_ppcfp128_b() {
84; CHECK-LABEL: @fold_from_fp16_to_ppcfp128_b(
85; CHECK-NEXT:    ret ppc_fp128 0xM40100000000000000000000000000000
86;
87  %a = call i16 @llvm.convert.to.fp16.f64(double 4.0)
88  %r = call ppc_fp128 @llvm.convert.from.fp16.ppcf128(i16 %a)
89  ret ppc_fp128 %r
90}
91
92; This would assert because converting SNAN causes an invalidOp status.
93; PR56981
94
95define float @convert_snan() {
96; CHECK-LABEL: @convert_snan(
97; CHECK-NEXT:    ret float 0x7FF8040000000000
98;
99  %r = call float @llvm.convert.from.fp16.f32(i16 31745) ; 0x7c01
100  ret float %r
101}
102
103declare i16 @llvm.convert.to.fp16.f64(double)
104declare float @llvm.convert.from.fp16.f32(i16)
105declare double @llvm.convert.from.fp16.f64(i16)
106declare x86_fp80 @llvm.convert.from.fp16.f80(i16)
107declare fp128 @llvm.convert.from.fp16.f128(i16)
108declare ppc_fp128 @llvm.convert.from.fp16.ppcf128(i16)
109