Annotation of researchv9/jerq/sgs/comp/optdir.c, revision 1.1.1.1

1.1       root        1: /*     @(#) optdir.c: 1.3 6/26/84      */
                      2: /* optdir.c
                      3: **
                      4: **     Optimization Director
                      5: **
                      6: **     The routines in this file monitor the information in
                      7: **     the machine independent portion of the compiler
                      8: **     and write comments in the assembly output informing
                      9: **      the machine dependent portion of the optimizer
                     10: **     that certain optimizations are possible.
                     11: **
                     12: */
                     13: 
                     14: # include "mfile1.h"
                     15: # include "storclass.h"
                     16: 
                     17: extern FILE *outfile;
                     18: extern int xdebug;
                     19: 
                     20: #ifdef IMPREGAL
                     21: 
                     22: /* Register allocation
                     23: ** Routines ra* direct the 'register allocation' optimization.
                     24: ** The optimization attempts to assign selected quantities,
                     25: ** i.e.,
                     26: **     local variables that
                     27: **             - are simple (are not related to arrays, structures, 
                     28: **               or unions)
                     29: **             - do not have their address taken explicitly with '&'
                     30: **     incoming arguments that
                     31: **             - are simple
                     32: **             - are in a procedure where no argument has its address taken
                     33: **               expilitly with an '&'
                     34: ** to available scratch or user registers.
                     35: **  
                     36: ** An estimator is computed for each qualifying quantity by the formulas:
                     37: **
                     38: **     local variables
                     39: **             RAPOEST * (FORWEIGHT or WHWEIGHT)**(loop depth)
                     40: **             -----------------------------------------------
                     41: **                 (BRWEIGHT)**(branch depth)
                     42: **
                     43: **     arguments
                     44: **             RAPOEST * (FORWEIGHT or WHWEIGHT)**(loop depth)
                     45: **             ----------------------------------------------- - 9
                     46: **                 (BRWEIGHT)**(branch depth)
                     47: **     
                     48: ** where '**' denotes exponentiation.
                     49: ** The quantities are ordered by decreasing estimator and up to HIGHSZ
                     50: ** are printed in the form
                     51: **     #REGAL  <estimator> <storage class> <ident> <length>
                     52: **
                     53: */
                     54: 
                     55: #define RAPAYOFF       3       /* operand payoff estimator in cycles */
                     56: #define FORWEIGHT      10      /* weight to emphasize code in 'for' loops */
                     57: #define WHWEIGHT       5       /* weight to emphasize code in 'while' and
                     58:                                ** 'do-while' loops */
                     59: #define BRWEIGHT       10      /* weight to de-emphasize code in branches */
                     60: #define HIGHSZ         20      /* size of table for sorting estimators */
                     61: 
                     62: int    estimtab[SYMTSZ];       /* payoff estimator for each variable, 
                     63:                                ** set to -1 if address of variable is taken */
                     64: NODE   *lastp;                 /* pointer to last NAME node processed */
                     65: int    lastid;                 /* index to symbol table for last NAME node */
                     66: int    dblflg = 0;             /* flag indicating presence of doubles */
                     67: 
                     68: struct hinode { /* ordered table of variables with highest estimators */
                     69:        int     hiestim;                /* estimator of cycle payoff */
                     70:        int     hiscl;                  /* scl of quant to put in reg */
                     71:        int     hiident;                /* identification of quantity:
                     72:                                         *      local           offset 
                     73:                                         *      argument        offset*/
                     74:        int     hilen;                  /* length in bytes of quantity */
                     75: } high[HIGHSZ];
                     76: 
                     77: /* table status */
                     78: 
                     79: #define        EMPTY   -2
                     80: #define        ADDRSD  -1
                     81: 
                     82: void
                     83: rainit()
                     84: 
                     85: {
                     86:        register int *p;
                     87:        struct hinode *hp;
                     88: 
                     89:        /* initialize estimator table */
                     90:        for( p = estimtab; p < estimtab + SYMTSZ; p++ ) *p = EMPTY;
                     91: 
                     92:        /* initialize hi table */
                     93:        for( hp = high; hp < high + HIGHSZ; hp++ ) hp->hiestim = EMPTY;
                     94: }
                     95: 
                     96: void
                     97: radbl()
                     98: {
                     99:        dblflg = 1;
                    100: #ifndef NODBG
                    101:        if (xdebug > 1 && dblflg)
                    102:                fprintf(outfile, "radbl() sets dblflg\n");
                    103: #endif
                    104: }
                    105: 
                    106: void
                    107: raname(p)
                    108: NODE *p;
                    109: 
                    110: {
                    111:        int type, class;
                    112:        int old;
                    113: 
                    114:        /* check for simpleness */
                    115:        type = stab[idname].stype;
                    116:        if( !( (CHAR <= type && type <= LONG) ||
                    117:                (UCHAR <= type && type <= ULONG) ||
                    118:                (ULONG < type) ) ) return;
                    119:        if( ISFTN(type) || ISARY(type) ) return;
                    120:        if( stab[idname].slevel > 2 ) return;
                    121: 
                    122:        /* compute per reference payoff */
                    123:        old = estimtab[idname];
                    124: #ifndef NODBG
                    125:        if (xdebug)
                    126:        {
                    127:                fprintf(outfile,
                    128:                        "raname(0x%lx)\tstab[%d] `%s' sclass %s cur.est %d\n",
                    129:                        p, idname, stab[idname].sname,
                    130:                        scnames(stab[idname].sclass), old);
                    131:        }
                    132: #endif
                    133:        /*
                    134:        * Don't count putting the PARAM into the REGISTER
                    135:        * for REGISTER PARAM's.
                    136:        */
                    137:        if( blevel >= 2 && estimtab[idname] != ADDRSD ) 
                    138:                switch( stab[idname].sclass ) {
                    139:                int i, weight;
                    140: 
                    141:                case PARAM:
                    142:                case AUTO:
                    143:                        if( estimtab[idname] == EMPTY ) estimtab[idname] = 0;
                    144:                        weight = RAPAYOFF;
                    145:                        for( i = 1; i <= fordepth; i++ ) {
                    146:                                if( weight >= 10000 ) break;
                    147:                                weight *= FORWEIGHT;
                    148:                        }
                    149:                        for( i = 1; i <= whdepth; i++ ) {
                    150:                                if( weight >= 10000 ) break;
                    151:                                weight *= WHWEIGHT;
                    152:                        }
                    153:                        for( i = 1; i <= brdepth; i++ ) {
                    154:                                weight /= BRWEIGHT;
                    155:                        }
                    156:                        estimtab[idname] += weight;
                    157:                }
                    158:        lastid = idname;
                    159:        lastp = p;
                    160: #ifndef NODBG
                    161:        if (xdebug > 1)
                    162:        {
                    163:                fprintf(outfile,
                    164:                        "`%s' type=%d class=%d level=%d flags=%x offset=%d\n",
                    165:                        stab[idname].sname, stab[idname].stype,
                    166:                        stab[idname].sclass, stab[idname].slevel,
                    167:                        stab[idname].sflags, stab[idname].offset);
                    168:                fprintf(outfile, "\tfordepth=%d whdepth=%d brdepth=%d change=%d estimator=%d\n",
                    169:                fordepth, whdepth, brdepth, estimtab[idname]-old,
                    170:                estimtab[idname]);
                    171:        }
                    172: #endif
                    173: }
                    174: 
                    175: void
                    176: raua(p)
                    177: NODE *p;
                    178: 
                    179: {
                    180:        /* mark variables with address taken */
                    181:        if( p == lastp )  estimtab[lastid] = ADDRSD;
                    182: }
                    183: 
                    184: void
                    185: raftn()
                    186: 
                    187: {
                    188: 
                    189:        register int i, j, k, ei;
                    190:        struct hinode *hp;
                    191:        struct symtab *sp;
                    192: 
                    193:        /* check for end of function */
                    194:        if( blevel != 2 ) return;
                    195: 
                    196:        /* check for doubles */
                    197:        if( dblflg == 0 ) fprintf( outfile, "#REGAL\t%d\tNODBL\n", 0 );
                    198:        else return;
                    199: 
                    200:        /* check for args with address taken */
                    201:        for( i = 0; i < SYMTSZ; i++ ) {
                    202:                if( stab[i].sclass == PARAM && estimtab[i] == ADDRSD ) {
                    203:                        for( j = 0; j < SYMTSZ; j++ ) 
                    204:                                if( stab[j].sclass == PARAM )
                    205:                                        estimtab[j] = ADDRSD;
                    206:                        break;
                    207:                }
                    208:        }
                    209: 
                    210:        /* insert entries from symbol table in decreasing order */
                    211:        for( i = 0; i < SYMTSZ; i++ ) {
                    212:                ei = estimtab[i];
                    213:                if( ei < 0 ) continue;
                    214:                sp = &stab[i];
                    215: 
                    216:                /* include cost for arg */
                    217:                if( sp->sclass == PARAM ) ei -= 9;
                    218:                if( ei < 0 ) continue;
                    219: 
                    220:                /* insertion sort */
                    221:                for( j = 0; j < HIGHSZ; j++ ) {
                    222:                        if( ei > high[j].hiestim ) {
                    223:                                for( k = 8; k >= j; k-- ) {
                    224:                                        hp = &high[k];
                    225:                                        (hp+1)->hiestim = hp->hiestim;
                    226:                                        (hp+1)->hiscl = hp->hiscl;
                    227:                                        (hp+1)->hiident = hp->hiident;
                    228:                                        (hp+1)->hilen = hp->hilen;
                    229:                                }
                    230:                                hp = &high[j];
                    231:                                hp->hiestim = ei;
                    232:                                hp->hiscl = sp->sclass;
                    233:                                hp->hiident = sp->offset;
                    234:                                switch( sp->stype ) {
                    235:                                case CHAR:
                    236:                                case UCHAR:
                    237:                                        hp->hilen = 1; break;
                    238:                                case SHORT:
                    239:                                case USHORT:
                    240:                                        hp->hilen = 2; break;
                    241:                                default:
                    242:                                        hp->hilen = 4; break;
                    243:                                }
                    244:                                break;
                    245:                        }
                    246:                }
                    247:        }
                    248: 
                    249:        /* print entries */
                    250:        for( i = 0; i < HIGHSZ; i++ ) {
                    251:                hp = &high[i];
                    252:                if( hp->hiestim == EMPTY ) break;
                    253:                fprintf( outfile, "#REGAL\t%d", hp->hiestim );
                    254:                switch( hp->hiscl ) {
                    255:                case AUTO:
                    256:                        fprintf( outfile, "\tAUTO \t%d(%%fp)", 
                    257:                                hp->hiident/SZCHAR );
                    258:                        break;
                    259:                case PARAM:
                    260:                        fprintf( outfile, "\tPARAM\t%d(%%ap)",
                    261:                                hp->hiident/SZCHAR );
                    262:                        break;
                    263:                }
                    264:                fprintf( outfile, "\t%d\n", hp->hilen );
                    265:        }
                    266: }
                    267: #endif /* IMPREGAL */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.