# # for (int i=0; i<10; i++) { # c = a + b + i; # } # #------------------------------ # i = 0; # do { # j = a + b # c = j + i; # i++; # } while(i<10) # # @ predict jump #------------------------------- # # loop(entry):{} # loop(lp_eader):{ i=0; } # loop(lp_body):{ j=a+b; c=j+i; i=i+1; } # loop(lp_exit):{ i<10; } # loop(exit):{} # # E0:{loop(entry)->loop(lp_header)} # E1:{loop(lp_header)->loop(lp_body)} # E2:{loop(lp_body)->loop(lp_exit)} # E3:{loop(lp_exit)->loop(lp_body)} # E4:{loop(lp_exit)->loop(exit)} #------------------------------ # j = a + b; # for (int i=0; i<10; i++) { # c = j + i; # } #------------------------------ # # j = a + b; # i = 0; # do { # c = j + i; # } while(i<10) # # loop(entry):{} # loop(lp_pre_header):{ j=a+b; } # loop(lp_header):{ i=0; } # loop(lp_body):{ c=j+i; i=i+1; } # loop(lp_exit):{ i<10; } # loop(exit):{} # # E0:{loop(entry)->loop(lp_pre_header); } # E1:{loop(lp_pre_header)->loop(lp_header); } # E2:{loop(lp_header)->loop(lp_body); } # E3:{loop(lp_body)->loop(lp_exit); } # E4:{loop(lp_exit)->loop(lp_header); } # E5:{loop(lp_exit)->loop(exiy); } loop *lp = cfg->get_LoopInfo(); loop_node *entry = lp->get_LoopEntry(); loop_node *exit = lp->get_LoopExit(); loop_node *header = lp->get_LoopHeader(); loop_node *body = lp->get_LoopBody(); InstructionList<> = body->get_Instructions(); pre_header_list = []; foreach ii in InstructionList { if ( ii->isMoveAble2PreHeader() ) pre_header_list.push(ii); } if ( !pre_header_list.empty() ){ loop *pre_header = new loop(); cfg->set_Loop(pre_header); entry->del_Succ(header); entry->set_Succ(pre_header); pre_header->set_Succ(header); pre_header->set_Proc(entry); header->del_Proc(entry); header->set_Proc(pre_header); foreach ii in pre_header_list { pre_header->set_Instruction(ii); header->del_Instruction(ii); } } bool isMoveAble2PreHeader() { OperandList<> = Instruction(this)->get_Operands(); bool change = true; foreach op in OperandList { if( (Operand)op != result ) { if( (Operand)op->get_Parent() != loopInfo && (Opernand)op->isStable() ) change &= true; else change &= false; } } return change; }form wiki definition: loop pre-header Suppose block M is a dominator with several incoming edges, some of them being back edges (so M is a loop header). It is advantageous to several optimization passes to break M up into two blocks Mpre and Mloop. The contents of M and back edges are moved to Mloop, the rest of the edges are moved to point into Mpre, and a new edge from Mpre to Mloop is inserted (so that Mpre is the immediate dominator of Mloop). In the beginning, Mpre would be empty, but passes like loop-invariant code motion could populate it. Mpre is called the loop pre-header, and Mloop would be the loop header. refs: http://en.wikipedia.org/wiki/Control_flow_graph
2011年8月19日 星期五
pre_header
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言