Ist Clang wirklich so schlau?

8

Wenn ich den folgenden Code mit Clang 3.3 mit -O3 -fno-vectorize kompiliere, bekomme ich die gleiche Assembly-Ausgabe, selbst wenn ich die kommentierte Zeile entferne. Der Codetyp macht alle möglichen 32-Bit-Ganzzahlen zum Schweben und zählt die in einem [0, 1] -Bereich. Ist Clangs Optimierer tatsächlich intelligent genug, um zu erkennen, dass 0xFFFFFFFF, wenn er auf Floaten gesetzt ist, nicht im Bereich [0, 1] liegt, also den zweiten Aufruf von fn vollständig ignorieren? GCC erzeugt anderen Code, wenn der zweite Aufruf entfernt wird.

%Vor%

Siehe hier: Ссылка

    
Chris_F 29.05.2014, 05:09
quelle

1 Antwort

11

Ja, es sieht so aus, als wäre Clang wirklich schlau.

Test:

%Vor%

Ergebnis:

%Vor%

Beachten Sie, dass Clang den Aufruf in fn(0x3f800000) in eine Inkrement-Anweisung umgewandelt hat, da der Wert in 1.0 dekodiert wird. Das ist richtig.

Meine Vermutung ist, dass Clang die Funktionsaufrufe verfolgt, weil sie nur Konstanten enthalten, und dass Clang in der Lage ist, memcpy durch Typ-Punning zu verfolgen (wahrscheinlich einfach durch Emulieren seines Effekts auf den konstanten Wert).

    
nneonneo 29.05.2014, 05:28
quelle