diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 6 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/and2.ll | 2 |
2 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index dd789fad569..279f44c2eae 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -834,6 +834,12 @@ Value *InstCombiner::SimplifyMultipleUseDemandedBits(Instruction *I, // 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; } diff --git a/llvm/test/Transforms/InstCombine/and2.ll b/llvm/test/Transforms/InstCombine/and2.ll index 0b4882fa823..1af248b804c 100644 --- a/llvm/test/Transforms/InstCombine/and2.ll +++ b/llvm/test/Transforms/InstCombine/and2.ll @@ -171,7 +171,7 @@ define i32 @test13(i32 %a, i32 %b) { 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]] |