summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/include/llvm/Transforms/Utils/SSI.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/include/llvm/Transforms/Utils/SSI.h')
-rw-r--r--contrib/llvm/include/llvm/Transforms/Utils/SSI.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/contrib/llvm/include/llvm/Transforms/Utils/SSI.h b/contrib/llvm/include/llvm/Transforms/Utils/SSI.h
new file mode 100644
index 0000000..198fc82
--- /dev/null
+++ b/contrib/llvm/include/llvm/Transforms/Utils/SSI.h
@@ -0,0 +1,93 @@
+//===------------------- SSI.h - Creates SSI Representation -----*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This pass converts a list of variables to the Static Single Information
+// form. This is a program representation described by Scott Ananian in his
+// Master Thesis: "The Static Single Information Form (1999)".
+// We are building an on-demand representation, that is, we do not convert
+// every single variable in the target function to SSI form. Rather, we receive
+// a list of target variables that must be converted. We also do not
+// completely convert a target variable to the SSI format. Instead, we only
+// change the variable in the points where new information can be attached
+// to its live range, that is, at branch points.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_UTILS_SSI_H
+#define LLVM_TRANSFORMS_UTILS_SSI_H
+
+#include "llvm/InstrTypes.h"
+#include "llvm/Pass.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/SmallVector.h"
+
+namespace llvm {
+
+ class DominatorTree;
+ class PHINode;
+ class Instruction;
+ class CmpInst;
+
+ class SSI : public FunctionPass {
+ public:
+ static char ID; // Pass identification, replacement for typeid.
+ SSI() :
+ FunctionPass(&ID) {
+ }
+
+ void getAnalysisUsage(AnalysisUsage &AU) const;
+
+ bool runOnFunction(Function&);
+
+ void createSSI(SmallVectorImpl<Instruction *> &value);
+
+ private:
+ // Variables always live
+ DominatorTree *DT_;
+
+ // Stores variables created by SSI
+ SmallPtrSet<Instruction *, 16> created;
+
+ // Phis created by SSI
+ DenseMap<PHINode *, Instruction*> phis;
+
+ // Sigmas created by SSI
+ DenseMap<PHINode *, Instruction*> sigmas;
+
+ // Phi nodes that have a phi as operand and has to be fixed
+ SmallPtrSet<PHINode *, 1> phisToFix;
+
+ // List of definition points for every variable
+ DenseMap<Instruction*, SmallVector<BasicBlock*, 4> > defsites;
+
+ // Basic Block of the original definition of each variable
+ DenseMap<Instruction*, BasicBlock*> value_original;
+
+ // Stack of last seen definition of a variable
+ DenseMap<Instruction*, SmallVector<Instruction *, 1> > value_stack;
+
+ void insertSigmaFunctions(SmallPtrSet<Instruction*, 4> &value);
+ void insertSigma(TerminatorInst *TI, Instruction *I);
+ void insertPhiFunctions(SmallPtrSet<Instruction*, 4> &value);
+ void renameInit(SmallPtrSet<Instruction*, 4> &value);
+ void rename(BasicBlock *BB);
+
+ void substituteUse(Instruction *I);
+ bool dominateAny(BasicBlock *BB, Instruction *value);
+ void fixPhis();
+
+ Instruction* getPositionPhi(PHINode *PN);
+ Instruction* getPositionSigma(PHINode *PN);
+
+ void init(SmallVectorImpl<Instruction *> &value);
+ void clean();
+ };
+} // end namespace
+#endif
OpenPOWER on IntegriCloud