mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-22 10:24:26 +00:00
PR17473:
Don't normalize an expression during postinc transformation unless it's invertible. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203719 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -12,7 +12,6 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
#define DEBUG_TYPE "iv-users"
|
||||
#include "llvm/Analysis/IVUsers.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
@ -186,15 +185,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');
|
||||
}
|
||||
|
Reference in New Issue
Block a user