#include "llvm/Analysis/Dominators.h"
#include "llvm/Pass.h"
#include "llvm/Function.h"
-#include "llvm/BasicBlock.h"
#include "llvm/iTerminators.h"
#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");
+#include "Support/Statistic.h"
namespace {
+ Statistic<> NumInserted("pinodes", "Number of Pi nodes inserted");
+
struct PiNodeInserter : public FunctionPass {
virtual bool runOnFunction(Function &F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.preservesCFG();
+ AU.setPreservesCFG();
AU.addRequired<DominatorSet>();
}
// Create the Pi node...
Value *Pi = Rep;
- if (Rep == 0) {
- PHINode *Phi = new PHINode(V->getType(), V->getName() + ".pi");
-
- // Insert the Pi node in the successor basic block...
- Succ->getInstList().push_front(Phi);
- Pi = Phi;
- }
+ if (Rep == 0) // Insert the Pi node in the successor basic block...
+ Pi = new PHINode(V->getType(), V->getName() + ".pi", Succ->begin());
// Loop over all of the uses of V, replacing ones that the Pi node
// dominates with references to the Pi node itself.