Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -628,7 +628,7 @@ return Overflow; } -/// True if C2 is a multiple of C1. Quotient contains C2/C1. +/// True if C1 is a multiple of C2. Quotient contains C1/C2. static bool isMultiple(const APInt &C1, const APInt &C2, APInt &Quotient, bool IsSigned) { assert(C1.getBitWidth() == C2.getBitWidth() && "Constant widths not equal"); @@ -714,7 +714,7 @@ APInt C1Shifted = APInt::getOneBitSet( C1->getBitWidth(), static_cast(C1->getLimitedValue())); - // (X << C1) / C2 -> X / (C2 >> C1) if C2 is a multiple of C1. + // (X << C1) / C2 -> X / (C2 >> C1) if C2 is a multiple of 1 << C1. if (isMultiple(*C2, C1Shifted, Quotient, IsSigned)) { auto *BO = BinaryOperator::Create(I.getOpcode(), X, ConstantInt::get(Ty, Quotient)); @@ -722,7 +722,7 @@ return BO; } - // (X << C1) / C2 -> X * (C2 >> C1) if C1 is a multiple of C2. + // (X << C1) / C2 -> X * ((1 << C1) / C2) if 1 << C1 is a multiple of C2. if (isMultiple(C1Shifted, *C2, Quotient, IsSigned)) { auto *Mul = BinaryOperator::Create(Instruction::Mul, X, ConstantInt::get(Ty, Quotient));