#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; SSI() :
FunctionPass(&ID) {
}
void getAnalysisUsage(AnalysisUsage &AU) const;
bool runOnFunction(Function&);
void createSSI(SmallVectorImpl<Instruction *> &value);
private:
DominatorTree *DT_;
SmallPtrSet<Instruction *, 16> created;
DenseMap<PHINode *, Instruction*> phis;
DenseMap<PHINode *, Instruction*> sigmas;
SmallPtrSet<PHINode *, 1> phisToFix;
DenseMap<Instruction*, SmallVector<BasicBlock*, 4> > defsites;
DenseMap<Instruction*, BasicBlock*> value_original;
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();
};
} #endif