Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik.

Ähnliche Präsentationen


Präsentation zum Thema: "Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik."—  Präsentation transkript:

1

2 Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik Interner Vortrag Mai 2001 Department of EE & IT University of Paderborn Prof. Dr.-Ing. J. Teich

3 Übersicht 1.Einleitung: Compilerphasen 2.Compilerphasen in TIL 3.elementare Datenstrukturen 4.Verzeichnisstruktur von TIL 5.Programmstruktur

4 Compilerphasen maschinenunabhg. Optimierung Hochsprache Fortran C Pascal Analyse Frontend maschinenunabhg. Darstellung Zwischensprache Assembler Code Maschinensprache Backend maschinenabhg. Codegenerierung

5 Compilerphasen: Backend Backend maschinenunabhängige Zwischendarstellung Assembler Befehlsauswahl Abhängigkeitsanalyse Funktionale Einheiten Registersatz Maschinenmodell Instruktionssatz Scheduling FU-Zuweisung Registerzuweisung

6 Compilerphasen Code Selektion Abhg. Analyse ODG-view Scheduling VLIW-Code TIL-backend lcc-Frontend MAML Fkt. Einheiten Register Instruktionssatz Machinenmodell FU-Zuteilung Register- zuteilung C-Programm burg_rcc –options Optimierung -O TIL-view Visualisierung

7 Verzeichnisstruktur Abhängigkeitsanalyse frontend/lcc3.6 /home/TIL/ analysis/ optim/ algtrans/ unreach/ unroll/ Optimierungsmodul Für jede mögliche Optimierungstransformation existiert ein eigenes Verzeichnis mit den ent- sprechenden Routinen und Deklarations-Dateien DUUD Ketten, Alias-Analyse, Omega Test

8 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/

9 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/

10 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/

11 Daten Strukturen block 2 block 4block 3 block 5 block 6 block 1 adtcdg adtodg Für jede Prozedur Für jeden Block proc 1 proc 2 proc n... adtprog Für jeden Block static tempconstlocal assign deref assign adtcode

12 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;

13 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;

14 CDG->cdg_bbedge typedef struct cdg_bbedge { cdgblock bbnum; /* Grundblock-Nummer*/ intbbcolour; /* Kantenfarbe*/ void *bboptinfo; /* Optimierungsinfo.*/ struct cdg_bbedge *bbnxt; /* nächster Eintrag*/ } *cdg_edgeptr;

15 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...*/ };

16 /backend/tilburg/myproc/cmdline.c Programmstruktur myproc_rcc -optionen parse cmd_line Suffix 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 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 Start lcc /frontend/lcc36/ src/til/ n TIL_endunit()/til/til2adt/ tiladt/ i2til til2adt targtdep support til til2i vliwsupp /home/TIL/ adtcdg.c adtcode.c adtconst.c adtprog.c adttype.c adtvd.c adtvtab.c tiladt/ I2til/ til2adt/ targtdep support til til2i/ vliwsupp /home/TIL/ basicio.c i2til.c readcode.c readdefs.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.c Informationsliste für jede Prozedur: adtprog.c Zwischencodegraph für jeden Block und jede Prozedur: adtcode.c Variablentabelle: 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

17 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-Phase Start 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 last proc n Strategie auswerten und Hooks setzen bei Änderungen nostd n

18 Code Optimization STRATEGY DO tail_rec_elimination; DO constant_propagation; CONSTANT_FOLDING; UNTIL(stable); DO DEAD_CODE_ELIM; UNTIL(stable); /*COPY_PROPAGATION;*/ CONDITIONAL_PRUNING; DO LOOP_MERGING; UNTIL(stable); block_fusion; unreach_code_elim; UNTIL (stable); END Code motion Conditional pruning Constant folding Copy propagation Dead code elimination Block fusion Loop merging Loop unrolling Constant propagation Recursive tail elimination Unreachable code elimination Algebraic transformations Dead jump elimination Faint variable elimination Branch swapping

19 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 Knoten des TIL Code Graphen und generiere Property Key

20 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 an /backend/tilburg/myproc/VLIW/model/machspec.c sil_init()

21 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( ) N tilburg/ frontend/ backend/ /home/TIL/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c

22 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.c Berechne Dominatorbaum Erkennen von Schleifenstrukturen im Kontrollflußgraph Initialisierung 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 Prozedur Zurücksetzen von globalen Prozedurinformationen auf Initialwert. Allokation von virtuellen Registern und benötigtem Speicherplatz Alloziere Speicherplatz für Codeinformation für alle Operanden Generiere Information für Targeting tilburg/ frontend/ backend/ /home/TIL/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c support til vliwsupp /home/TIL/ adt2i globhead i2til interfac til2i tiladt tilsupp common matrix tillnest tillook tilloop tilmenu tilview support til vliwsupp /home/TIL/ adt2i globhead i2til interfac til2i tiladt tilsupp common matrix tillnest tillook tilloop tilmenu tilview adtdom.c adtloo.c domcalc.c findloop.c join11.c normloop.c splitedg.c adtdom.c adtloo.c domcalc.c findloop.c join11.c normloop.c splitedg.c Abhg. Analyse

23 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 jeden Block der aktuellen Prozedur Initialisiere Strukturen für Generierung von ODG Abhg. Analyse Initialisiere Feld für statistische Information bzgl. aktueller Prozedur Generiere neuen Bezeichner für aktuelle Variable Eigentliche Codeselektion durch Baumüberdeckung tilburg/ frontend/ backend/ /home/TIL/ awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c VLIW/ asmdata.c asminstr.c asmprefix.c asmutil.c bcopy.c buildodg.c clusterset.c cmdline.c codegen.c codinfo.c codutil.c intermobj.c intervalset.c labels.c metrics.c myproc.c node.c optimizer.c peephole.c rcc.c register.spec rule.c ruleactions.gen ruleglobals.gen rulegrammar.gen rules.spec schedule.c spill.c srapdf.c statistic.c treecover.burg treecover.c typeinfer.c varinfo.c Generiere Assembler Prolog für aktuelle Prozedur. Werte Information über formale Parameterliste aus und setze Information für Registerzuweisung. 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

24 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 ? Y sil_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 gespeichert bdo_build_graph() /backend/tilburg/myproc/VLIW/source/adtodg.c Bilde Datenabhängigkeitsgraph ODG Abhg. Analyse sil_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 Scheduling Abhg. Analyse Aufruf des Schedulers gemäß Option in der Kommandozeile /backend/tilburg/myproc/VLIW/source/ List-Scheduling schedule_list_proc() schedule_list_ALAP_proc() schedule_list_move_proc() schedule_list_lam_proc() slack_sched_proc() Software-Pipelining schedule_softpipe_proc()

25 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ür jeden 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

26 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;

27 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;

28 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;

29 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;

30 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;


Herunterladen ppt "Das Compilerwerkzeug TIL Aufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik."

Ähnliche Präsentationen


Google-Anzeigen