diff options
author | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2023-06-19 10:45:42 +0100 |
---|---|---|
committer | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2023-06-19 10:53:08 +0100 |
commit | 5400257ded86b65e5b55cbb138e0438b96c9bebf (patch) | |
tree | a4369398c98fcd345f1a93e72496f7acca174836 /llvm/lib/Transforms/IPO/FunctionSpecialization.cpp | |
parent | f6a8775c5d9fa6cd49f404da70982f2e7b91c88c (diff) | |
download | llvm-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.cpp | 28 |
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; |