shithub: scc

ref: 25ee0a4512e705ff8017b87c8fc6ae6dc94732ce
dir: /cc2/optm.c/

View raw version

#include <stddef.h>
#include <stdint.h>

#include "../inc/cc.h"
#include "cc2.h"


#include <stdio.h>

static Node *
optcasts(Node *np, Type *tp)
{
	if (!np)
		return NULL;

repeat:
	switch (np->op) {
	case OCAST:
		/* TODO: be careful with the sign */
		if (np->type.c_int && np->type.size >= tp->size) {
			np = np->left;
			goto repeat;
		}
		break;
	case OASSIG:
		tp = &np->type;
		break;
	default:
		np->type = *tp;
	}

	np->left = optcasts(np->left, tp);
	np->right = optcasts(np->right, tp);
	return np;			
}

Node *
optimize(Node *np)
{
	np = optcasts(np, &np->type);
	return np;
}