Clause
← All dokumentation

Det engelska originalet har ändrats sedan översättningen gjordes, så delar av den kan vara inaktuella. Läs på engelska

Översatt från det engelska originalet · 1e3a39c8-dirty · 2026-10-26

Typspecialisering

Hastighetsläget (-O2) använder härledda fakta för att ta bort kontroller vid körning (bevis) och kan klona en funktion till representationsvarianter som skyddas av taggkontroller vid körning. -O0 och --no-type-specialization producerar endast generisk kod: varje kontroll finns kvar, varje åtkomst till sammansatta värden går genom sin runtime-tjänst.

Bevis

Ett bevis kommer endast från fakta som gäller närhelst koden körs:

Specifikationer bevisar aldrig något. term() och none() (kod som inferensen fann onåbar) bevisar ingenting; kroppar i anonyma funs får inga bevis.

OperationBevisas avGenererad kod
+ - *båda operanderna intervall av små heltal, resultatintervallet inom den omedelbara nyttolastenavkodning, beräkning och kodning inline; ingen tagg, overflow eller reservväg
+ - *en eller båda operanderna intervall av små heltalde bevisade taggtesterna försvinner; overflow-kontroll och reservväg via tjänst finns kvar
tupelmönsterfaktum för argument eller granskat värde: exakta tupler med mönstrets aritetformtestet tas bort (obevisat: testas inline)
tupelelementett formtest eller faktum som bevisar tupelninline-inläsning av elementet
listmönsterfaktum: säkert en cons-cellformtestet tas bort (annars ett test av primär tagg på varje nivå)
head, tailett cons-test eller faktum som bevisar celleninline-inläsningar
exakt literal [], {}, litet heltal, atomalltid (på varje nivå)ordjämförelse: lika omedelbara värden är ett ord
listgeneratorfaktum för generatorns indata: en äkta listacons-test och läsning av celler inline i varje iteration

Fakta når mönster i funktionshuvuden (argument sammanslagna från anropare), matchningar i kroppar (högersidan) och case/try-klausuler (det granskade värdet eller värdet av try-kroppen); fakta om element, head och tail följer extraheringar. En inline-läsning lagras i en rotplats som en tjänsts utdata, så att sänkningen av ramar behåller den som en term över safepoints (omläsningsregeln). De enda pekarkonverteringarna i genererad kod är dessa bevisade läsningar och inläsningarna av huvuden i inline-formtester för tupler (proven.cell). Layoutkonstanterna kommer från abi/term.hpp; runtimen kontrollerar dem mot sina privata cellayouter.

Varianter

LLVM:s kloning/förenkling ersätter bevisade kontroller inuti klonen. En begränsad dispatcher testar varje begränsad tagg och vidarebefordrar kontext och argument till en variant eller den generiska kroppen; den publika symbolen och ABI:t ändras inte. Inga spec-antaganden och inga fast-math-flaggor införs.

Nuvarande effekt

Bevis verkar på verklig källkod: lokala funktioner vars anropare skickar små heltal, tupler och listor förlorar sina tagg-, form- och tjänstekontroller (proofs, kontrollerat av CTest codegen_proofs och kört som golden-testet för körbara filer executables_proofs). En variant måste spara fler instruktioner än vad dess dispatch kostar; ett borttaget taggtest av ett argument gör sällan det, så varianter för källkod planeras oftast och avvisas sedan av tillväxtgränsen. Fokuserade LLVM-fixturer injicerar upprepade taggkontroller för att testa träffar, reservvägar och återställning vid tillväxt med native-exekvering.

Golden-tester för körbara filer körs under varje policy i fullt läge; snabbt läge kör -O0 (generisk) och -O2 med specialisering (bevis).

codegen_measurements skriver measurements/<config>/measurements.json i byggkatalogen för codegen-testerna (kompileringstid, IR-/objektbyte, varianter, bevisade läsningar, native-tid). Tider är beskrivande, aldrig tröskelvärden.