[PATCH] D38233: [InlineCost, NFC] Extract code dealing with inbounds GEPs from CallAnalyzer::visitGetElementPtr into separate function
Evgeny Astigeevich via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 3 05:02:31 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL314787: [InlineCost, NFC] Extract code dealing with inbounds GEPs from… (authored by eastig).
Repository:
rL LLVM
https://reviews.llvm.org/D38233
Files:
llvm/trunk/lib/Analysis/InlineCost.cpp
Index: llvm/trunk/lib/Analysis/InlineCost.cpp
===================================================================
--- llvm/trunk/lib/Analysis/InlineCost.cpp
+++ llvm/trunk/lib/Analysis/InlineCost.cpp
@@ -172,6 +172,7 @@
void accumulateSROACost(DenseMap<Value *, int>::iterator CostIt,
int InstructionCost);
bool isGEPFree(GetElementPtrInst &GEP);
+ bool canFoldInboundsGEP(GetElementPtrInst &I);
bool accumulateGEPOffset(GEPOperator &GEP, APInt &Offset);
bool simplifyCallSite(Function *F, CallSite CS);
template <typename Callable>
@@ -431,49 +432,43 @@
return true;
}
+/// \brief Check we can fold GEPs of constant-offset call site argument pointers.
+/// This requires target data and inbounds GEPs.
+///
+/// \return true if the specified GEP can be folded.
+bool CallAnalyzer::canFoldInboundsGEP(GetElementPtrInst &I) {
+ // Check if we have a base + offset for the pointer.
+ std::pair<Value *, APInt> BaseAndOffset =
+ ConstantOffsetPtrs.lookup(I.getPointerOperand());
+ if (!BaseAndOffset.first)
+ return false;
+
+ // Check if the offset of this GEP is constant, and if so accumulate it
+ // into Offset.
+ if (!accumulateGEPOffset(cast<GEPOperator>(I), BaseAndOffset.second))
+ return false;
+
+ // Add the result as a new mapping to Base + Offset.
+ ConstantOffsetPtrs[&I] = BaseAndOffset;
+
+ return true;
+}
+
bool CallAnalyzer::visitGetElementPtr(GetElementPtrInst &I) {
Value *SROAArg;
DenseMap<Value *, int>::iterator CostIt;
bool SROACandidate =
lookupSROAArgAndCost(I.getPointerOperand(), SROAArg, CostIt);
- // Try to fold GEPs of constant-offset call site argument pointers. This
- // requires target data and inbounds GEPs.
- if (I.isInBounds()) {
- // Check if we have a base + offset for the pointer.
- Value *Ptr = I.getPointerOperand();
- std::pair<Value *, APInt> BaseAndOffset = ConstantOffsetPtrs.lookup(Ptr);
- if (BaseAndOffset.first) {
- // Check if the offset of this GEP is constant, and if so accumulate it
- // into Offset.
- if (!accumulateGEPOffset(cast<GEPOperator>(I), BaseAndOffset.second)) {
- // Non-constant GEPs aren't folded, and disable SROA.
- if (SROACandidate)
- disableSROA(CostIt);
- return isGEPFree(I);
- }
-
- // Add the result as a new mapping to Base + Offset.
- ConstantOffsetPtrs[&I] = BaseAndOffset;
-
- // Also handle SROA candidates here, we already know that the GEP is
- // all-constant indexed.
- if (SROACandidate)
- SROAArgValues[&I] = SROAArg;
-
- return true;
- }
- }
-
// Lambda to check whether a GEP's indices are all constant.
auto IsGEPOffsetConstant = [&](GetElementPtrInst &GEP) {
for (User::op_iterator I = GEP.idx_begin(), E = GEP.idx_end(); I != E; ++I)
if (!isa<Constant>(*I) && !SimplifiedValues.lookup(*I))
return false;
return true;
};
- if (IsGEPOffsetConstant(I)) {
+ if ((I.isInBounds() && canFoldInboundsGEP(I)) || IsGEPOffsetConstant(I)) {
if (SROACandidate)
SROAArgValues[&I] = SROAArg;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38233.117501.patch
Type: text/x-patch
Size: 3122 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171003/a6eb07de/attachment.bin>
More information about the llvm-commits
mailing list