mono_local_alias_analysis (struct MonoCompile * cfg)
{
  long unsigned int D.22442;
  long unsigned int D.22443;
  unsigned int D.22446;
  int D.22449;
  unsigned int D.22451;
  unsigned int D.22452;
  int D.22455;
  void done = <<< error >>>;

  D.22442 = BIT_FIELD_REF <*cfg, 64, 5632>;
  D.22443 = D.22442 & 1024;
  if (D.22443 == 0) goto <D.22444>; else goto <D.22445>;
  <D.22444>:
  return;
  <D.22445>:
  D.22446 = cfg->verbose_level;
  if (D.22446 > 2) goto <D.22447>; else goto <D.22448>;
  <D.22447>:
  mono_print_code (cfg, "BEFORE ALIAS_ANALYSIS");
  <D.22448>:
  D.22449 = lower_memory_access (cfg);
  if (D.22449 == 0) goto done; else goto <D.22450>;
  <D.22450>:
  D.22451 = cfg->opt;
  D.22452 = D.22451 & 64;
  if (D.22452 != 0) goto <D.22453>; else goto <D.22454>;
  <D.22453>:
  mono_local_deadce (cfg);
  <D.22454>:
  D.22455 = recompute_aliased_variables (cfg);
  if (D.22455 == 0) goto done; else goto <D.22456>;
  <D.22456>:
  mono_handle_global_vregs (cfg);
  D.22451 = cfg->opt;
  D.22452 = D.22451 & 64;
  if (D.22452 != 0) goto <D.22457>; else goto <D.22458>;
  <D.22457>:
  mono_local_deadce (cfg);
  <D.22458>:
  done:
  D.22446 = cfg->verbose_level;
  if (D.22446 > 2) goto <D.22459>; else goto <D.22460>;
  <D.22459>:
  mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
  <D.22460>:
}


lower_memory_access (struct MonoCompile * cfg)
{
  short unsigned int D.22462;
  int D.22463;
  int D.22464;
  long int D.22465;
  void * D.22466;
  unsigned int D.22467;
  int D.22470;
  long int D.22471;
  const void * D.22472;
  const void * D.22478;
  int D.22479;
  long int D.22484;
  int D.22491;
  int D.22498;
  int D.22505;
  gboolean D.22507;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  struct MonoInst * tmp;
  gboolean needs_dce;
  struct GHashTable * addr_loads;

  needs_dce = 0;
  addr_loads = monoeg_g_hash_table_new (0B, 0B);
  bb = cfg->bb_entry;
  goto <D.22416>;
  <D.22415>:
  monoeg_g_hash_table_remove_all (addr_loads);
  ins = bb->code;
  goto <D.22413>;
  <D.22412>:
  D.22462 = ins->opcode;
  D.22463 = (int) D.22462;
  switch (D.22463) <default: <D.22506>, case 314: <D.22386>, case 374: <D.22401>, case 375: <D.22402>, case 376: <D.22403>, case 377: <D.22404>, case 378: <D.22405>, case 379: <D.22406>, case 380: <D.22407>, case 381: <D.22409>, case 384: <D.22410>, case 385: <D.22411>, case 387: <D.22408>, case 388: <D.22390>, case 389: <D.22396>, case 390: <D.22391>, case 391: <D.22392>, case 392: <D.22393>, case 393: <D.22394>, case 394: <D.22395>, case 395: <D.22397>, case 396: <D.22398>, case 397: <D.22399>, case 399: <D.22389>, case 424: <D.22388>>
  <D.22386>:
  D.22464 = ins->dreg;
  D.22465 = (long int) D.22464;
  D.22466 = (void *) D.22465;
  monoeg_g_hash_table_insert_replace (addr_loads, D.22466, ins, 0);
  D.22467 = cfg->verbose_level;
  if (D.22467 > 2) goto <D.22468>; else goto <D.22469>;
  <D.22468>:
  printf ("New address: ");
  mono_print_ins (ins);
  <D.22469>:
  goto <D.22387>;
  <D.22388>:
  D.22470 = ins->sreg1;
  D.22471 = (long int) D.22470;
  D.22472 = (const void *) D.22471;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22472);
  if (tmp != 0B) goto <D.22473>; else goto <D.22474>;
  <D.22473>:
  D.22464 = ins->dreg;
  D.22465 = (long int) D.22464;
  D.22466 = (void *) D.22465;
  monoeg_g_hash_table_insert_replace (addr_loads, D.22466, tmp, 0);
  D.22467 = cfg->verbose_level;
  if (D.22467 > 2) goto <D.22475>; else goto <D.22476>;
  <D.22475>:
  printf ("New alias: ");
  mono_print_ins (ins);
  <D.22476>:
  goto <D.22477>;
  <D.22474>:
  D.22464 = ins->dreg;
  D.22465 = (long int) D.22464;
  D.22478 = (const void *) D.22465;
  D.22479 = monoeg_g_hash_table_remove (addr_loads, D.22478);
  if (D.22479 != 0) goto <D.22480>; else goto <D.22481>;
  <D.22480>:
  D.22467 = cfg->verbose_level;
  if (D.22467 > 2) goto <D.22482>; else goto <D.22483>;
  <D.22482>:
  printf ("Killed alias: ");
  mono_print_ins (ins);
  <D.22483>:
  <D.22481>:
  <D.22477>:
  goto <D.22387>;
  <D.22389>:
  <D.22390>:
  <D.22391>:
  <D.22392>:
  <D.22393>:
  <D.22394>:
  <D.22395>:
  <D.22396>:
  <D.22397>:
  <D.22398>:
  <D.22399>:
  D.22484 = ins->data.op[0].const_val;
  if (D.22484 != 0) goto <D.22485>; else goto <D.22486>;
  <D.22485>:
  // predicted unlikely by continue predictor.
  goto <D.22400>;
  <D.22486>:
  D.22470 = ins->sreg1;
  D.22471 = (long int) D.22470;
  D.22472 = (const void *) D.22471;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22472);
  if (tmp != 0B) goto <D.22487>; else goto <D.22488>;
  <D.22487>:
  D.22467 = cfg->verbose_level;
  if (D.22467 > 2) goto <D.22489>; else goto <D.22490>;
  <D.22489>:
  printf ("Found candidate load:");
  mono_print_ins (ins);
  <D.22490>:
  D.22491 = lower_load (cfg, ins, tmp);
  needs_dce = D.22491 | needs_dce;
  <D.22488>:
  goto <D.22387>;
  <D.22401>:
  <D.22402>:
  <D.22403>:
  <D.22404>:
  <D.22405>:
  <D.22406>:
  <D.22407>:
  <D.22408>:
  D.22484 = ins->data.op[0].const_val;
  if (D.22484 != 0) goto <D.22492>; else goto <D.22493>;
  <D.22492>:
  // predicted unlikely by continue predictor.
  goto <D.22400>;
  <D.22493>:
  D.22464 = ins->dreg;
  D.22465 = (long int) D.22464;
  D.22478 = (const void *) D.22465;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22478);
  if (tmp != 0B) goto <D.22494>; else goto <D.22495>;
  <D.22494>:
  D.22467 = cfg->verbose_level;
  if (D.22467 > 2) goto <D.22496>; else goto <D.22497>;
  <D.22496>:
  printf ("Found candidate store:");
  mono_print_ins (ins);
  <D.22497>:
  D.22498 = lower_store (cfg, ins, tmp);
  needs_dce = D.22498 | needs_dce;
  <D.22495>:
  goto <D.22387>;
  <D.22409>:
  <D.22410>:
  <D.22411>:
  D.22484 = ins->data.op[0].const_val;
  if (D.22484 != 0) goto <D.22499>; else goto <D.22500>;
  <D.22499>:
  // predicted unlikely by continue predictor.
  goto <D.22400>;
  <D.22500>:
  D.22464 = ins->dreg;
  D.22465 = (long int) D.22464;
  D.22478 = (const void *) D.22465;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22478);
  if (tmp != 0B) goto <D.22501>; else goto <D.22502>;
  <D.22501>:
  D.22467 = cfg->verbose_level;
  if (D.22467 > 2) goto <D.22503>; else goto <D.22504>;
  <D.22503>:
  printf ("Found candidate store-imm:");
  mono_print_ins (ins);
  <D.22504>:
  D.22505 = lower_store_imm (cfg, ins, tmp);
  needs_dce = D.22505 | needs_dce;
  <D.22502>:
  goto <D.22387>;
  <D.22506>:
  <D.22387>:
  <D.22400>:
  ins = ins->next;
  <D.22413>:
  if (ins != 0B) goto <D.22412>; else goto <D.22414>;
  <D.22414>:
  bb = bb->next_bb;
  <D.22416>:
  if (bb != 0B) goto <D.22415>; else goto <D.22417>;
  <D.22417>:
  monoeg_g_hash_table_destroy (addr_loads);
  D.22507 = needs_dce;
  return D.22507;
}


lower_load (struct MonoCompile * cfg, struct MonoInst * load, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22509;
  unsigned int D.22510;
  short unsigned int D.22511;
  struct MonoClass * D.22514;
  unsigned int D.22517;
  const char * D.22520;
  const char * D.22521;
  gboolean D.22522;
  int D.22523;
  const char * D.22528;
  const char * D.22529;
  unsigned int D.22532;
  short unsigned int D.22533;
  int D.22534;
  int D.22535;
  int D.22536;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22509 = var->klass;
  type = &D.22509->byval_arg;
  D.22510 = mono_type_to_load_membase (cfg, type);
  replaced_op = (int) D.22510;
  D.22511 = load->opcode;
  if (D.22511 == 399) goto <D.22512>; else goto <D.22513>;
  <D.22512>:
  D.22514 = load->klass;
  D.22509 = var->klass;
  if (D.22514 != D.22509) goto <D.22515>; else goto <D.22516>;
  <D.22515>:
  D.22517 = cfg->verbose_level;
  if (D.22517 > 2) goto <D.22518>; else goto <D.22519>;
  <D.22518>:
  D.22514 = load->klass;
  D.22520 = D.22514->name;
  D.22509 = var->klass;
  D.22521 = D.22509->name;
  printf ("Incompatible load_vtype classes %s x %s\n", D.22520, D.22521);
  <D.22519>:
  D.22522 = 0;
  return D.22522;
  <D.22516>:
  <D.22513>:
  D.22511 = load->opcode;
  D.22523 = (int) D.22511;
  if (D.22523 != replaced_op) goto <D.22524>; else goto <D.22525>;
  <D.22524>:
  D.22517 = cfg->verbose_level;
  if (D.22517 > 2) goto <D.22526>; else goto <D.22527>;
  <D.22526>:
  D.22528 = mono_inst_name (replaced_op);
  D.22511 = load->opcode;
  D.22523 = (int) D.22511;
  D.22529 = mono_inst_name (D.22523);
  printf ("Incompatible load type: expected %s but got %s\n", D.22528, D.22529);
  <D.22527>:
  D.22522 = 0;
  return D.22522;
  <D.22525>:
  D.22517 = cfg->verbose_level;
  if (D.22517 > 2) goto <D.22530>; else goto <D.22531>;
  <D.22530>:
  printf ("mem2reg replacing: ");
  mono_print_ins (load);
  <D.22531>:
  D.22532 = mono_type_to_regmove (cfg, type);
  D.22533 = (short unsigned int) D.22532;
  load->opcode = D.22533;
  type_to_eval_stack_type (cfg, type, load);
  D.22534 = var->dreg;
  load->sreg1 = D.22534;
  D.22535 = mono_jit_stats.loads_eliminated;
  D.22536 = D.22535 + 1;
  mono_jit_stats.loads_eliminated = D.22536;
  D.22522 = 1;
  return D.22522;
}


lower_store (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22538;
  unsigned int D.22539;
  short unsigned int D.22540;
  struct MonoClass * D.22543;
  unsigned int D.22546;
  const char * D.22549;
  gboolean D.22550;
  int D.22551;
  const char * D.22556;
  const char * D.22557;
  unsigned int D.22560;
  short unsigned int D.22561;
  int D.22562;
  int D.22563;
  int D.22564;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22538 = var->klass;
  type = &D.22538->byval_arg;
  D.22539 = mono_type_to_store_membase (cfg, type);
  replaced_op = (int) D.22539;
  D.22540 = store->opcode;
  if (D.22540 == 387) goto <D.22541>; else goto <D.22542>;
  <D.22541>:
  D.22543 = store->klass;
  D.22538 = var->klass;
  if (D.22543 != D.22538) goto <D.22544>; else goto <D.22545>;
  <D.22544>:
  D.22546 = cfg->verbose_level;
  if (D.22546 > 2) goto <D.22547>; else goto <D.22548>;
  <D.22547>:
  D.22543 = store->klass;
  D.22549 = D.22543->name;
  D.22543 = store->klass;
  D.22549 = D.22543->name;
  printf ("Incompatible store_vtype classes %s x %s\n", D.22549, D.22549);
  <D.22548>:
  D.22550 = 0;
  return D.22550;
  <D.22545>:
  <D.22542>:
  D.22540 = store->opcode;
  D.22551 = (int) D.22540;
  if (D.22551 != replaced_op) goto <D.22552>; else goto <D.22553>;
  <D.22552>:
  D.22546 = cfg->verbose_level;
  if (D.22546 > 2) goto <D.22554>; else goto <D.22555>;
  <D.22554>:
  D.22556 = mono_inst_name (replaced_op);
  D.22540 = store->opcode;
  D.22551 = (int) D.22540;
  D.22557 = mono_inst_name (D.22551);
  printf ("Incompatible store_reg type: expected %s but got %s\n", D.22556, D.22557);
  <D.22555>:
  D.22550 = 0;
  return D.22550;
  <D.22553>:
  D.22546 = cfg->verbose_level;
  if (D.22546 > 2) goto <D.22558>; else goto <D.22559>;
  <D.22558>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22559>:
  D.22560 = mono_type_to_regmove (cfg, type);
  D.22561 = (short unsigned int) D.22560;
  store->opcode = D.22561;
  type_to_eval_stack_type (cfg, type, store);
  D.22562 = var->dreg;
  store->dreg = D.22562;
  D.22563 = mono_jit_stats.stores_eliminated;
  D.22564 = D.22563 + 1;
  mono_jit_stats.stores_eliminated = D.22564;
  D.22550 = 1;
  return D.22550;
}


printf (const char * restrict __fmt)
{
  int D.22566;

  D.22566 = __printf_chk (1, __fmt, __builtin_va_arg_pack ());
  return D.22566;
}


lower_store_imm (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22568;
  unsigned int D.22569;
  unsigned int store_op.0;
  unsigned int D.22571;
  gboolean D.22574;
  short unsigned int D.22575;
  int D.22576;
  unsigned char D.22577;
  int D.22578;
  int D.22579;
  unsigned int D.22582;
  int D.22587;
  long int D.22588;
  int D.22589;
  int D.22596;
  int D.22597;
  struct MonoInst * var;
  struct MonoType * type;
  int store_op;

  var = ldaddr->data.op[0].p;
  D.22568 = var->klass;
  type = &D.22568->byval_arg;
  D.22569 = mono_type_to_store_membase (cfg, type);
  store_op = (int) D.22569;
  store_op.0 = (unsigned int) store_op;
  D.22571 = store_op.0 + 4294966910;
  if (D.22571 <= 1) goto <D.22572>; else goto <D.22573>;
  <D.22572>:
  D.22574 = 0;
  return D.22574;
  <D.22573>:
  D.22575 = store->opcode;
  D.22576 = (int) D.22575;
  switch (D.22576) <default: <D.22377>, case 381: <D.22375>, case 384: <D.22373>, case 385: <D.22376>>
  <D.22373>:
  D.22577 = var->type;
  D.22578 = (int) D.22577;
  D.22579 = is_int_stack_size (D.22578);
  if (D.22579 == 0) goto <D.22580>; else goto <D.22581>;
  <D.22580>:
  D.22582 = cfg->verbose_level;
  if (D.22582 > 2) goto <D.22583>; else goto <D.22584>;
  <D.22583>:
  printf ("Incompatible variable of size != 4\n");
  <D.22584>:
  D.22574 = 0;
  return D.22574;
  <D.22581>:
  D.22582 = cfg->verbose_level;
  if (D.22582 > 2) goto <D.22585>; else goto <D.22586>;
  <D.22585>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22586>:
  store->opcode = 362;
  store->type = 1;
  D.22587 = var->dreg;
  store->dreg = D.22587;
  D.22588 = store->data.op[1].const_val;
  store->data.op[0].const_val = D.22588;
  goto <D.22374>;
  <D.22375>:
  <D.22376>:
  D.22577 = var->type;
  D.22578 = (int) D.22577;
  D.22589 = is_long_stack_size (D.22578);
  if (D.22589 == 0) goto <D.22590>; else goto <D.22591>;
  <D.22590>:
  D.22582 = cfg->verbose_level;
  if (D.22582 > 2) goto <D.22592>; else goto <D.22593>;
  <D.22592>:
  printf ("Incompatible variable of size != 8\n");
  <D.22593>:
  D.22574 = 0;
  return D.22574;
  <D.22591>:
  D.22582 = cfg->verbose_level;
  if (D.22582 > 2) goto <D.22594>; else goto <D.22595>;
  <D.22594>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22595>:
  store->opcode = 363;
  store->type = 2;
  D.22587 = var->dreg;
  store->dreg = D.22587;
  D.22588 = store->data.op[1].const_val;
  store->data.i8const = D.22588;
  goto <D.22374>;
  <D.22377>:
  D.22574 = 0;
  return D.22574;
  <D.22374>:
  D.22596 = mono_jit_stats.stores_eliminated;
  D.22597 = D.22596 + 1;
  mono_jit_stats.stores_eliminated = D.22597;
  D.22574 = 1;
  return D.22574;
}


is_int_stack_size (int type)
{
  gboolean D.22599;
  _Bool D.22600;

  D.22600 = type == 1;
  D.22599 = (gboolean) D.22600;
  return D.22599;
}


is_long_stack_size (int type)
{
  gboolean D.22602;
  int iftmp.1;

  if (type == 2) goto <D.22604>; else goto <D.22607>;
  <D.22607>:
  if (type == 5) goto <D.22604>; else goto <D.22605>;
  <D.22604>:
  iftmp.1 = 1;
  goto <D.22606>;
  <D.22605>:
  iftmp.1 = 0;
  <D.22606>:
  D.22602 = iftmp.1;
  return D.22602;
}


recompute_aliased_variables (struct MonoCompile * cfg)
{
  struct MonoInst * * D.22609;
  long unsigned int D.22610;
  long unsigned int D.22611;
  struct MonoInst * * D.22612;
  unsigned char D.22613;
  int D.22614;
  int D.22615;
  unsigned int D.22618;
  unsigned char D.22621;
  unsigned int i.2;
  unsigned int D.22623;
  gboolean D.22626;
  short unsigned int D.22627;
  unsigned char D.22632;
  int D.22633;
  int D.22634;
  unsigned char D.22639;
  int D.22640;
  int D.22641;
  int D.22642;
  int D.22643;
  int D.22644;
  struct MonoMethod * D.22649;
  char * D.22650;
  int i;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int kills;
  int adds;

  kills = 0;
  adds = 0;
  i = 0;
  goto <D.22428>;
  <D.22427>:
  {
    struct MonoInst * var;

    D.22609 = cfg->varinfo;
    D.22610 = (long unsigned int) i;
    D.22611 = D.22610 * 8;
    D.22612 = D.22609 + D.22611;
    var = *D.22612;
    D.22613 = var->flags;
    D.22614 = (int) D.22613;
    D.22615 = D.22614 & 16;
    if (D.22615 != 0) goto <D.22616>; else goto <D.22617>;
    <D.22616>:
    D.22618 = cfg->verbose_level;
    if (D.22618 > 2) goto <D.22619>; else goto <D.22620>;
    <D.22619>:
    printf ("Killing :");
    mono_print_ins (var);
    <D.22620>:
    kills = kills + 1;
    <D.22617>:
    D.22613 = var->flags;
    D.22621 = D.22613 & 239;
    var->flags = D.22621;
  }
  i = i + 1;
  <D.22428>:
  i.2 = (unsigned int) i;
  D.22623 = cfg->num_varinfo;
  if (i.2 < D.22623) goto <D.22427>; else goto <D.22429>;
  <D.22429>:
  if (kills == 0) goto <D.22624>; else goto <D.22625>;
  <D.22624>:
  D.22626 = 0;
  return D.22626;
  <D.22625>:
  bb = cfg->bb_entry;
  goto <D.22435>;
  <D.22434>:
  ins = bb->code;
  goto <D.22432>;
  <D.22431>:
  D.22627 = ins->opcode;
  if (D.22627 == 314) goto <D.22628>; else goto <D.22629>;
  <D.22628>:
  {
    struct MonoInst * var;

    D.22618 = cfg->verbose_level;
    if (D.22618 > 2) goto <D.22630>; else goto <D.22631>;
    <D.22630>:
    printf ("Found op :");
    mono_print_ins (ins);
    <D.22631>:
    var = ins->data.op[0].p;
    D.22632 = var->flags;
    D.22633 = (int) D.22632;
    D.22634 = D.22633 & 16;
    if (D.22634 == 0) goto <D.22635>; else goto <D.22636>;
    <D.22635>:
    D.22618 = cfg->verbose_level;
    if (D.22618 != 0) goto <D.22637>; else goto <D.22638>;
    <D.22637>:
    printf ("Restoring :");
    mono_print_ins (var);
    <D.22638>:
    adds = adds + 1;
    <D.22636>:
    D.22632 = var->flags;
    D.22639 = D.22632 | 16;
    var->flags = D.22639;
  }
  <D.22629>:
  ins = ins->next;
  <D.22432>:
  if (ins != 0B) goto <D.22431>; else goto <D.22433>;
  <D.22433>:
  bb = bb->next_bb;
  <D.22435>:
  if (bb != 0B) goto <D.22434>; else goto <D.22436>;
  <D.22436>:
  D.22640 = mono_jit_stats.alias_found;
  D.22641 = D.22640 + kills;
  mono_jit_stats.alias_found = D.22641;
  D.22642 = mono_jit_stats.alias_removed;
  D.22643 = kills - adds;
  D.22644 = D.22642 + D.22643;
  mono_jit_stats.alias_removed = D.22644;
  if (kills > adds) goto <D.22645>; else goto <D.22646>;
  <D.22645>:
  D.22618 = cfg->verbose_level;
  if (D.22618 > 2) goto <D.22647>; else goto <D.22648>;
  <D.22647>:
  D.22649 = cfg->method;
  D.22650 = mono_method_full_name (D.22649, 1);
  printf ("Method: %s\n", D.22650);
  printf ("Kills %d Adds %d\n", kills, adds);
  <D.22648>:
  D.22626 = 1;
  return D.22626;
  <D.22646>:
  D.22626 = 0;
  return D.22626;
}


