mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-12 18:33:22 +00:00
Don't attempt to add 'nsw' when intermediate instructions had no such guarantee.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137572 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
daf27ea899
commit
7f0170c197
@ -146,7 +146,6 @@ static bool MaintainNoSignedWrap(BinaryOperator &I, Value *B, Value *C) {
|
||||
return !Overflow;
|
||||
}
|
||||
|
||||
|
||||
/// SimplifyAssociativeOrCommutative - This performs a few simplifications for
|
||||
/// operators which are associative or commutative:
|
||||
//
|
||||
@ -197,7 +196,10 @@ bool InstCombiner::SimplifyAssociativeOrCommutative(BinaryOperator &I) {
|
||||
I.setOperand(1, V);
|
||||
// Conservatively clear the optional flags, since they may not be
|
||||
// preserved by the reassociation.
|
||||
if (MaintainNoSignedWrap(I, B, C)) {
|
||||
if (MaintainNoSignedWrap(I, B, C) &&
|
||||
(!Op0 || (isa<BinaryOperator>(Op0) && Op0->hasNoSignedWrap()))) {
|
||||
// Note: this is only valid because SimplifyBinOp doesn't look at
|
||||
// the operands to Op0.
|
||||
I.clearSubclassOptionalData();
|
||||
I.setHasNoSignedWrap(true);
|
||||
} else {
|
||||
@ -292,10 +294,11 @@ bool InstCombiner::SimplifyAssociativeOrCommutative(BinaryOperator &I) {
|
||||
I.setOperand(1, Folded);
|
||||
// Conservatively clear the optional flags, since they may not be
|
||||
// preserved by the reassociation.
|
||||
if (MaintainNoSignedWrap(I, C1, C2)) {
|
||||
if (MaintainNoSignedWrap(I, C1, C2) && Op0->hasNoSignedWrap() &&
|
||||
Op1->hasNoSignedWrap()) {
|
||||
New->setHasNoSignedWrap(true);
|
||||
I.clearSubclassOptionalData();
|
||||
I.setHasNoSignedWrap(true);
|
||||
New->setHasNoSignedWrap(true);
|
||||
} else {
|
||||
I.clearSubclassOptionalData();
|
||||
}
|
||||
|
@ -46,10 +46,38 @@ define i32 @preserve1(i32 %x) nounwind {
|
||||
ret i32 %add3
|
||||
}
|
||||
|
||||
; CHECK: @preserve2
|
||||
; CHECK: add nsw i8 %A, %B
|
||||
; CHECK: add nsw i8
|
||||
define i8 @preserve2(i8 %A, i8 %B) nounwind {
|
||||
%x = add nsw i8 %A, 10
|
||||
%y = add nsw i8 %B, 10
|
||||
%add = add nsw i8 %x, %y
|
||||
ret i8 %add
|
||||
}
|
||||
|
||||
; CHECK: @nopreserve1
|
||||
; CHECK: add i8 %x, -126
|
||||
define i8 @nopreserve1(i8 %x) nounwind {
|
||||
%add = add nsw i8 %x, 127
|
||||
%add3 = add nsw i8 %add, 3
|
||||
ret i8 %add3
|
||||
}
|
||||
}
|
||||
|
||||
; CHECK: @nopreserve2
|
||||
; CHECK: add i8 %x, 3
|
||||
define i8 @nopreserve2(i8 %x) nounwind {
|
||||
%add = add i8 %x, 1
|
||||
%add3 = add nsw i8 %add, 2
|
||||
ret i8 %add3
|
||||
}
|
||||
|
||||
; CHECK: @nopreserve3
|
||||
; CHECK: add i8 %A, %B
|
||||
; CHECK: add i8
|
||||
define i8 @nopreserve3(i8 %A, i8 %B) nounwind {
|
||||
%x = add i8 %A, 10
|
||||
%y = add i8 %B, 10
|
||||
%add = add nsw i8 %x, %y
|
||||
ret i8 %add
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user