mono_compile_iterated_dfrontier (struct MonoCompile * m, struct MonoBitSet * set)
{
  unsigned int D.22465;
  unsigned int D.22466;
  struct MonoMemPool * D.22467;
  unsigned int bitsize.0;
  void * D.22469;
  unsigned int D.22470;
  unsigned int D.22471;
  struct MonoBitSet * D.22472;
  struct MonoBitSet * result;
  int bitsize;
  int count1;
  int count2;

  D.22465 = m->num_bblocks;
  D.22466 = mono_bitset_alloc_size (D.22465, 0);
  bitsize = (int) D.22466;
  D.22467 = m->mempool;
  bitsize.0 = (unsigned int) bitsize;
  D.22469 = mono_mempool_alloc0 (D.22467, bitsize.0);
  D.22465 = m->num_bblocks;
  result = mono_bitset_mem_new (D.22469, D.22465, 0);
  df_set (m, result, set);
  D.22470 = mono_bitset_count (result);
  count2 = (int) D.22470;
  <D.22396>:
  count1 = count2;
  df_set (m, result, result);
  D.22471 = mono_bitset_count (result);
  count2 = (int) D.22471;
  if (count2 > count1) goto <D.22396>; else goto <D.22397>;
  <D.22397>:
  D.22472 = result;
  return D.22472;
}


df_set (struct MonoCompile * m, struct MonoBitSet * dest, struct MonoBitSet * set)
{
  struct MonoBasicBlock * * D.22474;
  long unsigned int D.22475;
  long unsigned int D.22476;
  struct MonoBasicBlock * * D.22477;
  struct MonoBasicBlock * D.22478;
  long unsigned int D.22479;
  long unsigned int D.22480;
  long unsigned int D.22481;
  long unsigned int D.22482;
  long unsigned int D.22483;
  unsigned int i.1;
  unsigned int D.22485;
  int i;

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

    D.22474 = m->bblocks;
    D.22475 = (long unsigned int) i;
    D.22476 = D.22475 * 8;
    D.22477 = D.22474 + D.22476;
    D.22478 = *D.22477;
    tmp_src = D.22478->dfrontier;
    tmp_dest = dest;
    D.22479 = tmp_dest->size;
    D.22480 = D.22479 / 64;
    size = (int) D.22480;
    i = 0;
    goto <D.22383>;
    <D.22382>:
    D.22481 = tmp_dest->data[i];
    D.22482 = tmp_src->data[i];
    D.22483 = D.22481 | D.22482;
    tmp_dest->data[i] = D.22483;
    i = i + 1;
    <D.22383>:
    if (i < size) goto <D.22382>; else goto <D.22384>;
    <D.22384>:
  }
  i = mono_bitset_find_first (set, i);
  <D.22386>:
  i.1 = (unsigned int) i;
  D.22485 = m->num_bblocks;
  if (i.1 < D.22485) goto <D.22486>; else goto <D.22387>;
  <D.22486>:
  if (i >= 0) goto <D.22385>; else goto <D.22387>;
  <D.22387>:
}


mono_compile_dominator_info (struct MonoCompile * cfg, int dom_flags)
{
  int D.22487;
  unsigned int D.22490;
  unsigned int D.22491;
  int D.22494;
  unsigned int D.22497;

  D.22487 = dom_flags & 1;
  if (D.22487 != 0) goto <D.22488>; else goto <D.22489>;
  <D.22488>:
  D.22490 = cfg->comp_done;
  D.22491 = D.22490 & 1;
  if (D.22491 == 0) goto <D.22492>; else goto <D.22493>;
  <D.22492>:
  compute_dominators (cfg);
  <D.22493>:
  <D.22489>:
  D.22494 = dom_flags & 4;
  if (D.22494 != 0) goto <D.22495>; else goto <D.22496>;
  <D.22495>:
  D.22490 = cfg->comp_done;
  D.22497 = D.22490 & 4;
  if (D.22497 == 0) goto <D.22498>; else goto <D.22499>;
  <D.22498>:
  compute_dominance_frontier (cfg);
  <D.22499>:
  <D.22496>:
}


compute_dominators (struct MonoCompile * cfg)
{
  unsigned int D.22500;
  unsigned int D.22501;
  _Bool D.22502;
  long int D.22503;
  long int D.22504;
  unsigned int D.22507;
  unsigned int D.22508;
  struct MonoBasicBlock * * D.22509;
  long unsigned int D.22510;
  long unsigned int D.22511;
  int D.22512;
  long unsigned int D.22513;
  long unsigned int D.22514;
  struct MonoBasicBlock * * D.22515;
  long unsigned int D.22516;
  long unsigned int D.22517;
  struct MonoBasicBlock * * D.22518;
  struct MonoBasicBlock * * D.22519;
  long unsigned int D.22520;
  long unsigned int D.22521;
  struct MonoBasicBlock * * D.22522;
  int D.22525;
  long unsigned int D.22526;
  long unsigned int D.22527;
  struct MonoBasicBlock * * D.22528;
  struct MonoBasicBlock * D.22529;
  short int D.22532;
  int D.22533;
  struct MonoBasicBlock * D.22534;
  _Bool D.22537;
  long int D.22538;
  long int D.22539;
  int D.22544;
  long unsigned int D.22546;
  long unsigned int D.22547;
  struct MonoBasicBlock * * D.22548;
  struct MonoBasicBlock * D.22549;
  int D.22552;
  int D.22553;
  long unsigned int D.22556;
  long unsigned int D.22557;
  struct MonoBasicBlock * * D.22558;
  long unsigned int D.22560;
  long unsigned int D.22561;
  struct MonoBasicBlock * * D.22562;
  int D.22563;
  long unsigned int D.22564;
  long unsigned int D.22565;
  struct MonoBasicBlock * * D.22566;
  struct MonoBasicBlock * D.22567;
  unsigned int bindex.2;
  struct MonoBasicBlock * * D.22574;
  struct MonoMemPool * D.22575;
  unsigned int bitsize.3;
  sizetype D.22577;
  int D.22578;
  long unsigned int D.22579;
  long unsigned int D.22580;
  long unsigned int D.22581;
  int D.22582;
  long unsigned int D.22583;
  long unsigned int D.22584;
  long unsigned int D.22587;
  struct MonoBasicBlock * * D.22588;
  int D.22589;
  long unsigned int D.22590;
  long unsigned int D.22591;
  long unsigned int D.22592;
  int D.22593;
  long unsigned int D.22594;
  long unsigned int D.22595;
  long unsigned int D.22596;
  struct MonoBasicBlock * * D.22597;
  struct MonoBasicBlock * D.22598;
  struct MonoBasicBlock * D.22599;
  struct GSList * D.22602;
  struct GSList * D.22603;
  long unsigned int D.22604;
  long unsigned int D.22605;
  unsigned int i.4;
  unsigned int D.22607;
  int bindex;
  int i;
  int bitsize;
  struct MonoBasicBlock * entry;
  struct MonoBasicBlock * * doms;
  gboolean changed;

  D.22500 = cfg->comp_done;
  D.22501 = D.22500 & 1;
  D.22502 = D.22501 != 0;
  D.22503 = (long int) D.22502;
  D.22504 = __builtin_expect (D.22503, 0);
  if (D.22504 != 0) goto <D.22505>; else goto <D.22506>;
  <D.22505>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 42, "!(cfg->comp_done & MONO_COMP_DOM)");
  <D.22506>:
  D.22507 = cfg->num_bblocks;
  D.22508 = mono_bitset_alloc_size (D.22507, 0);
  bitsize = (int) D.22508;
  D.22509 = cfg->bblocks;
  entry = *D.22509;
  D.22507 = cfg->num_bblocks;
  D.22510 = (long unsigned int) D.22507;
  D.22511 = D.22510 * 8;
  doms = monoeg_malloc0 (D.22511);
  D.22512 = entry->dfn;
  D.22513 = (long unsigned int) D.22512;
  D.22514 = D.22513 * 8;
  D.22515 = doms + D.22514;
  *D.22515 = entry;
  changed = 1;
  goto <D.22335>;
  <D.22334>:
  changed = 0;
  bindex = 0;
  goto <D.22332>;
  <D.22331>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * idom;

    D.22509 = cfg->bblocks;
    D.22516 = (long unsigned int) bindex;
    D.22517 = D.22516 * 8;
    D.22518 = D.22509 + D.22517;
    bb = *D.22518;
    idom = 0B;
    i = 0;
    goto <D.22321>;
    <D.22320>:
    {
      struct MonoBasicBlock * in_bb;

      D.22519 = bb->in_bb;
      D.22520 = (long unsigned int) i;
      D.22521 = D.22520 * 8;
      D.22522 = D.22519 + D.22521;
      in_bb = *D.22522;
      if (in_bb != bb) goto <D.22523>; else goto <D.22524>;
      <D.22523>:
      D.22525 = in_bb->dfn;
      D.22526 = (long unsigned int) D.22525;
      D.22527 = D.22526 * 8;
      D.22528 = doms + D.22527;
      D.22529 = *D.22528;
      if (D.22529 != 0B) goto <D.22530>; else goto <D.22531>;
      <D.22530>:
      idom = in_bb;
      goto <D.22319>;
      <D.22531>:
      <D.22524>:
    }
    i = i + 1;
    <D.22321>:
    D.22532 = bb->in_count;
    D.22533 = (int) D.22532;
    if (D.22533 > i) goto <D.22320>; else goto <D.22319>;
    <D.22319>:
    D.22509 = cfg->bblocks;
    D.22534 = *D.22509;
    if (D.22534 != bb) goto <D.22535>; else goto <D.22536>;
    <D.22535>:
    D.22537 = idom == 0B;
    D.22538 = (long int) D.22537;
    D.22539 = __builtin_expect (D.22538, 0);
    if (D.22539 != 0) goto <D.22540>; else goto <D.22541>;
    <D.22540>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 79, "idom");
    <D.22541>:
    <D.22536>:
    goto <D.22329>;
    <D.22328>:
    {
      struct MonoBasicBlock * in_bb;

      D.22519 = bb->in_bb;
      D.22520 = (long unsigned int) i;
      D.22521 = D.22520 * 8;
      D.22522 = D.22519 + D.22521;
      in_bb = *D.22522;
      D.22544 = in_bb->dfn;
      if (D.22544 != 0) goto <D.22542>; else goto <D.22545>;
      <D.22545>:
      if (in_bb == entry) goto <D.22542>; else goto <D.22543>;
      <D.22542>:
      D.22544 = in_bb->dfn;
      D.22546 = (long unsigned int) D.22544;
      D.22547 = D.22546 * 8;
      D.22548 = doms + D.22547;
      D.22549 = *D.22548;
      if (D.22549 != 0B) goto <D.22550>; else goto <D.22551>;
      <D.22550>:
      {
        struct MonoBasicBlock * f1;
        struct MonoBasicBlock * f2;

        f1 = idom;
        f2 = in_bb;
        goto <D.22326>;
        <D.22325>:
        D.22552 = f1->dfn;
        D.22553 = f2->dfn;
        if (D.22552 < D.22553) goto <D.22554>; else goto <D.22555>;
        <D.22554>:
        D.22553 = f2->dfn;
        D.22556 = (long unsigned int) D.22553;
        D.22557 = D.22556 * 8;
        D.22558 = doms + D.22557;
        f2 = *D.22558;
        goto <D.22559>;
        <D.22555>:
        D.22552 = f1->dfn;
        D.22560 = (long unsigned int) D.22552;
        D.22561 = D.22560 * 8;
        D.22562 = doms + D.22561;
        f1 = *D.22562;
        <D.22559>:
        <D.22326>:
        if (f1 != f2) goto <D.22325>; else goto <D.22327>;
        <D.22327>:
        idom = f1;
      }
      <D.22551>:
      <D.22543>:
      i = i + 1;
    }
    <D.22329>:
    D.22532 = bb->in_count;
    D.22533 = (int) D.22532;
    if (D.22533 > i) goto <D.22328>; else goto <D.22330>;
    <D.22330>:
    D.22563 = bb->dfn;
    D.22564 = (long unsigned int) D.22563;
    D.22565 = D.22564 * 8;
    D.22566 = doms + D.22565;
    D.22567 = *D.22566;
    if (D.22567 != idom) goto <D.22568>; else goto <D.22569>;
    <D.22568>:
    D.22509 = cfg->bblocks;
    D.22534 = *D.22509;
    if (D.22534 == bb) goto <D.22570>; else goto <D.22571>;
    <D.22570>:
    D.22563 = bb->dfn;
    D.22564 = (long unsigned int) D.22563;
    D.22565 = D.22564 * 8;
    D.22566 = doms + D.22565;
    *D.22566 = bb;
    goto <D.22572>;
    <D.22571>:
    D.22563 = bb->dfn;
    D.22564 = (long unsigned int) D.22563;
    D.22565 = D.22564 * 8;
    D.22566 = doms + D.22565;
    *D.22566 = idom;
    changed = 1;
    <D.22572>:
    <D.22569>:
  }
  bindex = bindex + 1;
  <D.22332>:
  bindex.2 = (unsigned int) bindex;
  D.22507 = cfg->num_bblocks;
  if (bindex.2 < D.22507) goto <D.22331>; else goto <D.22333>;
  <D.22333>:
  <D.22335>:
  if (changed != 0) goto <D.22334>; else goto <D.22336>;
  <D.22336>:
  i = 0;
  goto <D.22345>;
  <D.22344>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * cbb;
    struct MonoBitSet * dominators;
    char * mem;

    D.22509 = cfg->bblocks;
    D.22520 = (long unsigned int) i;
    D.22521 = D.22520 * 8;
    D.22574 = D.22509 + D.22521;
    bb = *D.22574;
    D.22575 = cfg->mempool;
    bitsize.3 = (unsigned int) bitsize;
    mem = mono_mempool_alloc0 (D.22575, bitsize.3);
    D.22507 = cfg->num_bblocks;
    dominators = mono_bitset_mem_new (mem, D.22507, 0);
    bb->dominators = dominators;
    D.22577 = (sizetype) bitsize;
    mem = mem + D.22577;
    D.22578 = bb->dfn;
    D.22579 = (long unsigned int) D.22578;
    D.22580 = D.22579 / 64;
    D.22581 = dominators->data[D.22580];
    D.22578 = bb->dfn;
    D.22582 = D.22578 & 63;
    D.22583 = 1 << D.22582;
    D.22584 = D.22581 | D.22583;
    dominators->data[D.22580] = D.22584;
    D.22578 = bb->dfn;
    if (D.22578 != 0) goto <D.22585>; else goto <D.22586>;
    <D.22585>:
    D.22578 = bb->dfn;
    D.22579 = (long unsigned int) D.22578;
    D.22587 = D.22579 * 8;
    D.22588 = doms + D.22587;
    cbb = *D.22588;
    goto <D.22342>;
    <D.22341>:
    D.22589 = cbb->dfn;
    D.22590 = (long unsigned int) D.22589;
    D.22591 = D.22590 / 64;
    D.22592 = dominators->data[D.22591];
    D.22589 = cbb->dfn;
    D.22593 = D.22589 & 63;
    D.22594 = 1 << D.22593;
    D.22595 = D.22592 | D.22594;
    dominators->data[D.22591] = D.22595;
    D.22589 = cbb->dfn;
    D.22590 = (long unsigned int) D.22589;
    D.22596 = D.22590 * 8;
    D.22597 = doms + D.22596;
    cbb = *D.22597;
    <D.22342>:
    D.22589 = cbb->dfn;
    if (D.22589 != 0) goto <D.22341>; else goto <D.22343>;
    <D.22343>:
    D.22578 = bb->dfn;
    D.22579 = (long unsigned int) D.22578;
    D.22587 = D.22579 * 8;
    D.22588 = doms + D.22587;
    D.22598 = *D.22588;
    bb->idom = D.22598;
    D.22599 = bb->idom;
    if (D.22599 != 0B) goto <D.22600>; else goto <D.22601>;
    <D.22600>:
    D.22599 = bb->idom;
    D.22575 = cfg->mempool;
    D.22599 = bb->idom;
    D.22602 = D.22599->dominated;
    D.22603 = g_slist_prepend_mempool (D.22575, D.22602, bb);
    D.22599->dominated = D.22603;
    <D.22601>:
    <D.22586>:
    D.22604 = dominators->data[0];
    D.22605 = D.22604 | 1;
    dominators->data[0] = D.22605;
  }
  i = i + 1;
  <D.22345>:
  i.4 = (unsigned int) i;
  D.22507 = cfg->num_bblocks;
  if (i.4 < D.22507) goto <D.22344>; else goto <D.22346>;
  <D.22346>:
  monoeg_g_free (doms);
  D.22500 = cfg->comp_done;
  D.22607 = D.22500 | 3;
  cfg->comp_done = D.22607;
}


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

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


compute_dominance_frontier (struct MonoCompile * cfg)
{
  unsigned int D.22610;
  unsigned int D.22611;
  _Bool D.22612;
  long int D.22613;
  long int D.22614;
  struct MonoBasicBlock * * D.22617;
  long unsigned int D.22618;
  long unsigned int D.22619;
  struct MonoBasicBlock * * D.22620;
  struct MonoBasicBlock * D.22621;
  unsigned int D.22622;
  unsigned int D.22623;
  unsigned int i.5;
  unsigned int D.22625;
  unsigned int D.22626;
  struct MonoMemPool * D.22627;
  unsigned int bitsize.6;
  unsigned int D.22629;
  struct MonoBitSet * D.22630;
  sizetype D.22631;
  short int D.22632;
  struct MonoBasicBlock * * D.22635;
  long unsigned int D.22636;
  long unsigned int D.22637;
  struct MonoBasicBlock * * D.22638;
  int D.22640;
  struct MonoBasicBlock * D.22642;
  struct MonoBitSet * D.22643;
  int D.22644;
  long unsigned int D.22645;
  long unsigned int D.22646;
  long unsigned int D.22647;
  int D.22648;
  long unsigned int D.22649;
  long unsigned int D.22650;
  struct MonoBasicBlock * D.22651;
  int D.22652;
  unsigned int D.22653;
  char * mem;
  int i;
  int j;
  int bitsize;

  D.22610 = cfg->comp_done;
  D.22611 = D.22610 & 4;
  D.22612 = D.22611 != 0;
  D.22613 = (long int) D.22612;
  D.22614 = __builtin_expect (D.22613, 0);
  if (D.22614 != 0) goto <D.22615>; else goto <D.22616>;
  <D.22615>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 197, "!(cfg->comp_done & MONO_COMP_DFRONTIER)");
  <D.22616>:
  i = 0;
  goto <D.22355>;
  <D.22354>:
  D.22617 = cfg->bblocks;
  D.22618 = (long unsigned int) i;
  D.22619 = D.22618 * 8;
  D.22620 = D.22617 + D.22619;
  D.22621 = *D.22620;
  D.22617 = cfg->bblocks;
  D.22618 = (long unsigned int) i;
  D.22619 = D.22618 * 8;
  D.22620 = D.22617 + D.22619;
  D.22621 = *D.22620;
  D.22622 = D.22621->flags;
  D.22623 = D.22622 & 4294967294;
  D.22621->flags = D.22623;
  i = i + 1;
  <D.22355>:
  i.5 = (unsigned int) i;
  D.22625 = cfg->num_bblocks;
  if (i.5 < D.22625) goto <D.22354>; else goto <D.22356>;
  <D.22356>:
  D.22625 = cfg->num_bblocks;
  D.22626 = mono_bitset_alloc_size (D.22625, 0);
  bitsize = (int) D.22626;
  D.22627 = cfg->mempool;
  D.22625 = cfg->num_bblocks;
  bitsize.6 = (unsigned int) bitsize;
  D.22629 = D.22625 * bitsize.6;
  mem = mono_mempool_alloc0 (D.22627, D.22629);
  i = 0;
  goto <D.22359>;
  <D.22358>:
  {
    struct MonoBasicBlock * bb;

    D.22617 = cfg->bblocks;
    D.22618 = (long unsigned int) i;
    D.22619 = D.22618 * 8;
    D.22620 = D.22617 + D.22619;
    bb = *D.22620;
    D.22625 = cfg->num_bblocks;
    D.22630 = mono_bitset_mem_new (mem, D.22625, 0);
    bb->dfrontier = D.22630;
    D.22631 = (sizetype) bitsize;
    mem = mem + D.22631;
  }
  i = i + 1;
  <D.22359>:
  i.5 = (unsigned int) i;
  D.22625 = cfg->num_bblocks;
  if (i.5 < D.22625) goto <D.22358>; else goto <D.22360>;
  <D.22360>:
  i = 0;
  goto <D.22370>;
  <D.22369>:
  {
    struct MonoBasicBlock * bb;

    D.22617 = cfg->bblocks;
    D.22618 = (long unsigned int) i;
    D.22619 = D.22618 * 8;
    D.22620 = D.22617 + D.22619;
    bb = *D.22620;
    D.22632 = bb->in_count;
    if (D.22632 > 1) goto <D.22633>; else goto <D.22634>;
    <D.22633>:
    j = 0;
    goto <D.22367>;
    <D.22366>:
    {
      struct MonoBasicBlock * p;

      D.22635 = bb->in_bb;
      D.22636 = (long unsigned int) j;
      D.22637 = D.22636 * 8;
      D.22638 = D.22635 + D.22637;
      p = *D.22638;
      D.22640 = p->dfn;
      if (D.22640 != 0) goto <D.22639>; else goto <D.22641>;
      <D.22641>:
      D.22617 = cfg->bblocks;
      D.22642 = *D.22617;
      if (D.22642 == p) goto <D.22639>; else goto <D.22365>;
      <D.22639>:
      goto <D.22364>;
      <D.22363>:
      D.22643 = p->dfrontier;
      D.22644 = bb->dfn;
      D.22645 = (long unsigned int) D.22644;
      D.22646 = D.22645 / 64;
      D.22643 = p->dfrontier;
      D.22647 = D.22643->data[D.22646];
      D.22644 = bb->dfn;
      D.22648 = D.22644 & 63;
      D.22649 = 1 << D.22648;
      D.22650 = D.22647 | D.22649;
      D.22643->data[D.22646] = D.22650;
      p = p->idom;
      <D.22364>:
      D.22651 = bb->idom;
      if (D.22651 != p) goto <D.22363>; else goto <D.22365>;
      <D.22365>:
    }
    j = j + 1;
    <D.22367>:
    D.22632 = bb->in_count;
    D.22652 = (int) D.22632;
    if (D.22652 > j) goto <D.22366>; else goto <D.22368>;
    <D.22368>:
    <D.22634>:
  }
  i = i + 1;
  <D.22370>:
  i.5 = (unsigned int) i;
  D.22625 = cfg->num_bblocks;
  if (i.5 < D.22625) goto <D.22369>; else goto <D.22371>;
  <D.22371>:
  D.22610 = cfg->comp_done;
  D.22653 = D.22610 | 4;
  cfg->comp_done = D.22653;
}


mono_compute_natural_loops (struct MonoCompile * cfg)
{
  unsigned int D.22654;
  unsigned int D.22655;
  _Bool D.22656;
  long int D.22657;
  long int D.22658;
  unsigned int D.22661;
  unsigned int D.22662;
  struct MonoBasicBlock * * D.22663;
  long unsigned int D.22664;
  long unsigned int D.22665;
  struct MonoBasicBlock * * D.22666;
  struct MonoBasicBlock * * D.22667;
  long unsigned int D.22668;
  long unsigned int D.22669;
  struct MonoBasicBlock * * D.22670;
  struct MonoBitSet * D.22673;
  int D.22674;
  long unsigned int D.22675;
  long unsigned int D.22676;
  long unsigned int D.22677;
  int D.22678;
  long unsigned int D.22679;
  long unsigned int D.22680;
  struct GList * D.22683;
  struct GList * D.22686;
  int D.22691;
  long unsigned int D.22694;
  long unsigned int D.22695;
  long unsigned int D.22696;
  int D.22697;
  long unsigned int D.22698;
  long unsigned int D.22699;
  int D.22703;
  long unsigned int D.22705;
  long unsigned int D.22706;
  long unsigned int D.22707;
  int D.22708;
  long unsigned int D.22709;
  long unsigned int D.22710;
  struct GList * D.22712;
  struct MonoMemPool * D.22713;
  struct GList * D.22714;
  signed char D.22715;
  signed char D.22716;
  unsigned char D.22717;
  unsigned char D.22718;
  signed char D.22719;
  long unsigned int D.22722;
  long unsigned int D.22723;
  long unsigned int D.22724;
  long unsigned int D.22725;
  struct MonoBasicBlock * * D.22726;
  long unsigned int D.22727;
  long unsigned int D.22728;
  struct MonoBasicBlock * * D.22729;
  int D.22735;
  long unsigned int D.22737;
  long unsigned int D.22738;
  long unsigned int D.22739;
  int D.22740;
  long unsigned int D.22741;
  long unsigned int D.22742;
  struct GList * D.22744;
  short int D.22745;
  int D.22746;
  long unsigned int D.22751;
  long unsigned int D.22752;
  long unsigned int D.22753;
  struct GList * D.22755;
  struct GList * D.22756;
  signed char D.22757;
  signed char D.22758;
  unsigned char D.22759;
  unsigned char D.22760;
  signed char D.22761;
  short int D.22762;
  int D.22763;
  unsigned int i.7;
  unsigned int D.22765;
  long unsigned int D.22766;
  long unsigned int D.22767;
  int D.22768;
  long unsigned int D.22771;
  long unsigned int D.22772;
  int * D.22773;
  struct MonoBasicBlock * D.22774;
  struct GList * D.22775;
  int D.22778;
  long unsigned int D.22781;
  long unsigned int D.22782;
  int * D.22783;
  int D.22784;
  int D.22785;
  long unsigned int D.22786;
  long unsigned int D.22787;
  int * D.22788;
  int D.22789;
  int i;
  int j;
  int k;
  struct MonoBitSet * in_loop_blocks;
  int * bb_indexes;

  D.22654 = cfg->comp_done;
  D.22655 = D.22654 & 256;
  D.22656 = D.22655 != 0;
  D.22657 = (long int) D.22656;
  D.22658 = __builtin_expect (D.22657, 0);
  if (D.22658 != 0) goto <D.22659>; else goto <D.22660>;
  <D.22659>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 311, "!(cfg->comp_done & MONO_COMP_LOOPS)");
  <D.22660>:
  D.22661 = cfg->num_bblocks;
  D.22662 = D.22661 + 1;
  in_loop_blocks = mono_bitset_new (D.22662, 0);
  i = 0;
  goto <D.22431>;
  <D.22430>:
  {
    struct MonoBasicBlock * n;

    D.22663 = cfg->bblocks;
    D.22664 = (long unsigned int) i;
    D.22665 = D.22664 * 8;
    D.22666 = D.22663 + D.22665;
    n = *D.22666;
    j = 0;
    goto <D.22428>;
    <D.22427>:
    {
      struct MonoBasicBlock * h;

      D.22667 = n->out_bb;
      D.22668 = (long unsigned int) j;
      D.22669 = D.22668 * 8;
      D.22670 = D.22667 + D.22669;
      h = *D.22670;
      if (n != h) goto <D.22671>; else goto <D.22672>;
      <D.22671>:
      D.22673 = n->dominators;
      D.22674 = h->dfn;
      D.22675 = (long unsigned int) D.22674;
      D.22676 = D.22675 / 64;
      D.22677 = D.22673->data[D.22676];
      D.22674 = h->dfn;
      D.22678 = D.22674 & 63;
      D.22679 = D.22677 >> D.22678;
      D.22680 = D.22679 & 1;
      if (D.22680 != 0) goto <D.22681>; else goto <D.22682>;
      <D.22681>:
      {
        struct GSList * todo;

        D.22683 = h->loop_blocks;
        if (D.22683 != 0B) goto <D.22684>; else goto <D.22685>;
        <D.22684>:
        D.22683 = h->loop_blocks;
        D.22686 = monoeg_g_list_find (D.22683, n);
        if (D.22686 != 0B) goto <D.22687>; else goto <D.22688>;
        <D.22687>:
        // predicted unlikely by continue predictor.
        goto <D.22413>;
        <D.22688>:
        <D.22685>:
        mono_bitset_clear_all (in_loop_blocks);
        D.22683 = h->loop_blocks;
        if (D.22683 != 0B) goto <D.22689>; else goto <D.22690>;
        <D.22689>:
        {
          struct GList * l;

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

            b = l->data;
            D.22691 = b->dfn;
            if (D.22691 != 0) goto <D.22692>; else goto <D.22693>;
            <D.22692>:
            D.22691 = b->dfn;
            D.22694 = (long unsigned int) D.22691;
            D.22695 = D.22694 / 64;
            D.22696 = in_loop_blocks->data[D.22695];
            D.22691 = b->dfn;
            D.22697 = D.22691 & 63;
            D.22698 = 1 << D.22697;
            D.22699 = D.22696 | D.22698;
            in_loop_blocks->data[D.22695] = D.22699;
            <D.22693>:
          }
          l = l->next;
          <D.22417>:
          if (l != 0B) goto <D.22416>; else goto <D.22418>;
          <D.22418>:
        }
        <D.22690>:
        todo = monoeg_g_slist_prepend (0B, n);
        goto <D.22420>;
        <D.22425>:
        {
          struct MonoBasicBlock * cb;

          cb = todo->data;
          todo = monoeg_g_slist_delete_link (todo, todo);
          D.22703 = cb->dfn;
          if (D.22703 != 0) goto <D.22704>; else goto <D.22700>;
          <D.22704>:
          D.22703 = cb->dfn;
          D.22705 = (long unsigned int) D.22703;
          D.22706 = D.22705 / 64;
          D.22707 = in_loop_blocks->data[D.22706];
          D.22703 = cb->dfn;
          D.22708 = D.22703 & 63;
          D.22709 = D.22707 >> D.22708;
          D.22710 = D.22709 & 1;
          if (D.22710 != 0) goto <D.22701>; else goto <D.22700>;
          <D.22700>:
          D.22703 = cb->dfn;
          if (D.22703 == 0) goto <D.22711>; else goto <D.22702>;
          <D.22711>:
          D.22683 = h->loop_blocks;
          D.22712 = monoeg_g_list_find (D.22683, cb);
          if (D.22712 != 0B) goto <D.22701>; else goto <D.22702>;
          <D.22701>:
          // predicted unlikely by continue predictor.
          goto <D.22420>;
          <D.22702>:
          D.22713 = cfg->mempool;
          D.22683 = h->loop_blocks;
          D.22714 = g_list_prepend_mempool (D.22713, D.22683, cb);
          h->loop_blocks = D.22714;
          D.22715 = cb->nesting;
          D.22716 = D.22715;
          D.22717 = (unsigned char) D.22716;
          D.22718 = D.22717 + 1;
          D.22719 = (signed char) D.22718;
          cb->nesting = D.22719;
          D.22703 = cb->dfn;
          if (D.22703 != 0) goto <D.22720>; else goto <D.22721>;
          <D.22720>:
          D.22703 = cb->dfn;
          D.22705 = (long unsigned int) D.22703;
          D.22722 = D.22705 / 64;
          D.22723 = in_loop_blocks->data[D.22722];
          D.22703 = cb->dfn;
          D.22708 = D.22703 & 63;
          D.22724 = 1 << D.22708;
          D.22725 = D.22723 | D.22724;
          in_loop_blocks->data[D.22722] = D.22725;
          <D.22721>:
          k = 0;
          goto <D.22423>;
          <D.22422>:
          {
            struct MonoBasicBlock * prev;

            D.22726 = cb->in_bb;
            D.22727 = (long unsigned int) k;
            D.22728 = D.22727 * 8;
            D.22729 = D.22726 + D.22728;
            prev = *D.22729;
            if (prev != h) goto <D.22733>; else goto <D.22734>;
            <D.22733>:
            D.22735 = prev->dfn;
            if (D.22735 == 0) goto <D.22732>; else goto <D.22736>;
            <D.22736>:
            D.22735 = prev->dfn;
            D.22737 = (long unsigned int) D.22735;
            D.22738 = D.22737 / 64;
            D.22739 = in_loop_blocks->data[D.22738];
            D.22735 = prev->dfn;
            D.22740 = D.22735 & 63;
            D.22741 = D.22739 >> D.22740;
            D.22742 = D.22741 & 1;
            if (D.22742 == 0) goto <D.22732>; else goto <D.22731>;
            <D.22732>:
            D.22735 = prev->dfn;
            if (D.22735 != 0) goto <D.22730>; else goto <D.22743>;
            <D.22743>:
            D.22683 = h->loop_blocks;
            D.22744 = monoeg_g_list_find (D.22683, prev);
            if (D.22744 == 0B) goto <D.22730>; else goto <D.22731>;
            <D.22730>:
            todo = monoeg_g_slist_prepend (todo, prev);
            <D.22731>:
            <D.22734>:
          }
          k = k + 1;
          <D.22423>:
          D.22745 = cb->in_count;
          D.22746 = (int) D.22745;
          if (D.22746 > k) goto <D.22422>; else goto <D.22424>;
          <D.22424>:
        }
        <D.22420>:
        if (todo != 0B) goto <D.22425>; else goto <D.22426>;
        <D.22426>:
        D.22674 = h->dfn;
        if (D.22674 == 0) goto <D.22749>; else goto <D.22750>;
        <D.22750>:
        D.22674 = h->dfn;
        D.22675 = (long unsigned int) D.22674;
        D.22676 = D.22675 / 64;
        D.22751 = in_loop_blocks->data[D.22676];
        D.22674 = h->dfn;
        D.22678 = D.22674 & 63;
        D.22752 = D.22751 >> D.22678;
        D.22753 = D.22752 & 1;
        if (D.22753 == 0) goto <D.22749>; else goto <D.22748>;
        <D.22749>:
        D.22674 = h->dfn;
        if (D.22674 != 0) goto <D.22747>; else goto <D.22754>;
        <D.22754>:
        D.22683 = h->loop_blocks;
        D.22755 = monoeg_g_list_find (D.22683, h);
        if (D.22755 == 0B) goto <D.22747>; else goto <D.22748>;
        <D.22747>:
        D.22713 = cfg->mempool;
        D.22683 = h->loop_blocks;
        D.22756 = g_list_prepend_mempool (D.22713, D.22683, h);
        h->loop_blocks = D.22756;
        D.22757 = h->nesting;
        D.22758 = D.22757;
        D.22759 = (unsigned char) D.22758;
        D.22760 = D.22759 + 1;
        D.22761 = (signed char) D.22760;
        h->nesting = D.22761;
        <D.22748>:
      }
      <D.22682>:
      <D.22672>:
    }
    <D.22413>:
    j = j + 1;
    <D.22428>:
    D.22762 = n->out_count;
    D.22763 = (int) D.22762;
    if (D.22763 > j) goto <D.22427>; else goto <D.22429>;
    <D.22429>:
  }
  i = i + 1;
  <D.22431>:
  i.7 = (unsigned int) i;
  D.22661 = cfg->num_bblocks;
  if (i.7 < D.22661) goto <D.22430>; else goto <D.22432>;
  <D.22432>:
  mono_bitset_free (in_loop_blocks);
  D.22654 = cfg->comp_done;
  D.22765 = D.22654 | 256;
  cfg->comp_done = D.22765;
  D.22661 = cfg->num_bblocks;
  D.22766 = (long unsigned int) D.22661;
  D.22767 = D.22766 * 4;
  bb_indexes = monoeg_malloc0 (D.22767);
  {
    struct MonoBasicBlock * bb;

    i = 0;
    bb = cfg->bb_entry;
    goto <D.22435>;
    <D.22434>:
    D.22768 = bb->dfn;
    if (D.22768 != 0) goto <D.22769>; else goto <D.22770>;
    <D.22769>:
    D.22768 = bb->dfn;
    D.22771 = (long unsigned int) D.22768;
    D.22772 = D.22771 * 4;
    D.22773 = bb_indexes + D.22772;
    *D.22773 = i;
    <D.22770>:
    i = i + 1;
    bb = bb->next_bb;
    <D.22435>:
    if (bb != 0B) goto <D.22434>; else goto <D.22436>;
    <D.22436>:
  }
  i = 0;
  goto <D.22445>;
  <D.22444>:
  D.22663 = cfg->bblocks;
  D.22664 = (long unsigned int) i;
  D.22665 = D.22664 * 8;
  D.22666 = D.22663 + D.22665;
  D.22774 = *D.22666;
  D.22775 = D.22774->loop_blocks;
  if (D.22775 != 0B) goto <D.22776>; else goto <D.22777>;
  <D.22776>:
  {
    struct MonoBasicBlock * h;
    struct MonoBasicBlock * body_start;
    struct GList * l;

    D.22663 = cfg->bblocks;
    D.22664 = (long unsigned int) i;
    D.22665 = D.22664 * 8;
    D.22666 = D.22663 + D.22665;
    h = *D.22666;
    body_start = h;
    l = h->loop_blocks;
    goto <D.22442>;
    <D.22441>:
    {
      struct MonoBasicBlock * cb;

      cb = l->data;
      D.22778 = cb->dfn;
      if (D.22778 != 0) goto <D.22779>; else goto <D.22780>;
      <D.22779>:
      D.22778 = cb->dfn;
      D.22781 = (long unsigned int) D.22778;
      D.22782 = D.22781 * 4;
      D.22783 = bb_indexes + D.22782;
      D.22784 = *D.22783;
      D.22785 = body_start->dfn;
      D.22786 = (long unsigned int) D.22785;
      D.22787 = D.22786 * 4;
      D.22788 = bb_indexes + D.22787;
      D.22789 = *D.22788;
      if (D.22784 < D.22789) goto <D.22790>; else goto <D.22791>;
      <D.22790>:
      body_start = cb;
      <D.22791>:
      <D.22780>:
    }
    l = l->next;
    <D.22442>:
    if (l != 0B) goto <D.22441>; else goto <D.22443>;
    <D.22443>:
    body_start->loop_body_start = 1;
  }
  <D.22777>:
  i = i + 1;
  <D.22445>:
  i.7 = (unsigned int) i;
  D.22661 = cfg->num_bblocks;
  if (i.7 < D.22661) goto <D.22444>; else goto <D.22446>;
  <D.22446>:
  monoeg_g_free (bb_indexes);
}


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

  new_list = mono_mempool_alloc (mp, 24);
  new_list->data = data;
  if (list != 0B) goto <D.22793>; else goto <D.22794>;
  <D.22793>:
  iftmp.8 = list->prev;
  goto <D.22795>;
  <D.22794>:
  iftmp.8 = 0B;
  <D.22795>:
  new_list->prev = iftmp.8;
  new_list->next = list;
  D.22796 = new_list->prev;
  if (D.22796 != 0B) goto <D.22797>; else goto <D.22798>;
  <D.22797>:
  D.22796 = new_list->prev;
  D.22796->next = new_list;
  <D.22798>:
  if (list != 0B) goto <D.22799>; else goto <D.22800>;
  <D.22799>:
  list->prev = new_list;
  <D.22800>:
  D.22801 = new_list;
  return D.22801;
}


mono_free_loop_info (struct MonoCompile * cfg)
{
  unsigned int D.22803;
  unsigned int D.22804;
  unsigned int D.22807;

  D.22803 = cfg->comp_done;
  D.22804 = D.22803 & 2;
  if (D.22804 != 0) goto <D.22805>; else goto <D.22806>;
  <D.22805>:
  clear_idominators (cfg);
  <D.22806>:
  D.22803 = cfg->comp_done;
  D.22807 = D.22803 & 256;
  if (D.22807 != 0) goto <D.22808>; else goto <D.22809>;
  <D.22808>:
  clear_loops (cfg);
  <D.22809>:
}


clear_idominators (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22810;
  long unsigned int D.22811;
  long unsigned int D.22812;
  struct MonoBasicBlock * * D.22813;
  struct MonoBasicBlock * D.22814;
  struct GSList * D.22815;
  unsigned int D.22818;
  unsigned int D.22819;
  unsigned int D.22820;
  guint i;

  i = 0;
  goto <D.22452>;
  <D.22451>:
  D.22810 = cfg->bblocks;
  D.22811 = (long unsigned int) i;
  D.22812 = D.22811 * 8;
  D.22813 = D.22810 + D.22812;
  D.22814 = *D.22813;
  D.22815 = D.22814->dominated;
  if (D.22815 != 0B) goto <D.22816>; else goto <D.22817>;
  <D.22816>:
  D.22810 = cfg->bblocks;
  D.22811 = (long unsigned int) i;
  D.22812 = D.22811 * 8;
  D.22813 = D.22810 + D.22812;
  D.22814 = *D.22813;
  D.22814->dominated = 0B;
  <D.22817>:
  i = i + 1;
  <D.22452>:
  D.22818 = cfg->num_bblocks;
  if (D.22818 > i) goto <D.22451>; else goto <D.22453>;
  <D.22453>:
  D.22819 = cfg->comp_done;
  D.22820 = D.22819 & 4294967293;
  cfg->comp_done = D.22820;
}


clear_loops (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22821;
  long unsigned int D.22822;
  long unsigned int D.22823;
  struct MonoBasicBlock * * D.22824;
  struct MonoBasicBlock * D.22825;
  unsigned int D.22826;
  unsigned int D.22827;
  unsigned int D.22828;
  guint i;

  i = 0;
  goto <D.22459>;
  <D.22458>:
  D.22821 = cfg->bblocks;
  D.22822 = (long unsigned int) i;
  D.22823 = D.22822 * 8;
  D.22824 = D.22821 + D.22823;
  D.22825 = *D.22824;
  D.22825->nesting = 0;
  D.22821 = cfg->bblocks;
  D.22822 = (long unsigned int) i;
  D.22823 = D.22822 * 8;
  D.22824 = D.22821 + D.22823;
  D.22825 = *D.22824;
  D.22825->loop_blocks = 0B;
  i = i + 1;
  <D.22459>:
  D.22826 = cfg->num_bblocks;
  if (D.22826 > i) goto <D.22458>; else goto <D.22460>;
  <D.22460>:
  D.22827 = cfg->comp_done;
  D.22828 = D.22827 & 4294967039;
  cfg->comp_done = D.22828;
}


