xref: /aosp_15_r20/external/llvm/test/Transforms/Inline/inline-fp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -inline < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Make sure that soft float implementations are calculated as being more expensive
3*9880d681SAndroid Build Coastguard Worker; to the inliner.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i32 @test_nofp() #0 {
6*9880d681SAndroid Build Coastguard Worker; f_nofp() has the "use-soft-float" attribute, so it should never get inlined.
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_nofp
8*9880d681SAndroid Build Coastguard Worker; CHECK: call float @f_nofp
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker  %responseX = alloca i32, align 4
11*9880d681SAndroid Build Coastguard Worker  %responseY = alloca i32, align 4
12*9880d681SAndroid Build Coastguard Worker  %responseZ = alloca i32, align 4
13*9880d681SAndroid Build Coastguard Worker  %valueX = alloca i8, align 1
14*9880d681SAndroid Build Coastguard Worker  %valueY = alloca i8, align 1
15*9880d681SAndroid Build Coastguard Worker  %valueZ = alloca i8, align 1
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker  call void @getX(i32* %responseX, i8* %valueX)
18*9880d681SAndroid Build Coastguard Worker  call void @getY(i32* %responseY, i8* %valueY)
19*9880d681SAndroid Build Coastguard Worker  call void @getZ(i32* %responseZ, i8* %valueZ)
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %responseX
22*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %valueX
23*9880d681SAndroid Build Coastguard Worker  %call = call float @f_nofp(i32 %0, i8 zeroext %1)
24*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %responseZ
25*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %valueZ
26*9880d681SAndroid Build Coastguard Worker  %call2 = call float @f_nofp(i32 %2, i8 zeroext %3)
27*9880d681SAndroid Build Coastguard Worker  %call3 = call float @fabsf(float %call)
28*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %call3, 0x3FC1EB8520000000
29*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.end12, label %if.else
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerif.else:                                          ; preds = %entry
32*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %responseY
33*9880d681SAndroid Build Coastguard Worker  %5 = load i8, i8* %valueY
34*9880d681SAndroid Build Coastguard Worker  %call1 = call float @f_nofp(i32 %4, i8 zeroext %5)
35*9880d681SAndroid Build Coastguard Worker  %call4 = call float @fabsf(float %call1)
36*9880d681SAndroid Build Coastguard Worker  %cmp5 = fcmp ogt float %call4, 0x3FC1EB8520000000
37*9880d681SAndroid Build Coastguard Worker  br i1 %cmp5, label %if.end12, label %if.else7
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerif.else7:                                         ; preds = %if.else
40*9880d681SAndroid Build Coastguard Worker  %call8 = call float @fabsf(float %call2)
41*9880d681SAndroid Build Coastguard Worker  %cmp9 = fcmp ogt float %call8, 0x3FC1EB8520000000
42*9880d681SAndroid Build Coastguard Worker  br i1 %cmp9, label %if.then10, label %if.end12
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerif.then10:                                        ; preds = %if.else7
45*9880d681SAndroid Build Coastguard Worker  br label %if.end12
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerif.end12:                                         ; preds = %if.else, %entry, %if.then10, %if.else7
48*9880d681SAndroid Build Coastguard Worker  %success.0 = phi i32 [ 0, %if.then10 ], [ 1, %if.else7 ], [ 0, %entry ], [ 0, %if.else ]
49*9880d681SAndroid Build Coastguard Worker  ret i32 %success.0
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine i32 @test_hasfp() #0 {
53*9880d681SAndroid Build Coastguard Worker; f_hasfp()  does not have the "use-soft-float" attribute, so it should get inlined.
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_hasfp
55*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call float @f_hasfp
56*9880d681SAndroid Build Coastguard Workerentry:
57*9880d681SAndroid Build Coastguard Worker  %responseX = alloca i32, align 4
58*9880d681SAndroid Build Coastguard Worker  %responseY = alloca i32, align 4
59*9880d681SAndroid Build Coastguard Worker  %responseZ = alloca i32, align 4
60*9880d681SAndroid Build Coastguard Worker  %valueX = alloca i8, align 1
61*9880d681SAndroid Build Coastguard Worker  %valueY = alloca i8, align 1
62*9880d681SAndroid Build Coastguard Worker  %valueZ = alloca i8, align 1
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker  call void @getX(i32* %responseX, i8* %valueX)
65*9880d681SAndroid Build Coastguard Worker  call void @getY(i32* %responseY, i8* %valueY)
66*9880d681SAndroid Build Coastguard Worker  call void @getZ(i32* %responseZ, i8* %valueZ)
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %responseX
69*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %valueX
70*9880d681SAndroid Build Coastguard Worker  %call = call float @f_hasfp(i32 %0, i8 zeroext %1)
71*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %responseZ
72*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %valueZ
73*9880d681SAndroid Build Coastguard Worker  %call2 = call float @f_hasfp(i32 %2, i8 zeroext %3)
74*9880d681SAndroid Build Coastguard Worker  %call3 = call float @fabsf(float %call)
75*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %call3, 0x3FC1EB8520000000
76*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.end12, label %if.else
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerif.else:                                          ; preds = %entry
79*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %responseY
80*9880d681SAndroid Build Coastguard Worker  %5 = load i8, i8* %valueY
81*9880d681SAndroid Build Coastguard Worker  %call1 = call float @f_hasfp(i32 %4, i8 zeroext %5)
82*9880d681SAndroid Build Coastguard Worker  %call4 = call float @fabsf(float %call1)
83*9880d681SAndroid Build Coastguard Worker  %cmp5 = fcmp ogt float %call4, 0x3FC1EB8520000000
84*9880d681SAndroid Build Coastguard Worker  br i1 %cmp5, label %if.end12, label %if.else7
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerif.else7:                                         ; preds = %if.else
87*9880d681SAndroid Build Coastguard Worker  %call8 = call float @fabsf(float %call2)
88*9880d681SAndroid Build Coastguard Worker  %cmp9 = fcmp ogt float %call8, 0x3FC1EB8520000000
89*9880d681SAndroid Build Coastguard Worker  br i1 %cmp9, label %if.then10, label %if.end12
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerif.then10:                                        ; preds = %if.else7
92*9880d681SAndroid Build Coastguard Worker  br label %if.end12
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerif.end12:                                         ; preds = %if.else, %entry, %if.then10, %if.else7
95*9880d681SAndroid Build Coastguard Worker  %success.0 = phi i32 [ 0, %if.then10 ], [ 1, %if.else7 ], [ 0, %entry ], [ 0, %if.else ]
96*9880d681SAndroid Build Coastguard Worker  ret i32 %success.0
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdeclare void @getX(i32*, i8*) #0
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdeclare void @getY(i32*, i8*) #0
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdeclare void @getZ(i32*, i8*) #0
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine internal float @f_hasfp(i32 %response, i8 zeroext %value1) #0 {
106*9880d681SAndroid Build Coastguard Workerentry:
107*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %value1 to i32
108*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %conv, -1
109*9880d681SAndroid Build Coastguard Worker  %conv1 = sitofp i32 %sub to float
110*9880d681SAndroid Build Coastguard Worker  %0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1)
111*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %0, 2.620000e+03
112*9880d681SAndroid Build Coastguard Worker  %conv2 = sitofp i32 %response to float
113*9880d681SAndroid Build Coastguard Worker  %sub3 = fsub float %conv2, %mul
114*9880d681SAndroid Build Coastguard Worker  %div = fdiv float %sub3, %mul
115*9880d681SAndroid Build Coastguard Worker  ret float %div
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine internal float @f_nofp(i32 %response, i8 zeroext %value1) #1 {
119*9880d681SAndroid Build Coastguard Workerentry:
120*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %value1 to i32
121*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %conv, -1
122*9880d681SAndroid Build Coastguard Worker  %conv1 = sitofp i32 %sub to float
123*9880d681SAndroid Build Coastguard Worker  %0 = tail call float @llvm.pow.f32(float 0x3FF028F5C0000000, float %conv1)
124*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %0, 2.620000e+03
125*9880d681SAndroid Build Coastguard Worker  %conv2 = sitofp i32 %response to float
126*9880d681SAndroid Build Coastguard Worker  %sub3 = fsub float %conv2, %mul
127*9880d681SAndroid Build Coastguard Worker  %div = fdiv float %sub3, %mul
128*9880d681SAndroid Build Coastguard Worker  ret float %div
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdeclare float @fabsf(float) optsize minsize
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.pow.f32(float, float) optsize minsize
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerattributes #0 = { minsize optsize }
136*9880d681SAndroid Build Coastguard Workerattributes #1 = { minsize optsize "use-soft-float"="true" }
137