【问题标题】:clang disable const propagationclang 禁用 const 传播
【发布时间】: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 中禁用这种行为?

【问题讨论】:

标签: clang llvm


【解决方案1】:

正如@Ismail Badawi 所说,这种持续传播是在前端(Clang)完成的,不依赖于当前的优化设置。

作为一种解决方法,我建议您创建一个遍历指令的通道,查看它们是否具有常量操作数并将它们替换为对应于它们的 SSA 值(在您的情况下为 z)。

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多