mono_local_alias_analysis (struct MonoCompile * cfg)
{
  unsigned char D.22352;
  unsigned char D.22353;
  unsigned int D.22356;
  int D.22359;
  unsigned int D.22361;
  unsigned int D.22362;
  int D.22365;
  void done = <<< error >>>;

  D.22352 = BIT_FIELD_REF <*cfg, 8, 5640>;
  D.22353 = D.22352 & 4;
  if (D.22353 == 0) goto <D.22354>; else goto <D.22355>;
  <D.22354>:
  return;
  <D.22355>:
  D.22356 = cfg->verbose_level;
  if (D.22356 > 2) goto <D.22357>; else goto <D.22358>;
  <D.22357>:
  mono_print_code (cfg, "BEFORE ALIAS_ANALYSIS");
  <D.22358>:
  D.22359 = lower_memory_access (cfg);
  if (D.22359 == 0) goto done; else goto <D.22360>;
  <D.22360>:
  D.22361 = cfg->opt;
  D.22362 = D.22361 & 64;
  if (D.22362 != 0) goto <D.22363>; else goto <D.22364>;
  <D.22363>:
  mono_local_deadce (cfg);
  <D.22364>:
  D.22365 = recompute_aliased_variables (cfg);
  if (D.22365 == 0) goto done; else goto <D.22366>;
  <D.22366>:
  mono_handle_global_vregs (cfg);
  D.22361 = cfg->opt;
  D.22362 = D.22361 & 64;
  if (D.22362 != 0) goto <D.22367>; else goto <D.22368>;
  <D.22367>:
  mono_local_deadce (cfg);
  <D.22368>:
  done:
  D.22356 = cfg->verbose_level;
  if (D.22356 > 2) goto <D.22369>; else goto <D.22370>;
  <D.22369>:
  mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
  <D.22370>:
}


lower_memory_access (struct MonoCompile * cfg)
{
  short unsigned int D.22372;
  int D.22373;
  int D.22374;
  long int D.22375;
  void * D.22376;
  unsigned int D.22377;
  int D.22380;
  long int D.22381;
  const void * D.22382;
  const void * D.22388;
  int D.22389;
  long int D.22394;
  int D.22401;
  int D.22408;
  int D.22415;
  gboolean D.22417;
  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.22326>;
  <D.22325>:
  monoeg_g_hash_table_remove_all (addr_loads);
  ins = bb->code;
  goto <D.22323>;
  <D.22322>:
  D.22372 = ins->opcode;
  D.22373 = (int) D.22372;
  switch (D.22373) <default: <D.22416>, case 314: <D.22296>, case 374: <D.22311>, case 375: <D.22312>, case 376: <D.22313>, case 377: <D.22314>, case 378: <D.22315>, case 379: <D.22316>, case 380: <D.22317>, case 384: <D.22319>, case 387: <D.22320>, case 388: <D.22321>, case 390: <D.22318>, case 391: <D.22300>, case 392: <D.22306>, case 393: <D.22301>, case 394: <D.22302>, case 395: <D.22303>, case 396: <D.22304>, case 397: <D.22305>, case 398: <D.22307>, case 399: <D.22308>, case 400: <D.22309>, case 403: <D.22299>, case 428: <D.22298>>
  <D.22296>:
  D.22374 = ins->dreg;
  D.22375 = (long int) D.22374;
  D.22376 = (void *) D.22375;
  monoeg_g_hash_table_insert_replace (addr_loads, D.22376, ins, 0);
  D.22377 = cfg->verbose_level;
  if (D.22377 > 2) goto <D.22378>; else goto <D.22379>;
  <D.22378>:
  printf ("New address: ");
  mono_print_ins (ins);
  <D.22379>:
  goto <D.22297>;
  <D.22298>:
  D.22380 = ins->sreg1;
  D.22381 = (long int) D.22380;
  D.22382 = (const void *) D.22381;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22382);
  if (tmp != 0B) goto <D.22383>; else goto <D.22384>;
  <D.22383>:
  D.22374 = ins->dreg;
  D.22375 = (long int) D.22374;
  D.22376 = (void *) D.22375;
  monoeg_g_hash_table_insert_replace (addr_loads, D.22376, tmp, 0);
  D.22377 = cfg->verbose_level;
  if (D.22377 > 2) goto <D.22385>; else goto <D.22386>;
  <D.22385>:
  printf ("New alias: ");
  mono_print_ins (ins);
  <D.22386>:
  goto <D.22387>;
  <D.22384>:
  D.22374 = ins->dreg;
  D.22375 = (long int) D.22374;
  D.22388 = (const void *) D.22375;
  D.22389 = monoeg_g_hash_table_remove (addr_loads, D.22388);
  if (D.22389 != 0) goto <D.22390>; else goto <D.22391>;
  <D.22390>:
  D.22377 = cfg->verbose_level;
  if (D.22377 > 2) goto <D.22392>; else goto <D.22393>;
  <D.22392>:
  printf ("Killed alias: ");
  mono_print_ins (ins);
  <D.22393>:
  <D.22391>:
  <D.22387>:
  goto <D.22297>;
  <D.22299>:
  <D.22300>:
  <D.22301>:
  <D.22302>:
  <D.22303>:
  <D.22304>:
  <D.22305>:
  <D.22306>:
  <D.22307>:
  <D.22308>:
  <D.22309>:
  D.22394 = ins->data.op[0].const_val;
  if (D.22394 != 0) goto <D.22395>; else goto <D.22396>;
  <D.22395>:
  // predicted unlikely by continue predictor.
  goto <D.22310>;
  <D.22396>:
  D.22380 = ins->sreg1;
  D.22381 = (long int) D.22380;
  D.22382 = (const void *) D.22381;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22382);
  if (tmp != 0B) goto <D.22397>; else goto <D.22398>;
  <D.22397>:
  D.22377 = cfg->verbose_level;
  if (D.22377 > 2) goto <D.22399>; else goto <D.22400>;
  <D.22399>:
  printf ("Found candidate load:");
  mono_print_ins (ins);
  <D.22400>:
  D.22401 = lower_load (cfg, ins, tmp);
  needs_dce = D.22401 | needs_dce;
  <D.22398>:
  goto <D.22297>;
  <D.22311>:
  <D.22312>:
  <D.22313>:
  <D.22314>:
  <D.22315>:
  <D.22316>:
  <D.22317>:
  <D.22318>:
  D.22394 = ins->data.op[0].const_val;
  if (D.22394 != 0) goto <D.22402>; else goto <D.22403>;
  <D.22402>:
  // predicted unlikely by continue predictor.
  goto <D.22310>;
  <D.22403>:
  D.22374 = ins->dreg;
  D.22375 = (long int) D.22374;
  D.22388 = (const void *) D.22375;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22388);
  if (tmp != 0B) goto <D.22404>; else goto <D.22405>;
  <D.22404>:
  D.22377 = cfg->verbose_level;
  if (D.22377 > 2) goto <D.22406>; else goto <D.22407>;
  <D.22406>:
  printf ("Found candidate store:");
  mono_print_ins (ins);
  <D.22407>:
  D.22408 = lower_store (cfg, ins, tmp);
  needs_dce = D.22408 | needs_dce;
  <D.22405>:
  goto <D.22297>;
  <D.22319>:
  <D.22320>:
  <D.22321>:
  D.22394 = ins->data.op[0].const_val;
  if (D.22394 != 0) goto <D.22409>; else goto <D.22410>;
  <D.22409>:
  // predicted unlikely by continue predictor.
  goto <D.22310>;
  <D.22410>:
  D.22374 = ins->dreg;
  D.22375 = (long int) D.22374;
  D.22388 = (const void *) D.22375;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22388);
  if (tmp != 0B) goto <D.22411>; else goto <D.22412>;
  <D.22411>:
  D.22377 = cfg->verbose_level;
  if (D.22377 > 2) goto <D.22413>; else goto <D.22414>;
  <D.22413>:
  printf ("Found candidate store-imm:");
  mono_print_ins (ins);
  <D.22414>:
  D.22415 = lower_store_imm (cfg, ins, tmp);
  needs_dce = D.22415 | needs_dce;
  <D.22412>:
  goto <D.22297>;
  <D.22416>:
  <D.22297>:
  <D.22310>:
  ins = ins->next;
  <D.22323>:
  if (ins != 0B) goto <D.22322>; else goto <D.22324>;
  <D.22324>:
  bb = bb->next_bb;
  <D.22326>:
  if (bb != 0B) goto <D.22325>; else goto <D.22327>;
  <D.22327>:
  monoeg_g_hash_table_destroy (addr_loads);
  D.22417 = needs_dce;
  return D.22417;
}


lower_load (struct MonoCompile * cfg, struct MonoInst * load, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22419;
  unsigned int D.22420;
  short unsigned int D.22421;
  struct MonoClass * D.22424;
  unsigned int D.22427;
  const char * D.22430;
  const char * D.22431;
  gboolean D.22432;
  int D.22433;
  const char * D.22438;
  const char * D.22439;
  unsigned int D.22442;
  short unsigned int D.22443;
  int D.22444;
  int D.22445;
  int D.22446;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22419 = var->klass;
  type = &D.22419->byval_arg;
  D.22420 = mono_type_to_load_membase (cfg, type);
  replaced_op = (int) D.22420;
  D.22421 = load->opcode;
  if (D.22421 == 403) goto <D.22422>; else goto <D.22423>;
  <D.22422>:
  D.22424 = load->klass;
  D.22419 = var->klass;
  if (D.22424 != D.22419) goto <D.22425>; else goto <D.22426>;
  <D.22425>:
  D.22427 = cfg->verbose_level;
  if (D.22427 > 2) goto <D.22428>; else goto <D.22429>;
  <D.22428>:
  D.22419 = var->klass;
  D.22430 = D.22419->name;
  D.22424 = load->klass;
  D.22431 = D.22424->name;
  printf ("Incompatible load_vtype classes %s x %s\n", D.22431, D.22430);
  <D.22429>:
  D.22432 = 0;
  return D.22432;
  <D.22426>:
  <D.22423>:
  D.22421 = load->opcode;
  D.22433 = (int) D.22421;
  if (D.22433 != replaced_op) goto <D.22434>; else goto <D.22435>;
  <D.22434>:
  D.22427 = cfg->verbose_level;
  if (D.22427 > 2) goto <D.22436>; else goto <D.22437>;
  <D.22436>:
  D.22421 = load->opcode;
  D.22433 = (int) D.22421;
  D.22438 = mono_inst_name (D.22433);
  D.22439 = mono_inst_name (replaced_op);
  printf ("Incompatible load type: expected %s but got %s\n", D.22439, D.22438);
  <D.22437>:
  D.22432 = 0;
  return D.22432;
  <D.22435>:
  D.22427 = cfg->verbose_level;
  if (D.22427 > 2) goto <D.22440>; else goto <D.22441>;
  <D.22440>:
  printf ("mem2reg replacing: ");
  mono_print_ins (load);
  <D.22441>:
  D.22442 = mono_type_to_regmove (cfg, type);
  D.22443 = (short unsigned int) D.22442;
  load->opcode = D.22443;
  type_to_eval_stack_type (cfg, type, load);
  D.22444 = var->dreg;
  load->sreg1 = D.22444;
  D.22445 = mono_jit_stats.loads_eliminated;
  D.22446 = D.22445 + 1;
  mono_jit_stats.loads_eliminated = D.22446;
  D.22432 = 1;
  return D.22432;
}


lower_store (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22448;
  unsigned int D.22449;
  short unsigned int D.22450;
  struct MonoClass * D.22453;
  unsigned int D.22456;
  const char * D.22459;
  gboolean D.22460;
  int D.22461;
  const char * D.22466;
  const char * D.22467;
  unsigned int D.22470;
  short unsigned int D.22471;
  int D.22472;
  int D.22473;
  int D.22474;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22448 = var->klass;
  type = &D.22448->byval_arg;
  D.22449 = mono_type_to_store_membase (cfg, type);
  replaced_op = (int) D.22449;
  D.22450 = store->opcode;
  if (D.22450 == 390) goto <D.22451>; else goto <D.22452>;
  <D.22451>:
  D.22453 = store->klass;
  D.22448 = var->klass;
  if (D.22453 != D.22448) goto <D.22454>; else goto <D.22455>;
  <D.22454>:
  D.22456 = cfg->verbose_level;
  if (D.22456 > 2) goto <D.22457>; else goto <D.22458>;
  <D.22457>:
  D.22453 = store->klass;
  D.22459 = D.22453->name;
  D.22453 = store->klass;
  D.22459 = D.22453->name;
  printf ("Incompatible store_vtype classes %s x %s\n", D.22459, D.22459);
  <D.22458>:
  D.22460 = 0;
  return D.22460;
  <D.22455>:
  <D.22452>:
  D.22450 = store->opcode;
  D.22461 = (int) D.22450;
  if (D.22461 != replaced_op) goto <D.22462>; else goto <D.22463>;
  <D.22462>:
  D.22456 = cfg->verbose_level;
  if (D.22456 > 2) goto <D.22464>; else goto <D.22465>;
  <D.22464>:
  D.22450 = store->opcode;
  D.22461 = (int) D.22450;
  D.22466 = mono_inst_name (D.22461);
  D.22467 = mono_inst_name (replaced_op);
  printf ("Incompatible store_reg type: expected %s but got %s\n", D.22467, D.22466);
  <D.22465>:
  D.22460 = 0;
  return D.22460;
  <D.22463>:
  D.22456 = cfg->verbose_level;
  if (D.22456 > 2) goto <D.22468>; else goto <D.22469>;
  <D.22468>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22469>:
  D.22470 = mono_type_to_regmove (cfg, type);
  D.22471 = (short unsigned int) D.22470;
  store->opcode = D.22471;
  type_to_eval_stack_type (cfg, type, store);
  D.22472 = var->dreg;
  store->dreg = D.22472;
  D.22473 = mono_jit_stats.stores_eliminated;
  D.22474 = D.22473 + 1;
  mono_jit_stats.stores_eliminated = D.22474;
  D.22460 = 1;
  return D.22460;
}


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

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


lower_store_imm (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22478;
  unsigned int D.22479;
  unsigned int store_op.0;
  unsigned int D.22481;
  gboolean D.22484;
  short unsigned int D.22485;
  int D.22486;
  unsigned char D.22487;
  int D.22488;
  int D.22489;
  unsigned int D.22492;
  int D.22497;
  long int D.22498;
  int D.22499;
  int D.22506;
  int D.22507;
  struct MonoInst * var;
  struct MonoType * type;
  int store_op;

  var = ldaddr->data.op[0].p;
  D.22478 = var->klass;
  type = &D.22478->byval_arg;
  D.22479 = mono_type_to_store_membase (cfg, type);
  store_op = (int) D.22479;
  store_op.0 = (unsigned int) store_op;
  D.22481 = store_op.0 + 4294966907;
  if (D.22481 <= 1) goto <D.22482>; else goto <D.22483>;
  <D.22482>:
  D.22484 = 0;
  return D.22484;
  <D.22483>:
  D.22485 = store->opcode;
  D.22486 = (int) D.22485;
  switch (D.22486) <default: <D.22287>, case 384: <D.22285>, case 387: <D.22283>, case 388: <D.22286>>
  <D.22283>:
  D.22487 = var->type;
  D.22488 = (int) D.22487;
  D.22489 = is_int_stack_size (D.22488);
  if (D.22489 == 0) goto <D.22490>; else goto <D.22491>;
  <D.22490>:
  D.22492 = cfg->verbose_level;
  if (D.22492 > 2) goto <D.22493>; else goto <D.22494>;
  <D.22493>:
  printf ("Incompatible variable of size != 4\n");
  <D.22494>:
  D.22484 = 0;
  return D.22484;
  <D.22491>:
  D.22492 = cfg->verbose_level;
  if (D.22492 > 2) goto <D.22495>; else goto <D.22496>;
  <D.22495>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22496>:
  store->opcode = 362;
  store->type = 1;
  D.22497 = var->dreg;
  store->dreg = D.22497;
  D.22498 = store->data.op[1].const_val;
  store->data.op[0].const_val = D.22498;
  goto <D.22284>;
  <D.22285>:
  <D.22286>:
  D.22487 = var->type;
  D.22488 = (int) D.22487;
  D.22499 = is_long_stack_size (D.22488);
  if (D.22499 == 0) goto <D.22500>; else goto <D.22501>;
  <D.22500>:
  D.22492 = cfg->verbose_level;
  if (D.22492 > 2) goto <D.22502>; else goto <D.22503>;
  <D.22502>:
  printf ("Incompatible variable of size != 8\n");
  <D.22503>:
  D.22484 = 0;
  return D.22484;
  <D.22501>:
  D.22492 = cfg->verbose_level;
  if (D.22492 > 2) goto <D.22504>; else goto <D.22505>;
  <D.22504>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22505>:
  store->opcode = 363;
  store->type = 2;
  D.22497 = var->dreg;
  store->dreg = D.22497;
  D.22498 = store->data.op[1].const_val;
  store->data.i8const = D.22498;
  goto <D.22284>;
  <D.22287>:
  D.22484 = 0;
  return D.22484;
  <D.22284>:
  D.22506 = mono_jit_stats.stores_eliminated;
  D.22507 = D.22506 + 1;
  mono_jit_stats.stores_eliminated = D.22507;
  D.22484 = 1;
  return D.22484;
}


is_int_stack_size (int type)
{
  gboolean D.22509;
  _Bool D.22510;

  D.22510 = type == 1;
  D.22509 = (gboolean) D.22510;
  return D.22509;
}


is_long_stack_size (int type)
{
  gboolean D.22512;
  _Bool D.22513;
  _Bool D.22514;
  _Bool D.22515;

  D.22513 = type == 2;
  D.22514 = type == 5;
  D.22515 = D.22513 | D.22514;
  D.22512 = (gboolean) D.22515;
  return D.22512;
}


recompute_aliased_variables (struct MonoCompile * cfg)
{
  struct MonoInst * * D.22517;
  long unsigned int D.22518;
  long unsigned int D.22519;
  struct MonoInst * * D.22520;
  unsigned char D.22521;
  int D.22522;
  int D.22523;
  unsigned int D.22526;
  unsigned char D.22529;
  unsigned int i.1;
  unsigned int D.22531;
  gboolean D.22534;
  short unsigned int D.22535;
  unsigned char D.22540;
  int D.22541;
  int D.22542;
  unsigned char D.22547;
  int D.22548;
  int D.22549;
  int D.22550;
  int D.22551;
  int D.22552;
  struct MonoMethod * D.22557;
  char * D.22558;
  int i;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int kills;
  int adds;

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

    D.22517 = cfg->varinfo;
    D.22518 = (long unsigned int) i;
    D.22519 = D.22518 * 8;
    D.22520 = D.22517 + D.22519;
    var = *D.22520;
    D.22521 = var->flags;
    D.22522 = (int) D.22521;
    D.22523 = D.22522 & 16;
    if (D.22523 != 0) goto <D.22524>; else goto <D.22525>;
    <D.22524>:
    D.22526 = cfg->verbose_level;
    if (D.22526 > 2) goto <D.22527>; else goto <D.22528>;
    <D.22527>:
    printf ("Killing :");
    mono_print_ins (var);
    <D.22528>:
    kills = kills + 1;
    <D.22525>:
    D.22521 = var->flags;
    D.22529 = D.22521 & 239;
    var->flags = D.22529;
  }
  i = i + 1;
  <D.22338>:
  i.1 = (unsigned int) i;
  D.22531 = cfg->num_varinfo;
  if (i.1 < D.22531) goto <D.22337>; else goto <D.22339>;
  <D.22339>:
  if (kills == 0) goto <D.22532>; else goto <D.22533>;
  <D.22532>:
  D.22534 = 0;
  return D.22534;
  <D.22533>:
  bb = cfg->bb_entry;
  goto <D.22345>;
  <D.22344>:
  ins = bb->code;
  goto <D.22342>;
  <D.22341>:
  D.22535 = ins->opcode;
  if (D.22535 == 314) goto <D.22536>; else goto <D.22537>;
  <D.22536>:
  {
    struct MonoInst * var;

    D.22526 = cfg->verbose_level;
    if (D.22526 > 2) goto <D.22538>; else goto <D.22539>;
    <D.22538>:
    printf ("Found op :");
    mono_print_ins (ins);
    <D.22539>:
    var = ins->data.op[0].p;
    D.22540 = var->flags;
    D.22541 = (int) D.22540;
    D.22542 = D.22541 & 16;
    if (D.22542 == 0) goto <D.22543>; else goto <D.22544>;
    <D.22543>:
    D.22526 = cfg->verbose_level;
    if (D.22526 != 0) goto <D.22545>; else goto <D.22546>;
    <D.22545>:
    printf ("Restoring :");
    mono_print_ins (var);
    <D.22546>:
    adds = adds + 1;
    <D.22544>:
    D.22540 = var->flags;
    D.22547 = D.22540 | 16;
    var->flags = D.22547;
  }
  <D.22537>:
  ins = ins->next;
  <D.22342>:
  if (ins != 0B) goto <D.22341>; else goto <D.22343>;
  <D.22343>:
  bb = bb->next_bb;
  <D.22345>:
  if (bb != 0B) goto <D.22344>; else goto <D.22346>;
  <D.22346>:
  D.22548 = mono_jit_stats.alias_found;
  D.22549 = D.22548 + kills;
  mono_jit_stats.alias_found = D.22549;
  D.22550 = mono_jit_stats.alias_removed;
  D.22551 = kills - adds;
  D.22552 = D.22550 + D.22551;
  mono_jit_stats.alias_removed = D.22552;
  if (kills > adds) goto <D.22553>; else goto <D.22554>;
  <D.22553>:
  D.22526 = cfg->verbose_level;
  if (D.22526 > 2) goto <D.22555>; else goto <D.22556>;
  <D.22555>:
  D.22557 = cfg->method;
  D.22558 = mono_method_full_name (D.22557, 1);
  printf ("Method: %s\n", D.22558);
  printf ("Kills %d Adds %d\n", kills, adds);
  <D.22556>:
  D.22534 = 1;
  return D.22534;
  <D.22554>:
  D.22534 = 0;
  return D.22534;
}


