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:     }

Defined functions

fortarg defined in line 13; used 3 times
ispow2 defined in line 171; used 1 times
nncon defined in line 178; used 5 times
optim defined in line 31; used 9 times

Defined variables

oflag defined in line 11; used 1 times
  • in line 41
revrel defined in line 30; used 1 times

Defined macros

LCON defined in line 7; used 3 times
LO defined in line 8; used 7 times
LV defined in line 9; never used
RCON defined in line 4; used 6 times
RO defined in line 5; used 3 times
RV defined in line 6; used 7 times
SWAP defined in line 3; used 1 times
  • in line 92
Last modified: 1982-08-28
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 610
Valid CSS Valid XHTML 1.0 Strict