2016-11-29 1 views
0

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?

+1

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 –

Antwort

1

Wie @Ismail Badawi sagte, wird diese konstante Propagierung auf der Frontend-Seite (Clang) durchgeführt und hängt nicht von der aktuellen Optimierungseinstellung ab.

Als Workaround empfehle ich Ihnen, einen Durchlauf zu erstellen, der über Anweisungen iterieren würde, sehen, ob sie konstante Operanden haben und sie mit SSA-Werten ersetzen, die ihnen entsprechen (z in Ihrem Fall).