线性扫描寄存器分配算法介绍

news2024/11/25 22:54:22

线性扫描寄存器分配

文章目录

  • 线性扫描寄存器分配
    • 1. 算法介绍
    • 2. 相关概念
    • 3. 算法的实现
      • 3.1 伪代码
      • 3.2 图示
    • 参考文献

  • 论文地址:

Linear Scan Register Allocation

​ 我们描述了一种称为线性扫描的快速全局寄存器分配的新算法。该算法不基于图形着色,而是在变量生存范围的单个线性时间扫描中将寄存器分配给变量。线性扫描算法比基于图形着色的算法要快得多,并且易于实现,并且生成的代码几乎与使用基于图形着色的更复杂且耗时的寄存器分配器获得的代码一样高效。该算法适用于关注编译时间的应用程序,例如动态编译系统、“即时”编译器和交互式开发环境。

不使用图着色算法的根本原因是它要先构造好完整的干涉图,才能在图上着色,而干涉图的构造代价太过高昂。应该说,图着色过程中的大部分开销都集中于干涉图的构造阶段。因此,虽然图着色生成的代码质量很高,但是对于讲究编译效率的现代编译器来说,其时间成本是不可忽视的。对于对编译时间更加敏感的 JIT 编译器来说,则更是如此。除此之外,在实际的编译工作中,人们发现了另外一个问题。由于在目前所有的硬件架构中,寄存器的数目都是有限的,故对于大型程序来说,寄存器不够用可以说是必然存在的情况。换句话说,大型程序一定会产生大量溢出。问题就出现在这里,因为图着色算法把重点放在解决“如何把所有的程序变量尽可能地分配到寄存器中”,如果程序一定会大量产生溢出,那么,关注“如何高效地溢出”比关注“如何尽量减少溢出”更有价值。

spill:溢出,是指目前的寄存器不够使用,该部分数据需要借助sram或者堆栈区域的空间进行缓存协调的行为。

寄存器的数量是有限的,因此当程序中使用了过多的变量或产生了大量的临时计算结果时,编译器可能会出现寄存器不足的情况,导致寄存器溢出。这可能会导致编译器将某些变量或数据存储在内存中,而不是寄存器中,从而降低了程序的执行效率。

1. 算法介绍

线性扫描寄存器分配算法是一种用于在编译器中分配寄存器的算法,旨在将程序中的变量映射到计算机的寄存器,以提高程序的执行效率。该算法通常用于编译器的代码生成阶段,用于生成目标代码。

线性扫描寄存器分配算法的基本思想是,通过一次线性扫描来分配寄存器,从而在程序的不同位置为变量分配寄存器。该算法不需要进行复杂的数据流分析,因此相对较快且简单。以下是线性扫描寄存器分配算法的主要步骤:

  1. 构建活跃变量区间(Live Range):首先,通过数据流分析计算每个变量的活跃区间,即变量在程序中被使用的区间。活跃区间通常是变量在程序中的生命周期。
  2. 排序活跃变量区间:将所有活跃变量区间按照其结束位置从小到大进行排序。
  3. 遍历活跃变量区间:从排好序的活跃变量区间列表中,按顺序遍历每个区间。在遍历过程中,为每个区间分配一个可用的寄存器,并在需要时将之前分配的寄存器释放。
  4. 确定溢出:如果某个区间没有足够的可用寄存器,即产生溢出,算法会尝试将某个寄存器的值移出到内存中,以腾出空间来分配给新的变量。

线性扫描寄存器分配算法的优点在于简单易实现,适用于中等规模的代码生成。然而,它可能不如其他更复杂的寄存器分配算法(如图着色法)在某些情况下能够达到更高的性能。不同的编译器可能会使用不同的寄存器分配算法,以根据特定的需求和目标平台进行优化。

2. 相关概念

live interval:生命间隔
live range:生命周期

interference:相交(conflict)

active list:已经分配物理内存的节点集合

3. 算法的实现

3.1 伪代码

image-20230814221420865

3.2 图示

image-20230814221317558

image-20230814221239700

参考文献

[1] Register Allocation in LLVM 3.0
[2] Hacker News - Register Allocation
[3] Linear Scan Register Allocation
[4] Register Allocation
[5] 博客圆-线性扫描寄存器分配

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

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

相关文章

20个互联网用户Python数据分析项目

这篇文章给大家整理了20个互联网用户数据分析的项目。所有收录的项目,进行了严格的筛选,标准有二: 1.有解说性文字,大家能知道每一步在干嘛,新手友好 2.数据集公开,保证大家可以在原文的基础上自行探索 更…

定长内存池设计ConcurrentMemoryPool

原理 还回来的内存用链表串联起来&#xff0c;称为自由链表 内存块自身进行链接&#xff0c;前四个字节存下一个的地址 结构 template<class T> class ObjectPool { public:T* New(){} private:char* _memory nullptr; //方便切割void* _freeList nullptr; };第一步…

ATF BL1 UFS初始化简单分析

ATF BL1 UFS初始化分析 1 ATF的下载链接2 ATF BL1 UFS 初始化简易流程图3 ATF BL1 ufs初始化简单过程分析3.1 调用过程3.2 hikey960_ufs_init3.3 dw_ufs_init3.3 ufs_init 以海思hikey960为例来介绍&#xff0c;简单介绍在ATF BL1阶段的初始化处理。 1 ATF的下载链接 https:/…

“解引用“空指针一定会导致段错误吗?

可能有些朋友看见这个标题第一反应是嵌入式的某些内存中,0地址也是可以被正常访问的,所以对0地址的解引用不会发生错误,但我要说的情况不是这个,而是指一个真正的空指针,不仅是c/c中的0,(void*)0,NULL,还有nullptr,一个真正的空指针. 在c语言中,想获得某结构体的成员变量相对偏…

HTTP 协议的基本格式和 fiddler 的用法

目录 一. HTTP 协议 1. HTTP协议是什么 2. HTTP协议的基本格式 HTTP请求 首行 GET和POST方法&#xff1a; 其他方法 经典面试题&#xff1a; URL Header(请求报头)部分 空行 ​HTTP响应 状态码总结: 二、Fiddler的用法 1.Fidder的安装 2.Fidder的使用 一. HTTP 协议 1. H…

netty学习分享(一)

TCP与UDP TCP 是面向连接的、可靠的流协议&#xff0c;通过三次握手建立连接&#xff0c;通讯完成时要拆除连接。 UDP是面向无连接的通讯协议&#xff0c;UDP通讯时不需要接收方确认&#xff0c;属于不可靠的传输&#xff0c;可能会出现丢包现象 端口号&#xff1a; 端口号用…

软考:中级软件设计师:文件管理,索引文件结构,树型文件结构,位示图,数据传输方式,微内核

软考&#xff1a;中级软件设计师: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1…

数学运算1

正确答案&#xff1a;F 你的答案&#xff1a;E 参考答案&#xff1a;最大排列为100 1 99 2 98 3…51 49 50 所以和为999897…1(100-50)因为是一个圈所以&#xff0c;100和50相接&#xff0c;所以等于5000 知识点&#xff1a;数学运算

工作经验总结:RH850中SP、LP、PC寄存器间联系与入栈出栈操作简单整理

一、RH850系列中SP、LP、PC寄存器简介 SP&#xff1a;栈顶寄存器&#xff0c;保存最新栈顶的地址 LP&#xff1a;链接寄存器&#xff0c;保存函数跳转的地址&#xff08;当没发生调用子函数的操作时候&#xff0c;你可以通过单步调试发现&#xff0c;该寄存器的值不变&#x…

Golang-使用 gvm 进行版本控制

当你想为每个项目切换 go 版本时&#xff0c;gvm (Go Version Manager) 很方便。 这里&#xff0c;我将介绍“如何在Mac上安装gvm”和“如何使用gvm” 使用准备 仅适用于 Mac 的准备工作 按照MacOSX 要求中的说明执行以下命令。 xcode-select --install brew update brew …

JavaFx基础学习【一】:基本认识

一、介绍 JavaFX 是一个开源的下一代客户端应用平台&#xff0c;适用于基于Java构建的桌面、移动端和嵌入式系统。 它是许多个人和公司的共同努力的成果&#xff0c;目的是为开发丰富的客户端应用提供一个现代、高效、功能齐全的工具包。 二、JavaFx应用基本结构 想要开发一款…

浅谈医用IT隔离电源在医院特殊场所接地系统的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】我们国家大部分医院的临床救治和确诊都是利用了医疗电气类设备和医用的医疗仪器&#xff0c;因此这些地方的接地问题应该引起我们的高度的重视。IT系统主要是利用了中性点没有直接接地的方式&#xff0c;所以可以减少电…

【【verilog 典型电路设计之加法器树乘法器】】

verilog 典型电路设计之加法器树乘法器 加法器树乘法器 加法器树乘法器的设计思想是“移位后加”&#xff0c;并且加法运算采用加法器树的形式。乘法运算的过程是&#xff0c;被乘数与乘数的每一位相乘并且乘以相应的权值&#xff0c;最后将所得的结果相加&#xff0c;便得到了…

日常BUG——微信小程序提交代码报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 在使用微信小程序开发工具进行提交代码时&#xff0c;报出如下错误&#xff1a; Invalid a…

DDR5内存升级看光威,两款超值DDR5内存条,价格实惠性能强劲

DDR4内存条现在用的人应该占多数&#xff0c;但是时候升级DDR5了&#xff0c;都已经2023年了&#xff0c;国产内存早就崛起了&#xff0c;超值的DDR5内存条选择非常多&#xff0c;特别适合游戏玩家使用&#xff0c;像是光威前段时间推出的两款高端DDR5&#xff0c;神策DDR5 和神…

Java面向对象(内部类)(枚举)(泛型)

内部类 内部类是五大成员之一&#xff08;成员变量、方法、构造方法、代码块、内部类&#xff09;&#xff1b; 一个类定义在另一个类的内部&#xff0c;就叫做内部类&#xff1b; 当一个类的内部&#xff0c;包含一个完整的事物&#xff0c;且这个事务不必单独设计&#xf…

折线分割平面

一、题目 我们看到过很多直线分割平面的题目&#xff0c;今天的这个题目稍微有些变化&#xff0c;我们要求的是n条折线分割平面的最大数目。比如&#xff0c;一条折线可以将平面分成两部分&#xff0c;两条折线最多可以将平面分成7部分&#xff0c;具体如下所示。 Input 输入…

计算机竞赛 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…

Docker自动化部署安装(十)之安装SonarQube

这里选择的是&#xff1a; sonarqube:9.1.0-community (推荐使用) postgres:9.6.23 数据库(sonarqube7.9及以后便不再支持mysql&#xff0c;版本太低的话里面的一些插件会下载不成功的) 1、docker-sonarqube.yml文件 version: 3 services:sonarqube:container_name: sonar…