[llvm-commits] [llvm] r74376 - in /llvm/trunk: lib/Transforms/Scalar/IndVarSimplify.cpp test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll

Dan Gohman gohman at apple.com
Fri Jun 26 22:16:57 PDT 2009


Author: djg
Date: Sat Jun 27 00:16:57 2009
New Revision: 74376

URL: http://llvm.org/viewvc/llvm-project?rev=74376&view=rev
Log:
When a value is used multiple times within a single PHI, instructions
inserted to replace that value must dominate all of of the basic
blocks associated with the uses of the value in the PHI, not just
one of them.

Added:
    llvm/trunk/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=74376&r1=74375&r2=74376&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Sat Jun 27 00:16:57 2009
@@ -70,6 +70,7 @@
     IVUsers         *IU;
     LoopInfo        *LI;
     ScalarEvolution *SE;
+    DominatorTree   *DT;
     bool Changed;
   public:
 
@@ -329,6 +330,7 @@
   IU = &getAnalysis<IVUsers>();
   LI = &getAnalysis<LoopInfo>();
   SE = &getAnalysis<ScalarEvolution>();
+  DT = &getAnalysis<DominatorTree>();
   Changed = false;
 
   // If there are any floating-point recurrences, attempt to
@@ -479,12 +481,22 @@
       if (!AR->isLoopInvariant(L) && !Stride->isLoopInvariant(L))
         continue;
 
+      // Determine the insertion point for this user. By default, insert
+      // immediately before the user. The SCEVExpander class will automatically
+      // hoist loop invariants out of the loop. For PHI nodes, there may be
+      // multiple uses, so compute the nearest common dominator for the
+      // incoming blocks.
       Instruction *InsertPt = User;
       if (PHINode *PHI = dyn_cast<PHINode>(InsertPt))
-        for (unsigned i = 0; ; ++i)
+        for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i)
           if (PHI->getIncomingValue(i) == Op) {
-            InsertPt = PHI->getIncomingBlock(i)->getTerminator();
-            break;
+            if (InsertPt == User)
+              InsertPt = PHI->getIncomingBlock(i)->getTerminator();
+            else
+              InsertPt =
+                DT->findNearestCommonDominator(InsertPt->getParent(),
+                                               PHI->getIncomingBlock(i))
+                      ->getTerminator();
           }
 
       // Now expand it into actual Instructions and patch it into place.

Added: llvm/trunk/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll?rev=74376&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll (added)
+++ llvm/trunk/test/Transforms/IndVarSimplify/phi-uses-value-multiple-times.ll Sat Jun 27 00:16:57 2009
@@ -0,0 +1,33 @@
+; RUN: llvm-as < %s | opt -indvars
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
+
+ at ue = external global i64
+
+define i32 @foo() nounwind {
+entry:
+	br label %bb38.i
+
+bb14.i27:
+	%t0 = load i64* @ue, align 8
+	%t1 = sub i64 %t0, %i.0.i35
+	%t2 = add i64 %t1, 1
+	br i1 undef, label %bb15.i28, label %bb19.i31
+
+bb15.i28:
+	br label %bb19.i31
+
+bb19.i31:
+	%y.0.i = phi i64 [ %t2, %bb15.i28 ], [ %t2, %bb14.i27 ]
+	br label %bb35.i
+
+bb35.i:
+	br i1 undef, label %bb37.i, label %bb14.i27
+
+bb37.i:
+	%t3 = add i64 %i.0.i35, 1
+	br label %bb38.i
+
+bb38.i:
+	%i.0.i35 = phi i64 [ 1, %entry ], [ %t3, %bb37.i ]
+	br label %bb35.i
+}





More information about the llvm-commits mailing list