changed lint flags, use ms_ego, changed allocation strategy for loops
This commit is contained in:
parent
41ca723d96
commit
335377da7a
|
@ -7,7 +7,7 @@ SHR=../share
|
|||
LDFLAGS=-i
|
||||
CPPFLAGS=-DVERBOSE -DNOTCOMPACT
|
||||
CFLAGS=$(CPPFLAGS) -O
|
||||
LINTFLAGS=-hbac
|
||||
LINTFLAGS=-hbu
|
||||
|
||||
CFILES=\
|
||||
ra.c ra_items.c ra_lifet.c ra_allocl.c ra_profits.c \
|
||||
|
|
|
@ -437,29 +437,29 @@ print_items(items,p)
|
|||
item_p item;
|
||||
interv_p iv;
|
||||
|
||||
printf("BEGIN PROCEDURE %d\n",p->p_id);
|
||||
fprintf(stderr, "BEGIN PROCEDURE %d\n",p->p_id);
|
||||
for (t = 0; t < NRITEMTYPES;t++) {
|
||||
for (item = items[t]; item != (item_p) 0;item = item->it_next) {
|
||||
printf("\nitemtype = %s\n",str_types[t]);
|
||||
fprintf(stderr, "\nitemtype = %s\n",str_types[t]);
|
||||
if (t == GLOBL_ADDR) {
|
||||
printf("id of external = %d\n",
|
||||
fprintf(stderr, "id of external = %d\n",
|
||||
item->i_t.it_obj->o_id);
|
||||
} else {
|
||||
printf("offset = %ld\n",
|
||||
fprintf(stderr, "offset = %ld\n",
|
||||
item->i_t.it_off);
|
||||
}
|
||||
printf("regtype = %s\n",str_regtypes[item->it_regtype]);
|
||||
printf("size = %d\n",item->it_size);
|
||||
printf("#usages = %d\n", Lnrelems(item->it_usage));
|
||||
printf("lifetime = {");
|
||||
fprintf(stderr, "regtype = %s\n",str_regtypes[item->it_regtype]);
|
||||
fprintf(stderr, "size = %d\n",item->it_size);
|
||||
fprintf(stderr, "#usages = %d\n", Lnrelems(item->it_usage));
|
||||
fprintf(stderr, "lifetime = {");
|
||||
for (iv = item->it_lives; iv != (interv_p) 0;
|
||||
iv = iv->i_next) {
|
||||
printf("(%d,%d) ",iv->i_start,iv->i_stop);
|
||||
fprintf(stderr, "(%d,%d) ",iv->i_start,iv->i_stop);
|
||||
}
|
||||
printf("} \n");
|
||||
fprintf(stderr, "} \n");
|
||||
}
|
||||
}
|
||||
printf("END PROCEDURE %d\n\n",p->p_id);
|
||||
fprintf(stderr, "END PROCEDURE %d\n\n",p->p_id);
|
||||
}
|
||||
|
||||
|
||||
|
@ -490,6 +490,7 @@ print_allocs(list)
|
|||
fprintf(stderr,"#usages(static) = %d\n",al->al_susecount);
|
||||
fprintf(stderr,"#usages(dyn) = %d\n",al->al_dusecount);
|
||||
fprintf(stderr,"#inits = %d\n",Lnrelems(al->al_inits));
|
||||
fprintf(stderr,"isloop = %d\n",al->al_isloop);
|
||||
fprintf(stderr,"timespan = {");
|
||||
for (iv = al->al_timespan; iv != (interv_p) 0;
|
||||
iv = iv->i_next) {
|
||||
|
@ -523,8 +524,8 @@ stat_regusage(list)
|
|||
for (x = list; x != (alloc_p) 0; x = x->al_next) {
|
||||
regs_needed[x->al_regtype]++;
|
||||
}
|
||||
/* printf("data regs:%d\n",regs_needed[reg_any]); */
|
||||
/* printf("address regs:%d\n",regs_needed[reg_pointer]); */
|
||||
/* fprintf(stderr, "data regs:%d\n",regs_needed[reg_any]); */
|
||||
/* fprintf(stderr, "address regs:%d\n",regs_needed[reg_pointer]); */
|
||||
}
|
||||
|
||||
|
||||
|
@ -538,7 +539,7 @@ statistics(items)
|
|||
int t,r;
|
||||
int cnt;
|
||||
|
||||
printf("\nSTATISTICS\n");
|
||||
fprintf(stderr, "\nSTATISTICS\n");
|
||||
for (r = 0; r <= reg_float; r++) cnt_regtypes[r] = 0;
|
||||
for (t = 0; t < NRITEMTYPES;t++) {
|
||||
cnt = 0;
|
||||
|
@ -549,9 +550,9 @@ statistics(items)
|
|||
}
|
||||
next = item->it_next;
|
||||
}
|
||||
printf("#%s = %d\n",str_types[t],cnt);
|
||||
fprintf(stderr, "#%s = %d\n",str_types[t],cnt);
|
||||
}
|
||||
for (r = 0; r <= reg_float; r++) {
|
||||
printf("#%s = %d\n",str_regtypes[r],cnt_regtypes[r]);
|
||||
fprintf(stderr, "#%s = %d\n",str_regtypes[r],cnt_regtypes[r]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,10 +8,6 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/* TEMPORARY: should be put in ../../../h/em_mes.h: */
|
||||
#define ms_liv 9
|
||||
#define ms_ded 10
|
||||
|
||||
#define INFINITE 10000
|
||||
#define NRREGTYPES (reg_float+1)
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ STATIC count_usage(p,item,nrloops,sloopcnt,dloopcnt)
|
|||
for (li = Lfirst(loops); li != (Lindex) 0; li=Lnext(li,loops)) {
|
||||
l = (loop_p) Lelem(li);
|
||||
sloopcnt[l->lp_id]++;
|
||||
dloopcnt[l->lp_id] +=
|
||||
dloopcnt[l->lp_id] +=
|
||||
(IS_FIRM(u->t_bblock) ? loop_scale(lev) : 1);
|
||||
}
|
||||
}
|
||||
|
@ -293,13 +293,15 @@ STATIC allocs_of_item(p,item,loops,sloopcnt,dloopcnt,alloc_list_p)
|
|||
insert_alloc(wholeproc, alloc_list_p);
|
||||
for (li = Lfirst(loops); li != (Lindex) 0; li = Lnext(li,loops)) {
|
||||
lp = (loop_p) Lelem(li);
|
||||
if (sloopcnt[lp->lp_id] != 0 && !updates_needed(lp,item)) {
|
||||
if (sloopcnt[lp->lp_id] != 0 && !updates_needed(lp,item)
|
||||
&& !((header = lp->LP_HEADER) == (bblock_p) 0 &&
|
||||
MUST_INIT(item,lp->lp_entry))) {
|
||||
/* Item is used within loop, so consider loop
|
||||
* as a timespan during which item may be put in
|
||||
* a register.
|
||||
*/
|
||||
if ((header = lp->LP_HEADER) == (bblock_p) 0 &&
|
||||
MUST_INIT(item,lp->lp_entry)) continue;
|
||||
*/
|
||||
lt = loop_lifetime(lp);
|
||||
susecount = sloopcnt[lp->lp_id];
|
||||
dusecount = dloopcnt[lp->lp_id];
|
||||
|
@ -314,6 +316,12 @@ STATIC allocs_of_item(p,item,loops,sloopcnt,dloopcnt,alloc_list_p)
|
|||
loop_inits(lp,item,header),wholeproc,
|
||||
TRUE,FALSE),
|
||||
alloc_list_p);
|
||||
} else if (sloopcnt[lp->lp_id] != 0) {
|
||||
/* I confess: this is a hack. I didn't expect the
|
||||
* Spanish inquisition.
|
||||
*/
|
||||
if (wholeproc->al_dusecount < dloopcnt[lp->lp_id])
|
||||
wholeproc->al_dusecount = dloopcnt[lp->lp_id];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,5 +41,5 @@ time_p cons_time(l,b)
|
|||
short loop_scale(lev)
|
||||
short lev;
|
||||
{
|
||||
return (lev == 0 ? 1 : (lev > 3 ? 20 : 5 * lev));
|
||||
return (lev == 0 ? 1 : (lev > 3 ? 32 : 8 * lev));
|
||||
}
|
||||
|
|
|
@ -19,15 +19,19 @@
|
|||
#include "../../../h/em_spec.h"
|
||||
#include "../../../h/em_pseu.h"
|
||||
#include "../../../h/em_reg.h"
|
||||
#include "../../../h/em_mes.h"
|
||||
#include "../../../h/em_ego.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)
|
||||
#define MSG_OFF(l) aoff(ARG(l),2)
|
||||
#define is_livemsg(l) (INSTR(l) == ps_mes && aoff(ARG(l),0) == ms_ego && \
|
||||
aoff(ARG(l),1) == ego_live)
|
||||
#define is_deadmsg(l) (INSTR(l) == ps_mes && aoff(ARG(l),0) == ms_ego && \
|
||||
aoff(ARG(l),1) == ego_dead)
|
||||
|
||||
build_lifetimes(items)
|
||||
item_p items[];
|
||||
|
|
|
@ -107,26 +107,19 @@ STATIC bool room_for(alloc,packed)
|
|||
|
||||
STATIC alloc_p best_alloc(unpacked,packed,time_opt)
|
||||
alloc_p unpacked,packed;
|
||||
bool time_opt;
|
||||
bool time_opt; /* now unused */
|
||||
{
|
||||
/* Find the next best candidate */
|
||||
|
||||
register alloc_p x,best;
|
||||
bool loops_only;
|
||||
|
||||
for (loops_only = time_opt; ; loops_only = FALSE) {
|
||||
/* If we're optimizing execution time, we first
|
||||
* consider loops.
|
||||
*/
|
||||
best = unpacked; /* dummy */
|
||||
for (x = unpacked->al_next; x != (alloc_p) 0; x = x->al_next) {
|
||||
if ((!loops_only || x->al_isloop) &&
|
||||
x->al_profits > best->al_profits &&
|
||||
room_for(x,packed)) {
|
||||
best = x;
|
||||
}
|
||||
best = unpacked; /* dummy */
|
||||
|
||||
for (x = unpacked->al_next; x != (alloc_p) 0; x = x->al_next) {
|
||||
if (x->al_profits > best->al_profits &&
|
||||
room_for(x,packed)) {
|
||||
best = x;
|
||||
}
|
||||
if (best != unpacked || !loops_only) break;
|
||||
}
|
||||
return (best == unpacked ? (alloc_p) 0 : best);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* R A _ P R O F I T S . C
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "../share/types.h"
|
||||
#include "../share/debug.h"
|
||||
#include "../share/lset.h"
|
||||
|
@ -96,8 +97,8 @@ allocscore(itemtyp,localtyp,size,off,totyp,time_out,space_out)
|
|||
*time_out = (m == (cond_p) 0 ? -1 : map_value(m,off,TRUE));
|
||||
*space_out = (m == (cond_p) 0 ? -1 : map_value(m,off,FALSE));
|
||||
/*
|
||||
printf("itemtyp = %d, localtyp = %d off = %ld\n",itemtyp,localtyp,off);
|
||||
printf("ALLOCSCORE = (%d,%d)\n",*time_out,*space_out);
|
||||
fprintf(stderr,"itemtyp = %d, localtyp = %d off = %ld\n",itemtyp,localtyp,off);
|
||||
fprintf(stderr,"ALLOCSCORE = (%d,%d)\n",*time_out,*space_out);
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -132,8 +133,8 @@ opening_cost(itemtyp,localtyp,off,time_out,space_out)
|
|||
*time_out = (m == (cond_p) 0 ? 1000 : map_value(m,off,TRUE));
|
||||
*space_out = (m == (cond_p) 0 ? 1000 : map_value(m,off,FALSE));
|
||||
/*
|
||||
printf("itemtyp = %d, localtyp = %d off = %ld\n",itemtyp,localtyp,off);
|
||||
printf("OPEN_COST = (%d,%d)\n",*time_out,*space_out);
|
||||
fprintf(stderr,"itemtyp = %d, localtyp = %d off = %ld\n",itemtyp,localtyp,off);
|
||||
fprintf(stderr,"OPEN_COST = (%d,%d)\n",*time_out,*space_out);
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -154,7 +155,7 @@ regsave_cost(regs,time_out,space_out)
|
|||
*time_out = index_value(regsav_cost,n,TRUE);
|
||||
*space_out = index_value(regsav_cost,n,FALSE);
|
||||
/*
|
||||
printf("REGSAVE COST, n=%d, (%d,%d)\n",n,*time_out,*space_out);
|
||||
fprintf(stderr,"REGSAVE COST, n=%d, (%d,%d)\n",n,*time_out,*space_out);
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "../../../h/em_spec.h"
|
||||
#include "../../../h/em_pseu.h"
|
||||
#include "../../../h/em_mes.h"
|
||||
#include "../../../h/em_ego.h"
|
||||
#include "../../../h/em_reg.h"
|
||||
#include "ra.h"
|
||||
#include "ra_interv.h"
|
||||
|
@ -434,10 +435,12 @@ rem_mes(p)
|
|||
for (b = p->p_start; b != (bblock_p) 0; b = b->b_next) {
|
||||
for (l = b->b_start; l != (line_p) 0; l = next) {
|
||||
next = l->l_next;
|
||||
if ( INSTR(l) == ps_mes &&
|
||||
((m = aoff(ARG(l),0)) == ms_liv || m == ms_ded)) {
|
||||
/* remove live/dead messages */
|
||||
rm_line(l,b);
|
||||
if (INSTR(l) == ps_mes
|
||||
&& aoff(ARG(l),0) == ms_ego
|
||||
&& ((m = aoff(ARG(l),1)) == ego_live
|
||||
|| m == ego_dead)) {
|
||||
/* remove live/dead messages */
|
||||
rm_line(l,b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue