diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
commit | d8e91e46262bc44006913e6796843909f1ac7bcd (patch) | |
tree | 7d0c143d9b38190e0fa0180805389da22cd834c5 /lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | b7eb8e35e481a74962664b63dfb09483b200209a (diff) | |
download | src-d8e91e46262bc44006913e6796843909f1ac7bcd.tar.gz src-d8e91e46262bc44006913e6796843909f1ac7bcd.zip |
Notes
Diffstat (limited to 'lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | lib/Transforms/Utils/SimplifyCFG.cpp | 312 |
1 files changed, 163 insertions, 149 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index c87b5c16ffce..03b73954321d 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -173,14 +173,15 @@ class SimplifyCFGOpt { const DataLayout &DL; SmallPtrSetImpl<BasicBlock *> *LoopHeaders; const SimplifyCFGOptions &Options; + bool Resimplify; - Value *isValueEqualityComparison(TerminatorInst *TI); + Value *isValueEqualityComparison(Instruction *TI); BasicBlock *GetValueEqualityComparisonCases( - TerminatorInst *TI, std::vector<ValueEqualityComparisonCase> &Cases); - bool SimplifyEqualityComparisonWithOnlyPredecessor(TerminatorInst *TI, + Instruction *TI, std::vector<ValueEqualityComparisonCase> &Cases); + bool SimplifyEqualityComparisonWithOnlyPredecessor(Instruction *TI, BasicBlock *Pred, IRBuilder<> &Builder); - bool FoldValueComparisonIntoPredecessors(TerminatorInst *TI, + bool FoldValueComparisonIntoPredecessors(Instruction *TI, IRBuilder<> &Builder); bool SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder); @@ -194,6 +195,9 @@ class SimplifyCFGOpt { bool SimplifyUncondBranch(BranchInst *BI, IRBuilder<> &Builder); bool SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder); + bool tryToSimplifyUncondBranchWithICmpInIt(ICmpInst *ICI, + IRBuilder<> &Builder); + public: SimplifyCFGOpt(const TargetTransformInfo &TTI, const DataLayout &DL, SmallPtrSetImpl<BasicBlock *> *LoopHeaders, @@ -201,6 +205,13 @@ public: : TTI(TTI), DL(DL), LoopHeaders(LoopHeaders), Options(Opts) {} bool run(BasicBlock *BB); + bool simplifyOnce(BasicBlock *BB); + + // Helper to set Resimplify and return change indication. + bool requestResimplify() { + Resimplify = true; + return true; + } }; } // end anonymous namespace @@ -208,7 +219,7 @@ public: /// Return true if it is safe to merge these two /// terminator instructions together. static bool -SafeToMergeTerminators(TerminatorInst *SI1, TerminatorInst *SI2, +SafeToMergeTerminators(Instruction *SI1, Instruction *SI2, SmallSetVector<BasicBlock *, 4> *FailBlocks = nullptr) { if (SI1 == SI2) return false; // Can't merge with self! @@ -315,7 +326,7 @@ static unsigned ComputeSpeculationCost(const User *I, /// V plus its non-dominating operands. If that cost is greater than /// CostRemaining, false is returned and CostRemaining is undefined. static bool DominatesMergePoint(Value *V, BasicBlock *BB, - SmallPtrSetImpl<Instruction *> *AggressiveInsts, + SmallPtrSetImpl<Instruction *> &AggressiveInsts, unsigned &CostRemaining, const TargetTransformInfo &TTI, unsigned Depth = 0) { @@ -349,13 +360,8 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, if (!BI || BI->isConditional() || BI->getSuccessor(0) != BB) return true; - // If we aren't allowing aggressive promotion anymore, then don't consider - // instructions in the 'if region'. - if (!AggressiveInsts) - return false; - // If we have seen this instruction before, don't count it again. - if (AggressiveInsts->count(I)) + if (AggressiveInsts.count(I)) return true; // Okay, it looks like the instruction IS in the "condition". Check to @@ -373,7 +379,7 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, // is expected to be undone in CodeGenPrepare if the speculation has not // enabled further IR optimizations. if (Cost > CostRemaining && - (!SpeculateOneExpensiveInst || !AggressiveInsts->empty() || Depth > 0)) + (!SpeculateOneExpensiveInst || !AggressiveInsts.empty() || Depth > 0)) return false; // Avoid unsigned wrap. @@ -386,7 +392,7 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, Depth + 1)) return false; // Okay, it's safe to do this! Remember this instruction. - AggressiveInsts->insert(I); + AggressiveInsts.insert(I); return true; } @@ -664,7 +670,7 @@ private: } // end anonymous namespace -static void EraseTerminatorInstAndDCECond(TerminatorInst *TI) { +static void EraseTerminatorAndDCECond(Instruction *TI) { Instruction *Cond = nullptr; if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { Cond = dyn_cast<Instruction>(SI->getCondition()); @@ -682,12 +688,12 @@ static void EraseTerminatorInstAndDCECond(TerminatorInst *TI) { /// Return true if the specified terminator checks /// to see if a value is equal to constant integer value. -Value *SimplifyCFGOpt::isValueEqualityComparison(TerminatorInst *TI) { +Value *SimplifyCFGOpt::isValueEqualityComparison(Instruction *TI) { Value *CV = nullptr; if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { // Do not permit merging of large switch instructions into their // predecessors unless there is only one predecessor. - if (SI->getNumSuccessors() * pred_size(SI->getParent()) <= 128) + if (!SI->getParent()->hasNPredecessorsOrMore(128 / SI->getNumSuccessors())) CV = SI->getCondition(); } else if (BranchInst *BI = dyn_cast<BranchInst>(TI)) if (BI->isConditional() && BI->getCondition()->hasOneUse()) @@ -710,7 +716,7 @@ Value *SimplifyCFGOpt::isValueEqualityComparison(TerminatorInst *TI) { /// Given a value comparison instruction, /// decode all of the 'cases' that it represents and return the 'default' block. BasicBlock *SimplifyCFGOpt::GetValueEqualityComparisonCases( - TerminatorInst *TI, std::vector<ValueEqualityComparisonCase> &Cases) { + Instruction *TI, std::vector<ValueEqualityComparisonCase> &Cases) { if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { Cases.reserve(SI->getNumCases()); for (auto Case : SI->cases()) @@ -800,7 +806,7 @@ static void setBranchWeights(Instruction *I, uint32_t TrueWeight, /// determines the outcome of this comparison. If so, simplify TI. This does a /// very limited form of jump threading. bool SimplifyCFGOpt::SimplifyEqualityComparisonWithOnlyPredecessor( - TerminatorInst *TI, BasicBlock *Pred, IRBuilder<> &Builder) { + Instruction *TI, BasicBlock *Pred, IRBuilder<> &Builder) { Value *PredVal = isValueEqualityComparison(Pred->getTerminator()); if (!PredVal) return false; // Not a value comparison in predecessor. @@ -848,7 +854,7 @@ bool SimplifyCFGOpt::SimplifyEqualityComparisonWithOnlyPredecessor( << "Through successor TI: " << *TI << "Leaving: " << *NI << "\n"); - EraseTerminatorInstAndDCECond(TI); + EraseTerminatorAndDCECond(TI); return true; } @@ -930,7 +936,7 @@ bool SimplifyCFGOpt::SimplifyEqualityComparisonWithOnlyPredecessor( << "Through successor TI: " << *TI << "Leaving: " << *NI << "\n"); - EraseTerminatorInstAndDCECond(TI); + EraseTerminatorAndDCECond(TI); return true; } @@ -965,10 +971,10 @@ static inline bool HasBranchWeights(const Instruction *I) { return false; } -/// Get Weights of a given TerminatorInst, the default weight is at the front +/// Get Weights of a given terminator, the default weight is at the front /// of the vector. If TI is a conditional eq, we need to swap the branch-weight /// metadata. -static void GetBranchWeights(TerminatorInst *TI, +static void GetBranchWeights(Instruction *TI, SmallVectorImpl<uint64_t> &Weights) { MDNode *MD = TI->getMetadata(LLVMContext::MD_prof); assert(MD); @@ -1002,7 +1008,7 @@ static void FitWeights(MutableArrayRef<uint64_t> Weights) { /// (either a switch or a branch on "X == c"). /// See if any of the predecessors of the terminator block are value comparisons /// on the same value. If so, and if safe to do so, fold them together. -bool SimplifyCFGOpt::FoldValueComparisonIntoPredecessors(TerminatorInst *TI, +bool SimplifyCFGOpt::FoldValueComparisonIntoPredecessors(Instruction *TI, IRBuilder<> &Builder) { BasicBlock *BB = TI->getParent(); Value *CV = isValueEqualityComparison(TI); // CondVal @@ -1014,7 +1020,7 @@ bool SimplifyCFGOpt::FoldValueComparisonIntoPredecessors(TerminatorInst *TI, BasicBlock *Pred = Preds.pop_back_val(); // See if the predecessor is a comparison with the same value. - TerminatorInst *PTI = Pred->getTerminator(); + Instruction *PTI = Pred->getTerminator(); Value *PCV = isValueEqualityComparison(PTI); // PredCondVal if (PCV == CV && TI != PTI) { @@ -1191,7 +1197,7 @@ bool SimplifyCFGOpt::FoldValueComparisonIntoPredecessors(TerminatorInst *TI, setBranchWeights(NewSI, MDWeights); } - EraseTerminatorInstAndDCECond(PTI); + EraseTerminatorAndDCECond(PTI); // Okay, last check. If BB is still a successor of PSI, then we must // have an infinite loop case. If so, add an infinitely looping block @@ -1270,7 +1276,7 @@ static bool HoistThenElseCodeToIf(BranchInst *BI, do { // If we are hoisting the terminator instruction, don't move one (making a // broken BB), instead clone it, and remove BI. - if (isa<TerminatorInst>(I1)) + if (I1->isTerminator()) goto HoistTerminator; // If we're going to hoist a call, make sure that the two instructions we're @@ -1315,8 +1321,9 @@ static bool HoistThenElseCodeToIf(BranchInst *BI, LLVMContext::MD_align, LLVMContext::MD_dereferenceable, LLVMContext::MD_dereferenceable_or_null, - LLVMContext::MD_mem_parallel_loop_access}; - combineMetadata(I1, I2, KnownIDs); + LLVMContext::MD_mem_parallel_loop_access, + LLVMContext::MD_access_group}; + combineMetadata(I1, I2, KnownIDs, true); // I1 and I2 are being combined into a single instruction. Its debug // location is the merged locations of the original instructions. @@ -1375,7 +1382,13 @@ HoistTerminator: NT->takeName(I1); } + // Ensure terminator gets a debug location, even an unknown one, in case + // it involves inlinable calls. + NT->applyMergedLocation(I1->getDebugLoc(), I2->getDebugLoc()); + + // PHIs created below will adopt NT's merged DebugLoc. IRBuilder<NoFolder> Builder(NT); + // Hoisting one of the terminators from our successor is a great thing. // Unfortunately, the successors of the if/else blocks may have PHI nodes in // them. If they do, all PHI entries for BB1/BB2 must agree for all PHI @@ -1407,7 +1420,7 @@ HoistTerminator: for (BasicBlock *Succ : successors(BB1)) AddPredecessorToBlock(Succ, BIParent, BB1); - EraseTerminatorInstAndDCECond(BI); + EraseTerminatorAndDCECond(BI); return true; } @@ -1582,7 +1595,7 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) { // However, as N-way merge for CallInst is rare, so we use simplified API // instead of using complex API for N-way merge. I0->applyMergedLocation(I0->getDebugLoc(), I->getDebugLoc()); - combineMetadataForCSE(I0, I); + combineMetadataForCSE(I0, I, true); I0->andIRFlags(I); } @@ -1940,11 +1953,11 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB, } assert(EndBB == BI->getSuccessor(!Invert) && "No edge from to end block"); - // Keep a count of how many times instructions are used within CondBB when - // they are candidates for sinking into CondBB. Specifically: + // Keep a count of how many times instructions are used within ThenBB when + // they are candidates for sinking into ThenBB. Specifically: // - They are defined in BB, and // - They have no side effects, and - // - All of their uses are in CondBB. + // - All of their uses are in ThenBB. SmallDenseMap<Instruction *, unsigned, 4> SinkCandidateUseCounts; SmallVector<Instruction *, 4> SpeculatedDbgIntrinsics; @@ -1994,14 +2007,14 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB, } } - // Consider any sink candidates which are only used in CondBB as costs for + // Consider any sink candidates which are only used in ThenBB as costs for // speculation. Note, while we iterate over a DenseMap here, we are summing // and so iteration order isn't significant. for (SmallDenseMap<Instruction *, unsigned, 4>::iterator I = SinkCandidateUseCounts.begin(), E = SinkCandidateUseCounts.end(); I != E; ++I) - if (I->first->getNumUses() == I->second) { + if (I->first->hasNUses(I->second)) { ++SpeculationCost; if (SpeculationCost > 1) return false; @@ -2241,7 +2254,7 @@ static bool FoldCondBranchOnPHI(BranchInst *BI, const DataLayout &DL, // Loop over all of the edges from PredBB to BB, changing them to branch // to EdgeBB instead. - TerminatorInst *PredBBTI = PredBB->getTerminator(); + Instruction *PredBBTI = PredBB->getTerminator(); for (unsigned i = 0, e = PredBBTI->getNumSuccessors(); i != e; ++i) if (PredBBTI->getSuccessor(i) == BB) { BB->removePredecessor(PredBB); @@ -2249,7 +2262,7 @@ static bool FoldCondBranchOnPHI(BranchInst *BI, const DataLayout &DL, } // Recurse, simplifying any other constants. - return FoldCondBranchOnPHI(BI, DL, AC) | true; + return FoldCondBranchOnPHI(BI, DL, AC) || true; } return false; @@ -2304,9 +2317,9 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, continue; } - if (!DominatesMergePoint(PN->getIncomingValue(0), BB, &AggressiveInsts, + if (!DominatesMergePoint(PN->getIncomingValue(0), BB, AggressiveInsts, MaxCostVal0, TTI) || - !DominatesMergePoint(PN->getIncomingValue(1), BB, &AggressiveInsts, + !DominatesMergePoint(PN->getIncomingValue(1), BB, AggressiveInsts, MaxCostVal1, TTI)) return false; } @@ -2336,8 +2349,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, IfBlock1 = nullptr; } else { DomBlock = *pred_begin(IfBlock1); - for (BasicBlock::iterator I = IfBlock1->begin(); !isa<TerminatorInst>(I); - ++I) + for (BasicBlock::iterator I = IfBlock1->begin(); !I->isTerminator(); ++I) if (!AggressiveInsts.count(&*I) && !isa<DbgInfoIntrinsic>(I)) { // This is not an aggressive instruction that we can promote. // Because of this, we won't be able to get rid of the control flow, so @@ -2350,8 +2362,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, IfBlock2 = nullptr; } else { DomBlock = *pred_begin(IfBlock2); - for (BasicBlock::iterator I = IfBlock2->begin(); !isa<TerminatorInst>(I); - ++I) + for (BasicBlock::iterator I = IfBlock2->begin(); !I->isTerminator(); ++I) if (!AggressiveInsts.count(&*I) && !isa<DbgInfoIntrinsic>(I)) { // This is not an aggressive instruction that we can promote. // Because of this, we won't be able to get rid of the control flow, so @@ -2371,20 +2382,10 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, // Move all 'aggressive' instructions, which are defined in the // conditional parts of the if's up to the dominating block. - if (IfBlock1) { - for (auto &I : *IfBlock1) - I.dropUnknownNonDebugMetadata(); - DomBlock->getInstList().splice(InsertPt->getIterator(), - IfBlock1->getInstList(), IfBlock1->begin(), - IfBlock1->getTerminator()->getIterator()); - } - if (IfBlock2) { - for (auto &I : *IfBlock2) - I.dropUnknownNonDebugMetadata(); - DomBlock->getInstList().splice(InsertPt->getIterator(), - IfBlock2->getInstList(), IfBlock2->begin(), - IfBlock2->getTerminator()->getIterator()); - } + if (IfBlock1) + hoistAllInstructionsInto(DomBlock, InsertPt, IfBlock1); + if (IfBlock2) + hoistAllInstructionsInto(DomBlock, InsertPt, IfBlock2); while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) { // Change the PHI node into a select instruction. @@ -2400,7 +2401,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, // At this point, IfBlock1 and IfBlock2 are both empty, so our if statement // has been flattened. Change DomBlock to jump directly to our new block to // avoid other simplifycfg's kicking in on the diamond. - TerminatorInst *OldTI = DomBlock->getTerminator(); + Instruction *OldTI = DomBlock->getTerminator(); Builder.SetInsertPoint(OldTI); Builder.CreateBr(BB); OldTI->eraseFromParent(); @@ -2434,7 +2435,7 @@ static bool SimplifyCondBranchToTwoReturns(BranchInst *BI, TrueSucc->removePredecessor(BI->getParent()); FalseSucc->removePredecessor(BI->getParent()); Builder.CreateRetVoid(); - EraseTerminatorInstAndDCECond(BI); + EraseTerminatorAndDCECond(BI); return true; } @@ -2490,7 +2491,7 @@ static bool SimplifyCondBranchToTwoReturns(BranchInst *BI, << "\n " << *BI << "NewRet = " << *RI << "TRUEBLOCK: " << *TrueSucc << "FALSEBLOCK: " << *FalseSucc); - EraseTerminatorInstAndDCECond(BI); + EraseTerminatorAndDCECond(BI); return true; } @@ -2541,6 +2542,8 @@ static bool extractPredSuccWeights(BranchInst *PBI, BranchInst *BI, bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { BasicBlock *BB = BI->getParent(); + const unsigned PredCount = pred_size(BB); + Instruction *Cond = nullptr; if (BI->isConditional()) Cond = dyn_cast<Instruction>(BI->getCondition()); @@ -2590,7 +2593,8 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { // too many instructions and these involved instructions can be executed // unconditionally. We denote all involved instructions except the condition // as "bonus instructions", and only allow this transformation when the - // number of the bonus instructions does not exceed a certain threshold. + // number of the bonus instructions we'll need to create when cloning into + // each predecessor does not exceed a certain threshold. unsigned NumBonusInsts = 0; for (auto I = BB->begin(); Cond != &*I; ++I) { // Ignore dbg intrinsics. @@ -2605,7 +2609,10 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { // I is used in the same BB. Since BI uses Cond and doesn't have more slots // to use any other instruction, User must be an instruction between next(I) // and Cond. - ++NumBonusInsts; + + // Account for the cost of duplicating this instruction into each + // predecessor. + NumBonusInsts += PredCount; // Early exits once we reach the limit. if (NumBonusInsts > BonusInstThreshold) return false; @@ -2711,16 +2718,16 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { // Clone Cond into the predecessor basic block, and or/and the // two conditions together. - Instruction *New = Cond->clone(); - RemapInstruction(New, VMap, + Instruction *CondInPred = Cond->clone(); + RemapInstruction(CondInPred, VMap, RF_NoModuleLevelChanges | RF_IgnoreMissingLocals); - PredBlock->getInstList().insert(PBI->getIterator(), New); - New->takeName(Cond); - Cond->setName(New->getName() + ".old"); + PredBlock->getInstList().insert(PBI->getIterator(), CondInPred); + CondInPred->takeName(Cond); + Cond->setName(CondInPred->getName() + ".old"); if (BI->isConditional()) { Instruction *NewCond = cast<Instruction>( - Builder.CreateBinOp(Opc, PBI->getCondition(), New, "or.cond")); + Builder.CreateBinOp(Opc, PBI->getCondition(), CondInPred, "or.cond")); PBI->setCondition(NewCond); uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight; @@ -2784,7 +2791,8 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { Instruction *NotCond = cast<Instruction>( Builder.CreateNot(PBI->getCondition(), "not.cond")); MergedCond = cast<Instruction>( - Builder.CreateBinOp(Instruction::And, NotCond, New, "and.cond")); + Builder.CreateBinOp(Instruction::And, NotCond, CondInPred, + "and.cond")); if (PBI_C->isOne()) MergedCond = cast<Instruction>(Builder.CreateBinOp( Instruction::Or, PBI->getCondition(), MergedCond, "or.cond")); @@ -2793,7 +2801,7 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { // PBI_C is true: (PBI_Cond and BI_Value) or (!PBI_Cond) // is false: PBI_Cond and BI_Value MergedCond = cast<Instruction>(Builder.CreateBinOp( - Instruction::And, PBI->getCondition(), New, "and.cond")); + Instruction::And, PBI->getCondition(), CondInPred, "and.cond")); if (PBI_C->isOne()) { Instruction *NotCond = cast<Instruction>( Builder.CreateNot(PBI->getCondition(), "not.cond")); @@ -2807,7 +2815,7 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) { } // Change PBI from Conditional to Unconditional. BranchInst *New_PBI = BranchInst::Create(TrueDest, PBI); - EraseTerminatorInstAndDCECond(PBI); + EraseTerminatorAndDCECond(PBI); PBI = New_PBI; } @@ -2873,7 +2881,7 @@ static Value *ensureValueAvailableInSuccessor(Value *V, BasicBlock *BB, if (!AlternativeV) break; - assert(pred_size(Succ) == 2); + assert(Succ->hasNPredecessors(2)); auto PredI = pred_begin(Succ); BasicBlock *OtherPredBB = *PredI == BB ? *++PredI : *PredI; if (PHI->getIncomingValueForBlock(OtherPredBB) == AlternativeV) @@ -2922,7 +2930,7 @@ static bool mergeConditionalStoreToAddress(BasicBlock *PTB, BasicBlock *PFB, isa<StoreInst>(I)) ++N; // Free instructions. - else if (isa<TerminatorInst>(I) || IsaBitcastOfPointerType(I)) + else if (I.isTerminator() || IsaBitcastOfPointerType(I)) continue; else return false; @@ -3402,7 +3410,7 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI, // Takes care of updating the successors and removing the old terminator. // Also makes sure not to introduce new successors by assuming that edges to // non-successor TrueBBs and FalseBBs aren't reachable. -static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond, +static bool SimplifyTerminatorOnSelect(Instruction *OldTerm, Value *Cond, BasicBlock *TrueBB, BasicBlock *FalseBB, uint32_t TrueWeight, uint32_t FalseWeight) { @@ -3414,7 +3422,7 @@ static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond, BasicBlock *KeepEdge2 = TrueBB != FalseBB ? FalseBB : nullptr; // Then remove the rest. - for (BasicBlock *Succ : OldTerm->successors()) { + for (BasicBlock *Succ : successors(OldTerm)) { // Make sure only to keep exactly one copy of each edge. if (Succ == KeepEdge1) KeepEdge1 = nullptr; @@ -3457,7 +3465,7 @@ static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond, Builder.CreateBr(FalseBB); } - EraseTerminatorInstAndDCECond(OldTerm); + EraseTerminatorAndDCECond(OldTerm); return true; } @@ -3534,9 +3542,8 @@ static bool SimplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI) { /// /// We prefer to split the edge to 'end' so that there is a true/false entry to /// the PHI, merging the third icmp into the switch. -static bool tryToSimplifyUncondBranchWithICmpInIt( - ICmpInst *ICI, IRBuilder<> &Builder, const DataLayout &DL, - const TargetTransformInfo &TTI, const SimplifyCFGOptions &Options) { +bool SimplifyCFGOpt::tryToSimplifyUncondBranchWithICmpInIt( + ICmpInst *ICI, IRBuilder<> &Builder) { BasicBlock *BB = ICI->getParent(); // If the block has any PHIs in it or the icmp has multiple uses, it is too @@ -3571,7 +3578,7 @@ static bool tryToSimplifyUncondBranchWithICmpInIt( ICI->eraseFromParent(); } // BB is now empty, so it is likely to simplify away. - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } // Ok, the block is reachable from the default dest. If the constant we're @@ -3587,7 +3594,7 @@ static bool tryToSimplifyUncondBranchWithICmpInIt( ICI->replaceAllUsesWith(V); ICI->eraseFromParent(); // BB is now empty, so it is likely to simplify away. - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } // The use of the icmp has to be in the 'end' block, by the only PHI node in @@ -3701,7 +3708,7 @@ static bool SimplifyBranchOnICmpChain(BranchInst *BI, IRBuilder<> &Builder, BasicBlock *NewBB = BB->splitBasicBlock(BI->getIterator(), "switch.early.test"); // Remove the uncond branch added to the old block. - TerminatorInst *OldTI = BB->getTerminator(); + Instruction *OldTI = BB->getTerminator(); Builder.SetInsertPoint(OldTI); if (TrueWhenEqual) @@ -3745,7 +3752,7 @@ static bool SimplifyBranchOnICmpChain(BranchInst *BI, IRBuilder<> &Builder, } // Erase the old branch instruction. - EraseTerminatorInstAndDCECond(BI); + EraseTerminatorAndDCECond(BI); LLVM_DEBUG(dbgs() << " ** 'icmp' chain result is:\n" << *BB << '\n'); return true; @@ -3861,9 +3868,9 @@ bool SimplifyCFGOpt::SimplifySingleResume(ResumeInst *RI) { } // The landingpad is now unreachable. Zap it. - BB->eraseFromParent(); if (LoopHeaders) LoopHeaders->erase(BB); + BB->eraseFromParent(); return true; } @@ -3993,7 +4000,7 @@ static bool removeEmptyCleanup(CleanupReturnInst *RI) { if (UnwindDest == nullptr) { removeUnwindEdge(PredBB); } else { - TerminatorInst *TI = PredBB->getTerminator(); + Instruction *TI = PredBB->getTerminator(); TI->replaceUsesOfWith(BB, UnwindDest); } } @@ -4062,7 +4069,7 @@ bool SimplifyCFGOpt::SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) { SmallVector<BranchInst *, 8> CondBranchPreds; for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) { BasicBlock *P = *PI; - TerminatorInst *PTI = P->getTerminator(); + Instruction *PTI = P->getTerminator(); if (BranchInst *BI = dyn_cast<BranchInst>(PTI)) { if (BI->isUnconditional()) UncondBranchPreds.push_back(P); @@ -4083,9 +4090,9 @@ bool SimplifyCFGOpt::SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) { // If we eliminated all predecessors of the block, delete the block now. if (pred_empty(BB)) { // We know there are no successors, so just nuke the block. - BB->eraseFromParent(); if (LoopHeaders) LoopHeaders->erase(BB); + BB->eraseFromParent(); } return true; @@ -4167,7 +4174,7 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) { SmallVector<BasicBlock *, 8> Preds(pred_begin(BB), pred_end(BB)); for (unsigned i = 0, e = Preds.size(); i != e; ++i) { - TerminatorInst *TI = Preds[i]->getTerminator(); + Instruction *TI = Preds[i]->getTerminator(); IRBuilder<> Builder(TI); if (auto *BI = dyn_cast<BranchInst>(TI)) { if (BI->isUnconditional()) { @@ -4179,10 +4186,10 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) { } else { if (BI->getSuccessor(0) == BB) { Builder.CreateBr(BI->getSuccessor(1)); - EraseTerminatorInstAndDCECond(BI); + EraseTerminatorAndDCECond(BI); } else if (BI->getSuccessor(1) == BB) { Builder.CreateBr(BI->getSuccessor(0)); - EraseTerminatorInstAndDCECond(BI); + EraseTerminatorAndDCECond(BI); Changed = true; } } @@ -4245,9 +4252,9 @@ bool SimplifyCFGOpt::SimplifyUnreachable(UnreachableInst *UI) { // If this block is now dead, remove it. if (pred_empty(BB) && BB != &BB->getParent()->getEntryBlock()) { // We know there are no successors, so just nuke the block. - BB->eraseFromParent(); if (LoopHeaders) LoopHeaders->erase(BB); + BB->eraseFromParent(); return true; } @@ -4424,7 +4431,7 @@ static bool eliminateDeadSwitchCases(SwitchInst *SI, AssumptionCache *AC, SplitBlock(&*NewDefault, &NewDefault->front()); auto *OldTI = NewDefault->getTerminator(); new UnreachableInst(SI->getContext(), OldTI); - EraseTerminatorInstAndDCECond(OldTI); + EraseTerminatorAndDCECond(OldTI); return true; } @@ -4635,12 +4642,12 @@ GetCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest, SmallDenseMap<Value *, Constant *> ConstantPool; ConstantPool.insert(std::make_pair(SI->getCondition(), CaseVal)); for (Instruction &I :CaseDest->instructionsWithoutDebug()) { - if (TerminatorInst *T = dyn_cast<TerminatorInst>(&I)) { + if (I.isTerminator()) { // If the terminator is a simple branch, continue to the next block. - if (T->getNumSuccessors() != 1 || T->isExceptional()) + if (I.getNumSuccessors() != 1 || I.isExceptionalTerminator()) return false; Pred = CaseDest; - CaseDest = T->getSuccessor(0); + CaseDest = I.getSuccessor(0); } else if (Constant *C = ConstantFold(&I, DL, ConstantPool)) { // Instruction is side-effect free and constant. @@ -5031,6 +5038,9 @@ SwitchLookupTable::SwitchLookupTable( GlobalVariable::PrivateLinkage, Initializer, "switch.table." + FuncName); Array->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); + // Set the alignment to that of an array items. We will be only loading one + // value out of it. + Array->setAlignment(DL.getPrefTypeAlignment(ValueType)); Kind = ArrayKind; } @@ -5257,7 +5267,7 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, // Figure out the corresponding result for each case value and phi node in the // common destination, as well as the min and max case values. - assert(SI->case_begin() != SI->case_end()); + assert(!empty(SI->cases())); SwitchInst::CaseIt CI = SI->case_begin(); ConstantInt *MinCaseVal = CI->getCaseValue(); ConstantInt *MaxCaseVal = CI->getCaseValue(); @@ -5509,7 +5519,7 @@ static bool ReduceSwitchRange(SwitchInst *SI, IRBuilder<> &Builder, SmallVector<int64_t,4> Values; for (auto &C : SI->cases()) Values.push_back(C.getCaseValue()->getValue().getSExtValue()); - llvm::sort(Values.begin(), Values.end()); + llvm::sort(Values); // If the switch is already dense, there's nothing useful to do here. if (isSwitchDense(Values)) @@ -5583,33 +5593,33 @@ bool SimplifyCFGOpt::SimplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) { // see if that predecessor totally determines the outcome of this switch. if (BasicBlock *OnlyPred = BB->getSinglePredecessor()) if (SimplifyEqualityComparisonWithOnlyPredecessor(SI, OnlyPred, Builder)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); Value *Cond = SI->getCondition(); if (SelectInst *Select = dyn_cast<SelectInst>(Cond)) if (SimplifySwitchOnSelect(SI, Select)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // If the block only contains the switch, see if we can fold the block // away into any preds. if (SI == &*BB->instructionsWithoutDebug().begin()) if (FoldValueComparisonIntoPredecessors(SI, Builder)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } // Try to transform the switch into an icmp and a branch. if (TurnSwitchRangeIntoICmp(SI, Builder)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // Remove unreachable cases. if (eliminateDeadSwitchCases(SI, Options.AC, DL)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); if (switchToSelect(SI, Builder, DL, TTI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); if (Options.ForwardSwitchCondToPhi && ForwardSwitchConditionToPHI(SI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // The conversion from switch to lookup tables results in difficult-to-analyze // code and makes pruning branches much harder. This is a problem if the @@ -5618,10 +5628,10 @@ bool SimplifyCFGOpt::SimplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) { // optimisation pipeline. if (Options.ConvertSwitchToLookupTable && SwitchToLookupTable(SI, Builder, DL, TTI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); if (ReduceSwitchRange(SI, Builder, DL, TTI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); return false; } @@ -5646,20 +5656,20 @@ bool SimplifyCFGOpt::SimplifyIndirectBr(IndirectBrInst *IBI) { if (IBI->getNumDestinations() == 0) { // If the indirectbr has no successors, change it to unreachable. new UnreachableInst(IBI->getContext(), IBI); - EraseTerminatorInstAndDCECond(IBI); + EraseTerminatorAndDCECond(IBI); return true; } if (IBI->getNumDestinations() == 1) { // If the indirectbr has one successor, change it to a direct branch. BranchInst::Create(IBI->getDestination(0), IBI); - EraseTerminatorInstAndDCECond(IBI); + EraseTerminatorAndDCECond(IBI); return true; } if (SelectInst *SI = dyn_cast<SelectInst>(IBI->getAddress())) { if (SimplifyIndirectBrOnSelect(IBI, SI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } return Changed; } @@ -5755,7 +5765,7 @@ bool SimplifyCFGOpt::SimplifyUncondBranch(BranchInst *BI, // backedge, so we can eliminate BB. bool NeedCanonicalLoop = Options.NeedCanonicalLoop && - (LoopHeaders && pred_size(BB) > 1 && + (LoopHeaders && BB->hasNPredecessorsOrMore(2) && (LoopHeaders->count(BB) || LoopHeaders->count(Succ))); BasicBlock::iterator I = BB->getFirstNonPHIOrDbg()->getIterator(); if (I->isTerminator() && BB != &BB->getParent()->getEntryBlock() && @@ -5769,7 +5779,7 @@ bool SimplifyCFGOpt::SimplifyUncondBranch(BranchInst *BI, for (++I; isa<DbgInfoIntrinsic>(I); ++I) ; if (I->isTerminator() && - tryToSimplifyUncondBranchWithICmpInIt(ICI, Builder, DL, TTI, Options)) + tryToSimplifyUncondBranchWithICmpInIt(ICI, Builder)) return true; } @@ -5787,7 +5797,7 @@ bool SimplifyCFGOpt::SimplifyUncondBranch(BranchInst *BI, // predecessor and use logical operations to update the incoming value // for PHI nodes in common successor. if (FoldBranchToCommonDest(BI, Options.BonusInstThreshold)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); return false; } @@ -5815,18 +5825,18 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) { // switch. if (BasicBlock *OnlyPred = BB->getSinglePredecessor()) if (SimplifyEqualityComparisonWithOnlyPredecessor(BI, OnlyPred, Builder)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // This block must be empty, except for the setcond inst, if it exists. // Ignore dbg intrinsics. auto I = BB->instructionsWithoutDebug().begin(); if (&*I == BI) { if (FoldValueComparisonIntoPredecessors(BI, Builder)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } else if (&*I == cast<Instruction>(BI->getCondition())) { ++I; if (&*I == BI && FoldValueComparisonIntoPredecessors(BI, Builder)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } } @@ -5834,35 +5844,24 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) { if (SimplifyBranchOnICmpChain(BI, Builder, DL)) return true; - // If this basic block has a single dominating predecessor block and the - // dominating block's condition implies BI's condition, we know the direction - // of the BI branch. - if (BasicBlock *Dom = BB->getSinglePredecessor()) { - auto *PBI = dyn_cast_or_null<BranchInst>(Dom->getTerminator()); - if (PBI && PBI->isConditional() && - PBI->getSuccessor(0) != PBI->getSuccessor(1)) { - assert(PBI->getSuccessor(0) == BB || PBI->getSuccessor(1) == BB); - bool CondIsTrue = PBI->getSuccessor(0) == BB; - Optional<bool> Implication = isImpliedCondition( - PBI->getCondition(), BI->getCondition(), DL, CondIsTrue); - if (Implication) { - // Turn this into a branch on constant. - auto *OldCond = BI->getCondition(); - ConstantInt *CI = *Implication - ? ConstantInt::getTrue(BB->getContext()) - : ConstantInt::getFalse(BB->getContext()); - BI->setCondition(CI); - RecursivelyDeleteTriviallyDeadInstructions(OldCond); - return simplifyCFG(BB, TTI, Options) | true; - } - } + // If this basic block has dominating predecessor blocks and the dominating + // blocks' conditions imply BI's condition, we know the direction of BI. + Optional<bool> Imp = isImpliedByDomCondition(BI->getCondition(), BI, DL); + if (Imp) { + // Turn this into a branch on constant. + auto *OldCond = BI->getCondition(); + ConstantInt *TorF = *Imp ? ConstantInt::getTrue(BB->getContext()) + : ConstantInt::getFalse(BB->getContext()); + BI->setCondition(TorF); + RecursivelyDeleteTriviallyDeadInstructions(OldCond); + return requestResimplify(); } // If this basic block is ONLY a compare and a branch, and if a predecessor // branches to us and one of our successors, fold the comparison into the // predecessor and use logical operations to pick the right destination. if (FoldBranchToCommonDest(BI, Options.BonusInstThreshold)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // We have a conditional branch to two blocks that are only reachable // from BI. We know that the condbr dominates the two blocks, so see if @@ -5871,24 +5870,24 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) { if (BI->getSuccessor(0)->getSinglePredecessor()) { if (BI->getSuccessor(1)->getSinglePredecessor()) { if (HoistThenElseCodeToIf(BI, TTI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } else { // If Successor #1 has multiple preds, we may be able to conditionally // execute Successor #0 if it branches to Successor #1. - TerminatorInst *Succ0TI = BI->getSuccessor(0)->getTerminator(); + Instruction *Succ0TI = BI->getSuccessor(0)->getTerminator(); if (Succ0TI->getNumSuccessors() == 1 && Succ0TI->getSuccessor(0) == BI->getSuccessor(1)) if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0), TTI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } } else if (BI->getSuccessor(1)->getSinglePredecessor()) { // If Successor #0 has multiple preds, we may be able to conditionally // execute Successor #1 if it branches to Successor #0. - TerminatorInst *Succ1TI = BI->getSuccessor(1)->getTerminator(); + Instruction *Succ1TI = BI->getSuccessor(1)->getTerminator(); if (Succ1TI->getNumSuccessors() == 1 && Succ1TI->getSuccessor(0) == BI->getSuccessor(0)) if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1), TTI)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); } // If this is a branch on a phi node in the current block, thread control @@ -5896,14 +5895,14 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) { if (PHINode *PN = dyn_cast<PHINode>(BI->getCondition())) if (PN->getParent() == BI->getParent()) if (FoldCondBranchOnPHI(BI, DL, Options.AC)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // Scan predecessor blocks for conditional branches. for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) if (BranchInst *PBI = dyn_cast<BranchInst>((*PI)->getTerminator())) if (PBI != BI && PBI->isConditional()) if (SimplifyCondBranchToCondBranch(PBI, BI, DL)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); // Look for diamond patterns. if (MergeCondStores) @@ -5911,7 +5910,7 @@ bool SimplifyCFGOpt::SimplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) { if (BranchInst *PBI = dyn_cast<BranchInst>(PrevBB->getTerminator())) if (PBI != BI && PBI->isConditional()) if (mergeConditionalStores(PBI, BI, DL)) - return simplifyCFG(BB, TTI, Options) | true; + return requestResimplify(); return false; } @@ -5974,7 +5973,7 @@ static bool removeUndefIntroducingPredecessor(BasicBlock *BB) { for (PHINode &PHI : BB->phis()) for (unsigned i = 0, e = PHI.getNumIncomingValues(); i != e; ++i) if (passingValueIsAlwaysUndefined(PHI.getIncomingValue(i), &PHI)) { - TerminatorInst *T = PHI.getIncomingBlock(i)->getTerminator(); + Instruction *T = PHI.getIncomingBlock(i)->getTerminator(); IRBuilder<> Builder(T); if (BranchInst *BI = dyn_cast<BranchInst>(T)) { BB->removePredecessor(PHI.getIncomingBlock(i)); @@ -5994,7 +5993,7 @@ static bool removeUndefIntroducingPredecessor(BasicBlock *BB) { return false; } -bool SimplifyCFGOpt::run(BasicBlock *BB) { +bool SimplifyCFGOpt::simplifyOnce(BasicBlock *BB) { bool Changed = false; assert(BB && BB->getParent() && "Block not embedded in function!"); @@ -6068,6 +6067,21 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) { return Changed; } +bool SimplifyCFGOpt::run(BasicBlock *BB) { + bool Changed = false; + + // Repeated simplify BB as long as resimplification is requested. + do { + Resimplify = false; + + // Perform one round of simplifcation. Resimplify flag will be set if + // another iteration is requested. + Changed |= simplifyOnce(BB); + } while (Resimplify); + + return Changed; +} + bool llvm::simplifyCFG(BasicBlock *BB, const TargetTransformInfo &TTI, const SimplifyCFGOptions &Options, SmallPtrSetImpl<BasicBlock *> *LoopHeaders) { |