我有以下代码:
(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
中禁用此类行为?
答案 0 :(得分:1)
正如@Ismail Badawi所说,这种常量传播是在前端(Clang)完成的,并不依赖于当前的优化设置。
作为一种解决方法,我建议你创建一个迭代指令的传递,看看它们是否有常量操作数,并用与它们对应的SSA值替换它们(在你的情况下为z)。