在llvm IR中使用一种def替换另一种def

在llvm IR中使用一种def替换另一种def,llvm,llvm-ir,Llvm,Llvm 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; a=b; c=a; 因此,我这样做: i->setOperand(0,op1) //op1 points to %b, i points t

本人有以下资料:

%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;
a=b; c=a; 
因此,我这样做:

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
这样做,我就进入了无限循环。因此,我觉得从op1的使用中删除I并将I添加到op2的使用中存在一些问题。 但是,代码在以下情况下运行良好:

a=b; b=b;
a=b; c=a; 

转换后我得到:
a=b;c=b

ReplaceInstWithInst()执行此任务,问题是当op1和op2都指向它一直替换的同一个操作数并进入无限循环时。所以,只需添加一张支票op1!=op2

我不知道它为什么会挂起,但我确信您的代码不会像您认为的那样执行。具体地说,
i->setOperand(0,op1)
i->replaceSofith(op2,op1)
在这个上下文中做相同的事情,所以调用它们没有意义。是的,我删除了setOperand(),得到了相同的结果。但是,问题是,在我将op2替换为I中的op1之后,如何从op2的使用中删除指令I。(我还尝试了替换WithInst,但相同的无限循环)