私は次の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 を削除し、op2 の使用に i を追加することには問題があると感じています。ただし、コードは次のような場合は正常に実行されます。
a=b; c=a;
変換後、次のようになります。a=b; c=b;