-
lqw authoredaee8d1fc
#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