Induction variables must be phi nodes
authorChris Lattner <sabre@nondot.org>
Mon, 3 Dec 2001 17:27:42 +0000 (17:27 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 3 Dec 2001 17:27:42 +0000 (17:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1402 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/InductionVariable.h
lib/Analysis/InductionVariable.cpp
tools/analyze/analyze.cpp

index 02fa6deedd58481ff647bd3ba559fd24f824f271..51399550b431a8938365fe00cfe8dce6de077ac6 100644 (file)
@@ -40,14 +40,11 @@ public:
   // Create an induction variable for the specified value.  If it is a PHI, and
   // if it's recognizable, classify it and fill in instance variables.
   //
-  InductionVariable(Instruction *V, cfg::LoopInfo *LoopInfo = 0);
-
+  InductionVariable(PHINode *PN, cfg::LoopInfo *LoopInfo = 0);
 
   // Classify Induction
   static enum iType Classify(const Value *Start, const Value *Step,
                             const cfg::Loop *L = 0);
-                                             
-
 };
 
 #endif
index 706c778a4da3c8a153a728f0dffb75b650b97ea3..b64daa25b3058f84fb593b4ffa7cead1a9f1ab72 100644 (file)
@@ -59,15 +59,14 @@ InductionVariable::Classify(const Value *Start, const Value *Step,
 // Create an induction variable for the specified value.  If it is a PHI, and
 // if it's recognizable, classify it and fill in instance variables.
 //
-InductionVariable::InductionVariable(Instruction *V, cfg::LoopInfo *LoopInfo) {
+InductionVariable::InductionVariable(PHINode *P, cfg::LoopInfo *LoopInfo) {
   InductionType = Unknown;     // Assume the worst
+  Phi = P;
   
-  // If this instruction is not a PHINode, it can't be an induction variable.
-  // Also, if the PHI node has more than two predecessors, we don't know how to
+  // If the PHI node has more than two predecessors, we don't know how to
   // handle it.
   //
-  Phi = dyn_cast<PHINode>(V);
-  if (!Phi || Phi->getNumIncomingValues() != 2) return;
+  if (Phi->getNumIncomingValues() != 2) return;
 
   // If we have loop information, make sure that this PHI node is in the header
   // of a loop...
index da7de6ec9af483089ffa69a516618b031e34624f..9a53bd45af181b7be56159819377a50ed5facd6e 100644 (file)
@@ -13,6 +13,7 @@
 #include "llvm/Instruction.h"
 #include "llvm/Module.h"
 #include "llvm/Method.h"
+#include "llvm/iPHINode.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Assembly/Parser.h"
 #include "llvm/Analysis/Writer.h"
@@ -67,11 +68,12 @@ static void PrintClassifiedExprs(Method *M) {
 static void PrintInductionVariables(Method *M) {
   cfg::LoopInfo LI(M);
   for (Method::inst_iterator I = M->inst_begin(), E = M->inst_end();
-       I != E; ++I) {
-    InductionVariable IV(*I, &LI);
-    if (IV.InductionType != InductionVariable::Unknown)
-      cout << IV;
-  }
+       I != E; ++I)
+    if (PHINode *PN = dyn_cast<PHINode>(*I)) {
+      InductionVariable IV(PN, &LI);
+      if (IV.InductionType != InductionVariable::Unknown)
+        cout << IV;
+    }
 }