aboutsummaryrefslogblamecommitdiff
path: root/ssa.h
blob: e9ff81ee2b47049e4f328f66cf9b5dcd8a3e74b2 (plain) (tree)





















                                      
             
                                        

                                                                                                         




























                                                    
#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 */
        BNEZ,
        GOTO,   /* unconditional jump */
        ARR,    /* displacement */
        MUL, DIV, MOD, ADD, SUB, SHL, SHR, AND, XOR, OR, LOR, LAND, NEG, NOR, SEQ, EQ, NE, LT, GT, LE, GE
    } 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