Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -834,6 +834,12 @@ // Compute the KnownZero/KnownOne bits to simplify things downstream. computeKnownBits(I, KnownZero, KnownOne, Depth, CxtI); + + // If this user is only demanding bits that we know, return the known + // constant. + if ((DemandedMask & (KnownZero|KnownOne)) == DemandedMask) + return Constant::getIntegerValue(ITy, KnownOne); + return nullptr; } Index: llvm/trunk/test/Transforms/InstCombine/and2.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/and2.ll +++ llvm/trunk/test/Transforms/InstCombine/and2.ll @@ -171,7 +171,7 @@ define i32 @test14(i32 %a, i32 %b) { ; CHECK-LABEL: @test14( ; CHECK-NEXT: [[X:%.*]] = shl i32 [[A:%.*]], 8 -; CHECK-NEXT: [[Y:%.*]] = sub i32 [[X]], [[B:%.*]] +; CHECK-NEXT: [[Y:%.*]] = sub i32 0, [[B:%.*]] ; CHECK-NEXT: [[Z:%.*]] = and i32 [[Y]], 128 ; CHECK-NEXT: [[W:%.*]] = mul i32 [[Z]], [[X]] ; CHECK-NEXT: ret i32 [[W]]