#
# for(i=0; i<2; i++) {
# c[i] = a[i] + a[i+1];
# }
#
#----------------------------
#
# c[0] = a[0] + a[1];
# c[1] = a[1] + a[2];
#
#----------------------------
# @ deepest loop case without subloop loop *lp =
cfg->get_LoopInfo();
Condition *cond = lp->get_Condition();
loop_node *Entry = lp->get_LoopEntry();
loop_node *Body = lp->get_LoopBody();
loop_node *Exit = lp->get_LoopExit();
#loop lp->get_SubLoops();
faltList<> = cond->get_Flattens();
int run_size = do_run_size();
InstructionList<> = Body->get_Instructions();
tmp_InstructionList = [];
for(int i =0; iget_Operand_Src1();
Operand *src2 = (Instruction)ii->get_Opernad_Src2();
Operand *dst = (Instruction)ii->get_Opernad_Dst();
Operator *op = (Instruction)ii->get_Operator();
if( src1->isArrayAccess() && faltList.find(src1->get_Array_ID()) != faltList.end() ) {
int new_src1_inx = faltList.find(src1->get_Array_ID())->get_Lists()->get_Value(i) +
src1->get_Array_ID()->get_Offset();
Operand *new_src1 = new Operand(src1->get_Array(),new_src1_inx);
}
if( src2->isArrayAccess() && faltList.find(src2->get_Array_ID()) != faltList.end() ) {
int new_src2_inx = faltList.find(src2->get_Array_ID())->get_Lists()->get_Value(i) +
src2->get_Array_ID()->get_Offset();
Operand *new_src2 = new Operand(src2->get_Array(),new_src2_inx);
}
if( dst->isArrayAccess() && faltList.find(dst->get_Array_ID()) != faltList.end() ) {
int new_dst_inx = faltList.find(dst->get_Array_ID())->get_Lists()->get_Value(i) +
dst->get_Array_ID()->get_Offset();
Operand *new_dst = new Operand(dst->get_Array(),new_dst_inx);
}
Instruction *new_ii = new Instruction(new_dst,new_src1,op,new_src2);
tmp_InstructionList.push(new_ii);
}
}
BasicBlock *lp_pre = Entry->get_Proc();
BasicBlock *lp_nxt = Exit->get_Succ();
cfg->del_Loop_BB([Entry,Pre_Header,Header,Body,Exit]);
cfg->del_Loop_Edge([{lp_pre,Entry},{Entry,Pre_Header},{Pre_Header,Header},{Header,Body},{Body,Exit},{Exit,Header}]);
BasicBlock *bb_entry = new BasicBlock();
BasicBlock *bb_exit = new BasicBlock();
BasicBlock *bb_cont = new BasicBlock();
cfg->set_BasicBlock([bb_entry,bb_exit,bb_cont]);
cfg->set_Edge([{lp_pre,bb_entry},{bb_entry,bb_cont},{bb_cont,bb_exit},{bb_exit,lp_nxt}]);
foreach ii in tmp_InstructionList
bb_cont.set_Instruction(ii);
# { i:[0,1], ... }
int do_run_size() {
int num = 0;
foreach flat in faltList {
foreach id in flat->get_IDs() {
if ( num == 0 )
num = id->get_Lists().size()
else
assert( id->get_Lists().size() == num && "size error in loop condition" );
}
}
return num;
}
2011年8月22日 星期一
unroll loop
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言