llvm后端之DAG设计
llvm后端之DAG设计
- 引言
- 1 核心类设计
- 2 类型系统
- 2.1 MVT::SimpleValueType
- 2.2 MVT
- 2.3 EVT
- 3 节点类型
引言
llvm后端将中端的IR转为有向无环图,即DAG。如下图:

图中黑色箭头为数据依赖;蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节点中间可以插入其他节点对应的指令,而红色节点表示两个节点生成的指令中间不能插入其他节点的指令。
注:本文参考源码路径为 https://github.com/llvm/llvm-project/tree/release/10.x
1 核心类设计
DAG图是围绕SDNode、SDUse、SDValue组织,如下图:

- DAG图中每个节点,用SDNode表示。节点有依赖节点,用OperandList表示;节点可以有多个输出值,其输出值类型用ValueList表示;
- 用SDValue表示每个节点的输出值,其中记录了SDNode和输出值序号ResNo;
- SDUse表示DAG图的依赖箭头。用Val表示箭头指向的节点,即被依赖的节点输出值;用User表示箭头起点的节点,即使用节点;
- 每个SDUse设置Val时,会将自己添加到SDNode的UseList链表中。这样每个Node就可以遍历到使用自己的其他节点。
2 类型系统
llvm后端DAG的类型系统分为三个层级,从外到内为:EVT、MVT、SimpleValueType。如下图:

2.1 MVT::SimpleValueType
SimpleValueType是基本数据类型的枚举定义,其中包括:
- 整数类型
- 浮点类型
- 向量类型:其中包括按类型分类有整数向量和浮点向量,按长度分类有固定长度向量和变长向量
- 其他类型
2.2 MVT
MVT是对SimpleValueType值的封装。并提供常规的方法:
- isValid : 为整数类型、浮点类、向量类型以及x86mmx、Glue、isVoid、Untyped、exnref,则为true;
- isFloatingPoint / isInteger : 整数/浮点及其相应类型的向量为true;
- isScalarInteger : 非向量的整数类型则为true;
- isScalableVector : 变长向量则为true;
- isFixedLengthVector :定长向量则为true;
- isOverloaded : 可重载类型,就是由内置函数可以解释的任意长度类型。有Any、iAny、vAny、fAny、iPTRAny;
- isPow2VectorType :向量元素个数为2的N次方,则为true;
- getPow2VectorType : 返回元素个数扩展为2的N次方的新向量类型,例如16个不扩展,5个则扩展为8个;
- getHalfNumVectorElementsVT : 将向量元素个数截断为原来的一半并返回其类型;
- getScalarType : 为向量则返回元素类型,否则返回自身相同类型;
- getVectorNumElements : 返回向量元素个数,变长向量则返回最小向量元素个数;
- getSizeInBits : 返回类型的bit位数,变长向量则返回最小元素个数乘以元素类型的bit数。
- getScalarSizeInBits : 返回getScalarType类型的bit位数;
- getStoreSize : 返回类型从存储长度,即扩展为字节长度。例如1位int扩展为8位int;
- bitsGT / bitsGE / bitsLT / bitsLE : 比较MVT的getSizeInBits值;
此外,还提供了根据bit位返回类型的系列静态方法。
2.3 EVT
EVT是对MVT的封装,此外还提供了对MVT类型的扩展。当表示MVT之外的类型时,其V.SimpleTy为INVALID_SIMPLE_VALUE_TYPE。例如,当定义一个1024位的int,此时就是一个扩展类型。
3 节点类型
DAG节点的类型(也就是操作类型,对应于指令类型)是定义在llvm::ISD::NodeType枚举类型中;此外,可以基于BUILTIN_OP_END往后自定义目标的操作类型。llvm::ISD::NodeType的节点类型包括:
相关文章:
llvm后端之DAG设计
llvm后端之DAG设计 引言1 核心类设计2 类型系统2.1 MVT::SimpleValueType2.2 MVT2.3 EVT 3 节点类型 引言 llvm后端将中端的IR转为有向无环图,即DAG。如下图: 图中黑色箭头为数据依赖;蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节…...
反序列化 [SWPUCTF 2021 新生赛]ez_unserialize
打开题目 查看源代码 得到提示,那我们用御剑扫描一下看看 我们知道有个robots.txt,访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …...
centos(linux)安装jenkins
官网:https://pkg.jenkins.io/redhat/ 安装官网进行操作: sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.reposudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key若出现如下错误: …...
Wireshark统计和可视化
第一章:Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧:过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章:网络协议分析 2.1 网络协议分析:TCP、UDP、ICMP等 2.2 高级协议分析:HTTP…...
高通平台开发系列讲解(SIM卡篇)SIM软件架构介绍
文章目录 一、SIM软件架构二、MMG SDI Task三、GSTK Task四、Simlock Task沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍SIM的相关组件。 SIM软件架构: SIM软件架构指的是与SIM卡(Subscriber Identity Module,订阅者身份模块)相关的软件系统设计和…...
音频筑基:瞬态、基音、偏噪信号类型分析
音频筑基:瞬态、基音、偏噪信号类型分析 是什么深入理解从编码角度看,基音信号编码通常会有啥问题?在频域感知编码过程中,瞬态信号会有啥问题?如何解决?瞬态信号场景下,5/10ms帧长编码有啥区别&…...
HarmonyOS ArkTS 中DatePicker先择时间 路由跳转并传值到其它页
效果 代码 代码里有TextTimerController 这一种例用方法较怪,Text ,Button Datepicker 的使用。 import router from ohos.router’则是引入路由模块。 import router from ohos.router Entry Component struct TextnewClock {textTimerController: TextTimerContr…...
Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验
Axure RP 8,一款引领潮流的交互式原型设计工具,为设计师提供了无限的可能性,让他们能够创造出逼真的原型,从而更好地展示和测试他们的设计。 Axure RP 8拥有丰富的功能和工具,让设计师可以轻松地创建出复杂的交互式原…...
迪文屏开发保姆级教程——页面键盘
迪文屏页面键盘保姆级教程。 本篇文章主要介绍了在DGBUS平台上使用页面键盘的步骤。 迪文屏官方开发指南PDF:(不方便下载的私聊我发给你) https://download.csdn.net/download/qq_21370051/88647174?spm1001.2014.3001.5503https://downloa…...
Unity的UI界面——Text/Image
编辑UI界面时,要先切换到2d界面 (3d项目的话) 1.Text控件 Text控件的相关属性: Character:(字符) Font:字体 Font Style:字体样式 Font Size:字体大小 Line Spac…...
sklearn和tensorflow的理解
人工智能的实现是基于机器学习,机器学习的一个方法是神经网络,以及各种机器学习算法库。 有监督学习:一般数据构成是【特征值目标值】 无监督学习:一般数据构成是【特征值】 Scikit-learn(sklearn)的定位是通用机器学习库&…...
css中BFC
css BFC BFC具有以下特性创建BFC的方式有多种BFC的应用场景和作用 扩展: CSS动画 transition: 过渡动画animation / keyframestransform都有哪些属性 举例 css BFC BFC,即块级格式化上下文(Block Formatting Context)…...
华为OD机试 - 小朋友来自多少小区(Java JS Python C)
题目描述 幼儿园组织活动,老师布置了一个任务: 每个小朋友去了解与自己同一个小区的小朋友还有几个。 我们将这些数量汇总到数组 garden 中。 请根据这些小朋友给出的信息,计算班级小朋友至少来自几个小区? 输入描述 输入:garden[] = {2, 2, 3} 输出描述 输出:7 备…...
前端:NPM的介绍和使用
一、NPM的介绍 NPM是Node.js的包管理器,用于管理Node.js的包NPM提供了方便的方式来安装、管理和分享Node.js的包 二、NPM的使用 1. 安装NPM 要使用NPM,首先需要安装Node.js。安装完成后,可以在命令行中运行以下命令来检查Node.js和NPM是否…...
力扣57. 插入区间
双指针法 思路: 用待插入区间左右边界初始化双指针 left 和 right;遍历待归并区间: 如果元素整体边界在 [left, right] 左侧(item[1] < left),则将给元素插入结果数组中;如果元素整体边界在…...
Linux c++开发-11-Socket TCP编程简单案例
服务端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <sys/types.h>#include <errno.h>int main(void) {//1.socketint server_sock socket(A…...
ros2机器人常规控制流程
The joint_state_publisher reads the robot_description parameter from the parameter server, finds all of the non-fixed joints and publishes a JointState message with all those joints defined.也就是说如果我们不需要控制机器人运动,只需要一个节点就可…...
分布式全局ID之雪花算法
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 雪花算法 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是雪花算法?…...
拿到服务器该做的事和升级docker engine
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo -i # 切换到 root 用户apt update -y # 升级 packagesapt install wget curl sudo vim git -y # Debian 系统比较干净,安装常用的软件 安装docker …...
【VScode和Leecode的爱恨情仇】command ‘leetcode.signin‘ not found
文章目录 一、关于command ‘leetcode.signin‘ not found的问题二、解决方案第一,没有下载Nodejs;第二,有没有在VScode中配置Nodejs第三,力扣的默认在VScode请求地址中请求头错误首先搞定配置其次搞定登入登入方法一:…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
