diff options
Diffstat (limited to 'ssa.h')
-rw-r--r-- | ssa.h | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -0,0 +1,53 @@ +#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 |