1
我有以下IR:與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;
所以,我這樣做:
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)'在這種情況下做同樣的事情,所以調用它們都沒有意義。 – Oak
是的,我刪除了setOperand()和相同的結果。 但是,關鍵是我如何從op2的使用中刪除指令i,之後我用op1替換了op2。 (我也試過ReplaceInstWithInst,但同樣的無限循環) – rahuL