Compiler construction 编译优化理论中的CSE与GVN

Compiler construction 编译优化理论中的CSE与GVN,compiler-construction,Compiler Construction,当我读麻省大学阿默斯特校区第11课时,我有一个问题 问题是,在第11课的第12页,它说明了值编号不能消除所有的子表达式 read(i); l = 2*i; if(i > 0) goto L1; j = 2*i; goto L2; L1: k = 2*i; L2: 解释是:l的值并不总是等于j或k的值 让我困惑的是,所有(l/j/k)的值都依赖于2*i,i的值编号在所有基本块中都应该相同,因为在示例代码段中,i没有任何赋值或重新定义。对吗 如果正

当我读麻省大学阿默斯特校区第11课时,我有一个问题

问题是,在第11课的第12页,它说明了值编号不能消除所有的子表达式

    read(i);
    l = 2*i;
    if(i > 0) goto L1;
    j = 2*i;
    goto L2;
L1: k = 2*i;
L2:  
解释是:l的值并不总是等于j或k的值

让我困惑的是,所有(l/j/k)的值都依赖于2*i,i的值编号在所有基本块中都应该相同,因为在示例代码段中,i没有任何赋值或重新定义。对吗

如果正确,2*i也将获得相同的值编号,并且可以成功地消除j和k的冗余2*i计算


我在插图上有错吗?如果您发现了,请帮助我解决这个问题。

您的两个假设都是正确的。
i
的值编号以及随后的
2*i
的值编号将在
read(i)
之后的整个函数中相同。因此,在分配
j
k
时,
2*i
的计算是多余的,在这两种情况下都可以用
l
代替。

根据我对GCC中CSE通行证的了解,这似乎是一个好问题。我认为问题是,我没有看到很多人有足够的知识来巡逻堆栈溢出。你可以考虑询问邮件列表,如果你不介意我问…你在用什么编译器?@jww是IAR编译器。