Lines Matching refs:SI

264 Instruction *InstCombinerImpl::foldSelectOpOp(SelectInst &SI, Instruction *TI,  in foldSelectOpOp()  argument
270 if ((match(&SI, m_SMin(m_Value(), m_Value())) || in foldSelectOpOp()
271 match(&SI, m_SMax(m_Value(), m_Value())) || in foldSelectOpOp()
272 match(&SI, m_UMin(m_Value(), m_Value())) || in foldSelectOpOp()
273 match(&SI, m_UMax(m_Value(), m_Value())))) in foldSelectOpOp()
277 Value *Cond = SI.getCondition(); in foldSelectOpOp()
313 SI.getName() + ".v", &SI); in foldSelectOpOp()
366 FMF |= SI.getFastMathFlags(); in foldSelectOpOp()
368 Builder.CreateSelect(Cond, X, Y, SI.getName() + ".v", &SI); in foldSelectOpOp()
386 Builder.CreateSelect(Cond, OtherOpT, OtherOpF, "minmaxop", &SI); in foldSelectOpOp()
402 FPMathOperator *SelectFPOp = cast<FPMathOperator>(&SI); in foldSelectOpOp()
413 return replaceInstUsesWith(SI, NewLdexp); in foldSelectOpOp()
428 SI.getName() + ".v", &SI); in foldSelectOpOp()
476 SI.getName() + ".v", &SI); in foldSelectOpOp()
504 Instruction *InstCombinerImpl::foldSelectIntoOp(SelectInst &SI, Value *TrueVal, in foldSelectIntoOp() argument
508 auto TryFoldSelectIntoOp = [&](SelectInst &SI, Value *TrueVal, in foldSelectIntoOp()
529 if (isa<FPMathOperator>(&SI)) in foldSelectIntoOp()
530 FMF = SI.getFastMathFlags(); in foldSelectIntoOp()
540 Value *NewSel = Builder.CreateSelect(SI.getCondition(), Swapped ? C : OOp, in foldSelectIntoOp()
541 Swapped ? OOp : C, "", &SI); in foldSelectIntoOp()
542 if (isa<FPMathOperator>(&SI)) in foldSelectIntoOp()
553 if (Instruction *R = TryFoldSelectIntoOp(SI, TrueVal, FalseVal, false)) in foldSelectIntoOp()
556 if (Instruction *R = TryFoldSelectIntoOp(SI, FalseVal, TrueVal, true)) in foldSelectIntoOp()
842 static Instruction *foldSelectZeroOrMul(SelectInst &SI, InstCombinerImpl &IC) { in foldSelectZeroOrMul() argument
843 auto *CondVal = SI.getCondition(); in foldSelectZeroOrMul()
844 auto *TrueVal = SI.getTrueValue(); in foldSelectZeroOrMul()
845 auto *FalseVal = SI.getFalseValue(); in foldSelectZeroOrMul()
881 return IC.replaceInstUsesWith(SI, FalseValI); in foldSelectZeroOrMul()
1630 static Value *foldSelectInstWithICmpConst(SelectInst &SI, ICmpInst *ICI, in foldSelectInstWithICmpConst() argument
1639 Value *TVal = SI.getTrueValue(); in foldSelectInstWithICmpConst()
1640 Value *FVal = SI.getFalseValue(); in foldSelectInstWithICmpConst()
1659 if (match(&SI, m_Select(m_Specific(ICI), m_APInt(C), m_BinOp(BO)))) in foldSelectInstWithICmpConst()
1661 else if (match(&SI, m_Select(m_Specific(ICI), m_BinOp(BO), m_APInt(C)))) in foldSelectInstWithICmpConst()
1680 Instruction *InstCombinerImpl::foldSelectInstWithICmp(SelectInst &SI, in foldSelectInstWithICmp() argument
1682 if (Instruction *NewSel = foldSelectValueEquivalence(SI, *ICI)) in foldSelectInstWithICmp()
1686 canonicalizeSPF(*ICI, SI.getTrueValue(), SI.getFalseValue(), *this)) in foldSelectInstWithICmp()
1687 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1689 if (Value *V = foldSelectInstWithICmpConst(SI, ICI, Builder)) in foldSelectInstWithICmp()
1690 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1692 if (Value *V = canonicalizeClampLike(SI, *ICI, Builder)) in foldSelectInstWithICmp()
1693 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1696 tryToReuseConstantFromSelectInComparison(SI, *ICI, *this)) in foldSelectInstWithICmp()
1699 if (Value *V = foldSelectICmpAnd(SI, ICI, Builder)) in foldSelectInstWithICmp()
1700 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1704 Value *TrueVal = SI.getTrueValue(); in foldSelectInstWithICmp()
1705 Value *FalseVal = SI.getFalseValue(); in foldSelectInstWithICmp()
1712 replaceOperand(SI, 1, CmpRHS); in foldSelectInstWithICmp()
1716 replaceOperand(SI, 2, CmpRHS); in foldSelectInstWithICmp()
1729 Builder.SetInsertPoint(&SI); in foldSelectInstWithICmp()
1731 replaceOperand(SI, 0, IsNeg); in foldSelectInstWithICmp()
1732 SI.swapValues(); in foldSelectInstWithICmp()
1733 SI.swapProfMetadata(); in foldSelectInstWithICmp()
1734 return &SI; in foldSelectInstWithICmp()
1783 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1788 foldSelectICmpAndAnd(SI.getType(), ICI, TrueVal, FalseVal, Builder)) in foldSelectInstWithICmp()
1792 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1801 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1804 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1807 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1810 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1813 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1816 return replaceInstUsesWith(SI, V); in foldSelectInstWithICmp()
1818 return Changed ? &SI : nullptr; in foldSelectInstWithICmp()
1831 const SelectInst &SI) { in canSelectOperandBeMappingIntoPredBlock() argument
1839 const PHINode *CondPHI = cast<PHINode>(SI.getCondition()); in canSelectOperandBeMappingIntoPredBlock()
1847 if (SI.getParent() == CondPHI->getParent() && in canSelectOperandBeMappingIntoPredBlock()
1879 static Instruction *foldAddSubSelect(SelectInst &SI, in foldAddSubSelect() argument
1881 Value *CondVal = SI.getCondition(); in foldAddSubSelect()
1882 Value *TrueVal = SI.getTrueValue(); in foldAddSubSelect()
1883 Value *FalseVal = SI.getFalseValue(); in foldAddSubSelect()
1916 if (SI.getType()->isFPOrFPVectorTy()) { in foldAddSubSelect()
1932 SI.getName() + ".p", &SI); in foldAddSubSelect()
1934 if (SI.getType()->isFPOrFPVectorTy()) { in foldAddSubSelect()
1955 foldOverflowingAddSubSelect(SelectInst &SI, InstCombiner::BuilderTy &Builder) { in foldOverflowingAddSubSelect() argument
1956 Value *CondVal = SI.getCondition(); in foldOverflowingAddSubSelect()
1957 Value *TrueVal = SI.getTrueValue(); in foldOverflowingAddSubSelect()
1958 Value *FalseVal = SI.getFalseValue(); in foldOverflowingAddSubSelect()
2065 Intrinsic::getDeclaration(SI.getModule(), NewIntrinsicID, SI.getType()); in foldOverflowingAddSubSelect()
2114 static Instruction *canonicalizeSelectToShuffle(SelectInst &SI) { in canonicalizeSelectToShuffle() argument
2115 Value *CondVal = SI.getCondition(); in canonicalizeSelectToShuffle()
2146 return new ShuffleVectorInst(SI.getTrueValue(), SI.getFalseValue(), Mask); in canonicalizeSelectToShuffle()
2241 static Value *foldSelectCmpXchg(SelectInst &SI) { in foldSelectCmpXchg() argument
2257 if (SI.hasOneUse()) in foldSelectCmpXchg()
2258 if (auto *Select = dyn_cast<SelectInst>(SI.user_back())) in foldSelectCmpXchg()
2259 if (Select->getCondition() == SI.getCondition()) in foldSelectCmpXchg()
2260 if (Select->getFalseValue() == SI.getTrueValue() || in foldSelectCmpXchg()
2261 Select->getTrueValue() == SI.getFalseValue()) in foldSelectCmpXchg()
2265 auto *CmpXchg = isExtractFromCmpXchg(SI.getCondition(), 1); in foldSelectCmpXchg()
2272 if (auto *X = isExtractFromCmpXchg(SI.getTrueValue(), 0)) in foldSelectCmpXchg()
2273 if (X == CmpXchg && X->getCompareOperand() == SI.getFalseValue()) in foldSelectCmpXchg()
2274 return SI.getFalseValue(); in foldSelectCmpXchg()
2279 if (auto *X = isExtractFromCmpXchg(SI.getFalseValue(), 0)) in foldSelectCmpXchg()
2280 if (X == CmpXchg && X->getCompareOperand() == SI.getTrueValue()) in foldSelectCmpXchg()
2281 return SI.getFalseValue(); in foldSelectCmpXchg()
2578 static Instruction *foldSelectWithSRem(SelectInst &SI, InstCombinerImpl &IC, in foldSelectWithSRem() argument
2580 Value *CondVal = SI.getCondition(); in foldSelectWithSRem()
2581 Value *TrueVal = SI.getTrueValue(); in foldSelectWithSRem()
2582 Value *FalseVal = SI.getFalseValue(); in foldSelectWithSRem()
2654 SelectInst &SI, in foldAndOrOfSelectUsingImpliedCond() argument
2656 Value *CondVal = SI.getCondition(); in foldAndOrOfSelectUsingImpliedCond()
2657 Value *A = SI.getTrueValue(); in foldAndOrOfSelectUsingImpliedCond()
2658 Value *B = SI.getFalseValue(); in foldAndOrOfSelectUsingImpliedCond()
2697 static Instruction *foldSelectWithFCmpToFabs(SelectInst &SI, in foldSelectWithFCmpToFabs() argument
2699 Value *CondVal = SI.getCondition(); in foldSelectWithFCmpToFabs()
2703 Value *TrueVal = SI.getTrueValue(); in foldSelectWithFCmpToFabs()
2704 Value *X = SI.getFalseValue(); in foldSelectWithFCmpToFabs()
2717 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI); in foldSelectWithFCmpToFabs()
2718 return IC.replaceInstUsesWith(SI, Fabs); in foldSelectWithFCmpToFabs()
2721 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI); in foldSelectWithFCmpToFabs()
2722 return IC.replaceInstUsesWith(SI, Fabs); in foldSelectWithFCmpToFabs()
2733 if (FMF.noNaNs() && !SI.hasNoNaNs()) { in foldSelectWithFCmpToFabs()
2734 SI.setHasNoNaNs(true); in foldSelectWithFCmpToFabs()
2737 if (FMF.noInfs() && !SI.hasNoInfs()) { in foldSelectWithFCmpToFabs()
2738 SI.setHasNoInfs(true); in foldSelectWithFCmpToFabs()
2752 if (!SI.hasNoSignedZeros() || !SI.hasNoNaNs()) in foldSelectWithFCmpToFabs()
2764 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI); in foldSelectWithFCmpToFabs()
2765 return IC.replaceInstUsesWith(SI, Fabs); in foldSelectWithFCmpToFabs()
2768 Value *Fabs = IC.Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, &SI); in foldSelectWithFCmpToFabs()
2770 NewFNeg->setFastMathFlags(SI.getFastMathFlags()); in foldSelectWithFCmpToFabs()
2775 return ChangedFMF ? &SI : nullptr; in foldSelectWithFCmpToFabs()
2793 foldRoundUpIntegerWithPow2Alignment(SelectInst &SI, in foldRoundUpIntegerWithPow2Alignment() argument
2795 Value *Cond = SI.getCondition(); in foldRoundUpIntegerWithPow2Alignment()
2796 Value *X = SI.getTrueValue(); in foldRoundUpIntegerWithPow2Alignment()
2797 Value *XBiasedHighBits = SI.getFalseValue(); in foldRoundUpIntegerWithPow2Alignment()
2847 R->takeName(&SI); in foldRoundUpIntegerWithPow2Alignment()
2937 Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) { in foldSelectOfBools() argument
2938 Value *CondVal = SI.getCondition(); in foldSelectOfBools()
2939 Value *TrueVal = SI.getTrueValue(); in foldSelectOfBools()
2940 Value *FalseVal = SI.getFalseValue(); in foldSelectOfBools()
2941 Type *SelType = SI.getType(); in foldSelectOfBools()
2967 return replaceInstUsesWith(SI, V); in foldSelectOfBools()
3008 return replaceInstUsesWith(SI, V); in foldSelectOfBools()
3054 if (match(&SI, m_LogicalAnd(m_Not(m_Value(A)), m_Not(m_Value(B)))) && in foldSelectOfBools()
3061 if (match(&SI, m_LogicalOr(m_Not(m_Value(A)), m_Not(m_Value(B)))) && in foldSelectOfBools()
3069 return replaceOperand(SI, 0, A); in foldSelectOfBools()
3073 return replaceOperand(SI, 0, A); in foldSelectOfBools()
3076 if (match(&SI, m_c_LogicalAnd(m_Not(m_LogicalAnd(m_Value(A), m_Value(B))), in foldSelectOfBools()
3115 return replaceInstUsesWith(SI, Op1); in foldSelectOfBools()
3125 if (auto *V = foldAndOrOfICmps(ICmp0, ICmp1, SI, IsAnd, in foldSelectOfBools()
3127 return replaceInstUsesWith(SI, V); in foldSelectOfBools()
3137 return replaceOperand(SI, 0, A); in foldSelectOfBools()
3143 return replaceOperand(SI, 1, A); in foldSelectOfBools()
3152 return replaceOperand(SI, 2, A); in foldSelectOfBools()
3158 return replaceOperand(SI, 0, A); in foldSelectOfBools()
3296 static Instruction *foldBitCeil(SelectInst &SI, IRBuilderBase &Builder) { in foldBitCeil() argument
3297 Type *SelType = SI.getType(); in foldBitCeil()
3300 Value *FalseVal = SI.getFalseValue(); in foldBitCeil()
3301 Value *TrueVal = SI.getTrueValue(); in foldBitCeil()
3305 if (!match(SI.getCondition(), m_ICmp(Pred, m_Value(Cond0), m_APInt(Cond1)))) in foldBitCeil()
3363 Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) { in visitSelectInst() argument
3364 Value *CondVal = SI.getCondition(); in visitSelectInst()
3365 Value *TrueVal = SI.getTrueValue(); in visitSelectInst()
3366 Value *FalseVal = SI.getFalseValue(); in visitSelectInst()
3367 Type *SelType = SI.getType(); in visitSelectInst()
3370 SQ.getWithInstruction(&SI))) in visitSelectInst()
3371 return replaceInstUsesWith(SI, V); in visitSelectInst()
3373 if (Instruction *I = canonicalizeSelectToShuffle(SI)) in visitSelectInst()
3376 if (Instruction *I = canonicalizeScalarSelectOfVecs(SI, *this)) in visitSelectInst()
3388 return replaceOperand(SI, 1, S); in visitSelectInst()
3393 return replaceOperand(SI, 2, S); in visitSelectInst()
3396 if (Instruction *R = foldSelectOfBools(SI)) in visitSelectInst()
3431 auto *SIFPOp = dyn_cast<FPMathOperator>(&SI); in visitSelectInst()
3452 return replaceInstUsesWith(SI, NewSel); in visitSelectInst()
3485 SI, SIFPOp->hasNoSignedZeros())) in visitSelectInst()
3486 return replaceInstUsesWith(SI, Cmp0); in visitSelectInst()
3497 if (match(&SI, m_OrdFMax(m_Value(X), m_Value(Y)))) in visitSelectInst()
3499 SI, Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, X, Y, &SI)); in visitSelectInst()
3501 if (match(&SI, m_OrdFMin(m_Value(X), m_Value(Y)))) in visitSelectInst()
3503 SI, Builder.CreateBinaryIntrinsic(Intrinsic::minnum, X, Y, &SI)); in visitSelectInst()
3508 if (Instruction *Fabs = foldSelectWithFCmpToFabs(SI, *this)) in visitSelectInst()
3513 if (Instruction *Result = foldSelectInstWithICmp(SI, ICI)) in visitSelectInst()
3516 if (Instruction *Add = foldAddSubSelect(SI, Builder)) in visitSelectInst()
3518 if (Instruction *Add = foldOverflowingAddSubSelect(SI, Builder)) in visitSelectInst()
3520 if (Instruction *Or = foldSetClearBits(SI, Builder)) in visitSelectInst()
3522 if (Instruction *Mul = foldSelectZeroOrMul(SI, *this)) in visitSelectInst()
3529 if (Instruction *IV = foldSelectOpOp(SI, TI, FI)) in visitSelectInst()
3532 if (Instruction *I = foldSelectExtConst(SI)) in visitSelectInst()
3535 if (Instruction *I = foldSelectWithSRem(SI, *this, Builder)) in visitSelectInst()
3555 Builder.CreateSelect(CondVal, NewT, NewF, SI.getName() + ".idx", &SI); in visitSelectInst()
3569 if (Instruction *FoldI = foldSelectIntoOp(SI, TrueVal, FalseVal)) in visitSelectInst()
3574 SelectPatternResult SPR = matchSelectPattern(&SI, LHS, RHS, &CastOp); in visitSelectInst()
3580 RHS2, SI, SPF, RHS)) in visitSelectInst()
3584 RHS2, SI, SPF, LHS)) in visitSelectInst()
3608 cast<FPMathOperator>(SI.getCondition())->getFastMathFlags(); in visitSelectInst()
3613 Value *NewSI = Builder.CreateSelect(Cmp, LHS, RHS, SI.getName(), &SI); in visitSelectInst()
3615 return replaceInstUsesWith(SI, NewSI); in visitSelectInst()
3618 return replaceInstUsesWith(SI, NewCast); in visitSelectInst()
3624 if (auto *PN = dyn_cast<PHINode>(SI.getCondition())) in visitSelectInst()
3626 if (canSelectOperandBeMappingIntoPredBlock(TrueVal, SI) && in visitSelectInst()
3627 canSelectOperandBeMappingIntoPredBlock(FalseVal, SI)) in visitSelectInst()
3628 if (Instruction *NV = foldOpIntoPhi(SI, PN)) in visitSelectInst()
3635 if (SI.getTrueValue() == TrueSI->getTrueValue()) in visitSelectInst()
3637 return replaceOperand(SI, 1, TrueSI->getTrueValue()); in visitSelectInst()
3645 replaceOperand(SI, 0, And); in visitSelectInst()
3646 replaceOperand(SI, 1, TrueSI->getTrueValue()); in visitSelectInst()
3647 return &SI; in visitSelectInst()
3655 if (SI.getFalseValue() == FalseSI->getFalseValue()) in visitSelectInst()
3657 return replaceOperand(SI, 2, FalseSI->getFalseValue()); in visitSelectInst()
3662 replaceOperand(SI, 0, Or); in visitSelectInst()
3663 replaceOperand(SI, 2, FalseSI->getFalseValue()); in visitSelectInst()
3664 return &SI; in visitSelectInst()
3681 return &SI; in visitSelectInst()
3688 return &SI; in visitSelectInst()
3700 return &SI; in visitSelectInst()
3707 return &SI; in visitSelectInst()
3714 !InstCombiner::shouldAvoidAbsorbingNotIntoSelect(SI)) { in visitSelectInst()
3715 replaceOperand(SI, 0, NotCond); in visitSelectInst()
3716 SI.swapValues(); in visitSelectInst()
3717 SI.swapProfMetadata(); in visitSelectInst()
3718 return &SI; in visitSelectInst()
3721 if (Instruction *I = foldVectorSelect(SI)) in visitSelectInst()
3731 computeKnownBits(CondVal, Known, 0, &SI); in visitSelectInst()
3733 return replaceInstUsesWith(SI, TrueVal); in visitSelectInst()
3735 return replaceInstUsesWith(SI, FalseVal); in visitSelectInst()
3738 if (Instruction *BitCastSel = foldSelectCmpBitcasts(SI, Builder)) in visitSelectInst()
3742 if (Value *V = foldSelectCmpXchg(SI)) in visitSelectInst()
3743 return replaceInstUsesWith(SI, V); in visitSelectInst()
3745 if (Instruction *Select = foldSelectBinOpIdentity(SI, TLI, *this)) in visitSelectInst()
3748 if (Instruction *Funnel = foldSelectFunnelShift(SI, Builder)) in visitSelectInst()
3751 if (Instruction *Copysign = foldSelectToCopysign(SI, Builder)) in visitSelectInst()
3754 if (Instruction *PN = foldSelectToPhi(SI, DT, Builder)) in visitSelectInst()
3755 return replaceInstUsesWith(SI, PN); in visitSelectInst()
3757 if (Value *Fr = foldSelectWithFrozenICmp(SI, Builder)) in visitSelectInst()
3758 return replaceInstUsesWith(SI, Fr); in visitSelectInst()
3760 if (Value *V = foldRoundUpIntegerWithPow2Alignment(SI, Builder)) in visitSelectInst()
3761 return replaceInstUsesWith(SI, V); in visitSelectInst()
3773 return replaceInstUsesWith(SI, MaskedInst); in visitSelectInst()
3788 if (Value *V = simplifyAndInst(CondVal, Mask, SQ.getWithInstruction(&SI))) in visitSelectInst()
3795 return replaceInstUsesWith(SI, MaskedInst); in visitSelectInst()
3799 if (Instruction *I = foldNestedSelects(SI, Builder)) in visitSelectInst()
3806 if (sinkNotIntoOtherHandOfLogicalOp(SI)) in visitSelectInst()
3807 return &SI; in visitSelectInst()
3809 if (Instruction *I = foldBitCeil(SI, Builder)) in visitSelectInst()
3820 SQ.getWithInstruction(&SI))) in visitSelectInst()