LLVM SelectionDAG后端怎么处理自定义节点

浅辰酱_7168

浅辰酱_7168

2026-09-28

473人浏览

原创

自定义sdnode必须在tablegen中用def显式声明并继承sdnode,否则selectiondagbuilder会断言失败;需在targetselectiondag.td或目标专属xxxisel.td中正确定义opcode、sdtypeprofile及props(如sdnphaschain),并在lowerintrinsic函数中映射intrinsic,再通过pat规则匹配生成machineinstr。

llvm selectiondag后端怎么处理自定义节点

自定义 SDNode 必须在 TableGen 中声明

LLVM 不允许运行时动态注册 SDNode,所有自定义节点类型(如 RISCVISD::ADDW 或 M88kISD::RET_FLAG)必须在 .td 文件中用 def 显式定义,并继承自 SDNode 类。否则,SelectionDAGBuilder 遇到对应 ISD:: 节点时会断言失败或静默降级为通用节点。

常见错误现象:Assertion failed: Node->getOpcode() != ISD::DELETED_NODE 或生成的 MachineInstr 完全不匹配预期指令。

  • 必须在 TargetSelectionDAG.td 或目标专属 XXXISel.td 中定义,例如:def ADDW : SDNode, SDTCisInt, SDTCisInt]>>
  • SDTypeProfile 的 numresults 和 numoperands 必须与 lowering 函数实际返回的 SDValue 数量严格一致,否则 DAG 构建阶段会崩溃
  • 若节点需 chain 或 glue,必须在 props 列表中显式写入 SDNPHasChain 或 SDNPOutGlue,否则后续指令调度和寄存器分配会忽略依赖关系

Lowering 阶段要把 intrinsic 映射成自定义 SDNode

用户代码中调用 __builtin_riscv_custom_addw() 这类 intrinsic,最终要由 LowerINTRINSIC_WO_CHAIN 或 LowerINTRINSIC_W_CHAIN 在 XXXISelLowering.cpp 中捕获,并返回封装了自定义 SDNode 的 SDValue。这一步漏掉,自定义节点就永远不会进入 DAG。

使用场景:RISC-V 自定义指令、DSP 扩展、安全协处理器指令等需要绕过通用 lowering 流程的语义。

Mintlify
Mintlify

一款面向开发团队的AI文档工具,可帮助自动生成、维护和组织软件项目文档,让开发者更高效地建立产品文档体系。

下载
  • 不能直接 new 一个 SDNode;必须调用 CurDAG->getMachineNode() 或 CurDAG->getNode(),传入你定义好的 opcode(如 RISCVISD::ADDW)
  • 如果 intrinsic 带副作用(如触发硬件状态变更),必须确保返回的节点带 SDNPHasChain 属性,并正确连接 input/output chain,否则优化器可能重排或删除该节点
  • 对操作数做合法性检查(如立即数范围、寄存器类别)应放在 lowering 里,而不是 pattern matching 阶段——后者只做匹配,不做校验

Pattern matching 需在 .td 文件中覆盖所有合法组合

DAG 到 MachineInstr 的转换靠 pat 规则驱动。自定义 SDNode 若没有对应的 pat,就会卡在 SelectionDAG 阶段,最终 fallback 到 expand 或 abort。

性能影响:一条未命中的 pat 可能导致整个 basic block 降级为 soft-float 或 library call,性能损失一个数量级以上。

  • pat 左侧必须是你的自定义 node(如 (RISCVISD::ADDW VR128:$rs1, VR128:$rs2)),右侧是 (ADDWrr VR128:$rs1, VR128:$rs2) 这类 machine operand 形式
  • 如果支持立即数变体,必须单独写 pat,例如 (RISCVISD::ADDWI VR128:$rs1, i32imm:$imm) → (ADDWIrr VR128:$rs1, i32imm:$imm),不能指望通用 immediate folding 自动处理
  • 涉及寄存器类约束(如仅允许 VR128,不允许 GPR)必须在 PatFrag 或 Operand 定义中显式限定,否则匹配会误选错误指令

调试时优先看 SelectionDAG -view-dag-dags 输出

最容易被忽略的是:自定义节点是否真的出现在 DAG 图中。光看汇编输出没用,因为失败往往发生在 DAG 构建或 lowering 阶段,根本走不到 instruction selection。

运行 llc -view-dag-dags -march=riscv32 test.ll,观察 dot 图里有没有你的 RISCVISD::XXX 节点。没有,说明 lowering 没生效;有但没转成 MachineInstr,说明 pat 匹配失败或条件不满足。

  • View 图中节点显示为 0xNNNN RISCVISD::ADDW 是正常;若显示为 0xNNNN ISD::INTRINSIC_WO_CHAIN,说明 lowering 函数没被调用或返回了空 SDValue
  • 匹配失败常因 operand 类型不匹配:比如你期望 i32,但实际传入的是 v4i32,SDTCisInt 就会拒斥
  • llc -debug-only=isel 会打印每条 pat 的匹配尝试过程,但输出极冗长,建议先用 -view-dag-dags 定位节点是否存在

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2163

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5750

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5046

10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

140

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

80

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

60

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

40

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

60

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

40

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程