More void, fewer clang warnings in util/ego
Most warnings are for functions implicitly returning int. Change most
of these functions to return void. (Traditional K&R C had no void
type, but C89 has it.)
Add prototypes to most function declarations in headers. This is
easy, because ego declares most of its extern functions, and the
comments listed most parameters. There were a few outdated or missing
declarations, and a few .c files that failed to include an .h with the
declarations.
Add prototypes to a few function definitions in .c files. Most
functions still have traditional K&R definitions. Most STATIC
functions still don't have prototypes, because they have no earlier
declaration where I would have added the prototype.
Change some prototypes in util/ego/share/alloc.h. Functions newmap()
and oldmap() handle an array of pointers to something; change the
array's type from `short **` to `void **`. Callers use casts to go
between `void **` and the correct type, like `line_p *`. Function
oldtable() takes a `short *`, not a `short **`; I added the wrong type
in 5bbbaf4
.
Make a few other changes to silence warnings. There are a few places
where clang wants extra parentheses in the code.
Edit util/ego/ra/build.lua to add the missing dependency on ra*.h; I
needed this to prevent crashes from ra.
This commit is contained in:
parent
be1662dd15
commit
17bc9cdef7
|
@ -62,9 +62,7 @@ STATIC int Sbo; /* #optimizations found */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC line_p last_code(lines,skip_pseu)
|
STATIC line_p last_code(line_p lines, bool skip_pseu)
|
||||||
line_p lines;
|
|
||||||
bool skip_pseu;
|
|
||||||
{
|
{
|
||||||
/* Determine the last line of a list */
|
/* Determine the last line of a list */
|
||||||
|
|
||||||
|
@ -82,12 +80,11 @@ STATIC short cc_tab[12] =
|
||||||
op_zne,op_bne,op_zgt,op_bgt,op_zge,op_bge};
|
op_zne,op_bne,op_zgt,op_bgt,op_zge,op_bge};
|
||||||
|
|
||||||
|
|
||||||
STATIC short rev_cond(cond)
|
STATIC short rev_cond(short cond)
|
||||||
short cond;
|
|
||||||
{
|
{
|
||||||
register i;
|
register int i;
|
||||||
|
|
||||||
for (i = 0; i < 12; i++) {
|
for (i = 0; i < 12; i++) {
|
||||||
if (cond == cc_tab[i]) return cc_tab[11-i];
|
if (cond == cc_tab[i]) return cc_tab[11-i];
|
||||||
}
|
}
|
||||||
return op_nop;
|
return op_nop;
|
||||||
|
@ -100,7 +97,7 @@ STATIC bool is_bcc(l)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC bo_optloop(p,b,x,bra,bcc)
|
STATIC void bo_optloop(p,b,x,bra,bcc)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
bblock_p b,x;
|
bblock_p b,x;
|
||||||
line_p bra,bcc;
|
line_p bra,bcc;
|
||||||
|
@ -180,7 +177,7 @@ OUTVERBOSE("branch optimization proc %d block %d\n", curproc->p_id,x->b_id);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC bo_loops(p)
|
STATIC void bo_loops(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
Lindex i;
|
Lindex i;
|
||||||
|
@ -192,7 +189,7 @@ STATIC bo_loops(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC mv_code(b1,b2)
|
STATIC void mv_code(b1,b2)
|
||||||
bblock_p b1,b2;
|
bblock_p b1,b2;
|
||||||
{
|
{
|
||||||
line_p l,x;
|
line_p l,x;
|
||||||
|
@ -207,8 +204,7 @@ STATIC mv_code(b1,b2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
STATIC void bo_switch(b)
|
||||||
bo_switch(b)
|
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
bblock_p s,x;
|
bblock_p s,x;
|
||||||
|
@ -256,7 +252,7 @@ OUTVERBOSE("branch optimization in proc %d, block %d",curproc->p_id,b->b_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC bo_extproc(p)
|
STATIC void bo_extproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Allocate the extended data structures for procedure p */
|
/* Allocate the extended data structures for procedure p */
|
||||||
|
@ -272,7 +268,7 @@ STATIC bo_extproc(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC loop_blocks(p)
|
STATIC void loop_blocks(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Compute the LP_BLOCKS sets for all loops of p */
|
/* Compute the LP_BLOCKS sets for all loops of p */
|
||||||
|
@ -288,7 +284,7 @@ STATIC loop_blocks(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC bo_cleanproc(p)
|
STATIC void bo_cleanproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Allocate the extended data structures for procedure p */
|
/* Allocate the extended data structures for procedure p */
|
||||||
|
@ -321,7 +317,7 @@ void bo_optimize(void *vp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <em_mes.h>
|
#include <em_mes.h>
|
||||||
#include "../share/types.h"
|
#include "../share/types.h"
|
||||||
#include "ca.h"
|
#include "ca.h"
|
||||||
|
#include "ca_put.h"
|
||||||
#include "../share/debug.h"
|
#include "../share/debug.h"
|
||||||
#include "../share/def.h"
|
#include "../share/def.h"
|
||||||
#include "../share/map.h"
|
#include "../share/map.h"
|
||||||
|
@ -22,18 +23,18 @@ FILE *outfile;
|
||||||
|
|
||||||
STATIC proc_p thispro;
|
STATIC proc_p thispro;
|
||||||
|
|
||||||
STATIC outinst(m) {
|
STATIC void outinst(int m) {
|
||||||
|
|
||||||
outbyte( (byte) m );
|
outbyte( (byte) m );
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC coutshort(i) short i; {
|
STATIC void coutshort(short i) {
|
||||||
|
|
||||||
outbyte( (byte) (i&BMASK) );
|
outbyte( (byte) (i&BMASK) );
|
||||||
outbyte( (byte) (i>>8) );
|
outbyte( (byte) (i>>8) );
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC coutint(i) short i; {
|
STATIC void coutint(short i) {
|
||||||
|
|
||||||
if (i>= -sp_zcst0 && i< sp_ncst0-sp_zcst0)
|
if (i>= -sp_zcst0 && i< sp_ncst0-sp_zcst0)
|
||||||
outbyte( (byte) (i+sp_zcst0+sp_fcst0) );
|
outbyte( (byte) (i+sp_zcst0+sp_fcst0) );
|
||||||
|
@ -43,7 +44,7 @@ STATIC coutint(i) short i; {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC coutoff(off) offset off; {
|
STATIC void coutoff(offset off) {
|
||||||
|
|
||||||
if ((short) off == off)
|
if ((short) off == off)
|
||||||
coutint((short) off);
|
coutint((short) off);
|
||||||
|
@ -55,9 +56,7 @@ STATIC coutoff(off) offset off; {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outsym(s,t)
|
STATIC void outsym(const char *s, int t)
|
||||||
char *s;
|
|
||||||
int t;
|
|
||||||
{
|
{
|
||||||
register byte *p;
|
register byte *p;
|
||||||
register unsigned num;
|
register unsigned num;
|
||||||
|
@ -85,21 +84,19 @@ STATIC outsym(s,t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outdsym(dbl)
|
STATIC void outdsym(dblock_p dbl)
|
||||||
dblock_p dbl;
|
|
||||||
{
|
{
|
||||||
if (dnames[dbl->d_id]) outsym(dnames[dbl->d_id],sp_dnam);
|
if (dnames[dbl->d_id]) outsym(dnames[dbl->d_id],sp_dnam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outpsym(p)
|
STATIC void outpsym(proc_p p)
|
||||||
proc_p p;
|
|
||||||
{
|
{
|
||||||
outsym(pnames[p->p_id],sp_pnam);
|
outsym(pnames[p->p_id],sp_pnam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outddef(id) short id; {
|
STATIC void outddef(short id) {
|
||||||
|
|
||||||
dblock_p dbl;
|
dblock_p dbl;
|
||||||
|
|
||||||
|
@ -111,7 +108,7 @@ STATIC outddef(id) short id; {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC outpdef(p) proc_p p; {
|
STATIC void outpdef(proc_p p) {
|
||||||
p->p_flags2 |= PF_SYMOUT;
|
p->p_flags2 |= PF_SYMOUT;
|
||||||
if (p->p_flags1 & PF_EXTERNAL) {
|
if (p->p_flags1 & PF_EXTERNAL) {
|
||||||
outinst(ps_exp);
|
outinst(ps_exp);
|
||||||
|
@ -120,7 +117,7 @@ STATIC outpdef(p) proc_p p; {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outdocc(obj) obj_p obj; {
|
STATIC void outdocc(obj_p obj) {
|
||||||
dblock_p dbl;
|
dblock_p dbl;
|
||||||
|
|
||||||
dbl = obj->o_dblock;
|
dbl = obj->o_dblock;
|
||||||
|
@ -135,7 +132,7 @@ STATIC outdocc(obj) obj_p obj; {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outpocc(p) proc_p p; {
|
STATIC void outpocc(proc_p p) {
|
||||||
if ((p->p_flags2 & PF_SYMOUT) == 0) {
|
if ((p->p_flags2 & PF_SYMOUT) == 0) {
|
||||||
p->p_flags2 |= PF_SYMOUT;
|
p->p_flags2 |= PF_SYMOUT;
|
||||||
if ((p->p_flags1 & PF_EXTERNAL) == 0) {
|
if ((p->p_flags1 & PF_EXTERNAL) == 0) {
|
||||||
|
@ -146,8 +143,7 @@ STATIC outpocc(p) proc_p p; {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC coutobject(obj)
|
STATIC void coutobject(obj_p obj)
|
||||||
obj_p obj;
|
|
||||||
{
|
{
|
||||||
/* In general, an object is defined by a global data
|
/* In general, an object is defined by a global data
|
||||||
* label and an offset. There are two special cases:
|
* label and an offset. There are two special cases:
|
||||||
|
@ -169,7 +165,7 @@ STATIC coutobject(obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC cputstr(abp) register argb_p abp; {
|
STATIC void cputstr(argb_p abp) {
|
||||||
register argb_p tbp;
|
register argb_p tbp;
|
||||||
register length;
|
register length;
|
||||||
|
|
||||||
|
@ -188,8 +184,7 @@ STATIC cputstr(abp) register argb_p abp; {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outnum(n)
|
STATIC void outnum(int n)
|
||||||
int n;
|
|
||||||
{
|
{
|
||||||
if (n < 256) {
|
if (n < 256) {
|
||||||
outbyte((byte) sp_ilb1);
|
outbyte((byte) sp_ilb1);
|
||||||
|
@ -201,8 +196,7 @@ STATIC outnum(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC numlab(n)
|
STATIC void numlab(int n)
|
||||||
int n;
|
|
||||||
{
|
{
|
||||||
if (n < sp_nilb0) {
|
if (n < sp_nilb0) {
|
||||||
outbyte((byte) (n + sp_filb0));
|
outbyte((byte) (n + sp_filb0));
|
||||||
|
@ -212,8 +206,7 @@ STATIC numlab(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC cputargs(lnp)
|
STATIC void cputargs(line_p lnp)
|
||||||
line_p lnp;
|
|
||||||
{
|
{
|
||||||
register arg_p ap;
|
register arg_p ap;
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
@ -264,8 +257,7 @@ STATIC cputargs(lnp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC outoperand(lnp)
|
STATIC void outoperand(line_p lnp)
|
||||||
line_p lnp;
|
|
||||||
{
|
{
|
||||||
/* Output the operand of instruction lnp */
|
/* Output the operand of instruction lnp */
|
||||||
|
|
||||||
|
@ -320,8 +312,7 @@ STATIC outoperand(lnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC outvisibility(lnp)
|
STATIC void outvisibility(line_p lnp)
|
||||||
line_p lnp;
|
|
||||||
{
|
{
|
||||||
/* In EM names of datalabels and procedures can be made
|
/* In EM names of datalabels and procedures can be made
|
||||||
* externally visible, so they can be used in other files.
|
* externally visible, so they can be used in other files.
|
||||||
|
@ -377,9 +368,7 @@ STATIC outvisibility(lnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cputlines(l,lf)
|
void cputlines(line_p l, FILE *lf)
|
||||||
line_p l;
|
|
||||||
FILE *lf;
|
|
||||||
{
|
{
|
||||||
/* Output the lines in Campact assembly language
|
/* Output the lines in Campact assembly language
|
||||||
* format.
|
* format.
|
||||||
|
@ -405,13 +394,12 @@ cputlines(l,lf)
|
||||||
oldline(lnp);
|
oldline(lnp);
|
||||||
}
|
}
|
||||||
if (lmap != (line_p *) 0) {
|
if (lmap != (line_p *) 0) {
|
||||||
oldmap(lmap,llength);
|
oldmap((void **) lmap,llength);
|
||||||
lmap = (line_p *) 0;
|
lmap = (line_p *) 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cputmagic(lf)
|
void cputmagic(FILE *lf)
|
||||||
FILE *lf;
|
|
||||||
{
|
{
|
||||||
/* write the magic number */
|
/* write the magic number */
|
||||||
|
|
||||||
|
|
|
@ -10,5 +10,5 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern cputlines();
|
void cputlines(line_p, FILE *);
|
||||||
extern cputmagic();
|
void cputmagic(FILE *);
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "../share/get.h"
|
#include "../share/get.h"
|
||||||
#include "../share/put.h"
|
#include "../share/put.h"
|
||||||
#include "../share/def.h"
|
#include "../share/def.h"
|
||||||
|
#include "../share/utils.h"
|
||||||
#include "cf.h"
|
#include "cf.h"
|
||||||
#include "cf_succ.h"
|
#include "cf_succ.h"
|
||||||
#include "cf_idom.h"
|
#include "cf_idom.h"
|
||||||
|
@ -75,7 +76,7 @@ STATIC short state; /* We use a finite state machine with the
|
||||||
* INIT: initial state
|
* INIT: initial state
|
||||||
*/
|
*/
|
||||||
|
|
||||||
STATIC nextblock()
|
STATIC void nextblock()
|
||||||
{
|
{
|
||||||
/* allocate a new basic block structure and
|
/* allocate a new basic block structure and
|
||||||
* set b, bp and lp.
|
* set b, bp and lp.
|
||||||
|
@ -138,12 +139,9 @@ STATIC line_p doread_line(p_out)
|
||||||
return lnp;
|
return lnp;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC bool getbblocks(fp, kind_out, n_out, g_out, l_out)
|
STATIC bool
|
||||||
FILE* fp;
|
getbblocks(FILE *fp, short *kind_out, short *n_out, bblock_p *g_out,
|
||||||
short* kind_out;
|
line_p *l_out)
|
||||||
short* n_out;
|
|
||||||
bblock_p* g_out;
|
|
||||||
line_p* l_out;
|
|
||||||
{
|
{
|
||||||
bblock_p head = (bblock_p)0;
|
bblock_p head = (bblock_p)0;
|
||||||
line_p headl = (line_p)0;
|
line_p headl = (line_p)0;
|
||||||
|
@ -252,7 +250,7 @@ line_p* l_out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC interproc_analysis(p)
|
STATIC void interproc_analysis(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Interprocedural analysis of a procedure p determines:
|
/* Interprocedural analysis of a procedure p determines:
|
||||||
|
@ -362,7 +360,7 @@ STATIC interproc_analysis(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC cf_cleanproc(p)
|
STATIC void cf_cleanproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Remove the extended data structures of p */
|
/* Remove the extended data structures of p */
|
||||||
|
@ -477,7 +475,7 @@ STATIC bool add_info(q, p)
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC trans_clos(head)
|
STATIC void trans_clos(head)
|
||||||
proc_p head;
|
proc_p head;
|
||||||
{
|
{
|
||||||
/* Compute the transitive closure of the used/changed
|
/* Compute the transitive closure of the used/changed
|
||||||
|
@ -508,7 +506,7 @@ STATIC trans_clos(head)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
indir_calls()
|
STATIC void indir_calls()
|
||||||
{
|
{
|
||||||
Cindex i;
|
Cindex i;
|
||||||
proc_p p;
|
proc_p p;
|
||||||
|
@ -522,7 +520,7 @@ indir_calls()
|
||||||
Cdeleteset(cai_set);
|
Cdeleteset(cai_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
main(argc, argv) int argc;
|
int main(argc, argv) int argc;
|
||||||
char* argv[];
|
char* argv[];
|
||||||
{
|
{
|
||||||
FILE* f, *f2, *gf2; /* The EM input, EM output, basic block output */
|
FILE* f, *f2, *gf2; /* The EM input, EM output, basic block output */
|
||||||
|
|
|
@ -34,7 +34,7 @@ short dfs_nr;
|
||||||
bblock_p *vertex; /* dynamically allocated array */
|
bblock_p *vertex; /* dynamically allocated array */
|
||||||
|
|
||||||
|
|
||||||
STATIC dfs(v)
|
STATIC void dfs(v)
|
||||||
bblock_p v;
|
bblock_p v;
|
||||||
{
|
{
|
||||||
/* Depth First Search */
|
/* Depth First Search */
|
||||||
|
@ -56,7 +56,7 @@ STATIC dfs(v)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC compress(v)
|
STATIC void compress(v)
|
||||||
bblock_p v;
|
bblock_p v;
|
||||||
{
|
{
|
||||||
if (v->B_ANCESTOR->B_ANCESTOR != (bblock_p) 0) {
|
if (v->B_ANCESTOR->B_ANCESTOR != (bblock_p) 0) {
|
||||||
|
@ -83,7 +83,7 @@ STATIC bblock_p eval(v)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC linkblocks(v,w)
|
STATIC void linkblocks(v,w)
|
||||||
bblock_p v,w;
|
bblock_p v,w;
|
||||||
{
|
{
|
||||||
w->B_ANCESTOR = v;
|
w->B_ANCESTOR = v;
|
||||||
|
@ -91,9 +91,7 @@ STATIC linkblocks(v,w)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dominators(r,n)
|
void dominators(bblock_p r, short n)
|
||||||
bblock_p r;
|
|
||||||
short n;
|
|
||||||
{
|
{
|
||||||
/* Compute the immediate dominator of every basic
|
/* Compute the immediate dominator of every basic
|
||||||
* block in the control flow graph rooted by r.
|
* block in the control flow graph rooted by r.
|
||||||
|
@ -139,5 +137,6 @@ dominators(r,n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r->b_idom = (bblock_p) 0;
|
r->b_idom = (bblock_p) 0;
|
||||||
oldmap(vertex,n); /* release memory for dynamic array vertex */
|
/* release memory for dynamic array vertex */
|
||||||
|
oldmap((void **) vertex,n);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern dominator(); /* (bblock_p head, short n)
|
void dominators(bblock_p head, short n);
|
||||||
|
/*
|
||||||
* Compute for every basic block its immediate
|
* Compute for every basic block its immediate
|
||||||
* dominator. The dominator relation is hence
|
* dominator. The dominator relation is hence
|
||||||
* recorded as a tree in which every node contains
|
* recorded as a tree in which every node contains
|
||||||
|
|
|
@ -83,7 +83,7 @@ STATIC bool inner_loop(l1,l2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC insrt(b,lpb,s_p)
|
STATIC void insrt(b,lpb,s_p)
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
lset *lpb;
|
lset *lpb;
|
||||||
lset *s_p;
|
lset *s_p;
|
||||||
|
@ -162,7 +162,7 @@ STATIC loop_p org_loop(lp,loops)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC collapse_loops(loops_p)
|
STATIC void collapse_loops(loops_p)
|
||||||
lset *loops_p;
|
lset *loops_p;
|
||||||
{
|
{
|
||||||
register Lindex li1, li2;
|
register Lindex li1, li2;
|
||||||
|
@ -187,7 +187,7 @@ STATIC collapse_loops(loops_p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC loop_per_block(lp)
|
STATIC void loop_per_block(lp)
|
||||||
loop_p lp;
|
loop_p lp;
|
||||||
{
|
{
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
|
@ -205,7 +205,7 @@ STATIC loop_per_block(lp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC loop_attrib(loops)
|
STATIC void loop_attrib(loops)
|
||||||
lset loops;
|
lset loops;
|
||||||
{
|
{
|
||||||
/* Compute several attributes */
|
/* Compute several attributes */
|
||||||
|
@ -223,7 +223,7 @@ STATIC loop_attrib(loops)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC nest_levels(loops)
|
STATIC void nest_levels(loops)
|
||||||
lset loops;
|
lset loops;
|
||||||
{
|
{
|
||||||
/* Compute the nesting levels of all loops of
|
/* Compute the nesting levels of all loops of
|
||||||
|
@ -250,7 +250,7 @@ STATIC nest_levels(loops)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC cleanup(loops)
|
STATIC void cleanup(loops)
|
||||||
lset loops;
|
lset loops;
|
||||||
{
|
{
|
||||||
/* Throw away the LP_BLOCKS sets */
|
/* Throw away the LP_BLOCKS sets */
|
||||||
|
@ -280,7 +280,7 @@ STATIC bool does_exit(b,lp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC mark_succ(b,lp)
|
STATIC void mark_succ(b,lp)
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
loop_p lp;
|
loop_p lp;
|
||||||
{
|
{
|
||||||
|
@ -339,7 +339,7 @@ STATIC void mark_blocks(lp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC mark_loopblocks(loops)
|
STATIC void mark_loopblocks(loops)
|
||||||
lset loops;
|
lset loops;
|
||||||
{
|
{
|
||||||
/* Determine for all loops which basic blocks
|
/* Determine for all loops which basic blocks
|
||||||
|
@ -360,7 +360,7 @@ STATIC mark_loopblocks(loops)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
loop_detection(p)
|
void loop_detection(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Find all natural loops of procedure p. Every loop is
|
/* Find all natural loops of procedure p. Every loop is
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
* L O O P D E T E C T I O N
|
* L O O P D E T E C T I O N
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern loop_detection(); /* (proc_p p)
|
void loop_detection(proc_p p); /*
|
||||||
* Detect all loops of procedure p.
|
* Detect all loops of procedure p.
|
||||||
* Every basic block of p is assigned
|
* Every basic block of p is assigned
|
||||||
* a set of all loops it is part of.
|
* a set of all loops it is part of.
|
||||||
|
|
|
@ -21,12 +21,13 @@
|
||||||
#include "../share/lset.h"
|
#include "../share/lset.h"
|
||||||
#include "../share/cset.h"
|
#include "../share/cset.h"
|
||||||
#include "cf.h"
|
#include "cf.h"
|
||||||
|
#include "cf_succ.h"
|
||||||
#include "../share/map.h"
|
#include "../share/map.h"
|
||||||
|
|
||||||
extern char em_flag[];
|
extern char em_flag[];
|
||||||
|
|
||||||
|
|
||||||
STATIC succeeds(succ,pred)
|
STATIC void succeeds(succ,pred)
|
||||||
bblock_p succ, pred;
|
bblock_p succ, pred;
|
||||||
{
|
{
|
||||||
assert(pred != (bblock_p) 0);
|
assert(pred != (bblock_p) 0);
|
||||||
|
@ -75,7 +76,7 @@ STATIC arg_p use_label(arg,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC case_flow(instr,desc,b)
|
STATIC void case_flow(instr,desc,b)
|
||||||
short instr;
|
short instr;
|
||||||
line_p desc;
|
line_p desc;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
|
@ -176,7 +177,7 @@ STATIC line_p case_descr(lnp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC last2_instrs(b,last_out,prev_out)
|
STATIC void last2_instrs(b,last_out,prev_out)
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
line_p *last_out,*prev_out;
|
line_p *last_out,*prev_out;
|
||||||
{
|
{
|
||||||
|
@ -205,7 +206,7 @@ STATIC last2_instrs(b,last_out,prev_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
control_flow(head)
|
void control_flow(head)
|
||||||
bblock_p head;
|
bblock_p head;
|
||||||
{
|
{
|
||||||
/* compute the successor and predecessor relation
|
/* compute the successor and predecessor relation
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
* S U C C E S S O R / P R E D E C E S S O R R E L A T I O N S
|
* S U C C E S S O R / P R E D E C E S S O R R E L A T I O N S
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern control_flow(); /* (bblock_p head)
|
void control_flow(bblock_p head);
|
||||||
|
/*
|
||||||
* Compute for every basic block
|
* Compute for every basic block
|
||||||
* its successors and predecessors
|
* its successors and predecessors
|
||||||
* in the control flow graph.
|
* in the control flow graph.
|
||||||
|
|
|
@ -134,7 +134,7 @@ STATIC bool is_desirable(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC cp_loops(b1,b2)
|
STATIC void cp_loops(b1,b2)
|
||||||
bblock_p b1,b2;
|
bblock_p b1,b2;
|
||||||
{
|
{
|
||||||
/* Copy the loopset of b2 to b1 */
|
/* Copy the loopset of b2 to b1 */
|
||||||
|
@ -149,7 +149,7 @@ STATIC cp_loops(b1,b2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC jump_cross(l1,l2,b1,b2)
|
STATIC void jump_cross(l1,l2,b1,b2)
|
||||||
line_p l1,l2;
|
line_p l1,l2;
|
||||||
bblock_p b1,b2;
|
bblock_p b1,b2;
|
||||||
{
|
{
|
||||||
|
@ -317,7 +317,7 @@ void cj_optimize(void *vp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,11 +56,11 @@ STATIC bool same_avail(byte kind, avail_p avp1, avail_p avp2)
|
||||||
case BINAIR_OP:
|
case BINAIR_OP:
|
||||||
case REMAINDER:
|
case REMAINDER:
|
||||||
if (commutative(avp1->av_instr & BMASK))
|
if (commutative(avp1->av_instr & BMASK))
|
||||||
return avp1->av_oleft == avp2->av_oleft &&
|
return (avp1->av_oleft == avp2->av_oleft &&
|
||||||
avp1->av_oright == avp2->av_oright
|
avp1->av_oright == avp2->av_oright)
|
||||||
||
|
||
|
||||||
avp1->av_oleft == avp2->av_oright &&
|
(avp1->av_oleft == avp2->av_oright &&
|
||||||
avp1->av_oright == avp2->av_oleft
|
avp1->av_oright == avp2->av_oleft)
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
return avp1->av_oleft == avp2->av_oleft &&
|
return avp1->av_oleft == avp2->av_oleft &&
|
||||||
|
@ -98,7 +98,8 @@ STATIC entity_p result_local(offset size, line_p l)
|
||||||
if (l == (line_p) 0)
|
if (l == (line_p) 0)
|
||||||
return (entity_p) 0;
|
return (entity_p) 0;
|
||||||
|
|
||||||
if (INSTR(l)==op_stl && size==ws || INSTR(l)==op_sdl && size==2*ws) {
|
if ((INSTR(l)==op_stl && size==ws) ||
|
||||||
|
(INSTR(l)==op_sdl && size==2*ws)) {
|
||||||
enp = getentity(l, &dummy);
|
enp = getentity(l, &dummy);
|
||||||
if (is_regvar(enp->en_loc)) {
|
if (is_regvar(enp->en_loc)) {
|
||||||
OUTTRACE("save local found, %ld(LB)", enp->en_loc);
|
OUTTRACE("save local found, %ld(LB)", enp->en_loc);
|
||||||
|
|
|
@ -52,12 +52,12 @@ lab_id lastlid = 0;
|
||||||
offset mespar = UNKNOWN_SIZE;
|
offset mespar = UNKNOWN_SIZE;
|
||||||
/* argumument of ps_par message of current procedure */
|
/* argumument of ps_par message of current procedure */
|
||||||
|
|
||||||
extern process_lines();
|
STATIC void process_lines(FILE *);
|
||||||
extern int readline();
|
STATIC int readline(short *, line_p *);
|
||||||
extern line_p readoperand();
|
STATIC line_p readoperand(short);
|
||||||
extern line_p inpseudo();
|
STATIC line_p inpseudo(short);
|
||||||
|
|
||||||
main(argc, argv) int argc;
|
int main(argc, argv) int argc;
|
||||||
char* argv[];
|
char* argv[];
|
||||||
{
|
{
|
||||||
/* The input files must be legal EM Compact
|
/* The input files must be legal EM Compact
|
||||||
|
@ -133,7 +133,7 @@ char* argv[];
|
||||||
#define END_INSTR 4
|
#define END_INSTR 4
|
||||||
#define DELETED_INSTR 5
|
#define DELETED_INSTR 5
|
||||||
|
|
||||||
STATIC add_end()
|
STATIC void add_end()
|
||||||
{
|
{
|
||||||
/* Add an end-pseudo to the current instruction list */
|
/* Add an end-pseudo to the current instruction list */
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ STATIC add_end()
|
||||||
lastline->l_instr = ps_end;
|
lastline->l_instr = ps_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
process_lines(fout)
|
STATIC void process_lines(fout)
|
||||||
FILE* fout;
|
FILE* fout;
|
||||||
{
|
{
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
|
@ -235,8 +235,7 @@ process_lines(fout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int readline(instr_out, lnp_out) short* instr_out;
|
STATIC int readline(short *instr_out, line_p *lnp_out)
|
||||||
line_p* lnp_out;
|
|
||||||
{
|
{
|
||||||
register line_p lnp;
|
register line_p lnp;
|
||||||
short n;
|
short n;
|
||||||
|
@ -310,7 +309,7 @@ line_p* lnp_out;
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
line_p readoperand(instr) short instr;
|
STATIC line_p readoperand(short instr)
|
||||||
{
|
{
|
||||||
/* Read the operand of the given instruction.
|
/* Read the operand of the given instruction.
|
||||||
* Create a line struct and return a pointer to it.
|
* Create a line struct and return a pointer to it.
|
||||||
|
@ -432,7 +431,7 @@ static char* hol_label()
|
||||||
return lastname;
|
return lastname;
|
||||||
}
|
}
|
||||||
|
|
||||||
line_p inpseudo(n) short n;
|
STATIC line_p inpseudo(short n)
|
||||||
{
|
{
|
||||||
int m;
|
int m;
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
|
|
||||||
/* opr_size */
|
/* opr_size */
|
||||||
|
|
||||||
offset opr_size(instr)
|
offset opr_size(short instr)
|
||||||
short instr;
|
|
||||||
{
|
{
|
||||||
switch(instr) {
|
switch(instr) {
|
||||||
case op_loe:
|
case op_loe:
|
||||||
|
@ -96,9 +95,7 @@ STATIC offset argsize(arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC offset blocksize(pseudo,args)
|
STATIC offset blocksize(byte pseudo, arg_p args)
|
||||||
byte pseudo;
|
|
||||||
arg_p args;
|
|
||||||
{
|
{
|
||||||
/* Determine the number of bytes of a datablock */
|
/* Determine the number of bytes of a datablock */
|
||||||
|
|
||||||
|
@ -167,7 +164,7 @@ STATIC arg_p copy_rom(args)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dblockdef(db,n,lnp)
|
void dblockdef(db,n,lnp)
|
||||||
dblock_p db;
|
dblock_p db;
|
||||||
int n;
|
int n;
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
|
@ -206,10 +203,7 @@ dblockdef(db,n,lnp)
|
||||||
|
|
||||||
/* combine */
|
/* combine */
|
||||||
|
|
||||||
combine(db,l1,l2,pseu)
|
void combine(dblock_p db, line_p l1, line_p l2, byte pseu)
|
||||||
dblock_p db;
|
|
||||||
line_p l1,l2;
|
|
||||||
byte pseu;
|
|
||||||
{
|
{
|
||||||
/* Combine two successive ROMs/CONs (without a data label
|
/* Combine two successive ROMs/CONs (without a data label
|
||||||
* in between into a single ROM. E.g.:
|
* in between into a single ROM. E.g.:
|
||||||
|
@ -258,7 +252,7 @@ combine(db,l1,l2,pseu)
|
||||||
|
|
||||||
/* arglist */
|
/* arglist */
|
||||||
|
|
||||||
STATIC arg_string(length,abp)
|
STATIC void arg_string(length,abp)
|
||||||
offset length;
|
offset length;
|
||||||
register argb_p abp;
|
register argb_p abp;
|
||||||
{
|
{
|
||||||
|
@ -447,10 +441,7 @@ STATIC obj_p make_object(dbl,off,size)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
obj_p object(ident,off,size)
|
obj_p object(char *ident, offset off, offset size)
|
||||||
char *ident;
|
|
||||||
offset off;
|
|
||||||
offset size;
|
|
||||||
{
|
{
|
||||||
dblock_p dbl;
|
dblock_p dbl;
|
||||||
|
|
||||||
|
|
|
@ -10,35 +10,38 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern offset opr_size(); /* ( short instr )
|
offset opr_size(short instr); /*
|
||||||
* size of operand of given instruction.
|
* size of operand of given instruction.
|
||||||
* The operand is an object , so the
|
* The operand is an object , so the
|
||||||
* instruction can be loe, zre etc..
|
* instruction can be loe, zre etc..
|
||||||
*/
|
*/
|
||||||
extern dblockdef(); /* (dblock_p db, int n, line_p lnp)
|
void dblockdef(dblock_p db, int n, line_p lnp);
|
||||||
|
/*
|
||||||
* Fill in d_pseudo, d_size and
|
* Fill in d_pseudo, d_size and
|
||||||
* d_values fields of db.
|
* d_values fields of db.
|
||||||
*/
|
*/
|
||||||
extern combine(); /* (dblock_p db;line_p l1,l2;byte pseu)
|
void combine(dblock_p db, line_p l1, line_p l2, byte pseu);
|
||||||
|
/*
|
||||||
* Combine two successive ROMs or CONs
|
* Combine two successive ROMs or CONs
|
||||||
* (with no data label in between)
|
* (with no data label in between)
|
||||||
* into one ROM or CON.
|
* into one ROM or CON.
|
||||||
*/
|
*/
|
||||||
extern line_p arglist(); /* ( int m)
|
line_p arglist(int m); /*
|
||||||
* Read a list of m arguments. If m
|
* Read a list of m arguments. If m
|
||||||
* is 0, then the list is of
|
* is 0, then the list is of
|
||||||
* undetermined length; it is
|
* undetermined length; it is
|
||||||
* then terminated by a cend symbol.
|
* then terminated by a cend symbol.
|
||||||
*/
|
*/
|
||||||
extern bool is_datalabel(); /* ( line_p l)
|
bool is_datalabel(line_p l); /*
|
||||||
* TRUE if l is a data label defining
|
* TRUE if l is a data label defining
|
||||||
* occurrence (i.e. its l_instr
|
* occurrence (i.e. its l_instr
|
||||||
* field is ps_sym).
|
* field is ps_sym).
|
||||||
*/
|
*/
|
||||||
extern dblock_p block_of_lab(); /* (char *ident)
|
dblock_p block_of_lab(char *ident); /*
|
||||||
* Find the datablock with
|
* Find the datablock with
|
||||||
* the given name.
|
* the given name.
|
||||||
*/
|
*/
|
||||||
extern obj_p object(); /* (char *ident,offset off,short size)
|
obj_p object(char *ident, offset off, offset size);
|
||||||
|
/*
|
||||||
* Create an object struct.
|
* Create an object struct.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -95,15 +95,15 @@ offset get_off() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC make_string(n) int n; {
|
STATIC void make_string(n) int n; {
|
||||||
|
|
||||||
sprintf(string,".%u",n);
|
sprintf(string,".%u",n);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC inident() {
|
STATIC void inident() {
|
||||||
register n;
|
register int n;
|
||||||
register char *p = string;
|
register char *p = string;
|
||||||
register c;
|
register int c;
|
||||||
|
|
||||||
n = get_int();
|
n = get_int();
|
||||||
while (n--) {
|
while (n--) {
|
||||||
|
@ -140,7 +140,7 @@ int table3(n) int n; {
|
||||||
}
|
}
|
||||||
|
|
||||||
int table1() {
|
int table1() {
|
||||||
register n;
|
register int n;
|
||||||
|
|
||||||
n = readbyte();
|
n = readbyte();
|
||||||
if (n == EOF)
|
if (n == EOF)
|
||||||
|
@ -161,7 +161,7 @@ int table1() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int table2() {
|
int table2() {
|
||||||
register n;
|
register int n;
|
||||||
|
|
||||||
n = readbyte();
|
n = readbyte();
|
||||||
if ((n < sp_fcst0 + sp_ncst0) && (n >= sp_fcst0)) {
|
if ((n < sp_fcst0 + sp_ncst0) && (n >= sp_fcst0)) {
|
||||||
|
@ -174,10 +174,7 @@ int table2() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
file_init(f,state,length)
|
void file_init(FILE *f, short state, long length)
|
||||||
FILE *f;
|
|
||||||
short state;
|
|
||||||
long length;
|
|
||||||
{
|
{
|
||||||
short n;
|
short n;
|
||||||
|
|
||||||
|
@ -193,7 +190,7 @@ file_init(f,state,length)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
arch_init(arch)
|
void arch_init(arch)
|
||||||
FILE *arch;
|
FILE *arch;
|
||||||
{
|
{
|
||||||
short n;
|
short n;
|
||||||
|
|
|
@ -8,22 +8,24 @@
|
||||||
* L O W L E V E L I / O R O U T I N E S
|
* L O W L E V E L I / O R O U T I N E S
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h> /* FILE */
|
||||||
|
|
||||||
extern int table1(); /* ( )
|
int table1(void); /*
|
||||||
* Read an instruction from the
|
* Read an instruction from the
|
||||||
* Compact Assembly Language input
|
* Compact Assembly Language input
|
||||||
* file (in 'neutral state').
|
* file (in 'neutral state').
|
||||||
*/
|
*/
|
||||||
extern int table2(); /* ( )
|
int table2(void); /*
|
||||||
* Read an instruction argument.
|
* Read an instruction argument.
|
||||||
*/
|
*/
|
||||||
extern int table3(); /* ( int )
|
int table3(int); /*
|
||||||
* Read 'Common Table' item.
|
* Read 'Common Table' item.
|
||||||
*/
|
*/
|
||||||
extern short get_int(); /* ( ) */
|
short get_int(void);
|
||||||
extern offset get_off(); /* ( ) */
|
offset get_off(void);
|
||||||
extern char readchar(); /* ( ) */
|
char readchar(void);
|
||||||
extern file_init(); /* (FILE *f, short state, long length)
|
void file_init(FILE *f, short state, long length);
|
||||||
|
/*
|
||||||
* Input file initialization. All
|
* Input file initialization. All
|
||||||
* following read operations will read
|
* following read operations will read
|
||||||
* from the given file f. Also checks
|
* from the given file f. Also checks
|
||||||
|
@ -32,7 +34,7 @@ extern file_init(); /* (FILE *f, short state, long length)
|
||||||
* If the state is ARCHIVE, length
|
* If the state is ARCHIVE, length
|
||||||
* specifies the length of the module.
|
* specifies the length of the module.
|
||||||
*/
|
*/
|
||||||
extern arch_init(); /* (FILE *arch)
|
void arch_init(FILE *arch); /*
|
||||||
* Same as file_init,but opens an
|
* Same as file_init,but opens an
|
||||||
* archive file. So it checks the
|
* archive file. So it checks the
|
||||||
* magic number for archives.
|
* magic number for archives.
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include "../share/files.h"
|
#include "../share/files.h"
|
||||||
#include "ic_lib.h"
|
#include "ic_lib.h"
|
||||||
|
|
||||||
STATIC skip_string(n)
|
STATIC void skip_string(n)
|
||||||
offset n;
|
offset n;
|
||||||
{
|
{
|
||||||
/* Read a string of length n and void it */
|
/* Read a string of length n and void it */
|
||||||
|
@ -60,7 +60,7 @@ STATIC void skip_arguments()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC bool proc_wanted(name) char* name;
|
STATIC bool proc_wanted(const char *name)
|
||||||
{
|
{
|
||||||
/* See if 'name' is the name of an external procedure
|
/* See if 'name' is the name of an external procedure
|
||||||
* that has been used before, but for which no body
|
* that has been used before, but for which no body
|
||||||
|
@ -79,7 +79,7 @@ STATIC bool proc_wanted(name) char* name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC bool data_wanted(name) char* name;
|
STATIC bool data_wanted(const char *name)
|
||||||
{
|
{
|
||||||
/* See if 'name' is the name of an externally visible
|
/* See if 'name' is the name of an externally visible
|
||||||
* data block that has been used before, but for which
|
* data block that has been used before, but for which
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern FILE *next_file(); /* (int argc, char *argv[])
|
FILE *next_file(int argc, char *argv[]);
|
||||||
|
/*
|
||||||
* See if there are any more EM input files.
|
* See if there are any more EM input files.
|
||||||
* 'argv' contains the names of the files
|
* 'argv' contains the names of the files
|
||||||
* that are passed as arguments to ic.
|
* that are passed as arguments to ic.
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "../share/debug.h"
|
#include "../share/debug.h"
|
||||||
#include "../share/map.h"
|
#include "../share/map.h"
|
||||||
#include "ic.h"
|
#include "ic.h"
|
||||||
|
#include "ic_io.h"
|
||||||
#include "ic_lookup.h"
|
#include "ic_lookup.h"
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
|
|
||||||
|
@ -43,8 +44,7 @@ char *lastname;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
lab_id instr_lab(number)
|
lab_id instr_lab(short number)
|
||||||
short number;
|
|
||||||
{
|
{
|
||||||
register num_p *npp, np;
|
register num_p *npp, np;
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ lab_id instr_lab(number)
|
||||||
|
|
||||||
/* symlookup */
|
/* symlookup */
|
||||||
|
|
||||||
STATIC unsigned hash(string) char *string; {
|
STATIC unsigned hash(const char *string) {
|
||||||
register char *p;
|
register char *p;
|
||||||
register unsigned i,sum;
|
register unsigned i,sum;
|
||||||
|
|
||||||
|
@ -91,9 +91,7 @@ STATIC unsigned hash(string) char *string; {
|
||||||
return(sum);
|
return(sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
dblock_p symlookup(name, status)
|
dblock_p symlookup(const char *name, int status)
|
||||||
char *name;
|
|
||||||
int status;
|
|
||||||
{
|
{
|
||||||
/* Look up the name of a data block. The name can appear
|
/* Look up the name of a data block. The name can appear
|
||||||
* in either a defining or applied occurrence (status is
|
* in either a defining or applied occurrence (status is
|
||||||
|
@ -206,9 +204,7 @@ proc_p getproc(status)
|
||||||
|
|
||||||
/* proclookup */
|
/* proclookup */
|
||||||
|
|
||||||
proc_p proclookup(name, status)
|
proc_p proclookup(const char *name, int status)
|
||||||
char *name;
|
|
||||||
int status;
|
|
||||||
{
|
{
|
||||||
register prc_p *ppp, pp;
|
register prc_p *ppp, pp;
|
||||||
register proc_p dp;
|
register proc_p dp;
|
||||||
|
@ -271,7 +267,7 @@ proc_p proclookup(name, status)
|
||||||
|
|
||||||
/* cleaninstrlabs */
|
/* cleaninstrlabs */
|
||||||
|
|
||||||
cleaninstrlabs()
|
void cleaninstrlabs()
|
||||||
{
|
{
|
||||||
register num_p *npp, np, next;
|
register num_p *npp, np, next;
|
||||||
|
|
||||||
|
@ -290,7 +286,7 @@ cleaninstrlabs()
|
||||||
|
|
||||||
/* dump_procnames */
|
/* dump_procnames */
|
||||||
|
|
||||||
dump_procnames(hash,n,f)
|
void dump_procnames(hash,n,f)
|
||||||
prc_p hash[];
|
prc_p hash[];
|
||||||
int n;
|
int n;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
@ -328,7 +324,7 @@ dump_procnames(hash,n,f)
|
||||||
|
|
||||||
/* cleanprocs */
|
/* cleanprocs */
|
||||||
|
|
||||||
cleanprocs(hash,n,mask)
|
void cleanprocs(hash,n,mask)
|
||||||
prc_p hash[];
|
prc_p hash[];
|
||||||
int n,mask;
|
int n,mask;
|
||||||
{
|
{
|
||||||
|
@ -372,7 +368,7 @@ cleanprocs(hash,n,mask)
|
||||||
|
|
||||||
/* dump_dblocknames */
|
/* dump_dblocknames */
|
||||||
|
|
||||||
dump_dblocknames(hash,n,f)
|
void dump_dblocknames(hash,n,f)
|
||||||
sym_p hash[];
|
sym_p hash[];
|
||||||
int n;
|
int n;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
@ -404,7 +400,7 @@ dump_dblocknames(hash,n,f)
|
||||||
|
|
||||||
/* cleandblocks */
|
/* cleandblocks */
|
||||||
|
|
||||||
cleandblocks(hash,n,mask)
|
void cleandblocks(hash,n,mask)
|
||||||
sym_p hash[];
|
sym_p hash[];
|
||||||
int n,mask;
|
int n,mask;
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,42 +35,52 @@ extern sym_p symhash[];
|
||||||
extern prc_p prochash[];
|
extern prc_p prochash[];
|
||||||
extern num_p numhash[];
|
extern num_p numhash[];
|
||||||
|
|
||||||
extern lab_id instr_lab(); /* ( short number)
|
lab_id instr_lab(short number); /*
|
||||||
* Maps EM labels to sequential
|
* Maps EM labels to sequential
|
||||||
* integers.
|
* integers.
|
||||||
*/
|
*/
|
||||||
extern dblock_p symlookup(); /* (char *ident, int status)
|
dblock_p symlookup(const char *ident, int status);
|
||||||
|
/*
|
||||||
* Look up the data block with
|
* Look up the data block with
|
||||||
* the given name.
|
* the given name.
|
||||||
*/
|
*/
|
||||||
extern dblock_p getsym(); /* ( int status)
|
dblock_p getsym(int status); /*
|
||||||
* Read and look up a symbol.
|
* Read and look up a symbol.
|
||||||
* If this is the first occurrence
|
* If this is the first occurrence
|
||||||
* of it, then make it external
|
* of it, then make it external
|
||||||
* (if status=OCCURRING) or
|
* (if status=OCCURRING) or
|
||||||
* internal (if DEFINING).
|
* internal (if DEFINING).
|
||||||
*/
|
*/
|
||||||
extern proc_p getproc(); /* (int status)
|
proc_p getproc(int status); /*
|
||||||
* Same as getsym, but for procedure
|
* Same as getsym, but for procedure
|
||||||
* names.
|
* names.
|
||||||
*/
|
*/
|
||||||
extern proc_p proclookup(); /* ( char *ident, int status)
|
proc_p proclookup(const char *ident, int status);
|
||||||
|
/*
|
||||||
* Find (in the hashtable) the
|
* Find (in the hashtable) the
|
||||||
* procedure with the given name.
|
* procedure with the given name.
|
||||||
*/
|
*/
|
||||||
extern cleaninstrlabs(); /* ( )
|
void cleaninstrlabs(void); /*
|
||||||
* Forget about all instruction labels.
|
* Forget about all instruction labels.
|
||||||
*/
|
*/
|
||||||
extern dump_procnames(); /* (prc_p hash[], int n, FILE *f)
|
void dump_procnames(prc_p hash[], int n, FILE *f);
|
||||||
|
/*
|
||||||
* Save the names of the procedures
|
* Save the names of the procedures
|
||||||
* in file f; hash is the hashtable
|
* in file f; hash is the hashtable
|
||||||
* used and n is its length.
|
* used and n is its length.
|
||||||
*/
|
*/
|
||||||
extern cleanprocs(); /* (prc_p hash[], int n,mask)
|
void cleanprocs(prc_p hash[], int n, int mask);
|
||||||
|
/*
|
||||||
* Make the names of all procedures
|
* Make the names of all procedures
|
||||||
* for which p_flags1&mask = 0 invisible
|
* for which p_flags1&mask = 0 invisible
|
||||||
*/
|
*/
|
||||||
extern cleandblocks(); /* (sym_p hash[], int n)
|
void dump_dblocknames(sym_p hash[], int n, FILE *f);
|
||||||
|
/*
|
||||||
|
* Save the names of the EM data
|
||||||
|
* blocks in FILE f.
|
||||||
|
*/
|
||||||
|
void cleandblocks(sym_p hash[], int n, int mask);
|
||||||
|
/*
|
||||||
* Make the names of all data blocks
|
* Make the names of all data blocks
|
||||||
* for which d_flags1&mask = 0 invisible
|
* for which d_flags1&mask = 0 invisible
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <em_path.h>
|
#include <em_path.h>
|
||||||
#include <em_mnem.h>
|
#include <em_mnem.h>
|
||||||
#include <em_pseu.h>
|
#include <em_pseu.h>
|
||||||
|
@ -21,7 +22,9 @@
|
||||||
#include "../share/map.h"
|
#include "../share/map.h"
|
||||||
#include "il_aux.h"
|
#include "il_aux.h"
|
||||||
#include "il1_anal.h"
|
#include "il1_anal.h"
|
||||||
|
#include "il1_aux.h"
|
||||||
#include "il2_aux.h"
|
#include "il2_aux.h"
|
||||||
|
#include "il3_change.h"
|
||||||
#include "il3_subst.h"
|
#include "il3_subst.h"
|
||||||
#include "../share/get.h"
|
#include "../share/get.h"
|
||||||
#include "../share/put.h"
|
#include "../share/put.h"
|
||||||
|
@ -56,7 +59,7 @@ int Sbig_caller, Sdispensable, Schangedcallee, Sbigcallee, Sspace, Szeroratio;
|
||||||
* The call descriptors are put in a file (calfile).
|
* The call descriptors are put in a file (calfile).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pass1(lnam, bnam, cnam) char* lnam, *bnam, *cnam;
|
STATIC void pass1(const char *lnam, const char *bnam, const char *cnam)
|
||||||
{
|
{
|
||||||
FILE* f, *gf, *cf, *ccf; /* The EM input, the basic block graph,
|
FILE* f, *gf, *cf, *ccf; /* The EM input, the basic block graph,
|
||||||
* the call-list file and the calcnt file.
|
* the call-list file and the calcnt file.
|
||||||
|
@ -124,8 +127,7 @@ pass1(lnam, bnam, cnam) char* lnam, *bnam, *cnam;
|
||||||
|
|
||||||
STATIC char cname2[128] = TMP_DIR;
|
STATIC char cname2[128] = TMP_DIR;
|
||||||
|
|
||||||
pass2(cnam, space) char* cnam;
|
STATIC void pass2(const char *cnam, long space)
|
||||||
long space;
|
|
||||||
{
|
{
|
||||||
FILE* cf, *cf2, *ccf;
|
FILE* cf, *cf2, *ccf;
|
||||||
call_p c, a;
|
call_p c, a;
|
||||||
|
@ -176,7 +178,7 @@ long space;
|
||||||
* EM textfile.
|
* EM textfile.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pass3(lnam, lnam2) char* lnam, *lnam2;
|
void pass3(const char *lnam, const char *lnam2)
|
||||||
{
|
{
|
||||||
bool verbose = TRUE;
|
bool verbose = TRUE;
|
||||||
FILE* lfile, *lfilerand, *lfile2, *sfile;
|
FILE* lfile, *lfilerand, *lfile2, *sfile;
|
||||||
|
@ -244,7 +246,7 @@ pass3(lnam, lnam2) char* lnam, *lnam2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC il_extptab(ptab)
|
STATIC void il_extptab(ptab)
|
||||||
proc_p ptab;
|
proc_p ptab;
|
||||||
{
|
{
|
||||||
/* Allocate space for extension of proctable entries.
|
/* Allocate space for extension of proctable entries.
|
||||||
|
@ -261,7 +263,7 @@ STATIC il_extptab(ptab)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC il_cleanptab(ptab)
|
STATIC void il_cleanptab(ptab)
|
||||||
proc_p ptab;
|
proc_p ptab;
|
||||||
{
|
{
|
||||||
/* De-allocate space for extensions */
|
/* De-allocate space for extensions */
|
||||||
|
@ -275,7 +277,7 @@ STATIC il_cleanptab(ptab)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
Sdiagnostics()
|
STATIC void Sdiagnostics()
|
||||||
{
|
{
|
||||||
/* print statictical information */
|
/* print statictical information */
|
||||||
|
|
||||||
|
@ -324,7 +326,7 @@ void il_flags(void *vp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
main(argc, argv) int argc;
|
int main(argc, argv) int argc;
|
||||||
char* argv[];
|
char* argv[];
|
||||||
{
|
{
|
||||||
struct files* files = findfiles(argc, argv);
|
struct files* files = findfiles(argc, argv);
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "il.h"
|
#include "il.h"
|
||||||
#include "../share/debug.h"
|
#include "../share/debug.h"
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
|
#include "../share/cset.h"
|
||||||
#include "../share/global.h"
|
#include "../share/global.h"
|
||||||
#include "../share/lset.h"
|
#include "../share/lset.h"
|
||||||
#include "../share/utils.h"
|
#include "../share/utils.h"
|
||||||
|
@ -38,7 +39,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
apriori(proctab)
|
void apriori(proctab)
|
||||||
proc_p proctab;
|
proc_p proctab;
|
||||||
{
|
{
|
||||||
/* For every procedure, see if we can determine
|
/* For every procedure, see if we can determine
|
||||||
|
@ -68,7 +69,7 @@ apriori(proctab)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC check_labels(p,arglist)
|
STATIC void check_labels(p,arglist)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
arg_p arglist;
|
arg_p arglist;
|
||||||
{
|
{
|
||||||
|
@ -91,7 +92,7 @@ STATIC check_labels(p,arglist)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC anal_instr(p,b,cf)
|
STATIC void anal_instr(p,b,cf)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
FILE *cf;
|
FILE *cf;
|
||||||
|
@ -152,7 +153,7 @@ STATIC anal_instr(p,b,cf)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
anal_proc(p,cf,ccf)
|
void anal_proc(p,cf,ccf)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
FILE *cf,*ccf;
|
FILE *cf,*ccf;
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,14 +8,16 @@
|
||||||
* I L 1 _ A N A L . H
|
* I L 1 _ A N A L . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern apriori(); /* (proc_p proctab)
|
void apriori(proc_p proctab);
|
||||||
|
/*
|
||||||
* For every procedure, see if we can determine
|
* For every procedure, see if we can determine
|
||||||
* from the information provided by the previous
|
* from the information provided by the previous
|
||||||
* phases of the optimizer that it cannot or should not
|
* phases of the optimizer that it cannot or should not
|
||||||
* be expanded in line. This will reduce the length
|
* be expanded in line. This will reduce the length
|
||||||
* of the call list.
|
* of the call list.
|
||||||
*/
|
*/
|
||||||
extern anal_proc(); /* (proc_p p, FILE *cf, *cff)
|
void anal_proc(proc_p p, FILE *cf, FILE *cff);
|
||||||
|
/*
|
||||||
* Analyse a procedure. See which formal parameters
|
* Analyse a procedure. See which formal parameters
|
||||||
* it uses and which procedures it calls.
|
* it uses and which procedures it calls.
|
||||||
* cf and ccf are the call-file and the call-count file.
|
* cf and ccf are the call-file and the call-count file.
|
||||||
|
|
|
@ -57,7 +57,7 @@ STATIC bool is_reg(off,s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rem_actuals(acts)
|
void rem_actuals(acts)
|
||||||
actual_p acts;
|
actual_p acts;
|
||||||
{
|
{
|
||||||
/* remove the actual-list */
|
/* remove the actual-list */
|
||||||
|
@ -73,7 +73,7 @@ rem_actuals(acts)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
remov_formals(p)
|
void remov_formals(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Remove the list of formals of p */
|
/* Remove the list of formals of p */
|
||||||
|
|
|
@ -8,34 +8,36 @@
|
||||||
* I L 1 _ A U X . H
|
* I L 1 _ A U X . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern bool same_size(); /* (int t1,t2)
|
bool same_size(int t1, int t2); /*
|
||||||
* See if the two types t1 and t2 have
|
* See if the two types t1 and t2 have
|
||||||
* the same size.
|
* the same size.
|
||||||
*/
|
*/
|
||||||
extern rem_actuals(); /* (actual_p atcs)
|
void rem_actuals(actual_p acts);/*
|
||||||
* remove an actual-list from core.
|
* remove an actual-list from core.
|
||||||
*/
|
*/
|
||||||
extern remov_formals(); /* (proc_p p)
|
void remov_formals(proc_p p); /*
|
||||||
* Remove the formals-list of p from core.
|
* Remove the formals-list of p from core.
|
||||||
*/
|
*/
|
||||||
extern void rem_indir_acc(); /* (proc_p p)
|
void rem_indir_acc(proc_p p); /*
|
||||||
* Remove formal that may be accessed
|
* Remove formal that may be accessed
|
||||||
* indirectly from formal lists of p
|
* indirectly from formal lists of p
|
||||||
*/
|
*/
|
||||||
extern bool par_overlap(); /* (offset off1, int t1, offset off2, int t2)
|
bool par_overlap(offset off1, int t1, offset off2, int t2);
|
||||||
|
/*
|
||||||
* See if the formal at offset off1 and type t1
|
* See if the formal at offset off1 and type t1
|
||||||
* overlaps the formal at offset off2
|
* overlaps the formal at offset off2
|
||||||
* and type t2.
|
* and type t2.
|
||||||
*/
|
*/
|
||||||
extern short looplevel(); /* (bblock_p b)
|
short looplevel(bblock_p b); /*
|
||||||
* Determine the loop nesting level of b.
|
* Determine the loop nesting level of b.
|
||||||
*/
|
*/
|
||||||
extern int proclength(); /* (proc_p p)
|
int proclength(proc_p p); /*
|
||||||
* Determine the number of EM instructions
|
* Determine the number of EM instructions
|
||||||
* in p. Do not count pseudos.
|
* in p. Do not count pseudos.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern line_p copy_code(); /* (line_p l1,l2)
|
line_p copy_code(line_p l1, line_p l2);
|
||||||
|
/*
|
||||||
* copy the code between l1 and l2.
|
* copy the code between l1 and l2.
|
||||||
* Pseudos may not be contained in
|
* Pseudos may not be contained in
|
||||||
* the list of instructions. If l1==l2
|
* the list of instructions. If l1==l2
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <em_mnem.h>
|
#include <em_mnem.h>
|
||||||
#include "../share/types.h"
|
#include "../share/types.h"
|
||||||
#include "il.h"
|
#include "il.h"
|
||||||
|
#include "il_aux.h"
|
||||||
#include "il1_cal.h"
|
#include "il1_cal.h"
|
||||||
#include "../share/debug.h"
|
#include "../share/debug.h"
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
|
@ -91,7 +92,7 @@ STATIC void inc_count(caller,callee)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
anal_cal(p,call,b,cf)
|
void anal_cal(p,call,b,cf)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
line_p call;
|
line_p call;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
|
|
|
@ -29,7 +29,8 @@ extern struct class classtab[];
|
||||||
#define CLASS9 9
|
#define CLASS9 9
|
||||||
|
|
||||||
|
|
||||||
extern anal_cal(); /* (line_p call, bblock_p b)
|
void anal_cal(proc_p p, line_p call, bblock_p b, FILE *cf);
|
||||||
|
/*
|
||||||
* analyze a call instruction;
|
* analyze a call instruction;
|
||||||
* try to recognize the actual parameter
|
* try to recognize the actual parameter
|
||||||
* expressions.
|
* expressions.
|
||||||
|
|
|
@ -70,7 +70,7 @@ formal_p find_formal(p,type,off)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC no_inl_pars(p)
|
STATIC void no_inl_pars(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* p may not have any in line parameters */
|
/* p may not have any in line parameters */
|
||||||
|
@ -81,7 +81,7 @@ STATIC no_inl_pars(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC inc_use(f,b)
|
STATIC void inc_use(f,b)
|
||||||
formal_p f;
|
formal_p f;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,8 +8,8 @@
|
||||||
* I L 1 _ F O R M A L . C
|
* I L 1 _ F O R M A L . C
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern void formal(); /* (proc_p p; bblock_p b; offset off;
|
void formal(proc_p p, bblock_p b, offset off, int type, int usage);
|
||||||
* int type, usage)
|
/*
|
||||||
* Analyze a reference to a parameter of p.
|
* Analyze a reference to a parameter of p.
|
||||||
* The type denotes its size (single,double,
|
* The type denotes its size (single,double,
|
||||||
* pointer).
|
* pointer).
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "../share/debug.h"
|
#include "../share/debug.h"
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
#include "../share/global.h"
|
#include "../share/global.h"
|
||||||
|
#include "../share/cset.h"
|
||||||
#include "../share/lset.h"
|
#include "../share/lset.h"
|
||||||
#include "il_aux.h"
|
#include "il_aux.h"
|
||||||
#include "il2_aux.h"
|
#include "il2_aux.h"
|
||||||
|
@ -34,6 +35,9 @@
|
||||||
#define CHANGED(p) p->p_flags2 |= PF_CHANGED
|
#define CHANGED(p) p->p_flags2 |= PF_CHANGED
|
||||||
#define IS_CHANGED(p) (p->p_flags2 & PF_CHANGED)
|
#define IS_CHANGED(p) (p->p_flags2 & PF_CHANGED)
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
STATIC void Sstat(proc_p proclist, long space);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
STATIC bool match_pars(fm,act)
|
STATIC bool match_pars(fm,act)
|
||||||
|
@ -220,7 +224,7 @@ STATIC short param_score(c)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
assign_ratio(c)
|
void assign_ratio(c)
|
||||||
call_p c;
|
call_p c;
|
||||||
{
|
{
|
||||||
/* This routine is one of the most important ones
|
/* This routine is one of the most important ones
|
||||||
|
@ -289,7 +293,7 @@ call_p abstract(c)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC adjust_counts(callee,ccf)
|
STATIC void adjust_counts(callee,ccf)
|
||||||
proc_p callee;
|
proc_p callee;
|
||||||
FILE *ccf;
|
FILE *ccf;
|
||||||
{
|
{
|
||||||
|
@ -389,7 +393,7 @@ STATIC call_p find_origin(c)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC selected(a)
|
STATIC void selected(a)
|
||||||
call_p a;
|
call_p a;
|
||||||
{
|
{
|
||||||
/* The call a is selected for in line expansion.
|
/* The call a is selected for in line expansion.
|
||||||
|
@ -406,7 +410,7 @@ STATIC selected(a)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC compare(x,best,space)
|
STATIC void compare(x,best,space)
|
||||||
call_p x, *best;
|
call_p x, *best;
|
||||||
long space;
|
long space;
|
||||||
{
|
{
|
||||||
|
@ -450,7 +454,7 @@ STATIC call_p best_one(list,space)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC singles(cals)
|
STATIC void singles(cals)
|
||||||
call_p cals;
|
call_p cals;
|
||||||
{
|
{
|
||||||
/* If a procedure is only called once, this call
|
/* If a procedure is only called once, this call
|
||||||
|
@ -486,7 +490,7 @@ STATIC singles(cals)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC single_calls(proclist)
|
STATIC void single_calls(proclist)
|
||||||
proc_p proclist;
|
proc_p proclist;
|
||||||
{
|
{
|
||||||
proc_p p;
|
proc_p p;
|
||||||
|
@ -505,7 +509,7 @@ STATIC single_calls(proclist)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
select_calls(proclist,ccf,space)
|
void select_calls(proclist,ccf,space)
|
||||||
proc_p proclist;
|
proc_p proclist;
|
||||||
FILE *ccf;
|
FILE *ccf;
|
||||||
long space ;
|
long space ;
|
||||||
|
@ -549,7 +553,7 @@ select_calls(proclist,ccf,space)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC nonnested_calls(cfile)
|
STATIC void nonnested_calls(cfile)
|
||||||
FILE *cfile;
|
FILE *cfile;
|
||||||
{
|
{
|
||||||
register call_p c,a;
|
register call_p c,a;
|
||||||
|
@ -569,7 +573,7 @@ STATIC nonnested_calls(cfile)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC copy_pars(src,dest)
|
STATIC void copy_pars(src,dest)
|
||||||
call_p src, dest;
|
call_p src, dest;
|
||||||
{
|
{
|
||||||
/* Copy the actual parameters of src to dest. */
|
/* Copy the actual parameters of src to dest. */
|
||||||
|
@ -589,7 +593,7 @@ STATIC copy_pars(src,dest)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC nest_pars(cals)
|
STATIC void nest_pars(cals)
|
||||||
call_p cals;
|
call_p cals;
|
||||||
{
|
{
|
||||||
/* Recursive auxiliary procedure of add_actuals. */
|
/* Recursive auxiliary procedure of add_actuals. */
|
||||||
|
@ -607,7 +611,7 @@ STATIC nest_pars(cals)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
add_actuals(proclist,cfile)
|
void add_actuals(proclist,cfile)
|
||||||
proc_p proclist;
|
proc_p proclist;
|
||||||
FILE *cfile;
|
FILE *cfile;
|
||||||
{
|
{
|
||||||
|
@ -633,7 +637,7 @@ add_actuals(proclist,cfile)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC clean(cals)
|
STATIC void clean(cals)
|
||||||
call_p *cals;
|
call_p *cals;
|
||||||
{
|
{
|
||||||
call_p c,next,*cpp;
|
call_p c,next,*cpp;
|
||||||
|
@ -655,7 +659,7 @@ STATIC clean(cals)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cleancals(proclist)
|
void cleancals(proclist)
|
||||||
proc_p proclist;
|
proc_p proclist;
|
||||||
{
|
{
|
||||||
/* Remove all calls in the P_CALS list of p
|
/* Remove all calls in the P_CALS list of p
|
||||||
|
@ -672,7 +676,7 @@ cleancals(proclist)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
append_abstract(a,p)
|
void append_abstract(a,p)
|
||||||
call_p a;
|
call_p a;
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
|
@ -698,7 +702,7 @@ append_abstract(a,p)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
Sstatist(list,space)
|
STATIC void Sstatist(list,space)
|
||||||
call_p list;
|
call_p list;
|
||||||
long space;
|
long space;
|
||||||
{
|
{
|
||||||
|
@ -717,7 +721,7 @@ Sstatist(list,space)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Sstat(proclist,space)
|
STATIC void Sstat(proclist,space)
|
||||||
proc_p proclist;
|
proc_p proclist;
|
||||||
long space;
|
long space;
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,22 +3,23 @@
|
||||||
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
||||||
*/
|
*/
|
||||||
extern bool anal_params(); /* (call_p c)
|
bool anal_params(call_p c); /*
|
||||||
* See which parameters of the call
|
* See which parameters of the call
|
||||||
* may be expanded in line.
|
* may be expanded in line.
|
||||||
* If the formals and actuals do not
|
* If the formals and actuals do not
|
||||||
* match, return FALSE
|
* match, return FALSE
|
||||||
*/
|
*/
|
||||||
extern assign_ratio(); /* (call_p c)
|
void assign_ratio(call_p c); /*
|
||||||
* Assigna ratio number to the call,
|
* Assigna ratio number to the call,
|
||||||
* indicating how desirable it is to
|
* indicating how desirable it is to
|
||||||
* expand the call in line.
|
* expand the call in line.
|
||||||
*/
|
*/
|
||||||
extern call_p abstract(); /* (call_p c)
|
call_p abstract(call_p c); /*
|
||||||
* Abstract essential information from
|
* Abstract essential information from
|
||||||
* the call.
|
* the call.
|
||||||
*/
|
*/
|
||||||
extern select_calls(); /* (call_p alist; FILE *ccf;short space)
|
void select_calls(proc_p proclist, FILE *ccf, long space);
|
||||||
|
/*
|
||||||
* Select the best calls to be expanded.
|
* Select the best calls to be expanded.
|
||||||
* Every procedure gets a list of
|
* Every procedure gets a list of
|
||||||
* selected calls appearing in it.
|
* selected calls appearing in it.
|
||||||
|
@ -26,10 +27,11 @@ extern select_calls(); /* (call_p alist; FILE *ccf;short space)
|
||||||
* program is allowed to grow
|
* program is allowed to grow
|
||||||
* (expressed in number of EM instructions).
|
* (expressed in number of EM instructions).
|
||||||
*/
|
*/
|
||||||
extern cleancals(); /* (proc_p plist)
|
void cleancals(proc_p alist); /*
|
||||||
* Remove all calls that were not selected.
|
* Remove all calls that were not selected.
|
||||||
*/
|
*/
|
||||||
extern add_actuals(); /* (proc_p plist; FILE *cfile)
|
void add_actuals(proc_p plist, FILE *cfile);
|
||||||
|
/*
|
||||||
* Add the actual parameters to the descriptor abstracts
|
* Add the actual parameters to the descriptor abstracts
|
||||||
* of the selected calls.
|
* of the selected calls.
|
||||||
* the calfile contains the full descriptors of all
|
* the calfile contains the full descriptors of all
|
||||||
|
@ -37,7 +39,8 @@ extern add_actuals(); /* (proc_p plist; FILE *cfile)
|
||||||
* These two are combined to yield a file of full
|
* These two are combined to yield a file of full
|
||||||
* descriptors of the selected calls.
|
* descriptors of the selected calls.
|
||||||
*/
|
*/
|
||||||
extern append_abstract(); /* (call_p a; proc_p p)
|
void append_abstract(call_p a, proc_p p);
|
||||||
|
/*
|
||||||
* Put the call-descriptor abstract in the p_cals
|
* Put the call-descriptor abstract in the p_cals
|
||||||
* list of p.
|
* list of p.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include "../share/debug.h"
|
#include "../share/debug.h"
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
#include "../share/global.h"
|
#include "../share/global.h"
|
||||||
#include "il_aux.h"
|
|
||||||
#include "il3_aux.h"
|
#include "il3_aux.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +32,7 @@ line_p last_line(lines)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
app_list(list,l)
|
void app_list(list,l)
|
||||||
line_p list,l;
|
line_p list,l;
|
||||||
{
|
{
|
||||||
/* Append the list after line l */
|
/* Append the list after line l */
|
||||||
|
@ -53,7 +52,7 @@ app_list(list,l)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rem_line(l)
|
void rem_line(l)
|
||||||
line_p l;
|
line_p l;
|
||||||
{
|
{
|
||||||
/* Remove a line from the list */
|
/* Remove a line from the list */
|
||||||
|
|
|
@ -8,13 +8,14 @@
|
||||||
* I L 3 _ A U X . H
|
* I L 3 _ A U X . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern line_p last_line(); /* (line_p list)
|
line_p last_line(line_p list); /*
|
||||||
* Find the last line of a list.
|
* Find the last line of a list.
|
||||||
*/
|
*/
|
||||||
extern app_list(); /* (line_p list,l)
|
void app_list(line_p list, line_p l);
|
||||||
|
/*
|
||||||
* Put list after l
|
* Put list after l
|
||||||
*/
|
*/
|
||||||
extern rem_line(); /* (line_p l)
|
void rem_line(line_p l); /*
|
||||||
* Remove a line from a (doubly linked)
|
* Remove a line from a (doubly linked)
|
||||||
* list.
|
* list.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -54,7 +54,7 @@ STATIC line_p par_expr(l,expr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC rem_text(l1,l2)
|
STATIC void rem_text(l1,l2)
|
||||||
line_p l1,l2;
|
line_p l1,l2;
|
||||||
{
|
{
|
||||||
/* Remove the lines from l1 to l2 (inclusive) */
|
/* Remove the lines from l1 to l2 (inclusive) */
|
||||||
|
@ -69,7 +69,7 @@ STATIC rem_text(l1,l2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC store_tmp(p,l,size)
|
STATIC void store_tmp(p,l,size)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
line_p l;
|
line_p l;
|
||||||
offset size;
|
offset size;
|
||||||
|
@ -103,7 +103,7 @@ STATIC store_tmp(p,l,size)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC chg_actuals(c,cal)
|
STATIC void chg_actuals(c,cal)
|
||||||
call_p c;
|
call_p c;
|
||||||
line_p cal;
|
line_p cal;
|
||||||
{
|
{
|
||||||
|
@ -131,7 +131,7 @@ STATIC chg_actuals(c,cal)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC rm_callpart(c,cal)
|
STATIC void rm_callpart(c,cal)
|
||||||
call_p c;
|
call_p c;
|
||||||
line_p cal;
|
line_p cal;
|
||||||
{
|
{
|
||||||
|
@ -155,7 +155,7 @@ STATIC rm_callpart(c,cal)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
chg_callseq(c,cal,l_out)
|
void chg_callseq(c,cal,l_out)
|
||||||
call_p c;
|
call_p c;
|
||||||
line_p cal,*l_out;
|
line_p cal,*l_out;
|
||||||
{
|
{
|
||||||
|
@ -237,7 +237,7 @@ STATIC void act_info(off,acts,ab_off,act_out,off_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC store_off(off,l)
|
STATIC void store_off(off,l)
|
||||||
offset off;
|
offset off;
|
||||||
line_p l;
|
line_p l;
|
||||||
{
|
{
|
||||||
|
@ -251,7 +251,7 @@ STATIC store_off(off,l)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC inl_actual(l,expr)
|
STATIC void inl_actual(l,expr)
|
||||||
line_p l, expr;
|
line_p l, expr;
|
||||||
{
|
{
|
||||||
/* Expand an actual parameter in line.
|
/* Expand an actual parameter in line.
|
||||||
|
@ -281,7 +281,7 @@ STATIC inl_actual(l,expr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC localref(l,c,ab_off,lb_off)
|
STATIC void localref(l,c,ab_off,lb_off)
|
||||||
line_p l;
|
line_p l;
|
||||||
call_p c;
|
call_p c;
|
||||||
offset ab_off, lb_off;
|
offset ab_off, lb_off;
|
||||||
|
@ -311,7 +311,7 @@ STATIC localref(l,c,ab_off,lb_off)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC chg_mes(l,c,ab_off,lb_off)
|
STATIC void chg_mes(l,c,ab_off,lb_off)
|
||||||
line_p l;
|
line_p l;
|
||||||
call_p c;
|
call_p c;
|
||||||
offset ab_off, lb_off;
|
offset ab_off, lb_off;
|
||||||
|
@ -355,7 +355,7 @@ STATIC chg_mes(l,c,ab_off,lb_off)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC chg_ret(l,c,lab)
|
STATIC void chg_ret(l,c,lab)
|
||||||
line_p l,lab;
|
line_p l,lab;
|
||||||
call_p c;
|
call_p c;
|
||||||
{
|
{
|
||||||
|
@ -379,7 +379,7 @@ STATIC chg_ret(l,c,lab)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC mod_instr(l,c,lab,ab_off,lb_off,lab_off)
|
STATIC void mod_instr(l,c,lab,ab_off,lb_off,lab_off)
|
||||||
line_p l,lab;
|
line_p l,lab;
|
||||||
call_p c;
|
call_p c;
|
||||||
offset ab_off,lb_off;
|
offset ab_off,lb_off;
|
||||||
|
@ -421,7 +421,7 @@ STATIC mod_instr(l,c,lab,ab_off,lb_off,lab_off)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
modify(text,c,lab,ab_off,lb_off,lab_off)
|
void modify(text,c,lab,ab_off,lb_off,lab_off)
|
||||||
line_p text,lab;
|
line_p text,lab;
|
||||||
call_p c;
|
call_p c;
|
||||||
offset ab_off,lb_off;
|
offset ab_off,lb_off;
|
||||||
|
@ -453,7 +453,7 @@ modify(text,c,lab,ab_off,lb_off,lab_off)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mod_actuals(nc,c,lab,ab_off,lb_off,lab_off)
|
void mod_actuals(nc,c,lab,ab_off,lb_off,lab_off)
|
||||||
call_p nc,c;
|
call_p nc,c;
|
||||||
line_p lab;
|
line_p lab;
|
||||||
offset ab_off,lb_off;
|
offset ab_off,lb_off;
|
||||||
|
@ -534,7 +534,7 @@ insert(text,l,firstline)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
liquidate(p,text)
|
void liquidate(p,text)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
line_p text;
|
line_p text;
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern chg_callseq(); /* (call_p c; line_p cal, *l_out)
|
void chg_callseq(call_p c, line_p cal, line_p *l_out);
|
||||||
|
/*
|
||||||
* Change the calling sequence of
|
* Change the calling sequence of
|
||||||
* the call c. The parameters are
|
* the call c. The parameters are
|
||||||
* changed and the sequence
|
* changed and the sequence
|
||||||
|
@ -19,28 +20,33 @@ extern chg_callseq(); /* (call_p c; line_p cal, *l_out)
|
||||||
* text of the called routine must
|
* text of the called routine must
|
||||||
* be put.
|
* be put.
|
||||||
*/
|
*/
|
||||||
extern line_p make_label(); /* (line_p l; proc_p p)
|
line_p make_label(line_p l, proc_p p);
|
||||||
|
/*
|
||||||
* Make sure that the instruction after
|
* Make sure that the instruction after
|
||||||
* l contains a label. If this is not
|
* l contains a label. If this is not
|
||||||
* already the case, create a new label.
|
* already the case, create a new label.
|
||||||
*/
|
*/
|
||||||
extern modify(); /* (line_p text; call_p c; line_p lab;
|
void modify(line_p text, call_p c, line_p lab, offset ab_off,
|
||||||
* offset ab_off, lb_off; int lab_off)
|
offset lb_off, int lab_off);
|
||||||
|
/*
|
||||||
* Modify the EM text of the called
|
* Modify the EM text of the called
|
||||||
* procedure.
|
* procedure.
|
||||||
*/
|
*/
|
||||||
extern mod_actuals(); /* (call_p nc,c; line_p lab;
|
void mod_actuals(call_p nc, call_p c, line_p lab, offset ab_off,
|
||||||
* offset ab_off, lb_off; int lab_off)
|
offset lb_off, int lab_off);
|
||||||
|
/*
|
||||||
* Modify the actual parameters of the
|
* Modify the actual parameters of the
|
||||||
* call nc the same way as the text of
|
* call nc the same way as the text of
|
||||||
* call c would be modified.
|
* call c would be modified.
|
||||||
*/
|
*/
|
||||||
extern void insert(); /* (line_p text,l,firstline)
|
void insert(line_p text, line_p l, line_p firstline);
|
||||||
|
/*
|
||||||
* Insert the modified EM text.
|
* Insert the modified EM text.
|
||||||
* Pseudos are put after the pseudos
|
* Pseudos are put after the pseudos
|
||||||
* of the caller.
|
* of the caller.
|
||||||
*/
|
*/
|
||||||
extern liquidate(); /* (proc_p p; line_p text)
|
void liquidate(proc_p p, line_p text);
|
||||||
|
/*
|
||||||
* All calls to p were expanded in line,
|
* All calls to p were expanded in line,
|
||||||
* so p is no longer needed.
|
* so p is no longer needed.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -47,9 +47,7 @@ STATIC line_p fetch_text(lf,c)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
line_p scan_to_cal(lines,n)
|
line_p scan_to_cal(line_p lines, short n)
|
||||||
line_p lines;
|
|
||||||
short n;
|
|
||||||
{
|
{
|
||||||
/* Find the n-th CAL instruction */
|
/* Find the n-th CAL instruction */
|
||||||
|
|
||||||
|
@ -65,7 +63,7 @@ line_p scan_to_cal(lines,n)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
substitute(lf,c,cal,firstline)
|
void substitute(lf,c,cal,firstline)
|
||||||
FILE *lf;
|
FILE *lf;
|
||||||
call_p c;
|
call_p c;
|
||||||
line_p cal,firstline;
|
line_p cal,firstline;
|
||||||
|
|
|
@ -9,10 +9,12 @@
|
||||||
* I L 3 _ S U B S T . H
|
* I L 3 _ S U B S T . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern line_p scan_to_cal(); /* (line_p lines; short n)
|
line_p scan_to_cal(line_p lines, short n);
|
||||||
|
/*
|
||||||
* Find the n-th cal instruction.
|
* Find the n-th cal instruction.
|
||||||
*/
|
*/
|
||||||
extern substitute(); /* (FILE *lf;call_p c; line_ pcal,firstline)
|
void substitute(FILE *lf, call_p c, line_p cal, line_p firstline);
|
||||||
|
/*
|
||||||
* Perform in line substitution of the call described
|
* Perform in line substitution of the call described
|
||||||
* by c. The EM text of the called routine is fetched
|
* by c. The EM text of the called routine is fetched
|
||||||
* and modified, the calling sequence is changed,
|
* and modified, the calling sequence is changed,
|
||||||
|
|
|
@ -106,7 +106,7 @@ line_p copy_expr(l1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rem_call(c)
|
void rem_call(c)
|
||||||
call_p c;
|
call_p c;
|
||||||
{
|
{
|
||||||
actual_p act, nexta;
|
actual_p act, nexta;
|
||||||
|
@ -132,7 +132,7 @@ rem_call(c)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* rem_graph */
|
/* remunit */
|
||||||
|
|
||||||
STATIC short remlines(l)
|
STATIC short remlines(l)
|
||||||
line_p l;
|
line_p l;
|
||||||
|
@ -149,11 +149,7 @@ STATIC short remlines(l)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void remunit(short kind, proc_p p, line_p l)
|
||||||
remunit(kind,p,l)
|
|
||||||
short kind;
|
|
||||||
proc_p p;
|
|
||||||
line_p l;
|
|
||||||
{
|
{
|
||||||
register bblock_p b;
|
register bblock_p b;
|
||||||
bblock_p next;
|
bblock_p next;
|
||||||
|
@ -176,12 +172,13 @@ remunit(kind,p,l)
|
||||||
oldloop(Lelem(pi));
|
oldloop(Lelem(pi));
|
||||||
}
|
}
|
||||||
Ldeleteset(p->p_loops);
|
Ldeleteset(p->p_loops);
|
||||||
oldmap(lmap,llength);
|
oldmap((void **) lmap,llength);
|
||||||
oldmap(lbmap,llength);
|
oldmap((void **) lbmap,llength);
|
||||||
oldmap(bmap,blength);
|
oldmap((void **) bmap,blength);
|
||||||
oldmap(lpmap,lplength);
|
oldmap((void **) lpmap,lplength);
|
||||||
}
|
}
|
||||||
remcc(head)
|
|
||||||
|
void remcc(head)
|
||||||
calcnt_p head;
|
calcnt_p head;
|
||||||
{
|
{
|
||||||
calcnt_p cc, next;
|
calcnt_p cc, next;
|
||||||
|
@ -271,8 +268,8 @@ line_p get_text(lf,p_out)
|
||||||
* and labels to basic blocks are not used.
|
* and labels to basic blocks are not used.
|
||||||
*/
|
*/
|
||||||
if (*p_out != (proc_p) 0) {
|
if (*p_out != (proc_p) 0) {
|
||||||
oldmap(lmap,llength);
|
oldmap((void **) lmap,llength);
|
||||||
oldmap(lbmap,llength);
|
oldmap((void **) lbmap,llength);
|
||||||
lmap = oldlmap;
|
lmap = oldlmap;
|
||||||
lpmap = oldlpmap;
|
lpmap = oldlpmap;
|
||||||
}
|
}
|
||||||
|
@ -309,7 +306,7 @@ calcnt_p getcc(ccf,p)
|
||||||
/* The following routines are only used by the Inline Substitution phase */
|
/* The following routines are only used by the Inline Substitution phase */
|
||||||
|
|
||||||
|
|
||||||
STATIC putactuals(alist,cfile)
|
STATIC void putactuals(alist,cfile)
|
||||||
actual_p alist;
|
actual_p alist;
|
||||||
FILE *cfile;
|
FILE *cfile;
|
||||||
{
|
{
|
||||||
|
@ -336,10 +333,7 @@ STATIC putactuals(alist,cfile)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
putcall(c,cfile,level)
|
void putcall(call_p c, FILE *cfile, short level)
|
||||||
call_p c;
|
|
||||||
FILE *cfile;
|
|
||||||
short level;
|
|
||||||
{
|
{
|
||||||
/* output a call */
|
/* output a call */
|
||||||
|
|
||||||
|
|
|
@ -9,50 +9,57 @@
|
||||||
* I L _ A U X . H
|
* I L _ A U X . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int tsize(); /* (int type)
|
#include <stdio.h> /* FILE */
|
||||||
|
|
||||||
|
int tsize(int type); /*
|
||||||
* Determine the size of a variable of
|
* Determine the size of a variable of
|
||||||
* the given type.
|
* the given type.
|
||||||
*/
|
*/
|
||||||
extern line_p duplicate(); /* (line_p lnp)
|
line_p duplicate(line_p lnp); /*
|
||||||
* Make a duplicate of the given EM
|
* Make a duplicate of the given EM
|
||||||
* instruction. Pseudos may not be
|
* instruction. Pseudos may not be
|
||||||
* passed as argumnets.
|
* passed as argumnets.
|
||||||
*/
|
*/
|
||||||
extern line_p copy_expr(); /* (line_p l1)
|
line_p copy_expr(line_p l1); /*
|
||||||
* copy the expression l1.
|
* copy the expression l1.
|
||||||
* Pseudos may not be contained in
|
* Pseudos may not be contained in
|
||||||
* the list of instructions.
|
* the list of instructions.
|
||||||
*/
|
*/
|
||||||
extern rem_call(); /* (call_p c)
|
void rem_call(call_p c); /*
|
||||||
* Remove a call from main memory.
|
* Remove a call from main memory.
|
||||||
*/
|
*/
|
||||||
extern rem_graph(); /* (proc_p p)
|
void remunit(short kind, proc_p p, line_p l);
|
||||||
|
/*
|
||||||
* Remove the CFG and EM text of
|
* Remove the CFG and EM text of
|
||||||
* a procedure from core.
|
* a procedure from core.
|
||||||
*/
|
*/
|
||||||
extern remcc(); /* (calcnt_p head)
|
void remcc(calcnt_p head); /*
|
||||||
* Remove call-count info from core.
|
* Remove call-count info from core.
|
||||||
*/
|
*/
|
||||||
extern call_p getcall(); /* (FILE *cf)
|
call_p getcall(FILE *cf); /*
|
||||||
* Read a call from the call-file
|
* Read a call from the call-file
|
||||||
*/
|
*/
|
||||||
extern line_p get_text(); /* (FILE *lf; proc_p *p_out)
|
line_p get_text(FILE *lf, proc_p *p_out);
|
||||||
|
/*
|
||||||
* Read the EM text of one procedure.
|
* Read the EM text of one procedure.
|
||||||
* The procedure read is returned via
|
* The procedure read is returned via
|
||||||
* p_out.
|
* p_out.
|
||||||
*/
|
*/
|
||||||
extern calcnt_p getcc(); /* (FILE *ccf; proc_p p)
|
calcnt_p getcc(FILE *ccf, proc_p p);
|
||||||
|
/*
|
||||||
* Read the call-count information
|
* Read the call-count information
|
||||||
* of procedure p.
|
* of procedure p.
|
||||||
*/
|
*/
|
||||||
extern putcall(); /* (call_p call; FILE *cfile; short level)
|
void putcall(call_p call, FILE *cfile, short level);
|
||||||
|
/*
|
||||||
* Write the call
|
* Write the call
|
||||||
* with the given id to the given file.
|
* with the given id to the given file.
|
||||||
* The level is the nesting level, used by
|
* The level is the nesting level, used by
|
||||||
* putcall when it calls itself recurively.
|
* putcall when it calls itself recurively.
|
||||||
* It should be 0 on outer levels.
|
* It should be 0 on outer levels.
|
||||||
*/
|
*/
|
||||||
extern long putcc(); /* (calcnt_p head; FILE *ccf)
|
long putcc(calcnt_p head, FILE *ccf);
|
||||||
|
/*
|
||||||
* Write call-count information to
|
* Write call-count information to
|
||||||
* file ccf.
|
* file ccf.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -41,16 +41,16 @@ short nrvars;
|
||||||
STATIC int Slv;
|
STATIC int Slv;
|
||||||
STATIC bool mesgflag = FALSE; /* Suppress generation of live/dead info */
|
STATIC bool mesgflag = FALSE; /* Suppress generation of live/dead info */
|
||||||
|
|
||||||
STATIC app_block();
|
STATIC void app_block();
|
||||||
|
|
||||||
STATIC clean_up()
|
STATIC void clean_up()
|
||||||
{
|
{
|
||||||
local_p *p;
|
local_p *p;
|
||||||
|
|
||||||
for (p = &locals[1]; p <= &locals[nrlocals]; p++) {
|
for (p = &locals[1]; p <= &locals[nrlocals]; p++) {
|
||||||
oldlocal(*p);
|
oldlocal(*p);
|
||||||
}
|
}
|
||||||
oldmap(locals,nrlocals);
|
oldmap((void **) locals,nrlocals);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ STATIC bool is_def(l)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC def_use(p)
|
STATIC void def_use(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Compute DEF(b) and USE(b), for every basic block b
|
/* Compute DEF(b) and USE(b), for every basic block b
|
||||||
|
@ -200,7 +200,7 @@ STATIC def_use(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC unite_ins(bbset,setp)
|
STATIC void unite_ins(bbset,setp)
|
||||||
lset bbset;
|
lset bbset;
|
||||||
cset *setp;
|
cset *setp;
|
||||||
{
|
{
|
||||||
|
@ -218,7 +218,7 @@ STATIC unite_ins(bbset,setp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC solve_lv(p)
|
STATIC void solve_lv(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Solve the data flow equations for Live Variables,
|
/* Solve the data flow equations for Live Variables,
|
||||||
|
@ -254,7 +254,7 @@ STATIC solve_lv(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC live_variables_analysis(p)
|
STATIC void live_variables_analysis(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
make_localtab(p);
|
make_localtab(p);
|
||||||
|
@ -264,7 +264,7 @@ STATIC live_variables_analysis(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC init_live_dead(b)
|
STATIC void init_live_dead(b)
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
/* For every register variable, see if it is
|
/* For every register variable, see if it is
|
||||||
|
@ -313,7 +313,7 @@ STATIC line_p make_mesg(mesg,loc)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC block_entry(b,prev)
|
STATIC void block_entry(b,prev)
|
||||||
bblock_p b,prev;
|
bblock_p b,prev;
|
||||||
{
|
{
|
||||||
short v,vn;
|
short v,vn;
|
||||||
|
@ -345,7 +345,7 @@ STATIC block_entry(b,prev)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC app_block(l,b)
|
STATIC void app_block(l,b)
|
||||||
line_p l;
|
line_p l;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
@ -369,7 +369,7 @@ STATIC app_block(l,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC definition(l,useless_out,v_out,mesgflag)
|
STATIC void definition(l,useless_out,v_out,mesgflag)
|
||||||
line_p l;
|
line_p l;
|
||||||
bool *useless_out;
|
bool *useless_out;
|
||||||
short *v_out;
|
short *v_out;
|
||||||
|
@ -420,7 +420,7 @@ STATIC definition(l,useless_out,v_out,mesgflag)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC use(l,mesgflag)
|
STATIC void use(l,mesgflag)
|
||||||
line_p l;
|
line_p l;
|
||||||
bool mesgflag;
|
bool mesgflag;
|
||||||
{
|
{
|
||||||
|
@ -451,7 +451,7 @@ STATIC use(l,mesgflag)
|
||||||
STATIC void nothing(line_p l1, line_p l2, offset size)
|
STATIC void nothing(line_p l1, line_p l2, offset size)
|
||||||
{ } /* No action to be undertaken at level 0 of parser */
|
{ } /* No action to be undertaken at level 0 of parser */
|
||||||
|
|
||||||
STATIC rem_code(l1,l2,b)
|
STATIC void rem_code(l1,l2,b)
|
||||||
line_p l1,l2;
|
line_p l1,l2;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
@ -481,9 +481,7 @@ STATIC rem_code(l1,l2,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
lv_mesg(p,mesgflag)
|
STATIC void lv_mesg(proc_p p, bool mesgflag)
|
||||||
proc_p p;
|
|
||||||
bool mesgflag;
|
|
||||||
{
|
{
|
||||||
/* Create live/dead messages for every possible register
|
/* Create live/dead messages for every possible register
|
||||||
* variable of p. A dead-message is put after a "use" of
|
* variable of p. A dead-message is put after a "use" of
|
||||||
|
@ -553,8 +551,7 @@ OUTVERBOSE("useless assignment ,proc %d,local %d", curproc->p_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC lv_extend(p)
|
STATIC void lv_extend(proc_p p)
|
||||||
proc_p p;
|
|
||||||
{
|
{
|
||||||
/* Allocate extended data structures for Use Definition analysis */
|
/* Allocate extended data structures for Use Definition analysis */
|
||||||
|
|
||||||
|
@ -566,8 +563,7 @@ STATIC lv_extend(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC lv_cleanup(p)
|
STATIC void lv_cleanup(proc_p p)
|
||||||
proc_p p;
|
|
||||||
{
|
{
|
||||||
/* Deallocate extended data structures for Use Definition analysis */
|
/* Deallocate extended data structures for Use Definition analysis */
|
||||||
|
|
||||||
|
@ -610,7 +606,7 @@ void lv_optimize(void *vp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,6 +24,7 @@ cprogram {
|
||||||
"modules/src/em_data+lib",
|
"modules/src/em_data+lib",
|
||||||
"h+emheaders",
|
"h+emheaders",
|
||||||
"+itemtab_h",
|
"+itemtab_h",
|
||||||
|
"./ra*.h",
|
||||||
},
|
},
|
||||||
vars = {
|
vars = {
|
||||||
["+cflags"] = {"-DVERBOSE", "-DNOTCOMPACT"}
|
["+cflags"] = {"-DVERBOSE", "-DNOTCOMPACT"}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "../share/files.h"
|
#include "../share/files.h"
|
||||||
#include "../share/get.h"
|
#include "../share/get.h"
|
||||||
#include "../share/put.h"
|
#include "../share/put.h"
|
||||||
|
#include "../share/cset.h"
|
||||||
#include "../share/lset.h"
|
#include "../share/lset.h"
|
||||||
#include "../share/map.h"
|
#include "../share/map.h"
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
|
@ -25,6 +26,7 @@
|
||||||
#include "ra.h"
|
#include "ra.h"
|
||||||
#include "ra_items.h"
|
#include "ra_items.h"
|
||||||
#include "ra_allocl.h"
|
#include "ra_allocl.h"
|
||||||
|
#include "ra_lifet.h"
|
||||||
#include "ra_profits.h"
|
#include "ra_profits.h"
|
||||||
#include "ra_pack.h"
|
#include "ra_pack.h"
|
||||||
#include "ra_xform.h"
|
#include "ra_xform.h"
|
||||||
|
@ -35,6 +37,8 @@
|
||||||
#define oldrabx(x) oldstruct(bext_ra,x)
|
#define oldrabx(x) oldstruct(bext_ra,x)
|
||||||
#define oldralpx(x) oldstruct(lpext_ra,x)
|
#define oldralpx(x) oldstruct(lpext_ra,x)
|
||||||
|
|
||||||
|
STATIC void stat_regusage(alloc_p list);
|
||||||
|
|
||||||
short alloc_id;
|
short alloc_id;
|
||||||
static item_p items[NRITEMTYPES];
|
static item_p items[NRITEMTYPES];
|
||||||
int nrinstrs;
|
int nrinstrs;
|
||||||
|
@ -72,7 +76,7 @@ STATIC cond_p getcondtab(f)
|
||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
get_atab(f,tab)
|
STATIC void get_atab(f,tab)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
cond_p tab[NRREGTYPES][NRREGTYPES];
|
cond_p tab[NRREGTYPES][NRREGTYPES];
|
||||||
{
|
{
|
||||||
|
@ -88,7 +92,7 @@ get_atab(f,tab)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
get_otab(f,tab)
|
STATIC void get_otab(f,tab)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
cond_p tab[NRREGTYPES];
|
cond_p tab[NRREGTYPES];
|
||||||
{
|
{
|
||||||
|
@ -155,7 +159,7 @@ STATIC bblock_p header(lp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC ra_extproc(p)
|
STATIC void ra_extproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Allocate the extended data structures for procedure p */
|
/* Allocate the extended data structures for procedure p */
|
||||||
|
@ -178,7 +182,7 @@ STATIC ra_extproc(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC ra_cleanproc(p)
|
STATIC void ra_cleanproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Allocate the extended data structures for procedure p */
|
/* Allocate the extended data structures for procedure p */
|
||||||
|
@ -199,7 +203,7 @@ STATIC ra_cleanproc(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC loop_blocks(p)
|
STATIC void loop_blocks(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Compute the LP_BLOCKS sets for all loops of p */
|
/* Compute the LP_BLOCKS sets for all loops of p */
|
||||||
|
@ -218,7 +222,7 @@ STATIC loop_blocks(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC make_instrmap(p,map)
|
STATIC void make_instrmap(p,map)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
line_p map[];
|
line_p map[];
|
||||||
{
|
{
|
||||||
|
@ -253,7 +257,7 @@ STATIC bool useful_item(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC cleantimeset(s)
|
STATIC void cleantimeset(s)
|
||||||
lset s;
|
lset s;
|
||||||
{
|
{
|
||||||
register Lindex i;
|
register Lindex i;
|
||||||
|
@ -300,7 +304,7 @@ STATIC item_p cat_items(items)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC clean_interval(list)
|
STATIC void clean_interval(list)
|
||||||
interv_p list;
|
interv_p list;
|
||||||
{
|
{
|
||||||
register interv_p x,next;
|
register interv_p x,next;
|
||||||
|
@ -313,7 +317,7 @@ STATIC clean_interval(list)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC clean_allocs(list)
|
STATIC void clean_allocs(list)
|
||||||
alloc_p list;
|
alloc_p list;
|
||||||
{
|
{
|
||||||
register alloc_p x,next;
|
register alloc_p x,next;
|
||||||
|
@ -331,7 +335,7 @@ STATIC clean_allocs(list)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC cleanitems(list)
|
STATIC void cleanitems(list)
|
||||||
item_p list;
|
item_p list;
|
||||||
{
|
{
|
||||||
register item_p x,next;
|
register item_p x,next;
|
||||||
|
@ -390,13 +394,13 @@ void ra_optimize(void *vp)
|
||||||
clean_allocs(unpacked);
|
clean_allocs(unpacked);
|
||||||
clean_allocs(packed);
|
clean_allocs(packed);
|
||||||
cleanitems(itemlist);
|
cleanitems(itemlist);
|
||||||
oldmap(instrmap,nrinstrs-1);
|
oldmap((void **) instrmap,nrinstrs-1);
|
||||||
ra_cleanproc(p);
|
ra_cleanproc(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
|
@ -430,6 +434,10 @@ char *str_regtypes[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All calls to print_items() and print_allocs() are in comments!
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
print_items(items,p)
|
print_items(items,p)
|
||||||
item_p items[];
|
item_p items[];
|
||||||
proc_p p;
|
proc_p p;
|
||||||
|
@ -510,10 +518,11 @@ print_allocs(list)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
short regs_needed[4];
|
STATIC short regs_needed[4];
|
||||||
stat_regusage(list)
|
STATIC void stat_regusage(list)
|
||||||
alloc_p list;
|
alloc_p list;
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -531,6 +540,10 @@ stat_regusage(list)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All calls to statistics() are in comments!
|
||||||
|
*/
|
||||||
|
#if 0
|
||||||
int cnt_regtypes[reg_float+1];
|
int cnt_regtypes[reg_float+1];
|
||||||
|
|
||||||
statistics(items)
|
statistics(items)
|
||||||
|
@ -557,3 +570,4 @@ statistics(items)
|
||||||
fprintf(stderr, "#%s = %d\n",str_regtypes[r],cnt_regtypes[r]);
|
fprintf(stderr, "#%s = %d\n",str_regtypes[r],cnt_regtypes[r]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include "ra_allocl.h"
|
#include "ra_allocl.h"
|
||||||
#include "ra_interv.h"
|
#include "ra_interv.h"
|
||||||
|
|
||||||
STATIC count_usage(p,item,nrloops,sloopcnt,dloopcnt)
|
STATIC void count_usage(p,item,nrloops,sloopcnt,dloopcnt)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
item_p item;
|
item_p item;
|
||||||
short nrloops, sloopcnt[], dloopcnt[];
|
short nrloops, sloopcnt[], dloopcnt[];
|
||||||
|
@ -92,7 +92,7 @@ STATIC alloc_p cons_alloc(item,timespan,stat_usecount,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC insert_alloc(alloc,list_p)
|
STATIC void insert_alloc(alloc,list_p)
|
||||||
alloc_p alloc, *list_p;
|
alloc_p alloc, *list_p;
|
||||||
{
|
{
|
||||||
alloc->al_next = *list_p;
|
alloc->al_next = *list_p;
|
||||||
|
@ -157,7 +157,7 @@ STATIC bblock_p init_point(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC add_blocks(b,s,span)
|
STATIC void add_blocks(b,s,span)
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
cset *s;
|
cset *s;
|
||||||
interv_p *span;
|
interv_p *span;
|
||||||
|
@ -176,7 +176,7 @@ STATIC add_blocks(b,s,span)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC whole_lifetime(item,ini_out,span_out)
|
STATIC void whole_lifetime(item,ini_out,span_out)
|
||||||
item_p item;
|
item_p item;
|
||||||
bblock_p *ini_out;
|
bblock_p *ini_out;
|
||||||
interv_p *span_out;
|
interv_p *span_out;
|
||||||
|
@ -267,12 +267,10 @@ STATIC short countuses(usage,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC allocs_of_item(p,item,loops,sloopcnt,dloopcnt,alloc_list_p)
|
STATIC void
|
||||||
proc_p p;
|
allocs_of_item(proc_p p, item_p item, lset loops,
|
||||||
item_p item;
|
short *sloopcnt, short *dloopcnt, /* dynamic arrays */
|
||||||
lset loops;
|
alloc_p *alloc_list_p)
|
||||||
short *sloopcnt,*dloopcnt; /* dynamic arrays */
|
|
||||||
alloc_p *alloc_list_p;
|
|
||||||
{
|
{
|
||||||
register Lindex li;
|
register Lindex li;
|
||||||
loop_p lp;
|
loop_p lp;
|
||||||
|
@ -328,10 +326,7 @@ STATIC allocs_of_item(p,item,loops,sloopcnt,dloopcnt,alloc_list_p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
alloc_p build_alloc_list(p,nrloops,itemlist)
|
alloc_p build_alloc_list(proc_p p, short nrloops, item_p itemlist)
|
||||||
proc_p p;
|
|
||||||
short nrloops;
|
|
||||||
item_p itemlist;
|
|
||||||
{
|
{
|
||||||
short *sloopcnt,*dloopcnt; /* dynamic arrays */
|
short *sloopcnt,*dloopcnt; /* dynamic arrays */
|
||||||
register item_p item;
|
register item_p item;
|
||||||
|
@ -351,7 +346,7 @@ alloc_p build_alloc_list(p,nrloops,itemlist)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
build_rivals_graph(alloclist)
|
void build_rivals_graph(alloclist)
|
||||||
alloc_p alloclist;
|
alloc_p alloclist;
|
||||||
{
|
{
|
||||||
/* See which allocations in the list are rivals of each other,
|
/* See which allocations in the list are rivals of each other,
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
* R A _ A L L O C L I S T . H
|
* R A _ A L L O C L I S T . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern alloc_p build_alloc_list(); /* (proc_p p; short nrloops;
|
alloc_p build_alloc_list(proc_p p, short nrloops, item_p itemlist);
|
||||||
* item_p itemlist)
|
/*
|
||||||
* Build a list of possible allocations
|
* Build a list of possible allocations
|
||||||
* for procedure p. An allocation
|
* for procedure p. An allocation
|
||||||
* essentially is a pair (item,timespan)
|
* essentially is a pair (item,timespan)
|
||||||
*/
|
*/
|
||||||
extern build_rivals_graph(); /* (alloc_p alloclist)
|
void build_rivals_graph(alloc_p alloclist);
|
||||||
/* See which allocations in the list are
|
/* See which allocations in the list are
|
||||||
* rivals of each other, i.e. there is
|
* rivals of each other, i.e. there is
|
||||||
* some point of time, falling in both
|
* some point of time, falling in both
|
||||||
|
|
|
@ -38,8 +38,7 @@ time_p cons_time(l,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
short loop_scale(lev)
|
short loop_scale(short lev)
|
||||||
short lev;
|
|
||||||
{
|
{
|
||||||
return (lev == 0 ? 1 : (lev > 3 ? 32 : 8 * lev));
|
return (lev == 0 ? 1 : (lev > 3 ? 32 : 8 * lev));
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
* register message of the local with
|
* register message of the local with
|
||||||
* the given offset.
|
* the given offset.
|
||||||
*/
|
*/
|
||||||
extern time_p cons_time(); /* (line_p l; bblock_p b)
|
time_p cons_time(line_p l, bblock_p b); /*
|
||||||
* Construct a 'time' record with
|
* Construct a 'time' record with
|
||||||
* fields 'l' and 'b'.
|
* fields 'l' and 'b'.
|
||||||
*/
|
*/
|
||||||
extern short loop_scale(); /* (short lev)
|
short loop_scale(short lev); /*
|
||||||
* Estimate how many times an item
|
* Estimate how many times an item
|
||||||
* appearing in a loop of nesting
|
* appearing in a loop of nesting
|
||||||
* level 'lev' will be used dynamically.
|
* level 'lev' will be used dynamically.
|
||||||
|
|
|
@ -19,8 +19,7 @@
|
||||||
#include "ra.h"
|
#include "ra.h"
|
||||||
#include "ra_interv.h"
|
#include "ra_interv.h"
|
||||||
|
|
||||||
interv_p cons_interval(t_start,t_stop)
|
interv_p cons_interval(short t_start, short t_stop)
|
||||||
short t_start,t_stop;
|
|
||||||
{
|
{
|
||||||
interv_p x;
|
interv_p x;
|
||||||
|
|
||||||
|
@ -32,9 +31,7 @@ interv_p cons_interval(t_start,t_stop)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
add_interval(t1,t2,list)
|
void add_interval(short t1, short t2, interv_p *list)
|
||||||
short t1,t2;
|
|
||||||
interv_p *list;
|
|
||||||
{
|
{
|
||||||
/* Add interval (t1,t2) to the list of intervals (which is
|
/* Add interval (t1,t2) to the list of intervals (which is
|
||||||
* an in-out parameter!). The list is sorted in 'chronological'
|
* an in-out parameter!). The list is sorted in 'chronological'
|
||||||
|
@ -116,7 +113,7 @@ interv_p proc_lifetime(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC set_min_max(iv1,iv2)
|
STATIC void set_min_max(iv1,iv2)
|
||||||
interv_p *iv1,*iv2;
|
interv_p *iv1,*iv2;
|
||||||
{
|
{
|
||||||
/* Auxiliary routine of intersect */
|
/* Auxiliary routine of intersect */
|
||||||
|
@ -201,9 +198,7 @@ bool not_disjoint(list1,list2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool contains(t,timespan)
|
bool contains(short t, interv_p timespan)
|
||||||
short t;
|
|
||||||
interv_p timespan;
|
|
||||||
{
|
{
|
||||||
register interv_p iv;
|
register interv_p iv;
|
||||||
|
|
||||||
|
|
|
@ -10,31 +10,39 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern interv_p cons_interval();/* (short t_start,t_stop)
|
interv_p cons_interval(short t_start, short t_stop);
|
||||||
|
/*
|
||||||
* construct an interval
|
* construct an interval
|
||||||
*/
|
*/
|
||||||
extern add_interval(); /* (short t1,t2; interv_p *list)
|
void add_interval(short t1, short t2, interv_p *list);
|
||||||
|
/*
|
||||||
* Add interval (t1,t2) to the list of
|
* Add interval (t1,t2) to the list of
|
||||||
* intervals (which is an in-out parameter!).
|
* intervals (which is an in-out parameter!).
|
||||||
*/
|
*/
|
||||||
extern interv_p loop_lifetime();/* (loop_p lp)
|
interv_p loop_lifetime(loop_p lp);
|
||||||
|
/*
|
||||||
* Determine the timespan of the loop,
|
* Determine the timespan of the loop,
|
||||||
* expressed as a list of intervals.
|
* expressed as a list of intervals.
|
||||||
*/
|
*/
|
||||||
extern interv_p proc_lifetime();/* (proc_p p)
|
interv_p proc_lifetime(proc_p p);
|
||||||
|
/*
|
||||||
* Determine the timespan of a procedure,
|
* Determine the timespan of a procedure,
|
||||||
* expressed as an interval.
|
* expressed as an interval.
|
||||||
*/
|
*/
|
||||||
extern interv_p intersect(); /* (interv_p list1,list2)
|
interv_p intersect(interv_p list1, interv_p list2);
|
||||||
|
/*
|
||||||
* Intersect two lifetimes, each denoted
|
* Intersect two lifetimes, each denoted
|
||||||
* by a list of intervals.
|
* by a list of intervals.
|
||||||
*/
|
*/
|
||||||
extern bool not_disjoint(); /* (interv_p list1,list2)
|
bool not_disjoint(interv_p list1, interv_p list2);
|
||||||
|
/*
|
||||||
* See if list1 and list2 do overlap somewhere.
|
* See if list1 and list2 do overlap somewhere.
|
||||||
*/
|
*/
|
||||||
extern bool contains(); /* (short t;interv_p timespan)
|
bool contains(short t, interv_p timespan);
|
||||||
|
/*
|
||||||
* See if t is part of the timespan.
|
* See if t is part of the timespan.
|
||||||
*/
|
*/
|
||||||
extern interv_p copy_timespan();/* (interv_p list)
|
interv_p copy_timespan(interv_p list);
|
||||||
|
/*
|
||||||
* Make a copy of the timespan.
|
* Make a copy of the timespan.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
/* prevent small constants from being put in a register */
|
/* prevent small constants from being put in a register */
|
||||||
|
|
||||||
|
|
||||||
clean_tab(items)
|
void clean_tab(items)
|
||||||
item_p items[];
|
item_p items[];
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
@ -85,7 +85,7 @@ item_p item_of(off,items)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fill_item(item,l)
|
void fill_item(item,l)
|
||||||
item_p item;
|
item_p item;
|
||||||
line_p l;
|
line_p l;
|
||||||
{
|
{
|
||||||
|
@ -238,7 +238,7 @@ STATIC short item_size(item)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC init_item(a,b)
|
STATIC void init_item(a,b)
|
||||||
item_p a,b;
|
item_p a,b;
|
||||||
{
|
{
|
||||||
a->it_type = b->it_type;
|
a->it_type = b->it_type;
|
||||||
|
@ -296,7 +296,7 @@ STATIC void add_item(item,t,items)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC add_usage(l,b,items)
|
STATIC void add_usage(l,b,items)
|
||||||
line_p l;
|
line_p l;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
item_p items[];
|
item_p items[];
|
||||||
|
@ -323,7 +323,7 @@ STATIC add_usage(l,b,items)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
build_itemlist(p,items,nrinstr_out)
|
void build_itemlist(p,items,nrinstr_out)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
item_p items[];
|
item_p items[];
|
||||||
int *nrinstr_out;
|
int *nrinstr_out;
|
||||||
|
@ -336,7 +336,7 @@ build_itemlist(p,items,nrinstr_out)
|
||||||
|
|
||||||
register line_p l;
|
register line_p l;
|
||||||
register bblock_p b;
|
register bblock_p b;
|
||||||
register cnt= 0;
|
register int cnt= 0;
|
||||||
|
|
||||||
clean_tab(items);
|
clean_tab(items);
|
||||||
for (b = p->p_start; b != (bblock_p) 0; b = b->b_next) {
|
for (b = p->p_start; b != (bblock_p) 0; b = b->b_next) {
|
||||||
|
|
|
@ -8,26 +8,30 @@
|
||||||
* R A _ I T E M S . H
|
* R A _ I T E M S . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern short item_type(); /* (line_p l)
|
short item_type(line_p l); /*
|
||||||
* Determine the type of item (constant,local
|
* Determine the type of item (constant,local
|
||||||
* variable etc.) accessed by l.
|
* variable etc.) accessed by l.
|
||||||
*/
|
*/
|
||||||
extern bool is_item(); /* (line_p l)
|
bool is_item(line_p l); /*
|
||||||
* See if l accesses an item
|
* See if l accesses an item
|
||||||
*/
|
*/
|
||||||
extern item_p item_of(); /* (offset off;item_p items)
|
item_p item_of(offset off, item_p items[]);
|
||||||
|
/*
|
||||||
* Determine the descriptor of the item
|
* Determine the descriptor of the item
|
||||||
* accessed by l; return 0 if not found
|
* accessed by l; return 0 if not found
|
||||||
*/
|
*/
|
||||||
extern fill_item(); /* (item_p item;line_p l)
|
void fill_item(item_p item, line_p l);
|
||||||
|
/*
|
||||||
* Compute the type and obj/off attributes
|
* Compute the type and obj/off attributes
|
||||||
* of the item accessed by l and put them
|
* of the item accessed by l and put them
|
||||||
* in the given item descriptor.
|
* in the given item descriptor.
|
||||||
*/
|
*/
|
||||||
extern bool same_item(); /* (item_p a,b)
|
bool same_item(item_p a, item_p b);
|
||||||
|
/*
|
||||||
* See if a and b are the same items.
|
* See if a and b are the same items.
|
||||||
*/
|
*/
|
||||||
extern build_itemlist(); /* (proc_p p;item_p items[]; int *nrinstr_out)
|
void build_itemlist(proc_p p, item_p items[], int *nrinstr_out);
|
||||||
|
/*
|
||||||
* Determine all items accessed by procedure p
|
* Determine all items accessed by procedure p
|
||||||
* and put them in the items lists. All items
|
* and put them in the items lists. All items
|
||||||
* of type T must be put in list items[T].
|
* of type T must be put in list items[T].
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "../share/alloc.h"
|
#include "../share/alloc.h"
|
||||||
#include "ra.h"
|
#include "ra.h"
|
||||||
#include "ra_aux.h"
|
#include "ra_aux.h"
|
||||||
|
#include "ra_interv.h"
|
||||||
#include "ra_items.h"
|
#include "ra_items.h"
|
||||||
#include "ra_lifet.h"
|
#include "ra_lifet.h"
|
||||||
|
|
||||||
|
@ -33,7 +34,7 @@
|
||||||
#define is_deadmsg(l) (INSTR(l) == ps_mes && aoff(ARG(l),0) == ms_ego && \
|
#define is_deadmsg(l) (INSTR(l) == ps_mes && aoff(ARG(l),0) == ms_ego && \
|
||||||
aoff(ARG(l),1) == ego_dead)
|
aoff(ARG(l),1) == ego_dead)
|
||||||
|
|
||||||
build_lifetimes(items)
|
void build_lifetimes(items)
|
||||||
item_p items[];
|
item_p items[];
|
||||||
{
|
{
|
||||||
/* compute the it_lives attribute of every item; this is
|
/* compute the it_lives attribute of every item; this is
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern build_lifetimes(); /* item_p items[];
|
void build_lifetimes(item_p items[]);
|
||||||
|
/*
|
||||||
* compute the it_lives attribute of every
|
* compute the it_lives attribute of every
|
||||||
* item; this is a list of intervals
|
* item; this is a list of intervals
|
||||||
* during which the item is live,
|
* during which the item is live,
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
#include "ra.h"
|
#include "ra.h"
|
||||||
#include "ra_aux.h"
|
#include "ra_aux.h"
|
||||||
#include "ra_interv.h"
|
#include "ra_interv.h"
|
||||||
|
#include "ra_pack.h"
|
||||||
|
#include "ra_profits.h"
|
||||||
|
|
||||||
|
|
||||||
short regs_occupied[NRREGTYPES]; /* #occupied registers for reg_pointer,
|
short regs_occupied[NRREGTYPES]; /* #occupied registers for reg_pointer,
|
||||||
|
@ -28,7 +30,7 @@ short regs_occupied[NRREGTYPES]; /* #occupied registers for reg_pointer,
|
||||||
*/
|
*/
|
||||||
#define reg_available(t) (regs_available[t] > regs_occupied[t])
|
#define reg_available(t) (regs_available[t] > regs_occupied[t])
|
||||||
|
|
||||||
STATIC initregcount()
|
STATIC void initregcount()
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
|
@ -47,9 +49,7 @@ STATIC alloc_p make_dummy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC bool fits_in(a,b,cont_item)
|
STATIC bool fits_in(alloc_p a, alloc_p b, bool *cont_item)
|
||||||
alloc_p a,b;
|
|
||||||
bool *cont_item;
|
|
||||||
{
|
{
|
||||||
/* See if allocation a can be assigned the same register as b.
|
/* See if allocation a can be assigned the same register as b.
|
||||||
* Both allocations should be of the same register-type.
|
* Both allocations should be of the same register-type.
|
||||||
|
@ -152,7 +152,7 @@ STATIC alloc_p choose_location(alloc,packed,p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC update_lists(alloc,unpacked,packed,fit)
|
STATIC void update_lists(alloc,unpacked,packed,fit)
|
||||||
alloc_p alloc,unpacked,packed,fit;
|
alloc_p alloc,unpacked,packed,fit;
|
||||||
{
|
{
|
||||||
/* 'alloc' has been granted a register; move it from the 'unpacked'
|
/* 'alloc' has been granted a register; move it from the 'unpacked'
|
||||||
|
@ -237,7 +237,7 @@ STATIC alloc_p best_cumprofits(list,x_out,prev_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC account_regsave(packed,unpacked)
|
STATIC void account_regsave(packed,unpacked)
|
||||||
alloc_p packed,unpacked;
|
alloc_p packed,unpacked;
|
||||||
{
|
{
|
||||||
/* After all packing has been done, we check for every allocated
|
/* After all packing has been done, we check for every allocated
|
||||||
|
@ -327,7 +327,7 @@ STATIC alloc_p find_prev(alloc,list)
|
||||||
* account_regsave from rejecting it.
|
* account_regsave from rejecting it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
STATIC repl_allocs(new,old,packed)
|
STATIC void repl_allocs(new,old,packed)
|
||||||
alloc_p new,old,packed;
|
alloc_p new,old,packed;
|
||||||
{
|
{
|
||||||
alloc_p x,next,prev,*p;
|
alloc_p x,next,prev,*p;
|
||||||
|
@ -356,7 +356,7 @@ STATIC repl_allocs(new,old,packed)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC assemble_allocs(packed)
|
STATIC void assemble_allocs(packed)
|
||||||
alloc_p packed;
|
alloc_p packed;
|
||||||
{
|
{
|
||||||
register alloc_p x,m,next;
|
register alloc_p x,m,next;
|
||||||
|
@ -377,10 +377,8 @@ STATIC assemble_allocs(packed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pack(alloclist,time_opt,packed_out,not_packed_out,p)
|
void pack(alloc_p alloclist, bool time_opt, alloc_p *packed_out,
|
||||||
alloc_p alloclist, *packed_out,*not_packed_out;
|
alloc_p *not_packed_out, proc_p p)
|
||||||
bool time_opt;
|
|
||||||
proc_p p;
|
|
||||||
{
|
{
|
||||||
/* This is the packing system. It decides which allations
|
/* This is the packing system. It decides which allations
|
||||||
* to grant a register.
|
* to grant a register.
|
||||||
|
|
|
@ -9,8 +9,9 @@
|
||||||
* R A _ P A C K . H
|
* R A _ P A C K . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern pack(); /* ( alloc_p alloclist, *packed_out,*not_packed_out;
|
void pack(alloc_p alloclist, bool time_opt, alloc_p *packed_out,
|
||||||
* bool time_opt; proc_p p)
|
alloc_p *not_packed_out, proc_p p);
|
||||||
|
/*
|
||||||
* This is the packing system. It decides which
|
* This is the packing system. It decides which
|
||||||
* allations to grant a register.
|
* allations to grant a register.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -18,9 +18,7 @@
|
||||||
#include "ra_aux.h"
|
#include "ra_aux.h"
|
||||||
#include "ra_profits.h"
|
#include "ra_profits.h"
|
||||||
|
|
||||||
STATIC bool test_cond(cond,val)
|
STATIC bool test_cond(short cond, offset val)
|
||||||
short cond;
|
|
||||||
offset val;
|
|
||||||
{
|
{
|
||||||
switch(cond) {
|
switch(cond) {
|
||||||
case DEFAULT:
|
case DEFAULT:
|
||||||
|
@ -34,10 +32,7 @@ STATIC bool test_cond(cond,val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC short map_value(tab,val,time)
|
STATIC short map_value(struct cond_tab tab[], offset val, bool time)
|
||||||
struct cond_tab tab[];
|
|
||||||
offset val;
|
|
||||||
bool time;
|
|
||||||
{
|
{
|
||||||
cond_p p;
|
cond_p p;
|
||||||
|
|
||||||
|
@ -49,10 +44,7 @@ STATIC short map_value(tab,val,time)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC short index_value(tab,n,time)
|
STATIC short index_value(struct cond_tab tab[], short n, bool time)
|
||||||
struct cond_tab tab[];
|
|
||||||
short n;
|
|
||||||
bool time;
|
|
||||||
{
|
{
|
||||||
cond_p p;
|
cond_p p;
|
||||||
|
|
||||||
|
@ -61,16 +53,15 @@ STATIC short index_value(tab,n,time)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
allocscore(itemtyp,localtyp,size,off,totyp,time_out,space_out)
|
STATIC void
|
||||||
short itemtyp, localtyp,totyp,size;
|
allocscore(short itemtyp, short localtyp, short size, offset off,
|
||||||
offset off;
|
short totyp, short *time_out, short *space_out)
|
||||||
short *time_out, *space_out;
|
|
||||||
{
|
{
|
||||||
cond_p m = (cond_p) 0;
|
cond_p m = (cond_p) 0;
|
||||||
|
|
||||||
if (localtyp == reg_loop) localtyp = reg_any;
|
if (localtyp == reg_loop) localtyp = reg_any;
|
||||||
if (size == ws || size == ps && totyp == reg_pointer ||
|
if (size == ws || (size == ps && totyp == reg_pointer) ||
|
||||||
size == 2 * ws && totyp == reg_float) {
|
(size == 2 * ws && totyp == reg_float)) {
|
||||||
switch(itemtyp) {
|
switch(itemtyp) {
|
||||||
case LOCALVAR:
|
case LOCALVAR:
|
||||||
m = alocaltab[localtyp][totyp];
|
m = alocaltab[localtyp][totyp];
|
||||||
|
@ -103,10 +94,9 @@ allocscore(itemtyp,localtyp,size,off,totyp,time_out,space_out)
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
opening_cost(itemtyp,localtyp,off,time_out,space_out)
|
STATIC void
|
||||||
short itemtyp, localtyp;
|
opening_cost(short itemtyp, short localtyp, offset off,
|
||||||
offset off;
|
short *time_out, short *space_out)
|
||||||
short *time_out, *space_out;
|
|
||||||
{
|
{
|
||||||
cond_p m;
|
cond_p m;
|
||||||
|
|
||||||
|
@ -142,8 +132,7 @@ opening_cost(itemtyp,localtyp,off,time_out,space_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
regsave_cost(regs,time_out,space_out)
|
void regsave_cost(short regs[], short *time_out, short *space_out)
|
||||||
short regs[], *time_out, *space_out;
|
|
||||||
{
|
{
|
||||||
/* Estimate the costs of saving and restoring the registers
|
/* Estimate the costs of saving and restoring the registers
|
||||||
* The array regs contains the number of registers of every
|
* The array regs contains the number of registers of every
|
||||||
|
@ -178,9 +167,7 @@ STATIC short dyn_inits(inits)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
compute_profits(alloclist,time_opt)
|
void compute_profits(alloc_p alloclist, bool time_opt)
|
||||||
alloc_p alloclist;
|
|
||||||
bool time_opt;
|
|
||||||
{
|
{
|
||||||
/* Compute the profits attribute of every allocation.
|
/* Compute the profits attribute of every allocation.
|
||||||
* If the item of an allocation may be put in several types
|
* If the item of an allocation may be put in several types
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
* R A _ P R O F I T S . H
|
* R A _ P R O F I T S . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern compute_profits();/* (alloc_p alloclist)
|
void compute_profits(alloc_p alloclist, bool time_opt);
|
||||||
|
/*
|
||||||
* Compute the profits attribute of every allocation.
|
* Compute the profits attribute of every allocation.
|
||||||
*/
|
*/
|
||||||
extern regsave_cost(); /* (short regs[], *time_out, *space_out)
|
void regsave_cost(short regs[], short *time_out, short *space_out);
|
||||||
*/
|
|
||||||
|
|
|
@ -77,8 +77,7 @@ struct repl repl_tab[NRREPLACEMENTS][REPL_LENGTH] = {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
init_replacements(psize,wsize)
|
void init_replacements(short psize, short wsize)
|
||||||
short psize,wsize;
|
|
||||||
{
|
{
|
||||||
/* The replacement code to be generated depends on the
|
/* The replacement code to be generated depends on the
|
||||||
* wordsize and pointer size of the target machine.
|
* wordsize and pointer size of the target machine.
|
||||||
|
@ -137,9 +136,7 @@ STATIC int repl_index(l)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC bool is_current(alloc,t)
|
STATIC bool is_current(alloc_p alloc, short t)
|
||||||
alloc_p alloc;
|
|
||||||
short t;
|
|
||||||
{
|
{
|
||||||
/* Is time t part of alloc's timespan? */
|
/* Is time t part of alloc's timespan? */
|
||||||
|
|
||||||
|
@ -147,7 +144,7 @@ STATIC bool is_current(alloc,t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC match_item(item,l)
|
STATIC bool match_item(item,l)
|
||||||
item_p item;
|
item_p item;
|
||||||
line_p l;
|
line_p l;
|
||||||
{
|
{
|
||||||
|
@ -188,7 +185,7 @@ STATIC alloc_p find_alloc(alloclist,l,t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC replace_line(l,b,list)
|
STATIC void replace_line(l,b,list)
|
||||||
line_p l,list;
|
line_p l,list;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
@ -245,7 +242,7 @@ STATIC line_p repl_code(lnp,regnr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC apply_alloc(b,l,alloc)
|
STATIC void apply_alloc(b,l,alloc)
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
line_p l;
|
line_p l;
|
||||||
alloc_p alloc;
|
alloc_p alloc;
|
||||||
|
@ -355,7 +352,7 @@ STATIC line_p init_place(b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC append_code(l1,l2,b)
|
STATIC void append_code(l1,l2,b)
|
||||||
line_p l1,l2;
|
line_p l1,l2;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
@ -380,7 +377,7 @@ STATIC append_code(l1,l2,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC emit_init_code(list)
|
STATIC void emit_init_code(list)
|
||||||
alloc_p list;
|
alloc_p list;
|
||||||
{
|
{
|
||||||
/* Emit initialization code for all packed allocations.
|
/* Emit initialization code for all packed allocations.
|
||||||
|
@ -409,7 +406,7 @@ STATIC emit_init_code(list)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC emit_mesregs(p,alloclist)
|
STATIC void emit_mesregs(p,alloclist)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
alloc_p alloclist;
|
alloc_p alloclist;
|
||||||
{
|
{
|
||||||
|
@ -432,7 +429,7 @@ STATIC emit_mesregs(p,alloclist)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rem_mes(p)
|
STATIC void rem_mes(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
register bblock_p b;
|
register bblock_p b;
|
||||||
|
@ -455,11 +452,8 @@ rem_mes(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
xform_proc(p,alloclist,nrinstrs,instrmap)
|
void
|
||||||
proc_p p;
|
xform_proc(proc_p p, alloc_p alloclist, short nrinstrs, line_p instrmap[])
|
||||||
alloc_p alloclist;
|
|
||||||
short nrinstrs;
|
|
||||||
line_p instrmap[];
|
|
||||||
{
|
{
|
||||||
/* Transform every instruction of procedure p that uses an item
|
/* Transform every instruction of procedure p that uses an item
|
||||||
* at a point where the item is kept in a register.
|
* at a point where the item is kept in a register.
|
||||||
|
@ -498,10 +492,7 @@ xform_proc(p,alloclist,nrinstrs,instrmap)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool always_in_reg(off,allocs,size_out)
|
bool always_in_reg(offset off, alloc_p allocs, short *size_out)
|
||||||
offset off;
|
|
||||||
alloc_p allocs;
|
|
||||||
short *size_out;
|
|
||||||
{
|
{
|
||||||
/* See if the local variable with the given offset is stored
|
/* See if the local variable with the given offset is stored
|
||||||
* in a register during its entire lifetime. As a side effect,
|
* in a register during its entire lifetime. As a side effect,
|
||||||
|
@ -526,7 +517,7 @@ bool always_in_reg(off,allocs,size_out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rem_locals(p,allocs)
|
void rem_locals(p,allocs)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
alloc_p allocs;
|
alloc_p allocs;
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,21 +9,35 @@
|
||||||
* R A _ X F O R M . H
|
* R A _ X F O R M . H
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern init_replacements(); /* (short psize,wsize)
|
void init_replacements(short psize, short wsize);
|
||||||
|
/*
|
||||||
* This routine must be called once, before
|
* This routine must be called once, before
|
||||||
* any call to xform_proc. It initializes
|
* any call to xform_proc. It initializes
|
||||||
* a machine dependent table.
|
* a machine dependent table.
|
||||||
*/
|
*/
|
||||||
extern xform_proc(); /* (proc_p p; alloc_p alloclist;
|
void xform_proc(proc_p p, alloc_p alloclist, short nrinstrs,
|
||||||
* short nrinstrs; line_p instrmap[])
|
line_p instrmap[]);
|
||||||
|
/*
|
||||||
* Transform a procedure. Alloclist must
|
* Transform a procedure. Alloclist must
|
||||||
* contain the packed allocations (i.e. those
|
* contain the packed allocations (i.e. those
|
||||||
* allocations that are assigned a register).
|
* allocations that are assigned a register).
|
||||||
*/
|
*/
|
||||||
bool always_in_reg(); /* ( offset off; alloc_p allocs;
|
bool always_in_reg(offset off, alloc_p allocs, short *size_out);
|
||||||
* short *size_out;)
|
/*
|
||||||
* See if the local variable with the given
|
* See if the local variable with the given
|
||||||
* offset is stored in a register during its
|
* offset is stored in a register during its
|
||||||
* entire lifetime. As a side effect,
|
* entire lifetime. As a side effect,
|
||||||
* return the size of the local.
|
* return the size of the local.
|
||||||
*/
|
*/
|
||||||
|
void rem_locals(proc_p p, alloc_p allocs);
|
||||||
|
/*
|
||||||
|
* Try to decrease the number of locals of
|
||||||
|
* procedure p, by looking at which locals
|
||||||
|
* are always stored in a register.
|
||||||
|
*/
|
||||||
|
void rem_formals(proc_p p, alloc_p allocs);
|
||||||
|
/*
|
||||||
|
* Try to decrease the number of formals of
|
||||||
|
* procedure p, by looking at which formals
|
||||||
|
* are always stored in a register.
|
||||||
|
*/
|
||||||
|
|
|
@ -184,12 +184,12 @@ void olddblock(dblock_p dbl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
short **newmap(short length) {
|
void **newmap(short length) {
|
||||||
return((short **) newcore((length+1) * sizeof(short *)));
|
return(newcore((length+1) * sizeof(short *)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*ARGSUSED1*/
|
/*ARGSUSED1*/
|
||||||
void oldmap(short **mp, short length) {
|
void oldmap(void **mp, short length) {
|
||||||
oldcore(mp, (length+1) * sizeof(short *));
|
oldcore(mp, (length+1) * sizeof(short *));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ short *newtable(short length) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*ARGSUSED1*/
|
/*ARGSUSED1*/
|
||||||
void oldtable(short **mp, short length) {
|
void oldtable(short *mp, short length) {
|
||||||
oldcore(mp, (length+1) * sizeof(short));
|
oldcore(mp, (length+1) * sizeof(short));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ void *myalloc(size_t);
|
||||||
|
|
||||||
line_p newline(byte optype);
|
line_p newline(byte optype);
|
||||||
arg_p newarg(byte argtyp);
|
arg_p newarg(byte argtyp);
|
||||||
short **newmap(short length);
|
void **newmap(short length);
|
||||||
cset newbitvect(short nrbytes);
|
cset newbitvect(short nrbytes);
|
||||||
cond_p newcondtab(int length);
|
cond_p newcondtab(int length);
|
||||||
|
|
||||||
|
@ -35,12 +35,12 @@ void oldargs(arg_p);
|
||||||
void oldargb(argb_p);
|
void oldargb(argb_p);
|
||||||
void oldobjects(obj_p);
|
void oldobjects(obj_p);
|
||||||
void olddblock(dblock_p);
|
void olddblock(dblock_p);
|
||||||
void oldmap(short **mp, short length);
|
void oldmap(void **mp, short length);
|
||||||
void oldbitvect(cset s, short nrbytes);
|
void oldbitvect(cset s, short nrbytes);
|
||||||
void oldcondtab(cond_p);
|
void oldcondtab(cond_p);
|
||||||
|
|
||||||
short *newtable(short length);
|
short *newtable(short length);
|
||||||
void oldtable(short **mp, short length);
|
void oldtable(short *mp, short length);
|
||||||
|
|
||||||
#define newdblock() (dblock_p) newstruct(dblock)
|
#define newdblock() (dblock_p) newstruct(dblock)
|
||||||
#define newobject() (obj_p) newstruct(obj)
|
#define newobject() (obj_p) newstruct(obj)
|
||||||
|
|
|
@ -19,7 +19,7 @@ void Cjoin(cset, cset *);
|
||||||
void Cintersect(cset, cset *);
|
void Cintersect(cset, cset *);
|
||||||
void Cdeleteset(cset);
|
void Cdeleteset(cset);
|
||||||
bool Cis_subset(cset, cset);
|
bool Cis_subset(cset, cset);
|
||||||
void Cclearset(cset, cset *);
|
void Cclear_set(cset *);
|
||||||
void Ccopy_set(cset, cset *);
|
void Ccopy_set(cset, cset *);
|
||||||
void Csubtract(cset, cset *);
|
void Csubtract(cset, cset *);
|
||||||
bool Cequal(cset, cset);
|
bool Cequal(cset, cset);
|
||||||
|
|
|
@ -68,7 +68,7 @@ STATIC void localvar(offset off, short size, local_p *locs, bool reg,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC check_message(line_p l, local_p *locs)
|
STATIC void check_message(line_p l, local_p *locs)
|
||||||
{
|
{
|
||||||
/* See if l is a register message */
|
/* See if l is a register message */
|
||||||
|
|
||||||
|
|
|
@ -240,7 +240,7 @@ void putdtable(dblock_p head, FILE *df)
|
||||||
}
|
}
|
||||||
fclose(curoutp);
|
fclose(curoutp);
|
||||||
if (omap != (obj_p *) 0) {
|
if (omap != (obj_p *) 0) {
|
||||||
oldmap((short **) omap,olength); /* release memory for omap */
|
oldmap((void **) omap,olength); /* release memory for omap */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ void putptable(proc_p head, FILE *pf, bool all)
|
||||||
}
|
}
|
||||||
fclose(curoutp);
|
fclose(curoutp);
|
||||||
if (pmap != (proc_p *) 0) {
|
if (pmap != (proc_p *) 0) {
|
||||||
oldmap((short **) pmap,plength); /* release memory for pmap */
|
oldmap((void **) pmap,plength); /* release memory for pmap */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,9 +416,9 @@ void putunit(short kind, proc_p p, line_p l, FILE *gf, FILE *lf)
|
||||||
oldbblock(b);
|
oldbblock(b);
|
||||||
}
|
}
|
||||||
/* Release the memory for the lmap, lbmap, bmap, lpmap tables */
|
/* Release the memory for the lmap, lbmap, bmap, lpmap tables */
|
||||||
if (lmap != (line_p *) 0) oldmap((short **) lmap,llength);
|
if (lmap != (line_p *) 0) oldmap((void **) lmap,llength);
|
||||||
if (lbmap != (bblock_p *) 0) oldmap((short **) lbmap,llength);
|
if (lbmap != (bblock_p *) 0) oldmap((void **) lbmap,llength);
|
||||||
if (bmap != (bblock_p *) 0) oldmap((short **) bmap,blength);
|
if (bmap != (bblock_p *) 0) oldmap((void **) bmap,blength);
|
||||||
if (lpmap != (loop_p *) 0) oldmap((short **) lpmap,lplength);
|
if (lpmap != (loop_p *) 0) oldmap((void **) lpmap,lplength);
|
||||||
curoutp = lf;
|
curoutp = lf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "../share/utils.h"
|
#include "../share/utils.h"
|
||||||
#include "sr_aux.h"
|
#include "sr_aux.h"
|
||||||
#include "sr_iv.h"
|
#include "sr_iv.h"
|
||||||
|
#include "sr_reduce.h"
|
||||||
|
|
||||||
/* Strength reduction tries to change expensive operators occurring
|
/* Strength reduction tries to change expensive operators occurring
|
||||||
* in a loop into cheaper operators. The expensive operators considered
|
* in a loop into cheaper operators. The expensive operators considered
|
||||||
|
@ -69,7 +70,7 @@ void sr_machinit(void *vp)
|
||||||
fscanf(f,"%d",&sli_threshold);
|
fscanf(f,"%d",&sli_threshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC del_ivs(ivs)
|
STATIC void del_ivs(ivs)
|
||||||
lset ivs;
|
lset ivs;
|
||||||
{
|
{
|
||||||
/* Delete the set of iv structs */
|
/* Delete the set of iv structs */
|
||||||
|
@ -83,7 +84,7 @@ STATIC del_ivs(ivs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC do_loop(loop)
|
STATIC void do_loop(loop)
|
||||||
loop_p loop;
|
loop_p loop;
|
||||||
{
|
{
|
||||||
lset ivs, vars;
|
lset ivs, vars;
|
||||||
|
@ -111,7 +112,7 @@ STATIC do_loop(loop)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC loopblocks(p)
|
STATIC void loopblocks(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Compute the LP_BLOCKS sets for all loops of p */
|
/* Compute the LP_BLOCKS sets for all loops of p */
|
||||||
|
@ -129,7 +130,7 @@ STATIC loopblocks(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC opt_proc(p)
|
STATIC void opt_proc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Optimize all loops of one procedure. We first do all
|
/* Optimize all loops of one procedure. We first do all
|
||||||
|
@ -182,7 +183,7 @@ STATIC bblock_p header(lp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC sr_extproc(p)
|
STATIC void sr_extproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Allocate the extended data structures for procedure p */
|
/* Allocate the extended data structures for procedure p */
|
||||||
|
@ -202,7 +203,7 @@ STATIC sr_extproc(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC sr_cleanproc(p)
|
STATIC void sr_cleanproc(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Remove the extended data structures for procedure p */
|
/* Remove the extended data structures for procedure p */
|
||||||
|
@ -232,7 +233,7 @@ void sr_optimize(void *vp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
|
|
|
@ -107,7 +107,7 @@ int elemsize(lnp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
concatenate(list1,list2)
|
void concatenate(list1,list2)
|
||||||
line_p list1,list2;
|
line_p list1,list2;
|
||||||
{
|
{
|
||||||
/* Append list2 to the end of list1. list1 may not be empty. */
|
/* Append list2 to the end of list1. list1 may not be empty. */
|
||||||
|
|
|
@ -6,20 +6,23 @@
|
||||||
/* S R _ A U X . H */
|
/* S R _ A U X . H */
|
||||||
|
|
||||||
|
|
||||||
extern bool is_loopconst(); /* (line_p l; lset vars)
|
bool is_loopconst(line_p l, lset vars);
|
||||||
|
/*
|
||||||
* See if l is a loop-constant. vars is the
|
* See if l is a loop-constant. vars is the
|
||||||
* set of variables changed in the loop.
|
* set of variables changed in the loop.
|
||||||
*/
|
*/
|
||||||
extern bool is_caddress(); /* (line_p l)
|
bool is_caddress(line_p l, lset vars);
|
||||||
|
/*
|
||||||
* See if l loads a loop-invariant entity of
|
* See if l loads a loop-invariant entity of
|
||||||
* size pointer-size.
|
* size pointer-size.
|
||||||
*/
|
*/
|
||||||
extern int elemsize(); /* (line_p l)
|
int elemsize(line_p l); /*
|
||||||
* l is an instruction that loads an array
|
* l is an instruction that loads an array
|
||||||
* descriptor. Try to determine the size
|
* descriptor. Try to determine the size
|
||||||
* of the array elements.
|
* of the array elements.
|
||||||
*/
|
*/
|
||||||
extern concatenate(); /* (line_p list1,list2)
|
void concatenate(line_p list1, line_p list2);
|
||||||
|
/*
|
||||||
* Append list2 to the end of list1
|
* Append list2 to the end of list1
|
||||||
*/
|
*/
|
||||||
#define is_const(l) (INSTR(l) == op_loc)
|
#define is_const(l) (INSTR(l) == op_loc)
|
||||||
|
|
|
@ -49,7 +49,7 @@ STATIC lset cand, /* set of candidates */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC un_cand(lnp)
|
STATIC void un_cand(lnp)
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
{
|
{
|
||||||
/* remove the variable stored into by lnp from the list of
|
/* remove the variable stored into by lnp from the list of
|
||||||
|
@ -84,7 +84,7 @@ STATIC bool is_cand(lnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC make_cand(lnp)
|
STATIC void make_cand(lnp)
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
{
|
{
|
||||||
/* make the variable stored into by lnp a candidate */
|
/* make the variable stored into by lnp a candidate */
|
||||||
|
@ -96,14 +96,14 @@ STATIC make_cand(lnp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC do_dismiss(lnp)
|
STATIC void do_dismiss(lnp)
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
{
|
{
|
||||||
Ladd(lnp,&dism);
|
Ladd(lnp,&dism);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC dismiss(lnp)
|
STATIC void dismiss(lnp)
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
{
|
{
|
||||||
/* The variable referenced by lnp is turned definitely into
|
/* The variable referenced by lnp is turned definitely into
|
||||||
|
@ -151,7 +151,7 @@ STATIC void try_cand(lnp,b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
candidates(lp,cand_out,vars_out)
|
void candidates(lp,cand_out,vars_out)
|
||||||
loop_p lp;
|
loop_p lp;
|
||||||
lset *cand_out, *vars_out;
|
lset *cand_out, *vars_out;
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern candidates(); /* (loop_p lp; lset *iv_cand, *vars)
|
void candidates(loop_p lp, lset *iv_cand, lset *vars);
|
||||||
|
/*
|
||||||
* Find candidate induction variables,
|
* Find candidate induction variables,
|
||||||
* i.e. local variables that are assigned
|
* i.e. local variables that are assigned
|
||||||
* a value precisely once within the loop,
|
* a value precisely once within the loop,
|
||||||
|
|
|
@ -111,10 +111,9 @@ STATIC int me_kind(l,sign_in,sign_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC bool match_expr(l,iv_allowed,lbegin,iv_seen,sign)
|
STATIC bool
|
||||||
line_p l,*lbegin;
|
match_expr(line_p l, bool iv_allowed, line_p *lbegin, bool *iv_seen,
|
||||||
bool iv_allowed, *iv_seen;
|
int sign)
|
||||||
int sign;
|
|
||||||
{
|
{
|
||||||
/* This routine is a top down parser for simple
|
/* This routine is a top down parser for simple
|
||||||
* EM expressions. It recognizes expressions that
|
* EM expressions. It recognizes expressions that
|
||||||
|
|
|
@ -9,8 +9,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern bool is_ivexpr();/* (line_p l; lset ivs,vars; line_p *lbegin; iv_p *iv;
|
bool is_ivexpr(line_p l, lset ivs, lset vars, line_p *lbegin, iv_p *iv,
|
||||||
* int *out_sign)
|
int *out_sign);
|
||||||
|
/*
|
||||||
* Try to recognize an expression that is a linear
|
* Try to recognize an expression that is a linear
|
||||||
* function of presicely one induction variable.
|
* function of presicely one induction variable.
|
||||||
* It may only use loop constants (besides the
|
* It may only use loop constants (besides the
|
||||||
|
|
|
@ -76,7 +76,7 @@ STATIC bool is_same(l,lnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC ivar(lnp,step)
|
STATIC void ivar(lnp,step)
|
||||||
line_p lnp;
|
line_p lnp;
|
||||||
int step;
|
int step;
|
||||||
{
|
{
|
||||||
|
@ -153,7 +153,7 @@ STATIC void try_patterns(lnp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
induc_vars(loop,ivar_out, vars_out)
|
void induc_vars(loop,ivar_out, vars_out)
|
||||||
loop_p loop;
|
loop_p loop;
|
||||||
lset *ivar_out, *vars_out;
|
lset *ivar_out, *vars_out;
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
*/
|
*/
|
||||||
/* S R _ I V . H */
|
/* S R _ I V . H */
|
||||||
|
|
||||||
extern induc_vars(); /* (loop_p loop; lset *ivars, *vars)
|
void induc_vars(loop_p loop, lset *ivars, lset *vars);
|
||||||
|
/*
|
||||||
* Find the set of induction variables
|
* Find the set of induction variables
|
||||||
* of the loop. Also find the set of (local)
|
* of the loop. Also find the set of (local)
|
||||||
* variables that are changed.
|
* variables that are changed.
|
||||||
|
|
|
@ -55,7 +55,7 @@ STATIC int regtyp(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC gen_regmes(tmp,score,code,p)
|
STATIC void gen_regmes(tmp,score,code,p)
|
||||||
offset tmp;
|
offset tmp;
|
||||||
int score;
|
int score;
|
||||||
code_p code;
|
code_p code;
|
||||||
|
@ -121,7 +121,7 @@ STATIC line_p newcode(code,tmp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC replcode(code,text)
|
STATIC void replcode(code,text)
|
||||||
code_p code;
|
code_p code;
|
||||||
line_p text;
|
line_p text;
|
||||||
{
|
{
|
||||||
|
@ -171,7 +171,7 @@ STATIC line_p add_code(pl, l)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC init_code(code,tmp)
|
STATIC void init_code(code,tmp)
|
||||||
code_p code;
|
code_p code;
|
||||||
offset tmp;
|
offset tmp;
|
||||||
{
|
{
|
||||||
|
@ -239,7 +239,7 @@ STATIC init_code(code,tmp)
|
||||||
*p = l; /* new last instruction */
|
*p = l; /* new last instruction */
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC incr_code(code,tmp)
|
STATIC void incr_code(code,tmp)
|
||||||
code_p code;
|
code_p code;
|
||||||
offset tmp;
|
offset tmp;
|
||||||
{
|
{
|
||||||
|
@ -322,7 +322,7 @@ STATIC incr_code(code,tmp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC remcode(c)
|
STATIC void remcode(c)
|
||||||
code_p c;
|
code_p c;
|
||||||
{
|
{
|
||||||
line_p l, next;
|
line_p l, next;
|
||||||
|
@ -453,7 +453,7 @@ STATIC code_p available(c,vars)
|
||||||
return (code_p) 0;
|
return (code_p) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC fix_header(lp)
|
STATIC void fix_header(lp)
|
||||||
loop_p lp;
|
loop_p lp;
|
||||||
{
|
{
|
||||||
/* Check if a header block was added, and if so, add a branch to
|
/* Check if a header block was added, and if so, add a branch to
|
||||||
|
@ -487,7 +487,7 @@ STATIC fix_header(lp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC reduce(code,vars)
|
STATIC void reduce(code,vars)
|
||||||
code_p code;
|
code_p code;
|
||||||
lset vars;
|
lset vars;
|
||||||
{
|
{
|
||||||
|
@ -711,7 +711,7 @@ STATIC void try_array(lp,ivs,vars,b,arr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC clean_avail()
|
STATIC void clean_avail()
|
||||||
{
|
{
|
||||||
Lindex i;
|
Lindex i;
|
||||||
|
|
||||||
|
@ -723,7 +723,7 @@ STATIC clean_avail()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
strength_reduction(lp,ivs,vars)
|
void strength_reduction(lp,ivs,vars)
|
||||||
loop_p lp; /* description of the loop */
|
loop_p lp; /* description of the loop */
|
||||||
lset ivs; /* set of induction variables of the loop */
|
lset ivs; /* set of induction variables of the loop */
|
||||||
lset vars; /* set of local variables changed in loop */
|
lset vars; /* set of local variables changed in loop */
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
/* S R _ R E D U C E . H */
|
/* S R _ R E D U C E . H */
|
||||||
|
|
||||||
extern strength_reduction(); /* (loop_p loop; lset ivs, vars)
|
void strength_reduction(loop_p loop, lset ivs, lset vars);
|
||||||
* Perform streength reduction.
|
/*
|
||||||
|
* Perform strength reduction.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -66,7 +66,7 @@ line_p move_pointer(tmp,dir)
|
||||||
|
|
||||||
/* make_header */
|
/* make_header */
|
||||||
|
|
||||||
STATIC copy_loops(b1,b2,except)
|
STATIC void copy_loops(b1,b2,except)
|
||||||
bblock_p b1,b2;
|
bblock_p b1,b2;
|
||||||
loop_p except;
|
loop_p except;
|
||||||
{
|
{
|
||||||
|
@ -108,7 +108,7 @@ STATIC lab_id label(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC adjust_jump(newtarg,oldtarg,c)
|
STATIC void adjust_jump(newtarg,oldtarg,c)
|
||||||
bblock_p newtarg,oldtarg,c;
|
bblock_p newtarg,oldtarg,c;
|
||||||
{
|
{
|
||||||
/* If the last instruction of c is a jump to the
|
/* If the last instruction of c is a jump to the
|
||||||
|
|
|
@ -11,12 +11,12 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern line_p move_pointer(); /* (offset tmp; int dir ) */
|
line_p move_pointer(offset tmp, int dir);
|
||||||
/* Generate EM code to load/store a pointer variable
|
/* Generate EM code to load/store a pointer variable
|
||||||
* onto/from the stack, depending on dir(ection).
|
* onto/from the stack, depending on dir(ection).
|
||||||
* We accept all kinds of pointer sizes.
|
* We accept all kinds of pointer sizes.
|
||||||
*/
|
*/
|
||||||
extern void make_header() ; /* (loop_p lp) */
|
void make_header(loop_p lp);
|
||||||
/* Make sure that the loop has a header block, i.e. a block
|
/* Make sure that the loop has a header block, i.e. a block
|
||||||
* has the loop entry block as its only successor and
|
* has the loop entry block as its only successor and
|
||||||
* that dominates the loop entry block.
|
* that dominates the loop entry block.
|
||||||
|
|
|
@ -103,7 +103,7 @@ STATIC short map_value(tab,val,time)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC init_root(root)
|
STATIC void init_root(root)
|
||||||
bblock_p root;
|
bblock_p root;
|
||||||
{
|
{
|
||||||
/* Initialise the IN OUT sets of the entry block of the
|
/* Initialise the IN OUT sets of the entry block of the
|
||||||
|
@ -133,7 +133,7 @@ STATIC init_root(root)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC unite_outs(bbset,setp)
|
STATIC void unite_outs(bbset,setp)
|
||||||
lset bbset;
|
lset bbset;
|
||||||
cset *setp;
|
cset *setp;
|
||||||
{
|
{
|
||||||
|
@ -151,7 +151,7 @@ STATIC unite_outs(bbset,setp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC solve_equations(p)
|
STATIC void solve_equations(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Solve the data flow equations for reaching
|
/* Solve the data flow equations for reaching
|
||||||
|
@ -390,7 +390,7 @@ pr_cblocks(p)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
STATIC ud_analysis(p)
|
STATIC void ud_analysis(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Perform use-definition analysis on procedure p */
|
/* Perform use-definition analysis on procedure p */
|
||||||
|
@ -415,20 +415,20 @@ STATIC ud_analysis(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC clean_maps()
|
STATIC void clean_maps()
|
||||||
{
|
{
|
||||||
local_p *p;
|
local_p *p;
|
||||||
cset *v;
|
cset *v;
|
||||||
|
|
||||||
oldmap(defs,nrexpldefs);
|
oldmap((void **) defs,nrexpldefs);
|
||||||
for (p = &locals[1]; p <= &locals[nrlocals]; p++) {
|
for (p = &locals[1]; p <= &locals[nrlocals]; p++) {
|
||||||
oldlocal(*p);
|
oldlocal(*p);
|
||||||
}
|
}
|
||||||
oldmap(locals,nrlocals);
|
oldmap((void **) locals,nrlocals);
|
||||||
for (v = &vardefs[1]; v <= &vardefs[nrvars]; v++) {
|
for (v = &vardefs[1]; v <= &vardefs[nrvars]; v++) {
|
||||||
Cdeleteset(*v);
|
Cdeleteset(*v);
|
||||||
}
|
}
|
||||||
oldmap(vardefs,nrvars);
|
oldmap((void **) vardefs,nrvars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ STATIC bool try_optim(l,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
value_propagation(p)
|
STATIC void value_propagation(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Apply value propagation to procedure p */
|
/* Apply value propagation to procedure p */
|
||||||
|
@ -484,7 +484,7 @@ value_propagation(p)
|
||||||
* e.g. the value of A might be statically known too now.
|
* e.g. the value of A might be statically known too now.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (changes) {
|
while (changes) {
|
||||||
changes = FALSE;
|
changes = FALSE;
|
||||||
for (b = p->p_start; b != (bblock_p) 0; b = b->b_next) {
|
for (b = p->p_start; b != (bblock_p) 0; b = b->b_next) {
|
||||||
for (l = b->b_start; l != (line_p) 0; l = next) {
|
for (l = b->b_start; l != (line_p) 0; l = next) {
|
||||||
|
@ -495,12 +495,12 @@ value_propagation(p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
oldmap(copies,nrcopies);
|
oldmap((void **) copies,nrcopies);
|
||||||
oldtable(def_to_copynr,nrdefs);
|
oldtable(def_to_copynr,nrdefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC ud_extend(p)
|
STATIC void ud_extend(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Allocate extended data structures for Use Definition analysis */
|
/* Allocate extended data structures for Use Definition analysis */
|
||||||
|
@ -513,7 +513,7 @@ STATIC ud_extend(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC ud_cleanup(p)
|
STATIC void ud_cleanup(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Deallocate extended data structures for Use Definition analysis */
|
/* Deallocate extended data structures for Use Definition analysis */
|
||||||
|
@ -553,7 +553,7 @@ void ud_optimize(void *vp)
|
||||||
clean_maps();
|
clean_maps();
|
||||||
}
|
}
|
||||||
|
|
||||||
main(argc,argv)
|
int main(argc,argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "../share/utils.h"
|
#include "../share/utils.h"
|
||||||
#include "ud_defs.h"
|
#include "ud_defs.h"
|
||||||
|
|
||||||
repl_line(old,new,b)
|
void repl_line(old,new,b)
|
||||||
line_p old,new;
|
line_p old,new;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,12 +10,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern repl_line(); /* (line_p old,new; bblock_p b)
|
void repl_line(line_p old, line_p new, bblock_p b);
|
||||||
|
/*
|
||||||
* Replace EM instruction 'old' by a
|
* Replace EM instruction 'old' by a
|
||||||
* copy of 'new'. Update doubly-linked
|
* copy of 'new'. Update doubly-linked
|
||||||
* list.
|
* list.
|
||||||
*/
|
*/
|
||||||
extern bool same_var(); /* (line_p use,def)
|
bool same_var(line_p use, line_p def);
|
||||||
|
/*
|
||||||
* 'use' is an instruction that uses a variable
|
* 'use' is an instruction that uses a variable
|
||||||
* for which we maintain ud-info (e.g. a LOL).
|
* for which we maintain ud-info (e.g. a LOL).
|
||||||
* See if 'def' references the same variable.
|
* See if 'def' references the same variable.
|
||||||
|
|
|
@ -109,9 +109,7 @@ bool value_known(def,val_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool affected(use,v,l)
|
bool affected(line_p use, short v, line_p l)
|
||||||
line_p use,l;
|
|
||||||
short v;
|
|
||||||
{
|
{
|
||||||
/* See if the variable referenced by 'use' may be
|
/* See if the variable referenced by 'use' may be
|
||||||
* changed by instruction l, which is either a cal, cai or
|
* changed by instruction l, which is either a cal, cai or
|
||||||
|
@ -223,7 +221,7 @@ line_p unique_def(use,b,defnr_out)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fold_const(l,b,val)
|
void fold_const(l,b,val)
|
||||||
line_p l;
|
line_p l;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
offset val;
|
offset val;
|
||||||
|
|
|
@ -6,23 +6,27 @@
|
||||||
|
|
||||||
/* C O N S T A N T P R O P A G A T I O N */
|
/* C O N S T A N T P R O P A G A T I O N */
|
||||||
|
|
||||||
extern line_p unique_def(); /* ( line_p use; bblock_p b; short *defnr_out;)
|
line_p unique_def(line_p use, bblock_p b, short *defnr_out);
|
||||||
|
/*
|
||||||
* See if there is a unique explicit definition
|
* See if there is a unique explicit definition
|
||||||
* of the variable used by 'use' that
|
* of the variable used by 'use' that
|
||||||
* reaches 'use'.
|
* reaches 'use'.
|
||||||
*/
|
*/
|
||||||
extern bool value_known(); /* (line_p def; offset *val_out)
|
bool value_known(line_p def, offset *val_out);
|
||||||
|
/*
|
||||||
* See if the value stored by definition 'def'
|
* See if the value stored by definition 'def'
|
||||||
* is known statically (i.e. is a constant).
|
* is known statically (i.e. is a constant).
|
||||||
*/
|
*/
|
||||||
extern fold_const(); /* (line_p l; bblock_p b; offset val)
|
void fold_const(line_p l, bblock_p b, offset val);
|
||||||
|
/*
|
||||||
* Perform the substitutions required for
|
* Perform the substitutions required for
|
||||||
* constant folding.
|
* constant folding.
|
||||||
*/
|
*/
|
||||||
extern bool is_use(); /* (line_p l)
|
bool is_use(line_p l); /*
|
||||||
* See if 'l' is a use of a variable.
|
* See if 'l' is a use of a variable.
|
||||||
*/
|
*/
|
||||||
extern bool affected(); /* (line_p use,l; short v)
|
bool affected(line_p use, short v, line_p l);
|
||||||
|
/*
|
||||||
* See if the variable referenced by 'use' may
|
* See if the variable referenced by 'use' may
|
||||||
* be changed by instruction l, which is
|
* be changed by instruction l, which is
|
||||||
* either a cal, cai or an indirect assignment.
|
* either a cal, cai or an indirect assignment.
|
||||||
|
|
|
@ -83,7 +83,7 @@ STATIC void traverse_defs(p,action)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC make_copytab(p)
|
STATIC void make_copytab(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Make a table of all copies appearing in procedure p.
|
/* Make a table of all copies appearing in procedure p.
|
||||||
|
@ -165,7 +165,7 @@ STATIC void gen_kill_copies(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC intersect_outs(bbset,setp,full_set)
|
STATIC void intersect_outs(bbset,setp,full_set)
|
||||||
lset bbset;
|
lset bbset;
|
||||||
cset *setp,full_set;
|
cset *setp,full_set;
|
||||||
{
|
{
|
||||||
|
@ -183,7 +183,7 @@ STATIC intersect_outs(bbset,setp,full_set)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC init_cin(p,full_set)
|
STATIC void init_cin(p,full_set)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
cset full_set;
|
cset full_set;
|
||||||
{
|
{
|
||||||
|
@ -218,7 +218,7 @@ STATIC init_cin(p,full_set)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC solve_cin(p)
|
STATIC void solve_cin(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Solve the data flow equations for reaching
|
/* Solve the data flow equations for reaching
|
||||||
|
@ -267,7 +267,7 @@ STATIC solve_cin(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
copy_analysis(p)
|
void copy_analysis(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Determine which copies procedure p has. Compute C_IN(b),
|
/* Determine which copies procedure p has. Compute C_IN(b),
|
||||||
|
@ -311,7 +311,7 @@ bool is_copy(def)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fold_var(old,new,b)
|
void fold_var(old,new,b)
|
||||||
line_p old, new;
|
line_p old, new;
|
||||||
bblock_p b;
|
bblock_p b;
|
||||||
{
|
{
|
||||||
|
@ -369,10 +369,7 @@ END DEBUG */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool value_retained(copy,defnr,use,b)
|
bool value_retained(line_p copy, short defnr, line_p use, bblock_p b)
|
||||||
line_p copy,use;
|
|
||||||
short defnr;
|
|
||||||
bblock_p b;
|
|
||||||
{
|
{
|
||||||
/* See if the right hand side variable of the
|
/* See if the right hand side variable of the
|
||||||
* copy still has the same value at 'use'.
|
* copy still has the same value at 'use'.
|
||||||
|
|
|
@ -16,23 +16,24 @@ extern short nrcopies; /* number of copies in the current procedure
|
||||||
* (length of copies-table)
|
* (length of copies-table)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern copy_analysis(); /* (proc_p p)
|
void copy_analysis(proc_p p); /*
|
||||||
* Determine which copies procedure p has.
|
* Determine which copies procedure p has.
|
||||||
* Compute C_IN(b), for every basic block b.
|
* Compute C_IN(b), for every basic block b.
|
||||||
*/
|
*/
|
||||||
extern bool is_copy(); /* (line_p def)
|
bool is_copy(line_p def); /*
|
||||||
* See if the definition def is also a 'copy',
|
* See if the definition def is also a 'copy',
|
||||||
* i.e. an statement of the form
|
* i.e. an statement of the form
|
||||||
* 'A := B' (or, in EM terminology:
|
* 'A := B' (or, in EM terminology:
|
||||||
* a sequence 'Load Variable; Store Variable').
|
* a sequence 'Load Variable; Store Variable').
|
||||||
*/
|
*/
|
||||||
extern fold_var(); /* (line_p old,new; bblock_p b)
|
void fold_var(line_p old, line_p new, bblock_p b);
|
||||||
|
/*
|
||||||
* The variable referenced by the
|
* The variable referenced by the
|
||||||
* EM instruction 'old' must be replaced
|
* EM instruction 'old' must be replaced
|
||||||
* by the variable referenced by 'new'.
|
* by the variable referenced by 'new'.
|
||||||
*/
|
*/
|
||||||
extern bool value_retained(); /* (line_p copy; short defnr; line_p use;
|
bool value_retained(line_p copy, short defnr, line_p use, bblock_p b);
|
||||||
* bblock_p b)
|
/*
|
||||||
* See if the right hand side variable of the
|
* See if the right hand side variable of the
|
||||||
* copy still has the same value at 'use'.
|
* copy still has the same value at 'use'.
|
||||||
* If the copy and the use are in the same
|
* If the copy and the use are in the same
|
||||||
|
|
|
@ -80,7 +80,7 @@ bool does_impl_def(l)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
make_defs(p)
|
void make_defs(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Make a map of all explicit definitions
|
/* Make a map of all explicit definitions
|
||||||
|
@ -134,7 +134,7 @@ make_defs(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC init_gen(nrdefs)
|
STATIC void init_gen(nrdefs)
|
||||||
short nrdefs;
|
short nrdefs;
|
||||||
{
|
{
|
||||||
/* Initializing routine of gen_sets. Compute the set
|
/* Initializing routine of gen_sets. Compute the set
|
||||||
|
@ -161,7 +161,7 @@ STATIC init_gen(nrdefs)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC clean_gen()
|
STATIC void clean_gen()
|
||||||
{
|
{
|
||||||
Cdeleteset(all_globl_defs);
|
Cdeleteset(all_globl_defs);
|
||||||
Cdeleteset(all_indir_defs);
|
Cdeleteset(all_indir_defs);
|
||||||
|
@ -200,7 +200,7 @@ STATIC bool same_target(l,defnr)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC rem_prev_defs(l,gen_p)
|
STATIC void rem_prev_defs(l,gen_p)
|
||||||
line_p l;
|
line_p l;
|
||||||
cset *gen_p;
|
cset *gen_p;
|
||||||
{
|
{
|
||||||
|
@ -223,7 +223,7 @@ STATIC rem_prev_defs(l,gen_p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC impl_globl_defs(p,gen_p)
|
STATIC void impl_globl_defs(p,gen_p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
cset *gen_p;
|
cset *gen_p;
|
||||||
{
|
{
|
||||||
|
@ -287,7 +287,7 @@ STATIC void impl_gen_defs(l,gen_p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
gen_sets(p)
|
void gen_sets(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* Compute for every basic block b of p the
|
/* Compute for every basic block b of p the
|
||||||
|
@ -329,9 +329,7 @@ gen_sets(p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
STATIC killed_defs(v,b)
|
STATIC void killed_defs(short v, bblock_p b)
|
||||||
short v;
|
|
||||||
bblock_p b;
|
|
||||||
{
|
{
|
||||||
/* Put all definitions of v occurring outside b
|
/* Put all definitions of v occurring outside b
|
||||||
* in KILL(b). In fact, we also put explicit
|
* in KILL(b). In fact, we also put explicit
|
||||||
|
@ -355,7 +353,7 @@ STATIC killed_defs(v,b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
kill_sets(p)
|
void kill_sets(p)
|
||||||
proc_p p;
|
proc_p p;
|
||||||
{
|
{
|
||||||
/* For every basic block b of p compute the set
|
/* For every basic block b of p compute the set
|
||||||
|
|
|
@ -13,21 +13,21 @@ extern short nrexpldefs; /* number of explicit definitions */
|
||||||
extern line_p *defs; /* map of explicit definitions */
|
extern line_p *defs; /* map of explicit definitions */
|
||||||
extern cset *vardefs; /* set of explicit defs. of all variables */
|
extern cset *vardefs; /* set of explicit defs. of all variables */
|
||||||
|
|
||||||
extern make_defs(); /* (proc_p p)
|
void make_defs(proc_p p); /*
|
||||||
* Compute defs[], vardefs[]
|
* Compute defs[], vardefs[]
|
||||||
* and CHGVARS(b) (for every b).
|
* and CHGVARS(b) (for every b).
|
||||||
*/
|
*/
|
||||||
extern gen_sets(); /* (proc_p p)
|
void gen_sets(proc_p p); /*
|
||||||
* Compute GEN(b) (for every b).
|
* Compute GEN(b) (for every b).
|
||||||
*/
|
*/
|
||||||
extern kill_sets(); /* (proc_p p)
|
void kill_sets(proc_p p); /*
|
||||||
*Compute KILL(b) (for every b).
|
* Compute KILL(b) (for every b).
|
||||||
*/
|
*/
|
||||||
extern bool does_expl_def(); /* (line_p l)
|
bool does_expl_def(line_p l); /*
|
||||||
* See if instruction l does an explicit
|
* See if instruction l does an explicit
|
||||||
* definition (e.g. a STL).
|
* definition (e.g. a STL).
|
||||||
*/
|
*/
|
||||||
extern bool does_impl_def(); /* (line_p l)
|
bool does_impl_def(line_p l); /*
|
||||||
* See if instruction l does an implicit
|
* See if instruction l does an implicit
|
||||||
* definition (e.g. a CAL).
|
* definition (e.g. a CAL).
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue