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