aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Transforms
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2009-07-03 19:28:36 +0000
committerNick Lewycky <nicholas@mxc.ca>2009-07-03 19:28:36 +0000
commit8e95a09b8f98920cce2e8adadac2113813e096d7 (patch)
tree94c10e0ce9ef6890a8a489b8fd686874486b2256 /include/llvm/Transforms
parent1901a4586e84c026cd837eb5c0d3b3b81f372056 (diff)
downloadexternal_llvm-8e95a09b8f98920cce2e8adadac2113813e096d7.zip
external_llvm-8e95a09b8f98920cce2e8adadac2113813e096d7.tar.gz
external_llvm-8e95a09b8f98920cce2e8adadac2113813e096d7.tar.bz2
Add Static Single Information construction pass written by André Tavares!
Use it by requiring it through the pass manager, then calling its createSSI method on the variables that you want in SSI form. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74780 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Transforms')
-rw-r--r--include/llvm/Transforms/Scalar.h6
-rw-r--r--include/llvm/Transforms/Utils/SSI.h102
2 files changed, 108 insertions, 0 deletions
diff --git a/include/llvm/Transforms/Scalar.h b/include/llvm/Transforms/Scalar.h
index 971baee..29cd3e3 100644
--- a/include/llvm/Transforms/Scalar.h
+++ b/include/llvm/Transforms/Scalar.h
@@ -337,6 +337,12 @@ FunctionPass *createCodeGenPreparePass(const TargetLowering *TLI = 0);
FunctionPass *createInstructionNamerPass();
extern const PassInfo *const InstructionNamerID;
+//===----------------------------------------------------------------------===//
+//
+// SSI - This pass converts to Static Single Information form.
+//
+FunctionPass *createSSIPass();
+
} // End llvm namespace
#endif
diff --git a/include/llvm/Transforms/Utils/SSI.h b/include/llvm/Transforms/Utils/SSI.h
new file mode 100644
index 0000000..59dd6d0
--- /dev/null
+++ b/include/llvm/Transforms/Utils/SSI.h
@@ -0,0 +1,102 @@
+//===------------------- 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/Pass.h"
+#include "llvm/ADT/BitVector.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;
+
+ /// runOnMachineFunction - pass entry point
+ bool runOnFunction(Function&);
+
+ void createSSI(SmallVectorImpl<Instruction *> &value);
+
+ private:
+ // Variables always live
+ DominatorTree *DT_;
+
+ // Stores variables created by SSI
+ SmallPtrSet<Instruction *, 16> created;
+
+ // These variables are only live for each creation
+ unsigned num_values;
+
+ // Has a bit for each variable, true if it needs to be created
+ // and false otherwise
+ BitVector needConstruction;
+
+ // Phis created by SSI
+ DenseMap<PHINode *, unsigned> phis;
+
+ // Sigmas created by SSI
+ DenseMap<PHINode *, unsigned> 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
+ SmallVector<SmallVector<BasicBlock *, 1>, 0> defsites;
+
+ // Basic Block of the original definition of each variable
+ SmallVector<BasicBlock *, 0> value_original;
+
+ // Stack of last seen definition of a variable
+ SmallVector<SmallVector<Instruction *, 1>, 0> value_stack;
+
+ void insertSigmaFunctions(SmallVectorImpl<Instruction *> &value);
+ void insertPhiFunctions(SmallVectorImpl<Instruction *> &value);
+ void renameInit(SmallVectorImpl<Instruction *> &value);
+ void rename(BasicBlock *BB);
+
+ void substituteUse(Instruction *I);
+ bool dominateAny(BasicBlock *BB, Instruction *value);
+ void fixPhis();
+
+ unsigned getPositionPhi(PHINode *PN);
+ unsigned getPositionSigma(PHINode *PN);
+
+ unsigned isUsedInTerminator(CmpInst *CI);
+
+ void init(SmallVectorImpl<Instruction *> &value);
+ void clean();
+ };
+} // end namespace
+#endif