问题描述
我被要求为以下代码编写到达定义,我想知道我的解决方案是否正确?我是否在正确的轨道上?我真的很感激任何帮助或提示。谢谢。
代码:
a = 0;
while (a < 100) {
b = a + 1
c = c + b
a = b * 2
}
return c;
第 1 步:寻找块和标记
a = 0; // block 1 | a1
while (a < 100) // block 2 |
b = a + 1 // block 3 | b2
c = c + b | c3
a = b * 2 | a3
return c; // block 3 |
第 2 步:为每个块找到 GEN 和 KILL 集
块 | GEN | 杀死 |
---|---|---|
1 | a1 | a3 |
2 | ∅ | ∅ |
3 | b3、c3、a3 | a1 |
4 | ∅ | ∅ |
第 4 步:查看算法以找到 IN 和 OUT 集
input: control flow graph CFG = (N,E,Entry,Exit)
// Boundary condition
OUT[Entry] = ∅
// Initialization for an iterative algorithm
For each basic block B other than Entry
OUT[B] = ∅
// iterate
While (changes to any OUT occur) {
For each basic block B other than Entry {
in[B] = ∪ (out[p]),for all predecessors p of B
out[B] = fB(in[B]) // out[B]=gen[B]∪(in[B]-kill[B])
}
第 5 步导出 IN 和 OUT 集
块 | GEN | 杀死 | IN | OUT |
---|---|---|---|---|
进入 | ∅ | |||
1 | a1 | a3 | ∅ | a1 |
2 | ∅ | ∅ | a1 | a1 |
3 | b3、c3、a3 | a1 | a1 | b3、c3、a3 |
4 | ∅ | ∅ | b3、c3、a3、a1 | b3、c3、a3、a1 |
退出 | b3、c3、a3、a1 | b3、c3、a3、a1 |
解决方法
看看这个例子:https://engineering.purdue.edu/~milind/ece573/2011spring/ps8-sol.pdf
该示例中分析的代码比您的代码稍微复杂一些,但对整个解决方案进行了非常详细的解释。