2016-11-29 20 views
0

を無効打ち鳴らすは、私は次のコードを有するCONST伝播

myfile.llを得られ

clang -O0 -emit-llvm -S -g myfile.c

は、以下が含ま:

entry: 
    %retval = alloca %struct.mystruct, align 4 
    %a = alloca i32, align 4 
    %b = alloca i32, align 4 
    %z = alloca i32, align 4 
    %i = alloca i32, align 4 
    %v = alloca i32, align 4 
    store i32 12, i32* %a, align 4 
    store i32 13, i32* %b, align 4 
    store i32 134, i32* %z, align 4 
    store i32 0, i32* %i, align 4 
    store i32 0, i32* %i, align 4 
    br label %for.cond 
    // some more stuff here 
for.body:           ; preds = %for.cond 
    store i32 11, i32* %v, align 4 
    %1 = load i32, i32* %v, align 4 
    %2 = load i32, i32* %i, align 4 
    %add = add i32 %1, %2 
    %add1 = add i32 %add, 134 //problem 
    %3 = load i32, i32* %b, align 4 
    %add2 = add i32 %3, %add1 
    store i32 %add2, i32* %b, align 4 
    br label %for.inc 
    // some stuff here 

コードスニペット%add1 = add i32 %add, 134には、伝播されたconstの値、つまり134が含まれています。これは私が探している行動ではありません。

%3 = load i32, i32* %z, align 4 
%add = add i32 %1, %2 
%add1 = add i32 %add, %3 

clangに行動のこの種を無効にする方法があります:私は、すなわち、それはload命令を生成するために、次のようなものを期待しますか?

+1

これは、コードの関連塊のように見える、これを無効にする方法がありますようには見えません。https://github.com/llvm-mirror/clang/blob/c689f6622f89dba2c01ea03462318006dac4785b/lib/CodeGen/CGExprScalar.cpp# L270-L278 –

答えて

1

@Ismail Badawiと言えば、この定数伝播はフロントエンド側(Clang)で行われ、現在の最適化設定には依存しません。

回避策として、命令を繰り返し実行するパスを作成し、定数オペランドがあるかどうかを確認し、それらに対応するSSA値(ケースのz)に置き換えることをお勧めします。

関連する問題