From a6ff92a975f2d6ef6a0db7aeaee3ee9fd046307a Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 9 May 2013 16:32:32 +0000 Subject: [PATCH] InstCombine: Don't just copy known bits from the first operand of an srem. That's obviously wrong. Conservatively restrict it to the sign bit, which matches the original intention of this analysis. Fixes PR15940. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181518 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/InstCombineSimplifyDemanded.cpp | 2 +- test/Transforms/InstCombine/icmp.ll | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 8add1ea618d..a7bfe0965b0 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 c912a576c3d..ed1cd1e5a4c 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