X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mono%2Fmini%2Fdominators.c;h=d4071234f12e0475f79ae9979d0572dcfc19973d;hb=d48b2f6a29866ce05af2e60023c893280a99ff8b;hp=d5f334dc226cce0b4a580ad6b244ea95aef3343b;hpb=f84f760a1c8a8c0ec6ae16b7f38d14a49d329ad7;p=mono.git diff --git a/mono/mini/dominators.c b/mono/mini/dominators.c index d5f334dc226..d4071234f12 100644 --- a/mono/mini/dominators.c +++ b/mono/mini/dominators.c @@ -6,12 +6,17 @@ * Paolo Molaro (lupus@ximian.com) * * (C) 2003 Ximian, Inc. + * Copyright 2011 Xamarin, Inc (http://www.xamarin.com) */ #include #include +#include +#include #include "mini.h" +#ifndef DISABLE_JIT + //#define DEBUG_DOMINATORS /* @@ -30,7 +35,6 @@ static void compute_dominators (MonoCompile *cfg) { int bindex, i, bitsize; - char* mem; MonoBasicBlock *entry; MonoBasicBlock **doms; gboolean changed; @@ -39,8 +43,6 @@ compute_dominators (MonoCompile *cfg) bitsize = mono_bitset_alloc_size (cfg->num_bblocks, 0); - mem = mono_mempool_alloc0 (cfg->mempool, bitsize * cfg->num_bblocks); - entry = cfg->bblocks [0]; doms = g_new0 (MonoBasicBlock*, cfg->num_bblocks); @@ -114,6 +116,9 @@ compute_dominators (MonoCompile *cfg) MonoBasicBlock *bb = cfg->bblocks [i]; MonoBasicBlock *cbb; MonoBitSet *dominators; + char *mem; + + mem = mono_mempool_alloc0 (cfg->mempool, bitsize); bb->dominators = dominators = mono_bitset_mem_new (mem, cfg->num_bblocks, 0); mem += bitsize; @@ -126,7 +131,7 @@ compute_dominators (MonoCompile *cfg) bb->idom = doms [bb->dfn]; if (bb->idom) - bb->idom->dominated = g_list_prepend (bb->idom->dominated, bb); + bb->idom->dominated = g_slist_prepend_mempool (cfg->mempool, bb->idom->dominated, bb); } /* The entry bb */ @@ -139,7 +144,7 @@ compute_dominators (MonoCompile *cfg) #ifdef DEBUG_DOMINATORS printf ("DTREE %s %d\n", mono_method_full_name (cfg->method, TRUE), - mono_method_get_header (cfg->method)->num_clauses); + cfg->header->num_clauses); for (i = 0; i < cfg->num_bblocks; ++i) { MonoBasicBlock *bb = cfg->bblocks [i]; printf ("BB%d(dfn=%d) (IDOM=BB%d): ", bb->block_num, bb->dfn, bb->idom ? bb->idom->block_num : -1); @@ -148,6 +153,8 @@ compute_dominators (MonoCompile *cfg) #endif } +#if 0 + static void check_dominance_frontier (MonoBasicBlock *x, MonoBasicBlock *t) { @@ -176,6 +183,8 @@ check_dominance_frontier (MonoBasicBlock *x, MonoBasicBlock *t) } } +#endif + /** * Compute dominance frontiers using the algorithm from the same paper. */ @@ -254,7 +263,7 @@ df_set (MonoCompile *m, MonoBitSet* dest, MonoBitSet *set) int i; mono_bitset_foreach_bit (set, i, m->num_bblocks) { - mono_bitset_union (dest, m->bblocks [i]->dfrontier); + mono_bitset_union_fast (dest, m->bblocks [i]->dfrontier); } } @@ -335,7 +344,7 @@ mono_compute_natural_loops (MonoCompile *cfg) if ((cb->dfn && mono_bitset_test_fast (in_loop_blocks, cb->dfn)) || (!cb->dfn && g_list_find (h->loop_blocks, cb))) continue; - h->loop_blocks = g_list_prepend (h->loop_blocks, cb); + h->loop_blocks = g_list_prepend_mempool (cfg->mempool, h->loop_blocks, cb); cb->nesting++; if (cb->dfn) mono_bitset_set_fast (in_loop_blocks, cb->dfn); @@ -351,7 +360,7 @@ mono_compute_natural_loops (MonoCompile *cfg) /* add the header if not already there */ if (!((h->dfn && mono_bitset_test_fast (in_loop_blocks, h->dfn)) || (!h->dfn && g_list_find (h->loop_blocks, h)))) { - h->loop_blocks = g_list_prepend (h->loop_blocks, h); + h->loop_blocks = g_list_prepend_mempool (cfg->mempool, h->loop_blocks, h); h->nesting++; } } @@ -376,6 +385,9 @@ mono_compute_natural_loops (MonoCompile *cfg) /* The loop body start is the first bblock in the order they will be emitted */ MonoBasicBlock *h = cfg->bblocks [i]; MonoBasicBlock *body_start = h; +#if defined(__native_client_codegen__) + MonoInst *inst; +#endif GList *l; for (l = h->loop_blocks; l; l = l->next) { @@ -386,6 +398,12 @@ mono_compute_natural_loops (MonoCompile *cfg) } } +#if defined(__native_client_codegen__) + /* Instrument the loop (GC back branch safe point) */ + MONO_INST_NEW (cfg, inst, OP_NACL_GC_SAFE_POINT); + inst->dreg = mono_alloc_dreg (cfg, STACK_I4); + mono_bblock_insert_before_ins (body_start, NULL, inst); +#endif body_start->loop_body_start = 1; } } @@ -414,7 +432,6 @@ clear_idominators (MonoCompile *cfg) for (i = 0; i < cfg->num_bblocks; ++i) { if (cfg->bblocks[i]->dominated) { - g_list_free (cfg->bblocks[i]->dominated); cfg->bblocks[i]->dominated = NULL; } } @@ -429,10 +446,7 @@ clear_loops (MonoCompile *cfg) for (i = 0; i < cfg->num_bblocks; ++i) { cfg->bblocks[i]->nesting = 0; - if (cfg->bblocks[i]->loop_blocks) { - g_list_free (cfg->bblocks[i]->loop_blocks); - cfg->bblocks[i]->loop_blocks = NULL; - } + cfg->bblocks[i]->loop_blocks = NULL; } cfg->comp_done &= ~MONO_COMP_LOOPS; @@ -446,3 +460,12 @@ mono_free_loop_info (MonoCompile *cfg) if (cfg->comp_done & MONO_COMP_LOOPS) clear_loops (cfg); } + +#else /* DISABLE_JIT */ + +void +mono_free_loop_info (MonoCompile *cfg) +{ +} + +#endif /* DISABLE_JIT */