I das folgende Stück Code haben:Klirren deaktivieren const Ausbreitungs
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;
}
I mit clang 4.0
kompilieren, wie folgt:
clang -O0 -emit-llvm -S -g myfile.c
Resultierende myfile.ll
enthält folgende Komponenten:
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
Im Code-Snippe t oben, %add1 = add i32 %add, 134
enthält propagierten const
Wert, d.h. 134
. Das ist nicht das Verhalten, nach dem ich suche. Ich erwarte, dass es load
Anweisungen zu erzeugen, das heißt in etwa wie folgt:
%3 = load i32, i32* %z, align 4
%add = add i32 %1, %2
%add1 = add i32 %add, %3
Gibt es eine Möglichkeit, diese Art von Verhalten in clang
zu deaktivieren?
Das sieht wie der relevante Block des Codes aus, sieht nicht aus, als gäbe es eine Möglichkeit, dies zu deaktivieren: https://github.com/llvm-mirror/clang/blob/c689f6622f89dba2c01ea03462318006dac4785b/lib/CodeGen/CGExprScalar.cpp# L270-L278 –