summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-09-13 02:09:55 +0000
committerChris Lattner <sabre@nondot.org>2005-09-13 02:09:55 +0000
commitfd018c8dfe1ce6e134af86af01c8d5b6e5534206 (patch)
tree69150a11692a202385c0e7c4b7ff523bea10b009 /llvm/lib/Transforms
parenta78635c1f0cc6a9baf8df658d88e5a5360a8b3c5 (diff)
downloadbcm5719-llvm-fd018c8dfe1ce6e134af86af01c8d5b6e5534206.tar.gz
bcm5719-llvm-fd018c8dfe1ce6e134af86af01c8d5b6e5534206.zip
Fix an issue where LSR would miss rewriting a use of an IV expression by a PHI node that is not the original PHI.
This fixes up a dot-product loop in galgel, speeding it up from 18.47s to 16.13s. llvm-svn: 23327
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 1a6ce62102f..8c66e262e40 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -333,14 +333,14 @@ bool LoopStrengthReduce::AddUsersIfInteresting(Instruction *I, Loop *L,
Instruction *User = cast<Instruction>(*UI);
// Do not infinitely recurse on PHI nodes.
- if (isa<PHINode>(User) && User->getParent() == L->getHeader())
+ if (isa<PHINode>(User) && Processed.count(User))
continue;
// If this is an instruction defined in a nested loop, or outside this loop,
// don't recurse into it.
bool AddUserToIVUsers = false;
if (LI->getLoopFor(User->getParent()) != L) {
- DEBUG(std::cerr << "FOUND USER in nested loop: " << *User
+ DEBUG(std::cerr << "FOUND USER in other loop: " << *User
<< " OF SCEV: " << *ISE << "\n");
AddUserToIVUsers = true;
} else if (!AddUsersIfInteresting(User, L, Processed)) {
@@ -459,9 +459,13 @@ void BasedUser::RewriteInstructionToUseNewBase(const SCEVHandle &NewBase,
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
if (PN->getIncomingValue(i) == OperandValToReplace) {
// If this is a critical edge, split the edge so that we do not insert the
- // code on all predecessor/successor paths.
+ // code on all predecessor/successor paths. We do this unless this is the
+ // canonical backedge for this loop, as this can make some inserted code
+ // be in an illegal position.
if (e != 1 &&
- PN->getIncomingBlock(i)->getTerminator()->getNumSuccessors() > 1) {
+ PN->getIncomingBlock(i)->getTerminator()->getNumSuccessors() > 1 &&
+ (PN->getParent() != L->getHeader() ||
+ !L->contains(PN->getIncomingBlock(i)))) {
// First step, split the critical edge.
SplitCriticalEdge(PN->getIncomingBlock(i), PN->getParent(), P);
OpenPOWER on IntegriCloud