#ifndef SSA_H #define SSA_H #include "const.h" #include "semantics.h" typedef struct COpr { enum { VAR, TMP, IMM } kind; union { CVar_t var; int imm; } info; } COpr; typedef struct CInst CInst; typedef CInst *CInst_t; struct CInst { enum { MOVE, BEQZ, /* conditional jump */ GOTO, /* unconditional jump */ ADD } op; COpr dest, src1, src2; CInst_t next, prev; }; typedef struct CBlock CBlock; typedef CBlock *CBlock_t; struct CBlock { CInst_t insts; /* instructions */ CBlock_t next, prev; int id; int ref; /* if referenced by any gotos */ }; CBlock_t cblock_create(); void cblock_append(CBlock_t cblk, CInst_t inst); CInst_t cblock_getback(CBlock_t cblk); int cblock_isempty(CBlock_t cblk); typedef struct CEdge CEdge; typedef struct CGraph { struct CEdge { CBlock *to; CEdge *next; } *head[MAX_BLOCK], *rhead[MAX_BLOCK]; } CGraph; void ssa_generate(CScope_t scope); #endif