Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -545,6 +545,22 @@ } break; } + case Instruction::UDiv: { + // UDiv doesn't demand low bits that are zero in the divisor. + const APInt *SA; + if (match(I->getOperand(1), m_APInt(SA))) { + // If the shift is exact, then it does demand the low bits. + if (cast(I)->isExact()) + break; + + // FIXME: Take the demanded mask of the result into account. + APInt DemandedMaskIn = + APInt::getHighBitsSet(BitWidth, BitWidth - SA->countTrailingZeros()); + if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Depth + 1)) + return I; + } + break; + } case Instruction::SRem: if (ConstantInt *Rem = dyn_cast(I->getOperand(1))) { // X % -1 demands all the bits because we don't want to introduce Index: llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll +++ llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll @@ -83,3 +83,24 @@ store i1 %C9, i1* undef ret i177 %B1 } + +define i32 @udiv_demanded(i32 %a) { +; CHECK-LABEL: @udiv_demanded( +; CHECK-NEXT: [[U:%.*]] = udiv i32 [[A:%.*]], 12 +; CHECK-NEXT: ret i32 [[U]] +; + %o = or i32 %a, 3 + %u = udiv i32 %o, 12 + ret i32 %u +} + +define i32 @udiv_exact_demanded(i32 %a) { +; CHECK-LABEL: @udiv_exact_demanded( +; CHECK-NEXT: [[O:%.*]] = and i32 [[A:%.*]], -3 +; CHECK-NEXT: [[U:%.*]] = udiv exact i32 [[O]], 12 +; CHECK-NEXT: ret i32 [[U]] +; + %o = and i32 %a, -3 + %u = udiv exact i32 %o, 12 + ret i32 %u +}