1 / 28

Das Compilerwerkzeug TIL Aufbau und Datenstrukturen

Das Compilerwerkzeug TIL Aufbau und Datenstrukturen. Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik {weper}@date.upb.de. Department of EE & IT University of Paderborn Prof. Dr.-Ing. J. Teich. Interner Vortrag Mai 2001. Übersicht.

Télécharger la présentation

Das Compilerwerkzeug TIL Aufbau und Datenstrukturen

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Das Compilerwerkzeug TILAufbau und Datenstrukturen Ralph Weper Universität Paderborn Fachbereich Elektrotechnik und Informationstechnik AG Datentechnik {weper}@date.upb.de Department of EE & IT University of Paderborn Prof. Dr.-Ing. J. Teich Interner Vortrag Mai 2001

  2. Übersicht • Einleitung: Compilerphasen • Compilerphasen in TIL • elementare Datenstrukturen • Verzeichnisstruktur von TIL • Programmstruktur

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

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

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

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

  7. Verzeichnisstruktur /home/TIL/ support/ Hilfsfunktionen für Benutzer Behandlung von Eingabeoptionen, Fehlermeldungen Bearbeitung von ODGs vliwsupp/ til/ Zwischendarstellung Aufbau interner Datenstrukturen (CDG, Variablentabelle, Codegraph) tiladt/ til2adt/ Bearbeiten von TIL Objekten Einlesen von TIL-Datei i2til/ til2i/ Ausgabe in .i-Datei targtdep/ Festlegung von maschinenspezifischen Formaten

  8. Verzeichnisstruktur /home/TIL/ til/ tilsupp/ Hilfs- und Ausgabefunktionen common/ allgemeine Funktionen matrix/ Matrizenoperationen tillnest/ Schleifenschachteln tillook/ formatierte Ausgabe tilview/ graphische Ausgabe tilmenu/ globhead/ globale Headerfiles für TIL-Schnittstelle

  9. awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ powerpc/ Maschinenmodell model/ source/ Scheduler, FU-Zuweisung Verzeichnisstruktur /home/TIL/ backend/ Architekturspezifische Module tilburg/ Skripten für Generierung von Baumgrammatik Baumzerteiler Generator BURG BURG Präprozessor Generator für Beschreibung des Registersatzes Strategien für Zwischencode-Optimierung Gucklochoptimierer Codegenerierung für SPARC Prozessor Codegenerierung für PowerPC VLIW/ graphische Ausgabe ODG odgview/

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

  11. 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;

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

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

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

  15. C-Code parse cmd_line /til/til2adt/ /frontend/lcc36/ src/til/ Analyse 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() <file.c> Start lcc <file.i> TIL-Code /home/TIL/ /home/TIL/ /home/TIL/ /home/TIL/ Initialisierung Suffix <file> /til/tiladt/ support Masch.unabhg. Optimierungen support support support vliwsupp vliwsupp vliwsupp vliwsupp tis_process() /til/i2til/ til TIL_beginunit() readcode() readcode() do_stmt() til til til Abhg. Analyse tiladt/ tiladt/ tiladt/ tiladt/ n adtcdg.c adtcode.c adtconst.c adtprog.c adttype.c adtvd.c adtvtab.c begin unit ? til2adt/ til2adt/ til2adt/ til2i/ Code-Selektion til2adt.c til2adt.c I2til/ Initialisierung til2i/ til2i/ basicio.c i2til.c readcode.c readdefs.c i2til/ i2til/ /til/til2adt/ FU-Zuteilung targtdep/ targtdep/ til2adt targtdep i2til Scheduling til2i TIL Typ ? targtdep Register- zuteilung TIL_endunit() /til/til2adt/ VLIW-Code Programmstruktur myproc_rcc -optionen <file> /backend/tilburg/myproc/cmdline.c C-Code 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 Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

  16. C-Code /backend/tilburg/myproc/myproc.c t2a_endunit() Analyse /backend/tilburg/myproc/optimizer.c opt_unit() TIL-Code opt_unit() last proc n nostd Masch.unabhg. Optimierungen Masch.unabhg. Optimierungen n MULTIPLY_SHIFT_OPT() unreachable_code_elim() Abhg. Analyse opt transform_mod() Code-Selektion DEADJUMPELIM() j FU-Zuteilung Schleifennormalisierung norm_loops_unit() Scheduling join_blocks_unit() Verschmelzen von Basisblöcken Register- zuteilung Strategie auswerten und Hooks setzen bei Änderungen VLIW-Code Programmstruktur TIL_endunit() /til/til2adt/til2adt.c Ende Frontend-Phase Start der Codegenerierung Til-Code -> Assembler Optimierungen gemäß Spezifikationen in der Kommandozeile TIL-Code Einfache Standardoptimierungen Abhg. Analyse Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

  17. C-Code /analysis/dep/adttildg.c tdg_init() Analyse öffne Ausgabedatei TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code Programmstruktur TIL_endunit() t2a_endunit() Hänge leere Liste an jeden Knoten des TIL Code Graphen und generiere Property Key Abhg. Analyse Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

  18. C-Code /analysis/dep/adttildg.c tdg_init() Analyse TIL-Code Masch.unabhg. Optimierungen /backend/tilburg/myproc/codegen.c cgen_init() /backend/tilburg/myproc/schedule.c Abhg. Analyse sil_init() Scheduling ? Code-Selektion FU-Zuteilung lege Analysedatei <file.ana> an n Scheduling Initialisiere Maschinenmodell /backend/tilburg/myproc/VLIW/model/machspec.c Register- zuteilung VLIW-Code Programmstruktur TIL_endunit() t2a_endunit() • Initialisiere Codegenerierung für • Übersetzungseinheit. • Deklariere externe Variablen und • Prozeduren. • Generiere Ausgabeheader und • Assembler Prolog • Initialisiere ASM-Syntax öffne Ausgabedatei Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

  19. C-Code 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 /home/TIL/ /backend/tilburg/myproc/codegen.c frontend/ Für alle Prozeduren Analyse backend/ cgen_proc() tilburg/ TIL-Code awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ Masch.unabhg. Optimierungen cgen_done() Abhg. Analyse Nachoptimierung Code-Selektion FU-Zuteilung Schedule ? Scheduling N Register- zuteilung fclose(<file.ana>) VLIW-Code Programmstruktur TIL_endunit() t2a_endunit() Code-Selektion FU-Zuteilung Scheduling Register- zuteilung VLIW-Code

  20. 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 /home/TIL/ til/tilsupp/tilloop/domcalc.c frontend/ dominator_calc() /home/TIL/ /home/TIL/ backend/ support support tilburg/ til/tilsupp/tilloop/findloop.c vliwsupp vliwsupp awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ find_loops() til til adt2i globhead i2til interfac til2i tiladt tilsupp adt2i globhead i2til interfac til2i tiladt tilsupp /backend/tilburg/myproc/spill.c spill_init() /backend/tilburg/myproc/intermobj.c imo_proc() common matrix tillnest tillook tilloop tilmenu tilview common matrix tillnest tillook tilloop tilmenu tilview /backend/tilburg/myproc/varinfo.c 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 vari_scan_proc() /backend/tilburg/myproc/codinfo.c cdi_init() /backend/tilburg/myproc/codinfo.c cdi_target() Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code Erkennen von Schleifenstrukturen im Kontrollflußgraph Initialisierung von Schleifeninformation (Schachtelungstiefe, Schleifenkopf, -rumpf) in Datenstruktur adtloop Initialisiere neue Prozedur Zurücksetzen von globalen Prozedurinformationen auf Initialwert. Initialisiere Prozedur mit Information für Spilling (max. Anzahl Parameter, max Framegröße ...) Alloziere Speicherplatz für Codeinformation für alle Operanden Allokation von virtuellen Registern und benötigtem Speicherplatz Generiere Information für Targeting Berechne Dominatorbaum Analyse TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Abhg. Analyse Abhg. Analyse Code-Selektion Code-Selektion FU-Zuteilung FU-Zuteilung Scheduling Scheduling Register- zuteilung Register- zuteilung VLIW-Code VLIW-Code

  21. 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 /home/TIL/ cgen_block() frontend/ lab_labeled_proc() backend/ * /backend/tilburg/myproc/codegen.c cgen_stmt() tilburg/ 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. awk/ burg/ burgpp/ rd/ strategies/ peeprules/ sparc/ myproc/ bdo_init_graph() treecover() stt_start_proc() reduce() /backend/tilburg/myproc/treecover.c asm_restart_id() rule_dispatch() /backend/tilburg/myproc/rules.c asu_prologue() Codeerzeugung /backend/tilburg/myproc/rules.spec /backend/tilburg/myproc/rules.gen * cgen_block() Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code Generiere neuen Bezeichner für aktuelle Variable Generiere Assembler Prolog für aktuelle Prozedur. Werte Information über formale Parameterliste aus und setze Information für Registerzuweisung. Initialisiere Strukturen für Generierung von ODG Generiere Label für jeden Block der aktuellen Prozedur Initialisiere Feld für statistische Information bzgl. aktueller Prozedur Analyse Eigentliche Codeselektion durch Baumüberdeckung TIL-Code Masch.unabhg. Optimierungen Abhg. Analyse Abhg. Analyse Code-Selektion Code-Selektion FU-Zuteilung FU-Zuteilung Scheduling Scheduling Register- zuteilung Register- zuteilung VLIW-Code VLIW-Code

  22. /backend/tilburg/myproc/schedule.c Scheduling ? Y sil_prepare_proc() /backend/tilburg/myproc/VLIW/source/adtodg.c /backend/tilburg/myproc/VLIW/source/ bdo_build_graph() 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() /backend/tilburg/myproc/schedule.c /til/tilsupp/tilloop/findloops.c /til/tilsupp/tilloop/domcalc.c find_loops() dom_calc() sil_schedule_proc() Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code • 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 Analyse TIL-Code Masch.unabhg. Optimierungen Bilde Datenabhängigkeitsgraph ODG Abhg. Analyse Abhg. Analyse Abhg. Analyse Abhg. Analyse Aufruf des Schedulers gemäß Option in der Kommandozeile Code-Selektion Code-Selektion FU-Zuteilung FU-Zuteilung Berechne Dominatorbaum neu Scheduling Scheduling Scheduling Scheduling Suche erneut nach Schleifen Register- zuteilung Register- zuteilung VLIW-Code VLIW-Code

  23. /backend/tilburg/myproc/asmutil.c /backend/tilburg/myproc/srapdf.c RegsUsed() asu_regalloc() Für jeden Block Generiere Codesequenz Ausgabe Programmstruktur TIL_endunit() cgen_proc() t2a_endunit() C-Code Analyse TIL-Code • 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 Masch.unabhg. Optimierungen Markiere alle benutzten Register für alle Registerklassen Für jeden Block wird Liste von Assemblerinstruktionen generiert. Anschließend wird Assembler Prä- und Postambel creiert und an die Liste angehängt. Abhg. Analyse Code-Selektion /backend/tilburg/myproc/asminstr.c FU-Zuteilung FU-Zuteilung Scheduling Scheduling /backend/tilburg/myproc/peephole.c Nachoptimierung Gucklochoptimierung, sofern nicht per Kommandozeile abgestellt Register- zuteilung Register- zuteilung Register- zuteilung VLIW-Code VLIW-Code

  24. 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;

  25. 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;

  26. 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/Freigabevirt. 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;

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

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

More Related