# define SWAP(p,q) {sp=p; p=q; q=sp;}
# define RCON(p) (p->right->op==ICON)
# define RO(p) p->right->op
# define RV(p) p->right->lval
# define LCON(p) (p->left->op==ICON)
# define LO(p) p->left->op
# define LV(p) p->left->lval
/* fortran function arguments */
p
->left
= fortarg( p
->left
);
p
->right
= fortarg( p
->right
);
p
= buildtree( UNARY MUL
, p
, NIL
);
/* mapping relationals when the sides are reversed */
short revrel
[] ={ EQ
, NE
, GE
, GT
, LE
, LT
, UGE
, UGT
, ULE
, ULT
};
optim(p
) register NODE
*p
; {
/* local optimizations, most of which are probably machine independent */
if( (t
=BTYPE(p
->type
))==ENUMTY
|| t
==MOETY
) econvert(p
);
if( ty
== LTYPE
) return(p
);
if( ty
== BITYPE
) p
->right
= optim(p
->right
);
p
->left
= optim(p
->left
);
p
->right
= fortarg( p
->right
);
if( LO(p
) != NAME
) cerror( "& error" );
if( !andable(p
->left
) ) return(p
);
/* paint over the type of the left hand side with the type of the top */
if( LO(p
) != ICON
) break;
if( !nncon(p
->right
) ) break;
/* commutative ops; for now, just collect constants */
/* someday, do it right */
if( nncon(p
->left
) || ( LCON(p
) && !RCON(p
) ) ) SWAP( p
->left
, p
->right
);
/* make ops tower to the left, not the right */
/* now, put together again */
if(o
== PLUS
&& LO(p
) == MINUS
&& RCON(p
) && RCON(p
->left
) &&
conval(p
->right
, MINUS
, p
->left
->right
)){
if( RCON(p
) && LO(p
)==o
&& RCON(p
->left
) && conval( p
->right
, o
, p
->left
->right
) ){
else if( LCON(p
) && RCON(p
) && conval( p
->left
, o
, p
->right
) ){
p
->left
= makety( p
->left
, p
->type
, p
->cdim
, p
->csiz
);
return( clocal( p
->left
) );
/* change muls to shifts */
if( o
==MUL
&& nncon(p
->right
) && (i
=ispow2(RV(p
)))>=0){
if( i
== 0 ){ /* multiplication by 1 */
p
->right
->type
= p
->right
->csiz
= INT
;
/* change +'s of negative consts back to - */
if( o
==PLUS
&& nncon(p
->right
) && RV(p
)<0 ){
if( nncon( p
->right
) && p
->right
->lval
== 1 ) goto zapright
;
p
->op
= revrel
[p
->op
- EQ
];
if( c
<= 0 || (c
&(c
-1)) ) return(-1);
for( i
=0; c
>1; ++i
) c
>>= 1;
/* is p a constant without a name */
return( p
->op
== ICON
&& p
->rval
== NONAME
);