#include "llvm/iOperators.h"
#include "llvm/iPHINode.h"
#include "llvm/Support/CFG.h"
+#include "Support/StatisticReporter.h"
+
+static Statistic<> NumInserted("pinodes\t\t- Number of Pi nodes inserted");
namespace {
struct PiNodeInserter : public FunctionPass {
- const char *getPassName() const { return "Pi Node Insertion"; }
-
- virtual bool runOnFunction(Function *F);
+ virtual bool runOnFunction(Function &F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.preservesCFG();
- AU.addRequired(DominatorSet::ID);
+ AU.addRequired<DominatorSet>();
}
// insertPiNodeFor - Insert a Pi node for V in the successors of BB if our
//
bool insertPiNodeFor(Value *V, BasicBlock *BB, Value *Rep = 0);
};
+
+ RegisterOpt<PiNodeInserter> X("pinodes", "Pi Node Insertion");
}
Pass *createPiNodeInsertionPass() { return new PiNodeInserter(); }
-bool PiNodeInserter::runOnFunction(Function *F) {
+bool PiNodeInserter::runOnFunction(Function &F) {
bool Changed = false;
- for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
- BasicBlock *BB = *I;
- TerminatorInst *TI = BB->getTerminator();
+ for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
+ TerminatorInst *TI = I->getTerminator();
// FIXME: Insert PI nodes for switch statements too
}
-// alreadyHasPiNodeFor - Return true if there is already a Pi node in BB for
-// V.
+// alreadyHasPiNodeFor - Return true if there is already a Pi node in BB for V.
static bool alreadyHasPiNodeFor(Value *V, BasicBlock *BB) {
for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I)
if (PHINode *PN = dyn_cast<PHINode>(*I))
if (Rep == 0)
cast<PHINode>(Pi)->addIncoming(V, Pred);
+
+ ++NumInserted;
return true;
}