Annotation of 3BSD/cmd/mip/optim.c, revision 1.1.1.1

1.1       root        1: # include "mfile1"
                      2: 
                      3: # define SWAP(p,q) {sp=p; p=q; q=sp;}
                      4: # define RCON(p) (p->right->op==ICON)
                      5: # define RO(p) p->right->op
                      6: # define RV(p) p->right->lval
                      7: # define LCON(p) (p->left->op==ICON)
                      8: # define LO(p) p->left->op
                      9: # define LV(p) p->left->lval
                     10: 
                     11: int oflag = 0;
                     12: 
                     13: NODE *
                     14: fortarg( p ) NODE *p; {
                     15:        /* fortran function arguments */
                     16: 
                     17:        if( p->op == CM ){
                     18:                p->left = fortarg( p->left );
                     19:                p->right = fortarg( p->right );
                     20:                return(p);
                     21:                }
                     22: 
                     23:        while( ISPTR(p->type) ){
                     24:                p = buildtree( UNARY MUL, p, NIL );
                     25:                }
                     26:        return( optim(p) );
                     27:        }
                     28: 
                     29:        /* mapping relationals when the sides are reversed */
                     30: short revrel[] ={ EQ, NE, GE, GT, LE, LT, UGE, UGT, ULE, ULT };
                     31: NODE *
                     32: optim(p) register NODE *p; {
                     33:        /* local optimizations, most of which are probably machine independent */
                     34: 
                     35:        register o, ty;
                     36:        NODE *sp;
                     37:        int i;
                     38:        TWORD t;
                     39: 
                     40:        if( (t=BTYPE(p->type))==ENUMTY || t==MOETY ) econvert(p);
                     41:        if( oflag ) return(p);
                     42:        ty = optype( o=p->op);
                     43:        if( ty == LTYPE ) return(p);
                     44: 
                     45:        if( ty == BITYPE ) p->right = optim(p->right);
                     46:        p->left = optim(p->left);
                     47: 
                     48:        /* collect constants */
                     49: 
                     50:        switch(o){
                     51: 
                     52:        case SCONV:
                     53:        case PCONV:
                     54:                return( clocal(p) );
                     55: 
                     56:        case FORTCALL:
                     57:                p->right = fortarg( p->right );
                     58:                break;
                     59: 
                     60:        case UNARY AND:
                     61:                if( LO(p) != NAME ) cerror( "& error" );
                     62: 
                     63:                if( !andable(p->left) ) return(p);
                     64: 
                     65:                LO(p) = ICON;
                     66: 
                     67:                setuleft:
                     68:                /* paint over the type of the left hand side with the type of the top */
                     69:                p->left->type = p->type;
                     70:                p->left->cdim = p->cdim;
                     71:                p->left->csiz = p->csiz;
                     72:                p->op = FREE;
                     73:                return( p->left );
                     74: 
                     75:        case UNARY MUL:
                     76:                if( LO(p) != ICON ) break;
                     77:                LO(p) = NAME;
                     78:                goto setuleft;
                     79: 
                     80:        case MINUS:
                     81:                if( !nncon(p->right) ) break;
                     82:                RV(p) = -RV(p);
                     83:                o = p->op = PLUS;
                     84: 
                     85:        case MUL:
                     86:        case PLUS:
                     87:        case AND:
                     88:        case OR:
                     89:        case ER:
                     90:                /* commutative ops; for now, just collect constants */
                     91:                /* someday, do it right */
                     92:                if( nncon(p->left) || ( LCON(p) && !RCON(p) ) ) SWAP( p->left, p->right );
                     93:                /* make ops tower to the left, not the right */
                     94:                if( RO(p) == o ){
                     95:                        NODE *t1, *t2, *t3;
                     96:                        t1 = p->left;
                     97:                        sp = p->right;
                     98:                        t2 = sp->left;
                     99:                        t3 = sp->right;
                    100:                        /* now, put together again */
                    101:                        p->left = sp;
                    102:                        sp->left = t1;
                    103:                        sp->right = t2;
                    104:                        p->right = t3;
                    105:                        }
                    106:                if(o == PLUS && LO(p) == MINUS && RCON(p) && RCON(p->left) &&
                    107:                  conval(p->right, MINUS, p->left->right)){
                    108:                        zapleft:
                    109:                        RO(p->left) = FREE;
                    110:                        LO(p) = FREE;
                    111:                        p->left = p->left->left;
                    112:                }
                    113:                if( RCON(p) && LO(p)==o && RCON(p->left) && conval( p->right, o, p->left->right ) ){
                    114:                        goto zapleft;
                    115:                        }
                    116:                else if( LCON(p) && RCON(p) && conval( p->left, o, p->right ) ){
                    117:                        zapright:
                    118:                        RO(p) = FREE;
                    119:                        p->left = makety( p->left, p->type, p->cdim, p->csiz );
                    120:                        p->op = FREE;
                    121:                        return( clocal( p->left ) );
                    122:                        }
                    123: 
                    124:                /* change muls to shifts */
                    125: 
                    126:                if( o==MUL && nncon(p->right) && (i=ispow2(RV(p)))>=0){
                    127:                        if( i == 0 ){ /* multiplication by 1 */
                    128:                                goto zapright;
                    129:                                }
                    130:                        o = p->op = LS;
                    131:                        p->right->type = p->right->csiz = INT;
                    132:                        RV(p) = i;
                    133:                        }
                    134: 
                    135:                /* change +'s of negative consts back to - */
                    136:                if( o==PLUS && nncon(p->right) && RV(p)<0 ){
                    137:                        RV(p) = -RV(p);
                    138:                        o = p->op = MINUS;
                    139:                        }
                    140:                break;
                    141: 
                    142:        case DIV:
                    143:                if( nncon( p->right ) && p->right->lval == 1 ) goto zapright;
                    144:                break;
                    145: 
                    146:        case EQ:
                    147:        case NE:
                    148:        case LT:
                    149:        case LE:
                    150:        case GT:
                    151:        case GE:
                    152:        case ULT:
                    153:        case ULE:
                    154:        case UGT:
                    155:        case UGE:
                    156:                if( !LCON(p) ) break;
                    157: 
                    158:                /* exchange operands */
                    159: 
                    160:                sp = p->left;
                    161:                p->left = p->right;
                    162:                p->right = sp;
                    163:                p->op = revrel[p->op - EQ ];
                    164:                break;
                    165: 
                    166:                }
                    167: 
                    168:        return(p);
                    169:        }
                    170: 
                    171: ispow2( c ) CONSZ c; {
                    172:        register i;
                    173:        if( c <= 0 || (c&(c-1)) ) return(-1);
                    174:        for( i=0; c>1; ++i) c >>= 1;
                    175:        return(i);
                    176:        }
                    177: 
                    178: nncon( p ) NODE *p; {
                    179:        /* is p a constant without a name */
                    180:        return( p->op == ICON && p->rval == NONAME );
                    181:        }

unix.superglobalmegacorp.com

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