mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[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
This commit is contained in:
parent
09464eb2ae
commit
883f134b81
@ -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));
|
||||
}
|
||||
|
@ -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 }
|
||||
|
Loading…
x
Reference in New Issue
Block a user