Lines Matching refs:SI

265   bool simplifySwitch(SwitchInst *SI, IRBuilder<> &Builder);
284 bool SimplifySwitchOnSelect(SwitchInst *SI, SelectInst *Select);
285 bool SimplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI);
286 bool TurnSwitchRangeIntoICmp(SwitchInst *SI, IRBuilder<> &Builder);
759 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { in EraseTerminatorAndDCECond() local
760 Cond = dyn_cast<Instruction>(SI->getCondition()); in EraseTerminatorAndDCECond()
777 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { in isValueEqualityComparison() local
780 if (!SI->getParent()->hasNPredecessorsOrMore(128 / SI->getNumSuccessors())) in isValueEqualityComparison()
781 CV = SI->getCondition(); in isValueEqualityComparison()
804 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) { in GetValueEqualityComparisonCases() local
805 Cases.reserve(SI->getNumCases()); in GetValueEqualityComparisonCases()
806 for (auto Case : SI->cases()) in GetValueEqualityComparisonCases()
809 return SI->getDefaultDest(); in GetValueEqualityComparisonCases()
864 static void setBranchWeights(SwitchInst *SI, ArrayRef<uint32_t> Weights, in setBranchWeights() argument
870 N = MDBuilder(SI->getParent()->getContext()) in setBranchWeights()
872 SI->setMetadata(LLVMContext::MD_prof, N); in setBranchWeights()
952 SwitchInstProfUpdateWrapper SI = *cast<SwitchInst>(TI); in SimplifyEqualityComparisonWithOnlyPredecessor() local
962 for (SwitchInst::CaseIt i = SI->case_end(), e = SI->case_begin(); i != e;) { in SimplifyEqualityComparisonWithOnlyPredecessor()
969 SI.removeCase(i); in SimplifyEqualityComparisonWithOnlyPredecessor()
1868 SelectInst *&SI = InsertedSelects[std::make_pair(BB1V, BB2V)]; in hoistSuccIdenticalTerminatorToSwitchOrIf() local
1869 if (!SI) { in hoistSuccIdenticalTerminatorToSwitchOrIf()
1875 SI = cast<SelectInst>(Builder.CreateSelect( in hoistSuccIdenticalTerminatorToSwitchOrIf()
1883 PN.setIncomingValue(i, SI); in hoistSuccIdenticalTerminatorToSwitchOrIf()
2875 if (auto *SI = dyn_cast<StoreInst>(&CurI)) { in isSafeToSpeculateStore() local
2879 if (SI->getPointerOperand() == StorePtr && in isSafeToSpeculateStore()
2880 SI->getValueOperand()->getType() == StoreTy && SI->isSimple() && in isSafeToSpeculateStore()
2881 SI->getAlign() >= StoreToHoist->getAlign()) in isSafeToSpeculateStore()
2883 return SI->getValueOperand(); in isSafeToSpeculateStore()
4011 if (auto *SI = dyn_cast<StoreInst>(&I)) { in findUniqueStoreInBlocks() local
4016 S = SI; in findUniqueStoreInBlocks()
4206 StoreInst *SI = cast<StoreInst>(QB.CreateStore(QPHI, Address)); in mergeConditionalStoreToAddress() local
4207 SI->setAAMetadata(PStore->getAAMetadata().merge(QStore->getAAMetadata())); in mergeConditionalStoreToAddress()
4212 SI->setAlignment(std::min(PStore->getAlign(), QStore->getAlign())); in mergeConditionalStoreToAddress()
4305 if (StoreInst *SI = dyn_cast<StoreInst>(&I)) in mergeConditionalStores() local
4306 PStoreAddresses.insert(SI->getPointerOperand()); in mergeConditionalStores()
4312 if (StoreInst *SI = dyn_cast<StoreInst>(&I)) in mergeConditionalStores() local
4313 QStoreAddresses.insert(SI->getPointerOperand()); in mergeConditionalStores()
4697 bool SimplifyCFGOpt::SimplifySwitchOnSelect(SwitchInst *SI, in SimplifySwitchOnSelect() argument
4707 BasicBlock *TrueBB = SI->findCaseValue(TrueVal)->getCaseSuccessor(); in SimplifySwitchOnSelect()
4708 BasicBlock *FalseBB = SI->findCaseValue(FalseVal)->getCaseSuccessor(); in SimplifySwitchOnSelect()
4713 bool HasWeights = hasBranchWeightMD(*SI); in SimplifySwitchOnSelect()
4715 GetBranchWeights(SI, Weights); in SimplifySwitchOnSelect()
4716 if (Weights.size() == 1 + SI->getNumCases()) { in SimplifySwitchOnSelect()
4718 (uint32_t)Weights[SI->findCaseValue(TrueVal)->getSuccessorIndex()]; in SimplifySwitchOnSelect()
4720 (uint32_t)Weights[SI->findCaseValue(FalseVal)->getSuccessorIndex()]; in SimplifySwitchOnSelect()
4725 return SimplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB, TrueWeight, in SimplifySwitchOnSelect()
4735 SelectInst *SI) { in SimplifyIndirectBrOnSelect() argument
4737 BlockAddress *TBA = dyn_cast<BlockAddress>(SI->getTrueValue()); in SimplifyIndirectBrOnSelect()
4738 BlockAddress *FBA = dyn_cast<BlockAddress>(SI->getFalseValue()); in SimplifyIndirectBrOnSelect()
4747 return SimplifyTerminatorOnSelect(IBI, SI->getCondition(), TrueBB, FalseBB, 0, in SimplifyIndirectBrOnSelect()
4787 SwitchInst *SI = cast<SwitchInst>(Pred->getTerminator()); in tryToSimplifyUncondBranchWithICmpInIt() local
4788 if (SI->getCondition() != V) in tryToSimplifyUncondBranchWithICmpInIt()
4794 if (SI->getDefaultDest() != BB) { in tryToSimplifyUncondBranchWithICmpInIt()
4795 ConstantInt *VVal = SI->findCaseDest(BB); in tryToSimplifyUncondBranchWithICmpInIt()
4810 if (SI->findCaseValue(Cst) != SI->case_default()) { in tryToSimplifyUncondBranchWithICmpInIt()
4851 SwitchInstProfUpdateWrapper SIW(*SI); in tryToSimplifyUncondBranchWithICmpInIt()
4865 Builder.SetCurrentDebugLocation(SI->getDebugLoc()); in tryToSimplifyUncondBranchWithICmpInIt()
5380 } else if (auto *SI = dyn_cast<SwitchInst>(TI)) { in simplifyUnreachable() local
5381 SwitchInstProfUpdateWrapper SU(*SI); in simplifyUnreachable()
5393 if (DTU && SI->getDefaultDest() != BB) in simplifyUnreachable()
5519 bool SimplifyCFGOpt::TurnSwitchRangeIntoICmp(SwitchInst *SI, in TurnSwitchRangeIntoICmp() argument
5521 assert(SI->getNumCases() > 1 && "Degenerate switch?"); in TurnSwitchRangeIntoICmp()
5524 !isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg()); in TurnSwitchRangeIntoICmp()
5526 auto *BB = SI->getParent(); in TurnSwitchRangeIntoICmp()
5529 BasicBlock *DestA = HasDefault ? SI->getDefaultDest() : nullptr; in TurnSwitchRangeIntoICmp()
5534 for (auto Case : SI->cases()) { in TurnSwitchRangeIntoICmp()
5556 assert(DestB != SI->getDefaultDest()); in TurnSwitchRangeIntoICmp()
5581 Value *Sub = SI->getCondition(); in TurnSwitchRangeIntoICmp()
5588 Cmp = ConstantInt::getTrue(SI->getContext()); in TurnSwitchRangeIntoICmp()
5594 if (hasBranchWeightMD(*SI)) { in TurnSwitchRangeIntoICmp()
5596 GetBranchWeights(SI, Weights); in TurnSwitchRangeIntoICmp()
5597 if (Weights.size() == 1 + SI->getNumCases()) { in TurnSwitchRangeIntoICmp()
5601 if (SI->getSuccessor(I) == ContiguousDest) in TurnSwitchRangeIntoICmp()
5617 if (ContiguousDest == SI->getDefaultDest()) in TurnSwitchRangeIntoICmp()
5620 cast<PHINode>(BBI)->removeIncomingValue(SI->getParent()); in TurnSwitchRangeIntoICmp()
5623 unsigned PreviousEdges = SI->getNumCases() - ContiguousCases->size(); in TurnSwitchRangeIntoICmp()
5624 if (OtherDest == SI->getDefaultDest()) in TurnSwitchRangeIntoICmp()
5627 cast<PHINode>(BBI)->removeIncomingValue(SI->getParent()); in TurnSwitchRangeIntoICmp()
5633 createUnreachableSwitchDefault(SI, DTU); in TurnSwitchRangeIntoICmp()
5635 auto *UnreachableDefault = SI->getDefaultDest(); in TurnSwitchRangeIntoICmp()
5638 SI->eraseFromParent(); in TurnSwitchRangeIntoICmp()
5648 static bool eliminateDeadSwitchCases(SwitchInst *SI, DomTreeUpdater *DTU, in eliminateDeadSwitchCases() argument
5651 Value *Cond = SI->getCondition(); in eliminateDeadSwitchCases()
5652 KnownBits Known = computeKnownBits(Cond, DL, 0, AC, SI); in eliminateDeadSwitchCases()
5658 ComputeMaxSignificantBits(Cond, DL, 0, AC, SI); in eliminateDeadSwitchCases()
5664 for (const auto &Case : SI->cases()) { in eliminateDeadSwitchCases()
5687 !isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg()); in eliminateDeadSwitchCases()
5694 if (SI->getNumCases() == AllNumCases) { in eliminateDeadSwitchCases()
5695 createUnreachableSwitchDefault(SI, DTU); in eliminateDeadSwitchCases()
5701 if (SI->getNumCases() == AllNumCases - 1) { in eliminateDeadSwitchCases()
5709 for (const auto &Case : SI->cases()) in eliminateDeadSwitchCases()
5713 SwitchInstProfUpdateWrapper SIW(*SI); in eliminateDeadSwitchCases()
5714 SIW.addCase(MissingCase, SI->getDefaultDest(), SIW.getSuccessorWeight(0)); in eliminateDeadSwitchCases()
5715 createUnreachableSwitchDefault(SI, DTU, /*RemoveOrigDefaultBlock*/ false); in eliminateDeadSwitchCases()
5724 SwitchInstProfUpdateWrapper SIW(*SI); in eliminateDeadSwitchCases()
5726 SwitchInst::CaseIt CaseI = SI->findCaseValue(DeadCase); in eliminateDeadSwitchCases()
5727 assert(CaseI != SI->case_default() && in eliminateDeadSwitchCases()
5730 CaseI->getCaseSuccessor()->removePredecessor(SI->getParent()); in eliminateDeadSwitchCases()
5738 Updates.push_back({DominatorTree::Delete, SI->getParent(), Successor}); in eliminateDeadSwitchCases()
5781 static bool ForwardSwitchConditionToPHI(SwitchInst *SI) { in ForwardSwitchConditionToPHI() argument
5785 BasicBlock *SwitchBlock = SI->getParent(); in ForwardSwitchConditionToPHI()
5787 for (const auto &Case : SI->cases()) { in ForwardSwitchConditionToPHI()
5811 Phi.setIncomingValue(SwitchBBIdx, SI->getCondition()); in ForwardSwitchConditionToPHI()
5826 if (Indexes.size() < 2 && !llvm::is_contained(Phi->incoming_values(), SI->getCondition())) in ForwardSwitchConditionToPHI()
5830 Phi->setIncomingValue(Index, SI->getCondition()); in ForwardSwitchConditionToPHI()
5908 getCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest, in getCaseResults() argument
5913 BasicBlock *Pred = SI->getParent(); in getCaseResults()
5918 ConstantPool.insert(std::make_pair(SI->getCondition(), CaseVal)); in getCaseResults()
5997 static bool initializeUniqueCases(SwitchInst *SI, PHINode *&PHI, in initializeUniqueCases() argument
6004 for (const auto &I : SI->cases()) { in initializeUniqueCases()
6009 if (!getCaseResults(SI, CaseVal, I.getCaseSuccessor(), &CommonDest, Results, in initializeUniqueCases()
6037 BasicBlock *DefaultDest = SI->getDefaultDest(); in initializeUniqueCases()
6038 getCaseResults(SI, nullptr, SI->getDefaultDest(), &CommonDest, DefaultResults, in initializeUniqueCases()
6130 static void removeSwitchAfterSelectFold(SwitchInst *SI, PHINode *PHI, in removeSwitchAfterSelectFold() argument
6136 BasicBlock *SelectBB = SI->getParent(); in removeSwitchAfterSelectFold()
6150 for (unsigned i = 0, e = SI->getNumSuccessors(); i < e; ++i) { in removeSwitchAfterSelectFold()
6151 BasicBlock *Succ = SI->getSuccessor(i); in removeSwitchAfterSelectFold()
6159 SI->eraseFromParent(); in removeSwitchAfterSelectFold()
6167 static bool trySwitchToSelect(SwitchInst *SI, IRBuilder<> &Builder, in trySwitchToSelect() argument
6170 Value *const Cond = SI->getCondition(); in trySwitchToSelect()
6176 if (!initializeUniqueCases(SI, PHI, CommonDest, UniqueResults, DefaultResult, in trySwitchToSelect()
6181 Builder.SetInsertPoint(SI); in trySwitchToSelect()
6187 removeSwitchAfterSelectFold(SI, PHI, SelectValue, Builder, DTU); in trySwitchToSelect()
6504 ShouldBuildLookupTable(SwitchInst *SI, uint64_t TableSize, in ShouldBuildLookupTable() argument
6507 if (SI->getNumCases() > TableSize) in ShouldBuildLookupTable()
6538 return isSwitchDense(SI->getNumCases(), TableSize); in ShouldBuildLookupTable()
6643 static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, in SwitchToLookupTable() argument
6646 assert(SI->getNumCases() > 1 && "Degenerate switch?"); in SwitchToLookupTable()
6648 BasicBlock *BB = SI->getParent(); in SwitchToLookupTable()
6665 if (SI->getNumCases() < 3) in SwitchToLookupTable()
6670 assert(!SI->cases().empty()); in SwitchToLookupTable()
6671 SwitchInst::CaseIt CI = SI->case_begin(); in SwitchToLookupTable()
6684 for (SwitchInst::CaseIt E = SI->case_end(); CI != E; ++CI) { in SwitchToLookupTable()
6694 if (!getCaseResults(SI, CaseVal, CI->getCaseSuccessor(), &CommonDest, in SwitchToLookupTable()
6719 getCaseResults(SI, nullptr, SI->getDefaultDest(), &CommonDest, in SwitchToLookupTable()
6740 bool DefaultIsReachable = !SI->defaultDestUndefined(); in SwitchToLookupTable()
6758 if (SI->getNumCases() < 4) // FIXME: Find best threshold value (benchmark). in SwitchToLookupTable()
6764 if (!ShouldBuildLookupTable(SI, TableSize, TTI, DL, ResultTypes)) in SwitchToLookupTable()
6783 Builder.SetInsertPoint(SI); in SwitchToLookupTable()
6788 TableIndex = SI->getCondition(); in SwitchToLookupTable()
6799 TableIndex = Builder.CreateSub(SI->getCondition(), TableIndexOffset, in SwitchToLookupTable()
6840 Builder.CreateCondBr(Cmp, LookupBB, SI->getDefaultDest()); in SwitchToLookupTable()
6879 Builder.CreateCondBr(LoBit, LookupBB, SI->getDefaultDest()); in SwitchToLookupTable()
6882 Updates.push_back({DominatorTree::Insert, MaskBB, SI->getDefaultDest()}); in SwitchToLookupTable()
6885 AddPredecessorToBlock(SI->getDefaultDest(), MaskBB, BB); in SwitchToLookupTable()
6891 SI->getDefaultDest()->removePredecessor(BB, in SwitchToLookupTable()
6894 Updates.push_back({DominatorTree::Delete, BB, SI->getDefaultDest()}); in SwitchToLookupTable()
6928 for (unsigned i = 0, e = SI->getNumSuccessors(); i < e; ++i) { in SwitchToLookupTable()
6929 BasicBlock *Succ = SI->getSuccessor(i); in SwitchToLookupTable()
6931 if (Succ == SI->getDefaultDest()) in SwitchToLookupTable()
6937 SI->eraseFromParent(); in SwitchToLookupTable()
6956 static bool ReduceSwitchRange(SwitchInst *SI, IRBuilder<> &Builder, in ReduceSwitchRange() argument
6959 auto *CondTy = cast<IntegerType>(SI->getCondition()->getType()); in ReduceSwitchRange()
6965 if (SI->getNumCases() < 4) in ReduceSwitchRange()
6973 for (const auto &C : SI->cases()) in ReduceSwitchRange()
7018 auto *Ty = cast<IntegerType>(SI->getCondition()->getType()); in ReduceSwitchRange()
7019 Builder.SetInsertPoint(SI); in ReduceSwitchRange()
7021 Builder.CreateSub(SI->getCondition(), ConstantInt::get(Ty, Base)); in ReduceSwitchRange()
7025 SI->replaceUsesOfWith(SI->getCondition(), Rot); in ReduceSwitchRange()
7027 for (auto Case : SI->cases()) { in ReduceSwitchRange()
7043 static bool simplifySwitchOfPowersOfTwo(SwitchInst *SI, IRBuilder<> &Builder, in simplifySwitchOfPowersOfTwo() argument
7046 Value *Condition = SI->getCondition(); in simplifySwitchOfPowersOfTwo()
7047 LLVMContext &Context = SI->getContext(); in simplifySwitchOfPowersOfTwo()
7065 if (SI->getNumCases() < 4) in simplifySwitchOfPowersOfTwo()
7071 if (!isa<UnreachableInst>(SI->getDefaultDest()->getFirstNonPHIOrDbg())) in simplifySwitchOfPowersOfTwo()
7076 for (const auto &Case : SI->cases()) { in simplifySwitchOfPowersOfTwo()
7091 Builder.SetInsertPoint(SI); in simplifySwitchOfPowersOfTwo()
7094 for (auto &Case : SI->cases()) { in simplifySwitchOfPowersOfTwo()
7104 SI->setCondition(ConditionTrailingZeros); in simplifySwitchOfPowersOfTwo()
7109 bool SimplifyCFGOpt::simplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) { in simplifySwitch() argument
7110 BasicBlock *BB = SI->getParent(); in simplifySwitch()
7112 if (isValueEqualityComparison(SI)) { in simplifySwitch()
7116 if (SimplifyEqualityComparisonWithOnlyPredecessor(SI, OnlyPred, Builder)) in simplifySwitch()
7119 Value *Cond = SI->getCondition(); in simplifySwitch()
7121 if (SimplifySwitchOnSelect(SI, Select)) in simplifySwitch()
7126 if (SI == &*BB->instructionsWithoutDebug(false).begin()) in simplifySwitch()
7127 if (FoldValueComparisonIntoPredecessors(SI, Builder)) in simplifySwitch()
7134 if (Options.ConvertSwitchRangeToICmp && TurnSwitchRangeIntoICmp(SI, Builder)) in simplifySwitch()
7138 if (eliminateDeadSwitchCases(SI, DTU, Options.AC, DL)) in simplifySwitch()
7141 if (trySwitchToSelect(SI, Builder, DTU, DL, TTI)) in simplifySwitch()
7144 if (Options.ForwardSwitchCondToPhi && ForwardSwitchConditionToPHI(SI)) in simplifySwitch()
7153 SwitchToLookupTable(SI, Builder, DTU, DL, TTI)) in simplifySwitch()
7156 if (simplifySwitchOfPowersOfTwo(SI, Builder, DL, TTI)) in simplifySwitch()
7159 if (ReduceSwitchRange(SI, Builder, DL, TTI)) in simplifySwitch()
7163 hoistCommonCodeFromSuccessors(SI->getParent(), !Options.HoistCommonInsts)) in simplifySwitch()
7211 if (SelectInst *SI = dyn_cast<SelectInst>(IBI->getAddress())) { in simplifyIndirectBr() local
7212 if (SimplifyIndirectBrOnSelect(IBI, SI)) in simplifyIndirectBr()
7660 if (StoreInst *SI = dyn_cast<StoreInst>(Use)) in passingValueIsAlwaysUndefined() local
7661 if (!SI->isVolatile()) in passingValueIsAlwaysUndefined()
7662 return (!NullPointerIsDefined(SI->getFunction(), in passingValueIsAlwaysUndefined()
7663 SI->getPointerAddressSpace())) && in passingValueIsAlwaysUndefined()
7664 SI->getPointerOperand() == I; in passingValueIsAlwaysUndefined()
7741 } else if (SwitchInst *SI = dyn_cast<SwitchInst>(T)) { in removeUndefIntroducingPredecessor() local
7749 for (const auto &Case : SI->cases()) in removeUndefIntroducingPredecessor()
7754 if (SI->getDefaultDest() == BB) { in removeUndefIntroducingPredecessor()
7756 SI->setDefaultDest(Unreachable); in removeUndefIntroducingPredecessor()