Skip to content

Commit ee8d1d2

Browse files
committed
ConstantFolding: Handle exp10 intrinsic
https://reviews.llvm.org/D157892
1 parent da077a5 commit ee8d1d2

File tree

2 files changed

+16
-24
lines changed

2 files changed

+16
-24
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,7 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) {
15421542
case Intrinsic::log10:
15431543
case Intrinsic::exp:
15441544
case Intrinsic::exp2:
1545+
case Intrinsic::exp10:
15451546
case Intrinsic::sqrt:
15461547
case Intrinsic::sin:
15471548
case Intrinsic::cos:
@@ -2200,6 +2201,9 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
22002201
case Intrinsic::exp2:
22012202
// Fold exp2(x) as pow(2, x), in case the host lacks a C99 library.
22022203
return ConstantFoldBinaryFP(pow, APFloat(2.0), APF, Ty);
2204+
case Intrinsic::exp10:
2205+
// Fold exp10(x) as pow(10, x), in case the host lacks a C99 library.
2206+
return ConstantFoldBinaryFP(pow, APFloat(10.0), APF, Ty);
22032207
case Intrinsic::sin:
22042208
return ConstantFoldFP(sin, APF, Ty);
22052209
case Intrinsic::cos:

llvm/test/Transforms/InstSimplify/exp10.ll

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ define <2 x float> @exp10_exp10_vector(<2 x float> %x) {
3535
define float @exp10_exp10_const(float %x) {
3636
; CHECK-LABEL: define float @exp10_exp10_const
3737
; CHECK-SAME: (float [[X:%.*]]) {
38-
; CHECK-NEXT: [[EXP100:%.*]] = call float @llvm.exp10.f32(float 4.200000e+01)
39-
; CHECK-NEXT: [[EXP101:%.*]] = call float @llvm.exp10.f32(float [[EXP100]])
38+
; CHECK-NEXT: [[EXP101:%.*]] = call float @llvm.exp10.f32(float 0x7FF0000000000000)
4039
; CHECK-NEXT: ret float [[EXP101]]
4140
;
4241
%exp100 = call float @llvm.exp10.f32(float 42.0)
@@ -102,8 +101,7 @@ define <2 x float> @exp10_undef_vector() {
102101

103102
define <2 x float> @exp10_zero_vector() {
104103
; CHECK-LABEL: define <2 x float> @exp10_zero_vector() {
105-
; CHECK-NEXT: [[RET:%.*]] = call <2 x float> @llvm.exp10.v2f32(<2 x float> zeroinitializer)
106-
; CHECK-NEXT: ret <2 x float> [[RET]]
104+
; CHECK-NEXT: ret <2 x float> <float 1.000000e+00, float 1.000000e+00>
107105
;
108106
%ret = call <2 x float> @llvm.exp10.v2f32(<2 x float> zeroinitializer)
109107
ret <2 x float> %ret
@@ -120,8 +118,7 @@ define <vscale x 2 x float> @exp10_zero_scalable_vector() {
120118

121119
define <2 x float> @exp10_zero_negzero_vector() {
122120
; CHECK-LABEL: define <2 x float> @exp10_zero_negzero_vector() {
123-
; CHECK-NEXT: [[RET:%.*]] = call <2 x float> @llvm.exp10.v2f32(<2 x float> <float 0.000000e+00, float -0.000000e+00>)
124-
; CHECK-NEXT: ret <2 x float> [[RET]]
121+
; CHECK-NEXT: ret <2 x float> <float 1.000000e+00, float 1.000000e+00>
125122
;
126123
%ret = call <2 x float> @llvm.exp10.v2f32(<2 x float> <float 0.0, float -0.0>)
127124
ret <2 x float> %ret
@@ -138,53 +135,47 @@ define <4 x float> @exp10_nonsplat_vector() {
138135

139136
define float @exp10_zero() {
140137
; CHECK-LABEL: define float @exp10_zero() {
141-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float 0.000000e+00)
142-
; CHECK-NEXT: ret float [[RET]]
138+
; CHECK-NEXT: ret float 1.000000e+00
143139
;
144140
%ret = call float @llvm.exp10.f32(float 0.0)
145141
ret float %ret
146142
}
147143

148144
define float @exp10_negzero() {
149145
; CHECK-LABEL: define float @exp10_negzero() {
150-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float -0.000000e+00)
151-
; CHECK-NEXT: ret float [[RET]]
146+
; CHECK-NEXT: ret float 1.000000e+00
152147
;
153148
%ret = call float @llvm.exp10.f32(float -0.0)
154149
ret float %ret
155150
}
156151

157152
define float @exp10_one() {
158153
; CHECK-LABEL: define float @exp10_one() {
159-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float 1.000000e+00)
160-
; CHECK-NEXT: ret float [[RET]]
154+
; CHECK-NEXT: ret float 1.000000e+01
161155
;
162156
%ret = call float @llvm.exp10.f32(float 1.0)
163157
ret float %ret
164158
}
165159

166160
define float @exp10_negone() {
167161
; CHECK-LABEL: define float @exp10_negone() {
168-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float -1.000000e+00)
169-
; CHECK-NEXT: ret float [[RET]]
162+
; CHECK-NEXT: ret float 0x3FB99999A0000000
170163
;
171164
%ret = call float @llvm.exp10.f32(float -1.0)
172165
ret float %ret
173166
}
174167

175168
define float @exp10_two() {
176169
; CHECK-LABEL: define float @exp10_two() {
177-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float 2.000000e+00)
178-
; CHECK-NEXT: ret float [[RET]]
170+
; CHECK-NEXT: ret float 1.000000e+02
179171
;
180172
%ret = call float @llvm.exp10.f32(float 2.0)
181173
ret float %ret
182174
}
183175

184176
define float @exp10_negtwo() {
185177
; CHECK-LABEL: define float @exp10_negtwo() {
186-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float -2.000000e+00)
187-
; CHECK-NEXT: ret float [[RET]]
178+
; CHECK-NEXT: ret float 0x3F847AE140000000
188179
;
189180
%ret = call float @llvm.exp10.f32(float -2.0)
190181
ret float %ret
@@ -228,17 +219,15 @@ define float @exp10_snan() {
228219

229220
define float @exp10_pos_denorm() {
230221
; CHECK-LABEL: define float @exp10_pos_denorm() {
231-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float 0x380FFFFFC0000000)
232-
; CHECK-NEXT: ret float [[RET]]
222+
; CHECK-NEXT: ret float 1.000000e+00
233223
;
234224
%ret = call float @llvm.exp10.f32(float bitcast (i32 8388607 to float))
235225
ret float %ret
236226
}
237227

238228
define float @exp10_neg_denorm() {
239229
; CHECK-LABEL: define float @exp10_neg_denorm() {
240-
; CHECK-NEXT: [[RET:%.*]] = call float @llvm.exp10.f32(float 0xB80FFFFFC0000000)
241-
; CHECK-NEXT: ret float [[RET]]
230+
; CHECK-NEXT: ret float 1.000000e+00
242231
;
243232
%ret = call float @llvm.exp10.f32(float bitcast (i32 -2139095041 to float))
244233
ret float %ret
@@ -273,8 +262,7 @@ define ppc_fp128 @canonicalize_noncanonical_zero_1_ppcf128() {
273262

274263
define <2 x float> @exp10_splat_4() {
275264
; CHECK-LABEL: define <2 x float> @exp10_splat_4() {
276-
; CHECK-NEXT: [[RET:%.*]] = call <2 x float> @llvm.exp10.v2f32(<2 x float> <float 4.000000e+00, float 4.000000e+00>)
277-
; CHECK-NEXT: ret <2 x float> [[RET]]
265+
; CHECK-NEXT: ret <2 x float> <float 1.000000e+04, float 1.000000e+04>
278266
;
279267
%ret = call <2 x float> @llvm.exp10.v2f32(<2 x float> <float 4.0, float 4.0>)
280268
ret <2 x float> %ret

0 commit comments

Comments
 (0)