BasicBlock.h 4.47 KiB
#ifndef MISAKA_BASICBLOCK
#define MISAKA_BASICBLOCK
#include <list>
#include <set>
#include <string>
#ifdef DEBUG
#include <cassert>
#endif
#include "Value.h"
#include "Instruction.h"
#include "Module.h"
#include "Function.h"
class Function;
class Instruction;
class Module;
class IRVisitor;
class BasicBlock : public Value
public:
    static BasicBlock *__init__(Module *m, const std::string &name, Function *parent);
    virtual ~BasicBlock() = default;
    Function *get_parent();
    void set_parent(Function *parent);
    static BasicBlock *create_basicblock(Function *parent, Module *m);
    void add_instruction(Instruction *instr);
    void add_instruction_begin(Instruction *instr);
    std::list<Instruction *>::iterator insert_instruction(Instruction *instr, std::list<Instruction *>::iterator insert_pos);
    void add_instruction(std::list<Instruction *>::iterator iter, Instruction *instr);
    std::list<Instruction *> &get_instructions();
    // WARNING:严禁还有引用的时候删除指令
    void remove_instruction(Instruction *instr);
    void remove_last_instruction();
    void move_last_to_begin();
    // Returns the terminator instruction if the block is well-formed or nullptr otherwise(if not).
    const Instruction *get_terminator() const;
    Instruction *get_terminator() {
        return const_cast<Instruction *>(static_cast<const BasicBlock *>(this)->get_terminator());
    std::list<BasicBlock *> &get_pre_basic_blocks();
    std::list<BasicBlock *> &get_succ_basic_blocks();
    void add_pre_basic_block(BasicBlock *bb);
    void add_succ_basic_block(BasicBlock *bb);
    void remove_pre_basic_block(BasicBlock *bb);
    void remove_succ_basic_block(BasicBlock *bb);
    virtual std::string print();
    virtual void accept(IRVisitor *visitor) final { visitor->visit(*this); }
    //  dominate tree
    /*******CFG_analyse*******/
    int get_incoming_branch(){return incoming_branch;}
    void incoming_add(){incoming_branch++;}
    void incoming_decrement(){incoming_branch--;}
    bool is_incoming_zero(){return incoming_branch==0;}
    void incoming_reset(){incoming_branch = 0;}
    int get_loop_depth(){return loop_depth;}
    void loop_depth_add(){loop_depth++;}
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
void loop_depth_reset(){loop_depth = 0;} /*******CFG_analyse*******/ bool is_empty(){return instr_list.empty();} /****************dominate tree API****************/ void set_idom(BasicBlock *bb) {idom_ = bb;} BasicBlock* get_idom(){return idom_;} void add_dom_frontier(BasicBlock* bb){dom_frontier_.insert(bb);} void add_rdom_frontier(BasicBlock* bb){rdom_frontier_.insert(bb);} void clear_rdom_frontier(){rdom_frontier_.clear();} auto add_rdom(BasicBlock* bb){return rdoms_.insert(bb);} void clear_rdom(){rdoms_.clear();} std::set<BasicBlock *> &get_dom_frontier(){return dom_frontier_;} std::set<BasicBlock *> &get_rdom_frontier(){return rdom_frontier_;} std::set<BasicBlock *> &get_rdoms(){return rdoms_;} // void set_live_in(std::set<Value*> in){live_in = in;} // void set_live_out(std::set<Value*> out){live_out = out;} // std::set<Value*> &get_live_in(){return live_in;} // std::set<Value*> &get_live_out(){return live_out;} void incoming_branch_add(){incoming_branch++;} // void loop_depth_add(){loop_depth++;} void reset_incoming_branch_num(){incoming_branch=0;} void reset_loop_depth(){loop_depth=0;} int get_incoming_branch_num(){return incoming_branch;} // int get_loop_depth(){return loop_depth;} void incoming_branch_decrease(){incoming_branch--;} // CFG loop analyze // int get_incoming_branch(){return incoming_branch;} // void incoming_add(){incoming_branch++;} // void incoming_decrement(){incoming_branch--;} // bool is_incoming_zero(){return incoming_branch==0;} // void incoming_reset(){incoming_branch = 0;} // void loop_depth_reset(){loop_depth = 0;} private: BasicBlock(Type *type, const std::string &name, Function *parent); Function *parent; std::list<BasicBlock *> pre_basic_blocks; std::list<BasicBlock *> succ_basic_blocks; std::list<Instruction *> instr_list; //支配树信息 BasicBlock* idom_ = nullptr; std::set<BasicBlock*> dom_frontier_; std::set<BasicBlock*> rdom_frontier_; std::set<BasicBlock*> rdoms_; //活跃变量分析 // std::set<Value*> use_var; // std::set<Value*> def_var; // std::set<Value*> live_in; // std::set<Value*> live_out; int incoming_branch = 0; int loop_depth = 0; }; #endif