LLVM里的寄存器分配 - 线性扫描算法(二)

2023-11-03

1 背景介绍

在上一篇博文 LLVM 里的寄存器分配 - 准备工作(一) 里,我主要整理了 LLVM 在做寄存器分配前所做的准备工作,介绍了 LLVM 是在怎样的 MIR 上做的寄存器分配。接下来,就需要讲讲 LLVM 是如何做寄存器分配了。虽然我学习的第一个寄存器分配算法是图着色算法,但由于目前的 LLVM 版本里使用的寄存器分配器均是线性扫描算法的变种(事实上 LLVM3.0 版本以前的寄存器分配器默认使用的就是线性扫描算法),因此本文主要介绍线性扫描算法的理论知识以及相关术语,图着色算法的具体过程可以参考文档 Global Register Allocation

2 为什么不使用图着色算法?

在开始研究 LLVM 里的寄存器分配算法之前,我一直以为 LLVM 使用的是图着色算法,后来了解多一点才发现 LLVM 至始至终就没有考虑过图着色。这是为什么呢?这个问题其实在 LLVM3.0 的发布会议上,这一版本寄存器分配器的开发者 Olesen 在他的 报告 里提到过,如下所示:

![Graph Coloring](https://img-blog.csdn.net/20180119194338963?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjk2NzQzNTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
不难发现,不使用图着色算法的根本原因是它要先构造好完整的干涉图,才能在图上着色,而干涉图的构造代价太过高昂。应该说,图着色过程中的大部分开销都集中于干涉图的构造阶段。因此,虽然图着色生成的代码质量很高,但是对于讲究编译效率的现代编译器来说,其时间成本是不可忽视的。对于对编译时间更加敏感的 JIT 编译器来说,则更是如此。

除此之外,在实际的编译工作中,人们发现了另外一个问题。由于在目前所有的硬件架构中,寄存器的数目都是有限的,故对于大型程序来说,寄存器不够用可以说是必然存在的情况。换句话说,大型程序一定会产生大量溢出。问题就出现在这里,因为图着色算法把重点放在解决“如何把所有的程序变量尽可能地分配到寄存器中”,如果程序一定会大量产生溢出,那么,关注“如何高效地溢出”比关注“如何尽量减少溢出”更有

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM里的寄存器分配 - 线性扫描算法(二) 的相关文章

随机推荐

  • OpenCV图像增强(二)——Retinex图像增强

    前言 1 Retinex图像增强是一种高动态范围图像的新色调映射技术 而基础理论是 物体的颜色是由物体对长波 红色 中波 绿色 短波 蓝色 光线的反射能力来决定的 而不是由反射光强度的绝对值来决定的 物体的色彩不受光照非均匀性的影响 具有一
  • 计算机网络技术期末个人总结

    计算机网络技术复习 一 计算机网络基础知识 了解 计算机网络 Internet 的发展 面向终端的计算机网络 单个计算机 直接连接主机 分组交换网络 实现了不同计算机之间的通信 此时广域网从逻辑上分为资源子网与通信子网 ARPANET出现
  • 吊打面试官系列之:UI自动化面试题汇总,对标P7,从此再也不怕面试官了。

    UI自动化面试题汇总 1 引言 2 基础篇 2 1 selenium的工作原理 2 2 selenium自动化页面元素找不到存在异常的原因 2 3 如何去定位属性动态变化的元素 2 4 如何去定位页面上动态加载的元素 2 5 seleniu
  • MT【332】椭圆正交变换

    2018河南数学联赛解答10 已知方程 17x 2 16xy 4y 2 34x 16y 13 0 表示椭圆 求它的对称中心和对称轴 解 设对称中心为 a b 显然 A 1 1 B 1 1 在图像上 所以对称点 A 2a 1 2b 1 B 2
  • 【集合】hashmap的实现原理,hashmap怎么解决哈希冲突的问题

    最近在详细的研究hashmap的内部结构和原理 终于豁然开朗 原来hashmap是那么的完美 数组和链表的结合体 在学习hashmap之前 首先问大家几个问题 看看是否对hashmap有了解多少 咱们通过问题进行对hashmap的学习和探索
  • 金融信创快速落地的应用迁移或创新开发要点

    转载本文请注明出处 微信公众号EAWorld 近日 汇聚专家智慧 分解转型实战的 重塑 直播栏目再上新 本期聚焦金融信创 解析推进金融信创快速落地的应用迁移或创新开发要点 访谈问题概览 1 与其他行业信创相比 金融信创有哪些难点 2 金融信
  • python学习--计算学生成绩排名案例(字典篇2) --小黑学习驿站

    目录 问题 额外话题 zip 函数 sorted 函数 问题 创建学生期末成绩自动排名 如何查找对应的学生学习成绩 思路 1 首先总分为未知数 定义学生数量 将语数英各科成绩分开 然后计算总成绩 2 计算出总成绩 然后进行排序 3 然后定义
  • 【Python】怎么在pip下载的时候设置镜像?(常见的清华镜像、阿里云镜像以及中科大镜像)

    一 清华镜像 在使用 pip 命令下载 Python 包时 可以通过设置 pip 的镜像源为清华镜像来加快下载速度 以下是如何设置清华镜像源的步骤 打开终端或命令行窗口 执行以下命令添加清华镜像源 pip config set global
  • 如何在Windows中安装Oracle数据库12c

    摘要 本教程逐步向您展示如何在Windows 12中安装Oracle数据库10c 安装甲骨文数据库 要在计算机上安装 Oracle 数据库 您需要从 Oracle 网站的下载页面下载安装程序 拥有ZIP格式的安装文件后 您需要将它们解压缩到
  • 百天百题(1/100)Java创建线程的方式?

    首先创建线程有四种种方式 1 继承Thread类 缺点 1 Java是不支持多继承的 所以我们不能在继承其他的类了 2 不能通过线程池来此操作 每次创建一个线程都需要先创建一个类 创建和销毁线程对整体的资源开销是非常大的 3 每次启动一个线
  • 局域网中服务器群配置ssh免密

    笔者以前配置ssh免密登陆 基本两步就可以了 ssh keygen删除密钥对 ssh copy id公钥复制到远程主机 完成密钥对部署 但是笔者寻思 在服务器群里面怎么来配置ssh免密呢 生成密钥对 然后多次使用ssh copy id分发公
  • Linux驱动开发-------- 内核的同步与互斥

    面试 请说一下 线程间同步方式有哪些 同一进程内的多个线程共享同一地址空间 为了避免多个线程同时访问数据造成的混乱 需要考虑线程之间的同步问题 所谓同步 即协同步调 按预定的先后次序访问共享资源 以免造成混乱 线程同步的实现方式主要有6种
  • java读取一个指定目录下的文件名,不递归读取

    public static ArrayList
  • electron-updater

    前提备份 安装一下更新插件 npm install electron updater save app Electron electronjs org 更多配置参考app Electron electronjs org 自动更新 elect
  • 2020及2021年常被利用的30个软件漏洞

    对于所有的0day 定制的恶意软件和其他完全未知的安全漏洞 它们已经存在多年并被广泛利用 为了更好地表明这一点 美国联邦调查局 FBI 美国网络安全与基础设施安全局 CISA 澳大利亚网络安全中心 ACSC 和英国国家网络安全中心 NCSC
  • 『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用

    08 Qt Designer中容器布局和绝对布局的使用 1 容器布局 1 1 设计容器布局 1 2 保存文件并执行 2 绝对布局 2 1 设计绝对布局 2 2 保存文件并执行 1 容器布局 1 1 设计容器布局 先拖入一个容器Frame容器
  • for循环数组遍历,引出增强for循环(forEach)

    这是一个传统的遍历数组元素的for循环结构 本例中的计数器为数组元素的索引 一般初始化为0 进入循环体的表达式一般写为 索引小于被遍历数组的长度 每次循环执行结束后会对索引进行加1操作 1 这是最简单的遍历 public class Dem
  • 毕业设计-基于微信小程序的垃圾分类系统

    目录 前言 课题背景与简介 实现设计思路 一 垃圾分类系统设计 二 垃圾分类系统开发技术分析 三 总结 实现效果样例 更多帮助
  • NLP学习(五)jieba分词-Python3实现

    中文分词 对于NLP 自然语言处理 来说 分词是一步重要的工作 市面上也有各种分词库 11款开放中文分词系统比较 1 基于词典 基于字典 词库匹配的分词方法 字符串匹配 机械分词法 2 基于统计 基于词频度统计的分词方法 3 基于规则 基于
  • LLVM里的寄存器分配 - 线性扫描算法(二)

    1 背景介绍 在上一篇博文 LLVM 里的寄存器分配 准备工作 一 里 我主要整理了 LLVM 在做寄存器分配前所做的准备工作 介绍了 LLVM 是在怎样的 MIR 上做的寄存器分配 接下来 就需要讲讲 LLVM 是如何做寄存器分配了 虽然