Skip to content

Commit

Permalink
Don't attempt to add 'nsw' when intermediate instructions had no such…
Browse files Browse the repository at this point in the history
… guarantee.

llvm-svn: 137572
  • Loading branch information
nlewycky committed Aug 14, 2011
1 parent de49278 commit ae13df6
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 5 deletions.
11 changes: 7 additions & 4 deletions llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
//
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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();
}
Expand Down
30 changes: 29 additions & 1 deletion llvm/test/Transforms/InstCombine/nsw.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit ae13df6

Please sign in to comment.