__attribute__((visibility ("hidden")))
mono_local_alias_analysis (struct MonoCompile * cfg)
{
  long unsigned int D.22272;
  long unsigned int D.22273;
  unsigned int D.22276;
  int D.22279;
  unsigned int D.22281;
  unsigned int D.22282;
  int D.22285;
  void done = <<< error >>>;

  D.22272 = BIT_FIELD_REF <*cfg, 64, 5632>;
  D.22273 = D.22272 & 9007199254740992;
  if (D.22273 == 0) goto <D.22274>; else goto <D.22275>;
  <D.22274>:
  return;
  <D.22275>:
  D.22276 = cfg->verbose_level;
  if (D.22276 > 2) goto <D.22277>; else goto <D.22278>;
  <D.22277>:
  mono_print_code (cfg, "BEFORE ALIAS_ANALYSIS");
  <D.22278>:
  D.22279 = lower_memory_access (cfg);
  if (D.22279 == 0) goto done; else goto <D.22280>;
  <D.22280>:
  D.22281 = cfg->opt;
  D.22282 = D.22281 & 64;
  if (D.22282 != 0) goto <D.22283>; else goto <D.22284>;
  <D.22283>:
  mono_local_deadce (cfg);
  <D.22284>:
  D.22285 = recompute_aliased_variables (cfg);
  if (D.22285 == 0) goto done; else goto <D.22286>;
  <D.22286>:
  mono_handle_global_vregs (cfg);
  D.22281 = cfg->opt;
  D.22282 = D.22281 & 64;
  if (D.22282 != 0) goto <D.22287>; else goto <D.22288>;
  <D.22287>:
  mono_local_deadce (cfg);
  <D.22288>:
  done:
  D.22276 = cfg->verbose_level;
  if (D.22276 > 2) goto <D.22289>; else goto <D.22290>;
  <D.22289>:
  mono_print_code (cfg, "AFTER ALIAS_ANALYSIS");
  <D.22290>:
}


lower_memory_access (struct MonoCompile * cfg)
{
  short unsigned int D.22292;
  int D.22293;
  int D.22294;
  long int D.22295;
  void * D.22296;
  unsigned int D.22297;
  int D.22300;
  long int D.22301;
  const void * D.22302;
  const void * D.22308;
  int D.22309;
  long int D.22314;
  int D.22321;
  int D.22328;
  int D.22335;
  gboolean D.22337;
  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.22246>;
  <D.22245>:
  monoeg_g_hash_table_remove_all (addr_loads);
  ins = bb->code;
  goto <D.22243>;
  <D.22242>:
  D.22292 = ins->opcode;
  D.22293 = (int) D.22292;
  switch (D.22293) <default: <D.22336>, case 314: <D.22216>, case 374: <D.22231>, case 375: <D.22232>, case 376: <D.22233>, case 377: <D.22234>, case 378: <D.22235>, case 379: <D.22236>, case 380: <D.22237>, case 381: <D.22239>, case 384: <D.22240>, case 385: <D.22241>, case 387: <D.22238>, case 388: <D.22220>, case 389: <D.22226>, case 390: <D.22221>, case 391: <D.22222>, case 392: <D.22223>, case 393: <D.22224>, case 394: <D.22225>, case 395: <D.22227>, case 396: <D.22228>, case 397: <D.22229>, case 399: <D.22219>, case 424: <D.22218>>
  <D.22216>:
  D.22294 = ins->dreg;
  D.22295 = (long int) D.22294;
  D.22296 = (void *) D.22295;
  monoeg_g_hash_table_insert_replace (addr_loads, D.22296, ins, 0);
  D.22297 = cfg->verbose_level;
  if (D.22297 > 2) goto <D.22298>; else goto <D.22299>;
  <D.22298>:
  printf ("New address: ");
  mono_print_ins (ins);
  <D.22299>:
  goto <D.22217>;
  <D.22218>:
  D.22300 = ins->sreg1;
  D.22301 = (long int) D.22300;
  D.22302 = (const void *) D.22301;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22302);
  if (tmp != 0B) goto <D.22303>; else goto <D.22304>;
  <D.22303>:
  D.22294 = ins->dreg;
  D.22295 = (long int) D.22294;
  D.22296 = (void *) D.22295;
  monoeg_g_hash_table_insert_replace (addr_loads, D.22296, tmp, 0);
  D.22297 = cfg->verbose_level;
  if (D.22297 > 2) goto <D.22305>; else goto <D.22306>;
  <D.22305>:
  printf ("New alias: ");
  mono_print_ins (ins);
  <D.22306>:
  goto <D.22307>;
  <D.22304>:
  D.22294 = ins->dreg;
  D.22295 = (long int) D.22294;
  D.22308 = (const void *) D.22295;
  D.22309 = monoeg_g_hash_table_remove (addr_loads, D.22308);
  if (D.22309 != 0) goto <D.22310>; else goto <D.22311>;
  <D.22310>:
  D.22297 = cfg->verbose_level;
  if (D.22297 > 2) goto <D.22312>; else goto <D.22313>;
  <D.22312>:
  printf ("Killed alias: ");
  mono_print_ins (ins);
  <D.22313>:
  <D.22311>:
  <D.22307>:
  goto <D.22217>;
  <D.22219>:
  <D.22220>:
  <D.22221>:
  <D.22222>:
  <D.22223>:
  <D.22224>:
  <D.22225>:
  <D.22226>:
  <D.22227>:
  <D.22228>:
  <D.22229>:
  D.22314 = ins->data.op[0].const_val;
  if (D.22314 != 0) goto <D.22315>; else goto <D.22316>;
  <D.22315>:
  // predicted unlikely by continue predictor.
  goto <D.22230>;
  <D.22316>:
  D.22300 = ins->sreg1;
  D.22301 = (long int) D.22300;
  D.22302 = (const void *) D.22301;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22302);
  if (tmp != 0B) goto <D.22317>; else goto <D.22318>;
  <D.22317>:
  D.22297 = cfg->verbose_level;
  if (D.22297 > 2) goto <D.22319>; else goto <D.22320>;
  <D.22319>:
  printf ("Found candidate load:");
  mono_print_ins (ins);
  <D.22320>:
  D.22321 = lower_load (cfg, ins, tmp);
  needs_dce = D.22321 | needs_dce;
  <D.22318>:
  goto <D.22217>;
  <D.22231>:
  <D.22232>:
  <D.22233>:
  <D.22234>:
  <D.22235>:
  <D.22236>:
  <D.22237>:
  <D.22238>:
  D.22314 = ins->data.op[0].const_val;
  if (D.22314 != 0) goto <D.22322>; else goto <D.22323>;
  <D.22322>:
  // predicted unlikely by continue predictor.
  goto <D.22230>;
  <D.22323>:
  D.22294 = ins->dreg;
  D.22295 = (long int) D.22294;
  D.22308 = (const void *) D.22295;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22308);
  if (tmp != 0B) goto <D.22324>; else goto <D.22325>;
  <D.22324>:
  D.22297 = cfg->verbose_level;
  if (D.22297 > 2) goto <D.22326>; else goto <D.22327>;
  <D.22326>:
  printf ("Found candidate store:");
  mono_print_ins (ins);
  <D.22327>:
  D.22328 = lower_store (cfg, ins, tmp);
  needs_dce = D.22328 | needs_dce;
  <D.22325>:
  goto <D.22217>;
  <D.22239>:
  <D.22240>:
  <D.22241>:
  D.22314 = ins->data.op[0].const_val;
  if (D.22314 != 0) goto <D.22329>; else goto <D.22330>;
  <D.22329>:
  // predicted unlikely by continue predictor.
  goto <D.22230>;
  <D.22330>:
  D.22294 = ins->dreg;
  D.22295 = (long int) D.22294;
  D.22308 = (const void *) D.22295;
  tmp = monoeg_g_hash_table_lookup (addr_loads, D.22308);
  if (tmp != 0B) goto <D.22331>; else goto <D.22332>;
  <D.22331>:
  D.22297 = cfg->verbose_level;
  if (D.22297 > 2) goto <D.22333>; else goto <D.22334>;
  <D.22333>:
  printf ("Found candidate store-imm:");
  mono_print_ins (ins);
  <D.22334>:
  D.22335 = lower_store_imm (cfg, ins, tmp);
  needs_dce = D.22335 | needs_dce;
  <D.22332>:
  goto <D.22217>;
  <D.22336>:
  <D.22217>:
  <D.22230>:
  ins = ins->next;
  <D.22243>:
  if (ins != 0B) goto <D.22242>; else goto <D.22244>;
  <D.22244>:
  bb = bb->next_bb;
  <D.22246>:
  if (bb != 0B) goto <D.22245>; else goto <D.22247>;
  <D.22247>:
  monoeg_g_hash_table_destroy (addr_loads);
  D.22337 = needs_dce;
  return D.22337;
}


lower_load (struct MonoCompile * cfg, struct MonoInst * load, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22339;
  unsigned int D.22340;
  short unsigned int D.22341;
  struct MonoClass * D.22344;
  unsigned int D.22347;
  const char * D.22350;
  const char * D.22351;
  gboolean D.22352;
  int D.22353;
  const char * D.22358;
  const char * D.22359;
  unsigned int D.22362;
  short unsigned int D.22363;
  int D.22364;
  int D.22365;
  int D.22366;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22339 = var->klass;
  type = &D.22339->byval_arg;
  D.22340 = mono_type_to_load_membase (cfg, type);
  replaced_op = (int) D.22340;
  D.22341 = load->opcode;
  if (D.22341 == 399) goto <D.22342>; else goto <D.22343>;
  <D.22342>:
  D.22344 = load->klass;
  D.22339 = var->klass;
  if (D.22344 != D.22339) goto <D.22345>; else goto <D.22346>;
  <D.22345>:
  D.22347 = cfg->verbose_level;
  if (D.22347 > 2) goto <D.22348>; else goto <D.22349>;
  <D.22348>:
  D.22344 = load->klass;
  D.22350 = D.22344->name;
  D.22339 = var->klass;
  D.22351 = D.22339->name;
  printf ("Incompatible load_vtype classes %s x %s\n", D.22350, D.22351);
  <D.22349>:
  D.22352 = 0;
  return D.22352;
  <D.22346>:
  <D.22343>:
  D.22341 = load->opcode;
  D.22353 = (int) D.22341;
  if (D.22353 != replaced_op) goto <D.22354>; else goto <D.22355>;
  <D.22354>:
  D.22347 = cfg->verbose_level;
  if (D.22347 > 2) goto <D.22356>; else goto <D.22357>;
  <D.22356>:
  D.22358 = mono_inst_name (replaced_op);
  D.22341 = load->opcode;
  D.22353 = (int) D.22341;
  D.22359 = mono_inst_name (D.22353);
  printf ("Incompatible load type: expected %s but got %s\n", D.22358, D.22359);
  <D.22357>:
  D.22352 = 0;
  return D.22352;
  <D.22355>:
  D.22347 = cfg->verbose_level;
  if (D.22347 > 2) goto <D.22360>; else goto <D.22361>;
  <D.22360>:
  printf ("mem2reg replacing: ");
  mono_print_ins (load);
  <D.22361>:
  D.22362 = mono_type_to_regmove (cfg, type);
  D.22363 = (short unsigned int) D.22362;
  load->opcode = D.22363;
  type_to_eval_stack_type (cfg, type, load);
  D.22364 = var->dreg;
  load->sreg1 = D.22364;
  D.22365 = mono_jit_stats.loads_eliminated;
  D.22366 = D.22365 + 1;
  mono_jit_stats.loads_eliminated = D.22366;
  D.22352 = 1;
  return D.22352;
}


lower_store (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22368;
  unsigned int D.22369;
  short unsigned int D.22370;
  struct MonoClass * D.22373;
  unsigned int D.22376;
  const char * D.22379;
  gboolean D.22380;
  int D.22381;
  const char * D.22386;
  const char * D.22387;
  unsigned int D.22390;
  short unsigned int D.22391;
  int D.22392;
  int D.22393;
  int D.22394;
  struct MonoInst * var;
  struct MonoType * type;
  int replaced_op;

  var = ldaddr->data.op[0].p;
  D.22368 = var->klass;
  type = &D.22368->byval_arg;
  D.22369 = mono_type_to_store_membase (cfg, type);
  replaced_op = (int) D.22369;
  D.22370 = store->opcode;
  if (D.22370 == 387) goto <D.22371>; else goto <D.22372>;
  <D.22371>:
  D.22373 = store->klass;
  D.22368 = var->klass;
  if (D.22373 != D.22368) goto <D.22374>; else goto <D.22375>;
  <D.22374>:
  D.22376 = cfg->verbose_level;
  if (D.22376 > 2) goto <D.22377>; else goto <D.22378>;
  <D.22377>:
  D.22373 = store->klass;
  D.22379 = D.22373->name;
  D.22373 = store->klass;
  D.22379 = D.22373->name;
  printf ("Incompatible store_vtype classes %s x %s\n", D.22379, D.22379);
  <D.22378>:
  D.22380 = 0;
  return D.22380;
  <D.22375>:
  <D.22372>:
  D.22370 = store->opcode;
  D.22381 = (int) D.22370;
  if (D.22381 != replaced_op) goto <D.22382>; else goto <D.22383>;
  <D.22382>:
  D.22376 = cfg->verbose_level;
  if (D.22376 > 2) goto <D.22384>; else goto <D.22385>;
  <D.22384>:
  D.22386 = mono_inst_name (replaced_op);
  D.22370 = store->opcode;
  D.22381 = (int) D.22370;
  D.22387 = mono_inst_name (D.22381);
  printf ("Incompatible store_reg type: expected %s but got %s\n", D.22386, D.22387);
  <D.22385>:
  D.22380 = 0;
  return D.22380;
  <D.22383>:
  D.22376 = cfg->verbose_level;
  if (D.22376 > 2) goto <D.22388>; else goto <D.22389>;
  <D.22388>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22389>:
  D.22390 = mono_type_to_regmove (cfg, type);
  D.22391 = (short unsigned int) D.22390;
  store->opcode = D.22391;
  type_to_eval_stack_type (cfg, type, store);
  D.22392 = var->dreg;
  store->dreg = D.22392;
  D.22393 = mono_jit_stats.stores_eliminated;
  D.22394 = D.22393 + 1;
  mono_jit_stats.stores_eliminated = D.22394;
  D.22380 = 1;
  return D.22380;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__))
printf (const char * restrict __fmt)
{
  int D.22396;

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


lower_store_imm (struct MonoCompile * cfg, struct MonoInst * store, struct MonoInst * ldaddr)
{
  struct MonoClass * D.22398;
  unsigned int D.22399;
  unsigned int store_op.0;
  unsigned int D.22401;
  gboolean D.22404;
  short unsigned int D.22405;
  int D.22406;
  unsigned char D.22407;
  int D.22408;
  int D.22409;
  unsigned int D.22412;
  int D.22417;
  long int D.22418;
  int D.22419;
  int D.22426;
  int D.22427;
  struct MonoInst * var;
  struct MonoType * type;
  int store_op;

  var = ldaddr->data.op[0].p;
  D.22398 = var->klass;
  type = &D.22398->byval_arg;
  D.22399 = mono_type_to_store_membase (cfg, type);
  store_op = (int) D.22399;
  store_op.0 = (unsigned int) store_op;
  D.22401 = store_op.0 + 4294966910;
  if (D.22401 <= 1) goto <D.22402>; else goto <D.22403>;
  <D.22402>:
  D.22404 = 0;
  return D.22404;
  <D.22403>:
  D.22405 = store->opcode;
  D.22406 = (int) D.22405;
  switch (D.22406) <default: <D.22207>, case 381: <D.22205>, case 384: <D.22203>, case 385: <D.22206>>
  <D.22203>:
  D.22407 = var->type;
  D.22408 = (int) D.22407;
  D.22409 = is_int_stack_size (D.22408);
  if (D.22409 == 0) goto <D.22410>; else goto <D.22411>;
  <D.22410>:
  D.22412 = cfg->verbose_level;
  if (D.22412 > 2) goto <D.22413>; else goto <D.22414>;
  <D.22413>:
  printf ("Incompatible variable of size != 4\n");
  <D.22414>:
  D.22404 = 0;
  return D.22404;
  <D.22411>:
  D.22412 = cfg->verbose_level;
  if (D.22412 > 2) goto <D.22415>; else goto <D.22416>;
  <D.22415>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22416>:
  store->opcode = 362;
  store->type = 1;
  D.22417 = var->dreg;
  store->dreg = D.22417;
  D.22418 = store->data.op[1].const_val;
  store->data.op[0].const_val = D.22418;
  goto <D.22204>;
  <D.22205>:
  <D.22206>:
  D.22407 = var->type;
  D.22408 = (int) D.22407;
  D.22419 = is_long_stack_size (D.22408);
  if (D.22419 == 0) goto <D.22420>; else goto <D.22421>;
  <D.22420>:
  D.22412 = cfg->verbose_level;
  if (D.22412 > 2) goto <D.22422>; else goto <D.22423>;
  <D.22422>:
  printf ("Incompatible variable of size != 8\n");
  <D.22423>:
  D.22404 = 0;
  return D.22404;
  <D.22421>:
  D.22412 = cfg->verbose_level;
  if (D.22412 > 2) goto <D.22424>; else goto <D.22425>;
  <D.22424>:
  printf ("mem2reg replacing: ");
  mono_print_ins (store);
  <D.22425>:
  store->opcode = 363;
  store->type = 2;
  D.22417 = var->dreg;
  store->dreg = D.22417;
  D.22418 = store->data.op[1].const_val;
  store->data.i8const = D.22418;
  goto <D.22204>;
  <D.22207>:
  D.22404 = 0;
  return D.22404;
  <D.22204>:
  D.22426 = mono_jit_stats.stores_eliminated;
  D.22427 = D.22426 + 1;
  mono_jit_stats.stores_eliminated = D.22427;
  D.22404 = 1;
  return D.22404;
}


is_int_stack_size (int type)
{
  gboolean D.22429;
  _Bool D.22430;

  D.22430 = type == 1;
  D.22429 = (gboolean) D.22430;
  return D.22429;
}


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

  if (type == 2) goto <D.22434>; else goto <D.22437>;
  <D.22437>:
  if (type == 5) goto <D.22434>; else goto <D.22435>;
  <D.22434>:
  iftmp.1 = 1;
  goto <D.22436>;
  <D.22435>:
  iftmp.1 = 0;
  <D.22436>:
  D.22432 = iftmp.1;
  return D.22432;
}


recompute_aliased_variables (struct MonoCompile * cfg)
{
  struct MonoInst * * D.22439;
  long unsigned int D.22440;
  long unsigned int D.22441;
  struct MonoInst * * D.22442;
  unsigned char D.22443;
  int D.22444;
  int D.22445;
  unsigned int D.22448;
  unsigned char D.22451;
  unsigned int D.22452;
  unsigned int i.2;
  gboolean D.22456;
  short unsigned int D.22457;
  unsigned char D.22462;
  int D.22463;
  int D.22464;
  unsigned char D.22469;
  int D.22470;
  int D.22471;
  int D.22472;
  int D.22473;
  int D.22474;
  struct MonoMethod * D.22479;
  char * D.22480;
  int i;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int kills;
  int adds;

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

    D.22439 = cfg->varinfo;
    D.22440 = (long unsigned int) i;
    D.22441 = D.22440 * 8;
    D.22442 = D.22439 + D.22441;
    var = *D.22442;
    D.22443 = var->flags;
    D.22444 = (int) D.22443;
    D.22445 = D.22444 & 16;
    if (D.22445 != 0) goto <D.22446>; else goto <D.22447>;
    <D.22446>:
    D.22448 = cfg->verbose_level;
    if (D.22448 > 2) goto <D.22449>; else goto <D.22450>;
    <D.22449>:
    printf ("Killing :");
    mono_print_ins (var);
    <D.22450>:
    kills = kills + 1;
    <D.22447>:
    D.22443 = var->flags;
    D.22451 = D.22443 & 239;
    var->flags = D.22451;
  }
  i = i + 1;
  <D.22258>:
  D.22452 = cfg->num_varinfo;
  i.2 = (unsigned int) i;
  if (D.22452 > i.2) goto <D.22257>; else goto <D.22259>;
  <D.22259>:
  if (kills == 0) goto <D.22454>; else goto <D.22455>;
  <D.22454>:
  D.22456 = 0;
  return D.22456;
  <D.22455>:
  bb = cfg->bb_entry;
  goto <D.22265>;
  <D.22264>:
  ins = bb->code;
  goto <D.22262>;
  <D.22261>:
  D.22457 = ins->opcode;
  if (D.22457 == 314) goto <D.22458>; else goto <D.22459>;
  <D.22458>:
  {
    struct MonoInst * var;

    D.22448 = cfg->verbose_level;
    if (D.22448 > 2) goto <D.22460>; else goto <D.22461>;
    <D.22460>:
    printf ("Found op :");
    mono_print_ins (ins);
    <D.22461>:
    var = ins->data.op[0].p;
    D.22462 = var->flags;
    D.22463 = (int) D.22462;
    D.22464 = D.22463 & 16;
    if (D.22464 == 0) goto <D.22465>; else goto <D.22466>;
    <D.22465>:
    D.22448 = cfg->verbose_level;
    if (D.22448 != 0) goto <D.22467>; else goto <D.22468>;
    <D.22467>:
    printf ("Restoring :");
    mono_print_ins (var);
    <D.22468>:
    adds = adds + 1;
    <D.22466>:
    D.22462 = var->flags;
    D.22469 = D.22462 | 16;
    var->flags = D.22469;
  }
  <D.22459>:
  ins = ins->next;
  <D.22262>:
  if (ins != 0B) goto <D.22261>; else goto <D.22263>;
  <D.22263>:
  bb = bb->next_bb;
  <D.22265>:
  if (bb != 0B) goto <D.22264>; else goto <D.22266>;
  <D.22266>:
  D.22470 = mono_jit_stats.alias_found;
  D.22471 = D.22470 + kills;
  mono_jit_stats.alias_found = D.22471;
  D.22472 = mono_jit_stats.alias_removed;
  D.22473 = kills - adds;
  D.22474 = D.22472 + D.22473;
  mono_jit_stats.alias_removed = D.22474;
  if (kills > adds) goto <D.22475>; else goto <D.22476>;
  <D.22475>:
  D.22448 = cfg->verbose_level;
  if (D.22448 > 2) goto <D.22477>; else goto <D.22478>;
  <D.22477>:
  D.22479 = cfg->method;
  D.22480 = mono_method_full_name (D.22479, 1);
  printf ("Method: %s\n", D.22480);
  printf ("Kills %d Adds %d\n", kills, adds);
  <D.22478>:
  D.22456 = 1;
  return D.22456;
  <D.22476>:
  D.22456 = 0;
  return D.22456;
}


