75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
/* R E G I S T E R A L L O C A T I O N
|
|
*
|
|
* R A _ L I F E T I M E . C
|
|
*/
|
|
|
|
#include "../share/types.h"
|
|
#include "../share/debug.h"
|
|
#include "../share/def.h"
|
|
#include "../share/global.h"
|
|
#include "../share/lset.h"
|
|
#include "../share/aux.h"
|
|
#include "../share/alloc.h"
|
|
#include "../../../h/em_mnem.h"
|
|
#include "../../../h/em_spec.h"
|
|
#include "../../../h/em_pseu.h"
|
|
#include "../../../h/em_reg.h"
|
|
#include "ra.h"
|
|
#include "ra_aux.h"
|
|
#include "ra_items.h"
|
|
#include "ra_lifet.h"
|
|
|
|
|
|
#define MSG_OFF(l) aoff(ARG(l),1)
|
|
#define is_livemsg(l) (INSTR(l) == ps_mes && aoff(ARG(l),0) == ms_liv)
|
|
#define is_deadmsg(l) (INSTR(l) == ps_mes && aoff(ARG(l),0) == ms_ded)
|
|
|
|
build_lifetimes(items)
|
|
item_p items[];
|
|
{
|
|
/* compute the it_lives attribute of every item; this is
|
|
* a list of intervals during which the item is live,
|
|
* i.e. its current value may be used.
|
|
* We traverse the EM text of the current procedure in
|
|
* lexical order. If we encounter a live-message, we store
|
|
* the number ('time') of the current instruction in the
|
|
* it_lastlive attribute of the concerning item. If we see
|
|
* a dead-message for that item, we know that the item is
|
|
* live in between these two pseudo's. If the first message
|
|
* appearing in the procedure is a dead-message, the item
|
|
* is live from time 0 (start of procedure) till now. (Note
|
|
* that it_lastlive is initially 0!).
|
|
* The lifetime ends on the last instruction before the
|
|
* dead-message that is not a live -or dead message.
|
|
*/
|
|
|
|
register line_p l;
|
|
register short now;
|
|
item_p item;
|
|
short last_code;
|
|
|
|
last_code = 0;
|
|
for (now = 0; now < nrinstrs; now++) {
|
|
l = instrmap[now];
|
|
if (is_livemsg(l)) {
|
|
item = item_of(MSG_OFF(l),items);
|
|
/* A local variable that is never used is NOT an
|
|
* item; yet, there may be a register message for it...
|
|
*/
|
|
if(item != (item_p) 0) {
|
|
item->it_lastlive = now;
|
|
}
|
|
} else {
|
|
if (is_deadmsg(l)) {
|
|
item = item_of(MSG_OFF(l),items);
|
|
if (item != (item_p) 0) {
|
|
add_interval(item->it_lastlive,
|
|
last_code, &item->it_lives);
|
|
}
|
|
} else {
|
|
last_code = now;
|
|
}
|
|
}
|
|
}
|
|
}
|