首页 > 其他分享 >指令选择原理与实现方式

指令选择原理与实现方式

时间:2024-06-23 21:58:10浏览次数:20  
标签:LLVM SelectionDAG IR 目标 选择 指令 原理

概述

编译器前端将源代码转换为等效形式的IR,IR经过优化器优化后传递到后端,由代码生成器将IR 代码转换为汇编代码或目标代码

在这个过程中,后端首先通过指令选择器目标机器支持的指令来实现IR指令

至于指令的顺序,可由后续的指令调度器决定

指令选择器

指令选择器选择指令的基本要求是确保指令能在目标机器上实现与IR相同的功能。其次,在特定的目标机器上,尽量使某些指令序列在执行时比其他指令效率更高

指令选择器应在条件允许下,尽可能选择高效的指令序列。因此,指令选择的目标可以归结为两个方面:即模式匹配和模式选择

模式匹配

模式匹配要解决的问题是找出可以实现IR的候选指令序列,这类候选指令序列通常有若干个

模式选择

模式选择要解决的问题是从若干个候选指令集中选出性能最好的指令序列

模式选择问题可以看作一个优化问题,即指令序列中每条指令的执行都有代价,模式选择的目标是最小化所选指令序列的代价的总和

指令选择的目标

指令执行代价的度量标准多种多样,可以是执行时间、占用内存大小或功耗

最常见的度量标准是执行时间,通过指令执行时间的最小化,实现程序在目标机器上整体执行性能的最大化

这里的目标机器通常是指程序编译针对的硬件平台,目标机器中必须包括可以连续解释和执行机器代码的处理器

目标机器的所有可用指令集合称为指令集,其行为由目标机器的指令集架构(Instruction Set Architecture, ISA) 规定

指令的实现方式

在LLVM中有三种指令选择实现方式:基于SelectionDAG的指令选择、快速指令选择和全局指令选择

所有的指令选择pass 都是基于MachineFunctioinPass类

在LLVM的指令选择阶段,Instrcution 类表示的LLVM IR 转换为 MachineInstr实例,MachineInstr类可用于表示后端所有目标相关机器指令

与Instrunction类相比,MachineInstr类表示的指令更接近目标平台。LLVM后端的SelectionDAGBuilder模块通过遍历LLVM IR 文件,将其中的基本块转换为图形式的SelectionDAG对象

构建SelectionDAG对象是指令选择的第一步。为了适应指令选择的需要,SelectionDAG类以低阶数据依赖DAG的形式表示LLVM IR,在此基础上可以实现目标相关优化和代码简化

SelectionDAG 类的定义(代码 <llvm_root>/llvm/include/llvm/CodeGen/SelectionDAG.h)

LLVM 后端将LLVM IR 转换为机器指令的标准方式是通过DAG实现的。即目标无关的SelectionDAG经过指令选择后,转换为目标相关的、包含机器代码的新DAG

利用目标描述中提供的模式,IR指令通过模块匹配可转换为机器指令。为此,LLVM实现了一种复杂的模式匹配算法

在编译LLVM工程时,会调用到TableGen工具。TableGen是LLVM 项目的重要的组成部分,该工具根据.td目标描述文件中的指令定义生成模式匹配表,并建立ISD(Instrunction Selection DAG) 和 ISD 与机器指令之间的映射关系

以AMDGPU后端的S_NOT_B64指令定义为例

def S_NOT_B64 : SOP1_64 <"s_not_b64", [(set i64:$sdet, (not i64: $src0))]>

其中,[(set i64: $ sdst, (not i64: $src0))] 是S_NOT_B64指令的选择模式,not 是LLVM的预定义操作符,定义如下:

def not: PatFrag<(ops node: $in), (xor node: $in, -1)>

PatFrag 类也定义在TargetSelectionDAG.td 文件中,其作用类似于 “%result = xor i64 % a, -1” 的匹配片段(matching fragment) 替换为not 预定操作符

S_NOT_B64 指令的选择模式描述了S_NOT_B64指令的功能,即调用具有64位整数类型参数的not节点,并返回64位整数类型的结果

当指令选择器在DAG中检测到符合模式的序列时,即会将其匹配到S_NOT_B64指令

上述选择模式是最简单的用法。除此之外,TableGen还支持多种模式类型,如PatFrags、OutPatFrag等。这种模式类型定义参见TargetSelectioinDAG.td

参考资料

标签:LLVM,SelectionDAG,IR,目标,选择,指令,原理
From: https://blog.csdn.net/weixin_40398522/article/details/139728914

相关文章

  • Vienna 整流器的基本原理及数学模型
    2.1Vienna整流器基本工作原理2.1.1主电路拓扑结构分析Vienna整流器系统的主电路包含用于升压的三相电感、三相桥臂和两个直流侧均压电容。通过有规律的对双向开关进行控制不仅能实现功率双向流动,还能使网侧电流时刻跟踪电网电压,使系统运行在高功率因数状态下。拓扑如图2......
  • 电影《绝地战警:生死与共》迅雷BT选择[高清版百度云下载/MKV2.88GB][中英双字资源]
    《绝地战警:生死与共》:一场华丽的动作盛宴电影《绝地战警:生死与共》是一部由导演马丁·坎贝尔执导、克里斯·塔克和杰克·切尼主演的动作喜剧片。该片于2021年上映,以其惊险刺激的动作场面和幽默风格赢得了广大观众的喜爱。 故事发生在现代繁华的洛杉矶市,克里斯·塔克......
  • 计算机组成原理复习总结(一)
    第一章计算机系统发展概述计算机发展历程计算机系统的层次结构计算机硬件的基本组成早期冯诺依曼机(以运算器为中心)现代计算机的结构(以存储器为中心)各个硬件的工作原理计算机系统的层次结构计算机的性能指标计算机发展历程电子管晶体管中小规模集成电路超大规模......
  • 快速学习SAP开发资料,SAP视频快速学习资料,ABAP零基础快速学习 为何选择学习SAP ABAP?选
    在瞬息万变的数字时代,想要在IT行业脱颖而出,掌握一项有优势技术是通往高薪的关键。SAP,作为全球企业管理和解决方案的领导者,其核心编程语言ABAP正引领着企业信息化的最前沿。现在,我们为你呈上一套精心策划的SAPABAP二次开发资料视频——你的收入改善与职业飞跃的加速器!一、为何选......
  • 这些工具都可以帮助用户更有效地管理和使用剪贴板,提供了比系统自带剪贴板更强大的功能
    在Windows环境中,有一些开源的剪贴板查看和管理工具可以帮助用户更有效地管理剪贴板历史记录。下面是几个比较流行的开源工具:Ditto:简介:Ditto是一个功能强大的剪贴板扩展工具,它保留了剪贴板的历史记录,允许用户随时访问之前复制的内容。主要功能:保存和管理剪贴板历史快速......
  • 【计算机组成原理】部分题目汇总
    计算机组成原理部分题目汇总一.简答题RISC和CICS简要说明,比较异同RISC(精简指令集)注重简单快速的指令执行,使用少量通用寄存器,固定长度指令,优化硬件性能,依赖软件(如编译器)来提升效率。CISC(复杂指令集)包含多样复杂的指令,能一条指令完成多步操作,采用变长指令,减少指令数但......
  • Pandas全面指南:数据加载、处理技巧与高级数据选择过滤方法
    Pandas全面指南:数据加载、处理技巧与高级数据选择过滤方法Pandas是Python中一个强大的数据分析库,它提供了快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的工作既简单又直观。Pandas主要的数据结构有Series(一维标签数组)和DataFrame(二维标签数据结构)。在本......
  • ChatGPT原理和训练【 ChatGPT是由OpenAI开发】
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)ChatGPT原理和......
  • Lazy TLB Mode 的工作原理
    LazyTLB(TranslationLookasideBuffer)mode是操作系统和处理器在管理虚拟内存时的一种优化技术,旨在提高处理器的性能。要理解LazyTLBmode,需要先了解一些基本概念:TLB(TranslationLookasideBuffer):TLB是一个缓存,用于存储虚拟地址到物理地址的映射。它加快了虚拟内存......
  • 带你彻底弄清CDMA码分多址的原理
    1.作用:主要用于无线多址接入,且具有很强抗干扰能力2.基本概念(1)码片:一个短间隔叫一个码片,1bit时间划分m个短间隔,则称1bit时间有m个码片(2)码片序列:1bit时间有m个码片,也就是每m个码片就有1bit的信息(每个站点都有自己的码片序列)(3)码片内容:码片中0写为-1,码片中1写为+13.站点发送......