编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • SSA对分支的处理
  • SSA对循环的处理
  • SSA的作用
  1. 中间代码生成

SSA(静态单赋值)

Previous三地址代码Next类型和声明

Last updated 4 months ago

Static Single Assignment(SSA)是一种特殊的三地址代码,其所有变量在代码中只被赋值一次。

基本构造思路:

  • 为每个变量维护一个计数器

  • 从函数入口开始遍历函数体

  • 遇到变量赋值时,为其生成新名字,并替换

通常只针对函数内的变量(即局部变量)计算SSA,全局变量的SSA在实际当中难以计算。

SSA对分支的处理

在分支汇合处插入φ语句,对于同一个变量x在不同路径中被赋值的情况,使用xi=φ(xj, xk, ...)来合并不同的赋值。

SSA对循环的处理

循环被翻译成分支与跳转语句的组合,直接按照相应语句的方式处理。

SSA的作用

  • 每个变量只被赋值一次,相当于都变成const变量

  • 简化了数据流分析和某些优化

  • 使得定义-使用链(def-use chain)易于计算,定义-使用链关联每个变量的定义(赋值)及其相应的使用,包含许多分析和优化所需的关键信息,SSA形式中,定义-使用关系非常清晰,且可以线性复杂度进行计算。