mono_compile_iterated_dfrontier (struct MonoCompile * m, struct MonoBitSet * set)
{
  unsigned int D.21616;
  unsigned int D.21617;
  struct MonoMemPool * D.21618;
  unsigned int bitsize.0;
  void * D.21620;
  unsigned int D.21621;
  unsigned int D.21622;
  struct MonoBitSet * D.21623;
  struct MonoBitSet * result;
  int bitsize;
  int count1;
  int count2;

  D.21616 = m->num_bblocks;
  D.21617 = mono_bitset_alloc_size (D.21616, 0);
  bitsize = (int) D.21617;
  D.21618 = m->mempool;
  bitsize.0 = (unsigned int) bitsize;
  D.21620 = mono_mempool_alloc0 (D.21618, bitsize.0);
  D.21616 = m->num_bblocks;
  result = mono_bitset_mem_new (D.21620, D.21616, 0);
  df_set (m, result, set);
  D.21621 = mono_bitset_count (result);
  count2 = (int) D.21621;
  <D.21547>:
  count1 = count2;
  df_set (m, result, result);
  D.21622 = mono_bitset_count (result);
  count2 = (int) D.21622;
  if (count2 > count1) goto <D.21547>; else goto <D.21548>;
  <D.21548>:
  D.21623 = result;
  return D.21623;
}


df_set (struct MonoCompile * m, struct MonoBitSet * dest, struct MonoBitSet * set)
{
  struct MonoBasicBlock * * D.21625;
  unsigned int i.1;
  unsigned int D.21627;
  struct MonoBasicBlock * * D.21628;
  struct MonoBasicBlock * D.21629;
  unsigned int D.21630;
  unsigned int D.21631;
  unsigned int D.21632;
  unsigned int D.21633;
  unsigned int D.21634;
  unsigned int i.2;
  unsigned int D.21636;
  int i;

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

    D.21625 = m->bblocks;
    i.1 = (unsigned int) i;
    D.21627 = i.1 * 4;
    D.21628 = D.21625 + D.21627;
    D.21629 = *D.21628;
    tmp_src = D.21629->dfrontier;
    tmp_dest = dest;
    D.21630 = tmp_dest->size;
    D.21631 = D.21630 / 32;
    size = (int) D.21631;
    i = 0;
    goto <D.21534>;
    <D.21533>:
    D.21632 = tmp_dest->data[i];
    D.21633 = tmp_src->data[i];
    D.21634 = D.21632 | D.21633;
    tmp_dest->data[i] = D.21634;
    i = i + 1;
    <D.21534>:
    if (i < size) goto <D.21533>; else goto <D.21535>;
    <D.21535>:
  }
  i = mono_bitset_find_first (set, i);
  <D.21537>:
  i.2 = (unsigned int) i;
  D.21636 = m->num_bblocks;
  if (i.2 < D.21636) goto <D.21637>; else goto <D.21538>;
  <D.21637>:
  if (i >= 0) goto <D.21536>; else goto <D.21538>;
  <D.21538>:
}


mono_compile_dominator_info (struct MonoCompile * cfg, int dom_flags)
{
  int D.21638;
  unsigned int D.21641;
  unsigned int D.21642;
  int D.21645;
  unsigned int D.21648;

  D.21638 = dom_flags & 1;
  if (D.21638 != 0) goto <D.21639>; else goto <D.21640>;
  <D.21639>:
  D.21641 = cfg->comp_done;
  D.21642 = D.21641 & 1;
  if (D.21642 == 0) goto <D.21643>; else goto <D.21644>;
  <D.21643>:
  compute_dominators (cfg);
  <D.21644>:
  <D.21640>:
  D.21645 = dom_flags & 4;
  if (D.21645 != 0) goto <D.21646>; else goto <D.21647>;
  <D.21646>:
  D.21641 = cfg->comp_done;
  D.21648 = D.21641 & 4;
  if (D.21648 == 0) goto <D.21649>; else goto <D.21650>;
  <D.21649>:
  compute_dominance_frontier (cfg);
  <D.21650>:
  <D.21647>:
}


compute_dominators (struct MonoCompile * cfg)
{
  unsigned int D.21651;
  unsigned int D.21652;
  _Bool D.21653;
  long int D.21654;
  long int D.21655;
  unsigned int D.21658;
  unsigned int D.21659;
  struct MonoBasicBlock * * D.21660;
  unsigned int D.21661;
  int D.21662;
  unsigned int D.21663;
  unsigned int D.21664;
  struct MonoBasicBlock * * D.21665;
  unsigned int bindex.3;
  unsigned int D.21667;
  struct MonoBasicBlock * * D.21668;
  struct MonoBasicBlock * * D.21669;
  unsigned int i.4;
  unsigned int D.21671;
  struct MonoBasicBlock * * D.21672;
  int D.21675;
  unsigned int D.21676;
  unsigned int D.21677;
  struct MonoBasicBlock * * D.21678;
  struct MonoBasicBlock * D.21679;
  short int D.21682;
  int D.21683;
  struct MonoBasicBlock * D.21684;
  _Bool D.21687;
  long int D.21688;
  long int D.21689;
  int D.21694;
  unsigned int D.21696;
  unsigned int D.21697;
  struct MonoBasicBlock * * D.21698;
  struct MonoBasicBlock * D.21699;
  int D.21702;
  int D.21703;
  unsigned int D.21706;
  unsigned int D.21707;
  struct MonoBasicBlock * * D.21708;
  unsigned int D.21710;
  unsigned int D.21711;
  struct MonoBasicBlock * * D.21712;
  int D.21713;
  unsigned int D.21714;
  unsigned int D.21715;
  struct MonoBasicBlock * * D.21716;
  struct MonoBasicBlock * D.21717;
  unsigned int bindex.5;
  struct MonoBasicBlock * * D.21724;
  struct MonoMemPool * D.21725;
  unsigned int bitsize.6;
  sizetype bitsize.7;
  int D.21728;
  unsigned int D.21729;
  unsigned int D.21730;
  unsigned int D.21731;
  int D.21732;
  unsigned int D.21733;
  unsigned int D.21734;
  unsigned int D.21737;
  struct MonoBasicBlock * * D.21738;
  int D.21739;
  unsigned int D.21740;
  unsigned int D.21741;
  unsigned int D.21742;
  int D.21743;
  unsigned int D.21744;
  unsigned int D.21745;
  unsigned int D.21746;
  struct MonoBasicBlock * * D.21747;
  struct MonoBasicBlock * D.21748;
  struct MonoBasicBlock * D.21749;
  struct GSList * D.21752;
  struct GSList * D.21753;
  unsigned int D.21754;
  unsigned int D.21755;
  unsigned int i.8;
  unsigned int D.21757;
  int bindex;
  int i;
  int bitsize;
  struct MonoBasicBlock * entry;
  struct MonoBasicBlock * * doms;
  gboolean changed;

  D.21651 = cfg->comp_done;
  D.21652 = D.21651 & 1;
  D.21653 = D.21652 != 0;
  D.21654 = (long int) D.21653;
  D.21655 = __builtin_expect (D.21654, 0);
  if (D.21655 != 0) goto <D.21656>; else goto <D.21657>;
  <D.21656>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 42, "!(cfg->comp_done & MONO_COMP_DOM)");
  <D.21657>:
  D.21658 = cfg->num_bblocks;
  D.21659 = mono_bitset_alloc_size (D.21658, 0);
  bitsize = (int) D.21659;
  D.21660 = cfg->bblocks;
  entry = *D.21660;
  D.21658 = cfg->num_bblocks;
  D.21661 = D.21658 * 4;
  doms = monoeg_malloc0 (D.21661);
  D.21662 = entry->dfn;
  D.21663 = (unsigned int) D.21662;
  D.21664 = D.21663 * 4;
  D.21665 = doms + D.21664;
  *D.21665 = entry;
  changed = 1;
  goto <D.21486>;
  <D.21485>:
  changed = 0;
  bindex = 0;
  goto <D.21483>;
  <D.21482>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * idom;

    D.21660 = cfg->bblocks;
    bindex.3 = (unsigned int) bindex;
    D.21667 = bindex.3 * 4;
    D.21668 = D.21660 + D.21667;
    bb = *D.21668;
    idom = 0B;
    i = 0;
    goto <D.21472>;
    <D.21471>:
    {
      struct MonoBasicBlock * in_bb;

      D.21669 = bb->in_bb;
      i.4 = (unsigned int) i;
      D.21671 = i.4 * 4;
      D.21672 = D.21669 + D.21671;
      in_bb = *D.21672;
      if (in_bb != bb) goto <D.21673>; else goto <D.21674>;
      <D.21673>:
      D.21675 = in_bb->dfn;
      D.21676 = (unsigned int) D.21675;
      D.21677 = D.21676 * 4;
      D.21678 = doms + D.21677;
      D.21679 = *D.21678;
      if (D.21679 != 0B) goto <D.21680>; else goto <D.21681>;
      <D.21680>:
      idom = in_bb;
      goto <D.21470>;
      <D.21681>:
      <D.21674>:
    }
    i = i + 1;
    <D.21472>:
    D.21682 = bb->in_count;
    D.21683 = (int) D.21682;
    if (D.21683 > i) goto <D.21471>; else goto <D.21470>;
    <D.21470>:
    D.21660 = cfg->bblocks;
    D.21684 = *D.21660;
    if (D.21684 != bb) goto <D.21685>; else goto <D.21686>;
    <D.21685>:
    D.21687 = idom == 0B;
    D.21688 = (long int) D.21687;
    D.21689 = __builtin_expect (D.21688, 0);
    if (D.21689 != 0) goto <D.21690>; else goto <D.21691>;
    <D.21690>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 79, "idom");
    <D.21691>:
    <D.21686>:
    goto <D.21480>;
    <D.21479>:
    {
      struct MonoBasicBlock * in_bb;

      D.21669 = bb->in_bb;
      i.4 = (unsigned int) i;
      D.21671 = i.4 * 4;
      D.21672 = D.21669 + D.21671;
      in_bb = *D.21672;
      D.21694 = in_bb->dfn;
      if (D.21694 != 0) goto <D.21692>; else goto <D.21695>;
      <D.21695>:
      if (in_bb == entry) goto <D.21692>; else goto <D.21693>;
      <D.21692>:
      D.21694 = in_bb->dfn;
      D.21696 = (unsigned int) D.21694;
      D.21697 = D.21696 * 4;
      D.21698 = doms + D.21697;
      D.21699 = *D.21698;
      if (D.21699 != 0B) goto <D.21700>; else goto <D.21701>;
      <D.21700>:
      {
        struct MonoBasicBlock * f1;
        struct MonoBasicBlock * f2;

        f1 = idom;
        f2 = in_bb;
        goto <D.21477>;
        <D.21476>:
        D.21702 = f1->dfn;
        D.21703 = f2->dfn;
        if (D.21702 < D.21703) goto <D.21704>; else goto <D.21705>;
        <D.21704>:
        D.21703 = f2->dfn;
        D.21706 = (unsigned int) D.21703;
        D.21707 = D.21706 * 4;
        D.21708 = doms + D.21707;
        f2 = *D.21708;
        goto <D.21709>;
        <D.21705>:
        D.21702 = f1->dfn;
        D.21710 = (unsigned int) D.21702;
        D.21711 = D.21710 * 4;
        D.21712 = doms + D.21711;
        f1 = *D.21712;
        <D.21709>:
        <D.21477>:
        if (f1 != f2) goto <D.21476>; else goto <D.21478>;
        <D.21478>:
        idom = f1;
      }
      <D.21701>:
      <D.21693>:
      i = i + 1;
    }
    <D.21480>:
    D.21682 = bb->in_count;
    D.21683 = (int) D.21682;
    if (D.21683 > i) goto <D.21479>; else goto <D.21481>;
    <D.21481>:
    D.21713 = bb->dfn;
    D.21714 = (unsigned int) D.21713;
    D.21715 = D.21714 * 4;
    D.21716 = doms + D.21715;
    D.21717 = *D.21716;
    if (D.21717 != idom) goto <D.21718>; else goto <D.21719>;
    <D.21718>:
    D.21660 = cfg->bblocks;
    D.21684 = *D.21660;
    if (D.21684 == bb) goto <D.21720>; else goto <D.21721>;
    <D.21720>:
    D.21713 = bb->dfn;
    D.21714 = (unsigned int) D.21713;
    D.21715 = D.21714 * 4;
    D.21716 = doms + D.21715;
    *D.21716 = bb;
    goto <D.21722>;
    <D.21721>:
    D.21713 = bb->dfn;
    D.21714 = (unsigned int) D.21713;
    D.21715 = D.21714 * 4;
    D.21716 = doms + D.21715;
    *D.21716 = idom;
    changed = 1;
    <D.21722>:
    <D.21719>:
  }
  bindex = bindex + 1;
  <D.21483>:
  bindex.5 = (unsigned int) bindex;
  D.21658 = cfg->num_bblocks;
  if (bindex.5 < D.21658) goto <D.21482>; else goto <D.21484>;
  <D.21484>:
  <D.21486>:
  if (changed != 0) goto <D.21485>; else goto <D.21487>;
  <D.21487>:
  i = 0;
  goto <D.21496>;
  <D.21495>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * cbb;
    struct MonoBitSet * dominators;
    char * mem;

    D.21660 = cfg->bblocks;
    i.4 = (unsigned int) i;
    D.21671 = i.4 * 4;
    D.21724 = D.21660 + D.21671;
    bb = *D.21724;
    D.21725 = cfg->mempool;
    bitsize.6 = (unsigned int) bitsize;
    mem = mono_mempool_alloc0 (D.21725, bitsize.6);
    D.21658 = cfg->num_bblocks;
    dominators = mono_bitset_mem_new (mem, D.21658, 0);
    bb->dominators = dominators;
    bitsize.7 = (sizetype) bitsize;
    mem = mem + bitsize.7;
    D.21728 = bb->dfn;
    D.21729 = (unsigned int) D.21728;
    D.21730 = D.21729 / 32;
    D.21731 = dominators->data[D.21730];
    D.21728 = bb->dfn;
    D.21732 = D.21728 & 31;
    D.21733 = 1 << D.21732;
    D.21734 = D.21731 | D.21733;
    dominators->data[D.21730] = D.21734;
    D.21728 = bb->dfn;
    if (D.21728 != 0) goto <D.21735>; else goto <D.21736>;
    <D.21735>:
    D.21728 = bb->dfn;
    D.21729 = (unsigned int) D.21728;
    D.21737 = D.21729 * 4;
    D.21738 = doms + D.21737;
    cbb = *D.21738;
    goto <D.21493>;
    <D.21492>:
    D.21739 = cbb->dfn;
    D.21740 = (unsigned int) D.21739;
    D.21741 = D.21740 / 32;
    D.21742 = dominators->data[D.21741];
    D.21739 = cbb->dfn;
    D.21743 = D.21739 & 31;
    D.21744 = 1 << D.21743;
    D.21745 = D.21742 | D.21744;
    dominators->data[D.21741] = D.21745;
    D.21739 = cbb->dfn;
    D.21740 = (unsigned int) D.21739;
    D.21746 = D.21740 * 4;
    D.21747 = doms + D.21746;
    cbb = *D.21747;
    <D.21493>:
    D.21739 = cbb->dfn;
    if (D.21739 != 0) goto <D.21492>; else goto <D.21494>;
    <D.21494>:
    D.21728 = bb->dfn;
    D.21729 = (unsigned int) D.21728;
    D.21737 = D.21729 * 4;
    D.21738 = doms + D.21737;
    D.21748 = *D.21738;
    bb->idom = D.21748;
    D.21749 = bb->idom;
    if (D.21749 != 0B) goto <D.21750>; else goto <D.21751>;
    <D.21750>:
    D.21749 = bb->idom;
    D.21725 = cfg->mempool;
    D.21749 = bb->idom;
    D.21752 = D.21749->dominated;
    D.21753 = g_slist_prepend_mempool (D.21725, D.21752, bb);
    D.21749->dominated = D.21753;
    <D.21751>:
    <D.21736>:
    D.21754 = dominators->data[0];
    D.21755 = D.21754 | 1;
    dominators->data[0] = D.21755;
  }
  i = i + 1;
  <D.21496>:
  i.8 = (unsigned int) i;
  D.21658 = cfg->num_bblocks;
  if (i.8 < D.21658) goto <D.21495>; else goto <D.21497>;
  <D.21497>:
  monoeg_g_free (doms);
  D.21651 = cfg->comp_done;
  D.21757 = D.21651 | 3;
  cfg->comp_done = D.21757;
}


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

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


compute_dominance_frontier (struct MonoCompile * cfg)
{
  unsigned int D.21760;
  unsigned int D.21761;
  _Bool D.21762;
  long int D.21763;
  long int D.21764;
  struct MonoBasicBlock * * D.21767;
  unsigned int i.9;
  unsigned int D.21769;
  struct MonoBasicBlock * * D.21770;
  struct MonoBasicBlock * D.21771;
  unsigned int D.21772;
  unsigned int D.21773;
  unsigned int i.10;
  unsigned int D.21775;
  unsigned int D.21776;
  struct MonoMemPool * D.21777;
  unsigned int bitsize.11;
  unsigned int D.21779;
  struct MonoBitSet * D.21780;
  sizetype bitsize.12;
  short int D.21782;
  struct MonoBasicBlock * * D.21785;
  unsigned int j.13;
  unsigned int D.21787;
  struct MonoBasicBlock * * D.21788;
  int D.21790;
  struct MonoBasicBlock * D.21792;
  struct MonoBitSet * D.21793;
  int D.21794;
  unsigned int D.21795;
  unsigned int D.21796;
  unsigned int D.21797;
  int D.21798;
  unsigned int D.21799;
  unsigned int D.21800;
  struct MonoBasicBlock * D.21801;
  int D.21802;
  unsigned int D.21803;
  char * mem;
  int i;
  int j;
  int bitsize;

  D.21760 = cfg->comp_done;
  D.21761 = D.21760 & 4;
  D.21762 = D.21761 != 0;
  D.21763 = (long int) D.21762;
  D.21764 = __builtin_expect (D.21763, 0);
  if (D.21764 != 0) goto <D.21765>; else goto <D.21766>;
  <D.21765>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 197, "!(cfg->comp_done & MONO_COMP_DFRONTIER)");
  <D.21766>:
  i = 0;
  goto <D.21506>;
  <D.21505>:
  D.21767 = cfg->bblocks;
  i.9 = (unsigned int) i;
  D.21769 = i.9 * 4;
  D.21770 = D.21767 + D.21769;
  D.21771 = *D.21770;
  D.21767 = cfg->bblocks;
  i.9 = (unsigned int) i;
  D.21769 = i.9 * 4;
  D.21770 = D.21767 + D.21769;
  D.21771 = *D.21770;
  D.21772 = D.21771->flags;
  D.21773 = D.21772 & 4294967294;
  D.21771->flags = D.21773;
  i = i + 1;
  <D.21506>:
  i.10 = (unsigned int) i;
  D.21775 = cfg->num_bblocks;
  if (i.10 < D.21775) goto <D.21505>; else goto <D.21507>;
  <D.21507>:
  D.21775 = cfg->num_bblocks;
  D.21776 = mono_bitset_alloc_size (D.21775, 0);
  bitsize = (int) D.21776;
  D.21777 = cfg->mempool;
  D.21775 = cfg->num_bblocks;
  bitsize.11 = (unsigned int) bitsize;
  D.21779 = D.21775 * bitsize.11;
  mem = mono_mempool_alloc0 (D.21777, D.21779);
  i = 0;
  goto <D.21510>;
  <D.21509>:
  {
    struct MonoBasicBlock * bb;

    D.21767 = cfg->bblocks;
    i.9 = (unsigned int) i;
    D.21769 = i.9 * 4;
    D.21770 = D.21767 + D.21769;
    bb = *D.21770;
    D.21775 = cfg->num_bblocks;
    D.21780 = mono_bitset_mem_new (mem, D.21775, 0);
    bb->dfrontier = D.21780;
    bitsize.12 = (sizetype) bitsize;
    mem = mem + bitsize.12;
  }
  i = i + 1;
  <D.21510>:
  i.10 = (unsigned int) i;
  D.21775 = cfg->num_bblocks;
  if (i.10 < D.21775) goto <D.21509>; else goto <D.21511>;
  <D.21511>:
  i = 0;
  goto <D.21521>;
  <D.21520>:
  {
    struct MonoBasicBlock * bb;

    D.21767 = cfg->bblocks;
    i.9 = (unsigned int) i;
    D.21769 = i.9 * 4;
    D.21770 = D.21767 + D.21769;
    bb = *D.21770;
    D.21782 = bb->in_count;
    if (D.21782 > 1) goto <D.21783>; else goto <D.21784>;
    <D.21783>:
    j = 0;
    goto <D.21518>;
    <D.21517>:
    {
      struct MonoBasicBlock * p;

      D.21785 = bb->in_bb;
      j.13 = (unsigned int) j;
      D.21787 = j.13 * 4;
      D.21788 = D.21785 + D.21787;
      p = *D.21788;
      D.21790 = p->dfn;
      if (D.21790 != 0) goto <D.21789>; else goto <D.21791>;
      <D.21791>:
      D.21767 = cfg->bblocks;
      D.21792 = *D.21767;
      if (D.21792 == p) goto <D.21789>; else goto <D.21516>;
      <D.21789>:
      goto <D.21515>;
      <D.21514>:
      D.21793 = p->dfrontier;
      D.21794 = bb->dfn;
      D.21795 = (unsigned int) D.21794;
      D.21796 = D.21795 / 32;
      D.21793 = p->dfrontier;
      D.21797 = D.21793->data[D.21796];
      D.21794 = bb->dfn;
      D.21798 = D.21794 & 31;
      D.21799 = 1 << D.21798;
      D.21800 = D.21797 | D.21799;
      D.21793->data[D.21796] = D.21800;
      p = p->idom;
      <D.21515>:
      D.21801 = bb->idom;
      if (D.21801 != p) goto <D.21514>; else goto <D.21516>;
      <D.21516>:
    }
    j = j + 1;
    <D.21518>:
    D.21782 = bb->in_count;
    D.21802 = (int) D.21782;
    if (D.21802 > j) goto <D.21517>; else goto <D.21519>;
    <D.21519>:
    <D.21784>:
  }
  i = i + 1;
  <D.21521>:
  i.10 = (unsigned int) i;
  D.21775 = cfg->num_bblocks;
  if (i.10 < D.21775) goto <D.21520>; else goto <D.21522>;
  <D.21522>:
  D.21760 = cfg->comp_done;
  D.21803 = D.21760 | 4;
  cfg->comp_done = D.21803;
}


mono_compute_natural_loops (struct MonoCompile * cfg)
{
  unsigned int D.21804;
  unsigned int D.21805;
  _Bool D.21806;
  long int D.21807;
  long int D.21808;
  unsigned int D.21811;
  unsigned int D.21812;
  struct MonoBasicBlock * * D.21813;
  unsigned int i.14;
  unsigned int D.21815;
  struct MonoBasicBlock * * D.21816;
  struct MonoBasicBlock * * D.21817;
  unsigned int j.15;
  unsigned int D.21819;
  struct MonoBasicBlock * * D.21820;
  struct MonoBitSet * D.21823;
  int D.21824;
  unsigned int D.21825;
  unsigned int D.21826;
  unsigned int D.21827;
  int D.21828;
  unsigned int D.21829;
  unsigned int D.21830;
  struct GList * D.21833;
  struct GList * D.21836;
  int D.21841;
  unsigned int D.21844;
  unsigned int D.21845;
  unsigned int D.21846;
  int D.21847;
  unsigned int D.21848;
  unsigned int D.21849;
  int D.21853;
  unsigned int D.21855;
  unsigned int D.21856;
  unsigned int D.21857;
  int D.21858;
  unsigned int D.21859;
  unsigned int D.21860;
  struct GList * D.21862;
  struct MonoMemPool * D.21863;
  struct GList * D.21864;
  signed char D.21865;
  signed char D.21866;
  unsigned char D.21867;
  unsigned char D.21868;
  signed char D.21869;
  unsigned int D.21872;
  unsigned int D.21873;
  unsigned int D.21874;
  struct MonoBasicBlock * * D.21875;
  unsigned int k.16;
  unsigned int D.21877;
  struct MonoBasicBlock * * D.21878;
  int D.21884;
  unsigned int D.21886;
  unsigned int D.21887;
  unsigned int D.21888;
  int D.21889;
  unsigned int D.21890;
  unsigned int D.21891;
  struct GList * D.21893;
  short int D.21894;
  int D.21895;
  unsigned int D.21900;
  unsigned int D.21901;
  struct GList * D.21903;
  struct GList * D.21904;
  signed char D.21905;
  signed char D.21906;
  unsigned char D.21907;
  unsigned char D.21908;
  signed char D.21909;
  short int D.21910;
  int D.21911;
  unsigned int i.17;
  unsigned int D.21913;
  unsigned int D.21914;
  int D.21915;
  unsigned int D.21918;
  unsigned int D.21919;
  int * D.21920;
  struct MonoBasicBlock * D.21921;
  struct GList * D.21922;
  int D.21925;
  unsigned int D.21928;
  unsigned int D.21929;
  int * D.21930;
  int D.21931;
  int D.21932;
  unsigned int D.21933;
  unsigned int D.21934;
  int * D.21935;
  int D.21936;
  int i;
  int j;
  int k;
  struct MonoBitSet * in_loop_blocks;
  int * bb_indexes;

  D.21804 = cfg->comp_done;
  D.21805 = D.21804 & 256;
  D.21806 = D.21805 != 0;
  D.21807 = (long int) D.21806;
  D.21808 = __builtin_expect (D.21807, 0);
  if (D.21808 != 0) goto <D.21809>; else goto <D.21810>;
  <D.21809>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 311, "!(cfg->comp_done & MONO_COMP_LOOPS)");
  <D.21810>:
  D.21811 = cfg->num_bblocks;
  D.21812 = D.21811 + 1;
  in_loop_blocks = mono_bitset_new (D.21812, 0);
  i = 0;
  goto <D.21582>;
  <D.21581>:
  {
    struct MonoBasicBlock * n;

    D.21813 = cfg->bblocks;
    i.14 = (unsigned int) i;
    D.21815 = i.14 * 4;
    D.21816 = D.21813 + D.21815;
    n = *D.21816;
    j = 0;
    goto <D.21579>;
    <D.21578>:
    {
      struct MonoBasicBlock * h;

      D.21817 = n->out_bb;
      j.15 = (unsigned int) j;
      D.21819 = j.15 * 4;
      D.21820 = D.21817 + D.21819;
      h = *D.21820;
      if (n != h) goto <D.21821>; else goto <D.21822>;
      <D.21821>:
      D.21823 = n->dominators;
      D.21824 = h->dfn;
      D.21825 = (unsigned int) D.21824;
      D.21826 = D.21825 / 32;
      D.21827 = D.21823->data[D.21826];
      D.21824 = h->dfn;
      D.21828 = D.21824 & 31;
      D.21829 = 1 << D.21828;
      D.21830 = D.21827 & D.21829;
      if (D.21830 != 0) goto <D.21831>; else goto <D.21832>;
      <D.21831>:
      {
        struct GSList * todo;

        D.21833 = h->loop_blocks;
        if (D.21833 != 0B) goto <D.21834>; else goto <D.21835>;
        <D.21834>:
        D.21833 = h->loop_blocks;
        D.21836 = monoeg_g_list_find (D.21833, n);
        if (D.21836 != 0B) goto <D.21837>; else goto <D.21838>;
        <D.21837>:
        // predicted unlikely by continue predictor.
        goto <D.21564>;
        <D.21838>:
        <D.21835>:
        mono_bitset_clear_all (in_loop_blocks);
        D.21833 = h->loop_blocks;
        if (D.21833 != 0B) goto <D.21839>; else goto <D.21840>;
        <D.21839>:
        {
          struct GList * l;

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

            b = l->data;
            D.21841 = b->dfn;
            if (D.21841 != 0) goto <D.21842>; else goto <D.21843>;
            <D.21842>:
            D.21841 = b->dfn;
            D.21844 = (unsigned int) D.21841;
            D.21845 = D.21844 / 32;
            D.21846 = in_loop_blocks->data[D.21845];
            D.21841 = b->dfn;
            D.21847 = D.21841 & 31;
            D.21848 = 1 << D.21847;
            D.21849 = D.21846 | D.21848;
            in_loop_blocks->data[D.21845] = D.21849;
            <D.21843>:
          }
          l = l->next;
          <D.21568>:
          if (l != 0B) goto <D.21567>; else goto <D.21569>;
          <D.21569>:
        }
        <D.21840>:
        todo = monoeg_g_slist_prepend (0B, n);
        goto <D.21571>;
        <D.21576>:
        {
          struct MonoBasicBlock * cb;

          cb = todo->data;
          todo = monoeg_g_slist_delete_link (todo, todo);
          D.21853 = cb->dfn;
          if (D.21853 != 0) goto <D.21854>; else goto <D.21850>;
          <D.21854>:
          D.21853 = cb->dfn;
          D.21855 = (unsigned int) D.21853;
          D.21856 = D.21855 / 32;
          D.21857 = in_loop_blocks->data[D.21856];
          D.21853 = cb->dfn;
          D.21858 = D.21853 & 31;
          D.21859 = 1 << D.21858;
          D.21860 = D.21857 & D.21859;
          if (D.21860 != 0) goto <D.21851>; else goto <D.21850>;
          <D.21850>:
          D.21853 = cb->dfn;
          if (D.21853 == 0) goto <D.21861>; else goto <D.21852>;
          <D.21861>:
          D.21833 = h->loop_blocks;
          D.21862 = monoeg_g_list_find (D.21833, cb);
          if (D.21862 != 0B) goto <D.21851>; else goto <D.21852>;
          <D.21851>:
          // predicted unlikely by continue predictor.
          goto <D.21571>;
          <D.21852>:
          D.21863 = cfg->mempool;
          D.21833 = h->loop_blocks;
          D.21864 = g_list_prepend_mempool (D.21863, D.21833, cb);
          h->loop_blocks = D.21864;
          D.21865 = cb->nesting;
          D.21866 = D.21865;
          D.21867 = (unsigned char) D.21866;
          D.21868 = D.21867 + 1;
          D.21869 = (signed char) D.21868;
          cb->nesting = D.21869;
          D.21853 = cb->dfn;
          if (D.21853 != 0) goto <D.21870>; else goto <D.21871>;
          <D.21870>:
          D.21853 = cb->dfn;
          D.21855 = (unsigned int) D.21853;
          D.21872 = D.21855 / 32;
          D.21873 = in_loop_blocks->data[D.21872];
          D.21853 = cb->dfn;
          D.21858 = D.21853 & 31;
          D.21859 = 1 << D.21858;
          D.21874 = D.21873 | D.21859;
          in_loop_blocks->data[D.21872] = D.21874;
          <D.21871>:
          k = 0;
          goto <D.21574>;
          <D.21573>:
          {
            struct MonoBasicBlock * prev;

            D.21875 = cb->in_bb;
            k.16 = (unsigned int) k;
            D.21877 = k.16 * 4;
            D.21878 = D.21875 + D.21877;
            prev = *D.21878;
            if (prev != h) goto <D.21882>; else goto <D.21883>;
            <D.21882>:
            D.21884 = prev->dfn;
            if (D.21884 == 0) goto <D.21881>; else goto <D.21885>;
            <D.21885>:
            D.21884 = prev->dfn;
            D.21886 = (unsigned int) D.21884;
            D.21887 = D.21886 / 32;
            D.21888 = in_loop_blocks->data[D.21887];
            D.21884 = prev->dfn;
            D.21889 = D.21884 & 31;
            D.21890 = 1 << D.21889;
            D.21891 = D.21888 & D.21890;
            if (D.21891 == 0) goto <D.21881>; else goto <D.21880>;
            <D.21881>:
            D.21884 = prev->dfn;
            if (D.21884 != 0) goto <D.21879>; else goto <D.21892>;
            <D.21892>:
            D.21833 = h->loop_blocks;
            D.21893 = monoeg_g_list_find (D.21833, prev);
            if (D.21893 == 0B) goto <D.21879>; else goto <D.21880>;
            <D.21879>:
            todo = monoeg_g_slist_prepend (todo, prev);
            <D.21880>:
            <D.21883>:
          }
          k = k + 1;
          <D.21574>:
          D.21894 = cb->in_count;
          D.21895 = (int) D.21894;
          if (D.21895 > k) goto <D.21573>; else goto <D.21575>;
          <D.21575>:
        }
        <D.21571>:
        if (todo != 0B) goto <D.21576>; else goto <D.21577>;
        <D.21577>:
        D.21824 = h->dfn;
        if (D.21824 == 0) goto <D.21898>; else goto <D.21899>;
        <D.21899>:
        D.21824 = h->dfn;
        D.21825 = (unsigned int) D.21824;
        D.21826 = D.21825 / 32;
        D.21900 = in_loop_blocks->data[D.21826];
        D.21824 = h->dfn;
        D.21828 = D.21824 & 31;
        D.21829 = 1 << D.21828;
        D.21901 = D.21900 & D.21829;
        if (D.21901 == 0) goto <D.21898>; else goto <D.21897>;
        <D.21898>:
        D.21824 = h->dfn;
        if (D.21824 != 0) goto <D.21896>; else goto <D.21902>;
        <D.21902>:
        D.21833 = h->loop_blocks;
        D.21903 = monoeg_g_list_find (D.21833, h);
        if (D.21903 == 0B) goto <D.21896>; else goto <D.21897>;
        <D.21896>:
        D.21863 = cfg->mempool;
        D.21833 = h->loop_blocks;
        D.21904 = g_list_prepend_mempool (D.21863, D.21833, h);
        h->loop_blocks = D.21904;
        D.21905 = h->nesting;
        D.21906 = D.21905;
        D.21907 = (unsigned char) D.21906;
        D.21908 = D.21907 + 1;
        D.21909 = (signed char) D.21908;
        h->nesting = D.21909;
        <D.21897>:
      }
      <D.21832>:
      <D.21822>:
    }
    <D.21564>:
    j = j + 1;
    <D.21579>:
    D.21910 = n->out_count;
    D.21911 = (int) D.21910;
    if (D.21911 > j) goto <D.21578>; else goto <D.21580>;
    <D.21580>:
  }
  i = i + 1;
  <D.21582>:
  i.17 = (unsigned int) i;
  D.21811 = cfg->num_bblocks;
  if (i.17 < D.21811) goto <D.21581>; else goto <D.21583>;
  <D.21583>:
  mono_bitset_free (in_loop_blocks);
  D.21804 = cfg->comp_done;
  D.21913 = D.21804 | 256;
  cfg->comp_done = D.21913;
  D.21811 = cfg->num_bblocks;
  D.21914 = D.21811 * 4;
  bb_indexes = monoeg_malloc0 (D.21914);
  {
    struct MonoBasicBlock * bb;

    i = 0;
    bb = cfg->bb_entry;
    goto <D.21586>;
    <D.21585>:
    D.21915 = bb->dfn;
    if (D.21915 != 0) goto <D.21916>; else goto <D.21917>;
    <D.21916>:
    D.21915 = bb->dfn;
    D.21918 = (unsigned int) D.21915;
    D.21919 = D.21918 * 4;
    D.21920 = bb_indexes + D.21919;
    *D.21920 = i;
    <D.21917>:
    i = i + 1;
    bb = bb->next_bb;
    <D.21586>:
    if (bb != 0B) goto <D.21585>; else goto <D.21587>;
    <D.21587>:
  }
  i = 0;
  goto <D.21596>;
  <D.21595>:
  D.21813 = cfg->bblocks;
  i.14 = (unsigned int) i;
  D.21815 = i.14 * 4;
  D.21816 = D.21813 + D.21815;
  D.21921 = *D.21816;
  D.21922 = D.21921->loop_blocks;
  if (D.21922 != 0B) goto <D.21923>; else goto <D.21924>;
  <D.21923>:
  {
    struct MonoBasicBlock * h;
    struct MonoBasicBlock * body_start;
    struct GList * l;

    D.21813 = cfg->bblocks;
    i.14 = (unsigned int) i;
    D.21815 = i.14 * 4;
    D.21816 = D.21813 + D.21815;
    h = *D.21816;
    body_start = h;
    l = h->loop_blocks;
    goto <D.21593>;
    <D.21592>:
    {
      struct MonoBasicBlock * cb;

      cb = l->data;
      D.21925 = cb->dfn;
      if (D.21925 != 0) goto <D.21926>; else goto <D.21927>;
      <D.21926>:
      D.21925 = cb->dfn;
      D.21928 = (unsigned int) D.21925;
      D.21929 = D.21928 * 4;
      D.21930 = bb_indexes + D.21929;
      D.21931 = *D.21930;
      D.21932 = body_start->dfn;
      D.21933 = (unsigned int) D.21932;
      D.21934 = D.21933 * 4;
      D.21935 = bb_indexes + D.21934;
      D.21936 = *D.21935;
      if (D.21931 < D.21936) goto <D.21937>; else goto <D.21938>;
      <D.21937>:
      body_start = cb;
      <D.21938>:
      <D.21927>:
    }
    l = l->next;
    <D.21593>:
    if (l != 0B) goto <D.21592>; else goto <D.21594>;
    <D.21594>:
    body_start->loop_body_start = 1;
  }
  <D.21924>:
  i = i + 1;
  <D.21596>:
  i.17 = (unsigned int) i;
  D.21811 = cfg->num_bblocks;
  if (i.17 < D.21811) goto <D.21595>; else goto <D.21597>;
  <D.21597>:
  monoeg_g_free (bb_indexes);
}


g_list_prepend_mempool (struct MonoMemPool * mp, struct GList * list, void * data)
{
  struct GList * iftmp.18;
  struct GList * D.21943;
  struct GList * D.21948;
  struct GList * new_list;

  new_list = mono_mempool_alloc (mp, 12);
  new_list->data = data;
  if (list != 0B) goto <D.21940>; else goto <D.21941>;
  <D.21940>:
  iftmp.18 = list->prev;
  goto <D.21942>;
  <D.21941>:
  iftmp.18 = 0B;
  <D.21942>:
  new_list->prev = iftmp.18;
  new_list->next = list;
  D.21943 = new_list->prev;
  if (D.21943 != 0B) goto <D.21944>; else goto <D.21945>;
  <D.21944>:
  D.21943 = new_list->prev;
  D.21943->next = new_list;
  <D.21945>:
  if (list != 0B) goto <D.21946>; else goto <D.21947>;
  <D.21946>:
  list->prev = new_list;
  <D.21947>:
  D.21948 = new_list;
  return D.21948;
}


mono_free_loop_info (struct MonoCompile * cfg)
{
  unsigned int D.21950;
  unsigned int D.21951;
  unsigned int D.21954;

  D.21950 = cfg->comp_done;
  D.21951 = D.21950 & 2;
  if (D.21951 != 0) goto <D.21952>; else goto <D.21953>;
  <D.21952>:
  clear_idominators (cfg);
  <D.21953>:
  D.21950 = cfg->comp_done;
  D.21954 = D.21950 & 256;
  if (D.21954 != 0) goto <D.21955>; else goto <D.21956>;
  <D.21955>:
  clear_loops (cfg);
  <D.21956>:
}


clear_idominators (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.21957;
  unsigned int D.21958;
  struct MonoBasicBlock * * D.21959;
  struct MonoBasicBlock * D.21960;
  struct GSList * D.21961;
  unsigned int D.21964;
  unsigned int D.21965;
  unsigned int D.21966;
  guint i;

  i = 0;
  goto <D.21603>;
  <D.21602>:
  D.21957 = cfg->bblocks;
  D.21958 = i * 4;
  D.21959 = D.21957 + D.21958;
  D.21960 = *D.21959;
  D.21961 = D.21960->dominated;
  if (D.21961 != 0B) goto <D.21962>; else goto <D.21963>;
  <D.21962>:
  D.21957 = cfg->bblocks;
  D.21958 = i * 4;
  D.21959 = D.21957 + D.21958;
  D.21960 = *D.21959;
  D.21960->dominated = 0B;
  <D.21963>:
  i = i + 1;
  <D.21603>:
  D.21964 = cfg->num_bblocks;
  if (D.21964 > i) goto <D.21602>; else goto <D.21604>;
  <D.21604>:
  D.21965 = cfg->comp_done;
  D.21966 = D.21965 & 4294967293;
  cfg->comp_done = D.21966;
}


clear_loops (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.21967;
  unsigned int D.21968;
  struct MonoBasicBlock * * D.21969;
  struct MonoBasicBlock * D.21970;
  unsigned int D.21971;
  unsigned int D.21972;
  unsigned int D.21973;
  guint i;

  i = 0;
  goto <D.21610>;
  <D.21609>:
  D.21967 = cfg->bblocks;
  D.21968 = i * 4;
  D.21969 = D.21967 + D.21968;
  D.21970 = *D.21969;
  D.21970->nesting = 0;
  D.21967 = cfg->bblocks;
  D.21968 = i * 4;
  D.21969 = D.21967 + D.21968;
  D.21970 = *D.21969;
  D.21970->loop_blocks = 0B;
  i = i + 1;
  <D.21610>:
  D.21971 = cfg->num_bblocks;
  if (D.21971 > i) goto <D.21609>; else goto <D.21611>;
  <D.21611>:
  D.21972 = cfg->comp_done;
  D.21973 = D.21972 & 4294967039;
  cfg->comp_done = D.21973;
}


