Skip to content

Commit ea2e1cd

Browse files
c8efDanielCChen
authored andcommitted
[ConstantFold] Fold log1p and log1pf when the input parameter is a constant value. (llvm#112113)
This patch adds support for constant folding for the `log1p` and `log1pf` libc functions.
1 parent 425c4fe commit ea2e1cd

File tree

2 files changed

+284
-3
lines changed

2 files changed

+284
-3
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,7 +1679,8 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) {
16791679
case 'l':
16801680
return Name == "log" || Name == "logf" || Name == "logl" ||
16811681
Name == "log2" || Name == "log2f" || Name == "log10" ||
1682-
Name == "log10f" || Name == "logb" || Name == "logbf";
1682+
Name == "log10f" || Name == "logb" || Name == "logbf" ||
1683+
Name == "log1p" || Name == "log1pf";
16831684
case 'n':
16841685
return Name == "nearbyint" || Name == "nearbyintf";
16851686
case 'p':
@@ -2394,6 +2395,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
23942395
if (!APF.isZero() && TLI->has(Func))
23952396
return ConstantFoldFP(logb, APF, Ty);
23962397
break;
2398+
case LibFunc_log1p:
2399+
case LibFunc_log1pf:
2400+
if (APF > APFloat::getOne(APF.getSemantics(), true) && TLI->has(Func))
2401+
return ConstantFoldFP(log1p, APF, Ty);
2402+
break;
23972403
case LibFunc_logl:
23982404
return nullptr;
23992405
case LibFunc_nearbyint:
@@ -3588,8 +3594,8 @@ bool llvm::isMathLibCallNoop(const CallBase *Call,
35883594
case LibFunc_acosl:
35893595
case LibFunc_acos:
35903596
case LibFunc_acosf:
3591-
return !(Op < APFloat(Op.getSemantics(), "-1") ||
3592-
Op > APFloat(Op.getSemantics(), "1"));
3597+
return !(Op < APFloat::getOne(Op.getSemantics(), true) ||
3598+
Op > APFloat::getOne(Op.getSemantics()));
35933599

35943600
case LibFunc_sinh:
35953601
case LibFunc_cosh:
Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
define float @log1pf_const() {
5+
; CHECK-LABEL: define float @log1pf_const() {
6+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 7.000000e+00)
7+
; CHECK-NEXT: ret float 0x4000A2B240000000
8+
;
9+
%r = call float @log1pf(float 7.000000e+00)
10+
ret float %r
11+
}
12+
13+
define double @log1p_const() {
14+
; CHECK-LABEL: define double @log1p_const() {
15+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 7.000000e+00)
16+
; CHECK-NEXT: ret double 0x4000A2B23F3BAB73
17+
;
18+
%r = call double @log1p(double 7.000000e+00)
19+
ret double %r
20+
}
21+
22+
define float @log1pf_minus_one() {
23+
; CHECK-LABEL: define float @log1pf_minus_one() {
24+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -1.000000e+00)
25+
; CHECK-NEXT: ret float [[R]]
26+
;
27+
%r = call float @log1pf(float -1.000000e+00)
28+
ret float %r
29+
}
30+
31+
define double @log1p_minus_one() {
32+
; CHECK-LABEL: define double @log1p_minus_one() {
33+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -1.000000e+00)
34+
; CHECK-NEXT: ret double [[R]]
35+
;
36+
%r = call double @log1p(double -1.000000e+00)
37+
ret double %r
38+
}
39+
40+
define float @log1pf_minus_one_memory_none() {
41+
; CHECK-LABEL: define float @log1pf_minus_one_memory_none() {
42+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -1.000000e+00) #[[ATTR0:[0-9]+]]
43+
; CHECK-NEXT: ret float [[R]]
44+
;
45+
%r = call float @log1pf(float -1.000000e+00) readnone
46+
ret float %r
47+
}
48+
49+
define double @log1p_minus_one_memory_none() {
50+
; CHECK-LABEL: define double @log1p_minus_one_memory_none() {
51+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -1.000000e+00) #[[ATTR0]]
52+
; CHECK-NEXT: ret double [[R]]
53+
;
54+
%r = call double @log1p(double -1.000000e+00) readnone
55+
ret double %r
56+
}
57+
58+
define float @log1pf_zero() {
59+
; CHECK-LABEL: define float @log1pf_zero() {
60+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0.000000e+00)
61+
; CHECK-NEXT: ret float 0.000000e+00
62+
;
63+
%r = call float @log1pf(float 0.000000e+00)
64+
ret float %r
65+
}
66+
67+
define double @log1p_zero() {
68+
; CHECK-LABEL: define double @log1p_zero() {
69+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0.000000e+00)
70+
; CHECK-NEXT: ret double 0.000000e+00
71+
;
72+
%r = call double @log1p(double 0.000000e+00)
73+
ret double %r
74+
}
75+
76+
define float @log1pf_neg_zero() {
77+
; CHECK-LABEL: define float @log1pf_neg_zero() {
78+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -0.000000e+00)
79+
; CHECK-NEXT: ret float -0.000000e+00
80+
;
81+
%r = call float @log1pf(float -0.000000e+00)
82+
ret float %r
83+
}
84+
85+
define double @log1p_neg_zero() {
86+
; CHECK-LABEL: define double @log1p_neg_zero() {
87+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -0.000000e+00)
88+
; CHECK-NEXT: ret double -0.000000e+00
89+
;
90+
%r = call double @log1p(double -0.000000e+00)
91+
ret double %r
92+
}
93+
94+
define float @log1pf_neg1() {
95+
; CHECK-LABEL: define float @log1pf_neg1() {
96+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -7.000000e+00)
97+
; CHECK-NEXT: ret float [[R]]
98+
;
99+
%r = call float @log1pf(float -7.000000e+00)
100+
ret float %r
101+
}
102+
103+
define double @log1p_neg1() {
104+
; CHECK-LABEL: define double @log1p_neg1() {
105+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -7.000000e+00)
106+
; CHECK-NEXT: ret double [[R]]
107+
;
108+
%r = call double @log1p(double -7.000000e+00)
109+
ret double %r
110+
}
111+
112+
define float @log1pf_neg1_memory_none() {
113+
; CHECK-LABEL: define float @log1pf_neg1_memory_none() {
114+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -7.000000e+00) #[[ATTR0]]
115+
; CHECK-NEXT: ret float [[R]]
116+
;
117+
%r = call float @log1pf(float -7.000000e+00) readnone
118+
ret float %r
119+
}
120+
121+
define double @log1p_neg1_memory_none() {
122+
; CHECK-LABEL: define double @log1p_neg1_memory_none() {
123+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -7.000000e+00) #[[ATTR0]]
124+
; CHECK-NEXT: ret double [[R]]
125+
;
126+
%r = call double @log1p(double -7.000000e+00) readnone
127+
ret double %r
128+
}
129+
130+
define float @log1pf_neg2() {
131+
; CHECK-LABEL: define float @log1pf_neg2() {
132+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float -5.000000e-01)
133+
; CHECK-NEXT: ret float 0xBFE62E4300000000
134+
;
135+
%r = call float @log1pf(float -5.000000e-01)
136+
ret float %r
137+
}
138+
139+
define double @log1p_neg2() {
140+
; CHECK-LABEL: define double @log1p_neg2() {
141+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double -5.000000e-01)
142+
; CHECK-NEXT: ret double 0xBFE62E42FEFA39EF
143+
;
144+
%r = call double @log1p(double -5.000000e-01)
145+
ret double %r
146+
}
147+
148+
define float @log1pf_inf() {
149+
; CHECK-LABEL: define float @log1pf_inf() {
150+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF0000000000000)
151+
; CHECK-NEXT: ret float [[R]]
152+
;
153+
%r = call float @log1pf(float 0x7FF0000000000000)
154+
ret float %r
155+
}
156+
157+
define double @log1p_inf() {
158+
; CHECK-LABEL: define double @log1p_inf() {
159+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF0000000000000)
160+
; CHECK-NEXT: ret double [[R]]
161+
;
162+
%r = call double @log1p(double 0x7FF0000000000000)
163+
ret double %r
164+
}
165+
166+
define float @log1pf_inf_memory_none() {
167+
; CHECK-LABEL: define float @log1pf_inf_memory_none() {
168+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF0000000000000) #[[ATTR0]]
169+
; CHECK-NEXT: ret float [[R]]
170+
;
171+
%r = call float @log1pf(float 0x7FF0000000000000) readnone
172+
ret float %r
173+
}
174+
175+
define double @log1p_inf_memory_none() {
176+
; CHECK-LABEL: define double @log1p_inf_memory_none() {
177+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF0000000000000) #[[ATTR0]]
178+
; CHECK-NEXT: ret double [[R]]
179+
;
180+
%r = call double @log1p(double 0x7FF0000000000000) readnone
181+
ret double %r
182+
}
183+
184+
define float @log1pf_neg_inf() {
185+
; CHECK-LABEL: define float @log1pf_neg_inf() {
186+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0xFFF0000000000000)
187+
; CHECK-NEXT: ret float [[R]]
188+
;
189+
%r = call float @log1pf(float 0xFFF0000000000000)
190+
ret float %r
191+
}
192+
193+
define double @log1p_neg_inf() {
194+
; CHECK-LABEL: define double @log1p_neg_inf() {
195+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0xFFF0000000000000)
196+
; CHECK-NEXT: ret double [[R]]
197+
;
198+
%r = call double @log1p(double 0xFFF0000000000000)
199+
ret double %r
200+
}
201+
202+
define float @log1pf_neg_inf_memory_none() {
203+
; CHECK-LABEL: define float @log1pf_neg_inf_memory_none() {
204+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0xFFF0000000000000) #[[ATTR0]]
205+
; CHECK-NEXT: ret float [[R]]
206+
;
207+
%r = call float @log1pf(float 0xFFF0000000000000) readnone
208+
ret float %r
209+
}
210+
211+
define double @log1p_neg_inf_memory_none() {
212+
; CHECK-LABEL: define double @log1p_neg_inf_memory_none() {
213+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0xFFF0000000000000) #[[ATTR0]]
214+
; CHECK-NEXT: ret double [[R]]
215+
;
216+
%r = call double @log1p(double 0xFFF0000000000000) readnone
217+
ret double %r
218+
}
219+
220+
define float @log1pf_nan() {
221+
; CHECK-LABEL: define float @log1pf_nan() {
222+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF8000000000000)
223+
; CHECK-NEXT: ret float [[R]]
224+
;
225+
%r = call float @log1pf(float 0x7FF8000000000000)
226+
ret float %r
227+
}
228+
229+
define double @log1p_nan() {
230+
; CHECK-LABEL: define double @log1p_nan() {
231+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF8000000000000)
232+
; CHECK-NEXT: ret double [[R]]
233+
;
234+
%r = call double @log1p(double 0x7FF8000000000000)
235+
ret double %r
236+
}
237+
238+
define float @log1pf_nan_memory_none() {
239+
; CHECK-LABEL: define float @log1pf_nan_memory_none() {
240+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF8000000000000) #[[ATTR0]]
241+
; CHECK-NEXT: ret float [[R]]
242+
;
243+
%r = call float @log1pf(float 0x7FF8000000000000) readnone
244+
ret float %r
245+
}
246+
247+
define double @log1p_nan_memory_none() {
248+
; CHECK-LABEL: define double @log1p_nan_memory_none() {
249+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF8000000000000) #[[ATTR0]]
250+
; CHECK-NEXT: ret double [[R]]
251+
;
252+
%r = call double @log1p(double 0x7FF8000000000000) readnone
253+
ret double %r
254+
}
255+
256+
define float @log1pf_poison() {
257+
; CHECK-LABEL: define float @log1pf_poison() {
258+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float poison)
259+
; CHECK-NEXT: ret float [[R]]
260+
;
261+
%r = call float @log1pf(float poison)
262+
ret float %r
263+
}
264+
265+
define double @log1p_poison() {
266+
; CHECK-LABEL: define double @log1p_poison() {
267+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double poison)
268+
; CHECK-NEXT: ret double [[R]]
269+
;
270+
%r = call double @log1p(double poison)
271+
ret double %r
272+
}
273+
274+
declare float @log1pf(float)
275+
declare double @log1p(double)

0 commit comments

Comments
 (0)