Lines Matching refs:SI
264 bool simplifySwitch(SwitchInst *SI, IRBuilder<> &Builder);
283 bool SimplifySwitchOnSelect(SwitchInst *SI, SelectInst *Select);
284 bool SimplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI);
285 bool TurnSwitchRangeIntoICmp(SwitchInst *SI, IRBuilder<> &Builder);
758 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { in EraseTerminatorAndDCECond() local
759 Cond = dyn_cast<Instruction>(SI->getCondition()); in EraseTerminatorAndDCECond()
776 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { in isValueEqualityComparison() local
779 if (!SI->getParent()->hasNPredecessorsOrMore(128 / SI->getNumSuccessors())) in isValueEqualityComparison()
780 CV = SI->getCondition(); in isValueEqualityComparison()
803 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { in GetValueEqualityComparisonCases() local
804 Cases.reserve(SI->getNumCases()); in GetValueEqualityComparisonCases()
805 for (auto Case : SI->cases()) in GetValueEqualityComparisonCases()
808 return SI->getDefaultDest(); in GetValueEqualityComparisonCases()
863 static void setBranchWeights(SwitchInst *SI, ArrayRef<uint32_t> Weights) { in setBranchWeights() argument
868 N = MDBuilder(SI->getParent()->getContext()).createBranchWeights(Weights); in setBranchWeights()
869 SI->setMetadata(LLVMContext::MD_prof, N); in setBranchWeights()
949 SwitchInstProfUpdateWrapper SI = *cast<SwitchInst>(TI); in SimplifyEqualityComparisonWithOnlyPredecessor() local
959 for (SwitchInst::CaseIt i = SI->case_end(), e = SI->case_begin(); i != e;) { in SimplifyEqualityComparisonWithOnlyPredecessor()
966 SI.removeCase(i); in SimplifyEqualityComparisonWithOnlyPredecessor()
1799 SelectInst *&SI = InsertedSelects[std::make_pair(BB1V, BB2V)]; in hoistSuccIdenticalTerminatorToSwitchOrIf() local
1800 if (!SI) { in hoistSuccIdenticalTerminatorToSwitchOrIf()
1806 SI = cast<SelectInst>(Builder.CreateSelect( in hoistSuccIdenticalTerminatorToSwitchOrIf()
1814 PN.setIncomingValue(i, SI); in hoistSuccIdenticalTerminatorToSwitchOrIf()
2817 if (auto *SI = dyn_cast<StoreInst>(&CurI)) { in isSafeToSpeculateStore() local
2821 if (SI->getPointerOperand() == StorePtr && in isSafeToSpeculateStore()
2822 SI->getValueOperand()->getType() == StoreTy && SI->isSimple()) in isSafeToSpeculateStore()
2824 return SI->getValueOperand(); in isSafeToSpeculateStore()
3943 if (auto *SI = dyn_cast<StoreInst>(&I)) { in findUniqueStoreInBlocks() local
3948 S = SI; in findUniqueStoreInBlocks()
4138 StoreInst *SI = cast<StoreInst>(QB.CreateStore(QPHI, Address)); in mergeConditionalStoreToAddress() local
4139 SI->setAAMetadata(PStore->getAAMetadata().merge(QStore->getAAMetadata())); in mergeConditionalStoreToAddress()
4144 SI->setAlignment(std::min(PStore->getAlign(), QStore->getAlign())); in mergeConditionalStoreToAddress()
4237 if (StoreInst *SI = dyn_cast<StoreInst>(&I)) in mergeConditionalStores() local
4238 PStoreAddresses.insert(SI->getPointerOperand()); in mergeConditionalStores()
4244 if (StoreInst *SI = dyn_cast<StoreInst>(&I)) in mergeConditionalStores() local
4245 QStoreAddresses.insert(SI->getPointerOperand()); in mergeConditionalStores()
4628 bool SimplifyCFGOpt::SimplifySwitchOnSelect(SwitchInst *SI, in SimplifySwitchOnSelect() argument
4638 BasicBlock *TrueBB = SI->findCaseValue(TrueVal)->getCaseSuccessor(); in SimplifySwitchOnSelect()
4639 BasicBlock *FalseBB = SI->findCaseValue(FalseVal)->getCaseSuccessor(); in SimplifySwitchOnSelect()
4644 bool HasWeights = hasBranchWeightMD(*SI); in SimplifySwitchOnSelect()
4646 GetBranchWeights(SI, Weights); in SimplifySwitchOnSelect()
4647 if (Weights.size() == 1 + SI->getNumCases()) { in SimplifySwitchOnSelect()
4649 (uint32_t)Weights[SI->findCaseValue(TrueVal)->getSuccessorIndex()]; in SimplifySwitchOnSelect()
4651 (uint32_t)Weights[SI->findCaseValue(FalseVal)->getSuccessorIndex()]; in SimplifySwitchOnSelect()
4656 return SimplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB, TrueWeight, in SimplifySwitchOnSelect()
4666 SelectInst *SI) { in SimplifyIndirectBrOnSelect() argument
4668 BlockAddress *TBA = dyn_cast<BlockAddress>(SI->getTrueValue()); in SimplifyIndirectBrOnSelect()
4669 BlockAddress *FBA = dyn_cast<BlockAddress>(SI->getFalseValue()); in SimplifyIndirectBrOnSelect()
4678 return SimplifyTerminatorOnSelect(IBI, SI->getCondition(), TrueBB, FalseBB, 0, in SimplifyIndirectBrOnSelect()
4718 SwitchInst *SI = cast<SwitchInst>(Pred->getTerminator()); in tryToSimplifyUncondBranchWithICmpInIt() local
4719 if (SI->getCondition() != V) in tryToSimplifyUncondBranchWithICmpInIt()
4725 if (SI->getDefaultDest() != BB) { in tryToSimplifyUncondBranchWithICmpInIt()
4726 ConstantInt *VVal = SI->findCaseDest(BB); in tryToSimplifyUncondBranchWithICmpInIt()
4741 if (SI->findCaseValue(Cst) != SI->case_default()) { in tryToSimplifyUncondBranchWithICmpInIt()
4782 SwitchInstProfUpdateWrapper SIW(*SI); in tryToSimplifyUncondBranchWithICmpInIt()
4796 Builder.SetCurrentDebugLocation(SI->getDebugLoc()); in tryToSimplifyUncondBranchWithICmpInIt()
5312 } else if (auto *SI = dyn_cast<SwitchInst>(TI)) { in simplifyUnreachable() local
5313 SwitchInstProfUpdateWrapper SU(*SI); in simplifyUnreachable()
5325 if (DTU && SI->getDefaultDest() != BB) in simplifyUnreachable()
5448 bool SimplifyCFGOpt::TurnSwitchRangeIntoICmp(SwitchInst *SI, in TurnSwitchRangeIntoICmp() argument
5450 assert(SI->getNumCases() > 1 && "Degenerate switch?"); in TurnSwitchRangeIntoICmp()
5453 !isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg()); in TurnSwitchRangeIntoICmp()
5455 auto *BB = SI->getParent(); in TurnSwitchRangeIntoICmp()
5458 BasicBlock *DestA = HasDefault ? SI->getDefaultDest() : nullptr; in TurnSwitchRangeIntoICmp()
5463 for (auto Case : SI->cases()) { in TurnSwitchRangeIntoICmp()
5485 assert(DestB != SI->getDefaultDest()); in TurnSwitchRangeIntoICmp()
5510 Value *Sub = SI->getCondition(); in TurnSwitchRangeIntoICmp()
5517 Cmp = ConstantInt::getTrue(SI->getContext()); in TurnSwitchRangeIntoICmp()
5523 if (hasBranchWeightMD(*SI)) { in TurnSwitchRangeIntoICmp()
5525 GetBranchWeights(SI, Weights); in TurnSwitchRangeIntoICmp()
5526 if (Weights.size() == 1 + SI->getNumCases()) { in TurnSwitchRangeIntoICmp()
5530 if (SI->getSuccessor(I) == ContiguousDest) in TurnSwitchRangeIntoICmp()
5546 if (ContiguousDest == SI->getDefaultDest()) in TurnSwitchRangeIntoICmp()
5549 cast<PHINode>(BBI)->removeIncomingValue(SI->getParent()); in TurnSwitchRangeIntoICmp()
5552 unsigned PreviousEdges = SI->getNumCases() - ContiguousCases->size(); in TurnSwitchRangeIntoICmp()
5553 if (OtherDest == SI->getDefaultDest()) in TurnSwitchRangeIntoICmp()
5556 cast<PHINode>(BBI)->removeIncomingValue(SI->getParent()); in TurnSwitchRangeIntoICmp()
5562 createUnreachableSwitchDefault(SI, DTU); in TurnSwitchRangeIntoICmp()
5564 auto *UnreachableDefault = SI->getDefaultDest(); in TurnSwitchRangeIntoICmp()
5567 SI->eraseFromParent(); in TurnSwitchRangeIntoICmp()
5577 static bool eliminateDeadSwitchCases(SwitchInst *SI, DomTreeUpdater *DTU, in eliminateDeadSwitchCases() argument
5580 Value *Cond = SI->getCondition(); in eliminateDeadSwitchCases()
5581 KnownBits Known = computeKnownBits(Cond, DL, 0, AC, SI); in eliminateDeadSwitchCases()
5587 ComputeMaxSignificantBits(Cond, DL, 0, AC, SI); in eliminateDeadSwitchCases()
5593 for (const auto &Case : SI->cases()) { in eliminateDeadSwitchCases()
5616 !isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg()); in eliminateDeadSwitchCases()
5622 SI->getNumCases() == (1ULL << NumUnknownBits)) { in eliminateDeadSwitchCases()
5623 createUnreachableSwitchDefault(SI, DTU); in eliminateDeadSwitchCases()
5630 SwitchInstProfUpdateWrapper SIW(*SI); in eliminateDeadSwitchCases()
5632 SwitchInst::CaseIt CaseI = SI->findCaseValue(DeadCase); in eliminateDeadSwitchCases()
5633 assert(CaseI != SI->case_default() && in eliminateDeadSwitchCases()
5636 CaseI->getCaseSuccessor()->removePredecessor(SI->getParent()); in eliminateDeadSwitchCases()
5644 Updates.push_back({DominatorTree::Delete, SI->getParent(), Successor}); in eliminateDeadSwitchCases()
5687 static bool ForwardSwitchConditionToPHI(SwitchInst *SI) { in ForwardSwitchConditionToPHI() argument
5691 BasicBlock *SwitchBlock = SI->getParent(); in ForwardSwitchConditionToPHI()
5693 for (const auto &Case : SI->cases()) { in ForwardSwitchConditionToPHI()
5717 Phi.setIncomingValue(SwitchBBIdx, SI->getCondition()); in ForwardSwitchConditionToPHI()
5735 Phi->setIncomingValue(Index, SI->getCondition()); in ForwardSwitchConditionToPHI()
5813 getCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest, in getCaseResults() argument
5818 BasicBlock *Pred = SI->getParent(); in getCaseResults()
5823 ConstantPool.insert(std::make_pair(SI->getCondition(), CaseVal)); in getCaseResults()
5902 static bool initializeUniqueCases(SwitchInst *SI, PHINode *&PHI, in initializeUniqueCases() argument
5909 for (const auto &I : SI->cases()) { in initializeUniqueCases()
5914 if (!getCaseResults(SI, CaseVal, I.getCaseSuccessor(), &CommonDest, Results, in initializeUniqueCases()
5942 BasicBlock *DefaultDest = SI->getDefaultDest(); in initializeUniqueCases()
5943 getCaseResults(SI, nullptr, SI->getDefaultDest(), &CommonDest, DefaultResults, in initializeUniqueCases()
6035 static void removeSwitchAfterSelectFold(SwitchInst *SI, PHINode *PHI, in removeSwitchAfterSelectFold() argument
6041 BasicBlock *SelectBB = SI->getParent(); in removeSwitchAfterSelectFold()
6055 for (unsigned i = 0, e = SI->getNumSuccessors(); i < e; ++i) { in removeSwitchAfterSelectFold()
6056 BasicBlock *Succ = SI->getSuccessor(i); in removeSwitchAfterSelectFold()
6064 SI->eraseFromParent(); in removeSwitchAfterSelectFold()
6072 static bool trySwitchToSelect(SwitchInst *SI, IRBuilder<> &Builder, in trySwitchToSelect() argument
6075 Value *const Cond = SI->getCondition(); in trySwitchToSelect()
6081 if (!initializeUniqueCases(SI, PHI, CommonDest, UniqueResults, DefaultResult, in trySwitchToSelect()
6086 Builder.SetInsertPoint(SI); in trySwitchToSelect()
6092 removeSwitchAfterSelectFold(SI, PHI, SelectValue, Builder, DTU); in trySwitchToSelect()
6409 ShouldBuildLookupTable(SwitchInst *SI, uint64_t TableSize, in ShouldBuildLookupTable() argument
6412 if (SI->getNumCases() > TableSize) in ShouldBuildLookupTable()
6443 return isSwitchDense(SI->getNumCases(), TableSize); in ShouldBuildLookupTable()
6547 static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, in SwitchToLookupTable() argument
6550 assert(SI->getNumCases() > 1 && "Degenerate switch?"); in SwitchToLookupTable()
6552 BasicBlock *BB = SI->getParent(); in SwitchToLookupTable()
6569 if (SI->getNumCases() < 3) in SwitchToLookupTable()
6574 assert(!SI->cases().empty()); in SwitchToLookupTable()
6575 SwitchInst::CaseIt CI = SI->case_begin(); in SwitchToLookupTable()
6588 for (SwitchInst::CaseIt E = SI->case_end(); CI != E; ++CI) { in SwitchToLookupTable()
6598 if (!getCaseResults(SI, CaseVal, CI->getCaseSuccessor(), &CommonDest, in SwitchToLookupTable()
6623 getCaseResults(SI, nullptr, SI->getDefaultDest(), &CommonDest, in SwitchToLookupTable()
6645 if (SI->getNumCases() < 4) // FIXME: Find best threshold value (benchmark). in SwitchToLookupTable()
6651 if (!ShouldBuildLookupTable(SI, TableSize, TTI, DL, ResultTypes)) in SwitchToLookupTable()
6668 !isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg()); in SwitchToLookupTable()
6676 Builder.SetInsertPoint(SI); in SwitchToLookupTable()
6681 TableIndex = SI->getCondition(); in SwitchToLookupTable()
6692 TableIndex = Builder.CreateSub(SI->getCondition(), TableIndexOffset, in SwitchToLookupTable()
6733 Builder.CreateCondBr(Cmp, LookupBB, SI->getDefaultDest()); in SwitchToLookupTable()
6772 Builder.CreateCondBr(LoBit, LookupBB, SI->getDefaultDest()); in SwitchToLookupTable()
6775 Updates.push_back({DominatorTree::Insert, MaskBB, SI->getDefaultDest()}); in SwitchToLookupTable()
6778 AddPredecessorToBlock(SI->getDefaultDest(), MaskBB, BB); in SwitchToLookupTable()
6784 SI->getDefaultDest()->removePredecessor(BB, in SwitchToLookupTable()
6787 Updates.push_back({DominatorTree::Delete, BB, SI->getDefaultDest()}); in SwitchToLookupTable()
6820 for (unsigned i = 0, e = SI->getNumSuccessors(); i < e; ++i) { in SwitchToLookupTable()
6821 BasicBlock *Succ = SI->getSuccessor(i); in SwitchToLookupTable()
6823 if (Succ == SI->getDefaultDest()) in SwitchToLookupTable()
6829 SI->eraseFromParent(); in SwitchToLookupTable()
6848 static bool ReduceSwitchRange(SwitchInst *SI, IRBuilder<> &Builder, in ReduceSwitchRange() argument
6851 auto *CondTy = cast<IntegerType>(SI->getCondition()->getType()); in ReduceSwitchRange()
6857 if (SI->getNumCases() < 4) in ReduceSwitchRange()
6865 for (const auto &C : SI->cases()) in ReduceSwitchRange()
6910 auto *Ty = cast<IntegerType>(SI->getCondition()->getType()); in ReduceSwitchRange()
6911 Builder.SetInsertPoint(SI); in ReduceSwitchRange()
6913 Builder.CreateSub(SI->getCondition(), ConstantInt::get(Ty, Base)); in ReduceSwitchRange()
6917 SI->replaceUsesOfWith(SI->getCondition(), Rot); in ReduceSwitchRange()
6919 for (auto Case : SI->cases()) { in ReduceSwitchRange()
6935 static bool simplifySwitchOfPowersOfTwo(SwitchInst *SI, IRBuilder<> &Builder, in simplifySwitchOfPowersOfTwo() argument
6938 Value *Condition = SI->getCondition(); in simplifySwitchOfPowersOfTwo()
6939 LLVMContext &Context = SI->getContext(); in simplifySwitchOfPowersOfTwo()
6957 if (SI->getNumCases() < 4) in simplifySwitchOfPowersOfTwo()
6963 if (!isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg())) in simplifySwitchOfPowersOfTwo()
6968 for (const auto &Case : SI->cases()) { in simplifySwitchOfPowersOfTwo()
6983 Builder.SetInsertPoint(SI); in simplifySwitchOfPowersOfTwo()
6986 for (auto &Case : SI->cases()) { in simplifySwitchOfPowersOfTwo()
6996 SI->setCondition(ConditionTrailingZeros); in simplifySwitchOfPowersOfTwo()
7001 bool SimplifyCFGOpt::simplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) { in simplifySwitch() argument
7002 BasicBlock *BB = SI->getParent(); in simplifySwitch()
7004 if (isValueEqualityComparison(SI)) { in simplifySwitch()
7008 if (SimplifyEqualityComparisonWithOnlyPredecessor(SI, OnlyPred, Builder)) in simplifySwitch()
7011 Value *Cond = SI->getCondition(); in simplifySwitch()
7013 if (SimplifySwitchOnSelect(SI, Select)) in simplifySwitch()
7018 if (SI == &*BB->instructionsWithoutDebug(false).begin()) in simplifySwitch()
7019 if (FoldValueComparisonIntoPredecessors(SI, Builder)) in simplifySwitch()
7026 if (Options.ConvertSwitchRangeToICmp && TurnSwitchRangeIntoICmp(SI, Builder)) in simplifySwitch()
7030 if (eliminateDeadSwitchCases(SI, DTU, Options.AC, DL)) in simplifySwitch()
7033 if (trySwitchToSelect(SI, Builder, DTU, DL, TTI)) in simplifySwitch()
7036 if (Options.ForwardSwitchCondToPhi && ForwardSwitchConditionToPHI(SI)) in simplifySwitch()
7045 SwitchToLookupTable(SI, Builder, DTU, DL, TTI)) in simplifySwitch()
7048 if (simplifySwitchOfPowersOfTwo(SI, Builder, DL, TTI)) in simplifySwitch()
7051 if (ReduceSwitchRange(SI, Builder, DL, TTI)) in simplifySwitch()
7055 hoistCommonCodeFromSuccessors(SI->getParent(), !Options.HoistCommonInsts)) in simplifySwitch()
7103 if (SelectInst *SI = dyn_cast<SelectInst>(IBI->getAddress())) { in simplifyIndirectBr() local
7104 if (SimplifyIndirectBrOnSelect(IBI, SI)) in simplifyIndirectBr()
7416 if (StoreInst *SI = dyn_cast<StoreInst>(Use)) in passingValueIsAlwaysUndefined() local
7417 if (!SI->isVolatile()) in passingValueIsAlwaysUndefined()
7418 return (!NullPointerIsDefined(SI->getFunction(), in passingValueIsAlwaysUndefined()
7419 SI->getPointerAddressSpace())) && in passingValueIsAlwaysUndefined()
7420 SI->getPointerOperand() == I; in passingValueIsAlwaysUndefined()
7490 } else if (SwitchInst *SI = dyn_cast<SwitchInst>(T)) { in removeUndefIntroducingPredecessor() local
7498 for (const auto &Case : SI->cases()) in removeUndefIntroducingPredecessor()
7503 if (SI->getDefaultDest() == BB) { in removeUndefIntroducingPredecessor()
7505 SI->setDefaultDest(Unreachable); in removeUndefIntroducingPredecessor()