DataFlowGraph *dfg = DataFlowGraph([]); foreach (BasicBlock)bb in (DataFlowGraph)dfg->get_BasicBlocks() { foreach (BasicBlock)preProc in (BasicBlock)bb->get_PreProcessor() { pre_aLiveOutList = preProc->get_aLiveOutRegs(); foreach (Register)inReg in (BasicBlock)bb->get_aLiveInRegs() { if( pre_aLiveOutList.find(inReg) != Pre_aLiveOutList.end() ) { (Register)OutReg = preProc->get_Reg(inReg->get_ID()); if( !PHI_Exist(OutReg,InReg) ) { # deep copy the old register items 2 new register, such as "procs", "succs"... { new_OutReg, new_InReg } = PHI_Insert(OutReg,InReg); # remove the old register pointer bb->remove_reg(InReg); bb->set_reg(new_InReg); # update the graph preProc->remove_reg(OutReg); PreProc->set_reg(new_OutReg); } } } } } ######################### # B1:{ a=1; }; B2:{ a=2; }; B3:{ a=a+1; } # E1:{B1->B3}; E2{B2->B3}; # # SSA graph # B1: { a(1)=1; }; B2:{ a(2)=2; }; B3:{ phi a(3):[ B1:a(1), B2:a(2)]; a(3)=a(3)+1; }Refs: SSA wiki http://en.wikipedia.org/wiki/Static_single_assignment_form Use-define_chain for load store http://en.wikipedia.org/wiki/Use-define_chain
2011年8月17日 星期三
SSA (static single assignment)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言