【发布时间】:2016-11-29 12:51:35
【问题描述】:
我有以下代码:
int test() {
int a = 12;
int b = 13;
int const z = 134;
int i = 0;
for (i = 0; i < 15; i++) {
unsigned v = 11;
b += v + i + z;
}
return a + b;
}
我用clang 4.0编译如下:
clang -O0 -emit-llvm -S -g myfile.c
生成的myfile.ll 包含以下内容:
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
在上面的代码 sn-p 中,%add1 = add i32 %add, 134 包含传播的const 值,即134。这不是我正在寻找的行为。我希望它生成load 指令,即类似于以下内容:
%3 = load i32, i32* %z, align 4
%add = add i32 %1, %2
%add1 = add i32 %add, %3
有没有办法在clang 中禁用这种行为?
【问题讨论】:
-
这看起来像是相关的代码块,看起来没有办法禁用它:github.com/llvm-mirror/clang/blob/…