mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
Add back commit r210029.
The code was actually correct. Sorry for the confusion. I have expanded the comment saying why the analysis is valid to avoid me misunderstaning it again in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210052 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -898,10 +898,20 @@ bool InstCombiner::WillNotOverflowSignedAdd(Value *LHS, Value *RHS) {
|
||||
// There are different heuristics we can use for this. Here are some simple
|
||||
// ones.
|
||||
|
||||
// Add has the property that adding any two 2's complement numbers can only
|
||||
// have one carry bit which can change a sign. As such, if LHS and RHS each
|
||||
// have at least two sign bits, we know that the addition of the two values
|
||||
// will sign extend fine.
|
||||
// If LHS and RHS each have at least two sign bits, the addition will look
|
||||
// like
|
||||
//
|
||||
// XX..... +
|
||||
// YY.....
|
||||
//
|
||||
// If the carry into the most significant position is 0, X and Y can't both
|
||||
// be 1 and therefore the carry out of the addition is also 0.
|
||||
//
|
||||
// If the carry into the most significant position is 1, X and Y can't both
|
||||
// be 0 and therefore the carry out of the addition is also 1.
|
||||
//
|
||||
// Since the carry into the most significant position is always equal to
|
||||
// the carry out of the addition, there is no signed overflow.
|
||||
if (ComputeNumSignBits(LHS) > 1 && ComputeNumSignBits(RHS) > 1)
|
||||
return true;
|
||||
|
||||
@@ -1191,6 +1201,11 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
|
||||
return BinaryOperator::CreateOr(A, B);
|
||||
}
|
||||
|
||||
if (!I.hasNoSignedWrap() && WillNotOverflowSignedAdd(LHS, RHS)) {
|
||||
Changed = true;
|
||||
I.setHasNoSignedWrap(true);
|
||||
}
|
||||
|
||||
return Changed ? &I : nullptr;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user