diff options
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 2 | ||||
-rw-r--r-- | test/Transforms/InstCombine/icmp.ll | 12 |
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 8add1ea618..a7bfe0965b 100644 --- a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -754,7 +754,7 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask, ComputeMaskedBits(I->getOperand(0), LHSKnownZero, LHSKnownOne, Depth+1); // If it's known zero, our sign bit is also zero. if (LHSKnownZero.isNegative()) - KnownZero |= LHSKnownZero; + KnownZero.setBit(KnownZero.getBitWidth() - 1); } break; case Instruction::URem: { diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index c912a576c3..ed1cd1e5a4 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -707,6 +707,18 @@ define i1 @test69(i32 %c) nounwind uwtable { ret i1 %3 } +; PR15940 +; CHECK: @test70 +; CHECK-NEXT: %A = srem i32 5, %X +; CHECK-NEXT: %C = icmp ne i32 %A, 2 +; CHECK-NEXT: ret i1 %C +define i1 @test70(i32 %X) { + %A = srem i32 5, %X + %B = add i32 %A, 2 + %C = icmp ne i32 %B, 4 + ret i1 %C +} + ; CHECK: @icmp_sext16trunc ; CHECK-NEXT: %1 = trunc i32 %x to i16 ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36 |