CFG *cfg = Parser(['file','code','temp_IR']); # Blocks[BB(basicblock)]; # Edges [forward,backward,cross,tree,fallthrough(without branch condition)]; # SubGraph(DFG): data flow graph ex: c = a + b; # # @ ex: if ( a==1 ) { c = a+b; } else { c = a-b; } # # cfg_BB(0); # condition # cfg_BB(0)->dfg_BB(0) # a==1 # dfg_BB(0)->instruction_ii(0) # a==1 # instruction_ii(0)->operator(0)[label,type,operand] # int(a) eq 1 # cfg_BB(1): #If(true) # ... # cfg_BB(2): #If(false) # ... # cfg_EE(0){cfg_BB(0),cfg_BB(1),'E0',0}; # edge 'E0' weighted 0 cfg_BB(0)->cfg_BB(1) # ... # linklist gen list<>cfg_order = cfg->search_methods([deep_first_search(), breadth_first_search(), post_order_search(), pre_order_search(), topology_sequence_search(), reverse_topology_sequence_search()]); # cfg_order = [ cfg_BB(0), cfg_BB(1), cfg_BB(2) ]; # find domin path, check dependence for each BasicBlock Dom *dom_tree = Dom(cfg); list<>dom_order = dom_tree->search_methods([post_order_domin(), pre_order_domin(), imm_domin()]); # dom_order = { Dom(cfg_BB(0):{cfg_BB(0)}), Dom(cfg_BB(1):{cfg_BB(0),cfg_BB(1)}), Dom(cfg_BB(2):{cfg_BB(0),cfg_BB(2)}) }; Dom_Graph *dom_graph = dom_tree->gen_graph(); # cfg_BB(0) @ dom_graph(directed graph) # | # ----------- # | | # V V # cfg_BB(1) cfg_BB(2) # find the correlation for each instruction Reg *reg = Reg(cfg); list<>reg_bb_order = reg->search_SSA(); # reg_bb_order = { BB0:[ cfg_BB(0)->dfg_BB(0)->(a:0), cfg_BB(0)->dfg_BB(0)->(eq:0), cfg_BB(0)->dfg_BB(0)->(1:0) ], # BB1:[ cfg_BB(1)->dfg_BB(1)->(c:1), cfg_BB(1)->dfg_BB(1)->(add:1), cfg_BB(1)->dfg_BB(1)->(a:1), cfg_BB(1)->dfg_BB(1)->(b:1) ], # BB2:[ cfg_BB(2)->dfg_BB(2)->(c:2), cfg_BB(2)->dfg_BB(2)->(sub:2), cdg_BB(2)->dfg_BB(2)->(a:2), cfg_BB(2)->dfg_BB(2)->(b:2) ] } SSA_Graph *ssa_graph = reg->toSSA(); # (a:0) eq (1:0) # | # -------------------------- # | | # V V # (c:1) add (a:1) (b:1) (c:2) sub (a:2) (b:2) list<> phi_order = ssa_graph->search_PHI(c); # phi_order = [ BB1:c:1, BB2:c:2 ] @ node c #CFG *nw_cfg = ssa_graph->toCFG(); # static analysis for BasicBlock such as if else, while, ... Strc *strc_tree = Strc(cfg); strc_tree->search_methods([Block(), IfThen(), IfThenElse(), SelfLoop(), NaturalLoop(), Unreachable()]); strc_tree->analysis([DeadCodeCut(), LoadStroeMerge(), ParallelMerge(), SerialMerge()]) # DeadcodeCut ex: for(i=0; i<10; i++) { a=1; } unreachable @ a=1; # LoadStoreMerge ex: c = a[10]; c = a[10]; # a[10] = c+1; = d = c+1; # d = a[10]; # SerialMerge ex: BB(0) goto BB(1) @ if and only if BB(0)->BB(1) has one directed edge and BB(1) has only one sink edge. # merge BB(0) and BB(1) to BB(0-1) # ParallelMerge ex: BB(0) and BB(1) are dependent @ if and only if Dom(BB(0)) != Dom(BB(1)), path(BB(0)) != path(BB(1)) # BB(0) BB(1) can be parallel cfg = str_tree->update_cfg(); # find Branck location, and predict it happened or not, Div_Graph *div_graph = Div_Graph(cfg); div_graph->analysis([BranchPredict(), BranchCut()]); # ex: if ( a==1 ) { if( b==1 ) { c=a+b; } } # | # if( a==1 && b==1 ) { c=a+b; } cfg = div_graph->update_cfg(); # platform Assignment # X86/Arm/Mips... X86 *x86 = X86(cfg); # x86 SIMD analysis, ex: MAC d = (a*b)+c merge a = a*b and d = a+c x86->analysis_SIMD(); ...ref: Muchnick book
2011年8月16日 星期二
sample compiler flow
寫了個 sample compiler flow,不過這裡面還有很多議題可以討論,就等小弟我慢慢的研究吧.
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言