• LLVM TargetPassConfig


    TargetPassConfig

    TargetPassConfig类是LLVM 后端添加pass入口,LLVM 框架将整个后端依次划分为指令选择、指令调度,寄存器分配等几个阶段,,如下图:

    其中每个阶段包含有一个或者多个pass,LLVM后端一个重要的处理就是兼容性和模块化,为了对这些后端所加的pass进行管理,LLVM后端对上述几个比较重要的阶段封装成接口,而每个接口基本代表一个 重要阶段,每个target可以根据需要添加所需要pass,

    TargetPassConfig该类为codegen中各个阶段提供了各个接口,提供主要接口如下:

    接口

    说明

    addISelPasses

    添加所有必须的从llvm IR转成生成MIpass

    addIRPasses

    添加对llvm IR->IR的优化pass

    addPassesToHandleExceptions

    添加较低级别的各种异常pass,这些pass主要处理CodeGen中产生的各种异常

    addCodeGenPrepare

    LLVM IR这个级别中添加CodeGen前准备的pass,这些pass此时还只处理IR,因此需要在addPassesToHandleExceptions之前添加

    addISelPrepare

    添加指令选择前的一些优化IRpass,这个阶段也处于IR阶段,还未转换成DAG,主要优化IR

    addInstSelector

    添加指令选择器selector以及必要pass

    addIRTranslator

    添加IR转换成机器码相关pass,调用关系时addIRTranslatoràaddInstSelector

    addMachinePasses

    添加一套CodeGen 标准所需要的pass

    addMachineSSAOptimization

    SSA优化所需要添加pass

    addPreRegAlloc/addPostRegAlloc

    分别是寄存器分配前/后所需要添加pass

    addFastRegAlloc

    快速分配寄存器所需要添加pass

    addPassesToGenerateCode

    addPassesToGenerateCode函数为添加CodeGen Pass总入口:

    1. /// addPassesToX helper drives creation and initialization of TargetPassConfig.
    2. static TargetPassConfig *
    3. addPassesToGenerateCode(LLVMTargetMachine &TM, PassManagerBase &PM,
    4. bool DisableVerify,
    5. MachineModuleInfoWrapperPass &MMIWP) {
    6. // Targets may override createPassConfig to provide a target-specific
    7. // subclass.
    8. TargetPassConfig *PassConfig = TM.createPassConfig(PM);
    9. // Set PassConfig options provided by TargetMachine.
    10. PassConfig->setDisableVerify(DisableVerify);
    11. PM.add(PassConfig);
    12. PM.add(&MMIWP);
    13. if (PassConfig->addISelPasses())
    14. return nullptr;
    15. PassConfig->addMachinePasses();
    16. PassConfig->setInitialized();
    17. return PassConfig;
    18. }
    •  createPassConfig :根据PM 创建对应target 的  TargetPassConfig ,每个target都会基于该类,对阶段中重要接口重新实现以实现添加独有pass,而不会影响其他target
    • PassConfig->addISelPasses:添加指令选择阶段中所需要的pass 总入口
    •  PassConfig->addMachinePasses(): 指令由IR 转换成机器码之后,所添加的pass,包括寄存器分配,以及机器码级别优化pass等

    AMDGPU TargetPassConfig

    新写一个后端时,一个重要内容就是实现该target 所需要的添加pass, 以AMDGPU为例TargetPassConfig继承关系如下:

    •  AMDGPUPassConfig: 是所有AMDGPU后端所必须要添加的pass
    • GCNPassConfig和 R600PassConfig分别针对的是GCN 和R600 平台。
  • 相关阅读:
    Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络
    Python程序设计教案
    五、Clion和STM32CubeMx---TIM定时器
    干扰管理学习日志6--------干扰管理综述(2021)
    python网络编程:通过socket实现TCP客户端和服务端
    C++【5】类与对象(二)
    因为 QUERY_ALL_PACKAGES 权限,我们上不了 Google Play 了
    图表开发工具LightningChart .NET v12.0正式发布——拥有新图表、新系列类型
    树结构的实际应用
    景联文科技:争创中国自动驾驶点云数据标注第一服务商
  • 原文地址:https://blog.csdn.net/weixin_42730667/article/details/125416708