方舟编译器分析十二——代码分析(十)

2021SC@SDUSC

今天我们继续分析MeFuncPhase中的sssTab。

ssaTab是MeFuncPhase类的phase之一,而且按照目前公布的代码,它是phase列表中第一个运行的MeFuncPhase类的phase。本文将对其进行简要分析,以期对其有一个初步的印象。

ssaTab phase的对应实现类是MeDoSSATab。其定义和实现的位置为src/maple_me/include/me_ssa_tab.h和src/maple_me/src/me_ssa_tab.cpp。

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<SSATab>(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;
}

 

除了每个phase都有的Run和PhaseName之外,没有任何一个其它的成员函数,也没有成员变量。

MeDoSSATab的Run函数,主要执行了一下几个操作:

  • 为处理的MeFunction添加一个名为ssaTab的SSATab*;
  • 遍历MeFunction的所有BB,然后在每个BB内部遍历每条语句,为语句构建SSA版本的语句,并将其添加到ssaTab;
  • 返回新构建好的ssaTab。

SSATab的定义和实现位于src/maple_me/include/ssa_tab.h和src/maple_me/src/ssa_tab.cpp,它继承于AnalysisResult类,用来存储构建的SSA语句。

SSATab有一个成员变量:

StmtsSSAPart stmtsSSAPart; 

它用来存储语句节点的SSA信息。注释里也说明了这点:“ Statement nodes' SSA information is stored in class SSATab's StmtsSSAPart, which has an array of pointers indexed by the stmtID field of each statement node.”所以,3中调用的CreateSSAStmt,也是将最终信息存储到了stmtsSSAPart里。

SSATab的设计与实现也不复杂,除了操作成员变量及其内部数据的设置和获取之外,就是CreateSSAExpr和CreateSSAStmt的成员函数。前者还是为后者服务的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值