summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp
diff options
context:
space:
mode:
authorFlorian Hahn <florian.hahn@arm.com>2018-11-09 13:28:58 +0000
committerFlorian Hahn <florian.hahn@arm.com>2018-11-09 13:28:58 +0000
commit9f878e9baef070970b11e8e7220f69ff804650bf (patch)
tree0034167bea1567dacc08061f368aa956f2a0f15a /llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp
parent7bd78fc1968f251a744f84163692c90423b3d15f (diff)
downloadbcm5719-llvm-9f878e9baef070970b11e8e7220f69ff804650bf.tar.gz
bcm5719-llvm-9f878e9baef070970b11e8e7220f69ff804650bf.zip
Revert r346483: [CallSiteSplitting] Only record conditions up to the IDom(call site).
This cause a failure with EXPENSIVE_CHECKS llvm-svn: 346492
Diffstat (limited to 'llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp53
1 files changed, 15 insertions, 38 deletions
diff --git a/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp b/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp
index 208dd5a5a83..b9e8e3424cc 100644
--- a/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp
+++ b/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp
@@ -149,14 +149,14 @@ static void recordCondition(CallSite CS, BasicBlock *From, BasicBlock *To,
/// Record ICmp conditions relevant to any argument in CS following Pred's
/// single predecessors. If there are conflicting conditions along a path, like
-/// x == 1 and x == 0, the first condition will be used. We stop once we reach
-/// an edge to StopAt.
+/// x == 1 and x == 0, the first condition will be used.
static void recordConditions(CallSite CS, BasicBlock *Pred,
- ConditionsTy &Conditions, BasicBlock *StopAt) {
+ ConditionsTy &Conditions) {
+ recordCondition(CS, Pred, CS.getInstruction()->getParent(), Conditions);
BasicBlock *From = Pred;
BasicBlock *To = Pred;
SmallPtrSet<BasicBlock *, 4> Visited;
- while (To != StopAt && !Visited.count(From->getSinglePredecessor()) &&
+ while (!Visited.count(From->getSinglePredecessor()) &&
(From = From->getSinglePredecessor())) {
recordCondition(CS, From, To, Conditions);
Visited.insert(From);
@@ -302,7 +302,7 @@ static void copyMustTailReturn(BasicBlock *SplitBB, Instruction *CI,
static void splitCallSite(
CallSite CS,
const SmallVectorImpl<std::pair<BasicBlock *, ConditionsTy>> &Preds,
- DominatorTree &DT) {
+ DominatorTree *DT) {
Instruction *Instr = CS.getInstruction();
BasicBlock *TailBB = Instr->getParent();
bool IsMustTailCall = CS.isMustTailCall();
@@ -327,7 +327,7 @@ static void splitCallSite(
BasicBlock *PredBB = Preds[i].first;
BasicBlock *SplitBlock = DuplicateInstructionsInSplitBetween(
TailBB, PredBB, &*std::next(Instr->getIterator()), ValueToValueMaps[i],
- &DT);
+ DT);
assert(SplitBlock && "Unexpected new basic block split.");
Instruction *NewCI =
@@ -438,7 +438,7 @@ static bool isPredicatedOnPHI(CallSite CS) {
return false;
}
-static bool tryToSplitOnPHIPredicatedArgument(CallSite CS, DominatorTree &DT) {
+static bool tryToSplitOnPHIPredicatedArgument(CallSite CS, DominatorTree *DT) {
if (!isPredicatedOnPHI(CS))
return false;
@@ -449,25 +449,15 @@ static bool tryToSplitOnPHIPredicatedArgument(CallSite CS, DominatorTree &DT) {
return true;
}
-static bool tryToSplitOnPredicatedArgument(CallSite CS, DominatorTree &DT) {
+static bool tryToSplitOnPredicatedArgument(CallSite CS, DominatorTree *DT) {
auto Preds = getTwoPredecessors(CS.getInstruction()->getParent());
if (Preds[0] == Preds[1])
return false;
- // We can stop recording conditions once we reached the immediate dominator
- // for the block containing the call site. Conditions in predecessors of the
- // that node will be the same for all paths to the call site and splitting
- // is not beneficial.
- auto *CSDTNode = DT.getNode(CS.getInstruction()->getParent());
- BasicBlock *StopAt = CSDTNode ? CSDTNode->getIDom()->getBlock() : nullptr;
-
SmallVector<std::pair<BasicBlock *, ConditionsTy>, 2> PredsCS;
for (auto *Pred : make_range(Preds.rbegin(), Preds.rend())) {
ConditionsTy Conditions;
- // Record condition on edge BB(CS) <- Pred
- recordCondition(CS, Pred, CS.getInstruction()->getParent(), Conditions);
- // Record conditions followng Pred's single predecessors.
- recordConditions(CS, Pred, Conditions, StopAt);
+ recordConditions(CS, Pred, Conditions);
PredsCS.push_back({Pred, Conditions});
}
@@ -476,24 +466,12 @@ static bool tryToSplitOnPredicatedArgument(CallSite CS, DominatorTree &DT) {
}))
return false;
- // Record common conditions starting from StopAt. Those conditions hold for
- // all paths to CS. Adding them gives the inliner a better chance at inlining
- // CS.
- ConditionsTy CommonConditions;
- if (StopAt)
- recordConditions(CS, StopAt, CommonConditions, nullptr);
- if (!CommonConditions.empty())
- for (auto &Pred : PredsCS) {
- Pred.second.insert(Pred.second.end(), CommonConditions.begin(),
- CommonConditions.end());
- }
-
splitCallSite(CS, PredsCS, DT);
return true;
}
static bool tryToSplitCallSite(CallSite CS, TargetTransformInfo &TTI,
- DominatorTree &DT) {
+ DominatorTree *DT) {
if (!CS.arg_size() || !canSplitCallSite(CS, TTI))
return false;
return tryToSplitOnPredicatedArgument(CS, DT) ||
@@ -501,7 +479,7 @@ static bool tryToSplitCallSite(CallSite CS, TargetTransformInfo &TTI,
}
static bool doCallSiteSplitting(Function &F, TargetLibraryInfo &TLI,
- TargetTransformInfo &TTI, DominatorTree &DT) {
+ TargetTransformInfo &TTI, DominatorTree *DT) {
bool Changed = false;
for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE;) {
BasicBlock &BB = *BI++;
@@ -546,7 +524,6 @@ struct CallSiteSplittingLegacyPass : public FunctionPass {
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<TargetLibraryInfoWrapperPass>();
AU.addRequired<TargetTransformInfoWrapperPass>();
- AU.addRequired<DominatorTreeWrapperPass>();
AU.addPreserved<DominatorTreeWrapperPass>();
FunctionPass::getAnalysisUsage(AU);
}
@@ -557,8 +534,9 @@ struct CallSiteSplittingLegacyPass : public FunctionPass {
auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
auto &TTI = getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
- auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
- return doCallSiteSplitting(F, TLI, TTI, DT);
+ auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
+ return doCallSiteSplitting(F, TLI, TTI,
+ DTWP ? &DTWP->getDomTree() : nullptr);
}
};
} // namespace
@@ -568,7 +546,6 @@ INITIALIZE_PASS_BEGIN(CallSiteSplittingLegacyPass, "callsite-splitting",
"Call-site splitting", false, false)
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
-INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_END(CallSiteSplittingLegacyPass, "callsite-splitting",
"Call-site splitting", false, false)
FunctionPass *llvm::createCallSiteSplittingPass() {
@@ -579,7 +556,7 @@ PreservedAnalyses CallSiteSplittingPass::run(Function &F,
FunctionAnalysisManager &AM) {
auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
auto &TTI = AM.getResult<TargetIRAnalysis>(F);
- auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
+ auto *DT = AM.getCachedResult<DominatorTreeAnalysis>(F);
if (!doCallSiteSplitting(F, TLI, TTI, DT))
return PreservedAnalyses::all();
OpenPOWER on IntegriCloud