diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-01-09 18:56:03 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-01-09 18:56:03 +0000 |
commit | 6fb1357c35b51c78d8fa0fa6db0e10a0436bb750 (patch) | |
tree | 0a17d6214ec15fff3b22045669d06b9a296cffa4 | |
parent | ba22da0da3f012d7864bafb2de83572ec4362865 (diff) | |
download | bcm5719-llvm-6fb1357c35b51c78d8fa0fa6db0e10a0436bb750.tar.gz bcm5719-llvm-6fb1357c35b51c78d8fa0fa6db0e10a0436bb750.zip |
[InstCombine] weaken assertions for icmp folds (PR35846)
Because of potential UB (known bits conflicts with an llvm.assume),
we have to check rather than assert here because InstSimplify doesn't
kill the compare:
https://bugs.llvm.org/show_bug.cgi?id=35846
llvm-svn: 322104
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 14 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/assume.ll | 17 |
2 files changed, 21 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 4fe653b4bd0..6df09dfb3a4 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -1893,11 +1893,8 @@ Instruction *InstCombiner::foldICmpShlConstant(ICmpInst &Cmp, APInt ShiftedC = C.ashr(*ShiftAmt); return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC)); } - if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) { - // This is the same code as the SGT case, but assert the pre-condition - // that is needed for this to work with equality predicates. - assert(C.ashr(*ShiftAmt).shl(*ShiftAmt) == C && - "Compare known true or false was not folded"); + if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) && + C.ashr(*ShiftAmt).shl(*ShiftAmt) == C) { APInt ShiftedC = C.ashr(*ShiftAmt); return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC)); } @@ -1926,11 +1923,8 @@ Instruction *InstCombiner::foldICmpShlConstant(ICmpInst &Cmp, APInt ShiftedC = C.lshr(*ShiftAmt); return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC)); } - if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) { - // This is the same code as the UGT case, but assert the pre-condition - // that is needed for this to work with equality predicates. - assert(C.lshr(*ShiftAmt).shl(*ShiftAmt) == C && - "Compare known true or false was not folded"); + if ((Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE) && + C.lshr(*ShiftAmt).shl(*ShiftAmt) == C) { APInt ShiftedC = C.lshr(*ShiftAmt); return new ICmpInst(Pred, X, ConstantInt::get(ShType, ShiftedC)); } diff --git a/llvm/test/Transforms/InstCombine/assume.ll b/llvm/test/Transforms/InstCombine/assume.ll index 13fa6339e85..7016dfc577f 100644 --- a/llvm/test/Transforms/InstCombine/assume.ll +++ b/llvm/test/Transforms/InstCombine/assume.ll @@ -275,6 +275,23 @@ define i1 @nonnull4(i32** %a) { ret i1 %rval } +; PR35846 - https://bugs.llvm.org/show_bug.cgi?id=35846 + +define i32 @assumption_conflicts_with_known_bits(i32 %a, i32 %b) { +; CHECK-LABEL: @assumption_conflicts_with_known_bits( +; CHECK-NEXT: tail call void @llvm.assume(i1 false) +; CHECK-NEXT: ret i32 0 +; + %and1 = and i32 %b, 3 + %B1 = lshr i32 %and1, %and1 + %B3 = shl nuw nsw i32 %and1, %B1 + %cmp = icmp eq i32 %B3, 1 + tail call void @llvm.assume(i1 %cmp) + %cmp2 = icmp eq i32 %B1, %B3 + tail call void @llvm.assume(i1 %cmp2) + ret i32 %and1 +} + attributes #0 = { nounwind uwtable } attributes #1 = { nounwind } |