xref: /aosp_15_r20/external/llvm/test/Transforms/InstSimplify/fold-builtin-fma.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instsimplify -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Fixes PR20832
4*9880d681SAndroid Build Coastguard Worker; Make sure that we correctly fold a fused multiply-add where operands
5*9880d681SAndroid Build Coastguard Worker; are all finite constants and addend is zero.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine double @PR20832()  {
11*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0.0)
12*9880d681SAndroid Build Coastguard Worker  ret double %1
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @PR20832(
15*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 5.600000e+01
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; Test builtin fma with all finite non-zero constants.
18*9880d681SAndroid Build Coastguard Workerdefine double @test_all_finite()  {
19*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 5.0)
20*9880d681SAndroid Build Coastguard Worker  ret double %1
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_all_finite(
23*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 6.100000e+01
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Test builtin fma with a +/-NaN addend.
26*9880d681SAndroid Build Coastguard Workerdefine double @test_NaN_addend()  {
27*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF8000000000000)
28*9880d681SAndroid Build Coastguard Worker  ret double %1
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_NaN_addend(
31*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF8000000000000
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine double @test_NaN_addend_2()  {
34*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF8000000000000)
35*9880d681SAndroid Build Coastguard Worker  ret double %1
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_NaN_addend_2(
38*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0xFFF8000000000000
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; Test builtin fma with a +/-Inf addend.
41*9880d681SAndroid Build Coastguard Workerdefine double @test_Inf_addend()  {
42*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF0000000000000)
43*9880d681SAndroid Build Coastguard Worker  ret double %1
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_Inf_addend(
46*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF0000000000000
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine double @test_Inf_addend_2()  {
49*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF0000000000000)
50*9880d681SAndroid Build Coastguard Worker  ret double %1
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_Inf_addend_2(
53*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0xFFF0000000000000
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Test builtin fma with one of the operands to the multiply being +/-NaN.
56*9880d681SAndroid Build Coastguard Workerdefine double @test_NaN_1()  {
57*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 0x7FF8000000000000, double 8.0, double 0.0)
58*9880d681SAndroid Build Coastguard Worker  ret double %1
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_NaN_1(
61*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF8000000000000
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine double @test_NaN_2()  {
65*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF8000000000000, double 0.0)
66*9880d681SAndroid Build Coastguard Worker  ret double %1
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_NaN_2(
69*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF8000000000000
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine double @test_NaN_3()  {
73*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 0xFFF8000000000000, double 8.0, double 0.0)
74*9880d681SAndroid Build Coastguard Worker  ret double %1
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_NaN_3(
77*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF8000000000000
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine double @test_NaN_4()  {
81*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF8000000000000, double 0.0)
82*9880d681SAndroid Build Coastguard Worker  ret double %1
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_NaN_4(
85*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF8000000000000
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; Test builtin fma with one of the operands to the multiply being +/-Inf.
89*9880d681SAndroid Build Coastguard Workerdefine double @test_Inf_1()  {
90*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 8.0, double 0.0)
91*9880d681SAndroid Build Coastguard Worker  ret double %1
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_Inf_1(
94*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF0000000000000
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine double @test_Inf_2()  {
98*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0.0)
99*9880d681SAndroid Build Coastguard Worker  ret double %1
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_Inf_2(
102*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0x7FF0000000000000
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine double @test_Inf_3()  {
106*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 8.0, double 0.0)
107*9880d681SAndroid Build Coastguard Worker  ret double %1
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_Inf_3(
110*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0xFFF0000000000000
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine double @test_Inf_4()  {
114*9880d681SAndroid Build Coastguard Worker  %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0.0)
115*9880d681SAndroid Build Coastguard Worker  ret double %1
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_Inf_4(
118*9880d681SAndroid Build Coastguard Worker; CHECK: ret double 0xFFF0000000000000
119*9880d681SAndroid Build Coastguard Worker
120