Fix an issue where LSR would miss rewriting a use of an IV expression by a PHI node...
authorChris Lattner <sabre@nondot.org>
Tue, 13 Sep 2005 02:09:55 +0000 (02:09 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 13 Sep 2005 02:09:55 +0000 (02:09 +0000)
This fixes up a dot-product loop in galgel, speeding it up from 18.47s to
16.13s.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23327 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 1a6ce62102f5052fcc32f2437286647396968de9..8c66e262e40b1cab0acaeea36247eb6c6f41d140 100644 (file)
@@ -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);