Lines Matching defs:C1
228 Constant *C1, *C2;
231 m_ImmConstant(C1))) &&
232 match(C1, m_APInt(IVal))) {
233 // ((X << C2)*C1) == (X * (C1 << C2))
235 ConstantFoldBinaryOpOperands(Instruction::Shl, C1, C2, DL);
246 if (match(&I, m_Mul(m_Value(NewOp), m_Constant(C1)))) {
248 if (Constant *NewCst = ConstantExpr::getExactLogBase2(C1)) {
305 // Canonicalize (X+C1)*MulC -> X*MulC+C1*MulC.
306 // Canonicalize (X|C1)*MulC -> X*MulC+C1*MulC.
308 Constant *C1;
309 if (match(Op0, m_OneUse(m_AddLike(m_Value(X), m_ImmConstant(C1))))) {
310 // C1*MulC simplifies to a tidier constant.
311 Value *NewC = Builder.CreateMul(C1, MulC);
373 // (mul (div exact X, C0), C1)
374 // -> (div exact X, C0 / C1)
375 // iff C0 % C1 == 0 and X / (C0 / C1) doesn't create UB.
376 const APInt *C1;
377 auto UDivCheck = [&C1](const APInt &C) { return C.urem(*C1).isZero(); };
378 auto SDivCheck = [&C1](const APInt &C) {
380 APInt::sdivrem(C, *C1, Quot, Rem);
383 if (match(Op1, m_APInt(C1)) &&
690 Constant *C1;
691 if (match(Op0, m_OneUse(m_FDiv(m_Constant(C1), m_Value(X))))) {
692 // (C1 / X) * C --> (C * C1) / X
694 ConstantFoldBinaryOpOperands(Instruction::FMul, C, C1, DL);
698 if (match(Op0, m_FDiv(m_Value(X), m_Constant(C1)))) {
700 // (X / C1) * C --> X * (C / C1)
702 ConstantFoldBinaryOpOperands(Instruction::FDiv, C, C1, DL);
707 // (X / C1) * C --> X / (C1 / C)
709 ConstantFoldBinaryOpOperands(Instruction::FDiv, C1, C, DL);
717 if (match(Op0, m_OneUse(m_FAdd(m_Value(X), m_Constant(C1))))) {
718 // (X + C1) * C --> (X * C) + (C * C1)
720 ConstantFoldBinaryOpOperands(Instruction::FMul, C, C1, DL)) {
725 if (match(Op0, m_OneUse(m_FSub(m_Constant(C1), m_Value(X))))) {
726 // (C1 - X) * C --> (C * C1) - (X * C)
728 ConstantFoldBinaryOpOperands(Instruction::FMul, C, C1, DL)) {
1052 static bool multiplyOverflows(const APInt &C1, const APInt &C2, APInt &Product,
1055 Product = IsSigned ? C1.smul_ov(C2, Overflow) : C1.umul_ov(C2, Overflow);
1059 /// True if C1 is a multiple of C2. Quotient contains C1/C2.
1060 static bool isMultiple(const APInt &C1, const APInt &C2, APInt &Quotient,
1062 assert(C1.getBitWidth() == C2.getBitWidth() && "Constant widths not equal");
1069 if (IsSigned && C1.isMinSignedValue() && C2.isAllOnes())
1072 APInt Remainder(C1.getBitWidth(), /*val=*/0ULL, IsSigned);
1074 APInt::sdivrem(C1, C2, Quotient, Remainder);
1076 APInt::udivrem(C1, C2, Quotient, Remainder);
1195 const APInt *C1;
1197 // (X / C1) / C2 -> X / (C1*C2)
1198 if ((IsSigned && match(Op0, m_SDiv(m_Value(X), m_APInt(C1)))) ||
1199 (!IsSigned && match(Op0, m_UDiv(m_Value(X), m_APInt(C1))))) {
1200 APInt Product(C1->getBitWidth(), /*val=*/0ULL, IsSigned);
1201 if (!multiplyOverflows(*C1, *C2, Product, IsSigned))
1207 if ((IsSigned && match(Op0, m_NSWMul(m_Value(X), m_APInt(C1)))) ||
1208 (!IsSigned && match(Op0, m_NUWMul(m_Value(X), m_APInt(C1))))) {
1210 // (X * C1) / C2 -> X / (C2 / C1) if C2 is a multiple of C1.
1211 if (isMultiple(*C2, *C1, Quotient, IsSigned)) {
1218 // (X * C1) / C2 -> X * (C1 / C2) if C1 is a multiple of C2.
1219 if (isMultiple(*C1, *C2, Quotient, IsSigned)) {
1229 if ((IsSigned && match(Op0, m_NSWShl(m_Value(X), m_APInt(C1))) &&
1230 C1->ult(C1->getBitWidth() - 1)) ||
1231 (!IsSigned && match(Op0, m_NUWShl(m_Value(X), m_APInt(C1))) &&
1232 C1->ult(C1->getBitWidth()))) {
1234 C1->getBitWidth(), static_cast<unsigned>(C1->getZExtValue()));
1236 // (X << C1) / C2 -> X / (C2 >> C1) if C2 is a multiple of 1 << C1.
1244 // (X << C1) / C2 -> X * ((1 << C1) / C2) if 1 << C1 is a multiple of C2.
1256 // ((X * C2) + C1) / C2 --> X + C1/C2
1261 m_APInt(C1))) &&
1262 isMultiple(*C1, *C2, Quotient, IsSigned)) {
1267 m_APInt(C1)))) {
1269 ConstantInt::get(Ty, C1->udiv(*C2)));
1369 const APInt *C1, *C2;
1371 if (OB1HasNSW && match(B, m_APInt(C1)) && !C1->isAllOnes())
1377 if (match(A, m_APInt(C1)) && match(B, m_APInt(C2)) && C2->ule(*C1))
1528 const APInt *C1, *C2;
1529 if (match(Op0, m_LShr(m_Value(X), m_APInt(C1))) && match(Op1, m_APInt(C2))) {
1530 // (X lshr C1) udiv C2 --> X udiv (C2 << C1)
1532 APInt C2ShlC1 = C2->ushl_ov(*C1, Overflow);