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的节点类型包括:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教3妹学编程-算法题】循环移位后的矩阵相似检查

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:“太阳当空照,花儿对我笑&…

干货!什么是财务业务化和业务财务化?

此回答摘录自《自价值财务:以业务与财务的双向奔赴,成就合规与增长双赢》,原文近7000字,作者纷享销客CFO郭保彬先生。更多业财一体化内容详见纷享销客最新专刊《上市公司如何打好合规与增长双赢之战》。 如今,财务管理…

Linux系统配置与服务管理基础(二)

目录 一、通配符 1. 简介 2. 作用 3. 符号与效果 4. 示例 二、别名alias 1. 语法选项 2. 示例 3. 补充说明 三、查看磁盘使用量 1. 语法选项 2. ll与du区别 3. 补充 四、创建目录mkdir 1. 语法选项 2. 示例 四、建立空文件touch 1. 语法选项 2. 附加功能 3…

【Kotlin】基础变量、集合和安全操作符

文章目录 数字字面常量显式转换数值类型转换背后 位运算符字符串字符串模板修饰符数组集合(Kotlin自带)通过序列提高效率惰性求值序列的操作方式中间操作末端操作 可null类型安全调用操作符 ?.操作符 ?:非空断言操作符 !! 使用类型检测及自动类型转换安…

第二百一十七回 修改页面导航中遇到的问题

文章目录 1. 问题介绍2. 使用方法3. 代码与分析3.1 示例代码3.2 代码分析4. 内容总结我们在上一章回中介绍了"分享一种更新页面数据的方法"相关的内容,本章回中将介绍修改页面导航中遇到的问题.闲话休提,让我们一起Talk Flutter吧。 1. 问题介绍 我们在页面之间导…

uni-app获取指定时间为周几,日期格式化为 “YYYY-MM-DD“ 的形式

在 uni-app 中,你可以使用 JavaScript 的 Date 对象来获取指定时间是星期几。以下是一个简单的示例代码,演示了如何在 uni-app 中实现这一功能: // 假设有一个指定的日期时间 const specifiedDate new Date(2023-12-25);// 获取这个指定日期…

go学习笔记

指针使用 // Person 定义一个人的结构体 type Person struct {// 姓名Name string// 年龄Age int// 性别Sex string// 身份证号idNumber string }//1、声明一个结构体变量var person Personfmt.Println(person.Name) // ""fmt.Println(person.Age) // 0fmt…

学习——html基础

什么是HTML Hyper Text Markup Language (超文本标记语言) 标记又俗称标签(tag)&#xff0c;一般格式&#xff1a; 如 <h1></h1>标签里还可以有属性(Attribute)&#xff1a; <tagName Atrribute “value" /> 如 <meta charset"utf-8"…

selenium自动化webdriver下载及安装

1、确认浏览器的版本 在浏览器的地址栏&#xff0c;输入chrome://version/&#xff0c;回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号&#xff08;只看大版本&#xff09;下载对应文件 2.2 116版本通过…

【进阶篇】YOLOv8实现K折交叉验证——解决数据集样本稀少和类别不平衡的难题,让你的模型评估更加稳健

YOLOv8专栏导航&#xff1a;点击此处跳转 K折交叉验证 K折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;是一种常用的机器学习模型评估方法&#xff0c;可以帮助我们评估模型的性能&#xff0c;特别适用于数据集相对较小的情况。 在K折交叉验证中&#xff0c;将原…

redis相关面试题

1、说一说你在项目中的redis的应用场景&#xff1f; 需要频繁查询的数据&#xff0c;分布式锁&#xff0c;spring session 5大value类型&#xff1a;string hash list set zset基本上就是缓存为的是服务无状态&#xff0c;延申思考&#xff0c;看你的项目有哪些数据结构或对象…

springboot 整合 springdataJPA 自定义操作 JPQL和SQL

1.接口StudentJPQLSQLMapper.java package com.jmj.springDataApp.mapper;import com.jmj.springDataApp.pojo.Student; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.da…

final的详解

在Java中&#xff0c;final 关键字用于表示不可改变的实体&#xff0c;可以应用于变量、方法、类和指令重排序。它有不同的作用&#xff0c;具体取决于它被应用的上下文。 1.对于变量&#xff1a; 如果一个变量被声明为 final&#xff0c;则该变量的值在一旦被赋予后就不能再被…

Starting the Docker Engine...一直转圈

出现的问题&#xff1a; 原因排查&#xff1a; 看了网上的很多篇文章&#xff0c;每个原因都排查了&#xff0c;没有发现问题。 遇到这样的情况应先看自己是否安装成功 打开运行&#xff0c;在空框中输入powershell并点击确定&#xff1a; docker version 显示版本证明安装…

3. 控制流程

3. 控制流程 ​ 跟任何的程序设计语言一样&#xff0c;Java使用条件语句和循环结构确定控制流程。 3.1 块作用域 ​ 块是指由一对大括号括起来的若干条简单的Java语句&#xff0c;块确定了变量的作用域。一个块可以嵌套在另一个块中。 常见例子&#xff1a; public static v…

微信小程序-选择和分割打开地图选择位置的信息

一、 前言 废话不多说&#xff0c;单刀直入。 本文要实现的功能是微信小程序中打开地图选择位置&#xff0c;以及将返回的位置信息分割。 例如返回的位置信息是&#xff1a;广东省深圳市龙岗区xxxxx小区 分割后变成&#xff1a; {province: "广东省",city: "深…

前端技术基建过程

1. 技术基建: 是研发团队的技术基础设施建设,是一个团队通用的技术能力沉淀. (1). 业务、架构、基建理解: ①. 业务支撑是活在当下②. 技术基建是活在未来(2). 意义: ①. 技术的价值在于解决业务问题,"业务支撑"和"基础建设"都是为了帮助业务解决问题②.…

042.Python异常处理_异常捕获

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

SpringBoot前后端分离开发项目部署时,项目打包准备工作

第一步&#xff1a;项目打包之前&#xff0c;拉前后端代码 拉完代码后&#xff0c;再执行下面操作&#xff08;确保项目能正常启动并运行&#xff09; 后端&#xff08;执行如下操作&#xff09; mvn clean install -T 8 -Dmaven.test.skiptrue -Dmaven.compile.forktrue 执行…

JDK17 SpringBoot3 整合常见依赖

JDK版本&#xff1a;17 SpringBoot 整合Mybatis Plus 、Redis等 依赖文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&q…