2014-02-19 28 views
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;

+0

我不知道它爲什麼會掛起,但我確定您的代碼不會執行您認爲它的操作。具體來說,'i-> setOperand(0,op1)'和'i-> replaceUsesOfWith(op2,op1)'在這種情況下做同樣的事情,所以調用它們都沒有意義。 – Oak

+0

是的,我刪除了setOperand()和相同的結果。 但是,關鍵是我如何從op2的使用中刪除指令i,之後我用op1替換了op2。 (我也試過ReplaceInstWithInst,但同樣的無限循環) – rahuL

回答

1

ReplaceInstWithInst()不工作,問題是當OP1,OP2的兩個點,以同樣的操作也不斷替換,去進入無限循環。所以,只需要添加一個檢查op1!= op2