Lines Matching refs:Q

66                                const SimplifyQuery &Q, unsigned MaxRecurse);
148 const SimplifyQuery &Q, unsigned MaxRecurse, in simplifyCmpSelCase() argument
150 Value *SimplifiedCmp = simplifyCmpInst(Pred, LHS, RHS, Q, MaxRecurse); in simplifyCmpSelCase()
165 const SimplifyQuery &Q, in simplifyCmpSelTrueCase() argument
167 return simplifyCmpSelCase(Pred, LHS, RHS, Cond, Q, MaxRecurse, in simplifyCmpSelTrueCase()
174 const SimplifyQuery &Q, in simplifyCmpSelFalseCase() argument
176 return simplifyCmpSelCase(Pred, LHS, RHS, Cond, Q, MaxRecurse, in simplifyCmpSelFalseCase()
184 const SimplifyQuery &Q, in handleOtherCmpSelSimplifications() argument
193 if (Value *V = simplifyAndInst(Cond, TCmp, Q, MaxRecurse)) in handleOtherCmpSelSimplifications()
198 if (Value *V = simplifyOrInst(Cond, FCmp, Q, MaxRecurse)) in handleOtherCmpSelSimplifications()
204 Cond, Constant::getAllOnesValue(Cond->getType()), Q, MaxRecurse)) in handleOtherCmpSelSimplifications()
240 const SimplifyQuery &Q, unsigned MaxRecurse) { in expandBinOp() argument
246 simplifyBinOp(Opcode, B0, OtherOp, Q.getWithoutUndef(), MaxRecurse); in expandBinOp()
250 simplifyBinOp(Opcode, B1, OtherOp, Q.getWithoutUndef(), MaxRecurse); in expandBinOp()
262 Value *S = simplifyBinOp(OpcodeToExpand, L, R, Q, MaxRecurse); in expandBinOp()
275 const SimplifyQuery &Q, in expandCommutativeBinOp() argument
281 if (Value *V = expandBinOp(Opcode, L, R, OpcodeToExpand, Q, MaxRecurse)) in expandCommutativeBinOp()
283 if (Value *V = expandBinOp(Opcode, R, L, OpcodeToExpand, Q, MaxRecurse)) in expandCommutativeBinOp()
292 const SimplifyQuery &Q, in simplifyAssociativeBinOp() argument
310 if (Value *V = simplifyBinOp(Opcode, B, C, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
316 if (Value *W = simplifyBinOp(Opcode, A, V, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
330 if (Value *V = simplifyBinOp(Opcode, A, B, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
336 if (Value *W = simplifyBinOp(Opcode, V, C, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
354 if (Value *V = simplifyBinOp(Opcode, C, A, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
360 if (Value *W = simplifyBinOp(Opcode, V, B, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
374 if (Value *V = simplifyBinOp(Opcode, C, A, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
380 if (Value *W = simplifyBinOp(Opcode, B, V, Q, MaxRecurse)) { in simplifyAssociativeBinOp()
395 Value *RHS, const SimplifyQuery &Q, in threadBinOpOverSelect() argument
413 TV = simplifyBinOp(Opcode, SI->getTrueValue(), RHS, Q, MaxRecurse); in threadBinOpOverSelect()
414 FV = simplifyBinOp(Opcode, SI->getFalseValue(), RHS, Q, MaxRecurse); in threadBinOpOverSelect()
416 TV = simplifyBinOp(Opcode, LHS, SI->getTrueValue(), Q, MaxRecurse); in threadBinOpOverSelect()
417 FV = simplifyBinOp(Opcode, LHS, SI->getFalseValue(), Q, MaxRecurse); in threadBinOpOverSelect()
426 if (TV && Q.isUndefValue(TV)) in threadBinOpOverSelect()
428 if (FV && Q.isUndefValue(FV)) in threadBinOpOverSelect()
473 Value *RHS, const SimplifyQuery &Q, in threadCmpOverSelect() argument
492 Value *TCmp = simplifyCmpSelTrueCase(Pred, TV, RHS, Cond, Q, MaxRecurse); in threadCmpOverSelect()
497 Value *FCmp = simplifyCmpSelFalseCase(Pred, FV, RHS, Cond, Q, MaxRecurse); in threadCmpOverSelect()
509 return handleOtherCmpSelSimplifications(TCmp, FCmp, Cond, Q, MaxRecurse); in threadCmpOverSelect()
519 Value *RHS, const SimplifyQuery &Q, in threadBinOpOverPHI() argument
529 if (!valueDominatesPHI(RHS, PI, Q.DT)) in threadBinOpOverPHI()
535 if (!valueDominatesPHI(LHS, PI, Q.DT)) in threadBinOpOverPHI()
545 Value *V = PI == LHS ? simplifyBinOp(Opcode, Incoming, RHS, Q, MaxRecurse) in threadBinOpOverPHI()
546 : simplifyBinOp(Opcode, LHS, Incoming, Q, MaxRecurse); in threadBinOpOverPHI()
562 const SimplifyQuery &Q, unsigned MaxRecurse) { in threadCmpOverPHI() argument
576 if (!valueDominatesPHI(RHS, PI, Q.DT)) in threadCmpOverPHI()
590 Value *V = simplifyCmpInst(Pred, Incoming, RHS, Q.getWithInstruction(InTI), in threadCmpOverPHI()
604 const SimplifyQuery &Q) { in foldOrCommuteConstant() argument
615 if (Q.CxtI != nullptr) in foldOrCommuteConstant()
616 return ConstantFoldFPInstOperands(Opcode, CLHS, CRHS, Q.DL, Q.CxtI); in foldOrCommuteConstant()
618 return ConstantFoldBinaryOpOperands(Opcode, CLHS, CRHS, Q.DL); in foldOrCommuteConstant()
631 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyAddInst() argument
632 if (Constant *C = foldOrCommuteConstant(Instruction::Add, Op0, Op1, Q)) in simplifyAddInst()
640 if (Q.isUndefValue(Op1)) in simplifyAddInst()
677 if (Value *V = simplifyXorInst(Op0, Op1, Q, MaxRecurse - 1)) in simplifyAddInst()
682 simplifyAssociativeBinOp(Instruction::Add, Op0, Op1, Q, MaxRecurse)) in simplifyAddInst()
747 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifySubInst() argument
748 if (Constant *C = foldOrCommuteConstant(Instruction::Sub, Op0, Op1, Q)) in simplifySubInst()
758 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifySubInst()
775 KnownBits Known = computeKnownBits(Op1, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifySubInst()
792 if (Value *V = simplifyBinOp(Instruction::Sub, Y, Z, Q, MaxRecurse - 1)) in simplifySubInst()
794 if (Value *W = simplifyBinOp(Instruction::Add, X, V, Q, MaxRecurse - 1)) { in simplifySubInst()
800 if (Value *V = simplifyBinOp(Instruction::Sub, X, Z, Q, MaxRecurse - 1)) in simplifySubInst()
802 if (Value *W = simplifyBinOp(Instruction::Add, Y, V, Q, MaxRecurse - 1)) { in simplifySubInst()
814 if (Value *V = simplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse - 1)) in simplifySubInst()
816 if (Value *W = simplifyBinOp(Instruction::Sub, V, Z, Q, MaxRecurse - 1)) { in simplifySubInst()
822 if (Value *V = simplifyBinOp(Instruction::Sub, X, Z, Q, MaxRecurse - 1)) in simplifySubInst()
824 if (Value *W = simplifyBinOp(Instruction::Sub, V, Y, Q, MaxRecurse - 1)) { in simplifySubInst()
836 if (Value *V = simplifyBinOp(Instruction::Sub, Z, X, Q, MaxRecurse - 1)) in simplifySubInst()
838 if (Value *W = simplifyBinOp(Instruction::Add, V, Y, Q, MaxRecurse - 1)) { in simplifySubInst()
849 if (Value *V = simplifyBinOp(Instruction::Sub, X, Y, Q, MaxRecurse - 1)) in simplifySubInst()
852 Q, MaxRecurse - 1)) in simplifySubInst()
858 if (Constant *Result = computePointerDifference(Q.DL, X, Y)) in simplifySubInst()
863 if (Value *V = simplifyXorInst(Op0, Op1, Q, MaxRecurse - 1)) in simplifySubInst()
879 const SimplifyQuery &Q) { in simplifySubInst() argument
880 return ::simplifySubInst(Op0, Op1, isNSW, isNUW, Q, RecursionLimit); in simplifySubInst()
885 static Value *simplifyMulInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyMulInst() argument
887 if (Constant *C = foldOrCommuteConstant(Instruction::Mul, Op0, Op1, Q)) in simplifyMulInst()
896 if (Q.isUndefValue(Op1) || match(Op1, m_Zero())) in simplifyMulInst()
905 if (Q.IIQ.UseInstrInfo && in simplifyMulInst()
913 if (Value *V = simplifyAndInst(Op0, Op1, Q, MaxRecurse - 1)) in simplifyMulInst()
918 simplifyAssociativeBinOp(Instruction::Mul, Op0, Op1, Q, MaxRecurse)) in simplifyMulInst()
923 Instruction::Add, Q, MaxRecurse)) in simplifyMulInst()
930 threadBinOpOverSelect(Instruction::Mul, Op0, Op1, Q, MaxRecurse)) in simplifyMulInst()
937 threadBinOpOverPHI(Instruction::Mul, Op0, Op1, Q, MaxRecurse)) in simplifyMulInst()
943 Value *llvm::simplifyMulInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyMulInst() argument
944 return ::simplifyMulInst(Op0, Op1, Q, RecursionLimit); in simplifyMulInst()
950 Value *Op1, const SimplifyQuery &Q) { in simplifyDivRem() argument
958 if (Q.isUndefValue(Op1) || isa<PoisonValue>(Op1)) in simplifyDivRem()
975 if (Elt && (Elt->isNullValue() || Q.isUndefValue(Elt))) in simplifyDivRem()
987 if (Q.isUndefValue(Op0)) in simplifyDivRem()
1017 if ((IsSigned && Q.IIQ.hasNoSignedWrap(Mul)) || in simplifyDivRem()
1018 (!IsSigned && Q.IIQ.hasNoUnsignedWrap(Mul)) || in simplifyDivRem()
1032 const SimplifyQuery &Q, unsigned MaxRecurse) { in isICmpTrue() argument
1033 Value *V = simplifyICmpInst(Pred, LHS, RHS, Q, MaxRecurse); in isICmpTrue()
1040 static bool isDivZero(Value *X, Value *Y, const SimplifyQuery &Q, in isDivZero() argument
1062 if (isICmpTrue(CmpInst::ICMP_SLT, Y, NegDividendC, Q, MaxRecurse) || in isDivZero()
1063 isICmpTrue(CmpInst::ICMP_SGT, Y, PosDividendC, Q, MaxRecurse)) in isDivZero()
1071 return isICmpTrue(CmpInst::ICMP_NE, X, Y, Q, MaxRecurse); in isDivZero()
1078 if (isICmpTrue(CmpInst::ICMP_SGT, X, NegDivisorC, Q, MaxRecurse) && in isDivZero()
1079 isICmpTrue(CmpInst::ICMP_SLT, X, PosDivisorC, Q, MaxRecurse)) in isDivZero()
1092 computeKnownBits(X, Q.DL, 0, Q.AC, Q.CxtI, Q.DT).getMaxValue().ult(*C)) in isDivZero()
1097 return isICmpTrue(ICmpInst::ICMP_ULT, X, Y, Q, MaxRecurse); in isDivZero()
1102 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyDiv() argument
1103 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q)) in simplifyDiv()
1106 if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q)) in simplifyDiv()
1129 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyDiv()
1135 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyDiv()
1138 if (isDivZero(Op0, Op1, Q, MaxRecurse, IsSigned)) in simplifyDiv()
1146 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyRem() argument
1147 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q)) in simplifyRem()
1150 if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q)) in simplifyRem()
1161 if (Q.IIQ.UseInstrInfo && in simplifyRem()
1171 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyRem()
1177 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyRem()
1181 if (isDivZero(Op0, Op1, Q, MaxRecurse, Opcode == Instruction::SRem)) in simplifyRem()
1189 static Value *simplifySDivInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifySDivInst() argument
1195 return simplifyDiv(Instruction::SDiv, Op0, Op1, Q, MaxRecurse); in simplifySDivInst()
1198 Value *llvm::simplifySDivInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifySDivInst() argument
1199 return ::simplifySDivInst(Op0, Op1, Q, RecursionLimit); in simplifySDivInst()
1204 static Value *simplifyUDivInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyUDivInst() argument
1206 return simplifyDiv(Instruction::UDiv, Op0, Op1, Q, MaxRecurse); in simplifyUDivInst()
1209 Value *llvm::simplifyUDivInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyUDivInst() argument
1210 return ::simplifyUDivInst(Op0, Op1, Q, RecursionLimit); in simplifyUDivInst()
1215 static Value *simplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifySRemInst() argument
1227 return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse); in simplifySRemInst()
1230 Value *llvm::simplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifySRemInst() argument
1231 return ::simplifySRemInst(Op0, Op1, Q, RecursionLimit); in simplifySRemInst()
1236 static Value *simplifyURemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyURemInst() argument
1238 return simplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse); in simplifyURemInst()
1241 Value *llvm::simplifyURemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyURemInst() argument
1242 return ::simplifyURemInst(Op0, Op1, Q, RecursionLimit); in simplifyURemInst()
1246 static bool isPoisonShift(Value *Amount, const SimplifyQuery &Q) { in isPoisonShift() argument
1252 if (Q.isUndefValue(C)) in isPoisonShift()
1265 if (!isPoisonShift(C->getAggregateElement(I), Q)) in isPoisonShift()
1276 Value *Op1, bool IsNSW, const SimplifyQuery &Q, in simplifyShift() argument
1278 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q)) in simplifyShift()
1298 if (isPoisonShift(Op1, Q)) in simplifyShift()
1304 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyShift()
1310 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyShift()
1315 KnownBits KnownAmt = computeKnownBits(Op1, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyShift()
1328 KnownBits KnownVal = computeKnownBits(Op0, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyShift()
1347 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyRightShift() argument
1349 simplifyShift(Opcode, Op0, Op1, /*IsNSW*/ false, Q, MaxRecurse)) in simplifyRightShift()
1358 if (Q.isUndefValue(Op0)) in simplifyRightShift()
1364 computeKnownBits(Op0, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT); in simplifyRightShift()
1375 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyShlInst() argument
1377 simplifyShift(Instruction::Shl, Op0, Op1, isNSW, Q, MaxRecurse)) in simplifyShlInst()
1382 if (Q.isUndefValue(Op0)) in simplifyShlInst()
1387 if (Q.IIQ.UseInstrInfo && in simplifyShlInst()
1401 const SimplifyQuery &Q) { in simplifyShlInst() argument
1402 return ::simplifyShlInst(Op0, Op1, isNSW, isNUW, Q, RecursionLimit); in simplifyShlInst()
1408 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyLShrInst() argument
1409 if (Value *V = simplifyRightShift(Instruction::LShr, Op0, Op1, isExact, Q, in simplifyLShrInst()
1428 const KnownBits YKnown = computeKnownBits(Y, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyLShrInst()
1438 const SimplifyQuery &Q) { in simplifyLShrInst() argument
1439 return ::simplifyLShrInst(Op0, Op1, isExact, Q, RecursionLimit); in simplifyLShrInst()
1445 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyAShrInst() argument
1446 if (Value *V = simplifyRightShift(Instruction::AShr, Op0, Op1, isExact, Q, in simplifyAShrInst()
1459 if (Q.IIQ.UseInstrInfo && match(Op0, m_NSWShl(m_Value(X), m_Specific(Op1)))) in simplifyAShrInst()
1463 unsigned NumSignBits = ComputeNumSignBits(Op0, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyAShrInst()
1471 const SimplifyQuery &Q) { in simplifyAShrInst() argument
1472 return ::simplifyAShrInst(Op0, Op1, isExact, Q, RecursionLimit); in simplifyAShrInst()
1479 const SimplifyQuery &Q) { in simplifyUnsignedRangeCheck() argument
1526 isKnownNonZero(B, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) in simplifyUnsignedRangeCheck()
1530 isKnownNonZero(B, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) in simplifyUnsignedRangeCheck()
1548 isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) in simplifyUnsignedRangeCheck()
1554 isKnownNonZero(X, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT)) in simplifyUnsignedRangeCheck()
1830 const SimplifyQuery &Q) { in simplifyAndOfICmps() argument
1831 if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true, Q)) in simplifyAndOfICmps()
1833 if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/true, Q)) in simplifyAndOfICmps()
1855 if (Value *X = simplifyAndOfICmpsWithAdd(Op0, Op1, Q.IIQ)) in simplifyAndOfICmps()
1857 if (Value *X = simplifyAndOfICmpsWithAdd(Op1, Op0, Q.IIQ)) in simplifyAndOfICmps()
1911 const SimplifyQuery &Q) { in simplifyOrOfICmps() argument
1912 if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/false, Q)) in simplifyOrOfICmps()
1914 if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/false, Q)) in simplifyOrOfICmps()
1936 if (Value *X = simplifyOrOfICmpsWithAdd(Op0, Op1, Q.IIQ)) in simplifyOrOfICmps()
1938 if (Value *X = simplifyOrOfICmpsWithAdd(Op1, Op0, Q.IIQ)) in simplifyOrOfICmps()
1982 static Value *simplifyAndOrOfCmps(const SimplifyQuery &Q, Value *Op0, in simplifyAndOrOfCmps() argument
1997 V = IsAnd ? simplifyAndOfICmps(ICmp0, ICmp1, Q) in simplifyAndOrOfCmps()
1998 : simplifyOrOfICmps(ICmp0, ICmp1, Q); in simplifyAndOrOfCmps()
2003 V = simplifyAndOrOfFCmps(Q.TLI, FCmp0, FCmp1, IsAnd); in simplifyAndOrOfCmps()
2044 static Value *simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyAndInst() argument
2046 if (Constant *C = foldOrCommuteConstant(Instruction::And, Op0, Op1, Q)) in simplifyAndInst()
2054 if (Q.isUndefValue(Op1)) in simplifyAndInst()
2121 if (isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, in simplifyAndInst()
2122 Q.DT)) in simplifyAndInst()
2124 if (isKnownToBeAPowerOfTwo(Op1, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, in simplifyAndInst()
2125 Q.DT)) in simplifyAndInst()
2133 isKnownToBeAPowerOfTwo(Op1, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyAndInst()
2136 isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyAndInst()
2139 if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, true)) in simplifyAndInst()
2144 simplifyAssociativeBinOp(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2149 Instruction::Or, Q, MaxRecurse)) in simplifyAndInst()
2154 Instruction::Xor, Q, MaxRecurse)) in simplifyAndInst()
2169 threadBinOpOverSelect(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2177 threadBinOpOverPHI(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2197 const KnownBits YKnown = computeKnownBits(Y, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyAndInst()
2200 const KnownBits XKnown = computeKnownBits(X, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyAndInst()
2224 if (isImpliedCondition(Op0, Op1, Q.DL).value_or(false)) in simplifyAndInst()
2227 if (isImpliedCondition(Op1, Op0, Q.DL).value_or(false)) in simplifyAndInst()
2234 Value *llvm::simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyAndInst() argument
2235 return ::simplifyAndInst(Op0, Op1, Q, RecursionLimit); in simplifyAndInst()
2323 static Value *simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyOrInst() argument
2325 if (Constant *C = foldOrCommuteConstant(Instruction::Or, Op0, Op1, Q)) in simplifyOrInst()
2335 if (Q.isUndefValue(Op1) || match(Op1, m_AllOnes())) in simplifyOrInst()
2393 if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, false)) in simplifyOrInst()
2406 simplifyAssociativeBinOp(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2411 Instruction::And, Q, MaxRecurse)) in simplifyOrInst()
2426 threadBinOpOverSelect(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2444 if (MaskedValueIsZero(N, *C2, Q.DL, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyOrInst()
2450 if (MaskedValueIsZero(N, *C1, Q.DL, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyOrInst()
2459 if (Value *V = threadBinOpOverPHI(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2464 if (isImpliedCondition(Op0, Op1, Q.DL).value_or(false)) in simplifyOrInst()
2467 if (isImpliedCondition(Op1, Op0, Q.DL).value_or(false)) in simplifyOrInst()
2474 Value *llvm::simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyOrInst() argument
2475 return ::simplifyOrInst(Op0, Op1, Q, RecursionLimit); in simplifyOrInst()
2480 static Value *simplifyXorInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyXorInst() argument
2482 if (Constant *C = foldOrCommuteConstant(Instruction::Xor, Op0, Op1, Q)) in simplifyXorInst()
2490 if (Q.isUndefValue(Op1)) in simplifyXorInst()
2534 simplifyAssociativeBinOp(Instruction::Xor, Op0, Op1, Q, MaxRecurse)) in simplifyXorInst()
2549 Value *llvm::simplifyXorInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyXorInst() argument
2550 return ::simplifyXorInst(Op0, Op1, Q, RecursionLimit); in simplifyXorInst()
2670 Value *RHS, const SimplifyQuery &Q) { in computePointerICmp() argument
2671 const DataLayout &DL = Q.DL; in computePointerICmp()
2672 const TargetLibraryInfo *TLI = Q.TLI; in computePointerICmp()
2673 const DominatorTree *DT = Q.DT; in computePointerICmp()
2674 const Instruction *CxtI = Q.CxtI; in computePointerICmp()
2675 const InstrInfoQuery &IIQ = Q.IIQ; in computePointerICmp()
2807 Value *RHS, const SimplifyQuery &Q) { in simplifyICmpOfBools() argument
2880 if (isImpliedCondition(RHS, LHS, Q.DL).value_or(false)) in simplifyICmpOfBools()
2891 if (isImpliedCondition(LHS, RHS, Q.DL).value_or(false)) in simplifyICmpOfBools()
2895 if (isImpliedCondition(LHS, RHS, Q.DL).value_or(false)) in simplifyICmpOfBools()
2905 Value *RHS, const SimplifyQuery &Q) { in simplifyICmpWithZero() argument
2919 if (isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT, Q.IIQ.UseInstrInfo)) in simplifyICmpWithZero()
2924 if (isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT, Q.IIQ.UseInstrInfo)) in simplifyICmpWithZero()
2928 KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithZero()
2936 KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithZero()
2940 isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyICmpWithZero()
2945 KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithZero()
2953 KnownBits LHSKnown = computeKnownBits(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithZero()
2957 isKnownNonZero(LHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyICmpWithZero()
3017 const SimplifyQuery &Q, in simplifyICmpWithBinOpOnLHS() argument
3030 KnownBits RHSKnown = computeKnownBits(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithBinOpOnLHS()
3031 KnownBits YKnown = computeKnownBits(Y, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithBinOpOnLHS()
3054 KnownBits Known = computeKnownBits(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithBinOpOnLHS()
3065 KnownBits Known = computeKnownBits(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyICmpWithBinOpOnLHS()
3111 if (isKnownNonZero(RHS, Q.DL, 0, Q.AC, Q.CxtI, Q.DT)) { in simplifyICmpWithBinOpOnLHS()
3192 Value *RHS, const SimplifyQuery &Q, in simplifyICmpWithBinOp() argument
3207 Q.IIQ.hasNoUnsignedWrap(cast<OverflowingBinaryOperator>(LBO))) || in simplifyICmpWithBinOp()
3209 Q.IIQ.hasNoSignedWrap(cast<OverflowingBinaryOperator>(LBO))); in simplifyICmpWithBinOp()
3217 Q.IIQ.hasNoUnsignedWrap(cast<OverflowingBinaryOperator>(RBO))) || in simplifyICmpWithBinOp()
3219 Q.IIQ.hasNoSignedWrap(cast<OverflowingBinaryOperator>(RBO))); in simplifyICmpWithBinOp()
3225 Constant::getNullValue(RHS->getType()), Q, in simplifyICmpWithBinOp()
3233 C == LHS ? D : C, Q, MaxRecurse - 1)) in simplifyICmpWithBinOp()
3260 if (Value *V = simplifyICmpInst(Pred, Y, Z, Q, MaxRecurse - 1)) in simplifyICmpWithBinOp()
3266 if (Value *V = simplifyICmpWithBinOpOnLHS(Pred, LBO, RHS, Q, MaxRecurse)) in simplifyICmpWithBinOp()
3271 ICmpInst::getSwappedPredicate(Pred), RBO, LHS, Q, MaxRecurse)) in simplifyICmpWithBinOp()
3307 if (Q.IIQ.hasNoSignedWrap(cast<OverflowingBinaryOperator>(LBO)) || in simplifyICmpWithBinOp()
3308 Q.IIQ.hasNoUnsignedWrap(cast<OverflowingBinaryOperator>(LBO)) || in simplifyICmpWithBinOp()
3334 if (ICmpInst::isSigned(Pred) || !Q.IIQ.isExact(LBO) || in simplifyICmpWithBinOp()
3335 !Q.IIQ.isExact(RBO)) in simplifyICmpWithBinOp()
3338 RBO->getOperand(0), Q, MaxRecurse - 1)) in simplifyICmpWithBinOp()
3342 if (!ICmpInst::isEquality(Pred) || !Q.IIQ.isExact(LBO) || in simplifyICmpWithBinOp()
3343 !Q.IIQ.isExact(RBO)) in simplifyICmpWithBinOp()
3346 RBO->getOperand(0), Q, MaxRecurse - 1)) in simplifyICmpWithBinOp()
3350 if (!Q.IIQ.isExact(LBO) || !Q.IIQ.isExact(RBO)) in simplifyICmpWithBinOp()
3353 RBO->getOperand(0), Q, MaxRecurse - 1)) in simplifyICmpWithBinOp()
3357 bool NUW = Q.IIQ.hasNoUnsignedWrap(LBO) && Q.IIQ.hasNoUnsignedWrap(RBO); in simplifyICmpWithBinOp()
3358 bool NSW = Q.IIQ.hasNoSignedWrap(LBO) && Q.IIQ.hasNoSignedWrap(RBO); in simplifyICmpWithBinOp()
3364 RBO->getOperand(0), Q, MaxRecurse - 1)) in simplifyICmpWithBinOp()
3376 Value *RHS, const SimplifyQuery &Q, in simplifyICmpWithMinMax() argument
3429 if (Value *V = simplifyICmpInst(EqP, A, B, Q, MaxRecurse - 1)) in simplifyICmpWithMinMax()
3443 if (Value *V = simplifyICmpInst(InvEqP, A, B, Q, MaxRecurse - 1)) in simplifyICmpWithMinMax()
3503 if (Value *V = simplifyICmpInst(EqP, A, B, Q, MaxRecurse - 1)) in simplifyICmpWithMinMax()
3517 if (Value *V = simplifyICmpInst(InvEqP, A, B, Q, MaxRecurse - 1)) in simplifyICmpWithMinMax()
3562 const SimplifyQuery &Q) { in simplifyICmpWithDominatingAssume() argument
3564 if (!Q.AC || !Q.CxtI || !Q.CxtI->getParent()) in simplifyICmpWithDominatingAssume()
3568 for (auto &AssumeVH : Q.AC->assumptionsFor(AssumeBaseOp)) { in simplifyICmpWithDominatingAssume()
3574 Predicate, LHS, RHS, Q.DL)) in simplifyICmpWithDominatingAssume()
3575 if (isValidAssumeForContext(Assume, Q.CxtI, Q.DT)) in simplifyICmpWithDominatingAssume()
3586 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyICmpInst() argument
3592 return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.DL, Q.TLI); in simplifyICmpInst()
3609 if (Q.isUndefValue(RHS) && ICmpInst::isEquality(Pred)) in simplifyICmpInst()
3614 if (LHS == RHS || Q.isUndefValue(RHS)) in simplifyICmpInst()
3617 if (Value *V = simplifyICmpOfBools(Pred, LHS, RHS, Q)) in simplifyICmpInst()
3622 if (Value *V = simplifyICmpWithZero(Pred, LHS, RHS, Q)) in simplifyICmpInst()
3625 if (Value *V = simplifyICmpWithConstant(Pred, LHS, RHS, Q.IIQ)) in simplifyICmpInst()
3634 if (Q.IIQ.getMetadata(RHS_Instr, LLVMContext::MD_range) && in simplifyICmpInst()
3635 Q.IIQ.getMetadata(LHS_Instr, LLVMContext::MD_range)) { in simplifyICmpInst()
3659 Q.DL.getTypeSizeInBits(SrcTy) == DstTy->getPrimitiveSizeInBits()) { in simplifyICmpInst()
3664 Q, MaxRecurse - 1)) in simplifyICmpInst()
3669 if (Value *V = simplifyICmpInst(Pred, SrcOp, RI->getOperand(0), Q, in simplifyICmpInst()
3683 RI->getOperand(0), Q, MaxRecurse - 1)) in simplifyICmpInst()
3707 SrcOp, Trunc, Q, MaxRecurse - 1)) in simplifyICmpInst()
3751 if (Value *V = simplifyICmpInst(Pred, SrcOp, RI->getOperand(0), Q, in simplifyICmpInst()
3776 simplifyICmpInst(Pred, SrcOp, Trunc, Q, MaxRecurse - 1)) in simplifyICmpInst()
3810 Constant::getNullValue(SrcTy), Q, in simplifyICmpInst()
3819 Constant::getNullValue(SrcTy), Q, in simplifyICmpInst()
3833 isKnownNonEqual(LHS, RHS, Q.DL, Q.AC, Q.CxtI, Q.DT, Q.IIQ.UseInstrInfo)) { in simplifyICmpInst()
3837 if (Value *V = simplifyICmpWithBinOp(Pred, LHS, RHS, Q, MaxRecurse)) in simplifyICmpInst()
3840 if (Value *V = simplifyICmpWithMinMax(Pred, LHS, RHS, Q, MaxRecurse)) in simplifyICmpInst()
3843 if (Value *V = simplifyICmpWithDominatingAssume(Pred, LHS, RHS, Q)) in simplifyICmpInst()
3849 if (auto *C = computePointerICmp(Pred, LHS, RHS, Q)) in simplifyICmpInst()
3853 if (Q.DL.getTypeSizeInBits(CLHS->getPointerOperandType()) == in simplifyICmpInst()
3854 Q.DL.getTypeSizeInBits(CLHS->getType()) && in simplifyICmpInst()
3855 Q.DL.getTypeSizeInBits(CRHS->getPointerOperandType()) == in simplifyICmpInst()
3856 Q.DL.getTypeSizeInBits(CRHS->getType())) in simplifyICmpInst()
3858 CRHS->getPointerOperand(), Q)) in simplifyICmpInst()
3864 if (Value *V = threadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse)) in simplifyICmpInst()
3870 if (Value *V = threadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse)) in simplifyICmpInst()
3877 const SimplifyQuery &Q) { in simplifyICmpInst() argument
3878 return ::simplifyICmpInst(Predicate, LHS, RHS, Q, RecursionLimit); in simplifyICmpInst()
3884 FastMathFlags FMF, const SimplifyQuery &Q, in simplifyFCmpInst() argument
3891 return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, Q.DL, Q.TLI, in simplifyFCmpInst()
3892 Q.CxtI); in simplifyFCmpInst()
3909 (isKnownNeverNaN(LHS, Q.TLI) && isKnownNeverNaN(RHS, Q.TLI))) in simplifyFCmpInst()
3925 if (Q.isUndefValue(LHS) || Q.isUndefValue(RHS)) { in simplifyFCmpInst()
3971 if (Pred == FCmpInst::FCMP_OEQ && isKnownNeverInfinity(LHS, Q.TLI)) in simplifyFCmpInst()
3974 if (Pred == FCmpInst::FCMP_UNE && isKnownNeverInfinity(LHS, Q.TLI)) in simplifyFCmpInst()
3977 if (Pred == FCmpInst::FCMP_UEQ && isKnownNeverInfinity(LHS, Q.TLI) && in simplifyFCmpInst()
3978 isKnownNeverNaN(LHS, Q.TLI)) in simplifyFCmpInst()
3981 if (Pred == FCmpInst::FCMP_ONE && isKnownNeverInfinity(LHS, Q.TLI) && in simplifyFCmpInst()
3982 isKnownNeverNaN(LHS, Q.TLI)) in simplifyFCmpInst()
3994 if (CannotBeOrderedLessThanZero(LHS, Q.TLI)) in simplifyFCmpInst()
4001 if (CannotBeOrderedLessThanZero(LHS, Q.TLI)) in simplifyFCmpInst()
4061 if ((FMF.noNaNs() || isKnownNeverNaN(LHS, Q.TLI)) && in simplifyFCmpInst()
4062 CannotBeOrderedLessThanZero(LHS, Q.TLI)) in simplifyFCmpInst()
4069 if (CannotBeOrderedLessThanZero(LHS, Q.TLI)) in simplifyFCmpInst()
4080 if (Value *V = threadCmpOverSelect(Pred, LHS, RHS, Q, MaxRecurse)) in simplifyFCmpInst()
4086 if (Value *V = threadCmpOverPHI(Pred, LHS, RHS, Q, MaxRecurse)) in simplifyFCmpInst()
4093 FastMathFlags FMF, const SimplifyQuery &Q) { in simplifyFCmpInst() argument
4094 return ::simplifyFCmpInst(Predicate, LHS, RHS, FMF, Q, RecursionLimit); in simplifyFCmpInst()
4098 const SimplifyQuery &Q, in simplifyWithOpReplaced() argument
4162 NewOps[1], Q, MaxRecurse - 1)); in simplifyWithOpReplaced()
4166 NewOps[1], Q, MaxRecurse - 1)); in simplifyWithOpReplaced()
4171 GEP->isInBounds(), Q, MaxRecurse - 1)); in simplifyWithOpReplaced()
4175 NewOps[0], NewOps[1], NewOps[2], Q, MaxRecurse - 1)); in simplifyWithOpReplaced()
4201 return ConstantFoldInstOperands(I, ConstOps, Q.DL, Q.TLI); in simplifyWithOpReplaced()
4205 const SimplifyQuery &Q, in simplifyWithOpReplaced() argument
4207 return ::simplifyWithOpReplaced(V, Op, RepOp, Q, AllowRefinement, in simplifyWithOpReplaced()
4264 const SimplifyQuery &Q, in simplifySelectWithICmpCond() argument
4347 if (simplifyWithOpReplaced(FalseVal, CmpLHS, CmpRHS, Q, in simplifySelectWithICmpCond()
4350 simplifyWithOpReplaced(FalseVal, CmpRHS, CmpLHS, Q, in simplifySelectWithICmpCond()
4354 if (simplifyWithOpReplaced(TrueVal, CmpLHS, CmpRHS, Q, in simplifySelectWithICmpCond()
4357 simplifyWithOpReplaced(TrueVal, CmpRHS, CmpLHS, Q, in simplifySelectWithICmpCond()
4369 const SimplifyQuery &Q) { in simplifySelectWithFCmp() argument
4379 Q.CxtI && isa<FPMathOperator>(Q.CxtI) && Q.CxtI->hasNoSignedZeros(); in simplifySelectWithFCmp()
4400 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifySelectInst() argument
4411 if (Q.isUndefValue(CondC)) in simplifySelectInst()
4456 (Q.isUndefValue(TrueVal) && in simplifySelectInst()
4457 isGuaranteedNotToBePoison(FalseVal, Q.AC, Q.CxtI, Q.DT))) in simplifySelectInst()
4462 (Q.isUndefValue(FalseVal) && in simplifySelectInst()
4463 isGuaranteedNotToBePoison(TrueVal, Q.AC, Q.CxtI, Q.DT))) in simplifySelectInst()
4486 (Q.isUndefValue(TEltC) && isGuaranteedNotToBePoison(FEltC))) in simplifySelectInst()
4489 (Q.isUndefValue(FEltC) && isGuaranteedNotToBePoison(TEltC))) in simplifySelectInst()
4499 simplifySelectWithICmpCond(Cond, TrueVal, FalseVal, Q, MaxRecurse)) in simplifySelectInst()
4502 if (Value *V = simplifySelectWithFCmp(Cond, TrueVal, FalseVal, Q)) in simplifySelectInst()
4508 Optional<bool> Imp = isImpliedByDomCondition(Cond, Q.CxtI, Q.DL); in simplifySelectInst()
4516 const SimplifyQuery &Q) { in simplifySelectInst() argument
4517 return ::simplifySelectInst(Cond, TrueVal, FalseVal, Q, RecursionLimit); in simplifySelectInst()
4524 const SimplifyQuery &Q, unsigned) { in simplifyGEPInst() argument
4562 if (Q.isUndefValue(Ptr)) in simplifyGEPInst()
4580 uint64_t TyAllocSize = Q.DL.getTypeAllocSize(Ty); in simplifyGEPInst()
4588 Q.DL.getPointerSizeInBits(AS)) { in simplifyGEPInst()
4619 if (!IsScalableVec && Q.DL.getTypeAllocSize(LastType) == 1 && in simplifyGEPInst()
4623 Q.DL.getIndexSizeInBits(Ptr->getType()->getPointerAddressSpace()); in simplifyGEPInst()
4624 if (Q.DL.getTypeSizeInBits(Indices.back()->getType()) == IdxWidth) { in simplifyGEPInst()
4627 Ptr->stripAndAccumulateInBoundsConstantOffsets(Q.DL, BasePtrOffset); in simplifyGEPInst()
4657 return ConstantFoldConstant(CE, Q.DL); in simplifyGEPInst()
4661 bool InBounds, const SimplifyQuery &Q) { in simplifyGEPInst() argument
4662 return ::simplifyGEPInst(SrcTy, Ptr, Indices, InBounds, Q, RecursionLimit); in simplifyGEPInst()
4669 const SimplifyQuery &Q, unsigned) { in simplifyInsertValueInst() argument
4675 if (Q.isUndefValue(Val)) in simplifyInsertValueInst()
4683 if (Q.isUndefValue(Agg)) in simplifyInsertValueInst()
4696 const SimplifyQuery &Q) { in simplifyInsertValueInst() argument
4697 return ::simplifyInsertValueInst(Agg, Val, Idxs, Q, RecursionLimit); in simplifyInsertValueInst()
4701 const SimplifyQuery &Q) { in simplifyInsertElementInst() argument
4717 if (Q.isUndefValue(Idx)) in simplifyInsertElementInst()
4723 (Q.isUndefValue(Val) && isGuaranteedNotToBePoison(Vec))) in simplifyInsertElementInst()
4761 const SimplifyQuery &Q) { in simplifyExtractValueInst() argument
4762 return ::simplifyExtractValueInst(Agg, Idxs, Q, RecursionLimit); in simplifyExtractValueInst()
4768 const SimplifyQuery &Q, unsigned) { in simplifyExtractElementInst() argument
4774 if (Q.isUndefValue(Vec)) in simplifyExtractElementInst()
4780 if (Q.isUndefValue(Idx)) in simplifyExtractElementInst()
4805 const SimplifyQuery &Q) { in simplifyExtractElementInst() argument
4806 return ::simplifyExtractElementInst(Vec, Idx, Q, RecursionLimit); in simplifyExtractElementInst()
4811 const SimplifyQuery &Q) { in simplifyPHINode() argument
4824 if (Q.isUndefValue(Incoming)) { in simplifyPHINode()
4843 return valueDominatesPHI(CommonValue, PN, Q.DT) ? CommonValue : nullptr; in simplifyPHINode()
4850 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyCastInst() argument
4852 return ConstantFoldCastOperand(CastOpc, C, Ty, Q.DL); in simplifyCastInst()
4863 SrcTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(SrcTy) : nullptr; in simplifyCastInst()
4865 MidTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(MidTy) : nullptr; in simplifyCastInst()
4867 DstTy->isPtrOrPtrVectorTy() ? Q.DL.getIntPtrType(DstTy) : nullptr; in simplifyCastInst()
4884 const SimplifyQuery &Q) { in simplifyCastInst() argument
4885 return ::simplifyCastInst(CastOpc, Op, Ty, Q, RecursionLimit); in simplifyCastInst()
4941 const SimplifyQuery &Q, in simplifyShuffleVectorInst() argument
5021 if (Q.isUndefValue(Op1) && RetTy == InVecTy && in simplifyShuffleVectorInst()
5057 const SimplifyQuery &Q) { in simplifyShuffleVectorInst() argument
5058 return ::simplifyShuffleVectorInst(Op0, Op1, Mask, RetTy, Q, RecursionLimit); in simplifyShuffleVectorInst()
5062 const SimplifyQuery &Q) { in foldConstant() argument
5064 return ConstantFoldUnaryOpOperand(Opcode, C, Q.DL); in foldConstant()
5071 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyFNegInst() argument
5072 if (Constant *C = foldConstant(Instruction::FNeg, Op, Q)) in simplifyFNegInst()
5084 const SimplifyQuery &Q) { in simplifyFNegInst() argument
5085 return ::simplifyFNegInst(Op, FMF, Q, RecursionLimit); in simplifyFNegInst()
5102 const SimplifyQuery &Q, in simplifyFPOp() argument
5113 bool IsUndef = Q.isUndefValue(V); in simplifyFPOp()
5138 const SimplifyQuery &Q, unsigned MaxRecurse, in simplifyFAddInst() argument
5142 if (Constant *C = foldOrCommuteConstant(Instruction::FAdd, Op0, Op1, Q)) in simplifyFAddInst()
5145 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFAddInst()
5162 (FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI))) in simplifyFAddInst()
5200 const SimplifyQuery &Q, unsigned MaxRecurse, in simplifyFSubInst() argument
5204 if (Constant *C = foldOrCommuteConstant(Instruction::FSub, Op0, Op1, Q)) in simplifyFSubInst()
5207 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFSubInst()
5220 (FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI))) in simplifyFSubInst()
5255 const SimplifyQuery &Q, unsigned MaxRecurse, in simplifyFMAFMul() argument
5258 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFMAFMul()
5295 const SimplifyQuery &Q, unsigned MaxRecurse, in simplifyFMulInst() argument
5299 if (Constant *C = foldOrCommuteConstant(Instruction::FMul, Op0, Op1, Q)) in simplifyFMulInst()
5303 return simplifyFMAFMul(Op0, Op1, FMF, Q, MaxRecurse, ExBehavior, Rounding); in simplifyFMulInst()
5307 const SimplifyQuery &Q, in simplifyFAddInst() argument
5310 return ::simplifyFAddInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFAddInst()
5315 const SimplifyQuery &Q, in simplifyFSubInst() argument
5318 return ::simplifyFSubInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFSubInst()
5323 const SimplifyQuery &Q, in simplifyFMulInst() argument
5326 return ::simplifyFMulInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFMulInst()
5331 const SimplifyQuery &Q, in simplifyFMAFMul() argument
5334 return ::simplifyFMAFMul(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFMAFMul()
5340 const SimplifyQuery &Q, unsigned, in simplifyFDivInst() argument
5344 if (Constant *C = foldOrCommuteConstant(Instruction::FDiv, Op0, Op1, Q)) in simplifyFDivInst()
5347 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFDivInst()
5386 const SimplifyQuery &Q, in simplifyFDivInst() argument
5389 return ::simplifyFDivInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFDivInst()
5395 const SimplifyQuery &Q, unsigned, in simplifyFRemInst() argument
5399 if (Constant *C = foldOrCommuteConstant(Instruction::FRem, Op0, Op1, Q)) in simplifyFRemInst()
5402 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFRemInst()
5424 const SimplifyQuery &Q, in simplifyFRemInst() argument
5427 return ::simplifyFRemInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFRemInst()
5435 static Value *simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q, in simplifyUnOp() argument
5439 return simplifyFNegInst(Op, FastMathFlags(), Q, MaxRecurse); in simplifyUnOp()
5449 const FastMathFlags &FMF, const SimplifyQuery &Q, in simplifyFPUnOp() argument
5453 return simplifyFNegInst(Op, FMF, Q, MaxRecurse); in simplifyFPUnOp()
5455 return simplifyUnOp(Opcode, Op, Q, MaxRecurse); in simplifyFPUnOp()
5459 Value *llvm::simplifyUnOp(unsigned Opcode, Value *Op, const SimplifyQuery &Q) { in simplifyUnOp() argument
5460 return ::simplifyUnOp(Opcode, Op, Q, RecursionLimit); in simplifyUnOp()
5464 const SimplifyQuery &Q) { in simplifyUnOp() argument
5465 return ::simplifyFPUnOp(Opcode, Op, FMF, Q, RecursionLimit); in simplifyUnOp()
5471 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyBinOp() argument
5474 return simplifyAddInst(LHS, RHS, false, false, Q, MaxRecurse); in simplifyBinOp()
5476 return simplifySubInst(LHS, RHS, false, false, Q, MaxRecurse); in simplifyBinOp()
5478 return simplifyMulInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5480 return simplifySDivInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5482 return simplifyUDivInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5484 return simplifySRemInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5486 return simplifyURemInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5488 return simplifyShlInst(LHS, RHS, false, false, Q, MaxRecurse); in simplifyBinOp()
5490 return simplifyLShrInst(LHS, RHS, false, Q, MaxRecurse); in simplifyBinOp()
5492 return simplifyAShrInst(LHS, RHS, false, Q, MaxRecurse); in simplifyBinOp()
5494 return simplifyAndInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5496 return simplifyOrInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5498 return simplifyXorInst(LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5500 return simplifyFAddInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse); in simplifyBinOp()
5502 return simplifyFSubInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse); in simplifyBinOp()
5504 return simplifyFMulInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse); in simplifyBinOp()
5506 return simplifyFDivInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse); in simplifyBinOp()
5508 return simplifyFRemInst(LHS, RHS, FastMathFlags(), Q, MaxRecurse); in simplifyBinOp()
5518 const FastMathFlags &FMF, const SimplifyQuery &Q, in simplifyBinOp() argument
5522 return simplifyFAddInst(LHS, RHS, FMF, Q, MaxRecurse); in simplifyBinOp()
5524 return simplifyFSubInst(LHS, RHS, FMF, Q, MaxRecurse); in simplifyBinOp()
5526 return simplifyFMulInst(LHS, RHS, FMF, Q, MaxRecurse); in simplifyBinOp()
5528 return simplifyFDivInst(LHS, RHS, FMF, Q, MaxRecurse); in simplifyBinOp()
5530 return simplifyBinOp(Opcode, LHS, RHS, Q, MaxRecurse); in simplifyBinOp()
5535 const SimplifyQuery &Q) { in simplifyBinOp() argument
5536 return ::simplifyBinOp(Opcode, LHS, RHS, Q, RecursionLimit); in simplifyBinOp()
5540 FastMathFlags FMF, const SimplifyQuery &Q) { in simplifyBinOp() argument
5541 return ::simplifyBinOp(Opcode, LHS, RHS, FMF, Q, RecursionLimit); in simplifyBinOp()
5546 const SimplifyQuery &Q, unsigned MaxRecurse) { in simplifyCmpInst() argument
5548 return simplifyICmpInst(Predicate, LHS, RHS, Q, MaxRecurse); in simplifyCmpInst()
5549 return simplifyFCmpInst(Predicate, LHS, RHS, FastMathFlags(), Q, MaxRecurse); in simplifyCmpInst()
5553 const SimplifyQuery &Q) { in simplifyCmpInst() argument
5554 return ::simplifyCmpInst(Predicate, LHS, RHS, Q, RecursionLimit); in simplifyCmpInst()
5633 const SimplifyQuery &Q) { in simplifyUnaryIntrinsic() argument
5644 if (SignBitMustBeZero(Op0, Q.TLI)) in simplifyUnaryIntrinsic()
5662 Q.DL, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyUnaryIntrinsic()
5668 if (Q.CxtI->hasAllowReassoc() && in simplifyUnaryIntrinsic()
5674 if (Q.CxtI->hasAllowReassoc() && in simplifyUnaryIntrinsic()
5680 if (Q.CxtI->hasAllowReassoc() && in simplifyUnaryIntrinsic()
5686 if (Q.CxtI->hasAllowReassoc() && in simplifyUnaryIntrinsic()
5694 if (Q.CxtI->hasAllowReassoc() && in simplifyUnaryIntrinsic()
5757 const SimplifyQuery &Q) { in simplifyBinaryIntrinsic() argument
5797 if (Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
5837 if (isICmpTrue(Pred, Op0, Op1, Q.getWithoutUndef(), RecursionLimit)) in simplifyBinaryIntrinsic()
5839 if (isICmpTrue(Pred, Op1, Op0, Q.getWithoutUndef(), RecursionLimit)) in simplifyBinaryIntrinsic()
5843 isImpliedByDomCondition(Pred, Op0, Op1, Q.CxtI, Q.DL)) in simplifyBinaryIntrinsic()
5846 isImpliedByDomCondition(Pred, Op1, Op0, Q.CxtI, Q.DL)) in simplifyBinaryIntrinsic()
5856 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
5863 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) { in simplifyBinaryIntrinsic()
5878 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
5892 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
5909 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
5918 return simplifyRelativeLoad(C0, C1, Q.DL); in simplifyBinaryIntrinsic()
5953 if (Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
5970 (C->isInfinity() || (Q.CxtI->hasNoInfs() && C->isLargest()))) { in simplifyBinaryIntrinsic()
5975 if (C->isNegative() == IsMin && (!PropagateNaN || Q.CxtI->hasNoNaNs())) in simplifyBinaryIntrinsic()
5982 if (C->isNegative() != IsMin && (PropagateNaN || Q.CxtI->hasNoNaNs())) in simplifyBinaryIntrinsic()
6019 static Value *simplifyIntrinsic(CallBase *Call, const SimplifyQuery &Q) { in simplifyIntrinsic() argument
6048 return simplifyUnaryIntrinsic(F, Call->getArgOperand(0), Q); in simplifyIntrinsic()
6052 Call->getArgOperand(1), Q); in simplifyIntrinsic()
6071 if (Q.isUndefValue(Op0) && Q.isUndefValue(Op1)) in simplifyIntrinsic()
6075 if (Q.isUndefValue(ShAmtArg)) in simplifyIntrinsic()
6101 if (Value *V = simplifyFPOp({Op0, Op1, Op2}, {}, Q, in simplifyIntrinsic()
6112 if (Value *V = simplifyFPOp({Op0, Op1, Op2}, {}, Q, fp::ebIgnore, in simplifyIntrinsic()
6135 if (Q.isUndefValue(Op1)) in simplifyIntrinsic()
6159 (Q.isUndefValue(Vec) || Vec == X) && IdxN == 0 && in simplifyIntrinsic()
6169 Q, FPI->getExceptionBehavior().value(), FPI->getRoundingMode().value()); in simplifyIntrinsic()
6175 Q, FPI->getExceptionBehavior().value(), FPI->getRoundingMode().value()); in simplifyIntrinsic()
6181 Q, FPI->getExceptionBehavior().value(), FPI->getRoundingMode().value()); in simplifyIntrinsic()
6187 Q, FPI->getExceptionBehavior().value(), FPI->getRoundingMode().value()); in simplifyIntrinsic()
6193 Q, FPI->getExceptionBehavior().value(), FPI->getRoundingMode().value()); in simplifyIntrinsic()
6200 static Value *tryConstantFoldCall(CallBase *Call, const SimplifyQuery &Q) { in tryConstantFoldCall() argument
6218 return ConstantFoldCall(Call, F, ConstantArgs, Q.TLI); in tryConstantFoldCall()
6221 Value *llvm::simplifyCall(CallBase *Call, const SimplifyQuery &Q) { in simplifyCall() argument
6233 if (Value *V = tryConstantFoldCall(Call, Q)) in simplifyCall()
6238 if (Value *Ret = simplifyIntrinsic(Call, Q)) in simplifyCall()
6244 Value *llvm::simplifyConstrainedFPCall(CallBase *Call, const SimplifyQuery &Q) { in simplifyConstrainedFPCall() argument
6246 if (Value *V = tryConstantFoldCall(Call, Q)) in simplifyConstrainedFPCall()
6248 if (Value *Ret = simplifyIntrinsic(Call, Q)) in simplifyConstrainedFPCall()
6254 static Value *simplifyFreezeInst(Value *Op0, const SimplifyQuery &Q) { in simplifyFreezeInst() argument
6256 if (llvm::isGuaranteedNotToBeUndefOrPoison(Op0, Q.AC, Q.CxtI, Q.DT)) in simplifyFreezeInst()
6262 Value *llvm::simplifyFreezeInst(Value *Op0, const SimplifyQuery &Q) { in simplifyFreezeInst() argument
6263 return ::simplifyFreezeInst(Op0, Q); in simplifyFreezeInst()
6267 const SimplifyQuery &Q) { in simplifyLoadInst() argument
6271 APInt Offset(Q.DL.getIndexTypeSizeInBits(PtrOp->getType()), 0); in simplifyLoadInst()
6278 Q.DL, Offset, /* AllowNonInbounts */ true, in simplifyLoadInst()
6281 Offset = Offset.sextOrTrunc(Q.DL.getIndexTypeSizeInBits(PtrOp->getType())); in simplifyLoadInst()
6286 return ConstantFoldLoadFromConstPtr(PtrOpC, LI->getType(), Offset, Q.DL); in simplifyLoadInst()
6297 const SimplifyQuery Q = SQ.CxtI ? SQ : SQ.getWithInstruction(I); in simplifyInstructionWithOperands() local
6306 Result = ConstantFoldInstOperands(I, NewConstOps, Q.DL, Q.TLI); in simplifyInstructionWithOperands()
6310 Result = simplifyFNegInst(NewOps[0], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6313 Result = simplifyFAddInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6317 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)), in simplifyInstructionWithOperands()
6318 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q); in simplifyInstructionWithOperands()
6321 Result = simplifyFSubInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6325 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)), in simplifyInstructionWithOperands()
6326 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q); in simplifyInstructionWithOperands()
6329 Result = simplifyFMulInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6332 Result = simplifyMulInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6335 Result = simplifySDivInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6338 Result = simplifyUDivInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6341 Result = simplifyFDivInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6344 Result = simplifySRemInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6347 Result = simplifyURemInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6350 Result = simplifyFRemInst(NewOps[0], NewOps[1], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6354 NewOps[0], NewOps[1], Q.IIQ.hasNoSignedWrap(cast<BinaryOperator>(I)), in simplifyInstructionWithOperands()
6355 Q.IIQ.hasNoUnsignedWrap(cast<BinaryOperator>(I)), Q); in simplifyInstructionWithOperands()
6359 Q.IIQ.isExact(cast<BinaryOperator>(I)), Q); in simplifyInstructionWithOperands()
6363 Q.IIQ.isExact(cast<BinaryOperator>(I)), Q); in simplifyInstructionWithOperands()
6366 Result = simplifyAndInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6369 Result = simplifyOrInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6372 Result = simplifyXorInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6376 NewOps[1], Q); in simplifyInstructionWithOperands()
6380 NewOps[1], I->getFastMathFlags(), Q); in simplifyInstructionWithOperands()
6383 Result = simplifySelectInst(NewOps[0], NewOps[1], NewOps[2], Q); in simplifyInstructionWithOperands()
6389 makeArrayRef(NewOps).slice(1), GEPI->isInBounds(), Q); in simplifyInstructionWithOperands()
6394 Result = simplifyInsertValueInst(NewOps[0], NewOps[1], IV->getIndices(), Q); in simplifyInstructionWithOperands()
6398 Result = simplifyInsertElementInst(NewOps[0], NewOps[1], NewOps[2], Q); in simplifyInstructionWithOperands()
6403 Result = simplifyExtractValueInst(NewOps[0], EVI->getIndices(), Q); in simplifyInstructionWithOperands()
6407 Result = simplifyExtractElementInst(NewOps[0], NewOps[1], Q); in simplifyInstructionWithOperands()
6413 NewOps[0], NewOps[1], SVI->getShuffleMask(), SVI->getType(), Q); in simplifyInstructionWithOperands()
6417 Result = simplifyPHINode(cast<PHINode>(I), NewOps, Q); in simplifyInstructionWithOperands()
6421 Result = simplifyCall(cast<CallInst>(I), Q); in simplifyInstructionWithOperands()
6425 Result = llvm::simplifyFreezeInst(NewOps[0], Q); in simplifyInstructionWithOperands()
6430 Result = simplifyCastInst(I->getOpcode(), NewOps[0], I->getType(), Q); in simplifyInstructionWithOperands()
6437 Result = simplifyLoadInst(cast<LoadInst>(I), NewOps[0], Q); in simplifyInstructionWithOperands()