1

我有以下 IR:

%2 = load i32* %b, align 4
store i32 %2, i32* %a, align 4
%3 = load i32* %a, align 4
store i32 %3, i32* %b, align 4

这本质上是

a=b; b=a;

现在,在复制传播之后,我想要类似的东西:

a=b; b=b;

所以,我这样做:

i->setOperand(0,op1)  //op1 points to %b, i points to  [%3 = load i32* %a, align 4]
i->replaceUsesOfWith(op2,op1); //op2 points to %a

这样做,我进入了上述 IR 的无限循环。所以我觉得从 op1 的使用中删除 i 并将 i 添加到 op2 的使用中存在一些问题。但是,代码运行良好,例如:

a=b; c=a; 

改造后我得到:a=b; c=b;

4

1 回答 1

1

ReplaceInstWithInst() 完成这项工作,问题是当 op1 和 op2 都指向同一个操作数时,它会不断替换并进入无限循环。因此,只需添加一个检查 op1 != op2

于 2014-02-20T10:15:28.060 回答