3.5 snapshot (which around 60% of them did).. r203025, r203050, r203054, r203281, r203581, r203719, r203818, r204155, r204304, r205067, r205630, r205738, r207990, r208501. ok matthew@
46 lines
1.9 KiB
Plaintext
46 lines
1.9 KiB
Plaintext
$OpenBSD: patch-lib_Analysis_IVUsers_cpp,v 1.1 2014/07/10 22:46:37 brad Exp $
|
|
|
|
r203719
|
|
PR17473: Don't normalize an expression during postinc transformation unless it's
|
|
invertible.
|
|
|
|
--- lib/Analysis/IVUsers.cpp.orig Sun Mar 2 21:57:38 2014
|
|
+++ lib/Analysis/IVUsers.cpp Sat Jun 14 03:56:54 2014
|
|
@@ -186,15 +186,34 @@ bool IVUsers::AddUsersImpl(Instruction *I,
|
|
|
|
if (AddUserToIVUsers) {
|
|
// Okay, we found a user that we cannot reduce.
|
|
- IVUses.push_back(new IVStrideUse(this, User, I));
|
|
- IVStrideUse &NewUse = IVUses.back();
|
|
+ IVStrideUse &NewUse = AddUser(User, I);
|
|
// Autodetect the post-inc loop set, populating NewUse.PostIncLoops.
|
|
// The regular return value here is discarded; instead of recording
|
|
// it, we just recompute it when we need it.
|
|
+ const SCEV *OriginalISE = ISE;
|
|
ISE = TransformForPostIncUse(NormalizeAutodetect,
|
|
ISE, User, I,
|
|
NewUse.PostIncLoops,
|
|
*SE, *DT);
|
|
+
|
|
+ // PostIncNormalization effectively simplifies the expression under
|
|
+ // pre-increment assumptions. Those assumptions (no wrapping) might not
|
|
+ // hold for the post-inc value. Catch such cases by making sure the
|
|
+ // transformation is invertible.
|
|
+ if (OriginalISE != ISE) {
|
|
+ const SCEV *DenormalizedISE =
|
|
+ TransformForPostIncUse(Denormalize, ISE, User, I,
|
|
+ NewUse.PostIncLoops, *SE, *DT);
|
|
+
|
|
+ // If we normalized the expression, but denormalization doesn't give the
|
|
+ // original one, discard this user.
|
|
+ if (OriginalISE != DenormalizedISE) {
|
|
+ DEBUG(dbgs() << " DISCARDING (NORMALIZATION ISN'T INVERTIBLE): "
|
|
+ << *ISE << '\n');
|
|
+ IVUses.pop_back();
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
DEBUG(if (SE->getSCEV(I) != ISE)
|
|
dbgs() << " NORMALIZED TO: " << *ISE << '\n');
|
|
}
|