//===------------------- 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; bool runOnFunction(Function&); void createSSI(SmallVectorImpl &value); private: // Variables always live DominatorTree *DT_; // Stores variables created by SSI SmallPtrSet 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 phis; // Sigmas created by SSI DenseMap sigmas; // Phi nodes that have a phi as operand and has to be fixed SmallPtrSet phisToFix; // List of definition points for every variable SmallVector, 0> defsites; // Basic Block of the original definition of each variable SmallVector value_original; // Stack of last seen definition of a variable SmallVector, 0> value_stack; void insertSigmaFunctions(SmallVectorImpl &value); void insertSigma(TerminatorInst *TI, Instruction *I, unsigned pos); void insertPhiFunctions(SmallVectorImpl &value); void renameInit(SmallVectorImpl &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); void init(SmallVectorImpl &value); void clean(); }; } // end namespace #endif