LLVM学习笔记(49)

news2024/9/22 13:33:35

4.1.3. 降级

在前面的章节里,我们展示了目标机器特定节点与目标机器无关节点共存的一个图。你可能会问,如果这是指令选择的一个输入,为什么在SelectionDAG类中已经有一些目标机器特定的节点?要理解这,我们首先在下图概括指令选择之前所有的步骤,从左上角的LLVM IR步骤开始:

首先,一个SelectionDAGBuilder实例访问每个函数并为每个基本块创建一个SelectionDAG对象。在这个过程中,一些特殊的IR指令,比如call与ret,需要将目标机器特定的习语——例如,如何传递实参,如何从一个函数返回——翻译为SelectionDAG节点。为解决这个问题,类TargetLowering中的算法被第一次使用。这个类是每个目标机器必须都实现的一个抽象接口,它拥有所有后端可以使用的大量的通用功能。

要实现这个抽象接口,每个目标机器声明一个名为<Target>TargetLowering的TargetLowering子类。每个目标机器还重载方法,以实现如何将一个特定的、目标机器无关的高级节点降级到更接近这个机器的形式。正如期望的,仅有少数节点必须以这个方式降级,而大多数其他节点在指令选择时被匹配、替换。例如,在sum.bc的SelectionDAG中,X86TargetLowering::LowerReturn()方法用于降级IR ret指令。在这期间,它生成了X86ISD::RET_FLAG节点,它将函数结果拷贝到EAX——一个处理函数返回值的目标机器特定方式。

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);

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

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

相关文章

已经是项目经理了,还有必要考PMP吗?

这个必要性不是一定的&#xff0c;如果你想升职加薪&#xff0c;想突破瓶颈&#xff0c;没有其它办法提升的话&#xff0c;考一个有针对性的项目管理证书也是有一些必要性的&#xff0c;虽然薪资和证书不是画等号的&#xff0c;但是多了一些可能性&#xff0c;既能提升自己&…

小白如何把微博的视频下载到本地,只需2个步骤

微博是中国最受欢迎的社交网络平台之一&#xff0c;用户可以在其上分享文字、图片和视频。但是&#xff0c;有时候我们会想要将喜欢的微博视频保存到本地&#xff0c;以便随时观看。本文将向您介绍如何实现这一目标。 无水印方法&#xff1a; 1. 搜一搜获取视频下载小助手 为…

ffmpeg推流 nginx-http-flv-module作为流媒体服务器转流m3u8 前端vue集成videojs-player播放 实现、调优、问题解决

背景&#xff1a; 最近公司要基于双目视觉做鹤管自动充装项目&#xff0c;需要对相机的流媒体进行推流&#xff0c;推流到流媒体服务器后&#xff0c;再将流转换成页面能播放的flv或m3u8格式的直播流&#xff0c;然后在页面进行视频直播。本项目共有四个鹤位&#xff0c;所以需…

1024 有奖征名|来给矩阵起源办公室的新猫取名字呀~

在一个风雨交加的夜晚&#xff0c;一只无名的小黑猫突然出现在矩阵起源办公室中。这只小黑猫的出现引起了员工们的惊讶和好奇。他的毛色乌黑亮丽&#xff0c;眼神炯炯有神&#xff0c;容貌精神焕发&#xff0c;脚步身轻如燕、叫声熠熠生辉。尽管大家都很喜欢这只可爱的小动物&a…

项目管理-2023西电网课课后习题答案-第二章

文章目录 第二章答案1-1011-2021-3031-4040-42 [✅] 第一章答案[✅] 第二章答案 第三章答案 第四章答案 第五章答案 第二章答案 1-10 11-20 21-30 31-40 40-42

【Redis系列】在Centos7上安装Redis5.0保姆级教程!

哈喽&#xff0c; 大家好&#xff0c;我是小浪。那么最近也是在忙秋招&#xff0c;很长一段时间没有更新文章啦&#xff0c;最近呢也是秋招闲下来&#xff0c;当然秋招结果也不是很理想&#xff0c;嗯……这里就不多说啦&#xff0c;回归正题&#xff0c;从今天开始我们就开始正…

横坐标日期等间隔绘图 python示例代码

有两列数据&#xff0c;一列是日期&#xff0c;另一列是数值。日期是递增的&#xff0c;但是间隔不是均匀的。比如1月1日至2月1日有10组数据&#xff0c;2月1日至3月1日有100组数据&#xff0c;3月1日至4月1日有1000组数据。我想绘折线图&#xff0c;横坐标是日期&#xff0c;纵…

内网电脑监控软件的功能

内网电脑监控软件是一种用于监控企业内部网络使用情况的软件&#xff0c;可以帮助企业管理者更好地了解员工的工作状态和网络使用情况&#xff0c;提高工作效率和信息安全。 其功能具体如下&#xff1a; 1、实时电脑屏幕 实时监控是内网电脑监控软件的核心功能之一&#xff0…

Redis数据类型——hash类型的概念及操作

1.hash类型介绍 可以理解为redis中的一个小型redis 2.v 3.hash数据类型的扩展操作 4.hash类型数据操作的注意事项

SylixOS BSP开发(七)

实现系统调试信息打印接口 当系统出错时或者使用内核日志时会输出一些打印信息&#xff0c;这最终都是调用到bspLib.c中的bspDebugMsg 这个接口来实现的&#xff0c;所以我们在开发BSP时&#xff0c;第一个要做的工作就是实现这个接口。 一般的调试信息都是通过串口来输出的&am…

Autojs 利用OpenCV识别棋子之天天象棋你马没了

本例子通过代码像你介绍利用OpenCV实现霍尔找圆的方法定位棋子位置 通过autojs脚本实现自动点击棋子 开源地址 https://github.com/Liberations/TtxqYourHorseIsGone/blob/master/main.js AutoXJs https://github.com/kkevsekk1/AutoX/releasesauto() //安卓版本高于Android 9…

受欢迎的免费在线数据库设计工具Itbuilder

工欲善其事必先利其器&#xff0c;众所周知&#xff0c;良好的数据库设计能够大幅减少后期的运维工作&#xff0c;同时也能最大程度地减少软件项目出错的可能。因此一个合适的在线数据库设计工具&#xff0c;来实现事半功倍的效果。 什么是在线数据库设计&#xff1f; 在线数据…

容联七陌助力鱼跃医疗升级智能联络中心,让客户服务更“鱼跃”

在当今高度竞争的市场环境中&#xff0c;企业的客户服务质量对于维护品牌形象和保持竞争优势至关重要。而随着人工智能、大数据等技术快速发展&#xff0c;智能化客户服务正在成为各行各业发展的重要部分。 鱼跃医疗是一家致力于“用科技律动生命"的国内知名医疗制造企业…

GaussDB技术解读系列:如何迁移到GaussDB?

迁移是数据库选型过程中客户最为关心的话题之一&#xff0c;经过大量的沟通调研&#xff0c;我们总结了三个客户在数据库迁移方面的主要期望&#xff1a;迁移不影响业务运行&#xff08;安心&#xff09;&#xff0c;迁移不能丢数据&#xff08;放心&#xff09;&#xff0c;迁…

损失函数总结(四):NLLLoss、CTCLoss

损失函数总结&#xff08;四&#xff09;&#xff1a;NLLLoss、CTCLoss 1 引言2 损失函数2.1 NLLLoss2.2 CTCLoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss)。在这篇文章中&#xff0c;会接着上文提到的众多…

【Note】一般二叉树的顺序存储

一般二叉树的存储示意图 位置i012345678910结点ABC^D^E^^F

离子阱领域新突破!滑铁卢团队在量子比特控制方面取得进展

&#xff08;图片来源&#xff1a;网络&#xff09; 要想打造未来量子计算机&#xff0c;就需要对量子比特进行精准可靠地控制。研究人员利用激光开发出了一种新方法&#xff0c;可以控制由化学元素钡制成的单个量子比特&#xff0c;这是迄今为止最好的离子阱量子比特控制方法…

使用Redis部署 PHP 留言板应用

使用Redis部署 PHP 留言板应用 启动 Redis 领导者&#xff08;Leader&#xff09;启动两个 Redis 跟随者&#xff08;Follower&#xff09;公开并查看前端服务清理 启动 Redis 数据库 创建 Redis Deployment apiVersion: apps/v1 kind: Deployment metadata:name: redis-le…

【IDEA查看一个jar包的依赖】

首先install,打jar包 重新创建一个项目 选中刚才的jar包 在这个包下就能看到jar包的依赖了

每日一练 | 华为认证真题练习Day122

1、路由器所有的接口属于同一个广播域。 A. 对 B. 错 2、下列配置默认路由的命令中&#xff0c;正确的是&#xff08;&#xff09;。 A. [Huawei]ip route-static 0.0.0.0 0.0.0.0 192.168.1.1 B. [Huawei-Serial0]ip route-static 0.0.0.0 0.0.0.0 0.0.0.0 C. [Huawei]ip…