mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-23 22:23:00 +00:00
Analysis: Reformulate WillNotOverflowUnsignedAdd for reusability
WillNotOverflowUnsignedAdd's smarts will live in ValueTracking as computeOverflowForUnsignedAdd. It now returns a tri-state result: never overflows, always overflows and sometimes overflows. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225329 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -937,22 +937,6 @@ bool InstCombiner::WillNotOverflowSignedAdd(Value *LHS, Value *RHS,
|
||||
return false;
|
||||
}
|
||||
|
||||
/// WillNotOverflowUnsignedAdd - Return true if we can prove that:
|
||||
/// (zext (add LHS, RHS)) === (add (zext LHS), (zext RHS))
|
||||
bool InstCombiner::WillNotOverflowUnsignedAdd(Value *LHS, Value *RHS,
|
||||
Instruction *CxtI) {
|
||||
// There are different heuristics we can use for this. Here is a simple one.
|
||||
// If the sign bit of LHS and that of RHS are both zero, no unsigned wrap.
|
||||
bool LHSKnownNonNegative, LHSKnownNegative;
|
||||
bool RHSKnownNonNegative, RHSKnownNegative;
|
||||
ComputeSignBit(LHS, LHSKnownNonNegative, LHSKnownNegative, /*Depth=*/0, CxtI);
|
||||
ComputeSignBit(RHS, RHSKnownNonNegative, RHSKnownNegative, /*Depth=*/0, CxtI);
|
||||
if (LHSKnownNonNegative && RHSKnownNonNegative)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// \brief Return true if we can prove that:
|
||||
/// (sub LHS, RHS) === (sub nsw LHS, RHS)
|
||||
/// This basically requires proving that the add in the original type would not
|
||||
@@ -1327,7 +1311,9 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
|
||||
Changed = true;
|
||||
I.setHasNoSignedWrap(true);
|
||||
}
|
||||
if (!I.hasNoUnsignedWrap() && WillNotOverflowUnsignedAdd(LHS, RHS, &I)) {
|
||||
if (!I.hasNoUnsignedWrap() &&
|
||||
computeOverflowForUnsignedAdd(LHS, RHS, &I) ==
|
||||
OverflowResult::NeverOverflows) {
|
||||
Changed = true;
|
||||
I.setHasNoUnsignedWrap(true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user