cit
cit copied to clipboard
Fix incorrect "kill" logic in copy propagation
int add(int n)
{
int a, b;
b = n;
a = b;
n = 3;
return a;
}
考虑上面的代码如果在对n = 3
进行复写传播时只是简单的只将b = n
杀死的话那么在对return a
进行覆写传播时就会复用本应该被杀死的语句a = b
(先前已被复写传播简化为a = n)导致return a
中的a会被替换为字面量3这明显是错误的,所以我们在这里保守的杀死一个联通分量中的所有语句。
修改前产生的中间代码(错误的):
-------------<add>Start--------------
entry
return 3 goto .L1
.L1:
exit
--------------<add>End---------------
编译完成:错误=0,警告=0.
修改后产生的中间代码:
-------------<add>Start--------------
entry
dec a
a = n
return a goto .L1
.L1:
exit
--------------<add>End---------------
编译完成:错误=0,警告=0.