mono_local_alias_analysis (struct MonoCompile * cfg)
{
  unsigned char D.21915;
  unsigned char D.21916;
  unsigned int D.21919;
  int D.21922;
  unsigned int D.21924;
  unsigned int D.21925;
  int D.21928;
  void done = <<< error >>>;

  D.21915 = BIT_FIELD_REF <*cfg, 8, 3432>;
  D.21916 = D.21915 & 4;
  if (D.21916 == 0) goto <D.21917>; else goto <D.21918>;
  <D.21917>:
  return;
  <D.21918>:
  D.21919 = cfg->verbose_level;
  if (D.21919 > 2) goto <D.21920>; else goto <D.21921>;
  <D.21920>:
  mono_print_code (cfg, "BEFORE ALIAS_ANALYSIS");
  <D.21921>:
  D.21922 = lower_memory_access (cfg);
  if (D.21922 == 0) goto done; else goto <D.21923>;
  <D.21923>:
  D.21924 = cfg->opt;
  D.21925 = D.21924 & 64;
  if (D.21925 != 0) goto <D.21926>; else goto <D.21927>;
  <D.21926>:
  mono_local_deadce (cfg);
  <D.21927>:
  D.21928 = recompute_aliased_variables (cfg);
  if (D.21928 == 0) goto done; else goto <D.21929>;
  <D.21929>:
  mono_handle_global_vregs (cfg);
  D.21924 = cfg->opt;
  D.21925 = D.21924 & 64;
  if (D.21925 != 0) goto <D.21930>; else goto <D.21931>;
  <D.21930>:
  mono_local_deadce (cfg);
  <D.21931>:
  done:
  D.21919 = cfg->verbose_level;
  if (D.21919 > 2) goto <D.21932>; else goto <D.21933>;
  <D.21932>:
  mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
  <D.21933>:
}


lower_memory_access (struct MonoCompile * cfg)
{
  short unsigned int D.21935;
  int D.21936;
  int D.21937;
  void * D.21938;
  unsigned int D.21939;
  int D.21942;
  const void * D.21943;
  const void * D.21949;
  int D.21950;
  int D.21955;
  int D.21962;
  int D.21969;
  int D.21976;
  gboolean D.21978;
  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.21889>;
  <D.21888>:
  monoeg_g_hash_table_remove_all (addr_loads);
  ins = bb->code;
  goto <D.21886>;
  <D.21885>:
  D.21935 = ins->opcode;
  D.21936 = (int) D.21935;
  switch (D.21936) <default: <D.21977>, case 314: <D.21859>, case 374: <D.21874>, case 375: <D.21875>, case 376: <D.21876>, case 377: <D.21877>, case 378: <D.21878>, case 379: <D.21879>, case 380: <D.21880>, case 384: <D.21882>, case 387: <D.21883>, case 388: <D.21884>, case 390: <D.21881>, case 391: <D.21863>, case 392: <D.21869>, case 393: <D.21864>, case 394: <D.21865>, case 395: <D.21866>, case 396: <D.21867>, case 397: <D.21868>, case 398: <D.21870>, case 399: <D.21871>, case 400: <D.21872>, case 403: <D.21862>, case 428: <D.21861>>
  <D.21859>:
  D.21937 = ins->dreg;
  D.21938 = (void *) D.21937;
  monoeg_g_hash_table_insert_replace (addr_loads, D.21938, ins, 0);
  D.21939 = cfg->verbose_level;
  if (D.21939 > 2) goto <D.21940>; else goto <D.21941>;
  <D.21940>:
  printf ("New address: ");
  mono_print_ins (ins);
  <D.21941>:
  goto <D.21860>;
  <D.21861>:
  D.21942 = ins->sreg1;
  D.21943 = (const void *) D.21942;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21943);
  if (tmp != 0B) goto <D.21944>; else goto <D.21945>;
  <D.21944>:
  D.21937 = ins->dreg;
  D.21938 = (void *) D.21937;
  monoeg_g_hash_table_insert_replace (addr_loads, D.21938, tmp, 0);
  D.21939 = cfg->verbose_level;
  if (D.21939 > 2) goto <D.21946>; else goto <D.21947>;
  <D.21946>:
  printf ("New alias: ");
  mono_print_ins (ins);
  <D.21947>:
  goto <D.21948>;
  <D.21945>:
  D.21937 = ins->dreg;
  D.21949 = (const void *) D.21937;
  D.21950 = monoeg_g_hash_table_remove (addr_loads, D.21949);
  if (D.21950 != 0) goto <D.21951>; else goto <D.21952>;
  <D.21951>:
  D.21939 = cfg->verbose_level;
  if (D.21939 > 2) goto <D.21953>; else goto <D.21954>;
  <D.21953>:
  printf ("Killed alias: ");
  mono_print_ins (ins);
  <D.21954>:
  <D.21952>:
  <D.21948>:
  goto <D.21860>;
  <D.21862>:
  <D.21863>:
  <D.21864>:
  <D.21865>:
  <D.21866>:
  <D.21867>:
  <D.21868>:
  <D.21869>:
  <D.21870>:
  <D.21871>:
  <D.21872>:
  D.21955 = ins->data.op[0].const_val;
  if (D.21955 != 0) goto <D.21956>; else goto <D.21957>;
  <D.21956>:
  // predicted unlikely by continue predictor.
  goto <D.21873>;
  <D.21957>:
  D.21942 = ins->sreg1;
  D.21943 = (const void *) D.21942;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21943);
  if (tmp != 0B) goto <D.21958>; else goto <D.21959>;
  <D.21958>:
  D.21939 = cfg->verbose_level;
  if (D.21939 > 2) goto <D.21960>; else goto <D.21961>;
  <D.21960>:
  printf ("Found candidate load:");
  mono_print_ins (ins);
  <D.21961>:
  D.21962 = lower_load (cfg, ins, tmp);
  needs_dce = D.21962 | needs_dce;
  <D.21959>:
  goto <D.21860>;
  <D.21874>:
  <D.21875>:
  <D.21876>:
  <D.21877>:
  <D.21878>:
  <D.21879>:
  <D.21880>:
  <D.21881>:
  D.21955 = ins->data.op[0].const_val;
  if (D.21955 != 0) goto <D.21963>; else goto <D.21964>;
  <D.21963>:
  // predicted unlikely by continue predictor.
  goto <D.21873>;
  <D.21964>:
  D.21937 = ins->dreg;
  D.21949 = (const void *) D.21937;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21949);
  if (tmp != 0B) goto <D.21965>; else goto <D.21966>;
  <D.21965>:
  D.21939 = cfg->verbose_level;
  if (D.21939 > 2) goto <D.21967>; else goto <D.21968>;
  <D.21967>:
  printf ("Found candidate store:");
  mono_print_ins (ins);
  <D.21968>:
  D.21969 = lower_store (cfg, ins, tmp);
  needs_dce = D.21969 | needs_dce;
  <D.21966>:
  goto <D.21860>;
  <D.21882>:
  <D.21883>:
  <D.21884>:
  D.21955 = ins->data.op[0].const_val;
  if (D.21955 != 0) goto <D.21970>; else goto <D.21971>;
  <D.21970>:
  // predicted unlikely by continue predictor.
  goto <D.21873>;
  <D.21971>:
  D.21937 = ins->dreg;
  D.21949 = (const void *) D.21937;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.21949);
  if (tmp != 0B) goto <D.21972>; else goto <D.21973>;
  <D.21972>:
  D.21939 = cfg->verbose_level;
  if (D.21939 > 2) goto <D.21974>; else goto <D.21975>;
  <D.21974>:
  printf ("Found candidate store-imm:");
  mono_print_ins (ins);
  <D.21975>:
  D.21976 = lower_store_imm (cfg, ins, tmp);
  needs_dce = D.21976 | needs_dce;
  <D.21973>:
  goto <D.21860>;
  <D.21977>:
  <D.21860>:
  <D.21873>:
  ins = ins->next;
  <D.21886>:
  if (ins != 0B) goto <D.21885>; else goto <D.21887>;
  <D.21887>:
  bb = bb->next_bb;
  <D.21889>:
  if (bb != 0B) goto <D.21888>; else goto <D.21890>;
  <D.21890>:
  monoeg_g_hash_table_destroy (addr_loads);
  D.21978 = needs_dce;
  return D.21978;
}


lower_load (struct MonoCompile * cfg, struct MonoInst * load, struct MonoInst * ldaddr)
{
  struct MonoClass * D.21980;
  unsigned int D.21981;
  short unsigned int D.21982;
  struct MonoClass * D.21985;
  unsigned int D.21988;
  const char * D.21991;
  const char * D.21992;
  gboolean D.21993;
  int D.21994;
  const char * D.21999;
  const char * D.22000;
  unsigned int D.22003;
  short unsigned int D.22004;
  int D.22005;
  int D.22006;
  int D.22007;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.21980 = var->klass;
  type = &D.21980->byval_arg;
  D.21981 = mono_type_to_load_membase (cfg, type);
  replaced_op = (int) D.21981;
  D.21982 = load->opcode;
  if (D.21982 == 403) goto <D.21983>; else goto <D.21984>;
  <D.21983>:
  D.21985 = load->klass;
  D.21980 = var->klass;
  if (D.21985 != D.21980) goto <D.21986>; else goto <D.21987>;
  <D.21986>:
  D.21988 = cfg->verbose_level;
  if (D.21988 > 2) goto <D.21989>; else goto <D.21990>;
  <D.21989>:
  D.21980 = var->klass;
  D.21991 = D.21980->name;
  D.21985 = load->klass;
  D.21992 = D.21985->name;
  printf ("Incompatible load_vtype classes %s x %s\n", D.21992, D.21991);
  <D.21990>:
  D.21993 = 0;
  return D.21993;
  <D.21987>:
  <D.21984>:
  D.21982 = load->opcode;
  D.21994 = (int) D.21982;
  if (D.21994 != replaced_op) goto <D.21995>; else goto <D.21996>;
  <D.21995>:
  D.21988 = cfg->verbose_level;
  if (D.21988 > 2) goto <D.21997>; else goto <D.21998>;
  <D.21997>:
  D.21982 = load->opcode;
  D.21994 = (int) D.21982;
  D.21999 = mono_inst_name (D.21994);
  D.22000 = mono_inst_name (replaced_op);
  printf ("Incompatible load type: expected %s but got %s\n", D.22000, D.21999);
  <D.21998>:
  D.21993 = 0;
  return D.21993;
  <D.21996>:
  D.21988 = cfg->verbose_level;
  if (D.21988 > 2) goto <D.22001>; else goto <D.22002>;
  <D.22001>:
  printf ("mem2reg replacing: ");
  mono_print_ins (load);
  <D.22002>:
  D.22003 = mono_type_to_regmove (cfg, type);
  D.22004 = (short unsigned int) D.22003;
  load->opcode = D.22004;
  type_to_eval_stack_type (cfg, type, load);
  D.22005 = var->dreg;
  load->sreg1 = D.22005;
  D.22006 = mono_jit_stats.loads_eliminated;
  D.22007 = D.22006 + 1;
  mono_jit_stats.loads_eliminated = D.22007;
  D.21993 = 1;
  return D.21993;
}


lower_store (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22009;
  unsigned int D.22010;
  short unsigned int D.22011;
  struct MonoClass * D.22014;
  unsigned int D.22017;
  const char * D.22020;
  gboolean D.22021;
  int D.22022;
  const char * D.22027;
  const char * D.22028;
  unsigned int D.22031;
  short unsigned int D.22032;
  int D.22033;
  int D.22034;
  int D.22035;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22009 = var->klass;
  type = &D.22009->byval_arg;
  D.22010 = mono_type_to_store_membase (cfg, type);
  replaced_op = (int) D.22010;
  D.22011 = store->opcode;
  if (D.22011 == 390) goto <D.22012>; else goto <D.22013>;
  <D.22012>:
  D.22014 = store->klass;
  D.22009 = var->klass;
  if (D.22014 != D.22009) goto <D.22015>; else goto <D.22016>;
  <D.22015>:
  D.22017 = cfg->verbose_level;
  if (D.22017 > 2) goto <D.22018>; else goto <D.22019>;
  <D.22018>:
  D.22014 = store->klass;
  D.22020 = D.22014->name;
  D.22014 = store->klass;
  D.22020 = D.22014->name;
  printf ("Incompatible store_vtype classes %s x %s\n", D.22020, D.22020);
  <D.22019>:
  D.22021 = 0;
  return D.22021;
  <D.22016>:
  <D.22013>:
  D.22011 = store->opcode;
  D.22022 = (int) D.22011;
  if (D.22022 != replaced_op) goto <D.22023>; else goto <D.22024>;
  <D.22023>:
  D.22017 = cfg->verbose_level;
  if (D.22017 > 2) goto <D.22025>; else goto <D.22026>;
  <D.22025>:
  D.22011 = store->opcode;
  D.22022 = (int) D.22011;
  D.22027 = mono_inst_name (D.22022);
  D.22028 = mono_inst_name (replaced_op);
  printf ("Incompatible store_reg type: expected %s but got %s\n", D.22028, D.22027);
  <D.22026>:
  D.22021 = 0;
  return D.22021;
  <D.22024>:
  D.22017 = cfg->verbose_level;
  if (D.22017 > 2) goto <D.22029>; else goto <D.22030>;
  <D.22029>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22030>:
  D.22031 = mono_type_to_regmove (cfg, type);
  D.22032 = (short unsigned int) D.22031;
  store->opcode = D.22032;
  type_to_eval_stack_type (cfg, type, store);
  D.22033 = var->dreg;
  store->dreg = D.22033;
  D.22034 = mono_jit_stats.stores_eliminated;
  D.22035 = D.22034 + 1;
  mono_jit_stats.stores_eliminated = D.22035;
  D.22021 = 1;
  return D.22021;
}


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

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


lower_store_imm (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22039;
  unsigned int D.22040;
  unsigned int store_op.0;
  unsigned int D.22042;
  gboolean D.22045;
  short unsigned int D.22046;
  int D.22047;
  unsigned char D.22048;
  int D.22049;
  int D.22050;
  unsigned int D.22053;
  int D.22058;
  int D.22059;
  int D.22060;
  long long int D.22067;
  int D.22068;
  int D.22069;
  struct MonoInst * var;
  struct MonoType * type;
  int store_op;

  var = ldaddr->data.op[0].p;
  D.22039 = var->klass;
  type = &D.22039->byval_arg;
  D.22040 = mono_type_to_store_membase (cfg, type);
  store_op = (int) D.22040;
  store_op.0 = (unsigned int) store_op;
  D.22042 = store_op.0 + 4294966907;
  if (D.22042 <= 1) goto <D.22043>; else goto <D.22044>;
  <D.22043>:
  D.22045 = 0;
  return D.22045;
  <D.22044>:
  D.22046 = store->opcode;
  D.22047 = (int) D.22046;
  switch (D.22047) <default: <D.21850>, case 384: <D.21846>, case 387: <D.21847>, case 388: <D.21849>>
  <D.21846>:
  <D.21847>:
  D.22048 = var->type;
  D.22049 = (int) D.22048;
  D.22050 = is_int_stack_size (D.22049);
  if (D.22050 == 0) goto <D.22051>; else goto <D.22052>;
  <D.22051>:
  D.22053 = cfg->verbose_level;
  if (D.22053 > 2) goto <D.22054>; else goto <D.22055>;
  <D.22054>:
  printf ("Incompatible variable of size != 4\n");
  <D.22055>:
  D.22045 = 0;
  return D.22045;
  <D.22052>:
  D.22053 = cfg->verbose_level;
  if (D.22053 > 2) goto <D.22056>; else goto <D.22057>;
  <D.22056>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22057>:
  store->opcode = 362;
  store->type = 1;
  D.22058 = var->dreg;
  store->dreg = D.22058;
  D.22059 = store->data.op[1].const_val;
  store->data.op[0].const_val = D.22059;
  goto <D.21848>;
  <D.21849>:
  D.22048 = var->type;
  D.22049 = (int) D.22048;
  D.22060 = is_long_stack_size (D.22049);
  if (D.22060 == 0) goto <D.22061>; else goto <D.22062>;
  <D.22061>:
  D.22053 = cfg->verbose_level;
  if (D.22053 > 2) goto <D.22063>; else goto <D.22064>;
  <D.22063>:
  printf ("Incompatible variable of size != 8\n");
  <D.22064>:
  D.22045 = 0;
  return D.22045;
  <D.22062>:
  D.22053 = cfg->verbose_level;
  if (D.22053 > 2) goto <D.22065>; else goto <D.22066>;
  <D.22065>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22066>:
  store->opcode = 363;
  store->type = 2;
  D.22058 = var->dreg;
  store->dreg = D.22058;
  D.22059 = store->data.op[1].const_val;
  D.22067 = (long long int) D.22059;
  store->data.i8const = D.22067;
  goto <D.21848>;
  <D.21850>:
  D.22045 = 0;
  return D.22045;
  <D.21848>:
  D.22068 = mono_jit_stats.stores_eliminated;
  D.22069 = D.22068 + 1;
  mono_jit_stats.stores_eliminated = D.22069;
  D.22045 = 1;
  return D.22045;
}


is_int_stack_size (int type)
{
  gboolean D.22071;
  _Bool D.22072;
  _Bool D.22073;
  _Bool D.22074;

  D.22072 = type == 1;
  D.22073 = type == 5;
  D.22074 = D.22072 | D.22073;
  D.22071 = (gboolean) D.22074;
  return D.22071;
}


is_long_stack_size (int type)
{
  gboolean D.22076;
  _Bool D.22077;

  D.22077 = type == 2;
  D.22076 = (gboolean) D.22077;
  return D.22076;
}


recompute_aliased_variables (struct MonoCompile * cfg)
{
  struct MonoInst * * D.22079;
  unsigned int i.1;
  unsigned int D.22081;
  struct MonoInst * * D.22082;
  unsigned char D.22083;
  int D.22084;
  int D.22085;
  unsigned int D.22088;
  unsigned char D.22091;
  unsigned int i.2;
  unsigned int D.22093;
  gboolean D.22096;
  short unsigned int D.22097;
  unsigned char D.22102;
  int D.22103;
  int D.22104;
  unsigned char D.22109;
  int D.22110;
  int D.22111;
  int D.22112;
  int D.22113;
  int D.22114;
  struct MonoMethod * D.22119;
  char * D.22120;
  int i;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int kills;
  int adds;

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

    D.22079 = cfg->varinfo;
    i.1 = (unsigned int) i;
    D.22081 = i.1 * 4;
    D.22082 = D.22079 + D.22081;
    var = *D.22082;
    D.22083 = var->flags;
    D.22084 = (int) D.22083;
    D.22085 = D.22084 & 16;
    if (D.22085 != 0) goto <D.22086>; else goto <D.22087>;
    <D.22086>:
    D.22088 = cfg->verbose_level;
    if (D.22088 > 2) goto <D.22089>; else goto <D.22090>;
    <D.22089>:
    printf ("Killing :");
    mono_print_ins (var);
    <D.22090>:
    kills = kills + 1;
    <D.22087>:
    D.22083 = var->flags;
    D.22091 = D.22083 & 239;
    var->flags = D.22091;
  }
  i = i + 1;
  <D.21901>:
  i.2 = (unsigned int) i;
  D.22093 = cfg->num_varinfo;
  if (i.2 < D.22093) goto <D.21900>; else goto <D.21902>;
  <D.21902>:
  if (kills == 0) goto <D.22094>; else goto <D.22095>;
  <D.22094>:
  D.22096 = 0;
  return D.22096;
  <D.22095>:
  bb = cfg->bb_entry;
  goto <D.21908>;
  <D.21907>:
  ins = bb->code;
  goto <D.21905>;
  <D.21904>:
  D.22097 = ins->opcode;
  if (D.22097 == 314) goto <D.22098>; else goto <D.22099>;
  <D.22098>:
  {
    struct MonoInst * var;

    D.22088 = cfg->verbose_level;
    if (D.22088 > 2) goto <D.22100>; else goto <D.22101>;
    <D.22100>:
    printf ("Found op :");
    mono_print_ins (ins);
    <D.22101>:
    var = ins->data.op[0].p;
    D.22102 = var->flags;
    D.22103 = (int) D.22102;
    D.22104 = D.22103 & 16;
    if (D.22104 == 0) goto <D.22105>; else goto <D.22106>;
    <D.22105>:
    D.22088 = cfg->verbose_level;
    if (D.22088 != 0) goto <D.22107>; else goto <D.22108>;
    <D.22107>:
    printf ("Restoring :");
    mono_print_ins (var);
    <D.22108>:
    adds = adds + 1;
    <D.22106>:
    D.22102 = var->flags;
    D.22109 = D.22102 | 16;
    var->flags = D.22109;
  }
  <D.22099>:
  ins = ins->next;
  <D.21905>:
  if (ins != 0B) goto <D.21904>; else goto <D.21906>;
  <D.21906>:
  bb = bb->next_bb;
  <D.21908>:
  if (bb != 0B) goto <D.21907>; else goto <D.21909>;
  <D.21909>:
  D.22110 = mono_jit_stats.alias_found;
  D.22111 = D.22110 + kills;
  mono_jit_stats.alias_found = D.22111;
  D.22112 = mono_jit_stats.alias_removed;
  D.22113 = kills - adds;
  D.22114 = D.22112 + D.22113;
  mono_jit_stats.alias_removed = D.22114;
  if (kills > adds) goto <D.22115>; else goto <D.22116>;
  <D.22115>:
  D.22088 = cfg->verbose_level;
  if (D.22088 > 2) goto <D.22117>; else goto <D.22118>;
  <D.22117>:
  D.22119 = cfg->method;
  D.22120 = mono_method_full_name (D.22119, 1);
  printf ("Method: %s\n", D.22120);
  printf ("Kills %d Adds %d\n", kills, adds);
  <D.22118>:
  D.22096 = 1;
  return D.22096;
  <D.22116>:
  D.22096 = 0;
  return D.22096;
}


