clang 禁用 const 传播
clang disable const propagation
我有如下一段代码:
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
在上面的代码片段中,%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
中禁用这种行为?
正如@Ismail Badawi所说,这种常量传播是在前端 (Clang) 完成的,不依赖于当前的优化设置。
作为解决方法,我建议您创建一个遍历指令的传递,查看它们是否具有常量操作数并将它们替换为对应于它们的 SSA 值(在您的情况下为 z)。
我有如下一段代码:
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
在上面的代码片段中,%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
中禁用这种行为?
正如@Ismail Badawi所说,这种常量传播是在前端 (Clang) 完成的,不依赖于当前的优化设置。
作为解决方法,我建议您创建一个遍历指令的传递,查看它们是否具有常量操作数并将它们替换为对应于它们的 SSA 值(在您的情况下为 z)。