mono_ssa_compute (struct MonoCompile * cfg)
{
  unsigned int D.22263;
  unsigned int D.22264;
  unsigned int D.22265;
  unsigned int D.22266;
  _Bool D.22267;
  long int D.22268;
  long int D.22269;
  unsigned char D.22272;
  unsigned char D.22273;
  _Bool D.22274;
  long int D.22275;
  long int D.22276;
  unsigned int D.22279;
  unsigned int D.22282;
  unsigned int D.22283;
  unsigned int D.22286;
  unsigned int D.22287;
  unsigned int D.22288;
  unsigned int D.22289;
  unsigned int i.0;
  unsigned int D.22291;
  struct MonoMethodVar * D.22292;
  struct MonoBitSet * D.22293;
  sizetype bitsize.1;
  unsigned int i.2;
  struct MonoInst * * D.22296;
  unsigned int D.22297;
  struct MonoInst * * D.22298;
  struct MonoInst * D.22299;
  short unsigned int D.22300;
  struct MonoBitSet * D.22303;
  unsigned int D.22304;
  unsigned int D.22305;
  struct MonoBasicBlock * * D.22306;
  struct MonoBasicBlock * * D.22307;
  struct MonoBasicBlock * D.22308;
  short unsigned int D.22309;
  short unsigned int D.22312;
  int D.22315;
  unsigned int D.22316;
  unsigned int D.22317;
  struct MonoInst * * D.22320;
  unsigned int D.22321;
  unsigned int D.22322;
  struct MonoInst * * D.22323;
  struct MonoInst * D.22324;
  struct MonoInst * iftmp.3;
  int D.22331;
  unsigned int D.22332;
  unsigned int D.22333;
  struct MonoMethodVar * D.22334;
  struct MonoBitSet * D.22335;
  unsigned int D.22336;
  struct MonoInst * iftmp.4;
  int D.22341;
  unsigned int D.22342;
  unsigned int D.22343;
  struct MonoMethodVar * D.22344;
  struct MonoBitSet * D.22345;
  unsigned int D.22346;
  int D.22347;
  unsigned int D.22348;
  unsigned int D.22349;
  unsigned char D.22350;
  unsigned char D.22353;
  int D.22354;
  int D.22355;
  unsigned int D.22358;
  unsigned int D.22363;
  int D.22366;
  unsigned int idx.5;
  unsigned int D.22368;
  struct MonoBasicBlock * * D.22369;
  struct MonoBasicBlock * D.22370;
  struct MonoBitSet * D.22375;
  unsigned int D.22376;
  unsigned int D.22377;
  unsigned int D.22378;
  struct MonoMemPool * D.22381;
  int D.22382;
  int D.22383;
  int D.22384;
  guint16 iftmp.6;
  unsigned int D.22388;
  unsigned int D.22389;
  struct MonoClass * D.22391;
  unsigned char D.22392;
  unsigned char D.22393;
  struct MonoType * D.22396;
  unsigned char D.22397;
  unsigned char D.22398;
  struct MonoClass * D.22401;
  struct MonoBasicBlock * D.22403;
  short int D.22404;
  int D.22405;
  int D.22406;
  unsigned int D.22407;
  unsigned int D.22408;
  void * D.22409;
  int * D.22410;
  sizetype j.7;
  sizetype D.22412;
  sizetype D.22413;
  int * D.22414;
  int D.22415;
  struct MonoInst * D.22416;
  unsigned int idx.8;
  unsigned int D.22419;
  unsigned int D.22420;
  unsigned int stack_history_size.9;
  unsigned int D.22422;
  struct MonoBasicBlock * D.22423;
  int D.22424;
  unsigned int D.22427;
  int i;
  int j;
  int idx;
  int bitsize;
  struct MonoBitSet * set;
  struct MonoMethodVar * vinfo;
  struct MonoInst * ins;
  struct MonoInst * * stack;
  guint8 * buf;
  guint8 * buf_start;
  struct RenameInfo * stack_history;
  int stack_history_size;
  gboolean * originals;
  guint32 * lvreg_stack;
  gboolean * lvreg_defined;

  D.22263 = cfg->num_varinfo;
  D.22264 = D.22263 * 56;
  vinfo = monoeg_malloc0 (D.22264);
  D.22265 = cfg->comp_done;
  D.22266 = D.22265 & 32;
  D.22267 = D.22266 != 0;
  D.22268 = (long int) D.22267;
  D.22269 = __builtin_expect (D.22268, 0);
  if (D.22269 != 0) goto <D.22270>; else goto <D.22271>;
  <D.22270>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 342, "!(cfg->comp_done & MONO_COMP_SSA)");
  <D.22271>:
  D.22272 = BIT_FIELD_REF <*cfg, 8, 3392>;
  D.22273 = D.22272 & 2;
  D.22274 = D.22273 != 0;
  D.22275 = (long int) D.22274;
  D.22276 = __builtin_expect (D.22275, 0);
  if (D.22276 != 0) goto <D.22277>; else goto <D.22278>;
  <D.22277>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 344, "!cfg->disable_ssa");
  <D.22278>:
  D.22279 = cfg->verbose_level;
  if (D.22279 > 3) goto <D.22280>; else goto <D.22281>;
  <D.22280>:
  D.22282 = cfg->next_vreg;
  D.22263 = cfg->num_varinfo;
  printf ("\nCOMPUTE SSA %d (R%d-)\n\n", D.22263, D.22282);
  <D.22281>:
  D.22265 = cfg->comp_done;
  D.22283 = D.22265 & 16;
  if (D.22283 == 0) goto <D.22284>; else goto <D.22285>;
  <D.22284>:
  mono_analyze_liveness (cfg);
  <D.22285>:
  mono_compile_dominator_info (cfg, 7);
  D.22286 = cfg->num_bblocks;
  D.22287 = mono_bitset_alloc_size (D.22286, 0);
  bitsize = (int) D.22287;
  D.22286 = cfg->num_bblocks;
  D.22288 = mono_bitset_alloc_size (D.22286, 0);
  D.22263 = cfg->num_varinfo;
  D.22289 = D.22288 * D.22263;
  buf_start = monoeg_malloc0 (D.22289);
  buf = buf_start;
  i = 0;
  goto <D.21918>;
  <D.21917>:
  i.0 = (unsigned int) i;
  D.22291 = i.0 * 56;
  D.22292 = vinfo + D.22291;
  D.22286 = cfg->num_bblocks;
  D.22293 = mono_bitset_mem_new (buf, D.22286, 0);
  D.22292->def_in = D.22293;
  bitsize.1 = (sizetype) bitsize;
  buf = buf + bitsize.1;
  i.0 = (unsigned int) i;
  D.22291 = i.0 * 56;
  D.22292 = vinfo + D.22291;
  i.2 = (unsigned int) i;
  D.22292->idx = i.2;
  D.22296 = cfg->varinfo;
  i.0 = (unsigned int) i;
  D.22297 = i.0 * 4;
  D.22298 = D.22296 + D.22297;
  D.22299 = *D.22298;
  D.22300 = D.22299->opcode;
  if (D.22300 == 330) goto <D.22301>; else goto <D.22302>;
  <D.22301>:
  i.0 = (unsigned int) i;
  D.22291 = i.0 * 56;
  D.22292 = vinfo + D.22291;
  D.22303 = D.22292->def_in;
  i.0 = (unsigned int) i;
  D.22291 = i.0 * 56;
  D.22292 = vinfo + D.22291;
  D.22303 = D.22292->def_in;
  D.22304 = D.22303->data[0];
  D.22305 = D.22304 | 1;
  D.22303->data[0] = D.22305;
  <D.22302>:
  i = i + 1;
  <D.21918>:
  i.2 = (unsigned int) i;
  D.22263 = cfg->num_varinfo;
  if (i.2 < D.22263) goto <D.21917>; else goto <D.21919>;
  <D.21919>:
  i = 0;
  goto <D.21925>;
  <D.21924>:
  D.22306 = cfg->bblocks;
  i.0 = (unsigned int) i;
  D.22297 = i.0 * 4;
  D.22307 = D.22306 + D.22297;
  D.22308 = *D.22307;
  ins = D.22308->code;
  goto <D.21922>;
  <D.21921>:
  D.22309 = ins->opcode;
  if (D.22309 == 316) goto <D.22310>; else goto <D.22311>;
  <D.22310>:
  // predicted unlikely by continue predictor.
  goto <D.21920>;
  <D.22311>:
  D.22309 = ins->opcode;
  D.22312 = D.22309 + 65162;
  if (D.22312 > 16) goto <D.22313>; else goto <D.22314>;
  <D.22313>:
  D.22315 = ins->dreg;
  D.22316 = (unsigned int) D.22315;
  D.22317 = cfg->vreg_to_inst_len;
  if (D.22316 < D.22317) goto <D.22318>; else goto <D.22319>;
  <D.22318>:
  D.22320 = cfg->vreg_to_inst;
  D.22315 = ins->dreg;
  D.22321 = (unsigned int) D.22315;
  D.22322 = D.22321 * 4;
  D.22323 = D.22320 + D.22322;
  D.22324 = *D.22323;
  if (D.22324 != 0B) goto <D.22325>; else goto <D.22326>;
  <D.22325>:
  D.22315 = ins->dreg;
  D.22316 = (unsigned int) D.22315;
  D.22317 = cfg->vreg_to_inst_len;
  if (D.22316 < D.22317) goto <D.22328>; else goto <D.22329>;
  <D.22328>:
  D.22320 = cfg->vreg_to_inst;
  D.22315 = ins->dreg;
  D.22321 = (unsigned int) D.22315;
  D.22322 = D.22321 * 4;
  D.22323 = D.22320 + D.22322;
  iftmp.3 = *D.22323;
  goto <D.22330>;
  <D.22329>:
  iftmp.3 = 0B;
  <D.22330>:
  D.22331 = iftmp.3->data.op[0].const_val;
  D.22332 = (unsigned int) D.22331;
  D.22333 = D.22332 * 56;
  D.22334 = vinfo + D.22333;
  D.22335 = D.22334->def_in;
  i.0 = (unsigned int) i;
  D.22336 = i.0 / 32;
  D.22315 = ins->dreg;
  D.22316 = (unsigned int) D.22315;
  D.22317 = cfg->vreg_to_inst_len;
  if (D.22316 < D.22317) goto <D.22338>; else goto <D.22339>;
  <D.22338>:
  D.22320 = cfg->vreg_to_inst;
  D.22315 = ins->dreg;
  D.22321 = (unsigned int) D.22315;
  D.22322 = D.22321 * 4;
  D.22323 = D.22320 + D.22322;
  iftmp.4 = *D.22323;
  goto <D.22340>;
  <D.22339>:
  iftmp.4 = 0B;
  <D.22340>:
  D.22341 = iftmp.4->data.op[0].const_val;
  D.22342 = (unsigned int) D.22341;
  D.22343 = D.22342 * 56;
  D.22344 = vinfo + D.22343;
  D.22345 = D.22344->def_in;
  D.22346 = D.22345->data[D.22336];
  D.22347 = i & 31;
  D.22348 = 1 << D.22347;
  D.22349 = D.22346 | D.22348;
  D.22335->data[D.22336] = D.22349;
  <D.22326>:
  <D.22319>:
  <D.22314>:
  <D.21920>:
  ins = ins->next;
  <D.21922>:
  if (ins != 0B) goto <D.21921>; else goto <D.21923>;
  <D.21923>:
  i = i + 1;
  <D.21925>:
  i.2 = (unsigned int) i;
  D.22286 = cfg->num_bblocks;
  if (i.2 < D.22286) goto <D.21924>; else goto <D.21926>;
  <D.21926>:
  i = 0;
  goto <D.21946>;
  <D.21945>:
  {
    struct MonoInst * var;

    D.22296 = cfg->varinfo;
    i.0 = (unsigned int) i;
    D.22297 = i.0 * 4;
    D.22298 = D.22296 + D.22297;
    var = *D.22298;
    D.22350 = var->type;
    if (D.22350 == 2) goto <D.22351>; else goto <D.22352>;
    <D.22351>:
    // predicted unlikely by continue predictor.
    goto <D.21928>;
    <D.22352>:
    D.22353 = var->flags;
    D.22354 = (int) D.22353;
    D.22355 = D.22354 & 20;
    if (D.22355 != 0) goto <D.22356>; else goto <D.22357>;
    <D.22356>:
    // predicted unlikely by continue predictor.
    goto <D.21928>;
    <D.22357>:
    i.0 = (unsigned int) i;
    D.22291 = i.0 * 56;
    D.22292 = vinfo + D.22291;
    D.22303 = D.22292->def_in;
    D.22358 = mono_bitset_count (D.22303);
    if (D.22358 <= 1) goto <D.22359>; else goto <D.22360>;
    <D.22359>:
    // predicted unlikely by continue predictor.
    goto <D.21928>;
    <D.22360>:
    i.0 = (unsigned int) i;
    D.22291 = i.0 * 56;
    D.22292 = vinfo + D.22291;
    D.22303 = D.22292->def_in;
    set = mono_compile_iterated_dfrontier (cfg, D.22303);
    D.22279 = cfg->verbose_level;
    if (D.22279 > 3) goto <D.22361>; else goto <D.22362>;
    <D.22361>:
    D.22363 = mono_bitset_count (set);
    if (D.22363 != 0) goto <D.22364>; else goto <D.22365>;
    <D.22364>:
    D.22366 = var->dreg;
    printf ("\tR%d needs PHI functions in ", D.22366);
    mono_blockset_print (cfg, set, "", 4294967295);
    <D.22365>:
    <D.22362>:
    idx = mono_bitset_find_start (set);
    goto <D.21943>;
    <D.21942>:
    {
      struct MonoBasicBlock * bb;

      D.22306 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22368 = idx.5 * 4;
      D.22369 = D.22306 + D.22368;
      bb = *D.22369;
      D.22370 = cfg->bb_exit;
      if (D.22370 == bb) goto <D.22371>; else goto <D.22372>;
      <D.22371>:
      // predicted unlikely by continue predictor.
      goto <D.21930>;
      <D.22372>:
      D.22265 = cfg->comp_done;
      D.22283 = D.22265 & 16;
      if (D.22283 != 0) goto <D.22373>; else goto <D.22374>;
      <D.22373>:
      D.22375 = bb->live_in_set;
      i.0 = (unsigned int) i;
      D.22376 = i.0 / 32;
      D.22377 = D.22375->data[D.22376];
      D.22347 = i & 31;
      D.22348 = 1 << D.22347;
      D.22378 = D.22377 & D.22348;
      if (D.22378 == 0) goto <D.22379>; else goto <D.22380>;
      <D.22379>:
      // predicted unlikely by continue predictor.
      goto <D.21930>;
      <D.22380>:
      <D.22374>:
      D.22381 = cfg->mempool;
      ins = mono_mempool_alloc0 (D.22381, 48);
      ins->opcode = 319;
      ins->data.op[0].const_val = i;
      ins->sreg2 = -1;
      D.22382 = ins->sreg2;
      ins->sreg1 = D.22382;
      D.22383 = ins->sreg1;
      ins->dreg = D.22383;
      D.22350 = var->type;
      D.22384 = (int) D.22350;
      switch (D.22384) <default: <D.22395>, case 1: <D.21931>, case 2: <D.21932>, case 3: <D.21933>, case 4: <D.21937>, case 5: <D.21934>, case 6: <D.21935>, case 7: <D.21938>>
      <D.21931>:
      <D.21932>:
      <D.21933>:
      <D.21934>:
      <D.21935>:
      ins->opcode = 319;
      goto <D.21936>;
      <D.21937>:
      ins->opcode = 320;
      goto <D.21936>;
      <D.21938>:
      D.22388 = cfg->opt;
      D.22389 = D.22388 & 67108864;
      if (D.22389 != 0) goto <D.22390>; else goto <D.22386>;
      <D.22390>:
      D.22391 = var->klass;
      D.22392 = BIT_FIELD_REF <*D.22391, 8, 192>;
      D.22393 = D.22392 & 2;
      if (D.22393 != 0) goto <D.22394>; else goto <D.22386>;
      <D.22394>:
      iftmp.6 = 964;
      goto <D.22387>;
      <D.22386>:
      iftmp.6 = 321;
      <D.22387>:
      ins->opcode = iftmp.6;
      goto <D.21936>;
      <D.22395>:
      <D.21936>:
      D.22396 = var->data.op[1].vtype;
      D.22397 = BIT_FIELD_REF <*D.22396, 8, 56>;
      D.22398 = D.22397 & 64;
      if (D.22398 != 0) goto <D.22399>; else goto <D.22400>;
      <D.22399>:
      D.22401 = mono_defaults.int_class;
      ins->klass = D.22401;
      goto <D.22402>;
      <D.22400>:
      D.22391 = var->klass;
      ins->klass = D.22391;
      <D.22402>:
      D.22306 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22368 = idx.5 * 4;
      D.22369 = D.22306 + D.22368;
      D.22403 = *D.22369;
      D.22404 = D.22403->in_count;
      D.22405 = (int) D.22404;
      D.22406 = D.22405 + 1;
      D.22407 = (unsigned int) D.22406;
      D.22408 = D.22407 * 4;
      D.22381 = cfg->mempool;
      D.22409 = mono_mempool_alloc0 (D.22381, D.22408);
      ins->data.op[1].phi_args = D.22409;
      D.22410 = ins->data.op[1].phi_args;
      D.22306 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22368 = idx.5 * 4;
      D.22369 = D.22306 + D.22368;
      D.22403 = *D.22369;
      D.22404 = D.22403->in_count;
      D.22405 = (int) D.22404;
      *D.22410 = D.22405;
      j = 0;
      goto <D.21940>;
      <D.21939>:
      D.22410 = ins->data.op[1].phi_args;
      j.7 = (sizetype) j;
      D.22412 = j.7 + 1;
      D.22413 = D.22412 * 4;
      D.22414 = D.22410 + D.22413;
      *D.22414 = -1;
      j = j + 1;
      <D.21940>:
      D.22306 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22368 = idx.5 * 4;
      D.22369 = D.22306 + D.22368;
      D.22403 = *D.22369;
      D.22404 = D.22403->in_count;
      D.22405 = (int) D.22404;
      if (D.22405 > j) goto <D.21939>; else goto <D.21941>;
      <D.21941>:
      D.22296 = cfg->varinfo;
      i.0 = (unsigned int) i;
      D.22297 = i.0 * 4;
      D.22298 = D.22296 + D.22297;
      D.22299 = *D.22298;
      D.22415 = D.22299->dreg;
      ins->dreg = D.22415;
      D.22416 = bb->code;
      mono_bblock_insert_before_ins (bb, D.22416, ins);
    }
    <D.21930>:
    idx = mono_bitset_find_first (set, idx);
    <D.21943>:
    idx.8 = (unsigned int) idx;
    D.22286 = cfg->num_bblocks;
    if (idx.8 < D.22286) goto <D.22418>; else goto <D.21944>;
    <D.22418>:
    if (idx >= 0) goto <D.21942>; else goto <D.21944>;
    <D.21944>:
  }
  <D.21928>:
  i = i + 1;
  <D.21946>:
  i.2 = (unsigned int) i;
  D.22263 = cfg->num_varinfo;
  if (i.2 < D.22263) goto <D.21945>; else goto <D.21947>;
  <D.21947>:
  monoeg_g_free (vinfo);
  monoeg_g_free (buf_start);
  D.22263 = cfg->num_varinfo;
  D.22419 = D.22263 * 4;
  stack = __builtin_alloca (D.22419);
  D.22263 = cfg->num_varinfo;
  D.22419 = D.22263 * 4;
  memset (stack, 0, D.22419);
  D.22282 = cfg->next_vreg;
  D.22420 = D.22282 * 4;
  lvreg_stack = monoeg_malloc0 (D.22420);
  D.22282 = cfg->next_vreg;
  D.22420 = D.22282 * 4;
  lvreg_defined = monoeg_malloc0 (D.22420);
  stack_history_size = 10240;
  stack_history_size.9 = (unsigned int) stack_history_size;
  D.22422 = stack_history_size.9 * 8;
  stack_history = monoeg_malloc (D.22422);
  D.22263 = cfg->num_varinfo;
  D.22419 = D.22263 * 4;
  originals = monoeg_malloc0 (D.22419);
  D.22423 = cfg->bb_entry;
  D.22263 = cfg->num_varinfo;
  D.22424 = (int) D.22263;
  mono_ssa_rename_vars (cfg, D.22424, D.22423, originals, stack, lvreg_stack, lvreg_defined, stack_history, stack_history_size);
  monoeg_g_free (stack_history);
  monoeg_g_free (originals);
  monoeg_g_free (lvreg_stack);
  monoeg_g_free (lvreg_defined);
  D.22279 = cfg->verbose_level;
  if (D.22279 > 3) goto <D.22425>; else goto <D.22426>;
  <D.22425>:
  printf ("\nEND COMPUTE SSA.\n\n");
  <D.22426>:
  D.22265 = cfg->comp_done;
  D.22427 = D.22265 | 32;
  cfg->comp_done = D.22427;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22430;
  int D.22435;
  void * D.22437;
  unsigned int D.22438;

  D.22430 = __builtin_constant_p (__len);
  if (D.22430 != 0) goto <D.22431>; else goto <D.22432>;
  <D.22431>:
  if (__len == 0) goto <D.22433>; else goto <D.22434>;
  <D.22433>:
  D.22435 = __builtin_constant_p (__ch);
  if (D.22435 == 0) goto <D.22428>; else goto <D.22436>;
  <D.22436>:
  if (__ch != 0) goto <D.22428>; else goto <D.22429>;
  <D.22428>:
  __warn_memset_zero_len ();
  D.22437 = __dest;
  return D.22437;
  <D.22429>:
  <D.22434>:
  <D.22432>:
  D.22438 = __builtin_object_size (__dest, 0);
  D.22437 = __builtin___memset_chk (__dest, __ch, __len, D.22438);
  return D.22437;
}


mono_ssa_rename_vars (struct MonoCompile * cfg, int max_vars, struct MonoBasicBlock * bb, gboolean * originals_used, struct MonoInst * * stack, guint32 * lvreg_stack, gboolean * lvreg_defined, struct RenameInfo * stack_history, int stack_history_size)
{
  unsigned int D.22440;
  int D.22443;
  short unsigned int D.22444;
  int D.22445;
  int D.22446;
  int D.22447;
  int D.22450;
  int D.22451;
  int D.22452;
  signed char D.22453;
  int D.22454;
  sizetype D.22455;
  const char * D.22456;
  char D.22457;
  struct MonoInst * iftmp.10;
  int D.22461;
  unsigned int D.22462;
  unsigned int D.22463;
  struct MonoInst * * D.22466;
  unsigned int D.22467;
  unsigned int D.22468;
  struct MonoInst * * D.22469;
  unsigned char D.22474;
  int D.22475;
  int D.22476;
  unsigned int idx.11;
  unsigned int D.22479;
  struct MonoInst * * D.22480;
  struct MonoInst * D.22481;
  short unsigned int D.22484;
  _Bool D.22487;
  long int D.22488;
  long int D.22489;
  int D.22492;
  int iftmp.12;
  guint32 * D.22498;
  unsigned int D.22499;
  _Bool D.22501;
  long int D.22502;
  long int D.22503;
  int D.22506;
  short unsigned int D.22507;
  struct MonoInst * iftmp.13;
  int D.22511;
  unsigned int D.22512;
  unsigned int D.22515;
  unsigned int D.22516;
  struct MonoInst * * D.22517;
  unsigned char D.22522;
  int D.22523;
  int D.22524;
  unsigned int idx.14;
  unsigned int D.22527;
  struct MonoInst * * D.22528;
  struct MonoInst * D.22529;
  short unsigned int D.22532;
  _Bool D.22535;
  long int D.22536;
  long int D.22537;
  int D.22540;
  int iftmp.15;
  guint32 * D.22546;
  unsigned int D.22547;
  _Bool D.22549;
  long int D.22550;
  long int D.22551;
  int D.22554;
  char D.22555;
  struct MonoInst * iftmp.16;
  unsigned char D.22567;
  int D.22568;
  int D.22569;
  _Bool D.22571;
  long int D.22572;
  long int D.22573;
  short unsigned int D.22576;
  unsigned int idx.17;
  unsigned int D.22580;
  gboolean * D.22581;
  _Bool D.22582;
  long int D.22583;
  long int D.22584;
  unsigned int stack_history_len.18;
  unsigned int D.22588;
  struct RenameInfo * D.22589;
  struct MonoInst * * D.22590;
  struct MonoInst * D.22591;
  int D.22592;
  struct MonoType * D.22595;
  struct MonoMethodVar * D.22596;
  int D.22597;
  unsigned int D.22598;
  unsigned int D.22599;
  struct MonoMethodVar * D.22600;
  int D.22603;
  int D.22604;
  int D.22606;
  unsigned int D.22607;
  unsigned int D.22608;
  int iftmp.19;
  gboolean * D.22613;
  int D.22614;
  _Bool D.22617;
  long int D.22618;
  long int D.22619;
  guint32 iftmp.20;
  unsigned int D.22625;
  gboolean * D.22627;
  gboolean * D.22628;
  int D.22629;
  struct MonoBasicBlock * * D.22632;
  unsigned int i.21;
  unsigned int D.22634;
  struct MonoBasicBlock * * D.22635;
  struct MonoBasicBlock * * D.22636;
  unsigned int j.22;
  unsigned int D.22638;
  struct MonoBasicBlock * * D.22639;
  struct MonoBasicBlock * D.22640;
  short int D.22642;
  int D.22643;
  short unsigned int D.22644;
  short unsigned int D.22645;
  _Bool D.22646;
  _Bool D.22647;
  _Bool D.22648;
  struct MonoInst * * D.22653;
  struct MonoInst * * D.22654;
  int * D.22655;
  sizetype j.23;
  sizetype D.22657;
  sizetype D.22658;
  int * D.22659;
  _Bool D.22660;
  long int D.22661;
  long int D.22662;
  int D.22665;
  short int D.22666;
  int D.22667;
  struct GSList * D.22668;
  int D.22671;
  void * D.22672;
  unsigned int D.22673;
  struct RenameInfo * D.22674;
  int D.22675;
  unsigned int D.22676;
  unsigned int D.22677;
  struct MonoInst * * D.22678;
  struct MonoInst * D.22679;
  unsigned int D.22680;
  unsigned int D.22681;
  struct MonoInst * ins;
  struct MonoInst * new_var;
  int i;
  int j;
  int idx;
  struct GSList * tmp;
  int stack_history_len;

  stack_history_len = 0;
  D.22440 = cfg->verbose_level;
  if (D.22440 > 3) goto <D.22441>; else goto <D.22442>;
  <D.22441>:
  D.22443 = bb->block_num;
  printf ("\nRENAME VARS BLOCK %d:\n", D.22443);
  <D.22442>:
  ins = bb->code;
  goto <D.21881>;
  <D.21880>:
  {
    const char * spec;
    int num_sregs;
    int sregs[3];

    try
      {
        D.22444 = ins->opcode;
        D.22445 = (int) D.22444;
        D.22446 = D.22445 + -313;
        D.22447 = D.22446 * 4;
        spec = &ins_info[D.22447];
        D.22444 = ins->opcode;
        if (D.22444 == 316) goto <D.22448>; else goto <D.22449>;
        <D.22448>:
        // predicted unlikely by continue predictor.
        goto <D.21870>;
        <D.22449>:
        D.22450 = ins->sreg1;
        sregs[0] = D.22450;
        D.22451 = ins->sreg2;
        sregs[1] = D.22451;
        D.22452 = ins->sreg3;
        sregs[2] = D.22452;
        D.22444 = ins->opcode;
        D.22445 = (int) D.22444;
        D.22446 = D.22445 + -313;
        D.22453 = ins_sreg_counts[D.22446];
        num_sregs = (int) D.22453;
        i = 0;
        goto <D.21874>;
        <D.21873>:
        D.22454 = i + 1;
        D.22455 = (sizetype) D.22454;
        D.22456 = spec + D.22455;
        D.22457 = *D.22456;
        if (D.22457 != 32) goto <D.22458>; else goto <D.22459>;
        <D.22458>:
        {
          struct MonoInst * var;

          D.22461 = sregs[i];
          D.22462 = (unsigned int) D.22461;
          D.22463 = cfg->vreg_to_inst_len;
          if (D.22462 < D.22463) goto <D.22464>; else goto <D.22465>;
          <D.22464>:
          D.22466 = cfg->vreg_to_inst;
          D.22461 = sregs[i];
          D.22467 = (unsigned int) D.22461;
          D.22468 = D.22467 * 4;
          D.22469 = D.22466 + D.22468;
          iftmp.10 = *D.22469;
          goto <D.22470>;
          <D.22465>:
          iftmp.10 = 0B;
          <D.22470>:
          var = iftmp.10;
          if (var != 0B) goto <D.22473>; else goto <D.22471>;
          <D.22473>:
          D.22474 = var->flags;
          D.22475 = (int) D.22474;
          D.22476 = D.22475 & 20;
          if (D.22476 == 0) goto <D.22477>; else goto <D.22471>;
          <D.22477>:
          {
            int idx;

            idx = var->data.op[0].const_val;
            idx.11 = (unsigned int) idx;
            D.22479 = idx.11 * 4;
            D.22480 = stack + D.22479;
            D.22481 = *D.22480;
            if (D.22481 != 0B) goto <D.22482>; else goto <D.22483>;
            <D.22482>:
            D.22484 = var->opcode;
            if (D.22484 != 330) goto <D.22485>; else goto <D.22486>;
            <D.22485>:
            idx.11 = (unsigned int) idx;
            D.22479 = idx.11 * 4;
            D.22480 = stack + D.22479;
            D.22481 = *D.22480;
            D.22487 = D.22481 == 0B;
            D.22488 = (long int) D.22487;
            D.22489 = __builtin_expect (D.22488, 0);
            if (D.22489 != 0) goto <D.22490>; else goto <D.22491>;
            <D.22490>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 200, "stack [idx]");
            <D.22491>:
            <D.22486>:
            idx.11 = (unsigned int) idx;
            D.22479 = idx.11 * 4;
            D.22480 = stack + D.22479;
            D.22481 = *D.22480;
            D.22492 = D.22481->dreg;
            sregs[i] = D.22492;
            idx.11 = (unsigned int) idx;
            D.22479 = idx.11 * 4;
            D.22480 = stack + D.22479;
            D.22481 = *D.22480;
            record_use (cfg, D.22481, bb, ins);
            goto <D.22493>;
            <D.22483>:
            record_use (cfg, var, bb, ins);
            <D.22493>:
          }
          goto <D.22472>;
          <D.22471>:
          if (var == 0B) goto <D.22497>; else goto <D.22495>;
          <D.22497>:
          D.22461 = sregs[i];
          D.22467 = (unsigned int) D.22461;
          D.22468 = D.22467 * 4;
          D.22498 = lvreg_stack + D.22468;
          D.22499 = *D.22498;
          if (D.22499 != 0) goto <D.22500>; else goto <D.22495>;
          <D.22500>:
          iftmp.12 = 1;
          goto <D.22496>;
          <D.22495>:
          iftmp.12 = 0;
          <D.22496>:
          D.22501 = iftmp.12 != 0;
          D.22502 = (long int) D.22501;
          D.22503 = __builtin_expect (D.22502, 0);
          if (D.22503 != 0) goto <D.22504>; else goto <D.22505>;
          <D.22504>:
          D.22461 = sregs[i];
          D.22467 = (unsigned int) D.22461;
          D.22468 = D.22467 * 4;
          D.22498 = lvreg_stack + D.22468;
          D.22499 = *D.22498;
          D.22506 = (int) D.22499;
          sregs[i] = D.22506;
          <D.22505>:
          <D.22472>:
        }
        <D.22459>:
        i = i + 1;
        <D.21874>:
        if (i < num_sregs) goto <D.21873>; else goto <D.21875>;
        <D.21875>:
        mono_inst_set_src_registers (ins, &sregs);
        D.22444 = ins->opcode;
        D.22507 = D.22444 + 65162;
        if (D.22507 <= 16) goto <D.22508>; else goto <D.22509>;
        <D.22508>:
        {
          struct MonoInst * var;

          D.22511 = ins->dreg;
          D.22512 = (unsigned int) D.22511;
          D.22463 = cfg->vreg_to_inst_len;
          if (D.22512 < D.22463) goto <D.22513>; else goto <D.22514>;
          <D.22513>:
          D.22466 = cfg->vreg_to_inst;
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22517 = D.22466 + D.22516;
          iftmp.13 = *D.22517;
          goto <D.22518>;
          <D.22514>:
          iftmp.13 = 0B;
          <D.22518>:
          var = iftmp.13;
          if (var != 0B) goto <D.22521>; else goto <D.22519>;
          <D.22521>:
          D.22522 = var->flags;
          D.22523 = (int) D.22522;
          D.22524 = D.22523 & 20;
          if (D.22524 == 0) goto <D.22525>; else goto <D.22519>;
          <D.22525>:
          {
            int idx;

            idx = var->data.op[0].const_val;
            idx.14 = (unsigned int) idx;
            D.22527 = idx.14 * 4;
            D.22528 = stack + D.22527;
            D.22529 = *D.22528;
            if (D.22529 != 0B) goto <D.22530>; else goto <D.22531>;
            <D.22530>:
            D.22532 = var->opcode;
            if (D.22532 != 330) goto <D.22533>; else goto <D.22534>;
            <D.22533>:
            idx.14 = (unsigned int) idx;
            D.22527 = idx.14 * 4;
            D.22528 = stack + D.22527;
            D.22529 = *D.22528;
            D.22535 = D.22529 == 0B;
            D.22536 = (long int) D.22535;
            D.22537 = __builtin_expect (D.22536, 0);
            if (D.22537 != 0) goto <D.22538>; else goto <D.22539>;
            <D.22538>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 219, "stack [idx]");
            <D.22539>:
            <D.22534>:
            idx.14 = (unsigned int) idx;
            D.22527 = idx.14 * 4;
            D.22528 = stack + D.22527;
            D.22529 = *D.22528;
            D.22540 = D.22529->dreg;
            ins->dreg = D.22540;
            idx.14 = (unsigned int) idx;
            D.22527 = idx.14 * 4;
            D.22528 = stack + D.22527;
            D.22529 = *D.22528;
            record_use (cfg, D.22529, bb, ins);
            goto <D.22541>;
            <D.22531>:
            record_use (cfg, var, bb, ins);
            <D.22541>:
          }
          goto <D.22520>;
          <D.22519>:
          if (var == 0B) goto <D.22545>; else goto <D.22543>;
          <D.22545>:
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22546 = lvreg_stack + D.22516;
          D.22547 = *D.22546;
          if (D.22547 != 0) goto <D.22548>; else goto <D.22543>;
          <D.22548>:
          iftmp.15 = 1;
          goto <D.22544>;
          <D.22543>:
          iftmp.15 = 0;
          <D.22544>:
          D.22549 = iftmp.15 != 0;
          D.22550 = (long int) D.22549;
          D.22551 = __builtin_expect (D.22550, 0);
          if (D.22551 != 0) goto <D.22552>; else goto <D.22553>;
          <D.22552>:
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22546 = lvreg_stack + D.22516;
          D.22547 = *D.22546;
          D.22554 = (int) D.22547;
          ins->dreg = D.22554;
          <D.22553>:
          <D.22520>:
        }
        <D.22509>:
        D.22555 = *spec;
        if (D.22555 != 32) goto <D.22556>; else goto <D.22557>;
        <D.22556>:
        D.22444 = ins->opcode;
        D.22507 = D.22444 + 65162;
        if (D.22507 > 16) goto <D.22558>; else goto <D.22559>;
        <D.22558>:
        {
          struct MonoInst * var;
          struct MonoMethodVar * info;

          D.22511 = ins->dreg;
          D.22512 = (unsigned int) D.22511;
          D.22463 = cfg->vreg_to_inst_len;
          if (D.22512 < D.22463) goto <D.22561>; else goto <D.22562>;
          <D.22561>:
          D.22466 = cfg->vreg_to_inst;
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22517 = D.22466 + D.22516;
          iftmp.16 = *D.22517;
          goto <D.22563>;
          <D.22562>:
          iftmp.16 = 0B;
          <D.22563>:
          var = iftmp.16;
          if (var != 0B) goto <D.22566>; else goto <D.22564>;
          <D.22566>:
          D.22567 = var->flags;
          D.22568 = (int) D.22567;
          D.22569 = D.22568 & 20;
          if (D.22569 == 0) goto <D.22570>; else goto <D.22564>;
          <D.22570>:
          idx = var->data.op[0].const_val;
          D.22571 = idx >= max_vars;
          D.22572 = (long int) D.22571;
          D.22573 = __builtin_expect (D.22572, 0);
          if (D.22573 != 0) goto <D.22574>; else goto <D.22575>;
          <D.22574>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 237, "idx < max_vars");
          <D.22575>:
          D.22576 = var->opcode;
          if (D.22576 == 330) goto <D.22577>; else goto <D.22578>;
          <D.22577>:
          idx.17 = (unsigned int) idx;
          D.22580 = idx.17 * 4;
          D.22581 = originals_used + D.22580;
          *D.22581 = 1;
          <D.22578>:
          D.22582 = stack_history_len >= stack_history_size;
          D.22583 = (long int) D.22582;
          D.22584 = __builtin_expect (D.22583, 0);
          if (D.22584 != 0) goto <D.22585>; else goto <D.22586>;
          <D.22585>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 243, "stack_history_len < stack_history_size");
          <D.22586>:
          stack_history_len.18 = (unsigned int) stack_history_len;
          D.22588 = stack_history_len.18 * 8;
          D.22589 = stack_history + D.22588;
          idx.17 = (unsigned int) idx;
          D.22580 = idx.17 * 4;
          D.22590 = stack + D.22580;
          D.22591 = *D.22590;
          D.22589->var = D.22591;
          stack_history_len.18 = (unsigned int) stack_history_len;
          D.22588 = stack_history_len.18 * 8;
          D.22589 = stack_history + D.22588;
          D.22589->idx = idx;
          stack_history_len = stack_history_len + 1;
          idx.17 = (unsigned int) idx;
          D.22580 = idx.17 * 4;
          D.22581 = originals_used + D.22580;
          D.22592 = *D.22581;
          if (D.22592 != 0) goto <D.22593>; else goto <D.22594>;
          <D.22593>:
          D.22595 = var->data.op[1].vtype;
          new_var = mono_compile_create_var (cfg, D.22595, 329);
          D.22567 = var->flags;
          new_var->flags = D.22567;
          D.22596 = cfg->vars;
          D.22597 = new_var->data.op[0].const_val;
          D.22598 = (unsigned int) D.22597;
          D.22599 = D.22598 * 56;
          D.22600 = D.22596 + D.22599;
          D.22600->reg = idx;
          D.22440 = cfg->verbose_level;
          if (D.22440 > 3) goto <D.22601>; else goto <D.22602>;
          <D.22601>:
          D.22603 = new_var->dreg;
          D.22604 = var->dreg;
          printf ("  R%d -> R%d\n", D.22604, D.22603);
          <D.22602>:
          idx.17 = (unsigned int) idx;
          D.22580 = idx.17 * 4;
          D.22590 = stack + D.22580;
          *D.22590 = new_var;
          D.22603 = new_var->dreg;
          ins->dreg = D.22603;
          var = new_var;
          goto <D.22605>;
          <D.22594>:
          idx.17 = (unsigned int) idx;
          D.22580 = idx.17 * 4;
          D.22590 = stack + D.22580;
          *D.22590 = var;
          idx.17 = (unsigned int) idx;
          D.22580 = idx.17 * 4;
          D.22581 = originals_used + D.22580;
          *D.22581 = 1;
          <D.22605>:
          D.22596 = cfg->vars;
          D.22606 = var->data.op[0].const_val;
          D.22607 = (unsigned int) D.22606;
          D.22608 = D.22607 * 56;
          info = D.22596 + D.22608;
          info->def = ins;
          info->def_bb = bb;
          goto <D.22565>;
          <D.22564>:
          if (var == 0B) goto <D.22612>; else goto <D.22610>;
          <D.22612>:
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22613 = lvreg_defined + D.22516;
          D.22614 = *D.22613;
          if (D.22614 != 0) goto <D.22615>; else goto <D.22610>;
          <D.22615>:
          D.22511 = ins->dreg;
          if (D.22511 > 7) goto <D.22616>; else goto <D.22610>;
          <D.22616>:
          iftmp.19 = 1;
          goto <D.22611>;
          <D.22610>:
          iftmp.19 = 0;
          <D.22611>:
          D.22617 = iftmp.19 != 0;
          D.22618 = (long int) D.22617;
          D.22619 = __builtin_expect (D.22618, 0);
          if (D.22619 != 0) goto <D.22620>; else goto <D.22621>;
          <D.22620>:
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22546 = lvreg_stack + D.22516;
          D.22511 = ins->dreg;
          D.22512 = (unsigned int) D.22511;
          D.22625 = cfg->vreg_is_ref_len;
          if (D.22512 < D.22625) goto <D.22626>; else goto <D.22623>;
          <D.22626>:
          D.22627 = cfg->vreg_is_ref;
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22628 = D.22627 + D.22516;
          D.22629 = *D.22628;
          if (D.22629 != 0) goto <D.22630>; else goto <D.22623>;
          <D.22630>:
          iftmp.20 = mono_alloc_ireg_ref (cfg);
          goto <D.22624>;
          <D.22623>:
          iftmp.20 = mono_alloc_preg (cfg);
          <D.22624>:
          *D.22546 = iftmp.20;
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22546 = lvreg_stack + D.22516;
          D.22547 = *D.22546;
          D.22554 = (int) D.22547;
          ins->dreg = D.22554;
          goto <D.22631>;
          <D.22621>:
          D.22511 = ins->dreg;
          D.22515 = (unsigned int) D.22511;
          D.22516 = D.22515 * 4;
          D.22613 = lvreg_defined + D.22516;
          *D.22613 = 1;
          <D.22631>:
          <D.22565>:
        }
        <D.22559>:
        <D.22557>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21870>:
  ins = ins->next;
  <D.21881>:
  if (ins != 0B) goto <D.21880>; else goto <D.21882>;
  <D.21882>:
  i = 0;
  goto <D.21891>;
  <D.21890>:
  {
    struct MonoBasicBlock * n;

    D.22632 = bb->out_bb;
    i.21 = (unsigned int) i;
    D.22634 = i.21 * 4;
    D.22635 = D.22632 + D.22634;
    n = *D.22635;
    j = 0;
    goto <D.21886>;
    <D.21885>:
    D.22636 = n->in_bb;
    j.22 = (unsigned int) j;
    D.22638 = j.22 * 4;
    D.22639 = D.22636 + D.22638;
    D.22640 = *D.22639;
    if (D.22640 == bb) goto <D.21884>; else goto <D.22641>;
    <D.22641>:
    j = j + 1;
    <D.21886>:
    D.22642 = n->in_count;
    D.22643 = (int) D.22642;
    if (D.22643 > j) goto <D.21885>; else goto <D.21884>;
    <D.21884>:
    ins = n->code;
    goto <D.21889>;
    <D.21888>:
    D.22644 = ins->opcode;
    D.22645 = D.22644 + 65217;
    D.22646 = D.22645 <= 2;
    D.22647 = D.22644 == 964;
    D.22648 = D.22646 | D.22647;
    if (D.22648 != 0) goto <D.22649>; else goto <D.21887>;
    <D.22649>:
    idx = ins->data.op[0].const_val;
    idx.17 = (unsigned int) idx;
    D.22580 = idx.17 * 4;
    D.22590 = stack + D.22580;
    D.22591 = *D.22590;
    if (D.22591 != 0B) goto <D.22650>; else goto <D.22651>;
    <D.22650>:
    idx.17 = (unsigned int) idx;
    D.22580 = idx.17 * 4;
    D.22590 = stack + D.22580;
    new_var = *D.22590;
    goto <D.22652>;
    <D.22651>:
    D.22653 = cfg->varinfo;
    idx.17 = (unsigned int) idx;
    D.22580 = idx.17 * 4;
    D.22654 = D.22653 + D.22580;
    new_var = *D.22654;
    <D.22652>:
    D.22655 = ins->data.op[1].phi_args;
    j.23 = (sizetype) j;
    D.22657 = j.23 + 1;
    D.22658 = D.22657 * 4;
    D.22659 = D.22655 + D.22658;
    D.22603 = new_var->dreg;
    *D.22659 = D.22603;
    record_use (cfg, new_var, n, ins);
    D.22440 = cfg->verbose_level;
    D.22660 = D.22440 > 3;
    D.22661 = (long int) D.22660;
    D.22662 = __builtin_expect (D.22661, 0);
    if (D.22662 != 0) goto <D.22663>; else goto <D.22664>;
    <D.22663>:
    D.22665 = n->block_num;
    D.22603 = new_var->dreg;
    D.22511 = ins->dreg;
    printf ("\tAdd PHI R%d <- R%d to BB%d\n", D.22511, D.22603, D.22665);
    <D.22664>:
    ins = ins->next;
    <D.21889>:
    if (ins != 0B) goto <D.21888>; else goto <D.21887>;
    <D.21887>:
  }
  i = i + 1;
  <D.21891>:
  D.22666 = bb->out_count;
  D.22667 = (int) D.22666;
  if (D.22667 > i) goto <D.21890>; else goto <D.21892>;
  <D.21892>:
  D.22668 = bb->dominated;
  if (D.22668 != 0B) goto <D.22669>; else goto <D.22670>;
  <D.22669>:
  tmp = bb->dominated;
  goto <D.21894>;
  <D.21893>:
  D.22671 = stack_history_size - stack_history_len;
  stack_history_len.18 = (unsigned int) stack_history_len;
  D.22588 = stack_history_len.18 * 8;
  D.22589 = stack_history + D.22588;
  D.22672 = tmp->data;
  mono_ssa_rename_vars (cfg, max_vars, D.22672, originals_used, stack, lvreg_stack, lvreg_defined, D.22589, D.22671);
  tmp = tmp->next;
  <D.21894>:
  if (tmp != 0B) goto <D.21893>; else goto <D.21895>;
  <D.21895>:
  <D.22670>:
  i = stack_history_len + -1;
  goto <D.21897>;
  <D.21896>:
  i.21 = (unsigned int) i;
  D.22673 = i.21 * 8;
  D.22674 = stack_history + D.22673;
  D.22675 = D.22674->idx;
  D.22676 = (unsigned int) D.22675;
  D.22677 = D.22676 * 4;
  D.22678 = stack + D.22677;
  i.21 = (unsigned int) i;
  D.22673 = i.21 * 8;
  D.22674 = stack_history + D.22673;
  D.22679 = D.22674->var;
  *D.22678 = D.22679;
  i = i + -1;
  <D.21897>:
  if (i >= 0) goto <D.21896>; else goto <D.21898>;
  <D.21898>:
  D.22680 = cfg->comp_done;
  D.22681 = D.22680 | 64;
  cfg->comp_done = D.22681;
}


record_use (struct MonoCompile * cfg, struct MonoInst * var, struct MonoBasicBlock * bb, struct MonoInst * ins)
{
  struct MonoMemPool * D.22684;
  struct MonoMethodVar * D.22685;
  int D.22686;
  unsigned int D.22687;
  unsigned int D.22688;
  struct GList * D.22689;
  struct GList * D.22690;
  struct MonoMethodVar * info;
  struct MonoVarUsageInfo * ui;

  D.22684 = cfg->mempool;
  ui = mono_mempool_alloc (D.22684, 8);
  D.22685 = cfg->vars;
  D.22686 = var->data.op[0].const_val;
  D.22687 = (unsigned int) D.22686;
  D.22688 = D.22687 * 56;
  info = D.22685 + D.22688;
  ui->bb = bb;
  ui->inst = ins;
  D.22689 = info->uses;
  D.22684 = cfg->mempool;
  D.22690 = g_list_prepend_mempool (D.22684, D.22689, ui);
  info->uses = D.22690;
}


g_list_prepend_mempool (struct MonoMemPool * mp, struct GList * list, void * data)
{
  struct GList * iftmp.24;
  struct GList * D.22695;
  struct GList * D.22700;
  struct GList * new_list;

  new_list = mono_mempool_alloc (mp, 12);
  new_list->data = data;
  if (list != 0B) goto <D.22692>; else goto <D.22693>;
  <D.22692>:
  iftmp.24 = list->prev;
  goto <D.22694>;
  <D.22693>:
  iftmp.24 = 0B;
  <D.22694>:
  new_list->prev = iftmp.24;
  new_list->next = list;
  D.22695 = new_list->prev;
  if (D.22695 != 0B) goto <D.22696>; else goto <D.22697>;
  <D.22696>:
  D.22695 = new_list->prev;
  D.22695->next = new_list;
  <D.22697>:
  if (list != 0B) goto <D.22698>; else goto <D.22699>;
  <D.22698>:
  list->prev = new_list;
  <D.22699>:
  D.22700 = new_list;
  return D.22700;
}


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

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


mono_ssa_remove (struct MonoCompile * cfg)
{
  unsigned int D.22704;
  unsigned int D.22705;
  _Bool D.22706;
  long int D.22707;
  long int D.22708;
  struct MonoBasicBlock * * D.22711;
  unsigned int i.25;
  unsigned int D.22713;
  struct MonoBasicBlock * * D.22714;
  unsigned int D.22715;
  int D.22718;
  short unsigned int D.22719;
  short unsigned int D.22720;
  _Bool D.22721;
  _Bool D.22722;
  _Bool D.22723;
  int * D.22726;
  int D.22727;
  short int D.22728;
  int D.22729;
  _Bool D.22730;
  long int D.22731;
  long int D.22732;
  struct MonoInst * iftmp.26;
  int D.22736;
  unsigned int D.22737;
  unsigned int D.22738;
  struct MonoInst * * D.22741;
  unsigned int D.22742;
  unsigned int D.22743;
  struct MonoInst * * D.22744;
  sizetype j.27;
  sizetype D.22747;
  sizetype D.22748;
  int * D.22749;
  int D.22750;
  short unsigned int D.22756;
  int D.22757;
  int D.22758;
  short unsigned int D.22759;
  struct MonoClass * D.22762;
  _Bool D.22763;
  long int D.22764;
  long int D.22765;
  struct MonoBasicBlock * * D.22768;
  unsigned int j.28;
  unsigned int D.22770;
  struct MonoBasicBlock * * D.22771;
  int D.22774;
  int D.22775;
  struct MonoMemPool * D.22778;
  int D.22779;
  short unsigned int D.22780;
  int D.22781;
  int D.22782;
  const unsigned char * D.22783;
  short unsigned int D.22784;
  unsigned int i.29;
  unsigned int D.22790;
  unsigned int bbindex.30;
  unsigned int D.22794;
  struct MonoBasicBlock * * D.22795;
  int D.22796;
  int D.22797;
  char D.22800;
  struct MonoInst * iftmp.31;
  struct MonoMethodVar * D.22809;
  int D.22810;
  unsigned int D.22811;
  unsigned int D.22812;
  int D.22813;
  unsigned int D.22816;
  unsigned int D.22817;
  unsigned int D.22820;
  unsigned int D.22821;
  struct MonoMethodVar * D.22822;
  int D.22823;
  struct MonoInst * * D.22826;
  unsigned int D.22827;
  struct MonoInst * * D.22828;
  struct MonoInst * D.22829;
  int D.22830;
  int D.22831;
  int D.22832;
  int D.22833;
  signed char D.22834;
  struct MonoInst * iftmp.32;
  int D.22836;
  unsigned int D.22837;
  unsigned int D.22840;
  unsigned int D.22841;
  struct MonoInst * * D.22842;
  int D.22846;
  unsigned int D.22847;
  unsigned int D.22848;
  int D.22849;
  unsigned int D.22852;
  unsigned int D.22853;
  unsigned int D.22856;
  unsigned int D.22857;
  struct MonoMethodVar * D.22858;
  int D.22859;
  unsigned int D.22862;
  struct MonoInst * * D.22863;
  struct MonoInst * D.22864;
  int D.22865;
  unsigned int bbindex.33;
  unsigned int D.22867;
  struct MonoMethodVar * D.22868;
  unsigned int D.22869;
  unsigned int D.22870;
  unsigned int D.22873;
  unsigned int D.22874;
  struct MonoInst * ins;
  struct MonoInst * var;
  struct MonoInst * move;
  int bbindex;
  int i;
  int j;
  int first;

  D.22704 = cfg->comp_done;
  D.22705 = D.22704 & 32;
  D.22706 = D.22705 == 0;
  D.22707 = (long int) D.22706;
  D.22708 = __builtin_expect (D.22707, 0);
  if (D.22708 != 0) goto <D.22709>; else goto <D.22710>;
  <D.22709>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 489, "cfg->comp_done & MONO_COMP_SSA");
  <D.22710>:
  i = 0;
  goto <D.21971>;
  <D.21970>:
  {
    struct MonoBasicBlock * bb;

    D.22711 = cfg->bblocks;
    i.25 = (unsigned int) i;
    D.22713 = i.25 * 4;
    D.22714 = D.22711 + D.22713;
    bb = *D.22714;
    D.22715 = cfg->verbose_level;
    if (D.22715 > 3) goto <D.22716>; else goto <D.22717>;
    <D.22716>:
    D.22718 = bb->block_num;
    printf ("\nREMOVE SSA %d:\n", D.22718);
    <D.22717>:
    ins = bb->code;
    goto <D.21968>;
    <D.21967>:
    D.22719 = ins->opcode;
    D.22720 = D.22719 + 65217;
    D.22721 = D.22720 <= 2;
    D.22722 = D.22719 == 964;
    D.22723 = D.22721 | D.22722;
    if (D.22723 != 0) goto <D.22724>; else goto <D.22725>;
    <D.22724>:
    D.22726 = ins->data.op[1].phi_args;
    D.22727 = *D.22726;
    D.22728 = bb->in_count;
    D.22729 = (int) D.22728;
    D.22730 = D.22727 != D.22729;
    D.22731 = (long int) D.22730;
    D.22732 = __builtin_expect (D.22731, 0);
    if (D.22732 != 0) goto <D.22733>; else goto <D.22734>;
    <D.22733>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 499, "ins->inst_phi_args [0] == bb->in_count");
    <D.22734>:
    D.22736 = ins->dreg;
    D.22737 = (unsigned int) D.22736;
    D.22738 = cfg->vreg_to_inst_len;
    if (D.22737 < D.22738) goto <D.22739>; else goto <D.22740>;
    <D.22739>:
    D.22741 = cfg->vreg_to_inst;
    D.22736 = ins->dreg;
    D.22742 = (unsigned int) D.22736;
    D.22743 = D.22742 * 4;
    D.22744 = D.22741 + D.22743;
    iftmp.26 = *D.22744;
    goto <D.22745>;
    <D.22740>:
    iftmp.26 = 0B;
    <D.22745>:
    var = iftmp.26;
    D.22726 = ins->data.op[1].phi_args;
    first = MEM[(int *)D.22726 + 4B];
    j = 1;
    goto <D.21961>;
    <D.21960>:
    D.22726 = ins->data.op[1].phi_args;
    j.27 = (sizetype) j;
    D.22747 = j.27 + 1;
    D.22748 = D.22747 * 4;
    D.22749 = D.22726 + D.22748;
    D.22750 = *D.22749;
    if (D.22750 != first) goto <D.21959>; else goto <D.22751>;
    <D.22751>:
    j = j + 1;
    <D.21961>:
    D.22728 = bb->in_count;
    D.22729 = (int) D.22728;
    if (D.22729 > j) goto <D.21960>; else goto <D.21959>;
    <D.21959>:
    D.22728 = bb->in_count;
    if (D.22728 > 1) goto <D.22754>; else goto <D.22752>;
    <D.22754>:
    D.22728 = bb->in_count;
    D.22729 = (int) D.22728;
    if (D.22729 == j) goto <D.22755>; else goto <D.22752>;
    <D.22755>:
    D.22756 = ins->opcode;
    D.22757 = (int) D.22756;
    D.22758 = op_phi_to_move (D.22757);
    D.22759 = (short unsigned int) D.22758;
    ins->opcode = D.22759;
    D.22756 = ins->opcode;
    if (D.22756 == 431) goto <D.22760>; else goto <D.22761>;
    <D.22760>:
    D.22762 = ins->klass;
    D.22763 = D.22762 == 0B;
    D.22764 = (long int) D.22763;
    D.22765 = __builtin_expect (D.22764, 0);
    if (D.22765 != 0) goto <D.22766>; else goto <D.22767>;
    <D.22766>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 512, "ins->klass");
    <D.22767>:
    <D.22761>:
    ins->sreg1 = first;
    goto <D.22753>;
    <D.22752>:
    j = 0;
    goto <D.21965>;
    <D.21964>:
    {
      struct MonoBasicBlock * pred;
      int sreg;

      D.22768 = bb->in_bb;
      j.28 = (unsigned int) j;
      D.22770 = j.28 * 4;
      D.22771 = D.22768 + D.22770;
      pred = *D.22771;
      D.22726 = ins->data.op[1].phi_args;
      j.27 = (sizetype) j;
      D.22747 = j.27 + 1;
      D.22748 = D.22747 * 4;
      D.22749 = D.22726 + D.22748;
      sreg = *D.22749;
      D.22715 = cfg->verbose_level;
      if (D.22715 > 3) goto <D.22772>; else goto <D.22773>;
      <D.22772>:
      D.22774 = pred->block_num;
      D.22775 = var->dreg;
      printf ("\tADD R%d <- R%d in BB%d\n", D.22775, sreg, D.22774);
      <D.22773>:
      D.22775 = var->dreg;
      if (D.22775 != sreg) goto <D.22776>; else goto <D.22777>;
      <D.22776>:
      D.22778 = cfg->mempool;
      move = mono_mempool_alloc0 (D.22778, 48);
      D.22756 = ins->opcode;
      D.22757 = (int) D.22756;
      D.22779 = op_phi_to_move (D.22757);
      D.22780 = (short unsigned int) D.22779;
      move->opcode = D.22780;
      move->dreg = -1;
      move->sreg3 = -1;
      D.22781 = move->sreg3;
      move->sreg2 = D.22781;
      D.22782 = move->sreg2;
      move->sreg1 = D.22782;
      D.22783 = cfg->ip;
      move->cil_code = D.22783;
      D.22784 = move->opcode;
      if (D.22784 == 431) goto <D.22785>; else goto <D.22786>;
      <D.22785>:
      D.22762 = ins->klass;
      D.22763 = D.22762 == 0B;
      D.22764 = (long int) D.22763;
      D.22765 = __builtin_expect (D.22764, 0);
      if (D.22765 != 0) goto <D.22787>; else goto <D.22788>;
      <D.22787>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 524, "ins->klass");
      <D.22788>:
      D.22762 = ins->klass;
      move->klass = D.22762;
      <D.22786>:
      D.22775 = var->dreg;
      move->dreg = D.22775;
      move->sreg1 = sreg;
      mono_add_ins_to_end (pred, move);
      <D.22777>:
    }
    j = j + 1;
    <D.21965>:
    D.22728 = bb->in_count;
    D.22729 = (int) D.22728;
    if (D.22729 > j) goto <D.21964>; else goto <D.21966>;
    <D.21966>:
    ins->opcode = 316;
    ins->dreg = -1;
    <D.22753>:
    <D.22725>:
    ins = ins->next;
    <D.21968>:
    if (ins != 0B) goto <D.21967>; else goto <D.21969>;
    <D.21969>:
  }
  i = i + 1;
  <D.21971>:
  i.29 = (unsigned int) i;
  D.22790 = cfg->num_bblocks;
  if (i.29 < D.22790) goto <D.21970>; else goto <D.21972>;
  <D.21972>:
  D.22715 = cfg->verbose_level;
  if (D.22715 > 3) goto <D.22791>; else goto <D.22792>;
  <D.22791>:
  i = 0;
  goto <D.21975>;
  <D.21974>:
  {
    struct MonoBasicBlock * bb;

    D.22711 = cfg->bblocks;
    i.25 = (unsigned int) i;
    D.22713 = i.25 * 4;
    D.22714 = D.22711 + D.22713;
    bb = *D.22714;
    mono_print_bb (bb, "AFTER REMOVE SSA:");
  }
  i = i + 1;
  <D.21975>:
  i.29 = (unsigned int) i;
  D.22790 = cfg->num_bblocks;
  if (i.29 < D.22790) goto <D.21974>; else goto <D.21976>;
  <D.21976>:
  <D.22792>:
  bbindex = 0;
  goto <D.21993>;
  <D.21992>:
  {
    struct MonoBasicBlock * bb;

    D.22711 = cfg->bblocks;
    bbindex.30 = (unsigned int) bbindex;
    D.22794 = bbindex.30 * 4;
    D.22795 = D.22711 + D.22794;
    bb = *D.22795;
    ins = bb->code;
    goto <D.21990>;
    <D.21989>:
    {
      const char * spec;
      int num_sregs;
      int sregs[3];

      try
        {
          D.22756 = ins->opcode;
          D.22757 = (int) D.22756;
          D.22796 = D.22757 + -313;
          D.22797 = D.22796 * 4;
          spec = &ins_info[D.22797];
          D.22756 = ins->opcode;
          if (D.22756 == 316) goto <D.22798>; else goto <D.22799>;
          <D.22798>:
          // predicted unlikely by continue predictor.
          goto <D.21981>;
          <D.22799>:
          D.22800 = *spec;
          if (D.22800 != 32) goto <D.22801>; else goto <D.22802>;
          <D.22801>:
          {
            struct MonoInst * var;

            D.22736 = ins->dreg;
            D.22737 = (unsigned int) D.22736;
            D.22738 = cfg->vreg_to_inst_len;
            if (D.22737 < D.22738) goto <D.22804>; else goto <D.22805>;
            <D.22804>:
            D.22741 = cfg->vreg_to_inst;
            D.22736 = ins->dreg;
            D.22742 = (unsigned int) D.22736;
            D.22743 = D.22742 * 4;
            D.22744 = D.22741 + D.22743;
            iftmp.31 = *D.22744;
            goto <D.22806>;
            <D.22805>:
            iftmp.31 = 0B;
            <D.22806>:
            var = iftmp.31;
            if (var != 0B) goto <D.22807>; else goto <D.22808>;
            <D.22807>:
            {
              struct MonoMethodVar * vmv;

              D.22809 = cfg->vars;
              D.22810 = var->data.op[0].const_val;
              D.22811 = (unsigned int) D.22810;
              D.22812 = D.22811 * 56;
              vmv = D.22809 + D.22812;
              D.22813 = vmv->reg;
              if (D.22813 != -1) goto <D.22814>; else goto <D.22815>;
              <D.22814>:
              D.22816 = vmv->idx;
              D.22813 = vmv->reg;
              D.22817 = (unsigned int) D.22813;
              if (D.22816 != D.22817) goto <D.22818>; else goto <D.22819>;
              <D.22818>:
              D.22809 = cfg->vars;
              D.22813 = vmv->reg;
              D.22820 = (unsigned int) D.22813;
              D.22821 = D.22820 * 56;
              D.22822 = D.22809 + D.22821;
              D.22823 = D.22822->reg;
              if (D.22823 != -1) goto <D.22824>; else goto <D.22825>;
              <D.22824>:
              D.22826 = cfg->varinfo;
              D.22813 = vmv->reg;
              D.22820 = (unsigned int) D.22813;
              D.22827 = D.22820 * 4;
              D.22828 = D.22826 + D.22827;
              D.22829 = *D.22828;
              D.22830 = D.22829->dreg;
              D.22736 = ins->dreg;
              printf ("COALESCE: R%d -> R%d\n", D.22736, D.22830);
              D.22826 = cfg->varinfo;
              D.22813 = vmv->reg;
              D.22820 = (unsigned int) D.22813;
              D.22827 = D.22820 * 4;
              D.22828 = D.22826 + D.22827;
              D.22829 = *D.22828;
              D.22830 = D.22829->dreg;
              ins->dreg = D.22830;
              <D.22825>:
              <D.22819>:
              <D.22815>:
            }
            <D.22808>:
          }
          <D.22802>:
          D.22831 = ins->sreg1;
          sregs[0] = D.22831;
          D.22832 = ins->sreg2;
          sregs[1] = D.22832;
          D.22833 = ins->sreg3;
          sregs[2] = D.22833;
          D.22756 = ins->opcode;
          D.22757 = (int) D.22756;
          D.22796 = D.22757 + -313;
          D.22834 = ins_sreg_counts[D.22796];
          num_sregs = (int) D.22834;
          i = 0;
          goto <D.21987>;
          <D.21986>:
          {
            struct MonoInst * var;

            D.22836 = sregs[i];
            D.22837 = (unsigned int) D.22836;
            D.22738 = cfg->vreg_to_inst_len;
            if (D.22837 < D.22738) goto <D.22838>; else goto <D.22839>;
            <D.22838>:
            D.22741 = cfg->vreg_to_inst;
            D.22836 = sregs[i];
            D.22840 = (unsigned int) D.22836;
            D.22841 = D.22840 * 4;
            D.22842 = D.22741 + D.22841;
            iftmp.32 = *D.22842;
            goto <D.22843>;
            <D.22839>:
            iftmp.32 = 0B;
            <D.22843>:
            var = iftmp.32;
            if (var != 0B) goto <D.22844>; else goto <D.22845>;
            <D.22844>:
            {
              struct MonoMethodVar * vmv;

              D.22809 = cfg->vars;
              D.22846 = var->data.op[0].const_val;
              D.22847 = (unsigned int) D.22846;
              D.22848 = D.22847 * 56;
              vmv = D.22809 + D.22848;
              D.22849 = vmv->reg;
              if (D.22849 != -1) goto <D.22850>; else goto <D.22851>;
              <D.22850>:
              D.22852 = vmv->idx;
              D.22849 = vmv->reg;
              D.22853 = (unsigned int) D.22849;
              if (D.22852 != D.22853) goto <D.22854>; else goto <D.22855>;
              <D.22854>:
              D.22809 = cfg->vars;
              D.22849 = vmv->reg;
              D.22856 = (unsigned int) D.22849;
              D.22857 = D.22856 * 56;
              D.22858 = D.22809 + D.22857;
              D.22859 = D.22858->reg;
              if (D.22859 != -1) goto <D.22860>; else goto <D.22861>;
              <D.22860>:
              D.22826 = cfg->varinfo;
              D.22849 = vmv->reg;
              D.22856 = (unsigned int) D.22849;
              D.22862 = D.22856 * 4;
              D.22863 = D.22826 + D.22862;
              D.22864 = *D.22863;
              D.22865 = D.22864->dreg;
              D.22836 = sregs[i];
              printf ("COALESCE: R%d -> R%d\n", D.22836, D.22865);
              D.22826 = cfg->varinfo;
              D.22849 = vmv->reg;
              D.22856 = (unsigned int) D.22849;
              D.22862 = D.22856 * 4;
              D.22863 = D.22826 + D.22862;
              D.22864 = *D.22863;
              D.22865 = D.22864->dreg;
              sregs[i] = D.22865;
              <D.22861>:
              <D.22855>:
              <D.22851>:
            }
            <D.22845>:
          }
          i = i + 1;
          <D.21987>:
          if (i < num_sregs) goto <D.21986>; else goto <D.21988>;
          <D.21988>:
          mono_inst_set_src_registers (ins, &sregs);
        }
      finally
        {
          sregs = {CLOBBER};
        }
    }
    <D.21981>:
    ins = ins->next;
    <D.21990>:
    if (ins != 0B) goto <D.21989>; else goto <D.21991>;
    <D.21991>:
  }
  bbindex = bbindex + 1;
  <D.21993>:
  bbindex.33 = (unsigned int) bbindex;
  D.22790 = cfg->num_bblocks;
  if (bbindex.33 < D.22790) goto <D.21992>; else goto <D.21994>;
  <D.21994>:
  i = 0;
  goto <D.21996>;
  <D.21995>:
  D.22809 = cfg->vars;
  i.25 = (unsigned int) i;
  D.22867 = i.25 * 56;
  D.22868 = D.22809 + D.22867;
  D.22868->reg = -1;
  i = i + 1;
  <D.21996>:
  i.29 = (unsigned int) i;
  D.22869 = cfg->num_varinfo;
  if (i.29 < D.22869) goto <D.21995>; else goto <D.21997>;
  <D.21997>:
  D.22704 = cfg->comp_done;
  D.22870 = D.22704 & 128;
  if (D.22870 != 0) goto <D.22871>; else goto <D.22872>;
  <D.22871>:
  unlink_unused_bblocks (cfg);
  <D.22872>:
  D.22704 = cfg->comp_done;
  D.22873 = D.22704 & 4294967279;
  cfg->comp_done = D.22873;
  D.22704 = cfg->comp_done;
  D.22874 = D.22704 & 4294967263;
  cfg->comp_done = D.22874;
}


op_phi_to_move (int opcode)
{
  int D.22877;

  switch (opcode) <default: <D.21836>, case 319: <D.21832>, case 320: <D.21833>, case 321: <D.21834>, case 964: <D.21835>>
  <D.21832>:
  D.22877 = 428;
  return D.22877;
  <D.21833>:
  D.22877 = 430;
  return D.22877;
  <D.21834>:
  D.22877 = 431;
  return D.22877;
  <D.21835>:
  D.22877 = 962;
  return D.22877;
  <D.21836>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "ssa.c", 137);
  D.22877 = -1;
  return D.22877;
}


unlink_unused_bblocks (struct MonoCompile * cfg)
{
  unsigned int D.22879;
  unsigned int D.22880;
  _Bool D.22881;
  long int D.22882;
  long int D.22883;
  unsigned int D.22886;
  _Bool D.22887;
  long int D.22888;
  long int D.22889;
  struct MonoBasicBlock * D.22892;
  unsigned int D.22893;
  unsigned int D.22894;
  struct MonoBasicBlock * D.22897;
  struct MonoBasicBlock * * D.22900;
  unsigned int i.34;
  unsigned int D.22902;
  struct MonoBasicBlock * * D.22903;
  unsigned int D.22904;
  unsigned int D.22905;
  struct MonoBasicBlock * * D.22908;
  unsigned int j.35;
  unsigned int D.22910;
  struct MonoBasicBlock * * D.22911;
  struct MonoBasicBlock * D.22912;
  short int D.22913;
  int D.22914;
  struct MonoBasicBlock * * D.22915;
  struct MonoBasicBlock * * D.22916;
  struct MonoBasicBlock * D.22917;
  short int D.22918;
  int D.22919;
  int D.22922;
  unsigned int i.36;
  unsigned int D.22924;
  int i;
  int j;
  struct MonoBasicBlock * bb;

  D.22879 = cfg->comp_done;
  D.22880 = D.22879 & 128;
  D.22881 = D.22880 == 0;
  D.22882 = (long int) D.22881;
  D.22883 = __builtin_expect (D.22882, 0);
  if (D.22883 != 0) goto <D.22884>; else goto <D.22885>;
  <D.22884>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 66, "cfg->comp_done & MONO_COMP_REACHABILITY");
  <D.22885>:
  D.22886 = cfg->verbose_level;
  D.22887 = D.22886 > 1;
  D.22888 = (long int) D.22887;
  D.22889 = __builtin_expect (D.22888, 0);
  if (D.22889 != 0) goto <D.22890>; else goto <D.22891>;
  <D.22890>:
  printf ("\nUNLINK UNUSED BBLOCKS:\n");
  <D.22891>:
  bb = cfg->bb_entry;
  goto <D.21801>;
  <D.21800>:
  D.22892 = bb->next_bb;
  D.22893 = D.22892->flags;
  D.22894 = D.22893 & 2;
  if (D.22894 == 0) goto <D.22895>; else goto <D.22896>;
  <D.22895>:
  D.22892 = bb->next_bb;
  D.22897 = D.22892->next_bb;
  bb->next_bb = D.22897;
  goto <D.22898>;
  <D.22896>:
  bb = bb->next_bb;
  <D.22898>:
  <D.21801>:
  if (bb != 0B) goto <D.22899>; else goto <D.21802>;
  <D.22899>:
  D.22892 = bb->next_bb;
  if (D.22892 != 0B) goto <D.21800>; else goto <D.21802>;
  <D.21802>:
  i = 1;
  goto <D.21810>;
  <D.21809>:
  D.22900 = cfg->bblocks;
  i.34 = (unsigned int) i;
  D.22902 = i.34 * 4;
  D.22903 = D.22900 + D.22902;
  bb = *D.22903;
  D.22904 = bb->flags;
  D.22905 = D.22904 & 2;
  if (D.22905 == 0) goto <D.22906>; else goto <D.22907>;
  <D.22906>:
  j = 0;
  goto <D.21804>;
  <D.21803>:
  D.22908 = bb->in_bb;
  j.35 = (unsigned int) j;
  D.22910 = j.35 * 4;
  D.22911 = D.22908 + D.22910;
  D.22912 = *D.22911;
  unlink_target (D.22912, bb);
  j = j + 1;
  <D.21804>:
  D.22913 = bb->in_count;
  D.22914 = (int) D.22913;
  if (D.22914 > j) goto <D.21803>; else goto <D.21805>;
  <D.21805>:
  j = 0;
  goto <D.21807>;
  <D.21806>:
  D.22915 = bb->out_bb;
  j.35 = (unsigned int) j;
  D.22910 = j.35 * 4;
  D.22916 = D.22915 + D.22910;
  D.22917 = *D.22916;
  unlink_target (bb, D.22917);
  j = j + 1;
  <D.21807>:
  D.22918 = bb->out_count;
  D.22919 = (int) D.22918;
  if (D.22919 > j) goto <D.21806>; else goto <D.21808>;
  <D.21808>:
  D.22886 = cfg->verbose_level;
  D.22887 = D.22886 > 1;
  D.22888 = (long int) D.22887;
  D.22889 = __builtin_expect (D.22888, 0);
  if (D.22889 != 0) goto <D.22920>; else goto <D.22921>;
  <D.22920>:
  D.22922 = bb->block_num;
  printf ("\tUnlinked BB%d\n", D.22922);
  <D.22921>:
  <D.22907>:
  i = i + 1;
  <D.21810>:
  i.36 = (unsigned int) i;
  D.22924 = cfg->num_bblocks;
  if (i.36 < D.22924) goto <D.21809>; else goto <D.21811>;
  <D.21811>:
}


unlink_target (struct MonoBasicBlock * bb, struct MonoBasicBlock * target)
{
  struct MonoBasicBlock * * D.22925;
  unsigned int i.37;
  unsigned int D.22927;
  struct MonoBasicBlock * * D.22928;
  struct MonoBasicBlock * D.22929;
  short int D.22932;
  unsigned short D.22933;
  unsigned short D.22934;
  short int D.22935;
  unsigned int D.22936;
  unsigned int D.22937;
  struct MonoBasicBlock * * D.22938;
  struct MonoBasicBlock * D.22939;
  int D.22940;
  struct MonoBasicBlock * * D.22941;
  struct MonoBasicBlock * * D.22942;
  struct MonoBasicBlock * D.22943;
  short int D.22946;
  unsigned short D.22947;
  unsigned short D.22948;
  short int D.22949;
  unsigned int D.22950;
  unsigned int D.22951;
  struct MonoBasicBlock * * D.22952;
  struct MonoBasicBlock * D.22953;
  int D.22954;
  int i;

  i = 0;
  goto <D.21790>;
  <D.21789>:
  D.22925 = bb->out_bb;
  i.37 = (unsigned int) i;
  D.22927 = i.37 * 4;
  D.22928 = D.22925 + D.22927;
  D.22929 = *D.22928;
  if (D.22929 == target) goto <D.22930>; else goto <D.22931>;
  <D.22930>:
  D.22925 = bb->out_bb;
  i.37 = (unsigned int) i;
  D.22927 = i.37 * 4;
  D.22928 = D.22925 + D.22927;
  D.22925 = bb->out_bb;
  D.22932 = bb->out_count;
  D.22933 = (unsigned short) D.22932;
  D.22934 = D.22933 + 65535;
  D.22935 = (short int) D.22934;
  bb->out_count = D.22935;
  D.22932 = bb->out_count;
  D.22936 = (unsigned int) D.22932;
  D.22937 = D.22936 * 4;
  D.22938 = D.22925 + D.22937;
  D.22939 = *D.22938;
  *D.22928 = D.22939;
  goto <D.21788>;
  <D.22931>:
  i = i + 1;
  <D.21790>:
  D.22932 = bb->out_count;
  D.22940 = (int) D.22932;
  if (D.22940 > i) goto <D.21789>; else goto <D.21788>;
  <D.21788>:
  i = 0;
  goto <D.21793>;
  <D.21792>:
  D.22941 = target->in_bb;
  i.37 = (unsigned int) i;
  D.22927 = i.37 * 4;
  D.22942 = D.22941 + D.22927;
  D.22943 = *D.22942;
  if (D.22943 == bb) goto <D.22944>; else goto <D.22945>;
  <D.22944>:
  D.22941 = target->in_bb;
  i.37 = (unsigned int) i;
  D.22927 = i.37 * 4;
  D.22942 = D.22941 + D.22927;
  D.22941 = target->in_bb;
  D.22946 = target->in_count;
  D.22947 = (unsigned short) D.22946;
  D.22948 = D.22947 + 65535;
  D.22949 = (short int) D.22948;
  target->in_count = D.22949;
  D.22946 = target->in_count;
  D.22950 = (unsigned int) D.22946;
  D.22951 = D.22950 * 4;
  D.22952 = D.22941 + D.22951;
  D.22953 = *D.22952;
  *D.22942 = D.22953;
  goto <D.21791>;
  <D.22945>:
  i = i + 1;
  <D.21793>:
  D.22946 = target->in_count;
  D.22954 = (int) D.22946;
  if (D.22954 > i) goto <D.21792>; else goto <D.21791>;
  <D.21791>:
}


mono_ssa_cprop (struct MonoCompile * cfg)
{
  unsigned int D.22955;
  unsigned int D.22956;
  unsigned int D.22957;
  unsigned int D.22958;
  struct MonoBasicBlock * D.22961;
  struct GList * bblock_list.38;
  unsigned int D.22963;
  unsigned int D.22964;
  unsigned int D.22965;
  unsigned int D.22966;
  struct MonoMethodVar * D.22967;
  unsigned int i.39;
  unsigned int D.22969;
  struct MonoInst * D.22970;
  unsigned int i.40;
  unsigned int D.22974;
  struct GList * bblock_list.41;
  struct GList * bblock_list.42;
  unsigned int D.22979;
  unsigned int D.22980;
  _Bool D.22981;
  long int D.22982;
  long int D.22983;
  struct MonoInst * D.22987;
  short unsigned int D.22989;
  short unsigned int D.22990;
  _Bool D.22991;
  short unsigned int D.22992;
  _Bool D.22993;
  _Bool D.22994;
  short unsigned int D.22996;
  short unsigned int D.22997;
  struct MonoBasicBlock * * D.23001;
  unsigned int D.23002;
  struct MonoBasicBlock * * D.23003;
  struct MonoBasicBlock * D.23004;
  short int D.23005;
  int D.23006;
  unsigned int D.23007;
  int D.23010;
  struct GList * cvars.43;
  struct GList * cvars.44;
  struct MonoBasicBlock * D.23013;
  unsigned int D.23014;
  unsigned int D.23015;
  struct MonoInst * D.23018;
  unsigned int D.23019;
  unsigned int D.23020;
  struct MonoInst * * carray;
  struct MonoBasicBlock * bb;
  struct GList * bblock_list;
  struct GList * cvars;
  struct GList * tmp;
  int i;

  try
    {
      D.22955 = cfg->next_vreg;
      D.22956 = D.22955 * 4;
      carray = monoeg_malloc0 (D.22956);
      D.22957 = cfg->comp_done;
      D.22958 = D.22957 & 64;
      if (D.22958 == 0) goto <D.22959>; else goto <D.22960>;
      <D.22959>:
      mono_ssa_create_def_use (cfg);
      <D.22960>:
      D.22961 = cfg->bb_entry;
      bblock_list.38 = monoeg_g_list_prepend (0B, D.22961);
      bblock_list = bblock_list.38;
      D.22961 = cfg->bb_entry;
      D.22961 = cfg->bb_entry;
      D.22963 = D.22961->flags;
      D.22964 = D.22963 | 2;
      D.22961->flags = D.22964;
      D.22965 = cfg->num_varinfo;
      D.22966 = D.22965 * 4;
      memset (carray, 0, D.22966);
      i = 0;
      goto <D.22160>;
      <D.22159>:
      {
        struct MonoMethodVar * info;

        D.22967 = cfg->vars;
        i.39 = (unsigned int) i;
        D.22969 = i.39 * 56;
        info = D.22967 + D.22969;
        D.22970 = info->def;
        if (D.22970 == 0B) goto <D.22971>; else goto <D.22972>;
        <D.22971>:
        info->cpstate = 2;
        <D.22972>:
      }
      i = i + 1;
      <D.22160>:
      i.40 = (unsigned int) i;
      D.22965 = cfg->num_varinfo;
      if (i.40 < D.22965) goto <D.22159>; else goto <D.22161>;
      <D.22161>:
      D.22961 = cfg->bb_entry;
      bb = D.22961->next_bb;
      goto <D.22163>;
      <D.22162>:
      D.22974 = bb->region;
      if (D.22974 != 0) goto <D.22975>; else goto <D.22976>;
      <D.22975>:
      add_cprop_bb (cfg, bb, &bblock_list);
      <D.22976>:
      bb = bb->next_bb;
      <D.22163>:
      if (bb != 0B) goto <D.22162>; else goto <D.22164>;
      <D.22164>:
      cvars = 0B;
      goto <D.22182>;
      <D.22181>:
      {
        struct MonoInst * inst;

        bblock_list.41 = bblock_list;
        bb = bblock_list.41->data;
        bblock_list.41 = bblock_list;
        bblock_list.41 = bblock_list;
        bblock_list.42 = monoeg_g_list_delete_link (bblock_list.41, bblock_list.41);
        bblock_list = bblock_list.42;
        D.22979 = bb->flags;
        D.22980 = D.22979 & 2;
        D.22981 = D.22980 == 0;
        D.22982 = (long int) D.22981;
        D.22983 = __builtin_expect (D.22982, 0);
        if (D.22983 != 0) goto <D.22984>; else goto <D.22985>;
        <D.22984>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1185, "bb->flags & BB_REACHABLE");
        <D.22985>:
        D.22987 = bb->last_ins;
        if (D.22987 == 0B) goto <D.22986>; else goto <D.22988>;
        <D.22988>:
        D.22987 = bb->last_ins;
        D.22989 = D.22987->opcode;
        D.22990 = D.22989 + 64981;
        D.22991 = D.22990 > 9;
        D.22992 = D.22989 + 64874;
        D.22993 = D.22992 > 9;
        D.22994 = D.22991 & D.22993;
        if (D.22994 != 0) goto <D.22995>; else goto <D.22168>;
        <D.22995>:
        D.22987 = bb->last_ins;
        D.22996 = D.22987->opcode;
        D.22997 = D.22996 + 64884;
        if (D.22997 > 9) goto <D.22998>; else goto <D.22168>;
        <D.22998>:
        D.22987 = bb->last_ins;
        D.22996 = D.22987->opcode;
        if (D.22996 != 446) goto <D.22999>; else goto <D.22168>;
        <D.22999>:
        D.22987 = bb->last_ins;
        D.22996 = D.22987->opcode;
        if (D.22996 != 763) goto <D.23000>; else goto <D.22168>;
        <D.23000>:
        D.22987 = bb->last_ins;
        D.22996 = D.22987->opcode;
        if (D.22996 != 370) goto <D.22986>; else goto <D.22168>;
        <D.22986>:
        i = 0;
        goto <D.22167>;
        <D.22166>:
        D.23001 = bb->out_bb;
        i.39 = (unsigned int) i;
        D.23002 = i.39 * 4;
        D.23003 = D.23001 + D.23002;
        D.23004 = *D.23003;
        add_cprop_bb (cfg, D.23004, &bblock_list);
        i = i + 1;
        <D.22167>:
        D.23005 = bb->out_count;
        D.23006 = (int) D.23005;
        if (D.23006 > i) goto <D.22166>; else goto <D.22168>;
        <D.22168>:
        D.23007 = cfg->verbose_level;
        if (D.23007 > 1) goto <D.23008>; else goto <D.23009>;
        <D.23008>:
        D.23010 = bb->block_num;
        printf ("\nSSA CONSPROP BB%d:\n", D.23010);
        <D.23009>:
        inst = bb->code;
        goto <D.22170>;
        <D.22169>:
        visit_inst (cfg, bb, inst, &cvars, &bblock_list, carray);
        inst = inst->next;
        <D.22170>:
        if (inst != 0B) goto <D.22169>; else goto <D.22171>;
        <D.22171>:
        goto <D.22179>;
        <D.22178>:
        {
          struct MonoMethodVar * info;

          cvars.43 = cvars;
          info = cvars.43->data;
          cvars.43 = cvars;
          cvars.43 = cvars;
          cvars.44 = monoeg_g_list_delete_link (cvars.43, cvars.43);
          cvars = cvars.44;
          tmp = info->uses;
          goto <D.22176>;
          <D.22175>:
          {
            struct MonoVarUsageInfo * ui;

            ui = tmp->data;
            D.23013 = ui->bb;
            D.23014 = D.23013->flags;
            D.23015 = D.23014 & 2;
            if (D.23015 == 0) goto <D.23016>; else goto <D.23017>;
            <D.23016>:
            // predicted unlikely by continue predictor.
            goto <D.22174>;
            <D.23017>:
            D.23018 = ui->inst;
            D.23013 = ui->bb;
            visit_inst (cfg, D.23013, D.23018, &cvars, &bblock_list, carray);
          }
          <D.22174>:
          tmp = tmp->next;
          <D.22176>:
          if (tmp != 0B) goto <D.22175>; else goto <D.22177>;
          <D.22177>:
        }
        <D.22179>:
        cvars.43 = cvars;
        if (cvars.43 != 0B) goto <D.22178>; else goto <D.22180>;
        <D.22180>:
      }
      <D.22182>:
      bblock_list.41 = bblock_list;
      if (bblock_list.41 != 0B) goto <D.22181>; else goto <D.22183>;
      <D.22183>:
      D.22961 = cfg->bb_entry;
      bb = D.22961->next_bb;
      goto <D.22189>;
      <D.22188>:
      {
        struct MonoInst * inst;

        inst = bb->code;
        goto <D.22186>;
        <D.22185>:
        fold_ins (cfg, bb, inst, carray);
        inst = inst->next;
        <D.22186>:
        if (inst != 0B) goto <D.22185>; else goto <D.22187>;
        <D.22187>:
      }
      bb = bb->next_bb;
      <D.22189>:
      if (bb != 0B) goto <D.22188>; else goto <D.22190>;
      <D.22190>:
      monoeg_g_free (carray);
      D.22957 = cfg->comp_done;
      D.23019 = D.22957 | 128;
      cfg->comp_done = D.23019;
      D.22957 = cfg->comp_done;
      D.23020 = D.22957 & 4294967231;
      cfg->comp_done = D.23020;
      i = 0;
      goto <D.22193>;
      <D.22192>:
      {
        struct MonoMethodVar * info;

        D.22967 = cfg->vars;
        i.39 = (unsigned int) i;
        D.22969 = i.39 * 56;
        info = D.22967 + D.22969;
        info->def = 0B;
        info->uses = 0B;
      }
      i = i + 1;
      <D.22193>:
      i.40 = (unsigned int) i;
      D.22965 = cfg->num_varinfo;
      if (i.40 < D.22965) goto <D.22192>; else goto <D.22194>;
      <D.22194>:
    }
  finally
    {
      bblock_list = {CLOBBER};
      cvars = {CLOBBER};
    }
}


mono_ssa_create_def_use (struct MonoCompile * cfg)
{
  unsigned int D.23021;
  unsigned int D.23022;
  _Bool D.23023;
  long int D.23024;
  long int D.23025;
  short unsigned int D.23028;
  int D.23029;
  int D.23030;
  int D.23031;
  int D.23034;
  int D.23035;
  int D.23036;
  signed char D.23037;
  struct MonoInst * iftmp.45;
  int D.23039;
  unsigned int D.23040;
  unsigned int D.23041;
  struct MonoInst * * D.23044;
  unsigned int D.23045;
  unsigned int D.23046;
  struct MonoInst * * D.23047;
  unsigned char D.23051;
  int D.23052;
  int D.23053;
  short unsigned int D.23056;
  struct MonoInst * iftmp.46;
  int D.23060;
  unsigned int D.23061;
  unsigned int D.23064;
  unsigned int D.23065;
  struct MonoInst * * D.23066;
  unsigned char D.23070;
  int D.23071;
  int D.23072;
  short unsigned int D.23075;
  short unsigned int D.23076;
  _Bool D.23077;
  _Bool D.23078;
  _Bool D.23079;
  int * D.23082;
  unsigned int i.47;
  unsigned int D.23084;
  int * D.23085;
  int D.23086;
  _Bool D.23087;
  long int D.23088;
  long int D.23089;
  struct MonoInst * iftmp.48;
  unsigned int D.23093;
  unsigned int D.23096;
  unsigned int D.23097;
  struct MonoInst * * D.23098;
  char D.23100;
  struct MonoInst * iftmp.49;
  unsigned char D.23111;
  int D.23112;
  int D.23113;
  struct MonoMethodVar * D.23116;
  int D.23117;
  unsigned int D.23118;
  unsigned int D.23119;
  unsigned int D.23120;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int i;

  D.23021 = cfg->comp_done;
  D.23022 = D.23021 & 64;
  D.23023 = D.23022 != 0;
  D.23024 = (long int) D.23023;
  D.23025 = __builtin_expect (D.23024, 0);
  if (D.23025 != 0) goto <D.23026>; else goto <D.23027>;
  <D.23026>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 619, "!(cfg->comp_done & MONO_COMP_SSA_DEF_USE)");
  <D.23027>:
  bb = cfg->bb_entry;
  goto <D.22022>;
  <D.22021>:
  ins = bb->code;
  goto <D.22019>;
  <D.22018>:
  {
    const char * spec;
    struct MonoMethodVar * info;
    int num_sregs;
    int sregs[3];

    try
      {
        D.23028 = ins->opcode;
        D.23029 = (int) D.23028;
        D.23030 = D.23029 + -313;
        D.23031 = D.23030 * 4;
        spec = &ins_info[D.23031];
        D.23028 = ins->opcode;
        if (D.23028 == 316) goto <D.23032>; else goto <D.23033>;
        <D.23032>:
        // predicted unlikely by continue predictor.
        goto <D.22008>;
        <D.23033>:
        D.23034 = ins->sreg1;
        sregs[0] = D.23034;
        D.23035 = ins->sreg2;
        sregs[1] = D.23035;
        D.23036 = ins->sreg3;
        sregs[2] = D.23036;
        D.23028 = ins->opcode;
        D.23029 = (int) D.23028;
        D.23030 = D.23029 + -313;
        D.23037 = ins_sreg_counts[D.23030];
        num_sregs = (int) D.23037;
        i = 0;
        goto <D.22011>;
        <D.22010>:
        {
          struct MonoInst * var;

          D.23039 = sregs[i];
          D.23040 = (unsigned int) D.23039;
          D.23041 = cfg->vreg_to_inst_len;
          if (D.23040 < D.23041) goto <D.23042>; else goto <D.23043>;
          <D.23042>:
          D.23044 = cfg->vreg_to_inst;
          D.23039 = sregs[i];
          D.23045 = (unsigned int) D.23039;
          D.23046 = D.23045 * 4;
          D.23047 = D.23044 + D.23046;
          iftmp.45 = *D.23047;
          goto <D.23048>;
          <D.23043>:
          iftmp.45 = 0B;
          <D.23048>:
          var = iftmp.45;
          if (var != 0B) goto <D.23049>; else goto <D.23050>;
          <D.23049>:
          D.23051 = var->flags;
          D.23052 = (int) D.23051;
          D.23053 = D.23052 & 20;
          if (D.23053 == 0) goto <D.23054>; else goto <D.23055>;
          <D.23054>:
          record_use (cfg, var, bb, ins);
          <D.23055>:
          <D.23050>:
        }
        i = i + 1;
        <D.22011>:
        if (i < num_sregs) goto <D.22010>; else goto <D.22012>;
        <D.22012>:
        D.23028 = ins->opcode;
        D.23056 = D.23028 + 65162;
        if (D.23056 <= 16) goto <D.23057>; else goto <D.23058>;
        <D.23057>:
        {
          struct MonoInst * var;

          D.23060 = ins->dreg;
          D.23061 = (unsigned int) D.23060;
          D.23041 = cfg->vreg_to_inst_len;
          if (D.23061 < D.23041) goto <D.23062>; else goto <D.23063>;
          <D.23062>:
          D.23044 = cfg->vreg_to_inst;
          D.23060 = ins->dreg;
          D.23064 = (unsigned int) D.23060;
          D.23065 = D.23064 * 4;
          D.23066 = D.23044 + D.23065;
          iftmp.46 = *D.23066;
          goto <D.23067>;
          <D.23063>:
          iftmp.46 = 0B;
          <D.23067>:
          var = iftmp.46;
          if (var != 0B) goto <D.23068>; else goto <D.23069>;
          <D.23068>:
          D.23070 = var->flags;
          D.23071 = (int) D.23070;
          D.23072 = D.23071 & 20;
          if (D.23072 == 0) goto <D.23073>; else goto <D.23074>;
          <D.23073>:
          record_use (cfg, var, bb, ins);
          <D.23074>:
          <D.23069>:
        }
        <D.23058>:
        D.23075 = ins->opcode;
        D.23076 = D.23075 + 65217;
        D.23077 = D.23076 <= 2;
        D.23078 = D.23075 == 964;
        D.23079 = D.23077 | D.23078;
        if (D.23079 != 0) goto <D.23080>; else goto <D.23081>;
        <D.23080>:
        D.23082 = ins->data.op[1].phi_args;
        i = *D.23082;
        goto <D.22015>;
        <D.22014>:
        D.23082 = ins->data.op[1].phi_args;
        i.47 = (unsigned int) i;
        D.23084 = i.47 * 4;
        D.23085 = D.23082 + D.23084;
        D.23086 = *D.23085;
        D.23087 = D.23086 == -1;
        D.23088 = (long int) D.23087;
        D.23089 = __builtin_expect (D.23088, 0);
        if (D.23089 != 0) goto <D.23090>; else goto <D.23091>;
        <D.23090>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 647, "ins->inst_phi_args [i] != -1");
        <D.23091>:
        D.23082 = ins->data.op[1].phi_args;
        i.47 = (unsigned int) i;
        D.23084 = i.47 * 4;
        D.23085 = D.23082 + D.23084;
        D.23086 = *D.23085;
        D.23093 = (unsigned int) D.23086;
        D.23041 = cfg->vreg_to_inst_len;
        if (D.23093 < D.23041) goto <D.23094>; else goto <D.23095>;
        <D.23094>:
        D.23044 = cfg->vreg_to_inst;
        D.23082 = ins->data.op[1].phi_args;
        i.47 = (unsigned int) i;
        D.23084 = i.47 * 4;
        D.23085 = D.23082 + D.23084;
        D.23086 = *D.23085;
        D.23096 = (unsigned int) D.23086;
        D.23097 = D.23096 * 4;
        D.23098 = D.23044 + D.23097;
        iftmp.48 = *D.23098;
        goto <D.23099>;
        <D.23095>:
        iftmp.48 = 0B;
        <D.23099>:
        record_use (cfg, iftmp.48, bb, ins);
        i = i + -1;
        <D.22015>:
        if (i > 0) goto <D.22014>; else goto <D.22016>;
        <D.22016>:
        <D.23081>:
        D.23100 = *spec;
        if (D.23100 != 32) goto <D.23101>; else goto <D.23102>;
        <D.23101>:
        D.23028 = ins->opcode;
        D.23056 = D.23028 + 65162;
        if (D.23056 > 16) goto <D.23103>; else goto <D.23104>;
        <D.23103>:
        {
          struct MonoInst * var;

          D.23060 = ins->dreg;
          D.23061 = (unsigned int) D.23060;
          D.23041 = cfg->vreg_to_inst_len;
          if (D.23061 < D.23041) goto <D.23106>; else goto <D.23107>;
          <D.23106>:
          D.23044 = cfg->vreg_to_inst;
          D.23060 = ins->dreg;
          D.23064 = (unsigned int) D.23060;
          D.23065 = D.23064 * 4;
          D.23066 = D.23044 + D.23065;
          iftmp.49 = *D.23066;
          goto <D.23108>;
          <D.23107>:
          iftmp.49 = 0B;
          <D.23108>:
          var = iftmp.49;
          if (var != 0B) goto <D.23109>; else goto <D.23110>;
          <D.23109>:
          D.23111 = var->flags;
          D.23112 = (int) D.23111;
          D.23113 = D.23112 & 20;
          if (D.23113 == 0) goto <D.23114>; else goto <D.23115>;
          <D.23114>:
          D.23116 = cfg->vars;
          D.23117 = var->data.op[0].const_val;
          D.23118 = (unsigned int) D.23117;
          D.23119 = D.23118 * 56;
          info = D.23116 + D.23119;
          info->def = ins;
          info->def_bb = bb;
          <D.23115>:
          <D.23110>:
        }
        <D.23104>:
        <D.23102>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.22008>:
  ins = ins->next;
  <D.22019>:
  if (ins != 0B) goto <D.22018>; else goto <D.22020>;
  <D.22020>:
  bb = bb->next_bb;
  <D.22022>:
  if (bb != 0B) goto <D.22021>; else goto <D.22023>;
  <D.22023>:
  D.23021 = cfg->comp_done;
  D.23120 = D.23021 | 64;
  cfg->comp_done = D.23120;
}


add_cprop_bb (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct GList * * bblist)
{
  unsigned int D.23123;
  _Bool D.23124;
  long int D.23125;
  long int D.23126;
  int D.23129;
  unsigned int D.23130;
  unsigned int D.23131;
  unsigned int D.23134;
  struct GList * D.23135;
  struct GList * D.23136;

  D.23123 = cfg->verbose_level;
  D.23124 = D.23123 > 1;
  D.23125 = (long int) D.23124;
  D.23126 = __builtin_expect (D.23125, 0);
  if (D.23126 != 0) goto <D.23127>; else goto <D.23128>;
  <D.23127>:
  D.23129 = bb->block_num;
  printf ("\tAdd BB%d to worklist\n", D.23129);
  <D.23128>:
  D.23130 = bb->flags;
  D.23131 = D.23130 & 2;
  if (D.23131 == 0) goto <D.23132>; else goto <D.23133>;
  <D.23132>:
  D.23130 = bb->flags;
  D.23134 = D.23130 | 2;
  bb->flags = D.23134;
  D.23135 = *bblist;
  D.23136 = monoeg_g_list_prepend (D.23135, bb);
  *bblist = D.23136;
  <D.23133>:
}


visit_inst (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoInst * ins, struct GList * * cvars, struct GList * * bblist, struct MonoInst * * carray)
{
  short unsigned int D.23137;
  int D.23138;
  int D.23139;
  int D.23140;
  unsigned int D.23143;
  short unsigned int D.23146;
  short unsigned int D.23147;
  _Bool D.23148;
  _Bool D.23149;
  _Bool D.23150;
  struct MonoMethodVar * D.23153;
  struct MonoInst * iftmp.50;
  int D.23155;
  unsigned int D.23156;
  unsigned int D.23157;
  struct MonoInst * * D.23160;
  unsigned int D.23161;
  unsigned int D.23162;
  struct MonoInst * * D.23163;
  int D.23165;
  unsigned int D.23166;
  unsigned int D.23167;
  struct MonoInst * iftmp.51;
  int * D.23169;
  unsigned int j.52;
  unsigned int D.23171;
  int * D.23172;
  int D.23173;
  unsigned int D.23174;
  unsigned int D.23177;
  unsigned int D.23178;
  struct MonoInst * * D.23179;
  int D.23181;
  unsigned int D.23182;
  unsigned int D.23183;
  struct MonoBasicBlock * D.23184;
  unsigned int D.23187;
  unsigned int D.23188;
  struct MonoInst * D.23193;
  char D.23196;
  int D.23199;
  unsigned int D.23200;
  unsigned int D.23201;
  struct MonoInst * * D.23202;
  struct MonoInst * D.23203;
  _Bool D.23204;
  long int D.23205;
  long int D.23206;
  short unsigned int D.23211;
  int D.23214;
  int D.23215;
  int D.23218;
  char D.23221;
  _Bool D.23224;
  long int D.23225;
  long int D.23226;
  short unsigned int D.23233;
  const char * D.23235;
  char D.23236;
  const char * D.23238;
  char D.23239;
  char D.23241;
  struct MonoInst * iftmp.53;
  unsigned char D.23252;
  int D.23253;
  int D.23254;
  int D.23256;
  unsigned int D.23257;
  unsigned int D.23258;
  char D.23259;
  struct MonoInst * c0.54;
  struct MonoInst * * D.23274;
  struct MonoInst * D.23276;
  struct GList * D.23279;
  struct GList * D.23280;
  struct GList * D.23283;
  struct MonoInst * D.23289;
  struct MonoInst * D.23292;
  struct MonoJumpInfoBBTable * iftmp.55;
  struct MonoJumpInfoBBTable * iftmp.56;
  struct MonoJumpInfoBBTable * iftmp.57;
  struct MonoJumpInfoBBTable * iftmp.58;
  struct MonoInst * D.23313;
  short unsigned int D.23315;
  struct MonoBasicBlock * * D.23316;
  unsigned int i.59;
  unsigned int D.23318;
  struct MonoBasicBlock * * D.23319;
  struct MonoBasicBlock * D.23320;
  int D.23323;
  _Bool D.23324;
  long int D.23325;
  long int D.23326;
  int D.23329;
  _Bool D.23330;
  long int D.23331;
  long int D.23332;
  int D.23335;
  unsigned int D.23336;
  unsigned int D.23337;
  struct MonoInst * * D.23338;
  struct MonoInst * D.23339;
  int D.23342;
  unsigned int idx.60;
  unsigned int D.23347;
  struct MonoBasicBlock * * D.23348;
  struct MonoBasicBlock * D.23349;
  struct MonoBasicBlock * * D.23357;
  unsigned int i.61;
  unsigned int D.23359;
  struct MonoBasicBlock * * D.23360;
  struct MonoBasicBlock * D.23361;
  int D.23364;
  short unsigned int D.23369;
  short unsigned int D.23370;
  _Bool D.23371;
  short unsigned int D.23372;
  _Bool D.23373;
  _Bool D.23374;
  short unsigned int D.23376;
  short unsigned int D.23379;
  _Bool D.23380;
  long int D.23381;
  long int D.23382;
  int D.23385;
  unsigned char D.23388;
  unsigned char D.23389;
  unsigned char D.23391;
  unsigned char D.23393;
  struct MonoBasicBlock * D.23396;
  short unsigned int D.23400;
  short unsigned int D.23401;
  _Bool D.23402;
  short unsigned int D.23403;
  _Bool D.23404;
  _Bool D.23405;
  short unsigned int D.23407;
  unsigned char D.23408;
  int D.23409;
  int D.23410;
  struct MonoBasicBlock * * D.23413;
  struct MonoBasicBlock * D.23414;
  int D.23416;
  struct MonoBasicBlock * * D.23419;
  struct MonoBasicBlock * D.23420;
  const char * spec;

  D.23137 = ins->opcode;
  D.23138 = (int) D.23137;
  D.23139 = D.23138 + -313;
  D.23140 = D.23139 * 4;
  spec = &ins_info[D.23140];
  D.23137 = ins->opcode;
  if (D.23137 == 316) goto <D.23141>; else goto <D.23142>;
  <D.23141>:
  return;
  <D.23142>:
  D.23143 = cfg->verbose_level;
  if (D.23143 > 1) goto <D.23144>; else goto <D.23145>;
  <D.23144>:
  mono_print_ins (ins);
  <D.23145>:
  D.23146 = ins->opcode;
  D.23147 = D.23146 + 65217;
  D.23148 = D.23147 <= 2;
  D.23149 = D.23146 == 964;
  D.23150 = D.23148 | D.23149;
  if (D.23150 != 0) goto <D.23151>; else goto <D.23152>;
  <D.23151>:
  {
    struct MonoMethodVar * info;
    struct MonoInst * c0;
    int j;

    D.23153 = cfg->vars;
    D.23155 = ins->dreg;
    D.23156 = (unsigned int) D.23155;
    D.23157 = cfg->vreg_to_inst_len;
    if (D.23156 < D.23157) goto <D.23158>; else goto <D.23159>;
    <D.23158>:
    D.23160 = cfg->vreg_to_inst;
    D.23155 = ins->dreg;
    D.23161 = (unsigned int) D.23155;
    D.23162 = D.23161 * 4;
    D.23163 = D.23160 + D.23162;
    iftmp.50 = *D.23163;
    goto <D.23164>;
    <D.23159>:
    iftmp.50 = 0B;
    <D.23164>:
    D.23165 = iftmp.50->data.op[0].const_val;
    D.23166 = (unsigned int) D.23165;
    D.23167 = D.23166 * 56;
    info = D.23153 + D.23167;
    c0 = 0B;
    j = 1;
    goto <D.22112>;
    <D.22111>:
    {
      struct MonoInst * var;
      struct MonoMethodVar * mv;
      struct MonoInst * src;

      D.23169 = ins->data.op[1].phi_args;
      j.52 = (unsigned int) j;
      D.23171 = j.52 * 4;
      D.23172 = D.23169 + D.23171;
      D.23173 = *D.23172;
      D.23174 = (unsigned int) D.23173;
      D.23157 = cfg->vreg_to_inst_len;
      if (D.23174 < D.23157) goto <D.23175>; else goto <D.23176>;
      <D.23175>:
      D.23160 = cfg->vreg_to_inst;
      D.23169 = ins->data.op[1].phi_args;
      j.52 = (unsigned int) j;
      D.23171 = j.52 * 4;
      D.23172 = D.23169 + D.23171;
      D.23173 = *D.23172;
      D.23177 = (unsigned int) D.23173;
      D.23178 = D.23177 * 4;
      D.23179 = D.23160 + D.23178;
      iftmp.51 = *D.23179;
      goto <D.23180>;
      <D.23176>:
      iftmp.51 = 0B;
      <D.23180>:
      var = iftmp.51;
      D.23153 = cfg->vars;
      D.23181 = var->data.op[0].const_val;
      D.23182 = (unsigned int) D.23181;
      D.23183 = D.23182 * 56;
      mv = D.23153 + D.23183;
      src = mv->def;
      D.23184 = mv->def_bb;
      if (D.23184 != 0B) goto <D.23185>; else goto <D.23186>;
      <D.23185>:
      D.23184 = mv->def_bb;
      D.23187 = D.23184->flags;
      D.23188 = D.23187 & 2;
      if (D.23188 == 0) goto <D.23189>; else goto <D.23190>;
      <D.23189>:
      // predicted unlikely by continue predictor.
      goto <D.22109>;
      <D.23190>:
      <D.23186>:
      D.23193 = mv->def;
      if (D.23193 == 0B) goto <D.23191>; else goto <D.23194>;
      <D.23194>:
      if (src == 0B) goto <D.23191>; else goto <D.23195>;
      <D.23195>:
      D.23196 = mv->cpstate;
      if (D.23196 == 2) goto <D.23191>; else goto <D.23192>;
      <D.23191>:
      change_varstate (cfg, cvars, info, 2, 0B, carray);
      goto <D.22110>;
      <D.23192>:
      D.23196 = mv->cpstate;
      if (D.23196 == 0) goto <D.23197>; else goto <D.23198>;
      <D.23197>:
      // predicted unlikely by continue predictor.
      goto <D.22109>;
      <D.23198>:
      D.23199 = var->dreg;
      D.23200 = (unsigned int) D.23199;
      D.23201 = D.23200 * 4;
      D.23202 = carray + D.23201;
      D.23203 = *D.23202;
      D.23204 = D.23203 == 0B;
      D.23205 = (long int) D.23204;
      D.23206 = __builtin_expect (D.23205, 0);
      if (D.23206 != 0) goto <D.23207>; else goto <D.23208>;
      <D.23207>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 873, "carray [var->dreg]");
      <D.23208>:
      if (c0 == 0B) goto <D.23209>; else goto <D.23210>;
      <D.23209>:
      D.23199 = var->dreg;
      D.23200 = (unsigned int) D.23199;
      D.23201 = D.23200 * 4;
      D.23202 = carray + D.23201;
      c0 = *D.23202;
      <D.23210>:
      D.23211 = c0->opcode;
      if (D.23211 != 362) goto <D.23212>; else goto <D.23213>;
      <D.23212>:
      change_varstate (cfg, cvars, info, 2, 0B, carray);
      goto <D.22110>;
      <D.23213>:
      D.23199 = var->dreg;
      D.23200 = (unsigned int) D.23199;
      D.23201 = D.23200 * 4;
      D.23202 = carray + D.23201;
      D.23203 = *D.23202;
      D.23214 = D.23203->data.op[0].const_val;
      D.23215 = c0->data.op[0].const_val;
      if (D.23214 != D.23215) goto <D.23216>; else goto <D.23217>;
      <D.23216>:
      change_varstate (cfg, cvars, info, 2, 0B, carray);
      goto <D.22110>;
      <D.23217>:
    }
    <D.22109>:
    j = j + 1;
    <D.22112>:
    D.23169 = ins->data.op[1].phi_args;
    D.23218 = *D.23169;
    if (D.23218 >= j) goto <D.22111>; else goto <D.22110>;
    <D.22110>:
    if (c0 != 0B) goto <D.23219>; else goto <D.23220>;
    <D.23219>:
    D.23221 = info->cpstate;
    if (D.23221 <= 0) goto <D.23222>; else goto <D.23223>;
    <D.23222>:
    change_varstate (cfg, cvars, info, 1, c0, carray);
    D.23211 = c0->opcode;
    D.23224 = D.23211 != 362;
    D.23225 = (long int) D.23224;
    D.23226 = __builtin_expect (D.23225, 0);
    if (D.23226 != 0) goto <D.23227>; else goto <D.23228>;
    <D.23227>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 893, "c0->opcode == OP_ICONST");
    <D.23228>:
    <D.23223>:
    <D.23220>:
  }
  goto <D.23229>;
  <D.23152>:
  D.23137 = ins->opcode;
  D.23233 = D.23137 + 65162;
  if (D.23233 > 16) goto <D.23234>; else goto <D.23230>;
  <D.23234>:
  D.23235 = spec + 1;
  D.23236 = *D.23235;
  if (D.23236 != 32) goto <D.23231>; else goto <D.23237>;
  <D.23237>:
  D.23238 = spec + 2;
  D.23239 = *D.23238;
  if (D.23239 != 32) goto <D.23231>; else goto <D.23240>;
  <D.23240>:
  D.23241 = *spec;
  if (D.23241 != 32) goto <D.23231>; else goto <D.23230>;
  <D.23231>:
  {
    struct MonoInst * var;
    struct MonoInst * c0;
    int state;

    try
      {
        D.23241 = *spec;
        if (D.23241 != 32) goto <D.23242>; else goto <D.23243>;
        <D.23242>:
        D.23155 = ins->dreg;
        D.23156 = (unsigned int) D.23155;
        D.23157 = cfg->vreg_to_inst_len;
        if (D.23156 < D.23157) goto <D.23245>; else goto <D.23246>;
        <D.23245>:
        D.23160 = cfg->vreg_to_inst;
        D.23155 = ins->dreg;
        D.23161 = (unsigned int) D.23155;
        D.23162 = D.23161 * 4;
        D.23163 = D.23160 + D.23162;
        iftmp.53 = *D.23163;
        goto <D.23247>;
        <D.23246>:
        iftmp.53 = 0B;
        <D.23247>:
        var = iftmp.53;
        goto <D.23248>;
        <D.23243>:
        var = 0B;
        <D.23248>:
        c0 = 0B;
        state = evaluate_ins (cfg, ins, &c0, carray);
        if (var != 0B) goto <D.23251>; else goto <D.23249>;
        <D.23251>:
        D.23252 = var->flags;
        D.23253 = (int) D.23252;
        D.23254 = D.23253 & 20;
        if (D.23254 == 0) goto <D.23255>; else goto <D.23249>;
        <D.23255>:
        {
          struct MonoMethodVar * info;

          D.23153 = cfg->vars;
          D.23256 = var->data.op[0].const_val;
          D.23257 = (unsigned int) D.23256;
          D.23258 = D.23257 * 56;
          info = D.23153 + D.23258;
          D.23259 = info->cpstate;
          if (D.23259 <= 1) goto <D.23260>; else goto <D.23261>;
          <D.23260>:
          if (state == 1) goto <D.23262>; else goto <D.23263>;
          <D.23262>:
          c0.54 = c0;
          change_varstate (cfg, cvars, info, 1, c0.54, carray);
          goto <D.23265>;
          <D.23263>:
          if (state == 2) goto <D.23266>; else goto <D.23267>;
          <D.23266>:
          change_varstate (cfg, cvars, info, 2, 0B, carray);
          <D.23267>:
          <D.23265>:
          <D.23261>:
        }
        goto <D.23250>;
        <D.23249>:
        if (var == 0B) goto <D.23268>; else goto <D.23269>;
        <D.23268>:
        D.23155 = ins->dreg;
        if (D.23155 != -1) goto <D.23270>; else goto <D.23271>;
        <D.23270>:
        c0.54 = c0;
        if (c0.54 != 0B) goto <D.23272>; else goto <D.23273>;
        <D.23272>:
        D.23155 = ins->dreg;
        D.23161 = (unsigned int) D.23155;
        D.23162 = D.23161 * 4;
        D.23274 = carray + D.23162;
        c0.54 = c0;
        *D.23274 = c0.54;
        goto <D.23275>;
        <D.23273>:
        D.23155 = ins->dreg;
        D.23161 = (unsigned int) D.23155;
        D.23162 = D.23161 * 4;
        D.23274 = carray + D.23162;
        D.23276 = *D.23274;
        if (D.23276 != 0B) goto <D.23277>; else goto <D.23278>;
        <D.23277>:
        D.23155 = ins->dreg;
        D.23161 = (unsigned int) D.23155;
        D.23162 = D.23161 * 4;
        D.23274 = carray + D.23162;
        *D.23274 = 0B;
        D.23279 = *bblist;
        D.23280 = monoeg_g_list_find (D.23279, bb);
        if (D.23280 == 0B) goto <D.23281>; else goto <D.23282>;
        <D.23281>:
        D.23279 = *bblist;
        D.23283 = monoeg_g_list_prepend (D.23279, bb);
        *bblist = D.23283;
        <D.23282>:
        <D.23278>:
        <D.23275>:
        <D.23271>:
        <D.23269>:
        <D.23250>:
        D.23137 = ins->opcode;
        if (D.23137 == 735) goto <D.23284>; else goto <D.23287>;
        <D.23287>:
        D.23137 = ins->opcode;
        if (D.23137 == 736) goto <D.23288>; else goto <D.23285>;
        <D.23288>:
        D.23289 = ins->data.op[1].src;
        if (D.23289 == 8B) goto <D.23284>; else goto <D.23285>;
        <D.23285>:
        D.23137 = ins->opcode;
        if (D.23137 == 370) goto <D.23284>; else goto <D.23290>;
        <D.23290>:
        D.23137 = ins->opcode;
        if (D.23137 == 738) goto <D.23291>; else goto <D.23286>;
        <D.23291>:
        D.23289 = ins->data.op[1].src;
        D.23292 = D.23289->data.op[1].src;
        if (D.23292 == 8B) goto <D.23284>; else goto <D.23286>;
        <D.23284>:
        {
          int i;
          struct MonoJumpInfoBBTable * table;

          D.23137 = ins->opcode;
          if (D.23137 == 735) goto <D.23294>; else goto <D.23295>;
          <D.23294>:
          iftmp.55 = ins->data.op[0].p;
          goto <D.23296>;
          <D.23295>:
          D.23137 = ins->opcode;
          if (D.23137 == 736) goto <D.23300>; else goto <D.23298>;
          <D.23300>:
          D.23289 = ins->data.op[1].src;
          if (D.23289 == 8B) goto <D.23301>; else goto <D.23298>;
          <D.23301>:
          iftmp.56 = ins->data.op[0].p;
          goto <D.23299>;
          <D.23298>:
          D.23137 = ins->opcode;
          if (D.23137 == 370) goto <D.23303>; else goto <D.23304>;
          <D.23303>:
          iftmp.57 = ins->data.op[0].p;
          goto <D.23305>;
          <D.23304>:
          D.23137 = ins->opcode;
          if (D.23137 == 738) goto <D.23309>; else goto <D.23307>;
          <D.23309>:
          D.23289 = ins->data.op[1].src;
          D.23292 = D.23289->data.op[1].src;
          if (D.23292 == 8B) goto <D.23310>; else goto <D.23307>;
          <D.23310>:
          D.23289 = ins->data.op[1].src;
          iftmp.58 = D.23289->data.op[0].p;
          goto <D.23308>;
          <D.23307>:
          iftmp.58 = 0B;
          <D.23308>:
          iftmp.57 = iftmp.58;
          <D.23305>:
          iftmp.56 = iftmp.57;
          <D.23299>:
          iftmp.55 = iftmp.56;
          <D.23296>:
          table = iftmp.55;
          D.23313 = ins->next;
          if (D.23313 == 0B) goto <D.23311>; else goto <D.23314>;
          <D.23314>:
          D.23313 = ins->next;
          D.23315 = D.23313->opcode;
          if (D.23315 != 569) goto <D.23311>; else goto <D.23312>;
          <D.23311>:
          i = 0;
          goto <D.22120>;
          <D.22119>:
          D.23316 = table->table;
          i.59 = (unsigned int) i;
          D.23318 = i.59 * 4;
          D.23319 = D.23316 + D.23318;
          D.23320 = *D.23319;
          if (D.23320 != 0B) goto <D.23321>; else goto <D.23322>;
          <D.23321>:
          D.23316 = table->table;
          i.59 = (unsigned int) i;
          D.23318 = i.59 * 4;
          D.23319 = D.23316 + D.23318;
          D.23320 = *D.23319;
          add_cprop_bb (cfg, D.23320, bblist);
          <D.23322>:
          i = i + 1;
          <D.22120>:
          D.23323 = table->table_size;
          if (D.23323 > i) goto <D.22119>; else goto <D.22121>;
          <D.22121>:
          return;
          <D.23312>:
          D.23313 = ins->next;
          D.23315 = D.23313->opcode;
          D.23324 = D.23315 != 569;
          D.23325 = (long int) D.23324;
          D.23326 = __builtin_expect (D.23325, 0);
          if (D.23326 != 0) goto <D.23327>; else goto <D.23328>;
          <D.23327>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 955, "ins->next->opcode == OP_PADD");
          <D.23328>:
          D.23313 = ins->next;
          D.23329 = D.23313->sreg1;
          D.23155 = ins->dreg;
          D.23330 = D.23329 != D.23155;
          D.23331 = (long int) D.23330;
          D.23332 = __builtin_expect (D.23331, 0);
          if (D.23332 != 0) goto <D.23333>; else goto <D.23334>;
          <D.23333>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 956, "ins->next->sreg1 == ins->dreg");
          <D.23334>:
          D.23313 = ins->next;
          D.23335 = D.23313->sreg2;
          D.23336 = (unsigned int) D.23335;
          D.23337 = D.23336 * 4;
          D.23338 = carray + D.23337;
          D.23339 = *D.23338;
          if (D.23339 != 0B) goto <D.23340>; else goto <D.23341>;
          <D.23340>:
          {
            int idx;

            D.23313 = ins->next;
            D.23335 = D.23313->sreg2;
            D.23336 = (unsigned int) D.23335;
            D.23337 = D.23336 * 4;
            D.23338 = carray + D.23337;
            D.23339 = *D.23338;
            D.23342 = D.23339->data.op[0].const_val;
            idx = D.23342 >> 2;
            if (idx < 0) goto <D.23343>; else goto <D.23345>;
            <D.23345>:
            D.23323 = table->table_size;
            if (D.23323 <= idx) goto <D.23343>; else goto <D.23344>;
            <D.23343>:
            return;
            <D.23344>:
            D.23316 = table->table;
            idx.60 = (unsigned int) idx;
            D.23347 = idx.60 * 4;
            D.23348 = D.23316 + D.23347;
            D.23349 = *D.23348;
            if (D.23349 != 0B) goto <D.23350>; else goto <D.23351>;
            <D.23350>:
            D.23316 = table->table;
            idx.60 = (unsigned int) idx;
            D.23347 = idx.60 * 4;
            D.23348 = D.23316 + D.23347;
            D.23349 = *D.23348;
            add_cprop_bb (cfg, D.23349, bblist);
            <D.23351>:
          }
          goto <D.23352>;
          <D.23341>:
          i = 0;
          goto <D.22124>;
          <D.22123>:
          D.23316 = table->table;
          i.59 = (unsigned int) i;
          D.23318 = i.59 * 4;
          D.23319 = D.23316 + D.23318;
          D.23320 = *D.23319;
          if (D.23320 != 0B) goto <D.23353>; else goto <D.23354>;
          <D.23353>:
          D.23316 = table->table;
          i.59 = (unsigned int) i;
          D.23318 = i.59 * 4;
          D.23319 = D.23316 + D.23318;
          D.23320 = *D.23319;
          add_cprop_bb (cfg, D.23320, bblist);
          <D.23354>:
          i = i + 1;
          <D.22124>:
          D.23323 = table->table_size;
          if (D.23323 > i) goto <D.22123>; else goto <D.22125>;
          <D.22125>:
          <D.23352>:
        }
        <D.23286>:
        D.23137 = ins->opcode;
        if (D.23137 == 370) goto <D.23355>; else goto <D.23356>;
        <D.23355>:
        {
          int i;
          struct MonoJumpInfoBBTable * table;

          table = ins->data.op[0].p;
          i = 0;
          goto <D.22129>;
          <D.22128>:
          D.23357 = table->table;
          i.61 = (unsigned int) i;
          D.23359 = i.61 * 4;
          D.23360 = D.23357 + D.23359;
          D.23361 = *D.23360;
          if (D.23361 != 0B) goto <D.23362>; else goto <D.23363>;
          <D.23362>:
          D.23357 = table->table;
          i.61 = (unsigned int) i;
          D.23359 = i.61 * 4;
          D.23360 = D.23357 + D.23359;
          D.23361 = *D.23360;
          add_cprop_bb (cfg, D.23361, bblist);
          <D.23363>:
          i = i + 1;
          <D.22129>:
          D.23364 = table->table_size;
          if (D.23364 > i) goto <D.22128>; else goto <D.22130>;
          <D.22130>:
        }
        <D.23356>:
        D.23313 = ins->next;
        if (D.23313 != 0B) goto <D.23367>; else goto <D.23368>;
        <D.23367>:
        D.23313 = ins->next;
        D.23369 = D.23313->opcode;
        D.23370 = D.23369 + 64981;
        D.23371 = D.23370 <= 9;
        D.23372 = D.23369 + 64874;
        D.23373 = D.23372 <= 9;
        D.23374 = D.23371 | D.23373;
        if (D.23374 != 0) goto <D.23365>; else goto <D.23375>;
        <D.23375>:
        D.23313 = ins->next;
        D.23315 = D.23313->opcode;
        D.23376 = D.23315 + 64884;
        if (D.23376 <= 9) goto <D.23365>; else goto <D.23366>;
        <D.23365>:
        c0.54 = c0;
        if (c0.54 != 0B) goto <D.23377>; else goto <D.23378>;
        <D.23377>:
        c0.54 = c0;
        D.23379 = c0.54->opcode;
        D.23380 = D.23379 != 362;
        D.23381 = (long int) D.23380;
        D.23382 = __builtin_expect (D.23381, 0);
        if (D.23382 != 0) goto <D.23383>; else goto <D.23384>;
        <D.23383>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 990, "c0->opcode == OP_ICONST");
        <D.23384>:
        c0.54 = c0;
        D.23385 = c0.54->data.op[0].const_val;
        if (D.23385 != 0) goto <D.23386>; else goto <D.23387>;
        <D.23386>:
        D.23313 = ins->next;
        D.23313 = ins->next;
        D.23388 = D.23313->flags;
        D.23389 = D.23388 | 8;
        D.23313->flags = D.23389;
        goto <D.23390>;
        <D.23387>:
        D.23313 = ins->next;
        D.23313 = ins->next;
        D.23388 = D.23313->flags;
        D.23391 = D.23388 | 16;
        D.23313->flags = D.23391;
        <D.23390>:
        goto <D.23392>;
        <D.23378>:
        D.23313 = ins->next;
        D.23313 = ins->next;
        D.23388 = D.23313->flags;
        D.23393 = D.23388 & 231;
        D.23313->flags = D.23393;
        <D.23392>:
        D.23313 = ins->next;
        visit_inst (cfg, bb, D.23313, cvars, bblist, carray);
        <D.23366>:
        <D.23368>:
      }
    finally
      {
        c0 = {CLOBBER};
      }
  }
  goto <D.23232>;
  <D.23230>:
  D.23137 = ins->opcode;
  if (D.23137 == 446) goto <D.23394>; else goto <D.23395>;
  <D.23394>:
  D.23396 = ins->data.op[0].target_block;
  add_cprop_bb (cfg, D.23396, bblist);
  goto <D.23397>;
  <D.23395>:
  D.23400 = ins->opcode;
  D.23401 = D.23400 + 64981;
  D.23402 = D.23401 <= 9;
  D.23403 = D.23400 + 64874;
  D.23404 = D.23403 <= 9;
  D.23405 = D.23402 | D.23404;
  if (D.23405 != 0) goto <D.23398>; else goto <D.23406>;
  <D.23406>:
  D.23137 = ins->opcode;
  D.23407 = D.23137 + 64884;
  if (D.23407 <= 9) goto <D.23398>; else goto <D.23399>;
  <D.23398>:
  D.23408 = ins->flags;
  D.23409 = (int) D.23408;
  D.23410 = D.23409 & 8;
  if (D.23410 != 0) goto <D.23411>; else goto <D.23412>;
  <D.23411>:
  D.23413 = ins->data.op[1].many_blocks;
  D.23414 = *D.23413;
  add_cprop_bb (cfg, D.23414, bblist);
  goto <D.23415>;
  <D.23412>:
  D.23408 = ins->flags;
  D.23409 = (int) D.23408;
  D.23416 = D.23409 & 16;
  if (D.23416 != 0) goto <D.23417>; else goto <D.23418>;
  <D.23417>:
  D.23413 = ins->data.op[1].many_blocks;
  D.23419 = D.23413 + 4;
  D.23420 = *D.23419;
  if (D.23420 != 0B) goto <D.23421>; else goto <D.23422>;
  <D.23421>:
  D.23413 = ins->data.op[1].many_blocks;
  D.23419 = D.23413 + 4;
  D.23420 = *D.23419;
  add_cprop_bb (cfg, D.23420, bblist);
  <D.23422>:
  goto <D.23423>;
  <D.23418>:
  D.23413 = ins->data.op[1].many_blocks;
  D.23414 = *D.23413;
  add_cprop_bb (cfg, D.23414, bblist);
  D.23413 = ins->data.op[1].many_blocks;
  D.23419 = D.23413 + 4;
  D.23420 = *D.23419;
  if (D.23420 != 0B) goto <D.23424>; else goto <D.23425>;
  <D.23424>:
  D.23413 = ins->data.op[1].many_blocks;
  D.23419 = D.23413 + 4;
  D.23420 = *D.23419;
  add_cprop_bb (cfg, D.23420, bblist);
  <D.23425>:
  <D.23423>:
  <D.23415>:
  <D.23399>:
  <D.23397>:
  <D.23232>:
  <D.23229>:
}


evaluate_ins (struct MonoCompile * cfg, struct MonoInst * ins, struct MonoInst * * res, struct MonoInst * * carray)
{
  short unsigned int D.23429;
  int D.23430;
  int D.23431;
  int D.23432;
  int D.23435;
  int D.23438;
  int D.23439;
  int D.23440;
  signed char D.23441;
  struct MonoInst * iftmp.62;
  int D.23443;
  unsigned int D.23444;
  unsigned int D.23445;
  struct MonoInst * * D.23448;
  unsigned int D.23449;
  unsigned int D.23450;
  struct MonoInst * * D.23451;
  struct MonoInst * * D.23453;
  struct MonoInst * D.23454;
  struct MonoInst * D.23455;
  unsigned char D.23461;
  int D.23462;
  int D.23463;
  struct MonoMethodVar * D.23466;
  int D.23467;
  unsigned int D.23468;
  unsigned int D.23469;
  struct MonoMethodVar * D.23470;
  char D.23471;
  int D.23472;
  int D.23473;
  _Bool D.23476;
  _Bool D.23477;
  _Bool D.23478;
  _Bool D.23481;
  long int D.23482;
  long int D.23483;
  char D.23486;
  int D.23489;
  unsigned int D.23490;
  unsigned int D.23491;
  struct MonoInst * * D.23492;
  struct MonoInst * D.23493;
  struct MonoInst * D.23496;
  struct MonoInst * D.23497;
  unsigned int D.23500;
  _Bool D.23501;
  long int D.23502;
  long int D.23503;
  struct MonoInst * args[3];
  int rs[3];
  struct MonoInst * c0;
  gboolean const_args;
  const char * spec;
  int num_sregs;
  int i;
  int sregs[3];

  try
    {
      const_args = 1;
      D.23429 = ins->opcode;
      D.23430 = (int) D.23429;
      D.23431 = D.23430 + -313;
      D.23432 = D.23431 * 4;
      spec = &ins_info[D.23432];
      D.23429 = ins->opcode;
      if (D.23429 == 362) goto <D.23433>; else goto <D.23434>;
      <D.23433>:
      *res = ins;
      D.23435 = 1;
      return D.23435;
      <D.23434>:
      D.23429 = ins->opcode;
      if (D.23429 == 316) goto <D.23436>; else goto <D.23437>;
      <D.23436>:
      D.23435 = 2;
      return D.23435;
      <D.23437>:
      D.23438 = ins->sreg1;
      sregs[0] = D.23438;
      D.23439 = ins->sreg2;
      sregs[1] = D.23439;
      D.23440 = ins->sreg3;
      sregs[2] = D.23440;
      D.23429 = ins->opcode;
      D.23430 = (int) D.23429;
      D.23431 = D.23430 + -313;
      D.23441 = ins_sreg_counts[D.23431];
      num_sregs = (int) D.23441;
      i = 0;
      goto <D.22072>;
      <D.22071>:
      args[i] = 0B;
      i = i + 1;
      <D.22072>:
      if (i <= 2) goto <D.22071>; else goto <D.22073>;
      <D.22073>:
      i = 0;
      goto <D.22076>;
      <D.22075>:
      {
        struct MonoInst * var;

        D.23443 = sregs[i];
        D.23444 = (unsigned int) D.23443;
        D.23445 = cfg->vreg_to_inst_len;
        if (D.23444 < D.23445) goto <D.23446>; else goto <D.23447>;
        <D.23446>:
        D.23448 = cfg->vreg_to_inst;
        D.23443 = sregs[i];
        D.23449 = (unsigned int) D.23443;
        D.23450 = D.23449 * 4;
        D.23451 = D.23448 + D.23450;
        iftmp.62 = *D.23451;
        goto <D.23452>;
        <D.23447>:
        iftmp.62 = 0B;
        <D.23452>:
        var = iftmp.62;
        rs[i] = 2;
        D.23443 = sregs[i];
        D.23449 = (unsigned int) D.23443;
        D.23450 = D.23449 * 4;
        D.23453 = carray + D.23450;
        D.23454 = *D.23453;
        args[i] = D.23454;
        D.23455 = args[i];
        if (D.23455 != 0B) goto <D.23456>; else goto <D.23457>;
        <D.23456>:
        rs[i] = 1;
        goto <D.23458>;
        <D.23457>:
        if (var != 0B) goto <D.23459>; else goto <D.23460>;
        <D.23459>:
        D.23461 = var->flags;
        D.23462 = (int) D.23461;
        D.23463 = D.23462 & 20;
        if (D.23463 == 0) goto <D.23464>; else goto <D.23465>;
        <D.23464>:
        D.23466 = cfg->vars;
        D.23467 = var->data.op[0].const_val;
        D.23468 = (unsigned int) D.23467;
        D.23469 = D.23468 * 56;
        D.23470 = D.23466 + D.23469;
        D.23471 = D.23470->cpstate;
        D.23472 = (int) D.23471;
        rs[i] = D.23472;
        <D.23465>:
        <D.23460>:
        <D.23458>:
        D.23473 = rs[i];
        if (D.23473 != 1) goto <D.23474>; else goto <D.23475>;
        <D.23474>:
        const_args = 0;
        <D.23475>:
      }
      i = i + 1;
      <D.22076>:
      if (i < num_sregs) goto <D.22075>; else goto <D.22077>;
      <D.22077>:
      c0 = 0B;
      D.23476 = num_sregs > 0;
      D.23477 = const_args != 0;
      D.23478 = D.23476 & D.23477;
      if (D.23478 != 0) goto <D.23479>; else goto <D.23480>;
      <D.23479>:
      D.23481 = num_sregs > 2;
      D.23482 = (long int) D.23481;
      D.23483 = __builtin_expect (D.23482, 0);
      if (D.23483 != 0) goto <D.23484>; else goto <D.23485>;
      <D.23484>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 776, "num_sregs <= 2");
      <D.23485>:
      D.23486 = *spec;
      if (D.23486 != 32) goto <D.23487>; else goto <D.23488>;
      <D.23487>:
      D.23489 = ins->dreg;
      D.23490 = (unsigned int) D.23489;
      D.23491 = D.23490 * 4;
      D.23492 = carray + D.23491;
      D.23493 = *D.23492;
      if (D.23493 != 0B) goto <D.23494>; else goto <D.23495>;
      <D.23494>:
      D.23489 = ins->dreg;
      D.23490 = (unsigned int) D.23489;
      D.23491 = D.23490 * 4;
      D.23492 = carray + D.23491;
      D.23493 = *D.23492;
      *res = D.23493;
      D.23435 = 1;
      return D.23435;
      <D.23495>:
      <D.23488>:
      D.23496 = args[1];
      D.23497 = args[0];
      c0 = mono_constant_fold_ins (cfg, ins, D.23497, D.23496, 0);
      if (c0 != 0B) goto <D.23498>; else goto <D.23499>;
      <D.23498>:
      D.23500 = cfg->verbose_level;
      D.23501 = D.23500 > 1;
      D.23502 = (long int) D.23501;
      D.23503 = __builtin_expect (D.23502, 0);
      if (D.23503 != 0) goto <D.23504>; else goto <D.23505>;
      <D.23504>:
      printf ("\t cfold -> ");
      mono_print_ins (c0);
      <D.23505>:
      *res = c0;
      D.23435 = 1;
      return D.23435;
      <D.23499>:
      D.23435 = 2;
      return D.23435;
      <D.23480>:
      if (num_sregs == 0) goto <D.23506>; else goto <D.23507>;
      <D.23506>:
      D.23435 = 2;
      return D.23435;
      <D.23507>:
      i = 0;
      goto <D.22079>;
      <D.22078>:
      D.23473 = rs[i];
      if (D.23473 == 2) goto <D.23508>; else goto <D.23509>;
      <D.23508>:
      D.23435 = 2;
      return D.23435;
      <D.23509>:
      i = i + 1;
      <D.22079>:
      if (i < num_sregs) goto <D.22078>; else goto <D.22080>;
      <D.22080>:
      D.23435 = 0;
      return D.23435;
    }
  finally
    {
      args = {CLOBBER};
      rs = {CLOBBER};
      sregs = {CLOBBER};
    }
}


change_varstate (struct MonoCompile * cfg, struct GList * * cvars, struct MonoMethodVar * info, int state, struct MonoInst * c0, struct MonoInst * * carray)
{
  char D.23512;
  int D.23513;
  char D.23516;
  unsigned int D.23517;
  _Bool D.23518;
  long int D.23519;
  long int D.23520;
  struct MonoInst * * D.23523;
  unsigned int D.23524;
  unsigned int D.23525;
  struct MonoInst * * D.23526;
  struct MonoInst * D.23527;
  int D.23528;
  _Bool D.23531;
  long int D.23532;
  long int D.23533;
  unsigned int D.23536;
  unsigned int D.23537;
  struct MonoInst * * D.23538;
  struct GList * D.23539;
  struct GList * D.23540;
  struct GList * D.23543;

  D.23512 = info->cpstate;
  D.23513 = (int) D.23512;
  if (D.23513 >= state) goto <D.23514>; else goto <D.23515>;
  <D.23514>:
  return;
  <D.23515>:
  D.23516 = (char) state;
  info->cpstate = D.23516;
  D.23517 = cfg->verbose_level;
  D.23518 = D.23517 > 1;
  D.23519 = (long int) D.23518;
  D.23520 = __builtin_expect (D.23519, 0);
  if (D.23520 != 0) goto <D.23521>; else goto <D.23522>;
  <D.23521>:
  D.23512 = info->cpstate;
  D.23513 = (int) D.23512;
  D.23523 = cfg->varinfo;
  D.23524 = info->idx;
  D.23525 = D.23524 * 4;
  D.23526 = D.23523 + D.23525;
  D.23527 = *D.23526;
  D.23528 = D.23527->dreg;
  printf ("\tState of R%d set to %d\n", D.23528, D.23513);
  <D.23522>:
  if (state == 1) goto <D.23529>; else goto <D.23530>;
  <D.23529>:
  D.23531 = c0 == 0B;
  D.23532 = (long int) D.23531;
  D.23533 = __builtin_expect (D.23532, 0);
  if (D.23533 != 0) goto <D.23534>; else goto <D.23535>;
  <D.23534>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 817, "c0");
  <D.23535>:
  <D.23530>:
  D.23523 = cfg->varinfo;
  D.23524 = info->idx;
  D.23525 = D.23524 * 4;
  D.23526 = D.23523 + D.23525;
  D.23527 = *D.23526;
  D.23528 = D.23527->dreg;
  D.23536 = (unsigned int) D.23528;
  D.23537 = D.23536 * 4;
  D.23538 = carray + D.23537;
  *D.23538 = c0;
  D.23539 = *cvars;
  D.23540 = monoeg_g_list_find (D.23539, info);
  if (D.23540 == 0B) goto <D.23541>; else goto <D.23542>;
  <D.23541>:
  D.23539 = *cvars;
  D.23543 = monoeg_g_list_prepend (D.23539, info);
  *cvars = D.23543;
  <D.23542>:
}


fold_ins (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoInst * ins, struct MonoInst * * carray)
{
  short unsigned int D.23545;
  int D.23546;
  int D.23547;
  int D.23548;
  signed char D.23549;
  int D.23553;
  short unsigned int D.23555;
  unsigned int D.23559;
  unsigned int D.23560;
  struct MonoInst * * D.23561;
  struct MonoInst * D.23562;
  char D.23564;
  short unsigned int D.23567;
  _Bool D.23568;
  long int D.23569;
  long int D.23570;
  int D.23573;
  int D.23574;
  int D.23575;
  unsigned int D.23578;
  unsigned int D.23579;
  struct MonoInst * * D.23580;
  struct MonoInst * D.23581;
  short unsigned int D.23586;
  int D.23587;
  _Bool D.23590;
  _Bool D.23591;
  _Bool D.23592;
  _Bool D.23594;
  _Bool D.23595;
  _Bool D.23596;
  int D.23597;
  const void * D.23598;
  struct MonoInst * D.23605;
  struct MonoInst * D.23608;
  struct MonoJumpInfoBBTable * iftmp.63;
  struct MonoJumpInfoBBTable * iftmp.64;
  struct MonoJumpInfoBBTable * iftmp.65;
  struct MonoJumpInfoBBTable * iftmp.66;
  struct MonoInst * D.23629;
  short unsigned int D.23631;
  _Bool D.23632;
  long int D.23633;
  long int D.23634;
  int D.23637;
  _Bool D.23638;
  long int D.23639;
  long int D.23640;
  struct MonoInst * D.23643;
  short unsigned int D.23644;
  _Bool D.23645;
  long int D.23646;
  long int D.23647;
  int D.23650;
  unsigned int D.23651;
  unsigned int D.23652;
  struct MonoInst * * D.23653;
  struct MonoInst * D.23654;
  int D.23657;
  int D.23661;
  struct MonoBasicBlock * * D.23662;
  unsigned int i.67;
  unsigned int D.23664;
  struct MonoBasicBlock * * D.23665;
  struct MonoBasicBlock * D.23666;
  int D.23667;
  int D.23668;
  int D.23669;
  struct MonoInst * D.23670;
  int D.23673;
  int D.23674;
  short unsigned int D.23678;
  unsigned int D.23679;
  _Bool D.23680;
  long int D.23681;
  long int D.23682;
  unsigned int idx.68;
  unsigned int D.23688;
  struct MonoBasicBlock * * D.23689;
  struct MonoBasicBlock * D.23690;
  short unsigned int D.23695;
  short unsigned int D.23696;
  _Bool D.23697;
  short unsigned int D.23698;
  _Bool D.23699;
  _Bool D.23700;
  short unsigned int D.23702;
  unsigned char D.23703;
  int D.23704;
  int D.23705;
  struct MonoBasicBlock * * D.23708;
  struct MonoBasicBlock * * D.23709;
  struct MonoBasicBlock * D.23710;
  struct MonoBasicBlock * D.23711;
  int D.23713;
  struct MonoBasicBlock * D.23716;
  const char * spec;
  int opcode2;
  int num_sregs;

  D.23545 = ins->opcode;
  D.23546 = (int) D.23545;
  D.23547 = D.23546 + -313;
  D.23548 = D.23547 * 4;
  spec = &ins_info[D.23548];
  D.23545 = ins->opcode;
  D.23546 = (int) D.23545;
  D.23547 = D.23546 + -313;
  D.23549 = ins_sreg_counts[D.23547];
  num_sregs = (int) D.23549;
  D.23545 = ins->opcode;
  if (D.23545 != 316) goto <D.23552>; else goto <D.23550>;
  <D.23552>:
  D.23553 = ins->dreg;
  if (D.23553 != -1) goto <D.23554>; else goto <D.23550>;
  <D.23554>:
  D.23545 = ins->opcode;
  D.23555 = D.23545 + 65162;
  if (D.23555 > 16) goto <D.23556>; else goto <D.23550>;
  <D.23556>:
  D.23553 = ins->dreg;
  D.23559 = (unsigned int) D.23553;
  D.23560 = D.23559 * 4;
  D.23561 = carray + D.23560;
  D.23562 = *D.23561;
  if (D.23562 != 0B) goto <D.23563>; else goto <D.23557>;
  <D.23563>:
  D.23564 = *spec;
  if (D.23564 == 105) goto <D.23565>; else goto <D.23557>;
  <D.23565>:
  D.23553 = ins->dreg;
  if (D.23553 > 7) goto <D.23566>; else goto <D.23557>;
  <D.23566>:
  D.23553 = ins->dreg;
  D.23559 = (unsigned int) D.23553;
  D.23560 = D.23559 * 4;
  D.23561 = carray + D.23560;
  D.23562 = *D.23561;
  D.23567 = D.23562->opcode;
  D.23568 = D.23567 != 362;
  D.23569 = (long int) D.23568;
  D.23570 = __builtin_expect (D.23569, 0);
  if (D.23570 != 0) goto <D.23571>; else goto <D.23572>;
  <D.23571>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1035, "carray [ins->dreg]->opcode == OP_ICONST");
  <D.23572>:
  ins->opcode = 362;
  D.23553 = ins->dreg;
  D.23559 = (unsigned int) D.23553;
  D.23560 = D.23559 * 4;
  D.23561 = carray + D.23560;
  D.23562 = *D.23561;
  D.23573 = D.23562->data.op[0].const_val;
  ins->data.op[0].const_val = D.23573;
  ins->sreg3 = -1;
  D.23574 = ins->sreg3;
  ins->sreg2 = D.23574;
  D.23575 = ins->sreg2;
  ins->sreg1 = D.23575;
  goto <D.23558>;
  <D.23557>:
  if (num_sregs == 2) goto <D.23576>; else goto <D.23577>;
  <D.23576>:
  D.23575 = ins->sreg2;
  D.23578 = (unsigned int) D.23575;
  D.23579 = D.23578 * 4;
  D.23580 = carray + D.23579;
  D.23581 = *D.23580;
  if (D.23581 != 0B) goto <D.23582>; else goto <D.23583>;
  <D.23582>:
  D.23545 = ins->opcode;
  D.23546 = (int) D.23545;
  opcode2 = mono_op_to_op_imm (D.23546);
  if (opcode2 != -1) goto <D.23584>; else goto <D.23585>;
  <D.23584>:
  D.23586 = (short unsigned int) opcode2;
  ins->opcode = D.23586;
  D.23575 = ins->sreg2;
  D.23578 = (unsigned int) D.23575;
  D.23579 = D.23578 * 4;
  D.23580 = carray + D.23579;
  D.23581 = *D.23580;
  D.23587 = D.23581->data.op[0].const_val;
  ins->data.op[1].const_val = D.23587;
  ins->sreg2 = -1;
  D.23590 = opcode2 == 343;
  D.23591 = opcode2 == 346;
  D.23592 = D.23590 | D.23591;
  if (D.23592 != 0) goto <D.23588>; else goto <D.23593>;
  <D.23593>:
  D.23594 = opcode2 == 352;
  D.23595 = opcode2 == 349;
  D.23596 = D.23594 | D.23595;
  if (D.23596 != 0) goto <D.23588>; else goto <D.23589>;
  <D.23588>:
  D.23597 = ins->data.op[1].const_val;
  D.23598 = (const void *) D.23597;
  MEM[(struct MonoCallInst *)ins].fptr = D.23598;
  <D.23589>:
  <D.23585>:
  goto <D.23599>;
  <D.23583>:
  <D.23599>:
  <D.23577>:
  <D.23558>:
  D.23545 = ins->opcode;
  if (D.23545 == 735) goto <D.23600>; else goto <D.23603>;
  <D.23603>:
  D.23545 = ins->opcode;
  if (D.23545 == 736) goto <D.23604>; else goto <D.23601>;
  <D.23604>:
  D.23605 = ins->data.op[1].src;
  if (D.23605 == 8B) goto <D.23600>; else goto <D.23601>;
  <D.23601>:
  D.23545 = ins->opcode;
  if (D.23545 == 370) goto <D.23600>; else goto <D.23606>;
  <D.23606>:
  D.23545 = ins->opcode;
  if (D.23545 == 738) goto <D.23607>; else goto <D.23602>;
  <D.23607>:
  D.23605 = ins->data.op[1].src;
  D.23608 = D.23605->data.op[1].src;
  if (D.23608 == 8B) goto <D.23600>; else goto <D.23602>;
  <D.23600>:
  {
    int i;
    struct MonoJumpInfoBBTable * table;

    D.23545 = ins->opcode;
    if (D.23545 == 735) goto <D.23610>; else goto <D.23611>;
    <D.23610>:
    iftmp.63 = ins->data.op[0].p;
    goto <D.23612>;
    <D.23611>:
    D.23545 = ins->opcode;
    if (D.23545 == 736) goto <D.23616>; else goto <D.23614>;
    <D.23616>:
    D.23605 = ins->data.op[1].src;
    if (D.23605 == 8B) goto <D.23617>; else goto <D.23614>;
    <D.23617>:
    iftmp.64 = ins->data.op[0].p;
    goto <D.23615>;
    <D.23614>:
    D.23545 = ins->opcode;
    if (D.23545 == 370) goto <D.23619>; else goto <D.23620>;
    <D.23619>:
    iftmp.65 = ins->data.op[0].p;
    goto <D.23621>;
    <D.23620>:
    D.23545 = ins->opcode;
    if (D.23545 == 738) goto <D.23625>; else goto <D.23623>;
    <D.23625>:
    D.23605 = ins->data.op[1].src;
    D.23608 = D.23605->data.op[1].src;
    if (D.23608 == 8B) goto <D.23626>; else goto <D.23623>;
    <D.23626>:
    D.23605 = ins->data.op[1].src;
    iftmp.66 = D.23605->data.op[0].p;
    goto <D.23624>;
    <D.23623>:
    iftmp.66 = 0B;
    <D.23624>:
    iftmp.65 = iftmp.66;
    <D.23621>:
    iftmp.64 = iftmp.65;
    <D.23615>:
    iftmp.63 = iftmp.64;
    <D.23612>:
    table = iftmp.63;
    D.23629 = ins->next;
    if (D.23629 == 0B) goto <D.23627>; else goto <D.23630>;
    <D.23630>:
    D.23629 = ins->next;
    D.23631 = D.23629->opcode;
    if (D.23631 != 569) goto <D.23627>; else goto <D.23628>;
    <D.23627>:
    return;
    <D.23628>:
    D.23629 = ins->next;
    D.23631 = D.23629->opcode;
    D.23632 = D.23631 != 569;
    D.23633 = (long int) D.23632;
    D.23634 = __builtin_expect (D.23633, 0);
    if (D.23634 != 0) goto <D.23635>; else goto <D.23636>;
    <D.23635>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1064, "ins->next->opcode == OP_PADD");
    <D.23636>:
    D.23629 = ins->next;
    D.23637 = D.23629->sreg1;
    D.23553 = ins->dreg;
    D.23638 = D.23637 != D.23553;
    D.23639 = (long int) D.23638;
    D.23640 = __builtin_expect (D.23639, 0);
    if (D.23640 != 0) goto <D.23641>; else goto <D.23642>;
    <D.23641>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1065, "ins->next->sreg1 == ins->dreg");
    <D.23642>:
    D.23629 = ins->next;
    D.23643 = D.23629->next;
    D.23644 = D.23643->opcode;
    D.23645 = D.23644 != 391;
    D.23646 = (long int) D.23645;
    D.23647 = __builtin_expect (D.23646, 0);
    if (D.23647 != 0) goto <D.23648>; else goto <D.23649>;
    <D.23648>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1066, "ins->next->next->opcode == OP_LOAD_MEMBASE");
    <D.23649>:
    D.23629 = ins->next;
    D.23650 = D.23629->sreg2;
    D.23651 = (unsigned int) D.23650;
    D.23652 = D.23651 * 4;
    D.23653 = carray + D.23652;
    D.23654 = *D.23653;
    if (D.23654 != 0B) goto <D.23655>; else goto <D.23656>;
    <D.23655>:
    {
      int idx;

      D.23629 = ins->next;
      D.23650 = D.23629->sreg2;
      D.23651 = (unsigned int) D.23650;
      D.23652 = D.23651 * 4;
      D.23653 = carray + D.23652;
      D.23654 = *D.23653;
      D.23657 = D.23654->data.op[0].const_val;
      idx = D.23657 >> 2;
      if (idx < 0) goto <D.23658>; else goto <D.23660>;
      <D.23660>:
      D.23661 = table->table_size;
      if (D.23661 <= idx) goto <D.23658>; else goto <D.23659>;
      <D.23658>:
      i = 0;
      goto <D.22144>;
      <D.22143>:
      D.23662 = table->table;
      i.67 = (unsigned int) i;
      D.23664 = i.67 * 4;
      D.23665 = D.23662 + D.23664;
      D.23666 = *D.23665;
      remove_bb_from_phis (cfg, bb, D.23666);
      D.23662 = table->table;
      i.67 = (unsigned int) i;
      D.23664 = i.67 * 4;
      D.23665 = D.23662 + D.23664;
      D.23666 = *D.23665;
      mono_unlink_bblock (cfg, bb, D.23666);
      i = i + 1;
      <D.22144>:
      D.23661 = table->table_size;
      if (D.23661 > i) goto <D.22143>; else goto <D.22145>;
      <D.22145>:
      ins->opcode = 316;
      ins->dreg = -1;
      ins->sreg3 = -1;
      D.23574 = ins->sreg3;
      ins->sreg2 = D.23574;
      D.23575 = ins->sreg2;
      ins->sreg1 = D.23575;
      D.23629 = ins->next;
      D.23629->opcode = 316;
      D.23629 = ins->next;
      D.23629->dreg = -1;
      D.23629 = ins->next;
      D.23629 = ins->next;
      D.23629 = ins->next;
      D.23629->sreg3 = -1;
      D.23667 = D.23629->sreg3;
      D.23629->sreg2 = D.23667;
      D.23650 = D.23629->sreg2;
      D.23629->sreg1 = D.23650;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23643->opcode = 316;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23643->dreg = -1;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23643->sreg3 = -1;
      D.23668 = D.23643->sreg3;
      D.23643->sreg2 = D.23668;
      D.23669 = D.23643->sreg2;
      D.23643->sreg1 = D.23669;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      if (D.23670 != 0B) goto <D.23671>; else goto <D.23672>;
      <D.23671>:
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23670->opcode = 316;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23670->dreg = -1;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23670->sreg3 = -1;
      D.23673 = D.23670->sreg3;
      D.23670->sreg2 = D.23673;
      D.23674 = D.23670->sreg2;
      D.23670->sreg1 = D.23674;
      <D.23672>:
      return;
      <D.23659>:
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      if (D.23670 == 0B) goto <D.23675>; else goto <D.23677>;
      <D.23677>:
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23678 = D.23670->opcode;
      if (D.23678 != 763) goto <D.23675>; else goto <D.23676>;
      <D.23675>:
      D.23679 = cfg->verbose_level;
      D.23680 = D.23679 > 1;
      D.23681 = (long int) D.23680;
      D.23682 = __builtin_expect (D.23681, 0);
      if (D.23682 != 0) goto <D.23683>; else goto <D.23684>;
      <D.23683>:
      printf ("\tNo cfold on ");
      mono_print_ins (ins);
      <D.23684>:
      return;
      <D.23676>:
      D.23679 = cfg->verbose_level;
      D.23680 = D.23679 > 1;
      D.23681 = (long int) D.23680;
      D.23682 = __builtin_expect (D.23681, 0);
      if (D.23682 != 0) goto <D.23685>; else goto <D.23686>;
      <D.23685>:
      printf ("\tcfold on ");
      mono_print_ins (ins);
      <D.23686>:
      i = 0;
      goto <D.22147>;
      <D.22146>:
      D.23662 = table->table;
      i.67 = (unsigned int) i;
      D.23664 = i.67 * 4;
      D.23665 = D.23662 + D.23664;
      D.23666 = *D.23665;
      D.23662 = table->table;
      idx.68 = (unsigned int) idx;
      D.23688 = idx.68 * 4;
      D.23689 = D.23662 + D.23688;
      D.23690 = *D.23689;
      if (D.23666 != D.23690) goto <D.23691>; else goto <D.23692>;
      <D.23691>:
      D.23662 = table->table;
      i.67 = (unsigned int) i;
      D.23664 = i.67 * 4;
      D.23665 = D.23662 + D.23664;
      D.23666 = *D.23665;
      remove_bb_from_phis (cfg, bb, D.23666);
      D.23662 = table->table;
      i.67 = (unsigned int) i;
      D.23664 = i.67 * 4;
      D.23665 = D.23662 + D.23664;
      D.23666 = *D.23665;
      mono_unlink_bblock (cfg, bb, D.23666);
      <D.23692>:
      i = i + 1;
      <D.22147>:
      D.23661 = table->table_size;
      if (D.23661 > i) goto <D.22146>; else goto <D.22148>;
      <D.22148>:
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23670->opcode = 446;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23662 = table->table;
      idx.68 = (unsigned int) idx;
      D.23688 = idx.68 * 4;
      D.23689 = D.23662 + D.23688;
      D.23690 = *D.23689;
      D.23670->data.op[0].target_block = D.23690;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23670 = D.23643->next;
      D.23670->sreg1 = -1;
      ins->opcode = 316;
      ins->dreg = -1;
      ins->sreg3 = -1;
      D.23574 = ins->sreg3;
      ins->sreg2 = D.23574;
      D.23575 = ins->sreg2;
      ins->sreg1 = D.23575;
      D.23629 = ins->next;
      D.23629->opcode = 316;
      D.23629 = ins->next;
      D.23629->dreg = -1;
      D.23629 = ins->next;
      D.23629 = ins->next;
      D.23629 = ins->next;
      D.23629->sreg3 = -1;
      D.23667 = D.23629->sreg3;
      D.23629->sreg2 = D.23667;
      D.23650 = D.23629->sreg2;
      D.23629->sreg1 = D.23650;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23643->opcode = 316;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23643->dreg = -1;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23629 = ins->next;
      D.23643 = D.23629->next;
      D.23643->sreg3 = -1;
      D.23668 = D.23643->sreg3;
      D.23643->sreg2 = D.23668;
      D.23669 = D.23643->sreg2;
      D.23643->sreg1 = D.23669;
    }
    <D.23656>:
  }
  <D.23602>:
  goto <D.23551>;
  <D.23550>:
  D.23695 = ins->opcode;
  D.23696 = D.23695 + 64981;
  D.23697 = D.23696 <= 9;
  D.23698 = D.23695 + 64874;
  D.23699 = D.23698 <= 9;
  D.23700 = D.23697 | D.23699;
  if (D.23700 != 0) goto <D.23693>; else goto <D.23701>;
  <D.23701>:
  D.23545 = ins->opcode;
  D.23702 = D.23545 + 64884;
  if (D.23702 <= 9) goto <D.23693>; else goto <D.23694>;
  <D.23693>:
  D.23703 = ins->flags;
  D.23704 = (int) D.23703;
  D.23705 = D.23704 & 8;
  if (D.23705 != 0) goto <D.23706>; else goto <D.23707>;
  <D.23706>:
  D.23708 = ins->data.op[1].many_blocks;
  D.23709 = D.23708 + 4;
  D.23710 = *D.23709;
  remove_bb_from_phis (cfg, bb, D.23710);
  D.23708 = ins->data.op[1].many_blocks;
  D.23709 = D.23708 + 4;
  D.23710 = *D.23709;
  mono_unlink_bblock (cfg, bb, D.23710);
  ins->opcode = 446;
  D.23708 = ins->data.op[1].many_blocks;
  D.23711 = *D.23708;
  ins->data.op[0].target_block = D.23711;
  goto <D.23712>;
  <D.23707>:
  D.23703 = ins->flags;
  D.23704 = (int) D.23703;
  D.23713 = D.23704 & 16;
  if (D.23713 != 0) goto <D.23714>; else goto <D.23715>;
  <D.23714>:
  D.23708 = ins->data.op[1].many_blocks;
  D.23711 = *D.23708;
  remove_bb_from_phis (cfg, bb, D.23711);
  D.23708 = ins->data.op[1].many_blocks;
  D.23711 = *D.23708;
  mono_unlink_bblock (cfg, bb, D.23711);
  ins->opcode = 446;
  D.23708 = ins->data.op[1].many_blocks;
  D.23716 = MEM[(struct MonoBasicBlock * *)D.23708 + 4B];
  ins->data.op[0].target_block = D.23716;
  <D.23715>:
  <D.23712>:
  <D.23694>:
  <D.23551>:
}


remove_bb_from_phis (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoBasicBlock * target)
{
  struct MonoBasicBlock * * D.23718;
  unsigned int i.69;
  unsigned int D.23720;
  struct MonoBasicBlock * * D.23721;
  struct MonoBasicBlock * D.23722;
  short int D.23724;
  int D.23725;
  _Bool D.23726;
  long int D.23727;
  long int D.23728;
  short unsigned int D.23731;
  short unsigned int D.23732;
  _Bool D.23733;
  _Bool D.23734;
  _Bool D.23735;
  int * D.23737;
  sizetype j.70;
  sizetype D.23739;
  sizetype D.23740;
  int * D.23741;
  sizetype D.23742;
  sizetype D.23743;
  int * D.23744;
  int D.23745;
  int D.23746;
  int D.23747;
  struct MonoInst * ins;
  int i;
  int j;

  i = 0;
  goto <D.21822>;
  <D.21821>:
  D.23718 = target->in_bb;
  i.69 = (unsigned int) i;
  D.23720 = i.69 * 4;
  D.23721 = D.23718 + D.23720;
  D.23722 = *D.23721;
  if (D.23722 == bb) goto <D.21820>; else goto <D.23723>;
  <D.23723>:
  i = i + 1;
  <D.21822>:
  D.23724 = target->in_count;
  D.23725 = (int) D.23724;
  if (D.23725 > i) goto <D.21821>; else goto <D.21820>;
  <D.21820>:
  D.23724 = target->in_count;
  D.23725 = (int) D.23724;
  D.23726 = D.23725 <= i;
  D.23727 = (long int) D.23726;
  D.23728 = __builtin_expect (D.23727, 0);
  if (D.23728 != 0) goto <D.23729>; else goto <D.23730>;
  <D.23729>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 111, "i < target->in_count");
  <D.23730>:
  ins = target->code;
  goto <D.21828>;
  <D.21827>:
  D.23731 = ins->opcode;
  D.23732 = D.23731 + 65217;
  D.23733 = D.23732 <= 2;
  D.23734 = D.23731 == 964;
  D.23735 = D.23733 | D.23734;
  if (D.23735 != 0) goto <D.23736>; else goto <D.21826>;
  <D.23736>:
  j = i;
  goto <D.21824>;
  <D.21823>:
  D.23737 = ins->data.op[1].phi_args;
  j.70 = (sizetype) j;
  D.23739 = j.70 + 1;
  D.23740 = D.23739 * 4;
  D.23741 = D.23737 + D.23740;
  D.23737 = ins->data.op[1].phi_args;
  j.70 = (sizetype) j;
  D.23742 = j.70 + 2;
  D.23743 = D.23742 * 4;
  D.23744 = D.23737 + D.23743;
  D.23745 = *D.23744;
  *D.23741 = D.23745;
  j = j + 1;
  <D.21824>:
  D.23737 = ins->data.op[1].phi_args;
  D.23746 = *D.23737;
  D.23747 = D.23746 + -1;
  if (D.23747 > j) goto <D.21823>; else goto <D.21825>;
  <D.21825>:
  D.23737 = ins->data.op[1].phi_args;
  D.23746 = *D.23737;
  D.23747 = D.23746 + -1;
  *D.23737 = D.23747;
  ins = ins->next;
  <D.21828>:
  if (ins != 0B) goto <D.21827>; else goto <D.21826>;
  <D.21826>:
}


mono_ssa_deadce (struct MonoCompile * cfg)
{
  unsigned int D.23748;
  unsigned int D.23749;
  _Bool D.23750;
  long int D.23751;
  long int D.23752;
  unsigned int D.23755;
  struct MonoMethodVar * D.23758;
  unsigned int i.71;
  unsigned int D.23760;
  struct GList * work_list.72;
  struct MonoMemPool * D.23762;
  struct GList * work_list.73;
  unsigned int i.74;
  unsigned int D.23765;
  struct GList * work_list.75;
  struct MonoInst * D.23769;
  struct GList * D.23772;
  struct GList * D.23774;
  void * D.23776;
  struct MonoInst * D.23777;
  short unsigned int D.23781;
  _Bool D.23782;
  _Bool D.23783;
  _Bool D.23784;
  short unsigned int D.23786;
  struct MonoInst * iftmp.76;
  int D.23790;
  unsigned int D.23791;
  unsigned int D.23792;
  struct MonoInst * * D.23795;
  unsigned int D.23796;
  unsigned int D.23797;
  struct MonoInst * * D.23798;
  unsigned char D.23802;
  int D.23803;
  int D.23804;
  int D.23807;
  unsigned int D.23808;
  unsigned int D.23809;
  struct MonoMethodVar * D.23810;
  int D.23811;
  short unsigned int D.23815;
  short unsigned int D.23817;
  _Bool D.23818;
  _Bool D.23819;
  _Bool D.23820;
  short unsigned int D.23821;
  short unsigned int D.23822;
  _Bool D.23823;
  _Bool D.23824;
  _Bool D.23825;
  int * D.23828;
  struct MonoInst * iftmp.77;
  unsigned int j.78;
  unsigned int D.23831;
  int * D.23832;
  int D.23833;
  unsigned int D.23834;
  unsigned int D.23837;
  unsigned int D.23838;
  struct MonoInst * * D.23839;
  int D.23841;
  unsigned int D.23842;
  unsigned int D.23843;
  int i;
  struct GList * work_list;

  try
    {
      D.23748 = cfg->comp_done;
      D.23749 = D.23748 & 32;
      D.23750 = D.23749 == 0;
      D.23751 = (long int) D.23750;
      D.23752 = __builtin_expect (D.23751, 0);
      if (D.23752 != 0) goto <D.23753>; else goto <D.23754>;
      <D.23753>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1259, "cfg->comp_done & MONO_COMP_SSA");
      <D.23754>:
      D.23748 = cfg->comp_done;
      D.23755 = D.23748 & 64;
      if (D.23755 == 0) goto <D.23756>; else goto <D.23757>;
      <D.23756>:
      mono_ssa_create_def_use (cfg);
      <D.23757>:
      mono_ssa_copyprop (cfg);
      work_list = 0B;
      i = 0;
      goto <D.22213>;
      <D.22212>:
      {
        struct MonoMethodVar * info;

        D.23758 = cfg->vars;
        i.71 = (unsigned int) i;
        D.23760 = i.71 * 56;
        info = D.23758 + D.23760;
        work_list.72 = work_list;
        D.23762 = cfg->mempool;
        work_list.73 = g_list_prepend_mempool (D.23762, work_list.72, info);
        work_list = work_list.73;
      }
      i = i + 1;
      <D.22213>:
      i.74 = (unsigned int) i;
      D.23765 = cfg->num_varinfo;
      if (i.74 < D.23765) goto <D.22212>; else goto <D.22214>;
      <D.22214>:
      goto <D.22224>;
      <D.22223>:
      {
        struct MonoMethodVar * info;

        work_list.72 = work_list;
        info = work_list.72->data;
        work_list.72 = work_list;
        work_list.72 = work_list;
        work_list.75 = monoeg_g_list_remove_link (work_list.72, work_list.72);
        work_list = work_list.75;
        D.23769 = info->def;
        if (D.23769 != 0B) goto <D.23770>; else goto <D.23771>;
        <D.23770>:
        D.23772 = info->uses;
        if (D.23772 == 0B) goto <D.23767>; else goto <D.23773>;
        <D.23773>:
        D.23772 = info->uses;
        D.23774 = D.23772->next;
        if (D.23774 == 0B) goto <D.23775>; else goto <D.23768>;
        <D.23775>:
        D.23772 = info->uses;
        D.23776 = D.23772->data;
        D.23777 = MEM[(struct MonoVarUsageInfo *)D.23776].inst;
        D.23769 = info->def;
        if (D.23777 == D.23769) goto <D.23767>; else goto <D.23768>;
        <D.23767>:
        {
          struct MonoInst * def;

          def = info->def;
          D.23781 = def->opcode;
          D.23782 = D.23781 == 428;
          D.23783 = D.23781 == 430;
          D.23784 = D.23782 | D.23783;
          if (D.23784 != 0) goto <D.23778>; else goto <D.23785>;
          <D.23785>:
          D.23786 = def->opcode;
          if (D.23786 == 431) goto <D.23778>; else goto <D.23787>;
          <D.23787>:
          D.23786 = def->opcode;
          if (D.23786 == 962) goto <D.23778>; else goto <D.23779>;
          <D.23778>:
          D.23786 = def->opcode;
          if (D.23786 != 430) goto <D.23788>; else goto <D.23779>;
          <D.23788>:
          {
            struct MonoInst * src_var;

            D.23790 = def->sreg1;
            D.23791 = (unsigned int) D.23790;
            D.23792 = cfg->vreg_to_inst_len;
            if (D.23791 < D.23792) goto <D.23793>; else goto <D.23794>;
            <D.23793>:
            D.23795 = cfg->vreg_to_inst;
            D.23790 = def->sreg1;
            D.23796 = (unsigned int) D.23790;
            D.23797 = D.23796 * 4;
            D.23798 = D.23795 + D.23797;
            iftmp.76 = *D.23798;
            goto <D.23799>;
            <D.23794>:
            iftmp.76 = 0B;
            <D.23799>:
            src_var = iftmp.76;
            if (src_var != 0B) goto <D.23800>; else goto <D.23801>;
            <D.23800>:
            D.23802 = src_var->flags;
            D.23803 = (int) D.23802;
            D.23804 = D.23803 & 20;
            if (D.23804 == 0) goto <D.23805>; else goto <D.23806>;
            <D.23805>:
            D.23758 = cfg->vars;
            D.23807 = src_var->data.op[0].const_val;
            D.23808 = (unsigned int) D.23807;
            D.23809 = D.23808 * 56;
            D.23810 = D.23758 + D.23809;
            add_to_dce_worklist (cfg, info, D.23810, &work_list);
            <D.23806>:
            <D.23801>:
            def->opcode = 316;
            def->sreg2 = -1;
            D.23811 = def->sreg2;
            def->sreg1 = D.23811;
            D.23790 = def->sreg1;
            def->dreg = D.23790;
            info->reg = -1;
          }
          goto <D.23780>;
          <D.23779>:
          D.23786 = def->opcode;
          D.23815 = D.23786 + 65174;
          if (D.23815 <= 1) goto <D.23812>; else goto <D.23816>;
          <D.23816>:
          D.23817 = def->opcode;
          D.23818 = D.23817 == 432;
          D.23819 = D.23817 == 963;
          D.23820 = D.23818 | D.23819;
          if (D.23820 != 0) goto <D.23812>; else goto <D.23813>;
          <D.23812>:
          def->opcode = 316;
          def->sreg2 = -1;
          D.23811 = def->sreg2;
          def->sreg1 = D.23811;
          D.23790 = def->sreg1;
          def->dreg = D.23790;
          info->reg = -1;
          goto <D.23814>;
          <D.23813>:
          D.23821 = def->opcode;
          D.23822 = D.23821 + 65217;
          D.23823 = D.23822 <= 2;
          D.23824 = D.23821 == 964;
          D.23825 = D.23823 | D.23824;
          if (D.23825 != 0) goto <D.23826>; else goto <D.23827>;
          <D.23826>:
          {
            int j;

            D.23828 = def->data.op[1].phi_args;
            j = *D.23828;
            goto <D.22221>;
            <D.22220>:
            {
              struct MonoMethodVar * u;

              D.23758 = cfg->vars;
              D.23828 = def->data.op[1].phi_args;
              j.78 = (unsigned int) j;
              D.23831 = j.78 * 4;
              D.23832 = D.23828 + D.23831;
              D.23833 = *D.23832;
              D.23834 = (unsigned int) D.23833;
              D.23792 = cfg->vreg_to_inst_len;
              if (D.23834 < D.23792) goto <D.23835>; else goto <D.23836>;
              <D.23835>:
              D.23795 = cfg->vreg_to_inst;
              D.23828 = def->data.op[1].phi_args;
              j.78 = (unsigned int) j;
              D.23831 = j.78 * 4;
              D.23832 = D.23828 + D.23831;
              D.23833 = *D.23832;
              D.23837 = (unsigned int) D.23833;
              D.23838 = D.23837 * 4;
              D.23839 = D.23795 + D.23838;
              iftmp.77 = *D.23839;
              goto <D.23840>;
              <D.23836>:
              iftmp.77 = 0B;
              <D.23840>:
              D.23841 = iftmp.77->data.op[0].const_val;
              D.23842 = (unsigned int) D.23841;
              D.23843 = D.23842 * 56;
              u = D.23758 + D.23843;
              add_to_dce_worklist (cfg, info, u, &work_list);
            }
            j = j + -1;
            <D.22221>:
            if (j > 0) goto <D.22220>; else goto <D.22222>;
            <D.22222>:
            def->opcode = 316;
            def->sreg2 = -1;
            D.23811 = def->sreg2;
            def->sreg1 = D.23811;
            D.23790 = def->sreg1;
            def->dreg = D.23790;
            info->reg = -1;
          }
          goto <D.23844>;
          <D.23827>:
          D.23786 = def->opcode;
          if (D.23786 == 316) goto <D.23845>; else goto <D.23846>;
          <D.23845>:
          <D.23846>:
          <D.23844>:
          <D.23814>:
          <D.23780>:
        }
        <D.23768>:
        <D.23771>:
      }
      <D.22224>:
      work_list.72 = work_list;
      if (work_list.72 != 0B) goto <D.22223>; else goto <D.22225>;
      <D.22225>:
    }
  finally
    {
      work_list = {CLOBBER};
    }
}


mono_ssa_copyprop (struct MonoCompile * cfg)
{
  unsigned int D.23847;
  unsigned int D.23848;
  _Bool D.23849;
  long int D.23850;
  long int D.23851;
  struct MonoInst * * D.23854;
  unsigned int index.79;
  unsigned int D.23856;
  struct MonoInst * * D.23857;
  struct MonoMethodVar * D.23858;
  unsigned int D.23859;
  struct MonoInst * D.23862;
  short unsigned int D.23865;
  _Bool D.23866;
  _Bool D.23867;
  _Bool D.23868;
  short unsigned int D.23870;
  struct MonoInst * iftmp.80;
  int D.23873;
  unsigned int D.23874;
  unsigned int D.23875;
  struct MonoInst * * D.23878;
  unsigned int D.23879;
  unsigned int D.23880;
  struct MonoInst * * D.23881;
  unsigned char D.23885;
  int D.23886;
  int D.23887;
  int D.23890;
  unsigned int D.23891;
  unsigned int D.23892;
  struct MonoMethodVar * D.23893;
  struct MonoInst * D.23894;
  short unsigned int D.23897;
  short unsigned int D.23898;
  _Bool D.23899;
  _Bool D.23900;
  _Bool D.23901;
  int D.23904;
  int D.23905;
  int D.23906;
  short unsigned int D.23907;
  int D.23908;
  int D.23909;
  signed char D.23910;
  int D.23911;
  _Bool D.23915;
  long int D.23916;
  long int D.23917;
  short unsigned int D.23923;
  int D.23925;
  short unsigned int D.23927;
  short unsigned int D.23928;
  _Bool D.23929;
  _Bool D.23930;
  _Bool D.23931;
  int * D.23934;
  unsigned int i.81;
  unsigned int D.23936;
  int * D.23937;
  int D.23938;
  _Bool D.23940;
  long int D.23941;
  long int D.23942;
  struct MonoBasicBlock * D.23946;
  unsigned int index.82;
  unsigned int D.23948;
  unsigned int D.23949;
  int i;
  int index;
  struct GList * l;

  D.23847 = cfg->comp_done;
  D.23848 = D.23847 & 64;
  D.23849 = D.23848 == 0;
  D.23850 = (long int) D.23849;
  D.23851 = __builtin_expect (D.23850, 0);
  if (D.23851 != 0) goto <D.23852>; else goto <D.23853>;
  <D.23852>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 674, "(cfg->comp_done & MONO_COMP_SSA_DEF_USE)");
  <D.23853>:
  index = 0;
  goto <D.22051>;
  <D.22050>:
  {
    struct MonoInst * var;
    struct MonoMethodVar * info;

    D.23854 = cfg->varinfo;
    index.79 = (unsigned int) index;
    D.23856 = index.79 * 4;
    D.23857 = D.23854 + D.23856;
    var = *D.23857;
    D.23858 = cfg->vars;
    index.79 = (unsigned int) index;
    D.23859 = index.79 * 56;
    info = D.23858 + D.23859;
    D.23862 = info->def;
    if (D.23862 != 0B) goto <D.23863>; else goto <D.23864>;
    <D.23863>:
    D.23862 = info->def;
    D.23865 = D.23862->opcode;
    D.23866 = D.23865 == 428;
    D.23867 = D.23865 == 430;
    D.23868 = D.23866 | D.23867;
    if (D.23868 != 0) goto <D.23860>; else goto <D.23869>;
    <D.23869>:
    D.23862 = info->def;
    D.23870 = D.23862->opcode;
    if (D.23870 == 431) goto <D.23860>; else goto <D.23871>;
    <D.23871>:
    D.23862 = info->def;
    D.23870 = D.23862->opcode;
    if (D.23870 == 962) goto <D.23860>; else goto <D.23861>;
    <D.23860>:
    {
      struct MonoInst * var2;

      D.23862 = info->def;
      D.23873 = D.23862->sreg1;
      D.23874 = (unsigned int) D.23873;
      D.23875 = cfg->vreg_to_inst_len;
      if (D.23874 < D.23875) goto <D.23876>; else goto <D.23877>;
      <D.23876>:
      D.23878 = cfg->vreg_to_inst;
      D.23862 = info->def;
      D.23873 = D.23862->sreg1;
      D.23879 = (unsigned int) D.23873;
      D.23880 = D.23879 * 4;
      D.23881 = D.23878 + D.23880;
      iftmp.80 = *D.23881;
      goto <D.23882>;
      <D.23877>:
      iftmp.80 = 0B;
      <D.23882>:
      var2 = iftmp.80;
      if (var2 != 0B) goto <D.23883>; else goto <D.23884>;
      <D.23883>:
      D.23885 = var2->flags;
      D.23886 = (int) D.23885;
      D.23887 = D.23886 & 20;
      if (D.23887 == 0) goto <D.23888>; else goto <D.23889>;
      <D.23888>:
      D.23858 = cfg->vars;
      D.23890 = var2->data.op[0].const_val;
      D.23891 = (unsigned int) D.23890;
      D.23892 = D.23891 * 56;
      D.23893 = D.23858 + D.23892;
      D.23894 = D.23893->def;
      if (D.23894 != 0B) goto <D.23895>; else goto <D.23896>;
      <D.23895>:
      D.23858 = cfg->vars;
      D.23890 = var2->data.op[0].const_val;
      D.23891 = (unsigned int) D.23890;
      D.23892 = D.23891 * 56;
      D.23893 = D.23858 + D.23892;
      D.23894 = D.23893->def;
      D.23897 = D.23894->opcode;
      D.23898 = D.23897 + 65217;
      D.23899 = D.23898 > 2;
      D.23900 = D.23897 != 964;
      D.23901 = D.23899 & D.23900;
      if (D.23901 != 0) goto <D.23902>; else goto <D.23903>;
      <D.23902>:
      {
        int dreg;
        int sreg1;

        dreg = var->dreg;
        sreg1 = var2->dreg;
        l = info->uses;
        goto <D.22048>;
        <D.22047>:
        {
          struct MonoVarUsageInfo * u;
          struct MonoInst * ins;
          struct GList * next;
          int num_sregs;
          int sregs[3];

          try
            {
              u = l->data;
              ins = u->inst;
              next = l->next;
              D.23904 = ins->sreg1;
              sregs[0] = D.23904;
              D.23905 = ins->sreg2;
              sregs[1] = D.23905;
              D.23906 = ins->sreg3;
              sregs[2] = D.23906;
              D.23907 = ins->opcode;
              D.23908 = (int) D.23907;
              D.23909 = D.23908 + -313;
              D.23910 = ins_sreg_counts[D.23909];
              num_sregs = (int) D.23910;
              i = 0;
              goto <D.22042>;
              <D.22041>:
              D.23911 = sregs[i];
              if (D.23911 == dreg) goto <D.22040>; else goto <D.23912>;
              <D.23912>:
              i = i + 1;
              <D.22042>:
              if (i < num_sregs) goto <D.22041>; else goto <D.22040>;
              <D.22040>:
              if (i < num_sregs) goto <D.23913>; else goto <D.23914>;
              <D.23913>:
              D.23911 = sregs[i];
              D.23915 = D.23911 != dreg;
              D.23916 = (long int) D.23915;
              D.23917 = __builtin_expect (D.23916, 0);
              if (D.23917 != 0) goto <D.23918>; else goto <D.23919>;
              <D.23918>:
              monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 702, "sregs [i] == dreg");
              <D.23919>:
              sregs[i] = sreg1;
              mono_inst_set_src_registers (ins, &sregs);
              goto <D.23920>;
              <D.23914>:
              D.23907 = ins->opcode;
              D.23923 = D.23907 + 65162;
              if (D.23923 <= 16) goto <D.23924>; else goto <D.23921>;
              <D.23924>:
              D.23925 = ins->dreg;
              if (D.23925 == dreg) goto <D.23926>; else goto <D.23921>;
              <D.23926>:
              ins->dreg = sreg1;
              goto <D.23922>;
              <D.23921>:
              D.23927 = ins->opcode;
              D.23928 = D.23927 + 65217;
              D.23929 = D.23928 <= 2;
              D.23930 = D.23927 == 964;
              D.23931 = D.23929 | D.23930;
              if (D.23931 != 0) goto <D.23932>; else goto <D.23933>;
              <D.23932>:
              D.23934 = ins->data.op[1].phi_args;
              i = *D.23934;
              goto <D.22046>;
              <D.22045>:
              {
                int sreg;

                D.23934 = ins->data.op[1].phi_args;
                i.81 = (unsigned int) i;
                D.23936 = i.81 * 4;
                D.23937 = D.23934 + D.23936;
                sreg = *D.23937;
                D.23938 = var->dreg;
                if (D.23938 == sreg) goto <D.22044>; else goto <D.23939>;
                <D.23939>:
              }
              i = i + -1;
              <D.22046>:
              if (i > 0) goto <D.22045>; else goto <D.22044>;
              <D.22044>:
              D.23940 = i <= 0;
              D.23941 = (long int) D.23940;
              D.23942 = __builtin_expect (D.23941, 0);
              if (D.23942 != 0) goto <D.23943>; else goto <D.23944>;
              <D.23943>:
              monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 713, "i > 0");
              <D.23944>:
              D.23934 = ins->data.op[1].phi_args;
              i.81 = (unsigned int) i;
              D.23936 = i.81 * 4;
              D.23937 = D.23934 + D.23936;
              *D.23937 = sreg1;
              goto <D.23945>;
              <D.23933>:
              monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "ssa.c", 717);
              <D.23945>:
              <D.23922>:
              <D.23920>:
              D.23946 = u->bb;
              record_use (cfg, var2, D.23946, ins);
              l = next;
            }
          finally
            {
              sregs = {CLOBBER};
            }
        }
        <D.22048>:
        if (l != 0B) goto <D.22047>; else goto <D.22049>;
        <D.22049>:
        info->uses = 0B;
      }
      <D.23903>:
      <D.23896>:
      <D.23889>:
      <D.23884>:
    }
    <D.23861>:
    <D.23864>:
  }
  index = index + 1;
  <D.22051>:
  index.82 = (unsigned int) index;
  D.23948 = cfg->num_varinfo;
  if (index.82 < D.23948) goto <D.22050>; else goto <D.22052>;
  <D.22052>:
  D.23949 = cfg->verbose_level;
  if (D.23949 > 3) goto <D.23950>; else goto <D.23951>;
  <D.23950>:
  {
    struct MonoBasicBlock * bb;

    bb = cfg->bb_entry;
    goto <D.22055>;
    <D.22054>:
    mono_print_bb (bb, "AFTER SSA COPYPROP");
    bb = bb->next_bb;
    <D.22055>:
    if (bb != 0B) goto <D.22054>; else goto <D.22056>;
    <D.22056>:
  }
  <D.23951>:
}


add_to_dce_worklist (struct MonoCompile * cfg, struct MonoMethodVar * var, struct MonoMethodVar * use, struct GList * * wl)
{
  struct GList * D.23952;
  struct MonoMemPool * D.23953;
  struct GList * D.23954;
  struct MonoInst * D.23955;
  struct MonoInst * D.23956;
  struct GList * D.23959;
  struct GList * D.23960;
  struct GList * tmp;

  D.23952 = *wl;
  D.23953 = cfg->mempool;
  D.23954 = g_list_prepend_mempool (D.23953, D.23952, use);
  *wl = D.23954;
  tmp = use->uses;
  goto <D.22205>;
  <D.22204>:
  {
    struct MonoVarUsageInfo * ui;

    ui = tmp->data;
    D.23955 = ui->inst;
    D.23956 = var->def;
    if (D.23955 == D.23956) goto <D.23957>; else goto <D.23958>;
    <D.23957>:
    D.23959 = use->uses;
    D.23960 = monoeg_g_list_remove_link (D.23959, tmp);
    use->uses = D.23960;
    goto <D.22203>;
    <D.23958>:
  }
  tmp = tmp->next;
  <D.22205>:
  if (tmp != 0B) goto <D.22204>; else goto <D.22203>;
  <D.22203>:
}


mono_ssa_loop_invariant_code_motion (struct MonoCompile * cfg)
{
  unsigned int D.23961;
  unsigned int D.23962;
  _Bool D.23963;
  long int D.23964;
  long int D.23965;
  unsigned int D.23968;
  unsigned int D.23969;
  struct MonoBasicBlock * D.23972;
  struct MonoInst * iftmp.83;
  short unsigned int D.23981;
  unsigned char D.23984;
  unsigned char D.23985;
  <unnamed type> D.23988;
  short unsigned int D.23993;
  _Bool D.23994;
  _Bool D.23995;
  _Bool D.23996;
  struct MonoInst * D.24003;
  short unsigned int D.24005;
  struct MonoBasicBlock * D.24007;
  signed char D.24009;
  short unsigned int D.24011;
  _Bool D.24012;
  _Bool D.24013;
  _Bool D.24014;
  short unsigned int D.24017;
  short unsigned int D.24026;
  _Bool D.24027;
  _Bool D.24028;
  _Bool D.24029;
  short unsigned int D.24085;
  _Bool D.24086;
  _Bool D.24087;
  _Bool D.24088;
  short unsigned int D.24092;
  int D.24093;
  int D.24094;
  int D.24095;
  int D.24098;
  char D.24101;
  unsigned int D.24108;
  int D.24111;
  struct MonoInst * D.24112;
  struct MonoInst * D.24115;
  struct MonoInst * D.24118;
  struct MonoInst * D.24121;
  short unsigned int D.24124;
  _Bool D.24125;
  _Bool D.24126;
  _Bool D.24127;
  struct MonoInst * iftmp.84;
  unsigned int D.24134;
  struct MonoMethodVar * D.24135;
  unsigned int i.85;
  unsigned int D.24137;
  unsigned int i.86;
  unsigned int D.24139;
  struct MonoBasicBlock * bb;
  struct MonoBasicBlock * h;
  struct MonoBasicBlock * idom;
  struct MonoInst * ins;
  struct MonoInst * n;
  struct MonoInst * tins;
  int i;

  D.23961 = cfg->comp_done;
  D.23962 = D.23961 & 32;
  D.23963 = D.23962 == 0;
  D.23964 = (long int) D.23963;
  D.23965 = __builtin_expect (D.23964, 0);
  if (D.23965 != 0) goto <D.23966>; else goto <D.23967>;
  <D.23966>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1360, "cfg->comp_done & MONO_COMP_SSA");
  <D.23967>:
  D.23968 = BIT_FIELD_REF <*cfg, 32, 3200>;
  D.23969 = D.23968 & 320;
  if (D.23969 != 320) goto <D.23970>; else goto <D.23971>;
  <D.23970>:
  return;
  <D.23971>:
  D.23972 = cfg->bb_entry;
  bb = D.23972->next_bb;
  goto <D.22256>;
  <D.22255>:
  {
    struct GList * lp;

    lp = bb->loop_blocks;
    if (lp == 0B) goto <D.23973>; else goto <D.23974>;
    <D.23973>:
    // predicted unlikely by continue predictor.
    goto <D.22237>;
    <D.23974>:
    h = lp->data;
    if (bb != h) goto <D.23975>; else goto <D.23976>;
    <D.23975>:
    // predicted unlikely by continue predictor.
    goto <D.22237>;
    <D.23976>:
    ins = bb->code;
    if (ins != 0B) goto <D.23978>; else goto <D.23979>;
    <D.23978>:
    iftmp.83 = ins->next;
    goto <D.23980>;
    <D.23979>:
    iftmp.83 = 0B;
    <D.23980>:
    n = iftmp.83;
    goto <D.22253>;
    <D.22252>:
    {
      gboolean is_class_init;

      is_class_init = 0;
      D.23981 = ins->opcode;
      if (D.23981 == 343) goto <D.23982>; else goto <D.23983>;
      <D.23982>:
      {
        struct MonoCallInst * call;

        call = ins;
        D.23984 = BIT_FIELD_REF <*call, 8, 640>;
        D.23985 = D.23984 & 4;
        if (D.23985 != 0) goto <D.23986>; else goto <D.23987>;
        <D.23986>:
        {
          struct MonoJumpInfo * ji;

          ji = call->fptr;
          D.23988 = ji->type;
          if (D.23988 == 15) goto <D.23989>; else goto <D.23990>;
          <D.23989>:
          is_class_init = 1;
          <D.23990>:
        }
        <D.23987>:
      }
      <D.23983>:
      D.23993 = ins->opcode;
      D.23994 = D.23993 == 787;
      D.23995 = D.23993 == 785;
      D.23996 = D.23994 | D.23995;
      if (D.23996 != 0) goto <D.23991>; else goto <D.23997>;
      <D.23997>:
      D.23981 = ins->opcode;
      if (D.23981 == 340) goto <D.23991>; else goto <D.23998>;
      <D.23998>:
      D.23981 = ins->opcode;
      if (D.23981 == 736) goto <D.23991>; else goto <D.23999>;
      <D.23999>:
      if (is_class_init != 0) goto <D.23991>; else goto <D.23992>;
      <D.23991>:
      {
        gboolean skip;
        int sreg;

        idom = h->idom;
        if (idom == 0B) goto <D.24000>; else goto <D.24002>;
        <D.24002>:
        D.24003 = idom->last_ins;
        if (D.24003 == 0B) goto <D.24000>; else goto <D.24004>;
        <D.24004>:
        D.24003 = idom->last_ins;
        D.24005 = D.24003->opcode;
        if (D.24005 != 446) goto <D.24000>; else goto <D.24006>;
        <D.24006>:
        D.24003 = idom->last_ins;
        D.24007 = D.24003->data.op[0].target_block;
        if (D.24007 != h) goto <D.24000>; else goto <D.24008>;
        <D.24008>:
        D.24009 = h->nesting;
        if (D.24009 != 1) goto <D.24000>; else goto <D.24001>;
        <D.24000>:
        // predicted unlikely by continue predictor.
        goto <D.22243>;
        <D.24001>:
        skip = 0;
        tins = bb->code;
        goto <D.22246>;
        <D.22245>:
        if (tins == ins) goto <D.22244>; else goto <D.24010>;
        <D.24010>:
        D.24011 = tins->opcode;
        D.24012 = D.24011 != 428;
        D.24013 = D.24011 != 430;
        D.24014 = D.24012 & D.24013;
        if (D.24014 != 0) goto <D.24015>; else goto <D.24016>;
        <D.24015>:
        D.24017 = tins->opcode;
        if (D.24017 != 431) goto <D.24018>; else goto <D.24019>;
        <D.24018>:
        D.24017 = tins->opcode;
        if (D.24017 != 962) goto <D.24020>; else goto <D.24021>;
        <D.24020>:
        D.24017 = tins->opcode;
        if (D.24017 != 362) goto <D.24022>; else goto <D.24023>;
        <D.24022>:
        D.24017 = tins->opcode;
        if (D.24017 != 363) goto <D.24024>; else goto <D.24025>;
        <D.24024>:
        D.24026 = tins->opcode;
        D.24027 = D.24026 != 432;
        D.24028 = D.24026 != 963;
        D.24029 = D.24027 & D.24028;
        if (D.24029 != 0) goto <D.24030>; else goto <D.24031>;
        <D.24030>:
        D.24017 = tins->opcode;
        if (D.24017 != 433) goto <D.24032>; else goto <D.24033>;
        <D.24032>:
        D.24017 = tins->opcode;
        if (D.24017 != 365) goto <D.24034>; else goto <D.24035>;
        <D.24034>:
        D.24017 = tins->opcode;
        if (D.24017 != 542) goto <D.24036>; else goto <D.24037>;
        <D.24036>:
        D.24017 = tins->opcode;
        if (D.24017 != 630) goto <D.24038>; else goto <D.24039>;
        <D.24038>:
        D.24017 = tins->opcode;
        if (D.24017 != 629) goto <D.24040>; else goto <D.24041>;
        <D.24040>:
        D.24017 = tins->opcode;
        if (D.24017 != 496) goto <D.24042>; else goto <D.24043>;
        <D.24042>:
        D.24017 = tins->opcode;
        if (D.24017 != 570) goto <D.24044>; else goto <D.24045>;
        <D.24044>:
        D.24017 = tins->opcode;
        if (D.24017 != 979) goto <D.24046>; else goto <D.24047>;
        <D.24046>:
        D.24017 = tins->opcode;
        if (D.24017 != 639) goto <D.24048>; else goto <D.24049>;
        <D.24048>:
        D.24017 = tins->opcode;
        if (D.24017 != 640) goto <D.24050>; else goto <D.24051>;
        <D.24050>:
        D.24017 = tins->opcode;
        if (D.24017 != 641) goto <D.24052>; else goto <D.24053>;
        <D.24052>:
        D.24017 = tins->opcode;
        if (D.24017 != 636) goto <D.24054>; else goto <D.24055>;
        <D.24054>:
        D.24017 = tins->opcode;
        if (D.24017 != 595) goto <D.24056>; else goto <D.24057>;
        <D.24056>:
        D.24017 = tins->opcode;
        if (D.24017 != 584) goto <D.24058>; else goto <D.24059>;
        <D.24058>:
        D.24017 = tins->opcode;
        if (D.24017 != 766) goto <D.24060>; else goto <D.24061>;
        <D.24060>:
        D.24017 = tins->opcode;
        if (D.24017 != 507) goto <D.24062>; else goto <D.24063>;
        <D.24062>:
        D.24017 = tins->opcode;
        if (D.24017 != 594) goto <D.24064>; else goto <D.24065>;
        <D.24064>:
        D.24017 = tins->opcode;
        if (D.24017 != 585) goto <D.24066>; else goto <D.24067>;
        <D.24066>:
        D.24017 = tins->opcode;
        if (D.24017 != 499) goto <D.24068>; else goto <D.24069>;
        <D.24068>:
        D.24017 = tins->opcode;
        if (D.24017 != 314) goto <D.24070>; else goto <D.24071>;
        <D.24070>:
        D.24017 = tins->opcode;
        if (D.24017 != 319) goto <D.24072>; else goto <D.24073>;
        <D.24072>:
        D.24017 = tins->opcode;
        if (D.24017 != 316) goto <D.24074>; else goto <D.24075>;
        <D.24074>:
        D.24017 = tins->opcode;
        if (D.24017 != 769) goto <D.24076>; else goto <D.24077>;
        <D.24076>:
        D.24017 = tins->opcode;
        if (D.24017 != 803) goto <D.24078>; else goto <D.24079>;
        <D.24078>:
        skip = 1;
        goto <D.22244>;
        <D.24079>:
        <D.24077>:
        <D.24075>:
        <D.24073>:
        <D.24071>:
        <D.24069>:
        <D.24067>:
        <D.24065>:
        <D.24063>:
        <D.24061>:
        <D.24059>:
        <D.24057>:
        <D.24055>:
        <D.24053>:
        <D.24051>:
        <D.24049>:
        <D.24047>:
        <D.24045>:
        <D.24043>:
        <D.24041>:
        <D.24039>:
        <D.24037>:
        <D.24035>:
        <D.24033>:
        <D.24031>:
        <D.24025>:
        <D.24023>:
        <D.24021>:
        <D.24019>:
        <D.24016>:
        tins = tins->next;
        <D.22246>:
        if (tins != 0B) goto <D.22245>; else goto <D.22244>;
        <D.22244>:
        if (skip != 0) goto <D.24080>; else goto <D.24081>;
        <D.24080>:
        // predicted unlikely by continue predictor.
        goto <D.22243>;
        <D.24081>:
        D.24085 = ins->opcode;
        D.24086 = D.24085 == 787;
        D.24087 = D.24085 == 785;
        D.24088 = D.24086 | D.24087;
        if (D.24088 != 0) goto <D.24082>; else goto <D.24089>;
        <D.24089>:
        D.23981 = ins->opcode;
        if (D.23981 == 340) goto <D.24082>; else goto <D.24083>;
        <D.24082>:
        sreg = ins->sreg1;
        goto <D.24084>;
        <D.24083>:
        sreg = -1;
        <D.24084>:
        if (sreg != -1) goto <D.24090>; else goto <D.24091>;
        <D.24090>:
        {
          struct MonoInst * tins;

          skip = 0;
          tins = ins->prev;
          goto <D.22251>;
          <D.22250>:
          {
            const char * spec;

            D.24092 = tins->opcode;
            D.24093 = (int) D.24092;
            D.24094 = D.24093 + -313;
            D.24095 = D.24094 * 4;
            spec = &ins_info[D.24095];
            D.24092 = tins->opcode;
            if (D.24092 == 428) goto <D.24096>; else goto <D.24097>;
            <D.24096>:
            D.24098 = tins->dreg;
            if (D.24098 == sreg) goto <D.24099>; else goto <D.24100>;
            <D.24099>:
            sreg = tins->sreg1;
            <D.24100>:
            <D.24097>:
            D.24101 = *spec;
            if (D.24101 != 32) goto <D.24102>; else goto <D.24103>;
            <D.24102>:
            D.24098 = tins->dreg;
            if (D.24098 == sreg) goto <D.24104>; else goto <D.24105>;
            <D.24104>:
            skip = 1;
            goto <D.22249>;
            <D.24105>:
            <D.24103>:
          }
          tins = tins->prev;
          <D.22251>:
          if (tins != 0B) goto <D.22250>; else goto <D.22249>;
          <D.22249>:
          if (skip != 0) goto <D.24106>; else goto <D.24107>;
          <D.24106>:
          // predicted unlikely by continue predictor.
          goto <D.22243>;
          <D.24107>:
          ins->sreg1 = sreg;
        }
        <D.24091>:
        D.24108 = cfg->verbose_level;
        if (D.24108 > 1) goto <D.24109>; else goto <D.24110>;
        <D.24109>:
        D.24111 = bb->block_num;
        printf ("licm in BB%d on ", D.24111);
        mono_print_ins (ins);
        <D.24110>:
        D.24112 = ins->prev;
        if (D.24112 != 0B) goto <D.24113>; else goto <D.24114>;
        <D.24113>:
        D.24112 = ins->prev;
        D.24115 = ins->next;
        D.24112->next = D.24115;
        <D.24114>:
        D.24115 = ins->next;
        if (D.24115 != 0B) goto <D.24116>; else goto <D.24117>;
        <D.24116>:
        D.24115 = ins->next;
        D.24112 = ins->prev;
        D.24115->prev = D.24112;
        <D.24117>:
        D.24118 = bb->code;
        if (D.24118 == ins) goto <D.24119>; else goto <D.24120>;
        <D.24119>:
        D.24115 = ins->next;
        bb->code = D.24115;
        <D.24120>:
        D.24121 = bb->last_ins;
        if (D.24121 == ins) goto <D.24122>; else goto <D.24123>;
        <D.24122>:
        D.24112 = ins->prev;
        bb->last_ins = D.24112;
        <D.24123>:
        D.24003 = idom->last_ins;
        mono_bblock_insert_before_ins (idom, D.24003, ins);
        D.24124 = ins->opcode;
        D.24125 = D.24124 == 787;
        D.24126 = D.24124 == 785;
        D.24127 = D.24125 | D.24126;
        if (D.24127 != 0) goto <D.24128>; else goto <D.24129>;
        <D.24128>:
        idom->has_array_access = 1;
        <D.24129>:
      }
      <D.23992>:
    }
    <D.22243>:
    ins = n;
    if (ins != 0B) goto <D.24131>; else goto <D.24132>;
    <D.24131>:
    iftmp.84 = ins->next;
    goto <D.24133>;
    <D.24132>:
    iftmp.84 = 0B;
    <D.24133>:
    n = iftmp.84;
    <D.22253>:
    if (ins != 0B) goto <D.22252>; else goto <D.22254>;
    <D.22254>:
  }
  <D.22237>:
  bb = bb->next_bb;
  <D.22256>:
  if (bb != 0B) goto <D.22255>; else goto <D.22257>;
  <D.22257>:
  D.23961 = cfg->comp_done;
  D.24134 = D.23961 & 4294967231;
  cfg->comp_done = D.24134;
  i = 0;
  goto <D.22260>;
  <D.22259>:
  {
    struct MonoMethodVar * info;

    D.24135 = cfg->vars;
    i.85 = (unsigned int) i;
    D.24137 = i.85 * 56;
    info = D.24135 + D.24137;
    info->def = 0B;
    info->uses = 0B;
  }
  i = i + 1;
  <D.22260>:
  i.86 = (unsigned int) i;
  D.24139 = cfg->num_varinfo;
  if (i.86 < D.24139) goto <D.22259>; else goto <D.22261>;
  <D.22261>:
}


