- 深入理解LLVM:代码生成
- 彭成寒 李灵 戴贤泽 王志磊 俞佳嘉
- 431字
- 2024-12-18 16:44:29
第2章 IR基础知识
目前流行的编译器通常采用三段式设计,分为前端、中端和后端,编译器的典型架构如图2-1所示。
图2-1 编译器架构示意图
前端:对程序进行解析,确保程序符合语言规定的词法、语法、语义规则。前端完成后通常将程序变换成另一种表示,这种新的表示一般更便于进行编译优化或者目标代码生成。
中端:目的是对程序进行优化。为了便于进行优化,通常使用IR来描述程序,不同的语言可以翻译成统一的IR,这样针对IR进行的优化可以做到语言无关。中端常见的优化有常量传播(Constant Propagation,CP)、死代码消除(Dead Code Elimination,DCE)、循环不变代码外提(Loop Invariant Code Motion,LICM)、循环展开(Loop Unrolling,LU)等。
后端:目的是将程序翻译成目标机器可以识别的机器码。后端的工作通常包括指令选择、指令调度、寄存器分配和机器码生成。
注意
通常我们提到的优化都是指语言无关、架构无关的编译优化,但现实中也存在一些语言相关、架构相关的优化技术,这些优化技术都是对特定问题的分析和解决,不在本书的讨论范围内。
IR是编译优化的基础,本章将主要讨论IR相关知识。