理论教育 实现编译器传播复写-编译器设计之路

实现编译器传播复写-编译器设计之路

时间:2023-11-04 理论教育 版权反馈
【摘要】:就算法实现而言,Neo Pascal的复写传播与常量传播是极其类似的,也是基于ud链完成的。程序7-13 Copy_Prop.cpp第3行:初始化复写传播的结束标志。第23行:调用GenCopyOp函数进行复写传播。在逐一判断比较的过程中,如出现不满足复写传播要求的情形,则立刻返回false。也就是说,这个for循环能够正常结束即表明给定操作数ud链的各定值点完全满足复写传播的要求。这种情况是不需要进行复写传播的。

实现编译器传播复写-编译器设计之路

复写传播对于IR的级别并没有太高的要求,无论是HIR还是LIR,复写传播通常都能适应。当然,复写传播的实现方式也并不唯一。Neo Pascal使用了一种易于理解且便于实现的方式,虽然它的效率可能不是最优的。就算法实现而言,Neo Pascal的复写传播与常量传播是极其类似的,也是基于ud链完成的。下面,就来详细分析相关实现。

程序7-13 Copy_Prop.cpp

第3行:初始化复写传播的结束标志。与许多优化算法一样,复写传播通常会进行多遍扫描处理,直到进入稳定状态为止。

第4行:判断复写传播是否结束。

第7~30行:遍历IR列表。

第9行:获取当前IR。

第11~12行:略过内嵌汇编代码。

第13~18行:获取处理方案。

第21行:判断m_Op2是否需要进行复写传播优化。通常,要满足如下两个条件:

(1)操作数必须为变量,即m_iType==OpInfo::VAR。

(2)操作数不允许是间接寻址,即m_bRef为false。

第23行:调用GenCopyOp函数进行复写传播。GenCopyOp函数声明形式如下:

【声明7-11】

bool CCopy_Prop::GenCopyOp(OpInfo &Op,int iProclndex)

注意,参数Op为引用传递,也就是说,如果给定操作数的所有ud点都满足复写传播的要求,那么,GenCopyOp将通过修改Op的属性,以实现复写传播的目的。函数的返回值用于标识实参操作数在复写传播过程中是否被修改。关于GenCopyOp函数的实现,稍后详解。(www.daowen.com)

第2528行:判断m_Opl是否需要进行复写传播优化。如满足以上两个条件,即调用GenCopyOp函数进行复写传播。

下面来看看GenCopyOp函数的实现,这是复写传播的核心。

程序7-14 Copy_Prop.cpp

第5行:遍历操作数的ud链信息。

第7行:根据ud链中的定值点信息,获取相应的IR。

第10~15行:获取处理方案。

第16~37行:逐一判断ud链各定值点是否满足复写传播的基本要求,主要判断如下三个条件:

(1)第18行:判断定值点IR的m_Opl是否为变量。

(2)第20行:判断定值点IR的m_Opl、m_Rslt是否为间接寻址。

(3)第22~31行:判断各定值点的m_Opl所示的变量是否相同,只需比较m_iLink属性即可。

在逐一判断比较的过程中,如出现不满足复写传播要求的情形,则立刻返回false。也就是说,这个for循环能够正常结束即表明给定操作数ud链的各定值点完全满足复写传播的要求。

第39~40行:这个if结构主要用于处理操作数的ud链为空的情况。这种情况是不需要进行复写传播的。

第41行:清空Op的ud链。

第42行:设置m_iLink属性。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈