2021SC@SDUSC
ssaTab是MeFuncPhase类的phase之一,而且按照目前公布的代码,它是phase列表中第一个运行的MeFuncPhase类的phase。
1、ssaTab phase的对应实现类是MeDoSSATab。其定义和实现的位置为src/maple_me/include/me_ssa_tab.h和src/maple_me/src/me_ssa_tab.cpp。
2、MeDoSSATab继承于MeFuncPhase。它的定义和实现都很简单。具体代码如下:class MeDoSSATab : public MeFuncPhase {
public:
explicit MeDoSSATab(MePhaseID id) : MeFuncPhase(id) {}
virtual ~MeDoSSATab() = default;
private:
AnalysisResult *Run(MeFunction *func, MeFuncResultMgr *funcResMgr, ModuleResultMgr *moduleResMgr) override;
std::string PhaseName() const override {
return “ssaTab”;
}
};
AnalysisResult *MeDoSSATab::Run(MeFunction *func, MeFuncResultMgr *funcResMgr, ModuleResultMgr *moduleResMgr) {
MPLTimer timer;
timer.Start();
if (DEBUGFUNC(func)) {
LogInfo::MapleLogger() << “\n============== SSA and AA preparation =============” << ‘\n’;
}
MemPool *memPool = NewMemPool();
// allocate ssaTab including its SSAPart to store SSA information for statements
SSATab *ssaTab = memPool->New(memPool, func->GetVersMp(), &func->GetMIRModule());
func->SetMeSSATab(ssaTab);
#if DEBUG
globalSSATab = ssaTab;
#endif
// pass through the program statements
for (auto bIt = func->valid_begin(); bIt != func->valid_end(); ++bIt) {
auto *bb = *bIt;
for (auto &stmt : bb->GetStmtNodes()) {
ssaTab->CreateSSAStmt(stmt, *bb); // this adds the SSANodes for exprs
}
}
if (DEBUGFUNC(func)) {
timer.Stop();
LogInfo::MapleLogger() << "ssaTab consumes cumulatively " << timer.Elapsed() << "seconds " << ‘\n’;
}
return ssaTab;
}
3、MeDoSSATab的Run函数,主要执行了一下几个操作:
为处理的MeFunction添加一个名为ssaTab的SSATab*;
遍历MeFunction的所有BB,然后在每个BB内部遍历每条语句,为语句构建SSA版本的语句,并将其添加到ssaTab;
返回新构建好的ssaTab。
参考自:小乖他爹