mono_compile_iterated_dfrontier (struct MonoCompile * m, struct MonoBitSet * set)
{
  unsigned int D.22375;
  unsigned int D.22376;
  unsigned int bitsize.0;
  struct MonoMemPool * D.22378;
  void * D.22379;
  unsigned int D.22380;
  unsigned int D.22381;
  struct MonoBitSet * D.22382;
  struct MonoBitSet * result;
  int bitsize;
  int count1;
  int count2;

  D.22375 = m->num_bblocks;
  D.22376 = mono_bitset_alloc_size (D.22375, 0);
  bitsize = (int) D.22376;
  D.22375 = m->num_bblocks;
  bitsize.0 = (unsigned int) bitsize;
  D.22378 = m->mempool;
  D.22379 = mono_mempool_alloc0 (D.22378, bitsize.0);
  result = mono_bitset_mem_new (D.22379, D.22375, 0);
  df_set (m, result, set);
  D.22380 = mono_bitset_count (result);
  count2 = (int) D.22380;
  <D.22306>:
  count1 = count2;
  df_set (m, result, result);
  D.22381 = mono_bitset_count (result);
  count2 = (int) D.22381;
  if (count2 > count1) goto <D.22306>; else goto <D.22307>;
  <D.22307>:
  D.22382 = result;
  return D.22382;
}


df_set (struct MonoCompile * m, struct MonoBitSet * dest, struct MonoBitSet * set)
{
  struct MonoBasicBlock * * D.22384;
  long unsigned int D.22385;
  long unsigned int D.22386;
  struct MonoBasicBlock * * D.22387;
  struct MonoBasicBlock * D.22388;
  long unsigned int D.22389;
  long unsigned int D.22390;
  long unsigned int D.22391;
  long unsigned int D.22392;
  long unsigned int D.22393;
  unsigned int i.1;
  unsigned int D.22395;
  int i;

  i = mono_bitset_find_start (set);
  goto <D.22296>;
  <D.22295>:
  {
    struct MonoBitSet * tmp_src;
    struct MonoBitSet * tmp_dest;
    int i;
    int size;

    D.22384 = m->bblocks;
    D.22385 = (long unsigned int) i;
    D.22386 = D.22385 * 8;
    D.22387 = D.22384 + D.22386;
    D.22388 = *D.22387;
    tmp_src = D.22388->dfrontier;
    tmp_dest = dest;
    D.22389 = tmp_dest->size;
    D.22390 = D.22389 / 64;
    size = (int) D.22390;
    i = 0;
    goto <D.22293>;
    <D.22292>:
    D.22391 = tmp_dest->data[i];
    D.22392 = tmp_src->data[i];
    D.22393 = D.22391 | D.22392;
    tmp_dest->data[i] = D.22393;
    i = i + 1;
    <D.22293>:
    if (i < size) goto <D.22292>; else goto <D.22294>;
    <D.22294>:
  }
  i = mono_bitset_find_first (set, i);
  <D.22296>:
  i.1 = (unsigned int) i;
  D.22395 = m->num_bblocks;
  if (i.1 < D.22395) goto <D.22396>; else goto <D.22297>;
  <D.22396>:
  if (i >= 0) goto <D.22295>; else goto <D.22297>;
  <D.22297>:
}


mono_compile_dominator_info (struct MonoCompile * cfg, int dom_flags)
{
  int D.22397;
  unsigned int D.22400;
  unsigned int D.22401;
  int D.22404;
  unsigned int D.22407;

  D.22397 = dom_flags & 1;
  if (D.22397 != 0) goto <D.22398>; else goto <D.22399>;
  <D.22398>:
  D.22400 = cfg->comp_done;
  D.22401 = D.22400 & 1;
  if (D.22401 == 0) goto <D.22402>; else goto <D.22403>;
  <D.22402>:
  compute_dominators (cfg);
  <D.22403>:
  <D.22399>:
  D.22404 = dom_flags & 4;
  if (D.22404 != 0) goto <D.22405>; else goto <D.22406>;
  <D.22405>:
  D.22400 = cfg->comp_done;
  D.22407 = D.22400 & 4;
  if (D.22407 == 0) goto <D.22408>; else goto <D.22409>;
  <D.22408>:
  compute_dominance_frontier (cfg);
  <D.22409>:
  <D.22406>:
}


compute_dominators (struct MonoCompile * cfg)
{
  unsigned int D.22410;
  unsigned int D.22411;
  _Bool D.22412;
  long int D.22413;
  long int D.22414;
  unsigned int D.22417;
  unsigned int D.22418;
  struct MonoBasicBlock * * D.22419;
  long unsigned int D.22420;
  long unsigned int D.22421;
  int D.22422;
  long unsigned int D.22423;
  long unsigned int D.22424;
  struct MonoBasicBlock * * D.22425;
  long unsigned int D.22426;
  long unsigned int D.22427;
  struct MonoBasicBlock * * D.22428;
  struct MonoBasicBlock * * D.22429;
  long unsigned int D.22430;
  long unsigned int D.22431;
  struct MonoBasicBlock * * D.22432;
  int D.22435;
  long unsigned int D.22436;
  long unsigned int D.22437;
  struct MonoBasicBlock * * D.22438;
  struct MonoBasicBlock * D.22439;
  short int D.22442;
  int D.22443;
  struct MonoBasicBlock * D.22444;
  _Bool D.22447;
  long int D.22448;
  long int D.22449;
  int D.22454;
  long unsigned int D.22456;
  long unsigned int D.22457;
  struct MonoBasicBlock * * D.22458;
  struct MonoBasicBlock * D.22459;
  int D.22462;
  int D.22463;
  long unsigned int D.22466;
  long unsigned int D.22467;
  struct MonoBasicBlock * * D.22468;
  long unsigned int D.22470;
  long unsigned int D.22471;
  struct MonoBasicBlock * * D.22472;
  int D.22473;
  long unsigned int D.22474;
  long unsigned int D.22475;
  struct MonoBasicBlock * * D.22476;
  struct MonoBasicBlock * D.22477;
  unsigned int bindex.2;
  struct MonoBasicBlock * * D.22484;
  unsigned int bitsize.3;
  struct MonoMemPool * D.22486;
  sizetype D.22487;
  int D.22488;
  long unsigned int D.22489;
  long unsigned int D.22490;
  long unsigned int D.22491;
  int D.22492;
  long unsigned int D.22493;
  long unsigned int D.22494;
  long unsigned int D.22497;
  struct MonoBasicBlock * * D.22498;
  int D.22499;
  long unsigned int D.22500;
  long unsigned int D.22501;
  long unsigned int D.22502;
  int D.22503;
  long unsigned int D.22504;
  long unsigned int D.22505;
  long unsigned int D.22506;
  struct MonoBasicBlock * * D.22507;
  struct MonoBasicBlock * D.22508;
  struct MonoBasicBlock * D.22509;
  struct GSList * D.22512;
  struct GSList * D.22513;
  long unsigned int D.22514;
  long unsigned int D.22515;
  unsigned int i.4;
  unsigned int D.22517;
  int bindex;
  int i;
  int bitsize;
  struct MonoBasicBlock * entry;
  struct MonoBasicBlock * * doms;
  gboolean changed;

  D.22410 = cfg->comp_done;
  D.22411 = D.22410 & 1;
  D.22412 = D.22411 != 0;
  D.22413 = (long int) D.22412;
  D.22414 = __builtin_expect (D.22413, 0);
  if (D.22414 != 0) goto <D.22415>; else goto <D.22416>;
  <D.22415>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 42, "!(cfg->comp_done & MONO_COMP_DOM)");
  <D.22416>:
  D.22417 = cfg->num_bblocks;
  D.22418 = mono_bitset_alloc_size (D.22417, 0);
  bitsize = (int) D.22418;
  D.22419 = cfg->bblocks;
  entry = *D.22419;
  D.22417 = cfg->num_bblocks;
  D.22420 = (long unsigned int) D.22417;
  D.22421 = D.22420 * 8;
  doms = monoeg_malloc0 (D.22421);
  D.22422 = entry->dfn;
  D.22423 = (long unsigned int) D.22422;
  D.22424 = D.22423 * 8;
  D.22425 = doms + D.22424;
  *D.22425 = entry;
  changed = 1;
  goto <D.22245>;
  <D.22244>:
  changed = 0;
  bindex = 0;
  goto <D.22242>;
  <D.22241>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * idom;

    D.22419 = cfg->bblocks;
    D.22426 = (long unsigned int) bindex;
    D.22427 = D.22426 * 8;
    D.22428 = D.22419 + D.22427;
    bb = *D.22428;
    idom = 0B;
    i = 0;
    goto <D.22231>;
    <D.22230>:
    {
      struct MonoBasicBlock * in_bb;

      D.22429 = bb->in_bb;
      D.22430 = (long unsigned int) i;
      D.22431 = D.22430 * 8;
      D.22432 = D.22429 + D.22431;
      in_bb = *D.22432;
      if (in_bb != bb) goto <D.22433>; else goto <D.22434>;
      <D.22433>:
      D.22435 = in_bb->dfn;
      D.22436 = (long unsigned int) D.22435;
      D.22437 = D.22436 * 8;
      D.22438 = doms + D.22437;
      D.22439 = *D.22438;
      if (D.22439 != 0B) goto <D.22440>; else goto <D.22441>;
      <D.22440>:
      idom = in_bb;
      goto <D.22229>;
      <D.22441>:
      <D.22434>:
    }
    i = i + 1;
    <D.22231>:
    D.22442 = bb->in_count;
    D.22443 = (int) D.22442;
    if (D.22443 > i) goto <D.22230>; else goto <D.22229>;
    <D.22229>:
    D.22419 = cfg->bblocks;
    D.22444 = *D.22419;
    if (D.22444 != bb) goto <D.22445>; else goto <D.22446>;
    <D.22445>:
    D.22447 = idom == 0B;
    D.22448 = (long int) D.22447;
    D.22449 = __builtin_expect (D.22448, 0);
    if (D.22449 != 0) goto <D.22450>; else goto <D.22451>;
    <D.22450>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 79, "idom");
    <D.22451>:
    <D.22446>:
    goto <D.22239>;
    <D.22238>:
    {
      struct MonoBasicBlock * in_bb;

      D.22429 = bb->in_bb;
      D.22430 = (long unsigned int) i;
      D.22431 = D.22430 * 8;
      D.22432 = D.22429 + D.22431;
      in_bb = *D.22432;
      D.22454 = in_bb->dfn;
      if (D.22454 != 0) goto <D.22452>; else goto <D.22455>;
      <D.22455>:
      if (in_bb == entry) goto <D.22452>; else goto <D.22453>;
      <D.22452>:
      D.22454 = in_bb->dfn;
      D.22456 = (long unsigned int) D.22454;
      D.22457 = D.22456 * 8;
      D.22458 = doms + D.22457;
      D.22459 = *D.22458;
      if (D.22459 != 0B) goto <D.22460>; else goto <D.22461>;
      <D.22460>:
      {
        struct MonoBasicBlock * f1;
        struct MonoBasicBlock * f2;

        f1 = idom;
        f2 = in_bb;
        goto <D.22236>;
        <D.22235>:
        D.22462 = f1->dfn;
        D.22463 = f2->dfn;
        if (D.22462 < D.22463) goto <D.22464>; else goto <D.22465>;
        <D.22464>:
        D.22463 = f2->dfn;
        D.22466 = (long unsigned int) D.22463;
        D.22467 = D.22466 * 8;
        D.22468 = doms + D.22467;
        f2 = *D.22468;
        goto <D.22469>;
        <D.22465>:
        D.22462 = f1->dfn;
        D.22470 = (long unsigned int) D.22462;
        D.22471 = D.22470 * 8;
        D.22472 = doms + D.22471;
        f1 = *D.22472;
        <D.22469>:
        <D.22236>:
        if (f1 != f2) goto <D.22235>; else goto <D.22237>;
        <D.22237>:
        idom = f1;
      }
      <D.22461>:
      <D.22453>:
      i = i + 1;
    }
    <D.22239>:
    D.22442 = bb->in_count;
    D.22443 = (int) D.22442;
    if (D.22443 > i) goto <D.22238>; else goto <D.22240>;
    <D.22240>:
    D.22473 = bb->dfn;
    D.22474 = (long unsigned int) D.22473;
    D.22475 = D.22474 * 8;
    D.22476 = doms + D.22475;
    D.22477 = *D.22476;
    if (D.22477 != idom) goto <D.22478>; else goto <D.22479>;
    <D.22478>:
    D.22419 = cfg->bblocks;
    D.22444 = *D.22419;
    if (D.22444 == bb) goto <D.22480>; else goto <D.22481>;
    <D.22480>:
    D.22473 = bb->dfn;
    D.22474 = (long unsigned int) D.22473;
    D.22475 = D.22474 * 8;
    D.22476 = doms + D.22475;
    *D.22476 = bb;
    goto <D.22482>;
    <D.22481>:
    D.22473 = bb->dfn;
    D.22474 = (long unsigned int) D.22473;
    D.22475 = D.22474 * 8;
    D.22476 = doms + D.22475;
    *D.22476 = idom;
    changed = 1;
    <D.22482>:
    <D.22479>:
  }
  bindex = bindex + 1;
  <D.22242>:
  bindex.2 = (unsigned int) bindex;
  D.22417 = cfg->num_bblocks;
  if (bindex.2 < D.22417) goto <D.22241>; else goto <D.22243>;
  <D.22243>:
  <D.22245>:
  if (changed != 0) goto <D.22244>; else goto <D.22246>;
  <D.22246>:
  i = 0;
  goto <D.22255>;
  <D.22254>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * cbb;
    struct MonoBitSet * dominators;
    char * mem;

    D.22419 = cfg->bblocks;
    D.22430 = (long unsigned int) i;
    D.22431 = D.22430 * 8;
    D.22484 = D.22419 + D.22431;
    bb = *D.22484;
    bitsize.3 = (unsigned int) bitsize;
    D.22486 = cfg->mempool;
    mem = mono_mempool_alloc0 (D.22486, bitsize.3);
    D.22417 = cfg->num_bblocks;
    dominators = mono_bitset_mem_new (mem, D.22417, 0);
    bb->dominators = dominators;
    D.22487 = (sizetype) bitsize;
    mem = mem + D.22487;
    D.22488 = bb->dfn;
    D.22489 = (long unsigned int) D.22488;
    D.22490 = D.22489 / 64;
    D.22491 = dominators->data[D.22490];
    D.22488 = bb->dfn;
    D.22492 = D.22488 & 63;
    D.22493 = 1 << D.22492;
    D.22494 = D.22491 | D.22493;
    dominators->data[D.22490] = D.22494;
    D.22488 = bb->dfn;
    if (D.22488 != 0) goto <D.22495>; else goto <D.22496>;
    <D.22495>:
    D.22488 = bb->dfn;
    D.22489 = (long unsigned int) D.22488;
    D.22497 = D.22489 * 8;
    D.22498 = doms + D.22497;
    cbb = *D.22498;
    goto <D.22252>;
    <D.22251>:
    D.22499 = cbb->dfn;
    D.22500 = (long unsigned int) D.22499;
    D.22501 = D.22500 / 64;
    D.22502 = dominators->data[D.22501];
    D.22499 = cbb->dfn;
    D.22503 = D.22499 & 63;
    D.22504 = 1 << D.22503;
    D.22505 = D.22502 | D.22504;
    dominators->data[D.22501] = D.22505;
    D.22499 = cbb->dfn;
    D.22500 = (long unsigned int) D.22499;
    D.22506 = D.22500 * 8;
    D.22507 = doms + D.22506;
    cbb = *D.22507;
    <D.22252>:
    D.22499 = cbb->dfn;
    if (D.22499 != 0) goto <D.22251>; else goto <D.22253>;
    <D.22253>:
    D.22488 = bb->dfn;
    D.22489 = (long unsigned int) D.22488;
    D.22497 = D.22489 * 8;
    D.22498 = doms + D.22497;
    D.22508 = *D.22498;
    bb->idom = D.22508;
    D.22509 = bb->idom;
    if (D.22509 != 0B) goto <D.22510>; else goto <D.22511>;
    <D.22510>:
    D.22509 = bb->idom;
    D.22509 = bb->idom;
    D.22512 = D.22509->dominated;
    D.22486 = cfg->mempool;
    D.22513 = g_slist_prepend_mempool (D.22486, D.22512, bb);
    D.22509->dominated = D.22513;
    <D.22511>:
    <D.22496>:
    D.22514 = dominators->data[0];
    D.22515 = D.22514 | 1;
    dominators->data[0] = D.22515;
  }
  i = i + 1;
  <D.22255>:
  i.4 = (unsigned int) i;
  D.22417 = cfg->num_bblocks;
  if (i.4 < D.22417) goto <D.22254>; else goto <D.22256>;
  <D.22256>:
  monoeg_g_free (doms);
  D.22410 = cfg->comp_done;
  D.22517 = D.22410 | 3;
  cfg->comp_done = D.22517;
}


g_slist_prepend_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.22518;
  struct GSList * new_list;

  new_list = mono_mempool_alloc (mp, 16);
  new_list->data = data;
  new_list->next = list;
  D.22518 = new_list;
  return D.22518;
}


compute_dominance_frontier (struct MonoCompile * cfg)
{
  unsigned int D.22520;
  unsigned int D.22521;
  _Bool D.22522;
  long int D.22523;
  long int D.22524;
  struct MonoBasicBlock * * D.22527;
  long unsigned int D.22528;
  long unsigned int D.22529;
  struct MonoBasicBlock * * D.22530;
  struct MonoBasicBlock * D.22531;
  unsigned int D.22532;
  unsigned int D.22533;
  unsigned int i.5;
  unsigned int D.22535;
  unsigned int D.22536;
  unsigned int bitsize.6;
  unsigned int D.22538;
  struct MonoMemPool * D.22539;
  struct MonoBitSet * D.22540;
  sizetype D.22541;
  short int D.22542;
  struct MonoBasicBlock * * D.22545;
  long unsigned int D.22546;
  long unsigned int D.22547;
  struct MonoBasicBlock * * D.22548;
  int D.22550;
  struct MonoBasicBlock * D.22552;
  struct MonoBitSet * D.22553;
  int D.22554;
  long unsigned int D.22555;
  long unsigned int D.22556;
  long unsigned int D.22557;
  int D.22558;
  long unsigned int D.22559;
  long unsigned int D.22560;
  struct MonoBasicBlock * D.22561;
  int D.22562;
  unsigned int D.22563;
  char * mem;
  int i;
  int j;
  int bitsize;

  D.22520 = cfg->comp_done;
  D.22521 = D.22520 & 4;
  D.22522 = D.22521 != 0;
  D.22523 = (long int) D.22522;
  D.22524 = __builtin_expect (D.22523, 0);
  if (D.22524 != 0) goto <D.22525>; else goto <D.22526>;
  <D.22525>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 197, "!(cfg->comp_done & MONO_COMP_DFRONTIER)");
  <D.22526>:
  i = 0;
  goto <D.22265>;
  <D.22264>:
  D.22527 = cfg->bblocks;
  D.22528 = (long unsigned int) i;
  D.22529 = D.22528 * 8;
  D.22530 = D.22527 + D.22529;
  D.22531 = *D.22530;
  D.22527 = cfg->bblocks;
  D.22528 = (long unsigned int) i;
  D.22529 = D.22528 * 8;
  D.22530 = D.22527 + D.22529;
  D.22531 = *D.22530;
  D.22532 = D.22531->flags;
  D.22533 = D.22532 & 4294967294;
  D.22531->flags = D.22533;
  i = i + 1;
  <D.22265>:
  i.5 = (unsigned int) i;
  D.22535 = cfg->num_bblocks;
  if (i.5 < D.22535) goto <D.22264>; else goto <D.22266>;
  <D.22266>:
  D.22535 = cfg->num_bblocks;
  D.22536 = mono_bitset_alloc_size (D.22535, 0);
  bitsize = (int) D.22536;
  D.22535 = cfg->num_bblocks;
  bitsize.6 = (unsigned int) bitsize;
  D.22538 = D.22535 * bitsize.6;
  D.22539 = cfg->mempool;
  mem = mono_mempool_alloc0 (D.22539, D.22538);
  i = 0;
  goto <D.22269>;
  <D.22268>:
  {
    struct MonoBasicBlock * bb;

    D.22527 = cfg->bblocks;
    D.22528 = (long unsigned int) i;
    D.22529 = D.22528 * 8;
    D.22530 = D.22527 + D.22529;
    bb = *D.22530;
    D.22535 = cfg->num_bblocks;
    D.22540 = mono_bitset_mem_new (mem, D.22535, 0);
    bb->dfrontier = D.22540;
    D.22541 = (sizetype) bitsize;
    mem = mem + D.22541;
  }
  i = i + 1;
  <D.22269>:
  i.5 = (unsigned int) i;
  D.22535 = cfg->num_bblocks;
  if (i.5 < D.22535) goto <D.22268>; else goto <D.22270>;
  <D.22270>:
  i = 0;
  goto <D.22280>;
  <D.22279>:
  {
    struct MonoBasicBlock * bb;

    D.22527 = cfg->bblocks;
    D.22528 = (long unsigned int) i;
    D.22529 = D.22528 * 8;
    D.22530 = D.22527 + D.22529;
    bb = *D.22530;
    D.22542 = bb->in_count;
    if (D.22542 > 1) goto <D.22543>; else goto <D.22544>;
    <D.22543>:
    j = 0;
    goto <D.22277>;
    <D.22276>:
    {
      struct MonoBasicBlock * p;

      D.22545 = bb->in_bb;
      D.22546 = (long unsigned int) j;
      D.22547 = D.22546 * 8;
      D.22548 = D.22545 + D.22547;
      p = *D.22548;
      D.22550 = p->dfn;
      if (D.22550 != 0) goto <D.22549>; else goto <D.22551>;
      <D.22551>:
      D.22527 = cfg->bblocks;
      D.22552 = *D.22527;
      if (D.22552 == p) goto <D.22549>; else goto <D.22275>;
      <D.22549>:
      goto <D.22274>;
      <D.22273>:
      D.22553 = p->dfrontier;
      D.22554 = bb->dfn;
      D.22555 = (long unsigned int) D.22554;
      D.22556 = D.22555 / 64;
      D.22553 = p->dfrontier;
      D.22557 = D.22553->data[D.22556];
      D.22554 = bb->dfn;
      D.22558 = D.22554 & 63;
      D.22559 = 1 << D.22558;
      D.22560 = D.22557 | D.22559;
      D.22553->data[D.22556] = D.22560;
      p = p->idom;
      <D.22274>:
      D.22561 = bb->idom;
      if (D.22561 != p) goto <D.22273>; else goto <D.22275>;
      <D.22275>:
    }
    j = j + 1;
    <D.22277>:
    D.22542 = bb->in_count;
    D.22562 = (int) D.22542;
    if (D.22562 > j) goto <D.22276>; else goto <D.22278>;
    <D.22278>:
    <D.22544>:
  }
  i = i + 1;
  <D.22280>:
  i.5 = (unsigned int) i;
  D.22535 = cfg->num_bblocks;
  if (i.5 < D.22535) goto <D.22279>; else goto <D.22281>;
  <D.22281>:
  D.22520 = cfg->comp_done;
  D.22563 = D.22520 | 4;
  cfg->comp_done = D.22563;
}


mono_compute_natural_loops (struct MonoCompile * cfg)
{
  unsigned int D.22564;
  unsigned int D.22565;
  _Bool D.22566;
  long int D.22567;
  long int D.22568;
  unsigned int D.22571;
  unsigned int D.22572;
  struct MonoBasicBlock * * D.22573;
  long unsigned int D.22574;
  long unsigned int D.22575;
  struct MonoBasicBlock * * D.22576;
  struct MonoBasicBlock * * D.22577;
  long unsigned int D.22578;
  long unsigned int D.22579;
  struct MonoBasicBlock * * D.22580;
  struct MonoBitSet * D.22583;
  int D.22584;
  long unsigned int D.22585;
  long unsigned int D.22586;
  long unsigned int D.22587;
  int D.22588;
  long unsigned int D.22589;
  long unsigned int D.22590;
  struct GList * D.22593;
  struct GList * D.22596;
  int D.22601;
  long unsigned int D.22604;
  long unsigned int D.22605;
  long unsigned int D.22606;
  int D.22607;
  long unsigned int D.22608;
  long unsigned int D.22609;
  int D.22613;
  long unsigned int D.22615;
  long unsigned int D.22616;
  long unsigned int D.22617;
  int D.22618;
  long unsigned int D.22619;
  long unsigned int D.22620;
  struct GList * D.22622;
  struct MonoMemPool * D.22623;
  struct GList * D.22624;
  signed char D.22625;
  signed char D.22626;
  unsigned char D.22627;
  unsigned char D.22628;
  signed char D.22629;
  long unsigned int D.22632;
  long unsigned int D.22633;
  long unsigned int D.22634;
  long unsigned int D.22635;
  struct MonoBasicBlock * * D.22636;
  long unsigned int D.22637;
  long unsigned int D.22638;
  struct MonoBasicBlock * * D.22639;
  int D.22645;
  long unsigned int D.22647;
  long unsigned int D.22648;
  long unsigned int D.22649;
  int D.22650;
  long unsigned int D.22651;
  long unsigned int D.22652;
  struct GList * D.22654;
  short int D.22655;
  int D.22656;
  long unsigned int D.22661;
  long unsigned int D.22662;
  long unsigned int D.22663;
  struct GList * D.22665;
  struct GList * D.22666;
  signed char D.22667;
  signed char D.22668;
  unsigned char D.22669;
  unsigned char D.22670;
  signed char D.22671;
  short int D.22672;
  int D.22673;
  unsigned int i.7;
  unsigned int D.22675;
  long unsigned int D.22676;
  long unsigned int D.22677;
  int D.22678;
  long unsigned int D.22681;
  long unsigned int D.22682;
  int * D.22683;
  struct MonoBasicBlock * D.22684;
  struct GList * D.22685;
  int D.22688;
  long unsigned int D.22691;
  long unsigned int D.22692;
  int * D.22693;
  int D.22694;
  int D.22695;
  long unsigned int D.22696;
  long unsigned int D.22697;
  int * D.22698;
  int D.22699;
  int i;
  int j;
  int k;
  struct MonoBitSet * in_loop_blocks;
  int * bb_indexes;

  D.22564 = cfg->comp_done;
  D.22565 = D.22564 & 256;
  D.22566 = D.22565 != 0;
  D.22567 = (long int) D.22566;
  D.22568 = __builtin_expect (D.22567, 0);
  if (D.22568 != 0) goto <D.22569>; else goto <D.22570>;
  <D.22569>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 311, "!(cfg->comp_done & MONO_COMP_LOOPS)");
  <D.22570>:
  D.22571 = cfg->num_bblocks;
  D.22572 = D.22571 + 1;
  in_loop_blocks = mono_bitset_new (D.22572, 0);
  i = 0;
  goto <D.22341>;
  <D.22340>:
  {
    struct MonoBasicBlock * n;

    D.22573 = cfg->bblocks;
    D.22574 = (long unsigned int) i;
    D.22575 = D.22574 * 8;
    D.22576 = D.22573 + D.22575;
    n = *D.22576;
    j = 0;
    goto <D.22338>;
    <D.22337>:
    {
      struct MonoBasicBlock * h;

      D.22577 = n->out_bb;
      D.22578 = (long unsigned int) j;
      D.22579 = D.22578 * 8;
      D.22580 = D.22577 + D.22579;
      h = *D.22580;
      if (n != h) goto <D.22581>; else goto <D.22582>;
      <D.22581>:
      D.22583 = n->dominators;
      D.22584 = h->dfn;
      D.22585 = (long unsigned int) D.22584;
      D.22586 = D.22585 / 64;
      D.22587 = D.22583->data[D.22586];
      D.22584 = h->dfn;
      D.22588 = D.22584 & 63;
      D.22589 = D.22587 >> D.22588;
      D.22590 = D.22589 & 1;
      if (D.22590 != 0) goto <D.22591>; else goto <D.22592>;
      <D.22591>:
      {
        struct GSList * todo;

        D.22593 = h->loop_blocks;
        if (D.22593 != 0B) goto <D.22594>; else goto <D.22595>;
        <D.22594>:
        D.22593 = h->loop_blocks;
        D.22596 = monoeg_g_list_find (D.22593, n);
        if (D.22596 != 0B) goto <D.22597>; else goto <D.22598>;
        <D.22597>:
        // predicted unlikely by continue predictor.
        goto <D.22323>;
        <D.22598>:
        <D.22595>:
        mono_bitset_clear_all (in_loop_blocks);
        D.22593 = h->loop_blocks;
        if (D.22593 != 0B) goto <D.22599>; else goto <D.22600>;
        <D.22599>:
        {
          struct GList * l;

          l = h->loop_blocks;
          goto <D.22327>;
          <D.22326>:
          {
            struct MonoBasicBlock * b;

            b = l->data;
            D.22601 = b->dfn;
            if (D.22601 != 0) goto <D.22602>; else goto <D.22603>;
            <D.22602>:
            D.22601 = b->dfn;
            D.22604 = (long unsigned int) D.22601;
            D.22605 = D.22604 / 64;
            D.22606 = in_loop_blocks->data[D.22605];
            D.22601 = b->dfn;
            D.22607 = D.22601 & 63;
            D.22608 = 1 << D.22607;
            D.22609 = D.22606 | D.22608;
            in_loop_blocks->data[D.22605] = D.22609;
            <D.22603>:
          }
          l = l->next;
          <D.22327>:
          if (l != 0B) goto <D.22326>; else goto <D.22328>;
          <D.22328>:
        }
        <D.22600>:
        todo = monoeg_g_slist_prepend (0B, n);
        goto <D.22330>;
        <D.22335>:
        {
          struct MonoBasicBlock * cb;

          cb = todo->data;
          todo = monoeg_g_slist_delete_link (todo, todo);
          D.22613 = cb->dfn;
          if (D.22613 != 0) goto <D.22614>; else goto <D.22610>;
          <D.22614>:
          D.22613 = cb->dfn;
          D.22615 = (long unsigned int) D.22613;
          D.22616 = D.22615 / 64;
          D.22617 = in_loop_blocks->data[D.22616];
          D.22613 = cb->dfn;
          D.22618 = D.22613 & 63;
          D.22619 = D.22617 >> D.22618;
          D.22620 = D.22619 & 1;
          if (D.22620 != 0) goto <D.22611>; else goto <D.22610>;
          <D.22610>:
          D.22613 = cb->dfn;
          if (D.22613 == 0) goto <D.22621>; else goto <D.22612>;
          <D.22621>:
          D.22593 = h->loop_blocks;
          D.22622 = monoeg_g_list_find (D.22593, cb);
          if (D.22622 != 0B) goto <D.22611>; else goto <D.22612>;
          <D.22611>:
          // predicted unlikely by continue predictor.
          goto <D.22330>;
          <D.22612>:
          D.22593 = h->loop_blocks;
          D.22623 = cfg->mempool;
          D.22624 = g_list_prepend_mempool (D.22623, D.22593, cb);
          h->loop_blocks = D.22624;
          D.22625 = cb->nesting;
          D.22626 = D.22625;
          D.22627 = (unsigned char) D.22626;
          D.22628 = D.22627 + 1;
          D.22629 = (signed char) D.22628;
          cb->nesting = D.22629;
          D.22613 = cb->dfn;
          if (D.22613 != 0) goto <D.22630>; else goto <D.22631>;
          <D.22630>:
          D.22613 = cb->dfn;
          D.22615 = (long unsigned int) D.22613;
          D.22632 = D.22615 / 64;
          D.22633 = in_loop_blocks->data[D.22632];
          D.22613 = cb->dfn;
          D.22618 = D.22613 & 63;
          D.22634 = 1 << D.22618;
          D.22635 = D.22633 | D.22634;
          in_loop_blocks->data[D.22632] = D.22635;
          <D.22631>:
          k = 0;
          goto <D.22333>;
          <D.22332>:
          {
            struct MonoBasicBlock * prev;

            D.22636 = cb->in_bb;
            D.22637 = (long unsigned int) k;
            D.22638 = D.22637 * 8;
            D.22639 = D.22636 + D.22638;
            prev = *D.22639;
            if (prev != h) goto <D.22643>; else goto <D.22644>;
            <D.22643>:
            D.22645 = prev->dfn;
            if (D.22645 == 0) goto <D.22642>; else goto <D.22646>;
            <D.22646>:
            D.22645 = prev->dfn;
            D.22647 = (long unsigned int) D.22645;
            D.22648 = D.22647 / 64;
            D.22649 = in_loop_blocks->data[D.22648];
            D.22645 = prev->dfn;
            D.22650 = D.22645 & 63;
            D.22651 = D.22649 >> D.22650;
            D.22652 = D.22651 & 1;
            if (D.22652 == 0) goto <D.22642>; else goto <D.22641>;
            <D.22642>:
            D.22645 = prev->dfn;
            if (D.22645 != 0) goto <D.22640>; else goto <D.22653>;
            <D.22653>:
            D.22593 = h->loop_blocks;
            D.22654 = monoeg_g_list_find (D.22593, prev);
            if (D.22654 == 0B) goto <D.22640>; else goto <D.22641>;
            <D.22640>:
            todo = monoeg_g_slist_prepend (todo, prev);
            <D.22641>:
            <D.22644>:
          }
          k = k + 1;
          <D.22333>:
          D.22655 = cb->in_count;
          D.22656 = (int) D.22655;
          if (D.22656 > k) goto <D.22332>; else goto <D.22334>;
          <D.22334>:
        }
        <D.22330>:
        if (todo != 0B) goto <D.22335>; else goto <D.22336>;
        <D.22336>:
        D.22584 = h->dfn;
        if (D.22584 == 0) goto <D.22659>; else goto <D.22660>;
        <D.22660>:
        D.22584 = h->dfn;
        D.22585 = (long unsigned int) D.22584;
        D.22586 = D.22585 / 64;
        D.22661 = in_loop_blocks->data[D.22586];
        D.22584 = h->dfn;
        D.22588 = D.22584 & 63;
        D.22662 = D.22661 >> D.22588;
        D.22663 = D.22662 & 1;
        if (D.22663 == 0) goto <D.22659>; else goto <D.22658>;
        <D.22659>:
        D.22584 = h->dfn;
        if (D.22584 != 0) goto <D.22657>; else goto <D.22664>;
        <D.22664>:
        D.22593 = h->loop_blocks;
        D.22665 = monoeg_g_list_find (D.22593, h);
        if (D.22665 == 0B) goto <D.22657>; else goto <D.22658>;
        <D.22657>:
        D.22593 = h->loop_blocks;
        D.22623 = cfg->mempool;
        D.22666 = g_list_prepend_mempool (D.22623, D.22593, h);
        h->loop_blocks = D.22666;
        D.22667 = h->nesting;
        D.22668 = D.22667;
        D.22669 = (unsigned char) D.22668;
        D.22670 = D.22669 + 1;
        D.22671 = (signed char) D.22670;
        h->nesting = D.22671;
        <D.22658>:
      }
      <D.22592>:
      <D.22582>:
    }
    <D.22323>:
    j = j + 1;
    <D.22338>:
    D.22672 = n->out_count;
    D.22673 = (int) D.22672;
    if (D.22673 > j) goto <D.22337>; else goto <D.22339>;
    <D.22339>:
  }
  i = i + 1;
  <D.22341>:
  i.7 = (unsigned int) i;
  D.22571 = cfg->num_bblocks;
  if (i.7 < D.22571) goto <D.22340>; else goto <D.22342>;
  <D.22342>:
  mono_bitset_free (in_loop_blocks);
  D.22564 = cfg->comp_done;
  D.22675 = D.22564 | 256;
  cfg->comp_done = D.22675;
  D.22571 = cfg->num_bblocks;
  D.22676 = (long unsigned int) D.22571;
  D.22677 = D.22676 * 4;
  bb_indexes = monoeg_malloc0 (D.22677);
  {
    struct MonoBasicBlock * bb;

    i = 0;
    bb = cfg->bb_entry;
    goto <D.22345>;
    <D.22344>:
    D.22678 = bb->dfn;
    if (D.22678 != 0) goto <D.22679>; else goto <D.22680>;
    <D.22679>:
    D.22678 = bb->dfn;
    D.22681 = (long unsigned int) D.22678;
    D.22682 = D.22681 * 4;
    D.22683 = bb_indexes + D.22682;
    *D.22683 = i;
    <D.22680>:
    i = i + 1;
    bb = bb->next_bb;
    <D.22345>:
    if (bb != 0B) goto <D.22344>; else goto <D.22346>;
    <D.22346>:
  }
  i = 0;
  goto <D.22355>;
  <D.22354>:
  D.22573 = cfg->bblocks;
  D.22574 = (long unsigned int) i;
  D.22575 = D.22574 * 8;
  D.22576 = D.22573 + D.22575;
  D.22684 = *D.22576;
  D.22685 = D.22684->loop_blocks;
  if (D.22685 != 0B) goto <D.22686>; else goto <D.22687>;
  <D.22686>:
  {
    struct MonoBasicBlock * h;
    struct MonoBasicBlock * body_start;
    struct GList * l;

    D.22573 = cfg->bblocks;
    D.22574 = (long unsigned int) i;
    D.22575 = D.22574 * 8;
    D.22576 = D.22573 + D.22575;
    h = *D.22576;
    body_start = h;
    l = h->loop_blocks;
    goto <D.22352>;
    <D.22351>:
    {
      struct MonoBasicBlock * cb;

      cb = l->data;
      D.22688 = cb->dfn;
      if (D.22688 != 0) goto <D.22689>; else goto <D.22690>;
      <D.22689>:
      D.22688 = cb->dfn;
      D.22691 = (long unsigned int) D.22688;
      D.22692 = D.22691 * 4;
      D.22693 = bb_indexes + D.22692;
      D.22694 = *D.22693;
      D.22695 = body_start->dfn;
      D.22696 = (long unsigned int) D.22695;
      D.22697 = D.22696 * 4;
      D.22698 = bb_indexes + D.22697;
      D.22699 = *D.22698;
      if (D.22694 < D.22699) goto <D.22700>; else goto <D.22701>;
      <D.22700>:
      body_start = cb;
      <D.22701>:
      <D.22690>:
    }
    l = l->next;
    <D.22352>:
    if (l != 0B) goto <D.22351>; else goto <D.22353>;
    <D.22353>:
    body_start->loop_body_start = 1;
  }
  <D.22687>:
  i = i + 1;
  <D.22355>:
  i.7 = (unsigned int) i;
  D.22571 = cfg->num_bblocks;
  if (i.7 < D.22571) goto <D.22354>; else goto <D.22356>;
  <D.22356>:
  monoeg_g_free (bb_indexes);
}


g_list_prepend_mempool (struct MonoMemPool * mp, struct GList * list, void * data)
{
  struct GList * iftmp.8;
  struct GList * D.22706;
  struct GList * D.22711;
  struct GList * new_list;

  new_list = mono_mempool_alloc (mp, 24);
  new_list->data = data;
  if (list != 0B) goto <D.22703>; else goto <D.22704>;
  <D.22703>:
  iftmp.8 = list->prev;
  goto <D.22705>;
  <D.22704>:
  iftmp.8 = 0B;
  <D.22705>:
  new_list->prev = iftmp.8;
  new_list->next = list;
  D.22706 = new_list->prev;
  if (D.22706 != 0B) goto <D.22707>; else goto <D.22708>;
  <D.22707>:
  D.22706 = new_list->prev;
  D.22706->next = new_list;
  <D.22708>:
  if (list != 0B) goto <D.22709>; else goto <D.22710>;
  <D.22709>:
  list->prev = new_list;
  <D.22710>:
  D.22711 = new_list;
  return D.22711;
}


mono_free_loop_info (struct MonoCompile * cfg)
{
  unsigned int D.22713;
  unsigned int D.22714;
  unsigned int D.22717;

  D.22713 = cfg->comp_done;
  D.22714 = D.22713 & 2;
  if (D.22714 != 0) goto <D.22715>; else goto <D.22716>;
  <D.22715>:
  clear_idominators (cfg);
  <D.22716>:
  D.22713 = cfg->comp_done;
  D.22717 = D.22713 & 256;
  if (D.22717 != 0) goto <D.22718>; else goto <D.22719>;
  <D.22718>:
  clear_loops (cfg);
  <D.22719>:
}


clear_idominators (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22720;
  long unsigned int D.22721;
  long unsigned int D.22722;
  struct MonoBasicBlock * * D.22723;
  struct MonoBasicBlock * D.22724;
  struct GSList * D.22725;
  unsigned int D.22728;
  unsigned int D.22729;
  unsigned int D.22730;
  guint i;

  i = 0;
  goto <D.22362>;
  <D.22361>:
  D.22720 = cfg->bblocks;
  D.22721 = (long unsigned int) i;
  D.22722 = D.22721 * 8;
  D.22723 = D.22720 + D.22722;
  D.22724 = *D.22723;
  D.22725 = D.22724->dominated;
  if (D.22725 != 0B) goto <D.22726>; else goto <D.22727>;
  <D.22726>:
  D.22720 = cfg->bblocks;
  D.22721 = (long unsigned int) i;
  D.22722 = D.22721 * 8;
  D.22723 = D.22720 + D.22722;
  D.22724 = *D.22723;
  D.22724->dominated = 0B;
  <D.22727>:
  i = i + 1;
  <D.22362>:
  D.22728 = cfg->num_bblocks;
  if (D.22728 > i) goto <D.22361>; else goto <D.22363>;
  <D.22363>:
  D.22729 = cfg->comp_done;
  D.22730 = D.22729 & 4294967293;
  cfg->comp_done = D.22730;
}


clear_loops (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22731;
  long unsigned int D.22732;
  long unsigned int D.22733;
  struct MonoBasicBlock * * D.22734;
  struct MonoBasicBlock * D.22735;
  unsigned int D.22736;
  unsigned int D.22737;
  unsigned int D.22738;
  guint i;

  i = 0;
  goto <D.22369>;
  <D.22368>:
  D.22731 = cfg->bblocks;
  D.22732 = (long unsigned int) i;
  D.22733 = D.22732 * 8;
  D.22734 = D.22731 + D.22733;
  D.22735 = *D.22734;
  D.22735->nesting = 0;
  D.22731 = cfg->bblocks;
  D.22732 = (long unsigned int) i;
  D.22733 = D.22732 * 8;
  D.22734 = D.22731 + D.22733;
  D.22735 = *D.22734;
  D.22735->loop_blocks = 0B;
  i = i + 1;
  <D.22369>:
  D.22736 = cfg->num_bblocks;
  if (D.22736 > i) goto <D.22368>; else goto <D.22370>;
  <D.22370>:
  D.22737 = cfg->comp_done;
  D.22738 = D.22737 & 4294967039;
  cfg->comp_done = D.22738;
}


