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)。