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