如何在我的中间代码上执行常量折叠和常量传播?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在我的中间代码上执行常量折叠和常量传播?相关的知识,希望对你有一定的参考价值。

所以我的编译器为if else和while生成中间代码(这些结构在C中,即编译器是C编译器接受while和if-else)并将其存储在文件中。

我知道恒定折叠和常数传播如何工作的理论方面。但是当我在读取带有中间代码的文件时,我如何实际编写和实现它。

如果有人能给我一个基本的算法/伪代码,那就太棒了,因为我发现基于阅读文本文件很难实现它。

答案

使用IR读取文本文件时,编译器不应该工作。它应该有一个方便的IR数据结构,并能够转换它。关于常数折叠或常数传播的算法,您应该在适当的书中更好地阅读它们。例如S.S.Müchnick的Advanced Compiler Design and Implementation

简而言之,常量折叠如下:

const_fold(instr):
  if is_bin_exp(instr.oper):
    if is_const(instr.arg1) && is_const(instr.arg2):
      return = perform_bin(instr.oper, instr.arg1, instr.arg2)
  if is_un_exp(instr.oper):
    if is_const(instr.arg1):
      return = perform_un(instr.oper, instr.arg1)
  return Null

以上是关于如何在我的中间代码上执行常量折叠和常量传播?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动将构建日期变为我的代码可见的常量?

如何自动将构建日期转换为对我的代码可见的常量?

如何在我的程序中设置一个依赖于平台的常量

编译器对屏蔽类没有常量折叠

在哪里定义 C++ 中的错误代码常量

O=Deparse 是如何工作的,Perl 有和折叠常量数组吗?