mono_compile_iterated_dfrontier (struct MonoCompile * m, struct MonoBitSet * set)
{
  unsigned int D.21937;
  unsigned int D.21938;
  unsigned int bitsize.0;
  struct MonoMemPool * D.21940;
  void * D.21941;
  unsigned int D.21942;
  unsigned int D.21943;
  struct MonoBitSet * D.21944;
  struct MonoBitSet * result;
  int bitsize;
  int count1;
  int count2;

  D.21937 = m->num_bblocks;
  D.21938 = mono_bitset_alloc_size (D.21937, 0);
  bitsize = (int) D.21938;
  D.21937 = m->num_bblocks;
  bitsize.0 = (unsigned int) bitsize;
  D.21940 = m->mempool;
  D.21941 = mono_mempool_alloc0 (D.21940, bitsize.0);
  result = mono_bitset_mem_new (D.21941, D.21937, 0);
  df_set (m, result, set);
  D.21942 = mono_bitset_count (result);
  count2 = (int) D.21942;
  <D.21868>:
  count1 = count2;
  df_set (m, result, result);
  D.21943 = mono_bitset_count (result);
  count2 = (int) D.21943;
  if (count2 > count1) goto <D.21868>; else goto <D.21869>;
  <D.21869>:
  D.21944 = result;
  return D.21944;
}


df_set (struct MonoCompile * m, struct MonoBitSet * dest, struct MonoBitSet * set)
{
  struct MonoBasicBlock * * D.21946;
  unsigned int i.1;
  unsigned int D.21948;
  struct MonoBasicBlock * * D.21949;
  struct MonoBasicBlock * D.21950;
  unsigned int D.21951;
  unsigned int D.21952;
  unsigned int D.21953;
  unsigned int D.21954;
  unsigned int D.21955;
  unsigned int i.2;
  unsigned int D.21957;
  int i;

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

    D.21946 = m->bblocks;
    i.1 = (unsigned int) i;
    D.21948 = i.1 * 4;
    D.21949 = D.21946 + D.21948;
    D.21950 = *D.21949;
    tmp_src = D.21950->dfrontier;
    tmp_dest = dest;
    D.21951 = tmp_dest->size;
    D.21952 = D.21951 / 32;
    size = (int) D.21952;
    i = 0;
    goto <D.21855>;
    <D.21854>:
    D.21953 = tmp_dest->data[i];
    D.21954 = tmp_src->data[i];
    D.21955 = D.21953 | D.21954;
    tmp_dest->data[i] = D.21955;
    i = i + 1;
    <D.21855>:
    if (i < size) goto <D.21854>; else goto <D.21856>;
    <D.21856>:
  }
  i = mono_bitset_find_first (set, i);
  <D.21858>:
  i.2 = (unsigned int) i;
  D.21957 = m->num_bblocks;
  if (i.2 < D.21957) goto <D.21958>; else goto <D.21859>;
  <D.21958>:
  if (i >= 0) goto <D.21857>; else goto <D.21859>;
  <D.21859>:
}


mono_compile_dominator_info (struct MonoCompile * cfg, int dom_flags)
{
  int D.21959;
  unsigned int D.21962;
  unsigned int D.21963;
  int D.21966;
  unsigned int D.21969;

  D.21959 = dom_flags & 1;
  if (D.21959 != 0) goto <D.21960>; else goto <D.21961>;
  <D.21960>:
  D.21962 = cfg->comp_done;
  D.21963 = D.21962 & 1;
  if (D.21963 == 0) goto <D.21964>; else goto <D.21965>;
  <D.21964>:
  compute_dominators (cfg);
  <D.21965>:
  <D.21961>:
  D.21966 = dom_flags & 4;
  if (D.21966 != 0) goto <D.21967>; else goto <D.21968>;
  <D.21967>:
  D.21962 = cfg->comp_done;
  D.21969 = D.21962 & 4;
  if (D.21969 == 0) goto <D.21970>; else goto <D.21971>;
  <D.21970>:
  compute_dominance_frontier (cfg);
  <D.21971>:
  <D.21968>:
}


compute_dominators (struct MonoCompile * cfg)
{
  unsigned int D.21972;
  unsigned int D.21973;
  _Bool D.21974;
  long int D.21975;
  long int D.21976;
  unsigned int D.21979;
  unsigned int D.21980;
  struct MonoBasicBlock * * D.21981;
  unsigned int D.21982;
  int D.21983;
  unsigned int D.21984;
  unsigned int D.21985;
  struct MonoBasicBlock * * D.21986;
  unsigned int bindex.3;
  unsigned int D.21988;
  struct MonoBasicBlock * * D.21989;
  struct MonoBasicBlock * * D.21990;
  unsigned int i.4;
  unsigned int D.21992;
  struct MonoBasicBlock * * D.21993;
  int D.21996;
  unsigned int D.21997;
  unsigned int D.21998;
  struct MonoBasicBlock * * D.21999;
  struct MonoBasicBlock * D.22000;
  short int D.22003;
  int D.22004;
  struct MonoBasicBlock * D.22005;
  _Bool D.22008;
  long int D.22009;
  long int D.22010;
  int D.22015;
  unsigned int D.22017;
  unsigned int D.22018;
  struct MonoBasicBlock * * D.22019;
  struct MonoBasicBlock * D.22020;
  int D.22023;
  int D.22024;
  unsigned int D.22027;
  unsigned int D.22028;
  struct MonoBasicBlock * * D.22029;
  unsigned int D.22031;
  unsigned int D.22032;
  struct MonoBasicBlock * * D.22033;
  int D.22034;
  unsigned int D.22035;
  unsigned int D.22036;
  struct MonoBasicBlock * * D.22037;
  struct MonoBasicBlock * D.22038;
  unsigned int bindex.5;
  struct MonoBasicBlock * * D.22045;
  unsigned int bitsize.6;
  struct MonoMemPool * D.22047;
  sizetype bitsize.7;
  int D.22049;
  unsigned int D.22050;
  unsigned int D.22051;
  unsigned int D.22052;
  int D.22053;
  unsigned int D.22054;
  unsigned int D.22055;
  unsigned int D.22058;
  struct MonoBasicBlock * * D.22059;
  int D.22060;
  unsigned int D.22061;
  unsigned int D.22062;
  unsigned int D.22063;
  int D.22064;
  unsigned int D.22065;
  unsigned int D.22066;
  unsigned int D.22067;
  struct MonoBasicBlock * * D.22068;
  struct MonoBasicBlock * D.22069;
  struct MonoBasicBlock * D.22070;
  struct GSList * D.22073;
  struct GSList * D.22074;
  unsigned int D.22075;
  unsigned int D.22076;
  unsigned int i.8;
  unsigned int D.22078;
  int bindex;
  int i;
  int bitsize;
  struct MonoBasicBlock * entry;
  struct MonoBasicBlock * * doms;
  gboolean changed;

  D.21972 = cfg->comp_done;
  D.21973 = D.21972 & 1;
  D.21974 = D.21973 != 0;
  D.21975 = (long int) D.21974;
  D.21976 = __builtin_expect (D.21975, 0);
  if (D.21976 != 0) goto <D.21977>; else goto <D.21978>;
  <D.21977>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 42, "!(cfg->comp_done & MONO_COMP_DOM)");
  <D.21978>:
  D.21979 = cfg->num_bblocks;
  D.21980 = mono_bitset_alloc_size (D.21979, 0);
  bitsize = (int) D.21980;
  D.21981 = cfg->bblocks;
  entry = *D.21981;
  D.21979 = cfg->num_bblocks;
  D.21982 = D.21979 * 4;
  doms = monoeg_malloc0 (D.21982);
  D.21983 = entry->dfn;
  D.21984 = (unsigned int) D.21983;
  D.21985 = D.21984 * 4;
  D.21986 = doms + D.21985;
  *D.21986 = entry;
  changed = 1;
  goto <D.21807>;
  <D.21806>:
  changed = 0;
  bindex = 0;
  goto <D.21804>;
  <D.21803>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * idom;

    D.21981 = cfg->bblocks;
    bindex.3 = (unsigned int) bindex;
    D.21988 = bindex.3 * 4;
    D.21989 = D.21981 + D.21988;
    bb = *D.21989;
    idom = 0B;
    i = 0;
    goto <D.21793>;
    <D.21792>:
    {
      struct MonoBasicBlock * in_bb;

      D.21990 = bb->in_bb;
      i.4 = (unsigned int) i;
      D.21992 = i.4 * 4;
      D.21993 = D.21990 + D.21992;
      in_bb = *D.21993;
      if (in_bb != bb) goto <D.21994>; else goto <D.21995>;
      <D.21994>:
      D.21996 = in_bb->dfn;
      D.21997 = (unsigned int) D.21996;
      D.21998 = D.21997 * 4;
      D.21999 = doms + D.21998;
      D.22000 = *D.21999;
      if (D.22000 != 0B) goto <D.22001>; else goto <D.22002>;
      <D.22001>:
      idom = in_bb;
      goto <D.21791>;
      <D.22002>:
      <D.21995>:
    }
    i = i + 1;
    <D.21793>:
    D.22003 = bb->in_count;
    D.22004 = (int) D.22003;
    if (D.22004 > i) goto <D.21792>; else goto <D.21791>;
    <D.21791>:
    D.21981 = cfg->bblocks;
    D.22005 = *D.21981;
    if (D.22005 != bb) goto <D.22006>; else goto <D.22007>;
    <D.22006>:
    D.22008 = idom == 0B;
    D.22009 = (long int) D.22008;
    D.22010 = __builtin_expect (D.22009, 0);
    if (D.22010 != 0) goto <D.22011>; else goto <D.22012>;
    <D.22011>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 79, "idom");
    <D.22012>:
    <D.22007>:
    goto <D.21801>;
    <D.21800>:
    {
      struct MonoBasicBlock * in_bb;

      D.21990 = bb->in_bb;
      i.4 = (unsigned int) i;
      D.21992 = i.4 * 4;
      D.21993 = D.21990 + D.21992;
      in_bb = *D.21993;
      D.22015 = in_bb->dfn;
      if (D.22015 != 0) goto <D.22013>; else goto <D.22016>;
      <D.22016>:
      if (in_bb == entry) goto <D.22013>; else goto <D.22014>;
      <D.22013>:
      D.22015 = in_bb->dfn;
      D.22017 = (unsigned int) D.22015;
      D.22018 = D.22017 * 4;
      D.22019 = doms + D.22018;
      D.22020 = *D.22019;
      if (D.22020 != 0B) goto <D.22021>; else goto <D.22022>;
      <D.22021>:
      {
        struct MonoBasicBlock * f1;
        struct MonoBasicBlock * f2;

        f1 = idom;
        f2 = in_bb;
        goto <D.21798>;
        <D.21797>:
        D.22023 = f1->dfn;
        D.22024 = f2->dfn;
        if (D.22023 < D.22024) goto <D.22025>; else goto <D.22026>;
        <D.22025>:
        D.22024 = f2->dfn;
        D.22027 = (unsigned int) D.22024;
        D.22028 = D.22027 * 4;
        D.22029 = doms + D.22028;
        f2 = *D.22029;
        goto <D.22030>;
        <D.22026>:
        D.22023 = f1->dfn;
        D.22031 = (unsigned int) D.22023;
        D.22032 = D.22031 * 4;
        D.22033 = doms + D.22032;
        f1 = *D.22033;
        <D.22030>:
        <D.21798>:
        if (f1 != f2) goto <D.21797>; else goto <D.21799>;
        <D.21799>:
        idom = f1;
      }
      <D.22022>:
      <D.22014>:
      i = i + 1;
    }
    <D.21801>:
    D.22003 = bb->in_count;
    D.22004 = (int) D.22003;
    if (D.22004 > i) goto <D.21800>; else goto <D.21802>;
    <D.21802>:
    D.22034 = bb->dfn;
    D.22035 = (unsigned int) D.22034;
    D.22036 = D.22035 * 4;
    D.22037 = doms + D.22036;
    D.22038 = *D.22037;
    if (D.22038 != idom) goto <D.22039>; else goto <D.22040>;
    <D.22039>:
    D.21981 = cfg->bblocks;
    D.22005 = *D.21981;
    if (D.22005 == bb) goto <D.22041>; else goto <D.22042>;
    <D.22041>:
    D.22034 = bb->dfn;
    D.22035 = (unsigned int) D.22034;
    D.22036 = D.22035 * 4;
    D.22037 = doms + D.22036;
    *D.22037 = bb;
    goto <D.22043>;
    <D.22042>:
    D.22034 = bb->dfn;
    D.22035 = (unsigned int) D.22034;
    D.22036 = D.22035 * 4;
    D.22037 = doms + D.22036;
    *D.22037 = idom;
    changed = 1;
    <D.22043>:
    <D.22040>:
  }
  bindex = bindex + 1;
  <D.21804>:
  bindex.5 = (unsigned int) bindex;
  D.21979 = cfg->num_bblocks;
  if (bindex.5 < D.21979) goto <D.21803>; else goto <D.21805>;
  <D.21805>:
  <D.21807>:
  if (changed != 0) goto <D.21806>; else goto <D.21808>;
  <D.21808>:
  i = 0;
  goto <D.21817>;
  <D.21816>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * cbb;
    struct MonoBitSet * dominators;
    char * mem;

    D.21981 = cfg->bblocks;
    i.4 = (unsigned int) i;
    D.21992 = i.4 * 4;
    D.22045 = D.21981 + D.21992;
    bb = *D.22045;
    bitsize.6 = (unsigned int) bitsize;
    D.22047 = cfg->mempool;
    mem = mono_mempool_alloc0 (D.22047, bitsize.6);
    D.21979 = cfg->num_bblocks;
    dominators = mono_bitset_mem_new (mem, D.21979, 0);
    bb->dominators = dominators;
    bitsize.7 = (sizetype) bitsize;
    mem = mem + bitsize.7;
    D.22049 = bb->dfn;
    D.22050 = (unsigned int) D.22049;
    D.22051 = D.22050 / 32;
    D.22052 = dominators->data[D.22051];
    D.22049 = bb->dfn;
    D.22053 = D.22049 & 31;
    D.22054 = 1 << D.22053;
    D.22055 = D.22052 | D.22054;
    dominators->data[D.22051] = D.22055;
    D.22049 = bb->dfn;
    if (D.22049 != 0) goto <D.22056>; else goto <D.22057>;
    <D.22056>:
    D.22049 = bb->dfn;
    D.22050 = (unsigned int) D.22049;
    D.22058 = D.22050 * 4;
    D.22059 = doms + D.22058;
    cbb = *D.22059;
    goto <D.21814>;
    <D.21813>:
    D.22060 = cbb->dfn;
    D.22061 = (unsigned int) D.22060;
    D.22062 = D.22061 / 32;
    D.22063 = dominators->data[D.22062];
    D.22060 = cbb->dfn;
    D.22064 = D.22060 & 31;
    D.22065 = 1 << D.22064;
    D.22066 = D.22063 | D.22065;
    dominators->data[D.22062] = D.22066;
    D.22060 = cbb->dfn;
    D.22061 = (unsigned int) D.22060;
    D.22067 = D.22061 * 4;
    D.22068 = doms + D.22067;
    cbb = *D.22068;
    <D.21814>:
    D.22060 = cbb->dfn;
    if (D.22060 != 0) goto <D.21813>; else goto <D.21815>;
    <D.21815>:
    D.22049 = bb->dfn;
    D.22050 = (unsigned int) D.22049;
    D.22058 = D.22050 * 4;
    D.22059 = doms + D.22058;
    D.22069 = *D.22059;
    bb->idom = D.22069;
    D.22070 = bb->idom;
    if (D.22070 != 0B) goto <D.22071>; else goto <D.22072>;
    <D.22071>:
    D.22070 = bb->idom;
    D.22070 = bb->idom;
    D.22073 = D.22070->dominated;
    D.22047 = cfg->mempool;
    D.22074 = g_slist_prepend_mempool (D.22047, D.22073, bb);
    D.22070->dominated = D.22074;
    <D.22072>:
    <D.22057>:
    D.22075 = dominators->data[0];
    D.22076 = D.22075 | 1;
    dominators->data[0] = D.22076;
  }
  i = i + 1;
  <D.21817>:
  i.8 = (unsigned int) i;
  D.21979 = cfg->num_bblocks;
  if (i.8 < D.21979) goto <D.21816>; else goto <D.21818>;
  <D.21818>:
  monoeg_g_free (doms);
  D.21972 = cfg->comp_done;
  D.22078 = D.21972 | 3;
  cfg->comp_done = D.22078;
}


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

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


compute_dominance_frontier (struct MonoCompile * cfg)
{
  unsigned int D.22081;
  unsigned int D.22082;
  _Bool D.22083;
  long int D.22084;
  long int D.22085;
  struct MonoBasicBlock * * D.22088;
  unsigned int i.9;
  unsigned int D.22090;
  struct MonoBasicBlock * * D.22091;
  struct MonoBasicBlock * D.22092;
  unsigned int D.22093;
  unsigned int D.22094;
  unsigned int i.10;
  unsigned int D.22096;
  unsigned int D.22097;
  unsigned int bitsize.11;
  unsigned int D.22099;
  struct MonoMemPool * D.22100;
  struct MonoBitSet * D.22101;
  sizetype bitsize.12;
  short int D.22103;
  struct MonoBasicBlock * * D.22106;
  unsigned int j.13;
  unsigned int D.22108;
  struct MonoBasicBlock * * D.22109;
  int D.22111;
  struct MonoBasicBlock * D.22113;
  struct MonoBitSet * D.22114;
  int D.22115;
  unsigned int D.22116;
  unsigned int D.22117;
  unsigned int D.22118;
  int D.22119;
  unsigned int D.22120;
  unsigned int D.22121;
  struct MonoBasicBlock * D.22122;
  int D.22123;
  unsigned int D.22124;
  char * mem;
  int i;
  int j;
  int bitsize;

  D.22081 = cfg->comp_done;
  D.22082 = D.22081 & 4;
  D.22083 = D.22082 != 0;
  D.22084 = (long int) D.22083;
  D.22085 = __builtin_expect (D.22084, 0);
  if (D.22085 != 0) goto <D.22086>; else goto <D.22087>;
  <D.22086>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 197, "!(cfg->comp_done & MONO_COMP_DFRONTIER)");
  <D.22087>:
  i = 0;
  goto <D.21827>;
  <D.21826>:
  D.22088 = cfg->bblocks;
  i.9 = (unsigned int) i;
  D.22090 = i.9 * 4;
  D.22091 = D.22088 + D.22090;
  D.22092 = *D.22091;
  D.22088 = cfg->bblocks;
  i.9 = (unsigned int) i;
  D.22090 = i.9 * 4;
  D.22091 = D.22088 + D.22090;
  D.22092 = *D.22091;
  D.22093 = D.22092->flags;
  D.22094 = D.22093 & 4294967294;
  D.22092->flags = D.22094;
  i = i + 1;
  <D.21827>:
  i.10 = (unsigned int) i;
  D.22096 = cfg->num_bblocks;
  if (i.10 < D.22096) goto <D.21826>; else goto <D.21828>;
  <D.21828>:
  D.22096 = cfg->num_bblocks;
  D.22097 = mono_bitset_alloc_size (D.22096, 0);
  bitsize = (int) D.22097;
  D.22096 = cfg->num_bblocks;
  bitsize.11 = (unsigned int) bitsize;
  D.22099 = D.22096 * bitsize.11;
  D.22100 = cfg->mempool;
  mem = mono_mempool_alloc0 (D.22100, D.22099);
  i = 0;
  goto <D.21831>;
  <D.21830>:
  {
    struct MonoBasicBlock * bb;

    D.22088 = cfg->bblocks;
    i.9 = (unsigned int) i;
    D.22090 = i.9 * 4;
    D.22091 = D.22088 + D.22090;
    bb = *D.22091;
    D.22096 = cfg->num_bblocks;
    D.22101 = mono_bitset_mem_new (mem, D.22096, 0);
    bb->dfrontier = D.22101;
    bitsize.12 = (sizetype) bitsize;
    mem = mem + bitsize.12;
  }
  i = i + 1;
  <D.21831>:
  i.10 = (unsigned int) i;
  D.22096 = cfg->num_bblocks;
  if (i.10 < D.22096) goto <D.21830>; else goto <D.21832>;
  <D.21832>:
  i = 0;
  goto <D.21842>;
  <D.21841>:
  {
    struct MonoBasicBlock * bb;

    D.22088 = cfg->bblocks;
    i.9 = (unsigned int) i;
    D.22090 = i.9 * 4;
    D.22091 = D.22088 + D.22090;
    bb = *D.22091;
    D.22103 = bb->in_count;
    if (D.22103 > 1) goto <D.22104>; else goto <D.22105>;
    <D.22104>:
    j = 0;
    goto <D.21839>;
    <D.21838>:
    {
      struct MonoBasicBlock * p;

      D.22106 = bb->in_bb;
      j.13 = (unsigned int) j;
      D.22108 = j.13 * 4;
      D.22109 = D.22106 + D.22108;
      p = *D.22109;
      D.22111 = p->dfn;
      if (D.22111 != 0) goto <D.22110>; else goto <D.22112>;
      <D.22112>:
      D.22088 = cfg->bblocks;
      D.22113 = *D.22088;
      if (D.22113 == p) goto <D.22110>; else goto <D.21837>;
      <D.22110>:
      goto <D.21836>;
      <D.21835>:
      D.22114 = p->dfrontier;
      D.22115 = bb->dfn;
      D.22116 = (unsigned int) D.22115;
      D.22117 = D.22116 / 32;
      D.22114 = p->dfrontier;
      D.22118 = D.22114->data[D.22117];
      D.22115 = bb->dfn;
      D.22119 = D.22115 & 31;
      D.22120 = 1 << D.22119;
      D.22121 = D.22118 | D.22120;
      D.22114->data[D.22117] = D.22121;
      p = p->idom;
      <D.21836>:
      D.22122 = bb->idom;
      if (D.22122 != p) goto <D.21835>; else goto <D.21837>;
      <D.21837>:
    }
    j = j + 1;
    <D.21839>:
    D.22103 = bb->in_count;
    D.22123 = (int) D.22103;
    if (D.22123 > j) goto <D.21838>; else goto <D.21840>;
    <D.21840>:
    <D.22105>:
  }
  i = i + 1;
  <D.21842>:
  i.10 = (unsigned int) i;
  D.22096 = cfg->num_bblocks;
  if (i.10 < D.22096) goto <D.21841>; else goto <D.21843>;
  <D.21843>:
  D.22081 = cfg->comp_done;
  D.22124 = D.22081 | 4;
  cfg->comp_done = D.22124;
}


mono_compute_natural_loops (struct MonoCompile * cfg)
{
  unsigned int D.22125;
  unsigned int D.22126;
  _Bool D.22127;
  long int D.22128;
  long int D.22129;
  unsigned int D.22132;
  unsigned int D.22133;
  struct MonoBasicBlock * * D.22134;
  unsigned int i.14;
  unsigned int D.22136;
  struct MonoBasicBlock * * D.22137;
  struct MonoBasicBlock * * D.22138;
  unsigned int j.15;
  unsigned int D.22140;
  struct MonoBasicBlock * * D.22141;
  struct MonoBitSet * D.22144;
  int D.22145;
  unsigned int D.22146;
  unsigned int D.22147;
  unsigned int D.22148;
  int D.22149;
  unsigned int D.22150;
  unsigned int D.22151;
  struct GList * D.22154;
  struct GList * D.22157;
  int D.22162;
  unsigned int D.22165;
  unsigned int D.22166;
  unsigned int D.22167;
  int D.22168;
  unsigned int D.22169;
  unsigned int D.22170;
  int D.22174;
  unsigned int D.22176;
  unsigned int D.22177;
  unsigned int D.22178;
  int D.22179;
  unsigned int D.22180;
  unsigned int D.22181;
  struct GList * D.22183;
  struct MonoMemPool * D.22184;
  struct GList * D.22185;
  signed char D.22186;
  signed char D.22187;
  unsigned char D.22188;
  unsigned char D.22189;
  signed char D.22190;
  unsigned int D.22193;
  unsigned int D.22194;
  unsigned int D.22195;
  struct MonoBasicBlock * * D.22196;
  unsigned int k.16;
  unsigned int D.22198;
  struct MonoBasicBlock * * D.22199;
  int D.22205;
  unsigned int D.22207;
  unsigned int D.22208;
  unsigned int D.22209;
  int D.22210;
  unsigned int D.22211;
  unsigned int D.22212;
  struct GList * D.22214;
  short int D.22215;
  int D.22216;
  unsigned int D.22221;
  unsigned int D.22222;
  struct GList * D.22224;
  struct GList * D.22225;
  signed char D.22226;
  signed char D.22227;
  unsigned char D.22228;
  unsigned char D.22229;
  signed char D.22230;
  short int D.22231;
  int D.22232;
  unsigned int i.17;
  unsigned int D.22234;
  unsigned int D.22235;
  int D.22236;
  unsigned int D.22239;
  unsigned int D.22240;
  int * D.22241;
  struct MonoBasicBlock * D.22242;
  struct GList * D.22243;
  int D.22246;
  unsigned int D.22249;
  unsigned int D.22250;
  int * D.22251;
  int D.22252;
  int D.22253;
  unsigned int D.22254;
  unsigned int D.22255;
  int * D.22256;
  int D.22257;
  int i;
  int j;
  int k;
  struct MonoBitSet * in_loop_blocks;
  int * bb_indexes;

  D.22125 = cfg->comp_done;
  D.22126 = D.22125 & 256;
  D.22127 = D.22126 != 0;
  D.22128 = (long int) D.22127;
  D.22129 = __builtin_expect (D.22128, 0);
  if (D.22129 != 0) goto <D.22130>; else goto <D.22131>;
  <D.22130>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 311, "!(cfg->comp_done & MONO_COMP_LOOPS)");
  <D.22131>:
  D.22132 = cfg->num_bblocks;
  D.22133 = D.22132 + 1;
  in_loop_blocks = mono_bitset_new (D.22133, 0);
  i = 0;
  goto <D.21903>;
  <D.21902>:
  {
    struct MonoBasicBlock * n;

    D.22134 = cfg->bblocks;
    i.14 = (unsigned int) i;
    D.22136 = i.14 * 4;
    D.22137 = D.22134 + D.22136;
    n = *D.22137;
    j = 0;
    goto <D.21900>;
    <D.21899>:
    {
      struct MonoBasicBlock * h;

      D.22138 = n->out_bb;
      j.15 = (unsigned int) j;
      D.22140 = j.15 * 4;
      D.22141 = D.22138 + D.22140;
      h = *D.22141;
      if (n != h) goto <D.22142>; else goto <D.22143>;
      <D.22142>:
      D.22144 = n->dominators;
      D.22145 = h->dfn;
      D.22146 = (unsigned int) D.22145;
      D.22147 = D.22146 / 32;
      D.22148 = D.22144->data[D.22147];
      D.22145 = h->dfn;
      D.22149 = D.22145 & 31;
      D.22150 = 1 << D.22149;
      D.22151 = D.22148 & D.22150;
      if (D.22151 != 0) goto <D.22152>; else goto <D.22153>;
      <D.22152>:
      {
        struct GSList * todo;

        D.22154 = h->loop_blocks;
        if (D.22154 != 0B) goto <D.22155>; else goto <D.22156>;
        <D.22155>:
        D.22154 = h->loop_blocks;
        D.22157 = monoeg_g_list_find (D.22154, n);
        if (D.22157 != 0B) goto <D.22158>; else goto <D.22159>;
        <D.22158>:
        // predicted unlikely by continue predictor.
        goto <D.21885>;
        <D.22159>:
        <D.22156>:
        mono_bitset_clear_all (in_loop_blocks);
        D.22154 = h->loop_blocks;
        if (D.22154 != 0B) goto <D.22160>; else goto <D.22161>;
        <D.22160>:
        {
          struct GList * l;

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

            b = l->data;
            D.22162 = b->dfn;
            if (D.22162 != 0) goto <D.22163>; else goto <D.22164>;
            <D.22163>:
            D.22162 = b->dfn;
            D.22165 = (unsigned int) D.22162;
            D.22166 = D.22165 / 32;
            D.22167 = in_loop_blocks->data[D.22166];
            D.22162 = b->dfn;
            D.22168 = D.22162 & 31;
            D.22169 = 1 << D.22168;
            D.22170 = D.22167 | D.22169;
            in_loop_blocks->data[D.22166] = D.22170;
            <D.22164>:
          }
          l = l->next;
          <D.21889>:
          if (l != 0B) goto <D.21888>; else goto <D.21890>;
          <D.21890>:
        }
        <D.22161>:
        todo = monoeg_g_slist_prepend (0B, n);
        goto <D.21892>;
        <D.21897>:
        {
          struct MonoBasicBlock * cb;

          cb = todo->data;
          todo = monoeg_g_slist_delete_link (todo, todo);
          D.22174 = cb->dfn;
          if (D.22174 != 0) goto <D.22175>; else goto <D.22171>;
          <D.22175>:
          D.22174 = cb->dfn;
          D.22176 = (unsigned int) D.22174;
          D.22177 = D.22176 / 32;
          D.22178 = in_loop_blocks->data[D.22177];
          D.22174 = cb->dfn;
          D.22179 = D.22174 & 31;
          D.22180 = 1 << D.22179;
          D.22181 = D.22178 & D.22180;
          if (D.22181 != 0) goto <D.22172>; else goto <D.22171>;
          <D.22171>:
          D.22174 = cb->dfn;
          if (D.22174 == 0) goto <D.22182>; else goto <D.22173>;
          <D.22182>:
          D.22154 = h->loop_blocks;
          D.22183 = monoeg_g_list_find (D.22154, cb);
          if (D.22183 != 0B) goto <D.22172>; else goto <D.22173>;
          <D.22172>:
          // predicted unlikely by continue predictor.
          goto <D.21892>;
          <D.22173>:
          D.22154 = h->loop_blocks;
          D.22184 = cfg->mempool;
          D.22185 = g_list_prepend_mempool (D.22184, D.22154, cb);
          h->loop_blocks = D.22185;
          D.22186 = cb->nesting;
          D.22187 = D.22186;
          D.22188 = (unsigned char) D.22187;
          D.22189 = D.22188 + 1;
          D.22190 = (signed char) D.22189;
          cb->nesting = D.22190;
          D.22174 = cb->dfn;
          if (D.22174 != 0) goto <D.22191>; else goto <D.22192>;
          <D.22191>:
          D.22174 = cb->dfn;
          D.22176 = (unsigned int) D.22174;
          D.22193 = D.22176 / 32;
          D.22194 = in_loop_blocks->data[D.22193];
          D.22174 = cb->dfn;
          D.22179 = D.22174 & 31;
          D.22180 = 1 << D.22179;
          D.22195 = D.22194 | D.22180;
          in_loop_blocks->data[D.22193] = D.22195;
          <D.22192>:
          k = 0;
          goto <D.21895>;
          <D.21894>:
          {
            struct MonoBasicBlock * prev;

            D.22196 = cb->in_bb;
            k.16 = (unsigned int) k;
            D.22198 = k.16 * 4;
            D.22199 = D.22196 + D.22198;
            prev = *D.22199;
            if (prev != h) goto <D.22203>; else goto <D.22204>;
            <D.22203>:
            D.22205 = prev->dfn;
            if (D.22205 == 0) goto <D.22202>; else goto <D.22206>;
            <D.22206>:
            D.22205 = prev->dfn;
            D.22207 = (unsigned int) D.22205;
            D.22208 = D.22207 / 32;
            D.22209 = in_loop_blocks->data[D.22208];
            D.22205 = prev->dfn;
            D.22210 = D.22205 & 31;
            D.22211 = 1 << D.22210;
            D.22212 = D.22209 & D.22211;
            if (D.22212 == 0) goto <D.22202>; else goto <D.22201>;
            <D.22202>:
            D.22205 = prev->dfn;
            if (D.22205 != 0) goto <D.22200>; else goto <D.22213>;
            <D.22213>:
            D.22154 = h->loop_blocks;
            D.22214 = monoeg_g_list_find (D.22154, prev);
            if (D.22214 == 0B) goto <D.22200>; else goto <D.22201>;
            <D.22200>:
            todo = monoeg_g_slist_prepend (todo, prev);
            <D.22201>:
            <D.22204>:
          }
          k = k + 1;
          <D.21895>:
          D.22215 = cb->in_count;
          D.22216 = (int) D.22215;
          if (D.22216 > k) goto <D.21894>; else goto <D.21896>;
          <D.21896>:
        }
        <D.21892>:
        if (todo != 0B) goto <D.21897>; else goto <D.21898>;
        <D.21898>:
        D.22145 = h->dfn;
        if (D.22145 == 0) goto <D.22219>; else goto <D.22220>;
        <D.22220>:
        D.22145 = h->dfn;
        D.22146 = (unsigned int) D.22145;
        D.22147 = D.22146 / 32;
        D.22221 = in_loop_blocks->data[D.22147];
        D.22145 = h->dfn;
        D.22149 = D.22145 & 31;
        D.22150 = 1 << D.22149;
        D.22222 = D.22221 & D.22150;
        if (D.22222 == 0) goto <D.22219>; else goto <D.22218>;
        <D.22219>:
        D.22145 = h->dfn;
        if (D.22145 != 0) goto <D.22217>; else goto <D.22223>;
        <D.22223>:
        D.22154 = h->loop_blocks;
        D.22224 = monoeg_g_list_find (D.22154, h);
        if (D.22224 == 0B) goto <D.22217>; else goto <D.22218>;
        <D.22217>:
        D.22154 = h->loop_blocks;
        D.22184 = cfg->mempool;
        D.22225 = g_list_prepend_mempool (D.22184, D.22154, h);
        h->loop_blocks = D.22225;
        D.22226 = h->nesting;
        D.22227 = D.22226;
        D.22228 = (unsigned char) D.22227;
        D.22229 = D.22228 + 1;
        D.22230 = (signed char) D.22229;
        h->nesting = D.22230;
        <D.22218>:
      }
      <D.22153>:
      <D.22143>:
    }
    <D.21885>:
    j = j + 1;
    <D.21900>:
    D.22231 = n->out_count;
    D.22232 = (int) D.22231;
    if (D.22232 > j) goto <D.21899>; else goto <D.21901>;
    <D.21901>:
  }
  i = i + 1;
  <D.21903>:
  i.17 = (unsigned int) i;
  D.22132 = cfg->num_bblocks;
  if (i.17 < D.22132) goto <D.21902>; else goto <D.21904>;
  <D.21904>:
  mono_bitset_free (in_loop_blocks);
  D.22125 = cfg->comp_done;
  D.22234 = D.22125 | 256;
  cfg->comp_done = D.22234;
  D.22132 = cfg->num_bblocks;
  D.22235 = D.22132 * 4;
  bb_indexes = monoeg_malloc0 (D.22235);
  {
    struct MonoBasicBlock * bb;

    i = 0;
    bb = cfg->bb_entry;
    goto <D.21907>;
    <D.21906>:
    D.22236 = bb->dfn;
    if (D.22236 != 0) goto <D.22237>; else goto <D.22238>;
    <D.22237>:
    D.22236 = bb->dfn;
    D.22239 = (unsigned int) D.22236;
    D.22240 = D.22239 * 4;
    D.22241 = bb_indexes + D.22240;
    *D.22241 = i;
    <D.22238>:
    i = i + 1;
    bb = bb->next_bb;
    <D.21907>:
    if (bb != 0B) goto <D.21906>; else goto <D.21908>;
    <D.21908>:
  }
  i = 0;
  goto <D.21917>;
  <D.21916>:
  D.22134 = cfg->bblocks;
  i.14 = (unsigned int) i;
  D.22136 = i.14 * 4;
  D.22137 = D.22134 + D.22136;
  D.22242 = *D.22137;
  D.22243 = D.22242->loop_blocks;
  if (D.22243 != 0B) goto <D.22244>; else goto <D.22245>;
  <D.22244>:
  {
    struct MonoBasicBlock * h;
    struct MonoBasicBlock * body_start;
    struct GList * l;

    D.22134 = cfg->bblocks;
    i.14 = (unsigned int) i;
    D.22136 = i.14 * 4;
    D.22137 = D.22134 + D.22136;
    h = *D.22137;
    body_start = h;
    l = h->loop_blocks;
    goto <D.21914>;
    <D.21913>:
    {
      struct MonoBasicBlock * cb;

      cb = l->data;
      D.22246 = cb->dfn;
      if (D.22246 != 0) goto <D.22247>; else goto <D.22248>;
      <D.22247>:
      D.22246 = cb->dfn;
      D.22249 = (unsigned int) D.22246;
      D.22250 = D.22249 * 4;
      D.22251 = bb_indexes + D.22250;
      D.22252 = *D.22251;
      D.22253 = body_start->dfn;
      D.22254 = (unsigned int) D.22253;
      D.22255 = D.22254 * 4;
      D.22256 = bb_indexes + D.22255;
      D.22257 = *D.22256;
      if (D.22252 < D.22257) goto <D.22258>; else goto <D.22259>;
      <D.22258>:
      body_start = cb;
      <D.22259>:
      <D.22248>:
    }
    l = l->next;
    <D.21914>:
    if (l != 0B) goto <D.21913>; else goto <D.21915>;
    <D.21915>:
    body_start->loop_body_start = 1;
  }
  <D.22245>:
  i = i + 1;
  <D.21917>:
  i.17 = (unsigned int) i;
  D.22132 = cfg->num_bblocks;
  if (i.17 < D.22132) goto <D.21916>; else goto <D.21918>;
  <D.21918>:
  monoeg_g_free (bb_indexes);
}


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

  new_list = mono_mempool_alloc (mp, 12);
  new_list->data = data;
  if (list != 0B) goto <D.22261>; else goto <D.22262>;
  <D.22261>:
  iftmp.18 = list->prev;
  goto <D.22263>;
  <D.22262>:
  iftmp.18 = 0B;
  <D.22263>:
  new_list->prev = iftmp.18;
  new_list->next = list;
  D.22264 = new_list->prev;
  if (D.22264 != 0B) goto <D.22265>; else goto <D.22266>;
  <D.22265>:
  D.22264 = new_list->prev;
  D.22264->next = new_list;
  <D.22266>:
  if (list != 0B) goto <D.22267>; else goto <D.22268>;
  <D.22267>:
  list->prev = new_list;
  <D.22268>:
  D.22269 = new_list;
  return D.22269;
}


mono_free_loop_info (struct MonoCompile * cfg)
{
  unsigned int D.22271;
  unsigned int D.22272;
  unsigned int D.22275;

  D.22271 = cfg->comp_done;
  D.22272 = D.22271 & 2;
  if (D.22272 != 0) goto <D.22273>; else goto <D.22274>;
  <D.22273>:
  clear_idominators (cfg);
  <D.22274>:
  D.22271 = cfg->comp_done;
  D.22275 = D.22271 & 256;
  if (D.22275 != 0) goto <D.22276>; else goto <D.22277>;
  <D.22276>:
  clear_loops (cfg);
  <D.22277>:
}


clear_idominators (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22278;
  unsigned int D.22279;
  struct MonoBasicBlock * * D.22280;
  struct MonoBasicBlock * D.22281;
  struct GSList * D.22282;
  unsigned int D.22285;
  unsigned int D.22286;
  unsigned int D.22287;
  guint i;

  i = 0;
  goto <D.21924>;
  <D.21923>:
  D.22278 = cfg->bblocks;
  D.22279 = i * 4;
  D.22280 = D.22278 + D.22279;
  D.22281 = *D.22280;
  D.22282 = D.22281->dominated;
  if (D.22282 != 0B) goto <D.22283>; else goto <D.22284>;
  <D.22283>:
  D.22278 = cfg->bblocks;
  D.22279 = i * 4;
  D.22280 = D.22278 + D.22279;
  D.22281 = *D.22280;
  D.22281->dominated = 0B;
  <D.22284>:
  i = i + 1;
  <D.21924>:
  D.22285 = cfg->num_bblocks;
  if (D.22285 > i) goto <D.21923>; else goto <D.21925>;
  <D.21925>:
  D.22286 = cfg->comp_done;
  D.22287 = D.22286 & 4294967293;
  cfg->comp_done = D.22287;
}


clear_loops (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22288;
  unsigned int D.22289;
  struct MonoBasicBlock * * D.22290;
  struct MonoBasicBlock * D.22291;
  unsigned int D.22292;
  unsigned int D.22293;
  unsigned int D.22294;
  guint i;

  i = 0;
  goto <D.21931>;
  <D.21930>:
  D.22288 = cfg->bblocks;
  D.22289 = i * 4;
  D.22290 = D.22288 + D.22289;
  D.22291 = *D.22290;
  D.22291->nesting = 0;
  D.22288 = cfg->bblocks;
  D.22289 = i * 4;
  D.22290 = D.22288 + D.22289;
  D.22291 = *D.22290;
  D.22291->loop_blocks = 0B;
  i = i + 1;
  <D.21931>:
  D.22292 = cfg->num_bblocks;
  if (D.22292 > i) goto <D.21930>; else goto <D.21932>;
  <D.21932>:
  D.22293 = cfg->comp_done;
  D.22294 = D.22293 & 4294967039;
  cfg->comp_done = D.22294;
}


