mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 06:30:39 +00:00
Induction variables must be phi nodes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1402 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f60dc88b3d
commit
df89f6efbc
@ -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
|
||||
|
@ -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...
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user