das compilerwerkzeug til aufbau und datenstrukturen n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Das Compilerwerkzeug TIL Aufbau und Datenstrukturen PowerPoint Presentation
Download Presentation
Das Compilerwerkzeug TIL Aufbau und Datenstrukturen

Loading in 2 Seconds...

play fullscreen
1 / 28

Das Compilerwerkzeug TIL Aufbau und Datenstrukturen - PowerPoint PPT Presentation


  • 161 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Das Compilerwerkzeug TIL Aufbau und Datenstrukturen' - hasad-pollard


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
das compilerwerkzeug til aufbau und datenstrukturen

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

slide2

Übersicht

  • Einleitung: Compilerphasen
  • Compilerphasen in TIL
  • elementare Datenstrukturen
  • Verzeichnisstruktur von TIL
  • Programmstruktur
compilerphasen

C

Hochsprache

Pascal

Fortran

Frontend

Analyse

maschinenunabhg.

Optimierung

maschinenunabhg.

Darstellung

Zwischensprache

Backend

maschinenabhg.

Codegenerierung

Maschinensprache

Assembler Code

Compilerphasen
compilerphasen backend

Maschinenmodell

maschinenunabhängige

Zwischendarstellung

Abhängigkeitsanalyse

Befehlsauswahl

Instruktionssatz

Registersatz

Funktionale

Einheiten

FU-Zuweisung

Scheduling

Registerzuweisung

Assembler

Compilerphasen: Backend

Backend

compilerphasen1

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

verzeichnisstruktur

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

verzeichnisstruktur1

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

verzeichnisstruktur2

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

verzeichnisstruktur3

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/

daten strukturen

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

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

slide14
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 ... */

};

programmstruktur

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

programmstruktur1

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

programmstruktur2

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

programmstruktur3

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

programmstruktur4

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

programmstruktur5

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

programmstruktur6

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

programmstruktur7

/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

programmstruktur8

/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

logische register
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
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
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;

assembler instruktionsliste
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
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;