1 /************************** comp/regalloc.c ************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 The register-allocator.
9 Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: 1997/03/05
13 *******************************************************************************/
16 /******************** Funktion: regalloc_doalloc ******************************
18 versucht f"ur ein Pseudoregister ein tats"achliches CPU-Register zu
20 Wenn noch keine Belegung stattgefunden hat, dann wird ein passendes
21 gerade freies Register angefordert.
22 Wenn das Pseudoregsiter bereits vorher schon einmal ein Belegung
23 hatte, dann wird versucht, das selbe CPU-Register wie vorher wieder
24 anzufordern. Wenn es nicht gelingt (weil es schon wieder anderwertig
25 verwendet wird), wann wird eben ein ganz neues Register angefordert.
27 ******************************************************************************/
29 static void regalloc_doalloc (varinfo *v)
32 if (! reg_reallocate (v->reg)) {
33 v->reg = reg_allocate (v->type, v->saved, true);
37 v->reg = reg_allocate (v->type, v->saved, false);
43 /********************* Funktion: regalloc_activate ****************************
45 setzt ein Pseudoregister auf aktiv (wenn es nicht schon
46 bereits aktiv ist), und fordert gegebenenfalls gleich ein passendes
48 Diese Operation wird aber nur bei Variablen mit lokalen Scope
51 ******************************************************************************/
53 static void regalloc_activate (varinfo *v)
55 if (! v->globalscope) {
56 if (! var_isactive(v) ) {
64 /******************** Funktion: regalloc_deactivate ***************************
66 setzt ein Pseudoregister auf inaktiv (wenn es nicht schon inaktiv war)
68 ******************************************************************************/
70 static void regalloc_deactivate (varinfo *v)
72 if (! v->globalscope) {
73 if (var_isactive(v) ) {
75 if (v->reg) reg_free (v->reg);
81 /******************** Funktion: regalloc_cmd **********************************
83 f"uhrt f"ur ein Pseudo-Command die Registerbelegung durch.
84 Wird von regalloc in einer Schleife aufgerufen.
86 ******************************************************************************/
88 static void regalloc_cmd (pcmd *c)
92 regalloc_deactivate (c->dest);
95 if (c->u.method.exceptionvar)
96 regalloc_activate (c->u.method.exceptionvar);
98 regalloc_activate (c->dest);
101 if (c->dest) regalloc_activate (c->dest);
107 /******************** Funktion: regalloc **************************************
109 f"uhrt f"ur einen ganzen Block die Registerbelegung durch.
111 ******************************************************************************/
113 static void regalloc (basicblock *b)
119 /* alle Pseudoregister am Stack, die schon eine Belegung haben,
123 if (tos -> var -> reg) regalloc_activate(tos->var);
127 /* alle anderen Pseudoregister am Stack belegen */
130 regalloc_activate(tos->var);
135 /* alle Befehle abarbeiten und Registerbelegung machen */
136 c = list_first (&b->pcmdlist);
139 c = list_next (&b->pcmdlist, c);
143 /* alle noch aktiven Pseudoregister deaktivieren */
144 while ( (v = var_nextactive ()) != NULL) {
145 regalloc_deactivate (v);