ref: c405c48a66cc5a7eeb192db81d42c08da2b19d73
dir: /cc2/optm.c/
#include <stddef.h> #include <stdint.h> #include <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; }