我有以下 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;