随笔分类 - Compiler
摘要:周知内联是为了消除函数调用的代价,即四大指令序列:调用前序列、被调者起始序列、被调者收尾序列、返回后序列。它们通常对应到体系结构调用者保存/恢复寄存器集合与被调者保存/恢复寄存器集合之约束。这个本质也是内联的前提。试问如果有某体系结构比如S,它任意深度的函数调用代价几乎为零,那么显然内联是没意义没必
阅读全文
摘要:1. 区间图:用于局部寄存器分配,基本块内的每个活跃范围看作一个区间(最早定义位置+最新使用位置),所有活跃范围构成区间图。区间图是一种不精确的冲突图(因为高估了活跃范围的范围而导致伪冲突,比如认为一个复制操作连接的或两个源相同目标不同的复制操作产生重叠的两个活跃范围冲突,但实际没有冲突),优势在
阅读全文
摘要:周知编译原理龙书阐述的基本块指令调度算法,它所使用的空的资源预约表RTD与每个指令的资源预约表RT,可以看作二维矩阵,行表示时钟周期、列表示cpu资源,其定位的元素值1表示占用/预约,0表示空闲/非预约。前者是随周期递增而动态扩大的矩阵,后者是固定尺寸(维数)的矩阵(指令花费周期与每周期预约资源皆已
阅读全文
摘要:设程序片段S=if C then S1 else S2,S1和S2可以是由赋值、条件、循环构成的复杂语句,S不为当前程序最后语句或某个循环主体最后语句,则S对应的流图生成的深度优先生成树T有3条树边,有S1的出口数+S2出口数-1条交叉边。为什么是3条树边?C到S1、C到S2、S1或S2到S3(S3
阅读全文
摘要:1.闭包记录分配:若逃逸分析能识别哪些闭包记录在创建它们的函数中是出口不活跃的,则这些闭包记录可分配在栈帧中(不再是堆中)2.内联扩展:由于小函数较多,因此内联可以免去调用开销而提高性能,对于递归函数,需先用循环前置头转换再内联,如果是尾递归函数,可先使用尾调用优化删除递归。如果一个函数的所有调用都
阅读全文
摘要:1. 输入:前者是二进制可执行程序,后者是高级语言源程序2. 优化对象:前者主要是直线型代码区域比如踪迹或超块(热点路径代码),超块类似后者中的扩展块;后者是控制流图,即所有代码块,不限于热点路径代码。超块构造类似后者中的基本块放置和过程放置3. 优化方法:前者要运行时采集剖析数据比如结点剖析和边剖
阅读全文
摘要:1. NFA到DFA:设NFA的状态数为n,根据子集构造法,则至多有2^n个状态转移,对每个状态转移,其状态分量至多有n个状态,每个状态计算它的可达状态集合耗时为O(n^2),另可达状态集合的并耗时为O(n^2),故一个转移耗时为n*O(n^2)=O(n^3),则所有转移总耗时为O(n^3*2^n)
阅读全文
摘要:1. 三条定律:交换律、结合律、吸收律(对于半格是幂等律),吸收律包含了幂等律 2. 上下界:交半格每对元素都有唯一最大下界,并半格每对元素都有唯一最小上界,格每对元素都有唯一最大下界和唯一最小上界 3. 格定义一个偏序,偏序有三个性质:自反性、反对称性、传递性 4. 格与偏序的关系:每个格对应一个
阅读全文
摘要:周知cpu为方便乱序执行,内部会使用重命名寄存器技术消除数据依赖(war和waw)。编译器在如下场景也会用到重命名 1. 静态单赋值。过程内的每个变量唯一定义一次,原有相同的则会重命名,包括phi结点的定值 2. bb表调度。为消除反相关依赖即war,可以重命名读操作使用或写操作定义的值,这样能
阅读全文
摘要:1. 不可达代码是指无论输入什么都不会执行的代码,对过程而言,即是从入口基本块到不了(没有路径可达)的那些基本块;死代码是指可达但计算了后面任何可执行路径都不会使用其计算结果的代码,比如死变量和死指令 2. 不可达代码的识别本质是有向图的可达性判定与传递闭包计算问题,一般用DFS法处理。先找到从入口
阅读全文
摘要:1. 目的是识别循环中那种在每个迭代都产生相同值的计算,并将它们移到循环之外。注意,如果一个计算出现在嵌套循环内,对外循环的特定迭代而言,内循环的每个迭代都产生相同的值,但外循环的不同迭代产生不同的值,那么这种计算将移到内循环外,而非外循环外 2. 识别循环不变量可以基于数据流分析求得的use-de
阅读全文
摘要:叶调用优化与收缩包装 1. 叶调用优化适用于被调者是不调用任何过程的过程之场景,这种过程叫叶过程 2. 有几种可能的优化 a)如果过程的实现使用display数组来寻址非局部变量,那么叶过程可避免在起始代码序列中更新display数组 b)如果叶过程内不使用由被调者保存的寄存器(寄存器分配器应设法优
阅读全文
摘要:1. 数学基础:两者的共同点是都基于数据流值的半格和对组合运算封闭的传递函数,不同点是区域分析算法还要求传递函数是一个半格,不仅支持组合运算,而且支持交汇运算和闭包运算,交汇运算用于把有相同后继的不同执行路径组合起来,闭包运算用于环上(比如循环)执行零到多次的效果 2. 流程:迭代算法由初始化和循环
阅读全文
摘要:1. 作为指令高速缓层优化的一种重要技术,它根据CFG流图边的执行频率将频繁执行的基本块排列在一起,并布局那些基本块在下降分支路径,而不在一起的也就是很少执行的基本块布局在转移分支路径。这样做一来可以使取到I-cache中的指令实际被执行的比例较高,二来对于某些体系结构上转移和下降路径延迟不等的分支
阅读全文
摘要:【输入输出】 一个过程的所有基本块,除entry和exit外的每个基本块包含指令序列 【流程】 由前向数据流分析、局部复写传播和遍历基本块构成 1. 前向数据流分析:目标是计算出每个基本块入口处有效的复写赋值集合,这里定义为CPin(i),i为基本块,其元素为表示复写赋值的四元组<u,v,blk,p
阅读全文
摘要:【输入】 ssa控制流图。结点为一个phi函数或一条运算指令,边包含控制流边和ssa边 【输出】 所有ssa变量的最终LatCell(常量半格值) 【流程】 1. 算法维护两个工作表,一是流图边FlowWL,用于跟踪控制流的执行,二是ssa边SSAWL,用于单赋值变量的传播。还有一个ExecFlag
阅读全文
摘要:【输入】 程序控制流图CFG 【输出】 带区域结点的控制依赖图CDG 【流程】 1. 为CFG添加一个虚构谓词结点start,它的Y边指向入口结点entry,出边指向出口结点exit,得到CFG+。添加start是因为entry到第1个基本块没有条件判断 2. 为CFG+构建后必经结点树PDOMTr
阅读全文
摘要:【输入】 根过程,及每个过程(含根过程)的指令序列 【输出】 调用图,由过程点集和调用边(形如<p,i,q>,p在位置i调用q)集构成 【全局结构】 PVVs:过程值变量集合 PVVals:过程值变量到过程常数集合的映射 PVBinds:过程值变量到过程值变量集合的映射 PVCalls:调用边的集合
阅读全文
摘要:【输入】 调用图,其顶端是根过程 【输出】 每个过程每个参数的icp值 【算法步骤】 1. 将根过程加入工作表,遍历调用图,构建每个过程的形参集合,初始化每个形参的icp值为未知(icp格的顶元素) 2. 从工作表移出一个过程p,若工作表为空则终止 3. 遍历p的指令序列,对每个调用点遍历被调过程q
阅读全文

浙公网安备 33010602011771号