三地址码转换成控制流程图

前言

本文是对2. Intermediate Representation的整理。由于本科时候的《编译原理》学的稀烂,所以无法旁征博引。下面仅仅是将理解的课件内容搬运过来。详见课件对应的课程视频

由于之前整理过clang&llvm简介。本文仅仅包含,三地址码(3-address code, 3AC)转换成控制流程图(control flow graph, CFG)。


三地址码

三地址码是语言的一种中间表示(intermediate representation, IR)。三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand),并且通常是赋值和二元运算符的组合。例如,t1 := t2 + t3。(三地址代码拆分了多运算符算术表达式以及控制流语句的嵌套结构,所以适用于目标代码的生成和优化。)

比如将下面的一条语句,转换成3AC形式。

x = (-b + sqrt(b^2 - 4*a*c)) / (2*a)

t1 := b * b
t2 := 4 * a
t3 := t2 * c
t4 := t1 - t3
t5 := sqrt(t4)
t6 := 0 - b
t7 := t5 + t6
t8 := 2 * a
t9 := t7 / t8
x := t9

常用的三地址指令,如下所示。其中

指令指令含义注释
x = y bop z二元操作bop: binary arithmetic or logical operation
x = uop y一元操作uop: unary operation (minus, negation, casting)
x = y赋值操作-
goto L无条件跳转L: a label to represent a program location
if x goto L / if x rop y goto L有条件跳转rop: relational operator (>, <, ==, >=, <=, etc.)

这里略去:将真实代码转换成三地址码,解释三地址码指令含义


控制流程图

思考下,如何使用程序(算法),将下面的3AC转换成CFG。

在这里插入图片描述

基本块

在转换之前,我们需要了解基本块的概念。基本块(basic block, BB)是连续的三地址码指令,这个块具有如下性质:

  • 必须从第一条指令,进入基本块。
  • 必须从最后一条指令,离开基本块。

构建基本块的算法如下:

输入:一个程序P生成的三地址码序列。
输出:程序P的一系列基本块
程序:
	(1)找出程序中,将来生成的基本块的第一条指令(我们称之为leaders)。
	* 程序P的三地址码的第一条指令,是leader。
	* 所有非条件/条件跳转指令的目标位置指令,是leader。
	* 所有非条件/条件跳转指令的下一条指令,是leader。
	(2)生成程序P的基本块。
	如果将程序P看出直线,leaders为不同的切割点。切割出来的(左闭右开)区间便是基本块。

上面的示例三地址码程序,经过该算法,得到的基本块,如下图所示。

在这里插入图片描述
在这里插入图片描述

基本块的连接

基本块为节点。下面,我们只需要在基本块上添加真确的边,便可以生成控制流程图。连线遵循下面两条规则:

  • 基本块之间,存在非条件/条件跳转,需要添加边。
  • 顺序相邻的两个块之间,需要添加边。

给基本块节点,添加边之后,如下图所示。即,将三地址码程序转换成控制流程图。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da1234cao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值