aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ConstantFolding.cpp
diff options
context:
space:
mode:
authorc8ef <c8ef@outlook.com>2024-10-20 10:46:35 +0800
committerGitHub <noreply@github.com>2024-10-20 10:46:35 +0800
commit1336e3d0b9a361fbbe2d97f225ef6757d20df51a (patch)
tree36a7bc0d2028040af350d8a0f971a607a4793799 /llvm/lib/Analysis/ConstantFolding.cpp
parentcba5c77a715cfa5892c69b6c646556825932575b (diff)
downloadllvm-1336e3d0b9a361fbbe2d97f225ef6757d20df51a.zip
llvm-1336e3d0b9a361fbbe2d97f225ef6757d20df51a.tar.gz
llvm-1336e3d0b9a361fbbe2d97f225ef6757d20df51a.tar.bz2
[ConstantFold] Fold `ilogb` and `ilogbf` when the input parameter is a constant value. (#113014)
This patch adds support for constant folding for the `ilogb` and `ilogbf` libc functions.
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 74df67a..c0104d2 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -1677,6 +1677,8 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) {
return Name == "fabs" || Name == "fabsf" ||
Name == "floor" || Name == "floorf" ||
Name == "fmod" || Name == "fmodf";
+ case 'i':
+ return Name == "ilogb" || Name == "ilogbf";
case 'l':
return Name == "log" || Name == "logf" || Name == "logl" ||
Name == "log2" || Name == "log2f" || Name == "log10" ||
@@ -2131,7 +2133,8 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
}
#endif
- if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
+ if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy() &&
+ !Ty->isIntegerTy())
return nullptr;
// Use internal versions of these intrinsics.
@@ -2391,6 +2394,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
// TODO: What about hosts that lack a C99 library?
return ConstantFoldFP(log10, APF, Ty);
break;
+ case LibFunc_ilogb:
+ case LibFunc_ilogbf:
+ if (!APF.isZero() && TLI->has(Func))
+ return ConstantInt::get(Ty, ilogb(APF), true);
+ break;
case LibFunc_logb:
case LibFunc_logbf:
if (!APF.isZero() && TLI->has(Func))