Ein switch mit 40 Cases wird in GCC nicht zu 40 Vergleichen – aber auch nicht automatisch zu einer Sprungtabelle. Mich interessiert, woran ihr festmacht, welche Lowering-Strategie die richtige war.
Im Godbolt-Fenster sehe ich bei -O2 meist die Jump Table, und sobald -Os ins Spiel kommt, kippt das Bild und der Vergleichsbaum taucht wieder auf. Dazu kommen die Fälle dazwischen: dichte, aber kleine Case-Bereiche, die als Bit-Test enden, und der switch conversion-Pass, der den Switch komplett in eine andere Form überführt, statt ihn nur zu lowern. Mit -fno-jump-tables lässt sich das eine abschalten, aber dann fehlt mir oft die saubere Begründung, warum der Binsearch hier wirklich besser ist – Sprungvorhersage, Codegröße, Cache?
Der Grund, warum mich das umtreibt, ist banal: Es ist dieselbe Idee wie im Posteingang. Nicht jeden Fall einzeln durchvergleichen, sondern eine Vorauswahl treffen lassen – nur dass beim Menschen die Freigabe am Ende stehen bleibt. FOX WIZ ist genau so gebaut: Antworten, Termine und Aufgaben liegen fertig bereit, bestätigt wird von dir. Der Unterschied zum Compiler ist, dass niemand im Hintergrund etwas nach außen schickt, was du nicht gesehen hast.
Welche Lowering-Strategie seht ihr in euren Builds – und bei welchem Case-Muster schaltet ihr switch conversion bewusst ab?
Top comments (0)