Skip to content

Commit b49c6c1

Browse files
committed
constant folding log1p
1 parent 464a7ee commit b49c6c1

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 7 additions & 1 deletion
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:
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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_zero() {
41+
; CHECK-LABEL: define float @log1pf_zero() {
42+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0.000000e+00)
43+
; CHECK-NEXT: ret float 0.000000e+00
44+
;
45+
%r = call float @log1pf(float 0.000000e+00)
46+
ret float %r
47+
}
48+
49+
define double @log1p_zero() {
50+
; CHECK-LABEL: define double @log1p_zero() {
51+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0.000000e+00)
52+
; CHECK-NEXT: ret double 0.000000e+00
53+
;
54+
%r = call double @log1p(double 0.000000e+00)
55+
ret double %r
56+
}
57+
58+
define float @log1pf_inf() {
59+
; CHECK-LABEL: define float @log1pf_inf() {
60+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF0000000000000)
61+
; CHECK-NEXT: ret float [[R]]
62+
;
63+
%r = call float @log1pf(float 0x7FF0000000000000)
64+
ret float %r
65+
}
66+
67+
define double @log1p_inf() {
68+
; CHECK-LABEL: define double @log1p_inf() {
69+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF0000000000000)
70+
; CHECK-NEXT: ret double [[R]]
71+
;
72+
%r = call double @log1p(double 0x7FF0000000000000)
73+
ret double %r
74+
}
75+
76+
define float @log1pf_nan() {
77+
; CHECK-LABEL: define float @log1pf_nan() {
78+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float 0x7FF8000000000000)
79+
; CHECK-NEXT: ret float [[R]]
80+
;
81+
%r = call float @log1pf(float 0x7FF8000000000000)
82+
ret float %r
83+
}
84+
85+
define double @log1p_nan() {
86+
; CHECK-LABEL: define double @log1p_nan() {
87+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double 0x7FF8000000000000)
88+
; CHECK-NEXT: ret double [[R]]
89+
;
90+
%r = call double @log1p(double 0x7FF8000000000000)
91+
ret double %r
92+
}
93+
94+
define float @log1pf_poison() {
95+
; CHECK-LABEL: define float @log1pf_poison() {
96+
; CHECK-NEXT: [[R:%.*]] = call float @log1pf(float poison)
97+
; CHECK-NEXT: ret float [[R]]
98+
;
99+
%r = call float @log1pf(float poison)
100+
ret float %r
101+
}
102+
103+
define double @log1p_poison() {
104+
; CHECK-LABEL: define double @log1p_poison() {
105+
; CHECK-NEXT: [[R:%.*]] = call double @log1p(double poison)
106+
; CHECK-NEXT: ret double [[R]]
107+
;
108+
%r = call double @log1p(double poison)
109+
ret double %r
110+
}
111+
112+
declare float @log1pf(float)
113+
declare double @log1p(double)

0 commit comments

Comments
 (0)