在llvm IR中替换使用一个def与其他def

时间:2014-02-19 21:34:34

标签: llvm llvm-ir

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

1 个答案:

答案 0 :(得分:1)

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