尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Selection DAG
DAG 是什么DAG Directed Acyclic Graph有向无环图在编译器后端Selection DAG 是一种中间表示用来描述单个基本块内的计算逻辑。要素含义节点Node一个操作add、mul、load、store 等边Edge数据依赖一个节点的结果流向另一个节点有向数据从生产者流向消费者无环没有循环单个基本块内天然无环DAG 与树的区别树每个节点只有一个父节点公共子表达式必须复制。DAG一个节点可以有多个父节点公共子表达式只出现一次。DAG 更紧凑且天然暴露了公共子表达式。为什么要建 Selection DAG指令选择之前要先建 Selection DAG原因有三个统一表示把 IR 转换成一种便于匹配的图结构。暴露依赖边直接表示数据依赖便于分析。便于拆树DAG 可以拆分成树的森林每棵树独立匹配指令模式。怎么把 IR 翻译成 DAG步骤① 遍历基本块中的每条 IR 指令 ② 为每条指令创建一个节点操作类型 结果类型 ③ 为每个操作数创建边从操作数节点指向当前节点 ④ 如果操作数已经存在SSA 值直接复用节点不重复创建 ⑤ 处理内存操作load/store时额外建立内存依赖边详细例子原始 IR单个基本块%1 add i32 %a, %b %2 mul i32 %1, %c %3 sub i32 %1, %d %4 mul i32 %2, %3 ret i32 %4逐步构建 DAG第 1 步处理%1 add i32 %a, %b创建节点add(%a, %b) 创建叶子%a, %b 创建边%a → add, %b → add %1 指向 add 节点第 2 步处理%2 mul i32 %1, %c创建节点mul(%1, %c) %1 已经存在 → 复用节点 创建叶子%c 创建边%1 → mul, %c → mul %2 指向 mul 节点处理%3 sub i32 %1, %d创建节点sub(%1, %d) %1 已经存在 → 复用节点 创建叶子%d 创建边%1 → sub, %d → sub %3 指向 sub 节点第 4 步处理%4 mul i32 %2, %3创建节点mul(%2, %3) %2 和 %3 已经存在 → 复用节点 创建边%2 → mul, %3 → mul %4 指向 mul 节点关键观察%1 add(%a, %b) 只出现一次但被 mul 和 sub 同时使用。如果用树表示%1 会被复制两份。DAG 的边直接表示%1 的结果流向两个消费者。为什么 DAG 要拆分成树的森林原因树匹配算法如 BURG、Maximal Munch只能处理树不能直接处理 DAG。因为 DAG 中一个节点有多个父节点树匹配算法不知道该从哪里开始匹配。所以需要把 DAG拆分成一系列树森林每棵树独立匹配。拆分规则共享节点有多个父节点的节点成为拆分点。拆分时共享节点的结果被“复制”到每棵消费树中但只计算一次。具体例子上面的 DAG拆分点%1 add(%a, %b) 有 2 个父节点mul 和 sub所以它是拆分点。拆分成 4 棵树树 1add(%a, %b) → %1 根%1叶子%a, %b 树 2mul(%1, %c) → %2 根%2叶子%1, %c 树 3sub(%1, %d) → %3 根%3叶子%1, %d 树 4mul(%2, %3) → %4 根%4叶子%2, %3按拓扑顺序匹配① 匹配树 1 → 生成 add 指令 → %1 存入寄存器 r1 ② 匹配树 2 → 生成 mul 指令 → %2 存入寄存器 r2 ③ 匹配树 3 → 生成 sub 指令 → %3 存入寄存器 r3 ④ 匹配树 4 → 生成 mul 指令 → %4 存入寄存器 r4生成的汇编假设每条指令代价为 1ADD r1, %a, %b ; 树 1 MUL r2, r1, %c ; 树 2 SUB r3, r1, %d ; 树 3 MUL r4, r2, r3 ; 树 4注意%1 只计算一次树 1结果 r1 被树 2 和树 3 复用。如果不用 DAG 而用树表示%1 会被计算两次每棵树各算一次浪费指令完整流程总结原始 IR基本块 │ ▼ ① 构建 Selection DAG │ 遍历 IR创建节点和边 │ 共享 SSA 值 → 复用节点 ▼ ② 拆分成树的森林 │ 在共享节点处拆分 │ 每棵树独立匹配 ▼ ③ 树匹配BURG / Maximal Munch │ 用机器指令模式覆盖每棵树 │ 动态规划选最小代价 ▼ ④ 生成汇编指令总结问题答案DAG 是什么有向无环图描述单个基本块的计算逻辑节点操作add、mul、load、store边数据依赖生产者 → 消费者与树的区别DAG 允许共享节点树必须复制怎么从 IR 建 DAG遍历 IR创建节点和边共享 SSA 值为什么要拆成树树匹配算法只能处理树不能处理 DAG怎么拆在共享节点有多个父节点处拆分拆分后怎么用每棵树独立匹配指令模式按拓扑顺序生成汇编一句话Selection DAG 是把 IR 转成有向无环图节点是操作边是数据依赖。DAG 允许共享公共子表达式比树更紧凑。为了用树匹配做指令选择DAG 在共享节点处拆分成树的森林每棵树独立匹配最终生成汇编指令。
RELATED

相关推荐

让我看看你是谁:Trae CN、TRAE-AI编程、TraeCode、TraeWork、TRAE SOLO CN、Trae APP

让我看看你是谁:Trae CN、TRAE-AI编程、TraeCode、TraeWork、TRAE SOLO CN、Trae APP

Trae现在让我越来越懵了,我刚开始从官网下载的时候,它叫Trae,安装完叫Trae CN,应用商店叫TRAE-AI编程,现在又推出了TraeWork,我当时安装后变成了TRAE SOLO CN,然而声名在外的却是TraeCode。哦&a…

📅 2026/10/6 16:11:00
ABAP CDS 注解传播机制详解,从继承、覆盖到截断与稳定性控制

ABAP CDS 注解传播机制详解,从继承、覆盖到截断与稳定性控制

在一个典型的 SAP S/4HANA 数据模型里,我们很少只写一层 CDS View。更常见的结构,是数据库表或者最底层 CDS Entity 提供原始数据,中间的 Interface View 负责语义建模,再往上由 Consumption View、Projection View 或 RAP Service 暴露给 Fiori、OData 或其他消费者。 当…

📅 2026/10/6 16:10:59
SAP ABAP CDS Metadata Extensions 深度解析,从 Annotation 解耦到 Clean Core 的元数据扩展机制

SAP ABAP CDS Metadata Extensions 深度解析,从 Annotation 解耦到 Clean Core 的元数据扩展机制

一个 CDS View 刚开始开发时,源代码通常还很清爽。数据源、Association、字段列表,再加少量 Annotation,整个模型的职责一眼就能看明白。 但当这个 CDS Entity 开始被 SAP Fiori Elements、OData、分析应用以及各种消费端使用之后,情况很快就会发生变化。 一个字段需要显…

📅 2026/10/6 16:10:59
MORE NEWS

更多资讯

📰

MySQL日期与时间戳转换全攻略:从类型原理到踩坑排查

接手过统计后台的都知道,最怕的不是SQL写不出来,而是表里的时间字段类型五花八门。前阵子我就遇到一张日志表,建表时图省事把create_time定义成varchar,结果按月统计要靠字符串截取函数拼接,从源库导过来的数据有的带毫…

📰

MySQL日期时间转换全攻略:DATE与TIMESTAMP互转及避坑指南

1. 前缀:为什么大家都在折腾日期转换 先问你一个问题:如果把数据库里的 20240806 这个字符串,和 2024-08-06 17:30:00 这个标准日期,直接用 > 比较大小,结果会是什么? 很多人第一反应是“能比较”…

📰

从影刀RPA到MySQL:内置包、Xpath与数据入库实战解析

我是那种拿到影刀RPA高级操作题会先焦虑半天的选手,尤其看到题目里同时出现“内置包”“Xpath”“MySQL”这三个词。因为单独考任何一个,都能靠背指令糊弄过去,放在一起就成了连环坑。这道题的网络题目描述很简单:使用影刀RPA内置…

📰

Superpowers:基于Web的多人协作游戏开发平台实战解析

如果你是个没事就爱翻翻开源社区的人,大概率见过这个名字:Superpowers。它在某些榜单上被归为"游戏开发工具",但又和Unity、Godot这些传统IDE画风明显不一样——因为这玩意儿连窗口程序都不是,它跑在浏览器里&#xff0…

📰

Agent-Reach 实战:CLI AI Agent 从环境搭建到并发部署

1. 从零认识 Agent-Reach:一个把 AI Agent 拉进终端的 CLI 工具第一次看到 Agent-Reach 这个名字,我下意识把它和市面上那些"套壳聊天框"归到了一类。直到我把它的定位、关键词和一堆相关热词摆在一起看——CLI、AI Agent、Python、并发、部署…

📰

OpenShell深度体验:跨平台终端统一与插件开发实战

说实话,一开始我对“OpenShell”这种名字是带着一点警惕的。毕竟终端圈子里的工具多如牛毛,光是把PowerShell、Zsh、Fish、Nushell这些老面孔折腾明白就够喝一壶了,再来一个新东西,第一反应往往是“又一个大而全的轮子”。但真正上…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬