讲师中心 微信公众号
AI工具推荐 视频效率加速

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

浅辰酱_7168

浅辰酱_7168

发布时间:2026-09-28 20:04:16

|

473人浏览过

|

来源于php中文网

原创

自定义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 流程的语义。

  • 不能直接 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<1> 就会拒斥
  • llc -debug-only=isel 会打印每条 pat 的匹配尝试过程,但输出极冗长,建议先用 -view-dag-dags 定位节点是否存在

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

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

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

2163

2023.08.11

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

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

5750

2024.03.19

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

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

5046

2024.03.19

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

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

160

2026.09.23

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

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

80

2026.09.23

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

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

80

2026.09.23

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

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

40

2026.09.22

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

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

60

2026.09.22

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

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

60

2026.09.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn