Skip to content

Commit 923566a

Browse files
authored
[ConstantFold] Fold logb and logbf when the input parameter is a constant value. (llvm#111232)
This patch adds support for constant folding for the `logb` and `logbf` libc functions.
1 parent 61a4678 commit 923566a

File tree

2 files changed

+121
-3
lines changed

2 files changed

+121
-3
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,9 +1677,9 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) {
16771677
Name == "floor" || Name == "floorf" ||
16781678
Name == "fmod" || Name == "fmodf";
16791679
case 'l':
1680-
return Name == "log" || Name == "logf" || Name == "log2" ||
1681-
Name == "log2f" || Name == "log10" || Name == "log10f" ||
1682-
Name == "logl";
1680+
return Name == "log" || Name == "logf" || Name == "logl" ||
1681+
Name == "log2" || Name == "log2f" || Name == "log10" ||
1682+
Name == "log10f" || Name == "logb" || Name == "logbf";
16831683
case 'n':
16841684
return Name == "nearbyint" || Name == "nearbyintf";
16851685
case 'p':
@@ -2389,6 +2389,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
23892389
// TODO: What about hosts that lack a C99 library?
23902390
return ConstantFoldFP(log10, APF, Ty);
23912391
break;
2392+
case LibFunc_logb:
2393+
case LibFunc_logbf:
2394+
if (!APF.isZero() && TLI->has(Func))
2395+
return ConstantFoldFP(logb, APF, Ty);
2396+
break;
23922397
case LibFunc_logl:
23932398
return nullptr;
23942399
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 @logbf_const() {
5+
; CHECK-LABEL: define float @logbf_const() {
6+
; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 7.000000e+00)
7+
; CHECK-NEXT: ret float 2.000000e+00
8+
;
9+
%r = call float @logbf(float 7.000000e+00)
10+
ret float %r
11+
}
12+
13+
define double @logb_const() {
14+
; CHECK-LABEL: define double @logb_const() {
15+
; CHECK-NEXT: [[R:%.*]] = call double @logb(double -7.000000e+00)
16+
; CHECK-NEXT: ret double 2.000000e+00
17+
;
18+
%r = call double @logb(double -7.000000e+00)
19+
ret double %r
20+
}
21+
22+
define float @logbf_zero() {
23+
; CHECK-LABEL: define float @logbf_zero() {
24+
; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 0.000000e+00)
25+
; CHECK-NEXT: ret float [[R]]
26+
;
27+
%r = call float @logbf(float 0.000000e+00)
28+
ret float %r
29+
}
30+
31+
define double @logb_zero() {
32+
; CHECK-LABEL: define double @logb_zero() {
33+
; CHECK-NEXT: [[R:%.*]] = call double @logb(double 0.000000e+00)
34+
; CHECK-NEXT: ret double [[R]]
35+
;
36+
%r = call double @logb(double 0.000000e+00)
37+
ret double %r
38+
}
39+
40+
define float @logbf_neg_zero() {
41+
; CHECK-LABEL: define float @logbf_neg_zero() {
42+
; CHECK-NEXT: [[R:%.*]] = call float @logbf(float -0.000000e+00)
43+
; CHECK-NEXT: ret float [[R]]
44+
;
45+
%r = call float @logbf(float -0.000000e+00)
46+
ret float %r
47+
}
48+
49+
define double @logb_neg_zero() {
50+
; CHECK-LABEL: define double @logb_neg_zero() {
51+
; CHECK-NEXT: [[R:%.*]] = call double @logb(double -0.000000e+00)
52+
; CHECK-NEXT: ret double [[R]]
53+
;
54+
%r = call double @logb(double -0.000000e+00)
55+
ret double %r
56+
}
57+
58+
define float @logbf_inf() {
59+
; CHECK-LABEL: define float @logbf_inf() {
60+
; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 0x7FF0000000000000)
61+
; CHECK-NEXT: ret float [[R]]
62+
;
63+
%r = call float @logbf(float 0x7FF0000000000000)
64+
ret float %r
65+
}
66+
67+
define double @logb_inf() {
68+
; CHECK-LABEL: define double @logb_inf() {
69+
; CHECK-NEXT: [[R:%.*]] = call double @logb(double 0x7FF0000000000000)
70+
; CHECK-NEXT: ret double [[R]]
71+
;
72+
%r = call double @logb(double 0x7FF0000000000000)
73+
ret double %r
74+
}
75+
76+
define float @logbf_nan() {
77+
; CHECK-LABEL: define float @logbf_nan() {
78+
; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 0x7FF8000000000000)
79+
; CHECK-NEXT: ret float [[R]]
80+
;
81+
%r = call float @logbf(float 0x7FF8000000000000)
82+
ret float %r
83+
}
84+
85+
define double @logb_nan() {
86+
; CHECK-LABEL: define double @logb_nan() {
87+
; CHECK-NEXT: [[R:%.*]] = call double @logb(double 0x7FF8000000000000)
88+
; CHECK-NEXT: ret double [[R]]
89+
;
90+
%r = call double @logb(double 0x7FF8000000000000)
91+
ret double %r
92+
}
93+
94+
define float @logbf_poison() {
95+
; CHECK-LABEL: define float @logbf_poison() {
96+
; CHECK-NEXT: [[R:%.*]] = call float @logbf(float poison)
97+
; CHECK-NEXT: ret float [[R]]
98+
;
99+
%r = call float @logbf(float poison)
100+
ret float %r
101+
}
102+
103+
define double @logb_poison() {
104+
; CHECK-LABEL: define double @logb_poison() {
105+
; CHECK-NEXT: [[R:%.*]] = call double @logb(double poison)
106+
; CHECK-NEXT: ret double [[R]]
107+
;
108+
%r = call double @logb(double poison)
109+
ret double %r
110+
}
111+
112+
declare float @logbf(float)
113+
declare double @logb(double)

0 commit comments

Comments
 (0)