LLVM学习笔记(50)

news2025/5/18 23:25:28

4.1.4. DAG合并与合法化

来自SelectionDAGBuilder的SelectionDAG输出还不能进行指令选择,必须通过额外的转换——显示在上图。在指令选择前应用的遍序列如下:

  • 匹配一组节点,在有利时使用更简单的构造来替换它们,DAG合并遍优化SelectionDAG的结构。例如,(add (Register X), (constant 0))可以折叠为(Register X)。类似的,目标机器的合并方法可以识别节点模式,决定是否合并以及折叠它们,提升目标机器指令选择的质量。方法setTargetDAGCombine标记目标机器希望合并的节点。例如,MIPS后端尝试合并加法——参考lib/Target/Mips/MipsISelLowering.cpp的setTargetDAGCombine(ISD::ADD)与performADDCombine()。

(注:在每个合法化阶段后运行DAG合并以尽量减少SelectionDAG冗余。另外,DAG合并知道运行到遍链(pass chain)的何处(例如,在合法化或向量合法化之后),并且可以更精确地使用这个信息。)

  • 类型合法化遍确保指令选择仅需要处理合法的类型。合法类型是目标机器原生支持的类型。例如,在仅支持i32类型的目标机器上带有i64操作数的加法是非法的。在这个情形里,类型合法器执行整数扩展,将一个i64操作数分解为两个i32操作数,同时生成处理它们的合适的代码。目标机器定义每个类型与哪些寄存器类相关,明确声明支持的类型。因此,必须相应地检测与处理非法类型:标量类型可以被提升、扩展或者弱化,而向量类型可以被分裂、标量化或者加宽。同样,目标机器也可以定制类型合法化的方法。类型合法器运行两次,在第一次DAG合并后,以及向量合法化后。
  • 存在后端直接支持一个向量类型的情形,这意味着对此有一个寄存器类,但在一个给定向量类型上的一个特定操作不一定。例如,有SSE2的X86支持v4i32向量类型。不过,在ISD::OR上没有支持v4i32类型的X86指令,仅支持v2i64。因此,向量合法化器使用指令的合法类型提升或扩展来处理这些情形。在上述ISD::OR情形里,操作被提升为使用v2i64类型。

(注:对某些类型,扩展将消除向量类型,使用标量类型。这会导致目标机器不支持的标量类型。不过,后续的类型合法化器将清除之。)

  • DAG合法化器具有与向量合法化器相同的任务,但处理任何带有不支持类型(标量或向量)的遗留操作。它支持相同的操作:提升,扩展,处理定制节点。例如,x86节点不支持以下三个中的任意一个:i8类型有符号整数到浮点数的操作(ISD::SINT_TO_FP),要求合法化器提升该操作;i32操作数上的有符号除法,要求一个扩展,发布一个库调用来处理该除法;f32操作数上浮点绝对值(ISD::FABS),使用一个定制句柄来生成具有相同效果的代码。X86以下列方式来发布这样的行为(参考lib/Target/X86/X86ISelLowering.cpp):

setOperationAction(ISD::SINT_TO_FP, MVT::i8, Promote);

setOperationAction(ISD::SDIV, MVT::i32, Expand);

setOperationAction(ISD::FABS, MVT::f32, Custom); 

4.1.5. DAG到DAG的指令选择

 DAG到DAG指令选择的目的是通过模式匹配,将目标机器无关的节点翻译为目标机器特定的节点。指令选择算法是局部的,一次作用在一个SelectionDAG(基本块)实例上。

作为一个例子,在指令选择后,我们的SelectionDAG结构展示如下。CopyToReg,CopyFromReg及Register节点没有触及,并一直维持到寄存器分配。事实上,指令选择阶段甚至可能生成额外的节点。在指令选择后, ISD::ADD节点被翻译为X86指令ADD32ri8,而X86ISD::RET_FLAG被翻译为RET。

(注:在同一个DAG中可能有3种指令表示共存:通用LLVM ISD节点,比如ISD::ADD;目标机器特定的<Target>ISD节点,比如X86ISD::RET_FLAG;以及目标机器的物理指令,比如X86::ADD32ri8。)

4.1.6. 模式匹配

每个目标机器通过在名为<Target_Name>DAGToDAGISel的SelectionDAGISel子类中实现Select()方法来处理指令选择,例如,SPARC中的SparcDAGToDAGISel::Select()。这个方法接受一个要匹配的SDNode参数,返回代表一条物理指令的一个SDNode值;否则出错。

Select()方法允许两个方式来匹配物理指令。最直接的方式是通过调用从TableGen模式生成的匹配代码,就像下面列表中的第一步。不过,模式表达能力可能不足以处理某些指令的古怪行为。在这种情形下,必须在这个方法里编写定制的C++匹配逻辑的实现,就像下面列表的第二步。这个做法的细节如下:

1. Select()方法调用SelectCode。TableGen为每个目标机器生成SelectCode()方法,在这个代码里,TableGen还生成了MatcherTable,将ISD及<Target>ISD节点映射到物理指令节点。这个匹配者表从.td文件(通常是<Target>InstrInfo.td)里的指令定义生成。SelectCode()方法以调用使用该目标机器匹配者表来匹配节点的目标机器无关方法SelectCodeCommon()结束。TableGen有一个专用的指令选择后端来生成这些方法即这个表

$ cd <llvm_source>/lib/Target/Sparc

$ llvm-tblgen -gen-dag-isel Sparc.td -I ../../../include

对每个目标机器,在C++生成文件<build_dir>/lib/Target/<Target>/<Target>GenDAGISel.inc中有相同的输出;例如,SPARC的方法与表在<build_dir>/lib/Target/Sparc/SparcGenDAGISel.inc文件里。

2. 在调用SelectCode()之前提供定制的匹配代码。例如,i32节点ISD::MULHU执行两个i32的乘法,产生一个i64结果,并返回高i32部分。在32位SPARC里,乘法指令SP::UMULrr在特殊寄存器Y中返回高部分,这要求使用SP::RDY指令读出。TableGen不能体现这个逻辑,我们使用下述代码来解决之:

case ISD::MULHU: {

   SDValue MulLHS = N->getOperand(0);

   SDValue MulRHS = N->getOperand(1);

   SDNode *Mul = CurDAG->getMachineNode(SP::UMULrr, dl,

            MVT::i32, MVT::Glue, MulLHS, MulRHS);

   return CurDAG->SelectNodeTo(N, SP::RDY, MVT::i32,

            SDValue(Mul, 1));

}
这里,在这个上下文中,N是要匹配的SDNode实参,它等于ISD::MULHU。因为在这个case语句之前已经执行过完备性检查,我们着手生成SPARC特定的操作码来替换ISD::MULHU。为此,我们调用CurDAG->getMachineNode()创建一个带有物理指令SP::UMULrr的节点。其次,通过使用CurDAG- >SelectNodeTo(),我们创建一个SP::RDY指令节点,然后将所有使用ISD::MULHU节点的地方改为指向SP::RDY的结果。下图展示了这个例子指令选择前后SelectionDAG结构。上述的C++代码片段是lib/Target/Sparc/SparcISelDAGToDAG.cpp代码的简化版。

 

4.1.7. 指令选择过程的可视化

有几个llc选项允许在指令选择的不同阶段可视化SelectionDAG。如果你使用这些选项,llc将生成一个类似于之前展示图的.dot图,不过你需要使用dot程序来显示它,或使用dotty来编辑它,两者都能在www.graphviz.org的Graphviz包里找到。下表以执行序展示了各个选项:

Llc选项

阶段

-view-dag-combine1-dags

在DAG合并1之前

-view-legalize-types-dags

在类型合法化之前

-view-dag-combine-lt-dags

类型合法化2之后,DAG合并之前

-view-legalize-dags

合法化之前

-view-dag-combine2-dags

DAG合并2之前

-view-isel-dags

在指令选择之前

-view-sched-dags

指令选择之后,调度之前

44.1.8. 快速指令选择

LLVM还支持另一个称为快速指令选择的实现。快速指令选择的目的是,以代码质量为代价,提供快速的代码生成,它适合于-O0级别优化过程的哲学。速度提升归因于避免复杂的折叠与降级逻辑。TableGen描述也用于简单的操作,但指令更复杂的匹配要求目标机器特定的处理代码。

-O0过程还使用快速的次优寄存器分配器及调度器,以代码质量换取编译速度。)

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

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

相关文章

基于NB-iot技术实现财物跟踪的EA01-SG定位模块方案

NB-iot无线数传模块可做财物防盗窃器&#xff0c;让你的财物可定位跟踪&#xff01; 随着社会的发展&#xff0c;公共资源及共享资源的蓬勃发展&#xff0c;对资产管理和资产追踪有了新的需求&#xff0c;如&#xff1a;某儿童玩具车在商场外面提供车辆乘坐游玩服务&#xff0…

一、python基础语法

文章目录 1.Python介绍1&#xff09;发明者龟叔2&#xff09;python特点3&#xff09;python缺点4&#xff09;Python版本 2.Python解释器1&#xff09;编译型和解释型2&#xff09;常见的python解释器3&#xff09;下载Python解释器4&#xff09;安装Python解释器5&#xff09…

​软件测试知多少:Postman​接口自动化测试

Postman除了前面介绍的一些功能&#xff0c;还有其他一些小功能在日常接口测试或许用得上。今天&#xff0c;我们就来盘点一下&#xff0c;如下所示&#xff1a; 一、数据驱动 想要批量执行接口用例&#xff0c;我们一般会将对应的接口用例放在同一个Collection中&#xff0c…

11.初始JavaScript[初步了解何为js]

文章目录 1.初识 JavaScript1.1JavaScript 是什么1.2发展历史1.3JavaScript 和 HTML 和 CSS 之间的关系1.4JavaScript 运行过程1.5JavaScript 的组成 2.前置知识2.1第一个程序2.2JavaScript 的书写形式2.2.1行内式2.2.2内嵌式2.2.3外部式 2.3注释2.4输入输出2.4.1输入: prompt2…

WSL重装Anaconda

第一次安装使用的是官网下载的文件&#xff0c;存放在Windows中进行安装的&#xff0c;结果安装后有一些小错误&#xff0c;现在想重新安装过。 一、卸载原Anaconda 首先要知道Anaconda的安装地址&#xff0c;默认地址为&#xff1a;C:\Users\用户名\AppData\Local\Packages\…

Linux ————​文件权限

&#xff08;一&#xff09;文件权限 基础补充 文件基本属性&#xff08;Linux中万物皆是文件&#xff09;文件是操作系统用来存储信息的基本结构&#xff0c;是一组信息的集合。文件通过文件名来唯一标识。Linux中的文件名称最长允许255个字符&#xff0c;这些字符可用A~Z、0…

【小程序图片水印】微信小程序图片加水印功能 canvas绘图

看看效果 实现步骤&#xff1a; 1.选择图片 /* 选择背景图片 对图片的大小以及类型做一下限制 */ chooseImage(e) {uni.chooseImage({count: 1,success: (res) > {let index res.tempFilePaths[0].lastIndexOf(".");let imgUrl res.tempFilePaths[0].substr(i…

【设计模式】第3节:设计模式概论

设计模式不是代码&#xff0c;而是某类问题的通用方案。设计模式的本质是提高软件的维护性、通用性和扩展性&#xff0c;并降低软件的复杂度。一共有24种设计模式&#xff0c;可以分为创建型模式、结构型模式和行为型模式三大类。设计模式中比较重要的有&#xff1a;单例模式、…

seata at模式死锁

背景 mysql版本为5.7,在mysql的系统表中&#xff0c;有一个lock_deadlocks的指标 SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE name LIKE %deadlock%该指标的count值记录了数据库实例从启动到现在的死锁次数&#xff0c;我们通过普罗米修斯的mysql探针&#xff0…

软件外包开发的代码质量控制

软件代码质量控制是确保软件项目成功的重要组成部分。以下是一些常见的软件代码质量控制方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.代码审查&#xff08;Code Review&#xff09; 通过定…

Zynq UltraScale+ XCZU15EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

目前比较好用的护眼台灯?央视公认最好的护眼台灯推荐

写这篇文章的时候&#xff0c;我总有种悔不当初的痛感&#xff1a;上学时只喜欢造型好看的台灯&#xff0c;总是把老妈买的护眼灯丢在一边&#xff0c;导致现在眼睛高度近视。虽然不念书了&#xff0c;但平日使用电脑浏览信息、阅读纸质书仍是抛弃不掉的生活习惯&#xff0c;配…

Redis实现方式开启新篇章,解决分布式环境下的资源竞争问题,提升系统稳定性

前言 分布式锁一般有三种实现方式&#xff1a; 数据库乐观锁&#xff1b;基于Redis的分布式锁&#xff1b;基于ZooKeeper的分布式锁 本篇博客将介绍第二种方式&#xff0c;基于Redis实现分布式锁。 虽然网上已经有各种介绍Redis分布式锁实现的博客&#xff0c;然而他们的实…

万字长文搞懂产品模式和项目模式

项目模式是很多传统企业对IT进行投资的方式&#xff0c;相对于产品模式&#xff0c;项目模式在团队建设、快速反应等方面存在很多弊端&#xff0c;本文从多个角度比较了产品和项目两种团队模式的利弊&#xff0c;并在最后回答了若干常见问题。原文: Products Over Projects 软件…

活动回顾|KCD 2023 杭州站

KCD 2023 活动介绍 HANGZHOU 关于 KCD Kubernetes Community Days&#xff08;KCD&#xff09;由云原生计算基金会&#xff08;CNCF&#xff09;发起&#xff0c;由全球各国当地的 CNCF 大使、CNCF 员工以及 CNCF 会员单位联合组织。目前 KCD 正在全球各个国家活跃地组织进行中…

nvidia-smi

1、说明 nvidia-smi 是 NVIDIA System Management Interface 的缩写&#xff0c;是 NVIDIA 提供的一个命令行工具&#xff0c;用于查看和管理 NVIDIA GPU 设备的信息。执行这个命令通常可以获取关于系统上安装的 NVIDIA GPU 的实时状态和性能信息。 一般来说&#xff0c;nvid…

内裤洗衣机有用吗?公认好用的四大款内衣洗衣机推荐

内衣目前洗衣机已经成为我们生活中不可缺少的一种电器。这不但可以节约我们的时间&#xff0c;而且能更好地清洗干净贴身衣物&#xff0c;使我们的生活变得更健康。那么到底哪些内衣洗衣机值得买呢&#xff1f;哪些内衣洗衣机清洗效果会更干净呢&#xff1f;这次&#xff0c;我…

众和策略:谷歌大跌!土耳其股市,两度熔断!

当地时间周三&#xff0c;美股三大指数团体收跌&#xff0c;谷歌等大型科技股连累纳指大跌超2%&#xff0c;创2月以来最大单日跌幅。 当日&#xff0c;谷歌股价大跌近10%至三个月低位&#xff0c;市值一夜蒸发超1600亿美元。周二盘后&#xff0c;谷歌母公司Alphabet发布了最新…

FinalShell或者XShell工具 突然连不上服务器(绝对好使!)

关闭网络管理器 systemctl stop NetworkManager禁止网络管理器开机重启 systemctl disable NetworkManager重启网络 service network restart绝对好使&#xff01;

技术实力获行业高度认可,几何伙伴首获科技进步奖殊荣!

2023年10月25日&#xff0c;“2023年度中国汽车工程学会科学技术奖”正式公布并于北京举行颁奖典礼&#xff0c;以对汽车工业努力奋斗、勇于创新的优秀企业和人才进行嘉奖&#xff0c;对优秀先进成果进行表彰。 其中&#xff0c;由几何伙伴主导&#xff0c;携手上汽集团、友道智…