mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-13 08:56:04 +00:00
Revert 260705, it appears to be causing pr26628
The root issue appears to be a confusion around what makeNoWrapRegion actually does. It seems likely we need two versions of this function with slightly different semantics. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260981 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a49cd63159
commit
3506c68e2b
@ -961,27 +961,6 @@ bool LazyValueInfoCache::solveBlockValueConstantRange(LVILatticeVal &BBLV,
|
||||
if (isa<BinaryOperator>(BBI)) {
|
||||
if (ConstantInt *RHS = dyn_cast<ConstantInt>(BBI->getOperand(1))) {
|
||||
RHSRange = ConstantRange(RHS->getValue());
|
||||
|
||||
// Try to use information about wrap flags to refine the range LHS can
|
||||
// legally have. This is a slightly weird way to implement forward
|
||||
// propagation over overflowing instructions, but it seems to be the only
|
||||
// clean one we have. NOTE: Because we may have speculated the
|
||||
// instruction, we can't constrain other uses of LHS even if they would
|
||||
// seem to be equivelent control dependent with this op.
|
||||
if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(BBI)) {
|
||||
unsigned WrapKind = 0;
|
||||
if (OBO->hasNoSignedWrap())
|
||||
WrapKind |= OverflowingBinaryOperator::NoSignedWrap;
|
||||
if (OBO->hasNoUnsignedWrap())
|
||||
WrapKind |= OverflowingBinaryOperator::NoUnsignedWrap;
|
||||
|
||||
if (WrapKind) {
|
||||
auto OpCode = static_cast<Instruction::BinaryOps>(BBI->getOpcode());
|
||||
auto NoWrapCR =
|
||||
ConstantRange::makeNoWrapRegion(OpCode, RHS->getValue(), WrapKind);
|
||||
LHSRange = LHSRange.intersectWith(NoWrapCR);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BBLV.markOverdefined();
|
||||
return true;
|
||||
|
@ -199,58 +199,3 @@ out:
|
||||
next:
|
||||
ret void
|
||||
}
|
||||
|
||||
; Can we use nsw in LVI to prove lack of overflow?
|
||||
define i1 @add_nsw(i32 %s) {
|
||||
; CHECK-LABEL: @add_nsw(
|
||||
entry:
|
||||
%cmp = icmp sgt i32 %s, 0
|
||||
br i1 %cmp, label %positive, label %out
|
||||
|
||||
positive:
|
||||
%add = add nsw i32 %s, 1
|
||||
%res = icmp sgt i32 %add, 0
|
||||
br label %next
|
||||
next:
|
||||
; CHECK: next:
|
||||
; CHECK: ret i1 true
|
||||
ret i1 %res
|
||||
out:
|
||||
ret i1 false
|
||||
}
|
||||
|
||||
define i1 @add_nsw2(i32 %s) {
|
||||
; CHECK-LABEL: @add_nsw2(
|
||||
entry:
|
||||
%cmp = icmp sge i32 %s, 0
|
||||
br i1 %cmp, label %positive, label %out
|
||||
|
||||
positive:
|
||||
%add = add nsw i32 %s, 1
|
||||
%res = icmp ne i32 %add, 0
|
||||
br label %next
|
||||
next:
|
||||
; CHECK: next:
|
||||
; CHECK: ret i1 true
|
||||
ret i1 %res
|
||||
out:
|
||||
ret i1 false
|
||||
}
|
||||
|
||||
define i1 @add_nuw(i32 %s) {
|
||||
; CHECK-LABEL: @add_nuw(
|
||||
entry:
|
||||
%cmp = icmp ult i32 %s, 400
|
||||
br i1 %cmp, label %positive, label %out
|
||||
|
||||
positive:
|
||||
%add = add nsw i32 %s, 1
|
||||
%res = icmp ne i32 %add, -100
|
||||
br label %next
|
||||
next:
|
||||
; CHECK: next:
|
||||
; CHECK: ret i1 true
|
||||
ret i1 %res
|
||||
out:
|
||||
ret i1 false
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user