[llvm] r230673 - SCEVExpander incorrectly marks generated subtractions as nuw/nsw
Sanjoy Das
sanjoy at playingwithpointers.com
Thu Feb 26 11:51:35 PST 2015
Author: sanjoy
Date: Thu Feb 26 13:51:35 2015
New Revision: 230673
URL: http://llvm.org/viewvc/llvm-project?rev=230673&view=rev
Log:
SCEVExpander incorrectly marks generated subtractions as nuw/nsw
It is not sound to mark the increment operation as `nuw` or `nsw`
based on a proof off of the add recurrence if the increment operation
we emit happens to be a `sub` instruction.
I could not come up with a test case for this -- the cases where
SCEVExpander decides to emit a `sub` instruction is quite small, and I
cannot think of a way I'd be able to get SCEV to prove that the
increment does not overflow in those cases.
Differential Revision: http://reviews.llvm.org/D7899
Modified:
llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
Modified: llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp?rev=230673&r1=230672&r2=230673&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolutionExpander.cpp Thu Feb 26 13:51:35 2015
@@ -1182,9 +1182,6 @@ SCEVExpander::getAddRecExprPHILiterally(
}
}
- bool IncrementIsNUW = IsIncrementNUW(SE, Normalized);
- bool IncrementIsNSW = IsIncrementNSW(SE, Normalized);
-
// Save the original insertion point so we can restore it when we're done.
BuilderType::InsertPointGuard Guard(Builder);
@@ -1219,6 +1216,12 @@ SCEVExpander::getAddRecExprPHILiterally(
// Expand the step somewhere that dominates the loop header.
Value *StepV = expandCodeFor(Step, IntTy, L->getHeader()->begin());
+ // The no-wrap behavior proved by IsIncrement(NUW|NSW) is only applicable if
+ // we actually do emit an addition. It does not apply if we emit a
+ // subtraction.
+ bool IncrementIsNUW = !useSubtract && IsIncrementNUW(SE, Normalized);
+ bool IncrementIsNSW = !useSubtract && IsIncrementNSW(SE, Normalized);
+
// Create the PHI.
BasicBlock *Header = L->getHeader();
Builder.SetInsertPoint(Header, Header->begin());
More information about the llvm-commits
mailing list