Lines Matching refs:BI
268 bool simplifyUncondBranch(BranchInst *BI, IRBuilder<> &Builder);
269 bool simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder);
278 bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB);
282 bool SimplifyBranchOnICmpChain(BranchInst *BI, IRBuilder<> &Builder,
441 BranchInst *BI = dyn_cast<BranchInst>(PBB->getTerminator()); in dominatesMergePoint() local
442 if (!BI || BI->isConditional() || BI->getSuccessor(0) != BB) in dominatesMergePoint()
761 } else if (BranchInst *BI = dyn_cast<BranchInst>(TI)) { in EraseTerminatorAndDCECond() local
762 if (BI->isConditional()) in EraseTerminatorAndDCECond()
763 Cond = dyn_cast<Instruction>(BI->getCondition()); in EraseTerminatorAndDCECond()
782 } else if (BranchInst *BI = dyn_cast<BranchInst>(TI)) in isValueEqualityComparison() local
783 if (BI->isConditional() && BI->getCondition()->hasOneUse()) in isValueEqualityComparison()
784 if (ICmpInst *ICI = dyn_cast<ICmpInst>(BI->getCondition())) { in isValueEqualityComparison()
812 BranchInst *BI = cast<BranchInst>(TI); in GetValueEqualityComparisonCases() local
813 ICmpInst *ICI = cast<ICmpInst>(BI->getCondition()); in GetValueEqualityComparisonCases()
814 BasicBlock *Succ = BI->getSuccessor(ICI->getPredicate() == ICmpInst::ICMP_NE); in GetValueEqualityComparisonCases()
817 return BI->getSuccessor(ICI->getPredicate() == ICmpInst::ICMP_EQ); in GetValueEqualityComparisonCases()
1077 if (BranchInst *BI = dyn_cast<BranchInst>(TI)) { in GetBranchWeights() local
1079 ICmpInst *ICI = cast<ICmpInst>(BI->getCondition()); in GetBranchWeights()
1782 auto *BI = dyn_cast<BranchInst>(TI); in hoistSuccIdenticalTerminatorToSwitchOrIf() local
1791 if (BI) { in hoistSuccIdenticalTerminatorToSwitchOrIf()
1793 assert(BI->getSuccessor(0) == I1->getParent()); in hoistSuccIdenticalTerminatorToSwitchOrIf()
1794 assert(BI->getSuccessor(1) == I2->getParent()); in hoistSuccIdenticalTerminatorToSwitchOrIf()
1801 if (isa<InvokeInst>(I1) && (!BI || !isSafeToHoistInvoke(BB1, BB2, I1, I2))) in hoistSuccIdenticalTerminatorToSwitchOrIf()
1819 if (!BI || passingValueIsAlwaysUndefined(BB1V, &PN) || in hoistSuccIdenticalTerminatorToSwitchOrIf()
1857 if (BI) { in hoistSuccIdenticalTerminatorToSwitchOrIf()
1876 BI->getCondition(), BB1V, BB2V, in hoistSuccIdenticalTerminatorToSwitchOrIf()
1877 BB1V->getName() + "." + BB2V->getName(), BI)); in hoistSuccIdenticalTerminatorToSwitchOrIf()
3000 bool SimplifyCFGOpt::SpeculativelyExecuteBB(BranchInst *BI, in SpeculativelyExecuteBB() argument
3006 Value *BrCond = BI->getCondition(); in SpeculativelyExecuteBB()
3010 BasicBlock *BB = BI->getParent(); in SpeculativelyExecuteBB()
3018 if (ThenBB != BI->getSuccessor(0)) { in SpeculativelyExecuteBB()
3019 assert(ThenBB == BI->getSuccessor(1) && "No edge from 'if' block?"); in SpeculativelyExecuteBB()
3022 assert(EndBB == BI->getSuccessor(!Invert) && "No edge from to end block"); in SpeculativelyExecuteBB()
3026 if (!BI->getMetadata(LLVMContext::MD_unpredictable)) { in SpeculativelyExecuteBB()
3028 if (extractBranchWeights(*BI, TWeight, FWeight) && in SpeculativelyExecuteBB()
3132 IRBuilder<NoFolder> Builder(BI); in SpeculativelyExecuteBB()
3139 BrCond, TrueV, FalseV, "spec.store.select", BI); in SpeculativelyExecuteBB()
3141 SpeculatedStore->applyMergedLocation(BI->getDebugLoc(), in SpeculativelyExecuteBB()
3208 BB->splice(BI->getIterator(), ThenBB, ThenBB->begin(), in SpeculativelyExecuteBB()
3212 IRBuilder<NoFolder> Builder(BI); in SpeculativelyExecuteBB()
3229 Value *V = Builder.CreateSelect(BrCond, TrueV, FalseV, "spec.select", BI); in SpeculativelyExecuteBB()
3292 auto *BI = dyn_cast<BranchInst>(From->getTerminator()); in getKnownValueOnEdge() local
3293 if (BI && BI->isConditional() && BI->getCondition() == V && in getKnownValueOnEdge()
3294 BI->getSuccessor(0) != BI->getSuccessor(1)) in getKnownValueOnEdge()
3295 return BI->getSuccessor(0) == To ? ConstantInt::getTrue(BI->getContext()) in getKnownValueOnEdge()
3296 : ConstantInt::getFalse(BI->getContext()); in getKnownValueOnEdge()
3305 FoldCondBranchOnValueKnownInPredecessorImpl(BranchInst *BI, DomTreeUpdater *DTU, in FoldCondBranchOnValueKnownInPredecessorImpl() argument
3309 BasicBlock *BB = BI->getParent(); in FoldCondBranchOnValueKnownInPredecessorImpl()
3310 Value *Cond = BI->getCondition(); in FoldCondBranchOnValueKnownInPredecessorImpl()
3343 BasicBlock *RealDest = BI->getSuccessor(!CB->getZExtValue()); in FoldCondBranchOnValueKnownInPredecessorImpl()
3383 for (BasicBlock::iterator BBI = BB->begin(); &*BBI != BI; ++BBI) { in FoldCondBranchOnValueKnownInPredecessorImpl()
3433 for (; &*SrcDbgCursor != BI; ++SrcDbgCursor) in FoldCondBranchOnValueKnownInPredecessorImpl()
3435 InsertPt->cloneDebugInfoFrom(BI); in FoldCondBranchOnValueKnownInPredecessorImpl()
3440 EdgeBI->setDebugLoc(BI->getDebugLoc()); in FoldCondBranchOnValueKnownInPredecessorImpl()
3462 static bool FoldCondBranchOnValueKnownInPredecessor(BranchInst *BI, in FoldCondBranchOnValueKnownInPredecessor() argument
3470 Result = FoldCondBranchOnValueKnownInPredecessorImpl(BI, DTU, DL, AC); in FoldCondBranchOnValueKnownInPredecessor()
3692 static bool extractPredSuccWeights(BranchInst *PBI, BranchInst *BI, in extractPredSuccWeights() argument
3700 extractBranchWeights(*BI, SuccTrueWeight, SuccFalseWeight); in extractPredSuccWeights()
3716 shouldFoldCondBranchesToCommonDestination(BranchInst *BI, BranchInst *PBI, in shouldFoldCondBranchesToCommonDestination() argument
3718 assert(BI && PBI && BI->isConditional() && PBI->isConditional() && in shouldFoldCondBranchesToCommonDestination()
3720 assert(is_contained(predecessors(BI->getParent()), PBI->getParent()) && in shouldFoldCondBranchesToCommonDestination()
3735 if (PBI->getSuccessor(0) == BI->getSuccessor(0)) { in shouldFoldCondBranchesToCommonDestination()
3738 return {{BI->getSuccessor(0), Instruction::Or, false}}; in shouldFoldCondBranchesToCommonDestination()
3739 } else if (PBI->getSuccessor(1) == BI->getSuccessor(1)) { in shouldFoldCondBranchesToCommonDestination()
3742 return {{BI->getSuccessor(1), Instruction::And, false}}; in shouldFoldCondBranchesToCommonDestination()
3743 } else if (PBI->getSuccessor(0) == BI->getSuccessor(1)) { in shouldFoldCondBranchesToCommonDestination()
3746 return {{BI->getSuccessor(1), Instruction::And, true}}; in shouldFoldCondBranchesToCommonDestination()
3747 } else if (PBI->getSuccessor(1) == BI->getSuccessor(0)) { in shouldFoldCondBranchesToCommonDestination()
3750 return {{BI->getSuccessor(0), Instruction::Or, true}}; in shouldFoldCondBranchesToCommonDestination()
3755 static bool performBranchToCommonDestFolding(BranchInst *BI, BranchInst *PBI, in performBranchToCommonDestFolding() argument
3759 BasicBlock *BB = BI->getParent(); in performBranchToCommonDestFolding()
3767 *shouldFoldCondBranchesToCommonDestination(BI, PBI, TTI); in performBranchToCommonDestFolding()
3784 PBI->getSuccessor(0) == BB ? BI->getSuccessor(0) : BI->getSuccessor(1); in performBranchToCommonDestFolding()
3793 if (extractPredSuccWeights(PBI, BI, PredTrueWeight, PredFalseWeight, in performBranchToCommonDestFolding()
3840 if (MDNode *LoopMD = BI->getMetadata(LLVMContext::MD_loop)) in performBranchToCommonDestFolding()
3859 Value *BICond = VMap[BI->getCondition()]; in performBranchToCommonDestFolding()
3878 bool llvm::FoldBranchToCommonDest(BranchInst *BI, DomTreeUpdater *DTU, in FoldBranchToCommonDest() argument
3884 if (!BI->isConditional()) in FoldBranchToCommonDest()
3887 BasicBlock *BB = BI->getParent(); in FoldBranchToCommonDest()
3892 Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()); in FoldBranchToCommonDest()
3912 if (!PBI || PBI->isUnconditional() || !SafeToMergeTerminators(BI, PBI)) in FoldBranchToCommonDest()
3919 if (auto Recipe = shouldFoldCondBranchesToCommonDestination(BI, PBI, TTI)) in FoldBranchToCommonDest()
3927 Type *Ty = BI->getCondition()->getType(); in FoldBranchToCommonDest()
3998 return performBranchToCommonDestFolding(BI, PBI, DTU, MSSAU, TTI); in FoldBranchToCommonDest()
4332 static bool tryWidenCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI, in tryWidenCondBranchToCondBranch() argument
4342 if (!isWidenableBranch(PBI) || IfTrueBB != BI->getParent() || in tryWidenCondBranchToCondBranch()
4343 !BI->getParent()->getSinglePredecessor()) in tryWidenCondBranchToCondBranch()
4358 if (BI->getSuccessor(1) != IfFalseBB && // no inf looping in tryWidenCondBranchToCondBranch()
4359 BI->getSuccessor(1)->getTerminatingDeoptimizeCall() && // profitability in tryWidenCondBranchToCondBranch()
4360 NoSideEffects(*BI->getParent())) { in tryWidenCondBranchToCondBranch()
4361 auto *OldSuccessor = BI->getSuccessor(1); in tryWidenCondBranchToCondBranch()
4362 OldSuccessor->removePredecessor(BI->getParent()); in tryWidenCondBranchToCondBranch()
4363 BI->setSuccessor(1, IfFalseBB); in tryWidenCondBranchToCondBranch()
4366 {{DominatorTree::Insert, BI->getParent(), IfFalseBB}, in tryWidenCondBranchToCondBranch()
4367 {DominatorTree::Delete, BI->getParent(), OldSuccessor}}); in tryWidenCondBranchToCondBranch()
4370 if (BI->getSuccessor(0) != IfFalseBB && // no inf looping in tryWidenCondBranchToCondBranch()
4371 BI->getSuccessor(0)->getTerminatingDeoptimizeCall() && // profitability in tryWidenCondBranchToCondBranch()
4372 NoSideEffects(*BI->getParent())) { in tryWidenCondBranchToCondBranch()
4373 auto *OldSuccessor = BI->getSuccessor(0); in tryWidenCondBranchToCondBranch()
4374 OldSuccessor->removePredecessor(BI->getParent()); in tryWidenCondBranchToCondBranch()
4375 BI->setSuccessor(0, IfFalseBB); in tryWidenCondBranchToCondBranch()
4378 {{DominatorTree::Insert, BI->getParent(), IfFalseBB}, in tryWidenCondBranchToCondBranch()
4379 {DominatorTree::Delete, BI->getParent(), OldSuccessor}}); in tryWidenCondBranchToCondBranch()
4389 static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI, in SimplifyCondBranchToCondBranch() argument
4393 assert(PBI->isConditional() && BI->isConditional()); in SimplifyCondBranchToCondBranch()
4394 BasicBlock *BB = BI->getParent(); in SimplifyCondBranchToCondBranch()
4399 if (PBI->getCondition() == BI->getCondition() && in SimplifyCondBranchToCondBranch()
4407 BI->setCondition( in SimplifyCondBranchToCondBranch()
4416 if (tryWidenCondBranchToCondBranch(PBI, BI, DTU)) in SimplifyCondBranchToCondBranch()
4422 if (MergeCondStores && mergeConditionalStores(PBI, BI, DTU, DL, TTI)) in SimplifyCondBranchToCondBranch()
4430 if (&*BB->instructionsWithoutDebug(false).begin() != BI) in SimplifyCondBranchToCondBranch()
4434 if (PBI->getSuccessor(0) == BI->getSuccessor(0)) { in SimplifyCondBranchToCondBranch()
4437 } else if (PBI->getSuccessor(0) == BI->getSuccessor(1)) { in SimplifyCondBranchToCondBranch()
4440 } else if (PBI->getSuccessor(1) == BI->getSuccessor(0)) { in SimplifyCondBranchToCondBranch()
4443 } else if (PBI->getSuccessor(1) == BI->getSuccessor(1)) { in SimplifyCondBranchToCondBranch()
4485 BasicBlock *OtherDest = BI->getSuccessor(BIOp ^ 1); in SimplifyCondBranchToCondBranch()
4488 << "AND: " << *BI->getParent()); in SimplifyCondBranchToCondBranch()
4521 Value *BICond = BI->getCondition(); in SimplifyCondBranchToCondBranch()
4545 extractPredSuccWeights(PBI, BI, PredTrueWeight, PredFalseWeight, in SimplifyCondBranchToCondBranch()
4878 bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI, in SimplifyBranchOnICmpChain() argument
4881 Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()); in SimplifyBranchOnICmpChain()
4921 BasicBlock *DefaultBB = BI->getSuccessor(1); in SimplifyBranchOnICmpChain()
4922 BasicBlock *EdgeBB = BI->getSuccessor(0); in SimplifyBranchOnICmpChain()
4926 BasicBlock *BB = BI->getParent(); in SimplifyBranchOnICmpChain()
4938 BasicBlock *NewBB = SplitBlock(BB, BI, DTU, /*LI=*/nullptr, in SimplifyBranchOnICmpChain()
4952 if (!isGuaranteedNotToBeUndefOrPoison(ExtraCase, AC, BI, nullptr)) in SimplifyBranchOnICmpChain()
4974 Builder.SetInsertPoint(BI); in SimplifyBranchOnICmpChain()
4999 EraseTerminatorAndDCECond(BI); in SimplifyBranchOnICmpChain()
5350 if (auto *BI = dyn_cast<BranchInst>(TI)) { in simplifyUnreachable() local
5353 if (all_of(BI->successors(), in simplifyUnreachable()
5359 assert(BI->isConditional() && "Can't get here with an uncond branch."); in simplifyUnreachable()
5360 Value* Cond = BI->getCondition(); in simplifyUnreachable()
5361 assert(BI->getSuccessor(0) != BI->getSuccessor(1) && in simplifyUnreachable()
5364 if (BI->getSuccessor(0) == BB) { in simplifyUnreachable()
5366 Builder.CreateBr(BI->getSuccessor(1)); in simplifyUnreachable()
5368 assert(BI->getSuccessor(1) == BB && "Incorrect CFG"); in simplifyUnreachable()
5370 Builder.CreateBr(BI->getSuccessor(0)); in simplifyUnreachable()
5375 EraseTerminatorAndDCECond(BI); in simplifyUnreachable()
7239 static bool TryToMergeLandingPad(LandingPadInst *LPad, BranchInst *BI, in TryToMergeLandingPad() argument
7258 if (!BI2 || !BI2->isIdenticalTo(BI)) in TryToMergeLandingPad()
7290 IRBuilder<> Builder(BI); in TryToMergeLandingPad()
7292 BI->eraseFromParent(); in TryToMergeLandingPad()
7305 bool SimplifyCFGOpt::simplifyUncondBranch(BranchInst *BI, in simplifyUncondBranch() argument
7307 BasicBlock *BB = BI->getParent(); in simplifyUncondBranch()
7308 BasicBlock *Succ = BI->getSuccessor(0); in simplifyUncondBranch()
7342 if (I->isTerminator() && TryToMergeLandingPad(LPad, BI, BB, DTU)) in simplifyUncondBranch()
7351 FoldBranchToCommonDest(BI, DTU, /*MSSAU=*/nullptr, &TTI, in simplifyUncondBranch()
7388 static bool mergeNestedCondBranch(BranchInst *BI, DomTreeUpdater *DTU) { in mergeNestedCondBranch() argument
7389 BasicBlock *BB = BI->getParent(); in mergeNestedCondBranch()
7390 BasicBlock *BB1 = BI->getSuccessor(0); in mergeNestedCondBranch()
7391 BasicBlock *BB2 = BI->getSuccessor(1); in mergeNestedCondBranch()
7416 IRBuilder<> Builder(BI); in mergeNestedCondBranch()
7417 BI->setCondition( in mergeNestedCondBranch()
7418 Builder.CreateXor(BI->getCondition(), BB1BI->getCondition())); in mergeNestedCondBranch()
7420 BI->setSuccessor(0, BB4); in mergeNestedCondBranch()
7422 BI->setSuccessor(1, BB3); in mergeNestedCondBranch()
7434 if (extractBranchWeights(*BI, BBTWeight, BBFWeight)) in mergeNestedCondBranch()
7452 setBranchWeights(BI, Weights[0], Weights[1], /*IsExpected=*/false); in mergeNestedCondBranch()
7457 bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) { in simplifyCondBranch() argument
7459 !isa<ConstantInt>(BI->getCondition()) && in simplifyCondBranch()
7460 BI->getSuccessor(0) != BI->getSuccessor(1) && in simplifyCondBranch()
7463 BasicBlock *BB = BI->getParent(); in simplifyCondBranch()
7465 BI->getFunction()->hasFnAttribute(Attribute::OptForFuzzing)) in simplifyCondBranch()
7469 if (isValueEqualityComparison(BI)) { in simplifyCondBranch()
7474 if (SimplifyEqualityComparisonWithOnlyPredecessor(BI, OnlyPred, Builder)) in simplifyCondBranch()
7480 if (&*I == BI) { in simplifyCondBranch()
7481 if (FoldValueComparisonIntoPredecessors(BI, Builder)) in simplifyCondBranch()
7483 } else if (&*I == cast<Instruction>(BI->getCondition())) { in simplifyCondBranch()
7485 if (&*I == BI && FoldValueComparisonIntoPredecessors(BI, Builder)) in simplifyCondBranch()
7491 if (SimplifyBranchOnICmpChain(BI, Builder, DL)) in simplifyCondBranch()
7496 std::optional<bool> Imp = isImpliedByDomCondition(BI->getCondition(), BI, DL); in simplifyCondBranch()
7499 auto *OldCond = BI->getCondition(); in simplifyCondBranch()
7502 BI->setCondition(TorF); in simplifyCondBranch()
7511 FoldBranchToCommonDest(BI, DTU, /*MSSAU=*/nullptr, &TTI, in simplifyCondBranch()
7519 if (BI->getSuccessor(0)->getSinglePredecessor()) { in simplifyCondBranch()
7520 if (BI->getSuccessor(1)->getSinglePredecessor()) { in simplifyCondBranch()
7522 BI->getParent(), !Options.HoistCommonInsts)) in simplifyCondBranch()
7527 Instruction *Succ0TI = BI->getSuccessor(0)->getTerminator(); in simplifyCondBranch()
7529 Succ0TI->getSuccessor(0) == BI->getSuccessor(1)) in simplifyCondBranch()
7530 if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0))) in simplifyCondBranch()
7533 } else if (BI->getSuccessor(1)->getSinglePredecessor()) { in simplifyCondBranch()
7536 Instruction *Succ1TI = BI->getSuccessor(1)->getTerminator(); in simplifyCondBranch()
7538 Succ1TI->getSuccessor(0) == BI->getSuccessor(0)) in simplifyCondBranch()
7539 if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1))) in simplifyCondBranch()
7546 if (FoldCondBranchOnValueKnownInPredecessor(BI, DTU, DL, Options.AC)) in simplifyCondBranch()
7552 if (PBI != BI && PBI->isConditional()) in simplifyCondBranch()
7553 if (SimplifyCondBranchToCondBranch(PBI, BI, DTU, DL, TTI)) in simplifyCondBranch()
7560 if (PBI != BI && PBI->isConditional()) in simplifyCondBranch()
7561 if (mergeConditionalStores(PBI, BI, DTU, DL, TTI)) in simplifyCondBranch()
7565 if (mergeNestedCondBranch(BI, DTU)) in simplifyCondBranch()
7717 if (BranchInst *BI = dyn_cast<BranchInst>(T)) { in removeUndefIntroducingPredecessor() local
7721 if (BI->isUnconditional()) in removeUndefIntroducingPredecessor()
7726 Value *Cond = BI->getCondition(); in removeUndefIntroducingPredecessor()
7728 if (BI->getSuccessor(0) == BB) in removeUndefIntroducingPredecessor()
7734 Builder.CreateBr(BI->getSuccessor(0) == BB ? BI->getSuccessor(1) in removeUndefIntroducingPredecessor()
7735 : BI->getSuccessor(0)); in removeUndefIntroducingPredecessor()
7737 BI->eraseFromParent(); in removeUndefIntroducingPredecessor()