diff options
author | c8ef <c8ef@outlook.com> | 2024-10-10 07:56:16 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-10 07:56:16 +0800 |
commit | 923566a67de39a00eb6fc5cabbad307a72aa338e (patch) | |
tree | b9ac2aa462719c784d092c332629e81ed841aa82 | |
parent | 61a46780d10c8f4e12c9b5496f5ca3f2cc7fba66 (diff) | |
download | llvm-923566a67de39a00eb6fc5cabbad307a72aa338e.zip llvm-923566a67de39a00eb6fc5cabbad307a72aa338e.tar.gz llvm-923566a67de39a00eb6fc5cabbad307a72aa338e.tar.bz2 |
[ConstantFold] Fold `logb` and `logbf` when the input parameter is a constant value. (#111232)
This patch adds support for constant folding for the `logb` and `logbf`
libc functions.
-rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 11 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/logb.ll | 113 |
2 files changed, 121 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index a6ef271..102762d 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1677,9 +1677,9 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) { Name == "floor" || Name == "floorf" || Name == "fmod" || Name == "fmodf"; case 'l': - return Name == "log" || Name == "logf" || Name == "log2" || - Name == "log2f" || Name == "log10" || Name == "log10f" || - Name == "logl"; + return Name == "log" || Name == "logf" || Name == "logl" || + Name == "log2" || Name == "log2f" || Name == "log10" || + Name == "log10f" || Name == "logb" || Name == "logbf"; case 'n': return Name == "nearbyint" || Name == "nearbyintf"; case 'p': @@ -2389,6 +2389,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name, // TODO: What about hosts that lack a C99 library? return ConstantFoldFP(log10, APF, Ty); break; + case LibFunc_logb: + case LibFunc_logbf: + if (!APF.isZero() && TLI->has(Func)) + return ConstantFoldFP(logb, APF, Ty); + break; case LibFunc_logl: return nullptr; case LibFunc_nearbyint: diff --git a/llvm/test/Transforms/InstCombine/logb.ll b/llvm/test/Transforms/InstCombine/logb.ll new file mode 100644 index 0000000..f2509e9 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/logb.ll @@ -0,0 +1,113 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +define float @logbf_const() { +; CHECK-LABEL: define float @logbf_const() { +; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 7.000000e+00) +; CHECK-NEXT: ret float 2.000000e+00 +; + %r = call float @logbf(float 7.000000e+00) + ret float %r +} + +define double @logb_const() { +; CHECK-LABEL: define double @logb_const() { +; CHECK-NEXT: [[R:%.*]] = call double @logb(double -7.000000e+00) +; CHECK-NEXT: ret double 2.000000e+00 +; + %r = call double @logb(double -7.000000e+00) + ret double %r +} + +define float @logbf_zero() { +; CHECK-LABEL: define float @logbf_zero() { +; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 0.000000e+00) +; CHECK-NEXT: ret float [[R]] +; + %r = call float @logbf(float 0.000000e+00) + ret float %r +} + +define double @logb_zero() { +; CHECK-LABEL: define double @logb_zero() { +; CHECK-NEXT: [[R:%.*]] = call double @logb(double 0.000000e+00) +; CHECK-NEXT: ret double [[R]] +; + %r = call double @logb(double 0.000000e+00) + ret double %r +} + +define float @logbf_neg_zero() { +; CHECK-LABEL: define float @logbf_neg_zero() { +; CHECK-NEXT: [[R:%.*]] = call float @logbf(float -0.000000e+00) +; CHECK-NEXT: ret float [[R]] +; + %r = call float @logbf(float -0.000000e+00) + ret float %r +} + +define double @logb_neg_zero() { +; CHECK-LABEL: define double @logb_neg_zero() { +; CHECK-NEXT: [[R:%.*]] = call double @logb(double -0.000000e+00) +; CHECK-NEXT: ret double [[R]] +; + %r = call double @logb(double -0.000000e+00) + ret double %r +} + +define float @logbf_inf() { +; CHECK-LABEL: define float @logbf_inf() { +; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 0x7FF0000000000000) +; CHECK-NEXT: ret float [[R]] +; + %r = call float @logbf(float 0x7FF0000000000000) + ret float %r +} + +define double @logb_inf() { +; CHECK-LABEL: define double @logb_inf() { +; CHECK-NEXT: [[R:%.*]] = call double @logb(double 0x7FF0000000000000) +; CHECK-NEXT: ret double [[R]] +; + %r = call double @logb(double 0x7FF0000000000000) + ret double %r +} + +define float @logbf_nan() { +; CHECK-LABEL: define float @logbf_nan() { +; CHECK-NEXT: [[R:%.*]] = call float @logbf(float 0x7FF8000000000000) +; CHECK-NEXT: ret float [[R]] +; + %r = call float @logbf(float 0x7FF8000000000000) + ret float %r +} + +define double @logb_nan() { +; CHECK-LABEL: define double @logb_nan() { +; CHECK-NEXT: [[R:%.*]] = call double @logb(double 0x7FF8000000000000) +; CHECK-NEXT: ret double [[R]] +; + %r = call double @logb(double 0x7FF8000000000000) + ret double %r +} + +define float @logbf_poison() { +; CHECK-LABEL: define float @logbf_poison() { +; CHECK-NEXT: [[R:%.*]] = call float @logbf(float poison) +; CHECK-NEXT: ret float [[R]] +; + %r = call float @logbf(float poison) + ret float %r +} + +define double @logb_poison() { +; CHECK-LABEL: define double @logb_poison() { +; CHECK-NEXT: [[R:%.*]] = call double @logb(double poison) +; CHECK-NEXT: ret double [[R]] +; + %r = call double @logb(double poison) + ret double %r +} + +declare float @logbf(float) +declare double @logb(double) |