mono_ssa_compute (struct MonoCompile * cfg)
{
  unsigned int D.21942;
  unsigned int D.21943;
  unsigned int D.21944;
  unsigned int D.21945;
  _Bool D.21946;
  long int D.21947;
  long int D.21948;
  unsigned int D.21951;
  unsigned int D.21952;
  _Bool D.21953;
  long int D.21954;
  long int D.21955;
  unsigned int D.21958;
  unsigned int D.21961;
  unsigned int D.21962;
  unsigned int D.21965;
  unsigned int D.21966;
  unsigned int D.21967;
  unsigned int D.21968;
  unsigned int i.0;
  unsigned int D.21970;
  struct MonoMethodVar * D.21971;
  struct MonoBitSet * D.21972;
  sizetype bitsize.1;
  unsigned int i.2;
  struct MonoInst * * D.21975;
  unsigned int D.21976;
  struct MonoInst * * D.21977;
  struct MonoInst * D.21978;
  short unsigned int D.21979;
  struct MonoBitSet * D.21982;
  unsigned int D.21983;
  unsigned int D.21984;
  struct MonoBasicBlock * * D.21985;
  struct MonoBasicBlock * * D.21986;
  struct MonoBasicBlock * D.21987;
  short unsigned int D.21988;
  short unsigned int D.21991;
  int D.21994;
  unsigned int D.21995;
  unsigned int D.21996;
  struct MonoInst * * D.21999;
  unsigned int D.22000;
  unsigned int D.22001;
  struct MonoInst * * D.22002;
  struct MonoInst * D.22003;
  struct MonoInst * iftmp.3;
  int D.22010;
  unsigned int D.22011;
  unsigned int D.22012;
  struct MonoMethodVar * D.22013;
  struct MonoBitSet * D.22014;
  unsigned int D.22015;
  struct MonoInst * iftmp.4;
  int D.22020;
  unsigned int D.22021;
  unsigned int D.22022;
  struct MonoMethodVar * D.22023;
  struct MonoBitSet * D.22024;
  unsigned int D.22025;
  int D.22026;
  unsigned int D.22027;
  unsigned int D.22028;
  unsigned char D.22029;
  unsigned char D.22032;
  int D.22033;
  int D.22034;
  unsigned int D.22037;
  unsigned int D.22042;
  int D.22045;
  unsigned int idx.5;
  unsigned int D.22047;
  struct MonoBasicBlock * * D.22048;
  struct MonoBasicBlock * D.22049;
  struct MonoBitSet * D.22054;
  unsigned int D.22055;
  unsigned int D.22056;
  unsigned int D.22057;
  struct MonoMemPool * D.22060;
  int D.22061;
  int D.22062;
  int D.22063;
  struct MonoType * D.22065;
  unsigned int D.22066;
  unsigned int D.22067;
  struct MonoClass * D.22070;
  struct MonoClass * D.22072;
  struct MonoBasicBlock * D.22073;
  short int D.22074;
  int D.22075;
  int D.22076;
  unsigned int D.22077;
  unsigned int D.22078;
  void * D.22079;
  int * D.22080;
  sizetype j.6;
  sizetype D.22082;
  sizetype D.22083;
  int * D.22084;
  int D.22085;
  struct MonoInst * D.22086;
  unsigned int idx.7;
  unsigned int D.22089;
  unsigned int D.22090;
  unsigned int stack_history_size.8;
  unsigned int D.22092;
  int D.22093;
  struct MonoBasicBlock * D.22094;
  unsigned int D.22097;
  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.21942 = cfg->num_varinfo;
  D.21943 = D.21942 * 56;
  vinfo = monoeg_malloc0 (D.21943);
  D.21944 = cfg->comp_done;
  D.21945 = D.21944 & 32;
  D.21946 = D.21945 != 0;
  D.21947 = (long int) D.21946;
  D.21948 = __builtin_expect (D.21947, 0);
  if (D.21948 != 0) goto <D.21949>; else goto <D.21950>;
  <D.21949>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 342, "!(cfg->comp_done & MONO_COMP_SSA)");
  <D.21950>:
  D.21951 = BIT_FIELD_REF <*cfg, 32, 3392>;
  D.21952 = D.21951 & 2;
  D.21953 = D.21952 != 0;
  D.21954 = (long int) D.21953;
  D.21955 = __builtin_expect (D.21954, 0);
  if (D.21955 != 0) goto <D.21956>; else goto <D.21957>;
  <D.21956>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 344, "!cfg->disable_ssa");
  <D.21957>:
  D.21958 = cfg->verbose_level;
  if (D.21958 > 3) goto <D.21959>; else goto <D.21960>;
  <D.21959>:
  D.21942 = cfg->num_varinfo;
  D.21961 = cfg->next_vreg;
  printf ("\nCOMPUTE SSA %d (R%d-)\n\n", D.21942, D.21961);
  <D.21960>:
  D.21944 = cfg->comp_done;
  D.21962 = D.21944 & 16;
  if (D.21962 == 0) goto <D.21963>; else goto <D.21964>;
  <D.21963>:
  mono_analyze_liveness (cfg);
  <D.21964>:
  mono_compile_dominator_info (cfg, 7);
  D.21965 = cfg->num_bblocks;
  D.21966 = mono_bitset_alloc_size (D.21965, 0);
  bitsize = (int) D.21966;
  D.21965 = cfg->num_bblocks;
  D.21967 = mono_bitset_alloc_size (D.21965, 0);
  D.21942 = cfg->num_varinfo;
  D.21968 = D.21967 * D.21942;
  buf_start = monoeg_malloc0 (D.21968);
  buf = buf_start;
  i = 0;
  goto <D.21597>;
  <D.21596>:
  i.0 = (unsigned int) i;
  D.21970 = i.0 * 56;
  D.21971 = vinfo + D.21970;
  D.21965 = cfg->num_bblocks;
  D.21972 = mono_bitset_mem_new (buf, D.21965, 0);
  D.21971->def_in = D.21972;
  bitsize.1 = (sizetype) bitsize;
  buf = buf + bitsize.1;
  i.0 = (unsigned int) i;
  D.21970 = i.0 * 56;
  D.21971 = vinfo + D.21970;
  i.2 = (unsigned int) i;
  D.21971->idx = i.2;
  D.21975 = cfg->varinfo;
  i.0 = (unsigned int) i;
  D.21976 = i.0 * 4;
  D.21977 = D.21975 + D.21976;
  D.21978 = *D.21977;
  D.21979 = D.21978->opcode;
  if (D.21979 == 330) goto <D.21980>; else goto <D.21981>;
  <D.21980>:
  i.0 = (unsigned int) i;
  D.21970 = i.0 * 56;
  D.21971 = vinfo + D.21970;
  D.21982 = D.21971->def_in;
  i.0 = (unsigned int) i;
  D.21970 = i.0 * 56;
  D.21971 = vinfo + D.21970;
  D.21982 = D.21971->def_in;
  D.21983 = D.21982->data[0];
  D.21984 = D.21983 | 1;
  D.21982->data[0] = D.21984;
  <D.21981>:
  i = i + 1;
  <D.21597>:
  i.2 = (unsigned int) i;
  D.21942 = cfg->num_varinfo;
  if (i.2 < D.21942) goto <D.21596>; else goto <D.21598>;
  <D.21598>:
  i = 0;
  goto <D.21604>;
  <D.21603>:
  D.21985 = cfg->bblocks;
  i.0 = (unsigned int) i;
  D.21976 = i.0 * 4;
  D.21986 = D.21985 + D.21976;
  D.21987 = *D.21986;
  ins = D.21987->code;
  goto <D.21601>;
  <D.21600>:
  D.21988 = ins->opcode;
  if (D.21988 == 316) goto <D.21989>; else goto <D.21990>;
  <D.21989>:
  // predicted unlikely by continue predictor.
  goto <D.21599>;
  <D.21990>:
  D.21988 = ins->opcode;
  D.21991 = D.21988 + 65162;
  if (D.21991 > 13) goto <D.21992>; else goto <D.21993>;
  <D.21992>:
  D.21994 = ins->dreg;
  D.21995 = (unsigned int) D.21994;
  D.21996 = cfg->vreg_to_inst_len;
  if (D.21995 < D.21996) goto <D.21997>; else goto <D.21998>;
  <D.21997>:
  D.21999 = cfg->vreg_to_inst;
  D.21994 = ins->dreg;
  D.22000 = (unsigned int) D.21994;
  D.22001 = D.22000 * 4;
  D.22002 = D.21999 + D.22001;
  D.22003 = *D.22002;
  if (D.22003 != 0B) goto <D.22004>; else goto <D.22005>;
  <D.22004>:
  D.21994 = ins->dreg;
  D.21995 = (unsigned int) D.21994;
  D.21996 = cfg->vreg_to_inst_len;
  if (D.21995 < D.21996) goto <D.22007>; else goto <D.22008>;
  <D.22007>:
  D.21999 = cfg->vreg_to_inst;
  D.21994 = ins->dreg;
  D.22000 = (unsigned int) D.21994;
  D.22001 = D.22000 * 4;
  D.22002 = D.21999 + D.22001;
  iftmp.3 = *D.22002;
  goto <D.22009>;
  <D.22008>:
  iftmp.3 = 0B;
  <D.22009>:
  D.22010 = iftmp.3->data.op[0].const_val;
  D.22011 = (unsigned int) D.22010;
  D.22012 = D.22011 * 56;
  D.22013 = vinfo + D.22012;
  D.22014 = D.22013->def_in;
  i.0 = (unsigned int) i;
  D.22015 = i.0 / 32;
  D.21994 = ins->dreg;
  D.21995 = (unsigned int) D.21994;
  D.21996 = cfg->vreg_to_inst_len;
  if (D.21995 < D.21996) goto <D.22017>; else goto <D.22018>;
  <D.22017>:
  D.21999 = cfg->vreg_to_inst;
  D.21994 = ins->dreg;
  D.22000 = (unsigned int) D.21994;
  D.22001 = D.22000 * 4;
  D.22002 = D.21999 + D.22001;
  iftmp.4 = *D.22002;
  goto <D.22019>;
  <D.22018>:
  iftmp.4 = 0B;
  <D.22019>:
  D.22020 = iftmp.4->data.op[0].const_val;
  D.22021 = (unsigned int) D.22020;
  D.22022 = D.22021 * 56;
  D.22023 = vinfo + D.22022;
  D.22024 = D.22023->def_in;
  D.22025 = D.22024->data[D.22015];
  D.22026 = i & 31;
  D.22027 = 1 << D.22026;
  D.22028 = D.22025 | D.22027;
  D.22014->data[D.22015] = D.22028;
  <D.22005>:
  <D.21998>:
  <D.21993>:
  <D.21599>:
  ins = ins->next;
  <D.21601>:
  if (ins != 0B) goto <D.21600>; else goto <D.21602>;
  <D.21602>:
  i = i + 1;
  <D.21604>:
  i.2 = (unsigned int) i;
  D.21965 = cfg->num_bblocks;
  if (i.2 < D.21965) goto <D.21603>; else goto <D.21605>;
  <D.21605>:
  i = 0;
  goto <D.21625>;
  <D.21624>:
  {
    struct MonoInst * var;

    D.21975 = cfg->varinfo;
    i.0 = (unsigned int) i;
    D.21976 = i.0 * 4;
    D.21977 = D.21975 + D.21976;
    var = *D.21977;
    D.22029 = var->type;
    if (D.22029 == 2) goto <D.22030>; else goto <D.22031>;
    <D.22030>:
    // predicted unlikely by continue predictor.
    goto <D.21607>;
    <D.22031>:
    D.22032 = var->flags;
    D.22033 = (int) D.22032;
    D.22034 = D.22033 & 20;
    if (D.22034 != 0) goto <D.22035>; else goto <D.22036>;
    <D.22035>:
    // predicted unlikely by continue predictor.
    goto <D.21607>;
    <D.22036>:
    i.0 = (unsigned int) i;
    D.21970 = i.0 * 56;
    D.21971 = vinfo + D.21970;
    D.21982 = D.21971->def_in;
    D.22037 = mono_bitset_count (D.21982);
    if (D.22037 <= 1) goto <D.22038>; else goto <D.22039>;
    <D.22038>:
    // predicted unlikely by continue predictor.
    goto <D.21607>;
    <D.22039>:
    i.0 = (unsigned int) i;
    D.21970 = i.0 * 56;
    D.21971 = vinfo + D.21970;
    D.21982 = D.21971->def_in;
    set = mono_compile_iterated_dfrontier (cfg, D.21982);
    D.21958 = cfg->verbose_level;
    if (D.21958 > 3) goto <D.22040>; else goto <D.22041>;
    <D.22040>:
    D.22042 = mono_bitset_count (set);
    if (D.22042 != 0) goto <D.22043>; else goto <D.22044>;
    <D.22043>:
    D.22045 = var->dreg;
    printf ("\tR%d needs PHI functions in ", D.22045);
    mono_blockset_print (cfg, set, "", 4294967295);
    <D.22044>:
    <D.22041>:
    idx = mono_bitset_find_start (set);
    goto <D.21622>;
    <D.21621>:
    {
      struct MonoBasicBlock * bb;

      D.21985 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22047 = idx.5 * 4;
      D.22048 = D.21985 + D.22047;
      bb = *D.22048;
      D.22049 = cfg->bb_exit;
      if (D.22049 == bb) goto <D.22050>; else goto <D.22051>;
      <D.22050>:
      // predicted unlikely by continue predictor.
      goto <D.21609>;
      <D.22051>:
      D.21944 = cfg->comp_done;
      D.21962 = D.21944 & 16;
      if (D.21962 != 0) goto <D.22052>; else goto <D.22053>;
      <D.22052>:
      D.22054 = bb->live_in_set;
      i.0 = (unsigned int) i;
      D.22055 = i.0 / 32;
      D.22056 = D.22054->data[D.22055];
      D.22026 = i & 31;
      D.22027 = 1 << D.22026;
      D.22057 = D.22056 & D.22027;
      if (D.22057 == 0) goto <D.22058>; else goto <D.22059>;
      <D.22058>:
      // predicted unlikely by continue predictor.
      goto <D.21609>;
      <D.22059>:
      <D.22053>:
      D.22060 = cfg->mempool;
      ins = mono_mempool_alloc0 (D.22060, 56);
      ins->opcode = 319;
      ins->data.op[0].const_val = i;
      ins->sreg2 = -1;
      D.22061 = ins->sreg2;
      ins->sreg1 = D.22061;
      D.22062 = ins->sreg1;
      ins->dreg = D.22062;
      D.22029 = var->type;
      D.22063 = (int) D.22029;
      switch (D.22063) <default: <D.22064>, case 1: <D.21610>, case 2: <D.21611>, case 3: <D.21612>, case 4: <D.21616>, case 5: <D.21613>, case 6: <D.21614>, case 7: <D.21617>>
      <D.21610>:
      <D.21611>:
      <D.21612>:
      <D.21613>:
      <D.21614>:
      ins->opcode = 319;
      goto <D.21615>;
      <D.21616>:
      ins->opcode = 320;
      goto <D.21615>;
      <D.21617>:
      ins->opcode = 321;
      goto <D.21615>;
      <D.22064>:
      <D.21615>:
      D.22065 = var->data.op[1].vtype;
      D.22066 = BIT_FIELD_REF <*D.22065, 32, 32>;
      D.22067 = D.22066 & 1073741824;
      if (D.22067 != 0) goto <D.22068>; else goto <D.22069>;
      <D.22068>:
      D.22070 = mono_defaults.int_class;
      ins->klass = D.22070;
      goto <D.22071>;
      <D.22069>:
      D.22072 = var->klass;
      ins->klass = D.22072;
      <D.22071>:
      D.22060 = cfg->mempool;
      D.21985 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22047 = idx.5 * 4;
      D.22048 = D.21985 + D.22047;
      D.22073 = *D.22048;
      D.22074 = D.22073->in_count;
      D.22075 = (int) D.22074;
      D.22076 = D.22075 + 1;
      D.22077 = (unsigned int) D.22076;
      D.22078 = D.22077 * 4;
      D.22079 = mono_mempool_alloc0 (D.22060, D.22078);
      ins->data.op[1].phi_args = D.22079;
      D.22080 = ins->data.op[1].phi_args;
      D.21985 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22047 = idx.5 * 4;
      D.22048 = D.21985 + D.22047;
      D.22073 = *D.22048;
      D.22074 = D.22073->in_count;
      D.22075 = (int) D.22074;
      *D.22080 = D.22075;
      j = 0;
      goto <D.21619>;
      <D.21618>:
      D.22080 = ins->data.op[1].phi_args;
      j.6 = (sizetype) j;
      D.22082 = j.6 + 1;
      D.22083 = D.22082 * 4;
      D.22084 = D.22080 + D.22083;
      *D.22084 = -1;
      j = j + 1;
      <D.21619>:
      D.21985 = cfg->bblocks;
      idx.5 = (unsigned int) idx;
      D.22047 = idx.5 * 4;
      D.22048 = D.21985 + D.22047;
      D.22073 = *D.22048;
      D.22074 = D.22073->in_count;
      D.22075 = (int) D.22074;
      if (D.22075 > j) goto <D.21618>; else goto <D.21620>;
      <D.21620>:
      D.21975 = cfg->varinfo;
      i.0 = (unsigned int) i;
      D.21976 = i.0 * 4;
      D.21977 = D.21975 + D.21976;
      D.21978 = *D.21977;
      D.22085 = D.21978->dreg;
      ins->dreg = D.22085;
      D.22086 = bb->code;
      mono_bblock_insert_before_ins (bb, D.22086, ins);
    }
    <D.21609>:
    idx = mono_bitset_find_first (set, idx);
    <D.21622>:
    idx.7 = (unsigned int) idx;
    D.21965 = cfg->num_bblocks;
    if (idx.7 < D.21965) goto <D.22088>; else goto <D.21623>;
    <D.22088>:
    if (idx >= 0) goto <D.21621>; else goto <D.21623>;
    <D.21623>:
  }
  <D.21607>:
  i = i + 1;
  <D.21625>:
  i.2 = (unsigned int) i;
  D.21942 = cfg->num_varinfo;
  if (i.2 < D.21942) goto <D.21624>; else goto <D.21626>;
  <D.21626>:
  monoeg_g_free (vinfo);
  monoeg_g_free (buf_start);
  D.21942 = cfg->num_varinfo;
  D.22089 = D.21942 * 4;
  stack = __builtin_alloca (D.22089);
  D.21942 = cfg->num_varinfo;
  D.22089 = D.21942 * 4;
  memset (stack, 0, D.22089);
  D.21961 = cfg->next_vreg;
  D.22090 = D.21961 * 4;
  lvreg_stack = monoeg_malloc0 (D.22090);
  D.21961 = cfg->next_vreg;
  D.22090 = D.21961 * 4;
  lvreg_defined = monoeg_malloc0 (D.22090);
  stack_history_size = 10240;
  stack_history_size.8 = (unsigned int) stack_history_size;
  D.22092 = stack_history_size.8 * 8;
  stack_history = monoeg_malloc (D.22092);
  D.21942 = cfg->num_varinfo;
  D.22089 = D.21942 * 4;
  originals = monoeg_malloc0 (D.22089);
  D.21942 = cfg->num_varinfo;
  D.22093 = (int) D.21942;
  D.22094 = cfg->bb_entry;
  mono_ssa_rename_vars (cfg, D.22093, D.22094, 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.21958 = cfg->verbose_level;
  if (D.21958 > 3) goto <D.22095>; else goto <D.22096>;
  <D.22095>:
  printf ("\nEND COMPUTE SSA.\n\n");
  <D.22096>:
  D.21944 = cfg->comp_done;
  D.22097 = D.21944 | 32;
  cfg->comp_done = D.22097;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22100;
  int D.22105;
  void * D.22107;
  unsigned int D.22108;

  D.22100 = __builtin_constant_p (__len);
  if (D.22100 != 0) goto <D.22101>; else goto <D.22102>;
  <D.22101>:
  if (__len == 0) goto <D.22103>; else goto <D.22104>;
  <D.22103>:
  D.22105 = __builtin_constant_p (__ch);
  if (D.22105 == 0) goto <D.22098>; else goto <D.22106>;
  <D.22106>:
  if (__ch != 0) goto <D.22098>; else goto <D.22099>;
  <D.22098>:
  __warn_memset_zero_len ();
  D.22107 = __dest;
  return D.22107;
  <D.22099>:
  <D.22104>:
  <D.22102>:
  D.22108 = __builtin_object_size (__dest, 0);
  D.22107 = __builtin___memset_chk (__dest, __ch, __len, D.22108);
  return D.22107;
}


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.22110;
  int D.22113;
  short unsigned int D.22114;
  int D.22115;
  int D.22116;
  int D.22117;
  int D.22120;
  int D.22121;
  int D.22122;
  signed char D.22123;
  int D.22124;
  sizetype D.22125;
  const char * D.22126;
  char D.22127;
  struct MonoInst * iftmp.9;
  int D.22131;
  unsigned int D.22132;
  unsigned int D.22133;
  struct MonoInst * * D.22136;
  unsigned int D.22137;
  unsigned int D.22138;
  struct MonoInst * * D.22139;
  unsigned char D.22144;
  int D.22145;
  int D.22146;
  unsigned int idx.10;
  unsigned int D.22149;
  struct MonoInst * * D.22150;
  struct MonoInst * D.22151;
  short unsigned int D.22154;
  _Bool D.22157;
  long int D.22158;
  long int D.22159;
  int D.22162;
  int iftmp.11;
  guint32 * D.22168;
  unsigned int D.22169;
  _Bool D.22171;
  long int D.22172;
  long int D.22173;
  int D.22176;
  short unsigned int D.22177;
  struct MonoInst * iftmp.12;
  int D.22181;
  unsigned int D.22182;
  unsigned int D.22185;
  unsigned int D.22186;
  struct MonoInst * * D.22187;
  unsigned char D.22192;
  int D.22193;
  int D.22194;
  unsigned int idx.13;
  unsigned int D.22197;
  struct MonoInst * * D.22198;
  struct MonoInst * D.22199;
  short unsigned int D.22202;
  _Bool D.22205;
  long int D.22206;
  long int D.22207;
  int D.22210;
  int iftmp.14;
  guint32 * D.22216;
  unsigned int D.22217;
  _Bool D.22219;
  long int D.22220;
  long int D.22221;
  int D.22224;
  char D.22225;
  struct MonoInst * iftmp.15;
  unsigned char D.22237;
  int D.22238;
  int D.22239;
  _Bool D.22241;
  long int D.22242;
  long int D.22243;
  short unsigned int D.22246;
  unsigned int idx.16;
  unsigned int D.22250;
  gboolean * D.22251;
  _Bool D.22252;
  long int D.22253;
  long int D.22254;
  unsigned int stack_history_len.17;
  unsigned int D.22258;
  struct RenameInfo * D.22259;
  struct MonoInst * * D.22260;
  struct MonoInst * D.22261;
  int D.22262;
  struct MonoType * D.22265;
  struct MonoMethodVar * D.22266;
  int D.22267;
  unsigned int D.22268;
  unsigned int D.22269;
  struct MonoMethodVar * D.22270;
  int D.22273;
  int D.22274;
  int D.22276;
  unsigned int D.22277;
  unsigned int D.22278;
  int iftmp.18;
  gboolean * D.22283;
  int D.22284;
  _Bool D.22287;
  long int D.22288;
  long int D.22289;
  guint32 iftmp.19;
  unsigned int D.22295;
  gboolean * D.22297;
  gboolean * D.22298;
  int D.22299;
  struct MonoBasicBlock * * D.22302;
  unsigned int i.20;
  unsigned int D.22304;
  struct MonoBasicBlock * * D.22305;
  struct MonoBasicBlock * * D.22306;
  unsigned int j.21;
  unsigned int D.22308;
  struct MonoBasicBlock * * D.22309;
  struct MonoBasicBlock * D.22310;
  short int D.22312;
  int D.22313;
  short unsigned int D.22314;
  struct MonoInst * * D.22319;
  struct MonoInst * * D.22320;
  int * D.22321;
  sizetype j.22;
  sizetype D.22323;
  sizetype D.22324;
  int * D.22325;
  _Bool D.22326;
  long int D.22327;
  long int D.22328;
  int D.22331;
  short int D.22332;
  int D.22333;
  struct GSList * D.22334;
  void * D.22337;
  int D.22338;
  unsigned int D.22339;
  struct RenameInfo * D.22340;
  int D.22341;
  unsigned int D.22342;
  unsigned int D.22343;
  struct MonoInst * * D.22344;
  struct MonoInst * D.22345;
  unsigned int D.22346;
  unsigned int D.22347;
  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.22110 = cfg->verbose_level;
  if (D.22110 > 3) goto <D.22111>; else goto <D.22112>;
  <D.22111>:
  D.22113 = bb->block_num;
  printf ("\nRENAME VARS BLOCK %d:\n", D.22113);
  <D.22112>:
  ins = bb->code;
  goto <D.21560>;
  <D.21559>:
  {
    const char * spec;
    int num_sregs;
    int sregs[3];

    try
      {
        D.22114 = ins->opcode;
        D.22115 = (int) D.22114;
        D.22116 = D.22115 + -313;
        D.22117 = D.22116 * 4;
        spec = &ins_info[D.22117];
        D.22114 = ins->opcode;
        if (D.22114 == 316) goto <D.22118>; else goto <D.22119>;
        <D.22118>:
        // predicted unlikely by continue predictor.
        goto <D.21549>;
        <D.22119>:
        D.22120 = ins->sreg1;
        sregs[0] = D.22120;
        D.22121 = ins->sreg2;
        sregs[1] = D.22121;
        D.22122 = ins->sreg3;
        sregs[2] = D.22122;
        D.22114 = ins->opcode;
        D.22115 = (int) D.22114;
        D.22116 = D.22115 + -313;
        D.22123 = ins_sreg_counts[D.22116];
        num_sregs = (int) D.22123;
        i = 0;
        goto <D.21553>;
        <D.21552>:
        D.22124 = i + 1;
        D.22125 = (sizetype) D.22124;
        D.22126 = spec + D.22125;
        D.22127 = *D.22126;
        if (D.22127 != 32) goto <D.22128>; else goto <D.22129>;
        <D.22128>:
        {
          struct MonoInst * var;

          D.22131 = sregs[i];
          D.22132 = (unsigned int) D.22131;
          D.22133 = cfg->vreg_to_inst_len;
          if (D.22132 < D.22133) goto <D.22134>; else goto <D.22135>;
          <D.22134>:
          D.22136 = cfg->vreg_to_inst;
          D.22131 = sregs[i];
          D.22137 = (unsigned int) D.22131;
          D.22138 = D.22137 * 4;
          D.22139 = D.22136 + D.22138;
          iftmp.9 = *D.22139;
          goto <D.22140>;
          <D.22135>:
          iftmp.9 = 0B;
          <D.22140>:
          var = iftmp.9;
          if (var != 0B) goto <D.22143>; else goto <D.22141>;
          <D.22143>:
          D.22144 = var->flags;
          D.22145 = (int) D.22144;
          D.22146 = D.22145 & 20;
          if (D.22146 == 0) goto <D.22147>; else goto <D.22141>;
          <D.22147>:
          {
            int idx;

            idx = var->data.op[0].const_val;
            idx.10 = (unsigned int) idx;
            D.22149 = idx.10 * 4;
            D.22150 = stack + D.22149;
            D.22151 = *D.22150;
            if (D.22151 != 0B) goto <D.22152>; else goto <D.22153>;
            <D.22152>:
            D.22154 = var->opcode;
            if (D.22154 != 330) goto <D.22155>; else goto <D.22156>;
            <D.22155>:
            idx.10 = (unsigned int) idx;
            D.22149 = idx.10 * 4;
            D.22150 = stack + D.22149;
            D.22151 = *D.22150;
            D.22157 = D.22151 == 0B;
            D.22158 = (long int) D.22157;
            D.22159 = __builtin_expect (D.22158, 0);
            if (D.22159 != 0) goto <D.22160>; else goto <D.22161>;
            <D.22160>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 200, "stack [idx]");
            <D.22161>:
            <D.22156>:
            idx.10 = (unsigned int) idx;
            D.22149 = idx.10 * 4;
            D.22150 = stack + D.22149;
            D.22151 = *D.22150;
            D.22162 = D.22151->dreg;
            sregs[i] = D.22162;
            idx.10 = (unsigned int) idx;
            D.22149 = idx.10 * 4;
            D.22150 = stack + D.22149;
            D.22151 = *D.22150;
            record_use (cfg, D.22151, bb, ins);
            goto <D.22163>;
            <D.22153>:
            record_use (cfg, var, bb, ins);
            <D.22163>:
          }
          goto <D.22142>;
          <D.22141>:
          if (var == 0B) goto <D.22167>; else goto <D.22165>;
          <D.22167>:
          D.22131 = sregs[i];
          D.22137 = (unsigned int) D.22131;
          D.22138 = D.22137 * 4;
          D.22168 = lvreg_stack + D.22138;
          D.22169 = *D.22168;
          if (D.22169 != 0) goto <D.22170>; else goto <D.22165>;
          <D.22170>:
          iftmp.11 = 1;
          goto <D.22166>;
          <D.22165>:
          iftmp.11 = 0;
          <D.22166>:
          D.22171 = iftmp.11 != 0;
          D.22172 = (long int) D.22171;
          D.22173 = __builtin_expect (D.22172, 0);
          if (D.22173 != 0) goto <D.22174>; else goto <D.22175>;
          <D.22174>:
          D.22131 = sregs[i];
          D.22137 = (unsigned int) D.22131;
          D.22138 = D.22137 * 4;
          D.22168 = lvreg_stack + D.22138;
          D.22169 = *D.22168;
          D.22176 = (int) D.22169;
          sregs[i] = D.22176;
          <D.22175>:
          <D.22142>:
        }
        <D.22129>:
        i = i + 1;
        <D.21553>:
        if (i < num_sregs) goto <D.21552>; else goto <D.21554>;
        <D.21554>:
        mono_inst_set_src_registers (ins, &sregs);
        D.22114 = ins->opcode;
        D.22177 = D.22114 + 65162;
        if (D.22177 <= 13) goto <D.22178>; else goto <D.22179>;
        <D.22178>:
        {
          struct MonoInst * var;

          D.22181 = ins->dreg;
          D.22182 = (unsigned int) D.22181;
          D.22133 = cfg->vreg_to_inst_len;
          if (D.22182 < D.22133) goto <D.22183>; else goto <D.22184>;
          <D.22183>:
          D.22136 = cfg->vreg_to_inst;
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22187 = D.22136 + D.22186;
          iftmp.12 = *D.22187;
          goto <D.22188>;
          <D.22184>:
          iftmp.12 = 0B;
          <D.22188>:
          var = iftmp.12;
          if (var != 0B) goto <D.22191>; else goto <D.22189>;
          <D.22191>:
          D.22192 = var->flags;
          D.22193 = (int) D.22192;
          D.22194 = D.22193 & 20;
          if (D.22194 == 0) goto <D.22195>; else goto <D.22189>;
          <D.22195>:
          {
            int idx;

            idx = var->data.op[0].const_val;
            idx.13 = (unsigned int) idx;
            D.22197 = idx.13 * 4;
            D.22198 = stack + D.22197;
            D.22199 = *D.22198;
            if (D.22199 != 0B) goto <D.22200>; else goto <D.22201>;
            <D.22200>:
            D.22202 = var->opcode;
            if (D.22202 != 330) goto <D.22203>; else goto <D.22204>;
            <D.22203>:
            idx.13 = (unsigned int) idx;
            D.22197 = idx.13 * 4;
            D.22198 = stack + D.22197;
            D.22199 = *D.22198;
            D.22205 = D.22199 == 0B;
            D.22206 = (long int) D.22205;
            D.22207 = __builtin_expect (D.22206, 0);
            if (D.22207 != 0) goto <D.22208>; else goto <D.22209>;
            <D.22208>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 219, "stack [idx]");
            <D.22209>:
            <D.22204>:
            idx.13 = (unsigned int) idx;
            D.22197 = idx.13 * 4;
            D.22198 = stack + D.22197;
            D.22199 = *D.22198;
            D.22210 = D.22199->dreg;
            ins->dreg = D.22210;
            idx.13 = (unsigned int) idx;
            D.22197 = idx.13 * 4;
            D.22198 = stack + D.22197;
            D.22199 = *D.22198;
            record_use (cfg, D.22199, bb, ins);
            goto <D.22211>;
            <D.22201>:
            record_use (cfg, var, bb, ins);
            <D.22211>:
          }
          goto <D.22190>;
          <D.22189>:
          if (var == 0B) goto <D.22215>; else goto <D.22213>;
          <D.22215>:
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22216 = lvreg_stack + D.22186;
          D.22217 = *D.22216;
          if (D.22217 != 0) goto <D.22218>; else goto <D.22213>;
          <D.22218>:
          iftmp.14 = 1;
          goto <D.22214>;
          <D.22213>:
          iftmp.14 = 0;
          <D.22214>:
          D.22219 = iftmp.14 != 0;
          D.22220 = (long int) D.22219;
          D.22221 = __builtin_expect (D.22220, 0);
          if (D.22221 != 0) goto <D.22222>; else goto <D.22223>;
          <D.22222>:
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22216 = lvreg_stack + D.22186;
          D.22217 = *D.22216;
          D.22224 = (int) D.22217;
          ins->dreg = D.22224;
          <D.22223>:
          <D.22190>:
        }
        <D.22179>:
        D.22225 = *spec;
        if (D.22225 != 32) goto <D.22226>; else goto <D.22227>;
        <D.22226>:
        D.22114 = ins->opcode;
        D.22177 = D.22114 + 65162;
        if (D.22177 > 13) goto <D.22228>; else goto <D.22229>;
        <D.22228>:
        {
          struct MonoInst * var;
          struct MonoMethodVar * info;

          D.22181 = ins->dreg;
          D.22182 = (unsigned int) D.22181;
          D.22133 = cfg->vreg_to_inst_len;
          if (D.22182 < D.22133) goto <D.22231>; else goto <D.22232>;
          <D.22231>:
          D.22136 = cfg->vreg_to_inst;
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22187 = D.22136 + D.22186;
          iftmp.15 = *D.22187;
          goto <D.22233>;
          <D.22232>:
          iftmp.15 = 0B;
          <D.22233>:
          var = iftmp.15;
          if (var != 0B) goto <D.22236>; else goto <D.22234>;
          <D.22236>:
          D.22237 = var->flags;
          D.22238 = (int) D.22237;
          D.22239 = D.22238 & 20;
          if (D.22239 == 0) goto <D.22240>; else goto <D.22234>;
          <D.22240>:
          idx = var->data.op[0].const_val;
          D.22241 = idx >= max_vars;
          D.22242 = (long int) D.22241;
          D.22243 = __builtin_expect (D.22242, 0);
          if (D.22243 != 0) goto <D.22244>; else goto <D.22245>;
          <D.22244>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 237, "idx < max_vars");
          <D.22245>:
          D.22246 = var->opcode;
          if (D.22246 == 330) goto <D.22247>; else goto <D.22248>;
          <D.22247>:
          idx.16 = (unsigned int) idx;
          D.22250 = idx.16 * 4;
          D.22251 = originals_used + D.22250;
          *D.22251 = 1;
          <D.22248>:
          D.22252 = stack_history_len >= stack_history_size;
          D.22253 = (long int) D.22252;
          D.22254 = __builtin_expect (D.22253, 0);
          if (D.22254 != 0) goto <D.22255>; else goto <D.22256>;
          <D.22255>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 243, "stack_history_len < stack_history_size");
          <D.22256>:
          stack_history_len.17 = (unsigned int) stack_history_len;
          D.22258 = stack_history_len.17 * 8;
          D.22259 = stack_history + D.22258;
          idx.16 = (unsigned int) idx;
          D.22250 = idx.16 * 4;
          D.22260 = stack + D.22250;
          D.22261 = *D.22260;
          D.22259->var = D.22261;
          stack_history_len.17 = (unsigned int) stack_history_len;
          D.22258 = stack_history_len.17 * 8;
          D.22259 = stack_history + D.22258;
          D.22259->idx = idx;
          stack_history_len = stack_history_len + 1;
          idx.16 = (unsigned int) idx;
          D.22250 = idx.16 * 4;
          D.22251 = originals_used + D.22250;
          D.22262 = *D.22251;
          if (D.22262 != 0) goto <D.22263>; else goto <D.22264>;
          <D.22263>:
          D.22265 = var->data.op[1].vtype;
          new_var = mono_compile_create_var (cfg, D.22265, 329);
          D.22237 = var->flags;
          new_var->flags = D.22237;
          D.22266 = cfg->vars;
          D.22267 = new_var->data.op[0].const_val;
          D.22268 = (unsigned int) D.22267;
          D.22269 = D.22268 * 56;
          D.22270 = D.22266 + D.22269;
          D.22270->reg = idx;
          D.22110 = cfg->verbose_level;
          if (D.22110 > 3) goto <D.22271>; else goto <D.22272>;
          <D.22271>:
          D.22273 = var->dreg;
          D.22274 = new_var->dreg;
          printf ("  R%d -> R%d\n", D.22273, D.22274);
          <D.22272>:
          idx.16 = (unsigned int) idx;
          D.22250 = idx.16 * 4;
          D.22260 = stack + D.22250;
          *D.22260 = new_var;
          D.22274 = new_var->dreg;
          ins->dreg = D.22274;
          var = new_var;
          goto <D.22275>;
          <D.22264>:
          idx.16 = (unsigned int) idx;
          D.22250 = idx.16 * 4;
          D.22260 = stack + D.22250;
          *D.22260 = var;
          idx.16 = (unsigned int) idx;
          D.22250 = idx.16 * 4;
          D.22251 = originals_used + D.22250;
          *D.22251 = 1;
          <D.22275>:
          D.22266 = cfg->vars;
          D.22276 = var->data.op[0].const_val;
          D.22277 = (unsigned int) D.22276;
          D.22278 = D.22277 * 56;
          info = D.22266 + D.22278;
          info->def = ins;
          info->def_bb = bb;
          goto <D.22235>;
          <D.22234>:
          if (var == 0B) goto <D.22282>; else goto <D.22280>;
          <D.22282>:
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22283 = lvreg_defined + D.22186;
          D.22284 = *D.22283;
          if (D.22284 != 0) goto <D.22285>; else goto <D.22280>;
          <D.22285>:
          D.22181 = ins->dreg;
          if (D.22181 > 31) goto <D.22286>; else goto <D.22280>;
          <D.22286>:
          iftmp.18 = 1;
          goto <D.22281>;
          <D.22280>:
          iftmp.18 = 0;
          <D.22281>:
          D.22287 = iftmp.18 != 0;
          D.22288 = (long int) D.22287;
          D.22289 = __builtin_expect (D.22288, 0);
          if (D.22289 != 0) goto <D.22290>; else goto <D.22291>;
          <D.22290>:
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22216 = lvreg_stack + D.22186;
          D.22181 = ins->dreg;
          D.22182 = (unsigned int) D.22181;
          D.22295 = cfg->vreg_is_ref_len;
          if (D.22182 < D.22295) goto <D.22296>; else goto <D.22293>;
          <D.22296>:
          D.22297 = cfg->vreg_is_ref;
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22298 = D.22297 + D.22186;
          D.22299 = *D.22298;
          if (D.22299 != 0) goto <D.22300>; else goto <D.22293>;
          <D.22300>:
          iftmp.19 = mono_alloc_ireg_ref (cfg);
          goto <D.22294>;
          <D.22293>:
          iftmp.19 = mono_alloc_preg (cfg);
          <D.22294>:
          *D.22216 = iftmp.19;
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22216 = lvreg_stack + D.22186;
          D.22217 = *D.22216;
          D.22224 = (int) D.22217;
          ins->dreg = D.22224;
          goto <D.22301>;
          <D.22291>:
          D.22181 = ins->dreg;
          D.22185 = (unsigned int) D.22181;
          D.22186 = D.22185 * 4;
          D.22283 = lvreg_defined + D.22186;
          *D.22283 = 1;
          <D.22301>:
          <D.22235>:
        }
        <D.22229>:
        <D.22227>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21549>:
  ins = ins->next;
  <D.21560>:
  if (ins != 0B) goto <D.21559>; else goto <D.21561>;
  <D.21561>:
  i = 0;
  goto <D.21570>;
  <D.21569>:
  {
    struct MonoBasicBlock * n;

    D.22302 = bb->out_bb;
    i.20 = (unsigned int) i;
    D.22304 = i.20 * 4;
    D.22305 = D.22302 + D.22304;
    n = *D.22305;
    j = 0;
    goto <D.21565>;
    <D.21564>:
    D.22306 = n->in_bb;
    j.21 = (unsigned int) j;
    D.22308 = j.21 * 4;
    D.22309 = D.22306 + D.22308;
    D.22310 = *D.22309;
    if (D.22310 == bb) goto <D.21563>; else goto <D.22311>;
    <D.22311>:
    j = j + 1;
    <D.21565>:
    D.22312 = n->in_count;
    D.22313 = (int) D.22312;
    if (D.22313 > j) goto <D.21564>; else goto <D.21563>;
    <D.21563>:
    ins = n->code;
    goto <D.21568>;
    <D.21567>:
    D.22114 = ins->opcode;
    D.22314 = D.22114 + 65217;
    if (D.22314 <= 2) goto <D.22315>; else goto <D.21566>;
    <D.22315>:
    idx = ins->data.op[0].const_val;
    idx.16 = (unsigned int) idx;
    D.22250 = idx.16 * 4;
    D.22260 = stack + D.22250;
    D.22261 = *D.22260;
    if (D.22261 != 0B) goto <D.22316>; else goto <D.22317>;
    <D.22316>:
    idx.16 = (unsigned int) idx;
    D.22250 = idx.16 * 4;
    D.22260 = stack + D.22250;
    new_var = *D.22260;
    goto <D.22318>;
    <D.22317>:
    D.22319 = cfg->varinfo;
    idx.16 = (unsigned int) idx;
    D.22250 = idx.16 * 4;
    D.22320 = D.22319 + D.22250;
    new_var = *D.22320;
    <D.22318>:
    D.22321 = ins->data.op[1].phi_args;
    j.22 = (sizetype) j;
    D.22323 = j.22 + 1;
    D.22324 = D.22323 * 4;
    D.22325 = D.22321 + D.22324;
    D.22274 = new_var->dreg;
    *D.22325 = D.22274;
    record_use (cfg, new_var, n, ins);
    D.22110 = cfg->verbose_level;
    D.22326 = D.22110 > 3;
    D.22327 = (long int) D.22326;
    D.22328 = __builtin_expect (D.22327, 0);
    if (D.22328 != 0) goto <D.22329>; else goto <D.22330>;
    <D.22329>:
    D.22181 = ins->dreg;
    D.22274 = new_var->dreg;
    D.22331 = n->block_num;
    printf ("\tAdd PHI R%d <- R%d to BB%d\n", D.22181, D.22274, D.22331);
    <D.22330>:
    ins = ins->next;
    <D.21568>:
    if (ins != 0B) goto <D.21567>; else goto <D.21566>;
    <D.21566>:
  }
  i = i + 1;
  <D.21570>:
  D.22332 = bb->out_count;
  D.22333 = (int) D.22332;
  if (D.22333 > i) goto <D.21569>; else goto <D.21571>;
  <D.21571>:
  D.22334 = bb->dominated;
  if (D.22334 != 0B) goto <D.22335>; else goto <D.22336>;
  <D.22335>:
  tmp = bb->dominated;
  goto <D.21573>;
  <D.21572>:
  D.22337 = tmp->data;
  stack_history_len.17 = (unsigned int) stack_history_len;
  D.22258 = stack_history_len.17 * 8;
  D.22259 = stack_history + D.22258;
  D.22338 = stack_history_size - stack_history_len;
  mono_ssa_rename_vars (cfg, max_vars, D.22337, originals_used, stack, lvreg_stack, lvreg_defined, D.22259, D.22338);
  tmp = tmp->next;
  <D.21573>:
  if (tmp != 0B) goto <D.21572>; else goto <D.21574>;
  <D.21574>:
  <D.22336>:
  i = stack_history_len + -1;
  goto <D.21576>;
  <D.21575>:
  i.20 = (unsigned int) i;
  D.22339 = i.20 * 8;
  D.22340 = stack_history + D.22339;
  D.22341 = D.22340->idx;
  D.22342 = (unsigned int) D.22341;
  D.22343 = D.22342 * 4;
  D.22344 = stack + D.22343;
  i.20 = (unsigned int) i;
  D.22339 = i.20 * 8;
  D.22340 = stack_history + D.22339;
  D.22345 = D.22340->var;
  *D.22344 = D.22345;
  i = i + -1;
  <D.21576>:
  if (i >= 0) goto <D.21575>; else goto <D.21577>;
  <D.21577>:
  D.22346 = cfg->comp_done;
  D.22347 = D.22346 | 64;
  cfg->comp_done = D.22347;
}


record_use (struct MonoCompile * cfg, struct MonoInst * var, struct MonoBasicBlock * bb, struct MonoInst * ins)
{
  struct MonoMemPool * D.22350;
  struct MonoMethodVar * D.22351;
  int D.22352;
  unsigned int D.22353;
  unsigned int D.22354;
  struct GList * D.22355;
  struct GList * D.22356;
  struct MonoMethodVar * info;
  struct MonoVarUsageInfo * ui;

  D.22350 = cfg->mempool;
  ui = mono_mempool_alloc (D.22350, 8);
  D.22351 = cfg->vars;
  D.22352 = var->data.op[0].const_val;
  D.22353 = (unsigned int) D.22352;
  D.22354 = D.22353 * 56;
  info = D.22351 + D.22354;
  ui->bb = bb;
  ui->inst = ins;
  D.22350 = cfg->mempool;
  D.22355 = info->uses;
  D.22356 = g_list_prepend_mempool (D.22350, D.22355, ui);
  info->uses = D.22356;
}


g_list_prepend_mempool (struct MonoMemPool * mp, struct GList * list, void * data)
{
  struct GList * iftmp.23;
  struct GList * D.22361;
  struct GList * D.22366;
  struct GList * new_list;

  new_list = mono_mempool_alloc (mp, 12);
  new_list->data = data;
  if (list != 0B) goto <D.22358>; else goto <D.22359>;
  <D.22358>:
  iftmp.23 = list->prev;
  goto <D.22360>;
  <D.22359>:
  iftmp.23 = 0B;
  <D.22360>:
  new_list->prev = iftmp.23;
  new_list->next = list;
  D.22361 = new_list->prev;
  if (D.22361 != 0B) goto <D.22362>; else goto <D.22363>;
  <D.22362>:
  D.22361 = new_list->prev;
  D.22361->next = new_list;
  <D.22363>:
  if (list != 0B) goto <D.22364>; else goto <D.22365>;
  <D.22364>:
  list->prev = new_list;
  <D.22365>:
  D.22366 = new_list;
  return D.22366;
}


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

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


mono_ssa_remove (struct MonoCompile * cfg)
{
  unsigned int D.22370;
  unsigned int D.22371;
  _Bool D.22372;
  long int D.22373;
  long int D.22374;
  struct MonoBasicBlock * * D.22377;
  unsigned int i.24;
  unsigned int D.22379;
  struct MonoBasicBlock * * D.22380;
  unsigned int D.22381;
  int D.22384;
  short unsigned int D.22385;
  short unsigned int D.22386;
  int * D.22389;
  int D.22390;
  short int D.22391;
  int D.22392;
  _Bool D.22393;
  long int D.22394;
  long int D.22395;
  struct MonoInst * iftmp.25;
  int D.22399;
  unsigned int D.22400;
  unsigned int D.22401;
  struct MonoInst * * D.22404;
  unsigned int D.22405;
  unsigned int D.22406;
  struct MonoInst * * D.22407;
  sizetype j.26;
  sizetype D.22410;
  sizetype D.22411;
  int * D.22412;
  int D.22413;
  int D.22419;
  int D.22420;
  short unsigned int D.22421;
  struct MonoClass * D.22424;
  _Bool D.22425;
  long int D.22426;
  long int D.22427;
  struct MonoBasicBlock * * D.22430;
  unsigned int j.27;
  unsigned int D.22432;
  struct MonoBasicBlock * * D.22433;
  int D.22436;
  int D.22437;
  struct MonoMemPool * D.22440;
  int D.22441;
  short unsigned int D.22442;
  int D.22443;
  int D.22444;
  const unsigned char * D.22445;
  short unsigned int D.22446;
  unsigned int i.28;
  unsigned int D.22452;
  unsigned int bbindex.29;
  unsigned int D.22456;
  struct MonoBasicBlock * * D.22457;
  int D.22458;
  int D.22459;
  char D.22462;
  struct MonoInst * iftmp.30;
  struct MonoMethodVar * D.22471;
  int D.22472;
  unsigned int D.22473;
  unsigned int D.22474;
  int D.22475;
  unsigned int D.22478;
  unsigned int D.22479;
  unsigned int D.22482;
  unsigned int D.22483;
  struct MonoMethodVar * D.22484;
  int D.22485;
  struct MonoInst * * D.22488;
  unsigned int D.22489;
  struct MonoInst * * D.22490;
  struct MonoInst * D.22491;
  int D.22492;
  int D.22493;
  int D.22494;
  int D.22495;
  signed char D.22496;
  struct MonoInst * iftmp.31;
  int D.22498;
  unsigned int D.22499;
  unsigned int D.22502;
  unsigned int D.22503;
  struct MonoInst * * D.22504;
  int D.22508;
  unsigned int D.22509;
  unsigned int D.22510;
  int D.22511;
  unsigned int D.22514;
  unsigned int D.22515;
  unsigned int D.22518;
  unsigned int D.22519;
  struct MonoMethodVar * D.22520;
  int D.22521;
  unsigned int D.22524;
  struct MonoInst * * D.22525;
  struct MonoInst * D.22526;
  int D.22527;
  unsigned int bbindex.32;
  unsigned int D.22529;
  struct MonoMethodVar * D.22530;
  unsigned int D.22531;
  unsigned int D.22532;
  unsigned int D.22535;
  unsigned int D.22536;
  struct MonoInst * ins;
  struct MonoInst * var;
  struct MonoInst * move;
  int bbindex;
  int i;
  int j;
  int first;

  D.22370 = cfg->comp_done;
  D.22371 = D.22370 & 32;
  D.22372 = D.22371 == 0;
  D.22373 = (long int) D.22372;
  D.22374 = __builtin_expect (D.22373, 0);
  if (D.22374 != 0) goto <D.22375>; else goto <D.22376>;
  <D.22375>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 489, "cfg->comp_done & MONO_COMP_SSA");
  <D.22376>:
  i = 0;
  goto <D.21650>;
  <D.21649>:
  {
    struct MonoBasicBlock * bb;

    D.22377 = cfg->bblocks;
    i.24 = (unsigned int) i;
    D.22379 = i.24 * 4;
    D.22380 = D.22377 + D.22379;
    bb = *D.22380;
    D.22381 = cfg->verbose_level;
    if (D.22381 > 3) goto <D.22382>; else goto <D.22383>;
    <D.22382>:
    D.22384 = bb->block_num;
    printf ("\nREMOVE SSA %d:\n", D.22384);
    <D.22383>:
    ins = bb->code;
    goto <D.21647>;
    <D.21646>:
    D.22385 = ins->opcode;
    D.22386 = D.22385 + 65217;
    if (D.22386 <= 2) goto <D.22387>; else goto <D.22388>;
    <D.22387>:
    D.22389 = ins->data.op[1].phi_args;
    D.22390 = *D.22389;
    D.22391 = bb->in_count;
    D.22392 = (int) D.22391;
    D.22393 = D.22390 != D.22392;
    D.22394 = (long int) D.22393;
    D.22395 = __builtin_expect (D.22394, 0);
    if (D.22395 != 0) goto <D.22396>; else goto <D.22397>;
    <D.22396>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 499, "ins->inst_phi_args [0] == bb->in_count");
    <D.22397>:
    D.22399 = ins->dreg;
    D.22400 = (unsigned int) D.22399;
    D.22401 = cfg->vreg_to_inst_len;
    if (D.22400 < D.22401) goto <D.22402>; else goto <D.22403>;
    <D.22402>:
    D.22404 = cfg->vreg_to_inst;
    D.22399 = ins->dreg;
    D.22405 = (unsigned int) D.22399;
    D.22406 = D.22405 * 4;
    D.22407 = D.22404 + D.22406;
    iftmp.25 = *D.22407;
    goto <D.22408>;
    <D.22403>:
    iftmp.25 = 0B;
    <D.22408>:
    var = iftmp.25;
    D.22389 = ins->data.op[1].phi_args;
    first = MEM[(int *)D.22389 + 4B];
    j = 1;
    goto <D.21640>;
    <D.21639>:
    D.22389 = ins->data.op[1].phi_args;
    j.26 = (sizetype) j;
    D.22410 = j.26 + 1;
    D.22411 = D.22410 * 4;
    D.22412 = D.22389 + D.22411;
    D.22413 = *D.22412;
    if (D.22413 != first) goto <D.21638>; else goto <D.22414>;
    <D.22414>:
    j = j + 1;
    <D.21640>:
    D.22391 = bb->in_count;
    D.22392 = (int) D.22391;
    if (D.22392 > j) goto <D.21639>; else goto <D.21638>;
    <D.21638>:
    D.22391 = bb->in_count;
    if (D.22391 > 1) goto <D.22417>; else goto <D.22415>;
    <D.22417>:
    D.22391 = bb->in_count;
    D.22392 = (int) D.22391;
    if (D.22392 == j) goto <D.22418>; else goto <D.22415>;
    <D.22418>:
    D.22385 = ins->opcode;
    D.22419 = (int) D.22385;
    D.22420 = op_phi_to_move (D.22419);
    D.22421 = (short unsigned int) D.22420;
    ins->opcode = D.22421;
    D.22385 = ins->opcode;
    if (D.22385 == 427) goto <D.22422>; else goto <D.22423>;
    <D.22422>:
    D.22424 = ins->klass;
    D.22425 = D.22424 == 0B;
    D.22426 = (long int) D.22425;
    D.22427 = __builtin_expect (D.22426, 0);
    if (D.22427 != 0) goto <D.22428>; else goto <D.22429>;
    <D.22428>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 512, "ins->klass");
    <D.22429>:
    <D.22423>:
    ins->sreg1 = first;
    goto <D.22416>;
    <D.22415>:
    j = 0;
    goto <D.21644>;
    <D.21643>:
    {
      struct MonoBasicBlock * pred;
      int sreg;

      D.22430 = bb->in_bb;
      j.27 = (unsigned int) j;
      D.22432 = j.27 * 4;
      D.22433 = D.22430 + D.22432;
      pred = *D.22433;
      D.22389 = ins->data.op[1].phi_args;
      j.26 = (sizetype) j;
      D.22410 = j.26 + 1;
      D.22411 = D.22410 * 4;
      D.22412 = D.22389 + D.22411;
      sreg = *D.22412;
      D.22381 = cfg->verbose_level;
      if (D.22381 > 3) goto <D.22434>; else goto <D.22435>;
      <D.22434>:
      D.22436 = var->dreg;
      D.22437 = pred->block_num;
      printf ("\tADD R%d <- R%d in BB%d\n", D.22436, sreg, D.22437);
      <D.22435>:
      D.22436 = var->dreg;
      if (D.22436 != sreg) goto <D.22438>; else goto <D.22439>;
      <D.22438>:
      D.22440 = cfg->mempool;
      move = mono_mempool_alloc0 (D.22440, 56);
      D.22385 = ins->opcode;
      D.22419 = (int) D.22385;
      D.22441 = op_phi_to_move (D.22419);
      D.22442 = (short unsigned int) D.22441;
      move->opcode = D.22442;
      move->dreg = -1;
      move->sreg3 = -1;
      D.22443 = move->sreg3;
      move->sreg2 = D.22443;
      D.22444 = move->sreg2;
      move->sreg1 = D.22444;
      D.22445 = cfg->ip;
      move->cil_code = D.22445;
      D.22446 = move->opcode;
      if (D.22446 == 427) goto <D.22447>; else goto <D.22448>;
      <D.22447>:
      D.22424 = ins->klass;
      D.22425 = D.22424 == 0B;
      D.22426 = (long int) D.22425;
      D.22427 = __builtin_expect (D.22426, 0);
      if (D.22427 != 0) goto <D.22449>; else goto <D.22450>;
      <D.22449>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 524, "ins->klass");
      <D.22450>:
      D.22424 = ins->klass;
      move->klass = D.22424;
      <D.22448>:
      D.22436 = var->dreg;
      move->dreg = D.22436;
      move->sreg1 = sreg;
      mono_add_ins_to_end (pred, move);
      <D.22439>:
    }
    j = j + 1;
    <D.21644>:
    D.22391 = bb->in_count;
    D.22392 = (int) D.22391;
    if (D.22392 > j) goto <D.21643>; else goto <D.21645>;
    <D.21645>:
    ins->opcode = 316;
    ins->dreg = -1;
    <D.22416>:
    <D.22388>:
    ins = ins->next;
    <D.21647>:
    if (ins != 0B) goto <D.21646>; else goto <D.21648>;
    <D.21648>:
  }
  i = i + 1;
  <D.21650>:
  i.28 = (unsigned int) i;
  D.22452 = cfg->num_bblocks;
  if (i.28 < D.22452) goto <D.21649>; else goto <D.21651>;
  <D.21651>:
  D.22381 = cfg->verbose_level;
  if (D.22381 > 3) goto <D.22453>; else goto <D.22454>;
  <D.22453>:
  i = 0;
  goto <D.21654>;
  <D.21653>:
  {
    struct MonoBasicBlock * bb;

    D.22377 = cfg->bblocks;
    i.24 = (unsigned int) i;
    D.22379 = i.24 * 4;
    D.22380 = D.22377 + D.22379;
    bb = *D.22380;
    mono_print_bb (bb, "AFTER REMOVE SSA:");
  }
  i = i + 1;
  <D.21654>:
  i.28 = (unsigned int) i;
  D.22452 = cfg->num_bblocks;
  if (i.28 < D.22452) goto <D.21653>; else goto <D.21655>;
  <D.21655>:
  <D.22454>:
  bbindex = 0;
  goto <D.21672>;
  <D.21671>:
  {
    struct MonoBasicBlock * bb;

    D.22377 = cfg->bblocks;
    bbindex.29 = (unsigned int) bbindex;
    D.22456 = bbindex.29 * 4;
    D.22457 = D.22377 + D.22456;
    bb = *D.22457;
    ins = bb->code;
    goto <D.21669>;
    <D.21668>:
    {
      const char * spec;
      int num_sregs;
      int sregs[3];

      try
        {
          D.22385 = ins->opcode;
          D.22419 = (int) D.22385;
          D.22458 = D.22419 + -313;
          D.22459 = D.22458 * 4;
          spec = &ins_info[D.22459];
          D.22385 = ins->opcode;
          if (D.22385 == 316) goto <D.22460>; else goto <D.22461>;
          <D.22460>:
          // predicted unlikely by continue predictor.
          goto <D.21660>;
          <D.22461>:
          D.22462 = *spec;
          if (D.22462 != 32) goto <D.22463>; else goto <D.22464>;
          <D.22463>:
          {
            struct MonoInst * var;

            D.22399 = ins->dreg;
            D.22400 = (unsigned int) D.22399;
            D.22401 = cfg->vreg_to_inst_len;
            if (D.22400 < D.22401) goto <D.22466>; else goto <D.22467>;
            <D.22466>:
            D.22404 = cfg->vreg_to_inst;
            D.22399 = ins->dreg;
            D.22405 = (unsigned int) D.22399;
            D.22406 = D.22405 * 4;
            D.22407 = D.22404 + D.22406;
            iftmp.30 = *D.22407;
            goto <D.22468>;
            <D.22467>:
            iftmp.30 = 0B;
            <D.22468>:
            var = iftmp.30;
            if (var != 0B) goto <D.22469>; else goto <D.22470>;
            <D.22469>:
            {
              struct MonoMethodVar * vmv;

              D.22471 = cfg->vars;
              D.22472 = var->data.op[0].const_val;
              D.22473 = (unsigned int) D.22472;
              D.22474 = D.22473 * 56;
              vmv = D.22471 + D.22474;
              D.22475 = vmv->reg;
              if (D.22475 != -1) goto <D.22476>; else goto <D.22477>;
              <D.22476>:
              D.22478 = vmv->idx;
              D.22475 = vmv->reg;
              D.22479 = (unsigned int) D.22475;
              if (D.22478 != D.22479) goto <D.22480>; else goto <D.22481>;
              <D.22480>:
              D.22471 = cfg->vars;
              D.22475 = vmv->reg;
              D.22482 = (unsigned int) D.22475;
              D.22483 = D.22482 * 56;
              D.22484 = D.22471 + D.22483;
              D.22485 = D.22484->reg;
              if (D.22485 != -1) goto <D.22486>; else goto <D.22487>;
              <D.22486>:
              D.22399 = ins->dreg;
              D.22488 = cfg->varinfo;
              D.22475 = vmv->reg;
              D.22482 = (unsigned int) D.22475;
              D.22489 = D.22482 * 4;
              D.22490 = D.22488 + D.22489;
              D.22491 = *D.22490;
              D.22492 = D.22491->dreg;
              printf ("COALESCE: R%d -> R%d\n", D.22399, D.22492);
              D.22488 = cfg->varinfo;
              D.22475 = vmv->reg;
              D.22482 = (unsigned int) D.22475;
              D.22489 = D.22482 * 4;
              D.22490 = D.22488 + D.22489;
              D.22491 = *D.22490;
              D.22492 = D.22491->dreg;
              ins->dreg = D.22492;
              <D.22487>:
              <D.22481>:
              <D.22477>:
            }
            <D.22470>:
          }
          <D.22464>:
          D.22493 = ins->sreg1;
          sregs[0] = D.22493;
          D.22494 = ins->sreg2;
          sregs[1] = D.22494;
          D.22495 = ins->sreg3;
          sregs[2] = D.22495;
          D.22385 = ins->opcode;
          D.22419 = (int) D.22385;
          D.22458 = D.22419 + -313;
          D.22496 = ins_sreg_counts[D.22458];
          num_sregs = (int) D.22496;
          i = 0;
          goto <D.21666>;
          <D.21665>:
          {
            struct MonoInst * var;

            D.22498 = sregs[i];
            D.22499 = (unsigned int) D.22498;
            D.22401 = cfg->vreg_to_inst_len;
            if (D.22499 < D.22401) goto <D.22500>; else goto <D.22501>;
            <D.22500>:
            D.22404 = cfg->vreg_to_inst;
            D.22498 = sregs[i];
            D.22502 = (unsigned int) D.22498;
            D.22503 = D.22502 * 4;
            D.22504 = D.22404 + D.22503;
            iftmp.31 = *D.22504;
            goto <D.22505>;
            <D.22501>:
            iftmp.31 = 0B;
            <D.22505>:
            var = iftmp.31;
            if (var != 0B) goto <D.22506>; else goto <D.22507>;
            <D.22506>:
            {
              struct MonoMethodVar * vmv;

              D.22471 = cfg->vars;
              D.22508 = var->data.op[0].const_val;
              D.22509 = (unsigned int) D.22508;
              D.22510 = D.22509 * 56;
              vmv = D.22471 + D.22510;
              D.22511 = vmv->reg;
              if (D.22511 != -1) goto <D.22512>; else goto <D.22513>;
              <D.22512>:
              D.22514 = vmv->idx;
              D.22511 = vmv->reg;
              D.22515 = (unsigned int) D.22511;
              if (D.22514 != D.22515) goto <D.22516>; else goto <D.22517>;
              <D.22516>:
              D.22471 = cfg->vars;
              D.22511 = vmv->reg;
              D.22518 = (unsigned int) D.22511;
              D.22519 = D.22518 * 56;
              D.22520 = D.22471 + D.22519;
              D.22521 = D.22520->reg;
              if (D.22521 != -1) goto <D.22522>; else goto <D.22523>;
              <D.22522>:
              D.22498 = sregs[i];
              D.22488 = cfg->varinfo;
              D.22511 = vmv->reg;
              D.22518 = (unsigned int) D.22511;
              D.22524 = D.22518 * 4;
              D.22525 = D.22488 + D.22524;
              D.22526 = *D.22525;
              D.22527 = D.22526->dreg;
              printf ("COALESCE: R%d -> R%d\n", D.22498, D.22527);
              D.22488 = cfg->varinfo;
              D.22511 = vmv->reg;
              D.22518 = (unsigned int) D.22511;
              D.22524 = D.22518 * 4;
              D.22525 = D.22488 + D.22524;
              D.22526 = *D.22525;
              D.22527 = D.22526->dreg;
              sregs[i] = D.22527;
              <D.22523>:
              <D.22517>:
              <D.22513>:
            }
            <D.22507>:
          }
          i = i + 1;
          <D.21666>:
          if (i < num_sregs) goto <D.21665>; else goto <D.21667>;
          <D.21667>:
          mono_inst_set_src_registers (ins, &sregs);
        }
      finally
        {
          sregs = {CLOBBER};
        }
    }
    <D.21660>:
    ins = ins->next;
    <D.21669>:
    if (ins != 0B) goto <D.21668>; else goto <D.21670>;
    <D.21670>:
  }
  bbindex = bbindex + 1;
  <D.21672>:
  bbindex.32 = (unsigned int) bbindex;
  D.22452 = cfg->num_bblocks;
  if (bbindex.32 < D.22452) goto <D.21671>; else goto <D.21673>;
  <D.21673>:
  i = 0;
  goto <D.21675>;
  <D.21674>:
  D.22471 = cfg->vars;
  i.24 = (unsigned int) i;
  D.22529 = i.24 * 56;
  D.22530 = D.22471 + D.22529;
  D.22530->reg = -1;
  i = i + 1;
  <D.21675>:
  i.28 = (unsigned int) i;
  D.22531 = cfg->num_varinfo;
  if (i.28 < D.22531) goto <D.21674>; else goto <D.21676>;
  <D.21676>:
  D.22370 = cfg->comp_done;
  D.22532 = D.22370 & 128;
  if (D.22532 != 0) goto <D.22533>; else goto <D.22534>;
  <D.22533>:
  unlink_unused_bblocks (cfg);
  <D.22534>:
  D.22370 = cfg->comp_done;
  D.22535 = D.22370 & 4294967279;
  cfg->comp_done = D.22535;
  D.22370 = cfg->comp_done;
  D.22536 = D.22370 & 4294967263;
  cfg->comp_done = D.22536;
}


op_phi_to_move (int opcode)
{
  int D.22539;

  switch (opcode) <default: <D.21515>, case 319: <D.21511>, case 320: <D.21512>, case 321: <D.21513>, case 802: <D.21514>>
  <D.21511>:
  D.22539 = 424;
  return D.22539;
  <D.21512>:
  D.22539 = 426;
  return D.22539;
  <D.21513>:
  D.22539 = 427;
  return D.22539;
  <D.21514>:
  D.22539 = 800;
  return D.22539;
  <D.21515>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "ssa.c", 137);
  D.22539 = -1;
  return D.22539;
}


unlink_unused_bblocks (struct MonoCompile * cfg)
{
  unsigned int D.22541;
  unsigned int D.22542;
  _Bool D.22543;
  long int D.22544;
  long int D.22545;
  unsigned int D.22548;
  _Bool D.22549;
  long int D.22550;
  long int D.22551;
  struct MonoBasicBlock * D.22554;
  unsigned int D.22555;
  unsigned int D.22556;
  struct MonoBasicBlock * D.22559;
  struct MonoBasicBlock * * D.22562;
  unsigned int i.33;
  unsigned int D.22564;
  struct MonoBasicBlock * * D.22565;
  unsigned int D.22566;
  unsigned int D.22567;
  struct MonoBasicBlock * * D.22570;
  unsigned int j.34;
  unsigned int D.22572;
  struct MonoBasicBlock * * D.22573;
  struct MonoBasicBlock * D.22574;
  short int D.22575;
  int D.22576;
  struct MonoBasicBlock * * D.22577;
  struct MonoBasicBlock * * D.22578;
  struct MonoBasicBlock * D.22579;
  short int D.22580;
  int D.22581;
  int D.22584;
  unsigned int i.35;
  unsigned int D.22586;
  int i;
  int j;
  struct MonoBasicBlock * bb;

  D.22541 = cfg->comp_done;
  D.22542 = D.22541 & 128;
  D.22543 = D.22542 == 0;
  D.22544 = (long int) D.22543;
  D.22545 = __builtin_expect (D.22544, 0);
  if (D.22545 != 0) goto <D.22546>; else goto <D.22547>;
  <D.22546>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 66, "cfg->comp_done & MONO_COMP_REACHABILITY");
  <D.22547>:
  D.22548 = cfg->verbose_level;
  D.22549 = D.22548 > 1;
  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>:
  printf ("\nUNLINK UNUSED BBLOCKS:\n");
  <D.22553>:
  bb = cfg->bb_entry;
  goto <D.21480>;
  <D.21479>:
  D.22554 = bb->next_bb;
  D.22555 = D.22554->flags;
  D.22556 = D.22555 & 2;
  if (D.22556 == 0) goto <D.22557>; else goto <D.22558>;
  <D.22557>:
  D.22554 = bb->next_bb;
  D.22559 = D.22554->next_bb;
  bb->next_bb = D.22559;
  goto <D.22560>;
  <D.22558>:
  bb = bb->next_bb;
  <D.22560>:
  <D.21480>:
  if (bb != 0B) goto <D.22561>; else goto <D.21481>;
  <D.22561>:
  D.22554 = bb->next_bb;
  if (D.22554 != 0B) goto <D.21479>; else goto <D.21481>;
  <D.21481>:
  i = 1;
  goto <D.21489>;
  <D.21488>:
  D.22562 = cfg->bblocks;
  i.33 = (unsigned int) i;
  D.22564 = i.33 * 4;
  D.22565 = D.22562 + D.22564;
  bb = *D.22565;
  D.22566 = bb->flags;
  D.22567 = D.22566 & 2;
  if (D.22567 == 0) goto <D.22568>; else goto <D.22569>;
  <D.22568>:
  j = 0;
  goto <D.21483>;
  <D.21482>:
  D.22570 = bb->in_bb;
  j.34 = (unsigned int) j;
  D.22572 = j.34 * 4;
  D.22573 = D.22570 + D.22572;
  D.22574 = *D.22573;
  unlink_target (D.22574, bb);
  j = j + 1;
  <D.21483>:
  D.22575 = bb->in_count;
  D.22576 = (int) D.22575;
  if (D.22576 > j) goto <D.21482>; else goto <D.21484>;
  <D.21484>:
  j = 0;
  goto <D.21486>;
  <D.21485>:
  D.22577 = bb->out_bb;
  j.34 = (unsigned int) j;
  D.22572 = j.34 * 4;
  D.22578 = D.22577 + D.22572;
  D.22579 = *D.22578;
  unlink_target (bb, D.22579);
  j = j + 1;
  <D.21486>:
  D.22580 = bb->out_count;
  D.22581 = (int) D.22580;
  if (D.22581 > j) goto <D.21485>; else goto <D.21487>;
  <D.21487>:
  D.22548 = cfg->verbose_level;
  D.22549 = D.22548 > 1;
  D.22550 = (long int) D.22549;
  D.22551 = __builtin_expect (D.22550, 0);
  if (D.22551 != 0) goto <D.22582>; else goto <D.22583>;
  <D.22582>:
  D.22584 = bb->block_num;
  printf ("\tUnlinked BB%d\n", D.22584);
  <D.22583>:
  <D.22569>:
  i = i + 1;
  <D.21489>:
  i.35 = (unsigned int) i;
  D.22586 = cfg->num_bblocks;
  if (i.35 < D.22586) goto <D.21488>; else goto <D.21490>;
  <D.21490>:
}


unlink_target (struct MonoBasicBlock * bb, struct MonoBasicBlock * target)
{
  struct MonoBasicBlock * * D.22587;
  unsigned int i.36;
  unsigned int D.22589;
  struct MonoBasicBlock * * D.22590;
  struct MonoBasicBlock * D.22591;
  short int D.22594;
  unsigned short D.22595;
  unsigned short D.22596;
  short int D.22597;
  unsigned int D.22598;
  unsigned int D.22599;
  struct MonoBasicBlock * * D.22600;
  struct MonoBasicBlock * D.22601;
  int D.22602;
  struct MonoBasicBlock * * D.22603;
  struct MonoBasicBlock * * D.22604;
  struct MonoBasicBlock * D.22605;
  short int D.22608;
  unsigned short D.22609;
  unsigned short D.22610;
  short int D.22611;
  unsigned int D.22612;
  unsigned int D.22613;
  struct MonoBasicBlock * * D.22614;
  struct MonoBasicBlock * D.22615;
  int D.22616;
  int i;

  i = 0;
  goto <D.21469>;
  <D.21468>:
  D.22587 = bb->out_bb;
  i.36 = (unsigned int) i;
  D.22589 = i.36 * 4;
  D.22590 = D.22587 + D.22589;
  D.22591 = *D.22590;
  if (D.22591 == target) goto <D.22592>; else goto <D.22593>;
  <D.22592>:
  D.22587 = bb->out_bb;
  i.36 = (unsigned int) i;
  D.22589 = i.36 * 4;
  D.22590 = D.22587 + D.22589;
  D.22587 = bb->out_bb;
  D.22594 = bb->out_count;
  D.22595 = (unsigned short) D.22594;
  D.22596 = D.22595 + 65535;
  D.22597 = (short int) D.22596;
  bb->out_count = D.22597;
  D.22594 = bb->out_count;
  D.22598 = (unsigned int) D.22594;
  D.22599 = D.22598 * 4;
  D.22600 = D.22587 + D.22599;
  D.22601 = *D.22600;
  *D.22590 = D.22601;
  goto <D.21467>;
  <D.22593>:
  i = i + 1;
  <D.21469>:
  D.22594 = bb->out_count;
  D.22602 = (int) D.22594;
  if (D.22602 > i) goto <D.21468>; else goto <D.21467>;
  <D.21467>:
  i = 0;
  goto <D.21472>;
  <D.21471>:
  D.22603 = target->in_bb;
  i.36 = (unsigned int) i;
  D.22589 = i.36 * 4;
  D.22604 = D.22603 + D.22589;
  D.22605 = *D.22604;
  if (D.22605 == bb) goto <D.22606>; else goto <D.22607>;
  <D.22606>:
  D.22603 = target->in_bb;
  i.36 = (unsigned int) i;
  D.22589 = i.36 * 4;
  D.22604 = D.22603 + D.22589;
  D.22603 = target->in_bb;
  D.22608 = target->in_count;
  D.22609 = (unsigned short) D.22608;
  D.22610 = D.22609 + 65535;
  D.22611 = (short int) D.22610;
  target->in_count = D.22611;
  D.22608 = target->in_count;
  D.22612 = (unsigned int) D.22608;
  D.22613 = D.22612 * 4;
  D.22614 = D.22603 + D.22613;
  D.22615 = *D.22614;
  *D.22604 = D.22615;
  goto <D.21470>;
  <D.22607>:
  i = i + 1;
  <D.21472>:
  D.22608 = target->in_count;
  D.22616 = (int) D.22608;
  if (D.22616 > i) goto <D.21471>; else goto <D.21470>;
  <D.21470>:
}


mono_ssa_cprop (struct MonoCompile * cfg)
{
  unsigned int D.22617;
  unsigned int D.22618;
  unsigned int D.22619;
  unsigned int D.22620;
  struct MonoBasicBlock * D.22623;
  struct GList * bblock_list.37;
  unsigned int D.22625;
  unsigned int D.22626;
  unsigned int D.22627;
  unsigned int D.22628;
  struct MonoMethodVar * D.22629;
  unsigned int i.38;
  unsigned int D.22631;
  struct MonoInst * D.22632;
  unsigned int i.39;
  unsigned int D.22636;
  struct GList * bblock_list.40;
  struct GList * bblock_list.41;
  unsigned int D.22641;
  unsigned int D.22642;
  _Bool D.22643;
  long int D.22644;
  long int D.22645;
  struct MonoInst * D.22649;
  short unsigned int D.22651;
  short unsigned int D.22652;
  short unsigned int D.22654;
  short unsigned int D.22656;
  struct MonoBasicBlock * * D.22660;
  unsigned int D.22661;
  struct MonoBasicBlock * * D.22662;
  struct MonoBasicBlock * D.22663;
  short int D.22664;
  int D.22665;
  unsigned int D.22666;
  int D.22669;
  struct GList * cvars.42;
  struct GList * cvars.43;
  struct MonoBasicBlock * D.22672;
  unsigned int D.22673;
  unsigned int D.22674;
  struct MonoInst * D.22677;
  unsigned int D.22678;
  unsigned int D.22679;
  struct MonoInst * * carray;
  struct MonoBasicBlock * bb;
  struct GList * bblock_list;
  struct GList * cvars;
  struct GList * tmp;
  int i;

  try
    {
      D.22617 = cfg->next_vreg;
      D.22618 = D.22617 * 4;
      carray = monoeg_malloc0 (D.22618);
      D.22619 = cfg->comp_done;
      D.22620 = D.22619 & 64;
      if (D.22620 == 0) goto <D.22621>; else goto <D.22622>;
      <D.22621>:
      mono_ssa_create_def_use (cfg);
      <D.22622>:
      D.22623 = cfg->bb_entry;
      bblock_list.37 = monoeg_g_list_prepend (0B, D.22623);
      bblock_list = bblock_list.37;
      D.22623 = cfg->bb_entry;
      D.22623 = cfg->bb_entry;
      D.22625 = D.22623->flags;
      D.22626 = D.22625 | 2;
      D.22623->flags = D.22626;
      D.22627 = cfg->num_varinfo;
      D.22628 = D.22627 * 4;
      memset (carray, 0, D.22628);
      i = 0;
      goto <D.21839>;
      <D.21838>:
      {
        struct MonoMethodVar * info;

        D.22629 = cfg->vars;
        i.38 = (unsigned int) i;
        D.22631 = i.38 * 56;
        info = D.22629 + D.22631;
        D.22632 = info->def;
        if (D.22632 == 0B) goto <D.22633>; else goto <D.22634>;
        <D.22633>:
        info->cpstate = 2;
        <D.22634>:
      }
      i = i + 1;
      <D.21839>:
      i.39 = (unsigned int) i;
      D.22627 = cfg->num_varinfo;
      if (i.39 < D.22627) goto <D.21838>; else goto <D.21840>;
      <D.21840>:
      D.22623 = cfg->bb_entry;
      bb = D.22623->next_bb;
      goto <D.21842>;
      <D.21841>:
      D.22636 = bb->region;
      if (D.22636 != 0) goto <D.22637>; else goto <D.22638>;
      <D.22637>:
      add_cprop_bb (cfg, bb, &bblock_list);
      <D.22638>:
      bb = bb->next_bb;
      <D.21842>:
      if (bb != 0B) goto <D.21841>; else goto <D.21843>;
      <D.21843>:
      cvars = 0B;
      goto <D.21861>;
      <D.21860>:
      {
        struct MonoInst * inst;

        bblock_list.40 = bblock_list;
        bb = bblock_list.40->data;
        bblock_list.40 = bblock_list;
        bblock_list.40 = bblock_list;
        bblock_list.41 = monoeg_g_list_delete_link (bblock_list.40, bblock_list.40);
        bblock_list = bblock_list.41;
        D.22641 = bb->flags;
        D.22642 = D.22641 & 2;
        D.22643 = D.22642 == 0;
        D.22644 = (long int) D.22643;
        D.22645 = __builtin_expect (D.22644, 0);
        if (D.22645 != 0) goto <D.22646>; else goto <D.22647>;
        <D.22646>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1185, "bb->flags & BB_REACHABLE");
        <D.22647>:
        D.22649 = bb->last_ins;
        if (D.22649 == 0B) goto <D.22648>; else goto <D.22650>;
        <D.22650>:
        D.22649 = bb->last_ins;
        D.22651 = D.22649->opcode;
        D.22652 = D.22651 + 64985;
        if (D.22652 > 9) goto <D.22653>; else goto <D.21847>;
        <D.22653>:
        D.22649 = bb->last_ins;
        D.22651 = D.22649->opcode;
        D.22654 = D.22651 + 64878;
        if (D.22654 > 9) goto <D.22655>; else goto <D.21847>;
        <D.22655>:
        D.22649 = bb->last_ins;
        D.22651 = D.22649->opcode;
        D.22656 = D.22651 + 64888;
        if (D.22656 > 9) goto <D.22657>; else goto <D.21847>;
        <D.22657>:
        D.22649 = bb->last_ins;
        D.22651 = D.22649->opcode;
        if (D.22651 != 442) goto <D.22658>; else goto <D.21847>;
        <D.22658>:
        D.22649 = bb->last_ins;
        D.22651 = D.22649->opcode;
        if (D.22651 != 759) goto <D.22659>; else goto <D.21847>;
        <D.22659>:
        D.22649 = bb->last_ins;
        D.22651 = D.22649->opcode;
        if (D.22651 != 370) goto <D.22648>; else goto <D.21847>;
        <D.22648>:
        i = 0;
        goto <D.21846>;
        <D.21845>:
        D.22660 = bb->out_bb;
        i.38 = (unsigned int) i;
        D.22661 = i.38 * 4;
        D.22662 = D.22660 + D.22661;
        D.22663 = *D.22662;
        add_cprop_bb (cfg, D.22663, &bblock_list);
        i = i + 1;
        <D.21846>:
        D.22664 = bb->out_count;
        D.22665 = (int) D.22664;
        if (D.22665 > i) goto <D.21845>; else goto <D.21847>;
        <D.21847>:
        D.22666 = cfg->verbose_level;
        if (D.22666 > 1) goto <D.22667>; else goto <D.22668>;
        <D.22667>:
        D.22669 = bb->block_num;
        printf ("\nSSA CONSPROP BB%d:\n", D.22669);
        <D.22668>:
        inst = bb->code;
        goto <D.21849>;
        <D.21848>:
        visit_inst (cfg, bb, inst, &cvars, &bblock_list, carray);
        inst = inst->next;
        <D.21849>:
        if (inst != 0B) goto <D.21848>; else goto <D.21850>;
        <D.21850>:
        goto <D.21858>;
        <D.21857>:
        {
          struct MonoMethodVar * info;

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

            ui = tmp->data;
            D.22672 = ui->bb;
            D.22673 = D.22672->flags;
            D.22674 = D.22673 & 2;
            if (D.22674 == 0) goto <D.22675>; else goto <D.22676>;
            <D.22675>:
            // predicted unlikely by continue predictor.
            goto <D.21853>;
            <D.22676>:
            D.22672 = ui->bb;
            D.22677 = ui->inst;
            visit_inst (cfg, D.22672, D.22677, &cvars, &bblock_list, carray);
          }
          <D.21853>:
          tmp = tmp->next;
          <D.21855>:
          if (tmp != 0B) goto <D.21854>; else goto <D.21856>;
          <D.21856>:
        }
        <D.21858>:
        cvars.42 = cvars;
        if (cvars.42 != 0B) goto <D.21857>; else goto <D.21859>;
        <D.21859>:
      }
      <D.21861>:
      bblock_list.40 = bblock_list;
      if (bblock_list.40 != 0B) goto <D.21860>; else goto <D.21862>;
      <D.21862>:
      D.22623 = cfg->bb_entry;
      bb = D.22623->next_bb;
      goto <D.21868>;
      <D.21867>:
      {
        struct MonoInst * inst;

        inst = bb->code;
        goto <D.21865>;
        <D.21864>:
        fold_ins (cfg, bb, inst, carray);
        inst = inst->next;
        <D.21865>:
        if (inst != 0B) goto <D.21864>; else goto <D.21866>;
        <D.21866>:
      }
      bb = bb->next_bb;
      <D.21868>:
      if (bb != 0B) goto <D.21867>; else goto <D.21869>;
      <D.21869>:
      monoeg_g_free (carray);
      D.22619 = cfg->comp_done;
      D.22678 = D.22619 | 128;
      cfg->comp_done = D.22678;
      D.22619 = cfg->comp_done;
      D.22679 = D.22619 & 4294967231;
      cfg->comp_done = D.22679;
      i = 0;
      goto <D.21872>;
      <D.21871>:
      {
        struct MonoMethodVar * info;

        D.22629 = cfg->vars;
        i.38 = (unsigned int) i;
        D.22631 = i.38 * 56;
        info = D.22629 + D.22631;
        info->def = 0B;
        info->uses = 0B;
      }
      i = i + 1;
      <D.21872>:
      i.39 = (unsigned int) i;
      D.22627 = cfg->num_varinfo;
      if (i.39 < D.22627) goto <D.21871>; else goto <D.21873>;
      <D.21873>:
    }
  finally
    {
      bblock_list = {CLOBBER};
      cvars = {CLOBBER};
    }
}


mono_ssa_create_def_use (struct MonoCompile * cfg)
{
  unsigned int D.22680;
  unsigned int D.22681;
  _Bool D.22682;
  long int D.22683;
  long int D.22684;
  short unsigned int D.22687;
  int D.22688;
  int D.22689;
  int D.22690;
  int D.22693;
  int D.22694;
  int D.22695;
  signed char D.22696;
  struct MonoInst * iftmp.44;
  int D.22698;
  unsigned int D.22699;
  unsigned int D.22700;
  struct MonoInst * * D.22703;
  unsigned int D.22704;
  unsigned int D.22705;
  struct MonoInst * * D.22706;
  unsigned char D.22710;
  int D.22711;
  int D.22712;
  short unsigned int D.22715;
  struct MonoInst * iftmp.45;
  int D.22719;
  unsigned int D.22720;
  unsigned int D.22723;
  unsigned int D.22724;
  struct MonoInst * * D.22725;
  unsigned char D.22729;
  int D.22730;
  int D.22731;
  short unsigned int D.22734;
  int * D.22737;
  unsigned int i.46;
  unsigned int D.22739;
  int * D.22740;
  int D.22741;
  _Bool D.22742;
  long int D.22743;
  long int D.22744;
  struct MonoInst * iftmp.47;
  unsigned int D.22748;
  unsigned int D.22751;
  unsigned int D.22752;
  struct MonoInst * * D.22753;
  char D.22755;
  struct MonoInst * iftmp.48;
  unsigned char D.22766;
  int D.22767;
  int D.22768;
  struct MonoMethodVar * D.22771;
  int D.22772;
  unsigned int D.22773;
  unsigned int D.22774;
  unsigned int D.22775;
  struct MonoBasicBlock * bb;
  struct MonoInst * ins;
  int i;

  D.22680 = cfg->comp_done;
  D.22681 = D.22680 & 64;
  D.22682 = D.22681 != 0;
  D.22683 = (long int) D.22682;
  D.22684 = __builtin_expect (D.22683, 0);
  if (D.22684 != 0) goto <D.22685>; else goto <D.22686>;
  <D.22685>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 619, "!(cfg->comp_done & MONO_COMP_SSA_DEF_USE)");
  <D.22686>:
  bb = cfg->bb_entry;
  goto <D.21701>;
  <D.21700>:
  ins = bb->code;
  goto <D.21698>;
  <D.21697>:
  {
    const char * spec;
    struct MonoMethodVar * info;
    int num_sregs;
    int sregs[3];

    try
      {
        D.22687 = ins->opcode;
        D.22688 = (int) D.22687;
        D.22689 = D.22688 + -313;
        D.22690 = D.22689 * 4;
        spec = &ins_info[D.22690];
        D.22687 = ins->opcode;
        if (D.22687 == 316) goto <D.22691>; else goto <D.22692>;
        <D.22691>:
        // predicted unlikely by continue predictor.
        goto <D.21687>;
        <D.22692>:
        D.22693 = ins->sreg1;
        sregs[0] = D.22693;
        D.22694 = ins->sreg2;
        sregs[1] = D.22694;
        D.22695 = ins->sreg3;
        sregs[2] = D.22695;
        D.22687 = ins->opcode;
        D.22688 = (int) D.22687;
        D.22689 = D.22688 + -313;
        D.22696 = ins_sreg_counts[D.22689];
        num_sregs = (int) D.22696;
        i = 0;
        goto <D.21690>;
        <D.21689>:
        {
          struct MonoInst * var;

          D.22698 = sregs[i];
          D.22699 = (unsigned int) D.22698;
          D.22700 = cfg->vreg_to_inst_len;
          if (D.22699 < D.22700) goto <D.22701>; else goto <D.22702>;
          <D.22701>:
          D.22703 = cfg->vreg_to_inst;
          D.22698 = sregs[i];
          D.22704 = (unsigned int) D.22698;
          D.22705 = D.22704 * 4;
          D.22706 = D.22703 + D.22705;
          iftmp.44 = *D.22706;
          goto <D.22707>;
          <D.22702>:
          iftmp.44 = 0B;
          <D.22707>:
          var = iftmp.44;
          if (var != 0B) goto <D.22708>; else goto <D.22709>;
          <D.22708>:
          D.22710 = var->flags;
          D.22711 = (int) D.22710;
          D.22712 = D.22711 & 20;
          if (D.22712 == 0) goto <D.22713>; else goto <D.22714>;
          <D.22713>:
          record_use (cfg, var, bb, ins);
          <D.22714>:
          <D.22709>:
        }
        i = i + 1;
        <D.21690>:
        if (i < num_sregs) goto <D.21689>; else goto <D.21691>;
        <D.21691>:
        D.22687 = ins->opcode;
        D.22715 = D.22687 + 65162;
        if (D.22715 <= 13) goto <D.22716>; else goto <D.22717>;
        <D.22716>:
        {
          struct MonoInst * var;

          D.22719 = ins->dreg;
          D.22720 = (unsigned int) D.22719;
          D.22700 = cfg->vreg_to_inst_len;
          if (D.22720 < D.22700) goto <D.22721>; else goto <D.22722>;
          <D.22721>:
          D.22703 = cfg->vreg_to_inst;
          D.22719 = ins->dreg;
          D.22723 = (unsigned int) D.22719;
          D.22724 = D.22723 * 4;
          D.22725 = D.22703 + D.22724;
          iftmp.45 = *D.22725;
          goto <D.22726>;
          <D.22722>:
          iftmp.45 = 0B;
          <D.22726>:
          var = iftmp.45;
          if (var != 0B) goto <D.22727>; else goto <D.22728>;
          <D.22727>:
          D.22729 = var->flags;
          D.22730 = (int) D.22729;
          D.22731 = D.22730 & 20;
          if (D.22731 == 0) goto <D.22732>; else goto <D.22733>;
          <D.22732>:
          record_use (cfg, var, bb, ins);
          <D.22733>:
          <D.22728>:
        }
        <D.22717>:
        D.22687 = ins->opcode;
        D.22734 = D.22687 + 65217;
        if (D.22734 <= 2) goto <D.22735>; else goto <D.22736>;
        <D.22735>:
        D.22737 = ins->data.op[1].phi_args;
        i = *D.22737;
        goto <D.21694>;
        <D.21693>:
        D.22737 = ins->data.op[1].phi_args;
        i.46 = (unsigned int) i;
        D.22739 = i.46 * 4;
        D.22740 = D.22737 + D.22739;
        D.22741 = *D.22740;
        D.22742 = D.22741 == -1;
        D.22743 = (long int) D.22742;
        D.22744 = __builtin_expect (D.22743, 0);
        if (D.22744 != 0) goto <D.22745>; else goto <D.22746>;
        <D.22745>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 647, "ins->inst_phi_args [i] != -1");
        <D.22746>:
        D.22737 = ins->data.op[1].phi_args;
        i.46 = (unsigned int) i;
        D.22739 = i.46 * 4;
        D.22740 = D.22737 + D.22739;
        D.22741 = *D.22740;
        D.22748 = (unsigned int) D.22741;
        D.22700 = cfg->vreg_to_inst_len;
        if (D.22748 < D.22700) goto <D.22749>; else goto <D.22750>;
        <D.22749>:
        D.22703 = cfg->vreg_to_inst;
        D.22737 = ins->data.op[1].phi_args;
        i.46 = (unsigned int) i;
        D.22739 = i.46 * 4;
        D.22740 = D.22737 + D.22739;
        D.22741 = *D.22740;
        D.22751 = (unsigned int) D.22741;
        D.22752 = D.22751 * 4;
        D.22753 = D.22703 + D.22752;
        iftmp.47 = *D.22753;
        goto <D.22754>;
        <D.22750>:
        iftmp.47 = 0B;
        <D.22754>:
        record_use (cfg, iftmp.47, bb, ins);
        i = i + -1;
        <D.21694>:
        if (i > 0) goto <D.21693>; else goto <D.21695>;
        <D.21695>:
        <D.22736>:
        D.22755 = *spec;
        if (D.22755 != 32) goto <D.22756>; else goto <D.22757>;
        <D.22756>:
        D.22687 = ins->opcode;
        D.22715 = D.22687 + 65162;
        if (D.22715 > 13) goto <D.22758>; else goto <D.22759>;
        <D.22758>:
        {
          struct MonoInst * var;

          D.22719 = ins->dreg;
          D.22720 = (unsigned int) D.22719;
          D.22700 = cfg->vreg_to_inst_len;
          if (D.22720 < D.22700) goto <D.22761>; else goto <D.22762>;
          <D.22761>:
          D.22703 = cfg->vreg_to_inst;
          D.22719 = ins->dreg;
          D.22723 = (unsigned int) D.22719;
          D.22724 = D.22723 * 4;
          D.22725 = D.22703 + D.22724;
          iftmp.48 = *D.22725;
          goto <D.22763>;
          <D.22762>:
          iftmp.48 = 0B;
          <D.22763>:
          var = iftmp.48;
          if (var != 0B) goto <D.22764>; else goto <D.22765>;
          <D.22764>:
          D.22766 = var->flags;
          D.22767 = (int) D.22766;
          D.22768 = D.22767 & 20;
          if (D.22768 == 0) goto <D.22769>; else goto <D.22770>;
          <D.22769>:
          D.22771 = cfg->vars;
          D.22772 = var->data.op[0].const_val;
          D.22773 = (unsigned int) D.22772;
          D.22774 = D.22773 * 56;
          info = D.22771 + D.22774;
          info->def = ins;
          info->def_bb = bb;
          <D.22770>:
          <D.22765>:
        }
        <D.22759>:
        <D.22757>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21687>:
  ins = ins->next;
  <D.21698>:
  if (ins != 0B) goto <D.21697>; else goto <D.21699>;
  <D.21699>:
  bb = bb->next_bb;
  <D.21701>:
  if (bb != 0B) goto <D.21700>; else goto <D.21702>;
  <D.21702>:
  D.22680 = cfg->comp_done;
  D.22775 = D.22680 | 64;
  cfg->comp_done = D.22775;
}


add_cprop_bb (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct GList * * bblist)
{
  unsigned int D.22778;
  _Bool D.22779;
  long int D.22780;
  long int D.22781;
  int D.22784;
  unsigned int D.22785;
  unsigned int D.22786;
  unsigned int D.22789;
  struct GList * D.22790;
  struct GList * D.22791;

  D.22778 = cfg->verbose_level;
  D.22779 = D.22778 > 1;
  D.22780 = (long int) D.22779;
  D.22781 = __builtin_expect (D.22780, 0);
  if (D.22781 != 0) goto <D.22782>; else goto <D.22783>;
  <D.22782>:
  D.22784 = bb->block_num;
  printf ("\tAdd BB%d to worklist\n", D.22784);
  <D.22783>:
  D.22785 = bb->flags;
  D.22786 = D.22785 & 2;
  if (D.22786 == 0) goto <D.22787>; else goto <D.22788>;
  <D.22787>:
  D.22785 = bb->flags;
  D.22789 = D.22785 | 2;
  bb->flags = D.22789;
  D.22790 = *bblist;
  D.22791 = monoeg_g_list_prepend (D.22790, bb);
  *bblist = D.22791;
  <D.22788>:
}


visit_inst (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoInst * ins, struct GList * * cvars, struct GList * * bblist, struct MonoInst * * carray)
{
  short unsigned int D.22792;
  int D.22793;
  int D.22794;
  int D.22795;
  unsigned int D.22798;
  short unsigned int D.22801;
  struct MonoMethodVar * D.22804;
  struct MonoInst * iftmp.49;
  int D.22806;
  unsigned int D.22807;
  unsigned int D.22808;
  struct MonoInst * * D.22811;
  unsigned int D.22812;
  unsigned int D.22813;
  struct MonoInst * * D.22814;
  int D.22816;
  unsigned int D.22817;
  unsigned int D.22818;
  struct MonoInst * iftmp.50;
  int * D.22820;
  unsigned int j.51;
  unsigned int D.22822;
  int * D.22823;
  int D.22824;
  unsigned int D.22825;
  unsigned int D.22828;
  unsigned int D.22829;
  struct MonoInst * * D.22830;
  int D.22832;
  unsigned int D.22833;
  unsigned int D.22834;
  struct MonoBasicBlock * D.22835;
  unsigned int D.22838;
  unsigned int D.22839;
  struct MonoInst * D.22844;
  char D.22847;
  int D.22850;
  unsigned int D.22851;
  unsigned int D.22852;
  struct MonoInst * * D.22853;
  struct MonoInst * D.22854;
  _Bool D.22855;
  long int D.22856;
  long int D.22857;
  short unsigned int D.22862;
  int D.22865;
  int D.22866;
  int D.22869;
  char D.22872;
  _Bool D.22875;
  long int D.22876;
  long int D.22877;
  short unsigned int D.22884;
  const char * D.22886;
  char D.22887;
  const char * D.22889;
  char D.22890;
  char D.22892;
  struct MonoInst * iftmp.52;
  unsigned char D.22903;
  int D.22904;
  int D.22905;
  int D.22907;
  unsigned int D.22908;
  unsigned int D.22909;
  char D.22910;
  struct MonoInst * c0.53;
  struct MonoInst * * D.22925;
  struct MonoInst * D.22927;
  struct GList * D.22930;
  struct GList * D.22931;
  struct GList * D.22934;
  struct MonoInst * D.22940;
  struct MonoInst * D.22943;
  struct MonoJumpInfoBBTable * iftmp.54;
  struct MonoJumpInfoBBTable * iftmp.55;
  struct MonoJumpInfoBBTable * iftmp.56;
  struct MonoJumpInfoBBTable * iftmp.57;
  struct MonoInst * D.22964;
  short unsigned int D.22966;
  struct MonoBasicBlock * * D.22967;
  unsigned int i.58;
  unsigned int D.22969;
  struct MonoBasicBlock * * D.22970;
  struct MonoBasicBlock * D.22971;
  int D.22974;
  _Bool D.22975;
  long int D.22976;
  long int D.22977;
  int D.22980;
  _Bool D.22981;
  long int D.22982;
  long int D.22983;
  int D.22986;
  unsigned int D.22987;
  unsigned int D.22988;
  struct MonoInst * * D.22989;
  struct MonoInst * D.22990;
  int D.22993;
  unsigned int idx.59;
  unsigned int D.22998;
  struct MonoBasicBlock * * D.22999;
  struct MonoBasicBlock * D.23000;
  struct MonoBasicBlock * * D.23008;
  unsigned int i.60;
  unsigned int D.23010;
  struct MonoBasicBlock * * D.23011;
  struct MonoBasicBlock * D.23012;
  int D.23015;
  short unsigned int D.23020;
  short unsigned int D.23022;
  short unsigned int D.23024;
  short unsigned int D.23027;
  _Bool D.23028;
  long int D.23029;
  long int D.23030;
  int D.23033;
  unsigned char D.23036;
  unsigned char D.23037;
  unsigned char D.23039;
  unsigned char D.23041;
  struct MonoBasicBlock * D.23044;
  short unsigned int D.23048;
  short unsigned int D.23050;
  short unsigned int D.23052;
  unsigned char D.23053;
  int D.23054;
  int D.23055;
  struct MonoBasicBlock * * D.23058;
  struct MonoBasicBlock * D.23059;
  int D.23061;
  struct MonoBasicBlock * * D.23064;
  struct MonoBasicBlock * D.23065;
  const char * spec;

  D.22792 = ins->opcode;
  D.22793 = (int) D.22792;
  D.22794 = D.22793 + -313;
  D.22795 = D.22794 * 4;
  spec = &ins_info[D.22795];
  D.22792 = ins->opcode;
  if (D.22792 == 316) goto <D.22796>; else goto <D.22797>;
  <D.22796>:
  return;
  <D.22797>:
  D.22798 = cfg->verbose_level;
  if (D.22798 > 1) goto <D.22799>; else goto <D.22800>;
  <D.22799>:
  mono_print_ins (ins);
  <D.22800>:
  D.22792 = ins->opcode;
  D.22801 = D.22792 + 65217;
  if (D.22801 <= 2) goto <D.22802>; else goto <D.22803>;
  <D.22802>:
  {
    struct MonoMethodVar * info;
    struct MonoInst * c0;
    int j;

    D.22804 = cfg->vars;
    D.22806 = ins->dreg;
    D.22807 = (unsigned int) D.22806;
    D.22808 = cfg->vreg_to_inst_len;
    if (D.22807 < D.22808) goto <D.22809>; else goto <D.22810>;
    <D.22809>:
    D.22811 = cfg->vreg_to_inst;
    D.22806 = ins->dreg;
    D.22812 = (unsigned int) D.22806;
    D.22813 = D.22812 * 4;
    D.22814 = D.22811 + D.22813;
    iftmp.49 = *D.22814;
    goto <D.22815>;
    <D.22810>:
    iftmp.49 = 0B;
    <D.22815>:
    D.22816 = iftmp.49->data.op[0].const_val;
    D.22817 = (unsigned int) D.22816;
    D.22818 = D.22817 * 56;
    info = D.22804 + D.22818;
    c0 = 0B;
    j = 1;
    goto <D.21791>;
    <D.21790>:
    {
      struct MonoInst * var;
      struct MonoMethodVar * mv;
      struct MonoInst * src;

      D.22820 = ins->data.op[1].phi_args;
      j.51 = (unsigned int) j;
      D.22822 = j.51 * 4;
      D.22823 = D.22820 + D.22822;
      D.22824 = *D.22823;
      D.22825 = (unsigned int) D.22824;
      D.22808 = cfg->vreg_to_inst_len;
      if (D.22825 < D.22808) goto <D.22826>; else goto <D.22827>;
      <D.22826>:
      D.22811 = cfg->vreg_to_inst;
      D.22820 = ins->data.op[1].phi_args;
      j.51 = (unsigned int) j;
      D.22822 = j.51 * 4;
      D.22823 = D.22820 + D.22822;
      D.22824 = *D.22823;
      D.22828 = (unsigned int) D.22824;
      D.22829 = D.22828 * 4;
      D.22830 = D.22811 + D.22829;
      iftmp.50 = *D.22830;
      goto <D.22831>;
      <D.22827>:
      iftmp.50 = 0B;
      <D.22831>:
      var = iftmp.50;
      D.22804 = cfg->vars;
      D.22832 = var->data.op[0].const_val;
      D.22833 = (unsigned int) D.22832;
      D.22834 = D.22833 * 56;
      mv = D.22804 + D.22834;
      src = mv->def;
      D.22835 = mv->def_bb;
      if (D.22835 != 0B) goto <D.22836>; else goto <D.22837>;
      <D.22836>:
      D.22835 = mv->def_bb;
      D.22838 = D.22835->flags;
      D.22839 = D.22838 & 2;
      if (D.22839 == 0) goto <D.22840>; else goto <D.22841>;
      <D.22840>:
      // predicted unlikely by continue predictor.
      goto <D.21788>;
      <D.22841>:
      <D.22837>:
      D.22844 = mv->def;
      if (D.22844 == 0B) goto <D.22842>; else goto <D.22845>;
      <D.22845>:
      if (src == 0B) goto <D.22842>; else goto <D.22846>;
      <D.22846>:
      D.22847 = mv->cpstate;
      if (D.22847 == 2) goto <D.22842>; else goto <D.22843>;
      <D.22842>:
      change_varstate (cfg, cvars, info, 2, 0B, carray);
      goto <D.21789>;
      <D.22843>:
      D.22847 = mv->cpstate;
      if (D.22847 == 0) goto <D.22848>; else goto <D.22849>;
      <D.22848>:
      // predicted unlikely by continue predictor.
      goto <D.21788>;
      <D.22849>:
      D.22850 = var->dreg;
      D.22851 = (unsigned int) D.22850;
      D.22852 = D.22851 * 4;
      D.22853 = carray + D.22852;
      D.22854 = *D.22853;
      D.22855 = D.22854 == 0B;
      D.22856 = (long int) D.22855;
      D.22857 = __builtin_expect (D.22856, 0);
      if (D.22857 != 0) goto <D.22858>; else goto <D.22859>;
      <D.22858>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 873, "carray [var->dreg]");
      <D.22859>:
      if (c0 == 0B) goto <D.22860>; else goto <D.22861>;
      <D.22860>:
      D.22850 = var->dreg;
      D.22851 = (unsigned int) D.22850;
      D.22852 = D.22851 * 4;
      D.22853 = carray + D.22852;
      c0 = *D.22853;
      <D.22861>:
      D.22862 = c0->opcode;
      if (D.22862 != 362) goto <D.22863>; else goto <D.22864>;
      <D.22863>:
      change_varstate (cfg, cvars, info, 2, 0B, carray);
      goto <D.21789>;
      <D.22864>:
      D.22850 = var->dreg;
      D.22851 = (unsigned int) D.22850;
      D.22852 = D.22851 * 4;
      D.22853 = carray + D.22852;
      D.22854 = *D.22853;
      D.22865 = D.22854->data.op[0].const_val;
      D.22866 = c0->data.op[0].const_val;
      if (D.22865 != D.22866) goto <D.22867>; else goto <D.22868>;
      <D.22867>:
      change_varstate (cfg, cvars, info, 2, 0B, carray);
      goto <D.21789>;
      <D.22868>:
    }
    <D.21788>:
    j = j + 1;
    <D.21791>:
    D.22820 = ins->data.op[1].phi_args;
    D.22869 = *D.22820;
    if (D.22869 >= j) goto <D.21790>; else goto <D.21789>;
    <D.21789>:
    if (c0 != 0B) goto <D.22870>; else goto <D.22871>;
    <D.22870>:
    D.22872 = info->cpstate;
    if (D.22872 <= 0) goto <D.22873>; else goto <D.22874>;
    <D.22873>:
    change_varstate (cfg, cvars, info, 1, c0, carray);
    D.22862 = c0->opcode;
    D.22875 = D.22862 != 362;
    D.22876 = (long int) D.22875;
    D.22877 = __builtin_expect (D.22876, 0);
    if (D.22877 != 0) goto <D.22878>; else goto <D.22879>;
    <D.22878>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 893, "c0->opcode == OP_ICONST");
    <D.22879>:
    <D.22874>:
    <D.22871>:
  }
  goto <D.22880>;
  <D.22803>:
  D.22792 = ins->opcode;
  D.22884 = D.22792 + 65162;
  if (D.22884 > 13) goto <D.22885>; else goto <D.22881>;
  <D.22885>:
  D.22886 = spec + 1;
  D.22887 = *D.22886;
  if (D.22887 != 32) goto <D.22882>; else goto <D.22888>;
  <D.22888>:
  D.22889 = spec + 2;
  D.22890 = *D.22889;
  if (D.22890 != 32) goto <D.22882>; else goto <D.22891>;
  <D.22891>:
  D.22892 = *spec;
  if (D.22892 != 32) goto <D.22882>; else goto <D.22881>;
  <D.22882>:
  {
    struct MonoInst * var;
    struct MonoInst * c0;
    int state;

    try
      {
        D.22892 = *spec;
        if (D.22892 != 32) goto <D.22893>; else goto <D.22894>;
        <D.22893>:
        D.22806 = ins->dreg;
        D.22807 = (unsigned int) D.22806;
        D.22808 = cfg->vreg_to_inst_len;
        if (D.22807 < D.22808) goto <D.22896>; else goto <D.22897>;
        <D.22896>:
        D.22811 = cfg->vreg_to_inst;
        D.22806 = ins->dreg;
        D.22812 = (unsigned int) D.22806;
        D.22813 = D.22812 * 4;
        D.22814 = D.22811 + D.22813;
        iftmp.52 = *D.22814;
        goto <D.22898>;
        <D.22897>:
        iftmp.52 = 0B;
        <D.22898>:
        var = iftmp.52;
        goto <D.22899>;
        <D.22894>:
        var = 0B;
        <D.22899>:
        c0 = 0B;
        state = evaluate_ins (cfg, ins, &c0, carray);
        if (var != 0B) goto <D.22902>; else goto <D.22900>;
        <D.22902>:
        D.22903 = var->flags;
        D.22904 = (int) D.22903;
        D.22905 = D.22904 & 20;
        if (D.22905 == 0) goto <D.22906>; else goto <D.22900>;
        <D.22906>:
        {
          struct MonoMethodVar * info;

          D.22804 = cfg->vars;
          D.22907 = var->data.op[0].const_val;
          D.22908 = (unsigned int) D.22907;
          D.22909 = D.22908 * 56;
          info = D.22804 + D.22909;
          D.22910 = info->cpstate;
          if (D.22910 <= 1) goto <D.22911>; else goto <D.22912>;
          <D.22911>:
          if (state == 1) goto <D.22913>; else goto <D.22914>;
          <D.22913>:
          c0.53 = c0;
          change_varstate (cfg, cvars, info, 1, c0.53, carray);
          goto <D.22916>;
          <D.22914>:
          if (state == 2) goto <D.22917>; else goto <D.22918>;
          <D.22917>:
          change_varstate (cfg, cvars, info, 2, 0B, carray);
          <D.22918>:
          <D.22916>:
          <D.22912>:
        }
        goto <D.22901>;
        <D.22900>:
        if (var == 0B) goto <D.22919>; else goto <D.22920>;
        <D.22919>:
        D.22806 = ins->dreg;
        if (D.22806 != -1) goto <D.22921>; else goto <D.22922>;
        <D.22921>:
        c0.53 = c0;
        if (c0.53 != 0B) goto <D.22923>; else goto <D.22924>;
        <D.22923>:
        D.22806 = ins->dreg;
        D.22812 = (unsigned int) D.22806;
        D.22813 = D.22812 * 4;
        D.22925 = carray + D.22813;
        c0.53 = c0;
        *D.22925 = c0.53;
        goto <D.22926>;
        <D.22924>:
        D.22806 = ins->dreg;
        D.22812 = (unsigned int) D.22806;
        D.22813 = D.22812 * 4;
        D.22925 = carray + D.22813;
        D.22927 = *D.22925;
        if (D.22927 != 0B) goto <D.22928>; else goto <D.22929>;
        <D.22928>:
        D.22806 = ins->dreg;
        D.22812 = (unsigned int) D.22806;
        D.22813 = D.22812 * 4;
        D.22925 = carray + D.22813;
        *D.22925 = 0B;
        D.22930 = *bblist;
        D.22931 = monoeg_g_list_find (D.22930, bb);
        if (D.22931 == 0B) goto <D.22932>; else goto <D.22933>;
        <D.22932>:
        D.22930 = *bblist;
        D.22934 = monoeg_g_list_prepend (D.22930, bb);
        *bblist = D.22934;
        <D.22933>:
        <D.22929>:
        <D.22926>:
        <D.22922>:
        <D.22920>:
        <D.22901>:
        D.22792 = ins->opcode;
        if (D.22792 == 731) goto <D.22935>; else goto <D.22938>;
        <D.22938>:
        D.22792 = ins->opcode;
        if (D.22792 == 732) goto <D.22939>; else goto <D.22936>;
        <D.22939>:
        D.22940 = ins->data.op[1].src;
        if (D.22940 == 8B) goto <D.22935>; else goto <D.22936>;
        <D.22936>:
        D.22792 = ins->opcode;
        if (D.22792 == 370) goto <D.22935>; else goto <D.22941>;
        <D.22941>:
        D.22792 = ins->opcode;
        if (D.22792 == 734) goto <D.22942>; else goto <D.22937>;
        <D.22942>:
        D.22940 = ins->data.op[1].src;
        D.22943 = D.22940->data.op[1].src;
        if (D.22943 == 8B) goto <D.22935>; else goto <D.22937>;
        <D.22935>:
        {
          int i;
          struct MonoJumpInfoBBTable * table;

          D.22792 = ins->opcode;
          if (D.22792 == 731) goto <D.22945>; else goto <D.22946>;
          <D.22945>:
          iftmp.54 = ins->data.op[0].p;
          goto <D.22947>;
          <D.22946>:
          D.22792 = ins->opcode;
          if (D.22792 == 732) goto <D.22951>; else goto <D.22949>;
          <D.22951>:
          D.22940 = ins->data.op[1].src;
          if (D.22940 == 8B) goto <D.22952>; else goto <D.22949>;
          <D.22952>:
          iftmp.55 = ins->data.op[0].p;
          goto <D.22950>;
          <D.22949>:
          D.22792 = ins->opcode;
          if (D.22792 == 370) goto <D.22954>; else goto <D.22955>;
          <D.22954>:
          iftmp.56 = ins->data.op[0].p;
          goto <D.22956>;
          <D.22955>:
          D.22792 = ins->opcode;
          if (D.22792 == 734) goto <D.22960>; else goto <D.22958>;
          <D.22960>:
          D.22940 = ins->data.op[1].src;
          D.22943 = D.22940->data.op[1].src;
          if (D.22943 == 8B) goto <D.22961>; else goto <D.22958>;
          <D.22961>:
          D.22940 = ins->data.op[1].src;
          iftmp.57 = D.22940->data.op[0].p;
          goto <D.22959>;
          <D.22958>:
          iftmp.57 = 0B;
          <D.22959>:
          iftmp.56 = iftmp.57;
          <D.22956>:
          iftmp.55 = iftmp.56;
          <D.22950>:
          iftmp.54 = iftmp.55;
          <D.22947>:
          table = iftmp.54;
          D.22964 = ins->next;
          if (D.22964 == 0B) goto <D.22962>; else goto <D.22965>;
          <D.22965>:
          D.22964 = ins->next;
          D.22966 = D.22964->opcode;
          if (D.22966 != 565) goto <D.22962>; else goto <D.22963>;
          <D.22962>:
          i = 0;
          goto <D.21799>;
          <D.21798>:
          D.22967 = table->table;
          i.58 = (unsigned int) i;
          D.22969 = i.58 * 4;
          D.22970 = D.22967 + D.22969;
          D.22971 = *D.22970;
          if (D.22971 != 0B) goto <D.22972>; else goto <D.22973>;
          <D.22972>:
          D.22967 = table->table;
          i.58 = (unsigned int) i;
          D.22969 = i.58 * 4;
          D.22970 = D.22967 + D.22969;
          D.22971 = *D.22970;
          add_cprop_bb (cfg, D.22971, bblist);
          <D.22973>:
          i = i + 1;
          <D.21799>:
          D.22974 = table->table_size;
          if (D.22974 > i) goto <D.21798>; else goto <D.21800>;
          <D.21800>:
          return;
          <D.22963>:
          D.22964 = ins->next;
          D.22966 = D.22964->opcode;
          D.22975 = D.22966 != 565;
          D.22976 = (long int) D.22975;
          D.22977 = __builtin_expect (D.22976, 0);
          if (D.22977 != 0) goto <D.22978>; else goto <D.22979>;
          <D.22978>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 955, "ins->next->opcode == OP_PADD");
          <D.22979>:
          D.22964 = ins->next;
          D.22980 = D.22964->sreg1;
          D.22806 = ins->dreg;
          D.22981 = D.22980 != D.22806;
          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", 956, "ins->next->sreg1 == ins->dreg");
          <D.22985>:
          D.22964 = ins->next;
          D.22986 = D.22964->sreg2;
          D.22987 = (unsigned int) D.22986;
          D.22988 = D.22987 * 4;
          D.22989 = carray + D.22988;
          D.22990 = *D.22989;
          if (D.22990 != 0B) goto <D.22991>; else goto <D.22992>;
          <D.22991>:
          {
            int idx;

            D.22964 = ins->next;
            D.22986 = D.22964->sreg2;
            D.22987 = (unsigned int) D.22986;
            D.22988 = D.22987 * 4;
            D.22989 = carray + D.22988;
            D.22990 = *D.22989;
            D.22993 = D.22990->data.op[0].const_val;
            idx = D.22993 >> 2;
            if (idx < 0) goto <D.22994>; else goto <D.22996>;
            <D.22996>:
            D.22974 = table->table_size;
            if (D.22974 <= idx) goto <D.22994>; else goto <D.22995>;
            <D.22994>:
            return;
            <D.22995>:
            D.22967 = table->table;
            idx.59 = (unsigned int) idx;
            D.22998 = idx.59 * 4;
            D.22999 = D.22967 + D.22998;
            D.23000 = *D.22999;
            if (D.23000 != 0B) goto <D.23001>; else goto <D.23002>;
            <D.23001>:
            D.22967 = table->table;
            idx.59 = (unsigned int) idx;
            D.22998 = idx.59 * 4;
            D.22999 = D.22967 + D.22998;
            D.23000 = *D.22999;
            add_cprop_bb (cfg, D.23000, bblist);
            <D.23002>:
          }
          goto <D.23003>;
          <D.22992>:
          i = 0;
          goto <D.21803>;
          <D.21802>:
          D.22967 = table->table;
          i.58 = (unsigned int) i;
          D.22969 = i.58 * 4;
          D.22970 = D.22967 + D.22969;
          D.22971 = *D.22970;
          if (D.22971 != 0B) goto <D.23004>; else goto <D.23005>;
          <D.23004>:
          D.22967 = table->table;
          i.58 = (unsigned int) i;
          D.22969 = i.58 * 4;
          D.22970 = D.22967 + D.22969;
          D.22971 = *D.22970;
          add_cprop_bb (cfg, D.22971, bblist);
          <D.23005>:
          i = i + 1;
          <D.21803>:
          D.22974 = table->table_size;
          if (D.22974 > i) goto <D.21802>; else goto <D.21804>;
          <D.21804>:
          <D.23003>:
        }
        <D.22937>:
        D.22792 = ins->opcode;
        if (D.22792 == 370) goto <D.23006>; else goto <D.23007>;
        <D.23006>:
        {
          int i;
          struct MonoJumpInfoBBTable * table;

          table = ins->data.op[0].p;
          i = 0;
          goto <D.21808>;
          <D.21807>:
          D.23008 = table->table;
          i.60 = (unsigned int) i;
          D.23010 = i.60 * 4;
          D.23011 = D.23008 + D.23010;
          D.23012 = *D.23011;
          if (D.23012 != 0B) goto <D.23013>; else goto <D.23014>;
          <D.23013>:
          D.23008 = table->table;
          i.60 = (unsigned int) i;
          D.23010 = i.60 * 4;
          D.23011 = D.23008 + D.23010;
          D.23012 = *D.23011;
          add_cprop_bb (cfg, D.23012, bblist);
          <D.23014>:
          i = i + 1;
          <D.21808>:
          D.23015 = table->table_size;
          if (D.23015 > i) goto <D.21807>; else goto <D.21809>;
          <D.21809>:
        }
        <D.23007>:
        D.22964 = ins->next;
        if (D.22964 != 0B) goto <D.23018>; else goto <D.23019>;
        <D.23018>:
        D.22964 = ins->next;
        D.22966 = D.22964->opcode;
        D.23020 = D.22966 + 64985;
        if (D.23020 <= 9) goto <D.23016>; else goto <D.23021>;
        <D.23021>:
        D.22964 = ins->next;
        D.22966 = D.22964->opcode;
        D.23022 = D.22966 + 64878;
        if (D.23022 <= 9) goto <D.23016>; else goto <D.23023>;
        <D.23023>:
        D.22964 = ins->next;
        D.22966 = D.22964->opcode;
        D.23024 = D.22966 + 64888;
        if (D.23024 <= 9) goto <D.23016>; else goto <D.23017>;
        <D.23016>:
        c0.53 = c0;
        if (c0.53 != 0B) goto <D.23025>; else goto <D.23026>;
        <D.23025>:
        c0.53 = c0;
        D.23027 = c0.53->opcode;
        D.23028 = D.23027 != 362;
        D.23029 = (long int) D.23028;
        D.23030 = __builtin_expect (D.23029, 0);
        if (D.23030 != 0) goto <D.23031>; else goto <D.23032>;
        <D.23031>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 990, "c0->opcode == OP_ICONST");
        <D.23032>:
        c0.53 = c0;
        D.23033 = c0.53->data.op[0].const_val;
        if (D.23033 != 0) goto <D.23034>; else goto <D.23035>;
        <D.23034>:
        D.22964 = ins->next;
        D.22964 = ins->next;
        D.23036 = D.22964->flags;
        D.23037 = D.23036 | 8;
        D.22964->flags = D.23037;
        goto <D.23038>;
        <D.23035>:
        D.22964 = ins->next;
        D.22964 = ins->next;
        D.23036 = D.22964->flags;
        D.23039 = D.23036 | 16;
        D.22964->flags = D.23039;
        <D.23038>:
        goto <D.23040>;
        <D.23026>:
        D.22964 = ins->next;
        D.22964 = ins->next;
        D.23036 = D.22964->flags;
        D.23041 = D.23036 & 231;
        D.22964->flags = D.23041;
        <D.23040>:
        D.22964 = ins->next;
        visit_inst (cfg, bb, D.22964, cvars, bblist, carray);
        <D.23017>:
        <D.23019>:
      }
    finally
      {
        c0 = {CLOBBER};
      }
  }
  goto <D.22883>;
  <D.22881>:
  D.22792 = ins->opcode;
  if (D.22792 == 442) goto <D.23042>; else goto <D.23043>;
  <D.23042>:
  D.23044 = ins->data.op[0].target_block;
  add_cprop_bb (cfg, D.23044, bblist);
  goto <D.23045>;
  <D.23043>:
  D.22792 = ins->opcode;
  D.23048 = D.22792 + 64985;
  if (D.23048 <= 9) goto <D.23046>; else goto <D.23049>;
  <D.23049>:
  D.22792 = ins->opcode;
  D.23050 = D.22792 + 64878;
  if (D.23050 <= 9) goto <D.23046>; else goto <D.23051>;
  <D.23051>:
  D.22792 = ins->opcode;
  D.23052 = D.22792 + 64888;
  if (D.23052 <= 9) goto <D.23046>; else goto <D.23047>;
  <D.23046>:
  D.23053 = ins->flags;
  D.23054 = (int) D.23053;
  D.23055 = D.23054 & 8;
  if (D.23055 != 0) goto <D.23056>; else goto <D.23057>;
  <D.23056>:
  D.23058 = ins->data.op[1].many_blocks;
  D.23059 = *D.23058;
  add_cprop_bb (cfg, D.23059, bblist);
  goto <D.23060>;
  <D.23057>:
  D.23053 = ins->flags;
  D.23054 = (int) D.23053;
  D.23061 = D.23054 & 16;
  if (D.23061 != 0) goto <D.23062>; else goto <D.23063>;
  <D.23062>:
  D.23058 = ins->data.op[1].many_blocks;
  D.23064 = D.23058 + 4;
  D.23065 = *D.23064;
  if (D.23065 != 0B) goto <D.23066>; else goto <D.23067>;
  <D.23066>:
  D.23058 = ins->data.op[1].many_blocks;
  D.23064 = D.23058 + 4;
  D.23065 = *D.23064;
  add_cprop_bb (cfg, D.23065, bblist);
  <D.23067>:
  goto <D.23068>;
  <D.23063>:
  D.23058 = ins->data.op[1].many_blocks;
  D.23059 = *D.23058;
  add_cprop_bb (cfg, D.23059, bblist);
  D.23058 = ins->data.op[1].many_blocks;
  D.23064 = D.23058 + 4;
  D.23065 = *D.23064;
  if (D.23065 != 0B) goto <D.23069>; else goto <D.23070>;
  <D.23069>:
  D.23058 = ins->data.op[1].many_blocks;
  D.23064 = D.23058 + 4;
  D.23065 = *D.23064;
  add_cprop_bb (cfg, D.23065, bblist);
  <D.23070>:
  <D.23068>:
  <D.23060>:
  <D.23047>:
  <D.23045>:
  <D.22883>:
  <D.22880>:
}


evaluate_ins (struct MonoCompile * cfg, struct MonoInst * ins, struct MonoInst * * res, struct MonoInst * * carray)
{
  short unsigned int D.23074;
  int D.23075;
  int D.23076;
  int D.23077;
  int D.23080;
  int D.23083;
  int D.23084;
  int D.23085;
  signed char D.23086;
  struct MonoInst * iftmp.61;
  int D.23088;
  unsigned int D.23089;
  unsigned int D.23090;
  struct MonoInst * * D.23093;
  unsigned int D.23094;
  unsigned int D.23095;
  struct MonoInst * * D.23096;
  struct MonoInst * * D.23098;
  struct MonoInst * D.23099;
  struct MonoInst * D.23100;
  unsigned char D.23106;
  int D.23107;
  int D.23108;
  struct MonoMethodVar * D.23111;
  int D.23112;
  unsigned int D.23113;
  unsigned int D.23114;
  struct MonoMethodVar * D.23115;
  char D.23116;
  int D.23117;
  int D.23118;
  _Bool D.23125;
  long int D.23126;
  long int D.23127;
  char D.23130;
  int D.23133;
  unsigned int D.23134;
  unsigned int D.23135;
  struct MonoInst * * D.23136;
  struct MonoInst * D.23137;
  struct MonoInst * D.23140;
  struct MonoInst * D.23141;
  unsigned int D.23144;
  _Bool D.23145;
  long int D.23146;
  long int D.23147;
  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.23074 = ins->opcode;
      D.23075 = (int) D.23074;
      D.23076 = D.23075 + -313;
      D.23077 = D.23076 * 4;
      spec = &ins_info[D.23077];
      D.23074 = ins->opcode;
      if (D.23074 == 362) goto <D.23078>; else goto <D.23079>;
      <D.23078>:
      *res = ins;
      D.23080 = 1;
      return D.23080;
      <D.23079>:
      D.23074 = ins->opcode;
      if (D.23074 == 316) goto <D.23081>; else goto <D.23082>;
      <D.23081>:
      D.23080 = 2;
      return D.23080;
      <D.23082>:
      D.23083 = ins->sreg1;
      sregs[0] = D.23083;
      D.23084 = ins->sreg2;
      sregs[1] = D.23084;
      D.23085 = ins->sreg3;
      sregs[2] = D.23085;
      D.23074 = ins->opcode;
      D.23075 = (int) D.23074;
      D.23076 = D.23075 + -313;
      D.23086 = ins_sreg_counts[D.23076];
      num_sregs = (int) D.23086;
      i = 0;
      goto <D.21751>;
      <D.21750>:
      args[i] = 0B;
      i = i + 1;
      <D.21751>:
      if (i <= 2) goto <D.21750>; else goto <D.21752>;
      <D.21752>:
      i = 0;
      goto <D.21755>;
      <D.21754>:
      {
        struct MonoInst * var;

        D.23088 = sregs[i];
        D.23089 = (unsigned int) D.23088;
        D.23090 = cfg->vreg_to_inst_len;
        if (D.23089 < D.23090) goto <D.23091>; else goto <D.23092>;
        <D.23091>:
        D.23093 = cfg->vreg_to_inst;
        D.23088 = sregs[i];
        D.23094 = (unsigned int) D.23088;
        D.23095 = D.23094 * 4;
        D.23096 = D.23093 + D.23095;
        iftmp.61 = *D.23096;
        goto <D.23097>;
        <D.23092>:
        iftmp.61 = 0B;
        <D.23097>:
        var = iftmp.61;
        rs[i] = 2;
        D.23088 = sregs[i];
        D.23094 = (unsigned int) D.23088;
        D.23095 = D.23094 * 4;
        D.23098 = carray + D.23095;
        D.23099 = *D.23098;
        args[i] = D.23099;
        D.23100 = args[i];
        if (D.23100 != 0B) goto <D.23101>; else goto <D.23102>;
        <D.23101>:
        rs[i] = 1;
        goto <D.23103>;
        <D.23102>:
        if (var != 0B) goto <D.23104>; else goto <D.23105>;
        <D.23104>:
        D.23106 = var->flags;
        D.23107 = (int) D.23106;
        D.23108 = D.23107 & 20;
        if (D.23108 == 0) goto <D.23109>; else goto <D.23110>;
        <D.23109>:
        D.23111 = cfg->vars;
        D.23112 = var->data.op[0].const_val;
        D.23113 = (unsigned int) D.23112;
        D.23114 = D.23113 * 56;
        D.23115 = D.23111 + D.23114;
        D.23116 = D.23115->cpstate;
        D.23117 = (int) D.23116;
        rs[i] = D.23117;
        <D.23110>:
        <D.23105>:
        <D.23103>:
        D.23118 = rs[i];
        if (D.23118 != 1) goto <D.23119>; else goto <D.23120>;
        <D.23119>:
        const_args = 0;
        <D.23120>:
      }
      i = i + 1;
      <D.21755>:
      if (i < num_sregs) goto <D.21754>; else goto <D.21756>;
      <D.21756>:
      c0 = 0B;
      if (num_sregs > 0) goto <D.23121>; else goto <D.23122>;
      <D.23121>:
      if (const_args != 0) goto <D.23123>; else goto <D.23124>;
      <D.23123>:
      D.23125 = num_sregs > 2;
      D.23126 = (long int) D.23125;
      D.23127 = __builtin_expect (D.23126, 0);
      if (D.23127 != 0) goto <D.23128>; else goto <D.23129>;
      <D.23128>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 776, "num_sregs <= 2");
      <D.23129>:
      D.23130 = *spec;
      if (D.23130 != 32) goto <D.23131>; else goto <D.23132>;
      <D.23131>:
      D.23133 = ins->dreg;
      D.23134 = (unsigned int) D.23133;
      D.23135 = D.23134 * 4;
      D.23136 = carray + D.23135;
      D.23137 = *D.23136;
      if (D.23137 != 0B) goto <D.23138>; else goto <D.23139>;
      <D.23138>:
      D.23133 = ins->dreg;
      D.23134 = (unsigned int) D.23133;
      D.23135 = D.23134 * 4;
      D.23136 = carray + D.23135;
      D.23137 = *D.23136;
      *res = D.23137;
      D.23080 = 1;
      return D.23080;
      <D.23139>:
      <D.23132>:
      D.23140 = args[0];
      D.23141 = args[1];
      c0 = mono_constant_fold_ins (cfg, ins, D.23140, D.23141, 0);
      if (c0 != 0B) goto <D.23142>; else goto <D.23143>;
      <D.23142>:
      D.23144 = cfg->verbose_level;
      D.23145 = D.23144 > 1;
      D.23146 = (long int) D.23145;
      D.23147 = __builtin_expect (D.23146, 0);
      if (D.23147 != 0) goto <D.23148>; else goto <D.23149>;
      <D.23148>:
      printf ("\t cfold -> ");
      mono_print_ins (c0);
      <D.23149>:
      *res = c0;
      D.23080 = 1;
      return D.23080;
      <D.23143>:
      D.23080 = 2;
      return D.23080;
      <D.23124>:
      <D.23122>:
      if (num_sregs == 0) goto <D.23150>; else goto <D.23151>;
      <D.23150>:
      D.23080 = 2;
      return D.23080;
      <D.23151>:
      i = 0;
      goto <D.21758>;
      <D.21757>:
      D.23118 = rs[i];
      if (D.23118 == 2) goto <D.23152>; else goto <D.23153>;
      <D.23152>:
      D.23080 = 2;
      return D.23080;
      <D.23153>:
      i = i + 1;
      <D.21758>:
      if (i < num_sregs) goto <D.21757>; else goto <D.21759>;
      <D.21759>:
      D.23080 = 0;
      return D.23080;
    }
  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.23156;
  int D.23157;
  char D.23160;
  unsigned int D.23161;
  _Bool D.23162;
  long int D.23163;
  long int D.23164;
  struct MonoInst * * D.23167;
  unsigned int D.23168;
  unsigned int D.23169;
  struct MonoInst * * D.23170;
  struct MonoInst * D.23171;
  int D.23172;
  _Bool D.23175;
  long int D.23176;
  long int D.23177;
  unsigned int D.23180;
  unsigned int D.23181;
  struct MonoInst * * D.23182;
  struct GList * D.23183;
  struct GList * D.23184;
  struct GList * D.23187;

  D.23156 = info->cpstate;
  D.23157 = (int) D.23156;
  if (D.23157 >= state) goto <D.23158>; else goto <D.23159>;
  <D.23158>:
  return;
  <D.23159>:
  D.23160 = (char) state;
  info->cpstate = D.23160;
  D.23161 = cfg->verbose_level;
  D.23162 = D.23161 > 1;
  D.23163 = (long int) D.23162;
  D.23164 = __builtin_expect (D.23163, 0);
  if (D.23164 != 0) goto <D.23165>; else goto <D.23166>;
  <D.23165>:
  D.23167 = cfg->varinfo;
  D.23168 = info->idx;
  D.23169 = D.23168 * 4;
  D.23170 = D.23167 + D.23169;
  D.23171 = *D.23170;
  D.23172 = D.23171->dreg;
  D.23156 = info->cpstate;
  D.23157 = (int) D.23156;
  printf ("\tState of R%d set to %d\n", D.23172, D.23157);
  <D.23166>:
  if (state == 1) goto <D.23173>; else goto <D.23174>;
  <D.23173>:
  D.23175 = c0 == 0B;
  D.23176 = (long int) D.23175;
  D.23177 = __builtin_expect (D.23176, 0);
  if (D.23177 != 0) goto <D.23178>; else goto <D.23179>;
  <D.23178>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 817, "c0");
  <D.23179>:
  <D.23174>:
  D.23167 = cfg->varinfo;
  D.23168 = info->idx;
  D.23169 = D.23168 * 4;
  D.23170 = D.23167 + D.23169;
  D.23171 = *D.23170;
  D.23172 = D.23171->dreg;
  D.23180 = (unsigned int) D.23172;
  D.23181 = D.23180 * 4;
  D.23182 = carray + D.23181;
  *D.23182 = c0;
  D.23183 = *cvars;
  D.23184 = monoeg_g_list_find (D.23183, info);
  if (D.23184 == 0B) goto <D.23185>; else goto <D.23186>;
  <D.23185>:
  D.23183 = *cvars;
  D.23187 = monoeg_g_list_prepend (D.23183, info);
  *cvars = D.23187;
  <D.23186>:
}


fold_ins (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoInst * ins, struct MonoInst * * carray)
{
  short unsigned int D.23189;
  int D.23190;
  int D.23191;
  int D.23192;
  signed char D.23193;
  int D.23197;
  short unsigned int D.23199;
  unsigned int D.23203;
  unsigned int D.23204;
  struct MonoInst * * D.23205;
  struct MonoInst * D.23206;
  char D.23208;
  short unsigned int D.23211;
  _Bool D.23212;
  long int D.23213;
  long int D.23214;
  int D.23217;
  int D.23218;
  int D.23219;
  unsigned int D.23222;
  unsigned int D.23223;
  struct MonoInst * * D.23224;
  struct MonoInst * D.23225;
  short unsigned int D.23230;
  int D.23231;
  int D.23237;
  const void * D.23238;
  struct MonoInst * D.23245;
  struct MonoInst * D.23248;
  struct MonoJumpInfoBBTable * iftmp.62;
  struct MonoJumpInfoBBTable * iftmp.63;
  struct MonoJumpInfoBBTable * iftmp.64;
  struct MonoJumpInfoBBTable * iftmp.65;
  struct MonoInst * D.23269;
  short unsigned int D.23271;
  _Bool D.23272;
  long int D.23273;
  long int D.23274;
  int D.23277;
  _Bool D.23278;
  long int D.23279;
  long int D.23280;
  struct MonoInst * D.23283;
  short unsigned int D.23284;
  _Bool D.23285;
  long int D.23286;
  long int D.23287;
  int D.23290;
  unsigned int D.23291;
  unsigned int D.23292;
  struct MonoInst * * D.23293;
  struct MonoInst * D.23294;
  int D.23297;
  int D.23301;
  struct MonoBasicBlock * * D.23302;
  unsigned int i.66;
  unsigned int D.23304;
  struct MonoBasicBlock * * D.23305;
  struct MonoBasicBlock * D.23306;
  int D.23307;
  int D.23308;
  int D.23309;
  struct MonoInst * D.23310;
  int D.23313;
  int D.23314;
  short unsigned int D.23318;
  unsigned int D.23319;
  _Bool D.23320;
  long int D.23321;
  long int D.23322;
  unsigned int idx.67;
  unsigned int D.23328;
  struct MonoBasicBlock * * D.23329;
  struct MonoBasicBlock * D.23330;
  short unsigned int D.23335;
  short unsigned int D.23337;
  short unsigned int D.23339;
  unsigned char D.23340;
  int D.23341;
  int D.23342;
  struct MonoBasicBlock * * D.23345;
  struct MonoBasicBlock * * D.23346;
  struct MonoBasicBlock * D.23347;
  struct MonoBasicBlock * D.23348;
  int D.23350;
  struct MonoBasicBlock * D.23353;
  const char * spec;
  int opcode2;
  int num_sregs;

  D.23189 = ins->opcode;
  D.23190 = (int) D.23189;
  D.23191 = D.23190 + -313;
  D.23192 = D.23191 * 4;
  spec = &ins_info[D.23192];
  D.23189 = ins->opcode;
  D.23190 = (int) D.23189;
  D.23191 = D.23190 + -313;
  D.23193 = ins_sreg_counts[D.23191];
  num_sregs = (int) D.23193;
  D.23189 = ins->opcode;
  if (D.23189 != 316) goto <D.23196>; else goto <D.23194>;
  <D.23196>:
  D.23197 = ins->dreg;
  if (D.23197 != -1) goto <D.23198>; else goto <D.23194>;
  <D.23198>:
  D.23189 = ins->opcode;
  D.23199 = D.23189 + 65162;
  if (D.23199 > 13) goto <D.23200>; else goto <D.23194>;
  <D.23200>:
  D.23197 = ins->dreg;
  D.23203 = (unsigned int) D.23197;
  D.23204 = D.23203 * 4;
  D.23205 = carray + D.23204;
  D.23206 = *D.23205;
  if (D.23206 != 0B) goto <D.23207>; else goto <D.23201>;
  <D.23207>:
  D.23208 = *spec;
  if (D.23208 == 105) goto <D.23209>; else goto <D.23201>;
  <D.23209>:
  D.23197 = ins->dreg;
  if (D.23197 > 31) goto <D.23210>; else goto <D.23201>;
  <D.23210>:
  D.23197 = ins->dreg;
  D.23203 = (unsigned int) D.23197;
  D.23204 = D.23203 * 4;
  D.23205 = carray + D.23204;
  D.23206 = *D.23205;
  D.23211 = D.23206->opcode;
  D.23212 = D.23211 != 362;
  D.23213 = (long int) D.23212;
  D.23214 = __builtin_expect (D.23213, 0);
  if (D.23214 != 0) goto <D.23215>; else goto <D.23216>;
  <D.23215>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1035, "carray [ins->dreg]->opcode == OP_ICONST");
  <D.23216>:
  ins->opcode = 362;
  D.23197 = ins->dreg;
  D.23203 = (unsigned int) D.23197;
  D.23204 = D.23203 * 4;
  D.23205 = carray + D.23204;
  D.23206 = *D.23205;
  D.23217 = D.23206->data.op[0].const_val;
  ins->data.op[0].const_val = D.23217;
  ins->sreg3 = -1;
  D.23218 = ins->sreg3;
  ins->sreg2 = D.23218;
  D.23219 = ins->sreg2;
  ins->sreg1 = D.23219;
  goto <D.23202>;
  <D.23201>:
  if (num_sregs == 2) goto <D.23220>; else goto <D.23221>;
  <D.23220>:
  D.23219 = ins->sreg2;
  D.23222 = (unsigned int) D.23219;
  D.23223 = D.23222 * 4;
  D.23224 = carray + D.23223;
  D.23225 = *D.23224;
  if (D.23225 != 0B) goto <D.23226>; else goto <D.23227>;
  <D.23226>:
  D.23189 = ins->opcode;
  D.23190 = (int) D.23189;
  opcode2 = mono_op_to_op_imm (D.23190);
  if (opcode2 != -1) goto <D.23228>; else goto <D.23229>;
  <D.23228>:
  D.23230 = (short unsigned int) opcode2;
  ins->opcode = D.23230;
  D.23219 = ins->sreg2;
  D.23222 = (unsigned int) D.23219;
  D.23223 = D.23222 * 4;
  D.23224 = carray + D.23223;
  D.23225 = *D.23224;
  D.23231 = D.23225->data.op[0].const_val;
  ins->data.op[1].const_val = D.23231;
  ins->sreg2 = -1;
  if (opcode2 == 343) goto <D.23232>; else goto <D.23234>;
  <D.23234>:
  if (opcode2 == 346) goto <D.23232>; else goto <D.23235>;
  <D.23235>:
  if (opcode2 == 352) goto <D.23232>; else goto <D.23236>;
  <D.23236>:
  if (opcode2 == 349) goto <D.23232>; else goto <D.23233>;
  <D.23232>:
  D.23237 = ins->data.op[1].const_val;
  D.23238 = (const void *) D.23237;
  MEM[(struct MonoCallInst *)ins].fptr = D.23238;
  <D.23233>:
  <D.23229>:
  goto <D.23239>;
  <D.23227>:
  <D.23239>:
  <D.23221>:
  <D.23202>:
  D.23189 = ins->opcode;
  if (D.23189 == 731) goto <D.23240>; else goto <D.23243>;
  <D.23243>:
  D.23189 = ins->opcode;
  if (D.23189 == 732) goto <D.23244>; else goto <D.23241>;
  <D.23244>:
  D.23245 = ins->data.op[1].src;
  if (D.23245 == 8B) goto <D.23240>; else goto <D.23241>;
  <D.23241>:
  D.23189 = ins->opcode;
  if (D.23189 == 370) goto <D.23240>; else goto <D.23246>;
  <D.23246>:
  D.23189 = ins->opcode;
  if (D.23189 == 734) goto <D.23247>; else goto <D.23242>;
  <D.23247>:
  D.23245 = ins->data.op[1].src;
  D.23248 = D.23245->data.op[1].src;
  if (D.23248 == 8B) goto <D.23240>; else goto <D.23242>;
  <D.23240>:
  {
    int i;
    struct MonoJumpInfoBBTable * table;

    D.23189 = ins->opcode;
    if (D.23189 == 731) goto <D.23250>; else goto <D.23251>;
    <D.23250>:
    iftmp.62 = ins->data.op[0].p;
    goto <D.23252>;
    <D.23251>:
    D.23189 = ins->opcode;
    if (D.23189 == 732) goto <D.23256>; else goto <D.23254>;
    <D.23256>:
    D.23245 = ins->data.op[1].src;
    if (D.23245 == 8B) goto <D.23257>; else goto <D.23254>;
    <D.23257>:
    iftmp.63 = ins->data.op[0].p;
    goto <D.23255>;
    <D.23254>:
    D.23189 = ins->opcode;
    if (D.23189 == 370) goto <D.23259>; else goto <D.23260>;
    <D.23259>:
    iftmp.64 = ins->data.op[0].p;
    goto <D.23261>;
    <D.23260>:
    D.23189 = ins->opcode;
    if (D.23189 == 734) goto <D.23265>; else goto <D.23263>;
    <D.23265>:
    D.23245 = ins->data.op[1].src;
    D.23248 = D.23245->data.op[1].src;
    if (D.23248 == 8B) goto <D.23266>; else goto <D.23263>;
    <D.23266>:
    D.23245 = ins->data.op[1].src;
    iftmp.65 = D.23245->data.op[0].p;
    goto <D.23264>;
    <D.23263>:
    iftmp.65 = 0B;
    <D.23264>:
    iftmp.64 = iftmp.65;
    <D.23261>:
    iftmp.63 = iftmp.64;
    <D.23255>:
    iftmp.62 = iftmp.63;
    <D.23252>:
    table = iftmp.62;
    D.23269 = ins->next;
    if (D.23269 == 0B) goto <D.23267>; else goto <D.23270>;
    <D.23270>:
    D.23269 = ins->next;
    D.23271 = D.23269->opcode;
    if (D.23271 != 565) goto <D.23267>; else goto <D.23268>;
    <D.23267>:
    return;
    <D.23268>:
    D.23269 = ins->next;
    D.23271 = D.23269->opcode;
    D.23272 = D.23271 != 565;
    D.23273 = (long int) D.23272;
    D.23274 = __builtin_expect (D.23273, 0);
    if (D.23274 != 0) goto <D.23275>; else goto <D.23276>;
    <D.23275>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1064, "ins->next->opcode == OP_PADD");
    <D.23276>:
    D.23269 = ins->next;
    D.23277 = D.23269->sreg1;
    D.23197 = ins->dreg;
    D.23278 = D.23277 != D.23197;
    D.23279 = (long int) D.23278;
    D.23280 = __builtin_expect (D.23279, 0);
    if (D.23280 != 0) goto <D.23281>; else goto <D.23282>;
    <D.23281>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1065, "ins->next->sreg1 == ins->dreg");
    <D.23282>:
    D.23269 = ins->next;
    D.23283 = D.23269->next;
    D.23284 = D.23283->opcode;
    D.23285 = D.23284 != 388;
    D.23286 = (long int) D.23285;
    D.23287 = __builtin_expect (D.23286, 0);
    if (D.23287 != 0) goto <D.23288>; else goto <D.23289>;
    <D.23288>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1066, "ins->next->next->opcode == OP_LOAD_MEMBASE");
    <D.23289>:
    D.23269 = ins->next;
    D.23290 = D.23269->sreg2;
    D.23291 = (unsigned int) D.23290;
    D.23292 = D.23291 * 4;
    D.23293 = carray + D.23292;
    D.23294 = *D.23293;
    if (D.23294 != 0B) goto <D.23295>; else goto <D.23296>;
    <D.23295>:
    {
      int idx;

      D.23269 = ins->next;
      D.23290 = D.23269->sreg2;
      D.23291 = (unsigned int) D.23290;
      D.23292 = D.23291 * 4;
      D.23293 = carray + D.23292;
      D.23294 = *D.23293;
      D.23297 = D.23294->data.op[0].const_val;
      idx = D.23297 >> 2;
      if (idx < 0) goto <D.23298>; else goto <D.23300>;
      <D.23300>:
      D.23301 = table->table_size;
      if (D.23301 <= idx) goto <D.23298>; else goto <D.23299>;
      <D.23298>:
      i = 0;
      goto <D.21823>;
      <D.21822>:
      D.23302 = table->table;
      i.66 = (unsigned int) i;
      D.23304 = i.66 * 4;
      D.23305 = D.23302 + D.23304;
      D.23306 = *D.23305;
      remove_bb_from_phis (cfg, bb, D.23306);
      D.23302 = table->table;
      i.66 = (unsigned int) i;
      D.23304 = i.66 * 4;
      D.23305 = D.23302 + D.23304;
      D.23306 = *D.23305;
      mono_unlink_bblock (cfg, bb, D.23306);
      i = i + 1;
      <D.21823>:
      D.23301 = table->table_size;
      if (D.23301 > i) goto <D.21822>; else goto <D.21824>;
      <D.21824>:
      ins->opcode = 316;
      ins->dreg = -1;
      ins->sreg3 = -1;
      D.23218 = ins->sreg3;
      ins->sreg2 = D.23218;
      D.23219 = ins->sreg2;
      ins->sreg1 = D.23219;
      D.23269 = ins->next;
      D.23269->opcode = 316;
      D.23269 = ins->next;
      D.23269->dreg = -1;
      D.23269 = ins->next;
      D.23269 = ins->next;
      D.23269 = ins->next;
      D.23269->sreg3 = -1;
      D.23307 = D.23269->sreg3;
      D.23269->sreg2 = D.23307;
      D.23290 = D.23269->sreg2;
      D.23269->sreg1 = D.23290;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23283->opcode = 316;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23283->dreg = -1;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23283->sreg3 = -1;
      D.23308 = D.23283->sreg3;
      D.23283->sreg2 = D.23308;
      D.23309 = D.23283->sreg2;
      D.23283->sreg1 = D.23309;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      if (D.23310 != 0B) goto <D.23311>; else goto <D.23312>;
      <D.23311>:
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23310->opcode = 316;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23310->dreg = -1;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23310->sreg3 = -1;
      D.23313 = D.23310->sreg3;
      D.23310->sreg2 = D.23313;
      D.23314 = D.23310->sreg2;
      D.23310->sreg1 = D.23314;
      <D.23312>:
      return;
      <D.23299>:
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      if (D.23310 == 0B) goto <D.23315>; else goto <D.23317>;
      <D.23317>:
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23318 = D.23310->opcode;
      if (D.23318 != 759) goto <D.23315>; else goto <D.23316>;
      <D.23315>:
      D.23319 = cfg->verbose_level;
      D.23320 = D.23319 > 1;
      D.23321 = (long int) D.23320;
      D.23322 = __builtin_expect (D.23321, 0);
      if (D.23322 != 0) goto <D.23323>; else goto <D.23324>;
      <D.23323>:
      printf ("\tNo cfold on ");
      mono_print_ins (ins);
      <D.23324>:
      return;
      <D.23316>:
      D.23319 = cfg->verbose_level;
      D.23320 = D.23319 > 1;
      D.23321 = (long int) D.23320;
      D.23322 = __builtin_expect (D.23321, 0);
      if (D.23322 != 0) goto <D.23325>; else goto <D.23326>;
      <D.23325>:
      printf ("\tcfold on ");
      mono_print_ins (ins);
      <D.23326>:
      i = 0;
      goto <D.21826>;
      <D.21825>:
      D.23302 = table->table;
      i.66 = (unsigned int) i;
      D.23304 = i.66 * 4;
      D.23305 = D.23302 + D.23304;
      D.23306 = *D.23305;
      D.23302 = table->table;
      idx.67 = (unsigned int) idx;
      D.23328 = idx.67 * 4;
      D.23329 = D.23302 + D.23328;
      D.23330 = *D.23329;
      if (D.23306 != D.23330) goto <D.23331>; else goto <D.23332>;
      <D.23331>:
      D.23302 = table->table;
      i.66 = (unsigned int) i;
      D.23304 = i.66 * 4;
      D.23305 = D.23302 + D.23304;
      D.23306 = *D.23305;
      remove_bb_from_phis (cfg, bb, D.23306);
      D.23302 = table->table;
      i.66 = (unsigned int) i;
      D.23304 = i.66 * 4;
      D.23305 = D.23302 + D.23304;
      D.23306 = *D.23305;
      mono_unlink_bblock (cfg, bb, D.23306);
      <D.23332>:
      i = i + 1;
      <D.21826>:
      D.23301 = table->table_size;
      if (D.23301 > i) goto <D.21825>; else goto <D.21827>;
      <D.21827>:
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23310->opcode = 442;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23302 = table->table;
      idx.67 = (unsigned int) idx;
      D.23328 = idx.67 * 4;
      D.23329 = D.23302 + D.23328;
      D.23330 = *D.23329;
      D.23310->data.op[0].target_block = D.23330;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23310 = D.23283->next;
      D.23310->sreg1 = -1;
      ins->opcode = 316;
      ins->dreg = -1;
      ins->sreg3 = -1;
      D.23218 = ins->sreg3;
      ins->sreg2 = D.23218;
      D.23219 = ins->sreg2;
      ins->sreg1 = D.23219;
      D.23269 = ins->next;
      D.23269->opcode = 316;
      D.23269 = ins->next;
      D.23269->dreg = -1;
      D.23269 = ins->next;
      D.23269 = ins->next;
      D.23269 = ins->next;
      D.23269->sreg3 = -1;
      D.23307 = D.23269->sreg3;
      D.23269->sreg2 = D.23307;
      D.23290 = D.23269->sreg2;
      D.23269->sreg1 = D.23290;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23283->opcode = 316;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23283->dreg = -1;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23269 = ins->next;
      D.23283 = D.23269->next;
      D.23283->sreg3 = -1;
      D.23308 = D.23283->sreg3;
      D.23283->sreg2 = D.23308;
      D.23309 = D.23283->sreg2;
      D.23283->sreg1 = D.23309;
    }
    <D.23296>:
  }
  <D.23242>:
  goto <D.23195>;
  <D.23194>:
  D.23189 = ins->opcode;
  D.23335 = D.23189 + 64985;
  if (D.23335 <= 9) goto <D.23333>; else goto <D.23336>;
  <D.23336>:
  D.23189 = ins->opcode;
  D.23337 = D.23189 + 64878;
  if (D.23337 <= 9) goto <D.23333>; else goto <D.23338>;
  <D.23338>:
  D.23189 = ins->opcode;
  D.23339 = D.23189 + 64888;
  if (D.23339 <= 9) goto <D.23333>; else goto <D.23334>;
  <D.23333>:
  D.23340 = ins->flags;
  D.23341 = (int) D.23340;
  D.23342 = D.23341 & 8;
  if (D.23342 != 0) goto <D.23343>; else goto <D.23344>;
  <D.23343>:
  D.23345 = ins->data.op[1].many_blocks;
  D.23346 = D.23345 + 4;
  D.23347 = *D.23346;
  remove_bb_from_phis (cfg, bb, D.23347);
  D.23345 = ins->data.op[1].many_blocks;
  D.23346 = D.23345 + 4;
  D.23347 = *D.23346;
  mono_unlink_bblock (cfg, bb, D.23347);
  ins->opcode = 442;
  D.23345 = ins->data.op[1].many_blocks;
  D.23348 = *D.23345;
  ins->data.op[0].target_block = D.23348;
  goto <D.23349>;
  <D.23344>:
  D.23340 = ins->flags;
  D.23341 = (int) D.23340;
  D.23350 = D.23341 & 16;
  if (D.23350 != 0) goto <D.23351>; else goto <D.23352>;
  <D.23351>:
  D.23345 = ins->data.op[1].many_blocks;
  D.23348 = *D.23345;
  remove_bb_from_phis (cfg, bb, D.23348);
  D.23345 = ins->data.op[1].many_blocks;
  D.23348 = *D.23345;
  mono_unlink_bblock (cfg, bb, D.23348);
  ins->opcode = 442;
  D.23345 = ins->data.op[1].many_blocks;
  D.23353 = MEM[(struct MonoBasicBlock * *)D.23345 + 4B];
  ins->data.op[0].target_block = D.23353;
  <D.23352>:
  <D.23349>:
  <D.23334>:
  <D.23195>:
}


remove_bb_from_phis (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoBasicBlock * target)
{
  struct MonoBasicBlock * * D.23355;
  unsigned int i.68;
  unsigned int D.23357;
  struct MonoBasicBlock * * D.23358;
  struct MonoBasicBlock * D.23359;
  short int D.23361;
  int D.23362;
  _Bool D.23363;
  long int D.23364;
  long int D.23365;
  short unsigned int D.23368;
  short unsigned int D.23369;
  int * D.23371;
  sizetype j.69;
  sizetype D.23373;
  sizetype D.23374;
  int * D.23375;
  sizetype D.23376;
  sizetype D.23377;
  int * D.23378;
  int D.23379;
  int D.23380;
  int D.23381;
  struct MonoInst * ins;
  int i;
  int j;

  i = 0;
  goto <D.21501>;
  <D.21500>:
  D.23355 = target->in_bb;
  i.68 = (unsigned int) i;
  D.23357 = i.68 * 4;
  D.23358 = D.23355 + D.23357;
  D.23359 = *D.23358;
  if (D.23359 == bb) goto <D.21499>; else goto <D.23360>;
  <D.23360>:
  i = i + 1;
  <D.21501>:
  D.23361 = target->in_count;
  D.23362 = (int) D.23361;
  if (D.23362 > i) goto <D.21500>; else goto <D.21499>;
  <D.21499>:
  D.23361 = target->in_count;
  D.23362 = (int) D.23361;
  D.23363 = D.23362 <= i;
  D.23364 = (long int) D.23363;
  D.23365 = __builtin_expect (D.23364, 0);
  if (D.23365 != 0) goto <D.23366>; else goto <D.23367>;
  <D.23366>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 111, "i < target->in_count");
  <D.23367>:
  ins = target->code;
  goto <D.21507>;
  <D.21506>:
  D.23368 = ins->opcode;
  D.23369 = D.23368 + 65217;
  if (D.23369 <= 2) goto <D.23370>; else goto <D.21505>;
  <D.23370>:
  j = i;
  goto <D.21503>;
  <D.21502>:
  D.23371 = ins->data.op[1].phi_args;
  j.69 = (sizetype) j;
  D.23373 = j.69 + 1;
  D.23374 = D.23373 * 4;
  D.23375 = D.23371 + D.23374;
  D.23371 = ins->data.op[1].phi_args;
  j.69 = (sizetype) j;
  D.23376 = j.69 + 2;
  D.23377 = D.23376 * 4;
  D.23378 = D.23371 + D.23377;
  D.23379 = *D.23378;
  *D.23375 = D.23379;
  j = j + 1;
  <D.21503>:
  D.23371 = ins->data.op[1].phi_args;
  D.23380 = *D.23371;
  D.23381 = D.23380 + -1;
  if (D.23381 > j) goto <D.21502>; else goto <D.21504>;
  <D.21504>:
  D.23371 = ins->data.op[1].phi_args;
  D.23380 = *D.23371;
  D.23381 = D.23380 + -1;
  *D.23371 = D.23381;
  ins = ins->next;
  <D.21507>:
  if (ins != 0B) goto <D.21506>; else goto <D.21505>;
  <D.21505>:
}


mono_ssa_deadce (struct MonoCompile * cfg)
{
  unsigned int D.23382;
  unsigned int D.23383;
  _Bool D.23384;
  long int D.23385;
  long int D.23386;
  unsigned int D.23389;
  struct MonoMethodVar * D.23392;
  unsigned int i.70;
  unsigned int D.23394;
  struct MonoMemPool * D.23395;
  struct GList * work_list.71;
  struct GList * work_list.72;
  unsigned int i.73;
  unsigned int D.23399;
  struct GList * work_list.74;
  struct MonoInst * D.23403;
  struct GList * D.23406;
  struct GList * D.23408;
  void * D.23410;
  struct MonoInst * D.23411;
  short unsigned int D.23415;
  struct MonoInst * iftmp.75;
  int D.23419;
  unsigned int D.23420;
  unsigned int D.23421;
  struct MonoInst * * D.23424;
  unsigned int D.23425;
  unsigned int D.23426;
  struct MonoInst * * D.23427;
  unsigned char D.23431;
  int D.23432;
  int D.23433;
  int D.23436;
  unsigned int D.23437;
  unsigned int D.23438;
  struct MonoMethodVar * D.23439;
  int D.23440;
  short unsigned int D.23444;
  short unsigned int D.23446;
  int * D.23449;
  struct MonoInst * iftmp.76;
  unsigned int j.77;
  unsigned int D.23452;
  int * D.23453;
  int D.23454;
  unsigned int D.23455;
  unsigned int D.23458;
  unsigned int D.23459;
  struct MonoInst * * D.23460;
  int D.23462;
  unsigned int D.23463;
  unsigned int D.23464;
  int i;
  struct GList * work_list;

  try
    {
      D.23382 = cfg->comp_done;
      D.23383 = D.23382 & 32;
      D.23384 = D.23383 == 0;
      D.23385 = (long int) D.23384;
      D.23386 = __builtin_expect (D.23385, 0);
      if (D.23386 != 0) goto <D.23387>; else goto <D.23388>;
      <D.23387>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1259, "cfg->comp_done & MONO_COMP_SSA");
      <D.23388>:
      D.23382 = cfg->comp_done;
      D.23389 = D.23382 & 64;
      if (D.23389 == 0) goto <D.23390>; else goto <D.23391>;
      <D.23390>:
      mono_ssa_create_def_use (cfg);
      <D.23391>:
      mono_ssa_copyprop (cfg);
      work_list = 0B;
      i = 0;
      goto <D.21892>;
      <D.21891>:
      {
        struct MonoMethodVar * info;

        D.23392 = cfg->vars;
        i.70 = (unsigned int) i;
        D.23394 = i.70 * 56;
        info = D.23392 + D.23394;
        D.23395 = cfg->mempool;
        work_list.71 = work_list;
        work_list.72 = g_list_prepend_mempool (D.23395, work_list.71, info);
        work_list = work_list.72;
      }
      i = i + 1;
      <D.21892>:
      i.73 = (unsigned int) i;
      D.23399 = cfg->num_varinfo;
      if (i.73 < D.23399) goto <D.21891>; else goto <D.21893>;
      <D.21893>:
      goto <D.21903>;
      <D.21902>:
      {
        struct MonoMethodVar * info;

        work_list.71 = work_list;
        info = work_list.71->data;
        work_list.71 = work_list;
        work_list.71 = work_list;
        work_list.74 = monoeg_g_list_remove_link (work_list.71, work_list.71);
        work_list = work_list.74;
        D.23403 = info->def;
        if (D.23403 != 0B) goto <D.23404>; else goto <D.23405>;
        <D.23404>:
        D.23406 = info->uses;
        if (D.23406 == 0B) goto <D.23401>; else goto <D.23407>;
        <D.23407>:
        D.23406 = info->uses;
        D.23408 = D.23406->next;
        if (D.23408 == 0B) goto <D.23409>; else goto <D.23402>;
        <D.23409>:
        D.23406 = info->uses;
        D.23410 = D.23406->data;
        D.23411 = MEM[(struct MonoVarUsageInfo *)D.23410].inst;
        D.23403 = info->def;
        if (D.23411 == D.23403) goto <D.23401>; else goto <D.23402>;
        <D.23401>:
        {
          struct MonoInst * def;

          def = info->def;
          D.23415 = def->opcode;
          if (D.23415 == 424) goto <D.23412>; else goto <D.23416>;
          <D.23416>:
          D.23415 = def->opcode;
          if (D.23415 == 426) goto <D.23412>; else goto <D.23417>;
          <D.23417>:
          D.23415 = def->opcode;
          if (D.23415 == 427) goto <D.23412>; else goto <D.23413>;
          <D.23412>:
          {
            struct MonoInst * src_var;

            D.23419 = def->sreg1;
            D.23420 = (unsigned int) D.23419;
            D.23421 = cfg->vreg_to_inst_len;
            if (D.23420 < D.23421) goto <D.23422>; else goto <D.23423>;
            <D.23422>:
            D.23424 = cfg->vreg_to_inst;
            D.23419 = def->sreg1;
            D.23425 = (unsigned int) D.23419;
            D.23426 = D.23425 * 4;
            D.23427 = D.23424 + D.23426;
            iftmp.75 = *D.23427;
            goto <D.23428>;
            <D.23423>:
            iftmp.75 = 0B;
            <D.23428>:
            src_var = iftmp.75;
            if (src_var != 0B) goto <D.23429>; else goto <D.23430>;
            <D.23429>:
            D.23431 = src_var->flags;
            D.23432 = (int) D.23431;
            D.23433 = D.23432 & 20;
            if (D.23433 == 0) goto <D.23434>; else goto <D.23435>;
            <D.23434>:
            D.23392 = cfg->vars;
            D.23436 = src_var->data.op[0].const_val;
            D.23437 = (unsigned int) D.23436;
            D.23438 = D.23437 * 56;
            D.23439 = D.23392 + D.23438;
            add_to_dce_worklist (cfg, info, D.23439, &work_list);
            <D.23435>:
            <D.23430>:
            def->opcode = 316;
            def->sreg2 = -1;
            D.23440 = def->sreg2;
            def->sreg1 = D.23440;
            D.23419 = def->sreg1;
            def->dreg = D.23419;
            info->reg = -1;
          }
          goto <D.23414>;
          <D.23413>:
          D.23415 = def->opcode;
          D.23444 = D.23415 + 65174;
          if (D.23444 <= 1) goto <D.23441>; else goto <D.23445>;
          <D.23445>:
          D.23415 = def->opcode;
          if (D.23415 == 428) goto <D.23441>; else goto <D.23442>;
          <D.23441>:
          def->opcode = 316;
          def->sreg2 = -1;
          D.23440 = def->sreg2;
          def->sreg1 = D.23440;
          D.23419 = def->sreg1;
          def->dreg = D.23419;
          info->reg = -1;
          goto <D.23443>;
          <D.23442>:
          D.23415 = def->opcode;
          D.23446 = D.23415 + 65217;
          if (D.23446 <= 2) goto <D.23447>; else goto <D.23448>;
          <D.23447>:
          {
            int j;

            D.23449 = def->data.op[1].phi_args;
            j = *D.23449;
            goto <D.21900>;
            <D.21899>:
            {
              struct MonoMethodVar * u;

              D.23392 = cfg->vars;
              D.23449 = def->data.op[1].phi_args;
              j.77 = (unsigned int) j;
              D.23452 = j.77 * 4;
              D.23453 = D.23449 + D.23452;
              D.23454 = *D.23453;
              D.23455 = (unsigned int) D.23454;
              D.23421 = cfg->vreg_to_inst_len;
              if (D.23455 < D.23421) goto <D.23456>; else goto <D.23457>;
              <D.23456>:
              D.23424 = cfg->vreg_to_inst;
              D.23449 = def->data.op[1].phi_args;
              j.77 = (unsigned int) j;
              D.23452 = j.77 * 4;
              D.23453 = D.23449 + D.23452;
              D.23454 = *D.23453;
              D.23458 = (unsigned int) D.23454;
              D.23459 = D.23458 * 4;
              D.23460 = D.23424 + D.23459;
              iftmp.76 = *D.23460;
              goto <D.23461>;
              <D.23457>:
              iftmp.76 = 0B;
              <D.23461>:
              D.23462 = iftmp.76->data.op[0].const_val;
              D.23463 = (unsigned int) D.23462;
              D.23464 = D.23463 * 56;
              u = D.23392 + D.23464;
              add_to_dce_worklist (cfg, info, u, &work_list);
            }
            j = j + -1;
            <D.21900>:
            if (j > 0) goto <D.21899>; else goto <D.21901>;
            <D.21901>:
            def->opcode = 316;
            def->sreg2 = -1;
            D.23440 = def->sreg2;
            def->sreg1 = D.23440;
            D.23419 = def->sreg1;
            def->dreg = D.23419;
            info->reg = -1;
          }
          goto <D.23465>;
          <D.23448>:
          D.23415 = def->opcode;
          if (D.23415 == 316) goto <D.23466>; else goto <D.23467>;
          <D.23466>:
          <D.23467>:
          <D.23465>:
          <D.23443>:
          <D.23414>:
        }
        <D.23402>:
        <D.23405>:
      }
      <D.21903>:
      work_list.71 = work_list;
      if (work_list.71 != 0B) goto <D.21902>; else goto <D.21904>;
      <D.21904>:
    }
  finally
    {
      work_list = {CLOBBER};
    }
}


mono_ssa_copyprop (struct MonoCompile * cfg)
{
  unsigned int D.23468;
  unsigned int D.23469;
  _Bool D.23470;
  long int D.23471;
  long int D.23472;
  struct MonoInst * * D.23475;
  unsigned int index.78;
  unsigned int D.23477;
  struct MonoInst * * D.23478;
  struct MonoMethodVar * D.23479;
  unsigned int D.23480;
  struct MonoInst * D.23483;
  short unsigned int D.23486;
  struct MonoInst * iftmp.79;
  int D.23490;
  unsigned int D.23491;
  unsigned int D.23492;
  struct MonoInst * * D.23495;
  unsigned int D.23496;
  unsigned int D.23497;
  struct MonoInst * * D.23498;
  unsigned char D.23502;
  int D.23503;
  int D.23504;
  int D.23507;
  unsigned int D.23508;
  unsigned int D.23509;
  struct MonoMethodVar * D.23510;
  struct MonoInst * D.23511;
  short unsigned int D.23514;
  short unsigned int D.23515;
  int D.23518;
  int D.23519;
  int D.23520;
  short unsigned int D.23521;
  int D.23522;
  int D.23523;
  signed char D.23524;
  int D.23525;
  _Bool D.23529;
  long int D.23530;
  long int D.23531;
  short unsigned int D.23537;
  int D.23539;
  short unsigned int D.23541;
  int * D.23544;
  unsigned int i.80;
  unsigned int D.23546;
  int * D.23547;
  int D.23548;
  _Bool D.23550;
  long int D.23551;
  long int D.23552;
  struct MonoBasicBlock * D.23556;
  unsigned int index.81;
  unsigned int D.23558;
  unsigned int D.23559;
  int i;
  int index;
  struct GList * l;

  D.23468 = cfg->comp_done;
  D.23469 = D.23468 & 64;
  D.23470 = D.23469 == 0;
  D.23471 = (long int) D.23470;
  D.23472 = __builtin_expect (D.23471, 0);
  if (D.23472 != 0) goto <D.23473>; else goto <D.23474>;
  <D.23473>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 674, "(cfg->comp_done & MONO_COMP_SSA_DEF_USE)");
  <D.23474>:
  index = 0;
  goto <D.21730>;
  <D.21729>:
  {
    struct MonoInst * var;
    struct MonoMethodVar * info;

    D.23475 = cfg->varinfo;
    index.78 = (unsigned int) index;
    D.23477 = index.78 * 4;
    D.23478 = D.23475 + D.23477;
    var = *D.23478;
    D.23479 = cfg->vars;
    index.78 = (unsigned int) index;
    D.23480 = index.78 * 56;
    info = D.23479 + D.23480;
    D.23483 = info->def;
    if (D.23483 != 0B) goto <D.23484>; else goto <D.23485>;
    <D.23484>:
    D.23483 = info->def;
    D.23486 = D.23483->opcode;
    if (D.23486 == 424) goto <D.23481>; else goto <D.23487>;
    <D.23487>:
    D.23483 = info->def;
    D.23486 = D.23483->opcode;
    if (D.23486 == 426) goto <D.23481>; else goto <D.23488>;
    <D.23488>:
    D.23483 = info->def;
    D.23486 = D.23483->opcode;
    if (D.23486 == 427) goto <D.23481>; else goto <D.23482>;
    <D.23481>:
    {
      struct MonoInst * var2;

      D.23483 = info->def;
      D.23490 = D.23483->sreg1;
      D.23491 = (unsigned int) D.23490;
      D.23492 = cfg->vreg_to_inst_len;
      if (D.23491 < D.23492) goto <D.23493>; else goto <D.23494>;
      <D.23493>:
      D.23495 = cfg->vreg_to_inst;
      D.23483 = info->def;
      D.23490 = D.23483->sreg1;
      D.23496 = (unsigned int) D.23490;
      D.23497 = D.23496 * 4;
      D.23498 = D.23495 + D.23497;
      iftmp.79 = *D.23498;
      goto <D.23499>;
      <D.23494>:
      iftmp.79 = 0B;
      <D.23499>:
      var2 = iftmp.79;
      if (var2 != 0B) goto <D.23500>; else goto <D.23501>;
      <D.23500>:
      D.23502 = var2->flags;
      D.23503 = (int) D.23502;
      D.23504 = D.23503 & 20;
      if (D.23504 == 0) goto <D.23505>; else goto <D.23506>;
      <D.23505>:
      D.23479 = cfg->vars;
      D.23507 = var2->data.op[0].const_val;
      D.23508 = (unsigned int) D.23507;
      D.23509 = D.23508 * 56;
      D.23510 = D.23479 + D.23509;
      D.23511 = D.23510->def;
      if (D.23511 != 0B) goto <D.23512>; else goto <D.23513>;
      <D.23512>:
      D.23479 = cfg->vars;
      D.23507 = var2->data.op[0].const_val;
      D.23508 = (unsigned int) D.23507;
      D.23509 = D.23508 * 56;
      D.23510 = D.23479 + D.23509;
      D.23511 = D.23510->def;
      D.23514 = D.23511->opcode;
      D.23515 = D.23514 + 65217;
      if (D.23515 > 2) goto <D.23516>; else goto <D.23517>;
      <D.23516>:
      {
        int dreg;
        int sreg1;

        dreg = var->dreg;
        sreg1 = var2->dreg;
        l = info->uses;
        goto <D.21727>;
        <D.21726>:
        {
          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.23518 = ins->sreg1;
              sregs[0] = D.23518;
              D.23519 = ins->sreg2;
              sregs[1] = D.23519;
              D.23520 = ins->sreg3;
              sregs[2] = D.23520;
              D.23521 = ins->opcode;
              D.23522 = (int) D.23521;
              D.23523 = D.23522 + -313;
              D.23524 = ins_sreg_counts[D.23523];
              num_sregs = (int) D.23524;
              i = 0;
              goto <D.21721>;
              <D.21720>:
              D.23525 = sregs[i];
              if (D.23525 == dreg) goto <D.21719>; else goto <D.23526>;
              <D.23526>:
              i = i + 1;
              <D.21721>:
              if (i < num_sregs) goto <D.21720>; else goto <D.21719>;
              <D.21719>:
              if (i < num_sregs) goto <D.23527>; else goto <D.23528>;
              <D.23527>:
              D.23525 = sregs[i];
              D.23529 = D.23525 != dreg;
              D.23530 = (long int) D.23529;
              D.23531 = __builtin_expect (D.23530, 0);
              if (D.23531 != 0) goto <D.23532>; else goto <D.23533>;
              <D.23532>:
              monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 702, "sregs [i] == dreg");
              <D.23533>:
              sregs[i] = sreg1;
              mono_inst_set_src_registers (ins, &sregs);
              goto <D.23534>;
              <D.23528>:
              D.23521 = ins->opcode;
              D.23537 = D.23521 + 65162;
              if (D.23537 <= 13) goto <D.23538>; else goto <D.23535>;
              <D.23538>:
              D.23539 = ins->dreg;
              if (D.23539 == dreg) goto <D.23540>; else goto <D.23535>;
              <D.23540>:
              ins->dreg = sreg1;
              goto <D.23536>;
              <D.23535>:
              D.23521 = ins->opcode;
              D.23541 = D.23521 + 65217;
              if (D.23541 <= 2) goto <D.23542>; else goto <D.23543>;
              <D.23542>:
              D.23544 = ins->data.op[1].phi_args;
              i = *D.23544;
              goto <D.21725>;
              <D.21724>:
              {
                int sreg;

                D.23544 = ins->data.op[1].phi_args;
                i.80 = (unsigned int) i;
                D.23546 = i.80 * 4;
                D.23547 = D.23544 + D.23546;
                sreg = *D.23547;
                D.23548 = var->dreg;
                if (D.23548 == sreg) goto <D.21723>; else goto <D.23549>;
                <D.23549>:
              }
              i = i + -1;
              <D.21725>:
              if (i > 0) goto <D.21724>; else goto <D.21723>;
              <D.21723>:
              D.23550 = i <= 0;
              D.23551 = (long int) D.23550;
              D.23552 = __builtin_expect (D.23551, 0);
              if (D.23552 != 0) goto <D.23553>; else goto <D.23554>;
              <D.23553>:
              monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 713, "i > 0");
              <D.23554>:
              D.23544 = ins->data.op[1].phi_args;
              i.80 = (unsigned int) i;
              D.23546 = i.80 * 4;
              D.23547 = D.23544 + D.23546;
              *D.23547 = sreg1;
              goto <D.23555>;
              <D.23543>:
              monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "ssa.c", 717);
              <D.23555>:
              <D.23536>:
              <D.23534>:
              D.23556 = u->bb;
              record_use (cfg, var2, D.23556, ins);
              l = next;
            }
          finally
            {
              sregs = {CLOBBER};
            }
        }
        <D.21727>:
        if (l != 0B) goto <D.21726>; else goto <D.21728>;
        <D.21728>:
        info->uses = 0B;
      }
      <D.23517>:
      <D.23513>:
      <D.23506>:
      <D.23501>:
    }
    <D.23482>:
    <D.23485>:
  }
  index = index + 1;
  <D.21730>:
  index.81 = (unsigned int) index;
  D.23558 = cfg->num_varinfo;
  if (index.81 < D.23558) goto <D.21729>; else goto <D.21731>;
  <D.21731>:
  D.23559 = cfg->verbose_level;
  if (D.23559 > 3) goto <D.23560>; else goto <D.23561>;
  <D.23560>:
  {
    struct MonoBasicBlock * bb;

    bb = cfg->bb_entry;
    goto <D.21734>;
    <D.21733>:
    mono_print_bb (bb, "AFTER SSA COPYPROP");
    bb = bb->next_bb;
    <D.21734>:
    if (bb != 0B) goto <D.21733>; else goto <D.21735>;
    <D.21735>:
  }
  <D.23561>:
}


add_to_dce_worklist (struct MonoCompile * cfg, struct MonoMethodVar * var, struct MonoMethodVar * use, struct GList * * wl)
{
  struct MonoMemPool * D.23562;
  struct GList * D.23563;
  struct GList * D.23564;
  struct MonoInst * D.23565;
  struct MonoInst * D.23566;
  struct GList * D.23569;
  struct GList * D.23570;
  struct GList * tmp;

  D.23562 = cfg->mempool;
  D.23563 = *wl;
  D.23564 = g_list_prepend_mempool (D.23562, D.23563, use);
  *wl = D.23564;
  tmp = use->uses;
  goto <D.21884>;
  <D.21883>:
  {
    struct MonoVarUsageInfo * ui;

    ui = tmp->data;
    D.23565 = ui->inst;
    D.23566 = var->def;
    if (D.23565 == D.23566) goto <D.23567>; else goto <D.23568>;
    <D.23567>:
    D.23569 = use->uses;
    D.23570 = monoeg_g_list_remove_link (D.23569, tmp);
    use->uses = D.23570;
    goto <D.21882>;
    <D.23568>:
  }
  tmp = tmp->next;
  <D.21884>:
  if (tmp != 0B) goto <D.21883>; else goto <D.21882>;
  <D.21882>:
}


mono_ssa_loop_invariant_code_motion (struct MonoCompile * cfg)
{
  unsigned int D.23571;
  unsigned int D.23572;
  _Bool D.23573;
  long int D.23574;
  long int D.23575;
  unsigned int D.23578;
  unsigned int D.23579;
  struct MonoBasicBlock * D.23582;
  struct MonoInst * iftmp.82;
  short unsigned int D.23591;
  unsigned int D.23594;
  unsigned int D.23595;
  <unnamed type> D.23598;
  struct MonoInst * D.23610;
  short unsigned int D.23612;
  struct MonoBasicBlock * D.23614;
  signed char D.23616;
  short unsigned int D.23618;
  short unsigned int D.23688;
  int D.23689;
  int D.23690;
  int D.23691;
  int D.23694;
  char D.23697;
  unsigned int D.23704;
  int D.23707;
  struct MonoInst * D.23708;
  struct MonoInst * D.23711;
  struct MonoInst * D.23714;
  struct MonoInst * D.23717;
  struct MonoInst * iftmp.83;
  unsigned int D.23727;
  struct MonoMethodVar * D.23728;
  unsigned int i.84;
  unsigned int D.23730;
  unsigned int i.85;
  unsigned int D.23732;
  struct MonoBasicBlock * bb;
  struct MonoBasicBlock * h;
  struct MonoBasicBlock * idom;
  struct MonoInst * ins;
  struct MonoInst * n;
  struct MonoInst * tins;
  int i;

  D.23571 = cfg->comp_done;
  D.23572 = D.23571 & 32;
  D.23573 = D.23572 == 0;
  D.23574 = (long int) D.23573;
  D.23575 = __builtin_expect (D.23574, 0);
  if (D.23575 != 0) goto <D.23576>; else goto <D.23577>;
  <D.23576>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "ssa.c", 1360, "cfg->comp_done & MONO_COMP_SSA");
  <D.23577>:
  D.23578 = BIT_FIELD_REF <*cfg, 32, 3200>;
  D.23579 = D.23578 & 320;
  if (D.23579 != 320) goto <D.23580>; else goto <D.23581>;
  <D.23580>:
  return;
  <D.23581>:
  D.23582 = cfg->bb_entry;
  bb = D.23582->next_bb;
  goto <D.21935>;
  <D.21934>:
  {
    struct GList * lp;

    lp = bb->loop_blocks;
    if (lp == 0B) goto <D.23583>; else goto <D.23584>;
    <D.23583>:
    // predicted unlikely by continue predictor.
    goto <D.21916>;
    <D.23584>:
    h = lp->data;
    if (bb != h) goto <D.23585>; else goto <D.23586>;
    <D.23585>:
    // predicted unlikely by continue predictor.
    goto <D.21916>;
    <D.23586>:
    ins = bb->code;
    if (ins != 0B) goto <D.23588>; else goto <D.23589>;
    <D.23588>:
    iftmp.82 = ins->next;
    goto <D.23590>;
    <D.23589>:
    iftmp.82 = 0B;
    <D.23590>:
    n = iftmp.82;
    goto <D.21932>;
    <D.21931>:
    {
      gboolean is_class_init;

      is_class_init = 0;
      D.23591 = ins->opcode;
      if (D.23591 == 343) goto <D.23592>; else goto <D.23593>;
      <D.23592>:
      {
        struct MonoCallInst * call;

        call = ins;
        D.23594 = BIT_FIELD_REF <*call, 32, 704>;
        D.23595 = D.23594 & 4;
        if (D.23595 != 0) goto <D.23596>; else goto <D.23597>;
        <D.23596>:
        {
          struct MonoJumpInfo * ji;

          ji = call->fptr;
          D.23598 = ji->type;
          if (D.23598 == 15) goto <D.23599>; else goto <D.23600>;
          <D.23599>:
          is_class_init = 1;
          <D.23600>:
        }
        <D.23597>:
      }
      <D.23593>:
      D.23591 = ins->opcode;
      if (D.23591 == 783) goto <D.23601>; else goto <D.23603>;
      <D.23603>:
      D.23591 = ins->opcode;
      if (D.23591 == 781) goto <D.23601>; else goto <D.23604>;
      <D.23604>:
      D.23591 = ins->opcode;
      if (D.23591 == 340) goto <D.23601>; else goto <D.23605>;
      <D.23605>:
      D.23591 = ins->opcode;
      if (D.23591 == 732) goto <D.23601>; else goto <D.23606>;
      <D.23606>:
      if (is_class_init != 0) goto <D.23601>; else goto <D.23602>;
      <D.23601>:
      {
        gboolean skip;
        int sreg;

        idom = h->idom;
        if (idom == 0B) goto <D.23607>; else goto <D.23609>;
        <D.23609>:
        D.23610 = idom->last_ins;
        if (D.23610 == 0B) goto <D.23607>; else goto <D.23611>;
        <D.23611>:
        D.23610 = idom->last_ins;
        D.23612 = D.23610->opcode;
        if (D.23612 != 442) goto <D.23607>; else goto <D.23613>;
        <D.23613>:
        D.23610 = idom->last_ins;
        D.23614 = D.23610->data.op[0].target_block;
        if (D.23614 != h) goto <D.23607>; else goto <D.23615>;
        <D.23615>:
        D.23616 = h->nesting;
        if (D.23616 != 1) goto <D.23607>; else goto <D.23608>;
        <D.23607>:
        // predicted unlikely by continue predictor.
        goto <D.21922>;
        <D.23608>:
        skip = 0;
        tins = bb->code;
        goto <D.21925>;
        <D.21924>:
        if (tins == ins) goto <D.21923>; else goto <D.23617>;
        <D.23617>:
        D.23618 = tins->opcode;
        if (D.23618 != 424) goto <D.23619>; else goto <D.23620>;
        <D.23619>:
        D.23618 = tins->opcode;
        if (D.23618 != 426) goto <D.23621>; else goto <D.23622>;
        <D.23621>:
        D.23618 = tins->opcode;
        if (D.23618 != 427) goto <D.23623>; else goto <D.23624>;
        <D.23623>:
        D.23618 = tins->opcode;
        if (D.23618 != 362) goto <D.23625>; else goto <D.23626>;
        <D.23625>:
        D.23618 = tins->opcode;
        if (D.23618 != 363) goto <D.23627>; else goto <D.23628>;
        <D.23627>:
        D.23618 = tins->opcode;
        if (D.23618 != 428) goto <D.23629>; else goto <D.23630>;
        <D.23629>:
        D.23618 = tins->opcode;
        if (D.23618 != 429) goto <D.23631>; else goto <D.23632>;
        <D.23631>:
        D.23618 = tins->opcode;
        if (D.23618 != 365) goto <D.23633>; else goto <D.23634>;
        <D.23633>:
        D.23618 = tins->opcode;
        if (D.23618 != 538) goto <D.23635>; else goto <D.23636>;
        <D.23635>:
        D.23618 = tins->opcode;
        if (D.23618 != 626) goto <D.23637>; else goto <D.23638>;
        <D.23637>:
        D.23618 = tins->opcode;
        if (D.23618 != 625) goto <D.23639>; else goto <D.23640>;
        <D.23639>:
        D.23618 = tins->opcode;
        if (D.23618 != 492) goto <D.23641>; else goto <D.23642>;
        <D.23641>:
        D.23618 = tins->opcode;
        if (D.23618 != 566) goto <D.23643>; else goto <D.23644>;
        <D.23643>:
        D.23618 = tins->opcode;
        if (D.23618 != 817) goto <D.23645>; else goto <D.23646>;
        <D.23645>:
        D.23618 = tins->opcode;
        if (D.23618 != 635) goto <D.23647>; else goto <D.23648>;
        <D.23647>:
        D.23618 = tins->opcode;
        if (D.23618 != 636) goto <D.23649>; else goto <D.23650>;
        <D.23649>:
        D.23618 = tins->opcode;
        if (D.23618 != 637) goto <D.23651>; else goto <D.23652>;
        <D.23651>:
        D.23618 = tins->opcode;
        if (D.23618 != 632) goto <D.23653>; else goto <D.23654>;
        <D.23653>:
        D.23618 = tins->opcode;
        if (D.23618 != 591) goto <D.23655>; else goto <D.23656>;
        <D.23655>:
        D.23618 = tins->opcode;
        if (D.23618 != 580) goto <D.23657>; else goto <D.23658>;
        <D.23657>:
        D.23618 = tins->opcode;
        if (D.23618 != 762) goto <D.23659>; else goto <D.23660>;
        <D.23659>:
        D.23618 = tins->opcode;
        if (D.23618 != 503) goto <D.23661>; else goto <D.23662>;
        <D.23661>:
        D.23618 = tins->opcode;
        if (D.23618 != 590) goto <D.23663>; else goto <D.23664>;
        <D.23663>:
        D.23618 = tins->opcode;
        if (D.23618 != 581) goto <D.23665>; else goto <D.23666>;
        <D.23665>:
        D.23618 = tins->opcode;
        if (D.23618 != 495) goto <D.23667>; else goto <D.23668>;
        <D.23667>:
        D.23618 = tins->opcode;
        if (D.23618 != 314) goto <D.23669>; else goto <D.23670>;
        <D.23669>:
        D.23618 = tins->opcode;
        if (D.23618 != 319) goto <D.23671>; else goto <D.23672>;
        <D.23671>:
        D.23618 = tins->opcode;
        if (D.23618 != 316) goto <D.23673>; else goto <D.23674>;
        <D.23673>:
        D.23618 = tins->opcode;
        if (D.23618 != 765) goto <D.23675>; else goto <D.23676>;
        <D.23675>:
        D.23618 = tins->opcode;
        if (D.23618 != 799) goto <D.23677>; else goto <D.23678>;
        <D.23677>:
        skip = 1;
        goto <D.21923>;
        <D.23678>:
        <D.23676>:
        <D.23674>:
        <D.23672>:
        <D.23670>:
        <D.23668>:
        <D.23666>:
        <D.23664>:
        <D.23662>:
        <D.23660>:
        <D.23658>:
        <D.23656>:
        <D.23654>:
        <D.23652>:
        <D.23650>:
        <D.23648>:
        <D.23646>:
        <D.23644>:
        <D.23642>:
        <D.23640>:
        <D.23638>:
        <D.23636>:
        <D.23634>:
        <D.23632>:
        <D.23630>:
        <D.23628>:
        <D.23626>:
        <D.23624>:
        <D.23622>:
        <D.23620>:
        tins = tins->next;
        <D.21925>:
        if (tins != 0B) goto <D.21924>; else goto <D.21923>;
        <D.21923>:
        if (skip != 0) goto <D.23679>; else goto <D.23680>;
        <D.23679>:
        // predicted unlikely by continue predictor.
        goto <D.21922>;
        <D.23680>:
        D.23591 = ins->opcode;
        if (D.23591 == 783) goto <D.23681>; else goto <D.23684>;
        <D.23684>:
        D.23591 = ins->opcode;
        if (D.23591 == 781) goto <D.23681>; else goto <D.23685>;
        <D.23685>:
        D.23591 = ins->opcode;
        if (D.23591 == 340) goto <D.23681>; else goto <D.23682>;
        <D.23681>:
        sreg = ins->sreg1;
        goto <D.23683>;
        <D.23682>:
        sreg = -1;
        <D.23683>:
        if (sreg != -1) goto <D.23686>; else goto <D.23687>;
        <D.23686>:
        {
          struct MonoInst * tins;

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

            D.23688 = tins->opcode;
            D.23689 = (int) D.23688;
            D.23690 = D.23689 + -313;
            D.23691 = D.23690 * 4;
            spec = &ins_info[D.23691];
            D.23688 = tins->opcode;
            if (D.23688 == 424) goto <D.23692>; else goto <D.23693>;
            <D.23692>:
            D.23694 = tins->dreg;
            if (D.23694 == sreg) goto <D.23695>; else goto <D.23696>;
            <D.23695>:
            sreg = tins->sreg1;
            <D.23696>:
            <D.23693>:
            D.23697 = *spec;
            if (D.23697 != 32) goto <D.23698>; else goto <D.23699>;
            <D.23698>:
            D.23694 = tins->dreg;
            if (D.23694 == sreg) goto <D.23700>; else goto <D.23701>;
            <D.23700>:
            skip = 1;
            goto <D.21928>;
            <D.23701>:
            <D.23699>:
          }
          tins = tins->prev;
          <D.21930>:
          if (tins != 0B) goto <D.21929>; else goto <D.21928>;
          <D.21928>:
          if (skip != 0) goto <D.23702>; else goto <D.23703>;
          <D.23702>:
          // predicted unlikely by continue predictor.
          goto <D.21922>;
          <D.23703>:
          ins->sreg1 = sreg;
        }
        <D.23687>:
        D.23704 = cfg->verbose_level;
        if (D.23704 > 1) goto <D.23705>; else goto <D.23706>;
        <D.23705>:
        D.23707 = bb->block_num;
        printf ("licm in BB%d on ", D.23707);
        mono_print_ins (ins);
        <D.23706>:
        D.23708 = ins->prev;
        if (D.23708 != 0B) goto <D.23709>; else goto <D.23710>;
        <D.23709>:
        D.23708 = ins->prev;
        D.23711 = ins->next;
        D.23708->next = D.23711;
        <D.23710>:
        D.23711 = ins->next;
        if (D.23711 != 0B) goto <D.23712>; else goto <D.23713>;
        <D.23712>:
        D.23711 = ins->next;
        D.23708 = ins->prev;
        D.23711->prev = D.23708;
        <D.23713>:
        D.23714 = bb->code;
        if (D.23714 == ins) goto <D.23715>; else goto <D.23716>;
        <D.23715>:
        D.23711 = ins->next;
        bb->code = D.23711;
        <D.23716>:
        D.23717 = bb->last_ins;
        if (D.23717 == ins) goto <D.23718>; else goto <D.23719>;
        <D.23718>:
        D.23708 = ins->prev;
        bb->last_ins = D.23708;
        <D.23719>:
        D.23610 = idom->last_ins;
        mono_bblock_insert_before_ins (idom, D.23610, ins);
        D.23591 = ins->opcode;
        if (D.23591 == 783) goto <D.23720>; else goto <D.23722>;
        <D.23722>:
        D.23591 = ins->opcode;
        if (D.23591 == 781) goto <D.23720>; else goto <D.23721>;
        <D.23720>:
        idom->has_array_access = 1;
        <D.23721>:
      }
      <D.23602>:
    }
    <D.21922>:
    ins = n;
    if (ins != 0B) goto <D.23724>; else goto <D.23725>;
    <D.23724>:
    iftmp.83 = ins->next;
    goto <D.23726>;
    <D.23725>:
    iftmp.83 = 0B;
    <D.23726>:
    n = iftmp.83;
    <D.21932>:
    if (ins != 0B) goto <D.21931>; else goto <D.21933>;
    <D.21933>:
  }
  <D.21916>:
  bb = bb->next_bb;
  <D.21935>:
  if (bb != 0B) goto <D.21934>; else goto <D.21936>;
  <D.21936>:
  D.23571 = cfg->comp_done;
  D.23727 = D.23571 & 4294967231;
  cfg->comp_done = D.23727;
  i = 0;
  goto <D.21939>;
  <D.21938>:
  {
    struct MonoMethodVar * info;

    D.23728 = cfg->vars;
    i.84 = (unsigned int) i;
    D.23730 = i.84 * 56;
    info = D.23728 + D.23730;
    info->def = 0B;
    info->uses = 0B;
  }
  i = i + 1;
  <D.21939>:
  i.85 = (unsigned int) i;
  D.23732 = cfg->num_varinfo;
  if (i.85 < D.23732) goto <D.21938>; else goto <D.21940>;
  <D.21940>:
}


