Lines Matching refs:II

306 Value *InstCombinerImpl::simplifyMaskedLoad(IntrinsicInst &II) {  in simplifyMaskedLoad()  argument
307 Value *LoadPtr = II.getArgOperand(0); in simplifyMaskedLoad()
309 cast<ConstantInt>(II.getArgOperand(1))->getAlignValue(); in simplifyMaskedLoad()
313 if (maskIsAllOneOrUndef(II.getArgOperand(2))) { in simplifyMaskedLoad()
314 LoadInst *L = Builder.CreateAlignedLoad(II.getType(), LoadPtr, Alignment, in simplifyMaskedLoad()
316 L->copyMetadata(II); in simplifyMaskedLoad()
322 if (isDereferenceablePointer(LoadPtr, II.getType(), in simplifyMaskedLoad()
323 II.getModule()->getDataLayout(), &II, &AC)) { in simplifyMaskedLoad()
324 LoadInst *LI = Builder.CreateAlignedLoad(II.getType(), LoadPtr, Alignment, in simplifyMaskedLoad()
326 LI->copyMetadata(II); in simplifyMaskedLoad()
327 return Builder.CreateSelect(II.getArgOperand(2), LI, II.getArgOperand(3)); in simplifyMaskedLoad()
336 Instruction *InstCombinerImpl::simplifyMaskedStore(IntrinsicInst &II) { in simplifyMaskedStore() argument
337 auto *ConstMask = dyn_cast<Constant>(II.getArgOperand(3)); in simplifyMaskedStore()
343 return eraseInstFromFunction(II); in simplifyMaskedStore()
347 Value *StorePtr = II.getArgOperand(1); in simplifyMaskedStore()
348 Align Alignment = cast<ConstantInt>(II.getArgOperand(2))->getAlignValue(); in simplifyMaskedStore()
350 new StoreInst(II.getArgOperand(0), StorePtr, false, Alignment); in simplifyMaskedStore()
351 S->copyMetadata(II); in simplifyMaskedStore()
361 if (Value *V = SimplifyDemandedVectorElts(II.getOperand(0), DemandedElts, in simplifyMaskedStore()
363 return replaceOperand(II, 0, V); in simplifyMaskedStore()
374 Instruction *InstCombinerImpl::simplifyMaskedGather(IntrinsicInst &II) { in simplifyMaskedGather() argument
375 auto *ConstMask = dyn_cast<Constant>(II.getArgOperand(2)); in simplifyMaskedGather()
383 if (auto *SplatPtr = getSplatValue(II.getArgOperand(0))) { in simplifyMaskedGather()
384 auto *VecTy = cast<VectorType>(II.getType()); in simplifyMaskedGather()
386 cast<ConstantInt>(II.getArgOperand(1))->getAlignValue(); in simplifyMaskedGather()
391 return replaceInstUsesWith(II, cast<Instruction>(Shuf)); in simplifyMaskedGather()
402 Instruction *InstCombinerImpl::simplifyMaskedScatter(IntrinsicInst &II) { in simplifyMaskedScatter() argument
403 auto *ConstMask = dyn_cast<Constant>(II.getArgOperand(3)); in simplifyMaskedScatter()
409 return eraseInstFromFunction(II); in simplifyMaskedScatter()
412 if (auto *SplatPtr = getSplatValue(II.getArgOperand(1))) { in simplifyMaskedScatter()
414 if (auto *SplatValue = getSplatValue(II.getArgOperand(0))) { in simplifyMaskedScatter()
417 cast<ConstantInt>(II.getArgOperand(2))->getAlignValue(); in simplifyMaskedScatter()
420 S->copyMetadata(II); in simplifyMaskedScatter()
427 Align Alignment = cast<ConstantInt>(II.getArgOperand(2))->getAlignValue(); in simplifyMaskedScatter()
428 VectorType *WideLoadTy = cast<VectorType>(II.getArgOperand(1)->getType()); in simplifyMaskedScatter()
433 Builder.CreateExtractElement(II.getArgOperand(0), LastLane); in simplifyMaskedScatter()
436 S->copyMetadata(II); in simplifyMaskedScatter()
446 if (Value *V = SimplifyDemandedVectorElts(II.getOperand(0), DemandedElts, in simplifyMaskedScatter()
448 return replaceOperand(II, 0, V); in simplifyMaskedScatter()
449 if (Value *V = SimplifyDemandedVectorElts(II.getOperand(1), DemandedElts, in simplifyMaskedScatter()
451 return replaceOperand(II, 1, V); in simplifyMaskedScatter()
464 static Instruction *simplifyInvariantGroupIntrinsic(IntrinsicInst &II, in simplifyInvariantGroupIntrinsic() argument
466 auto *Arg = II.getArgOperand(0); in simplifyInvariantGroupIntrinsic()
480 if (II.getIntrinsicID() == Intrinsic::launder_invariant_group) in simplifyInvariantGroupIntrinsic()
482 else if (II.getIntrinsicID() == Intrinsic::strip_invariant_group) in simplifyInvariantGroupIntrinsic()
488 II.getType()->getPointerAddressSpace()) in simplifyInvariantGroupIntrinsic()
489 Result = IC.Builder.CreateAddrSpaceCast(Result, II.getType()); in simplifyInvariantGroupIntrinsic()
494 static Instruction *foldCttzCtlz(IntrinsicInst &II, InstCombinerImpl &IC) { in foldCttzCtlz() argument
495 assert((II.getIntrinsicID() == Intrinsic::cttz || in foldCttzCtlz()
496 II.getIntrinsicID() == Intrinsic::ctlz) && in foldCttzCtlz()
498 bool IsTZ = II.getIntrinsicID() == Intrinsic::cttz; in foldCttzCtlz()
499 Value *Op0 = II.getArgOperand(0); in foldCttzCtlz()
500 Value *Op1 = II.getArgOperand(1); in foldCttzCtlz()
506 Function *F = Intrinsic::getDeclaration(II.getModule(), ID, II.getType()); in foldCttzCtlz()
507 return CallInst::Create(F, {X, II.getArgOperand(1)}); in foldCttzCtlz()
510 if (II.getType()->isIntOrIntVectorTy(1)) { in foldCttzCtlz()
517 return IC.replaceInstUsesWith(II, ConstantInt::getNullValue(II.getType())); in foldCttzCtlz()
525 return IC.replaceOperand(II, 0, X); in foldCttzCtlz()
529 return IC.replaceOperand(II, 0, X); in foldCttzCtlz()
533 auto *Zext = IC.Builder.CreateZExt(X, II.getType()); in foldCttzCtlz()
536 return IC.replaceInstUsesWith(II, CttzZext); in foldCttzCtlz()
544 auto *ZextCttz = IC.Builder.CreateZExt(Cttz, II.getType()); in foldCttzCtlz()
545 return IC.replaceInstUsesWith(II, ZextCttz); in foldCttzCtlz()
553 return IC.replaceOperand(II, 0, X); in foldCttzCtlz()
556 return IC.replaceOperand(II, 0, X); in foldCttzCtlz()
591 KnownBits Known = IC.computeKnownBits(Op0, 0, &II); in foldCttzCtlz()
605 return IC.replaceInstUsesWith(II, C); in foldCttzCtlz()
612 isKnownNonZero(Op0, IC.getDataLayout(), 0, &IC.getAssumptionCache(), &II, in foldCttzCtlz()
614 if (!match(II.getArgOperand(1), m_One())) in foldCttzCtlz()
615 return IC.replaceOperand(II, 1, IC.Builder.getTrue()); in foldCttzCtlz()
620 if (IT && IT->getBitWidth() != 1 && !II.getMetadata(LLVMContext::MD_range)) { in foldCttzCtlz()
624 II.setMetadata(LLVMContext::MD_range, in foldCttzCtlz()
625 MDNode::get(II.getContext(), LowAndHigh)); in foldCttzCtlz()
626 return &II; in foldCttzCtlz()
632 static Instruction *foldCtpop(IntrinsicInst &II, InstCombinerImpl &IC) { in foldCtpop() argument
633 assert(II.getIntrinsicID() == Intrinsic::ctpop && in foldCtpop()
635 Type *Ty = II.getType(); in foldCtpop()
637 Value *Op0 = II.getArgOperand(0); in foldCtpop()
643 return IC.replaceOperand(II, 0, X); in foldCtpop()
649 return IC.replaceOperand(II, 0, X); in foldCtpop()
655 Intrinsic::getDeclaration(II.getModule(), Intrinsic::cttz, Ty); in foldCtpop()
658 return IC.replaceInstUsesWith(II, IC.Builder.CreateSub(Bw, Cttz)); in foldCtpop()
665 Intrinsic::getDeclaration(II.getModule(), Intrinsic::cttz, Ty); in foldCtpop()
677 IC.computeKnownBits(Op0, Known, 0, &II); in foldCtpop()
701 if (IT->getBitWidth() != 1 && !II.getMetadata(LLVMContext::MD_range)) { in foldCtpop()
705 II.setMetadata(LLVMContext::MD_range, in foldCtpop()
706 MDNode::get(II.getContext(), LowAndHigh)); in foldCtpop()
707 return &II; in foldCtpop()
717 static Value *simplifyNeonTbl1(const IntrinsicInst &II, in simplifyNeonTbl1() argument
720 auto *C = dyn_cast<Constant>(II.getArgOperand(1)); in simplifyNeonTbl1()
724 auto *VecTy = cast<FixedVectorType>(II.getType()); in simplifyNeonTbl1()
746 auto *V1 = II.getArgOperand(0); in simplifyNeonTbl1()
821 static Instruction *createOverflowTuple(IntrinsicInst *II, Value *Result, in createOverflowTuple() argument
824 StructType *ST = cast<StructType>(II->getType()); in createOverflowTuple()
830 InstCombinerImpl::foldIntrinsicWithOverflowCommon(IntrinsicInst *II) { in foldIntrinsicWithOverflowCommon() argument
831 WithOverflowInst *WO = cast<WithOverflowInst>(II); in foldIntrinsicWithOverflowCommon()
911 Instruction *InstCombinerImpl::foldIntrinsicIsFPClass(IntrinsicInst &II) { in foldIntrinsicIsFPClass() argument
912 Value *Src0 = II.getArgOperand(0); in foldIntrinsicIsFPClass()
913 Value *Src1 = II.getArgOperand(1); in foldIntrinsicIsFPClass()
921 const bool IsStrict = II.isStrictFP(); in foldIntrinsicIsFPClass()
927 II.setArgOperand(1, ConstantInt::get(Src1->getType(), fneg(Mask))); in foldIntrinsicIsFPClass()
928 return replaceOperand(II, 0, FNegSrc); in foldIntrinsicIsFPClass()
933 II.setArgOperand(1, ConstantInt::get(Src1->getType(), inverse_fabs(Mask))); in foldIntrinsicIsFPClass()
934 return replaceOperand(II, 0, FAbsSrc); in foldIntrinsicIsFPClass()
951 CmpInf->takeName(&II); in foldIntrinsicIsFPClass()
952 return replaceInstUsesWith(II, CmpInf); in foldIntrinsicIsFPClass()
966 EqInf->takeName(&II); in foldIntrinsicIsFPClass()
967 return replaceInstUsesWith(II, EqInf); in foldIntrinsicIsFPClass()
980 NeInf->takeName(&II); in foldIntrinsicIsFPClass()
981 return replaceInstUsesWith(II, NeInf); in foldIntrinsicIsFPClass()
989 IsNan->takeName(&II); in foldIntrinsicIsFPClass()
990 return replaceInstUsesWith(II, IsNan); in foldIntrinsicIsFPClass()
997 FCmp->takeName(&II); in foldIntrinsicIsFPClass()
998 return replaceInstUsesWith(II, FCmp); in foldIntrinsicIsFPClass()
1017 (PredType = fpclassTestIsFCmp0(OrderedMask, *II.getFunction(), in foldIntrinsicIsFPClass()
1026 FCmp->takeName(&II); in foldIntrinsicIsFPClass()
1027 return replaceInstUsesWith(II, FCmp); in foldIntrinsicIsFPClass()
1030 KnownFPClass Known = computeKnownFPClass(Src0, Mask, &II); in foldIntrinsicIsFPClass()
1036 II.setArgOperand( in foldIntrinsicIsFPClass()
1038 return &II; in foldIntrinsicIsFPClass()
1045 return replaceInstUsesWith(II, ConstantInt::get(II.getType(), true)); in foldIntrinsicIsFPClass()
1096 static Instruction *moveAddAfterMinMax(IntrinsicInst *II, in moveAddAfterMinMax() argument
1098 Intrinsic::ID MinMaxID = II->getIntrinsicID(); in moveAddAfterMinMax()
1104 Value *Op0 = II->getArgOperand(0), *Op1 = II->getArgOperand(1); in moveAddAfterMinMax()
1127 Constant *NewMinMaxC = ConstantInt::get(II->getType(), CDiff); in moveAddAfterMinMax()
1197 static Instruction *foldClampRangeOfTwo(IntrinsicInst *II, in foldClampRangeOfTwo() argument
1199 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1); in foldClampRangeOfTwo()
1206 switch (II->getIntrinsicID()) { in foldClampRangeOfTwo()
1232 return SelectInst::Create(Cmp, ConstantInt::get(II->getType(), *C0), I1); in foldClampRangeOfTwo()
1237 static Value *reassociateMinMaxWithConstants(IntrinsicInst *II, in reassociateMinMaxWithConstants() argument
1239 Intrinsic::ID MinMaxID = II->getIntrinsicID(); in reassociateMinMaxWithConstants()
1240 auto *LHS = dyn_cast<IntrinsicInst>(II->getArgOperand(0)); in reassociateMinMaxWithConstants()
1246 !match(II->getArgOperand(1), m_ImmConstant(C1))) in reassociateMinMaxWithConstants()
1253 return Builder.CreateIntrinsic(MinMaxID, II->getType(), in reassociateMinMaxWithConstants()
1260 reassociateMinMaxWithConstantInOperand(IntrinsicInst *II, in reassociateMinMaxWithConstantInOperand() argument
1266 if (!match(II, m_c_MaxOrMin(m_OneUse(m_CombineAnd( in reassociateMinMaxWithConstantInOperand()
1273 Intrinsic::ID MinMaxID = II->getIntrinsicID(); in reassociateMinMaxWithConstantInOperand()
1281 Intrinsic::getDeclaration(II->getModule(), MinMaxID, II->getType()); in reassociateMinMaxWithConstantInOperand()
1288 static Instruction *factorizeMinMaxTree(IntrinsicInst *II) { in factorizeMinMaxTree() argument
1290 auto *LHS = dyn_cast<IntrinsicInst>(II->getArgOperand(0)); in factorizeMinMaxTree()
1291 auto *RHS = dyn_cast<IntrinsicInst>(II->getArgOperand(1)); in factorizeMinMaxTree()
1292 Intrinsic::ID MinMaxID = II->getIntrinsicID(); in factorizeMinMaxTree()
1339 Module *Mod = II->getModule(); in factorizeMinMaxTree()
1340 Function *MinMax = Intrinsic::getDeclaration(Mod, MinMaxID, II->getType()); in factorizeMinMaxTree()
1347 foldShuffledIntrinsicOperands(IntrinsicInst *II, in foldShuffledIntrinsicOperands() argument
1352 switch (II->getIntrinsicID()) { in foldShuffledIntrinsicOperands()
1367 if (!match(II->getArgOperand(0), in foldShuffledIntrinsicOperands()
1372 if (none_of(II->args(), [](Value *V) { return V->hasOneUse(); })) in foldShuffledIntrinsicOperands()
1376 SmallVector<Value *, 4> NewArgs(II->arg_size()); in foldShuffledIntrinsicOperands()
1379 for (unsigned i = 1, e = II->arg_size(); i != e; ++i) { in foldShuffledIntrinsicOperands()
1380 if (!match(II->getArgOperand(i), in foldShuffledIntrinsicOperands()
1388 Instruction *FPI = isa<FPMathOperator>(II) ? II : nullptr; in foldShuffledIntrinsicOperands()
1390 Builder.CreateIntrinsic(II->getIntrinsicID(), SrcTy, NewArgs, FPI); in foldShuffledIntrinsicOperands()
1459 IntrinsicInst *II = dyn_cast<IntrinsicInst>(&CI); in visitCallInst() local
1460 if (!II) return visitCallBase(CI); in visitCallInst()
1464 if (auto *AMI = dyn_cast<AtomicMemIntrinsic>(II)) in visitCallInst()
1476 if (auto *MI = dyn_cast<AnyMemIntrinsic>(II)) { in visitCallInst()
1525 if (Changed) return II; in visitCallInst()
1530 if (auto *IIFVTy = dyn_cast<FixedVectorType>(II->getType())) { in visitCallInst()
1534 if (Value *V = SimplifyDemandedVectorElts(II, AllOnesEltMask, PoisonElts)) { in visitCallInst()
1535 if (V != II) in visitCallInst()
1536 return replaceInstUsesWith(*II, V); in visitCallInst()
1537 return II; in visitCallInst()
1541 if (II->isCommutative()) { in visitCallInst()
1542 if (auto Pair = matchSymmetricPair(II->getOperand(0), II->getOperand(1))) { in visitCallInst()
1543 replaceOperand(*II, 0, Pair->first); in visitCallInst()
1544 replaceOperand(*II, 1, Pair->second); in visitCallInst()
1545 return II; in visitCallInst()
1561 Intrinsic::ID IID = II->getIntrinsicID(); in visitCallInst()
1565 if (Value *V = lowerObjectSizeCall(II, DL, &TLI, AA, /*MustSucceed=*/false, in visitCallInst()
1574 Value *IIOperand = II->getArgOperand(0); in visitCallInst()
1575 bool IntMinIsPoison = cast<Constant>(II->getArgOperand(1))->isOneValue(); in visitCallInst()
1581 return replaceOperand(*II, 0, X); in visitCallInst()
1583 return replaceOperand(*II, 0, X); in visitCallInst()
1585 return replaceOperand(*II, 0, X); in visitCallInst()
1588 getKnownSignOrZero(IIOperand, II, DL, &AC, &DT)) { in visitCallInst()
1592 return replaceInstUsesWith(*II, IIOperand); in visitCallInst()
1606 return CastInst::Create(Instruction::ZExt, NarrowAbs, II->getType()); in visitCallInst()
1613 return BinaryOperator::CreateAnd(X, ConstantInt::get(II->getType(), 1)); in visitCallInst()
1618 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1); in visitCallInst()
1621 assert(II->getType()->getScalarSizeInBits() != 1 && in visitCallInst()
1625 return CastInst::Create(Instruction::ZExt, Cmp, II->getType()); in visitCallInst()
1630 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1); in visitCallInst()
1635 return CastInst::Create(Instruction::ZExt, NarrowMaxMin, II->getType()); in visitCallInst()
1642 return CastInst::Create(Instruction::ZExt, NarrowMaxMin, II->getType()); in visitCallInst()
1651 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1); in visitCallInst()
1656 return CastInst::Create(Instruction::SExt, NarrowMaxMin, II->getType()); in visitCallInst()
1664 return CastInst::Create(Instruction::SExt, NarrowMaxMin, II->getType()); in visitCallInst()
1671 II->getType()->isIntOrIntVectorTy(1)) { in visitCallInst()
1678 II->getType()->isIntOrIntVectorTy(1)) { in visitCallInst()
1713 auto KnownSign = getKnownSign(X, II, DL, &AC, &DT); in visitCallInst()
1759 if (Instruction *I = moveAddAfterMinMax(II, Builder)) in visitCallInst()
1778 ConstantInt::getBool(II->getContext(), IntMinIsPoison)); in visitCallInst()
1787 if (Instruction *Sel = foldClampRangeOfTwo(II, Builder)) in visitCallInst()
1790 if (Instruction *SAdd = matchSAddSubSat(*II)) in visitCallInst()
1793 if (Value *NewMinMax = reassociateMinMaxWithConstants(II, Builder)) in visitCallInst()
1794 return replaceInstUsesWith(*II, NewMinMax); in visitCallInst()
1796 if (Instruction *R = reassociateMinMaxWithConstantInOperand(II, Builder)) in visitCallInst()
1799 if (Instruction *NewMinMax = factorizeMinMaxTree(II)) in visitCallInst()
1809 I0, IsSigned, SQ.getWithInstruction(II)); in visitCallInst()
1812 return replaceInstUsesWith(*II, I0); in visitCallInst()
1814 return replaceInstUsesWith(*II, in visitCallInst()
1815 ConstantInt::get(II->getType(), *RHSC)); in visitCallInst()
1822 Value *IIOperand = II->getArgOperand(0); in visitCallInst()
1827 Type *Ty = II->getType(); in visitCallInst()
1840 Value *IIOperand = II->getArgOperand(0); in visitCallInst()
1863 KnownBits Known = computeKnownBits(IIOperand, 0, II); in visitCallInst()
1893 if (Instruction *BitOp = matchBSwapOrBitReverse(*II, /*MatchBSwaps*/ false, in visitCallInst()
1899 if (Value *SimplifiedMaskedOp = simplifyMaskedLoad(*II)) in visitCallInst()
1903 return simplifyMaskedStore(*II); in visitCallInst()
1905 return simplifyMaskedGather(*II); in visitCallInst()
1907 return simplifyMaskedScatter(*II); in visitCallInst()
1910 if (auto *SkippedBarrier = simplifyInvariantGroupIntrinsic(*II, *this)) in visitCallInst()
1911 return replaceInstUsesWith(*II, SkippedBarrier); in visitCallInst()
1914 if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getArgOperand(1))) { in visitCallInst()
1919 II->getArgOperand(0), II); in visitCallInst()
1922 return BinaryOperator::CreateFMulFMF(II->getArgOperand(0), in visitCallInst()
1923 II->getArgOperand(0), II); in visitCallInst()
1931 if (match(II->getArgOperand(0), m_FNeg(m_Value(X))) || in visitCallInst()
1932 match(II->getArgOperand(0), m_FAbs(m_Value(X))) || in visitCallInst()
1933 match(II->getArgOperand(0), in visitCallInst()
1935 return replaceOperand(*II, 0, X); in visitCallInst()
1942 if (auto *I = foldCttzCtlz(*II, *this)) in visitCallInst()
1947 if (auto *I = foldCtpop(*II, *this)) in visitCallInst()
1953 Value *Op0 = II->getArgOperand(0), *Op1 = II->getArgOperand(1); in visitCallInst()
1954 Type *Ty = II->getType(); in visitCallInst()
1957 if (match(II->getArgOperand(2), m_ImmConstant(ShAmtC))) { in visitCallInst()
1965 return replaceOperand(*II, 2, ModuloC); in visitCallInst()
1977 Module *Mod = II->getModule(); in visitCallInst()
1997 Module *Mod = II->getModule(); in visitCallInst()
2002 matchBSwapOrBitReverse(*II, /*MatchBSwaps*/ true, in visitCallInst()
2008 if (SimplifyDemandedInstructionBits(*II)) in visitCallInst()
2018 if (SimplifyDemandedBits(II, 2, Op2Demanded, Op2Known)) in visitCallInst()
2023 unsigned BitWidth = DL.getPointerTypeSizeInBits(II->getType()); in visitCallInst()
2025 if (SimplifyDemandedInstructionBits(*II, Known)) in visitCallInst()
2026 return II; in visitCallInst()
2033 if (match(II->getArgOperand(0), in visitCallInst()
2036 assert(II->getArgOperand(1)->getType() == InnerMask->getType() && in visitCallInst()
2040 Value *NewMask = Builder.CreateAnd(II->getArgOperand(1), InnerMask); in visitCallInst()
2049 isKnownNonZero(II, DL, /*Depth*/ 0, &AC, II, &DT))) { in visitCallInst()
2070 if (Instruction *I = foldIntrinsicWithOverflowCommon(II)) in visitCallInst()
2078 Value *Arg0 = II->getArgOperand(0); in visitCallInst()
2079 Value *Arg1 = II->getArgOperand(1); in visitCallInst()
2089 *II, Builder.CreateBinaryIntrinsic( in visitCallInst()
2098 if (Instruction *I = foldIntrinsicWithOverflowCommon(II)) in visitCallInst()
2103 if (Instruction *I = foldIntrinsicWithOverflowCommon(II)) in visitCallInst()
2107 Value *Arg0 = II->getArgOperand(0); in visitCallInst()
2108 Value *Arg1 = II->getArgOperand(1); in visitCallInst()
2118 *II, Builder.CreateBinaryIntrinsic(Intrinsic::sadd_with_overflow, in visitCallInst()
2129 SaturatingInst *SI = cast<SaturatingInst>(II); in visitCallInst()
2163 *II, Builder.CreateBinaryIntrinsic( in visitCallInst()
2196 *II, Builder.CreateBinaryIntrinsic( in visitCallInst()
2197 IID, X, ConstantInt::get(II->getType(), NewVal))); in visitCallInst()
2207 Value *Arg0 = II->getArgOperand(0); in visitCallInst()
2208 Value *Arg1 = II->getArgOperand(1); in visitCallInst()
2232 Value *NewCall = Builder.CreateBinaryIntrinsic(NewIID, X, Y, II); in visitCallInst()
2234 FNeg->copyIRFlags(II); in visitCallInst()
2264 IID, X, ConstantFP::get(Arg0->getType(), Res), II); in visitCallInst()
2269 return replaceInstUsesWith(*II, NewCall); in visitCallInst()
2278 Builder.CreateBinaryIntrinsic(IID, X, Y, II, II->getName()); in visitCallInst()
2279 return new FPExtInst(NewCall, II->getType()); in visitCallInst()
2289 Value *R = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, II); in visitCallInst()
2291 R = Builder.CreateFNegFMF(R, II); in visitCallInst()
2292 return replaceInstUsesWith(*II, R); in visitCallInst()
2302 if (match(II->getArgOperand(0), m_FNeg(m_Value(A))) && in visitCallInst()
2303 match(II->getArgOperand(1), m_FNeg(m_Value(B)))) { in visitCallInst()
2304 replaceOperand(*II, 0, A); in visitCallInst()
2305 replaceOperand(*II, 1, B); in visitCallInst()
2306 return II; in visitCallInst()
2309 Value *Op0 = II->getOperand(0); in visitCallInst()
2310 Value *Op1 = II->getOperand(1); in visitCallInst()
2329 Value *OtherOp = II->getOperand(OtherOpArg); in visitCallInst()
2330 VectorType *RetTy = cast<VectorType>(II->getType()); in visitCallInst()
2340 replaceOperand(*II, NegatedOpArg, OpNotNeg); in visitCallInst()
2341 replaceOperand(*II, OtherOpArg, InverseOtherOp); in visitCallInst()
2342 return II; in visitCallInst()
2346 SmallVector<Value *, 5> NewArgs(II->args()); in visitCallInst()
2349 Builder.CreateIntrinsic(II->getType(), IID, NewArgs, II); in visitCallInst()
2350 return replaceInstUsesWith(*II, Builder.CreateFNegFMF(NewMul, II)); in visitCallInst()
2356 if (II->isFast()) { in visitCallInst()
2358 Builder.setFastMathFlags(II->getFastMathFlags()); in visitCallInst()
2359 Value *Mul = Builder.CreateFMul(II->getArgOperand(0), in visitCallInst()
2360 II->getArgOperand(1)); in visitCallInst()
2361 Value *Add = Builder.CreateFAdd(Mul, II->getArgOperand(2)); in visitCallInst()
2362 Add->takeName(II); in visitCallInst()
2363 return replaceInstUsesWith(*II, Add); in visitCallInst()
2367 if (Value *V = simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1), in visitCallInst()
2368 II->getFastMathFlags(), in visitCallInst()
2369 SQ.getWithInstruction(II))) { in visitCallInst()
2370 auto *FAdd = BinaryOperator::CreateFAdd(V, II->getArgOperand(2)); in visitCallInst()
2371 FAdd->copyFastMathFlags(II); in visitCallInst()
2379 Value *Src0 = II->getArgOperand(0); in visitCallInst()
2380 Value *Src1 = II->getArgOperand(1); in visitCallInst()
2383 replaceOperand(*II, 0, X); in visitCallInst()
2384 replaceOperand(*II, 1, Y); in visitCallInst()
2385 return II; in visitCallInst()
2391 replaceOperand(*II, 0, X); in visitCallInst()
2392 replaceOperand(*II, 1, X); in visitCallInst()
2393 return II; in visitCallInst()
2398 if (Value *V = simplifyFMAFMul(II->getArgOperand(0), II->getArgOperand(1), in visitCallInst()
2399 II->getFastMathFlags(), in visitCallInst()
2400 SQ.getWithInstruction(II))) { in visitCallInst()
2401 auto *FAdd = BinaryOperator::CreateFAdd(V, II->getArgOperand(2)); in visitCallInst()
2402 FAdd->copyFastMathFlags(II); in visitCallInst()
2409 if (match(II->getArgOperand(2), m_NegZeroFP()) || in visitCallInst()
2410 (match(II->getArgOperand(2), m_PosZeroFP()) && in visitCallInst()
2411 II->getFastMathFlags().noSignedZeros())) in visitCallInst()
2412 return BinaryOperator::CreateFMulFMF(Src0, Src1, II); in visitCallInst()
2417 Value *Mag = II->getArgOperand(0), *Sign = II->getArgOperand(1); in visitCallInst()
2421 Value *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Mag, II); in visitCallInst()
2422 return replaceInstUsesWith(*II, Fabs); in visitCallInst()
2429 Value *Fabs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, Mag, II); in visitCallInst()
2430 return replaceInstUsesWith(*II, Builder.CreateFNegFMF(Fabs, II)); in visitCallInst()
2437 return replaceOperand(*II, 1, X); in visitCallInst()
2443 return replaceOperand(*II, 0, X); in visitCallInst()
2449 if (match(II->getArgOperand(0), in visitCallInst()
2453 CallInst *AbsT = Builder.CreateCall(II->getCalledFunction(), {TVal}); in visitCallInst()
2454 CallInst *AbsF = Builder.CreateCall(II->getCalledFunction(), {FVal}); in visitCallInst()
2459 return replaceOperand(*II, 0, FVal); in visitCallInst()
2462 return replaceOperand(*II, 0, TVal); in visitCallInst()
2466 if (match(II->getArgOperand(0), in visitCallInst()
2470 Builder.CreateCall(II->getCalledFunction(), {Magnitude}); in visitCallInst()
2471 AbsSign->copyFastMathFlags(II); in visitCallInst()
2472 return replaceInstUsesWith(*II, AbsSign); in visitCallInst()
2485 if (match(II->getArgOperand(0), m_OneUse(m_FPExt(m_Value(ExtSrc))))) { in visitCallInst()
2487 Value *NarrowII = Builder.CreateUnaryIntrinsic(IID, ExtSrc, II); in visitCallInst()
2488 return new FPExtInst(NarrowII, II->getType()); in visitCallInst()
2495 Value *Src = II->getArgOperand(0); in visitCallInst()
2499 return replaceOperand(*II, 0, X); in visitCallInst()
2505 if (match(II->getArgOperand(0), m_OneUse(m_FNeg(m_Value(X))))) { in visitCallInst()
2507 Value *NewSin = Builder.CreateUnaryIntrinsic(Intrinsic::sin, X, II); in visitCallInst()
2509 FNeg->copyFastMathFlags(II); in visitCallInst()
2527 Value *Src = II->getArgOperand(0); in visitCallInst()
2528 Value *Exp = II->getArgOperand(1); in visitCallInst()
2534 FastMathFlags FMF = II->getFastMathFlags(); in visitCallInst()
2538 signBitMustBeTheSame(Exp, InnerExp, II, DL, &AC, &DT)) { in visitCallInst()
2542 II->setArgOperand(1, NewExp); in visitCallInst()
2543 II->setFastMathFlags(InnerFlags); // Or the inner flags. in visitCallInst()
2544 return replaceOperand(*II, 0, InnerSrc); in visitCallInst()
2554 bool NeedSign = II->getIntrinsicID() == Intrinsic::ptrauth_resign; in visitCallInst()
2555 Value *Key = II->getArgOperand(1); in visitCallInst()
2556 Value *Disc = II->getArgOperand(2); in visitCallInst()
2561 if (auto CI = dyn_cast<CallBase>(II->getArgOperand(0))) { in visitCallInst()
2588 replaceInstUsesWith(*II, BasePtr); in visitCallInst()
2589 eraseInstFromFunction(*II); in visitCallInst()
2601 CallArgs.push_back(II->getArgOperand(3)); in visitCallInst()
2602 CallArgs.push_back(II->getArgOperand(4)); in visitCallInst()
2605 Function *NewFn = Intrinsic::getDeclaration(II->getModule(), NewIntrin); in visitCallInst()
2610 if (Value *V = simplifyNeonTbl1(*II, Builder)) in visitCallInst()
2611 return replaceInstUsesWith(*II, V); in visitCallInst()
2618 Value *Arg0 = II->getArgOperand(0); in visitCallInst()
2619 Value *Arg1 = II->getArgOperand(1); in visitCallInst()
2623 return replaceInstUsesWith(CI, ConstantAggregateZero::get(II->getType())); in visitCallInst()
2629 VectorType *NewVT = cast<VectorType>(II->getType()); in visitCallInst()
2646 return CastInst::CreateIntegerCast(Arg0, II->getType(), in visitCallInst()
2655 Value *DataArg = II->getArgOperand(0); in visitCallInst()
2656 Value *KeyArg = II->getArgOperand(1); in visitCallInst()
2662 replaceOperand(*II, 0, Data); in visitCallInst()
2663 replaceOperand(*II, 1, Key); in visitCallInst()
2664 return II; in visitCallInst()
2671 if (auto Op0 = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) { in visitCallInst()
2676 Value *Bytes = Op0->getArgOperand(1), *Mask = II->getArgOperand(1); in visitCallInst()
2678 uint64_t Mask1 = computeKnownBits(Mask, 0, II).One.getZExtValue(); in visitCallInst()
2682 return replaceInstUsesWith(*II, Op0->getArgOperand(0)); in visitCallInst()
2698 if (auto *II = dyn_cast<IntrinsicInst>(CI)) { in visitCallInst() local
2699 if (II->getIntrinsicID() == Intrinsic::stackrestore) in visitCallInst()
2702 if (II->mayHaveSideEffects()) in visitCallInst()
2716 if (IntrinsicInst *SS = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) { in visitCallInst()
2718 SS->getParent() == II->getParent()) { in visitCallInst()
2721 for (++BI; &*BI != II; ++BI) { in visitCallInst()
2752 BasicBlock::iterator BI(II); in visitCallInst()
2753 Instruction *TI = II->getParent()->getTerminator(); in visitCallInst()
2787 if (II->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) || in visitCallInst()
2788 II->getFunction()->hasFnAttribute(Attribute::SanitizeMemory) || in visitCallInst()
2789 II->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress)) in visitCallInst()
2792 if (removeTriviallyEmptyRange(*II, *this, [](const IntrinsicInst &I) { in visitCallInst()
2798 Value *IIOperand = II->getArgOperand(0); in visitCallInst()
2800 II->getOperandBundlesAsDefs(OpBundles); in visitCallInst()
2807 if (isAssumeWithEmptyBundle(*cast<AssumeInst>(II))) in visitCallInst()
2809 replaceUse(II->getOperandUse(0), ConstantInt::getTrue(II->getContext())); in visitCallInst()
2815 Instruction *Next = II->getNextNonDebugInstruction(); in visitCallInst()
2822 FunctionType *AssumeIntrinsicTy = II->getFunctionType(); in visitCallInst()
2823 Value *AssumeIntrinsic = II->getCalledOperand(); in visitCallInst()
2827 II->getName()); in visitCallInst()
2828 Builder.CreateCall(AssumeIntrinsicTy, AssumeIntrinsic, B, II->getName()); in visitCallInst()
2829 return eraseInstFromFunction(*II); in visitCallInst()
2834 Builder.CreateNot(A), OpBundles, II->getName()); in visitCallInst()
2836 Builder.CreateNot(B), II->getName()); in visitCallInst()
2837 return eraseInstFromFunction(*II); in visitCallInst()
2847 isValidAssumeForContext(II, LHS, &DT)) { in visitCallInst()
2848 MDNode *MD = MDNode::get(II->getContext(), std::nullopt); in visitCallInst()
2851 return RemoveConditionFromAssume(II); in visitCallInst()
2861 for (unsigned Idx = 0; Idx < II->getNumOperandBundles(); Idx++) { in visitCallInst()
2862 OperandBundleUse OBU = II->getOperandBundleAt(Idx); in visitCallInst()
2891 return RemoveConditionFromAssume(II); in visitCallInst()
2921 Replacement->insertAfter(II); in visitCallInst()
2924 return RemoveConditionFromAssume(II); in visitCallInst()
2930 if (EnableKnowledgeRetention && II->hasOperandBundles()) { in visitCallInst()
2931 for (unsigned Idx = 0; Idx < II->getNumOperandBundles(); Idx++) { in visitCallInst()
2932 auto &BOI = II->bundle_op_info_begin()[Idx]; in visitCallInst()
2934 llvm::getKnowledgeFromBundle(cast<AssumeInst>(*II), BOI); in visitCallInst()
2940 llvm::simplifyRetainedKnowledge(cast<AssumeInst>(II), RK, in visitCallInst()
2947 Worklist.pushValue(II->op_begin()[BOI.Begin]); in visitCallInst()
2948 Value::dropDroppableUse(II->op_begin()[BOI.Begin]); in visitCallInst()
2954 II->op_begin()[BOI.Begin].set(CanonRK.WasOn); in visitCallInst()
2956 II->op_begin()[BOI.Begin + 1].set(ConstantInt::get( in visitCallInst()
2957 Type::getInt64Ty(II->getContext()), CanonRK.ArgValue)); in visitCallInst()
2960 return II; in visitCallInst()
2967 computeKnownBits(IIOperand, Known, 0, II); in visitCallInst()
2968 if (Known.isAllOnes() && isAssumeWithEmptyBundle(cast<AssumeInst>(*II))) in visitCallInst()
2969 return eraseInstFromFunction(*II); in visitCallInst()
2973 CreateNonTerminatorUnreachable(II); in visitCallInst()
2974 return eraseInstFromFunction(*II); in visitCallInst()
2979 AC.updateAffectedValues(cast<AssumeInst>(II)); in visitCallInst()
2986 Instruction *NextInst = II->getNextNonDebugInstruction(); in visitCallInst()
2996 Value *CurrCond = II->getArgOperand(0); in visitCallInst()
3001 Instruction *MoveI = II->getNextNonDebugInstruction(); in visitCallInst()
3005 Temp->moveBefore(II); in visitCallInst()
3007 replaceOperand(*II, 0, Builder.CreateAnd(CurrCond, NextCond)); in visitCallInst()
3010 return II; in visitCallInst()
3015 Value *Vec = II->getArgOperand(0); in visitCallInst()
3016 Value *SubVec = II->getArgOperand(1); in visitCallInst()
3017 Value *Idx = II->getArgOperand(2); in visitCallInst()
3018 auto *DstTy = dyn_cast<FixedVectorType>(II->getType()); in visitCallInst()
3061 Value *Vec = II->getArgOperand(0); in visitCallInst()
3062 Value *Idx = II->getArgOperand(1); in visitCallInst()
3064 Type *ReturnType = II->getType(); in visitCallInst()
3118 Value *Vec = II->getArgOperand(0); in visitCallInst()
3127 OldBinOp->getName(), II)); in visitCallInst()
3133 OldBinOp, OldBinOp->getName(), II)); in visitCallInst()
3139 OldBinOp, OldBinOp->getName(), II)); in visitCallInst()
3145 OldUnOp->getOpcode(), X, OldUnOp, OldUnOp->getName(), II); in visitCallInst()
3159 Value *Arg = II->getArgOperand(0); in visitCallInst()
3176 II->getType()); in visitCallInst()
3190 Value *Arg = II->getArgOperand(0); in visitCallInst()
3198 if (Res->getType() != II->getType()) in visitCallInst()
3199 Res = Builder.CreateZExtOrTrunc(Res, II->getType()); in visitCallInst()
3218 Value *Arg = II->getArgOperand(0); in visitCallInst()
3226 II->getType()); in visitCallInst()
3241 Value *Arg = II->getArgOperand(0); in visitCallInst()
3247 if (Res->getType() != II->getType()) in visitCallInst()
3248 Res = Builder.CreateZExt(Res, II->getType()); in visitCallInst()
3265 Value *Arg = II->getArgOperand(0); in visitCallInst()
3275 II->getType()); in visitCallInst()
3300 Value *Arg = II->getArgOperand(0); in visitCallInst()
3313 Res = Builder.CreateCast(ExtOpc, Res, II->getType()); in visitCallInst()
3326 II->hasAllowReassoc(); in visitCallInst()
3331 Value *Arg = II->getArgOperand(ArgIdx); in visitCallInst()
3348 replaceUse(II->getOperandUse(ArgIdx), V); in visitCallInst()
3354 if (Instruction *I = foldIntrinsicIsFPClass(*II)) in visitCallInst()
3360 std::optional<Instruction *> V = targetInstCombineIntrinsic(*II); in visitCallInst()
3383 for (Value *Op : II->args()) in visitCallInst()
3385 if (Instruction *R = FoldOpIntoSelect(*II, Sel)) in visitCallInst()
3392 if (Instruction *Shuf = foldShuffledIntrinsicOperands(II, Builder)) in visitCallInst()
3397 return visitCallBase(*II); in visitCallInst()
3429 Instruction *InstCombinerImpl::visitInvokeInst(InvokeInst &II) { in visitInvokeInst() argument
3430 return visitCallBase(II); in visitInvokeInst()
3475 IntrinsicInst *II = dyn_cast<IntrinsicInst>(U); in findInitTrampolineFromAlloca() local
3476 if (!II) in findInitTrampolineFromAlloca()
3478 if (II->getIntrinsicID() == Intrinsic::init_trampoline) { in findInitTrampolineFromAlloca()
3482 InitTrampoline = II; in findInitTrampolineFromAlloca()
3485 if (II->getIntrinsicID() == Intrinsic::adjust_trampoline) in findInitTrampolineFromAlloca()
3510 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) in findInitTrampolineFromBB() local
3511 if (II->getIntrinsicID() == Intrinsic::init_trampoline && in findInitTrampolineFromBB()
3512 II->getOperand(0) == TrampMem) in findInitTrampolineFromBB()
3513 return II; in findInitTrampolineFromBB()
3683 if (IntrinsicInst *II = findInitTrampoline(Callee)) in visitCallBase() local
3684 return transformCallThroughTrampoline(Call, *II); in visitCallBase()
3911 if (auto *II = dyn_cast<InvokeInst>(Caller)) in transformConstExprCastCall() local
3912 PhisNotSupportedBlock = II->getNormalDest(); in transformConstExprCastCall()
4067 if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) { in transformConstExprCastCall() local
4068 NewCall = Builder.CreateInvoke(Callee, II->getNormalDest(), in transformConstExprCastCall()
4069 II->getUnwindDest(), Args, OpBundles); in transformConstExprCastCall()
4225 if (InvokeInst *II = dyn_cast<InvokeInst>(&Call)) { in transformCallThroughTrampoline() local
4226 NewCaller = InvokeInst::Create(NewFTy, NestF, II->getNormalDest(), in transformCallThroughTrampoline()
4227 II->getUnwindDest(), NewArgs, OpBundles); in transformCallThroughTrampoline()
4228 cast<InvokeInst>(NewCaller)->setCallingConv(II->getCallingConv()); in transformCallThroughTrampoline()