1

私は次の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;

4

1 に答える 1

1

ReplaceInstWithInst() は仕事をします。問題は、op1 と op2 の両方が同じオペランドを指しているときに、置き換え続けて無限ループに陥ることでした。したがって、チェック op1 != op2 を 1 つ追加するだけで済みました。

于 2014-02-20T10:15:28.060 に答える