mono_liveness_handle_exception_clauses (struct MonoCompile * cfg)
{
  <unnamed-unsigned:15> D.22157;
  unsigned int D.22158;
  unsigned int D.22159;
  struct MonoMemPool * D.22160;
  unsigned int i.0;
  unsigned int D.22162;
  gboolean * D.22163;
  int D.22164;
  struct MonoExceptionClause * D.22165;
  unsigned int D.22166;
  unsigned int D.22167;
  unsigned int j.1;
  unsigned int D.22171;
  unsigned int D.22172;
  unsigned int D.22175;
  unsigned int D.22176;
  unsigned int D.22179;
  unsigned int D.22180;
  unsigned int D.22183;
  gboolean * D.22184;
  unsigned int D.22185;
  unsigned int D.22187;
  unsigned int D.22190;
  unsigned int D.22193;
  sizetype D.22194;
  sizetype D.22195;
  gboolean * D.22196;
  int D.22197;
  unsigned int D.22200;
  int D.22203;
  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.22157 = header->num_clauses;
      D.22158 = (unsigned int) D.22157;
      D.22159 = D.22158 * 4;
      D.22160 = cfg->mempool;
      outer_try = mono_mempool_alloc0 (D.22160, D.22159);
      i = 0;
      goto <D.21842>;
      <D.21841>:
      i.0 = (unsigned int) i;
      D.22162 = i.0 * 4;
      D.22163 = outer_try + D.22162;
      *D.22163 = 1;
      i = i + 1;
      <D.21842>:
      D.22157 = header->num_clauses;
      D.22164 = (int) D.22157;
      if (D.22164 > i) goto <D.21841>; else goto <D.21843>;
      <D.21843>:
      D.22157 = header->num_clauses;
      D.22164 = (int) D.22157;
      i = D.22164 + -1;
      goto <D.21848>;
      <D.21847>:
      D.22165 = header->clauses;
      i.0 = (unsigned int) i;
      D.22166 = i.0 * 24;
      clause = D.22165 + D.22166;
      D.22167 = clause->flags;
      if (D.22167 != 0) goto <D.22168>; else goto <D.22169>;
      <D.22168>:
      i.0 = (unsigned int) i;
      D.22162 = i.0 * 4;
      D.22163 = outer_try + D.22162;
      *D.22163 = 1;
      j = i + -1;
      goto <D.21846>;
      <D.21845>:
      D.22165 = header->clauses;
      j.1 = (unsigned int) j;
      D.22171 = j.1 * 24;
      clause2 = D.22165 + D.22171;
      D.22172 = clause2->flags;
      if (D.22172 == 0) goto <D.22173>; else goto <D.22174>;
      <D.22173>:
      D.22175 = clause->handler_offset;
      D.22176 = clause2->try_offset;
      if (D.22175 <= D.22176) goto <D.22177>; else goto <D.22178>;
      <D.22177>:
      D.22176 = clause2->try_offset;
      D.22175 = clause->handler_offset;
      D.22179 = clause->handler_len;
      D.22180 = D.22175 + D.22179;
      if (D.22176 < D.22180) goto <D.22181>; else goto <D.22182>;
      <D.22181>:
      j.1 = (unsigned int) j;
      D.22183 = j.1 * 4;
      D.22184 = outer_try + D.22183;
      *D.22184 = 0;
      goto <D.21844>;
      <D.22182>:
      <D.22178>:
      <D.22174>:
      D.22176 = clause2->try_offset;
      D.22185 = clause->try_offset;
      if (D.22176 < D.22185) goto <D.21844>; else goto <D.22186>;
      <D.22186>:
      j = j + -1;
      <D.21846>:
      if (j >= 0) goto <D.21845>; else goto <D.21844>;
      <D.21844>:
      <D.22169>:
      i = i + -1;
      <D.21848>:
      if (i >= 0) goto <D.21847>; else goto <D.21849>;
      <D.21849>:
      bb = cfg->bb_entry;
      goto <D.21852>;
      <D.21851>:
      D.22187 = bb->region;
      if (D.22187 == 4294967295) goto <D.22188>; else goto <D.22189>;
      <D.22188>:
      // predicted unlikely by continue predictor.
      goto <D.21850>;
      <D.22189>:
      D.22187 = bb->region;
      D.22190 = D.22187 & 240;
      if (D.22190 == 0) goto <D.22191>; else goto <D.22192>;
      <D.22191>:
      D.22187 = bb->region;
      D.22193 = D.22187 >> 8;
      D.22194 = D.22193 + 1073741823;
      D.22195 = D.22194 * 4;
      D.22196 = outer_try + D.22195;
      D.22197 = *D.22196;
      if (D.22197 != 0) goto <D.22198>; else goto <D.22199>;
      <D.22198>:
      // predicted unlikely by continue predictor.
      goto <D.21850>;
      <D.22199>:
      <D.22192>:
      D.22200 = cfg->verbose_level;
      if (D.22200 > 2) goto <D.22201>; else goto <D.22202>;
      <D.22201>:
      D.22203 = bb->block_num;
      printf ("pessimize variables in bb %d.\n", D.22203);
      <D.22202>:
      visit_bb (cfg, bb, &visited);
      <D.21850>:
      bb = bb->next_bb;
      <D.21852>:
      if (bb != 0B) goto <D.21851>; else goto <D.21853>;
      <D.21853>:
      visited.2 = visited;
      monoeg_g_slist_free (visited.2);
    }
  finally
    {
      visited = {CLOBBER};
    }
}


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

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


visit_bb (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct GSList * * visited)
{
  struct GSList * D.22207;
  struct GSList * D.22208;
  short unsigned int D.22211;
  int D.22212;
  int D.22213;
  int D.22214;
  char D.22217;
  int iftmp.3;
  int D.22223;
  _Bool D.22226;
  long int D.22227;
  long int D.22228;
  unsigned int D.22233;
  unsigned int D.22234;
  struct MonoInst * * D.22237;
  unsigned int D.22238;
  unsigned int D.22239;
  struct MonoInst * * D.22240;
  struct MonoInst * D.22241;
  struct MonoInst * iftmp.4;
  struct MonoMethodVar * D.22248;
  unsigned int idx.5;
  unsigned int D.22250;
  struct MonoInst * * D.22251;
  unsigned int D.22252;
  unsigned int D.22253;
  struct MonoInst * * D.22254;
  struct MonoInst * D.22255;
  unsigned char D.22256;
  unsigned char D.22257;
  unsigned char D.22258;
  struct MonoInst * iftmp.6;
  int D.22262;
  int D.22263;
  unsigned int D.22264;
  sizetype D.22267;
  sizetype D.22268;
  sizetype D.22269;
  struct MonoInst * * D.22270;
  struct MonoInst * iftmp.7;
  unsigned char D.22276;
  unsigned char D.22277;
  struct MonoInst * iftmp.8;
  int D.22279;
  unsigned int D.22280;
  sizetype D.22283;
  sizetype D.22284;
  struct MonoInst * * D.22285;
  struct MonoInst * iftmp.9;
  unsigned char D.22291;
  unsigned char D.22292;
  int D.22293;
  int D.22294;
  int D.22295;
  signed char D.22296;
  _Bool D.22297;
  long int D.22298;
  long int D.22299;
  unsigned int sreg.10;
  unsigned int sreg.11;
  unsigned int D.22306;
  struct MonoInst * * D.22307;
  struct MonoInst * D.22308;
  struct MonoInst * iftmp.12;
  unsigned int idx.13;
  unsigned int D.22316;
  unsigned int D.22317;
  unsigned int D.22318;
  struct MonoInst * * D.22319;
  struct MonoInst * D.22320;
  unsigned char D.22321;
  unsigned char D.22322;
  unsigned char D.22323;
  struct MonoInst * iftmp.14;
  int D.22327;
  int D.22328;
  unsigned int D.22329;
  sizetype D.22332;
  sizetype D.22333;
  sizetype D.22334;
  struct MonoInst * * D.22335;
  struct MonoInst * iftmp.15;
  unsigned char D.22341;
  unsigned char D.22342;
  struct MonoInst * iftmp.16;
  int D.22344;
  unsigned int D.22345;
  sizetype D.22348;
  sizetype D.22349;
  struct MonoInst * * D.22350;
  struct MonoInst * iftmp.17;
  unsigned char D.22356;
  unsigned char D.22357;
  struct GSList * D.22358;
  struct MonoBasicBlock * * D.22359;
  unsigned int i.18;
  unsigned int D.22361;
  struct MonoBasicBlock * * D.22362;
  struct MonoBasicBlock * D.22363;
  short int D.22364;
  int D.22365;
  int i;
  struct MonoInst * ins;

  D.22207 = *visited;
  D.22208 = monoeg_g_slist_find (D.22207, bb);
  if (D.22208 != 0B) goto <D.22209>; else goto <D.22210>;
  <D.22209>:
  return;
  <D.22210>:
  ins = bb->code;
  goto <D.21825>;
  <D.21824>:
  {
    const char * spec;
    int regtype;
    int srcindex;
    int sreg;
    int num_sregs;
    int sregs[3];

    try
      {
        D.22211 = ins->opcode;
        D.22212 = (int) D.22211;
        D.22213 = D.22212 + -313;
        D.22214 = D.22213 * 4;
        spec = &ins_info[D.22214];
        D.22211 = ins->opcode;
        if (D.22211 == 316) goto <D.22215>; else goto <D.22216>;
        <D.22215>:
        // predicted unlikely by continue predictor.
        goto <D.21814>;
        <D.22216>:
        D.22217 = *spec;
        regtype = (int) D.22217;
        D.22223 = ins->dreg;
        if (D.22223 != -1) goto <D.22219>; else goto <D.22224>;
        <D.22224>:
        if (regtype != 32) goto <D.22219>; else goto <D.22220>;
        <D.22219>:
        D.22223 = ins->dreg;
        if (D.22223 == -1) goto <D.22221>; else goto <D.22225>;
        <D.22225>:
        if (regtype == 32) goto <D.22221>; else goto <D.22220>;
        <D.22221>:
        iftmp.3 = 1;
        goto <D.22222>;
        <D.22220>:
        iftmp.3 = 0;
        <D.22222>:
        D.22226 = iftmp.3 != 0;
        D.22227 = (long int) D.22226;
        D.22228 = __builtin_expect (D.22227, 0);
        if (D.22228 != 0) goto <D.22229>; else goto <D.22230>;
        <D.22229>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 94, "((ins->dreg == -1) && (regtype == \' \')) || ((ins->dreg != -1) && (regtype != \' \'))");
        <D.22230>:
        D.22223 = ins->dreg;
        if (D.22223 != -1) goto <D.22231>; else goto <D.22232>;
        <D.22231>:
        D.22223 = ins->dreg;
        D.22233 = (unsigned int) D.22223;
        D.22234 = cfg->vreg_to_inst_len;
        if (D.22233 < D.22234) goto <D.22235>; else goto <D.22236>;
        <D.22235>:
        D.22237 = cfg->vreg_to_inst;
        D.22223 = ins->dreg;
        D.22238 = (unsigned int) D.22223;
        D.22239 = D.22238 * 4;
        D.22240 = D.22237 + D.22239;
        D.22241 = *D.22240;
        if (D.22241 != 0B) goto <D.22242>; else goto <D.22243>;
        <D.22242>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          D.22223 = ins->dreg;
          D.22233 = (unsigned int) D.22223;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22233 < D.22234) goto <D.22245>; else goto <D.22246>;
          <D.22245>:
          D.22237 = cfg->vreg_to_inst;
          D.22223 = ins->dreg;
          D.22238 = (unsigned int) D.22223;
          D.22239 = D.22238 * 4;
          D.22240 = D.22237 + D.22239;
          iftmp.4 = *D.22240;
          goto <D.22247>;
          <D.22246>:
          iftmp.4 = 0B;
          <D.22247>:
          var = iftmp.4;
          idx = var->data.op[0].const_val;
          D.22248 = cfg->vars;
          idx.5 = (unsigned int) idx;
          D.22250 = idx.5 * 56;
          vi = D.22248 + D.22250;
          D.22251 = cfg->varinfo;
          D.22252 = vi->idx;
          D.22253 = D.22252 * 4;
          D.22254 = D.22251 + D.22253;
          D.22255 = *D.22254;
          D.22251 = cfg->varinfo;
          D.22252 = vi->idx;
          D.22253 = D.22252 * 4;
          D.22254 = D.22251 + D.22253;
          D.22255 = *D.22254;
          D.22256 = D.22255->flags;
          D.22257 = D.22256 | 4;
          D.22255->flags = D.22257;
          D.22258 = var->type;
          if (D.22258 == 2) goto <D.22259>; else goto <D.22260>;
          <D.22259>:
          D.22262 = var->dreg;
          D.22263 = D.22262 + 1;
          D.22264 = (unsigned int) D.22263;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22264 < D.22234) goto <D.22265>; else goto <D.22266>;
          <D.22265>:
          D.22237 = cfg->vreg_to_inst;
          D.22262 = var->dreg;
          D.22267 = (sizetype) D.22262;
          D.22268 = D.22267 + 1;
          D.22269 = D.22268 * 4;
          D.22270 = D.22237 + D.22269;
          iftmp.6 = *D.22270;
          goto <D.22271>;
          <D.22266>:
          iftmp.6 = 0B;
          <D.22271>:
          D.22262 = var->dreg;
          D.22263 = D.22262 + 1;
          D.22264 = (unsigned int) D.22263;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22264 < D.22234) goto <D.22273>; else goto <D.22274>;
          <D.22273>:
          D.22237 = cfg->vreg_to_inst;
          D.22262 = var->dreg;
          D.22267 = (sizetype) D.22262;
          D.22268 = D.22267 + 1;
          D.22269 = D.22268 * 4;
          D.22270 = D.22237 + D.22269;
          iftmp.7 = *D.22270;
          goto <D.22275>;
          <D.22274>:
          iftmp.7 = 0B;
          <D.22275>:
          D.22276 = iftmp.7->flags;
          D.22277 = D.22276 | 4;
          iftmp.6->flags = D.22277;
          D.22262 = var->dreg;
          D.22279 = D.22262 + 2;
          D.22280 = (unsigned int) D.22279;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22280 < D.22234) goto <D.22281>; else goto <D.22282>;
          <D.22281>:
          D.22237 = cfg->vreg_to_inst;
          D.22262 = var->dreg;
          D.22267 = (sizetype) D.22262;
          D.22283 = D.22267 + 2;
          D.22284 = D.22283 * 4;
          D.22285 = D.22237 + D.22284;
          iftmp.8 = *D.22285;
          goto <D.22286>;
          <D.22282>:
          iftmp.8 = 0B;
          <D.22286>:
          D.22262 = var->dreg;
          D.22279 = D.22262 + 2;
          D.22280 = (unsigned int) D.22279;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22280 < D.22234) goto <D.22288>; else goto <D.22289>;
          <D.22288>:
          D.22237 = cfg->vreg_to_inst;
          D.22262 = var->dreg;
          D.22267 = (sizetype) D.22262;
          D.22283 = D.22267 + 2;
          D.22284 = D.22283 * 4;
          D.22285 = D.22237 + D.22284;
          iftmp.9 = *D.22285;
          goto <D.22290>;
          <D.22289>:
          iftmp.9 = 0B;
          <D.22290>:
          D.22291 = iftmp.9->flags;
          D.22292 = D.22291 | 4;
          iftmp.8->flags = D.22292;
          <D.22260>:
        }
        <D.22243>:
        <D.22236>:
        <D.22232>:
        D.22293 = ins->sreg1;
        sregs[0] = D.22293;
        D.22294 = ins->sreg2;
        sregs[1] = D.22294;
        D.22295 = ins->sreg3;
        sregs[2] = D.22295;
        D.22211 = ins->opcode;
        D.22212 = (int) D.22211;
        D.22213 = D.22212 + -313;
        D.22296 = ins_sreg_counts[D.22213];
        num_sregs = (int) D.22296;
        srcindex = 0;
        goto <D.21822>;
        <D.21821>:
        sreg = sregs[srcindex];
        D.22297 = sreg == -1;
        D.22298 = (long int) D.22297;
        D.22299 = __builtin_expect (D.22298, 0);
        if (D.22299 != 0) goto <D.22300>; else goto <D.22301>;
        <D.22300>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 114, "sreg != -1");
        <D.22301>:
        sreg.10 = (unsigned int) sreg;
        D.22234 = cfg->vreg_to_inst_len;
        if (sreg.10 < D.22234) goto <D.22303>; else goto <D.22304>;
        <D.22303>:
        D.22237 = cfg->vreg_to_inst;
        sreg.11 = (unsigned int) sreg;
        D.22306 = sreg.11 * 4;
        D.22307 = D.22237 + D.22306;
        D.22308 = *D.22307;
        if (D.22308 != 0B) goto <D.22309>; else goto <D.22310>;
        <D.22309>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          sreg.10 = (unsigned int) sreg;
          D.22234 = cfg->vreg_to_inst_len;
          if (sreg.10 < D.22234) goto <D.22312>; else goto <D.22313>;
          <D.22312>:
          D.22237 = cfg->vreg_to_inst;
          sreg.11 = (unsigned int) sreg;
          D.22306 = sreg.11 * 4;
          D.22307 = D.22237 + D.22306;
          iftmp.12 = *D.22307;
          goto <D.22314>;
          <D.22313>:
          iftmp.12 = 0B;
          <D.22314>:
          var = iftmp.12;
          idx = var->data.op[0].const_val;
          D.22248 = cfg->vars;
          idx.13 = (unsigned int) idx;
          D.22316 = idx.13 * 56;
          vi = D.22248 + D.22316;
          D.22251 = cfg->varinfo;
          D.22317 = vi->idx;
          D.22318 = D.22317 * 4;
          D.22319 = D.22251 + D.22318;
          D.22320 = *D.22319;
          D.22251 = cfg->varinfo;
          D.22317 = vi->idx;
          D.22318 = D.22317 * 4;
          D.22319 = D.22251 + D.22318;
          D.22320 = *D.22319;
          D.22321 = D.22320->flags;
          D.22322 = D.22321 | 4;
          D.22320->flags = D.22322;
          D.22323 = var->type;
          if (D.22323 == 2) goto <D.22324>; else goto <D.22325>;
          <D.22324>:
          D.22327 = var->dreg;
          D.22328 = D.22327 + 1;
          D.22329 = (unsigned int) D.22328;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22329 < D.22234) goto <D.22330>; else goto <D.22331>;
          <D.22330>:
          D.22237 = cfg->vreg_to_inst;
          D.22327 = var->dreg;
          D.22332 = (sizetype) D.22327;
          D.22333 = D.22332 + 1;
          D.22334 = D.22333 * 4;
          D.22335 = D.22237 + D.22334;
          iftmp.14 = *D.22335;
          goto <D.22336>;
          <D.22331>:
          iftmp.14 = 0B;
          <D.22336>:
          D.22327 = var->dreg;
          D.22328 = D.22327 + 1;
          D.22329 = (unsigned int) D.22328;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22329 < D.22234) goto <D.22338>; else goto <D.22339>;
          <D.22338>:
          D.22237 = cfg->vreg_to_inst;
          D.22327 = var->dreg;
          D.22332 = (sizetype) D.22327;
          D.22333 = D.22332 + 1;
          D.22334 = D.22333 * 4;
          D.22335 = D.22237 + D.22334;
          iftmp.15 = *D.22335;
          goto <D.22340>;
          <D.22339>:
          iftmp.15 = 0B;
          <D.22340>:
          D.22341 = iftmp.15->flags;
          D.22342 = D.22341 | 4;
          iftmp.14->flags = D.22342;
          D.22327 = var->dreg;
          D.22344 = D.22327 + 2;
          D.22345 = (unsigned int) D.22344;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22345 < D.22234) goto <D.22346>; else goto <D.22347>;
          <D.22346>:
          D.22237 = cfg->vreg_to_inst;
          D.22327 = var->dreg;
          D.22332 = (sizetype) D.22327;
          D.22348 = D.22332 + 2;
          D.22349 = D.22348 * 4;
          D.22350 = D.22237 + D.22349;
          iftmp.16 = *D.22350;
          goto <D.22351>;
          <D.22347>:
          iftmp.16 = 0B;
          <D.22351>:
          D.22327 = var->dreg;
          D.22344 = D.22327 + 2;
          D.22345 = (unsigned int) D.22344;
          D.22234 = cfg->vreg_to_inst_len;
          if (D.22345 < D.22234) goto <D.22353>; else goto <D.22354>;
          <D.22353>:
          D.22237 = cfg->vreg_to_inst;
          D.22327 = var->dreg;
          D.22332 = (sizetype) D.22327;
          D.22348 = D.22332 + 2;
          D.22349 = D.22348 * 4;
          D.22350 = D.22237 + D.22349;
          iftmp.17 = *D.22350;
          goto <D.22355>;
          <D.22354>:
          iftmp.17 = 0B;
          <D.22355>:
          D.22356 = iftmp.17->flags;
          D.22357 = D.22356 | 4;
          iftmp.16->flags = D.22357;
          <D.22325>:
        }
        <D.22310>:
        <D.22304>:
        srcindex = srcindex + 1;
        <D.21822>:
        if (srcindex < num_sregs) goto <D.21821>; else goto <D.21823>;
        <D.21823>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21814>:
  ins = ins->next;
  <D.21825>:
  if (ins != 0B) goto <D.21824>; else goto <D.21826>;
  <D.21826>:
  D.22207 = *visited;
  D.22358 = monoeg_g_slist_append (D.22207, bb);
  *visited = D.22358;
  i = 0;
  goto <D.21828>;
  <D.21827>:
  D.22359 = bb->out_bb;
  i.18 = (unsigned int) i;
  D.22361 = i.18 * 4;
  D.22362 = D.22359 + D.22361;
  D.22363 = *D.22362;
  visit_bb (cfg, D.22363, visited);
  i = i + 1;
  <D.21828>:
  D.22364 = bb->out_count;
  D.22365 = (int) D.22364;
  if (D.22365 > i) goto <D.21827>; else goto <D.21829>;
  <D.21829>:
}


mono_analyze_liveness (struct MonoCompile * cfg)
{
  unsigned int D.22369;
  unsigned int D.22370;
  unsigned int D.22373;
  unsigned int D.22374;
  _Bool D.22375;
  long int D.22376;
  long int D.22377;
  unsigned int D.22380;
  unsigned int max_vars.19;
  unsigned int D.22384;
  struct MonoMethodVar * D.22385;
  unsigned int i.20;
  unsigned int D.22387;
  struct MonoMethodVar * D.22388;
  struct MonoBasicBlock * * D.22389;
  unsigned int D.22390;
  struct MonoBasicBlock * * D.22391;
  unsigned int bitsize.21;
  struct MonoMemPool * D.22393;
  struct MonoBitSet * D.22394;
  struct MonoBitSet * D.22395;
  int D.22398;
  struct MonoBasicBlock * * D.22399;
  unsigned int j.22;
  unsigned int D.22401;
  struct MonoBasicBlock * * D.22402;
  struct MonoBasicBlock * D.22403;
  int D.22404;
  short int D.22405;
  int D.22406;
  struct MonoBitSet * D.22409;
  struct MonoBitSet * D.22410;
  unsigned int i.23;
  unsigned int D.22412;
  unsigned int D.22413;
  unsigned int D.22414;
  unsigned int l_end.24;
  unsigned int D.22416;
  struct MonoBasicBlock * * D.22417;
  int D.22418;
  unsigned int D.22419;
  unsigned int D.22420;
  gboolean * D.22421;
  struct MonoBitSet * D.22422;
  unsigned int D.22425;
  struct MonoBasicBlock * * D.22426;
  int D.22427;
  unsigned int D.22428;
  unsigned int D.22429;
  gboolean * D.22430;
  int D.22433;
  struct MonoBasicBlock * * D.22434;
  struct MonoBasicBlock * * D.22435;
  struct MonoBasicBlock * D.22436;
  int D.22437;
  short int D.22438;
  int D.22439;
  struct MonoBasicBlock * * D.22440;
  struct MonoBasicBlock * * D.22441;
  struct MonoBasicBlock * D.22442;
  int D.22443;
  short int D.22444;
  int D.22445;
  struct MonoBitSet * D.22448;
  unsigned int D.22452;
  unsigned int D.22453;
  struct MonoBitSet * D.22454;
  gsize[0:] * D.22455;
  gsize[0:] * D.22456;
  struct MonoBitSet * D.22457;
  struct MonoBitSet * D.22460;
  unsigned int D.22461;
  unsigned int D.22462;
  struct MonoBitSet * D.22463;
  gsize[0:] * D.22464;
  gsize[0:] * D.22465;
  unsigned int D.22466;
  unsigned int D.22467;
  unsigned int D.22468;
  unsigned int D.22469;
  unsigned int D.22470;
  unsigned int D.22471;
  unsigned int D.22472;
  unsigned int D.22473;
  unsigned int D.22474;
  unsigned int D.22475;
  unsigned int D.22476;
  struct MonoInst * D.22479;
  short unsigned int D.22481;
  unsigned int D.22483;
  unsigned int D.22484;
  unsigned int D.22485;
  unsigned int D.22486;
  unsigned int D.22487;
  int D.22490;
  struct MonoBitSet * D.22493;
  unsigned int D.22494;
  unsigned int D.22495;
  gsize[0:] * D.22496;
  unsigned int D.22497;
  unsigned int D.22498;
  unsigned int D.22499;
  unsigned int D.22500;
  unsigned int D.22501;
  unsigned int D.22502;
  unsigned int D.22503;
  unsigned int D.22504;
  unsigned int D.22505;
  unsigned int D.22506;
  unsigned int D.22507;
  struct MonoBitSet * D.22508;
  int D.22511;
  unsigned int D.22512;
  unsigned int D.22513;
  gboolean * D.22514;
  int D.22515;
  int D.22520;
  unsigned int l_end.25;
  unsigned int D.22522;
  struct MonoBasicBlock * * D.22523;
  _Bool D.22524;
  long int D.22525;
  long int D.22526;
  struct MonoBitSet * D.22531;
  struct MonoBitSet * D.22534;
  unsigned int D.22535;
  unsigned int D.22536;
  struct MonoBitSet * D.22537;
  gsize[0:] * D.22538;
  gsize[0:] * D.22539;
  unsigned int D.22540;
  unsigned int D.22541;
  unsigned int D.22542;
  unsigned int D.22543;
  unsigned int D.22544;
  unsigned int D.22545;
  unsigned int D.22546;
  unsigned int D.22547;
  unsigned int D.22548;
  unsigned int D.22549;
  unsigned int D.22550;
  int D.22551;
  int D.22552;
  struct MonoBitSet * D.22553;
  unsigned int max_vars.26;
  unsigned int D.22557;
  struct MonoBitSet * D.22558;
  unsigned int D.22559;
  unsigned int D.22560;
  int abs_pos.27;
  unsigned int k.28;
  unsigned int D.22565;
  struct MonoMethodVar * D.22566;
  unsigned int D.22567;
  unsigned int D.22570;
  int D.22571;
  unsigned int D.22572;
  unsigned int j.29;
  struct MonoInst * * D.22574;
  unsigned int D.22575;
  unsigned int D.22576;
  struct MonoInst * * D.22577;
  struct MonoInst * D.22578;
  short unsigned int D.22579;
  unsigned int D.22582;
  unsigned char D.22585;
  int D.22586;
  int D.22587;
  unsigned char D.22592;
  unsigned char D.22593;
  struct MonoGenericSharingContext * D.22596;
  struct MonoMethod * D.22598;
  struct MonoMethodSignature * D.22599;
  unsigned char D.22600;
  unsigned char D.22601;
  struct MonoInst * * D.22603;
  struct MonoInst * D.22604;
  unsigned char D.22605;
  unsigned int D.22608;
  int D.22609;
  struct MonoBitSet * D.22610;
  struct MonoBitSet * D.22611;
  unsigned int D.22612;
  unsigned int D.22613;
  unsigned char D.22614;
  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.22369 = cfg->num_varinfo;
  max_vars = (int) D.22369;
  D.22370 = cfg->verbose_level;
  if (D.22370 > 1) goto <D.22371>; else goto <D.22372>;
  <D.22371>:
  printf ("\nLIVENESS:\n");
  <D.22372>:
  D.22373 = cfg->comp_done;
  D.22374 = D.22373 & 16;
  D.22375 = D.22374 != 0;
  D.22376 = (long int) D.22375;
  D.22377 = __builtin_expect (D.22376, 0);
  if (D.22377 != 0) goto <D.22378>; else goto <D.22379>;
  <D.22378>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 316, "!(cfg->comp_done & MONO_COMP_LIVENESS)");
  <D.22379>:
  D.22373 = cfg->comp_done;
  D.22380 = D.22373 | 16;
  cfg->comp_done = D.22380;
  if (max_vars == 0) goto <D.22381>; else goto <D.22382>;
  <D.22381>:
  return;
  <D.22382>:
  max_vars.19 = (unsigned int) max_vars;
  D.22384 = mono_bitset_alloc_size (max_vars.19, 0);
  bitsize = (int) D.22384;
  i = 0;
  goto <D.21900>;
  <D.21899>:
  D.22385 = cfg->vars;
  i.20 = (unsigned int) i;
  D.22387 = i.20 * 56;
  D.22388 = D.22385 + D.22387;
  D.22388->range.first_use.abs_pos = 4294967295;
  D.22385 = cfg->vars;
  i.20 = (unsigned int) i;
  D.22387 = i.20 * 56;
  D.22388 = D.22385 + D.22387;
  D.22388->range.last_use.abs_pos = 0;
  D.22385 = cfg->vars;
  i.20 = (unsigned int) i;
  D.22387 = i.20 * 56;
  D.22388 = D.22385 + D.22387;
  D.22388->spill_costs = 0;
  i = i + 1;
  <D.21900>:
  if (i < max_vars) goto <D.21899>; else goto <D.21901>;
  <D.21901>:
  i = 0;
  goto <D.21907>;
  <D.21906>:
  {
    struct MonoBasicBlock * bb;

    D.22389 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22390 = i.20 * 4;
    D.22391 = D.22389 + D.22390;
    bb = *D.22391;
    max_vars.19 = (unsigned int) max_vars;
    bitsize.21 = (unsigned int) bitsize;
    D.22393 = cfg->mempool;
    D.22394 = mono_bitset_mp_new (D.22393, bitsize.21, max_vars.19);
    bb->gen_set = D.22394;
    max_vars.19 = (unsigned int) max_vars;
    bitsize.21 = (unsigned int) bitsize;
    D.22393 = cfg->mempool;
    D.22395 = mono_bitset_mp_new (D.22393, bitsize.21, max_vars.19);
    bb->kill_set = D.22395;
    D.22370 = cfg->verbose_level;
    if (D.22370 > 1) goto <D.22396>; else goto <D.22397>;
    <D.22396>:
    D.22398 = bb->block_num;
    printf ("BLOCK BB%d (", D.22398);
    j = 0;
    goto <D.21904>;
    <D.21903>:
    D.22399 = bb->out_bb;
    j.22 = (unsigned int) j;
    D.22401 = j.22 * 4;
    D.22402 = D.22399 + D.22401;
    D.22403 = *D.22402;
    D.22404 = D.22403->block_num;
    printf ("BB%d, ", D.22404);
    j = j + 1;
    <D.21904>:
    D.22405 = bb->out_count;
    D.22406 = (int) D.22405;
    if (D.22406 > j) goto <D.21903>; else goto <D.21905>;
    <D.21905>:
    printf ("):\n");
    <D.22397>:
    analyze_liveness_bb (cfg, bb);
    D.22370 = cfg->verbose_level;
    if (D.22370 > 1) goto <D.22407>; else goto <D.22408>;
    <D.22407>:
    D.22398 = bb->block_num;
    printf ("GEN  BB%d: ", D.22398);
    D.22409 = bb->gen_set;
    mono_bitset_print (D.22409);
    D.22398 = bb->block_num;
    printf ("KILL BB%d: ", D.22398);
    D.22410 = bb->kill_set;
    mono_bitset_print (D.22410);
    <D.22408>:
  }
  i = i + 1;
  <D.21907>:
  i.23 = (unsigned int) i;
  D.22412 = cfg->num_bblocks;
  if (i.23 < D.22412) goto <D.21906>; else goto <D.21908>;
  <D.21908>:
  max_vars.19 = (unsigned int) max_vars;
  old_live_out_set = mono_bitset_new (max_vars.19, 0);
  D.22412 = cfg->num_bblocks;
  D.22413 = D.22412 + 1;
  D.22414 = D.22413 * 4;
  in_worklist = monoeg_malloc0 (D.22414);
  D.22412 = cfg->num_bblocks;
  D.22413 = D.22412 + 1;
  D.22414 = D.22413 * 4;
  worklist = monoeg_malloc (D.22414);
  l_end = 0;
  i = 0;
  goto <D.21911>;
  <D.21910>:
  {
    struct MonoBasicBlock * bb;

    D.22389 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22390 = i.20 * 4;
    D.22391 = D.22389 + D.22390;
    bb = *D.22391;
    l_end.24 = l_end;
    l_end = l_end.24 + 1;
    D.22416 = l_end.24 * 4;
    D.22417 = worklist + D.22416;
    *D.22417 = bb;
    D.22418 = bb->dfn;
    D.22419 = (unsigned int) D.22418;
    D.22420 = D.22419 * 4;
    D.22421 = in_worklist + D.22420;
    *D.22421 = 1;
    bb->live_in_set = 0B;
    max_vars.19 = (unsigned int) max_vars;
    bitsize.21 = (unsigned int) bitsize;
    D.22393 = cfg->mempool;
    D.22422 = mono_bitset_mp_new (D.22393, bitsize.21, max_vars.19);
    bb->live_out_set = D.22422;
  }
  i = i + 1;
  <D.21911>:
  i.23 = (unsigned int) i;
  D.22412 = cfg->num_bblocks;
  if (i.23 < D.22412) goto <D.21910>; else goto <D.21912>;
  <D.21912>:
  out_iter = 0;
  D.22370 = cfg->verbose_level;
  if (D.22370 > 1) goto <D.22423>; else goto <D.22424>;
  <D.22423>:
  printf ("\nITERATION:\n");
  <D.22424>:
  goto <D.21922>;
  <D.21965>:
  {
    struct MonoBasicBlock * bb;
    struct MonoBasicBlock * out_bb;
    gboolean changed;

    l_end = l_end + 4294967295;
    D.22425 = l_end * 4;
    D.22426 = worklist + D.22425;
    bb = *D.22426;
    D.22427 = bb->dfn;
    D.22428 = (unsigned int) D.22427;
    D.22429 = D.22428 * 4;
    D.22430 = in_worklist + D.22429;
    *D.22430 = 0;
    D.22370 = cfg->verbose_level;
    if (D.22370 > 1) goto <D.22431>; else goto <D.22432>;
    <D.22431>:
    D.22427 = bb->dfn;
    D.22433 = bb->block_num;
    printf ("P: BB%d(%d): IN: ", D.22433, D.22427);
    j = 0;
    goto <D.21917>;
    <D.21916>:
    D.22434 = bb->in_bb;
    j.22 = (unsigned int) j;
    D.22401 = j.22 * 4;
    D.22435 = D.22434 + D.22401;
    D.22436 = *D.22435;
    D.22437 = D.22436->block_num;
    printf ("BB%d ", D.22437);
    j = j + 1;
    <D.21917>:
    D.22438 = bb->in_count;
    D.22439 = (int) D.22438;
    if (D.22439 > j) goto <D.21916>; else goto <D.21918>;
    <D.21918>:
    printf ("OUT:");
    j = 0;
    goto <D.21920>;
    <D.21919>:
    D.22440 = bb->out_bb;
    j.22 = (unsigned int) j;
    D.22401 = j.22 * 4;
    D.22441 = D.22440 + D.22401;
    D.22442 = *D.22441;
    D.22443 = D.22442->block_num;
    printf ("BB%d ", D.22443);
    j = j + 1;
    <D.21920>:
    D.22444 = bb->out_count;
    D.22445 = (int) D.22444;
    if (D.22445 > j) goto <D.21919>; else goto <D.21921>;
    <D.21921>:
    printf ("\n");
    <D.22432>:
    D.22444 = bb->out_count;
    if (D.22444 == 0) goto <D.22446>; else goto <D.22447>;
    <D.22446>:
    // predicted unlikely by continue predictor.
    goto <D.21922>;
    <D.22447>:
    out_iter = out_iter + 1;
    D.22448 = bb->live_in_set;
    if (D.22448 == 0B) goto <D.22449>; else goto <D.22450>;
    <D.22449>:
    changed = 1;
    goto <D.22451>;
    <D.22450>:
    changed = 0;
    D.22452 = old_live_out_set->size;
    D.22453 = D.22452 / 8;
    D.22454 = bb->live_out_set;
    D.22455 = &D.22454->data;
    D.22456 = &old_live_out_set->data;
    memcpy (D.22456, D.22455, D.22453);
    <D.22451>:
    j = 0;
    goto <D.21945>;
    <D.21944>:
    D.22440 = bb->out_bb;
    j.22 = (unsigned int) j;
    D.22401 = j.22 * 4;
    D.22441 = D.22440 + D.22401;
    out_bb = *D.22441;
    D.22457 = out_bb->live_in_set;
    if (D.22457 == 0B) goto <D.22458>; else goto <D.22459>;
    <D.22458>:
    max_vars.19 = (unsigned int) max_vars;
    bitsize.21 = (unsigned int) bitsize;
    D.22393 = cfg->mempool;
    D.22460 = mono_bitset_mp_new_noinit (D.22393, bitsize.21, max_vars.19);
    out_bb->live_in_set = D.22460;
    D.22457 = out_bb->live_in_set;
    D.22461 = D.22457->size;
    D.22462 = D.22461 / 8;
    D.22463 = out_bb->live_out_set;
    D.22464 = &D.22463->data;
    D.22457 = out_bb->live_in_set;
    D.22465 = &D.22457->data;
    memcpy (D.22465, D.22464, D.22462);
    {
      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.22466 = tmp_dest->size;
      D.22467 = D.22466 / 32;
      size = (int) D.22467;
      i = 0;
      goto <D.21928>;
      <D.21927>:
      D.22468 = tmp_dest->data[i];
      D.22469 = tmp_src->data[i];
      D.22470 = ~D.22469;
      D.22471 = D.22468 & D.22470;
      tmp_dest->data[i] = D.22471;
      i = i + 1;
      <D.21928>:
      if (i < size) goto <D.21927>; else goto <D.21929>;
      <D.21929>:
    }
    {
      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.22472 = tmp_dest->size;
      D.22473 = D.22472 / 32;
      size = (int) D.22473;
      i = 0;
      goto <D.21935>;
      <D.21934>:
      D.22474 = tmp_dest->data[i];
      D.22475 = tmp_src->data[i];
      D.22476 = D.22474 | D.22475;
      tmp_dest->data[i] = D.22476;
      i = i + 1;
      <D.21935>:
      if (i < size) goto <D.21934>; else goto <D.21936>;
      <D.21936>:
    }
    <D.22459>:
    D.22479 = bb->last_ins;
    if (D.22479 != 0B) goto <D.22480>; else goto <D.22477>;
    <D.22480>:
    D.22479 = bb->last_ins;
    D.22481 = D.22479->opcode;
    if (D.22481 == 802) goto <D.22482>; else goto <D.22477>;
    <D.22482>:
    goto <D.22478>;
    <D.22477>:
    {
      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.22483 = tmp_dest->size;
      D.22484 = D.22483 / 32;
      size = (int) D.22484;
      i = 0;
      goto <D.21942>;
      <D.21941>:
      D.22485 = tmp_dest->data[i];
      D.22486 = tmp_src->data[i];
      D.22487 = D.22485 | D.22486;
      tmp_dest->data[i] = D.22487;
      i = i + 1;
      <D.21942>:
      if (i < size) goto <D.21941>; else goto <D.21943>;
      <D.21943>:
    }
    <D.22478>:
    j = j + 1;
    <D.21945>:
    D.22444 = bb->out_count;
    D.22445 = (int) D.22444;
    if (D.22445 > j) goto <D.21944>; else goto <D.21946>;
    <D.21946>:
    if (changed != 0) goto <D.22488>; else goto <D.22489>;
    <D.22489>:
    D.22454 = bb->live_out_set;
    D.22490 = mono_bitset_equal (old_live_out_set, D.22454);
    if (D.22490 == 0) goto <D.22488>; else goto <D.21964>;
    <D.22488>:
    D.22448 = bb->live_in_set;
    if (D.22448 == 0B) goto <D.22491>; else goto <D.22492>;
    <D.22491>:
    max_vars.19 = (unsigned int) max_vars;
    bitsize.21 = (unsigned int) bitsize;
    D.22393 = cfg->mempool;
    D.22493 = mono_bitset_mp_new_noinit (D.22393, bitsize.21, max_vars.19);
    bb->live_in_set = D.22493;
    <D.22492>:
    D.22448 = bb->live_in_set;
    D.22494 = D.22448->size;
    D.22495 = D.22494 / 8;
    D.22454 = bb->live_out_set;
    D.22455 = &D.22454->data;
    D.22448 = bb->live_in_set;
    D.22496 = &D.22448->data;
    memcpy (D.22496, D.22455, D.22495);
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->kill_set;
      tmp_dest = bb->live_in_set;
      D.22497 = tmp_dest->size;
      D.22498 = D.22497 / 32;
      size = (int) D.22498;
      i = 0;
      goto <D.21952>;
      <D.21951>:
      D.22499 = tmp_dest->data[i];
      D.22500 = tmp_src->data[i];
      D.22501 = ~D.22500;
      D.22502 = D.22499 & D.22501;
      tmp_dest->data[i] = D.22502;
      i = i + 1;
      <D.21952>:
      if (i < size) goto <D.21951>; else goto <D.21953>;
      <D.21953>:
    }
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->gen_set;
      tmp_dest = bb->live_in_set;
      D.22503 = tmp_dest->size;
      D.22504 = D.22503 / 32;
      size = (int) D.22504;
      i = 0;
      goto <D.21959>;
      <D.21958>:
      D.22505 = tmp_dest->data[i];
      D.22506 = tmp_src->data[i];
      D.22507 = D.22505 | D.22506;
      tmp_dest->data[i] = D.22507;
      i = i + 1;
      <D.21959>:
      if (i < size) goto <D.21958>; else goto <D.21960>;
      <D.21960>:
    }
    j = 0;
    goto <D.21963>;
    <D.21962>:
    {
      struct MonoBasicBlock * in_bb;

      D.22434 = bb->in_bb;
      j.22 = (unsigned int) j;
      D.22401 = j.22 * 4;
      D.22435 = D.22434 + D.22401;
      in_bb = *D.22435;
      D.22508 = in_bb->gen_set;
      if (D.22508 != 0B) goto <D.22509>; else goto <D.22510>;
      <D.22509>:
      D.22511 = in_bb->dfn;
      D.22512 = (unsigned int) D.22511;
      D.22513 = D.22512 * 4;
      D.22514 = in_worklist + D.22513;
      D.22515 = *D.22514;
      if (D.22515 == 0) goto <D.22516>; else goto <D.22517>;
      <D.22516>:
      D.22370 = cfg->verbose_level;
      if (D.22370 > 1) goto <D.22518>; else goto <D.22519>;
      <D.22518>:
      D.22520 = in_bb->block_num;
      printf ("\tADD: %d\n", D.22520);
      <D.22519>:
      l_end.25 = l_end;
      l_end = l_end.25 + 1;
      D.22522 = l_end.25 * 4;
      D.22523 = worklist + D.22522;
      *D.22523 = in_bb;
      D.22511 = in_bb->dfn;
      D.22512 = (unsigned int) D.22511;
      D.22513 = D.22512 * 4;
      D.22514 = in_worklist + D.22513;
      *D.22514 = 1;
      <D.22517>:
      <D.22510>:
    }
    j = j + 1;
    <D.21963>:
    D.22438 = bb->in_count;
    D.22439 = (int) D.22438;
    if (D.22439 > j) goto <D.21962>; else goto <D.21964>;
    <D.21964>:
    D.22370 = cfg->verbose_level;
    D.22524 = D.22370 > 1;
    D.22525 = (long int) D.22524;
    D.22526 = __builtin_expect (D.22525, 0);
    if (D.22526 != 0) goto <D.22527>; else goto <D.22528>;
    <D.22527>:
    D.22433 = bb->block_num;
    printf ("\tLIVE IN  BB%d: ", D.22433);
    D.22448 = bb->live_in_set;
    mono_bitset_print (D.22448);
    <D.22528>:
  }
  <D.21922>:
  if (l_end != 0) goto <D.21965>; else goto <D.21966>;
  <D.21966>:
  D.22370 = cfg->verbose_level;
  if (D.22370 > 1) goto <D.22529>; else goto <D.22530>;
  <D.22529>:
  D.22412 = cfg->num_bblocks;
  printf ("IT: %d %d.\n", D.22412, out_iter);
  <D.22530>:
  mono_bitset_free (old_live_out_set);
  monoeg_g_free (worklist);
  monoeg_g_free (in_worklist);
  i = 0;
  goto <D.21983>;
  <D.21982>:
  {
    struct MonoBasicBlock * bb;

    D.22389 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22390 = i.20 * 4;
    D.22391 = D.22389 + D.22390;
    bb = *D.22391;
    D.22531 = bb->live_in_set;
    if (D.22531 == 0B) goto <D.22532>; else goto <D.22533>;
    <D.22532>:
    max_vars.19 = (unsigned int) max_vars;
    bitsize.21 = (unsigned int) bitsize;
    D.22393 = cfg->mempool;
    D.22534 = mono_bitset_mp_new (D.22393, bitsize.21, max_vars.19);
    bb->live_in_set = D.22534;
    D.22531 = bb->live_in_set;
    D.22535 = D.22531->size;
    D.22536 = D.22535 / 8;
    D.22537 = bb->live_out_set;
    D.22538 = &D.22537->data;
    D.22531 = bb->live_in_set;
    D.22539 = &D.22531->data;
    memcpy (D.22539, D.22538, D.22536);
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->kill_set;
      tmp_dest = bb->live_in_set;
      D.22540 = tmp_dest->size;
      D.22541 = D.22540 / 32;
      size = (int) D.22541;
      i = 0;
      goto <D.21973>;
      <D.21972>:
      D.22542 = tmp_dest->data[i];
      D.22543 = tmp_src->data[i];
      D.22544 = ~D.22543;
      D.22545 = D.22542 & D.22544;
      tmp_dest->data[i] = D.22545;
      i = i + 1;
      <D.21973>:
      if (i < size) goto <D.21972>; else goto <D.21974>;
      <D.21974>:
    }
    {
      struct MonoBitSet * tmp_src;
      struct MonoBitSet * tmp_dest;
      int i;
      int size;

      tmp_src = bb->gen_set;
      tmp_dest = bb->live_in_set;
      D.22546 = tmp_dest->size;
      D.22547 = D.22546 / 32;
      size = (int) D.22547;
      i = 0;
      goto <D.21980>;
      <D.21979>:
      D.22548 = tmp_dest->data[i];
      D.22549 = tmp_src->data[i];
      D.22550 = D.22548 | D.22549;
      tmp_dest->data[i] = D.22550;
      i = i + 1;
      <D.21980>:
      if (i < size) goto <D.21979>; else goto <D.21981>;
      <D.21981>:
    }
    <D.22533>:
  }
  i = i + 1;
  <D.21983>:
  i.23 = (unsigned int) i;
  D.22412 = cfg->num_bblocks;
  if (i.23 < D.22412) goto <D.21982>; else goto <D.21984>;
  <D.21984>:
  i = 0;
  goto <D.22000>;
  <D.21999>:
  {
    struct MonoBasicBlock * bb;
    guint32 max;
    guint32 abs_pos;
    struct MonoMethodVar * vars;

    D.22389 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22390 = i.20 * 4;
    D.22391 = D.22389 + D.22390;
    bb = *D.22391;
    D.22551 = bb->dfn;
    D.22552 = D.22551 << 16;
    abs_pos = (guint32) D.22552;
    vars = cfg->vars;
    D.22553 = bb->live_out_set;
    if (D.22553 == 0B) goto <D.22554>; else goto <D.22555>;
    <D.22554>:
    // predicted unlikely by continue predictor.
    goto <D.21989>;
    <D.22555>:
    max_vars.26 = (unsigned int) max_vars;
    D.22557 = max_vars.26 + 31;
    max = D.22557 / 32;
    j = 0;
    goto <D.21997>;
    <D.21996>:
    {
      gsize bits_in;
      gsize bits_out;
      int k;

      D.22558 = bb->live_in_set;
      bits_in = D.22558->data[j];
      D.22553 = bb->live_out_set;
      bits_out = D.22553->data[j];
      j.22 = (unsigned int) j;
      D.22559 = j.22 * 32;
      k = (int) D.22559;
      goto <D.21994>;
      <D.21993>:
      D.22560 = bits_in & 1;
      if (D.22560 != 0) goto <D.22561>; else goto <D.22562>;
      <D.22561>:
      abs_pos.27 = (int) abs_pos;
      k.28 = (unsigned int) k;
      D.22565 = k.28 * 56;
      D.22566 = vars + D.22565;
      update_live_range (D.22566, abs_pos.27);
      <D.22562>:
      D.22567 = bits_out & 1;
      if (D.22567 != 0) goto <D.22568>; else goto <D.22569>;
      <D.22568>:
      D.22570 = abs_pos + 65535;
      D.22571 = (int) D.22570;
      k.28 = (unsigned int) k;
      D.22565 = k.28 * 56;
      D.22566 = vars + D.22565;
      update_live_range (D.22566, D.22571);
      <D.22569>:
      bits_in = bits_in >> 1;
      bits_out = bits_out >> 1;
      k = k + 1;
      <D.21994>:
      D.22572 = bits_in | bits_out;
      if (D.22572 != 0) goto <D.21993>; else goto <D.21995>;
      <D.21995>:
    }
    j = j + 1;
    <D.21997>:
    j.29 = (unsigned int) j;
    if (j.29 < max) goto <D.21996>; else goto <D.21998>;
    <D.21998>:
  }
  <D.21989>:
  i = i + 1;
  <D.22000>:
  i.23 = (unsigned int) i;
  D.22412 = cfg->num_bblocks;
  if (i.23 < D.22412) goto <D.21999>; else goto <D.22001>;
  <D.22001>:
  i = 0;
  goto <D.22004>;
  <D.22003>:
  {
    struct MonoMethodVar * vi;

    D.22385 = cfg->vars;
    i.20 = (unsigned int) i;
    D.22387 = i.20 * 56;
    vi = D.22385 + D.22387;
    D.22574 = cfg->varinfo;
    D.22575 = vi->idx;
    D.22576 = D.22575 * 4;
    D.22577 = D.22574 + D.22576;
    D.22578 = *D.22577;
    D.22579 = D.22578->opcode;
    if (D.22579 == 330) goto <D.22580>; else goto <D.22581>;
    <D.22580>:
    D.22582 = vi->range.last_use.abs_pos;
    if (D.22582 == 0) goto <D.22583>; else goto <D.22584>;
    <D.22583>:
    D.22574 = cfg->varinfo;
    D.22575 = vi->idx;
    D.22576 = D.22575 * 4;
    D.22577 = D.22574 + D.22576;
    D.22578 = *D.22577;
    D.22585 = D.22578->flags;
    D.22586 = (int) D.22585;
    D.22587 = D.22586 & 20;
    if (D.22587 == 0) goto <D.22588>; else goto <D.22589>;
    <D.22588>:
    D.22592 = BIT_FIELD_REF <*cfg, 8, 3408>;
    D.22593 = D.22592 & 128;
    if (D.22593 == 0) goto <D.22594>; else goto <D.22595>;
    <D.22594>:
    D.22596 = cfg->generic_sharing_context;
    if (D.22596 == 0B) goto <D.22590>; else goto <D.22597>;
    <D.22597>:
    D.22598 = cfg->method;
    D.22599 = mono_method_signature (D.22598);
    D.22600 = BIT_FIELD_REF <*D.22599, 8, 80>;
    D.22601 = D.22600 & 64;
    if (D.22601 == 0) goto <D.22590>; else goto <D.22602>;
    <D.22602>:
    D.22574 = cfg->varinfo;
    D.22575 = vi->idx;
    D.22576 = D.22575 * 4;
    D.22577 = D.22574 + D.22576;
    D.22578 = *D.22577;
    D.22603 = cfg->args;
    D.22604 = *D.22603;
    if (D.22578 != D.22604) goto <D.22590>; else goto <D.22591>;
    <D.22590>:
    D.22574 = cfg->varinfo;
    D.22575 = vi->idx;
    D.22576 = D.22575 * 4;
    D.22577 = D.22574 + D.22576;
    D.22578 = *D.22577;
    D.22574 = cfg->varinfo;
    D.22575 = vi->idx;
    D.22576 = D.22575 * 4;
    D.22577 = D.22574 + D.22576;
    D.22578 = *D.22577;
    D.22585 = D.22578->flags;
    D.22605 = D.22585 | 2;
    D.22578->flags = D.22605;
    <D.22591>:
    <D.22595>:
    <D.22589>:
    <D.22584>:
    vi->range.first_use.abs_pos = 0;
    <D.22581>:
  }
  i = i + 1;
  <D.22004>:
  if (i < max_vars) goto <D.22003>; else goto <D.22005>;
  <D.22005>:
  D.22370 = cfg->verbose_level;
  if (D.22370 > 1) goto <D.22606>; else goto <D.22607>;
  <D.22606>:
  D.22412 = cfg->num_bblocks;
  D.22608 = D.22412 + 4294967295;
  i = (int) D.22608;
  goto <D.22008>;
  <D.22007>:
  {
    struct MonoBasicBlock * bb;

    D.22389 = cfg->bblocks;
    i.20 = (unsigned int) i;
    D.22390 = i.20 * 4;
    D.22391 = D.22389 + D.22390;
    bb = *D.22391;
    D.22609 = bb->block_num;
    printf ("LIVE IN  BB%d: ", D.22609);
    D.22610 = bb->live_in_set;
    mono_bitset_print (D.22610);
    D.22609 = bb->block_num;
    printf ("LIVE OUT BB%d: ", D.22609);
    D.22611 = bb->live_out_set;
    mono_bitset_print (D.22611);
  }
  i = i + -1;
  <D.22008>:
  if (i >= 0) goto <D.22007>; else goto <D.22009>;
  <D.22009>:
  i = 0;
  goto <D.22012>;
  <D.22011>:
  {
    struct MonoMethodVar * vi;

    D.22385 = cfg->vars;
    i.20 = (unsigned int) i;
    D.22387 = i.20 * 56;
    vi = D.22385 + D.22387;
    D.22612 = vi->range.last_use.abs_pos;
    D.22613 = vi->range.first_use.abs_pos;
    printf ("V%d: [0x%x - 0x%x]\n", i, D.22613, D.22612);
  }
  i = i + 1;
  <D.22012>:
  if (i < max_vars) goto <D.22011>; else goto <D.22013>;
  <D.22013>:
  <D.22607>:
  D.22592 = BIT_FIELD_REF <*cfg, 8, 3408>;
  D.22614 = D.22592 & 8;
  if (D.22614 == 0) goto <D.22615>; else goto <D.22616>;
  <D.22615>:
  optimize_initlocals (cfg);
  <D.22616>:
}


analyze_liveness_bb (struct MonoCompile * cfg, struct MonoBasicBlock * bb)
{
  int D.22618;
  int D.22619;
  short unsigned int D.22620;
  int D.22621;
  int D.22622;
  int D.22623;
  unsigned int D.22624;
  struct MonoMethodVar * D.22631;
  unsigned int idx.30;
  unsigned int D.22633;
  int D.22636;
  unsigned int inst_num.31;
  unsigned int D.22638;
  int D.22639;
  struct MonoMethodVar * D.22640;
  struct MonoBitSet * D.22641;
  unsigned int D.22642;
  unsigned int D.22643;
  int D.22644;
  unsigned int D.22645;
  unsigned int D.22646;
  struct MonoBitSet * D.22649;
  unsigned int D.22650;
  unsigned int D.22651;
  unsigned int D.22652;
  int D.22653;
  signed char D.22654;
  int D.22655;
  int D.22656;
  int D.22657;
  int D.22658;
  int D.22659;
  int D.22660;
  int D.22661;
  signed char D.22662;
  int D.22663;
  sizetype D.22664;
  const char * D.22665;
  char D.22666;
  unsigned int sreg.32;
  unsigned int D.22670;
  struct MonoInst * * D.22673;
  unsigned int sreg.33;
  unsigned int D.22675;
  struct MonoInst * * D.22676;
  struct MonoInst * D.22677;
  struct MonoInst * iftmp.34;
  unsigned int idx.35;
  unsigned int D.22685;
  struct MonoMethodVar * D.22688;
  unsigned int D.22689;
  unsigned int D.22690;
  int D.22691;
  unsigned int D.22692;
  unsigned int D.22693;
  unsigned int D.22696;
  unsigned int D.22697;
  unsigned int D.22698;
  int D.22699;
  int D.22700;
  char D.22701;
  int D.22704;
  unsigned int D.22705;
  unsigned int D.22708;
  unsigned int D.22709;
  struct MonoInst * * D.22710;
  struct MonoInst * D.22711;
  struct MonoInst * iftmp.36;
  unsigned int idx.37;
  unsigned int D.22719;
  short unsigned int D.22720;
  struct MonoMethodVar * D.22723;
  unsigned int D.22724;
  unsigned int D.22725;
  int D.22726;
  unsigned int D.22727;
  unsigned int D.22728;
  unsigned int D.22731;
  unsigned int D.22732;
  unsigned int D.22733;
  int D.22734;
  int D.22735;
  unsigned int D.22739;
  int D.22740;
  unsigned int D.22741;
  unsigned int D.22742;
  unsigned int D.22743;
  struct MonoInst * ins;
  int sreg;
  int inst_num;
  struct MonoMethodVar * vars;
  guint32 abs_pos;

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

    try
      {
        D.22620 = ins->opcode;
        D.22621 = (int) D.22620;
        D.22622 = D.22621 + -313;
        D.22623 = D.22622 * 4;
        spec = &ins_info[D.22623];
        D.22624 = cfg->verbose_level;
        if (D.22624 > 1) goto <D.22625>; else goto <D.22626>;
        <D.22625>:
        printf ("\t");
        mono_print_ins (ins);
        <D.22626>:
        D.22620 = ins->opcode;
        if (D.22620 == 316) goto <D.22627>; else goto <D.22628>;
        <D.22627>:
        // predicted unlikely by continue predictor.
        goto <D.21871>;
        <D.22628>:
        D.22620 = ins->opcode;
        if (D.22620 == 314) goto <D.22629>; else goto <D.22630>;
        <D.22629>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          var = ins->data.op[0].p;
          idx = var->data.op[0].const_val;
          D.22631 = cfg->vars;
          idx.30 = (unsigned int) idx;
          D.22633 = idx.30 * 56;
          vi = D.22631 + D.22633;
          D.22624 = cfg->verbose_level;
          if (D.22624 > 1) goto <D.22634>; else goto <D.22635>;
          <D.22634>:
          D.22636 = var->dreg;
          printf ("\tGEN: R%d(%d)\n", D.22636, idx);
          <D.22635>:
          inst_num.31 = (unsigned int) inst_num;
          D.22638 = abs_pos + inst_num.31;
          D.22639 = (int) D.22638;
          idx.30 = (unsigned int) idx;
          D.22633 = idx.30 * 56;
          D.22640 = vars + D.22633;
          update_live_range (D.22640, D.22639);
          D.22641 = bb->kill_set;
          idx.30 = (unsigned int) idx;
          D.22642 = idx.30 / 32;
          D.22643 = D.22641->data[D.22642];
          D.22644 = idx & 31;
          D.22645 = 1 << D.22644;
          D.22646 = D.22643 & D.22645;
          if (D.22646 == 0) goto <D.22647>; else goto <D.22648>;
          <D.22647>:
          D.22649 = bb->gen_set;
          idx.30 = (unsigned int) idx;
          D.22650 = idx.30 / 32;
          D.22649 = bb->gen_set;
          D.22651 = D.22649->data[D.22650];
          D.22644 = idx & 31;
          D.22645 = 1 << D.22644;
          D.22652 = D.22651 | D.22645;
          D.22649->data[D.22650] = D.22652;
          <D.22648>:
          D.22653 = vi->spill_costs;
          D.22654 = bb->nesting;
          D.22655 = (int) D.22654;
          D.22656 = D.22655 << 1;
          D.22657 = 1 << D.22656;
          D.22658 = D.22653 + D.22657;
          vi->spill_costs = D.22658;
        }
        <D.22630>:
        D.22659 = ins->sreg1;
        sregs[0] = D.22659;
        D.22660 = ins->sreg2;
        sregs[1] = D.22660;
        D.22661 = ins->sreg3;
        sregs[2] = D.22661;
        D.22620 = ins->opcode;
        D.22621 = (int) D.22620;
        D.22622 = D.22621 + -313;
        D.22662 = ins_sreg_counts[D.22622];
        num_sregs = (int) D.22662;
        i = 0;
        goto <D.21879>;
        <D.21878>:
        sreg = sregs[i];
        D.22663 = i + 1;
        D.22664 = (sizetype) D.22663;
        D.22665 = spec + D.22664;
        D.22666 = *D.22665;
        if (D.22666 != 32) goto <D.22667>; else goto <D.22668>;
        <D.22667>:
        sreg.32 = (unsigned int) sreg;
        D.22670 = cfg->vreg_to_inst_len;
        if (sreg.32 < D.22670) goto <D.22671>; else goto <D.22672>;
        <D.22671>:
        D.22673 = cfg->vreg_to_inst;
        sreg.33 = (unsigned int) sreg;
        D.22675 = sreg.33 * 4;
        D.22676 = D.22673 + D.22675;
        D.22677 = *D.22676;
        if (D.22677 != 0B) goto <D.22678>; else goto <D.22679>;
        <D.22678>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          sreg.32 = (unsigned int) sreg;
          D.22670 = cfg->vreg_to_inst_len;
          if (sreg.32 < D.22670) goto <D.22681>; else goto <D.22682>;
          <D.22681>:
          D.22673 = cfg->vreg_to_inst;
          sreg.33 = (unsigned int) sreg;
          D.22675 = sreg.33 * 4;
          D.22676 = D.22673 + D.22675;
          iftmp.34 = *D.22676;
          goto <D.22683>;
          <D.22682>:
          iftmp.34 = 0B;
          <D.22683>:
          var = iftmp.34;
          idx = var->data.op[0].const_val;
          D.22631 = cfg->vars;
          idx.35 = (unsigned int) idx;
          D.22685 = idx.35 * 56;
          vi = D.22631 + D.22685;
          D.22624 = cfg->verbose_level;
          if (D.22624 > 1) goto <D.22686>; else goto <D.22687>;
          <D.22686>:
          printf ("\tGEN: R%d(%d)\n", sreg, idx);
          <D.22687>:
          inst_num.31 = (unsigned int) inst_num;
          D.22638 = abs_pos + inst_num.31;
          D.22639 = (int) D.22638;
          idx.35 = (unsigned int) idx;
          D.22685 = idx.35 * 56;
          D.22688 = vars + D.22685;
          update_live_range (D.22688, D.22639);
          D.22641 = bb->kill_set;
          idx.35 = (unsigned int) idx;
          D.22689 = idx.35 / 32;
          D.22690 = D.22641->data[D.22689];
          D.22691 = idx & 31;
          D.22692 = 1 << D.22691;
          D.22693 = D.22690 & D.22692;
          if (D.22693 == 0) goto <D.22694>; else goto <D.22695>;
          <D.22694>:
          D.22649 = bb->gen_set;
          idx.35 = (unsigned int) idx;
          D.22696 = idx.35 / 32;
          D.22649 = bb->gen_set;
          D.22697 = D.22649->data[D.22696];
          D.22691 = idx & 31;
          D.22692 = 1 << D.22691;
          D.22698 = D.22697 | D.22692;
          D.22649->data[D.22696] = D.22698;
          <D.22695>:
          D.22699 = vi->spill_costs;
          D.22654 = bb->nesting;
          D.22655 = (int) D.22654;
          D.22656 = D.22655 << 1;
          D.22657 = 1 << D.22656;
          D.22700 = D.22699 + D.22657;
          vi->spill_costs = D.22700;
        }
        <D.22679>:
        <D.22672>:
        <D.22668>:
        i = i + 1;
        <D.21879>:
        if (i < num_sregs) goto <D.21878>; else goto <D.21880>;
        <D.21880>:
        D.22701 = *spec;
        if (D.22701 != 32) goto <D.22702>; else goto <D.22703>;
        <D.22702>:
        D.22704 = ins->dreg;
        D.22705 = (unsigned int) D.22704;
        D.22670 = cfg->vreg_to_inst_len;
        if (D.22705 < D.22670) goto <D.22706>; else goto <D.22707>;
        <D.22706>:
        D.22673 = cfg->vreg_to_inst;
        D.22704 = ins->dreg;
        D.22708 = (unsigned int) D.22704;
        D.22709 = D.22708 * 4;
        D.22710 = D.22673 + D.22709;
        D.22711 = *D.22710;
        if (D.22711 != 0B) goto <D.22712>; else goto <D.22713>;
        <D.22712>:
        {
          struct MonoInst * var;
          int idx;
          struct MonoMethodVar * vi;

          D.22704 = ins->dreg;
          D.22705 = (unsigned int) D.22704;
          D.22670 = cfg->vreg_to_inst_len;
          if (D.22705 < D.22670) goto <D.22715>; else goto <D.22716>;
          <D.22715>:
          D.22673 = cfg->vreg_to_inst;
          D.22704 = ins->dreg;
          D.22708 = (unsigned int) D.22704;
          D.22709 = D.22708 * 4;
          D.22710 = D.22673 + D.22709;
          iftmp.36 = *D.22710;
          goto <D.22717>;
          <D.22716>:
          iftmp.36 = 0B;
          <D.22717>:
          var = iftmp.36;
          idx = var->data.op[0].const_val;
          D.22631 = cfg->vars;
          idx.37 = (unsigned int) idx;
          D.22719 = idx.37 * 56;
          vi = D.22631 + D.22719;
          D.22620 = ins->opcode;
          D.22720 = D.22620 + 65162;
          if (D.22720 <= 16) goto <D.22721>; else goto <D.22722>;
          <D.22721>:
          inst_num.31 = (unsigned int) inst_num;
          D.22638 = abs_pos + inst_num.31;
          D.22639 = (int) D.22638;
          idx.37 = (unsigned int) idx;
          D.22719 = idx.37 * 56;
          D.22723 = vars + D.22719;
          update_live_range (D.22723, D.22639);
          D.22641 = bb->kill_set;
          idx.37 = (unsigned int) idx;
          D.22724 = idx.37 / 32;
          D.22725 = D.22641->data[D.22724];
          D.22726 = idx & 31;
          D.22727 = 1 << D.22726;
          D.22728 = D.22725 & D.22727;
          if (D.22728 == 0) goto <D.22729>; else goto <D.22730>;
          <D.22729>:
          D.22649 = bb->gen_set;
          idx.37 = (unsigned int) idx;
          D.22731 = idx.37 / 32;
          D.22649 = bb->gen_set;
          D.22732 = D.22649->data[D.22731];
          D.22726 = idx & 31;
          D.22727 = 1 << D.22726;
          D.22733 = D.22732 | D.22727;
          D.22649->data[D.22731] = D.22733;
          <D.22730>:
          D.22734 = vi->spill_costs;
          D.22654 = bb->nesting;
          D.22655 = (int) D.22654;
          D.22656 = D.22655 << 1;
          D.22657 = 1 << D.22656;
          D.22735 = D.22734 + D.22657;
          vi->spill_costs = D.22735;
          goto <D.22736>;
          <D.22722>:
          D.22624 = cfg->verbose_level;
          if (D.22624 > 1) goto <D.22737>; else goto <D.22738>;
          <D.22737>:
          D.22704 = ins->dreg;
          printf ("\tKILL: R%d(%d)\n", D.22704, idx);
          <D.22738>:
          inst_num.31 = (unsigned int) inst_num;
          D.22638 = abs_pos + inst_num.31;
          D.22739 = D.22638 + 1;
          D.22740 = (int) D.22739;
          idx.37 = (unsigned int) idx;
          D.22719 = idx.37 * 56;
          D.22723 = vars + D.22719;
          update_live_range (D.22723, D.22740);
          D.22641 = bb->kill_set;
          idx.37 = (unsigned int) idx;
          D.22741 = idx.37 / 32;
          D.22641 = bb->kill_set;
          D.22742 = D.22641->data[D.22741];
          D.22726 = idx & 31;
          D.22727 = 1 << D.22726;
          D.22743 = D.22742 | D.22727;
          D.22641->data[D.22741] = D.22743;
          D.22734 = vi->spill_costs;
          D.22654 = bb->nesting;
          D.22655 = (int) D.22654;
          D.22656 = D.22655 << 1;
          D.22657 = 1 << D.22656;
          D.22735 = D.22734 + D.22657;
          vi->spill_costs = D.22735;
          <D.22736>:
        }
        <D.22713>:
        <D.22707>:
        <D.22703>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  <D.21871>:
  ins = ins->next;
  inst_num = inst_num + 2;
  <D.21885>:
  if (ins != 0B) goto <D.21884>; else goto <D.21886>;
  <D.21886>:
}


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

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


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

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


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

  D.22751 = __builtin_object_size (__dest, 0);
  D.22750 = __builtin___memcpy_chk (__dest, __src, __len, D.22751);
  return D.22750;
}


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

  D.22753 = var->range.first_use.abs_pos;
  abs_pos.38 = (unsigned int) abs_pos;
  if (D.22753 > abs_pos.38) goto <D.22755>; else goto <D.22756>;
  <D.22755>:
  abs_pos.38 = (unsigned int) abs_pos;
  var->range.first_use.abs_pos = abs_pos.38;
  <D.22756>:
  D.22757 = var->range.last_use.abs_pos;
  abs_pos.38 = (unsigned int) abs_pos;
  if (D.22757 < abs_pos.38) goto <D.22758>; else goto <D.22759>;
  <D.22758>:
  abs_pos.38 = (unsigned int) abs_pos;
  var->range.last_use.abs_pos = abs_pos.38;
  <D.22759>:
}


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

  first = 1;
  printf ("{");
  i = 0;
  goto <D.21799>;
  <D.21798>:
  i.39 = (unsigned int) i;
  D.22761 = mono_bitset_test (set, i.39);
  if (D.22761 != 0) goto <D.22762>; else goto <D.22763>;
  <D.22762>:
  if (first == 0) goto <D.22764>; else goto <D.22765>;
  <D.22764>:
  printf (", ");
  <D.22765>:
  printf ("%d", i);
  first = 0;
  <D.22763>:
  i = i + 1;
  <D.21799>:
  i.39 = (unsigned int) i;
  D.22766 = mono_bitset_size (set);
  if (i.39 < D.22766) goto <D.21798>; else goto <D.21800>;
  <D.21800>:
  printf ("}\n");
}


optimize_initlocals (struct MonoCompile * cfg)
{
  unsigned int D.22767;
  unsigned int D.22768;
  struct MonoBasicBlock * D.22769;
  int D.22770;
  int D.22771;
  int D.22772;
  short unsigned int D.22773;
  int D.22774;
  int D.22775;
  signed char D.22776;
  int D.22777;
  unsigned int D.22778;
  unsigned int D.22779;
  unsigned int D.22780;
  int D.22781;
  unsigned int D.22782;
  unsigned int D.22783;
  short unsigned int D.22784;
  int D.22787;
  unsigned int D.22788;
  unsigned int D.22789;
  unsigned int D.22790;
  int D.22791;
  unsigned int D.22792;
  unsigned int D.22793;
  int D.22794;
  char D.22795;
  struct MonoInst * iftmp.40;
  unsigned int D.22801;
  unsigned int D.22802;
  struct MonoInst * * D.22805;
  unsigned int D.22806;
  struct MonoInst * * D.22807;
  unsigned int D.22811;
  unsigned int D.22812;
  unsigned int D.22813;
  struct MonoBitSet * D.22816;
  int D.22817;
  unsigned int D.22818;
  unsigned int D.22819;
  unsigned int D.22820;
  int D.22821;
  unsigned int D.22822;
  unsigned int D.22823;
  struct MonoInst * D.22826;
  unsigned char D.22829;
  int D.22830;
  int D.22831;
  unsigned char D.22834;
  unsigned char D.22835;
  unsigned char D.22838;
  short unsigned int D.22841;
  short unsigned int D.22842;
  _Bool D.22843;
  _Bool D.22844;
  _Bool D.22845;
  struct MonoMethodVar * D.22848;
  unsigned int D.22849;
  struct MonoMethodVar * D.22850;
  int D.22851;
  int D.22852;
  struct MonoBitSet * used;
  struct MonoInst * ins;
  struct MonoBasicBlock * initlocals_bb;

  D.22767 = cfg->next_vreg;
  D.22768 = D.22767 + 1;
  used = mono_bitset_new (D.22768, 0);
  mono_bitset_clear_all (used);
  D.22769 = cfg->bb_entry;
  initlocals_bb = D.22769->next_bb;
  ins = initlocals_bb->code;
  goto <D.22027>;
  <D.22026>:
  {
    int num_sregs;
    int i;
    int sregs[3];

    try
      {
        D.22770 = ins->sreg1;
        sregs[0] = D.22770;
        D.22771 = ins->sreg2;
        sregs[1] = D.22771;
        D.22772 = ins->sreg3;
        sregs[2] = D.22772;
        D.22773 = ins->opcode;
        D.22774 = (int) D.22773;
        D.22775 = D.22774 + -313;
        D.22776 = ins_sreg_counts[D.22775];
        num_sregs = (int) D.22776;
        i = 0;
        goto <D.22024>;
        <D.22023>:
        D.22777 = sregs[i];
        D.22778 = (unsigned int) D.22777;
        D.22779 = D.22778 / 32;
        D.22780 = used->data[D.22779];
        D.22777 = sregs[i];
        D.22781 = D.22777 & 31;
        D.22782 = 1 << D.22781;
        D.22783 = D.22780 | D.22782;
        used->data[D.22779] = D.22783;
        i = i + 1;
        <D.22024>:
        if (i < num_sregs) goto <D.22023>; else goto <D.22025>;
        <D.22025>:
        D.22773 = ins->opcode;
        D.22784 = D.22773 + 65162;
        if (D.22784 <= 16) goto <D.22785>; else goto <D.22786>;
        <D.22785>:
        D.22787 = ins->dreg;
        D.22788 = (unsigned int) D.22787;
        D.22789 = D.22788 / 32;
        D.22790 = used->data[D.22789];
        D.22787 = ins->dreg;
        D.22791 = D.22787 & 31;
        D.22792 = 1 << D.22791;
        D.22793 = D.22790 | D.22792;
        used->data[D.22789] = D.22793;
        <D.22786>:
      }
    finally
      {
        sregs = {CLOBBER};
      }
  }
  ins = ins->next;
  <D.22027>:
  if (ins != 0B) goto <D.22026>; else goto <D.22028>;
  <D.22028>:
  ins = initlocals_bb->code;
  goto <D.22033>;
  <D.22032>:
  {
    const char * spec;

    D.22773 = ins->opcode;
    D.22774 = (int) D.22773;
    D.22775 = D.22774 + -313;
    D.22794 = D.22775 * 4;
    spec = &ins_info[D.22794];
    D.22795 = *spec;
    if (D.22795 != 32) goto <D.22796>; else goto <D.22797>;
    <D.22796>:
    D.22773 = ins->opcode;
    D.22784 = D.22773 + 65162;
    if (D.22784 > 16) goto <D.22798>; else goto <D.22799>;
    <D.22798>:
    {
      struct MonoInst * var;

      D.22787 = ins->dreg;
      D.22801 = (unsigned int) D.22787;
      D.22802 = cfg->vreg_to_inst_len;
      if (D.22801 < D.22802) goto <D.22803>; else goto <D.22804>;
      <D.22803>:
      D.22805 = cfg->vreg_to_inst;
      D.22787 = ins->dreg;
      D.22788 = (unsigned int) D.22787;
      D.22806 = D.22788 * 4;
      D.22807 = D.22805 + D.22806;
      iftmp.40 = *D.22807;
      goto <D.22808>;
      <D.22804>:
      iftmp.40 = 0B;
      <D.22808>:
      var = iftmp.40;
      if (var != 0B) goto <D.22809>; else goto <D.22810>;
      <D.22809>:
      D.22787 = ins->dreg;
      D.22788 = (unsigned int) D.22787;
      D.22811 = D.22788 / 32;
      D.22812 = used->data[D.22811];
      D.22787 = ins->dreg;
      D.22791 = D.22787 & 31;
      D.22792 = 1 << D.22791;
      D.22813 = D.22812 & D.22792;
      if (D.22813 == 0) goto <D.22814>; else goto <D.22815>;
      <D.22814>:
      D.22816 = initlocals_bb->live_out_set;
      D.22817 = var->data.op[0].const_val;
      D.22818 = (unsigned int) D.22817;
      D.22819 = D.22818 / 32;
      D.22820 = D.22816->data[D.22819];
      D.22817 = var->data.op[0].const_val;
      D.22821 = D.22817 & 31;
      D.22822 = 1 << D.22821;
      D.22823 = D.22820 & D.22822;
      if (D.22823 == 0) goto <D.22824>; else goto <D.22825>;
      <D.22824>:
      D.22826 = cfg->ret;
      if (D.22826 != var) goto <D.22827>; else goto <D.22828>;
      <D.22827>:
      D.22829 = var->flags;
      D.22830 = (int) D.22829;
      D.22831 = D.22830 & 20;
      if (D.22831 == 0) goto <D.22832>; else goto <D.22833>;
      <D.22832>:
      D.22834 = BIT_FIELD_REF <*cfg, 8, 3408>;
      D.22835 = D.22834 & 16;
      if (D.22835 != 0) goto <D.22836>; else goto <D.22837>;
      <D.22836>:
      D.22838 = var->type;
      if (D.22838 == 6) goto <D.22839>; else goto <D.22840>;
      <D.22839>:
      // predicted unlikely by continue predictor.
      goto <D.22031>;
      <D.22840>:
      <D.22837>:
      D.22841 = ins->opcode;
      D.22842 = D.22841 + 65174;
      D.22843 = D.22842 <= 1;
      D.22844 = D.22841 == 365;
      D.22845 = D.22843 | D.22844;
      if (D.22845 != 0) goto <D.22846>; else goto <D.22847>;
      <D.22846>:
      ins->opcode = 316;
      ins->dreg = -1;
      ins->sreg3 = -1;
      D.22772 = ins->sreg3;
      ins->sreg2 = D.22772;
      D.22771 = ins->sreg2;
      ins->sreg1 = D.22771;
      D.22848 = cfg->vars;
      D.22817 = var->data.op[0].const_val;
      D.22818 = (unsigned int) D.22817;
      D.22849 = D.22818 * 56;
      D.22850 = D.22848 + D.22849;
      D.22848 = cfg->vars;
      D.22817 = var->data.op[0].const_val;
      D.22818 = (unsigned int) D.22817;
      D.22849 = D.22818 * 56;
      D.22850 = D.22848 + D.22849;
      D.22851 = D.22850->spill_costs;
      D.22852 = D.22851 + -1;
      D.22850->spill_costs = D.22852;
      <D.22847>:
      <D.22833>:
      <D.22828>:
      <D.22825>:
      <D.22815>:
      <D.22810>:
    }
    <D.22799>:
    <D.22797>:
  }
  <D.22031>:
  ins = ins->next;
  <D.22033>:
  if (ins != 0B) goto <D.22032>; else goto <D.22034>;
  <D.22034>:
  monoeg_g_free (used);
}


mono_linterval_add_range (struct MonoCompile * cfg, struct MonoLiveInterval * interval, int from, int to)
{
  _Bool D.22853;
  long int D.22854;
  long int D.22855;
  int iftmp.41;
  struct MonoLiveRange2 * D.22861;
  int D.22863;
  _Bool D.22866;
  long int D.22867;
  long int D.22868;
  int D.22872;
  int D.22876;
  struct MonoMemPool * D.22882;
  struct MonoLiveRange2 * prev_range;
  struct MonoLiveRange2 * next_range;
  struct MonoLiveRange2 * new_range;

  D.22853 = to < from;
  D.22854 = (long int) D.22853;
  D.22855 = __builtin_expect (D.22854, 0);
  if (D.22855 != 0) goto <D.22856>; else goto <D.22857>;
  <D.22856>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 637, "to >= from");
  <D.22857>:
  D.22861 = interval->range;
  if (D.22861 != 0B) goto <D.22862>; else goto <D.22859>;
  <D.22862>:
  D.22861 = interval->range;
  D.22863 = D.22861->from;
  if (D.22863 > from) goto <D.22864>; else goto <D.22859>;
  <D.22864>:
  D.22861 = interval->range;
  D.22863 = D.22861->from;
  if (D.22863 == to) goto <D.22865>; else goto <D.22859>;
  <D.22865>:
  iftmp.41 = 1;
  goto <D.22860>;
  <D.22859>:
  iftmp.41 = 0;
  <D.22860>:
  D.22866 = iftmp.41 != 0;
  D.22867 = (long int) D.22866;
  D.22868 = __builtin_expect (D.22867, 1);
  if (D.22868 != 0) goto <D.22869>; else goto <D.22870>;
  <D.22869>:
  D.22861 = interval->range;
  D.22861->from = from;
  return;
  <D.22870>:
  prev_range = 0B;
  next_range = interval->range;
  goto <D.22045>;
  <D.22044>:
  prev_range = next_range;
  next_range = next_range->next;
  <D.22045>:
  if (next_range != 0B) goto <D.22871>; else goto <D.22046>;
  <D.22871>:
  D.22872 = next_range->from;
  if (D.22872 <= from) goto <D.22044>; else goto <D.22046>;
  <D.22046>:
  if (prev_range != 0B) goto <D.22875>; else goto <D.22873>;
  <D.22875>:
  D.22876 = prev_range->to;
  if (D.22876 == from) goto <D.22877>; else goto <D.22873>;
  <D.22877>:
  prev_range->to = to;
  goto <D.22874>;
  <D.22873>:
  if (next_range != 0B) goto <D.22880>; else goto <D.22878>;
  <D.22880>:
  D.22872 = next_range->from;
  if (D.22872 == to) goto <D.22881>; else goto <D.22878>;
  <D.22881>:
  next_range->from = from;
  goto <D.22879>;
  <D.22878>:
  D.22882 = cfg->mempool;
  new_range = mono_mempool_alloc (D.22882, 12);
  new_range->from = from;
  new_range->to = to;
  new_range->next = 0B;
  if (prev_range != 0B) goto <D.22883>; else goto <D.22884>;
  <D.22883>:
  prev_range->next = new_range;
  goto <D.22885>;
  <D.22884>:
  interval->range = new_range;
  <D.22885>:
  if (next_range != 0B) goto <D.22886>; else goto <D.22887>;
  <D.22886>:
  new_range->next = next_range;
  goto <D.22888>;
  <D.22887>:
  interval->last_range = new_range;
  <D.22888>:
  <D.22879>:
  <D.22874>:
}


mono_linterval_print (struct MonoLiveInterval * interval)
{
  int D.22890;
  int D.22891;
  struct MonoLiveRange2 * range;

  range = interval->range;
  goto <D.22052>;
  <D.22051>:
  D.22890 = range->to;
  D.22891 = range->from;
  printf ("[%x-%x] ", D.22891, D.22890);
  range = range->next;
  <D.22052>:
  if (range != 0B) goto <D.22051>; else goto <D.22053>;
  <D.22053>:
}


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


mono_linterval_covers (struct MonoLiveInterval * interval, int pos)
{
  int D.22892;
  int D.22895;
  gboolean D.22898;
  struct MonoLiveRange2 * range;

  range = interval->range;
  goto <D.22063>;
  <D.22062>:
  D.22892 = range->from;
  if (D.22892 <= pos) goto <D.22893>; else goto <D.22894>;
  <D.22893>:
  D.22895 = range->to;
  if (D.22895 >= pos) goto <D.22896>; else goto <D.22897>;
  <D.22896>:
  D.22898 = 1;
  return D.22898;
  <D.22897>:
  <D.22894>:
  D.22892 = range->from;
  if (D.22892 > pos) goto <D.22899>; else goto <D.22900>;
  <D.22899>:
  D.22898 = 0;
  return D.22898;
  <D.22900>:
  range = range->next;
  <D.22063>:
  if (range != 0B) goto <D.22062>; else goto <D.22064>;
  <D.22064>:
  D.22898 = 0;
  return D.22898;
}


mono_linterval_get_intersect_pos (struct MonoLiveInterval * i1, struct MonoLiveInterval * i2)
{
  int D.22902;
  int D.22903;
  int D.22906;
  int D.22907;
  gint32 D.22912;
  struct MonoLiveRange2 * r1;
  struct MonoLiveRange2 * r2;

  r1 = i1->range;
  goto <D.22075>;
  <D.22074>:
  r2 = i2->range;
  goto <D.22072>;
  <D.22071>:
  D.22902 = r2->to;
  D.22903 = r1->from;
  if (D.22902 > D.22903) goto <D.22904>; else goto <D.22905>;
  <D.22904>:
  D.22906 = r2->from;
  D.22907 = r1->to;
  if (D.22906 < D.22907) goto <D.22908>; else goto <D.22909>;
  <D.22908>:
  D.22906 = r2->from;
  D.22903 = r1->from;
  if (D.22906 <= D.22903) goto <D.22910>; else goto <D.22911>;
  <D.22910>:
  D.22912 = r1->from;
  return D.22912;
  <D.22911>:
  D.22912 = r2->from;
  return D.22912;
  <D.22909>:
  <D.22905>:
  r2 = r2->next;
  <D.22072>:
  if (r2 != 0B) goto <D.22071>; else goto <D.22073>;
  <D.22073>:
  r1 = r1->next;
  <D.22075>:
  if (r1 != 0B) goto <D.22074>; else goto <D.22076>;
  <D.22076>:
  D.22912 = -1;
  return D.22912;
}


mono_linterval_split (struct MonoCompile * cfg, struct MonoLiveInterval * interval, struct MonoLiveInterval * * i1, struct MonoLiveInterval * * i2, int pos)
{
  int iftmp.42;
  struct MonoLiveRange2 * D.22918;
  int D.22919;
  struct MonoLiveRange2 * D.22921;
  int D.22922;
  _Bool D.22923;
  long int D.22924;
  long int D.22925;
  struct MonoMemPool * D.22928;
  void * D.22929;
  void * D.22930;
  int D.22931;
  int D.22934;
  struct MonoLiveInterval * D.22935;
  int D.22941;
  struct MonoLiveInterval * D.22942;
  struct MonoLiveRange2 * r;

  D.22918 = interval->range;
  D.22919 = D.22918->from;
  if (D.22919 >= pos) goto <D.22915>; else goto <D.22920>;
  <D.22920>:
  D.22921 = interval->last_range;
  D.22922 = D.22921->to;
  if (D.22922 < pos) goto <D.22915>; else goto <D.22916>;
  <D.22915>:
  iftmp.42 = 1;
  goto <D.22917>;
  <D.22916>:
  iftmp.42 = 0;
  <D.22917>:
  D.22923 = iftmp.42 != 0;
  D.22924 = (long int) D.22923;
  D.22925 = __builtin_expect (D.22924, 0);
  if (D.22925 != 0) goto <D.22926>; else goto <D.22927>;
  <D.22926>:
  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.22927>:
  D.22928 = cfg->mempool;
  D.22929 = mono_mempool_alloc0 (D.22928, 8);
  *i1 = D.22929;
  D.22928 = cfg->mempool;
  D.22930 = mono_mempool_alloc0 (D.22928, 8);
  *i2 = D.22930;
  r = interval->range;
  goto <D.22086>;
  <D.22085>:
  D.22931 = r->to;
  if (D.22931 < pos) goto <D.22932>; else goto <D.22933>;
  <D.22932>:
  D.22931 = r->to;
  D.22934 = r->from;
  D.22935 = *i1;
  mono_linterval_add_range (cfg, D.22935, D.22934, D.22931);
  goto <D.22936>;
  <D.22933>:
  D.22934 = r->from;
  if (D.22934 < pos) goto <D.22939>; else goto <D.22937>;
  <D.22939>:
  D.22931 = r->to;
  if (D.22931 >= pos) goto <D.22940>; else goto <D.22937>;
  <D.22940>:
  D.22941 = pos + -1;
  D.22934 = r->from;
  D.22935 = *i1;
  mono_linterval_add_range (cfg, D.22935, D.22934, D.22941);
  D.22931 = r->to;
  D.22942 = *i2;
  mono_linterval_add_range (cfg, D.22942, pos, D.22931);
  goto <D.22938>;
  <D.22937>:
  D.22931 = r->to;
  D.22934 = r->from;
  D.22942 = *i2;
  mono_linterval_add_range (cfg, D.22942, D.22934, D.22931);
  <D.22938>:
  <D.22936>:
  r = r->next;
  <D.22086>:
  if (r != 0B) goto <D.22085>; else goto <D.22087>;
  <D.22087>:
}


mono_analyze_liveness_gc (struct MonoCompile * cfg)
{
  unsigned int D.22943;
  unsigned int D.22946;
  unsigned int max_vars.43;
  unsigned int D.22948;
  unsigned int D.22949;
  unsigned int D.22950;
  struct MonoMethodVar * D.22951;
  unsigned int idx.44;
  unsigned int D.22953;
  int D.22954;
  unsigned int D.22955;
  unsigned int D.22956;
  struct MonoMethodVar * * D.22957;
  unsigned int reverse_len.45;
  unsigned int D.22959;
  struct MonoMemPool * D.22960;
  int D.22961;
  int D.22962;
  int D.22965;
  struct MonoInst * D.22966;
  unsigned int D.22969;
  unsigned int D.22970;
  struct MonoBitSet * D.22971;
  unsigned int j.46;
  unsigned int D.22975;
  unsigned int D.22976;
  struct MonoInst * * D.22979;
  unsigned int k.47;
  unsigned int D.22981;
  struct MonoInst * * D.22982;
  struct MonoInst * D.22983;
  unsigned char D.22984;
  signed char D.22985;
  gint32 * D.22990;
  unsigned int new_reverse_len.48;
  unsigned int D.22994;
  unsigned int nins.49;
  unsigned int D.22996;
  struct MonoInst * * D.22997;
  unsigned int i.50;
  unsigned int D.22999;
  struct MonoInst * * D.23000;
  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.22943 = cfg->verbose_level;
      if (D.22943 > 1) goto <D.22944>; else goto <D.22945>;
      <D.22944>:
      printf ("\n------------ GC LIVENESS: ----------\n");
      <D.22945>:
      D.22946 = cfg->num_varinfo;
      max_vars = (int) D.22946;
      max_vars.43 = (unsigned int) max_vars;
      D.22948 = max_vars.43 * 4;
      last_use = monoeg_malloc0 (D.22948);
      D.22949 = cfg->next_vreg;
      D.22950 = D.22949 * 4;
      vreg_to_varinfo = monoeg_malloc0 (D.22950);
      idx = 0;
      goto <D.22130>;
      <D.22129>:
      {
        struct MonoMethodVar * vi;

        D.22951 = cfg->vars;
        idx.44 = (unsigned int) idx;
        D.22953 = idx.44 * 56;
        vi = D.22951 + D.22953;
        D.22954 = vi->vreg;
        D.22955 = (unsigned int) D.22954;
        D.22956 = D.22955 * 4;
        D.22957 = vreg_to_varinfo + D.22956;
        *D.22957 = vi;
      }
      idx = idx + 1;
      <D.22130>:
      if (idx < max_vars) goto <D.22129>; else goto <D.22131>;
      <D.22131>:
      reverse_len = 1024;
      reverse_len.45 = (unsigned int) reverse_len;
      D.22959 = reverse_len.45 * 4;
      D.22960 = cfg->mempool;
      reverse = mono_mempool_alloc (D.22960, D.22959);
      bb = cfg->bb_entry;
      goto <D.22154>;
      <D.22153>:
      {
        struct MonoInst * ins;

        block_from = bb->real_native_offset;
        D.22961 = bb->native_offset;
        D.22962 = bb->native_length;
        block_to = D.22961 + D.22962;
        D.22943 = cfg->verbose_level;
        if (D.22943 > 1) goto <D.22963>; else goto <D.22964>;
        <D.22963>:
        D.22965 = bb->block_num;
        printf ("GC LIVENESS BB%d:\n", D.22965);
        <D.22964>:
        D.22966 = bb->code;
        if (D.22966 == 0B) goto <D.22967>; else goto <D.22968>;
        <D.22967>:
        // predicted unlikely by continue predictor.
        goto <D.22133>;
        <D.22968>:
        max_vars.43 = (unsigned int) max_vars;
        D.22948 = max_vars.43 * 4;
        memset (last_use, 0, D.22948);
        max_vars.43 = (unsigned int) max_vars;
        D.22969 = max_vars.43 + 31;
        D.22970 = D.22969 / 32;
        max = (int) D.22970;
        j = 0;
        goto <D.22142>;
        <D.22141>:
        {
          gsize bits_out;
          int k;

          D.22971 = bb->live_out_set;
          if (D.22971 == 0B) goto <D.22972>; else goto <D.22973>;
          <D.22972>:
          // predicted unlikely by continue predictor.
          goto <D.22136>;
          <D.22973>:
          D.22971 = bb->live_out_set;
          bits_out = D.22971->data[j];
          j.46 = (unsigned int) j;
          D.22975 = j.46 * 32;
          k = (int) D.22975;
          goto <D.22139>;
          <D.22138>:
          D.22976 = bits_out & 1;
          if (D.22976 != 0) goto <D.22977>; else goto <D.22978>;
          <D.22977>:
          D.22979 = cfg->varinfo;
          k.47 = (unsigned int) k;
          D.22981 = k.47 * 4;
          D.22982 = D.22979 + D.22981;
          D.22983 = *D.22982;
          D.22984 = D.22983->flags;
          D.22985 = (signed char) D.22984;
          if (D.22985 < 0) goto <D.22986>; else goto <D.22987>;
          <D.22986>:
          {
            int vreg;

            D.22979 = cfg->varinfo;
            k.47 = (unsigned int) k;
            D.22981 = k.47 * 4;
            D.22982 = D.22979 + D.22981;
            D.22983 = *D.22982;
            vreg = get_vreg_from_var (cfg, D.22983);
            D.22943 = cfg->verbose_level;
            if (D.22943 > 1) goto <D.22988>; else goto <D.22989>;
            <D.22988>:
            printf ("Var R%d live at exit, last_use set to %x.\n", vreg, block_to);
            <D.22989>:
            k.47 = (unsigned int) k;
            D.22981 = k.47 * 4;
            D.22990 = last_use + D.22981;
            *D.22990 = block_to;
          }
          <D.22987>:
          <D.22978>:
          bits_out = bits_out >> 1;
          k = k + 1;
          <D.22139>:
          if (bits_out != 0) goto <D.22138>; else goto <D.22140>;
          <D.22140>:
        }
        <D.22136>:
        j = j + 1;
        <D.22142>:
        if (j < max) goto <D.22141>; else goto <D.22143>;
        <D.22143>:
        nins = 0;
        pos = block_from;
        ins = bb->code;
        goto <D.22147>;
        <D.22146>:
        if (nins >= reverse_len) goto <D.22991>; else goto <D.22992>;
        <D.22991>:
        {
          int new_reverse_len;
          struct MonoInst * * new_reverse;

          new_reverse_len = reverse_len * 2;
          new_reverse_len.48 = (unsigned int) new_reverse_len;
          D.22994 = new_reverse_len.48 * 4;
          D.22960 = cfg->mempool;
          new_reverse = mono_mempool_alloc (D.22960, D.22994);
          reverse_len.45 = (unsigned int) reverse_len;
          D.22959 = reverse_len.45 * 4;
          memcpy (new_reverse, reverse, D.22959);
          reverse = new_reverse;
          reverse_len = new_reverse_len;
        }
        <D.22992>:
        nins.49 = (unsigned int) nins;
        D.22996 = nins.49 * 4;
        D.22997 = reverse + D.22996;
        *D.22997 = ins;
        ins = ins->next;
        nins = nins + 1;
        pos = pos + 1;
        <D.22147>:
        if (ins != 0B) goto <D.22146>; else goto <D.22148>;
        <D.22148>:
        callsites = 0B;
        i = nins + -1;
        goto <D.22151>;
        <D.22150>:
        {
          struct MonoInst * ins;

          i.50 = (unsigned int) i;
          D.22999 = i.50 * 4;
          D.23000 = reverse + D.22999;
          ins = *D.23000;
          update_liveness_gc (cfg, bb, ins, last_use, vreg_to_varinfo, &callsites);
        }
        i = i + -1;
        <D.22151>:
        if (i >= 0) goto <D.22150>; else goto <D.22152>;
        <D.22152>:
        callsites.51 = callsites;
        bb->gc_callsites = callsites.51;
      }
      <D.22133>:
      bb = bb->next_bb;
      <D.22154>:
      if (bb != 0B) goto <D.22153>; else goto <D.22155>;
      <D.22155>:
      monoeg_g_free (last_use);
      monoeg_g_free (vreg_to_varinfo);
    }
  finally
    {
      callsites = {CLOBBER};
    }
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.23004;
  int D.23009;
  void * D.23011;
  unsigned int D.23012;

  D.23004 = __builtin_constant_p (__len);
  if (D.23004 != 0) goto <D.23005>; else goto <D.23006>;
  <D.23005>:
  if (__len == 0) goto <D.23007>; else goto <D.23008>;
  <D.23007>:
  D.23009 = __builtin_constant_p (__ch);
  if (D.23009 == 0) goto <D.23002>; else goto <D.23010>;
  <D.23010>:
  if (__ch != 0) goto <D.23002>; else goto <D.23003>;
  <D.23002>:
  __warn_memset_zero_len ();
  D.23011 = __dest;
  return D.23011;
  <D.23003>:
  <D.23008>:
  <D.23006>:
  D.23012 = __builtin_object_size (__dest, 0);
  D.23011 = __builtin___memset_chk (__dest, __ch, __len, D.23012);
  return D.23011;
}


get_vreg_from_var (struct MonoCompile * cfg, struct MonoInst * var)
{
  short unsigned int D.23014;
  int D.23017;
  struct MonoMethodVar * D.23018;
  int D.23019;
  unsigned int D.23020;
  unsigned int D.23021;
  struct MonoMethodVar * D.23022;

  D.23014 = var->opcode;
  if (D.23014 == 366) goto <D.23015>; else goto <D.23016>;
  <D.23015>:
  D.23018 = cfg->vars;
  D.23019 = var->data.op[0].const_val;
  D.23020 = (unsigned int) D.23019;
  D.23021 = D.23020 * 56;
  D.23022 = D.23018 + D.23021;
  D.23017 = D.23022->vreg;
  return D.23017;
  <D.23016>:
  D.23017 = var->dreg;
  return D.23017;
}


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.23024;
  short unsigned int D.23025;
  unsigned int vreg.52;
  unsigned int D.23029;
  struct MonoMethodVar * * D.23030;
  unsigned int D.23031;
  unsigned int D.23032;
  unsigned int idx.53;
  unsigned int D.23038;
  gint32 * D.23039;
  int D.23040;
  struct GSList * D.23053;
  _Bool D.23054;
  long int D.23055;
  long int D.23056;
  struct GSList * D.23059;
  struct MonoMemPool * D.23060;
  struct GSList * D.23061;
  unsigned char D.23063;
  signed char D.23064;
  int D.23069;
  unsigned int D.23072;
  long long unsigned int D.23073;
  long long unsigned int D.23074;
  long long unsigned int D.23075;
  long long unsigned int D.23076;
  unsigned int D.23077;
  void * D.23078;
  unsigned int i.54;
  unsigned int D.23080;
  gint32 * D.23081;
  int D.23082;
  struct MonoMethodVar * D.23087;
  unsigned int D.23088;
  struct MonoMethodVar * D.23089;
  int D.23090;
  guint8 * D.23091;
  int D.23092;
  sizetype D.23093;
  guint8 * D.23094;
  unsigned char D.23095;
  signed char D.23096;
  int D.23097;
  int D.23098;
  signed char D.23099;
  signed char D.23100;
  unsigned char D.23101;
  unsigned int i.55;
  struct GSList * D.23105;

  D.23024 = ins->opcode;
  D.23025 = D.23024 + 64536;
  if (D.23025 <= 1) goto <D.23026>; else goto <D.23027>;
  <D.23026>:
  {
    int vreg;
    struct MonoMethodVar * vi;
    int idx;
    int pc_offset;

    vreg = ins->data.op[1].const_val;
    vreg.52 = (unsigned int) vreg;
    D.23029 = vreg.52 * 4;
    D.23030 = vreg_to_varinfo + D.23029;
    vi = *D.23030;
    D.23031 = vi->idx;
    idx = (int) D.23031;
    pc_offset = ins->backend.pc_offset;
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23033>; else goto <D.23034>;
    <D.23033>:
    printf ("\t%x: ", pc_offset);
    mono_print_ins (ins);
    <D.23034>:
    D.23024 = ins->opcode;
    if (D.23024 == 1000) goto <D.23035>; else goto <D.23036>;
    <D.23035>:
    idx.53 = (unsigned int) idx;
    D.23038 = idx.53 * 4;
    D.23039 = last_use + D.23038;
    D.23040 = *D.23039;
    if (D.23040 > 0) goto <D.23041>; else goto <D.23042>;
    <D.23041>:
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23043>; else goto <D.23044>;
    <D.23043>:
    idx.53 = (unsigned int) idx;
    D.23038 = idx.53 * 4;
    D.23039 = last_use + D.23038;
    D.23040 = *D.23039;
    printf ("\tadd range to R%d: [%x, %x)\n", vreg, pc_offset, D.23040);
    <D.23044>:
    idx.53 = (unsigned int) idx;
    D.23038 = idx.53 * 4;
    D.23039 = last_use + D.23038;
    *D.23039 = 0;
    <D.23042>:
    goto <D.23045>;
    <D.23036>:
    idx.53 = (unsigned int) idx;
    D.23038 = idx.53 * 4;
    D.23039 = last_use + D.23038;
    D.23040 = *D.23039;
    if (D.23040 == 0) goto <D.23046>; else goto <D.23047>;
    <D.23046>:
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23048>; else goto <D.23049>;
    <D.23048>:
    printf ("\tlast use of R%d set to %x\n", vreg, pc_offset);
    <D.23049>:
    idx.53 = (unsigned int) idx;
    D.23038 = idx.53 * 4;
    D.23039 = last_use + D.23038;
    *D.23039 = pc_offset;
    <D.23047>:
    <D.23045>:
  }
  goto <D.23050>;
  <D.23027>:
  D.23024 = ins->opcode;
  if (D.23024 == 1003) goto <D.23051>; else goto <D.23052>;
  <D.23051>:
  {
    struct GCCallSite * last;

    D.23053 = *callsites;
    D.23054 = D.23053 == 0B;
    D.23055 = (long int) D.23054;
    D.23056 = __builtin_expect (D.23055, 0);
    if (D.23056 != 0) goto <D.23057>; else goto <D.23058>;
    <D.23057>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "liveness.c", 1003, "*callsites");
    <D.23058>:
    D.23053 = *callsites;
    last = D.23053->data;
    D.23059 = last->param_slots;
    D.23060 = cfg->mempool;
    D.23061 = g_slist_prepend_mempool (D.23060, D.23059, ins);
    last->param_slots = D.23061;
  }
  goto <D.23062>;
  <D.23052>:
  D.23063 = ins->flags;
  D.23064 = (signed char) D.23063;
  if (D.23064 < 0) goto <D.23065>; else goto <D.23066>;
  <D.23065>:
  {
    struct GCCallSite * callsite;
    int i;

    D.23060 = cfg->mempool;
    callsite = mono_mempool_alloc0 (D.23060, 16);
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23067>; else goto <D.23068>;
    <D.23067>:
    D.23069 = ins->backend.pc_offset;
    printf ("\t%x: ", D.23069);
    mono_print_ins (ins);
    <D.23068>:
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23070>; else goto <D.23071>;
    <D.23070>:
    printf ("\t\tlive: ");
    <D.23071>:
    callsite->bb = bb;
    D.23072 = cfg->num_varinfo;
    D.23073 = (long long unsigned int) D.23072;
    D.23074 = D.23073 + 7;
    D.23075 = D.23074 & 18446744073709551608;
    D.23076 = D.23075 / 8;
    D.23077 = (unsigned int) D.23076;
    D.23060 = cfg->mempool;
    D.23078 = mono_mempool_alloc0 (D.23060, D.23077);
    callsite->liveness = D.23078;
    D.23069 = ins->backend.pc_offset;
    callsite->pc_offset = D.23069;
    i = 0;
    goto <D.22104>;
    <D.22103>:
    i.54 = (unsigned int) i;
    D.23080 = i.54 * 4;
    D.23081 = last_use + D.23080;
    D.23082 = *D.23081;
    if (D.23082 != 0) goto <D.23083>; else goto <D.23084>;
    <D.23083>:
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23085>; else goto <D.23086>;
    <D.23085>:
    D.23087 = cfg->vars;
    i.54 = (unsigned int) i;
    D.23088 = i.54 * 56;
    D.23089 = D.23087 + D.23088;
    D.23090 = D.23089->vreg;
    printf ("R%d", D.23090);
    <D.23086>:
    D.23091 = callsite->liveness;
    D.23092 = i / 8;
    D.23093 = (sizetype) D.23092;
    D.23094 = D.23091 + D.23093;
    D.23091 = callsite->liveness;
    D.23093 = (sizetype) D.23092;
    D.23094 = D.23091 + D.23093;
    D.23095 = *D.23094;
    D.23096 = (signed char) D.23095;
    D.23097 = i % 8;
    D.23098 = 1 << D.23097;
    D.23099 = (signed char) D.23098;
    D.23100 = D.23096 | D.23099;
    D.23101 = (unsigned char) D.23100;
    *D.23094 = D.23101;
    <D.23084>:
    i = i + 1;
    <D.22104>:
    i.55 = (unsigned int) i;
    D.23072 = cfg->num_varinfo;
    if (i.55 < D.23072) goto <D.22103>; else goto <D.22105>;
    <D.22105>:
    D.23032 = cfg->verbose_level;
    if (D.23032 > 1) goto <D.23103>; else goto <D.23104>;
    <D.23103>:
    printf ("\n");
    <D.23104>:
    D.23053 = *callsites;
    D.23060 = cfg->mempool;
    D.23105 = g_slist_prepend_mempool (D.23060, D.23053, callsite);
    *callsites = D.23105;
  }
  <D.23066>:
  <D.23062>:
  <D.23050>:
}


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

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


