LLVM AMDGPU 后端代码分析研究(3)AMDGPUFixFunctionBitcasts

1. 简介

indirect-call 对后端芯片来说,是一件非常伤害性能的行为,它让分支预测单元更难处理,它常出现在C++虚函数调用,GPU的subroutine. Compiler有一些算法就是想要减少indirect-call,具体可见参考文献1,AMD使用了下图第二种:Indirect Call Promotion.
在这里插入图片描述

2. 源码跟踪&学习

llc 命令:

llc.exe -mtriple=amdgcn G:\Mesa3D_ws\llvm-11.0.0.src\llvm-11.0.0.src\test\CodeGen\AMDGPU\promote-alloca-bitcast-function.ll

AMDGPUFixFunctionBitcasts

class AMDGPUFixFunctionBitcasts final
    : public ModulePass,
      public InstVisitor<AMDGPUFixFunctionBitcasts> {

  bool runOnModule(Module &M) override;
  bool Modified;
public:
  void visitCallBase(CallBase &CB) {
    if (CB.getCalledFunction())
      return;
    auto *Callee =
        dyn_cast<Function>(CB.getCalledOperand()->stripPointerCasts());
    if (Callee && isLegalToPromote(CB, Callee)) {
      promoteCall(CB, Callee);
      Modified = true;
    }
  }
  static char ID;
  AMDGPUFixFunctionBitcasts() : ModulePass(ID) {}
};

AMDGPUFixFunctionBitcasts::runOnModule

bool AMDGPUFixFunctionBitcasts::runOnModule(Module &M) {
  Modified = false;
  visit(M);
  return Modified;
}

2.1 InstVisitor

当某个LLVM Pass想要对Module Unit 遍历,同时对不同类型的指令做不同的工作时,可以使用这个接口,只需要继承这个模板类,同时重载各指令类型接口即可,最后在runOnModule , 调用visit(M) . 它可以减少代码中大量的casts和if-else代码,同时它故意使用了C++模板技术,减少了虚函数调用开销,性能上会更好。

参考写法:

struct CountAllocaVisitor : public InstVisitor<CountAllocaVisitor> {
unsigned Count;
CountAllocaVisitor() : Count(0) {}
void visitAllocaInst(AllocaInst &AI) { ++Count; }
....
};

2.2 CallPromotionUtils

这个工具类定义了一些转换indirect-call的接口:

  • isLegalToPromote : 返回值类型,参数个数,参数类型相同或者可bitcast即为合法
  • promoteCall : 具体的处理逻辑
  • promoteCallWithIfThenElse : 提升为条件Call
  • tryPromoteCall :

3. 总结

  • indirect-call
  • InstVisitor 的使用,这个工具接口可以替换大量’For遍历式’代码的,主体非常干净整洁.
  • CallPromotionUtils

4. 参考资料

  1. https://llvm.org/devmtg/2015-10/slides/Baev-IndirectCallPromotion.pdf
  2. https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5105&rep=rep1&type=pdf
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值