aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
diff options
context:
space:
mode:
authorAlexandros Lamprineas <alexandros.lamprineas@arm.com>2023-06-19 10:45:42 +0100
committerAlexandros Lamprineas <alexandros.lamprineas@arm.com>2023-06-19 10:53:08 +0100
commit5400257ded86b65e5b55cbb138e0438b96c9bebf (patch)
treea4369398c98fcd345f1a93e72496f7acca174836 /llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
parentf6a8775c5d9fa6cd49f404da70982f2e7b91c88c (diff)
downloadllvm-5400257ded86b65e5b55cbb138e0438b96c9bebf.zip
llvm-5400257ded86b65e5b55cbb138e0438b96c9bebf.tar.gz
llvm-5400257ded86b65e5b55cbb138e0438b96c9bebf.tar.bz2
[FuncSpec] Add Freeze and CallBase to the InstCostVisitor.
Allows constant folding of such instructions when estimating user bonus. Differential Revision: https://reviews.llvm.org/D153036
Diffstat (limited to 'llvm/lib/Transforms/IPO/FunctionSpecialization.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/FunctionSpecialization.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
index a970253..1792b249 100644
--- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
@@ -222,6 +222,34 @@ Cost InstCostVisitor::estimateBranchInst(BranchInst &I) {
return estimateBasicBlocks(WorkList, KnownConstants, Solver, BFI, TTI);
}
+Constant *InstCostVisitor::visitFreezeInst(FreezeInst &I) {
+ if (isGuaranteedNotToBeUndefOrPoison(LastVisited->second))
+ return LastVisited->second;
+ return nullptr;
+}
+
+Constant *InstCostVisitor::visitCallBase(CallBase &I) {
+ Function *F = I.getCalledFunction();
+ if (!F || !canConstantFoldCallTo(&I, F))
+ return nullptr;
+
+ SmallVector<Constant *, 8> Operands;
+ Operands.reserve(I.getNumOperands());
+
+ for (unsigned Idx = 0, E = I.getNumOperands() - 1; Idx != E; ++Idx) {
+ Value *V = I.getOperand(Idx);
+ auto *C = dyn_cast<Constant>(V);
+ if (!C)
+ C = findConstantFor(V, KnownConstants);
+ if (!C)
+ return nullptr;
+ Operands.push_back(C);
+ }
+
+ auto Ops = ArrayRef(Operands.begin(), Operands.end());
+ return ConstantFoldCall(&I, F, Ops);
+}
+
Constant *InstCostVisitor::visitLoadInst(LoadInst &I) {
if (isa<ConstantPointerNull>(LastVisited->second))
return nullptr;