mono_local_alias_analysis (struct MonoCompile * cfg)
{
  unsigned int D.21594;
  unsigned int D.21595;
  unsigned int D.21598;
  int D.21601;
  unsigned int D.21603;
  unsigned int D.21604;
  int D.21607;
  void done = <<< error >>>;

  D.21594 = BIT_FIELD_REF <*cfg, 32, 3424>;
  D.21595 = D.21594 & 1024;
  if (D.21595 == 0) goto <D.21596>; else goto <D.21597>;
  <D.21596>:
  return;
  <D.21597>:
  D.21598 = cfg->verbose_level;
  if (D.21598 > 2) goto <D.21599>; else goto <D.21600>;
  <D.21599>:
  mono_print_code (cfg, "BEFORE ALIAS_ANALYSIS");
  <D.21600>:
  D.21601 = lower_memory_access (cfg);
  if (D.21601 == 0) goto done; else goto <D.21602>;
  <D.21602>:
  D.21603 = cfg->opt;
  D.21604 = D.21603 & 64;
  if (D.21604 != 0) goto <D.21605>; else goto <D.21606>;
  <D.21605>:
  mono_local_deadce (cfg);
  <D.21606>:
  D.21607 = recompute_aliased_variables (cfg);
  if (D.21607 == 0) goto done; else goto <D.21608>;
  <D.21608>:
  mono_handle_global_vregs (cfg);
  D.21603 = cfg->opt;
  D.21604 = D.21603 & 64;
  if (D.21604 != 0) goto <D.21609>; else goto <D.21610>;
  <D.21609>:
  mono_local_deadce (cfg);
  <D.21610>:
  done:
  D.21598 = cfg->verbose_level;
  if (D.21598 > 2) goto <D.21611>; else goto <D.21612>;
  <D.21611>:
  mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
  <D.21612>:
}


lower_memory_access (struct MonoCompile * cfg)
{
  short unsigned int D.21614;
  int D.21615;
  int D.21616;
  void * D.21617;
  unsigned int D.21618;
  int D.21621;
  const void * D.21622;
  const void * D.21628;
  int D.21629;
  int D.21634;
  int D.21641;
  int D.21648;
  int D.21655;
  gboolean D.21657;
  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.21568>;
  <D.21567>:
  monoeg_g_hash_table_remove_all (addr_loads);
  ins = bb->code;
  goto <D.21565>;
  <D.21564>:
  D.21614 = ins->opcode;
  D.21615 = (int) D.21614;
  switch (D.21615) <default: <D.21656>, case 314: <D.21538>, case 374: <D.21553>, case 375: <D.21554>, case 376: <D.21555>, case 377: <D.21556>, case 378: <D.21557>, case 379: <D.21558>, case 380: <D.21559>, case 381: <D.21561>, case 384: <D.21562>, case 385: <D.21563>, case 387: <D.21560>, case 388: <D.21542>, case 389: <D.21548>, case 390: <D.21543>, case 391: <D.21544>, case 392: <D.21545>, case 393: <D.21546>, case 394: <D.21547>, case 395: <D.21549>, case 396: <D.21550>, case 397: <D.21551>, case 399: <D.21541>, case 424: <D.21540>>
  <D.21538>:
  D.21616 = ins->dreg;
  D.21617 = (void *) D.21616;
  monoeg_g_hash_table_insert_replace (addr_loads, D.21617, ins, 0);
  D.21618 = cfg->verbose_level;
  if (D.21618 > 2) goto <D.21619>; else goto <D.21620>;
  <D.21619>:
  printf ("New address: ");
  mono_print_ins (ins);
  <D.21620>:
  goto <D.21539>;
  <D.21540>:
  D.21621 = ins->sreg1;
  D.21622 = (const void *) D.21621;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21622);
  if (tmp != 0B) goto <D.21623>; else goto <D.21624>;
  <D.21623>:
  D.21616 = ins->dreg;
  D.21617 = (void *) D.21616;
  monoeg_g_hash_table_insert_replace (addr_loads, D.21617, tmp, 0);
  D.21618 = cfg->verbose_level;
  if (D.21618 > 2) goto <D.21625>; else goto <D.21626>;
  <D.21625>:
  printf ("New alias: ");
  mono_print_ins (ins);
  <D.21626>:
  goto <D.21627>;
  <D.21624>:
  D.21616 = ins->dreg;
  D.21628 = (const void *) D.21616;
  D.21629 = monoeg_g_hash_table_remove (addr_loads, D.21628);
  if (D.21629 != 0) goto <D.21630>; else goto <D.21631>;
  <D.21630>:
  D.21618 = cfg->verbose_level;
  if (D.21618 > 2) goto <D.21632>; else goto <D.21633>;
  <D.21632>:
  printf ("Killed alias: ");
  mono_print_ins (ins);
  <D.21633>:
  <D.21631>:
  <D.21627>:
  goto <D.21539>;
  <D.21541>:
  <D.21542>:
  <D.21543>:
  <D.21544>:
  <D.21545>:
  <D.21546>:
  <D.21547>:
  <D.21548>:
  <D.21549>:
  <D.21550>:
  <D.21551>:
  D.21634 = ins->data.op[0].const_val;
  if (D.21634 != 0) goto <D.21635>; else goto <D.21636>;
  <D.21635>:
  // predicted unlikely by continue predictor.
  goto <D.21552>;
  <D.21636>:
  D.21621 = ins->sreg1;
  D.21622 = (const void *) D.21621;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21622);
  if (tmp != 0B) goto <D.21637>; else goto <D.21638>;
  <D.21637>:
  D.21618 = cfg->verbose_level;
  if (D.21618 > 2) goto <D.21639>; else goto <D.21640>;
  <D.21639>:
  printf ("Found candidate load:");
  mono_print_ins (ins);
  <D.21640>:
  D.21641 = lower_load (cfg, ins, tmp);
  needs_dce = D.21641 | needs_dce;
  <D.21638>:
  goto <D.21539>;
  <D.21553>:
  <D.21554>:
  <D.21555>:
  <D.21556>:
  <D.21557>:
  <D.21558>:
  <D.21559>:
  <D.21560>:
  D.21634 = ins->data.op[0].const_val;
  if (D.21634 != 0) goto <D.21642>; else goto <D.21643>;
  <D.21642>:
  // predicted unlikely by continue predictor.
  goto <D.21552>;
  <D.21643>:
  D.21616 = ins->dreg;
  D.21628 = (const void *) D.21616;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21628);
  if (tmp != 0B) goto <D.21644>; else goto <D.21645>;
  <D.21644>:
  D.21618 = cfg->verbose_level;
  if (D.21618 > 2) goto <D.21646>; else goto <D.21647>;
  <D.21646>:
  printf ("Found candidate store:");
  mono_print_ins (ins);
  <D.21647>:
  D.21648 = lower_store (cfg, ins, tmp);
  needs_dce = D.21648 | needs_dce;
  <D.21645>:
  goto <D.21539>;
  <D.21561>:
  <D.21562>:
  <D.21563>:
  D.21634 = ins->data.op[0].const_val;
  if (D.21634 != 0) goto <D.21649>; else goto <D.21650>;
  <D.21649>:
  // predicted unlikely by continue predictor.
  goto <D.21552>;
  <D.21650>:
  D.21616 = ins->dreg;
  D.21628 = (const void *) D.21616;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21628);
  if (tmp != 0B) goto <D.21651>; else goto <D.21652>;
  <D.21651>:
  D.21618 = cfg->verbose_level;
  if (D.21618 > 2) goto <D.21653>; else goto <D.21654>;
  <D.21653>:
  printf ("Found candidate store-imm:");
  mono_print_ins (ins);
  <D.21654>:
  D.21655 = lower_store_imm (cfg, ins, tmp);
  needs_dce = D.21655 | needs_dce;
  <D.21652>:
  goto <D.21539>;
  <D.21656>:
  <D.21539>:
  <D.21552>:
  ins = ins->next;
  <D.21565>:
  if (ins != 0B) goto <D.21564>; else goto <D.21566>;
  <D.21566>:
  bb = bb->next_bb;
  <D.21568>:
  if (bb != 0B) goto <D.21567>; else goto <D.21569>;
  <D.21569>:
  monoeg_g_hash_table_destroy (addr_loads);
  D.21657 = needs_dce;
  return D.21657;
}


lower_load (struct MonoCompile * cfg, struct MonoInst * load, struct MonoInst * ldaddr)
{
  struct MonoClass * D.21659;
  unsigned int D.21660;
  short unsigned int D.21661;
  struct MonoClass * D.21664;
  unsigned int D.21667;
  const char * D.21670;
  const char * D.21671;
  gboolean D.21672;
  int D.21673;
  const char * D.21678;
  const char * D.21679;
  unsigned int D.21682;
  short unsigned int D.21683;
  int D.21684;
  int D.21685;
  int D.21686;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.21659 = var->klass;
  type = &D.21659->byval_arg;
  D.21660 = mono_type_to_load_membase (cfg, type);
  replaced_op = (int) D.21660;
  D.21661 = load->opcode;
  if (D.21661 == 399) goto <D.21662>; else goto <D.21663>;
  <D.21662>:
  D.21664 = load->klass;
  D.21659 = var->klass;
  if (D.21664 != D.21659) goto <D.21665>; else goto <D.21666>;
  <D.21665>:
  D.21667 = cfg->verbose_level;
  if (D.21667 > 2) goto <D.21668>; else goto <D.21669>;
  <D.21668>:
  D.21664 = load->klass;
  D.21670 = D.21664->name;
  D.21659 = var->klass;
  D.21671 = D.21659->name;
  printf ("Incompatible load_vtype classes %s x %s\n", D.21670, D.21671);
  <D.21669>:
  D.21672 = 0;
  return D.21672;
  <D.21666>:
  <D.21663>:
  D.21661 = load->opcode;
  D.21673 = (int) D.21661;
  if (D.21673 != replaced_op) goto <D.21674>; else goto <D.21675>;
  <D.21674>:
  D.21667 = cfg->verbose_level;
  if (D.21667 > 2) goto <D.21676>; else goto <D.21677>;
  <D.21676>:
  D.21678 = mono_inst_name (replaced_op);
  D.21661 = load->opcode;
  D.21673 = (int) D.21661;
  D.21679 = mono_inst_name (D.21673);
  printf ("Incompatible load type: expected %s but got %s\n", D.21678, D.21679);
  <D.21677>:
  D.21672 = 0;
  return D.21672;
  <D.21675>:
  D.21667 = cfg->verbose_level;
  if (D.21667 > 2) goto <D.21680>; else goto <D.21681>;
  <D.21680>:
  printf ("mem2reg replacing: ");
  mono_print_ins (load);
  <D.21681>:
  D.21682 = mono_type_to_regmove (cfg, type);
  D.21683 = (short unsigned int) D.21682;
  load->opcode = D.21683;
  type_to_eval_stack_type (cfg, type, load);
  D.21684 = var->dreg;
  load->sreg1 = D.21684;
  D.21685 = mono_jit_stats.loads_eliminated;
  D.21686 = D.21685 + 1;
  mono_jit_stats.loads_eliminated = D.21686;
  D.21672 = 1;
  return D.21672;
}


lower_store (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.21688;
  unsigned int D.21689;
  short unsigned int D.21690;
  struct MonoClass * D.21693;
  unsigned int D.21696;
  const char * D.21699;
  gboolean D.21700;
  int D.21701;
  const char * D.21706;
  const char * D.21707;
  unsigned int D.21710;
  short unsigned int D.21711;
  int D.21712;
  int D.21713;
  int D.21714;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.21688 = var->klass;
  type = &D.21688->byval_arg;
  D.21689 = mono_type_to_store_membase (cfg, type);
  replaced_op = (int) D.21689;
  D.21690 = store->opcode;
  if (D.21690 == 387) goto <D.21691>; else goto <D.21692>;
  <D.21691>:
  D.21693 = store->klass;
  D.21688 = var->klass;
  if (D.21693 != D.21688) goto <D.21694>; else goto <D.21695>;
  <D.21694>:
  D.21696 = cfg->verbose_level;
  if (D.21696 > 2) goto <D.21697>; else goto <D.21698>;
  <D.21697>:
  D.21693 = store->klass;
  D.21699 = D.21693->name;
  D.21693 = store->klass;
  D.21699 = D.21693->name;
  printf ("Incompatible store_vtype classes %s x %s\n", D.21699, D.21699);
  <D.21698>:
  D.21700 = 0;
  return D.21700;
  <D.21695>:
  <D.21692>:
  D.21690 = store->opcode;
  D.21701 = (int) D.21690;
  if (D.21701 != replaced_op) goto <D.21702>; else goto <D.21703>;
  <D.21702>:
  D.21696 = cfg->verbose_level;
  if (D.21696 > 2) goto <D.21704>; else goto <D.21705>;
  <D.21704>:
  D.21706 = mono_inst_name (replaced_op);
  D.21690 = store->opcode;
  D.21701 = (int) D.21690;
  D.21707 = mono_inst_name (D.21701);
  printf ("Incompatible store_reg type: expected %s but got %s\n", D.21706, D.21707);
  <D.21705>:
  D.21700 = 0;
  return D.21700;
  <D.21703>:
  D.21696 = cfg->verbose_level;
  if (D.21696 > 2) goto <D.21708>; else goto <D.21709>;
  <D.21708>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.21709>:
  D.21710 = mono_type_to_regmove (cfg, type);
  D.21711 = (short unsigned int) D.21710;
  store->opcode = D.21711;
  type_to_eval_stack_type (cfg, type, store);
  D.21712 = var->dreg;
  store->dreg = D.21712;
  D.21713 = mono_jit_stats.stores_eliminated;
  D.21714 = D.21713 + 1;
  mono_jit_stats.stores_eliminated = D.21714;
  D.21700 = 1;
  return D.21700;
}


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

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


lower_store_imm (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.21718;
  unsigned int D.21719;
  unsigned int store_op.0;
  unsigned int D.21721;
  gboolean D.21724;
  short unsigned int D.21725;
  int D.21726;
  unsigned char D.21727;
  int D.21728;
  int D.21729;
  unsigned int D.21732;
  int D.21737;
  int D.21738;
  int D.21739;
  long long int D.21746;
  int D.21747;
  int D.21748;
  struct MonoInst * var;
  struct MonoType * type;
  int store_op;

  var = ldaddr->data.op[0].p;
  D.21718 = var->klass;
  type = &D.21718->byval_arg;
  D.21719 = mono_type_to_store_membase (cfg, type);
  store_op = (int) D.21719;
  store_op.0 = (unsigned int) store_op;
  D.21721 = store_op.0 + 4294966910;
  if (D.21721 <= 1) goto <D.21722>; else goto <D.21723>;
  <D.21722>:
  D.21724 = 0;
  return D.21724;
  <D.21723>:
  D.21725 = store->opcode;
  D.21726 = (int) D.21725;
  switch (D.21726) <default: <D.21529>, case 381: <D.21525>, case 384: <D.21526>, case 385: <D.21528>>
  <D.21525>:
  <D.21526>:
  D.21727 = var->type;
  D.21728 = (int) D.21727;
  D.21729 = is_int_stack_size (D.21728);
  if (D.21729 == 0) goto <D.21730>; else goto <D.21731>;
  <D.21730>:
  D.21732 = cfg->verbose_level;
  if (D.21732 > 2) goto <D.21733>; else goto <D.21734>;
  <D.21733>:
  printf ("Incompatible variable of size != 4\n");
  <D.21734>:
  D.21724 = 0;
  return D.21724;
  <D.21731>:
  D.21732 = cfg->verbose_level;
  if (D.21732 > 2) goto <D.21735>; else goto <D.21736>;
  <D.21735>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.21736>:
  store->opcode = 362;
  store->type = 1;
  D.21737 = var->dreg;
  store->dreg = D.21737;
  D.21738 = store->data.op[1].const_val;
  store->data.op[0].const_val = D.21738;
  goto <D.21527>;
  <D.21528>:
  D.21727 = var->type;
  D.21728 = (int) D.21727;
  D.21739 = is_long_stack_size (D.21728);
  if (D.21739 == 0) goto <D.21740>; else goto <D.21741>;
  <D.21740>:
  D.21732 = cfg->verbose_level;
  if (D.21732 > 2) goto <D.21742>; else goto <D.21743>;
  <D.21742>:
  printf ("Incompatible variable of size != 8\n");
  <D.21743>:
  D.21724 = 0;
  return D.21724;
  <D.21741>:
  D.21732 = cfg->verbose_level;
  if (D.21732 > 2) goto <D.21744>; else goto <D.21745>;
  <D.21744>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.21745>:
  store->opcode = 363;
  store->type = 2;
  D.21737 = var->dreg;
  store->dreg = D.21737;
  D.21738 = store->data.op[1].const_val;
  D.21746 = (long long int) D.21738;
  store->data.i8const = D.21746;
  goto <D.21527>;
  <D.21529>:
  D.21724 = 0;
  return D.21724;
  <D.21527>:
  D.21747 = mono_jit_stats.stores_eliminated;
  D.21748 = D.21747 + 1;
  mono_jit_stats.stores_eliminated = D.21748;
  D.21724 = 1;
  return D.21724;
}


is_int_stack_size (int type)
{
  gboolean D.21750;
  int iftmp.1;

  if (type == 1) goto <D.21752>; else goto <D.21755>;
  <D.21755>:
  if (type == 5) goto <D.21752>; else goto <D.21753>;
  <D.21752>:
  iftmp.1 = 1;
  goto <D.21754>;
  <D.21753>:
  iftmp.1 = 0;
  <D.21754>:
  D.21750 = iftmp.1;
  return D.21750;
}


is_long_stack_size (int type)
{
  gboolean D.21757;
  _Bool D.21758;

  D.21758 = type == 2;
  D.21757 = (gboolean) D.21758;
  return D.21757;
}


recompute_aliased_variables (struct MonoCompile * cfg)
{
  struct MonoInst * * D.21760;
  unsigned int i.2;
  unsigned int D.21762;
  struct MonoInst * * D.21763;
  unsigned char D.21764;
  int D.21765;
  int D.21766;
  unsigned int D.21769;
  unsigned char D.21772;
  unsigned int i.3;
  unsigned int D.21774;
  gboolean D.21777;
  short unsigned int D.21778;
  unsigned char D.21783;
  int D.21784;
  int D.21785;
  unsigned char D.21790;
  int D.21791;
  int D.21792;
  int D.21793;
  int D.21794;
  int D.21795;
  struct MonoMethod * D.21800;
  char * D.21801;
  int i;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int kills;
  int adds;

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

    D.21760 = cfg->varinfo;
    i.2 = (unsigned int) i;
    D.21762 = i.2 * 4;
    D.21763 = D.21760 + D.21762;
    var = *D.21763;
    D.21764 = var->flags;
    D.21765 = (int) D.21764;
    D.21766 = D.21765 & 16;
    if (D.21766 != 0) goto <D.21767>; else goto <D.21768>;
    <D.21767>:
    D.21769 = cfg->verbose_level;
    if (D.21769 > 2) goto <D.21770>; else goto <D.21771>;
    <D.21770>:
    printf ("Killing :");
    mono_print_ins (var);
    <D.21771>:
    kills = kills + 1;
    <D.21768>:
    D.21764 = var->flags;
    D.21772 = D.21764 & 239;
    var->flags = D.21772;
  }
  i = i + 1;
  <D.21580>:
  i.3 = (unsigned int) i;
  D.21774 = cfg->num_varinfo;
  if (i.3 < D.21774) goto <D.21579>; else goto <D.21581>;
  <D.21581>:
  if (kills == 0) goto <D.21775>; else goto <D.21776>;
  <D.21775>:
  D.21777 = 0;
  return D.21777;
  <D.21776>:
  bb = cfg->bb_entry;
  goto <D.21587>;
  <D.21586>:
  ins = bb->code;
  goto <D.21584>;
  <D.21583>:
  D.21778 = ins->opcode;
  if (D.21778 == 314) goto <D.21779>; else goto <D.21780>;
  <D.21779>:
  {
    struct MonoInst * var;

    D.21769 = cfg->verbose_level;
    if (D.21769 > 2) goto <D.21781>; else goto <D.21782>;
    <D.21781>:
    printf ("Found op :");
    mono_print_ins (ins);
    <D.21782>:
    var = ins->data.op[0].p;
    D.21783 = var->flags;
    D.21784 = (int) D.21783;
    D.21785 = D.21784 & 16;
    if (D.21785 == 0) goto <D.21786>; else goto <D.21787>;
    <D.21786>:
    D.21769 = cfg->verbose_level;
    if (D.21769 != 0) goto <D.21788>; else goto <D.21789>;
    <D.21788>:
    printf ("Restoring :");
    mono_print_ins (var);
    <D.21789>:
    adds = adds + 1;
    <D.21787>:
    D.21783 = var->flags;
    D.21790 = D.21783 | 16;
    var->flags = D.21790;
  }
  <D.21780>:
  ins = ins->next;
  <D.21584>:
  if (ins != 0B) goto <D.21583>; else goto <D.21585>;
  <D.21585>:
  bb = bb->next_bb;
  <D.21587>:
  if (bb != 0B) goto <D.21586>; else goto <D.21588>;
  <D.21588>:
  D.21791 = mono_jit_stats.alias_found;
  D.21792 = D.21791 + kills;
  mono_jit_stats.alias_found = D.21792;
  D.21793 = mono_jit_stats.alias_removed;
  D.21794 = kills - adds;
  D.21795 = D.21793 + D.21794;
  mono_jit_stats.alias_removed = D.21795;
  if (kills > adds) goto <D.21796>; else goto <D.21797>;
  <D.21796>:
  D.21769 = cfg->verbose_level;
  if (D.21769 > 2) goto <D.21798>; else goto <D.21799>;
  <D.21798>:
  D.21800 = cfg->method;
  D.21801 = mono_method_full_name (D.21800, 1);
  printf ("Method: %s\n", D.21801);
  printf ("Kills %d Adds %d\n", kills, adds);
  <D.21799>:
  D.21777 = 1;
  return D.21777;
  <D.21797>:
  D.21777 = 0;
  return D.21777;
}


