diff options
Diffstat (limited to 'ir_suif.hh')
-rw-r--r-- | ir_suif.hh | 212 |
1 files changed, 0 insertions, 212 deletions
diff --git a/ir_suif.hh b/ir_suif.hh deleted file mode 100644 index 9c3d82d..0000000 --- a/ir_suif.hh +++ /dev/null @@ -1,212 +0,0 @@ -#ifndef IR_SUIF_HH -#define IR_SUIF_HH - -#include <map> -#include <code_gen/CG_suifRepr.h> -#include <code_gen/CG_suifBuilder.h> -#include "ir_code.hh" - -struct IR_suifScalarSymbol: public IR_ScalarSymbol { - var_sym *vs_; - - IR_suifScalarSymbol(const IR_Code *ir, var_sym *vs) { - ir_ = ir; - vs_ = vs; - } - std::string name() const; - int size() const; - bool operator==(const IR_Symbol &that) const; - IR_Symbol *clone() const; -}; - - -struct IR_suifArraySymbol: public IR_ArraySymbol { - var_sym *vs_; - int indirect_; - int offset_; - - IR_suifArraySymbol(const IR_Code *ir, var_sym *vs, int indirect = 0, int offset = 0) { - ir_ = ir; - vs_ = vs; - indirect_ = indirect; - offset_ = offset; - } - std::string name() const; - int elem_size() const; - int n_dim() const; - omega::CG_outputRepr *size(int dim) const; - bool operator==(const IR_Symbol &that) const; - IR_ARRAY_LAYOUT_TYPE layout_type() const; - IR_Symbol *clone() const; -}; - - -struct IR_suifConstantRef: public IR_ConstantRef { - union { - omega::coef_t i_; - double f_; - }; - - IR_suifConstantRef(const IR_Code *ir, omega::coef_t i) { - ir_ = ir; - type_ = IR_CONSTANT_INT; - i_ = i; - } - IR_suifConstantRef(const IR_Code *ir, double f) { - ir_ = ir; - type_ = IR_CONSTANT_FLOAT; - f_ = f; - } - omega::coef_t integer() const {assert(is_integer()); return i_;} - bool operator==(const IR_Ref &that) const; - omega::CG_outputRepr *convert(); - IR_Ref *clone() const; -}; - - -struct IR_suifScalarRef: public IR_ScalarRef { - instruction *ins_pos_; - int op_pos_; // -1 means destination operand, otherwise source operand - var_sym *vs_; - - IR_suifScalarRef(const IR_Code *ir, var_sym *sym) { - ir_ = ir; - ins_pos_ = NULL; - vs_ = sym; - } - IR_suifScalarRef(const IR_Code *ir, instruction *ins, int pos) { - ir_ = ir; - ins_pos_ = ins; - op_pos_ = pos; - operand op; - if (pos == -1) - op = ins->dst_op(); - else - op = ins->src_op(pos); - assert(op.is_symbol()); - vs_ = op.symbol(); - } - bool is_write() const; - IR_ScalarSymbol *symbol() const; - bool operator==(const IR_Ref &that) const; - omega::CG_outputRepr *convert(); - IR_Ref *clone() const; -}; - - -struct IR_suifArrayRef: public IR_ArrayRef { - in_array *ia_; - - IR_suifArrayRef(const IR_Code *ir, in_array *ia) { - ir_ = ir; - ia_ = ia; - } - bool is_write() const; - omega::CG_outputRepr *index(int dim) const; - IR_ArraySymbol *symbol() const; - bool operator==(const IR_Ref &that) const; - omega::CG_outputRepr *convert(); - IR_Ref *clone() const; -}; - - -struct IR_suifLoop: public IR_Loop { - tree_for *tf_; - - IR_suifLoop(const IR_Code *ir, tree_for *tf) { ir_ = ir; tf_ = tf; } - ~IR_suifLoop() {} - IR_ScalarSymbol *index() const; - omega::CG_outputRepr *lower_bound() const; - omega::CG_outputRepr *upper_bound() const; - IR_CONDITION_TYPE stop_cond() const; - IR_Block *body() const; - int step_size() const; - IR_Block *convert(); - IR_Control *clone() const; -}; - - -struct IR_suifBlock: public IR_Block { - tree_node_list *tnl_; - tree_node_list_e *start_, *end_; - - IR_suifBlock(const IR_Code *ir, tree_node_list *tnl, tree_node_list_e *start, tree_node_list_e *end) { - ir_ = ir; tnl_ = tnl; start_ = start; end_ = end; - } - IR_suifBlock(const IR_Code *ir, tree_node_list *tnl) { - ir_ = ir; tnl_ = tnl; start_ = tnl_->head(); end_ = tnl_->tail(); - } - ~IR_suifBlock() {} - omega::CG_outputRepr *extract() const; - IR_Control *clone() const; -}; - - -struct IR_suifIf: public IR_If { - tree_if *ti_; - - IR_suifIf(const IR_Code *ir, tree_if *ti) { ir_ = ir; ti_ = ti; } - ~IR_suifIf() {} - omega::CG_outputRepr *condition() const; - IR_Block *then_body() const; - IR_Block *else_body() const; - IR_Block *convert(); - IR_Control *clone() const; -}; - - -// singleton class for global suif initialization -class IR_suifCode_Global_Init { -private: - static IR_suifCode_Global_Init *pinstance; -protected: - IR_suifCode_Global_Init(); - IR_suifCode_Global_Init(const IR_suifCode_Global_Init &); - IR_suifCode_Global_Init & operator= (const IR_suifCode_Global_Init &); -public: - static IR_suifCode_Global_Init *Instance(); - ~IR_suifCode_Global_Init() {} -}; - -// singleton class for global suif cleanup -class IR_suifCode_Global_Cleanup { -public: - IR_suifCode_Global_Cleanup() {} - ~IR_suifCode_Global_Cleanup(); -}; - -class IR_suifCode: public IR_Code{ -protected: - file_set_entry *fse_; - proc_sym *psym_; - proc_symtab *symtab_; - bool is_fortran_; - -public: - IR_suifCode(const char *filename, int proc_num); - ~IR_suifCode(); - - IR_ScalarSymbol *CreateScalarSymbol(const IR_Symbol *sym, int memory_type = 0); - IR_ArraySymbol *CreateArraySymbol(const IR_Symbol *sym, std::vector<omega::CG_outputRepr *> &size, int memory_type = 0); - IR_ScalarRef *CreateScalarRef(const IR_ScalarSymbol *sym); - IR_ArrayRef *CreateArrayRef(const IR_ArraySymbol *sym, std::vector<omega::CG_outputRepr *> &index); - int ArrayIndexStartAt() {if (is_fortran_) return 1; else return 0;} - - std::vector<IR_ArrayRef *> FindArrayRef(const omega::CG_outputRepr *repr) const; - std::vector<IR_ScalarRef *> FindScalarRef(const omega::CG_outputRepr *repr) const; - std::vector<IR_Control *> FindOneLevelControlStructure(const IR_Block *block) const; - IR_Block *MergeNeighboringControlStructures(const std::vector<IR_Control *> &controls) const; - IR_Block *GetCode() const; - void ReplaceCode(IR_Control *old, omega::CG_outputRepr *repr); - void ReplaceExpression(IR_Ref *old, omega::CG_outputRepr *repr); - - IR_OPERATION_TYPE QueryExpOperation(const omega::CG_outputRepr *repr) const; - IR_CONDITION_TYPE QueryBooleanExpOperation(const omega::CG_outputRepr *repr) const; - std::vector<omega::CG_outputRepr *> QueryExpOperand(const omega::CG_outputRepr *repr) const; - IR_Ref *Repr2Ref(const omega::CG_outputRepr *) const; - - friend class IR_suifArraySymbol; - friend class IR_suifArrayRef; -}; - -#endif |