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)
沒有留言:
張貼留言