mono_liveness_handle_exception_clauses (struct MonoCompile * cfg)
{
  struct MonoMemPool * D.21836;
  <unnamed-unsigned:15> D.21837;
  unsigned int D.21838;
  unsigned int D.21839;
  unsigned int i.0;
  unsigned int D.21841;
  gboolean * D.21842;
  int D.21843;
  struct MonoExceptionClause * D.21844;
  unsigned int D.21845;
  unsigned int D.21846;
  unsigned int j.1;
  unsigned int D.21850;
  unsigned int D.21851;
  unsigned int D.21854;
  unsigned int D.21855;
  unsigned int D.21858;
  unsigned int D.21859;
  unsigned int D.21862;
  gboolean * D.21863;
  unsigned int D.21864;
  unsigned int D.21866;
  unsigned int D.21869;
  unsigned int D.21872;
  sizetype D.21873;
  sizetype D.21874;
  gboolean * D.21875;
  int D.21876;
  unsigned int D.21879;
  int D.21882;
  struct GSList * visited.2;
  struct MonoBasicBlock * bb;
  struct GSList * visited;
  struct MonoMethodHeader * header;
  struct MonoExceptionClause * clause;
  struct MonoExceptionClause * clause2;
  int i;
  int j;
  gboolean * outer_try;

  try
    {
      visited = 0B;
      header = cfg->header;
      D.21836 = cfg->mempool;
      D.21837 = header->num_clauses;
      D.21838 = (unsigned int) D.21837;
      D.21839 = D.21838 * 4;
      outer_try = mono_mempool_alloc0 (D.21836, D.21839);
      i = 0;
      goto <D.21521>;
      <D.21520>:
      i.0 = (unsigned int) i;
      D.21841 = i.0 * 4;
      D.21842 = outer_try + D.21841;
      *D.21842 = 1;
      i = i + 1;
      <D.21521>:
      D.21837 = header->num_clauses;
      D.21843 = (int) D.21837;
      if (D.21843 > i) goto <D.21520>; else goto <D.21522>;
      <D.21522>:
      D.21837 = header->num_clauses;
      D.21843 = (int) D.21837;
      i = D.21843 + -1;
      goto <D.21527>;
      <D.21526>:
      D.21844 = header->clauses;
      i.0 = (unsigned int) i;
      D.21845 = i.0 * 24;
      clause = D.21844 + D.21845;
      D.21846 = clause->flags;
      if (D.21846 != 0) goto <D.21847>; else goto <D.21848>;
      <D.21847>:
      i.0 = (unsigned int) i;
      D.21841 = i.0 * 4;
      D.21842 = outer_try + D.21841;
      *D.21842 = 1;
      j = i + -1;
      goto <D.21525>;
      <D.21524>:
      D.21844 = header->clauses;
      j.1 = (unsigned int) j;
      D.21850 = j.1 * 24;
      clause2 = D.21844 + D.21850;
      D.21851 = clause2->flags;
      if (D.21851 == 0) goto <D.21852>; else goto <D.21853>;
      <D.21852>:
      D.21854 = clause->handler_offset;
      D.21855 = clause2->try_offset;
      if (D.21854 <= D.21855) goto <D.21856>; else goto <D.21857>;
      <D.21856>:
      D.21855 = clause2->try_offset;
      D.21854 = clause->handler_offset;
      D.21858 = clause->handler_len;
      D.21859 = D.21854 + D.21858;
      if (D.21855 < D.21859) goto <D.21860>; else goto <D.21861>;
      <D.21860>:
      j.1 = (unsigned int) j;
      D.21862 = j.1 * 4;
      D.21863 = outer_try + D.21862;
      *D.21863 = 0;
      goto <D.21523>;
      <D.21861>:
      <D.21857>:
      <D.21853>:
      D.21855 = clause2->try_offset;
      D.21864 = clause->try_offset;
      if (D.21855 < D.21864) goto <D.21523>; else goto <D.21865>;
      <D.21865>:
      j = j + -1;
      <D.21525>:
      if (j >= 0) goto <D.21524>; else goto <D.21523>;
      <D.21523>:
      <D.21848>:
      i = i + -1;
      <D.21527>:
      if (i >= 0) goto <D.21526>; else goto <D.21528>;
      <D.21528>:
      bb = cfg->bb_entry;
      goto <D.21531>;
      <D.21530>:
      D.21866 = bb->region;
      if (D.21866 == 4294967295) goto <D.21867>; else goto <D.21868>;
      <D.21867>:
      // predicted unlikely by continue predictor.
      goto <D.21529>;
      <D.21868>:
      D.21866 = bb->region;
      D.21869 = D.21866 & 240;
      if (D.21869 == 0) goto <D.21870>; else goto <D.21871>;
      <D.21870>:
      D.21866 = bb->region;
      D.21872 = D.21866 >> 8;
      D.21873 = D.21872 + 1073741823;
      D.21874 = D.21873 * 4;
      D.21875 = outer_try + D.21874;
      D.21876 = *D.21875;
      if (D.21876 != 0) goto <D.21877>; else goto <D.21878>;
      <D.21877>:
      // predicted unlikely by continue predictor.
      goto <D.21529>;
      <D.21878>:
      <D.21871>:
      D.21879 = cfg->verbose_level;
      if (D.21879 > 2) goto <D.21880>; else goto <D.21881>;
      <D.21880>:
      D.21882 = bb->block_num;
      printf ("pessimize variables in bb %d.\n", D.21882);
      <D.21881>:
      visit_bb (cfg, bb, &visited);
      <D.21529>:
      bb = bb->next_bb;
      <D.21531>:
      if (bb != 0B) goto <D.21530>; else goto <D.21532>;
      <D.21532>:
      visited.2 = visited;
      monoeg_g_slist_free (visited.2);
    }
  finally
    {
      visited = {CLOBBER};
    }
}


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

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


visit_bb (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct GSList * * visited)
{
  struct GSList * D.21886;
  struct GSList * D.21887;
  short unsigned int D.21890;
  int D.21891;
  int D.21892;
  int D.21893;
  char D.21896;
  int iftmp.3;
  int D.21902;
  _Bool D.21905;
  long int D.21906;
  long int D.21907;
  unsigned int D.21912;
  unsigned int D.21913;
  struct MonoInst * * D.21916;
  unsigned int D.21917;
  unsigned int D.21918;
  struct MonoInst * * D.21919;
  struct MonoInst * D.21920;
  struct MonoInst * iftmp.4;
  struct MonoMethodVar * D.21927;
  unsigned int idx.5;
  unsigned int D.21929;
  struct MonoInst * * D.21930;
  unsigned int D.21931;
  unsigned int D.21932;
  struct MonoInst * * D.21933;
  struct MonoInst * D.21934;
  unsigned char D.21935;
  unsigned char D.21936;
  unsigned char D.21937;
  struct MonoInst * iftmp.6;
  int D.21941;
  int D.21942;
  unsigned int D.21943;
  sizetype D.21946;
  sizetype D.21947;
  sizetype D.21948;
  struct MonoInst * * D.21949;
  struct MonoInst * iftmp.7;
  unsigned char D.21955;
  unsigned char D.21956;
  struct MonoInst * iftmp.8;
  int D.21958;
  unsigned int D.21959;
  sizetype D.21962;
  sizetype D.21963;
  struct MonoInst * * D.21964;
  struct MonoInst * iftmp.9;
  unsigned char D.21970;
  unsigned char D.21971;
  int D.21972;
  int D.21973;
  int D.21974;
  signed char D.21975;
  _Bool D.21976;
  long int D.21977;
  long int D.21978;
  unsigned int sreg.10;
  unsigned int sreg.11;
  unsigned int D.21985;
  struct MonoInst * * D.21986;
  struct MonoInst * D.21987;
  struct MonoInst * iftmp.12;
  unsigned int idx.13;
  unsigned int D.21995;
  unsigned int D.21996;
  unsigned int D.21997;
  struct MonoInst * * D.21998;
  struct MonoInst * D.21999;
  unsigned char D.22000;
  unsigned char D.22001;
  unsigned char D.22002;
  struct MonoInst * iftmp.14;
  int D.22006;
  int D.22007;
  unsigned int D.22008;
  sizetype D.22011;
  sizetype D.22012;
  sizetype D.22013;
  struct MonoInst * * D.22014;
  struct MonoInst * iftmp.15;
  unsigned char D.22020;
  unsigned char D.22021;
  struct MonoInst * iftmp.16;
  int D.22023;
  unsigned int D.22024;
  sizetype D.22027;
  sizetype D.22028;
  struct MonoInst * * D.22029;
  struct MonoInst * iftmp.17;
  unsigned char D.22035;
  unsigned char D.22036;
  struct GSList * D.22037;
  struct MonoBasicBlock * * D.22038;
  unsigned int i.18;
  unsigned int D.22040;
  struct MonoBasicBlock * * D.22041;
  struct MonoBasicBlock * D.22042;
  short int D.22043;
  int D.22044;
  int i;
  struct MonoInst * ins;

  D.21886 = *visited;
  D.21887 = monoeg_g_slist_find (D.21886, bb);
  if (D.21887 != 0B) goto <D.21888>; else goto <D.21889>;
  <D.21888>:
  return;
  <D.21889>:
  ins = bb->code;
  goto <D.21504>;
  <D.21503>:
  {
    const char * spec;
    int regtype;
    int srcindex;
    int sreg;
    int num_sregs;
    int sregs[3];

    try
      {
        D.21890 = ins->opcode;
        D.21891 = (int) D.21890;
        D.21892 = D.21891 + -313;
        D.21893 = D.21892 * 4;
        spec = &ins_info[D.21893];
        D.21890 = ins->opcode;
        if (D.21890 == 316) goto <D.21894>; else goto <D.21895>;
        <D.21894>:
        // predicted unlikely by continue predictor.
        goto <D.21493>;
        <D.21895>:
        D.21896 = *spec;
        regtype = (int) D.21896;
        D.21902 = ins->dreg;
        if (D.21902 != -1) goto <D.21898>; else goto <D.21903>;
        <D.21903>:
        if (regtype != 32) goto <D.21898>; else goto <D.21899>;
        <D.21898>:
        D.21902 = ins->dreg;
        if (D.21902 == -1) goto <D.21900>; else goto <D.21904>;
        <D.21904>:
        if (regtype == 32) goto <D.21900>; else goto <D.21899>;
        <D.21900>:
        iftmp.3 = 1;
        goto <D.21901>;
        <D.21899>:
        iftmp.3 = 0;
        <D.21901>:
        D.21905 = iftmp.3 != 0;
        D.21906 = (long int) D.21905;
        D.21907 = __builtin_expect (D.21906, 0);
        if (D.21907 != 0) goto <D.21908>; else goto <D.21909>;
        <D.21908>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 94, "((ins->dreg == -1) && (regtype == \' \')) || ((ins->dreg != -1) && (regtype != \' \'))");
        <D.21909>:
        D.21902 = ins->dreg;
        if (D.21902 != -1) goto <D.21910>; else goto <D.21911>;
        <D.21910>:
        D.21902 = ins->dreg;
        D.21912 = (unsigned int) D.21902;
        D.21913 = cfg->vreg_to_inst_len;
        if (D.21912 < D.21913) goto <D.21914>; else goto <D.21915>;
        <D.21914>:
        D.21916 = cfg->vreg_to_inst;
        D.21902 = ins->dreg;
        D.21917 = (unsigned int) D.21902;
        D.21918 = D.21917 * 4;
        D.21919 = D.21916 + D.21918;
        D.21920 = *D.21919;
        if (D.21920 != 0B) goto <D.21921>; else goto <D.21922>;
        <D.21921>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          D.21902 = ins->dreg;
          D.21912 = (unsigned int) D.21902;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.21912 < D.21913) goto <D.21924>; else goto <D.21925>;
          <D.21924>:
          D.21916 = cfg->vreg_to_inst;
          D.21902 = ins->dreg;
          D.21917 = (unsigned int) D.21902;
          D.21918 = D.21917 * 4;
          D.21919 = D.21916 + D.21918;
          iftmp.4 = *D.21919;
          goto <D.21926>;
          <D.21925>:
          iftmp.4 = 0B;
          <D.21926>:
          var = iftmp.4;
          idx = var->data.op[0].const_val;
          D.21927 = cfg->vars;
          idx.5 = (unsigned int) idx;
          D.21929 = idx.5 * 56;
          vi = D.21927 + D.21929;
          D.21930 = cfg->varinfo;
          D.21931 = vi->idx;
          D.21932 = D.21931 * 4;
          D.21933 = D.21930 + D.21932;
          D.21934 = *D.21933;
          D.21930 = cfg->varinfo;
          D.21931 = vi->idx;
          D.21932 = D.21931 * 4;
          D.21933 = D.21930 + D.21932;
          D.21934 = *D.21933;
          D.21935 = D.21934->flags;
          D.21936 = D.21935 | 4;
          D.21934->flags = D.21936;
          D.21937 = var->type;
          if (D.21937 == 2) goto <D.21938>; else goto <D.21939>;
          <D.21938>:
          D.21941 = var->dreg;
          D.21942 = D.21941 + 1;
          D.21943 = (unsigned int) D.21942;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.21943 < D.21913) goto <D.21944>; else goto <D.21945>;
          <D.21944>:
          D.21916 = cfg->vreg_to_inst;
          D.21941 = var->dreg;
          D.21946 = (sizetype) D.21941;
          D.21947 = D.21946 + 1;
          D.21948 = D.21947 * 4;
          D.21949 = D.21916 + D.21948;
          iftmp.6 = *D.21949;
          goto <D.21950>;
          <D.21945>:
          iftmp.6 = 0B;
          <D.21950>:
          D.21941 = var->dreg;
          D.21942 = D.21941 + 1;
          D.21943 = (unsigned int) D.21942;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.21943 < D.21913) goto <D.21952>; else goto <D.21953>;
          <D.21952>:
          D.21916 = cfg->vreg_to_inst;
          D.21941 = var->dreg;
          D.21946 = (sizetype) D.21941;
          D.21947 = D.21946 + 1;
          D.21948 = D.21947 * 4;
          D.21949 = D.21916 + D.21948;
          iftmp.7 = *D.21949;
          goto <D.21954>;
          <D.21953>:
          iftmp.7 = 0B;
          <D.21954>:
          D.21955 = iftmp.7->flags;
          D.21956 = D.21955 | 4;
          iftmp.6->flags = D.21956;
          D.21941 = var->dreg;
          D.21958 = D.21941 + 2;
          D.21959 = (unsigned int) D.21958;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.21959 < D.21913) goto <D.21960>; else goto <D.21961>;
          <D.21960>:
          D.21916 = cfg->vreg_to_inst;
          D.21941 = var->dreg;
          D.21946 = (sizetype) D.21941;
          D.21962 = D.21946 + 2;
          D.21963 = D.21962 * 4;
          D.21964 = D.21916 + D.21963;
          iftmp.8 = *D.21964;
          goto <D.21965>;
          <D.21961>:
          iftmp.8 = 0B;
          <D.21965>:
          D.21941 = var->dreg;
          D.21958 = D.21941 + 2;
          D.21959 = (unsigned int) D.21958;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.21959 < D.21913) goto <D.21967>; else goto <D.21968>;
          <D.21967>:
          D.21916 = cfg->vreg_to_inst;
          D.21941 = var->dreg;
          D.21946 = (sizetype) D.21941;
          D.21962 = D.21946 + 2;
          D.21963 = D.21962 * 4;
          D.21964 = D.21916 + D.21963;
          iftmp.9 = *D.21964;
          goto <D.21969>;
          <D.21968>:
          iftmp.9 = 0B;
          <D.21969>:
          D.21970 = iftmp.9->flags;
          D.21971 = D.21970 | 4;
          iftmp.8->flags = D.21971;
          <D.21939>:
        }
        <D.21922>:
        <D.21915>:
        <D.21911>:
        D.21972 = ins->sreg1;
        sregs[0] = D.21972;
        D.21973 = ins->sreg2;
        sregs[1] = D.21973;
        D.21974 = ins->sreg3;
        sregs[2] = D.21974;
        D.21890 = ins->opcode;
        D.21891 = (int) D.21890;
        D.21892 = D.21891 + -313;
        D.21975 = ins_sreg_counts[D.21892];
        num_sregs = (int) D.21975;
        srcindex = 0;
        goto <D.21501>;
        <D.21500>:
        sreg = sregs[srcindex];
        D.21976 = sreg == -1;
        D.21977 = (long int) D.21976;
        D.21978 = __builtin_expect (D.21977, 0);
        if (D.21978 != 0) goto <D.21979>; else goto <D.21980>;
        <D.21979>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 114, "sreg != -1");
        <D.21980>:
        sreg.10 = (unsigned int) sreg;
        D.21913 = cfg->vreg_to_inst_len;
        if (sreg.10 < D.21913) goto <D.21982>; else goto <D.21983>;
        <D.21982>:
        D.21916 = cfg->vreg_to_inst;
        sreg.11 = (unsigned int) sreg;
        D.21985 = sreg.11 * 4;
        D.21986 = D.21916 + D.21985;
        D.21987 = *D.21986;
        if (D.21987 != 0B) goto <D.21988>; else goto <D.21989>;
        <D.21988>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          sreg.10 = (unsigned int) sreg;
          D.21913 = cfg->vreg_to_inst_len;
          if (sreg.10 < D.21913) goto <D.21991>; else goto <D.21992>;
          <D.21991>:
          D.21916 = cfg->vreg_to_inst;
          sreg.11 = (unsigned int) sreg;
          D.21985 = sreg.11 * 4;
          D.21986 = D.21916 + D.21985;
          iftmp.12 = *D.21986;
          goto <D.21993>;
          <D.21992>:
          iftmp.12 = 0B;
          <D.21993>:
          var = iftmp.12;
          idx = var->data.op[0].const_val;
          D.21927 = cfg->vars;
          idx.13 = (unsigned int) idx;
          D.21995 = idx.13 * 56;
          vi = D.21927 + D.21995;
          D.21930 = cfg->varinfo;
          D.21996 = vi->idx;
          D.21997 = D.21996 * 4;
          D.21998 = D.21930 + D.21997;
          D.21999 = *D.21998;
          D.21930 = cfg->varinfo;
          D.21996 = vi->idx;
          D.21997 = D.21996 * 4;
          D.21998 = D.21930 + D.21997;
          D.21999 = *D.21998;
          D.22000 = D.21999->flags;
          D.22001 = D.22000 | 4;
          D.21999->flags = D.22001;
          D.22002 = var->type;
          if (D.22002 == 2) goto <D.22003>; else goto <D.22004>;
          <D.22003>:
          D.22006 = var->dreg;
          D.22007 = D.22006 + 1;
          D.22008 = (unsigned int) D.22007;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.22008 < D.21913) goto <D.22009>; else goto <D.22010>;
          <D.22009>:
          D.21916 = cfg->vreg_to_inst;
          D.22006 = var->dreg;
          D.22011 = (sizetype) D.22006;
          D.22012 = D.22011 + 1;
          D.22013 = D.22012 * 4;
          D.22014 = D.21916 + D.22013;
          iftmp.14 = *D.22014;
          goto <D.22015>;
          <D.22010>:
          iftmp.14 = 0B;
          <D.22015>:
          D.22006 = var->dreg;
          D.22007 = D.22006 + 1;
          D.22008 = (unsigned int) D.22007;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.22008 < D.21913) goto <D.22017>; else goto <D.22018>;
          <D.22017>:
          D.21916 = cfg->vreg_to_inst;
          D.22006 = var->dreg;
          D.22011 = (sizetype) D.22006;
          D.22012 = D.22011 + 1;
          D.22013 = D.22012 * 4;
          D.22014 = D.21916 + D.22013;
          iftmp.15 = *D.22014;
          goto <D.22019>;
          <D.22018>:
          iftmp.15 = 0B;
          <D.22019>:
          D.22020 = iftmp.15->flags;
          D.22021 = D.22020 | 4;
          iftmp.14->flags = D.22021;
          D.22006 = var->dreg;
          D.22023 = D.22006 + 2;
          D.22024 = (unsigned int) D.22023;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.22024 < D.21913) goto <D.22025>; else goto <D.22026>;
          <D.22025>:
          D.21916 = cfg->vreg_to_inst;
          D.22006 = var->dreg;
          D.22011 = (sizetype) D.22006;
          D.22027 = D.22011 + 2;
          D.22028 = D.22027 * 4;
          D.22029 = D.21916 + D.22028;
          iftmp.16 = *D.22029;
          goto <D.22030>;
          <D.22026>:
          iftmp.16 = 0B;
          <D.22030>:
          D.22006 = var->dreg;
          D.22023 = D.22006 + 2;
          D.22024 = (unsigned int) D.22023;
          D.21913 = cfg->vreg_to_inst_len;
          if (D.22024 < D.21913) goto <D.22032>; else goto <D.22033>;
          <D.22032>:
          D.21916 = cfg->vreg_to_inst;
          D.22006 = var->dreg;
          D.22011 = (sizetype) D.22006;
          D.22027 = D.22011 + 2;
          D.22028 = D.22027 * 4;
          D.22029 = D.21916 + D.22028;
          iftmp.17 = *D.22029;
          goto <D.22034>;
          <D.22033>:
          iftmp.17 = 0B;
          <D.22034>:
          D.22035 = iftmp.17->flags;
          D.22036 = D.22035 | 4;
          iftmp.16->flags = D.22036;
          <D.22004>:
        }
        <D.21989>:
        <D.21983>:
        srcindex = srcindex + 1;
        <D.21501>:
        if (srcindex < num_sregs) goto <D.21500>; else goto <D.21502>;
        <D.21502>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21493>:
  ins = ins->next;
  <D.21504>:
  if (ins != 0B) goto <D.21503>; else goto <D.21505>;
  <D.21505>:
  D.21886 = *visited;
  D.22037 = monoeg_g_slist_append (D.21886, bb);
  *visited = D.22037;
  i = 0;
  goto <D.21507>;
  <D.21506>:
  D.22038 = bb->out_bb;
  i.18 = (unsigned int) i;
  D.22040 = i.18 * 4;
  D.22041 = D.22038 + D.22040;
  D.22042 = *D.22041;
  visit_bb (cfg, D.22042, visited);
  i = i + 1;
  <D.21507>:
  D.22043 = bb->out_count;
  D.22044 = (int) D.22043;
  if (D.22044 > i) goto <D.21506>; else goto <D.21508>;
  <D.21508>:
}


mono_analyze_liveness (struct MonoCompile * cfg)
{
  unsigned int D.22048;
  unsigned int D.22049;
  unsigned int D.22052;
  unsigned int D.22053;
  _Bool D.22054;
  long int D.22055;
  long int D.22056;
  unsigned int D.22059;
  unsigned int max_vars.19;
  unsigned int D.22063;
  struct MonoMethodVar * D.22064;
  unsigned int i.20;
  unsigned int D.22066;
  struct MonoMethodVar * D.22067;
  struct MonoBasicBlock * * D.22068;
  unsigned int D.22069;
  struct MonoBasicBlock * * D.22070;
  struct MonoMemPool * D.22071;
  unsigned int bitsize.21;
  struct MonoBitSet * D.22073;
  struct MonoBitSet * D.22074;
  int D.22077;
  struct MonoBasicBlock * * D.22078;
  unsigned int j.22;
  unsigned int D.22080;
  struct MonoBasicBlock * * D.22081;
  struct MonoBasicBlock * D.22082;
  int D.22083;
  short int D.22084;
  int D.22085;
  struct MonoBitSet * D.22088;
  struct MonoBitSet * D.22089;
  unsigned int i.23;
  unsigned int D.22091;
  unsigned int D.22092;
  unsigned int D.22093;
  unsigned int l_end.24;
  unsigned int D.22095;
  struct MonoBasicBlock * * D.22096;
  int D.22097;
  unsigned int D.22098;
  unsigned int D.22099;
  gboolean * D.22100;
  struct MonoBitSet * D.22101;
  unsigned int D.22104;
  struct MonoBasicBlock * * D.22105;
  int D.22106;
  unsigned int D.22107;
  unsigned int D.22108;
  gboolean * D.22109;
  int D.22112;
  struct MonoBasicBlock * * D.22113;
  struct MonoBasicBlock * * D.22114;
  struct MonoBasicBlock * D.22115;
  int D.22116;
  short int D.22117;
  int D.22118;
  struct MonoBasicBlock * * D.22119;
  struct MonoBasicBlock * * D.22120;
  struct MonoBasicBlock * D.22121;
  int D.22122;
  short int D.22123;
  int D.22124;
  struct MonoBitSet * D.22127;
  gsize[0:] * D.22131;
  struct MonoBitSet * D.22132;
  gsize[0:] * D.22133;
  unsigned int D.22134;
  unsigned int D.22135;
  struct MonoBitSet * D.22136;
  struct MonoBitSet * D.22139;
  gsize[0:] * D.22140;
  struct MonoBitSet * D.22141;
  gsize[0:] * D.22142;
  unsigned int D.22143;
  unsigned int D.22144;
  unsigned int D.22145;
  unsigned int D.22146;
  unsigned int D.22147;
  unsigned int D.22148;
  unsigned int D.22149;
  unsigned int D.22150;
  unsigned int D.22151;
  unsigned int D.22152;
  unsigned int D.22153;
  unsigned int D.22154;
  unsigned int D.22155;
  struct MonoInst * D.22158;
  short unsigned int D.22160;
  unsigned int D.22162;
  unsigned int D.22163;
  unsigned int D.22164;
  unsigned int D.22165;
  unsigned int D.22166;
  int D.22169;
  struct MonoBitSet * D.22172;
  gsize[0:] * D.22173;
  unsigned int D.22174;
  unsigned int D.22175;
  unsigned int D.22176;
  unsigned int D.22177;
  unsigned int D.22178;
  unsigned int D.22179;
  unsigned int D.22180;
  unsigned int D.22181;
  unsigned int D.22182;
  unsigned int D.22183;
  unsigned int D.22184;
  unsigned int D.22185;
  unsigned int D.22186;
  struct MonoBitSet * D.22187;
  int D.22190;
  unsigned int D.22191;
  unsigned int D.22192;
  gboolean * D.22193;
  int D.22194;
  int D.22199;
  unsigned int l_end.25;
  unsigned int D.22201;
  struct MonoBasicBlock * * D.22202;
  _Bool D.22203;
  long int D.22204;
  long int D.22205;
  struct MonoBitSet * D.22210;
  struct MonoBitSet * D.22213;
  gsize[0:] * D.22214;
  struct MonoBitSet * D.22215;
  gsize[0:] * D.22216;
  unsigned int D.22217;
  unsigned int D.22218;
  unsigned int D.22219;
  unsigned int D.22220;
  unsigned int D.22221;
  unsigned int D.22222;
  unsigned int D.22223;
  unsigned int D.22224;
  unsigned int D.22225;
  unsigned int D.22226;
  unsigned int D.22227;
  unsigned int D.22228;
  unsigned int D.22229;
  int D.22230;
  int D.22231;
  struct MonoBitSet * D.22232;
  unsigned int max_vars.26;
  unsigned int D.22236;
  struct MonoBitSet * D.22237;
  unsigned int D.22238;
  unsigned int D.22239;
  unsigned int k.27;
  unsigned int D.22243;
  struct MonoMethodVar * D.22244;
  int abs_pos.28;
  unsigned int D.22246;
  unsigned int D.22249;
  int D.22250;
  unsigned int j.29;
  struct MonoInst * * D.22253;
  unsigned int D.22254;
  unsigned int D.22255;
  struct MonoInst * * D.22256;
  struct MonoInst * D.22257;
  short unsigned int D.22258;
  unsigned int D.22261;
  unsigned char D.22264;
  int D.22265;
  int D.22266;
  unsigned int D.22271;
  unsigned int D.22272;
  struct MonoGenericSharingContext * D.22275;
  struct MonoMethod * D.22277;
  struct MonoMethodSignature * D.22278;
  unsigned int D.22279;
  unsigned int D.22280;
  struct MonoInst * * D.22282;
  struct MonoInst * D.22283;
  unsigned char D.22284;
  unsigned int D.22287;
  int D.22288;
  struct MonoBitSet * D.22289;
  struct MonoBitSet * D.22290;
  unsigned int D.22291;
  unsigned int D.22292;
  unsigned int D.22293;
  struct MonoBitSet * old_live_out_set;
  int i;
  int j;
  int max_vars;
  int out_iter;
  gboolean * in_worklist;
  struct MonoBasicBlock * * worklist;
  guint32 l_end;
  int bitsize;

  D.22048 = cfg->num_varinfo;
  max_vars = (int) D.22048;
  D.22049 = cfg->verbose_level;
  if (D.22049 > 1) goto <D.22050>; else goto <D.22051>;
  <D.22050>:
  printf ("\nLIVENESS:\n");
  <D.22051>:
  D.22052 = cfg->comp_done;
  D.22053 = D.22052 & 16;
  D.22054 = D.22053 != 0;
  D.22055 = (long int) D.22054;
  D.22056 = __builtin_expect (D.22055, 0);
  if (D.22056 != 0) goto <D.22057>; else goto <D.22058>;
  <D.22057>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 316, "!(cfg->comp_done & MONO_COMP_LIVENESS)");
  <D.22058>:
  D.22052 = cfg->comp_done;
  D.22059 = D.22052 | 16;
  cfg->comp_done = D.22059;
  if (max_vars == 0) goto <D.22060>; else goto <D.22061>;
  <D.22060>:
  return;
  <D.22061>:
  max_vars.19 = (unsigned int) max_vars;
  D.22063 = mono_bitset_alloc_size (max_vars.19, 0);
  bitsize = (int) D.22063;
  i = 0;
  goto <D.21579>;
  <D.21578>:
  D.22064 = cfg->vars;
  i.20 = (unsigned int) i;
  D.22066 = i.20 * 56;
  D.22067 = D.22064 + D.22066;
  D.22067->range.first_use.abs_pos = 4294967295;
  D.22064 = cfg->vars;
  i.20 = (unsigned int) i;
  D.22066 = i.20 * 56;
  D.22067 = D.22064 + D.22066;
  D.22067->range.last_use.abs_pos = 0;
  D.22064 = cfg->vars;
  i.20 = (unsigned int) i;
  D.22066 = i.20 * 56;
  D.22067 = D.22064 + D.22066;
  D.22067->spill_costs = 0;
  i = i + 1;
  <D.21579>:
  if (i < max_vars) goto <D.21578>; else goto <D.21580>;
  <D.21580>:
  i = 0;
  goto <D.21586>;
  <D.21585>:
  {
    struct MonoBasicBlock * bb;

    D.22068 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22069 = i.20 * 4;
    D.22070 = D.22068 + D.22069;
    bb = *D.22070;
    D.22071 = cfg->mempool;
    bitsize.21 = (unsigned int) bitsize;
    max_vars.19 = (unsigned int) max_vars;
    D.22073 = mono_bitset_mp_new (D.22071, bitsize.21, max_vars.19);
    bb->gen_set = D.22073;
    D.22071 = cfg->mempool;
    bitsize.21 = (unsigned int) bitsize;
    max_vars.19 = (unsigned int) max_vars;
    D.22074 = mono_bitset_mp_new (D.22071, bitsize.21, max_vars.19);
    bb->kill_set = D.22074;
    D.22049 = cfg->verbose_level;
    if (D.22049 > 1) goto <D.22075>; else goto <D.22076>;
    <D.22075>:
    D.22077 = bb->block_num;
    printf ("BLOCK BB%d (", D.22077);
    j = 0;
    goto <D.21583>;
    <D.21582>:
    D.22078 = bb->out_bb;
    j.22 = (unsigned int) j;
    D.22080 = j.22 * 4;
    D.22081 = D.22078 + D.22080;
    D.22082 = *D.22081;
    D.22083 = D.22082->block_num;
    printf ("BB%d, ", D.22083);
    j = j + 1;
    <D.21583>:
    D.22084 = bb->out_count;
    D.22085 = (int) D.22084;
    if (D.22085 > j) goto <D.21582>; else goto <D.21584>;
    <D.21584>:
    printf ("):\n");
    <D.22076>:
    analyze_liveness_bb (cfg, bb);
    D.22049 = cfg->verbose_level;
    if (D.22049 > 1) goto <D.22086>; else goto <D.22087>;
    <D.22086>:
    D.22077 = bb->block_num;
    printf ("GEN  BB%d: ", D.22077);
    D.22088 = bb->gen_set;
    mono_bitset_print (D.22088);
    D.22077 = bb->block_num;
    printf ("KILL BB%d: ", D.22077);
    D.22089 = bb->kill_set;
    mono_bitset_print (D.22089);
    <D.22087>:
  }
  i = i + 1;
  <D.21586>:
  i.23 = (unsigned int) i;
  D.22091 = cfg->num_bblocks;
  if (i.23 < D.22091) goto <D.21585>; else goto <D.21587>;
  <D.21587>:
  max_vars.19 = (unsigned int) max_vars;
  old_live_out_set = mono_bitset_new (max_vars.19, 0);
  D.22091 = cfg->num_bblocks;
  D.22092 = D.22091 + 1;
  D.22093 = D.22092 * 4;
  in_worklist = monoeg_malloc0 (D.22093);
  D.22091 = cfg->num_bblocks;
  D.22092 = D.22091 + 1;
  D.22093 = D.22092 * 4;
  worklist = monoeg_malloc (D.22093);
  l_end = 0;
  i = 0;
  goto <D.21590>;
  <D.21589>:
  {
    struct MonoBasicBlock * bb;

    D.22068 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22069 = i.20 * 4;
    D.22070 = D.22068 + D.22069;
    bb = *D.22070;
    l_end.24 = l_end;
    l_end = l_end.24 + 1;
    D.22095 = l_end.24 * 4;
    D.22096 = worklist + D.22095;
    *D.22096 = bb;
    D.22097 = bb->dfn;
    D.22098 = (unsigned int) D.22097;
    D.22099 = D.22098 * 4;
    D.22100 = in_worklist + D.22099;
    *D.22100 = 1;
    bb->live_in_set = 0B;
    D.22071 = cfg->mempool;
    bitsize.21 = (unsigned int) bitsize;
    max_vars.19 = (unsigned int) max_vars;
    D.22101 = mono_bitset_mp_new (D.22071, bitsize.21, max_vars.19);
    bb->live_out_set = D.22101;
  }
  i = i + 1;
  <D.21590>:
  i.23 = (unsigned int) i;
  D.22091 = cfg->num_bblocks;
  if (i.23 < D.22091) goto <D.21589>; else goto <D.21591>;
  <D.21591>:
  out_iter = 0;
  D.22049 = cfg->verbose_level;
  if (D.22049 > 1) goto <D.22102>; else goto <D.22103>;
  <D.22102>:
  printf ("\nITERATION:\n");
  <D.22103>:
  goto <D.21601>;
  <D.21644>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * out_bb;
    gboolean changed;

    l_end = l_end + 4294967295;
    D.22104 = l_end * 4;
    D.22105 = worklist + D.22104;
    bb = *D.22105;
    D.22106 = bb->dfn;
    D.22107 = (unsigned int) D.22106;
    D.22108 = D.22107 * 4;
    D.22109 = in_worklist + D.22108;
    *D.22109 = 0;
    D.22049 = cfg->verbose_level;
    if (D.22049 > 1) goto <D.22110>; else goto <D.22111>;
    <D.22110>:
    D.22112 = bb->block_num;
    D.22106 = bb->dfn;
    printf ("P: BB%d(%d): IN: ", D.22112, D.22106);
    j = 0;
    goto <D.21596>;
    <D.21595>:
    D.22113 = bb->in_bb;
    j.22 = (unsigned int) j;
    D.22080 = j.22 * 4;
    D.22114 = D.22113 + D.22080;
    D.22115 = *D.22114;
    D.22116 = D.22115->block_num;
    printf ("BB%d ", D.22116);
    j = j + 1;
    <D.21596>:
    D.22117 = bb->in_count;
    D.22118 = (int) D.22117;
    if (D.22118 > j) goto <D.21595>; else goto <D.21597>;
    <D.21597>:
    printf ("OUT:");
    j = 0;
    goto <D.21599>;
    <D.21598>:
    D.22119 = bb->out_bb;
    j.22 = (unsigned int) j;
    D.22080 = j.22 * 4;
    D.22120 = D.22119 + D.22080;
    D.22121 = *D.22120;
    D.22122 = D.22121->block_num;
    printf ("BB%d ", D.22122);
    j = j + 1;
    <D.21599>:
    D.22123 = bb->out_count;
    D.22124 = (int) D.22123;
    if (D.22124 > j) goto <D.21598>; else goto <D.21600>;
    <D.21600>:
    printf ("\n");
    <D.22111>:
    D.22123 = bb->out_count;
    if (D.22123 == 0) goto <D.22125>; else goto <D.22126>;
    <D.22125>:
    // predicted unlikely by continue predictor.
    goto <D.21601>;
    <D.22126>:
    out_iter = out_iter + 1;
    D.22127 = bb->live_in_set;
    if (D.22127 == 0B) goto <D.22128>; else goto <D.22129>;
    <D.22128>:
    changed = 1;
    goto <D.22130>;
    <D.22129>:
    changed = 0;
    D.22131 = &old_live_out_set->data;
    D.22132 = bb->live_out_set;
    D.22133 = &D.22132->data;
    D.22134 = old_live_out_set->size;
    D.22135 = D.22134 / 8;
    memcpy (D.22131, D.22133, D.22135);
    <D.22130>:
    j = 0;
    goto <D.21624>;
    <D.21623>:
    D.22119 = bb->out_bb;
    j.22 = (unsigned int) j;
    D.22080 = j.22 * 4;
    D.22120 = D.22119 + D.22080;
    out_bb = *D.22120;
    D.22136 = out_bb->live_in_set;
    if (D.22136 == 0B) goto <D.22137>; else goto <D.22138>;
    <D.22137>:
    D.22071 = cfg->mempool;
    bitsize.21 = (unsigned int) bitsize;
    max_vars.19 = (unsigned int) max_vars;
    D.22139 = mono_bitset_mp_new_noinit (D.22071, bitsize.21, max_vars.19);
    out_bb->live_in_set = D.22139;
    D.22136 = out_bb->live_in_set;
    D.22140 = &D.22136->data;
    D.22141 = out_bb->live_out_set;
    D.22142 = &D.22141->data;
    D.22136 = out_bb->live_in_set;
    D.22143 = D.22136->size;
    D.22144 = D.22143 / 8;
    memcpy (D.22140, D.22142, D.22144);
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = out_bb->kill_set;
      tmp_dest = out_bb->live_in_set;
      D.22145 = tmp_dest->size;
      D.22146 = D.22145 / 32;
      size = (int) D.22146;
      i = 0;
      goto <D.21607>;
      <D.21606>:
      D.22147 = tmp_dest->data[i];
      D.22148 = tmp_src->data[i];
      D.22149 = ~D.22148;
      D.22150 = D.22147 & D.22149;
      tmp_dest->data[i] = D.22150;
      i = i + 1;
      <D.21607>:
      if (i < size) goto <D.21606>; else goto <D.21608>;
      <D.21608>:
    }
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = out_bb->gen_set;
      tmp_dest = out_bb->live_in_set;
      D.22151 = tmp_dest->size;
      D.22152 = D.22151 / 32;
      size = (int) D.22152;
      i = 0;
      goto <D.21614>;
      <D.21613>:
      D.22153 = tmp_dest->data[i];
      D.22154 = tmp_src->data[i];
      D.22155 = D.22153 | D.22154;
      tmp_dest->data[i] = D.22155;
      i = i + 1;
      <D.21614>:
      if (i < size) goto <D.21613>; else goto <D.21615>;
      <D.21615>:
    }
    <D.22138>:
    D.22158 = bb->last_ins;
    if (D.22158 != 0B) goto <D.22159>; else goto <D.22156>;
    <D.22159>:
    D.22158 = bb->last_ins;
    D.22160 = D.22158->opcode;
    if (D.22160 == 798) goto <D.22161>; else goto <D.22156>;
    <D.22161>:
    goto <D.22157>;
    <D.22156>:
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = out_bb->live_in_set;
      tmp_dest = bb->live_out_set;
      D.22162 = tmp_dest->size;
      D.22163 = D.22162 / 32;
      size = (int) D.22163;
      i = 0;
      goto <D.21621>;
      <D.21620>:
      D.22164 = tmp_dest->data[i];
      D.22165 = tmp_src->data[i];
      D.22166 = D.22164 | D.22165;
      tmp_dest->data[i] = D.22166;
      i = i + 1;
      <D.21621>:
      if (i < size) goto <D.21620>; else goto <D.21622>;
      <D.21622>:
    }
    <D.22157>:
    j = j + 1;
    <D.21624>:
    D.22123 = bb->out_count;
    D.22124 = (int) D.22123;
    if (D.22124 > j) goto <D.21623>; else goto <D.21625>;
    <D.21625>:
    if (changed != 0) goto <D.22167>; else goto <D.22168>;
    <D.22168>:
    D.22132 = bb->live_out_set;
    D.22169 = mono_bitset_equal (old_live_out_set, D.22132);
    if (D.22169 == 0) goto <D.22167>; else goto <D.21643>;
    <D.22167>:
    D.22127 = bb->live_in_set;
    if (D.22127 == 0B) goto <D.22170>; else goto <D.22171>;
    <D.22170>:
    D.22071 = cfg->mempool;
    bitsize.21 = (unsigned int) bitsize;
    max_vars.19 = (unsigned int) max_vars;
    D.22172 = mono_bitset_mp_new_noinit (D.22071, bitsize.21, max_vars.19);
    bb->live_in_set = D.22172;
    <D.22171>:
    D.22127 = bb->live_in_set;
    D.22173 = &D.22127->data;
    D.22132 = bb->live_out_set;
    D.22133 = &D.22132->data;
    D.22127 = bb->live_in_set;
    D.22174 = D.22127->size;
    D.22175 = D.22174 / 8;
    memcpy (D.22173, D.22133, D.22175);
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->kill_set;
      tmp_dest = bb->live_in_set;
      D.22176 = tmp_dest->size;
      D.22177 = D.22176 / 32;
      size = (int) D.22177;
      i = 0;
      goto <D.21631>;
      <D.21630>:
      D.22178 = tmp_dest->data[i];
      D.22179 = tmp_src->data[i];
      D.22180 = ~D.22179;
      D.22181 = D.22178 & D.22180;
      tmp_dest->data[i] = D.22181;
      i = i + 1;
      <D.21631>:
      if (i < size) goto <D.21630>; else goto <D.21632>;
      <D.21632>:
    }
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->gen_set;
      tmp_dest = bb->live_in_set;
      D.22182 = tmp_dest->size;
      D.22183 = D.22182 / 32;
      size = (int) D.22183;
      i = 0;
      goto <D.21638>;
      <D.21637>:
      D.22184 = tmp_dest->data[i];
      D.22185 = tmp_src->data[i];
      D.22186 = D.22184 | D.22185;
      tmp_dest->data[i] = D.22186;
      i = i + 1;
      <D.21638>:
      if (i < size) goto <D.21637>; else goto <D.21639>;
      <D.21639>:
    }
    j = 0;
    goto <D.21642>;
    <D.21641>:
    {
      struct MonoBasicBlock * in_bb;

      D.22113 = bb->in_bb;
      j.22 = (unsigned int) j;
      D.22080 = j.22 * 4;
      D.22114 = D.22113 + D.22080;
      in_bb = *D.22114;
      D.22187 = in_bb->gen_set;
      if (D.22187 != 0B) goto <D.22188>; else goto <D.22189>;
      <D.22188>:
      D.22190 = in_bb->dfn;
      D.22191 = (unsigned int) D.22190;
      D.22192 = D.22191 * 4;
      D.22193 = in_worklist + D.22192;
      D.22194 = *D.22193;
      if (D.22194 == 0) goto <D.22195>; else goto <D.22196>;
      <D.22195>:
      D.22049 = cfg->verbose_level;
      if (D.22049 > 1) goto <D.22197>; else goto <D.22198>;
      <D.22197>:
      D.22199 = in_bb->block_num;
      printf ("\tADD: %d\n", D.22199);
      <D.22198>:
      l_end.25 = l_end;
      l_end = l_end.25 + 1;
      D.22201 = l_end.25 * 4;
      D.22202 = worklist + D.22201;
      *D.22202 = in_bb;
      D.22190 = in_bb->dfn;
      D.22191 = (unsigned int) D.22190;
      D.22192 = D.22191 * 4;
      D.22193 = in_worklist + D.22192;
      *D.22193 = 1;
      <D.22196>:
      <D.22189>:
    }
    j = j + 1;
    <D.21642>:
    D.22117 = bb->in_count;
    D.22118 = (int) D.22117;
    if (D.22118 > j) goto <D.21641>; else goto <D.21643>;
    <D.21643>:
    D.22049 = cfg->verbose_level;
    D.22203 = D.22049 > 1;
    D.22204 = (long int) D.22203;
    D.22205 = __builtin_expect (D.22204, 0);
    if (D.22205 != 0) goto <D.22206>; else goto <D.22207>;
    <D.22206>:
    D.22112 = bb->block_num;
    printf ("\tLIVE IN  BB%d: ", D.22112);
    D.22127 = bb->live_in_set;
    mono_bitset_print (D.22127);
    <D.22207>:
  }
  <D.21601>:
  if (l_end != 0) goto <D.21644>; else goto <D.21645>;
  <D.21645>:
  D.22049 = cfg->verbose_level;
  if (D.22049 > 1) goto <D.22208>; else goto <D.22209>;
  <D.22208>:
  D.22091 = cfg->num_bblocks;
  printf ("IT: %d %d.\n", D.22091, out_iter);
  <D.22209>:
  mono_bitset_free (old_live_out_set);
  monoeg_g_free (worklist);
  monoeg_g_free (in_worklist);
  i = 0;
  goto <D.21662>;
  <D.21661>:
  {
    struct MonoBasicBlock * bb;

    D.22068 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22069 = i.20 * 4;
    D.22070 = D.22068 + D.22069;
    bb = *D.22070;
    D.22210 = bb->live_in_set;
    if (D.22210 == 0B) goto <D.22211>; else goto <D.22212>;
    <D.22211>:
    D.22071 = cfg->mempool;
    bitsize.21 = (unsigned int) bitsize;
    max_vars.19 = (unsigned int) max_vars;
    D.22213 = mono_bitset_mp_new (D.22071, bitsize.21, max_vars.19);
    bb->live_in_set = D.22213;
    D.22210 = bb->live_in_set;
    D.22214 = &D.22210->data;
    D.22215 = bb->live_out_set;
    D.22216 = &D.22215->data;
    D.22210 = bb->live_in_set;
    D.22217 = D.22210->size;
    D.22218 = D.22217 / 8;
    memcpy (D.22214, D.22216, D.22218);
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->kill_set;
      tmp_dest = bb->live_in_set;
      D.22219 = tmp_dest->size;
      D.22220 = D.22219 / 32;
      size = (int) D.22220;
      i = 0;
      goto <D.21652>;
      <D.21651>:
      D.22221 = tmp_dest->data[i];
      D.22222 = tmp_src->data[i];
      D.22223 = ~D.22222;
      D.22224 = D.22221 & D.22223;
      tmp_dest->data[i] = D.22224;
      i = i + 1;
      <D.21652>:
      if (i < size) goto <D.21651>; else goto <D.21653>;
      <D.21653>:
    }
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->gen_set;
      tmp_dest = bb->live_in_set;
      D.22225 = tmp_dest->size;
      D.22226 = D.22225 / 32;
      size = (int) D.22226;
      i = 0;
      goto <D.21659>;
      <D.21658>:
      D.22227 = tmp_dest->data[i];
      D.22228 = tmp_src->data[i];
      D.22229 = D.22227 | D.22228;
      tmp_dest->data[i] = D.22229;
      i = i + 1;
      <D.21659>:
      if (i < size) goto <D.21658>; else goto <D.21660>;
      <D.21660>:
    }
    <D.22212>:
  }
  i = i + 1;
  <D.21662>:
  i.23 = (unsigned int) i;
  D.22091 = cfg->num_bblocks;
  if (i.23 < D.22091) goto <D.21661>; else goto <D.21663>;
  <D.21663>:
  i = 0;
  goto <D.21679>;
  <D.21678>:
  {
    struct MonoBasicBlock * bb;
    guint32 max;
    guint32 abs_pos;
    struct MonoMethodVar * vars;

    D.22068 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22069 = i.20 * 4;
    D.22070 = D.22068 + D.22069;
    bb = *D.22070;
    D.22230 = bb->dfn;
    D.22231 = D.22230 << 16;
    abs_pos = (guint32) D.22231;
    vars = cfg->vars;
    D.22232 = bb->live_out_set;
    if (D.22232 == 0B) goto <D.22233>; else goto <D.22234>;
    <D.22233>:
    // predicted unlikely by continue predictor.
    goto <D.21668>;
    <D.22234>:
    max_vars.26 = (unsigned int) max_vars;
    D.22236 = max_vars.26 + 31;
    max = D.22236 / 32;
    j = 0;
    goto <D.21676>;
    <D.21675>:
    {
      gsize bits_in;
      gsize bits_out;
      int k;

      D.22237 = bb->live_in_set;
      bits_in = D.22237->data[j];
      D.22232 = bb->live_out_set;
      bits_out = D.22232->data[j];
      j.22 = (unsigned int) j;
      D.22238 = j.22 * 32;
      k = (int) D.22238;
      goto <D.21673>;
      <D.21672>:
      D.22239 = bits_in & 1;
      if (D.22239 != 0) goto <D.22240>; else goto <D.22241>;
      <D.22240>:
      k.27 = (unsigned int) k;
      D.22243 = k.27 * 56;
      D.22244 = vars + D.22243;
      abs_pos.28 = (int) abs_pos;
      update_live_range (D.22244, abs_pos.28);
      <D.22241>:
      D.22246 = bits_out & 1;
      if (D.22246 != 0) goto <D.22247>; else goto <D.22248>;
      <D.22247>:
      k.27 = (unsigned int) k;
      D.22243 = k.27 * 56;
      D.22244 = vars + D.22243;
      D.22249 = abs_pos + 65535;
      D.22250 = (int) D.22249;
      update_live_range (D.22244, D.22250);
      <D.22248>:
      bits_in = bits_in >> 1;
      bits_out = bits_out >> 1;
      k = k + 1;
      <D.21673>:
      if (bits_in != 0) goto <D.21672>; else goto <D.22251>;
      <D.22251>:
      if (bits_out != 0) goto <D.21672>; else goto <D.21674>;
      <D.21674>:
    }
    j = j + 1;
    <D.21676>:
    j.29 = (unsigned int) j;
    if (j.29 < max) goto <D.21675>; else goto <D.21677>;
    <D.21677>:
  }
  <D.21668>:
  i = i + 1;
  <D.21679>:
  i.23 = (unsigned int) i;
  D.22091 = cfg->num_bblocks;
  if (i.23 < D.22091) goto <D.21678>; else goto <D.21680>;
  <D.21680>:
  i = 0;
  goto <D.21683>;
  <D.21682>:
  {
    struct MonoMethodVar * vi;

    D.22064 = cfg->vars;
    i.20 = (unsigned int) i;
    D.22066 = i.20 * 56;
    vi = D.22064 + D.22066;
    D.22253 = cfg->varinfo;
    D.22254 = vi->idx;
    D.22255 = D.22254 * 4;
    D.22256 = D.22253 + D.22255;
    D.22257 = *D.22256;
    D.22258 = D.22257->opcode;
    if (D.22258 == 330) goto <D.22259>; else goto <D.22260>;
    <D.22259>:
    D.22261 = vi->range.last_use.abs_pos;
    if (D.22261 == 0) goto <D.22262>; else goto <D.22263>;
    <D.22262>:
    D.22253 = cfg->varinfo;
    D.22254 = vi->idx;
    D.22255 = D.22254 * 4;
    D.22256 = D.22253 + D.22255;
    D.22257 = *D.22256;
    D.22264 = D.22257->flags;
    D.22265 = (int) D.22264;
    D.22266 = D.22265 & 20;
    if (D.22266 == 0) goto <D.22267>; else goto <D.22268>;
    <D.22267>:
    D.22271 = BIT_FIELD_REF <*cfg, 32, 3392>;
    D.22272 = D.22271 & 8388608;
    if (D.22272 == 0) goto <D.22273>; else goto <D.22274>;
    <D.22273>:
    D.22275 = cfg->generic_sharing_context;
    if (D.22275 == 0B) goto <D.22269>; else goto <D.22276>;
    <D.22276>:
    D.22277 = cfg->method;
    D.22278 = mono_method_signature (D.22277);
    D.22279 = BIT_FIELD_REF <*D.22278, 32, 64>;
    D.22280 = D.22279 & 4194304;
    if (D.22280 == 0) goto <D.22269>; else goto <D.22281>;
    <D.22281>:
    D.22253 = cfg->varinfo;
    D.22254 = vi->idx;
    D.22255 = D.22254 * 4;
    D.22256 = D.22253 + D.22255;
    D.22257 = *D.22256;
    D.22282 = cfg->args;
    D.22283 = *D.22282;
    if (D.22257 != D.22283) goto <D.22269>; else goto <D.22270>;
    <D.22269>:
    D.22253 = cfg->varinfo;
    D.22254 = vi->idx;
    D.22255 = D.22254 * 4;
    D.22256 = D.22253 + D.22255;
    D.22257 = *D.22256;
    D.22253 = cfg->varinfo;
    D.22254 = vi->idx;
    D.22255 = D.22254 * 4;
    D.22256 = D.22253 + D.22255;
    D.22257 = *D.22256;
    D.22264 = D.22257->flags;
    D.22284 = D.22264 | 2;
    D.22257->flags = D.22284;
    <D.22270>:
    <D.22274>:
    <D.22268>:
    <D.22263>:
    vi->range.first_use.abs_pos = 0;
    <D.22260>:
  }
  i = i + 1;
  <D.21683>:
  if (i < max_vars) goto <D.21682>; else goto <D.21684>;
  <D.21684>:
  D.22049 = cfg->verbose_level;
  if (D.22049 > 1) goto <D.22285>; else goto <D.22286>;
  <D.22285>:
  D.22091 = cfg->num_bblocks;
  D.22287 = D.22091 + 4294967295;
  i = (int) D.22287;
  goto <D.21687>;
  <D.21686>:
  {
    struct MonoBasicBlock * bb;

    D.22068 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22069 = i.20 * 4;
    D.22070 = D.22068 + D.22069;
    bb = *D.22070;
    D.22288 = bb->block_num;
    printf ("LIVE IN  BB%d: ", D.22288);
    D.22289 = bb->live_in_set;
    mono_bitset_print (D.22289);
    D.22288 = bb->block_num;
    printf ("LIVE OUT BB%d: ", D.22288);
    D.22290 = bb->live_out_set;
    mono_bitset_print (D.22290);
  }
  i = i + -1;
  <D.21687>:
  if (i >= 0) goto <D.21686>; else goto <D.21688>;
  <D.21688>:
  i = 0;
  goto <D.21691>;
  <D.21690>:
  {
    struct MonoMethodVar * vi;

    D.22064 = cfg->vars;
    i.20 = (unsigned int) i;
    D.22066 = i.20 * 56;
    vi = D.22064 + D.22066;
    D.22291 = vi->range.first_use.abs_pos;
    D.22292 = vi->range.last_use.abs_pos;
    printf ("V%d: [0x%x - 0x%x]\n", i, D.22291, D.22292);
  }
  i = i + 1;
  <D.21691>:
  if (i < max_vars) goto <D.21690>; else goto <D.21692>;
  <D.21692>:
  <D.22286>:
  D.22271 = BIT_FIELD_REF <*cfg, 32, 3392>;
  D.22293 = D.22271 & 524288;
  if (D.22293 == 0) goto <D.22294>; else goto <D.22295>;
  <D.22294>:
  optimize_initlocals (cfg);
  <D.22295>:
}


analyze_liveness_bb (struct MonoCompile * cfg, struct MonoBasicBlock * bb)
{
  int D.22297;
  int D.22298;
  short unsigned int D.22299;
  int D.22300;
  int D.22301;
  int D.22302;
  unsigned int D.22303;
  struct MonoMethodVar * D.22310;
  unsigned int idx.30;
  unsigned int D.22312;
  int D.22315;
  struct MonoMethodVar * D.22316;
  unsigned int inst_num.31;
  unsigned int D.22318;
  int D.22319;
  struct MonoBitSet * D.22320;
  unsigned int D.22321;
  unsigned int D.22322;
  int D.22323;
  unsigned int D.22324;
  unsigned int D.22325;
  struct MonoBitSet * D.22328;
  unsigned int D.22329;
  unsigned int D.22330;
  unsigned int D.22331;
  int D.22332;
  signed char D.22333;
  int D.22334;
  int D.22335;
  int D.22336;
  int D.22337;
  int D.22338;
  int D.22339;
  int D.22340;
  signed char D.22341;
  int D.22342;
  sizetype D.22343;
  const char * D.22344;
  char D.22345;
  unsigned int sreg.32;
  unsigned int D.22349;
  struct MonoInst * * D.22352;
  unsigned int sreg.33;
  unsigned int D.22354;
  struct MonoInst * * D.22355;
  struct MonoInst * D.22356;
  struct MonoInst * iftmp.34;
  unsigned int idx.35;
  unsigned int D.22364;
  struct MonoMethodVar * D.22367;
  unsigned int D.22368;
  unsigned int D.22369;
  int D.22370;
  unsigned int D.22371;
  unsigned int D.22372;
  unsigned int D.22375;
  unsigned int D.22376;
  unsigned int D.22377;
  int D.22378;
  int D.22379;
  char D.22380;
  int D.22383;
  unsigned int D.22384;
  unsigned int D.22387;
  unsigned int D.22388;
  struct MonoInst * * D.22389;
  struct MonoInst * D.22390;
  struct MonoInst * iftmp.36;
  unsigned int idx.37;
  unsigned int D.22398;
  short unsigned int D.22399;
  struct MonoMethodVar * D.22402;
  unsigned int D.22403;
  unsigned int D.22404;
  int D.22405;
  unsigned int D.22406;
  unsigned int D.22407;
  unsigned int D.22410;
  unsigned int D.22411;
  unsigned int D.22412;
  int D.22413;
  int D.22414;
  unsigned int D.22418;
  int D.22419;
  unsigned int D.22420;
  unsigned int D.22421;
  unsigned int D.22422;
  struct MonoInst * ins;
  int sreg;
  int inst_num;
  struct MonoMethodVar * vars;
  guint32 abs_pos;

  vars = cfg->vars;
  D.22297 = bb->dfn;
  D.22298 = D.22297 << 16;
  abs_pos = (guint32) D.22298;
  inst_num = 2;
  ins = bb->code;
  goto <D.21564>;
  <D.21563>:
  {
    const char * spec;
    int num_sregs;
    int i;
    int sregs[3];

    try
      {
        D.22299 = ins->opcode;
        D.22300 = (int) D.22299;
        D.22301 = D.22300 + -313;
        D.22302 = D.22301 * 4;
        spec = &ins_info[D.22302];
        D.22303 = cfg->verbose_level;
        if (D.22303 > 1) goto <D.22304>; else goto <D.22305>;
        <D.22304>:
        printf ("\t");
        mono_print_ins (ins);
        <D.22305>:
        D.22299 = ins->opcode;
        if (D.22299 == 316) goto <D.22306>; else goto <D.22307>;
        <D.22306>:
        // predicted unlikely by continue predictor.
        goto <D.21550>;
        <D.22307>:
        D.22299 = ins->opcode;
        if (D.22299 == 314) goto <D.22308>; else goto <D.22309>;
        <D.22308>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          var = ins->data.op[0].p;
          idx = var->data.op[0].const_val;
          D.22310 = cfg->vars;
          idx.30 = (unsigned int) idx;
          D.22312 = idx.30 * 56;
          vi = D.22310 + D.22312;
          D.22303 = cfg->verbose_level;
          if (D.22303 > 1) goto <D.22313>; else goto <D.22314>;
          <D.22313>:
          D.22315 = var->dreg;
          printf ("\tGEN: R%d(%d)\n", D.22315, idx);
          <D.22314>:
          idx.30 = (unsigned int) idx;
          D.22312 = idx.30 * 56;
          D.22316 = vars + D.22312;
          inst_num.31 = (unsigned int) inst_num;
          D.22318 = abs_pos + inst_num.31;
          D.22319 = (int) D.22318;
          update_live_range (D.22316, D.22319);
          D.22320 = bb->kill_set;
          idx.30 = (unsigned int) idx;
          D.22321 = idx.30 / 32;
          D.22322 = D.22320->data[D.22321];
          D.22323 = idx & 31;
          D.22324 = 1 << D.22323;
          D.22325 = D.22322 & D.22324;
          if (D.22325 == 0) goto <D.22326>; else goto <D.22327>;
          <D.22326>:
          D.22328 = bb->gen_set;
          idx.30 = (unsigned int) idx;
          D.22329 = idx.30 / 32;
          D.22328 = bb->gen_set;
          D.22330 = D.22328->data[D.22329];
          D.22323 = idx & 31;
          D.22324 = 1 << D.22323;
          D.22331 = D.22330 | D.22324;
          D.22328->data[D.22329] = D.22331;
          <D.22327>:
          D.22332 = vi->spill_costs;
          D.22333 = bb->nesting;
          D.22334 = (int) D.22333;
          D.22335 = D.22334 << 1;
          D.22336 = 1 << D.22335;
          D.22337 = D.22332 + D.22336;
          vi->spill_costs = D.22337;
        }
        <D.22309>:
        D.22338 = ins->sreg1;
        sregs[0] = D.22338;
        D.22339 = ins->sreg2;
        sregs[1] = D.22339;
        D.22340 = ins->sreg3;
        sregs[2] = D.22340;
        D.22299 = ins->opcode;
        D.22300 = (int) D.22299;
        D.22301 = D.22300 + -313;
        D.22341 = ins_sreg_counts[D.22301];
        num_sregs = (int) D.22341;
        i = 0;
        goto <D.21558>;
        <D.21557>:
        sreg = sregs[i];
        D.22342 = i + 1;
        D.22343 = (sizetype) D.22342;
        D.22344 = spec + D.22343;
        D.22345 = *D.22344;
        if (D.22345 != 32) goto <D.22346>; else goto <D.22347>;
        <D.22346>:
        sreg.32 = (unsigned int) sreg;
        D.22349 = cfg->vreg_to_inst_len;
        if (sreg.32 < D.22349) goto <D.22350>; else goto <D.22351>;
        <D.22350>:
        D.22352 = cfg->vreg_to_inst;
        sreg.33 = (unsigned int) sreg;
        D.22354 = sreg.33 * 4;
        D.22355 = D.22352 + D.22354;
        D.22356 = *D.22355;
        if (D.22356 != 0B) goto <D.22357>; else goto <D.22358>;
        <D.22357>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          sreg.32 = (unsigned int) sreg;
          D.22349 = cfg->vreg_to_inst_len;
          if (sreg.32 < D.22349) goto <D.22360>; else goto <D.22361>;
          <D.22360>:
          D.22352 = cfg->vreg_to_inst;
          sreg.33 = (unsigned int) sreg;
          D.22354 = sreg.33 * 4;
          D.22355 = D.22352 + D.22354;
          iftmp.34 = *D.22355;
          goto <D.22362>;
          <D.22361>:
          iftmp.34 = 0B;
          <D.22362>:
          var = iftmp.34;
          idx = var->data.op[0].const_val;
          D.22310 = cfg->vars;
          idx.35 = (unsigned int) idx;
          D.22364 = idx.35 * 56;
          vi = D.22310 + D.22364;
          D.22303 = cfg->verbose_level;
          if (D.22303 > 1) goto <D.22365>; else goto <D.22366>;
          <D.22365>:
          printf ("\tGEN: R%d(%d)\n", sreg, idx);
          <D.22366>:
          idx.35 = (unsigned int) idx;
          D.22364 = idx.35 * 56;
          D.22367 = vars + D.22364;
          inst_num.31 = (unsigned int) inst_num;
          D.22318 = abs_pos + inst_num.31;
          D.22319 = (int) D.22318;
          update_live_range (D.22367, D.22319);
          D.22320 = bb->kill_set;
          idx.35 = (unsigned int) idx;
          D.22368 = idx.35 / 32;
          D.22369 = D.22320->data[D.22368];
          D.22370 = idx & 31;
          D.22371 = 1 << D.22370;
          D.22372 = D.22369 & D.22371;
          if (D.22372 == 0) goto <D.22373>; else goto <D.22374>;
          <D.22373>:
          D.22328 = bb->gen_set;
          idx.35 = (unsigned int) idx;
          D.22375 = idx.35 / 32;
          D.22328 = bb->gen_set;
          D.22376 = D.22328->data[D.22375];
          D.22370 = idx & 31;
          D.22371 = 1 << D.22370;
          D.22377 = D.22376 | D.22371;
          D.22328->data[D.22375] = D.22377;
          <D.22374>:
          D.22378 = vi->spill_costs;
          D.22333 = bb->nesting;
          D.22334 = (int) D.22333;
          D.22335 = D.22334 << 1;
          D.22336 = 1 << D.22335;
          D.22379 = D.22378 + D.22336;
          vi->spill_costs = D.22379;
        }
        <D.22358>:
        <D.22351>:
        <D.22347>:
        i = i + 1;
        <D.21558>:
        if (i < num_sregs) goto <D.21557>; else goto <D.21559>;
        <D.21559>:
        D.22380 = *spec;
        if (D.22380 != 32) goto <D.22381>; else goto <D.22382>;
        <D.22381>:
        D.22383 = ins->dreg;
        D.22384 = (unsigned int) D.22383;
        D.22349 = cfg->vreg_to_inst_len;
        if (D.22384 < D.22349) goto <D.22385>; else goto <D.22386>;
        <D.22385>:
        D.22352 = cfg->vreg_to_inst;
        D.22383 = ins->dreg;
        D.22387 = (unsigned int) D.22383;
        D.22388 = D.22387 * 4;
        D.22389 = D.22352 + D.22388;
        D.22390 = *D.22389;
        if (D.22390 != 0B) goto <D.22391>; else goto <D.22392>;
        <D.22391>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          D.22383 = ins->dreg;
          D.22384 = (unsigned int) D.22383;
          D.22349 = cfg->vreg_to_inst_len;
          if (D.22384 < D.22349) goto <D.22394>; else goto <D.22395>;
          <D.22394>:
          D.22352 = cfg->vreg_to_inst;
          D.22383 = ins->dreg;
          D.22387 = (unsigned int) D.22383;
          D.22388 = D.22387 * 4;
          D.22389 = D.22352 + D.22388;
          iftmp.36 = *D.22389;
          goto <D.22396>;
          <D.22395>:
          iftmp.36 = 0B;
          <D.22396>:
          var = iftmp.36;
          idx = var->data.op[0].const_val;
          D.22310 = cfg->vars;
          idx.37 = (unsigned int) idx;
          D.22398 = idx.37 * 56;
          vi = D.22310 + D.22398;
          D.22299 = ins->opcode;
          D.22399 = D.22299 + 65162;
          if (D.22399 <= 13) goto <D.22400>; else goto <D.22401>;
          <D.22400>:
          idx.37 = (unsigned int) idx;
          D.22398 = idx.37 * 56;
          D.22402 = vars + D.22398;
          inst_num.31 = (unsigned int) inst_num;
          D.22318 = abs_pos + inst_num.31;
          D.22319 = (int) D.22318;
          update_live_range (D.22402, D.22319);
          D.22320 = bb->kill_set;
          idx.37 = (unsigned int) idx;
          D.22403 = idx.37 / 32;
          D.22404 = D.22320->data[D.22403];
          D.22405 = idx & 31;
          D.22406 = 1 << D.22405;
          D.22407 = D.22404 & D.22406;
          if (D.22407 == 0) goto <D.22408>; else goto <D.22409>;
          <D.22408>:
          D.22328 = bb->gen_set;
          idx.37 = (unsigned int) idx;
          D.22410 = idx.37 / 32;
          D.22328 = bb->gen_set;
          D.22411 = D.22328->data[D.22410];
          D.22405 = idx & 31;
          D.22406 = 1 << D.22405;
          D.22412 = D.22411 | D.22406;
          D.22328->data[D.22410] = D.22412;
          <D.22409>:
          D.22413 = vi->spill_costs;
          D.22333 = bb->nesting;
          D.22334 = (int) D.22333;
          D.22335 = D.22334 << 1;
          D.22336 = 1 << D.22335;
          D.22414 = D.22413 + D.22336;
          vi->spill_costs = D.22414;
          goto <D.22415>;
          <D.22401>:
          D.22303 = cfg->verbose_level;
          if (D.22303 > 1) goto <D.22416>; else goto <D.22417>;
          <D.22416>:
          D.22383 = ins->dreg;
          printf ("\tKILL: R%d(%d)\n", D.22383, idx);
          <D.22417>:
          idx.37 = (unsigned int) idx;
          D.22398 = idx.37 * 56;
          D.22402 = vars + D.22398;
          inst_num.31 = (unsigned int) inst_num;
          D.22318 = abs_pos + inst_num.31;
          D.22418 = D.22318 + 1;
          D.22419 = (int) D.22418;
          update_live_range (D.22402, D.22419);
          D.22320 = bb->kill_set;
          idx.37 = (unsigned int) idx;
          D.22420 = idx.37 / 32;
          D.22320 = bb->kill_set;
          D.22421 = D.22320->data[D.22420];
          D.22405 = idx & 31;
          D.22406 = 1 << D.22405;
          D.22422 = D.22421 | D.22406;
          D.22320->data[D.22420] = D.22422;
          D.22413 = vi->spill_costs;
          D.22333 = bb->nesting;
          D.22334 = (int) D.22333;
          D.22335 = D.22334 << 1;
          D.22336 = 1 << D.22335;
          D.22414 = D.22413 + D.22336;
          vi->spill_costs = D.22414;
          <D.22415>:
        }
        <D.22392>:
        <D.22386>:
        <D.22382>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21550>:
  ins = ins->next;
  inst_num = inst_num + 2;
  <D.21564>:
  if (ins != 0B) goto <D.21563>; else goto <D.21565>;
  <D.21565>:
}


mono_bitset_mp_new_noinit (struct MonoMemPool * mp, guint32 size, guint32 max_size)
{
  struct MonoBitSet * D.22425;
  guint8 * mem;

  mem = mono_mempool_alloc (mp, size);
  D.22425 = mono_bitset_mem_new (mem, max_size, 1);
  return D.22425;
}


mono_bitset_mp_new (struct MonoMemPool * mp, guint32 size, guint32 max_size)
{
  struct MonoBitSet * D.22427;
  guint8 * mem;

  mem = mono_mempool_alloc0 (mp, size);
  D.22427 = mono_bitset_mem_new (mem, max_size, 1);
  return D.22427;
}


memcpy (void * restrict __dest, const void * restrict __src, size_t __len)
{
  void * D.22429;
  unsigned int D.22430;

  D.22430 = __builtin_object_size (__dest, 0);
  D.22429 = __builtin___memcpy_chk (__dest, __src, __len, D.22430);
  return D.22429;
}


update_live_range (struct MonoMethodVar * var, int abs_pos)
{
  unsigned int D.22432;
  unsigned int abs_pos.38;
  unsigned int D.22436;

  D.22432 = var->range.first_use.abs_pos;
  abs_pos.38 = (unsigned int) abs_pos;
  if (D.22432 > abs_pos.38) goto <D.22434>; else goto <D.22435>;
  <D.22434>:
  abs_pos.38 = (unsigned int) abs_pos;
  var->range.first_use.abs_pos = abs_pos.38;
  <D.22435>:
  D.22436 = var->range.last_use.abs_pos;
  abs_pos.38 = (unsigned int) abs_pos;
  if (D.22436 < abs_pos.38) goto <D.22437>; else goto <D.22438>;
  <D.22437>:
  abs_pos.38 = (unsigned int) abs_pos;
  var->range.last_use.abs_pos = abs_pos.38;
  <D.22438>:
}


mono_bitset_print (struct MonoBitSet * set)
{
  unsigned int i.39;
  int D.22440;
  unsigned int D.22445;
  int i;
  gboolean first;

  first = 1;
  printf ("{");
  i = 0;
  goto <D.21478>;
  <D.21477>:
  i.39 = (unsigned int) i;
  D.22440 = mono_bitset_test (set, i.39);
  if (D.22440 != 0) goto <D.22441>; else goto <D.22442>;
  <D.22441>:
  if (first == 0) goto <D.22443>; else goto <D.22444>;
  <D.22443>:
  printf (", ");
  <D.22444>:
  printf ("%d", i);
  first = 0;
  <D.22442>:
  i = i + 1;
  <D.21478>:
  i.39 = (unsigned int) i;
  D.22445 = mono_bitset_size (set);
  if (i.39 < D.22445) goto <D.21477>; else goto <D.21479>;
  <D.21479>:
  printf ("}\n");
}


optimize_initlocals (struct MonoCompile * cfg)
{
  unsigned int D.22446;
  unsigned int D.22447;
  struct MonoBasicBlock * D.22448;
  int D.22449;
  int D.22450;
  int D.22451;
  short unsigned int D.22452;
  int D.22453;
  int D.22454;
  signed char D.22455;
  int D.22456;
  unsigned int D.22457;
  unsigned int D.22458;
  unsigned int D.22459;
  int D.22460;
  unsigned int D.22461;
  unsigned int D.22462;
  short unsigned int D.22463;
  int D.22466;
  unsigned int D.22467;
  unsigned int D.22468;
  unsigned int D.22469;
  int D.22470;
  unsigned int D.22471;
  unsigned int D.22472;
  int D.22473;
  char D.22474;
  struct MonoInst * iftmp.40;
  unsigned int D.22480;
  unsigned int D.22481;
  struct MonoInst * * D.22484;
  unsigned int D.22485;
  struct MonoInst * * D.22486;
  unsigned int D.22490;
  unsigned int D.22491;
  unsigned int D.22492;
  struct MonoBitSet * D.22495;
  int D.22496;
  unsigned int D.22497;
  unsigned int D.22498;
  unsigned int D.22499;
  int D.22500;
  unsigned int D.22501;
  unsigned int D.22502;
  struct MonoInst * D.22505;
  unsigned char D.22508;
  int D.22509;
  int D.22510;
  unsigned int D.22513;
  unsigned int D.22514;
  unsigned char D.22517;
  short unsigned int D.22522;
  struct MonoMethodVar * D.22524;
  unsigned int D.22525;
  struct MonoMethodVar * D.22526;
  int D.22527;
  int D.22528;
  struct MonoBitSet * used;
  struct MonoInst * ins;
  struct MonoBasicBlock * initlocals_bb;

  D.22446 = cfg->next_vreg;
  D.22447 = D.22446 + 1;
  used = mono_bitset_new (D.22447, 0);
  mono_bitset_clear_all (used);
  D.22448 = cfg->bb_entry;
  initlocals_bb = D.22448->next_bb;
  ins = initlocals_bb->code;
  goto <D.21706>;
  <D.21705>:
  {
    int num_sregs;
    int i;
    int sregs[3];

    try
      {
        D.22449 = ins->sreg1;
        sregs[0] = D.22449;
        D.22450 = ins->sreg2;
        sregs[1] = D.22450;
        D.22451 = ins->sreg3;
        sregs[2] = D.22451;
        D.22452 = ins->opcode;
        D.22453 = (int) D.22452;
        D.22454 = D.22453 + -313;
        D.22455 = ins_sreg_counts[D.22454];
        num_sregs = (int) D.22455;
        i = 0;
        goto <D.21703>;
        <D.21702>:
        D.22456 = sregs[i];
        D.22457 = (unsigned int) D.22456;
        D.22458 = D.22457 / 32;
        D.22459 = used->data[D.22458];
        D.22456 = sregs[i];
        D.22460 = D.22456 & 31;
        D.22461 = 1 << D.22460;
        D.22462 = D.22459 | D.22461;
        used->data[D.22458] = D.22462;
        i = i + 1;
        <D.21703>:
        if (i < num_sregs) goto <D.21702>; else goto <D.21704>;
        <D.21704>:
        D.22452 = ins->opcode;
        D.22463 = D.22452 + 65162;
        if (D.22463 <= 13) goto <D.22464>; else goto <D.22465>;
        <D.22464>:
        D.22466 = ins->dreg;
        D.22467 = (unsigned int) D.22466;
        D.22468 = D.22467 / 32;
        D.22469 = used->data[D.22468];
        D.22466 = ins->dreg;
        D.22470 = D.22466 & 31;
        D.22471 = 1 << D.22470;
        D.22472 = D.22469 | D.22471;
        used->data[D.22468] = D.22472;
        <D.22465>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  ins = ins->next;
  <D.21706>:
  if (ins != 0B) goto <D.21705>; else goto <D.21707>;
  <D.21707>:
  ins = initlocals_bb->code;
  goto <D.21712>;
  <D.21711>:
  {
    const char * spec;

    D.22452 = ins->opcode;
    D.22453 = (int) D.22452;
    D.22454 = D.22453 + -313;
    D.22473 = D.22454 * 4;
    spec = &ins_info[D.22473];
    D.22474 = *spec;
    if (D.22474 != 32) goto <D.22475>; else goto <D.22476>;
    <D.22475>:
    D.22452 = ins->opcode;
    D.22463 = D.22452 + 65162;
    if (D.22463 > 13) goto <D.22477>; else goto <D.22478>;
    <D.22477>:
    {
      struct MonoInst * var;

      D.22466 = ins->dreg;
      D.22480 = (unsigned int) D.22466;
      D.22481 = cfg->vreg_to_inst_len;
      if (D.22480 < D.22481) goto <D.22482>; else goto <D.22483>;
      <D.22482>:
      D.22484 = cfg->vreg_to_inst;
      D.22466 = ins->dreg;
      D.22467 = (unsigned int) D.22466;
      D.22485 = D.22467 * 4;
      D.22486 = D.22484 + D.22485;
      iftmp.40 = *D.22486;
      goto <D.22487>;
      <D.22483>:
      iftmp.40 = 0B;
      <D.22487>:
      var = iftmp.40;
      if (var != 0B) goto <D.22488>; else goto <D.22489>;
      <D.22488>:
      D.22466 = ins->dreg;
      D.22467 = (unsigned int) D.22466;
      D.22490 = D.22467 / 32;
      D.22491 = used->data[D.22490];
      D.22466 = ins->dreg;
      D.22470 = D.22466 & 31;
      D.22471 = 1 << D.22470;
      D.22492 = D.22491 & D.22471;
      if (D.22492 == 0) goto <D.22493>; else goto <D.22494>;
      <D.22493>:
      D.22495 = initlocals_bb->live_out_set;
      D.22496 = var->data.op[0].const_val;
      D.22497 = (unsigned int) D.22496;
      D.22498 = D.22497 / 32;
      D.22499 = D.22495->data[D.22498];
      D.22496 = var->data.op[0].const_val;
      D.22500 = D.22496 & 31;
      D.22501 = 1 << D.22500;
      D.22502 = D.22499 & D.22501;
      if (D.22502 == 0) goto <D.22503>; else goto <D.22504>;
      <D.22503>:
      D.22505 = cfg->ret;
      if (D.22505 != var) goto <D.22506>; else goto <D.22507>;
      <D.22506>:
      D.22508 = var->flags;
      D.22509 = (int) D.22508;
      D.22510 = D.22509 & 20;
      if (D.22510 == 0) goto <D.22511>; else goto <D.22512>;
      <D.22511>:
      D.22513 = BIT_FIELD_REF <*cfg, 32, 3392>;
      D.22514 = D.22513 & 1048576;
      if (D.22514 != 0) goto <D.22515>; else goto <D.22516>;
      <D.22515>:
      D.22517 = var->type;
      if (D.22517 == 6) goto <D.22518>; else goto <D.22519>;
      <D.22518>:
      // predicted unlikely by continue predictor.
      goto <D.21710>;
      <D.22519>:
      <D.22516>:
      D.22452 = ins->opcode;
      D.22522 = D.22452 + 65174;
      if (D.22522 <= 1) goto <D.22520>; else goto <D.22523>;
      <D.22523>:
      D.22452 = ins->opcode;
      if (D.22452 == 365) goto <D.22520>; else goto <D.22521>;
      <D.22520>:
      ins->opcode = 316;
      ins->dreg = -1;
      ins->sreg3 = -1;
      D.22451 = ins->sreg3;
      ins->sreg2 = D.22451;
      D.22450 = ins->sreg2;
      ins->sreg1 = D.22450;
      D.22524 = cfg->vars;
      D.22496 = var->data.op[0].const_val;
      D.22497 = (unsigned int) D.22496;
      D.22525 = D.22497 * 56;
      D.22526 = D.22524 + D.22525;
      D.22524 = cfg->vars;
      D.22496 = var->data.op[0].const_val;
      D.22497 = (unsigned int) D.22496;
      D.22525 = D.22497 * 56;
      D.22526 = D.22524 + D.22525;
      D.22527 = D.22526->spill_costs;
      D.22528 = D.22527 + -1;
      D.22526->spill_costs = D.22528;
      <D.22521>:
      <D.22512>:
      <D.22507>:
      <D.22504>:
      <D.22494>:
      <D.22489>:
    }
    <D.22478>:
    <D.22476>:
  }
  <D.21710>:
  ins = ins->next;
  <D.21712>:
  if (ins != 0B) goto <D.21711>; else goto <D.21713>;
  <D.21713>:
  monoeg_g_free (used);
}


mono_linterval_add_range (struct MonoCompile * cfg, struct MonoLiveInterval * interval, int from, int to)
{
  _Bool D.22529;
  long int D.22530;
  long int D.22531;
  int iftmp.41;
  struct MonoLiveRange2 * D.22537;
  int D.22539;
  _Bool D.22542;
  long int D.22543;
  long int D.22544;
  int D.22548;
  int D.22552;
  struct MonoMemPool * D.22558;
  struct MonoLiveRange2 * prev_range;
  struct MonoLiveRange2 * next_range;
  struct MonoLiveRange2 * new_range;

  D.22529 = to < from;
  D.22530 = (long int) D.22529;
  D.22531 = __builtin_expect (D.22530, 0);
  if (D.22531 != 0) goto <D.22532>; else goto <D.22533>;
  <D.22532>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 637, "to >= from");
  <D.22533>:
  D.22537 = interval->range;
  if (D.22537 != 0B) goto <D.22538>; else goto <D.22535>;
  <D.22538>:
  D.22537 = interval->range;
  D.22539 = D.22537->from;
  if (D.22539 > from) goto <D.22540>; else goto <D.22535>;
  <D.22540>:
  D.22537 = interval->range;
  D.22539 = D.22537->from;
  if (D.22539 == to) goto <D.22541>; else goto <D.22535>;
  <D.22541>:
  iftmp.41 = 1;
  goto <D.22536>;
  <D.22535>:
  iftmp.41 = 0;
  <D.22536>:
  D.22542 = iftmp.41 != 0;
  D.22543 = (long int) D.22542;
  D.22544 = __builtin_expect (D.22543, 1);
  if (D.22544 != 0) goto <D.22545>; else goto <D.22546>;
  <D.22545>:
  D.22537 = interval->range;
  D.22537->from = from;
  return;
  <D.22546>:
  prev_range = 0B;
  next_range = interval->range;
  goto <D.21724>;
  <D.21723>:
  prev_range = next_range;
  next_range = next_range->next;
  <D.21724>:
  if (next_range != 0B) goto <D.22547>; else goto <D.21725>;
  <D.22547>:
  D.22548 = next_range->from;
  if (D.22548 <= from) goto <D.21723>; else goto <D.21725>;
  <D.21725>:
  if (prev_range != 0B) goto <D.22551>; else goto <D.22549>;
  <D.22551>:
  D.22552 = prev_range->to;
  if (D.22552 == from) goto <D.22553>; else goto <D.22549>;
  <D.22553>:
  prev_range->to = to;
  goto <D.22550>;
  <D.22549>:
  if (next_range != 0B) goto <D.22556>; else goto <D.22554>;
  <D.22556>:
  D.22548 = next_range->from;
  if (D.22548 == to) goto <D.22557>; else goto <D.22554>;
  <D.22557>:
  next_range->from = from;
  goto <D.22555>;
  <D.22554>:
  D.22558 = cfg->mempool;
  new_range = mono_mempool_alloc (D.22558, 12);
  new_range->from = from;
  new_range->to = to;
  new_range->next = 0B;
  if (prev_range != 0B) goto <D.22559>; else goto <D.22560>;
  <D.22559>:
  prev_range->next = new_range;
  goto <D.22561>;
  <D.22560>:
  interval->range = new_range;
  <D.22561>:
  if (next_range != 0B) goto <D.22562>; else goto <D.22563>;
  <D.22562>:
  new_range->next = next_range;
  goto <D.22564>;
  <D.22563>:
  interval->last_range = new_range;
  <D.22564>:
  <D.22555>:
  <D.22550>:
}


mono_linterval_print (struct MonoLiveInterval * interval)
{
  int D.22566;
  int D.22567;
  struct MonoLiveRange2 * range;

  range = interval->range;
  goto <D.21731>;
  <D.21730>:
  D.22566 = range->from;
  D.22567 = range->to;
  printf ("[%x-%x] ", D.22566, D.22567);
  range = range->next;
  <D.21731>:
  if (range != 0B) goto <D.21730>; else goto <D.21732>;
  <D.21732>:
}


mono_linterval_print_nl (struct MonoLiveInterval * interval)
{
  mono_linterval_print (interval);
  printf ("\n");
}


mono_linterval_covers (struct MonoLiveInterval * interval, int pos)
{
  int D.22568;
  int D.22571;
  gboolean D.22574;
  struct MonoLiveRange2 * range;

  range = interval->range;
  goto <D.21742>;
  <D.21741>:
  D.22568 = range->from;
  if (D.22568 <= pos) goto <D.22569>; else goto <D.22570>;
  <D.22569>:
  D.22571 = range->to;
  if (D.22571 >= pos) goto <D.22572>; else goto <D.22573>;
  <D.22572>:
  D.22574 = 1;
  return D.22574;
  <D.22573>:
  <D.22570>:
  D.22568 = range->from;
  if (D.22568 > pos) goto <D.22575>; else goto <D.22576>;
  <D.22575>:
  D.22574 = 0;
  return D.22574;
  <D.22576>:
  range = range->next;
  <D.21742>:
  if (range != 0B) goto <D.21741>; else goto <D.21743>;
  <D.21743>:
  D.22574 = 0;
  return D.22574;
}


mono_linterval_get_intersect_pos (struct MonoLiveInterval * i1, struct MonoLiveInterval * i2)
{
  int D.22578;
  int D.22579;
  int D.22582;
  int D.22583;
  gint32 D.22588;
  struct MonoLiveRange2 * r1;
  struct MonoLiveRange2 * r2;

  r1 = i1->range;
  goto <D.21754>;
  <D.21753>:
  r2 = i2->range;
  goto <D.21751>;
  <D.21750>:
  D.22578 = r2->to;
  D.22579 = r1->from;
  if (D.22578 > D.22579) goto <D.22580>; else goto <D.22581>;
  <D.22580>:
  D.22582 = r2->from;
  D.22583 = r1->to;
  if (D.22582 < D.22583) goto <D.22584>; else goto <D.22585>;
  <D.22584>:
  D.22582 = r2->from;
  D.22579 = r1->from;
  if (D.22582 <= D.22579) goto <D.22586>; else goto <D.22587>;
  <D.22586>:
  D.22588 = r1->from;
  return D.22588;
  <D.22587>:
  D.22588 = r2->from;
  return D.22588;
  <D.22585>:
  <D.22581>:
  r2 = r2->next;
  <D.21751>:
  if (r2 != 0B) goto <D.21750>; else goto <D.21752>;
  <D.21752>:
  r1 = r1->next;
  <D.21754>:
  if (r1 != 0B) goto <D.21753>; else goto <D.21755>;
  <D.21755>:
  D.22588 = -1;
  return D.22588;
}


mono_linterval_split (struct MonoCompile * cfg, struct MonoLiveInterval * interval, struct MonoLiveInterval * * i1, struct MonoLiveInterval * * i2, int pos)
{
  int iftmp.42;
  struct MonoLiveRange2 * D.22594;
  int D.22595;
  struct MonoLiveRange2 * D.22597;
  int D.22598;
  _Bool D.22599;
  long int D.22600;
  long int D.22601;
  struct MonoMemPool * D.22604;
  void * D.22605;
  void * D.22606;
  int D.22607;
  struct MonoLiveInterval * D.22610;
  int D.22611;
  int D.22617;
  struct MonoLiveInterval * D.22618;
  struct MonoLiveRange2 * r;

  D.22594 = interval->range;
  D.22595 = D.22594->from;
  if (D.22595 >= pos) goto <D.22591>; else goto <D.22596>;
  <D.22596>:
  D.22597 = interval->last_range;
  D.22598 = D.22597->to;
  if (D.22598 < pos) goto <D.22591>; else goto <D.22592>;
  <D.22591>:
  iftmp.42 = 1;
  goto <D.22593>;
  <D.22592>:
  iftmp.42 = 0;
  <D.22593>:
  D.22599 = iftmp.42 != 0;
  D.22600 = (long int) D.22599;
  D.22601 = __builtin_expect (D.22600, 0);
  if (D.22601 != 0) goto <D.22602>; else goto <D.22603>;
  <D.22602>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 752, "pos > interval->range->from && pos <= interval->last_range->to");
  <D.22603>:
  D.22604 = cfg->mempool;
  D.22605 = mono_mempool_alloc0 (D.22604, 8);
  *i1 = D.22605;
  D.22604 = cfg->mempool;
  D.22606 = mono_mempool_alloc0 (D.22604, 8);
  *i2 = D.22606;
  r = interval->range;
  goto <D.21765>;
  <D.21764>:
  D.22607 = r->to;
  if (D.22607 < pos) goto <D.22608>; else goto <D.22609>;
  <D.22608>:
  D.22610 = *i1;
  D.22611 = r->from;
  D.22607 = r->to;
  mono_linterval_add_range (cfg, D.22610, D.22611, D.22607);
  goto <D.22612>;
  <D.22609>:
  D.22611 = r->from;
  if (D.22611 < pos) goto <D.22615>; else goto <D.22613>;
  <D.22615>:
  D.22607 = r->to;
  if (D.22607 >= pos) goto <D.22616>; else goto <D.22613>;
  <D.22616>:
  D.22610 = *i1;
  D.22611 = r->from;
  D.22617 = pos + -1;
  mono_linterval_add_range (cfg, D.22610, D.22611, D.22617);
  D.22618 = *i2;
  D.22607 = r->to;
  mono_linterval_add_range (cfg, D.22618, pos, D.22607);
  goto <D.22614>;
  <D.22613>:
  D.22618 = *i2;
  D.22611 = r->from;
  D.22607 = r->to;
  mono_linterval_add_range (cfg, D.22618, D.22611, D.22607);
  <D.22614>:
  <D.22612>:
  r = r->next;
  <D.21765>:
  if (r != 0B) goto <D.21764>; else goto <D.21766>;
  <D.21766>:
}


mono_analyze_liveness_gc (struct MonoCompile * cfg)
{
  unsigned int D.22619;
  unsigned int D.22622;
  unsigned int max_vars.43;
  unsigned int D.22624;
  unsigned int D.22625;
  unsigned int D.22626;
  struct MonoMethodVar * D.22627;
  unsigned int idx.44;
  unsigned int D.22629;
  int D.22630;
  unsigned int D.22631;
  unsigned int D.22632;
  struct MonoMethodVar * * D.22633;
  struct MonoMemPool * D.22634;
  unsigned int reverse_len.45;
  unsigned int D.22636;
  int D.22637;
  int D.22638;
  int D.22641;
  struct MonoInst * D.22642;
  unsigned int D.22645;
  unsigned int D.22646;
  struct MonoBitSet * D.22647;
  unsigned int j.46;
  unsigned int D.22651;
  unsigned int D.22652;
  struct MonoInst * * D.22655;
  unsigned int k.47;
  unsigned int D.22657;
  struct MonoInst * * D.22658;
  struct MonoInst * D.22659;
  unsigned char D.22660;
  signed char D.22661;
  gint32 * D.22666;
  unsigned int new_reverse_len.48;
  unsigned int D.22670;
  unsigned int nins.49;
  unsigned int D.22672;
  struct MonoInst * * D.22673;
  unsigned int i.50;
  unsigned int D.22675;
  struct MonoInst * * D.22676;
  struct GSList * callsites.51;
  int idx;
  int i;
  int j;
  int nins;
  int max;
  int max_vars;
  int block_from;
  int block_to;
  int pos;
  int reverse_len;
  gint32 * last_use;
  struct MonoInst * * reverse;
  struct MonoMethodVar * * vreg_to_varinfo;
  struct MonoBasicBlock * bb;
  struct GSList * callsites;

  try
    {
      vreg_to_varinfo = 0B;
      D.22619 = cfg->verbose_level;
      if (D.22619 > 1) goto <D.22620>; else goto <D.22621>;
      <D.22620>:
      printf ("\n------------ GC LIVENESS: ----------\n");
      <D.22621>:
      D.22622 = cfg->num_varinfo;
      max_vars = (int) D.22622;
      max_vars.43 = (unsigned int) max_vars;
      D.22624 = max_vars.43 * 4;
      last_use = monoeg_malloc0 (D.22624);
      D.22625 = cfg->next_vreg;
      D.22626 = D.22625 * 4;
      vreg_to_varinfo = monoeg_malloc0 (D.22626);
      idx = 0;
      goto <D.21809>;
      <D.21808>:
      {
        struct MonoMethodVar * vi;

        D.22627 = cfg->vars;
        idx.44 = (unsigned int) idx;
        D.22629 = idx.44 * 56;
        vi = D.22627 + D.22629;
        D.22630 = vi->vreg;
        D.22631 = (unsigned int) D.22630;
        D.22632 = D.22631 * 4;
        D.22633 = vreg_to_varinfo + D.22632;
        *D.22633 = vi;
      }
      idx = idx + 1;
      <D.21809>:
      if (idx < max_vars) goto <D.21808>; else goto <D.21810>;
      <D.21810>:
      reverse_len = 1024;
      D.22634 = cfg->mempool;
      reverse_len.45 = (unsigned int) reverse_len;
      D.22636 = reverse_len.45 * 4;
      reverse = mono_mempool_alloc (D.22634, D.22636);
      bb = cfg->bb_entry;
      goto <D.21833>;
      <D.21832>:
      {
        struct MonoInst * ins;

        block_from = bb->real_native_offset;
        D.22637 = bb->native_offset;
        D.22638 = bb->native_length;
        block_to = D.22637 + D.22638;
        D.22619 = cfg->verbose_level;
        if (D.22619 > 1) goto <D.22639>; else goto <D.22640>;
        <D.22639>:
        D.22641 = bb->block_num;
        printf ("GC LIVENESS BB%d:\n", D.22641);
        <D.22640>:
        D.22642 = bb->code;
        if (D.22642 == 0B) goto <D.22643>; else goto <D.22644>;
        <D.22643>:
        // predicted unlikely by continue predictor.
        goto <D.21812>;
        <D.22644>:
        max_vars.43 = (unsigned int) max_vars;
        D.22624 = max_vars.43 * 4;
        memset (last_use, 0, D.22624);
        max_vars.43 = (unsigned int) max_vars;
        D.22645 = max_vars.43 + 31;
        D.22646 = D.22645 / 32;
        max = (int) D.22646;
        j = 0;
        goto <D.21821>;
        <D.21820>:
        {
          gsize bits_out;
          int k;

          D.22647 = bb->live_out_set;
          if (D.22647 == 0B) goto <D.22648>; else goto <D.22649>;
          <D.22648>:
          // predicted unlikely by continue predictor.
          goto <D.21815>;
          <D.22649>:
          D.22647 = bb->live_out_set;
          bits_out = D.22647->data[j];
          j.46 = (unsigned int) j;
          D.22651 = j.46 * 32;
          k = (int) D.22651;
          goto <D.21818>;
          <D.21817>:
          D.22652 = bits_out & 1;
          if (D.22652 != 0) goto <D.22653>; else goto <D.22654>;
          <D.22653>:
          D.22655 = cfg->varinfo;
          k.47 = (unsigned int) k;
          D.22657 = k.47 * 4;
          D.22658 = D.22655 + D.22657;
          D.22659 = *D.22658;
          D.22660 = D.22659->flags;
          D.22661 = (signed char) D.22660;
          if (D.22661 < 0) goto <D.22662>; else goto <D.22663>;
          <D.22662>:
          {
            int vreg;

            D.22655 = cfg->varinfo;
            k.47 = (unsigned int) k;
            D.22657 = k.47 * 4;
            D.22658 = D.22655 + D.22657;
            D.22659 = *D.22658;
            vreg = get_vreg_from_var (cfg, D.22659);
            D.22619 = cfg->verbose_level;
            if (D.22619 > 1) goto <D.22664>; else goto <D.22665>;
            <D.22664>:
            printf ("Var R%d live at exit, last_use set to %x.\n", vreg, block_to);
            <D.22665>:
            k.47 = (unsigned int) k;
            D.22657 = k.47 * 4;
            D.22666 = last_use + D.22657;
            *D.22666 = block_to;
          }
          <D.22663>:
          <D.22654>:
          bits_out = bits_out >> 1;
          k = k + 1;
          <D.21818>:
          if (bits_out != 0) goto <D.21817>; else goto <D.21819>;
          <D.21819>:
        }
        <D.21815>:
        j = j + 1;
        <D.21821>:
        if (j < max) goto <D.21820>; else goto <D.21822>;
        <D.21822>:
        nins = 0;
        pos = block_from;
        ins = bb->code;
        goto <D.21826>;
        <D.21825>:
        if (nins >= reverse_len) goto <D.22667>; else goto <D.22668>;
        <D.22667>:
        {
          int new_reverse_len;
          struct MonoInst * * new_reverse;

          new_reverse_len = reverse_len * 2;
          D.22634 = cfg->mempool;
          new_reverse_len.48 = (unsigned int) new_reverse_len;
          D.22670 = new_reverse_len.48 * 4;
          new_reverse = mono_mempool_alloc (D.22634, D.22670);
          reverse_len.45 = (unsigned int) reverse_len;
          D.22636 = reverse_len.45 * 4;
          memcpy (new_reverse, reverse, D.22636);
          reverse = new_reverse;
          reverse_len = new_reverse_len;
        }
        <D.22668>:
        nins.49 = (unsigned int) nins;
        D.22672 = nins.49 * 4;
        D.22673 = reverse + D.22672;
        *D.22673 = ins;
        ins = ins->next;
        nins = nins + 1;
        pos = pos + 1;
        <D.21826>:
        if (ins != 0B) goto <D.21825>; else goto <D.21827>;
        <D.21827>:
        callsites = 0B;
        i = nins + -1;
        goto <D.21830>;
        <D.21829>:
        {
          struct MonoInst * ins;

          i.50 = (unsigned int) i;
          D.22675 = i.50 * 4;
          D.22676 = reverse + D.22675;
          ins = *D.22676;
          update_liveness_gc (cfg, bb, ins, last_use, vreg_to_varinfo, &callsites);
        }
        i = i + -1;
        <D.21830>:
        if (i >= 0) goto <D.21829>; else goto <D.21831>;
        <D.21831>:
        callsites.51 = callsites;
        bb->gc_callsites = callsites.51;
      }
      <D.21812>:
      bb = bb->next_bb;
      <D.21833>:
      if (bb != 0B) goto <D.21832>; else goto <D.21834>;
      <D.21834>:
      monoeg_g_free (last_use);
      monoeg_g_free (vreg_to_varinfo);
    }
  finally
    {
      callsites = {CLOBBER};
    }
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22680;
  int D.22685;
  void * D.22687;
  unsigned int D.22688;

  D.22680 = __builtin_constant_p (__len);
  if (D.22680 != 0) goto <D.22681>; else goto <D.22682>;
  <D.22681>:
  if (__len == 0) goto <D.22683>; else goto <D.22684>;
  <D.22683>:
  D.22685 = __builtin_constant_p (__ch);
  if (D.22685 == 0) goto <D.22678>; else goto <D.22686>;
  <D.22686>:
  if (__ch != 0) goto <D.22678>; else goto <D.22679>;
  <D.22678>:
  __warn_memset_zero_len ();
  D.22687 = __dest;
  return D.22687;
  <D.22679>:
  <D.22684>:
  <D.22682>:
  D.22688 = __builtin_object_size (__dest, 0);
  D.22687 = __builtin___memset_chk (__dest, __ch, __len, D.22688);
  return D.22687;
}


get_vreg_from_var (struct MonoCompile * cfg, struct MonoInst * var)
{
  short unsigned int D.22690;
  int D.22693;
  struct MonoMethodVar * D.22694;
  int D.22695;
  unsigned int D.22696;
  unsigned int D.22697;
  struct MonoMethodVar * D.22698;

  D.22690 = var->opcode;
  if (D.22690 == 366) goto <D.22691>; else goto <D.22692>;
  <D.22691>:
  D.22694 = cfg->vars;
  D.22695 = var->data.op[0].const_val;
  D.22696 = (unsigned int) D.22695;
  D.22697 = D.22696 * 56;
  D.22698 = D.22694 + D.22697;
  D.22693 = D.22698->vreg;
  return D.22693;
  <D.22692>:
  D.22693 = var->dreg;
  return D.22693;
}


update_liveness_gc (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoInst * ins, gint32 * last_use, struct MonoMethodVar * * vreg_to_varinfo, struct GSList * * callsites)
{
  short unsigned int D.22700;
  short unsigned int D.22701;
  unsigned int vreg.52;
  unsigned int D.22705;
  struct MonoMethodVar * * D.22706;
  unsigned int D.22707;
  unsigned int D.22708;
  unsigned int idx.53;
  unsigned int D.22714;
  gint32 * D.22715;
  int D.22716;
  struct GSList * D.22729;
  _Bool D.22730;
  long int D.22731;
  long int D.22732;
  struct MonoMemPool * D.22735;
  struct GSList * D.22736;
  struct GSList * D.22737;
  unsigned char D.22739;
  signed char D.22740;
  int D.22745;
  unsigned int D.22748;
  long long unsigned int D.22749;
  long long unsigned int D.22750;
  long long unsigned int D.22751;
  long long unsigned int D.22752;
  unsigned int D.22753;
  void * D.22754;
  unsigned int i.54;
  unsigned int D.22756;
  gint32 * D.22757;
  int D.22758;
  struct MonoMethodVar * D.22763;
  unsigned int D.22764;
  struct MonoMethodVar * D.22765;
  int D.22766;
  guint8 * D.22767;
  int D.22768;
  sizetype D.22769;
  guint8 * D.22770;
  unsigned char D.22771;
  signed char D.22772;
  int D.22773;
  int D.22774;
  signed char D.22775;
  signed char D.22776;
  unsigned char D.22777;
  unsigned int i.55;
  struct GSList * D.22781;

  D.22700 = ins->opcode;
  D.22701 = D.22700 + 64698;
  if (D.22701 <= 1) goto <D.22702>; else goto <D.22703>;
  <D.22702>:
  {
    int vreg;
    struct MonoMethodVar * vi;
    int idx;
    int pc_offset;

    vreg = ins->data.op[1].const_val;
    vreg.52 = (unsigned int) vreg;
    D.22705 = vreg.52 * 4;
    D.22706 = vreg_to_varinfo + D.22705;
    vi = *D.22706;
    D.22707 = vi->idx;
    idx = (int) D.22707;
    pc_offset = ins->backend.pc_offset;
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22709>; else goto <D.22710>;
    <D.22709>:
    printf ("\t%x: ", pc_offset);
    mono_print_ins (ins);
    <D.22710>:
    D.22700 = ins->opcode;
    if (D.22700 == 838) goto <D.22711>; else goto <D.22712>;
    <D.22711>:
    idx.53 = (unsigned int) idx;
    D.22714 = idx.53 * 4;
    D.22715 = last_use + D.22714;
    D.22716 = *D.22715;
    if (D.22716 > 0) goto <D.22717>; else goto <D.22718>;
    <D.22717>:
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22719>; else goto <D.22720>;
    <D.22719>:
    idx.53 = (unsigned int) idx;
    D.22714 = idx.53 * 4;
    D.22715 = last_use + D.22714;
    D.22716 = *D.22715;
    printf ("\tadd range to R%d: [%x, %x)\n", vreg, pc_offset, D.22716);
    <D.22720>:
    idx.53 = (unsigned int) idx;
    D.22714 = idx.53 * 4;
    D.22715 = last_use + D.22714;
    *D.22715 = 0;
    <D.22718>:
    goto <D.22721>;
    <D.22712>:
    idx.53 = (unsigned int) idx;
    D.22714 = idx.53 * 4;
    D.22715 = last_use + D.22714;
    D.22716 = *D.22715;
    if (D.22716 == 0) goto <D.22722>; else goto <D.22723>;
    <D.22722>:
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22724>; else goto <D.22725>;
    <D.22724>:
    printf ("\tlast use of R%d set to %x\n", vreg, pc_offset);
    <D.22725>:
    idx.53 = (unsigned int) idx;
    D.22714 = idx.53 * 4;
    D.22715 = last_use + D.22714;
    *D.22715 = pc_offset;
    <D.22723>:
    <D.22721>:
  }
  goto <D.22726>;
  <D.22703>:
  D.22700 = ins->opcode;
  if (D.22700 == 841) goto <D.22727>; else goto <D.22728>;
  <D.22727>:
  {
    struct GCCallSite * last;

    D.22729 = *callsites;
    D.22730 = D.22729 == 0B;
    D.22731 = (long int) D.22730;
    D.22732 = __builtin_expect (D.22731, 0);
    if (D.22732 != 0) goto <D.22733>; else goto <D.22734>;
    <D.22733>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 1003, "*callsites");
    <D.22734>:
    D.22729 = *callsites;
    last = D.22729->data;
    D.22735 = cfg->mempool;
    D.22736 = last->param_slots;
    D.22737 = g_slist_prepend_mempool (D.22735, D.22736, ins);
    last->param_slots = D.22737;
  }
  goto <D.22738>;
  <D.22728>:
  D.22739 = ins->flags;
  D.22740 = (signed char) D.22739;
  if (D.22740 < 0) goto <D.22741>; else goto <D.22742>;
  <D.22741>:
  {
    struct GCCallSite * callsite;
    int i;

    D.22735 = cfg->mempool;
    callsite = mono_mempool_alloc0 (D.22735, 16);
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22743>; else goto <D.22744>;
    <D.22743>:
    D.22745 = ins->backend.pc_offset;
    printf ("\t%x: ", D.22745);
    mono_print_ins (ins);
    <D.22744>:
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22746>; else goto <D.22747>;
    <D.22746>:
    printf ("\t\tlive: ");
    <D.22747>:
    callsite->bb = bb;
    D.22735 = cfg->mempool;
    D.22748 = cfg->num_varinfo;
    D.22749 = (long long unsigned int) D.22748;
    D.22750 = D.22749 + 7;
    D.22751 = D.22750 & 18446744073709551608;
    D.22752 = D.22751 / 8;
    D.22753 = (unsigned int) D.22752;
    D.22754 = mono_mempool_alloc0 (D.22735, D.22753);
    callsite->liveness = D.22754;
    D.22745 = ins->backend.pc_offset;
    callsite->pc_offset = D.22745;
    i = 0;
    goto <D.21783>;
    <D.21782>:
    i.54 = (unsigned int) i;
    D.22756 = i.54 * 4;
    D.22757 = last_use + D.22756;
    D.22758 = *D.22757;
    if (D.22758 != 0) goto <D.22759>; else goto <D.22760>;
    <D.22759>:
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22761>; else goto <D.22762>;
    <D.22761>:
    D.22763 = cfg->vars;
    i.54 = (unsigned int) i;
    D.22764 = i.54 * 56;
    D.22765 = D.22763 + D.22764;
    D.22766 = D.22765->vreg;
    printf ("R%d", D.22766);
    <D.22762>:
    D.22767 = callsite->liveness;
    D.22768 = i / 8;
    D.22769 = (sizetype) D.22768;
    D.22770 = D.22767 + D.22769;
    D.22767 = callsite->liveness;
    D.22769 = (sizetype) D.22768;
    D.22770 = D.22767 + D.22769;
    D.22771 = *D.22770;
    D.22772 = (signed char) D.22771;
    D.22773 = i % 8;
    D.22774 = 1 << D.22773;
    D.22775 = (signed char) D.22774;
    D.22776 = D.22772 | D.22775;
    D.22777 = (unsigned char) D.22776;
    *D.22770 = D.22777;
    <D.22760>:
    i = i + 1;
    <D.21783>:
    i.55 = (unsigned int) i;
    D.22748 = cfg->num_varinfo;
    if (i.55 < D.22748) goto <D.21782>; else goto <D.21784>;
    <D.21784>:
    D.22708 = cfg->verbose_level;
    if (D.22708 > 1) goto <D.22779>; else goto <D.22780>;
    <D.22779>:
    printf ("\n");
    <D.22780>:
    D.22735 = cfg->mempool;
    D.22729 = *callsites;
    D.22781 = g_slist_prepend_mempool (D.22735, D.22729, callsite);
    *callsites = D.22781;
  }
  <D.22742>:
  <D.22738>:
  <D.22726>:
}


g_slist_prepend_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.22782;
  struct GSList * new_list;

  new_list = mono_mempool_alloc (mp, 8);
  new_list->data = data;
  new_list->next = list;
  D.22782 = new_list;
  return D.22782;
}


