LLVM Struct Array-Iteration

8

Beim Kompilieren dieses Codes mit LLVM:

%Vor%

Aus irgendeinem Grund entscheidet der Compiler, dieses Array auf seltsame Weise zu durchlaufen. Zuerst wählt es einen scheinbar beliebigen Punkt in der Mitte oder am Ende der Struktur, und speichert dann die entsprechenden Werte mit unmittelbaren Werten relativ zum beliebigen Punkt.

Ich habe herausgefunden, dass der willkürliche Punkt aus diesem IR-Code ausgewählt ist:

%Vor%

Dabei ist 4 der Offset von char3.

In diesem Beispiel wird der Speicher für int1, int2, char1, char2 negative unmittelbare Werte haben, char3 wird sofort 0 haben.

Es scheint, dass mit verschiedenen Anordnungen von Struct Bar verschiedene Offsets erhalten werden, aber immer innerhalb oder am Ende der Struktur.

Zum Beispiel die Strukturleiste in:

ändern %Vor%

Ergibt sich mit der folgenden IR-Linie:

%Vor%

Das bedeutet, dass der Speicher für char1, char2 und char 3 negative unmittelbare Werte, int1 direkte 0 und int2 positive direkte Werte haben wird.

Warum iteriert es relativ zu einem anderen Punkt als der Basis der Struktur?

    
Eitan Ziv 01.05.2016, 18:29
quelle

1 Antwort

1

Ein neuer Build von Clang erzeugt nicht die von Ihnen beschriebene Anweisung getelementptr . Es verwendet normale Indizierung. Das Seltsamste ist, eine Version zu produzieren, bei der der Körper der Schleife zweimal abgerollt wird:

%Vor%

Wenn Sie Ihre Frage mit Schritten aktualisieren, um das von Ihnen gesehene IR zu reproduzieren, erkläre ich Ihnen gerne, warum LLVM es erzeugt hat, aber ich möchte nicht anhand des Namens des Befehls raten.

    
Chandler Carruth 31.05.2016 05:53
quelle

Tags und Links