Lines Matching refs:Op0

301   BinaryOperator *Op0 = dyn_cast<BinaryOperator>(LHS);  in simplifyAssociativeBinOp()  local
305 if (Op0 && Op0->getOpcode() == Opcode) { in simplifyAssociativeBinOp()
306 Value *A = Op0->getOperand(0); in simplifyAssociativeBinOp()
307 Value *B = Op0->getOperand(1); in simplifyAssociativeBinOp()
349 if (Op0 && Op0->getOpcode() == Opcode) { in simplifyAssociativeBinOp()
350 Value *A = Op0->getOperand(0); in simplifyAssociativeBinOp()
351 Value *B = Op0->getOperand(1); in simplifyAssociativeBinOp()
604 Value *&Op0, Value *&Op1, in foldOrCommuteConstant() argument
606 if (auto *CLHS = dyn_cast<Constant>(Op0)) { in foldOrCommuteConstant()
624 std::swap(Op0, Op1); in foldOrCommuteConstant()
631 static Value *simplifyAddInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifyAddInst() argument
633 if (Constant *C = foldOrCommuteConstant(Instruction::Add, Op0, Op1, Q)) in simplifyAddInst()
646 return Op0; in simplifyAddInst()
649 if (isKnownNegation(Op0, Op1)) in simplifyAddInst()
650 return Constant::getNullValue(Op0->getType()); in simplifyAddInst()
656 if (match(Op1, m_Sub(m_Value(Y), m_Specific(Op0))) || in simplifyAddInst()
657 match(Op0, m_Sub(m_Value(Y), m_Specific(Op1)))) in simplifyAddInst()
661 Type *Ty = Op0->getType(); in simplifyAddInst()
662 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0)))) in simplifyAddInst()
669 match(Op0, m_Xor(m_Value(Y), m_SignMask()))) in simplifyAddInst()
677 if (MaxRecurse && Op0->getType()->isIntOrIntVectorTy(1)) in simplifyAddInst()
678 if (Value *V = simplifyXorInst(Op0, Op1, Q, MaxRecurse - 1)) in simplifyAddInst()
683 simplifyAssociativeBinOp(Instruction::Add, Op0, Op1, Q, MaxRecurse)) in simplifyAddInst()
698 Value *llvm::simplifyAddInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifyAddInst() argument
700 return ::simplifyAddInst(Op0, Op1, IsNSW, IsNUW, Query, RecursionLimit); in simplifyAddInst()
749 static Value *simplifyByDomEq(unsigned Opcode, Value *Op0, Value *Op1, in simplifyByDomEq() argument
756 isImpliedByDomCondition(CmpInst::ICMP_EQ, Op0, Op1, Q.CxtI, Q.DL); in simplifyByDomEq()
758 Type *Ty = Op0->getType(); in simplifyByDomEq()
783 static Value *simplifySubInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifySubInst() argument
785 if (Constant *C = foldOrCommuteConstant(Instruction::Sub, Op0, Op1, Q)) in simplifySubInst()
790 if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1)) in simplifySubInst()
791 return PoisonValue::get(Op0->getType()); in simplifySubInst()
795 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifySubInst()
796 return UndefValue::get(Op0->getType()); in simplifySubInst()
800 return Op0; in simplifySubInst()
803 if (Op0 == Op1) in simplifySubInst()
804 return Constant::getNullValue(Op0->getType()); in simplifySubInst()
807 if (match(Op0, m_Zero())) { in simplifySubInst()
810 return Constant::getNullValue(Op0->getType()); in simplifySubInst()
817 return Constant::getNullValue(Op0->getType()); in simplifySubInst()
827 if (MaxRecurse && match(Op0, m_Add(m_Value(X), m_Value(Y)))) { // (X + Y) - Z in simplifySubInst()
848 X = Op0; in simplifySubInst()
870 Z = Op0; in simplifySubInst()
882 if (MaxRecurse && match(Op0, m_Trunc(m_Value(X))) && in simplifySubInst()
888 if (Value *W = simplifyCastInst(Instruction::Trunc, V, Op0->getType(), in simplifySubInst()
894 if (match(Op0, m_PtrToInt(m_Value(X))) && match(Op1, m_PtrToInt(m_Value(Y)))) in simplifySubInst()
896 return ConstantExpr::getIntegerCast(Result, Op0->getType(), true); in simplifySubInst()
899 if (MaxRecurse && Op0->getType()->isIntOrIntVectorTy(1)) in simplifySubInst()
900 if (Value *V = simplifyXorInst(Op0, Op1, Q, MaxRecurse - 1)) in simplifySubInst()
912 if (Value *V = simplifyByDomEq(Instruction::Sub, Op0, Op1, Q, MaxRecurse)) in simplifySubInst()
918 Value *llvm::simplifySubInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifySubInst() argument
920 return ::simplifySubInst(Op0, Op1, IsNSW, IsNUW, Q, RecursionLimit); in simplifySubInst()
925 static Value *simplifyMulInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifyMulInst() argument
927 if (Constant *C = foldOrCommuteConstant(Instruction::Mul, Op0, Op1, Q)) in simplifyMulInst()
937 return Constant::getNullValue(Op0->getType()); in simplifyMulInst()
941 return Op0; in simplifyMulInst()
946 (match(Op0, in simplifyMulInst()
948 match(Op1, m_Exact(m_IDiv(m_Value(X), m_Specific(Op0)))))) // Y * (X / Y) in simplifyMulInst()
951 if (Op0->getType()->isIntOrIntVectorTy(1)) { in simplifyMulInst()
955 return ConstantInt::getNullValue(Op0->getType()); in simplifyMulInst()
959 if (Value *V = simplifyAndInst(Op0, Op1, Q, MaxRecurse - 1)) in simplifyMulInst()
965 simplifyAssociativeBinOp(Instruction::Mul, Op0, Op1, Q, MaxRecurse)) in simplifyMulInst()
969 if (Value *V = expandCommutativeBinOp(Instruction::Mul, Op0, Op1, in simplifyMulInst()
975 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) in simplifyMulInst()
977 threadBinOpOverSelect(Instruction::Mul, Op0, Op1, Q, MaxRecurse)) in simplifyMulInst()
982 if (isa<PHINode>(Op0) || isa<PHINode>(Op1)) in simplifyMulInst()
984 threadBinOpOverPHI(Instruction::Mul, Op0, Op1, Q, MaxRecurse)) in simplifyMulInst()
990 Value *llvm::simplifyMulInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifyMulInst() argument
992 return ::simplifyMulInst(Op0, Op1, IsNSW, IsNUW, Q, RecursionLimit); in simplifyMulInst()
997 static Value *simplifyDivRem(Instruction::BinaryOps Opcode, Value *Op0, in simplifyDivRem() argument
1003 Type *Ty = Op0->getType(); in simplifyDivRem()
1031 if (isa<PoisonValue>(Op0)) in simplifyDivRem()
1032 return Op0; in simplifyDivRem()
1036 if (Q.isUndefValue(Op0)) in simplifyDivRem()
1041 if (match(Op0, m_Zero())) in simplifyDivRem()
1042 return Constant::getNullValue(Op0->getType()); in simplifyDivRem()
1046 if (Op0 == Op1) in simplifyDivRem()
1057 return IsDiv ? Op0 : Constant::getNullValue(Ty); in simplifyDivRem()
1062 if (match(Op0, m_c_Mul(m_Value(X), m_Specific(Op1)))) { in simplifyDivRem()
1063 auto *Mul = cast<OverflowingBinaryOperator>(Op0); in simplifyDivRem()
1070 return IsDiv ? X : Constant::getNullValue(Op0->getType()); in simplifyDivRem()
1074 if (Value *V = simplifyByDomEq(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyDivRem()
1153 static Value *simplifyDiv(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, in simplifyDiv() argument
1156 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q)) in simplifyDiv()
1159 if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyDiv()
1167 KnownBits KnownOp0 = computeKnownBits(Op0, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyDiv()
1169 return PoisonValue::get(Op0->getType()); in simplifyDiv()
1175 if ((IsSigned && match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) || in simplifyDiv()
1176 (!IsSigned && match(Op0, m_URem(m_Value(), m_Specific(Op1))))) in simplifyDiv()
1177 return Constant::getNullValue(Op0->getType()); in simplifyDiv()
1181 if (!IsSigned && match(Op0, m_UDiv(m_Value(), m_ConstantInt(C1))) && in simplifyDiv()
1186 return Constant::getNullValue(Op0->getType()); in simplifyDiv()
1191 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) in simplifyDiv()
1192 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyDiv()
1197 if (isa<PHINode>(Op0) || isa<PHINode>(Op1)) in simplifyDiv()
1198 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyDiv()
1201 if (isDivZero(Op0, Op1, Q, MaxRecurse, IsSigned)) in simplifyDiv()
1202 return Constant::getNullValue(Op0->getType()); in simplifyDiv()
1208 static Value *simplifyRem(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, in simplifyRem() argument
1210 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q)) in simplifyRem()
1213 if (Value *V = simplifyDivRem(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyRem()
1218 match(Op0, m_SRem(m_Value(), m_Specific(Op1)))) || in simplifyRem()
1220 match(Op0, m_URem(m_Value(), m_Specific(Op1))))) in simplifyRem()
1221 return Op0; in simplifyRem()
1226 match(Op0, m_NSWShl(m_Specific(Op1), m_Value()))) || in simplifyRem()
1228 match(Op0, m_NUWShl(m_Specific(Op1), m_Value()))))) in simplifyRem()
1229 return Constant::getNullValue(Op0->getType()); in simplifyRem()
1233 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) in simplifyRem()
1234 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyRem()
1239 if (isa<PHINode>(Op0) || isa<PHINode>(Op1)) in simplifyRem()
1240 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyRem()
1244 if (isDivZero(Op0, Op1, Q, MaxRecurse, Opcode == Instruction::SRem)) in simplifyRem()
1245 return Op0; in simplifyRem()
1252 static Value *simplifySDivInst(Value *Op0, Value *Op1, bool IsExact, in simplifySDivInst() argument
1255 if (isKnownNegation(Op0, Op1, /*NeedNSW=*/true)) in simplifySDivInst()
1256 return Constant::getAllOnesValue(Op0->getType()); in simplifySDivInst()
1258 return simplifyDiv(Instruction::SDiv, Op0, Op1, IsExact, Q, MaxRecurse); in simplifySDivInst()
1261 Value *llvm::simplifySDivInst(Value *Op0, Value *Op1, bool IsExact, in simplifySDivInst() argument
1263 return ::simplifySDivInst(Op0, Op1, IsExact, Q, RecursionLimit); in simplifySDivInst()
1268 static Value *simplifyUDivInst(Value *Op0, Value *Op1, bool IsExact, in simplifyUDivInst() argument
1270 return simplifyDiv(Instruction::UDiv, Op0, Op1, IsExact, Q, MaxRecurse); in simplifyUDivInst()
1273 Value *llvm::simplifyUDivInst(Value *Op0, Value *Op1, bool IsExact, in simplifyUDivInst() argument
1275 return ::simplifyUDivInst(Op0, Op1, IsExact, Q, RecursionLimit); in simplifyUDivInst()
1280 static Value *simplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifySRemInst() argument
1286 return ConstantInt::getNullValue(Op0->getType()); in simplifySRemInst()
1289 if (isKnownNegation(Op0, Op1)) in simplifySRemInst()
1290 return ConstantInt::getNullValue(Op0->getType()); in simplifySRemInst()
1292 return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse); in simplifySRemInst()
1295 Value *llvm::simplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifySRemInst() argument
1296 return ::simplifySRemInst(Op0, Op1, Q, RecursionLimit); in simplifySRemInst()
1301 static Value *simplifyURemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyURemInst() argument
1303 return simplifyRem(Instruction::URem, Op0, Op1, Q, MaxRecurse); in simplifyURemInst()
1306 Value *llvm::simplifyURemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyURemInst() argument
1307 return ::simplifyURemInst(Op0, Op1, Q, RecursionLimit); in simplifyURemInst()
1342 static Value *simplifyShift(Instruction::BinaryOps Opcode, Value *Op0, in simplifyShift() argument
1345 if (Constant *C = foldOrCommuteConstant(Opcode, Op0, Op1, Q)) in simplifyShift()
1349 if (isa<PoisonValue>(Op0)) in simplifyShift()
1350 return Op0; in simplifyShift()
1353 if (match(Op0, m_Zero())) in simplifyShift()
1354 return Constant::getNullValue(Op0->getType()); in simplifyShift()
1362 return Op0; in simplifyShift()
1366 return PoisonValue::get(Op0->getType()); in simplifyShift()
1370 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) in simplifyShift()
1371 if (Value *V = threadBinOpOverSelect(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyShift()
1376 if (isa<PHINode>(Op0) || isa<PHINode>(Op1)) in simplifyShift()
1377 if (Value *V = threadBinOpOverPHI(Opcode, Op0, Op1, Q, MaxRecurse)) in simplifyShift()
1384 return PoisonValue::get(Op0->getType()); in simplifyShift()
1390 return Op0; in simplifyShift()
1395 KnownBits KnownVal = computeKnownBits(Op0, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyShift()
1404 return PoisonValue::get(Op0->getType()); in simplifyShift()
1412 static Value *simplifyRightShift(Instruction::BinaryOps Opcode, Value *Op0, in simplifyRightShift() argument
1416 simplifyShift(Opcode, Op0, Op1, /*IsNSW*/ false, Q, MaxRecurse)) in simplifyRightShift()
1420 if (Op0 == Op1) in simplifyRightShift()
1421 return Constant::getNullValue(Op0->getType()); in simplifyRightShift()
1425 if (Q.isUndefValue(Op0)) in simplifyRightShift()
1426 return IsExact ? Op0 : Constant::getNullValue(Op0->getType()); in simplifyRightShift()
1432 computeKnownBits(Op0, Q.DL, /*Depth=*/0, Q.AC, Q.CxtI, Q.DT); in simplifyRightShift()
1434 return Op0; in simplifyRightShift()
1442 static Value *simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifyShlInst() argument
1445 simplifyShift(Instruction::Shl, Op0, Op1, IsNSW, Q, MaxRecurse)) in simplifyShlInst()
1450 if (Q.isUndefValue(Op0)) in simplifyShlInst()
1451 return IsNSW || IsNUW ? Op0 : Constant::getNullValue(Op0->getType()); in simplifyShlInst()
1456 match(Op0, m_Exact(m_Shr(m_Value(X), m_Specific(Op1))))) in simplifyShlInst()
1460 if (IsNUW && match(Op0, m_Negative())) in simplifyShlInst()
1461 return Op0; in simplifyShlInst()
1468 Value *llvm::simplifyShlInst(Value *Op0, Value *Op1, bool IsNSW, bool IsNUW, in simplifyShlInst() argument
1470 return ::simplifyShlInst(Op0, Op1, IsNSW, IsNUW, Q, RecursionLimit); in simplifyShlInst()
1475 static Value *simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, in simplifyLShrInst() argument
1477 if (Value *V = simplifyRightShift(Instruction::LShr, Op0, Op1, IsExact, Q, in simplifyLShrInst()
1483 if (match(Op0, m_NUWShl(m_Value(X), m_Specific(Op1)))) in simplifyLShrInst()
1494 match(Op0, m_c_Or(m_NUWShl(m_Value(X), m_APInt(ShLAmt)), m_Value(Y))) && in simplifyLShrInst()
1505 Value *llvm::simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact, in simplifyLShrInst() argument
1507 return ::simplifyLShrInst(Op0, Op1, IsExact, Q, RecursionLimit); in simplifyLShrInst()
1512 static Value *simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact, in simplifyAShrInst() argument
1514 if (Value *V = simplifyRightShift(Instruction::AShr, Op0, Op1, IsExact, Q, in simplifyAShrInst()
1521 if (match(Op0, m_AllOnes()) || in simplifyAShrInst()
1522 match(Op0, m_Shl(m_AllOnes(), m_Specific(Op1)))) in simplifyAShrInst()
1523 return Constant::getAllOnesValue(Op0->getType()); in simplifyAShrInst()
1527 if (Q.IIQ.UseInstrInfo && match(Op0, m_NSWShl(m_Value(X), m_Specific(Op1)))) in simplifyAShrInst()
1531 unsigned NumSignBits = ComputeNumSignBits(Op0, Q.DL, 0, Q.AC, Q.CxtI, Q.DT); in simplifyAShrInst()
1532 if (NumSignBits == Op0->getType()->getScalarSizeInBits()) in simplifyAShrInst()
1533 return Op0; in simplifyAShrInst()
1538 Value *llvm::simplifyAShrInst(Value *Op0, Value *Op1, bool IsExact, in simplifyAShrInst() argument
1540 return ::simplifyAShrInst(Op0, Op1, IsExact, Q, RecursionLimit); in simplifyAShrInst()
1730 static Value *simplifyAndOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, in simplifyAndOfICmpsWithAdd() argument
1736 if (!match(Op0, m_ICmp(Pred0, m_Add(m_Value(V), m_APInt(C0)), m_APInt(C1)))) in simplifyAndOfICmpsWithAdd()
1742 auto *AddInst = cast<OverflowingBinaryOperator>(Op0->getOperand(0)); in simplifyAndOfICmpsWithAdd()
1746 Type *ITy = Op0->getType(); in simplifyAndOfICmpsWithAdd()
1858 static Value *simplifyAndOfICmps(ICmpInst *Op0, ICmpInst *Op1, in simplifyAndOfICmps() argument
1860 if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/true, Q)) in simplifyAndOfICmps()
1862 if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/true, Q)) in simplifyAndOfICmps()
1865 if (Value *X = simplifyAndOrOfICmpsWithConstants(Op0, Op1, true)) in simplifyAndOfICmps()
1868 if (Value *X = simplifyAndOrOfICmpsWithLimitConst(Op0, Op1, true)) in simplifyAndOfICmps()
1871 if (Value *X = simplifyAndOrOfICmpsWithZero(Op0, Op1, true)) in simplifyAndOfICmps()
1874 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op0, Op1, true)) in simplifyAndOfICmps()
1876 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op1, Op0, true)) in simplifyAndOfICmps()
1879 if (Value *X = simplifyAndOfICmpsWithAdd(Op0, Op1, Q.IIQ)) in simplifyAndOfICmps()
1881 if (Value *X = simplifyAndOfICmpsWithAdd(Op1, Op0, Q.IIQ)) in simplifyAndOfICmps()
1887 static Value *simplifyOrOfICmpsWithAdd(ICmpInst *Op0, ICmpInst *Op1, in simplifyOrOfICmpsWithAdd() argument
1893 if (!match(Op0, m_ICmp(Pred0, m_Add(m_Value(V), m_APInt(C0)), m_APInt(C1)))) in simplifyOrOfICmpsWithAdd()
1899 auto *AddInst = cast<BinaryOperator>(Op0->getOperand(0)); in simplifyOrOfICmpsWithAdd()
1903 Type *ITy = Op0->getType(); in simplifyOrOfICmpsWithAdd()
1934 static Value *simplifyOrOfICmps(ICmpInst *Op0, ICmpInst *Op1, in simplifyOrOfICmps() argument
1936 if (Value *X = simplifyUnsignedRangeCheck(Op0, Op1, /*IsAnd=*/false, Q)) in simplifyOrOfICmps()
1938 if (Value *X = simplifyUnsignedRangeCheck(Op1, Op0, /*IsAnd=*/false, Q)) in simplifyOrOfICmps()
1941 if (Value *X = simplifyAndOrOfICmpsWithConstants(Op0, Op1, false)) in simplifyOrOfICmps()
1944 if (Value *X = simplifyAndOrOfICmpsWithLimitConst(Op0, Op1, false)) in simplifyOrOfICmps()
1947 if (Value *X = simplifyAndOrOfICmpsWithZero(Op0, Op1, false)) in simplifyOrOfICmps()
1950 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op0, Op1, false)) in simplifyOrOfICmps()
1952 if (Value *X = simplifyAndOrOfICmpsWithCtpop(Op1, Op0, false)) in simplifyOrOfICmps()
1955 if (Value *X = simplifyOrOfICmpsWithAdd(Op0, Op1, Q.IIQ)) in simplifyOrOfICmps()
1957 if (Value *X = simplifyOrOfICmpsWithAdd(Op1, Op0, Q.IIQ)) in simplifyOrOfICmps()
2001 static Value *simplifyAndOrOfCmps(const SimplifyQuery &Q, Value *Op0, in simplifyAndOrOfCmps() argument
2004 auto *Cast0 = dyn_cast<CastInst>(Op0); in simplifyAndOrOfCmps()
2008 Op0 = Cast0->getOperand(0); in simplifyAndOrOfCmps()
2013 auto *ICmp0 = dyn_cast<ICmpInst>(Op0); in simplifyAndOrOfCmps()
2019 auto *FCmp0 = dyn_cast<FCmpInst>(Op0); in simplifyAndOrOfCmps()
2039 static Value *simplifyLogicOfAddSub(Value *Op0, Value *Op1, in simplifyLogicOfAddSub() argument
2041 assert(Op0->getType() == Op1->getType() && "Mismatched binop types"); in simplifyLogicOfAddSub()
2045 if ((match(Op0, m_Add(m_Value(X), m_Constant(C1))) && in simplifyLogicOfAddSub()
2048 match(Op0, m_Sub(m_Constant(C2), m_Specific(X))))) { in simplifyLogicOfAddSub()
2053 Type *Ty = Op0->getType(); in simplifyLogicOfAddSub()
2063 static Value *simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyAndInst() argument
2065 if (Constant *C = foldOrCommuteConstant(Instruction::And, Op0, Op1, Q)) in simplifyAndInst()
2074 return Constant::getNullValue(Op0->getType()); in simplifyAndInst()
2077 if (Op0 == Op1) in simplifyAndInst()
2078 return Op0; in simplifyAndInst()
2082 return Constant::getNullValue(Op0->getType()); in simplifyAndInst()
2086 return Op0; in simplifyAndInst()
2089 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0)))) in simplifyAndInst()
2090 return Constant::getNullValue(Op0->getType()); in simplifyAndInst()
2093 if (match(Op0, m_c_Or(m_Specific(Op1), m_Value()))) in simplifyAndInst()
2097 if (match(Op1, m_c_Or(m_Specific(Op0), m_Value()))) in simplifyAndInst()
2098 return Op0; in simplifyAndInst()
2102 if (match(Op0, m_c_Or(m_Value(X), m_Not(m_Value(Y)))) && in simplifyAndInst()
2106 match(Op0, m_c_Or(m_Deferred(X), m_Deferred(Y)))) in simplifyAndInst()
2109 if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::And)) in simplifyAndInst()
2118 if (match(Op0, m_Shl(m_Value(X), m_APInt(ShAmt))) && in simplifyAndInst()
2120 return Op0; in simplifyAndInst()
2124 if (match(Op0, m_LShr(m_Value(X), m_APInt(ShAmt))) && in simplifyAndInst()
2126 return Op0; in simplifyAndInst()
2132 if (isCheckForZeroAndMulWithOverflow(Op0, Op1, true)) in simplifyAndInst()
2134 if (isCheckForZeroAndMulWithOverflow(Op1, Op0, true)) in simplifyAndInst()
2135 return Op0; in simplifyAndInst()
2138 if (match(Op0, m_Neg(m_Specific(Op1))) || in simplifyAndInst()
2139 match(Op1, m_Neg(m_Specific(Op0)))) { in simplifyAndInst()
2140 if (isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, in simplifyAndInst()
2142 return Op0; in simplifyAndInst()
2151 if (match(Op0, m_Add(m_Specific(Op1), m_AllOnes())) && in simplifyAndInst()
2154 if (match(Op1, m_Add(m_Specific(Op0), m_AllOnes())) && in simplifyAndInst()
2155 isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ true, 0, Q.AC, Q.CxtI, Q.DT)) in simplifyAndInst()
2156 return Constant::getNullValue(Op0->getType()); in simplifyAndInst()
2158 if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, true)) in simplifyAndInst()
2163 simplifyAssociativeBinOp(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2167 if (Value *V = expandCommutativeBinOp(Instruction::And, Op0, Op1, in simplifyAndInst()
2172 if (Value *V = expandCommutativeBinOp(Instruction::And, Op0, Op1, in simplifyAndInst()
2176 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) { in simplifyAndInst()
2177 if (Op0->getType()->isIntOrIntVectorTy(1)) { in simplifyAndInst()
2179 if (match(Op1, m_Select(m_Specific(Op0), m_Value(), m_Zero()))) in simplifyAndInst()
2181 else if (match(Op0, m_Select(m_Specific(Op1), m_Value(), m_Zero()))) in simplifyAndInst()
2182 return Op0; in simplifyAndInst()
2188 threadBinOpOverSelect(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2194 if (isa<PHINode>(Op0) || isa<PHINode>(Op1)) in simplifyAndInst()
2196 threadBinOpOverPHI(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2211 match(Op0, m_c_Or(m_CombineAnd(m_NUWShl(m_Value(X), m_APInt(ShAmt)), in simplifyAndInst()
2214 const unsigned Width = Op0->getType()->getScalarSizeInBits(); in simplifyAndInst()
2235 if (match(Op0, m_c_Xor(m_Value(X), in simplifyAndInst()
2239 return Constant::getNullValue(Op0->getType()); in simplifyAndInst()
2241 if (Op0->getType()->isIntOrIntVectorTy(1)) { in simplifyAndInst()
2242 if (std::optional<bool> Implied = isImpliedCondition(Op0, Op1, Q.DL)) { in simplifyAndInst()
2245 return Op0; in simplifyAndInst()
2248 return ConstantInt::getFalse(Op0->getType()); in simplifyAndInst()
2250 if (std::optional<bool> Implied = isImpliedCondition(Op1, Op0, Q.DL)) { in simplifyAndInst()
2260 if (Value *V = simplifyByDomEq(Instruction::And, Op0, Op1, Q, MaxRecurse)) in simplifyAndInst()
2266 Value *llvm::simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyAndInst() argument
2267 return ::simplifyAndInst(Op0, Op1, Q, RecursionLimit); in simplifyAndInst()
2364 static Value *simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyOrInst() argument
2366 if (Constant *C = foldOrCommuteConstant(Instruction::Or, Op0, Op1, Q)) in simplifyOrInst()
2377 return Constant::getAllOnesValue(Op0->getType()); in simplifyOrInst()
2381 if (Op0 == Op1 || match(Op1, m_Zero())) in simplifyOrInst()
2382 return Op0; in simplifyOrInst()
2384 if (Value *R = simplifyOrLogic(Op0, Op1)) in simplifyOrInst()
2386 if (Value *R = simplifyOrLogic(Op1, Op0)) in simplifyOrInst()
2389 if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::Or)) in simplifyOrInst()
2397 if ((match(Op0, m_Shl(m_AllOnes(), m_Value(X))) && in simplifyOrInst()
2400 match(Op0, m_LShr(m_AllOnes(), m_Value(Y))))) { in simplifyOrInst()
2414 if (match(Op0, in simplifyOrInst()
2417 return Op0; in simplifyOrInst()
2420 match(Op0, m_Shl(m_Specific(X), m_Specific(Y)))) in simplifyOrInst()
2425 if (match(Op0, in simplifyOrInst()
2428 return Op0; in simplifyOrInst()
2431 match(Op0, m_LShr(m_Specific(X), m_Specific(Y)))) in simplifyOrInst()
2434 if (Value *V = simplifyAndOrOfCmps(Q, Op0, Op1, false)) in simplifyOrInst()
2440 if (isCheckForZeroAndMulWithOverflow(Op0, Op1, false)) in simplifyOrInst()
2442 if (isCheckForZeroAndMulWithOverflow(Op1, Op0, false)) in simplifyOrInst()
2443 return Op0; in simplifyOrInst()
2447 simplifyAssociativeBinOp(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2451 if (Value *V = expandCommutativeBinOp(Instruction::Or, Op0, Op1, in simplifyOrInst()
2455 if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1)) { in simplifyOrInst()
2456 if (Op0->getType()->isIntOrIntVectorTy(1)) { in simplifyOrInst()
2458 if (match(Op1, m_Select(m_Specific(Op0), m_One(), m_Value()))) in simplifyOrInst()
2460 else if (match(Op0, m_Select(m_Specific(Op1), m_One(), m_Value()))) in simplifyOrInst()
2461 return Op0; in simplifyOrInst()
2467 threadBinOpOverSelect(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2474 if (match(Op0, m_And(m_Value(A), m_APInt(C1))) && in simplifyOrInst()
2499 if (isa<PHINode>(Op0) || isa<PHINode>(Op1)) in simplifyOrInst()
2500 if (Value *V = threadBinOpOverPHI(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2503 if (Op0->getType()->isIntOrIntVectorTy(1)) { in simplifyOrInst()
2505 isImpliedCondition(Op0, Op1, Q.DL, false)) { in simplifyOrInst()
2508 return Op0; in simplifyOrInst()
2511 return ConstantInt::getTrue(Op0->getType()); in simplifyOrInst()
2514 isImpliedCondition(Op1, Op0, Q.DL, false)) { in simplifyOrInst()
2524 if (Value *V = simplifyByDomEq(Instruction::Or, Op0, Op1, Q, MaxRecurse)) in simplifyOrInst()
2530 Value *llvm::simplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyOrInst() argument
2531 return ::simplifyOrInst(Op0, Op1, Q, RecursionLimit); in simplifyOrInst()
2536 static Value *simplifyXorInst(Value *Op0, Value *Op1, const SimplifyQuery &Q, in simplifyXorInst() argument
2538 if (Constant *C = foldOrCommuteConstant(Instruction::Xor, Op0, Op1, Q)) in simplifyXorInst()
2551 return Op0; in simplifyXorInst()
2554 if (Op0 == Op1) in simplifyXorInst()
2555 return Constant::getNullValue(Op0->getType()); in simplifyXorInst()
2558 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0)))) in simplifyXorInst()
2559 return Constant::getAllOnesValue(Op0->getType()); in simplifyXorInst()
2580 if (Value *R = foldAndOrNot(Op0, Op1)) in simplifyXorInst()
2582 if (Value *R = foldAndOrNot(Op1, Op0)) in simplifyXorInst()
2585 if (Value *V = simplifyLogicOfAddSub(Op0, Op1, Instruction::Xor)) in simplifyXorInst()
2590 simplifyAssociativeBinOp(Instruction::Xor, Op0, Op1, Q, MaxRecurse)) in simplifyXorInst()
2602 if (Value *V = simplifyByDomEq(Instruction::Xor, Op0, Op1, Q, MaxRecurse)) in simplifyXorInst()
2608 Value *llvm::simplifyXorInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { in simplifyXorInst() argument
2609 return ::simplifyXorInst(Op0, Op1, Q, RecursionLimit); in simplifyXorInst()
5102 static Value *foldIdentityShuffles(int DestElt, Value *Op0, Value *Op1, in foldIdentityShuffles() argument
5114 int InVecNumElts = cast<FixedVectorType>(Op0->getType())->getNumElements(); in foldIdentityShuffles()
5116 Value *SourceOp = Op0; in foldIdentityShuffles()
5150 static Value *simplifyShuffleVectorInst(Value *Op0, Value *Op1, in simplifyShuffleVectorInst() argument
5157 auto *InVecTy = cast<VectorType>(Op0->getType()); in simplifyShuffleVectorInst()
5180 Op0 = PoisonValue::get(InVecTy); in simplifyShuffleVectorInst()
5185 auto *Op0Const = dyn_cast<Constant>(Op0); in simplifyShuffleVectorInst()
5198 std::swap(Op0, Op1); in simplifyShuffleVectorInst()
5211 if (!Scalable && match(Op0, m_InsertElt(m_Value(), m_Constant(C), in simplifyShuffleVectorInst()
5231 if (auto *OpShuf = dyn_cast<ShuffleVectorInst>(Op0)) in simplifyShuffleVectorInst()
5234 return Op0; in simplifyShuffleVectorInst()
5256 foldIdentityShuffles(i, Op0, Op1, Indices[i], RootVec, MaxRecurse); in simplifyShuffleVectorInst()
5266 Value *llvm::simplifyShuffleVectorInst(Value *Op0, Value *Op1, in simplifyShuffleVectorInst() argument
5269 return ::simplifyShuffleVectorInst(Op0, Op1, Mask, RetTy, Q, RecursionLimit); in simplifyShuffleVectorInst()
5371 simplifyFAddInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFAddInst() argument
5376 if (Constant *C = foldOrCommuteConstant(Instruction::FAdd, Op0, Op1, Q)) in simplifyFAddInst()
5379 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFAddInst()
5391 return Op0; in simplifyFAddInst()
5396 (FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI))) in simplifyFAddInst()
5397 return Op0; in simplifyFAddInst()
5414 if (match(Op0, m_FSub(m_AnyZeroFP(), m_Specific(Op1))) || in simplifyFAddInst()
5415 match(Op1, m_FSub(m_AnyZeroFP(), m_Specific(Op0)))) in simplifyFAddInst()
5416 return ConstantFP::getNullValue(Op0->getType()); in simplifyFAddInst()
5418 if (match(Op0, m_FNeg(m_Specific(Op1))) || in simplifyFAddInst()
5419 match(Op1, m_FNeg(m_Specific(Op0)))) in simplifyFAddInst()
5420 return ConstantFP::getNullValue(Op0->getType()); in simplifyFAddInst()
5427 (match(Op0, m_FSub(m_Value(X), m_Specific(Op1))) || in simplifyFAddInst()
5428 match(Op1, m_FSub(m_Value(X), m_Specific(Op0))))) in simplifyFAddInst()
5437 simplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFSubInst() argument
5442 if (Constant *C = foldOrCommuteConstant(Instruction::FSub, Op0, Op1, Q)) in simplifyFSubInst()
5445 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFSubInst()
5453 return Op0; in simplifyFSubInst()
5458 (FMF.noSignedZeros() || CannotBeNegativeZero(Op0, Q.TLI))) in simplifyFSubInst()
5459 return Op0; in simplifyFSubInst()
5465 if (match(Op0, m_NegZeroFP()) && match(Op1, m_FNeg(m_Value(X)))) in simplifyFSubInst()
5471 if (FMF.noSignedZeros() && match(Op0, m_AnyZeroFP()) && in simplifyFSubInst()
5481 if (Op0 == Op1) in simplifyFSubInst()
5482 return Constant::getNullValue(Op0->getType()); in simplifyFSubInst()
5485 if (match(Op0, m_Inf())) in simplifyFSubInst()
5486 return Op0; in simplifyFSubInst()
5496 (match(Op1, m_FSub(m_Specific(Op0), m_Value(X))) || in simplifyFSubInst()
5497 match(Op0, m_c_FAdd(m_Specific(Op1), m_Value(X))))) in simplifyFSubInst()
5503 static Value *simplifyFMAFMul(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFMAFMul() argument
5507 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFMAFMul()
5514 if (match(Op0, m_FPOne()) || match(Op0, m_AnyZeroFP())) in simplifyFMAFMul()
5515 std::swap(Op0, Op1); in simplifyFMAFMul()
5519 return Op0; in simplifyFMAFMul()
5524 return ConstantFP::getNullValue(Op0->getType()); in simplifyFMAFMul()
5527 if (isKnownNeverInfinity(Op0, Q.TLI) && isKnownNeverNaN(Op0, Q.TLI) && in simplifyFMAFMul()
5528 SignBitMustBeZero(Op0, Q.TLI)) in simplifyFMAFMul()
5537 if (Op0 == Op1 && match(Op0, m_Sqrt(m_Value(X))) && FMF.allowReassoc() && in simplifyFMAFMul()
5546 simplifyFMulInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFMulInst() argument
5551 if (Constant *C = foldOrCommuteConstant(Instruction::FMul, Op0, Op1, Q)) in simplifyFMulInst()
5555 return simplifyFMAFMul(Op0, Op1, FMF, Q, MaxRecurse, ExBehavior, Rounding); in simplifyFMulInst()
5558 Value *llvm::simplifyFAddInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFAddInst() argument
5562 return ::simplifyFAddInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFAddInst()
5566 Value *llvm::simplifyFSubInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFSubInst() argument
5570 return ::simplifyFSubInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFSubInst()
5574 Value *llvm::simplifyFMulInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFMulInst() argument
5578 return ::simplifyFMulInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFMulInst()
5582 Value *llvm::simplifyFMAFMul(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFMAFMul() argument
5586 return ::simplifyFMAFMul(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFMAFMul()
5591 simplifyFDivInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFDivInst() argument
5596 if (Constant *C = foldOrCommuteConstant(Instruction::FDiv, Op0, Op1, Q)) in simplifyFDivInst()
5599 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFDivInst()
5607 return Op0; in simplifyFDivInst()
5612 if (FMF.noNaNs() && FMF.noSignedZeros() && match(Op0, m_AnyZeroFP())) in simplifyFDivInst()
5613 return ConstantFP::getNullValue(Op0->getType()); in simplifyFDivInst()
5618 if (Op0 == Op1) in simplifyFDivInst()
5619 return ConstantFP::get(Op0->getType(), 1.0); in simplifyFDivInst()
5623 if (FMF.allowReassoc() && match(Op0, m_c_FMul(m_Value(X), m_Specific(Op1)))) in simplifyFDivInst()
5629 if (match(Op0, m_FNegNSZ(m_Specific(Op1))) || in simplifyFDivInst()
5630 match(Op1, m_FNegNSZ(m_Specific(Op0)))) in simplifyFDivInst()
5631 return ConstantFP::get(Op0->getType(), -1.0); in simplifyFDivInst()
5641 Value *llvm::simplifyFDivInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFDivInst() argument
5645 return ::simplifyFDivInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFDivInst()
5650 simplifyFRemInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFRemInst() argument
5655 if (Constant *C = foldOrCommuteConstant(Instruction::FRem, Op0, Op1, Q)) in simplifyFRemInst()
5658 if (Constant *C = simplifyFPOp({Op0, Op1}, FMF, Q, ExBehavior, Rounding)) in simplifyFRemInst()
5669 if (match(Op0, m_PosZeroFP())) in simplifyFRemInst()
5670 return ConstantFP::getNullValue(Op0->getType()); in simplifyFRemInst()
5672 if (match(Op0, m_NegZeroFP())) in simplifyFRemInst()
5673 return ConstantFP::getNegativeZero(Op0->getType()); in simplifyFRemInst()
5679 Value *llvm::simplifyFRemInst(Value *Op0, Value *Op1, FastMathFlags FMF, in simplifyFRemInst() argument
5683 return ::simplifyFRemInst(Op0, Op1, FMF, Q, RecursionLimit, ExBehavior, in simplifyFRemInst()
5911 static Value *simplifyUnaryIntrinsic(Function *F, Value *Op0, in simplifyUnaryIntrinsic() argument
5916 if (auto *II = dyn_cast<IntrinsicInst>(Op0)) in simplifyUnaryIntrinsic()
5926 auto *II = dyn_cast<IntrinsicInst>(Op0); in simplifyUnaryIntrinsic()
5928 match(Op0, m_SIToFP(m_Value())) || match(Op0, m_UIToFP(m_Value()))) in simplifyUnaryIntrinsic()
5929 return Op0; in simplifyUnaryIntrinsic()
5935 if (SignBitMustBeZero(Op0, Q.TLI)) in simplifyUnaryIntrinsic()
5936 return Op0; in simplifyUnaryIntrinsic()
5940 if (match(Op0, m_BSwap(m_Value(X)))) in simplifyUnaryIntrinsic()
5945 if (match(Op0, m_BitReverse(m_Value(X)))) in simplifyUnaryIntrinsic()
5950 if (isKnownToBeAPowerOfTwo(Op0, Q.DL, /*OrZero*/ false, 0, Q.AC, Q.CxtI, in simplifyUnaryIntrinsic()
5952 return ConstantInt::get(Op0->getType(), 1); in simplifyUnaryIntrinsic()
5955 unsigned BitWidth = Op0->getType()->getScalarSizeInBits(); in simplifyUnaryIntrinsic()
5956 if (MaskedValueIsZero(Op0, APInt::getHighBitsSet(BitWidth, BitWidth - 1), in simplifyUnaryIntrinsic()
5958 return Op0; in simplifyUnaryIntrinsic()
5964 match(Op0, m_Intrinsic<Intrinsic::log>(m_Value(X)))) in simplifyUnaryIntrinsic()
5970 match(Op0, m_Intrinsic<Intrinsic::log2>(m_Value(X)))) in simplifyUnaryIntrinsic()
5976 match(Op0, m_Intrinsic<Intrinsic::exp>(m_Value(X)))) in simplifyUnaryIntrinsic()
5982 (match(Op0, m_Intrinsic<Intrinsic::exp2>(m_Value(X))) || in simplifyUnaryIntrinsic()
5983 match(Op0, in simplifyUnaryIntrinsic()
5990 match(Op0, m_Intrinsic<Intrinsic::pow>(m_SpecificFP(10.0), m_Value(X)))) in simplifyUnaryIntrinsic()
5995 if (match(Op0, m_VecReverse(m_Value(X)))) in simplifyUnaryIntrinsic()
5998 if (isSplatValue(Op0)) in simplifyUnaryIntrinsic()
5999 return Op0; in simplifyUnaryIntrinsic()
6011 static Value *foldMinMaxSharedOp(Intrinsic::ID IID, Value *Op0, Value *Op1) { in foldMinMaxSharedOp() argument
6013 if (!match(Op0, m_MaxOrMin(m_Value(X), m_Value(Y)))) in foldMinMaxSharedOp()
6016 auto *MM0 = dyn_cast<IntrinsicInst>(Op0); in foldMinMaxSharedOp()
6033 static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1, in simplifyBinaryIntrinsic() argument
6043 if (match(Op0, m_Intrinsic<Intrinsic::abs>(m_Value(), m_Value()))) in simplifyBinaryIntrinsic()
6044 return Op0; in simplifyBinaryIntrinsic()
6049 if (match(Op0, m_Shl(m_One(), m_Value(X)))) in simplifyBinaryIntrinsic()
6055 if (match(Op0, m_LShr(m_Negative(), m_Value(X)))) in simplifyBinaryIntrinsic()
6057 if (match(Op0, m_AShr(m_Negative(), m_Value()))) in simplifyBinaryIntrinsic()
6066 if (Op0 == Op1) in simplifyBinaryIntrinsic()
6067 return Op0; in simplifyBinaryIntrinsic()
6070 if (match(Op0, m_ImmConstant())) in simplifyBinaryIntrinsic()
6071 std::swap(Op0, Op1); in simplifyBinaryIntrinsic()
6090 return Op0; in simplifyBinaryIntrinsic()
6094 auto *MinMax0 = dyn_cast<IntrinsicInst>(Op0); in simplifyBinaryIntrinsic()
6103 return Op0; in simplifyBinaryIntrinsic()
6107 if (Value *V = foldMinMaxSharedOp(IID, Op0, Op1)) in simplifyBinaryIntrinsic()
6109 if (Value *V = foldMinMaxSharedOp(IID, Op1, Op0)) in simplifyBinaryIntrinsic()
6114 if (isICmpTrue(Pred, Op0, Op1, Q.getWithoutUndef(), RecursionLimit)) in simplifyBinaryIntrinsic()
6115 return Op0; in simplifyBinaryIntrinsic()
6116 if (isICmpTrue(Pred, Op1, Op0, Q.getWithoutUndef(), RecursionLimit)) in simplifyBinaryIntrinsic()
6120 isImpliedByDomCondition(Pred, Op0, Op1, Q.CxtI, Q.DL)) in simplifyBinaryIntrinsic()
6121 return *Imp ? Op0 : Op1; in simplifyBinaryIntrinsic()
6123 isImpliedByDomCondition(Pred, Op1, Op0, Q.CxtI, Q.DL)) in simplifyBinaryIntrinsic()
6124 return *Imp ? Op1 : Op0; in simplifyBinaryIntrinsic()
6133 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
6140 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) { in simplifyBinaryIntrinsic()
6151 if (match(Op0, m_Zero()) || match(Op1, m_Zero())) in simplifyBinaryIntrinsic()
6155 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
6161 if (match(Op0, m_AllOnes()) || match(Op1, m_AllOnes())) in simplifyBinaryIntrinsic()
6169 if (Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
6174 return Op0; in simplifyBinaryIntrinsic()
6176 if (match(Op0, m_Zero())) in simplifyBinaryIntrinsic()
6181 if (match(Op0, m_Zero()) || match(Op1, m_AllOnes())) in simplifyBinaryIntrinsic()
6186 if (Op0 == Op1 || Q.isUndefValue(Op0) || Q.isUndefValue(Op1)) in simplifyBinaryIntrinsic()
6190 return Op0; in simplifyBinaryIntrinsic()
6193 if (auto *C0 = dyn_cast<Constant>(Op0)) in simplifyBinaryIntrinsic()
6201 return ConstantFP::get(Op0->getType(), 1.0); in simplifyBinaryIntrinsic()
6204 return Op0; in simplifyBinaryIntrinsic()
6209 if (Op0 == Op1) in simplifyBinaryIntrinsic()
6210 return Op0; in simplifyBinaryIntrinsic()
6213 if (match(Op0, m_FNeg(m_Specific(Op1))) || in simplifyBinaryIntrinsic()
6214 match(Op1, m_FNeg(m_Specific(Op0)))) in simplifyBinaryIntrinsic()
6218 if (isa<PoisonValue>(Op0)) in simplifyBinaryIntrinsic()
6227 if (Q.isUndefValue(Op0)) in simplifyBinaryIntrinsic()
6236 if (Op0 == Op1) in simplifyBinaryIntrinsic()
6237 return Op0; in simplifyBinaryIntrinsic()
6240 if (isa<Constant>(Op0)) in simplifyBinaryIntrinsic()
6241 std::swap(Op0, Op1); in simplifyBinaryIntrinsic()
6245 return Op0; in simplifyBinaryIntrinsic()
6255 return PropagateNaN ? propagateNaN(cast<Constant>(Op1)) : Op0; in simplifyBinaryIntrinsic()
6274 return Op0; in simplifyBinaryIntrinsic()
6279 if (auto *M0 = dyn_cast<IntrinsicInst>(Op0)) in simplifyBinaryIntrinsic()
6282 return Op0; in simplifyBinaryIntrinsic()
6285 (M1->getOperand(0) == Op0 || M1->getOperand(1) == Op0)) in simplifyBinaryIntrinsic()
6296 if (match(Op0, m_Intrinsic<Intrinsic::vector_insert>(m_Value(), m_Value(X), in simplifyBinaryIntrinsic()
6358 Value *Op0 = Call->getArgOperand(0), *Op1 = Call->getArgOperand(1), in simplifyIntrinsic() local
6362 if (Q.isUndefValue(Op0) && Q.isUndefValue(Op1)) in simplifyIntrinsic()
6378 if (match(Op0, m_Zero()) && match(Op1, m_Zero())) in simplifyIntrinsic()
6382 if (match(Op0, m_AllOnes()) && match(Op1, m_AllOnes())) in simplifyIntrinsic()
6388 Value *Op0 = Call->getArgOperand(0); in simplifyIntrinsic() local
6393 simplifyFPOp({Op0, Op1, Op2}, {}, Q, *FPI->getExceptionBehavior(), in simplifyIntrinsic()
6400 Value *Op0 = Call->getArgOperand(0); in simplifyIntrinsic() local
6403 if (Value *V = simplifyFPOp({Op0, Op1, Op2}, {}, Q, fp::ebIgnore, in simplifyIntrinsic()
6410 Value *Op0 = Call->getArgOperand(0); in simplifyIntrinsic() local
6418 if (isa<Constant>(Op0)) in simplifyIntrinsic()
6419 std::swap(Op0, Op1); in simplifyIntrinsic()
6434 return Op0; in simplifyIntrinsic()
6545 static Value *simplifyFreezeInst(Value *Op0, const SimplifyQuery &Q) { in simplifyFreezeInst() argument
6547 if (llvm::isGuaranteedNotToBeUndefOrPoison(Op0, Q.AC, Q.CxtI, Q.DT)) in simplifyFreezeInst()
6548 return Op0; in simplifyFreezeInst()
6553 Value *llvm::simplifyFreezeInst(Value *Op0, const SimplifyQuery &Q) { in simplifyFreezeInst() argument
6554 return ::simplifyFreezeInst(Op0, Q); in simplifyFreezeInst()