【发布时间】:2014-02-19 21:34:33
【问题描述】:
我有以下 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;
【问题讨论】:
-
我不知道它为什么挂起,但我确信您的代码没有按照您的想法执行。具体来说,
i->setOperand(0,op1)和i->replaceUsesOfWith(op2,op1)在这种情况下做同样的事情,所以调用它们没有任何意义。 -
是的,我删除了 setOperand() 和相同的结果。但是,关键是在 i 中将 op2 替换为 op1 之后,如何从 op2 的使用中删除指令 i。 (我也试过 ReplaceInstWithInst 但同样的无限循环)