我有以下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;
答案 0 :(得分:1)
ReplaceInstWithInst()完成这项工作,问题是当op1和op2都指向同一个操作数时它会不断替换并进入无限循环。所以,只需要添加一个检查op1!= op2