0
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
命令を生成するために、次のようなものを期待しますか?
これは、コードの関連塊のように見える、これを無効にする方法がありますようには見えません。https://github.com/llvm-mirror/clang/blob/c689f6622f89dba2c01ea03462318006dac4785b/lib/CodeGen/CGExprScalar.cpp# L270-L278 –