clang禁用const传播

时间:2016-11-29 12:51:35

标签: clang llvm

我有以下代码:

   (function(){

    var myApp = angular.module('mainApp', ['angularTreeview']);

  //test controller
  mainApp.controller('myController', function($scope){

我用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 中禁用此类行为?

1 个答案:

答案 0 :(得分:1)

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

作为一种解决方法,我建议你创建一个迭代指令的传递,看看它们是否有常量操作数,并用与它们对应的SSA值替换它们(在你的情况下为z)。