//
// This pass is designed to be a very quick global transformation that
// eliminates global common subexpressions from a function. It does this by
-// examining the SSA value graph of the function, instead of doing slow, dense,
-// bit-vector computations.
+// using an existing value numbering implementation to identify the common
+// subexpressions, eliminating them when possible.
//
//===----------------------------------------------------------------------===//
#include "llvm/Transforms/Scalar.h"
-#include "llvm/InstrTypes.h"
#include "llvm/iMemory.h"
+#include "llvm/Type.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Analysis/ValueNumbering.h"
#include "llvm/Support/InstIterator.h"
-#include "llvm/Support/CFG.h"
-#include "llvm/Type.h"
-#include "Support/StatisticReporter.h"
+#include "Support/Statistic.h"
#include <algorithm>
-using std::set;
-using std::map;
-
namespace {
- Statistic<> NumInstRemoved("gcse\t\t- Number of instructions removed");
- Statistic<> NumLoadRemoved("gcse\t\t- Number of loads removed");
- Statistic<> NumNonInsts ("gcse\t\t- Number of instructions removed due "
+ Statistic<> NumInstRemoved("gcse", "Number of instructions removed");
+ Statistic<> NumLoadRemoved("gcse", "Number of loads removed");
+ Statistic<> NumNonInsts ("gcse", "Number of instructions removed due "
"to non-instruction values");
class GCSE : public FunctionPass {
- set<Instruction*> WorkList;
+ std::set<Instruction*> WorkList;
DominatorSet *DomSetInfo;
#if 0
ImmediateDominators *ImmDominator;
// This transformation requires dominator and immediate dominator info
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.preservesCFG();
+ AU.setPreservesCFG();
AU.addRequired<DominatorSet>();
AU.addRequired<ImmediateDominators>();
AU.addRequired<ValueNumbering>();