Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich...
-
Upload
kaetharina-schieck -
Category
Documents
-
view
110 -
download
0
Transcript of Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich...
Das Compilerwerkzeug TILAufbau und Datenstrukturen
Ralph Weper
Universität Paderborn
Fachbereich Elektrotechnik und Informationstechnik
AG Datentechnik
{weper}@date.upb.de
Interner VortragMai 2001
Department of EE & ITUniversity of PaderbornProf. Dr.-Ing. J. Teich
Übersicht
1. Einleitung: Compilerphasen
2. Compilerphasen in TIL
3. elementare Datenstrukturen
4. Verzeichnisstruktur von TIL
5. Programmstruktur
Compilerphasen
maschinenunabhg.Optimierung
HochspracheFortran
CPascal
Analyse
Fro
nten
d
maschinenunabhg.Darstellung
Zwischensprache
Assembler CodeMaschinensprache
Backen
d
maschinenabhg.Codegenerierung
Compilerphasen: BackendB
ackend
maschinenunabhängigeZwischendarstellung
Assembler
Befehlsauswahl
Abhängigkeitsanalyse
Funktionale Einheiten
Registersatz
Maschinenmodell
Instruktionssatz
Scheduling
FU-Zuweisung
Registerzuweisung
Compilerphasen
Code SelektionAbhg. Analyse
ODG-view
Scheduling
VLIW-Code
TIL-backend
lcc-Frontend
MAML
Fkt. Einheiten
Register
Instruktionssatz
Machinenmodell
FU-Zuteilung
Register-zuteilung
C-Programmburg_rcc –options <file.c>
Optimierung -O <strategy>
TIL-view
Visualisierung
Verzeichnisstruktur
Abhängigkeitsanalyse
frontend/ lcc3.6
/home/TIL/
analysis/
optim/
algtrans/
unreach/unroll/
Optimierungsmodul
Für jede mögliche Optimierungstransformationexistiert ein eigenes Verzeichnis mit den ent-sprechenden Routinen und Deklarations-Dateien
DUUD Ketten, Alias-Analyse, Omega Test
Verzeichnisstruktur
Hilfsfunktionen für Benutzer
Zwischendarstellung
tiladt/ Aufbau interner Datenstrukturen(CDG, Variablentabelle, Codegraph)
Behandlung von Eingabeoptionen, Fehlermeldungen
i2til/ Einlesen von TIL-Datei
til2adt/ Bearbeiten von TIL Objekten
Ausgabe in .i-Datei
targtdep/ Festlegung von maschinenspezifischen Formaten
Bearbeitung von ODGs
support/
til/
til2i/
vliwsupp/
/home/TIL/
Verzeichnisstruktur
tilsupp/
common/
Hilfs- und Ausgabefunktionen
matrix/ Matrizenoperationen
tillnest/ Schleifenschachteln
tillook/ formatierte Ausgabe
tilview/graphische Ausgabe
tilmenu/
globhead/ globale Headerfiles für TIL-Schnittstelle
allgemeine Funktionen
/home/TIL/til/
Verzeichnisstruktur
backend/
tilburg/
Baumzerteiler Generator BURG
BURG Präprozessor
Skripten für Generierung von Baumgrammatik
Generator für Beschreibung des Registersatzes
Strategien für Zwischencode-Optimierung
Gucklochoptimierer
Architekturspezifische Module
Codegenerierung für SPARC Prozessor
Codegenerierung für PowerPC
awk/
burg/
burgpp/
rd/
strategies/
peeprules/
sparc/
powerpc/
VLIW/model/ Maschinenmodell
source/ Scheduler, FU-Zuweisung
odgview/ graphische Ausgabe ODG
/home/TIL/
Daten Strukturen
block 2
block 4block 3
block 5
block 6
block 1adtcdg
adtodg
Für jede Prozedur
Für jeden Block
proc 1
proc 2
proc n
...
adtprog
Für jeden Block
static
temp constlocal
assign
deref
assignadtcode
CDG
typedef struct cdg {
proginfo ppi; /* Prozedurnummer */ cdg_basicblock graph; /* Flußgraph */ cdg_labhash labtab; /* Label-Hashtabelle */ label maxlab; /* max. benutztes Label */ cdg_swlist swides; /* Switchdeskriptoren */ int nxtblock; /* nächste Blocknummer */ bool istopol; /* ist topol. sortiert? */ cdgblock first_topol; /* erster in Top.Sort. */ cdgblock last_topol; /* letzter in Top.Sort. */ cdgblock bbentry; /* Eingangsblock */ cdgblock bbexit; /* Ausgangsblock */ struct cdg *next; /* nächster Eintrag */ int graph_tab_entries;
} *cdg_cdglist;
CDG->cdg_basicblock
typedef struct cdg_bb {
bool deleted; /* gelöscht */ cdg_edgeptr pred; /* Liste der Vorgänger */ cdg_edgeptr succ; /* Liste der Nachfolger */ short num_preds; /* Anzahl Vorg"anger */ short num_succs; /* Anzahl Nachfolger */ int bbflag; /* Grundblock-Flags */ void *optinfo; /* Optimierungsinfo. */ proplist props; /* Eigenschafteninfo. */ label start; /* Anfangslabel */ int line; /* Anfangszeile */ int labinfo; /* Label-Information */ cdgblock next_topol; /* nächster in Top.Sort. */ cdgblock prev_topol; /* vorheriger in Top.Sort */ int topolnum; /* für topologische Sort. */ int topollev; /* Ebene f"ur Ausgabe */
} *cdg_basicblock;
CDG->cdg_bbedge
typedef struct cdg_bbedge {
cdgblock bbnum; /* Grundblock-Nummer*/
int bbcolour; /* Kantenfarbe */ void *bboptinfo; /* Optimierungsinfo.*/ struct cdg_bbedge *bbnxt; /* nächster Eintrag */
} *cdg_edgeptr;
ODG
struct odg_struct {edgeptr pred; /* Vorgängerfeldzeiger */edgeptr succ; /* Nachfolgerfeldzeiger */short num_preds; /* Anzahl Vorgänger */short num_succs; /* Anzahl Nachfolger */short local_preds; /* lokale Vorgänger */short local_succs; /* lokale Nachfolger */cdgblock onblock; /* Block des Knotens */short number; /* Knotennummer */short auxnum; /* für Ausgabe/Traversierung. */short visitnum; /* für Traversierung */
short visit2; struct con_component components;
/* starke Zusammenhangskomponenten */void *optinf; /* Optimierungsinfo */proplist prop; /* Eigenschaftenliste */odgtype ontype; /* Knotentyp */
void *onoper; /* Operation */odgnode nxttop; /* next Top-/Def-Knoten im Block */odgnode pretop; /* voheriger ... */odgnode nxtbot; /* nächster Bot-/Use-Knoten imBlock*/odgnode prebot; /* voheriger ... */
};
/backend/tilburg/myproc/cmdline.c
Programmstrukturmyproc_rcc -optionen <file>
parse cmd_line
Suffix<file>
begin unit?
readcode() do_stmt()
TIL_beginprocedure()TIL_endprocedure()
TIL_branch()TIL_condbranch()TIL_switch_stat()
TIL_defaultswitch()TIL_passaddr()TIL_passvalue()
TIL_precall()TIL_postcall()
TIL_returnvalue()TIL_call()
TIL_unary()TIL_binary()
TIL_localobject()TIL_staticobject()
TIL_constant()TIL_deref()
TIL_tmpdescr()TIL_addindex()TIL_placelabel()
/til/til2adt/
Initialisierung
<file.i>
Initialisierung/til/tiladt/
readcode() tis_process()/til/i2til/
TIL Typ?
TIL_beginunit() /til/til2adt/FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
C-Code
<file.c> Start lcc
/frontend/lcc36/src/til/
n
TIL_endunit() /til/til2adt/
tiladt/
i2tiltil2adt
targtdep
support
til
til2i
vliwsupp
/home/TIL/
adtcdg.cadtcode.cadtconst.cadtprog.cadttype.cadtvd.cadtvtab.c
tiladt/
I2til/
til2adt/
targtdep
support
til
til2i/
vliwsupp
/home/TIL/
basicio.ci2til.creadcode.creaddefs.c
tiladt/
i2til/
til2adt/
targtdep/
support
til
til2i/
vliwsupp
/home/TIL/
til2adt.c
tiladt/
i2til/
til2adt/
targtdep/
support
til
til2i/
vliwsupp
/home/TIL/
til2adt.c
TIL_beginunit()
Initialisierungen:Programmflußgraph: adtcdg.cInformationsliste für jede Prozedur: adtprog.cZwischencodegraph für jeden Block und jede Prozedur: adtcode.cVariablentabelle: adtvtab.c
Aufruf der Funktion t2a_beginunit(): /backend/tilburg/myproc/myprocburg.c
Initialisierung Dominatorbaum dom_init(): /til/tilsupp/tilloop/domcalc.c
Initialisierung Schleifeninformation loo_init(): /til/tilsupp/tilloop/adtloop.c
Initialisierung ODG odg_init(): /backend/tilburg/myproc/VLIW/source/adtodg.c
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
TIL-Code
Abhg. Analyse
Code-Selektion
Masch.unabhg.
Optimierungen
TIL_endunit()/til/til2adt/til2adt.c
Ende Frontend-PhaseStart der Codegenerierung Til-Code -> Assembler
t2a_endunit()
/backend/tilburg/myproc/myproc.c
opt_unit()
/backend/tilburg/myproc/optimizer.c
opt_unit()
Optimierungen gemäß Spezifikationen in der Kommandozeile
MULTIPLY_SHIFT_OPT()
unreachable_code_elim()
transform_mod()
DEADJUMPELIM()
Einfache Standardoptimierungen
opt
norm_loops_unit()
join_blocks_unit()
Schleifennormalisierung
Verschmelzen von Basisblöcken
j
lastproc
nStrategie auswertenund Hooks setzenbei Änderungen
nostd n
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Abhg. Analyse
Code-Selektion
TIL_endunit()t2a_endunit()
tdg_init()
/analysis/dep/adttildg.c
öffne Ausgabedatei
Hänge leere Liste an jeden Knotendes TIL Code Graphen und generiereProperty Key
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Code-Selektion
TIL_endunit()t2a_endunit()
tdg_init()
/analysis/dep/adttildg.c
öffne Ausgabedatei
cgen_init()
/backend/tilburg/myproc/codegen.c
• Initialisiere Codegenerierung für Übersetzungseinheit.• Deklariere externe Variablen und Prozeduren.• Generiere Ausgabeheader und Assembler Prolog• Initialisiere ASM-Syntax
Scheduling?
n
Initialisiere Maschinenmodell
/backend/tilburg/myproc/schedule.c
lege Analysedatei<file.ana> an
/backend/tilburg/myproc/VLIW/model/machspec.c
sil_init()
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Code-Selektion
TIL_endunit()t2a_endunit()
cgen_done()
Nachoptimierung
Für alle Prozeduren
cgen_proc()
/backend/tilburg/myproc/codegen.c
Schedule?
fclose(<file.ana>)N
tilburg/
frontend/backend/
/home/TIL/
awk/burg/burgpp/rd/strategies/peeprules/sparc/myproc/
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Code-Selektion
TIL_endunit()t2a_endunit() cgen_proc()
find_loops()
til/tilsupp/tilloop/findloop.c
spill_init()
/backend/tilburg/myproc/spill.c
imo_proc()
/backend/tilburg/myproc/intermobj.c
vari_scan_proc()
/backend/tilburg/myproc/varinfo.c
cdi_init()
/backend/tilburg/myproc/codinfo.c
cdi_target()
/backend/tilburg/myproc/codinfo.c
dominator_calc()
til/tilsupp/tilloop/domcalc.cBerechne Dominatorbaum
Erkennen von Schleifenstrukturen im KontrollflußgraphInitialisierung von Schleifeninformation(Schachtelungstiefe, Schleifenkopf, -rumpf) in Datenstruktur adtloop
Abhg. Analyse
Initialisiere Prozedur mit Information für Spilling (max. Anzahl Parameter,max Framegröße ...)
Initialisiere neue ProzedurZurücksetzen von globalen Prozedurinformationenauf Initialwert.
Allokation von virtuellenRegistern und benötigtemSpeicherplatz
Alloziere Speicherplatzfür Codeinformation füralle Operanden
Generiere Information für Targeting
tilburg/
frontend/backend/
/home/TIL/
awk/burg/burgpp/rd/strategies/peeprules/sparc/myproc/
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
support
tilvliwsupp
/home/TIL/
adt2iglobheadi2tilinterfactil2itiladttilsupp
commonmatrixtillnesttillooktillooptilmenutilview
support
tilvliwsupp
/home/TIL/
adt2iglobheadi2tilinterfactil2itiladttilsupp
commonmatrixtillnesttillooktillooptilmenutilview
adtdom.cadtloo.cdomcalc.cfindloop.cjoin11.cnormloop.csplitedg.c
adtdom.cadtloo.cdomcalc.cfindloop.cjoin11.cnormloop.csplitedg.c
Abhg. Analyse
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Code-Selektion
TIL_endunit()t2a_endunit() cgen_proc()
bdo_init_graph()
stt_start_proc()
asm_restart_id()
asu_prologue()
lab_labeled_proc()
Generiere Label für jedenBlock der aktuellen ProzedurInitialisiere Strukturen fürGenerierung von ODG
Abhg. Analyse
Initialisiere Feld für statistischeInformation bzgl. aktueller Prozedur
Generiere neuen Bezeichnerfür aktuelle Variable
Eigentliche Codeselektion durch Baumüberdeckung
tilburg/
frontend/backend/
/home/TIL/
awk/burg/burgpp/rd/strategies/peeprules/sparc/myproc/
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
VLIW/asmdata.casminstr.casmprefix.casmutil.cbcopy.cbuildodg.cclusterset.ccmdline.ccodegen.ccodinfo.ccodutil.cintermobj.cintervalset.clabels.cmetrics.cmyproc.cnode.coptimizer.cpeephole.crcc.cregister.specrule.cruleactions.genruleglobals.genrulegrammar.genrules.specschedule.cspill.csrapdf.cstatistic.ctreecover.burgtreecover.ctypeinfer.cvarinfo.c
Generiere Assembler Prolog für aktuelle Prozedur. Werte Information über formale Parameterliste aus und setze Information für Registerzuweisung.
cgen_block() *
cgen_block()
/backend/tilburg/myproc/codegen.c
Baumüberdeckung:Für jedes Statement des aktuellen Blocks wird durch den von dem Werkzeug BURG generierten Baumzerteiler überprüft, ob der Teilbaum ein gültiges Statement gemäß der spezifizierten Baumgrammatik darstellt und versucht,eine möglichst günstige Codesequenz zu generieren.
cgen_stmt() *
treecover()
reduce()/backend/tilburg/myproc/treecover.c
rule_dispatch()
/backend/tilburg/myproc/rules.spec Codeerzeugung
/backend/tilburg/myproc/rules.gen
/backend/tilburg/myproc/rules.c
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
Code-Selektion
TIL_endunit()t2a_endunit() cgen_proc()
Abhg. Analyse
Scheduling?
Ysil_prepare_proc()
/backend/tilburg/myproc/schedule.c • Starte Abhängigkeitsanalyse /analysis/dep/dep_anal.c
local_dep_anal()global_dep_anal()
• Falls Flag in Kommandozeile gesetzt ist, wird Schleifeninfor- mation extrahiert: find_loop() /til/tilsupp/tilloop/findloop.c und die Analyse mittels Omega-Test durchgeführt /analysis/dep/depomega/
• Abhängigkeitsvektoren werden ggf in <file.iter> gespeichert
bdo_build_graph()
/backend/tilburg/myproc/VLIW/source/adtodg.c
Bilde Datenabhängigkeitsgraph ODG
Abhg. Analysesil_schedule_proc()
/backend/tilburg/myproc/schedule.c
dom_calc()
/til/tilsupp/tilloop/domcalc.c
find_loops()
/til/tilsupp/tilloop/findloops.c
Berechne Dominatorbaum neu
Suche erneut nach Schleifen
SchedulingScheduling
Abhg. AnalyseAufruf des Schedulers gemäßOption in der Kommandozeile
/backend/tilburg/myproc/VLIW/source/
List-Schedulingschedule_list_proc()schedule_list_ALAP_proc()schedule_list_move_proc()schedule_list_lam_proc()slack_sched_proc()
Software-Pipeliningschedule_softpipe_proc()
Programmstruktur
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
C-Code
Analyse
TIL-Code
Masch.unabhg.
Optimierungen
Abhg. Analyse
Code-Selektion
FU-Zuteilung
Scheduling
Register-zuteilung
VLIW-Code
TIL_endunit()t2a_endunit() cgen_proc()
asu_regalloc()
/backend/tilburg/myproc/asmutil.c
RegsUsed()
/backend/tilburg/myproc/srapdf.c• Initialisiert Registerzuteilungsmodul aus der Registersatzspezifikation /backend/tilburg/myproc/srapdf.c
• Startet ersten Pass der Registerzuteilung
• Meldet potentielle Register zur Belegung an
• Bestimmt Lebensintervalle von virtuellen Registern
• Registerfärbung gemäß Anzahl zur Verfügung stehender Register
• Gegebenenfalls Erzeugung von Spillcode
• Sartet zweiten Pass der Registerzuteilung
• Ersetzen von virtuellen Registern durch physikalische
Markiere alle benutzten Register für alle Registerklassen
Register-zuteilung
/backend/tilburg/myproc/asminstr.c
Generiere Codesequenz
Fürjeden Block
Nachoptimierung
Ausgabe
Für jeden Block wird Liste von Assemblerinstruktionen generiert. Anschließend wird Assembler Prä- und Postambel creiert und an die Liste angehängt.
Gucklochoptimierung, sofern nicht per Kommandozeile abgestellt
/backend/tilburg/myproc/peephole.c
Logische Register
typedef struct assignreg /* logisches Register unter dem mehrere physikalische liegen koennen
*/{ struct assignreg *next;
/* Liste aller logischen Register einer Klasse */ PHYSREGLIST *first; /* Liste aller physikalischen
Register, die unter diesem logischen liegen */ ClusterSet physregset;
/* Menge der physik. Register für Ueberlappungstests */
VIRTREG *bound;/* Liste der an dieses logische Register zugeord-
neten virtuellen */ int classnr; /* eigene Klassennummer */ int regnr; /* Registernummer innerhalb der Klasse*/ char used; /* Merker fuer die RegsUsed-Funktion */ char locked; /* log. Reg. als gesperrt markieren */
} ASSIGNREG;
Physikalische Register
typedef struct physreg{
unsigned id; /* eindeutige ID */
VIRTREG *vreg; /* momentan an dieses virtuelle Register zugeordnet oder 0
*/ int gennr; /* Nummer der ältesten benutzenden In-
struktion (für Auswahl beim Auslagern) */
char used; /* Merker fuer die RegsUsed-Funktion */
char locked; /* markiert phys. Register als gesperrt */
char collock; /* durch Färbung gesperrt ( = reserviert) */
} PHYSREG;
typedef struct physreglist /* Liste physikalischer Register */{
struct physreglist *next; /* Listenverkettung */
PHYSREG *preg; /* Verweis auf phys. Register */
} PHYSREGLIST;
Virtuelle Register
typedef struct virtreg{
int id; /* eindeutige Kennzeichnung */ struct assignreg *bound; /*zugeordnetes log. Register*/ int classnr, /* Klasse des logischen Registers */ hintclass; /* Klasse des Wunschregisters, falls hintreg nicht -1*/ int regnr, /* Nummer des log. Regs innerhalb der Klasse oder -1 */ hintreg; /* RegisterNr eines Wunschregisters oder -1 */ char spilled; /* Wert des virtuellen Registers gerade ausgelagert? */ REGUSES *first, /* erster Benutzungsvermerk (Definition) */
*last; /* letzer Benutzungsvermerk */ struct virtreg *next; /* Verkettung fuer Liste freier/belegter virt. Regs */ struct virtreg *link; /* tmp Verkettung zur Verwaltung/Freigabe virt. Regs.*/ long descr; /* Deskriptor fuer Speicherstelle für Spilling*/ int lastgen; /* Instr. bei der zuletzt UseReg2 fuer dieses virt.Reg. aufgerufen wurde */ int lastclassnr; /* dabei zurueckgemeldete Klasse */ int lastregnr; /* dabei zurueckgemeldete RegisterNr */ char lastmemuse; /* dabei zurueckgemeldetes Flag für Speicherbenutzung*/ struct virtreg *alias;/* Verweis auf virtuelles Aliasregister */ void *user_info; /* Info, kann vom User gesetzt und gelesen werden */ int valid; /* Tag mit magischem Wert zum Abfangen ungült. Zeiger*/
}VIRTREG;
Assembler Instruktionsliste
typedef struct asm_instr {
struct asm_instr *next, *prev;/* cyclic linked list of instructions */
AsmOpcode opc; /* opcode of instruction */
AsmOperand opd[ASM_MAX_OPD]; /* operands of instruction */
odgnode on; /* corresponding node in odg */
unsigned id; /* unique ID if odgnode present, else NO_INSTR_ID
*/codop cop; /* til codop "owning" this instr
*/void *info; /* user info, used for param vregs with calls */long infosize; /* size of memory referenced by above ptr
*/char option; /* special instruction option */
} *AsmInstr;
Operanden
typedef struct asm_opd {AsmOpdKind kind; /* kind of Operand */AsmModifier mod; /* modifier to be applied to Operand */long offs; /* offset to be applied to operand */union { /* specific data */
struct asm_opd *link; /* used while on free-list */struct {
VIRTREG *vreg; /* reference to virtual register */int regclass; /* class of phys. Reg. allocated */int regnr; /* nr of phys. regs allocated */
} virtreg;struct {
int regclass; /* regclass of physical register */int regnr; /* nr of physical register */
} physreg;int intval; /* value of signed const */unsigned uintval; /* value of unsigned const */float floatval; /* value of float const */double doubleval; /* value of double const */struct {
char *charptr; /* reference to chars of string */int length; /* nr of chars, not a C-string */
} string;char *name; /* name as a \0-terminated C-string */
} opdata;} *AsmOperand;