Compiler construction 编译优化理论中的CSE与GVN
当我读麻省大学阿默斯特校区第11课时,我有一个问题 问题是,在第11课的第12页,它说明了值编号不能消除所有的子表达式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没有任何赋值或重新定义。对吗 如果正
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编译器。