__attribute__((visibility ("hidden")))
mono_compile_iterated_dfrontier (struct MonoCompile * m, struct MonoBitSet * set)
{
  unsigned int D.22295;
  unsigned int D.22296;
  struct MonoMemPool * D.22297;
  unsigned int bitsize.0;
  void * D.22299;
  unsigned int D.22300;
  unsigned int D.22301;
  struct MonoBitSet * D.22302;
  struct MonoBitSet * result;
  int bitsize;
  int count1;
  int count2;

  D.22295 = m->num_bblocks;
  D.22296 = mono_bitset_alloc_size (D.22295, 0);
  bitsize = (int) D.22296;
  D.22297 = m->mempool;
  bitsize.0 = (unsigned int) bitsize;
  D.22299 = mono_mempool_alloc0 (D.22297, bitsize.0);
  D.22295 = m->num_bblocks;
  result = mono_bitset_mem_new (D.22299, D.22295, 0);
  df_set (m, result, set);
  D.22300 = mono_bitset_count (result);
  count2 = (int) D.22300;
  <D.22226>:
  count1 = count2;
  df_set (m, result, result);
  D.22301 = mono_bitset_count (result);
  count2 = (int) D.22301;
  if (count2 > count1) goto <D.22226>; else goto <D.22227>;
  <D.22227>:
  D.22302 = result;
  return D.22302;
}


df_set (struct MonoCompile * m, struct MonoBitSet * dest, struct MonoBitSet * set)
{
  struct MonoBasicBlock * * D.22304;
  long unsigned int D.22305;
  long unsigned int D.22306;
  struct MonoBasicBlock * * D.22307;
  struct MonoBasicBlock * D.22308;
  long unsigned int D.22309;
  long unsigned int D.22310;
  long unsigned int D.22311;
  long unsigned int D.22312;
  long unsigned int D.22313;
  unsigned int D.22314;
  unsigned int i.1;
  int i;

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

    D.22304 = m->bblocks;
    D.22305 = (long unsigned int) i;
    D.22306 = D.22305 * 8;
    D.22307 = D.22304 + D.22306;
    D.22308 = *D.22307;
    tmp_src = D.22308->dfrontier;
    tmp_dest = dest;
    D.22309 = tmp_dest->size;
    D.22310 = D.22309 / 64;
    size = (int) D.22310;
    i = 0;
    goto <D.22213>;
    <D.22212>:
    D.22311 = tmp_dest->data[i];
    D.22312 = tmp_src->data[i];
    D.22313 = D.22311 | D.22312;
    tmp_dest->data[i] = D.22313;
    i = i + 1;
    <D.22213>:
    if (i < size) goto <D.22212>; else goto <D.22214>;
    <D.22214>:
  }
  i = mono_bitset_find_first (set, i);
  <D.22216>:
  D.22314 = m->num_bblocks;
  i.1 = (unsigned int) i;
  if (D.22314 > i.1) goto <D.22316>; else goto <D.22217>;
  <D.22316>:
  if (i >= 0) goto <D.22215>; else goto <D.22217>;
  <D.22217>:
}


__attribute__((visibility ("hidden")))
mono_compile_dominator_info (struct MonoCompile * cfg, int dom_flags)
{
  int D.22317;
  unsigned int D.22320;
  unsigned int D.22321;
  int D.22324;
  unsigned int D.22327;

  D.22317 = dom_flags & 1;
  if (D.22317 != 0) goto <D.22318>; else goto <D.22319>;
  <D.22318>:
  D.22320 = cfg->comp_done;
  D.22321 = D.22320 & 1;
  if (D.22321 == 0) goto <D.22322>; else goto <D.22323>;
  <D.22322>:
  compute_dominators (cfg);
  <D.22323>:
  <D.22319>:
  D.22324 = dom_flags & 4;
  if (D.22324 != 0) goto <D.22325>; else goto <D.22326>;
  <D.22325>:
  D.22320 = cfg->comp_done;
  D.22327 = D.22320 & 4;
  if (D.22327 == 0) goto <D.22328>; else goto <D.22329>;
  <D.22328>:
  compute_dominance_frontier (cfg);
  <D.22329>:
  <D.22326>:
}


compute_dominators (struct MonoCompile * cfg)
{
  unsigned int D.22330;
  unsigned int D.22331;
  _Bool D.22332;
  long int D.22333;
  long int D.22334;
  unsigned int D.22337;
  unsigned int D.22338;
  struct MonoBasicBlock * * D.22339;
  long unsigned int D.22340;
  long unsigned int D.22341;
  int D.22342;
  long unsigned int D.22343;
  long unsigned int D.22344;
  struct MonoBasicBlock * * D.22345;
  long unsigned int D.22346;
  long unsigned int D.22347;
  struct MonoBasicBlock * * D.22348;
  struct MonoBasicBlock * * D.22349;
  long unsigned int D.22350;
  long unsigned int D.22351;
  struct MonoBasicBlock * * D.22352;
  int D.22355;
  long unsigned int D.22356;
  long unsigned int D.22357;
  struct MonoBasicBlock * * D.22358;
  struct MonoBasicBlock * D.22359;
  short int D.22362;
  int D.22363;
  struct MonoBasicBlock * D.22364;
  _Bool D.22367;
  long int D.22368;
  long int D.22369;
  int D.22374;
  long unsigned int D.22376;
  long unsigned int D.22377;
  struct MonoBasicBlock * * D.22378;
  struct MonoBasicBlock * D.22379;
  int D.22382;
  int D.22383;
  long unsigned int D.22386;
  long unsigned int D.22387;
  struct MonoBasicBlock * * D.22388;
  long unsigned int D.22390;
  long unsigned int D.22391;
  struct MonoBasicBlock * * D.22392;
  int D.22393;
  long unsigned int D.22394;
  long unsigned int D.22395;
  struct MonoBasicBlock * * D.22396;
  struct MonoBasicBlock * D.22397;
  unsigned int bindex.2;
  struct MonoBasicBlock * * D.22404;
  struct MonoMemPool * D.22405;
  unsigned int bitsize.3;
  sizetype D.22407;
  int D.22408;
  long unsigned int D.22409;
  long unsigned int D.22410;
  long unsigned int D.22411;
  unsigned int D.22412;
  unsigned int D.22413;
  long unsigned int D.22414;
  long unsigned int D.22415;
  long unsigned int D.22418;
  struct MonoBasicBlock * * D.22419;
  int D.22420;
  long unsigned int D.22421;
  long unsigned int D.22422;
  long unsigned int D.22423;
  unsigned int D.22424;
  unsigned int D.22425;
  long unsigned int D.22426;
  long unsigned int D.22427;
  long unsigned int D.22428;
  struct MonoBasicBlock * * D.22429;
  struct MonoBasicBlock * D.22430;
  struct MonoBasicBlock * D.22431;
  struct GSList * D.22434;
  struct GSList * D.22435;
  long unsigned int D.22436;
  long unsigned int D.22437;
  unsigned int i.4;
  unsigned int D.22439;
  int bindex;
  int i;
  int bitsize;
  struct MonoBasicBlock * entry;
  struct MonoBasicBlock * * doms;
  gboolean changed;

  D.22330 = cfg->comp_done;
  D.22331 = D.22330 & 1;
  D.22332 = D.22331 != 0;
  D.22333 = (long int) D.22332;
  D.22334 = __builtin_expect (D.22333, 0);
  if (D.22334 != 0) goto <D.22335>; else goto <D.22336>;
  <D.22335>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 42, "!(cfg->comp_done & MONO_COMP_DOM)");
  <D.22336>:
  D.22337 = cfg->num_bblocks;
  D.22338 = mono_bitset_alloc_size (D.22337, 0);
  bitsize = (int) D.22338;
  D.22339 = cfg->bblocks;
  entry = *D.22339;
  D.22337 = cfg->num_bblocks;
  D.22340 = (long unsigned int) D.22337;
  D.22341 = D.22340 * 8;
  doms = monoeg_malloc0 (D.22341);
  D.22342 = entry->dfn;
  D.22343 = (long unsigned int) D.22342;
  D.22344 = D.22343 * 8;
  D.22345 = doms + D.22344;
  *D.22345 = entry;
  changed = 1;
  goto <D.22165>;
  <D.22164>:
  changed = 0;
  bindex = 0;
  goto <D.22162>;
  <D.22161>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * idom;

    D.22339 = cfg->bblocks;
    D.22346 = (long unsigned int) bindex;
    D.22347 = D.22346 * 8;
    D.22348 = D.22339 + D.22347;
    bb = *D.22348;
    idom = 0B;
    i = 0;
    goto <D.22151>;
    <D.22150>:
    {
      struct MonoBasicBlock * in_bb;

      D.22349 = bb->in_bb;
      D.22350 = (long unsigned int) i;
      D.22351 = D.22350 * 8;
      D.22352 = D.22349 + D.22351;
      in_bb = *D.22352;
      if (in_bb != bb) goto <D.22353>; else goto <D.22354>;
      <D.22353>:
      D.22355 = in_bb->dfn;
      D.22356 = (long unsigned int) D.22355;
      D.22357 = D.22356 * 8;
      D.22358 = doms + D.22357;
      D.22359 = *D.22358;
      if (D.22359 != 0B) goto <D.22360>; else goto <D.22361>;
      <D.22360>:
      idom = in_bb;
      goto <D.22149>;
      <D.22361>:
      <D.22354>:
    }
    i = i + 1;
    <D.22151>:
    D.22362 = bb->in_count;
    D.22363 = (int) D.22362;
    if (D.22363 > i) goto <D.22150>; else goto <D.22149>;
    <D.22149>:
    D.22339 = cfg->bblocks;
    D.22364 = *D.22339;
    if (D.22364 != bb) goto <D.22365>; else goto <D.22366>;
    <D.22365>:
    D.22367 = idom == 0B;
    D.22368 = (long int) D.22367;
    D.22369 = __builtin_expect (D.22368, 0);
    if (D.22369 != 0) goto <D.22370>; else goto <D.22371>;
    <D.22370>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 79, "idom");
    <D.22371>:
    <D.22366>:
    goto <D.22159>;
    <D.22158>:
    {
      struct MonoBasicBlock * in_bb;

      D.22349 = bb->in_bb;
      D.22350 = (long unsigned int) i;
      D.22351 = D.22350 * 8;
      D.22352 = D.22349 + D.22351;
      in_bb = *D.22352;
      D.22374 = in_bb->dfn;
      if (D.22374 != 0) goto <D.22372>; else goto <D.22375>;
      <D.22375>:
      if (in_bb == entry) goto <D.22372>; else goto <D.22373>;
      <D.22372>:
      D.22374 = in_bb->dfn;
      D.22376 = (long unsigned int) D.22374;
      D.22377 = D.22376 * 8;
      D.22378 = doms + D.22377;
      D.22379 = *D.22378;
      if (D.22379 != 0B) goto <D.22380>; else goto <D.22381>;
      <D.22380>:
      {
        struct MonoBasicBlock * f1;
        struct MonoBasicBlock * f2;

        f1 = idom;
        f2 = in_bb;
        goto <D.22156>;
        <D.22155>:
        D.22382 = f1->dfn;
        D.22383 = f2->dfn;
        if (D.22382 < D.22383) goto <D.22384>; else goto <D.22385>;
        <D.22384>:
        D.22383 = f2->dfn;
        D.22386 = (long unsigned int) D.22383;
        D.22387 = D.22386 * 8;
        D.22388 = doms + D.22387;
        f2 = *D.22388;
        goto <D.22389>;
        <D.22385>:
        D.22382 = f1->dfn;
        D.22390 = (long unsigned int) D.22382;
        D.22391 = D.22390 * 8;
        D.22392 = doms + D.22391;
        f1 = *D.22392;
        <D.22389>:
        <D.22156>:
        if (f1 != f2) goto <D.22155>; else goto <D.22157>;
        <D.22157>:
        idom = f1;
      }
      <D.22381>:
      <D.22373>:
      i = i + 1;
    }
    <D.22159>:
    D.22362 = bb->in_count;
    D.22363 = (int) D.22362;
    if (D.22363 > i) goto <D.22158>; else goto <D.22160>;
    <D.22160>:
    D.22393 = bb->dfn;
    D.22394 = (long unsigned int) D.22393;
    D.22395 = D.22394 * 8;
    D.22396 = doms + D.22395;
    D.22397 = *D.22396;
    if (D.22397 != idom) goto <D.22398>; else goto <D.22399>;
    <D.22398>:
    D.22339 = cfg->bblocks;
    D.22364 = *D.22339;
    if (D.22364 == bb) goto <D.22400>; else goto <D.22401>;
    <D.22400>:
    D.22393 = bb->dfn;
    D.22394 = (long unsigned int) D.22393;
    D.22395 = D.22394 * 8;
    D.22396 = doms + D.22395;
    *D.22396 = bb;
    goto <D.22402>;
    <D.22401>:
    D.22393 = bb->dfn;
    D.22394 = (long unsigned int) D.22393;
    D.22395 = D.22394 * 8;
    D.22396 = doms + D.22395;
    *D.22396 = idom;
    changed = 1;
    <D.22402>:
    <D.22399>:
  }
  bindex = bindex + 1;
  <D.22162>:
  D.22337 = cfg->num_bblocks;
  bindex.2 = (unsigned int) bindex;
  if (D.22337 > bindex.2) goto <D.22161>; else goto <D.22163>;
  <D.22163>:
  <D.22165>:
  if (changed != 0) goto <D.22164>; else goto <D.22166>;
  <D.22166>:
  i = 0;
  goto <D.22175>;
  <D.22174>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * cbb;
    struct MonoBitSet * dominators;
    char * mem;

    D.22339 = cfg->bblocks;
    D.22350 = (long unsigned int) i;
    D.22351 = D.22350 * 8;
    D.22404 = D.22339 + D.22351;
    bb = *D.22404;
    D.22405 = cfg->mempool;
    bitsize.3 = (unsigned int) bitsize;
    mem = mono_mempool_alloc0 (D.22405, bitsize.3);
    D.22337 = cfg->num_bblocks;
    dominators = mono_bitset_mem_new (mem, D.22337, 0);
    bb->dominators = dominators;
    D.22407 = (sizetype) bitsize;
    mem = mem + D.22407;
    D.22408 = bb->dfn;
    D.22409 = (long unsigned int) D.22408;
    D.22410 = D.22409 / 64;
    D.22411 = dominators->data[D.22410];
    D.22408 = bb->dfn;
    D.22412 = (unsigned int) D.22408;
    D.22413 = D.22412 & 63;
    D.22414 = 1 << D.22413;
    D.22415 = D.22411 | D.22414;
    dominators->data[D.22410] = D.22415;
    D.22408 = bb->dfn;
    if (D.22408 != 0) goto <D.22416>; else goto <D.22417>;
    <D.22416>:
    D.22408 = bb->dfn;
    D.22409 = (long unsigned int) D.22408;
    D.22418 = D.22409 * 8;
    D.22419 = doms + D.22418;
    cbb = *D.22419;
    goto <D.22172>;
    <D.22171>:
    D.22420 = cbb->dfn;
    D.22421 = (long unsigned int) D.22420;
    D.22422 = D.22421 / 64;
    D.22423 = dominators->data[D.22422];
    D.22420 = cbb->dfn;
    D.22424 = (unsigned int) D.22420;
    D.22425 = D.22424 & 63;
    D.22426 = 1 << D.22425;
    D.22427 = D.22423 | D.22426;
    dominators->data[D.22422] = D.22427;
    D.22420 = cbb->dfn;
    D.22421 = (long unsigned int) D.22420;
    D.22428 = D.22421 * 8;
    D.22429 = doms + D.22428;
    cbb = *D.22429;
    <D.22172>:
    D.22420 = cbb->dfn;
    if (D.22420 != 0) goto <D.22171>; else goto <D.22173>;
    <D.22173>:
    D.22408 = bb->dfn;
    D.22409 = (long unsigned int) D.22408;
    D.22418 = D.22409 * 8;
    D.22419 = doms + D.22418;
    D.22430 = *D.22419;
    bb->idom = D.22430;
    D.22431 = bb->idom;
    if (D.22431 != 0B) goto <D.22432>; else goto <D.22433>;
    <D.22432>:
    D.22431 = bb->idom;
    D.22405 = cfg->mempool;
    D.22431 = bb->idom;
    D.22434 = D.22431->dominated;
    D.22435 = g_slist_prepend_mempool (D.22405, D.22434, bb);
    D.22431->dominated = D.22435;
    <D.22433>:
    <D.22417>:
    D.22436 = dominators->data[0];
    D.22437 = D.22436 | 1;
    dominators->data[0] = D.22437;
  }
  i = i + 1;
  <D.22175>:
  D.22337 = cfg->num_bblocks;
  i.4 = (unsigned int) i;
  if (D.22337 > i.4) goto <D.22174>; else goto <D.22176>;
  <D.22176>:
  monoeg_g_free (doms);
  D.22330 = cfg->comp_done;
  D.22439 = D.22330 | 3;
  cfg->comp_done = D.22439;
}


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

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


compute_dominance_frontier (struct MonoCompile * cfg)
{
  unsigned int D.22442;
  unsigned int D.22443;
  _Bool D.22444;
  long int D.22445;
  long int D.22446;
  struct MonoBasicBlock * * D.22449;
  long unsigned int D.22450;
  long unsigned int D.22451;
  struct MonoBasicBlock * * D.22452;
  struct MonoBasicBlock * D.22453;
  unsigned int D.22454;
  unsigned int D.22455;
  unsigned int D.22456;
  unsigned int i.5;
  unsigned int D.22458;
  struct MonoMemPool * D.22459;
  unsigned int bitsize.6;
  unsigned int D.22461;
  struct MonoBitSet * D.22462;
  sizetype D.22463;
  short int D.22464;
  struct MonoBasicBlock * * D.22467;
  long unsigned int D.22468;
  long unsigned int D.22469;
  struct MonoBasicBlock * * D.22470;
  int D.22472;
  struct MonoBasicBlock * D.22474;
  struct MonoBitSet * D.22475;
  int D.22476;
  long unsigned int D.22477;
  long unsigned int D.22478;
  long unsigned int D.22479;
  unsigned int D.22480;
  unsigned int D.22481;
  long unsigned int D.22482;
  long unsigned int D.22483;
  struct MonoBasicBlock * D.22484;
  int D.22485;
  unsigned int D.22486;
  char * mem;
  int i;
  int j;
  int bitsize;

  D.22442 = cfg->comp_done;
  D.22443 = D.22442 & 4;
  D.22444 = D.22443 != 0;
  D.22445 = (long int) D.22444;
  D.22446 = __builtin_expect (D.22445, 0);
  if (D.22446 != 0) goto <D.22447>; else goto <D.22448>;
  <D.22447>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 197, "!(cfg->comp_done & MONO_COMP_DFRONTIER)");
  <D.22448>:
  i = 0;
  goto <D.22185>;
  <D.22184>:
  D.22449 = cfg->bblocks;
  D.22450 = (long unsigned int) i;
  D.22451 = D.22450 * 8;
  D.22452 = D.22449 + D.22451;
  D.22453 = *D.22452;
  D.22449 = cfg->bblocks;
  D.22450 = (long unsigned int) i;
  D.22451 = D.22450 * 8;
  D.22452 = D.22449 + D.22451;
  D.22453 = *D.22452;
  D.22454 = D.22453->flags;
  D.22455 = D.22454 & 4294967294;
  D.22453->flags = D.22455;
  i = i + 1;
  <D.22185>:
  D.22456 = cfg->num_bblocks;
  i.5 = (unsigned int) i;
  if (D.22456 > i.5) goto <D.22184>; else goto <D.22186>;
  <D.22186>:
  D.22456 = cfg->num_bblocks;
  D.22458 = mono_bitset_alloc_size (D.22456, 0);
  bitsize = (int) D.22458;
  D.22459 = cfg->mempool;
  D.22456 = cfg->num_bblocks;
  bitsize.6 = (unsigned int) bitsize;
  D.22461 = D.22456 * bitsize.6;
  mem = mono_mempool_alloc0 (D.22459, D.22461);
  i = 0;
  goto <D.22189>;
  <D.22188>:
  {
    struct MonoBasicBlock * bb;

    D.22449 = cfg->bblocks;
    D.22450 = (long unsigned int) i;
    D.22451 = D.22450 * 8;
    D.22452 = D.22449 + D.22451;
    bb = *D.22452;
    D.22456 = cfg->num_bblocks;
    D.22462 = mono_bitset_mem_new (mem, D.22456, 0);
    bb->dfrontier = D.22462;
    D.22463 = (sizetype) bitsize;
    mem = mem + D.22463;
  }
  i = i + 1;
  <D.22189>:
  D.22456 = cfg->num_bblocks;
  i.5 = (unsigned int) i;
  if (D.22456 > i.5) goto <D.22188>; else goto <D.22190>;
  <D.22190>:
  i = 0;
  goto <D.22200>;
  <D.22199>:
  {
    struct MonoBasicBlock * bb;

    D.22449 = cfg->bblocks;
    D.22450 = (long unsigned int) i;
    D.22451 = D.22450 * 8;
    D.22452 = D.22449 + D.22451;
    bb = *D.22452;
    D.22464 = bb->in_count;
    if (D.22464 > 1) goto <D.22465>; else goto <D.22466>;
    <D.22465>:
    j = 0;
    goto <D.22197>;
    <D.22196>:
    {
      struct MonoBasicBlock * p;

      D.22467 = bb->in_bb;
      D.22468 = (long unsigned int) j;
      D.22469 = D.22468 * 8;
      D.22470 = D.22467 + D.22469;
      p = *D.22470;
      D.22472 = p->dfn;
      if (D.22472 != 0) goto <D.22471>; else goto <D.22473>;
      <D.22473>:
      D.22449 = cfg->bblocks;
      D.22474 = *D.22449;
      if (D.22474 == p) goto <D.22471>; else goto <D.22195>;
      <D.22471>:
      goto <D.22194>;
      <D.22193>:
      D.22475 = p->dfrontier;
      D.22476 = bb->dfn;
      D.22477 = (long unsigned int) D.22476;
      D.22478 = D.22477 / 64;
      D.22475 = p->dfrontier;
      D.22479 = D.22475->data[D.22478];
      D.22476 = bb->dfn;
      D.22480 = (unsigned int) D.22476;
      D.22481 = D.22480 & 63;
      D.22482 = 1 << D.22481;
      D.22483 = D.22479 | D.22482;
      D.22475->data[D.22478] = D.22483;
      p = p->idom;
      <D.22194>:
      D.22484 = bb->idom;
      if (D.22484 != p) goto <D.22193>; else goto <D.22195>;
      <D.22195>:
    }
    j = j + 1;
    <D.22197>:
    D.22464 = bb->in_count;
    D.22485 = (int) D.22464;
    if (D.22485 > j) goto <D.22196>; else goto <D.22198>;
    <D.22198>:
    <D.22466>:
  }
  i = i + 1;
  <D.22200>:
  D.22456 = cfg->num_bblocks;
  i.5 = (unsigned int) i;
  if (D.22456 > i.5) goto <D.22199>; else goto <D.22201>;
  <D.22201>:
  D.22442 = cfg->comp_done;
  D.22486 = D.22442 | 4;
  cfg->comp_done = D.22486;
}


__attribute__((visibility ("hidden")))
mono_compute_natural_loops (struct MonoCompile * cfg)
{
  unsigned int D.22487;
  unsigned int D.22488;
  _Bool D.22489;
  long int D.22490;
  long int D.22491;
  unsigned int D.22494;
  unsigned int D.22495;
  struct MonoBasicBlock * * D.22496;
  long unsigned int D.22497;
  long unsigned int D.22498;
  struct MonoBasicBlock * * D.22499;
  struct MonoBasicBlock * * D.22500;
  long unsigned int D.22501;
  long unsigned int D.22502;
  struct MonoBasicBlock * * D.22503;
  struct MonoBitSet * D.22506;
  int D.22507;
  long unsigned int D.22508;
  long unsigned int D.22509;
  long unsigned int D.22510;
  unsigned int D.22511;
  unsigned int D.22512;
  long unsigned int D.22513;
  long unsigned int D.22514;
  struct GList * D.22517;
  struct GList * D.22520;
  int D.22525;
  long unsigned int D.22528;
  long unsigned int D.22529;
  long unsigned int D.22530;
  unsigned int D.22531;
  unsigned int D.22532;
  long unsigned int D.22533;
  long unsigned int D.22534;
  int D.22538;
  long unsigned int D.22540;
  long unsigned int D.22541;
  long unsigned int D.22542;
  unsigned int D.22543;
  unsigned int D.22544;
  long unsigned int D.22545;
  long unsigned int D.22546;
  struct GList * D.22548;
  struct MonoMemPool * D.22549;
  struct GList * D.22550;
  signed char D.22551;
  signed char D.22552;
  unsigned char D.22553;
  unsigned char D.22554;
  signed char D.22555;
  long unsigned int D.22558;
  long unsigned int D.22559;
  long unsigned int D.22560;
  long unsigned int D.22561;
  struct MonoBasicBlock * * D.22562;
  long unsigned int D.22563;
  long unsigned int D.22564;
  struct MonoBasicBlock * * D.22565;
  int D.22571;
  long unsigned int D.22573;
  long unsigned int D.22574;
  long unsigned int D.22575;
  unsigned int D.22576;
  unsigned int D.22577;
  long unsigned int D.22578;
  long unsigned int D.22579;
  struct GList * D.22581;
  short int D.22582;
  int D.22583;
  long unsigned int D.22588;
  long unsigned int D.22589;
  long unsigned int D.22590;
  struct GList * D.22592;
  struct GList * D.22593;
  signed char D.22594;
  signed char D.22595;
  unsigned char D.22596;
  unsigned char D.22597;
  signed char D.22598;
  short int D.22599;
  int D.22600;
  unsigned int i.7;
  unsigned int D.22602;
  long unsigned int D.22603;
  long unsigned int D.22604;
  int D.22605;
  long unsigned int D.22608;
  long unsigned int D.22609;
  int * D.22610;
  struct MonoBasicBlock * D.22611;
  struct GList * D.22612;
  int D.22615;
  long unsigned int D.22618;
  long unsigned int D.22619;
  int * D.22620;
  int D.22621;
  int D.22622;
  long unsigned int D.22623;
  long unsigned int D.22624;
  int * D.22625;
  int D.22626;
  int i;
  int j;
  int k;
  struct MonoBitSet * in_loop_blocks;
  int * bb_indexes;

  D.22487 = cfg->comp_done;
  D.22488 = D.22487 & 256;
  D.22489 = D.22488 != 0;
  D.22490 = (long int) D.22489;
  D.22491 = __builtin_expect (D.22490, 0);
  if (D.22491 != 0) goto <D.22492>; else goto <D.22493>;
  <D.22492>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dominators.c", 311, "!(cfg->comp_done & MONO_COMP_LOOPS)");
  <D.22493>:
  D.22494 = cfg->num_bblocks;
  D.22495 = D.22494 + 1;
  in_loop_blocks = mono_bitset_new (D.22495, 0);
  i = 0;
  goto <D.22261>;
  <D.22260>:
  {
    struct MonoBasicBlock * n;

    D.22496 = cfg->bblocks;
    D.22497 = (long unsigned int) i;
    D.22498 = D.22497 * 8;
    D.22499 = D.22496 + D.22498;
    n = *D.22499;
    j = 0;
    goto <D.22258>;
    <D.22257>:
    {
      struct MonoBasicBlock * h;

      D.22500 = n->out_bb;
      D.22501 = (long unsigned int) j;
      D.22502 = D.22501 * 8;
      D.22503 = D.22500 + D.22502;
      h = *D.22503;
      if (n != h) goto <D.22504>; else goto <D.22505>;
      <D.22504>:
      D.22506 = n->dominators;
      D.22507 = h->dfn;
      D.22508 = (long unsigned int) D.22507;
      D.22509 = D.22508 / 64;
      D.22510 = D.22506->data[D.22509];
      D.22507 = h->dfn;
      D.22511 = (unsigned int) D.22507;
      D.22512 = D.22511 & 63;
      D.22513 = D.22510 >> D.22512;
      D.22514 = D.22513 & 1;
      if (D.22514 != 0) goto <D.22515>; else goto <D.22516>;
      <D.22515>:
      {
        struct GSList * todo;

        D.22517 = h->loop_blocks;
        if (D.22517 != 0B) goto <D.22518>; else goto <D.22519>;
        <D.22518>:
        D.22517 = h->loop_blocks;
        D.22520 = monoeg_g_list_find (D.22517, n);
        if (D.22520 != 0B) goto <D.22521>; else goto <D.22522>;
        <D.22521>:
        // predicted unlikely by continue predictor.
        goto <D.22243>;
        <D.22522>:
        <D.22519>:
        mono_bitset_clear_all (in_loop_blocks);
        D.22517 = h->loop_blocks;
        if (D.22517 != 0B) goto <D.22523>; else goto <D.22524>;
        <D.22523>:
        {
          struct GList * l;

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

            b = l->data;
            D.22525 = b->dfn;
            if (D.22525 != 0) goto <D.22526>; else goto <D.22527>;
            <D.22526>:
            D.22525 = b->dfn;
            D.22528 = (long unsigned int) D.22525;
            D.22529 = D.22528 / 64;
            D.22530 = in_loop_blocks->data[D.22529];
            D.22525 = b->dfn;
            D.22531 = (unsigned int) D.22525;
            D.22532 = D.22531 & 63;
            D.22533 = 1 << D.22532;
            D.22534 = D.22530 | D.22533;
            in_loop_blocks->data[D.22529] = D.22534;
            <D.22527>:
          }
          l = l->next;
          <D.22247>:
          if (l != 0B) goto <D.22246>; else goto <D.22248>;
          <D.22248>:
        }
        <D.22524>:
        todo = monoeg_g_slist_prepend (0B, n);
        goto <D.22250>;
        <D.22255>:
        {
          struct MonoBasicBlock * cb;

          cb = todo->data;
          todo = monoeg_g_slist_delete_link (todo, todo);
          D.22538 = cb->dfn;
          if (D.22538 != 0) goto <D.22539>; else goto <D.22535>;
          <D.22539>:
          D.22538 = cb->dfn;
          D.22540 = (long unsigned int) D.22538;
          D.22541 = D.22540 / 64;
          D.22542 = in_loop_blocks->data[D.22541];
          D.22538 = cb->dfn;
          D.22543 = (unsigned int) D.22538;
          D.22544 = D.22543 & 63;
          D.22545 = D.22542 >> D.22544;
          D.22546 = D.22545 & 1;
          if (D.22546 != 0) goto <D.22536>; else goto <D.22535>;
          <D.22535>:
          D.22538 = cb->dfn;
          if (D.22538 == 0) goto <D.22547>; else goto <D.22537>;
          <D.22547>:
          D.22517 = h->loop_blocks;
          D.22548 = monoeg_g_list_find (D.22517, cb);
          if (D.22548 != 0B) goto <D.22536>; else goto <D.22537>;
          <D.22536>:
          // predicted unlikely by continue predictor.
          goto <D.22250>;
          <D.22537>:
          D.22549 = cfg->mempool;
          D.22517 = h->loop_blocks;
          D.22550 = g_list_prepend_mempool (D.22549, D.22517, cb);
          h->loop_blocks = D.22550;
          D.22551 = cb->nesting;
          D.22552 = D.22551;
          D.22553 = (unsigned char) D.22552;
          D.22554 = D.22553 + 1;
          D.22555 = (signed char) D.22554;
          cb->nesting = D.22555;
          D.22538 = cb->dfn;
          if (D.22538 != 0) goto <D.22556>; else goto <D.22557>;
          <D.22556>:
          D.22538 = cb->dfn;
          D.22540 = (long unsigned int) D.22538;
          D.22558 = D.22540 / 64;
          D.22559 = in_loop_blocks->data[D.22558];
          D.22538 = cb->dfn;
          D.22543 = (unsigned int) D.22538;
          D.22544 = D.22543 & 63;
          D.22560 = 1 << D.22544;
          D.22561 = D.22559 | D.22560;
          in_loop_blocks->data[D.22558] = D.22561;
          <D.22557>:
          k = 0;
          goto <D.22253>;
          <D.22252>:
          {
            struct MonoBasicBlock * prev;

            D.22562 = cb->in_bb;
            D.22563 = (long unsigned int) k;
            D.22564 = D.22563 * 8;
            D.22565 = D.22562 + D.22564;
            prev = *D.22565;
            if (prev != h) goto <D.22569>; else goto <D.22570>;
            <D.22569>:
            D.22571 = prev->dfn;
            if (D.22571 == 0) goto <D.22568>; else goto <D.22572>;
            <D.22572>:
            D.22571 = prev->dfn;
            D.22573 = (long unsigned int) D.22571;
            D.22574 = D.22573 / 64;
            D.22575 = in_loop_blocks->data[D.22574];
            D.22571 = prev->dfn;
            D.22576 = (unsigned int) D.22571;
            D.22577 = D.22576 & 63;
            D.22578 = D.22575 >> D.22577;
            D.22579 = D.22578 & 1;
            if (D.22579 == 0) goto <D.22568>; else goto <D.22567>;
            <D.22568>:
            D.22571 = prev->dfn;
            if (D.22571 != 0) goto <D.22566>; else goto <D.22580>;
            <D.22580>:
            D.22517 = h->loop_blocks;
            D.22581 = monoeg_g_list_find (D.22517, prev);
            if (D.22581 == 0B) goto <D.22566>; else goto <D.22567>;
            <D.22566>:
            todo = monoeg_g_slist_prepend (todo, prev);
            <D.22567>:
            <D.22570>:
          }
          k = k + 1;
          <D.22253>:
          D.22582 = cb->in_count;
          D.22583 = (int) D.22582;
          if (D.22583 > k) goto <D.22252>; else goto <D.22254>;
          <D.22254>:
        }
        <D.22250>:
        if (todo != 0B) goto <D.22255>; else goto <D.22256>;
        <D.22256>:
        D.22507 = h->dfn;
        if (D.22507 == 0) goto <D.22586>; else goto <D.22587>;
        <D.22587>:
        D.22507 = h->dfn;
        D.22508 = (long unsigned int) D.22507;
        D.22509 = D.22508 / 64;
        D.22588 = in_loop_blocks->data[D.22509];
        D.22507 = h->dfn;
        D.22511 = (unsigned int) D.22507;
        D.22512 = D.22511 & 63;
        D.22589 = D.22588 >> D.22512;
        D.22590 = D.22589 & 1;
        if (D.22590 == 0) goto <D.22586>; else goto <D.22585>;
        <D.22586>:
        D.22507 = h->dfn;
        if (D.22507 != 0) goto <D.22584>; else goto <D.22591>;
        <D.22591>:
        D.22517 = h->loop_blocks;
        D.22592 = monoeg_g_list_find (D.22517, h);
        if (D.22592 == 0B) goto <D.22584>; else goto <D.22585>;
        <D.22584>:
        D.22549 = cfg->mempool;
        D.22517 = h->loop_blocks;
        D.22593 = g_list_prepend_mempool (D.22549, D.22517, h);
        h->loop_blocks = D.22593;
        D.22594 = h->nesting;
        D.22595 = D.22594;
        D.22596 = (unsigned char) D.22595;
        D.22597 = D.22596 + 1;
        D.22598 = (signed char) D.22597;
        h->nesting = D.22598;
        <D.22585>:
      }
      <D.22516>:
      <D.22505>:
    }
    <D.22243>:
    j = j + 1;
    <D.22258>:
    D.22599 = n->out_count;
    D.22600 = (int) D.22599;
    if (D.22600 > j) goto <D.22257>; else goto <D.22259>;
    <D.22259>:
  }
  i = i + 1;
  <D.22261>:
  D.22494 = cfg->num_bblocks;
  i.7 = (unsigned int) i;
  if (D.22494 > i.7) goto <D.22260>; else goto <D.22262>;
  <D.22262>:
  mono_bitset_free (in_loop_blocks);
  D.22487 = cfg->comp_done;
  D.22602 = D.22487 | 256;
  cfg->comp_done = D.22602;
  D.22494 = cfg->num_bblocks;
  D.22603 = (long unsigned int) D.22494;
  D.22604 = D.22603 * 4;
  bb_indexes = monoeg_malloc0 (D.22604);
  {
    struct MonoBasicBlock * bb;

    i = 0;
    bb = cfg->bb_entry;
    goto <D.22265>;
    <D.22264>:
    D.22605 = bb->dfn;
    if (D.22605 != 0) goto <D.22606>; else goto <D.22607>;
    <D.22606>:
    D.22605 = bb->dfn;
    D.22608 = (long unsigned int) D.22605;
    D.22609 = D.22608 * 4;
    D.22610 = bb_indexes + D.22609;
    *D.22610 = i;
    <D.22607>:
    i = i + 1;
    bb = bb->next_bb;
    <D.22265>:
    if (bb != 0B) goto <D.22264>; else goto <D.22266>;
    <D.22266>:
  }
  i = 0;
  goto <D.22275>;
  <D.22274>:
  D.22496 = cfg->bblocks;
  D.22497 = (long unsigned int) i;
  D.22498 = D.22497 * 8;
  D.22499 = D.22496 + D.22498;
  D.22611 = *D.22499;
  D.22612 = D.22611->loop_blocks;
  if (D.22612 != 0B) goto <D.22613>; else goto <D.22614>;
  <D.22613>:
  {
    struct MonoBasicBlock * h;
    struct MonoBasicBlock * body_start;
    struct GList * l;

    D.22496 = cfg->bblocks;
    D.22497 = (long unsigned int) i;
    D.22498 = D.22497 * 8;
    D.22499 = D.22496 + D.22498;
    h = *D.22499;
    body_start = h;
    l = h->loop_blocks;
    goto <D.22272>;
    <D.22271>:
    {
      struct MonoBasicBlock * cb;

      cb = l->data;
      D.22615 = cb->dfn;
      if (D.22615 != 0) goto <D.22616>; else goto <D.22617>;
      <D.22616>:
      D.22615 = cb->dfn;
      D.22618 = (long unsigned int) D.22615;
      D.22619 = D.22618 * 4;
      D.22620 = bb_indexes + D.22619;
      D.22621 = *D.22620;
      D.22622 = body_start->dfn;
      D.22623 = (long unsigned int) D.22622;
      D.22624 = D.22623 * 4;
      D.22625 = bb_indexes + D.22624;
      D.22626 = *D.22625;
      if (D.22621 < D.22626) goto <D.22627>; else goto <D.22628>;
      <D.22627>:
      body_start = cb;
      <D.22628>:
      <D.22617>:
    }
    l = l->next;
    <D.22272>:
    if (l != 0B) goto <D.22271>; else goto <D.22273>;
    <D.22273>:
    body_start->loop_body_start = 1;
  }
  <D.22614>:
  i = i + 1;
  <D.22275>:
  D.22494 = cfg->num_bblocks;
  i.7 = (unsigned int) i;
  if (D.22494 > i.7) goto <D.22274>; else goto <D.22276>;
  <D.22276>:
  monoeg_g_free (bb_indexes);
}


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

  new_list = mono_mempool_alloc (mp, 24);
  new_list->data = data;
  if (list != 0B) goto <D.22630>; else goto <D.22631>;
  <D.22630>:
  iftmp.8 = list->prev;
  goto <D.22632>;
  <D.22631>:
  iftmp.8 = 0B;
  <D.22632>:
  new_list->prev = iftmp.8;
  new_list->next = list;
  D.22633 = new_list->prev;
  if (D.22633 != 0B) goto <D.22634>; else goto <D.22635>;
  <D.22634>:
  D.22633 = new_list->prev;
  D.22633->next = new_list;
  <D.22635>:
  if (list != 0B) goto <D.22636>; else goto <D.22637>;
  <D.22636>:
  list->prev = new_list;
  <D.22637>:
  D.22638 = new_list;
  return D.22638;
}


__attribute__((visibility ("hidden")))
mono_free_loop_info (struct MonoCompile * cfg)
{
  unsigned int D.22640;
  unsigned int D.22641;
  unsigned int D.22644;

  D.22640 = cfg->comp_done;
  D.22641 = D.22640 & 2;
  if (D.22641 != 0) goto <D.22642>; else goto <D.22643>;
  <D.22642>:
  clear_idominators (cfg);
  <D.22643>:
  D.22640 = cfg->comp_done;
  D.22644 = D.22640 & 256;
  if (D.22644 != 0) goto <D.22645>; else goto <D.22646>;
  <D.22645>:
  clear_loops (cfg);
  <D.22646>:
}


clear_idominators (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22647;
  long unsigned int D.22648;
  long unsigned int D.22649;
  struct MonoBasicBlock * * D.22650;
  struct MonoBasicBlock * D.22651;
  struct GSList * D.22652;
  unsigned int D.22655;
  unsigned int D.22656;
  unsigned int D.22657;
  guint i;

  i = 0;
  goto <D.22282>;
  <D.22281>:
  D.22647 = cfg->bblocks;
  D.22648 = (long unsigned int) i;
  D.22649 = D.22648 * 8;
  D.22650 = D.22647 + D.22649;
  D.22651 = *D.22650;
  D.22652 = D.22651->dominated;
  if (D.22652 != 0B) goto <D.22653>; else goto <D.22654>;
  <D.22653>:
  D.22647 = cfg->bblocks;
  D.22648 = (long unsigned int) i;
  D.22649 = D.22648 * 8;
  D.22650 = D.22647 + D.22649;
  D.22651 = *D.22650;
  D.22651->dominated = 0B;
  <D.22654>:
  i = i + 1;
  <D.22282>:
  D.22655 = cfg->num_bblocks;
  if (D.22655 > i) goto <D.22281>; else goto <D.22283>;
  <D.22283>:
  D.22656 = cfg->comp_done;
  D.22657 = D.22656 & 4294967293;
  cfg->comp_done = D.22657;
}


clear_loops (struct MonoCompile * cfg)
{
  struct MonoBasicBlock * * D.22658;
  long unsigned int D.22659;
  long unsigned int D.22660;
  struct MonoBasicBlock * * D.22661;
  struct MonoBasicBlock * D.22662;
  unsigned int D.22663;
  unsigned int D.22664;
  unsigned int D.22665;
  guint i;

  i = 0;
  goto <D.22289>;
  <D.22288>:
  D.22658 = cfg->bblocks;
  D.22659 = (long unsigned int) i;
  D.22660 = D.22659 * 8;
  D.22661 = D.22658 + D.22660;
  D.22662 = *D.22661;
  D.22662->nesting = 0;
  D.22658 = cfg->bblocks;
  D.22659 = (long unsigned int) i;
  D.22660 = D.22659 * 8;
  D.22661 = D.22658 + D.22660;
  D.22662 = *D.22661;
  D.22662->loop_blocks = 0B;
  i = i + 1;
  <D.22289>:
  D.22663 = cfg->num_bblocks;
  if (D.22663 > i) goto <D.22288>; else goto <D.22290>;
  <D.22290>:
  D.22664 = cfg->comp_done;
  D.22665 = D.22664 & 4294967039;
  cfg->comp_done = D.22665;
}


