随笔-156  评论-223  文章-30  trackbacks-0
周知cpu为方便乱序执行,内部会使用重命名寄存器技术消除数据依赖(war和waw)。编译器在如下场景也会用到重命名

​1. 静态单赋值。过程内的每个变量唯一定义一次,原有相同的则会重命名,包括phi结点的定值
​2. bb表调度。为消除反相关依赖即war,可以重命名读操作使用或写操作定义的值,这样能调度产生总时钟周期更少的指令序列,但可能增加寄存器压力导致溢出而新增了长延迟操作(内存加载/存储)并迫使另一轮调度
​3. ebb表调度。对于某一ebb的一条路径p,p存在过早退出路径pe,p和pe的公共前缀是基本块b,当调度p时,如果某个操作i向后移动到b,且i定义的值杀死了pe上的同名值,那么需要重命名i的定值。若i的定值被重命名,且其在p的出口处是活跃的,则调度器需要在出口处复制回原来的名字
​4. trace表调度。踪迹不同于ebb路径,它允许中间存在多个前驱即入口的基本块,而后者不能。当调度存在多入口的块b的某踪迹t时,t上的某操作i可能前向移动跨越b(t外的代码路径需作补偿),若i杀死了一个活跃范围跨越b的值,则需要重命名i的定值;同理,若i向后移动跨越b且杀死了t上的某值,则需重命名i的定值,这时t外的代码路径补偿可以使用同一名字
posted on 2023-09-06 23:35 春秋十二月 阅读(57) 评论(0)  编辑 收藏 引用 所属分类: Compiler

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理