llvm后端之局部变量

llvm后端之局部变量

  • 引言
  • 1 生成FrameIndexSDNode
  • 2 消除FrameIndex
    • 2.1 eliminateCallFramePseudoInstr
    • 2.2 eliminateFrameIndex

引言

llvm后端对局部变量(即alloc节点)的访问,首先,将对alloc节点转为FrameIndex,所有对alloc的load和store均用FrameIndex取代;最后,在PEI这个pass中调用XXXRegisterInfo::eliminateFrameIndex将FrameIndex操作数转换为FP寄存器偏移量。

1 生成FrameIndexSDNode

  • 在SelectionDAGISel::runOnMachineFunction->FunctionLoweringInfo::set中会为每个AllocaInst生成FrameIndex、并在FunctionLoweringInfo::StaticAllocaMap存储AllocaInst与FrameIndex的索引关系。由于可变参数在帧指针上面、局部变量在帧指针下面,所以FrameIndex就是由AllocaInst封装的栈对象在MachineFrameInfo::Objects中的位置序号减去前面的可变参数对象个数(可变参数也是栈对象,它也记录在该Objects且放置在前面);
  • 当生成DAG阶段,节点引用的操作数是AllocaInst时,在FunctionLoweringInfo::StaticAllocaMap中查找对应FrameIndex值,并创建FrameIndexSDNode节点。

注:MachineFrameInfo::Objects列表依次放置可变参数、异常参数、局部变量。其中可变参数和异常参数是FixedObjects。局部变量包括固定大小的变量,不固定大小的变量(例如不定长的数组)。

2 消除FrameIndex

由于FrameIndex操作数是一个抽象的操作数,对它的替换是在PEI这个pass中进行的。核心流程如下:

  • 在函数PEI::replaceFrameIndices(MachineFunction &MF)中,通过df_iterator对每个基本块按DFS进行迭代,每个迭代项记录entry节点到当前节点的DFS搜索路径。针对每个节点调用PEI::replaceFrameIndices的重载函数来迭代基本块的每条指令;
  • 如果指令是帧操作指令,则需要获取此指令栈指针偏移大小,并且要累加到后续迭代中。并且通过XXXFrameLowering::eliminateCallFramePseudoInstr将该伪指令展开为真实的栈指针的操作;
  • 对于非debug指令且非TargetOpcode::STATEPOINT类型的指令,通过XXXRegisterInfo::eliminateFrameIndex将操作数更改为基于帧指针FP的偏移。

注:帧操作指令的定义由class XXXInstrInfo构造时,由XXXGenInstrInfo传入。对于RISCV而言,就是RISCV::ADJCALLSTACKDOWN和RISCV::ADJCALLSTACKUP两条指令,前者是增长栈、后者为缩小栈

2.1 eliminateCallFramePseudoInstr

该函数为TargetFrameLowering的虚函数,以RISCV为例,其逻辑如下:

  • 当没有保护栈空间,或者说没有将栈空间固定死(也就是函数有可变长的局部变量),则插入累加SP寄存器的指令;
  • 最后,删除之前的老指令(无论函数有无可变长的局部变量)。

2.2 eliminateFrameIndex

该函数为TargetRegisterInfo的虚函数,以RISCV为例,其逻辑如下:

  • 首先,进行断言。本函数是不希望出现动态调整栈指针情况,当然出现过调整又恢复的情况是可以接受的;
  • 通过RISCVFrameLowering::getFrameIndexReference计算FrameIndex的空间相对FrameReg的偏移,并通过引用返回FrameReg;
  • 最后,当Offset是有效12位立即数,则将FrameIndex操作数设置为FrameReg的引用,下一个操作数设置为offset立即数;当Offset不是有效12位立即数,则将FrameReg与offset相加后,设置FrameIndex操作数为累加的值,下一个操作数设置为0;

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

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

相关文章

分类预测|2024年最新优化算法鹦鹉优化器PO|基于鹦鹉优化SVM支持向量机数据分类预测Matlab程序PO-SVM

分类预测|2024年最新优化算法鹦鹉优化器PO|基于鹦鹉优化SVM支持向量机数据分类预测Matlab程序PO-SVM 文章目录 一、基本原理**原理****PO-SVM 流程****总结** 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 PO-SVM 是一种将鹦鹉优化算法(Parrot Opti…

机器学习 第8章 集成学习

目录 个体与集成BoostingBagging与随机森林Bagging随机森林 结合策略平均法投票法学习法 个体与集成 定义:集成学习,也叫多分类器系统、基于委员会的学习等,它是一种通过结合多个学习器来构建一个更强大的学习器的技术。如下图所示 在这里&a…

计算机网络八股总结

这里写目录标题 网络模型划分(五层和七层)及每一层的功能五层网络模型七层网络模型(OSI模型) 三次握手和四次挥手具体过程及原因三次握手四次挥手 TCP/IP协议组成UDP协议与TCP/IP协议的区别Http协议相关知识网络地址,子…

【每日一题】LeetCode 2390 从字符串中移除星号(栈、字符串、模拟)

【每日一题】LeetCode 2390 从字符串中移除星号(栈、字符串、模拟) 题目描述 给定一个由小写英文字母和星号 * 组成的字符串 s,你需要通过一系列操作移除所有的星号。在每一步操作中,你可以选中字符串中的一个星号,然…

新能源汽车 BMS 学习笔记篇——如何选择继电器 MOS 管作为开关

序:继电器和 MOSFET(俗称 MOS 管)都可以用作 BMS(Battery Management System,电池管理系统) 中控制电池充放电的开关,但它们在原理、结构和特性上存在一些区别,以下总结它们之间主要…

java后端如何发送httpGET和POST请求

用java后端发送请求需要用到的一个工具包为HttpClient。HttpClient是Apache的一个子项目&#xff0c;是高效的、功能丰富的支持HTTP协议的客户端编程工具包。 引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId&…

springboot-数据库事务支持

文章目录 事务支持编程式事务管理声明式事务管理使用 Transactional 注解配置事务管理器Transactional 的一些属性 isolation 事务隔离级别propagation 事务传播机制 事务支持 Spring Boot 中的事务管理主要依赖于 Spring Framework 提供的功能。Spring 为事务管理提供了两种方…

.net core 通过Sqlsugar生成实体

通过替换字符串的方式生成代码&#xff0c;其他代码也可以通这种方式生成 直接上代码 设置模板 将这几个模板文件设置为&#xff1a;嵌入资源 模板内容&#xff1a; using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName}; /// <summary> /// {TableDisplay…

重学SpringBoot3-SpringApplicationRunListener

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringApplicationRunListener 1. 基本作用2. 如何实现2.1. 创建SpringApplicationRunListener2.2. 注册SpringApplicationRunListener2.3. 完整示例 3.…

跨国公司撤出背后的启示:中国IT产业的挑战与机遇

目录 前言 1. 全球化背景下的战略调整 2. 中国IT人才的应对之策 3. 中国IT产业的机遇与挑战 4. 未来的中国IT产业&#xff1a;自主创新与全球化并行 5. 结语 相关推荐 前言 IBM中国近日宣布撤出其在华两大研发中心&#xff0c;这一决定在IT行业内引发了广泛的讨论和思考…

iceoryx共享内存通信

共享内存原理 当POSIX系统中的进程启动时,它会被赋予自己的虚拟地址空间。 虚拟地址空间跨越的范围对于不同的进程可能是相同的,但是在特定地址可访问的数据对于每个进程可能是不同的。 在进程的虚拟地址空间内,有许多“内存区域”用于加载或映射数据。这些内存区域通常是…

MacBook上怎么查找历史复制记录?

你是否经常遇到这样的情况:做内容或方案时,需要用到素材就去找,找到后回来粘贴,然后再去找,再回来粘贴?这个过程是不是很繁琐? 那么找到的素材要不要保存下来呢?每个都存成文件似乎太麻烦了。但如果不单独保存,过两天想再利用又找不到了,怎么办? 在网上看到的一段好文案、…

Centos入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个开源的Linux发行版&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建。以下是CentOS入门必备的一些基础知识&#xff1a; 前言 本文由浪浪云赞助发布&#xff0c;…

ELK 架构中 ES 性能优化

1. 背景 由于目前日志采集流程中, 经常遇到用户磁盘 IO 占用超过 90% 以上的场景, 但是观察其日志量大约在 2k~5k 之间, 整体数据量不大, 所以针对该问题进行了一系列的压测和实验验证,最后得出这篇优化建议文档 2. 压测前期准备 2.1 制造大量日志 该阶段为数据源输入阶段,…

JavaScript 将 json 美化输出

https://andi.cn/page/621741.html

STM32G474RE之RTC

STM32G474RE之RTC使用HAL库实现RTC时间配置&#xff0c;以及报警配置&#xff0c;支持双路报警。 1、STM32G474RE的RTC晶振引脚&#xff1a; OSC32_IN为PC14&#xff0c;OSC32_OUT为PC15&#xff1b; 2、Vbat引脚 Vbat引脚是用来给外部晶振LSE和备份寄存器提供电源。当没有“…

反射获取构造器、成员方法、成员变量

目录 一、反射 1.反射的概述 2.反射的作用 二、获取Class类对象的方式 三、反射获取构造方法并使用 1.Class类获取构造方法对象的方法 2.Constructor类用于创建对象的方法 四、反射获取成员变量并使用 1.Class类获取成员变量对象的方法 2.Field类用于给成员变量赋值的方法 …

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 16 的新功…

3D Gaussian Splatting 论文学习

概述 目前比较常见的渲染方法大致可以分为2种&#xff1a; 将场景中的物体投影到渲染平面&#xff1a;传统的渲染管线就是这种方式&#xff0c;主要针对Mesh数据&#xff0c;可以将顶点直接投影成2D的形式&#xff0c;配合光栅化、深度测试、Alpha混合等就可以得到渲染的图像…