sgen_safe_name (void * obj)
{
  const char * D.24231;

  D.24231 = safe_name (obj);
  return D.24231;
}


safe_name (void * obj)
{
  unsigned int D.24233;
  unsigned int D.24234;
  const char * D.24235;
  struct MonoClass * D.24236;
  struct MonoVTable * vt;

  D.24233 = MEM[(mword *)obj];
  D.24234 = D.24233 & 4294967292;
  vt = (struct MonoVTable *) D.24234;
  D.24236 = vt->klass;
  D.24235 = D.24236->name;
  return D.24235;
}


sgen_scan_area_with_callback (char * start, char * end, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data, gboolean allow_flags)
{
  void * D.24238;
  char * iftmp.0;
  unsigned int D.24244;
  unsigned int D.24245;
  unsigned int D.24248;
  unsigned int D.24253;
  unsigned int D.24254;
  unsigned int D.24255;
  unsigned int D.24256;
  struct MonoVTable * D.24257;
  struct MonoVTable * array_fill_vtable.1;

  goto <D.22495>;
  <D.22496>:
  {
    size_t size;
    char * obj;

    D.24238 = MEM[(void * *)start];
    if (D.24238 == 0B) goto <D.24239>; else goto <D.24240>;
    <D.24239>:
    start = start + 4;
    // predicted unlikely by continue predictor.
    goto <D.22495>;
    <D.24240>:
    if (allow_flags != 0) goto <D.24241>; else goto <D.24242>;
    <D.24241>:
    D.24244 = MEM[(mword *)start];
    D.24245 = D.24244 & 1;
    if (D.24245 != 0) goto <D.24246>; else goto <D.24247>;
    <D.24246>:
    D.24244 = MEM[(mword *)start];
    D.24248 = D.24244 & 4294967292;
    iftmp.0 = (char *) D.24248;
    goto <D.24249>;
    <D.24247>:
    iftmp.0 = 0B;
    <D.24249>:
    obj = iftmp.0;
    if (obj == 0B) goto <D.24250>; else goto <D.24251>;
    <D.24250>:
    obj = start;
    <D.24251>:
    goto <D.24252>;
    <D.24242>:
    obj = start;
    <D.24252>:
    D.24253 = sgen_safe_object_get_size (obj);
    D.24254 = D.24253 + 7;
    size = D.24254 & 4294967288;
    D.24255 = MEM[(mword *)obj];
    D.24256 = D.24255 & 4294967292;
    D.24257 = (struct MonoVTable *) D.24256;
    array_fill_vtable.1 = array_fill_vtable;
    if (D.24257 != array_fill_vtable.1) goto <D.24259>; else goto <D.24260>;
    <D.24259>:
    callback (obj, size, data);
    <D.24260>:
    start = start + size;
  }
  <D.22495>:
  if (start < end) goto <D.22496>; else goto <D.22497>;
  <D.22497>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.2;
  unsigned int D.24262;
  unsigned int D.24263;
  unsigned int D.24266;
  guint D.24270;
  struct MonoVTable * D.24271;
  char * forwarded;

  D.24262 = MEM[(mword *)obj];
  D.24263 = D.24262 & 1;
  if (D.24263 != 0) goto <D.24264>; else goto <D.24265>;
  <D.24264>:
  D.24262 = MEM[(mword *)obj];
  D.24266 = D.24262 & 4294967292;
  iftmp.2 = (char *) D.24266;
  goto <D.24267>;
  <D.24265>:
  iftmp.2 = 0B;
  <D.24267>:
  forwarded = iftmp.2;
  if (forwarded != 0B) goto <D.24268>; else goto <D.24269>;
  <D.24268>:
  obj = forwarded;
  <D.24269>:
  D.24262 = MEM[(mword *)obj];
  D.24266 = D.24262 & 4294967292;
  D.24271 = (struct MonoVTable *) D.24266;
  D.24270 = sgen_par_object_get_size (D.24271, obj);
  return D.24270;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.24273;
  unsigned int D.24274;
  guint D.24279;
  int D.24280;
  int D.24281;
  unsigned int D.24282;
  unsigned int D.24285;
  int D.24286;
  unsigned int D.24287;
  unsigned int element_size.3;
  unsigned int D.24289;
  unsigned int D.24290;
  struct MonoClass * D.24293;
  unsigned char D.24294;
  unsigned int D.24295;
  unsigned int D.24296;
  mword descr;
  mword type;

  D.24273 = vtable->gc_descr;
  descr = (mword) D.24273;
  type = descr & 7;
  D.24274 = type + 4294967295;
  if (D.24274 <= 1) goto <D.24275>; else goto <D.24276>;
  <D.24275>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.24277>; else goto <D.24278>;
    <D.24277>:
    D.24280 = MEM[(struct MonoString *)o].length;
    D.24281 = D.24280 * 2;
    D.24282 = (unsigned int) D.24281;
    D.24279 = D.24282 + 14;
    return D.24279;
    <D.24278>:
    D.24279 = size;
    return D.24279;
  }
  <D.24276>:
  if (type == 4) goto <D.24283>; else goto <D.24284>;
  <D.24283>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.24285 = descr >> 3;
    D.24286 = (int) D.24285;
    element_size = D.24286 & 1023;
    array = o;
    D.24287 = array->max_length;
    element_size.3 = (unsigned int) element_size;
    D.24289 = D.24287 * element_size.3;
    size = D.24289 + 16;
    D.24290 = descr & 8192;
    if (D.24290 != 0) goto <D.24291>; else goto <D.24292>;
    <D.24291>:
    size = size + 3;
    size = size & 4294967292;
    D.24293 = vtable->klass;
    D.24294 = D.24293->rank;
    D.24295 = (unsigned int) D.24294;
    D.24296 = D.24295 * 8;
    size = D.24296 + size;
    <D.24292>:
    D.24279 = size;
    return D.24279;
  }
  <D.24284>:
  D.24279 = slow_object_get_size (vtable, o);
  return D.24279;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.24298;
  guint D.24301;
  int D.24302;
  int D.24303;
  unsigned int D.24304;
  unsigned char D.24305;
  int D.24308;
  unsigned int D.24309;
  unsigned int D.24310;
  unsigned int D.24311;
  struct MonoArrayBounds * D.24312;
  _Bool D.24313;
  long int D.24314;
  long int D.24315;
  unsigned int D.24318;
  unsigned int D.24319;
  int D.24320;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.24298 = mono_defaults.string_class;
  if (D.24298 == klass) goto <D.24299>; else goto <D.24300>;
  <D.24299>:
  D.24302 = MEM[(struct MonoString *)o].length;
  D.24303 = D.24302 * 2;
  D.24304 = (unsigned int) D.24303;
  D.24301 = D.24304 + 14;
  return D.24301;
  <D.24300>:
  D.24305 = klass->rank;
  if (D.24305 != 0) goto <D.24306>; else goto <D.24307>;
  <D.24306>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.24308 = klass->sizes.element_size;
    D.24309 = (unsigned int) D.24308;
    D.24310 = array->max_length;
    D.24311 = D.24309 * D.24310;
    size = D.24311 + 16;
    D.24312 = array->bounds;
    D.24313 = D.24312 != 0B;
    D.24314 = (long int) D.24313;
    D.24315 = __builtin_expect (D.24314, 0);
    if (D.24315 != 0) goto <D.24316>; else goto <D.24317>;
    <D.24316>:
    size = size + 3;
    size = size & 4294967292;
    D.24305 = klass->rank;
    D.24318 = (unsigned int) D.24305;
    D.24319 = D.24318 * 8;
    size = D.24319 + size;
    <D.24317>:
    D.24301 = size;
    return D.24301;
  }
  <D.24307>:
  D.24320 = klass->instance_size;
  D.24301 = (guint) D.24320;
  return D.24301;
}


mono_gc_scan_for_specific_ref (struct MonoObject * key, gboolean precise)
{
  struct GCMemSection * nursery_section.4;
  char * D.24323;
  char * D.24324;
  void (*<T36b4>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24325;
  unsigned int D.24326;
  void * D.24327;
  char * D.24328;
  struct SgenHashTableEntry * D.24329;
  unsigned int D.24330;
  void * * ptr;
  struct RootRecord * root;

  scan_object_for_specific_ref_precise = precise;
  nursery_section.4 = nursery_section;
  D.24323 = nursery_section.4->data;
  nursery_section.4 = nursery_section;
  D.24324 = nursery_section.4->end_data;
  sgen_scan_area_with_callback (D.24323, D.24324, scan_object_for_specific_ref_callback, key, 1);
  D.24325 = major_collector.iterate_objects;
  D.24325 (1, 1, scan_object_for_specific_ref_callback, key);
  sgen_los_iterate_objects (scan_object_for_specific_ref_callback, key);
  scan_roots_for_specific_ref (key, 0);
  scan_roots_for_specific_ref (key, 2);
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

    __hash_table = &roots_hash[1];
    __table = __hash_table->table;
    __i = 0;
    goto <D.22572>;
    <D.22571>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.24326 = __i * 4;
      __iter = __table + D.24326;
      goto <D.22569>;
      <D.22568>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        ptr = __entry->key;
        root = &__entry->data;
        goto <D.22566>;
        <D.22565>:
        D.24327 = *ptr;
        check_root_obj_specific_ref (root, D.24327, key);
        ptr = ptr + 4;
        <D.22566>:
        D.24328 = root->end_root;
        if (D.24328 > ptr) goto <D.22565>; else goto <D.22567>;
        <D.22567>:
      }
      __iter = __next;
      <D.22569>:
      D.24329 = *__iter;
      if (D.24329 != 0B) goto <D.22568>; else goto <D.22570>;
      <D.22570>:
    }
    __i = __i + 1;
    <D.22572>:
    D.24330 = roots_hash[1].size;
    if (D.24330 > __i) goto <D.22571>; else goto <D.22573>;
    <D.22573>:
  }
}


scan_object_for_specific_ref_callback (char * obj, size_t size, struct MonoObject * key)
{
  scan_object_for_specific_ref (obj, key);
}


scan_object_for_specific_ref (char * start, struct MonoObject * key)
{
  char * iftmp.5;
  unsigned int D.24332;
  unsigned int D.24333;
  unsigned int D.24336;
  int scan_object_for_specific_ref_precise.6;
  unsigned int D.24343;
  unsigned int D.24344;
  unsigned int D.24347;
  unsigned int D.24348;
  unsigned int D.24349;
  unsigned int D.24350;
  unsigned int D.24351;
  void * D.24352;
  const char * D.24355;
  int _objptr.7;
  int start.8;
  int D.24358;
  const char * D.24361;
  unsigned int _index.9;
  unsigned int D.24363;
  int D.24364;
  void * D.24365;
  const char * D.24368;
  int _objptr.10;
  int D.24370;
  unsigned int _index.11;
  unsigned int D.24372;
  int D.24373;
  const char * D.24376;
  unsigned int D.24377;
  unsigned int D.24380;
  int D.24381;
  int desc.12;
  unsigned int D.24385;
  unsigned int el_size.13;
  unsigned int D.24387;
  void * D.24388;
  const char * D.24391;
  int p.14;
  int D.24393;
  int D.24397;
  unsigned int offset.15;
  unsigned int D.24399;
  unsigned int i.16;
  unsigned int D.24401;
  void * * D.24402;
  void * D.24403;
  const char * D.24406;
  char * D.24407;
  int D.24408;
  int D.24409;
  sizetype el_size.17;
  unsigned int D.24414;
  void * D.24417;
  const char * D.24420;
  int p.18;
  int D.24422;
  unsigned int D.24423;
  void * D.24426;
  const char * D.24429;
  int _objptr.19;
  int D.24431;
  unsigned int D.24432;
  unsigned int D.24433;
  struct MonoVTable * D.24436;
  struct MonoClass * D.24437;
  const char * D.24438;
  const char * D.24439;
  gsize * bitmap_data.20;
  unsigned int D.24441;
  void * D.24444;
  const char * D.24447;
  int _objptr.21;
  int D.24449;
  int bwords.22;
  unsigned int D.24451;
  gsize * mbitmap_data.23;
  unsigned int D.24453;
  unsigned int D.24454;
  struct MonoClass * D.24455;
  unsigned int el_size.24;
  unsigned int D.24457;
  const char * D.24460;
  const char * D.24461;
  gsize * bitmap_data.25;
  unsigned int D.24463;
  void * D.24466;
  const char * D.24469;
  int _objptr.26;
  int D.24471;
  unsigned int bwords.27;
  sizetype el_size.28;
  unsigned int i.29;
  unsigned int D.24476;
  mword * D.24477;
  unsigned int D.24478;
  unsigned int key.30;
  const char * D.24482;
  unsigned int i.31;
  unsigned int D.24484;
  char * forwarded;

  D.24332 = MEM[(mword *)start];
  D.24333 = D.24332 & 1;
  if (D.24333 != 0) goto <D.24334>; else goto <D.24335>;
  <D.24334>:
  D.24332 = MEM[(mword *)start];
  D.24336 = D.24332 & 4294967292;
  iftmp.5 = (char *) D.24336;
  goto <D.24337>;
  <D.24335>:
  iftmp.5 = 0B;
  <D.24337>:
  forwarded = iftmp.5;
  if (forwarded != 0B) goto <D.24338>; else goto <D.24339>;
  <D.24338>:
  start = forwarded;
  <D.24339>:
  scan_object_for_specific_ref_precise.6 = scan_object_for_specific_ref_precise;
  if (scan_object_for_specific_ref_precise.6 != 0) goto <D.24341>; else goto <D.24342>;
  <D.24341>:
  {
    struct GCVTable * vt;
    mword desc;

    D.24332 = MEM[(mword *)start];
    D.24336 = D.24332 & 4294967292;
    vt = (struct GCVTable *) D.24336;
    desc = vt->desc;
    D.24343 = desc & 7;
    switch (D.24343) <default: <D.22479>, case 1: <D.22394>, case 2: <D.22401>, case 3: <D.22445>, case 4: <D.22409>, case 5: <D.22439>, case 6: <D.22458>, case 7: <D.22478>>
    <D.22394>:
    D.24344 = desc & 4294901760;
    if (D.24344 != 0) goto <D.24345>; else goto <D.24346>;
    <D.24345>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.24347 = desc >> 16;
      D.24348 = D.24347 & 255;
      D.24349 = D.24348 * 4;
      _objptr = _objptr + D.24349;
      D.24350 = desc >> 24;
      D.24351 = D.24350 * 4;
      _objptr_end = _objptr + D.24351;
      D.24352 = *_objptr;
      if (D.24352 == key) goto <D.24353>; else goto <D.24354>;
      <D.24353>:
      D.24355 = safe_name (start);
      _objptr.7 = (int) _objptr;
      start.8 = (int) start;
      D.24358 = _objptr.7 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24355, D.24358);
      <D.24354>:
      _objptr = _objptr + 4;
      goto <D.22398>;
      <D.22397>:
      D.24352 = *_objptr;
      if (D.24352 == key) goto <D.24359>; else goto <D.24360>;
      <D.24359>:
      D.24361 = safe_name (start);
      _objptr.7 = (int) _objptr;
      start.8 = (int) start;
      D.24358 = _objptr.7 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24361, D.24358);
      <D.24360>:
      _objptr = _objptr + 4;
      <D.22398>:
      if (_objptr < _objptr_end) goto <D.22397>; else goto <D.22399>;
      <D.22399>:
    }
    <D.24346>:
    goto <D.22400>;
    <D.22401>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 16;
      _objptr = _objptr + 8;
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.9 = (unsigned int) _index;
        D.24363 = _index.9 * 4;
        _objptr = _objptr + D.24363;
        D.24364 = _index + 1;
        _bmap = _bmap >> D.24364;
        D.24365 = *_objptr;
        if (D.24365 == key) goto <D.24366>; else goto <D.24367>;
        <D.24366>:
        D.24368 = safe_name (start);
        _objptr.10 = (int) _objptr;
        start.8 = (int) start;
        D.24370 = _objptr.10 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24368, D.24370);
        <D.24367>:
        _objptr = _objptr + 4;
      }
      goto <D.22407>;
      <D.22406>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.11 = (unsigned int) _index;
        D.24372 = _index.11 * 4;
        _objptr = _objptr + D.24372;
        D.24373 = _index + 1;
        _bmap = _bmap >> D.24373;
        D.24365 = *_objptr;
        if (D.24365 == key) goto <D.24374>; else goto <D.24375>;
        <D.24374>:
        D.24376 = safe_name (start);
        _objptr.10 = (int) _objptr;
        start.8 = (int) start;
        D.24370 = _objptr.10 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24376, D.24370);
        <D.24375>:
        _objptr = _objptr + 4;
      }
      <D.22407>:
      if (_bmap != 0) goto <D.22406>; else goto <D.22408>;
      <D.22408>:
    }
    goto <D.22400>;
    <D.22409>:
    D.24377 = desc & 4294950912;
    if (D.24377 != 0) goto <D.24378>; else goto <D.24379>;
    <D.24378>:
    {
      int el_size;
      int etype;

      D.24380 = desc >> 3;
      D.24381 = (int) D.24380;
      el_size = D.24381 & 1023;
      desc.12 = (int) desc;
      etype = desc.12 & 49152;
      if (etype == 16384) goto <D.24383>; else goto <D.24384>;
      <D.24383>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.24385 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.24387 = D.24385 * el_size.13;
        end_refs = p + D.24387;
        goto <D.22415>;
        <D.22414>:
        D.24388 = *p;
        if (D.24388 == key) goto <D.24389>; else goto <D.24390>;
        <D.24389>:
        D.24391 = safe_name (start);
        p.14 = (int) p;
        start.8 = (int) start;
        D.24393 = p.14 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24391, D.24393);
        <D.24390>:
        p = p + 4;
        <D.22415>:
        if (p < end_refs) goto <D.22414>; else goto <D.22416>;
        <D.22416>:
      }
      goto <D.24394>;
      <D.24384>:
      if (etype == 32768) goto <D.24395>; else goto <D.24396>;
      <D.24395>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.24347 = desc >> 16;
        D.24397 = (int) D.24347;
        offset = D.24397 & 255;
        D.24350 = desc >> 24;
        num_refs = (int) D.24350;
        e_start = start + 16;
        D.24385 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.24387 = D.24385 * el_size.13;
        e_end = e_start + D.24387;
        goto <D.22427>;
        <D.22426>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.15 = (unsigned int) offset;
          D.24399 = offset.15 * 4;
          p = p + D.24399;
          i = 0;
          goto <D.22424>;
          <D.22423>:
          i.16 = (unsigned int) i;
          D.24401 = i.16 * 4;
          D.24402 = p + D.24401;
          D.24403 = *D.24402;
          if (D.24403 == key) goto <D.24404>; else goto <D.24405>;
          <D.24404>:
          D.24406 = safe_name (start);
          i.16 = (unsigned int) i;
          D.24401 = i.16 * 4;
          D.24407 = p + D.24401;
          D.24408 = (int) D.24407;
          start.8 = (int) start;
          D.24409 = D.24408 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24406, D.24409);
          <D.24405>:
          i = i + 1;
          <D.22424>:
          if (i < num_refs) goto <D.22423>; else goto <D.22425>;
          <D.22425>:
          el_size.17 = (sizetype) el_size;
          e_start = e_start + el_size.17;
        }
        <D.22427>:
        if (e_start < e_end) goto <D.22426>; else goto <D.22428>;
        <D.22428>:
      }
      goto <D.24411>;
      <D.24396>:
      if (etype == 49152) goto <D.24412>; else goto <D.24413>;
      <D.24412>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.24385 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.24387 = D.24385 * el_size.13;
        e_end = e_start + D.24387;
        goto <D.22437>;
        <D.22436>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.22434>;
          <D.22433>:
          D.24414 = _bmap & 1;
          if (D.24414 != 0) goto <D.24415>; else goto <D.24416>;
          <D.24415>:
          D.24417 = *p;
          if (D.24417 == key) goto <D.24418>; else goto <D.24419>;
          <D.24418>:
          D.24420 = safe_name (start);
          p.18 = (int) p;
          start.8 = (int) start;
          D.24422 = p.18 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24420, D.24422);
          <D.24419>:
          <D.24416>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.22434>:
          if (_bmap != 0) goto <D.22433>; else goto <D.22435>;
          <D.22435>:
          el_size.17 = (sizetype) el_size;
          e_start = e_start + el_size.17;
        }
        <D.22437>:
        if (e_start < e_end) goto <D.22436>; else goto <D.22438>;
        <D.22438>:
      }
      <D.24413>:
      <D.24411>:
      <D.24394>:
    }
    <D.24379>:
    goto <D.22400>;
    <D.22439>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.22443>;
      <D.22442>:
      D.24423 = _bmap & 1;
      if (D.24423 != 0) goto <D.24424>; else goto <D.24425>;
      <D.24424>:
      D.24426 = *_objptr;
      if (D.24426 == key) goto <D.24427>; else goto <D.24428>;
      <D.24427>:
      D.24429 = safe_name (start);
      _objptr.19 = (int) _objptr;
      start.8 = (int) start;
      D.24431 = _objptr.19 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24429, D.24431);
      <D.24428>:
      <D.24425>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.22443>:
      if (_bmap != 0) goto <D.22442>; else goto <D.22444>;
      <D.22444>:
    }
    goto <D.22400>;
    <D.22445>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.24432 = *bitmap_data;
      D.24433 = D.24432 + 4294967295;
      bwords = (int) D.24433;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.24434>; else goto <D.24435>;
      <D.24434>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.24436 = myobj->vtable;
        D.24437 = D.24436->klass;
        D.24438 = D.24437->name_space;
        D.24436 = myobj->vtable;
        D.24437 = D.24436->klass;
        D.24439 = D.24437->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.24438, D.24439);
      }
      <D.24435>:
      goto <D.22456>;
      <D.22455>:
      {
        gsize _bmap;

        bitmap_data.20 = bitmap_data;
        bitmap_data = bitmap_data.20 + 4;
        _bmap = *bitmap_data.20;
        _objptr = start_run;
        goto <D.22453>;
        <D.22452>:
        D.24441 = _bmap & 1;
        if (D.24441 != 0) goto <D.24442>; else goto <D.24443>;
        <D.24442>:
        D.24444 = *_objptr;
        if (D.24444 == key) goto <D.24445>; else goto <D.24446>;
        <D.24445>:
        D.24447 = safe_name (start);
        _objptr.21 = (int) _objptr;
        start.8 = (int) start;
        D.24449 = _objptr.21 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24447, D.24449);
        <D.24446>:
        <D.24443>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.22453>:
        if (_bmap != 0) goto <D.22452>; else goto <D.22454>;
        <D.22454>:
        start_run = start_run + 128;
      }
      <D.22456>:
      bwords.22 = bwords;
      bwords = bwords.22 + -1;
      if (bwords.22 > 0) goto <D.22455>; else goto <D.22457>;
      <D.22457>:
    }
    goto <D.22400>;
    <D.22458>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.24451 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.24451);
      mbitmap_data.23 = mbitmap_data;
      mbitmap_data = mbitmap_data.23 + 4;
      D.24453 = *mbitmap_data.23;
      D.24454 = D.24453 + 4294967295;
      mbwords = (int) D.24454;
      D.24455 = vt->klass;
      el_size = mono_array_element_size (D.24455);
      e_start = start + 16;
      D.24385 = MEM[(struct MonoArray *)start].max_length;
      el_size.24 = (unsigned int) el_size;
      D.24457 = D.24385 * el_size.24;
      e_end = e_start + D.24457;
      if (0 != 0) goto <D.24458>; else goto <D.24459>;
      <D.24458>:
      D.24451 = vt->desc;
      D.24455 = vt->klass;
      D.24460 = D.24455->name_space;
      D.24455 = vt->klass;
      D.24461 = D.24455->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.24451, D.24460, D.24461);
      <D.24459>:
      goto <D.22476>;
      <D.22475>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.22473>;
        <D.22472>:
        {
          gsize _bmap;
          void * * start_run;

          bitmap_data.25 = bitmap_data;
          bitmap_data = bitmap_data.25 + 4;
          _bmap = *bitmap_data.25;
          start_run = _objptr;
          goto <D.22470>;
          <D.22469>:
          D.24463 = _bmap & 1;
          if (D.24463 != 0) goto <D.24464>; else goto <D.24465>;
          <D.24464>:
          D.24466 = *_objptr;
          if (D.24466 == key) goto <D.24467>; else goto <D.24468>;
          <D.24467>:
          D.24469 = safe_name (start);
          _objptr.26 = (int) _objptr;
          start.8 = (int) start;
          D.24471 = _objptr.26 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.24469, D.24471);
          <D.24468>:
          <D.24465>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.22470>:
          if (_bmap != 0) goto <D.22469>; else goto <D.22471>;
          <D.22471>:
          _objptr = start_run + 128;
        }
        <D.22473>:
        bwords.27 = bwords;
        bwords = bwords.27 + 4294967295;
        if (bwords.27 != 0) goto <D.22472>; else goto <D.22474>;
        <D.22474>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.22476>:
      if (e_start < e_end) goto <D.22475>; else goto <D.22477>;
      <D.22477>:
    }
    goto <D.22400>;
    <D.22478>:
    goto <D.22400>;
    <D.22479>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.22400>:
  }
  goto <D.24474>;
  <D.24342>:
  {
    mword * words;
    size_t size;
    int i;

    words = start;
    size = sgen_safe_object_get_size (start);
    i = 0;
    goto <D.22484>;
    <D.22483>:
    i.29 = (unsigned int) i;
    D.24476 = i.29 * 4;
    D.24477 = words + D.24476;
    D.24478 = *D.24477;
    key.30 = (unsigned int) key;
    if (D.24478 == key.30) goto <D.24480>; else goto <D.24481>;
    <D.24480>:
    D.24482 = safe_name (start);
    i.29 = (unsigned int) i;
    D.24476 = i.29 * 4;
    monoeg_g_print ("found possible ref to %p in object %p (%s) at offset %td\n", key, start, D.24482, D.24476);
    <D.24481>:
    i = i + 1;
    <D.22484>:
    i.31 = (unsigned int) i;
    D.24484 = size / 4;
    if (i.31 < D.24484) goto <D.22483>; else goto <D.22485>;
    <D.22485>:
  }
  <D.24474>:
}


scan_roots_for_specific_ref (struct MonoObject * key, int root_type)
{
  unsigned int D.24487;
  unsigned int D.24488;
  unsigned int D.24489;
  void * D.24492;
  unsigned int D.24493;
  unsigned int D.24494;
  gsize * bitmap_data.32;
  unsigned int D.24496;
  void * D.24499;
  int bwords.33;
  struct SgenHashTableEntry * D.24501;
  unsigned int D.24502;
  void * * start_root;
  struct RootRecord * root;

  check_key = key;
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

    __hash_table = &roots_hash[root_type];
    __table = __hash_table->table;
    __i = 0;
    goto <D.22551>;
    <D.22550>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.24487 = __i * 4;
      __iter = __table + D.24487;
      goto <D.22548>;
      <D.22547>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        {
          mword desc;

          desc = root->root_desc;
          check_root = root;
          D.24488 = desc & 7;
          switch (D.24488) <default: <D.22546>, case 1: <D.22526>, case 2: <D.22545>, case 3: <D.22530>, case 4: <D.22543>>
          <D.22526>:
          desc = desc >> 3;
          goto <D.22528>;
          <D.22527>:
          D.24489 = desc & 1;
          if (D.24489 != 0) goto <D.24490>; else goto <D.24491>;
          <D.24490>:
          D.24492 = *start_root;
          check_root_obj_specific_ref (root, key, D.24492);
          <D.24491>:
          desc = desc >> 1;
          start_root = start_root + 4;
          <D.22528>:
          if (desc != 0) goto <D.22527>; else goto <D.22529>;
          <D.22529>:
          return;
          <D.22530>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.24493 = *bitmap_data;
            D.24494 = D.24493 + 4294967295;
            bwords = (int) D.24494;
            start_run = start_root;
            bitmap_data = bitmap_data + 4;
            goto <D.22540>;
            <D.22539>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.32 = bitmap_data;
              bitmap_data = bitmap_data.32 + 4;
              bmap = *bitmap_data.32;
              objptr = start_run;
              goto <D.22537>;
              <D.22536>:
              D.24496 = bmap & 1;
              if (D.24496 != 0) goto <D.24497>; else goto <D.24498>;
              <D.24497>:
              D.24499 = *objptr;
              check_root_obj_specific_ref (root, key, D.24499);
              <D.24498>:
              bmap = bmap >> 1;
              objptr = objptr + 4;
              <D.22537>:
              if (bmap != 0) goto <D.22536>; else goto <D.22538>;
              <D.22538>:
              start_run = start_run + 128;
            }
            <D.22540>:
            bwords.33 = bwords;
            bwords = bwords.33 + -1;
            if (bwords.33 > 0) goto <D.22539>; else goto <D.22541>;
            <D.22541>:
            goto <D.22542>;
          }
          <D.22543>:
          {
            void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

            marker = sgen_get_user_descriptor_func (desc);
            marker (start_root, check_root_obj_specific_ref_from_marker);
            goto <D.22542>;
          }
          <D.22545>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 844);
          <D.22546>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 846);
          <D.22542>:
        }
      }
      __iter = __next;
      <D.22548>:
      D.24501 = *__iter;
      if (D.24501 != 0B) goto <D.22547>; else goto <D.22549>;
      <D.22549>:
    }
    __i = __i + 1;
    <D.22551>:
    D.24502 = roots_hash[root_type].size;
    if (D.24502 > __i) goto <D.22550>; else goto <D.22552>;
    <D.22552>:
  }
  check_key = 0B;
  check_root = 0B;
}


check_root_obj_specific_ref_from_marker (void * * obj)
{
  struct RootRecord * check_root.34;
  struct MonoObject * check_key.35;
  void * D.24506;

  check_root.34 = check_root;
  check_key.35 = check_key;
  D.24506 = *obj;
  check_root_obj_specific_ref (check_root.34, check_key.35, D.24506);
}


check_root_obj_specific_ref (struct RootRecord * root, struct MonoObject * key, struct MonoObject * obj)
{
  if (key != obj) goto <D.24507>; else goto <D.24508>;
  <D.24507>:
  return;
  <D.24508>:
  monoeg_g_print ("found ref to %p in root record %p\n", key, root);
}


mono_gc_clear_domain (struct MonoDomain * domain)
{
  int concurrent_collection_in_progress.36;
  int concurrent_collection_in_progress.37;
  _Bool D.24514;
  long int D.24515;
  long int D.24516;
  int xdomain_checks.38;
  struct MonoDomain * D.24522;
  struct GCMemSection * nursery_section.39;
  char * D.24526;
  char * D.24527;
  void (*<T36b4>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24528;
  char[0:] * D.24529;
  int D.24530;
  struct LOSObject * los_object_list.40;
  struct FILE * gc_debug_file.41;
  struct MonoDomain * D.24540;
  int do_pin_stats.42;
  _Bool D.24544;
  long int D.24545;
  long int D.24546;
  struct LOSObject * bigobj;
  struct LOSObject * prev;
  int i;

  pthread_mutex_lock (&gc_mutex);
  sgen_stop_world (0);
  concurrent_collection_in_progress.36 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.36 != 0) goto <D.24511>; else goto <D.24512>;
  <D.24511>:
  sgen_perform_collection (0, 1, "clear domain", 1);
  <D.24512>:
  concurrent_collection_in_progress.37 = concurrent_collection_in_progress;
  D.24514 = concurrent_collection_in_progress.37 != 0;
  D.24515 = (long int) D.24514;
  D.24516 = __builtin_expect (D.24515, 0);
  if (D.24516 != 0) goto <D.24517>; else goto <D.24518>;
  <D.24517>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1059, "!concurrent_collection_in_progress");
  <D.24518>:
  sgen_process_fin_stage_entries ();
  sgen_process_dislink_stage_entries ();
  sgen_clear_nursery_fragments ();
  xdomain_checks.38 = xdomain_checks;
  if (xdomain_checks.38 != 0) goto <D.24520>; else goto <D.24521>;
  <D.24520>:
  D.24522 = mono_get_root_domain ();
  if (D.24522 != domain) goto <D.24523>; else goto <D.24524>;
  <D.24523>:
  scan_for_registered_roots_in_domain (domain, 0);
  scan_for_registered_roots_in_domain (domain, 2);
  check_for_xdomain_refs ();
  <D.24524>:
  <D.24521>:
  null_ephemerons_for_domain (domain);
  i = 0;
  goto <D.22669>;
  <D.22668>:
  sgen_null_links_for_domain (domain, i);
  i = i + 1;
  <D.22669>:
  if (i <= 1) goto <D.22668>; else goto <D.22670>;
  <D.22670>:
  i = 0;
  goto <D.22672>;
  <D.22671>:
  sgen_remove_finalizers_for_domain (domain, i);
  i = i + 1;
  <D.22672>:
  if (i <= 1) goto <D.22671>; else goto <D.22673>;
  <D.22673>:
  nursery_section.39 = nursery_section;
  D.24526 = nursery_section.39->data;
  nursery_section.39 = nursery_section;
  D.24527 = nursery_section.39->end_data;
  sgen_scan_area_with_callback (D.24526, D.24527, clear_domain_process_minor_object_callback, domain, 0);
  D.24528 = major_collector.iterate_objects;
  D.24528 (1, 1, clear_domain_process_major_object_callback, domain);
  bigobj = los_object_list;
  goto <D.22675>;
  <D.22674>:
  D.24529 = &bigobj->data;
  clear_domain_process_object (D.24529, domain);
  bigobj = bigobj->next;
  <D.22675>:
  if (bigobj != 0B) goto <D.22674>; else goto <D.22676>;
  <D.22676>:
  prev = 0B;
  bigobj = los_object_list;
  goto <D.22678>;
  <D.22679>:
  D.24529 = &bigobj->data;
  D.24530 = need_remove_object_for_domain (D.24529, domain);
  if (D.24530 != 0) goto <D.24531>; else goto <D.24532>;
  <D.24531>:
  {
    struct LOSObject * to_free;

    to_free = bigobj;
    if (prev != 0B) goto <D.24533>; else goto <D.24534>;
    <D.24533>:
    los_object_list.40 = bigobj->next;
    prev->next = los_object_list.40;
    goto <D.24536>;
    <D.24534>:
    los_object_list.40 = bigobj->next;
    los_object_list = los_object_list.40;
    <D.24536>:
    bigobj = bigobj->next;
    if (0 != 0) goto <D.24537>; else goto <D.24538>;
    <D.24537>:
    gc_debug_file.41 = gc_debug_file;
    D.24529 = &bigobj->data;
    fprintf (gc_debug_file.41, "Freeing large object %p\n", D.24529);
    gc_debug_file.41 = gc_debug_file;
    fflush (gc_debug_file.41);
    <D.24538>:
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.22678>;
  }
  <D.24532>:
  prev = bigobj;
  bigobj = bigobj->next;
  <D.22678>:
  if (bigobj != 0B) goto <D.22679>; else goto <D.22680>;
  <D.22680>:
  D.24528 = major_collector.iterate_objects;
  D.24528 (1, 0, clear_domain_free_major_non_pinned_object_callback, domain);
  D.24528 = major_collector.iterate_objects;
  D.24528 (0, 1, clear_domain_free_major_pinned_object_callback, domain);
  D.24540 = mono_get_root_domain ();
  if (D.24540 == domain) goto <D.24541>; else goto <D.24542>;
  <D.24541>:
  do_pin_stats.42 = do_pin_stats;
  D.24544 = do_pin_stats.42 != 0;
  D.24545 = (long int) D.24544;
  D.24546 = __builtin_expect (D.24545, 0);
  if (D.24546 != 0) goto <D.24547>; else goto <D.24548>;
  <D.24547>:
  sgen_pin_stats_print_class_stats ();
  <D.24548>:
  <D.24542>:
  sgen_restart_world (0, 0B);
  sgen_gc_unlock ();
}


clear_domain_free_major_pinned_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.24549;
  void (*<T36b0>) (char *, size_t) D.24552;

  D.24549 = need_remove_object_for_domain (obj, domain);
  if (D.24549 != 0) goto <D.24550>; else goto <D.24551>;
  <D.24550>:
  D.24552 = major_collector.free_pinned_object;
  D.24552 (obj, size);
  <D.24551>:
}


clear_domain_free_major_non_pinned_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.24553;
  void (*<T36b0>) (char *, size_t) D.24556;

  D.24553 = need_remove_object_for_domain (obj, domain);
  if (D.24553 != 0) goto <D.24554>; else goto <D.24555>;
  <D.24554>:
  D.24556 = major_collector.free_non_pinned_object;
  D.24556 (obj, size);
  <D.24555>:
}


clear_domain_process_major_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  clear_domain_process_object (obj, domain);
}


clear_domain_process_minor_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.24557;

  D.24557 = clear_domain_process_object (obj, domain);
  if (D.24557 != 0) goto <D.24558>; else goto <D.24559>;
  <D.24558>:
  memset (obj, 0, size);
  <D.24559>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.24562;
  int D.24567;
  void * D.24569;
  unsigned int D.24570;

  D.24562 = __builtin_constant_p (__len);
  if (D.24562 != 0) goto <D.24563>; else goto <D.24564>;
  <D.24563>:
  if (__len == 0) goto <D.24565>; else goto <D.24566>;
  <D.24565>:
  D.24567 = __builtin_constant_p (__ch);
  if (D.24567 == 0) goto <D.24560>; else goto <D.24568>;
  <D.24568>:
  if (__ch != 0) goto <D.24560>; else goto <D.24561>;
  <D.24560>:
  __warn_memset_zero_len ();
  D.24569 = __dest;
  return D.24569;
  <D.24561>:
  <D.24566>:
  <D.24564>:
  D.24570 = __builtin_object_size (__dest, 0);
  D.24569 = __builtin___memset_chk (__dest, __ch, __len, D.24570);
  return D.24569;
}


scan_for_registered_roots_in_domain (struct MonoDomain * domain, int root_type)
{
  unsigned int D.24572;
  unsigned int D.24575;
  unsigned int D.24576;
  void * D.24579;
  unsigned int D.24582;
  unsigned int D.24583;
  gsize * bitmap_data.43;
  unsigned int D.24585;
  void * D.24588;
  int bwords.44;
  struct SgenHashTableEntry * D.24592;
  unsigned int D.24593;
  void * * start_root;
  struct RootRecord * root;

  check_domain = domain;
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

    __hash_table = &roots_hash[root_type];
    __table = __hash_table->table;
    __i = 0;
    goto <D.22627>;
    <D.22626>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.24572 = __i * 4;
      __iter = __table + D.24572;
      goto <D.22624>;
      <D.22623>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        {
          mword desc;

          desc = root->root_desc;
          if (start_root == domain) goto <D.24573>; else goto <D.24574>;
          <D.24573>:
          // predicted unlikely by continue predictor.
          goto <D.22601>;
          <D.24574>:
          D.24575 = desc & 7;
          switch (D.24575) <default: <D.22622>, case 1: <D.22602>, case 2: <D.22621>, case 3: <D.22607>, case 4: <D.22619>>
          <D.22602>:
          desc = desc >> 3;
          goto <D.22604>;
          <D.22603>:
          D.24576 = desc & 1;
          if (D.24576 != 0) goto <D.24577>; else goto <D.24578>;
          <D.24577>:
          D.24579 = *start_root;
          if (D.24579 != 0B) goto <D.24580>; else goto <D.24581>;
          <D.24580>:
          D.24579 = *start_root;
          check_obj_not_in_domain (D.24579);
          <D.24581>:
          <D.24578>:
          desc = desc >> 1;
          start_root = start_root + 4;
          <D.22604>:
          if (desc != 0) goto <D.22603>; else goto <D.22605>;
          <D.22605>:
          goto <D.22606>;
          <D.22607>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.24582 = *bitmap_data;
            D.24583 = D.24582 + 4294967295;
            bwords = (int) D.24583;
            start_run = start_root;
            bitmap_data = bitmap_data + 4;
            goto <D.22617>;
            <D.22616>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.43 = bitmap_data;
              bitmap_data = bitmap_data.43 + 4;
              bmap = *bitmap_data.43;
              objptr = start_run;
              goto <D.22614>;
              <D.22613>:
              D.24585 = bmap & 1;
              if (D.24585 != 0) goto <D.24586>; else goto <D.24587>;
              <D.24586>:
              D.24588 = *objptr;
              if (D.24588 != 0B) goto <D.24589>; else goto <D.24590>;
              <D.24589>:
              D.24588 = *objptr;
              check_obj_not_in_domain (D.24588);
              <D.24590>:
              <D.24587>:
              bmap = bmap >> 1;
              objptr = objptr + 4;
              <D.22614>:
              if (bmap != 0) goto <D.22613>; else goto <D.22615>;
              <D.22615>:
              start_run = start_run + 128;
            }
            <D.22617>:
            bwords.44 = bwords;
            bwords = bwords.44 + -1;
            if (bwords.44 > 0) goto <D.22616>; else goto <D.22618>;
            <D.22618>:
            goto <D.22606>;
          }
          <D.22619>:
          {
            void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

            marker = sgen_get_user_descriptor_func (desc);
            marker (start_root, check_obj_not_in_domain);
            goto <D.22606>;
          }
          <D.22621>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 969);
          <D.22622>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 971);
          <D.22606>:
        }
      }
      <D.22601>:
      __iter = __next;
      <D.22624>:
      D.24592 = *__iter;
      if (D.24592 != 0B) goto <D.22623>; else goto <D.22625>;
      <D.22625>:
    }
    __i = __i + 1;
    <D.22627>:
    D.24593 = roots_hash[root_type].size;
    if (D.24593 > __i) goto <D.22626>; else goto <D.22628>;
    <D.22628>:
  }
  check_domain = 0B;
}


check_obj_not_in_domain (void * * o)
{
  void * D.24594;
  struct MonoVTable * D.24595;
  struct MonoDomain * D.24596;
  struct MonoDomain * check_domain.45;
  _Bool D.24598;
  long int D.24599;
  long int D.24600;

  D.24594 = *o;
  D.24595 = MEM[(struct MonoObject *)D.24594].vtable;
  D.24596 = D.24595->domain;
  check_domain.45 = check_domain;
  D.24598 = D.24596 == check_domain.45;
  D.24599 = (long int) D.24598;
  D.24600 = __builtin_expect (D.24599, 0);
  if (D.24600 != 0) goto <D.24601>; else goto <D.24602>;
  <D.24601>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 918, "((MonoObject*)(*o))->vtable->domain != check_domain");
  <D.24602>:
}


check_for_xdomain_refs ()
{
  struct GCMemSection * nursery_section.46;
  char * D.24604;
  char * D.24605;
  void (*<T36b4>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24606;
  char[0:] * D.24607;
  unsigned int D.24608;
  struct LOSObject * bigobj;

  nursery_section.46 = nursery_section;
  D.24604 = nursery_section.46->data;
  nursery_section.46 = nursery_section;
  D.24605 = nursery_section.46->end_data;
  sgen_scan_area_with_callback (D.24604, D.24605, scan_object_for_xdomain_refs, 0B, 0);
  D.24606 = major_collector.iterate_objects;
  D.24606 (1, 1, scan_object_for_xdomain_refs, 0B);
  bigobj = los_object_list;
  goto <D.22634>;
  <D.22633>:
  D.24607 = &bigobj->data;
  D.24608 = sgen_los_object_size (bigobj);
  scan_object_for_xdomain_refs (D.24607, D.24608, 0B);
  bigobj = bigobj->next;
  <D.22634>:
  if (bigobj != 0B) goto <D.22633>; else goto <D.22635>;
  <D.22635>:
}


scan_object_for_xdomain_refs (char * start, mword size, void * data)
{
  struct MonoVTable * D.24609;
  unsigned int D.24610;
  unsigned int D.24611;
  unsigned int D.24612;
  unsigned int D.24613;
  unsigned int D.24616;
  unsigned int D.24617;
  unsigned int D.24618;
  unsigned int D.24619;
  unsigned int D.24620;
  unsigned int _index.47;
  unsigned int D.24622;
  int D.24623;
  unsigned int _index.48;
  unsigned int D.24625;
  int D.24626;
  unsigned int D.24627;
  unsigned int D.24630;
  int D.24631;
  int desc.49;
  unsigned int D.24635;
  unsigned int el_size.50;
  unsigned int D.24637;
  int D.24641;
  unsigned int offset.51;
  unsigned int D.24643;
  unsigned int i.52;
  unsigned int D.24645;
  void * * D.24646;
  sizetype el_size.53;
  unsigned int D.24651;
  unsigned int D.24654;
  unsigned int D.24657;
  unsigned int D.24658;
  struct MonoVTable * D.24661;
  struct MonoClass * D.24662;
  const char * D.24663;
  const char * D.24664;
  gsize * bitmap_data.54;
  unsigned int D.24666;
  int bwords.55;
  unsigned int D.24670;
  gsize * mbitmap_data.56;
  unsigned int D.24672;
  unsigned int D.24673;
  struct MonoClass * D.24674;
  unsigned int el_size.57;
  unsigned int D.24676;
  const char * D.24679;
  const char * D.24680;
  gsize * bitmap_data.58;
  unsigned int D.24682;
  unsigned int bwords.59;
  sizetype el_size.60;
  struct MonoDomain * domain;

  D.24609 = MEM[(struct MonoObject *)start].vtable;
  domain = D.24609->domain;
  {
    struct GCVTable * vt;
    mword desc;

    D.24610 = MEM[(mword *)start];
    D.24611 = D.24610 & 4294967292;
    vt = (struct GCVTable *) D.24611;
    desc = vt->desc;
    D.24612 = desc & 7;
    switch (D.24612) <default: <D.22385>, case 1: <D.22300>, case 2: <D.22307>, case 3: <D.22351>, case 4: <D.22315>, case 5: <D.22345>, case 6: <D.22364>, case 7: <D.22384>>
    <D.22300>:
    D.24613 = desc & 4294901760;
    if (D.24613 != 0) goto <D.24614>; else goto <D.24615>;
    <D.24614>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.24616 = desc >> 16;
      D.24617 = D.24616 & 255;
      D.24618 = D.24617 * 4;
      _objptr = _objptr + D.24618;
      D.24619 = desc >> 24;
      D.24620 = D.24619 * 4;
      _objptr_end = _objptr + D.24620;
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 4;
      goto <D.22304>;
      <D.22303>:
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 4;
      <D.22304>:
      if (_objptr < _objptr_end) goto <D.22303>; else goto <D.22305>;
      <D.22305>:
    }
    <D.24615>:
    goto <D.22306>;
    <D.22307>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 16;
      _objptr = _objptr + 8;
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.47 = (unsigned int) _index;
        D.24622 = _index.47 * 4;
        _objptr = _objptr + D.24622;
        D.24623 = _index + 1;
        _bmap = _bmap >> D.24623;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 4;
      }
      goto <D.22313>;
      <D.22312>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.48 = (unsigned int) _index;
        D.24625 = _index.48 * 4;
        _objptr = _objptr + D.24625;
        D.24626 = _index + 1;
        _bmap = _bmap >> D.24626;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 4;
      }
      <D.22313>:
      if (_bmap != 0) goto <D.22312>; else goto <D.22314>;
      <D.22314>:
    }
    goto <D.22306>;
    <D.22315>:
    D.24627 = desc & 4294950912;
    if (D.24627 != 0) goto <D.24628>; else goto <D.24629>;
    <D.24628>:
    {
      int el_size;
      int etype;

      D.24630 = desc >> 3;
      D.24631 = (int) D.24630;
      el_size = D.24631 & 1023;
      desc.49 = (int) desc;
      etype = desc.49 & 49152;
      if (etype == 16384) goto <D.24633>; else goto <D.24634>;
      <D.24633>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.24635 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.24637 = D.24635 * el_size.50;
        end_refs = p + D.24637;
        goto <D.22321>;
        <D.22320>:
        check_reference_for_xdomain (p, start, domain);
        p = p + 4;
        <D.22321>:
        if (p < end_refs) goto <D.22320>; else goto <D.22322>;
        <D.22322>:
      }
      goto <D.24638>;
      <D.24634>:
      if (etype == 32768) goto <D.24639>; else goto <D.24640>;
      <D.24639>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.24616 = desc >> 16;
        D.24641 = (int) D.24616;
        offset = D.24641 & 255;
        D.24619 = desc >> 24;
        num_refs = (int) D.24619;
        e_start = start + 16;
        D.24635 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.24637 = D.24635 * el_size.50;
        e_end = e_start + D.24637;
        goto <D.22333>;
        <D.22332>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.51 = (unsigned int) offset;
          D.24643 = offset.51 * 4;
          p = p + D.24643;
          i = 0;
          goto <D.22330>;
          <D.22329>:
          i.52 = (unsigned int) i;
          D.24645 = i.52 * 4;
          D.24646 = p + D.24645;
          check_reference_for_xdomain (D.24646, start, domain);
          i = i + 1;
          <D.22330>:
          if (i < num_refs) goto <D.22329>; else goto <D.22331>;
          <D.22331>:
          el_size.53 = (sizetype) el_size;
          e_start = e_start + el_size.53;
        }
        <D.22333>:
        if (e_start < e_end) goto <D.22332>; else goto <D.22334>;
        <D.22334>:
      }
      goto <D.24648>;
      <D.24640>:
      if (etype == 49152) goto <D.24649>; else goto <D.24650>;
      <D.24649>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.24635 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.24637 = D.24635 * el_size.50;
        e_end = e_start + D.24637;
        goto <D.22343>;
        <D.22342>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.22340>;
          <D.22339>:
          D.24651 = _bmap & 1;
          if (D.24651 != 0) goto <D.24652>; else goto <D.24653>;
          <D.24652>:
          check_reference_for_xdomain (p, start, domain);
          <D.24653>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.22340>:
          if (_bmap != 0) goto <D.22339>; else goto <D.22341>;
          <D.22341>:
          el_size.53 = (sizetype) el_size;
          e_start = e_start + el_size.53;
        }
        <D.22343>:
        if (e_start < e_end) goto <D.22342>; else goto <D.22344>;
        <D.22344>:
      }
      <D.24650>:
      <D.24648>:
      <D.24638>:
    }
    <D.24629>:
    goto <D.22306>;
    <D.22345>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.22349>;
      <D.22348>:
      D.24654 = _bmap & 1;
      if (D.24654 != 0) goto <D.24655>; else goto <D.24656>;
      <D.24655>:
      check_reference_for_xdomain (_objptr, start, domain);
      <D.24656>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.22349>:
      if (_bmap != 0) goto <D.22348>; else goto <D.22350>;
      <D.22350>:
    }
    goto <D.22306>;
    <D.22351>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.24657 = *bitmap_data;
      D.24658 = D.24657 + 4294967295;
      bwords = (int) D.24658;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.24659>; else goto <D.24660>;
      <D.24659>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.24661 = myobj->vtable;
        D.24662 = D.24661->klass;
        D.24663 = D.24662->name_space;
        D.24661 = myobj->vtable;
        D.24662 = D.24661->klass;
        D.24664 = D.24662->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.24663, D.24664);
      }
      <D.24660>:
      goto <D.22362>;
      <D.22361>:
      {
        gsize _bmap;

        bitmap_data.54 = bitmap_data;
        bitmap_data = bitmap_data.54 + 4;
        _bmap = *bitmap_data.54;
        _objptr = start_run;
        goto <D.22359>;
        <D.22358>:
        D.24666 = _bmap & 1;
        if (D.24666 != 0) goto <D.24667>; else goto <D.24668>;
        <D.24667>:
        check_reference_for_xdomain (_objptr, start, domain);
        <D.24668>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.22359>:
        if (_bmap != 0) goto <D.22358>; else goto <D.22360>;
        <D.22360>:
        start_run = start_run + 128;
      }
      <D.22362>:
      bwords.55 = bwords;
      bwords = bwords.55 + -1;
      if (bwords.55 > 0) goto <D.22361>; else goto <D.22363>;
      <D.22363>:
    }
    goto <D.22306>;
    <D.22364>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.24670 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.24670);
      mbitmap_data.56 = mbitmap_data;
      mbitmap_data = mbitmap_data.56 + 4;
      D.24672 = *mbitmap_data.56;
      D.24673 = D.24672 + 4294967295;
      mbwords = (int) D.24673;
      D.24674 = vt->klass;
      el_size = mono_array_element_size (D.24674);
      e_start = start + 16;
      D.24635 = MEM[(struct MonoArray *)start].max_length;
      el_size.57 = (unsigned int) el_size;
      D.24676 = D.24635 * el_size.57;
      e_end = e_start + D.24676;
      if (0 != 0) goto <D.24677>; else goto <D.24678>;
      <D.24677>:
      D.24670 = vt->desc;
      D.24674 = vt->klass;
      D.24679 = D.24674->name_space;
      D.24674 = vt->klass;
      D.24680 = D.24674->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.24670, D.24679, D.24680);
      <D.24678>:
      goto <D.22382>;
      <D.22381>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.22379>;
        <D.22378>:
        {
          gsize _bmap;
          void * * start_run;

          bitmap_data.58 = bitmap_data;
          bitmap_data = bitmap_data.58 + 4;
          _bmap = *bitmap_data.58;
          start_run = _objptr;
          goto <D.22376>;
          <D.22375>:
          D.24682 = _bmap & 1;
          if (D.24682 != 0) goto <D.24683>; else goto <D.24684>;
          <D.24683>:
          check_reference_for_xdomain (_objptr, start, domain);
          <D.24684>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.22376>:
          if (_bmap != 0) goto <D.22375>; else goto <D.22377>;
          <D.22377>:
          _objptr = start_run + 128;
        }
        <D.22379>:
        bwords.59 = bwords;
        bwords = bwords.59 + 4294967295;
        if (bwords.59 != 0) goto <D.22378>; else goto <D.22380>;
        <D.22380>:
        el_size.60 = (sizetype) el_size;
        e_start = e_start + el_size.60;
      }
      <D.22382>:
      if (e_start < e_end) goto <D.22381>; else goto <D.22383>;
      <D.22383>:
    }
    goto <D.22306>;
    <D.22384>:
    goto <D.22306>;
    <D.22385>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.22306>:
  }
}


check_reference_for_xdomain (void * * ptr, char * obj, struct MonoDomain * domain)
{
  int ptr.61;
  int o.62;
  struct MonoVTable * D.24693;
  struct MonoDomain * D.24694;
  int D.24695;
  struct MonoVTable * D.24698;
  struct MonoClassField * D.24699;
  unsigned int i.63;
  unsigned int D.24701;
  struct MonoClassField * D.24702;
  int D.24703;
  unsigned int i.64;
  unsigned int D.24707;
  struct MonoClass * D.24709;
  struct MonoClass * D.24710;
  struct MonoClass * D.24714;
  const char * D.24715;
  const char * D.24716;
  const char * iftmp.65;
  const char * D.24721;
  const char * D.24722;
  const char * iftmp.66;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;
  struct MonoClass * class;
  struct MonoClassField * field;
  char * str;

  o = obj;
  ref = *ptr;
  ptr.61 = (int) ptr;
  o.62 = (int) o;
  offset = ptr.61 - o.62;
  if (ref == 0B) goto <D.24690>; else goto <D.24692>;
  <D.24692>:
  D.24693 = ref->vtable;
  D.24694 = D.24693->domain;
  if (D.24694 == domain) goto <D.24690>; else goto <D.24691>;
  <D.24690>:
  return;
  <D.24691>:
  D.24695 = is_xdomain_ref_allowed (ptr, obj, domain);
  if (D.24695 != 0) goto <D.24696>; else goto <D.24697>;
  <D.24696>:
  return;
  <D.24697>:
  field = 0B;
  D.24698 = o->vtable;
  class = D.24698->klass;
  goto <D.22291>;
  <D.22290>:
  {
    int i;

    i = 0;
    goto <D.22288>;
    <D.22287>:
    D.24699 = class->fields;
    i.63 = (unsigned int) i;
    D.24701 = i.63 * 16;
    D.24702 = D.24699 + D.24701;
    D.24703 = D.24702->offset;
    if (D.24703 == offset) goto <D.24704>; else goto <D.24705>;
    <D.24704>:
    D.24699 = class->fields;
    i.63 = (unsigned int) i;
    D.24701 = i.63 * 16;
    field = D.24699 + D.24701;
    goto <D.22286>;
    <D.24705>:
    i = i + 1;
    <D.22288>:
    i.64 = (unsigned int) i;
    D.24707 = class->field.count;
    if (i.64 < D.24707) goto <D.22287>; else goto <D.22286>;
    <D.22286>:
    if (field != 0B) goto <D.22289>; else goto <D.24708>;
    <D.24708>:
  }
  class = class->parent;
  <D.22291>:
  if (class != 0B) goto <D.22290>; else goto <D.22289>;
  <D.22289>:
  D.24693 = ref->vtable;
  D.24709 = D.24693->klass;
  D.24710 = mono_defaults.string_class;
  if (D.24709 == D.24710) goto <D.24711>; else goto <D.24712>;
  <D.24711>:
  str = mono_string_to_utf8 (ref);
  goto <D.24713>;
  <D.24712>:
  str = 0B;
  <D.24713>:
  D.24698 = o->vtable;
  D.24714 = D.24698->klass;
  D.24715 = D.24714->name_space;
  D.24698 = o->vtable;
  D.24714 = D.24698->klass;
  D.24716 = D.24714->name;
  if (field != 0B) goto <D.24718>; else goto <D.24719>;
  <D.24718>:
  iftmp.65 = field->name;
  goto <D.24720>;
  <D.24719>:
  iftmp.65 = "";
  <D.24720>:
  D.24693 = ref->vtable;
  D.24709 = D.24693->klass;
  D.24721 = D.24709->name_space;
  D.24693 = ref->vtable;
  D.24709 = D.24693->klass;
  D.24722 = D.24709->name;
  if (str != 0B) goto <D.24724>; else goto <D.24725>;
  <D.24724>:
  iftmp.66 = str;
  goto <D.24726>;
  <D.24725>:
  iftmp.66 = "";
  <D.24726>:
  monoeg_g_print ("xdomain reference in %p (%s.%s) at offset %d (%s) to %p (%s.%s) (%s)  -  pointed to by:\n", o, D.24715, D.24716, offset, iftmp.65, ref, D.24721, D.24722, iftmp.66);
  mono_gc_scan_for_specific_ref (o, 1);
  if (str != 0B) goto <D.24727>; else goto <D.24728>;
  <D.24727>:
  monoeg_g_free (str);
  <D.24728>:
}


is_xdomain_ref_allowed (void * * ptr, char * obj, struct MonoDomain * domain)
{
  int ptr.67;
  int o.68;
  struct MonoVTable * D.24732;
  struct MonoClass * D.24733;
  struct MonoClass * D.24734;
  gboolean D.24739;
  struct MonoClass * D.24740;
  struct MonoClass * D.24745;
  int D.24746;
  int D.22174;
  int iftmp.69;
  int D.22173;
  struct MonoVTable * D.24754;
  struct MonoClass * D.24755;
  const char[21] * D.24756;
  unsigned char D.24757;
  int D.24758;
  unsigned char D.24759;
  int D.24760;
  _Bool D.24761;
  _Bool D.24762;
  _Bool D.24763;
  const unsigned char * D.24766;
  unsigned char D.24767;
  int D.24768;
  const unsigned char * D.24769;
  unsigned char D.24770;
  int D.24771;
  _Bool D.24772;
  _Bool D.24773;
  const unsigned char * D.24776;
  unsigned char D.24777;
  int D.24778;
  const unsigned char * D.24779;
  unsigned char D.24780;
  int D.24781;
  _Bool D.24782;
  _Bool D.24783;
  const unsigned char * D.24786;
  unsigned char D.24787;
  int D.24788;
  const unsigned char * D.24789;
  unsigned char D.24790;
  int D.24791;
  const char * D.24793;
  int D.22183;
  int iftmp.70;
  int D.22182;
  const char[12] * D.24799;
  unsigned char D.24800;
  int D.24801;
  unsigned char D.24802;
  int D.24803;
  _Bool D.24804;
  _Bool D.24805;
  _Bool D.24806;
  const unsigned char * D.24809;
  unsigned char D.24810;
  int D.24811;
  const unsigned char * D.24812;
  unsigned char D.24813;
  int D.24814;
  _Bool D.24815;
  _Bool D.24816;
  const unsigned char * D.24819;
  unsigned char D.24820;
  int D.24821;
  const unsigned char * D.24822;
  unsigned char D.24823;
  int D.24824;
  _Bool D.24825;
  _Bool D.24826;
  const unsigned char * D.24829;
  unsigned char D.24830;
  int D.24831;
  const unsigned char * D.24832;
  unsigned char D.24833;
  int D.24834;
  const char * D.24836;
  int D.22192;
  int iftmp.71;
  int D.22191;
  const char[7] * D.24842;
  unsigned char D.24843;
  int D.24844;
  unsigned char D.24845;
  int D.24846;
  _Bool D.24847;
  _Bool D.24848;
  _Bool D.24849;
  const unsigned char * D.24852;
  unsigned char D.24853;
  int D.24854;
  const unsigned char * D.24855;
  unsigned char D.24856;
  int D.24857;
  _Bool D.24858;
  _Bool D.24859;
  const unsigned char * D.24862;
  unsigned char D.24863;
  int D.24864;
  const unsigned char * D.24865;
  unsigned char D.24866;
  int D.24867;
  _Bool D.24868;
  _Bool D.24869;
  const unsigned char * D.24872;
  unsigned char D.24873;
  int D.24874;
  const unsigned char * D.24875;
  unsigned char D.24876;
  int D.24877;
  const char * D.24879;
  int D.22201;
  int iftmp.72;
  int D.22200;
  const char[9] * D.24885;
  unsigned char D.24886;
  int D.24887;
  unsigned char D.24888;
  int D.24889;
  _Bool D.24890;
  _Bool D.24891;
  _Bool D.24892;
  const unsigned char * D.24895;
  unsigned char D.24896;
  int D.24897;
  const unsigned char * D.24898;
  unsigned char D.24899;
  int D.24900;
  _Bool D.24901;
  _Bool D.24902;
  const unsigned char * D.24905;
  unsigned char D.24906;
  int D.24907;
  const unsigned char * D.24908;
  unsigned char D.24909;
  int D.24910;
  _Bool D.24911;
  _Bool D.24912;
  const unsigned char * D.24915;
  unsigned char D.24916;
  int D.24917;
  const unsigned char * D.24918;
  unsigned char D.24919;
  int D.24920;
  const char * D.24922;
  int D.22210;
  int iftmp.73;
  int D.22209;
  unsigned char D.24928;
  int D.24929;
  _Bool D.24930;
  _Bool D.24931;
  _Bool D.24932;
  const unsigned char * D.24935;
  unsigned char D.24936;
  int D.24937;
  _Bool D.24938;
  _Bool D.24939;
  const unsigned char * D.24942;
  unsigned char D.24943;
  int D.24944;
  _Bool D.24945;
  _Bool D.24946;
  const unsigned char * D.24949;
  unsigned char D.24950;
  int D.24951;
  int D.22219;
  int iftmp.74;
  int D.22218;
  const char[7] * D.24958;
  unsigned char D.24959;
  int D.24960;
  unsigned char D.24961;
  int D.24962;
  _Bool D.24963;
  _Bool D.24964;
  _Bool D.24965;
  const unsigned char * D.24968;
  unsigned char D.24969;
  int D.24970;
  const unsigned char * D.24971;
  unsigned char D.24972;
  int D.24973;
  _Bool D.24974;
  _Bool D.24975;
  const unsigned char * D.24978;
  unsigned char D.24979;
  int D.24980;
  const unsigned char * D.24981;
  unsigned char D.24982;
  int D.24983;
  _Bool D.24984;
  _Bool D.24985;
  const unsigned char * D.24988;
  unsigned char D.24989;
  int D.24990;
  const unsigned char * D.24991;
  unsigned char D.24992;
  int D.24993;
  int D.22228;
  int iftmp.75;
  int D.22227;
  const char[10] * D.25000;
  unsigned char D.25001;
  int D.25002;
  unsigned char D.25003;
  int D.25004;
  _Bool D.25005;
  _Bool D.25006;
  _Bool D.25007;
  const unsigned char * D.25010;
  unsigned char D.25011;
  int D.25012;
  const unsigned char * D.25013;
  unsigned char D.25014;
  int D.25015;
  _Bool D.25016;
  _Bool D.25017;
  const unsigned char * D.25020;
  unsigned char D.25021;
  int D.25022;
  const unsigned char * D.25023;
  unsigned char D.25024;
  int D.25025;
  _Bool D.25026;
  _Bool D.25027;
  const unsigned char * D.25030;
  unsigned char D.25031;
  int D.25032;
  const unsigned char * D.25033;
  unsigned char D.25034;
  int D.25035;
  int D.22237;
  int iftmp.76;
  int D.22236;
  const char[13] * D.25042;
  unsigned char D.25043;
  int D.25044;
  unsigned char D.25045;
  int D.25046;
  _Bool D.25047;
  _Bool D.25048;
  _Bool D.25049;
  const unsigned char * D.25052;
  unsigned char D.25053;
  int D.25054;
  const unsigned char * D.25055;
  unsigned char D.25056;
  int D.25057;
  _Bool D.25058;
  _Bool D.25059;
  const unsigned char * D.25062;
  unsigned char D.25063;
  int D.25064;
  const unsigned char * D.25065;
  unsigned char D.25066;
  int D.25067;
  _Bool D.25068;
  _Bool D.25069;
  const unsigned char * D.25072;
  unsigned char D.25073;
  int D.25074;
  const unsigned char * D.25075;
  unsigned char D.25076;
  int D.25077;
  int D.22246;
  int iftmp.77;
  int D.22245;
  const char[34] * D.25084;
  unsigned char D.25085;
  int D.25086;
  unsigned char D.25087;
  int D.25088;
  _Bool D.25089;
  _Bool D.25090;
  _Bool D.25091;
  const unsigned char * D.25094;
  unsigned char D.25095;
  int D.25096;
  const unsigned char * D.25097;
  unsigned char D.25098;
  int D.25099;
  _Bool D.25100;
  _Bool D.25101;
  const unsigned char * D.25104;
  unsigned char D.25105;
  int D.25106;
  const unsigned char * D.25107;
  unsigned char D.25108;
  int D.25109;
  _Bool D.25110;
  _Bool D.25111;
  const unsigned char * D.25114;
  unsigned char D.25115;
  int D.25116;
  const unsigned char * D.25117;
  unsigned char D.25118;
  int D.25119;
  int D.22255;
  int iftmp.78;
  int D.22254;
  const char[12] * D.25126;
  unsigned char D.25127;
  int D.25128;
  unsigned char D.25129;
  int D.25130;
  _Bool D.25131;
  _Bool D.25132;
  _Bool D.25133;
  const unsigned char * D.25136;
  unsigned char D.25137;
  int D.25138;
  const unsigned char * D.25139;
  unsigned char D.25140;
  int D.25141;
  _Bool D.25142;
  _Bool D.25143;
  const unsigned char * D.25146;
  unsigned char D.25147;
  int D.25148;
  const unsigned char * D.25149;
  unsigned char D.25150;
  int D.25151;
  _Bool D.25152;
  _Bool D.25153;
  const unsigned char * D.25156;
  unsigned char D.25157;
  int D.25158;
  const unsigned char * D.25159;
  unsigned char D.25160;
  int D.25161;
  int D.22264;
  int iftmp.79;
  int D.22263;
  unsigned char D.25168;
  int D.25169;
  _Bool D.25170;
  _Bool D.25171;
  _Bool D.25172;
  const unsigned char * D.25175;
  unsigned char D.25176;
  int D.25177;
  _Bool D.25178;
  _Bool D.25179;
  const unsigned char * D.25182;
  unsigned char D.25183;
  int D.25184;
  _Bool D.25185;
  _Bool D.25186;
  const unsigned char * D.25189;
  unsigned char D.25190;
  int D.25191;
  int D.22273;
  int iftmp.80;
  int D.22272;
  unsigned char D.25198;
  int D.25199;
  _Bool D.25200;
  _Bool D.25201;
  _Bool D.25202;
  const unsigned char * D.25205;
  unsigned char D.25206;
  int D.25207;
  _Bool D.25208;
  _Bool D.25209;
  const unsigned char * D.25212;
  unsigned char D.25213;
  int D.25214;
  _Bool D.25215;
  _Bool D.25216;
  const unsigned char * D.25219;
  unsigned char D.25220;
  int D.25221;
  int D.25225;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;

  o = obj;
  ref = *ptr;
  ptr.67 = (int) ptr;
  o.68 = (int) o;
  offset = ptr.67 - o.68;
  D.24732 = o->vtable;
  D.24733 = D.24732->klass;
  D.24734 = mono_defaults.thread_class;
  if (D.24733 == D.24734) goto <D.24735>; else goto <D.24736>;
  <D.24735>:
  if (offset == 8) goto <D.24737>; else goto <D.24738>;
  <D.24737>:
  D.24739 = 1;
  return D.24739;
  <D.24738>:
  <D.24736>:
  D.24732 = o->vtable;
  D.24733 = D.24732->klass;
  D.24740 = mono_defaults.internal_thread_class;
  if (D.24733 == D.24740) goto <D.24741>; else goto <D.24742>;
  <D.24741>:
  if (offset == 68) goto <D.24743>; else goto <D.24744>;
  <D.24743>:
  D.24739 = 1;
  return D.24739;
  <D.24744>:
  <D.24742>:
  D.24732 = o->vtable;
  D.24733 = D.24732->klass;
  D.24745 = mono_defaults.real_proxy_class;
  D.24746 = mono_class_has_parent_fast (D.24733, D.24745);
  if (D.24746 != 0) goto <D.24747>; else goto <D.24748>;
  <D.24747>:
  if (offset == 16) goto <D.24749>; else goto <D.24750>;
  <D.24749>:
  D.24739 = 1;
  return D.24739;
  <D.24750>:
  <D.24748>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 20;
    if (__s2_len <= 3) goto <D.24752>; else goto <D.24753>;
    <D.24752>:
    {
      const unsigned char * __s2;
      int __result;

      D.24754 = ref->vtable;
      D.24755 = D.24754->klass;
      __s2 = D.24755->name_space;
      D.24756 = "System.Globalization";
      D.24757 = MEM[(const unsigned char *)D.24756];
      D.24758 = (int) D.24757;
      D.24759 = *__s2;
      D.24760 = (int) D.24759;
      __result = D.24758 - D.24760;
      {
        D.24761 = __s2_len != 0;
        D.24762 = __result == 0;
        D.24763 = D.24761 & D.24762;
        if (D.24763 != 0) goto <D.24764>; else goto <D.24765>;
        <D.24764>:
        D.24766 = &MEM[(void *)"System.Globalization" + 1B];
        D.24767 = *D.24766;
        D.24768 = (int) D.24767;
        D.24769 = __s2 + 1;
        D.24770 = *D.24769;
        D.24771 = (int) D.24770;
        __result = D.24768 - D.24771;
        D.24772 = __s2_len > 1;
        D.24762 = __result == 0;
        D.24773 = D.24772 & D.24762;
        if (D.24773 != 0) goto <D.24774>; else goto <D.24775>;
        <D.24774>:
        D.24776 = &MEM[(void *)"System.Globalization" + 2B];
        D.24777 = *D.24776;
        D.24778 = (int) D.24777;
        D.24779 = __s2 + 2;
        D.24780 = *D.24779;
        D.24781 = (int) D.24780;
        __result = D.24778 - D.24781;
        D.24782 = __s2_len > 2;
        D.24762 = __result == 0;
        D.24783 = D.24782 & D.24762;
        if (D.24783 != 0) goto <D.24784>; else goto <D.24785>;
        <D.24784>:
        D.24786 = &MEM[(void *)"System.Globalization" + 3B];
        D.24787 = *D.24786;
        D.24788 = (int) D.24787;
        D.24789 = __s2 + 3;
        D.24790 = *D.24789;
        D.24791 = (int) D.24790;
        __result = D.24788 - D.24791;
        <D.24785>:
        <D.24775>:
        <D.24765>:
      }
      D.22173 = __result;
    }
    iftmp.69 = -D.22173;
    goto <D.24792>;
    <D.24753>:
    D.24754 = ref->vtable;
    D.24755 = D.24754->klass;
    D.24793 = D.24755->name_space;
    iftmp.69 = __builtin_strcmp (D.24793, "System.Globalization");
    <D.24792>:
    D.22174 = iftmp.69;
  }
  if (D.22174 == 0) goto <D.24794>; else goto <D.24795>;
  <D.24794>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 11;
    if (__s2_len <= 3) goto <D.24797>; else goto <D.24798>;
    <D.24797>:
    {
      const unsigned char * __s2;
      int __result;

      D.24754 = ref->vtable;
      D.24755 = D.24754->klass;
      __s2 = D.24755->name;
      D.24799 = "CultureInfo";
      D.24800 = MEM[(const unsigned char *)D.24799];
      D.24801 = (int) D.24800;
      D.24802 = *__s2;
      D.24803 = (int) D.24802;
      __result = D.24801 - D.24803;
      {
        D.24804 = __s2_len != 0;
        D.24805 = __result == 0;
        D.24806 = D.24804 & D.24805;
        if (D.24806 != 0) goto <D.24807>; else goto <D.24808>;
        <D.24807>:
        D.24809 = &MEM[(void *)"CultureInfo" + 1B];
        D.24810 = *D.24809;
        D.24811 = (int) D.24810;
        D.24812 = __s2 + 1;
        D.24813 = *D.24812;
        D.24814 = (int) D.24813;
        __result = D.24811 - D.24814;
        D.24815 = __s2_len > 1;
        D.24805 = __result == 0;
        D.24816 = D.24815 & D.24805;
        if (D.24816 != 0) goto <D.24817>; else goto <D.24818>;
        <D.24817>:
        D.24819 = &MEM[(void *)"CultureInfo" + 2B];
        D.24820 = *D.24819;
        D.24821 = (int) D.24820;
        D.24822 = __s2 + 2;
        D.24823 = *D.24822;
        D.24824 = (int) D.24823;
        __result = D.24821 - D.24824;
        D.24825 = __s2_len > 2;
        D.24805 = __result == 0;
        D.24826 = D.24825 & D.24805;
        if (D.24826 != 0) goto <D.24827>; else goto <D.24828>;
        <D.24827>:
        D.24829 = &MEM[(void *)"CultureInfo" + 3B];
        D.24830 = *D.24829;
        D.24831 = (int) D.24830;
        D.24832 = __s2 + 3;
        D.24833 = *D.24832;
        D.24834 = (int) D.24833;
        __result = D.24831 - D.24834;
        <D.24828>:
        <D.24818>:
        <D.24808>:
      }
      D.22182 = __result;
    }
    iftmp.70 = -D.22182;
    goto <D.24835>;
    <D.24798>:
    D.24754 = ref->vtable;
    D.24755 = D.24754->klass;
    D.24836 = D.24755->name;
    iftmp.70 = __builtin_strcmp (D.24836, "CultureInfo");
    <D.24835>:
    D.22183 = iftmp.70;
  }
  if (D.22183 == 0) goto <D.24837>; else goto <D.24838>;
  <D.24837>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.24840>; else goto <D.24841>;
    <D.24840>:
    {
      const unsigned char * __s2;
      int __result;

      D.24732 = o->vtable;
      D.24733 = D.24732->klass;
      __s2 = D.24733->name_space;
      D.24842 = "System";
      D.24843 = MEM[(const unsigned char *)D.24842];
      D.24844 = (int) D.24843;
      D.24845 = *__s2;
      D.24846 = (int) D.24845;
      __result = D.24844 - D.24846;
      {
        D.24847 = __s2_len != 0;
        D.24848 = __result == 0;
        D.24849 = D.24847 & D.24848;
        if (D.24849 != 0) goto <D.24850>; else goto <D.24851>;
        <D.24850>:
        D.24852 = &MEM[(void *)"System" + 1B];
        D.24853 = *D.24852;
        D.24854 = (int) D.24853;
        D.24855 = __s2 + 1;
        D.24856 = *D.24855;
        D.24857 = (int) D.24856;
        __result = D.24854 - D.24857;
        D.24858 = __s2_len > 1;
        D.24848 = __result == 0;
        D.24859 = D.24858 & D.24848;
        if (D.24859 != 0) goto <D.24860>; else goto <D.24861>;
        <D.24860>:
        D.24862 = &MEM[(void *)"System" + 2B];
        D.24863 = *D.24862;
        D.24864 = (int) D.24863;
        D.24865 = __s2 + 2;
        D.24866 = *D.24865;
        D.24867 = (int) D.24866;
        __result = D.24864 - D.24867;
        D.24868 = __s2_len > 2;
        D.24848 = __result == 0;
        D.24869 = D.24868 & D.24848;
        if (D.24869 != 0) goto <D.24870>; else goto <D.24871>;
        <D.24870>:
        D.24872 = &MEM[(void *)"System" + 3B];
        D.24873 = *D.24872;
        D.24874 = (int) D.24873;
        D.24875 = __s2 + 3;
        D.24876 = *D.24875;
        D.24877 = (int) D.24876;
        __result = D.24874 - D.24877;
        <D.24871>:
        <D.24861>:
        <D.24851>:
      }
      D.22191 = __result;
    }
    iftmp.71 = -D.22191;
    goto <D.24878>;
    <D.24841>:
    D.24732 = o->vtable;
    D.24733 = D.24732->klass;
    D.24879 = D.24733->name_space;
    iftmp.71 = __builtin_strcmp (D.24879, "System");
    <D.24878>:
    D.22192 = iftmp.71;
  }
  if (D.22192 == 0) goto <D.24880>; else goto <D.24881>;
  <D.24880>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 8;
    if (__s2_len <= 3) goto <D.24883>; else goto <D.24884>;
    <D.24883>:
    {
      const unsigned char * __s2;
      int __result;

      D.24732 = o->vtable;
      D.24733 = D.24732->klass;
      __s2 = D.24733->name;
      D.24885 = "Object[]";
      D.24886 = MEM[(const unsigned char *)D.24885];
      D.24887 = (int) D.24886;
      D.24888 = *__s2;
      D.24889 = (int) D.24888;
      __result = D.24887 - D.24889;
      {
        D.24890 = __s2_len != 0;
        D.24891 = __result == 0;
        D.24892 = D.24890 & D.24891;
        if (D.24892 != 0) goto <D.24893>; else goto <D.24894>;
        <D.24893>:
        D.24895 = &MEM[(void *)"Object[]" + 1B];
        D.24896 = *D.24895;
        D.24897 = (int) D.24896;
        D.24898 = __s2 + 1;
        D.24899 = *D.24898;
        D.24900 = (int) D.24899;
        __result = D.24897 - D.24900;
        D.24901 = __s2_len > 1;
        D.24891 = __result == 0;
        D.24902 = D.24901 & D.24891;
        if (D.24902 != 0) goto <D.24903>; else goto <D.24904>;
        <D.24903>:
        D.24905 = &MEM[(void *)"Object[]" + 2B];
        D.24906 = *D.24905;
        D.24907 = (int) D.24906;
        D.24908 = __s2 + 2;
        D.24909 = *D.24908;
        D.24910 = (int) D.24909;
        __result = D.24907 - D.24910;
        D.24911 = __s2_len > 2;
        D.24891 = __result == 0;
        D.24912 = D.24911 & D.24891;
        if (D.24912 != 0) goto <D.24913>; else goto <D.24914>;
        <D.24913>:
        D.24915 = &MEM[(void *)"Object[]" + 3B];
        D.24916 = *D.24915;
        D.24917 = (int) D.24916;
        D.24918 = __s2 + 3;
        D.24919 = *D.24918;
        D.24920 = (int) D.24919;
        __result = D.24917 - D.24920;
        <D.24914>:
        <D.24904>:
        <D.24894>:
      }
      D.22200 = __result;
    }
    iftmp.72 = -D.22200;
    goto <D.24921>;
    <D.24884>:
    D.24732 = o->vtable;
    D.24733 = D.24732->klass;
    D.24922 = D.24733->name;
    iftmp.72 = __builtin_strcmp (D.24922, "Object[]");
    <D.24921>:
    D.22201 = iftmp.72;
  }
  if (D.22201 == 0) goto <D.24923>; else goto <D.24924>;
  <D.24923>:
  D.24739 = 1;
  return D.24739;
  <D.24924>:
  <D.24881>:
  <D.24838>:
  <D.24795>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.24926>; else goto <D.24927>;
    <D.24926>:
    {
      const unsigned char * __s2;
      int __result;

      D.24754 = ref->vtable;
      D.24755 = D.24754->klass;
      __s2 = D.24755->name_space;
      D.24842 = "System";
      D.24843 = MEM[(const unsigned char *)D.24842];
      D.24844 = (int) D.24843;
      D.24928 = *__s2;
      D.24929 = (int) D.24928;
      __result = D.24844 - D.24929;
      {
        D.24930 = __s2_len != 0;
        D.24931 = __result == 0;
        D.24932 = D.24930 & D.24931;
        if (D.24932 != 0) goto <D.24933>; else goto <D.24934>;
        <D.24933>:
        D.24852 = &MEM[(void *)"System" + 1B];
        D.24853 = *D.24852;
        D.24854 = (int) D.24853;
        D.24935 = __s2 + 1;
        D.24936 = *D.24935;
        D.24937 = (int) D.24936;
        __result = D.24854 - D.24937;
        D.24938 = __s2_len > 1;
        D.24931 = __result == 0;
        D.24939 = D.24938 & D.24931;
        if (D.24939 != 0) goto <D.24940>; else goto <D.24941>;
        <D.24940>:
        D.24862 = &MEM[(void *)"System" + 2B];
        D.24863 = *D.24862;
        D.24864 = (int) D.24863;
        D.24942 = __s2 + 2;
        D.24943 = *D.24942;
        D.24944 = (int) D.24943;
        __result = D.24864 - D.24944;
        D.24945 = __s2_len > 2;
        D.24931 = __result == 0;
        D.24946 = D.24945 & D.24931;
        if (D.24946 != 0) goto <D.24947>; else goto <D.24948>;
        <D.24947>:
        D.24872 = &MEM[(void *)"System" + 3B];
        D.24873 = *D.24872;
        D.24874 = (int) D.24873;
        D.24949 = __s2 + 3;
        D.24950 = *D.24949;
        D.24951 = (int) D.24950;
        __result = D.24874 - D.24951;
        <D.24948>:
        <D.24941>:
        <D.24934>:
      }
      D.22209 = __result;
    }
    iftmp.73 = -D.22209;
    goto <D.24952>;
    <D.24927>:
    D.24754 = ref->vtable;
    D.24755 = D.24754->klass;
    D.24793 = D.24755->name_space;
    iftmp.73 = __builtin_strcmp (D.24793, "System");
    <D.24952>:
    D.22210 = iftmp.73;
  }
  if (D.22210 == 0) goto <D.24953>; else goto <D.24954>;
  <D.24953>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.24956>; else goto <D.24957>;
    <D.24956>:
    {
      const unsigned char * __s2;
      int __result;

      D.24754 = ref->vtable;
      D.24755 = D.24754->klass;
      __s2 = D.24755->name;
      D.24958 = "Byte[]";
      D.24959 = MEM[(const unsigned char *)D.24958];
      D.24960 = (int) D.24959;
      D.24961 = *__s2;
      D.24962 = (int) D.24961;
      __result = D.24960 - D.24962;
      {
        D.24963 = __s2_len != 0;
        D.24964 = __result == 0;
        D.24965 = D.24963 & D.24964;
        if (D.24965 != 0) goto <D.24966>; else goto <D.24967>;
        <D.24966>:
        D.24968 = &MEM[(void *)"Byte[]" + 1B];
        D.24969 = *D.24968;
        D.24970 = (int) D.24969;
        D.24971 = __s2 + 1;
        D.24972 = *D.24971;
        D.24973 = (int) D.24972;
        __result = D.24970 - D.24973;
        D.24974 = __s2_len > 1;
        D.24964 = __result == 0;
        D.24975 = D.24974 & D.24964;
        if (D.24975 != 0) goto <D.24976>; else goto <D.24977>;
        <D.24976>:
        D.24978 = &MEM[(void *)"Byte[]" + 2B];
        D.24979 = *D.24978;
        D.24980 = (int) D.24979;
        D.24981 = __s2 + 2;
        D.24982 = *D.24981;
        D.24983 = (int) D.24982;
        __result = D.24980 - D.24983;
        D.24984 = __s2_len > 2;
        D.24964 = __result == 0;
        D.24985 = D.24984 & D.24964;
        if (D.24985 != 0) goto <D.24986>; else goto <D.24987>;
        <D.24986>:
        D.24988 = &MEM[(void *)"Byte[]" + 3B];
        D.24989 = *D.24988;
        D.24990 = (int) D.24989;
        D.24991 = __s2 + 3;
        D.24992 = *D.24991;
        D.24993 = (int) D.24992;
        __result = D.24990 - D.24993;
        <D.24987>:
        <D.24977>:
        <D.24967>:
      }
      D.22218 = __result;
    }
    iftmp.74 = -D.22218;
    goto <D.24994>;
    <D.24957>:
    D.24754 = ref->vtable;
    D.24755 = D.24754->klass;
    D.24836 = D.24755->name;
    iftmp.74 = __builtin_strcmp (D.24836, "Byte[]");
    <D.24994>:
    D.22219 = iftmp.74;
  }
  if (D.22219 == 0) goto <D.24995>; else goto <D.24996>;
  <D.24995>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 9;
    if (__s2_len <= 3) goto <D.24998>; else goto <D.24999>;
    <D.24998>:
    {
      const unsigned char * __s2;
      int __result;

      D.24732 = o->vtable;
      D.24733 = D.24732->klass;
      __s2 = D.24733->name_space;
      D.25000 = "System.IO";
      D.25001 = MEM[(const unsigned char *)D.25000];
      D.25002 = (int) D.25001;
      D.25003 = *__s2;
      D.25004 = (int) D.25003;
      __result = D.25002 - D.25004;
      {
        D.25005 = __s2_len != 0;
        D.25006 = __result == 0;
        D.25007 = D.25005 & D.25006;
        if (D.25007 != 0) goto <D.25008>; else goto <D.25009>;
        <D.25008>:
        D.25010 = &MEM[(void *)"System.IO" + 1B];
        D.25011 = *D.25010;
        D.25012 = (int) D.25011;
        D.25013 = __s2 + 1;
        D.25014 = *D.25013;
        D.25015 = (int) D.25014;
        __result = D.25012 - D.25015;
        D.25016 = __s2_len > 1;
        D.25006 = __result == 0;
        D.25017 = D.25016 & D.25006;
        if (D.25017 != 0) goto <D.25018>; else goto <D.25019>;
        <D.25018>:
        D.25020 = &MEM[(void *)"System.IO" + 2B];
        D.25021 = *D.25020;
        D.25022 = (int) D.25021;
        D.25023 = __s2 + 2;
        D.25024 = *D.25023;
        D.25025 = (int) D.25024;
        __result = D.25022 - D.25025;
        D.25026 = __s2_len > 2;
        D.25006 = __result == 0;
        D.25027 = D.25026 & D.25006;
        if (D.25027 != 0) goto <D.25028>; else goto <D.25029>;
        <D.25028>:
        D.25030 = &MEM[(void *)"System.IO" + 3B];
        D.25031 = *D.25030;
        D.25032 = (int) D.25031;
        D.25033 = __s2 + 3;
        D.25034 = *D.25033;
        D.25035 = (int) D.25034;
        __result = D.25032 - D.25035;
        <D.25029>:
        <D.25019>:
        <D.25009>:
      }
      D.22227 = __result;
    }
    iftmp.75 = -D.22227;
    goto <D.25036>;
    <D.24999>:
    D.24732 = o->vtable;
    D.24733 = D.24732->klass;
    D.24879 = D.24733->name_space;
    iftmp.75 = __builtin_strcmp (D.24879, "System.IO");
    <D.25036>:
    D.22228 = iftmp.75;
  }
  if (D.22228 == 0) goto <D.25037>; else goto <D.25038>;
  <D.25037>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 12;
    if (__s2_len <= 3) goto <D.25040>; else goto <D.25041>;
    <D.25040>:
    {
      const unsigned char * __s2;
      int __result;

      D.24732 = o->vtable;
      D.24733 = D.24732->klass;
      __s2 = D.24733->name;
      D.25042 = "MemoryStream";
      D.25043 = MEM[(const unsigned char *)D.25042];
      D.25044 = (int) D.25043;
      D.25045 = *__s2;
      D.25046 = (int) D.25045;
      __result = D.25044 - D.25046;
      {
        D.25047 = __s2_len != 0;
        D.25048 = __result == 0;
        D.25049 = D.25047 & D.25048;
        if (D.25049 != 0) goto <D.25050>; else goto <D.25051>;
        <D.25050>:
        D.25052 = &MEM[(void *)"MemoryStream" + 1B];
        D.25053 = *D.25052;
        D.25054 = (int) D.25053;
        D.25055 = __s2 + 1;
        D.25056 = *D.25055;
        D.25057 = (int) D.25056;
        __result = D.25054 - D.25057;
        D.25058 = __s2_len > 1;
        D.25048 = __result == 0;
        D.25059 = D.25058 & D.25048;
        if (D.25059 != 0) goto <D.25060>; else goto <D.25061>;
        <D.25060>:
        D.25062 = &MEM[(void *)"MemoryStream" + 2B];
        D.25063 = *D.25062;
        D.25064 = (int) D.25063;
        D.25065 = __s2 + 2;
        D.25066 = *D.25065;
        D.25067 = (int) D.25066;
        __result = D.25064 - D.25067;
        D.25068 = __s2_len > 2;
        D.25048 = __result == 0;
        D.25069 = D.25068 & D.25048;
        if (D.25069 != 0) goto <D.25070>; else goto <D.25071>;
        <D.25070>:
        D.25072 = &MEM[(void *)"MemoryStream" + 3B];
        D.25073 = *D.25072;
        D.25074 = (int) D.25073;
        D.25075 = __s2 + 3;
        D.25076 = *D.25075;
        D.25077 = (int) D.25076;
        __result = D.25074 - D.25077;
        <D.25071>:
        <D.25061>:
        <D.25051>:
      }
      D.22236 = __result;
    }
    iftmp.76 = -D.22236;
    goto <D.25078>;
    <D.25041>:
    D.24732 = o->vtable;
    D.24733 = D.24732->klass;
    D.24922 = D.24733->name;
    iftmp.76 = __builtin_strcmp (D.24922, "MemoryStream");
    <D.25078>:
    D.22237 = iftmp.76;
  }
  if (D.22237 == 0) goto <D.25079>; else goto <D.25080>;
  <D.25079>:
  D.24739 = 1;
  return D.24739;
  <D.25080>:
  <D.25038>:
  <D.24996>:
  <D.24954>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 33;
    if (__s2_len <= 3) goto <D.25082>; else goto <D.25083>;
    <D.25082>:
    {
      const unsigned char * __s2;
      int __result;

      D.24754 = ref->vtable;
      D.24755 = D.24754->klass;
      __s2 = D.24755->name_space;
      D.25084 = "System.Runtime.Remoting.Messaging";
      D.25085 = MEM[(const unsigned char *)D.25084];
      D.25086 = (int) D.25085;
      D.25087 = *__s2;
      D.25088 = (int) D.25087;
      __result = D.25086 - D.25088;
      {
        D.25089 = __s2_len != 0;
        D.25090 = __result == 0;
        D.25091 = D.25089 & D.25090;
        if (D.25091 != 0) goto <D.25092>; else goto <D.25093>;
        <D.25092>:
        D.25094 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 1B];
        D.25095 = *D.25094;
        D.25096 = (int) D.25095;
        D.25097 = __s2 + 1;
        D.25098 = *D.25097;
        D.25099 = (int) D.25098;
        __result = D.25096 - D.25099;
        D.25100 = __s2_len > 1;
        D.25090 = __result == 0;
        D.25101 = D.25100 & D.25090;
        if (D.25101 != 0) goto <D.25102>; else goto <D.25103>;
        <D.25102>:
        D.25104 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 2B];
        D.25105 = *D.25104;
        D.25106 = (int) D.25105;
        D.25107 = __s2 + 2;
        D.25108 = *D.25107;
        D.25109 = (int) D.25108;
        __result = D.25106 - D.25109;
        D.25110 = __s2_len > 2;
        D.25090 = __result == 0;
        D.25111 = D.25110 & D.25090;
        if (D.25111 != 0) goto <D.25112>; else goto <D.25113>;
        <D.25112>:
        D.25114 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 3B];
        D.25115 = *D.25114;
        D.25116 = (int) D.25115;
        D.25117 = __s2 + 3;
        D.25118 = *D.25117;
        D.25119 = (int) D.25118;
        __result = D.25116 - D.25119;
        <D.25113>:
        <D.25103>:
        <D.25093>:
      }
      D.22245 = __result;
    }
    iftmp.77 = -D.22245;
    goto <D.25120>;
    <D.25083>:
    D.24754 = ref->vtable;
    D.24755 = D.24754->klass;
    D.24793 = D.24755->name_space;
    iftmp.77 = __builtin_strcmp (D.24793, "System.Runtime.Remoting.Messaging");
    <D.25120>:
    D.22246 = iftmp.77;
  }
  if (D.22246 == 0) goto <D.25121>; else goto <D.25122>;
  <D.25121>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 11;
    if (__s2_len <= 3) goto <D.25124>; else goto <D.25125>;
    <D.25124>:
    {
      const unsigned char * __s2;
      int __result;

      D.24754 = ref->vtable;
      D.24755 = D.24754->klass;
      __s2 = D.24755->name;
      D.25126 = "AsyncResult";
      D.25127 = MEM[(const unsigned char *)D.25126];
      D.25128 = (int) D.25127;
      D.25129 = *__s2;
      D.25130 = (int) D.25129;
      __result = D.25128 - D.25130;
      {
        D.25131 = __s2_len != 0;
        D.25132 = __result == 0;
        D.25133 = D.25131 & D.25132;
        if (D.25133 != 0) goto <D.25134>; else goto <D.25135>;
        <D.25134>:
        D.25136 = &MEM[(void *)"AsyncResult" + 1B];
        D.25137 = *D.25136;
        D.25138 = (int) D.25137;
        D.25139 = __s2 + 1;
        D.25140 = *D.25139;
        D.25141 = (int) D.25140;
        __result = D.25138 - D.25141;
        D.25142 = __s2_len > 1;
        D.25132 = __result == 0;
        D.25143 = D.25142 & D.25132;
        if (D.25143 != 0) goto <D.25144>; else goto <D.25145>;
        <D.25144>:
        D.25146 = &MEM[(void *)"AsyncResult" + 2B];
        D.25147 = *D.25146;
        D.25148 = (int) D.25147;
        D.25149 = __s2 + 2;
        D.25150 = *D.25149;
        D.25151 = (int) D.25150;
        __result = D.25148 - D.25151;
        D.25152 = __s2_len > 2;
        D.25132 = __result == 0;
        D.25153 = D.25152 & D.25132;
        if (D.25153 != 0) goto <D.25154>; else goto <D.25155>;
        <D.25154>:
        D.25156 = &MEM[(void *)"AsyncResult" + 3B];
        D.25157 = *D.25156;
        D.25158 = (int) D.25157;
        D.25159 = __s2 + 3;
        D.25160 = *D.25159;
        D.25161 = (int) D.25160;
        __result = D.25158 - D.25161;
        <D.25155>:
        <D.25145>:
        <D.25135>:
      }
      D.22254 = __result;
    }
    iftmp.78 = -D.22254;
    goto <D.25162>;
    <D.25125>:
    D.24754 = ref->vtable;
    D.24755 = D.24754->klass;
    D.24836 = D.24755->name;
    iftmp.78 = __builtin_strcmp (D.24836, "AsyncResult");
    <D.25162>:
    D.22255 = iftmp.78;
  }
  if (D.22255 == 0) goto <D.25163>; else goto <D.25164>;
  <D.25163>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.25166>; else goto <D.25167>;
    <D.25166>:
    {
      const unsigned char * __s2;
      int __result;

      D.24732 = o->vtable;
      D.24733 = D.24732->klass;
      __s2 = D.24733->name_space;
      D.24842 = "System";
      D.24843 = MEM[(const unsigned char *)D.24842];
      D.24844 = (int) D.24843;
      D.25168 = *__s2;
      D.25169 = (int) D.25168;
      __result = D.24844 - D.25169;
      {
        D.25170 = __s2_len != 0;
        D.25171 = __result == 0;
        D.25172 = D.25170 & D.25171;
        if (D.25172 != 0) goto <D.25173>; else goto <D.25174>;
        <D.25173>:
        D.24852 = &MEM[(void *)"System" + 1B];
        D.24853 = *D.24852;
        D.24854 = (int) D.24853;
        D.25175 = __s2 + 1;
        D.25176 = *D.25175;
        D.25177 = (int) D.25176;
        __result = D.24854 - D.25177;
        D.25178 = __s2_len > 1;
        D.25171 = __result == 0;
        D.25179 = D.25178 & D.25171;
        if (D.25179 != 0) goto <D.25180>; else goto <D.25181>;
        <D.25180>:
        D.24862 = &MEM[(void *)"System" + 2B];
        D.24863 = *D.24862;
        D.24864 = (int) D.24863;
        D.25182 = __s2 + 2;
        D.25183 = *D.25182;
        D.25184 = (int) D.25183;
        __result = D.24864 - D.25184;
        D.25185 = __s2_len > 2;
        D.25171 = __result == 0;
        D.25186 = D.25185 & D.25171;
        if (D.25186 != 0) goto <D.25187>; else goto <D.25188>;
        <D.25187>:
        D.24872 = &MEM[(void *)"System" + 3B];
        D.24873 = *D.24872;
        D.24874 = (int) D.24873;
        D.25189 = __s2 + 3;
        D.25190 = *D.25189;
        D.25191 = (int) D.25190;
        __result = D.24874 - D.25191;
        <D.25188>:
        <D.25181>:
        <D.25174>:
      }
      D.22263 = __result;
    }
    iftmp.79 = -D.22263;
    goto <D.25192>;
    <D.25167>:
    D.24732 = o->vtable;
    D.24733 = D.24732->klass;
    D.24879 = D.24733->name_space;
    iftmp.79 = __builtin_strcmp (D.24879, "System");
    <D.25192>:
    D.22264 = iftmp.79;
  }
  if (D.22264 == 0) goto <D.25193>; else goto <D.25194>;
  <D.25193>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 8;
    if (__s2_len <= 3) goto <D.25196>; else goto <D.25197>;
    <D.25196>:
    {
      const unsigned char * __s2;
      int __result;

      D.24732 = o->vtable;
      D.24733 = D.24732->klass;
      __s2 = D.24733->name;
      D.24885 = "Object[]";
      D.24886 = MEM[(const unsigned char *)D.24885];
      D.24887 = (int) D.24886;
      D.25198 = *__s2;
      D.25199 = (int) D.25198;
      __result = D.24887 - D.25199;
      {
        D.25200 = __s2_len != 0;
        D.25201 = __result == 0;
        D.25202 = D.25200 & D.25201;
        if (D.25202 != 0) goto <D.25203>; else goto <D.25204>;
        <D.25203>:
        D.24895 = &MEM[(void *)"Object[]" + 1B];
        D.24896 = *D.24895;
        D.24897 = (int) D.24896;
        D.25205 = __s2 + 1;
        D.25206 = *D.25205;
        D.25207 = (int) D.25206;
        __result = D.24897 - D.25207;
        D.25208 = __s2_len > 1;
        D.25201 = __result == 0;
        D.25209 = D.25208 & D.25201;
        if (D.25209 != 0) goto <D.25210>; else goto <D.25211>;
        <D.25210>:
        D.24905 = &MEM[(void *)"Object[]" + 2B];
        D.24906 = *D.24905;
        D.24907 = (int) D.24906;
        D.25212 = __s2 + 2;
        D.25213 = *D.25212;
        D.25214 = (int) D.25213;
        __result = D.24907 - D.25214;
        D.25215 = __s2_len > 2;
        D.25201 = __result == 0;
        D.25216 = D.25215 & D.25201;
        if (D.25216 != 0) goto <D.25217>; else goto <D.25218>;
        <D.25217>:
        D.24915 = &MEM[(void *)"Object[]" + 3B];
        D.24916 = *D.24915;
        D.24917 = (int) D.24916;
        D.25219 = __s2 + 3;
        D.25220 = *D.25219;
        D.25221 = (int) D.25220;
        __result = D.24917 - D.25221;
        <D.25218>:
        <D.25211>:
        <D.25204>:
      }
      D.22272 = __result;
    }
    iftmp.80 = -D.22272;
    goto <D.25222>;
    <D.25197>:
    D.24732 = o->vtable;
    D.24733 = D.24732->klass;
    D.24922 = D.24733->name;
    iftmp.80 = __builtin_strcmp (D.24922, "Object[]");
    <D.25222>:
    D.22273 = iftmp.80;
  }
  if (D.22273 == 0) goto <D.25223>; else goto <D.25224>;
  <D.25223>:
  D.25225 = mono_thread_pool_is_queue_array (o);
  if (D.25225 != 0) goto <D.25226>; else goto <D.25227>;
  <D.25226>:
  D.24739 = 1;
  return D.24739;
  <D.25227>:
  <D.25224>:
  <D.25194>:
  <D.25164>:
  <D.25122>:
  D.24739 = 0;
  return D.24739;
}


mono_class_has_parent_fast (struct MonoClass * klass, struct MonoClass * parent)
{
  gboolean D.25229;
  int iftmp.81;
  short unsigned int D.25233;
  short unsigned int D.25234;
  struct MonoClass * * D.25236;
  sizetype D.25237;
  sizetype D.25238;
  sizetype D.25239;
  struct MonoClass * * D.25240;
  struct MonoClass * D.25241;

  D.25233 = klass->idepth;
  D.25234 = parent->idepth;
  if (D.25233 >= D.25234) goto <D.25235>; else goto <D.25231>;
  <D.25235>:
  D.25236 = klass->supertypes;
  D.25234 = parent->idepth;
  D.25237 = (sizetype) D.25234;
  D.25238 = D.25237 + 1073741823;
  D.25239 = D.25238 * 4;
  D.25240 = D.25236 + D.25239;
  D.25241 = *D.25240;
  if (D.25241 == parent) goto <D.25242>; else goto <D.25231>;
  <D.25242>:
  iftmp.81 = 1;
  goto <D.25232>;
  <D.25231>:
  iftmp.81 = 0;
  <D.25232>:
  D.25229 = iftmp.81;
  return D.25229;
}


null_ephemerons_for_domain (struct MonoDomain * domain)
{
  struct MonoVTable * D.25247;
  struct EphemeronLinkNode * ephemeron_list.82;
  struct EphemeronLinkNode * current;
  struct EphemeronLinkNode * prev;

  current = ephemeron_list;
  prev = 0B;
  goto <D.23345>;
  <D.23344>:
  {
    struct MonoObject * object;

    object = current->array;
    if (object != 0B) goto <D.25246>; else goto <D.25244>;
    <D.25246>:
    D.25247 = object->vtable;
    if (D.25247 == 0B) goto <D.25248>; else goto <D.25244>;
    <D.25248>:
    {
      struct EphemeronLinkNode * tmp;

      tmp = current;
      if (prev != 0B) goto <D.25249>; else goto <D.25250>;
      <D.25249>:
      ephemeron_list.82 = current->next;
      prev->next = ephemeron_list.82;
      goto <D.25252>;
      <D.25250>:
      ephemeron_list.82 = current->next;
      ephemeron_list = ephemeron_list.82;
      <D.25252>:
      current = current->next;
      sgen_free_internal (tmp, 18);
    }
    goto <D.25245>;
    <D.25244>:
    prev = current;
    current = current->next;
    <D.25245>:
  }
  <D.23345>:
  if (current != 0B) goto <D.23344>; else goto <D.23346>;
  <D.23346>:
}


clear_domain_process_object (char * obj, struct MonoDomain * domain)
{
  struct MonoThreadsSync * D.25255;
  gboolean D.25260;
  gboolean remove;

  process_object_for_domain_clearing (obj, domain);
  remove = need_remove_object_for_domain (obj, domain);
  if (remove != 0) goto <D.25253>; else goto <D.25254>;
  <D.25253>:
  D.25255 = MEM[(struct MonoObject *)obj].synchronisation;
  if (D.25255 != 0B) goto <D.25256>; else goto <D.25257>;
  <D.25256>:
  {
    void * * dislink;

    dislink = mono_monitor_get_object_monitor_weak_link (obj);
    if (dislink != 0B) goto <D.25258>; else goto <D.25259>;
    <D.25258>:
    sgen_register_disappearing_link (0B, dislink, 0, 1);
    <D.25259>:
  }
  <D.25257>:
  <D.25254>:
  D.25260 = remove;
  return D.25260;
}


process_object_for_domain_clearing (char * start, struct MonoDomain * domain)
{
  unsigned int D.25262;
  unsigned int D.25263;
  struct MonoClass * D.25264;
  struct MonoClass * D.25265;
  struct MonoVTable * D.25268;
  struct MonoDomain * D.25269;
  struct MonoDomain * D.25270;
  _Bool D.25271;
  long int D.25272;
  long int D.25273;
  struct MonoClass * D.25276;
  int D.25277;
  unsigned int D.25284;
  unsigned int D.25285;
  struct MonoVTable * D.25287;
  struct MonoDomain * D.25288;
  struct FILE * gc_debug_file.83;
  struct GCVTable * vt;

  D.25262 = MEM[(mword *)start];
  D.25263 = D.25262 & 4294967292;
  vt = (struct GCVTable *) D.25263;
  D.25264 = vt->klass;
  D.25265 = mono_defaults.internal_thread_class;
  if (D.25264 == D.25265) goto <D.25266>; else goto <D.25267>;
  <D.25266>:
  D.25268 = MEM[(struct MonoObject *)start].vtable;
  D.25269 = D.25268->domain;
  D.25270 = mono_get_root_domain ();
  D.25271 = D.25269 != D.25270;
  D.25272 = (long int) D.25271;
  D.25273 = __builtin_expect (D.25272, 0);
  if (D.25273 != 0) goto <D.25274>; else goto <D.25275>;
  <D.25274>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 896, "mono_object_domain (start) == mono_get_root_domain ()");
  <D.25275>:
  <D.25267>:
  D.25264 = vt->klass;
  D.25276 = mono_defaults.real_proxy_class;
  D.25277 = mono_class_has_parent_fast (D.25264, D.25276);
  if (D.25277 != 0) goto <D.25278>; else goto <D.25279>;
  <D.25278>:
  {
    struct MonoObject * server;

    server = MEM[(struct MonoRealProxy *)start].unwrapped_server;
    if (server != 0B) goto <D.25282>; else goto <D.25283>;
    <D.25282>:
    D.25284 = MEM[(mword *)server];
    D.25285 = D.25284 & 4294967292;
    if (D.25285 == 0) goto <D.25280>; else goto <D.25286>;
    <D.25286>:
    D.25287 = server->vtable;
    D.25288 = D.25287->domain;
    if (D.25288 == domain) goto <D.25280>; else goto <D.25281>;
    <D.25280>:
    if (0 != 0) goto <D.25289>; else goto <D.25290>;
    <D.25289>:
    gc_debug_file.83 = gc_debug_file;
    fprintf (gc_debug_file.83, "Cleaning up remote pointer in %p to object %p\n", start, server);
    gc_debug_file.83 = gc_debug_file;
    fflush (gc_debug_file.83);
    <D.25290>:
    MEM[(struct MonoRealProxy *)start].unwrapped_server = 0B;
    <D.25281>:
    <D.25283>:
  }
  <D.25279>:
}


need_remove_object_for_domain (char * start, struct MonoDomain * domain)
{
  struct MonoVTable * D.25292;
  struct MonoDomain * D.25293;
  struct FILE * gc_debug_file.84;
  gboolean D.25299;

  D.25292 = MEM[(struct MonoObject *)start].vtable;
  D.25293 = D.25292->domain;
  if (D.25293 == domain) goto <D.25294>; else goto <D.25295>;
  <D.25294>:
  if (0 != 0) goto <D.25296>; else goto <D.25297>;
  <D.25296>:
  gc_debug_file.84 = gc_debug_file;
  fprintf (gc_debug_file.84, "Need to cleanup object %p\n", start);
  gc_debug_file.84 = gc_debug_file;
  fflush (gc_debug_file.84);
  <D.25297>:
  D.25299 = 1;
  return D.25299;
  <D.25295>:
  D.25299 = 0;
  return D.25299;
}


sgen_add_to_global_remset (void * ptr, void * obj)
{
  int D.25301;
  _Bool D.25302;
  long int D.25303;
  long int D.25304;
  int D.25307;
  int current_collection_generation.85;
  _Bool D.25311;
  long int D.25312;
  long int D.25313;
  int D.25319;
  _Bool D.25320;
  long int D.25321;
  long int D.25322;
  unsigned int D.25325;
  unsigned int D.25326;
  int iftmp.86;
  int D.25332;
  int D.25334;
  _Bool D.25336;
  long int D.25337;
  long int D.25338;
  int D.25342;
  void (*<T1b97>) (void *) D.25345;
  int do_pin_stats.87;
  _Bool D.25347;
  long int D.25348;
  long int D.25349;
  struct FILE * gc_debug_file.88;

  D.25301 = sgen_ptr_in_nursery (obj);
  D.25302 = D.25301 == 0;
  D.25303 = (long int) D.25302;
  D.25304 = __builtin_expect (D.25303, 0);
  if (D.25304 != 0) goto <D.25305>; else goto <D.25306>;
  <D.25305>:
  monoeg_g_log (0B, 4, "Target pointer of global remset must be in the nursery");
  <D.22685>:
  goto <D.22685>;
  <D.25306>:
  D.25307 = major_collector.is_concurrent;
  if (D.25307 == 0) goto <D.25308>; else goto <D.25309>;
  <D.25308>:
  current_collection_generation.85 = current_collection_generation;
  D.25311 = current_collection_generation.85 == -1;
  D.25312 = (long int) D.25311;
  D.25313 = __builtin_expect (D.25312, 0);
  if (D.25313 != 0) goto <D.25314>; else goto <D.25315>;
  <D.25314>:
  monoeg_g_log (0B, 4, "Global remsets can only be added during collections");
  <D.22686>:
  goto <D.22686>;
  <D.25315>:
  goto <D.25316>;
  <D.25309>:
  current_collection_generation.85 = current_collection_generation;
  if (current_collection_generation.85 == -1) goto <D.25317>; else goto <D.25318>;
  <D.25317>:
  D.25319 = sgen_concurrent_collection_in_progress ();
  D.25320 = D.25319 == 0;
  D.25321 = (long int) D.25320;
  D.25322 = __builtin_expect (D.25321, 0);
  if (D.25322 != 0) goto <D.25323>; else goto <D.25324>;
  <D.25323>:
  monoeg_g_log (0B, 4, "Global remsets outside of collection pauses can only be added by the concurrent collector");
  <D.22687>:
  goto <D.22687>;
  <D.25324>:
  <D.25318>:
  <D.25316>:
  D.25325 = MEM[(mword *)obj];
  D.25326 = D.25325 & 2;
  if (D.25326 == 0) goto <D.25327>; else goto <D.25328>;
  <D.25327>:
  D.25332 = sgen_minor_collector.is_split;
  if (D.25332 == 0) goto <D.25333>; else goto <D.25330>;
  <D.25333>:
  D.25334 = sgen_concurrent_collection_in_progress ();
  if (D.25334 == 0) goto <D.25335>; else goto <D.25330>;
  <D.25335>:
  iftmp.86 = 1;
  goto <D.25331>;
  <D.25330>:
  iftmp.86 = 0;
  <D.25331>:
  D.25336 = iftmp.86 != 0;
  D.25337 = (long int) D.25336;
  D.25338 = __builtin_expect (D.25337, 0);
  if (D.25338 != 0) goto <D.25339>; else goto <D.25340>;
  <D.25339>:
  monoeg_g_log (0B, 4, "Non-pinned objects can only remain in nursery if it is a split nursery");
  <D.22688>:
  goto <D.22688>;
  <D.25340>:
  goto <D.25341>;
  <D.25328>:
  D.25342 = sgen_cement_lookup_or_register (obj);
  if (D.25342 != 0) goto <D.25343>; else goto <D.25344>;
  <D.25343>:
  return;
  <D.25344>:
  <D.25341>:
  D.25345 = remset.record_pointer;
  D.25345 (ptr);
  do_pin_stats.87 = do_pin_stats;
  D.25347 = do_pin_stats.87 != 0;
  D.25348 = (long int) D.25347;
  D.25349 = __builtin_expect (D.25348, 0);
  if (D.25349 != 0) goto <D.25350>; else goto <D.25351>;
  <D.25350>:
  sgen_pin_stats_register_global_remset (obj);
  <D.25351>:
  if (0 != 0) goto <D.25352>; else goto <D.25353>;
  <D.25352>:
  gc_debug_file.88 = gc_debug_file;
  fprintf (gc_debug_file.88, "Adding global remset for %p\n", ptr);
  gc_debug_file.88 = gc_debug_file;
  fflush (gc_debug_file.88);
  <D.25353>:
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.25356;
  int sgen_nursery_bits.89;
  int D.25358;
  int D.25359;
  unsigned int D.25360;
  unsigned int p.90;
  unsigned int D.25362;
  char * sgen_nursery_start.91;
  unsigned int sgen_nursery_start.92;
  _Bool D.25365;

  sgen_nursery_bits.89 = sgen_nursery_bits;
  D.25358 = 1 << sgen_nursery_bits.89;
  D.25359 = -D.25358;
  D.25360 = (unsigned int) D.25359;
  p.90 = (unsigned int) p;
  D.25362 = D.25360 & p.90;
  sgen_nursery_start.91 = sgen_nursery_start;
  sgen_nursery_start.92 = (unsigned int) sgen_nursery_start.91;
  D.25365 = D.25362 == sgen_nursery_start.92;
  D.25356 = (gboolean) D.25365;
  return D.25356;
}


sgen_drain_gray_stack (int max_objs, struct ScanCopyContext ctx)
{
  struct GrayQueueSection * D.25369;
  int D.25373;
  _Bool D.25374;
  long int D.25375;
  long int D.25376;
  int D.25380;
  gboolean D.25383;
  struct FILE * gc_debug_file.93;
  const char * D.25387;
  const char * D.25398;
  char * obj;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  struct GrayQueue * queue;

  scan_func = ctx.scan_func;
  queue = ctx.queue;
  if (max_objs == -1) goto <D.25367>; else goto <D.25368>;
  <D.25367>:
  <D.22696>:
  D.25369 = queue->first;
  if (D.25369 == 0B) goto <D.25370>; else goto <D.25371>;
  <D.25370>:
  obj = 0B;
  goto <D.25372>;
  <D.25371>:
  D.25369 = queue->first;
  D.25373 = D.25369->end;
  D.25374 = D.25373 == 1;
  D.25375 = (long int) D.25374;
  D.25376 = __builtin_expect (D.25375, 0);
  if (D.25376 != 0) goto <D.25377>; else goto <D.25378>;
  <D.25377>:
  obj = sgen_gray_object_dequeue (queue);
  goto <D.25379>;
  <D.25378>:
  D.25369 = queue->first;
  D.25369 = queue->first;
  D.25373 = D.25369->end;
  D.25380 = D.25373 + -1;
  D.25369->end = D.25380;
  D.25373 = D.25369->end;
  obj = D.25369->objects[D.25373];
  <D.25379>:
  <D.25372>:
  if (obj == 0B) goto <D.25381>; else goto <D.25382>;
  <D.25381>:
  D.25383 = 1;
  return D.25383;
  <D.25382>:
  if (0 != 0) goto <D.25384>; else goto <D.25385>;
  <D.25384>:
  gc_debug_file.93 = gc_debug_file;
  D.25387 = safe_name (obj);
  fprintf (gc_debug_file.93, "Precise gray object scan %p (%s)\n", obj, D.25387);
  gc_debug_file.93 = gc_debug_file;
  fflush (gc_debug_file.93);
  <D.25385>:
  scan_func (obj, queue);
  goto <D.22696>;
  <D.25368>:
  {
    int i;

    <D.22701>:
    i = 0;
    goto <D.22699>;
    <D.22698>:
    D.25369 = queue->first;
    if (D.25369 == 0B) goto <D.25388>; else goto <D.25389>;
    <D.25388>:
    obj = 0B;
    goto <D.25390>;
    <D.25389>:
    D.25369 = queue->first;
    D.25373 = D.25369->end;
    D.25374 = D.25373 == 1;
    D.25375 = (long int) D.25374;
    D.25376 = __builtin_expect (D.25375, 0);
    if (D.25376 != 0) goto <D.25391>; else goto <D.25392>;
    <D.25391>:
    obj = sgen_gray_object_dequeue (queue);
    goto <D.25393>;
    <D.25392>:
    D.25369 = queue->first;
    D.25369 = queue->first;
    D.25373 = D.25369->end;
    D.25380 = D.25373 + -1;
    D.25369->end = D.25380;
    D.25373 = D.25369->end;
    obj = D.25369->objects[D.25373];
    <D.25393>:
    <D.25390>:
    if (obj == 0B) goto <D.25394>; else goto <D.25395>;
    <D.25394>:
    D.25383 = 1;
    return D.25383;
    <D.25395>:
    if (0 != 0) goto <D.25396>; else goto <D.25397>;
    <D.25396>:
    gc_debug_file.93 = gc_debug_file;
    D.25398 = safe_name (obj);
    fprintf (gc_debug_file.93, "Precise gray object scan %p (%s)\n", obj, D.25398);
    gc_debug_file.93 = gc_debug_file;
    fflush (gc_debug_file.93);
    <D.25397>:
    scan_func (obj, queue);
    i = i + 1;
    <D.22699>:
    if (i != max_objs) goto <D.22698>; else goto <D.22700>;
    <D.22700>:
    if (max_objs < 0) goto <D.22701>; else goto <D.22702>;
    <D.22702>:
    D.25383 = 0;
    return D.25383;
  }
}


sgen_pin_objects_in_section (struct GCMemSection * section, struct ScanCopyContext ctx)
{
  unsigned int num_entries.94;
  unsigned int D.25403;
  void * * D.25404;
  char * D.25405;
  char * D.25406;
  int num_entries;

  num_entries = section->pin_queue_num_entries;
  if (num_entries != 0) goto <D.25400>; else goto <D.25401>;
  <D.25400>:
  {
    void * * start;
    int reduced_to;

    start = section->pin_queue_start;
    num_entries.94 = (unsigned int) num_entries;
    D.25403 = num_entries.94 * 4;
    D.25404 = start + D.25403;
    D.25405 = section->data;
    D.25406 = section->next_data;
    reduced_to = pin_objects_from_addresses (section, start, D.25404, D.25405, D.25406, ctx);
    section->pin_queue_num_entries = reduced_to;
    if (reduced_to == 0) goto <D.25407>; else goto <D.25408>;
    <D.25407>:
    section->pin_queue_start = 0B;
    <D.25408>:
  }
  <D.25401>:
}


pin_objects_from_addresses (struct GCMemSection * section, void * * start, void * * end, void * start_nursery, void * end_nursery, struct ScanCopyContext ctx)
{
  _Bool D.25409;
  _Bool D.25410;
  _Bool D.25411;
  struct FILE * gc_debug_file.95;
  char * D.25421;
  int addr.96;
  char * D.25425;
  int D.25426;
  int D.25427;
  unsigned int idx.97;
  unsigned int D.25429;
  _Bool D.25430;
  long int D.25431;
  long int D.25432;
  char * * D.25435;
  unsigned int D.25436;
  char * * D.25437;
  _Bool D.25438;
  _Bool D.25439;
  _Bool D.25440;
  _Bool D.25443;
  _Bool D.25444;
  _Bool D.25445;
  void * D.25451;
  unsigned int search_start.98;
  unsigned int D.25455;
  unsigned int D.25456;
  unsigned int D.25457;
  unsigned int D.25458;
  struct MonoThreadsSync * D.25459;
  const char * D.25465;
  const char * D.25475;
  unsigned int D.25476;
  unsigned int D.25477;
  int iftmp.99;
  struct GrayQueueSection * D.25482;
  int D.25484;
  _Bool D.25485;
  long int D.25486;
  long int D.25487;
  int D.25491;
  int D.25492;
  int do_pin_stats.100;
  _Bool D.25494;
  long int D.25495;
  long int D.25496;
  unsigned int count.101;
  unsigned int D.25500;
  void * * D.25501;
  <unnamed type> D.25502;
  unsigned int D.25503;
  void * * D.25506;
  void * D.25507;
  long long int D.25508;
  long long int stat_pinned_objects.102;
  long long int stat_pinned_objects.103;
  int D.25511;
  void * last;
  int count;
  void * search_start;
  void * last_obj;
  size_t last_obj_size;
  void * addr;
  int idx;
  void * * definitely_pinned;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  struct SgenGrayQueue * queue;

  last = 0B;
  count = 0;
  last_obj = 0B;
  last_obj_size = 0;
  definitely_pinned = start;
  scan_func = ctx.scan_func;
  queue = ctx.queue;
  sgen_nursery_allocator_prepare_for_pinning ();
  goto <D.22721>;
  <D.22728>:
  addr = *start;
  D.25409 = addr != last;
  D.25410 = addr >= start_nursery;
  D.25411 = D.25409 & D.25410;
  if (D.25411 != 0) goto <D.25412>; else goto <D.25413>;
  <D.25412>:
  if (addr < end_nursery) goto <D.25414>; else goto <D.25415>;
  <D.25414>:
  if (0 != 0) goto <D.25416>; else goto <D.25417>;
  <D.25416>:
  gc_debug_file.95 = gc_debug_file;
  fprintf (gc_debug_file.95, "Considering pinning addr %p\n", addr);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.25417>:
  if (addr >= last_obj) goto <D.25419>; else goto <D.25420>;
  <D.25419>:
  D.25421 = last_obj + last_obj_size;
  if (D.25421 > addr) goto <D.25422>; else goto <D.25423>;
  <D.25422>:
  start = start + 4;
  // predicted unlikely by continue predictor.
  goto <D.22721>;
  <D.25423>:
  <D.25420>:
  addr.96 = (int) addr;
  D.25425 = section->data;
  D.25426 = (int) D.25425;
  D.25427 = addr.96 - D.25426;
  idx = D.25427 / 8192;
  idx.97 = (unsigned int) idx;
  D.25429 = section->num_scan_start;
  D.25430 = idx.97 >= D.25429;
  D.25431 = (long int) D.25430;
  D.25432 = __builtin_expect (D.25431, 0);
  if (D.25432 != 0) goto <D.25433>; else goto <D.25434>;
  <D.25433>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1246, "idx < section->num_scan_start");
  <D.25434>:
  D.25435 = section->scan_starts;
  idx.97 = (unsigned int) idx;
  D.25436 = idx.97 * 4;
  D.25437 = D.25435 + D.25436;
  search_start = *D.25437;
  D.25438 = search_start == 0B;
  D.25439 = search_start > addr;
  D.25440 = D.25438 | D.25439;
  if (D.25440 != 0) goto <D.25441>; else goto <D.25442>;
  <D.25441>:
  goto <D.22724>;
  <D.22723>:
  idx = idx + -1;
  D.25435 = section->scan_starts;
  idx.97 = (unsigned int) idx;
  D.25436 = idx.97 * 4;
  D.25437 = D.25435 + D.25436;
  search_start = *D.25437;
  D.25443 = search_start != 0B;
  D.25444 = search_start <= addr;
  D.25445 = D.25443 & D.25444;
  if (D.25445 != 0) goto <D.22722>; else goto <D.25446>;
  <D.25446>:
  <D.22724>:
  if (idx != 0) goto <D.22723>; else goto <D.22722>;
  <D.22722>:
  D.25438 = search_start == 0B;
  D.25439 = search_start > addr;
  D.25440 = D.25438 | D.25439;
  if (D.25440 != 0) goto <D.25447>; else goto <D.25448>;
  <D.25447>:
  search_start = start_nursery;
  <D.25448>:
  <D.25442>:
  if (search_start < last_obj) goto <D.25449>; else goto <D.25450>;
  <D.25449>:
  search_start = last_obj + last_obj_size;
  <D.25450>:
  <D.22727>:
  D.25451 = MEM[(void * *)search_start];
  if (D.25451 == 0B) goto <D.25452>; else goto <D.25453>;
  <D.25452>:
  search_start.98 = (unsigned int) search_start;
  D.25455 = search_start.98 + 11;
  D.25456 = D.25455 & 4294967288;
  search_start = (void *) D.25456;
  // predicted unlikely by continue predictor.
  goto <D.22725>;
  <D.25453>:
  last_obj = search_start;
  D.25457 = sgen_safe_object_get_size (search_start);
  D.25458 = D.25457 + 7;
  last_obj_size = D.25458 & 4294967288;
  D.25459 = MEM[(struct MonoObject *)last_obj].synchronisation;
  if (D.25459 == 4294967295B) goto <D.25460>; else goto <D.25461>;
  <D.25460>:
  goto <D.25462>;
  <D.25461>:
  if (0 != 0) goto <D.25463>; else goto <D.25464>;
  <D.25463>:
  gc_debug_file.95 = gc_debug_file;
  D.25465 = safe_name (last_obj);
  fprintf (gc_debug_file.95, "Pinned try match %p (%s), size %zd\n", last_obj, D.25465, last_obj_size);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.25464>:
  if (addr >= search_start) goto <D.25466>; else goto <D.25467>;
  <D.25466>:
  D.25421 = last_obj + last_obj_size;
  if (D.25421 > addr) goto <D.25468>; else goto <D.25469>;
  <D.25468>:
  if (scan_func != 0B) goto <D.25470>; else goto <D.25471>;
  <D.25470>:
  scan_func (search_start, queue);
  goto <D.25472>;
  <D.25471>:
  if (0 != 0) goto <D.25473>; else goto <D.25474>;
  <D.25473>:
  gc_debug_file.95 = gc_debug_file;
  D.25451 = MEM[(void * *)search_start];
  D.25475 = safe_name (search_start);
  fprintf (gc_debug_file.95, "Pinned object %p, vtable %p (%s), count %d\n\n", search_start, D.25451, D.25475, count);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.25474>:
  D.25476 = MEM[(mword *)search_start];
  D.25477 = D.25476 | 2;
  MEM[(mword *)search_start] = D.25477;
  D.25482 = queue->first;
  if (D.25482 == 0B) goto <D.25479>; else goto <D.25483>;
  <D.25483>:
  D.25482 = queue->first;
  D.25484 = D.25482->end;
  if (D.25484 == 125) goto <D.25479>; else goto <D.25480>;
  <D.25479>:
  iftmp.99 = 1;
  goto <D.25481>;
  <D.25480>:
  iftmp.99 = 0;
  <D.25481>:
  D.25485 = iftmp.99 != 0;
  D.25486 = (long int) D.25485;
  D.25487 = __builtin_expect (D.25486, 0);
  if (D.25487 != 0) goto <D.25488>; else goto <D.25489>;
  <D.25488>:
  sgen_gray_object_enqueue (queue, search_start);
  goto <D.25490>;
  <D.25489>:
  D.25482 = queue->first;
  D.25482 = queue->first;
  D.25484 = D.25482->end;
  D.25491 = D.25484;
  D.25492 = D.25491 + 1;
  D.25482->end = D.25492;
  D.25482->objects[D.25491] = search_start;
  <D.25490>:
  __builtin_prefetch (search_start);
  do_pin_stats.100 = do_pin_stats;
  D.25494 = do_pin_stats.100 != 0;
  D.25495 = (long int) D.25494;
  D.25496 = __builtin_expect (D.25495, 0);
  if (D.25496 != 0) goto <D.25497>; else goto <D.25498>;
  <D.25497>:
  sgen_pin_stats_register_object (search_start, last_obj_size);
  <D.25498>:
  count.101 = (unsigned int) count;
  D.25500 = count.101 * 4;
  D.25501 = definitely_pinned + D.25500;
  *D.25501 = search_start;
  count = count + 1;
  <D.25472>:
  goto <D.22726>;
  <D.25469>:
  <D.25467>:
  <D.25462>:
  search_start = search_start + last_obj_size;
  <D.22725>:
  if (search_start <= addr) goto <D.22727>; else goto <D.22726>;
  <D.22726>:
  last = addr;
  <D.25415>:
  <D.25413>:
  start = start + 4;
  <D.22721>:
  if (start < end) goto <D.22728>; else goto <D.22729>;
  <D.22729>:
  D.25502 = mono_profiler_get_events ();
  D.25503 = D.25502 & 1048576;
  if (D.25503 != 0) goto <D.25504>; else goto <D.25505>;
  <D.25504>:
  {
    struct GCRootReport report;

    try
      {
        report.count = 0;
        idx = 0;
        goto <D.22732>;
        <D.22731>:
        idx.97 = (unsigned int) idx;
        D.25436 = idx.97 * 4;
        D.25506 = definitely_pinned + D.25436;
        D.25507 = *D.25506;
        add_profile_gc_root (&report, D.25507, 260, 0);
        idx = idx + 1;
        <D.22732>:
        if (idx < count) goto <D.22731>; else goto <D.22733>;
        <D.22733>:
        notify_gc_roots (&report);
      }
    finally
      {
        report = {CLOBBER};
      }
  }
  <D.25505>:
  D.25508 = (long long int) count;
  stat_pinned_objects.102 = stat_pinned_objects;
  stat_pinned_objects.103 = D.25508 + stat_pinned_objects.102;
  stat_pinned_objects = stat_pinned_objects.103;
  D.25511 = count;
  return D.25511;
}


add_profile_gc_root (struct GCRootReport * report, void * object, int rtype, uintptr_t extra_info)
{
  int D.25513;
  int D.25516;
  int D.25517;
  unsigned int D.25518;
  unsigned int D.25519;
  struct MonoVTable * D.25520;
  struct MonoClass * D.25521;
  unsigned int D.25522;

  D.25513 = report->count;
  if (D.25513 == 32) goto <D.25514>; else goto <D.25515>;
  <D.25514>:
  notify_gc_roots (report);
  <D.25515>:
  D.25513 = report->count;
  report->objects[D.25513] = object;
  D.25513 = report->count;
  report->root_types[D.25513] = rtype;
  D.25513 = report->count;
  D.25516 = D.25513;
  D.25517 = D.25516 + 1;
  report->count = D.25517;
  D.25518 = MEM[(mword *)object];
  D.25519 = D.25518 & 4294967292;
  D.25520 = (struct MonoVTable *) D.25519;
  D.25521 = D.25520->klass;
  D.25522 = (unsigned int) D.25521;
  report->extra_info[D.25516] = D.25522;
}


notify_gc_roots (struct GCRootReport * report)
{
  int D.25523;
  void *[32] * D.25526;
  int[32] * D.25527;
  uintptr_t[32] * D.25528;

  D.25523 = report->count;
  if (D.25523 == 0) goto <D.25524>; else goto <D.25525>;
  <D.25524>:
  return;
  <D.25525>:
  D.25523 = report->count;
  D.25526 = &report->objects;
  D.25527 = &report->root_types;
  D.25528 = &report->extra_info;
  mono_profiler_gc_roots (D.25523, D.25526, D.25527, D.25528);
  report->count = 0;
}


sgen_pin_object (void * object, struct GrayQueue * queue)
{
  int concurrent_collection_in_progress.104;
  _Bool D.25531;
  long int D.25532;
  long int D.25533;
  int D.25536;
  unsigned int objects_pinned.105;
  unsigned int objects_pinned.106;
  unsigned int D.25542;
  unsigned int D.25543;
  int do_pin_stats.107;
  _Bool D.25545;
  long int D.25546;
  long int D.25547;
  unsigned int D.25550;
  int iftmp.108;
  struct GrayQueueSection * D.25555;
  int D.25557;
  _Bool D.25558;
  long int D.25559;
  long int D.25560;
  int D.25564;
  int D.25565;

  concurrent_collection_in_progress.104 = concurrent_collection_in_progress;
  D.25531 = concurrent_collection_in_progress.104 != 0;
  D.25532 = (long int) D.25531;
  D.25533 = __builtin_expect (D.25532, 0);
  if (D.25533 != 0) goto <D.25534>; else goto <D.25535>;
  <D.25534>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1355, "!concurrent_collection_in_progress");
  <D.25535>:
  D.25536 = sgen_collection_is_parallel ();
  if (D.25536 != 0) goto <D.25537>; else goto <D.25538>;
  <D.25537>:
  pthread_mutex_lock (&pin_queue_mutex);
  sgen_pin_stage_ptr (object);
  objects_pinned.105 = objects_pinned;
  objects_pinned.106 = objects_pinned.105 + 1;
  objects_pinned = objects_pinned.106;
  pthread_mutex_unlock (&pin_queue_mutex);
  goto <D.25541>;
  <D.25538>:
  D.25542 = MEM[(mword *)object];
  D.25543 = D.25542 | 2;
  MEM[(mword *)object] = D.25543;
  sgen_pin_stage_ptr (object);
  objects_pinned.105 = objects_pinned;
  objects_pinned.106 = objects_pinned.105 + 1;
  objects_pinned = objects_pinned.106;
  do_pin_stats.107 = do_pin_stats;
  D.25545 = do_pin_stats.107 != 0;
  D.25546 = (long int) D.25545;
  D.25547 = __builtin_expect (D.25546, 0);
  if (D.25547 != 0) goto <D.25548>; else goto <D.25549>;
  <D.25548>:
  D.25550 = sgen_safe_object_get_size (object);
  sgen_pin_stats_register_object (object, D.25550);
  <D.25549>:
  <D.25541>:
  D.25555 = queue->first;
  if (D.25555 == 0B) goto <D.25552>; else goto <D.25556>;
  <D.25556>:
  D.25555 = queue->first;
  D.25557 = D.25555->end;
  if (D.25557 == 125) goto <D.25552>; else goto <D.25553>;
  <D.25552>:
  iftmp.108 = 1;
  goto <D.25554>;
  <D.25553>:
  iftmp.108 = 0;
  <D.25554>:
  D.25558 = iftmp.108 != 0;
  D.25559 = (long int) D.25558;
  D.25560 = __builtin_expect (D.25559, 0);
  if (D.25560 != 0) goto <D.25561>; else goto <D.25562>;
  <D.25561>:
  sgen_gray_object_enqueue (queue, object);
  goto <D.25563>;
  <D.25562>:
  D.25555 = queue->first;
  D.25555 = queue->first;
  D.25557 = D.25555->end;
  D.25564 = D.25557;
  D.25565 = D.25564 + 1;
  D.25555->end = D.25565;
  D.25555->objects[D.25564] = object;
  <D.25563>:
  __builtin_prefetch (object);
}


sgen_parallel_pin_or_update (void * * ptr, void * obj, struct MonoVTable * vt, struct SgenGrayQueue * queue)
{
  int D.25566;
  unsigned int vt.109;
  unsigned int D.25570;
  void * D.25571;
  void * D.25572;
  void (*<T35c3>) (char *, struct SgenGrayQueue *) D.25576;
  unsigned int D.25577;
  unsigned int D.25580;
  void * D.25581;
  unsigned int D.25582;

  <D.22754>:
  {
    mword vtable_word;
    gboolean major_pinned;

    major_pinned = 0;
    D.25566 = sgen_ptr_in_nursery (obj);
    if (D.25566 != 0) goto <D.25567>; else goto <D.25568>;
    <D.25567>:
    vt.109 = (unsigned int) vt;
    D.25570 = vt.109 | 2;
    D.25571 = (void *) D.25570;
    D.25572 = InterlockedCompareExchangePointer (obj, D.25571, vt);
    if (D.25572 == vt) goto <D.25573>; else goto <D.25574>;
    <D.25573>:
    sgen_pin_object (obj, queue);
    goto <D.22753>;
    <D.25574>:
    goto <D.25575>;
    <D.25568>:
    D.25576 = major_collector.pin_major_object;
    D.25576 (obj, queue);
    major_pinned = 1;
    <D.25575>:
    vtable_word = MEM[(mword *)obj];
    D.25577 = vtable_word & 1;
    if (D.25577 != 0) goto <D.25578>; else goto <D.25579>;
    <D.25578>:
    D.25580 = vtable_word & 4294967292;
    D.25581 = (void *) D.25580;
    *ptr = D.25581;
    goto <D.22753>;
    <D.25579>:
    D.25582 = vtable_word & 2;
    if (D.25582 != 0) goto <D.22753>; else goto <D.25583>;
    <D.25583>:
    if (major_pinned != 0) goto <D.22753>; else goto <D.25584>;
    <D.25584>:
  }
  goto <D.22754>;
  <D.22753>:
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.25585;
  unsigned int comp.110;
  unsigned int exch.111;
  unsigned int D.25588;

  comp.110 = (unsigned int) comp;
  exch.111 = (unsigned int) exch;
  D.25588 = __sync_val_compare_and_swap_4 (dest, comp.110, exch.111);
  D.25585 = (void *) D.25588;
  return D.25585;
}


sgen_sort_addresses (void * * array, int size)
{
  int D.25590;
  unsigned int parent.112;
  unsigned int D.25592;
  void * * D.25593;
  void * D.25594;
  unsigned int child.113;
  unsigned int D.25596;
  void * * D.25597;
  void * D.25598;
  unsigned int i.114;
  unsigned int D.25601;
  void * * D.25602;
  void * D.25603;
  int D.25604;
  unsigned int child.115;
  unsigned int D.25608;
  void * * D.25609;
  void * D.25610;
  sizetype child.116;
  sizetype D.25612;
  sizetype D.25613;
  void * * D.25614;
  void * D.25615;
  unsigned int root.117;
  unsigned int D.25619;
  void * * D.25620;
  void * D.25621;
  int i;
  void * tmp;

  i = 1;
  goto <D.22767>;
  <D.22766>:
  {
    int child;

    child = i;
    goto <D.22765>;
    <D.22764>:
    {
      int parent;

      D.25590 = child + -1;
      parent = D.25590 / 2;
      parent.112 = (unsigned int) parent;
      D.25592 = parent.112 * 4;
      D.25593 = array + D.25592;
      D.25594 = *D.25593;
      child.113 = (unsigned int) child;
      D.25596 = child.113 * 4;
      D.25597 = array + D.25596;
      D.25598 = *D.25597;
      if (D.25594 >= D.25598) goto <D.22763>; else goto <D.25599>;
      <D.25599>:
      parent.112 = (unsigned int) parent;
      D.25592 = parent.112 * 4;
      D.25593 = array + D.25592;
      tmp = *D.25593;
      parent.112 = (unsigned int) parent;
      D.25592 = parent.112 * 4;
      D.25593 = array + D.25592;
      child.113 = (unsigned int) child;
      D.25596 = child.113 * 4;
      D.25597 = array + D.25596;
      D.25598 = *D.25597;
      *D.25593 = D.25598;
      child.113 = (unsigned int) child;
      D.25596 = child.113 * 4;
      D.25597 = array + D.25596;
      *D.25597 = tmp;
      child = parent;
    }
    <D.22765>:
    if (child > 0) goto <D.22764>; else goto <D.22763>;
    <D.22763>:
  }
  i = i + 1;
  <D.22767>:
  if (i < size) goto <D.22766>; else goto <D.22768>;
  <D.22768>:
  i = size + -1;
  goto <D.22776>;
  <D.22775>:
  {
    int end;
    int root;

    i.114 = (unsigned int) i;
    D.25601 = i.114 * 4;
    D.25602 = array + D.25601;
    tmp = *D.25602;
    i.114 = (unsigned int) i;
    D.25601 = i.114 * 4;
    D.25602 = array + D.25601;
    D.25603 = *array;
    *D.25602 = D.25603;
    *array = tmp;
    end = i + -1;
    root = 0;
    goto <D.22774>;
    <D.22773>:
    {
      int child;

      D.25604 = root * 2;
      child = D.25604 + 1;
      if (child < end) goto <D.25605>; else goto <D.25606>;
      <D.25605>:
      child.115 = (unsigned int) child;
      D.25608 = child.115 * 4;
      D.25609 = array + D.25608;
      D.25610 = *D.25609;
      child.116 = (sizetype) child;
      D.25612 = child.116 + 1;
      D.25613 = D.25612 * 4;
      D.25614 = array + D.25613;
      D.25615 = *D.25614;
      if (D.25610 < D.25615) goto <D.25616>; else goto <D.25617>;
      <D.25616>:
      child = child + 1;
      <D.25617>:
      <D.25606>:
      root.117 = (unsigned int) root;
      D.25619 = root.117 * 4;
      D.25620 = array + D.25619;
      D.25621 = *D.25620;
      child.115 = (unsigned int) child;
      D.25608 = child.115 * 4;
      D.25609 = array + D.25608;
      D.25610 = *D.25609;
      if (D.25621 >= D.25610) goto <D.22772>; else goto <D.25622>;
      <D.25622>:
      root.117 = (unsigned int) root;
      D.25619 = root.117 * 4;
      D.25620 = array + D.25619;
      tmp = *D.25620;
      root.117 = (unsigned int) root;
      D.25619 = root.117 * 4;
      D.25620 = array + D.25619;
      child.115 = (unsigned int) child;
      D.25608 = child.115 * 4;
      D.25609 = array + D.25608;
      D.25610 = *D.25609;
      *D.25620 = D.25610;
      child.115 = (unsigned int) child;
      D.25608 = child.115 * 4;
      D.25609 = array + D.25608;
      *D.25609 = tmp;
      root = child;
    }
    <D.22774>:
    D.25604 = root * 2;
    if (D.25604 < end) goto <D.22773>; else goto <D.22772>;
    <D.22772>:
  }
  i = i + -1;
  <D.22776>:
  if (i > 0) goto <D.22775>; else goto <D.22777>;
  <D.22777>:
}


sgen_update_heap_boundaries (mword low, mword high)
{
  void * low.118;
  void * old.119;
  void * D.25626;
  void * high.120;
  void * D.25629;
  mword old;

  <D.22874>:
  old = lowest_heap_address;
  if (low >= old) goto <D.22873>; else goto <D.25623>;
  <D.25623>:
  low.118 = (void *) low;
  old.119 = (void *) old;
  D.25626 = InterlockedCompareExchangePointer (&lowest_heap_address, low.118, old.119);
  old.119 = (void *) old;
  if (D.25626 != old.119) goto <D.22874>; else goto <D.22873>;
  <D.22873>:
  <D.22876>:
  old = highest_heap_address;
  if (high <= old) goto <D.22875>; else goto <D.25627>;
  <D.25627>:
  high.120 = (void *) high;
  old.119 = (void *) old;
  D.25629 = InterlockedCompareExchangePointer (&highest_heap_address, high.120, old.119);
  old.119 = (void *) old;
  if (D.25629 != old.119) goto <D.22876>; else goto <D.22875>;
  <D.22875>:
}


mono_gc_get_nursery (int * shift_bits, size_t * size)
{
  int sgen_nursery_size.121;
  unsigned int sgen_nursery_size.122;
  int sgen_nursery_bits.123;
  void * D.25633;

  sgen_nursery_size.121 = sgen_nursery_size;
  sgen_nursery_size.122 = (unsigned int) sgen_nursery_size.121;
  *size = sgen_nursery_size.122;
  sgen_nursery_bits.123 = sgen_nursery_bits;
  *shift_bits = sgen_nursery_bits.123;
  D.25633 = sgen_get_nursery_start ();
  return D.25633;
}


sgen_get_nursery_start ()
{
  char * D.25635;

  D.25635 = sgen_nursery_start;
  return D.25635;
}


mono_gc_set_current_thread_appdomain (struct MonoDomain * domain)
{
  _Bool D.25639;
  long int D.25640;
  long int D.25641;
  struct SgenThreadInfo * info;

  info = mono_thread_info_current ();
  if (domain != 0B) goto <D.25637>; else goto <D.25638>;
  <D.25637>:
  D.25639 = info == 0B;
  D.25640 = (long int) D.25639;
  D.25641 = __builtin_expect (D.25640, 0);
  if (D.25641 != 0) goto <D.25642>; else goto <D.25643>;
  <D.25642>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1733, "info");
  <D.25643>:
  info->stopped_domain = domain;
  <D.25638>:
}


mono_gc_precise_stack_mark_enabled ()
{
  gboolean D.25644;
  int conservative_stack_mark.124;
  _Bool D.25646;

  conservative_stack_mark.124 = conservative_stack_mark;
  D.25646 = conservative_stack_mark.124 == 0;
  D.25644 = (gboolean) D.25646;
  return D.25644;
}


mono_gc_get_logfile ()
{
  struct FILE * D.25648;

  D.25648 = gc_debug_file;
  return D.25648;
}


sgen_generation_name (int generation)
{
  const char * D.25650;

  D.25650 = generation_name (generation);
  return D.25650;
}


generation_name (int generation)
{
  const char * D.25652;

  switch (generation) <default: <D.22978>, case 0: <D.22976>, case 1: <D.22977>>
  <D.22976>:
  D.25652 = "nursery";
  return D.25652;
  <D.22977>:
  D.25652 = "old";
  return D.25652;
  <D.22978>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1869);
}


sgen_get_current_object_ops ()
{
  struct SgenObjectOperations * D.25654;

  D.25654 = &current_object_ops;
  return D.25654;
}


sgen_check_section_scan_starts (struct GCMemSection * section)
{
  char * * D.25656;
  unsigned int i.125;
  unsigned int D.25658;
  char * * D.25659;
  char * D.25660;
  unsigned int D.25663;
  _Bool D.25664;
  long int D.25665;
  long int D.25666;
  unsigned int D.25669;
  int i;

  i = 0;
  goto <D.23010>;
  <D.23009>:
  D.25656 = section->scan_starts;
  i.125 = (unsigned int) i;
  D.25658 = i.125 * 4;
  D.25659 = D.25656 + D.25658;
  D.25660 = *D.25659;
  if (D.25660 != 0B) goto <D.25661>; else goto <D.25662>;
  <D.25661>:
  {
    guint size;

    D.25656 = section->scan_starts;
    i.125 = (unsigned int) i;
    D.25658 = i.125 * 4;
    D.25659 = D.25656 + D.25658;
    D.25660 = *D.25659;
    size = sgen_safe_object_get_size (D.25660);
    D.25663 = size + 4294967288;
    D.25664 = D.25663 > 7992;
    D.25665 = (long int) D.25664;
    D.25666 = __builtin_expect (D.25665, 0);
    if (D.25666 != 0) goto <D.25667>; else goto <D.25668>;
    <D.25667>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2034, "size >= sizeof (MonoObject) && size <= MAX_SMALL_OBJ_SIZE");
    <D.25668>:
  }
  <D.25662>:
  i = i + 1;
  <D.23010>:
  i.125 = (unsigned int) i;
  D.25669 = section->num_scan_start;
  if (i.125 < D.25669) goto <D.23009>; else goto <D.23011>;
  <D.23011>:
}


sgen_dump_occupied (char * start, char * end, char * section_start)
{
  struct FILE * heap_dump_file.126;
  int start.127;
  int section_start.128;
  int D.25673;
  int end.129;
  int D.25675;

  heap_dump_file.126 = heap_dump_file;
  start.127 = (int) start;
  section_start.128 = (int) section_start;
  D.25673 = start.127 - section_start.128;
  end.129 = (int) end;
  start.127 = (int) start;
  D.25675 = end.129 - start.127;
  fprintf (heap_dump_file.126, "<occupied offset=\"%td\" size=\"%td\"/>\n", D.25673, D.25675);
}


fprintf (struct FILE * restrict __stream, const char * restrict __fmt)
{
  int D.25676;

  D.25676 = __fprintf_chk (__stream, 1, __fmt, __builtin_va_arg_pack ());
  return D.25676;
}


sgen_dump_section (struct GCMemSection * section, const char * type)
{
  char * D.25678;
  unsigned int D.25679;
  struct FILE * heap_dump_file.130;
  void * D.25681;
  char * D.25686;
  _Bool D.25687;
  long int D.25688;
  long int D.25689;
  unsigned int D.25694;
  unsigned int D.25695;
  unsigned int D.25696;
  unsigned int D.25697;
  char * start;
  char * end;
  char * occ_start;
  struct GCVTable * vt;
  char * old_start;

  start = section->data;
  D.25678 = section->data;
  D.25679 = section->size;
  end = D.25678 + D.25679;
  occ_start = 0B;
  old_start = 0B;
  heap_dump_file.130 = heap_dump_file;
  D.25679 = section->size;
  fprintf (heap_dump_file.130, "<section type=\"%s\" size=\"%lu\">\n", type, D.25679);
  goto <D.23051>;
  <D.23052>:
  {
    guint size;
    struct MonoClass * class;

    D.25681 = MEM[(void * *)start];
    if (D.25681 == 0B) goto <D.25682>; else goto <D.25683>;
    <D.25682>:
    if (occ_start != 0B) goto <D.25684>; else goto <D.25685>;
    <D.25684>:
    D.25678 = section->data;
    sgen_dump_occupied (occ_start, start, D.25678);
    occ_start = 0B;
    <D.25685>:
    start = start + 4;
    // predicted unlikely by continue predictor.
    goto <D.23051>;
    <D.25683>:
    D.25686 = section->next_data;
    D.25687 = D.25686 <= start;
    D.25688 = (long int) D.25687;
    D.25689 = __builtin_expect (D.25688, 0);
    if (D.25689 != 0) goto <D.25690>; else goto <D.25691>;
    <D.25690>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2088, "start < section->next_data");
    <D.25691>:
    if (occ_start == 0B) goto <D.25692>; else goto <D.25693>;
    <D.25692>:
    occ_start = start;
    <D.25693>:
    D.25694 = MEM[(mword *)start];
    D.25695 = D.25694 & 4294967292;
    vt = (struct GCVTable *) D.25695;
    class = vt->klass;
    D.25696 = sgen_safe_object_get_size (start);
    D.25697 = D.25696 + 7;
    size = D.25697 & 4294967288;
    old_start = start;
    start = start + size;
  }
  <D.23051>:
  if (start < end) goto <D.23052>; else goto <D.23053>;
  <D.23053>:
  if (occ_start != 0B) goto <D.25698>; else goto <D.25699>;
  <D.25698>:
  D.25678 = section->data;
  sgen_dump_occupied (occ_start, start, D.25678);
  <D.25699>:
  heap_dump_file.130 = heap_dump_file;
  fprintf (heap_dump_file.130, "</section>\n");
}


sgen_register_moved_object (void * obj, void * destination)
{
  <unnamed type> mono_profiler_events.131;
  unsigned int D.25701;
  _Bool D.25702;
  long int D.25703;
  long int D.25704;
  int D.25707;
  _Bool D.25708;
  long int D.25709;
  long int D.25710;
  int moved_objects_idx.132;
  int moved_objects_idx.133;
  int moved_objects_idx.134;
  int moved_objects_idx.135;
  int moved_objects_idx.136;

  mono_profiler_events.131 = mono_profiler_events;
  D.25701 = mono_profiler_events.131 & 524288;
  D.25702 = D.25701 == 0;
  D.25703 = (long int) D.25702;
  D.25704 = __builtin_expect (D.25703, 0);
  if (D.25704 != 0) goto <D.25705>; else goto <D.25706>;
  <D.25705>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2187, "mono_profiler_events & MONO_PROFILE_GC_MOVES");
  <D.25706>:
  D.25707 = sgen_collection_is_parallel ();
  D.25708 = D.25707 != 0;
  D.25709 = (long int) D.25708;
  D.25710 = __builtin_expect (D.25709, 0);
  if (D.25710 != 0) goto <D.25711>; else goto <D.25712>;
  <D.25711>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2190, "!sgen_collection_is_parallel ()");
  <D.25712>:
  moved_objects_idx.132 = moved_objects_idx;
  if (moved_objects_idx.132 == 64) goto <D.25714>; else goto <D.25715>;
  <D.25714>:
  moved_objects_idx.132 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.132);
  moved_objects_idx = 0;
  <D.25715>:
  moved_objects_idx.132 = moved_objects_idx;
  moved_objects_idx.133 = moved_objects_idx.132;
  moved_objects_idx.134 = moved_objects_idx.133 + 1;
  moved_objects_idx = moved_objects_idx.134;
  moved_objects[moved_objects_idx.133] = obj;
  moved_objects_idx.132 = moved_objects_idx;
  moved_objects_idx.135 = moved_objects_idx.132;
  moved_objects_idx.136 = moved_objects_idx.135 + 1;
  moved_objects_idx = moved_objects_idx.136;
  moved_objects[moved_objects_idx.135] = destination;
}


sgen_set_pinned_from_failed_allocation (mword objsize)
{
  unsigned int bytes_pinned_from_failed_allocation.137;
  unsigned int bytes_pinned_from_failed_allocation.138;

  bytes_pinned_from_failed_allocation.137 = bytes_pinned_from_failed_allocation;
  bytes_pinned_from_failed_allocation.138 = bytes_pinned_from_failed_allocation.137 + objsize;
  bytes_pinned_from_failed_allocation = bytes_pinned_from_failed_allocation.138;
}


sgen_collection_is_parallel ()
{
  int current_collection_generation.139;
  gboolean D.25723;

  current_collection_generation.139 = current_collection_generation;
  switch (current_collection_generation.139) <default: <D.23098>, case 0: <D.23096>, case 1: <D.23097>>
  <D.23096>:
  D.25723 = nursery_collection_is_parallel;
  return D.25723;
  <D.23097>:
  D.25723 = major_collector.is_parallel;
  return D.25723;
  <D.23098>:
  current_collection_generation.139 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.139);
  <D.23099>:
  goto <D.23099>;
}


sgen_collection_is_concurrent ()
{
  int current_collection_generation.140;
  gboolean D.25726;

  current_collection_generation.140 = current_collection_generation;
  switch (current_collection_generation.140) <default: <D.23105>, case 0: <D.23103>, case 1: <D.23104>>
  <D.23103>:
  D.25726 = 0;
  return D.25726;
  <D.23104>:
  D.25726 = concurrent_collection_in_progress;
  return D.25726;
  <D.23105>:
  current_collection_generation.140 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.140);
  <D.23106>:
  goto <D.23106>;
}


sgen_concurrent_collection_in_progress ()
{
  gboolean D.25728;

  D.25728 = concurrent_collection_in_progress;
  return D.25728;
}


sgen_ensure_free_space (size_t size)
{
  int D.25732;
  int degraded_mode.141;
  int D.25739;
  int D.25743;
  int concurrent_collection_in_progress.142;
  int D.25752;
  int generation_to_collect;
  const char * reason;

  generation_to_collect = -1;
  reason = 0B;
  if (size > 8000) goto <D.25730>; else goto <D.25731>;
  <D.25730>:
  D.25732 = sgen_need_major_collection (size);
  if (D.25732 != 0) goto <D.25733>; else goto <D.25734>;
  <D.25733>:
  reason = "LOS overflow";
  generation_to_collect = 1;
  <D.25734>:
  goto <D.25735>;
  <D.25731>:
  degraded_mode.141 = degraded_mode;
  if (degraded_mode.141 != 0) goto <D.25737>; else goto <D.25738>;
  <D.25737>:
  D.25739 = sgen_need_major_collection (size);
  if (D.25739 != 0) goto <D.25740>; else goto <D.25741>;
  <D.25740>:
  reason = "Degraded mode overflow";
  generation_to_collect = 1;
  <D.25741>:
  goto <D.25742>;
  <D.25738>:
  D.25743 = sgen_need_major_collection (size);
  if (D.25743 != 0) goto <D.25744>; else goto <D.25745>;
  <D.25744>:
  reason = "Minor allowance";
  generation_to_collect = 1;
  goto <D.25746>;
  <D.25745>:
  generation_to_collect = 0;
  reason = "Nursery full";
  <D.25746>:
  <D.25742>:
  <D.25735>:
  if (generation_to_collect == -1) goto <D.25747>; else goto <D.25748>;
  <D.25747>:
  concurrent_collection_in_progress.142 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.142 != 0) goto <D.25750>; else goto <D.25751>;
  <D.25750>:
  D.25752 = sgen_workers_all_done ();
  if (D.25752 != 0) goto <D.25753>; else goto <D.25754>;
  <D.25753>:
  generation_to_collect = 1;
  reason = "Finish concurrent collection";
  <D.25754>:
  <D.25751>:
  <D.25748>:
  if (generation_to_collect == -1) goto <D.25755>; else goto <D.25756>;
  <D.25755>:
  return;
  <D.25756>:
  sgen_perform_collection (size, generation_to_collect, reason, 0);
}


sgen_perform_collection (size_t requested_size, int generation_to_collect, const char * reason, gboolean wait_to_finish)
{
  unsigned int generation_to_collect.143;
  _Bool D.25761;
  long int D.25762;
  long int D.25763;
  long long int D.25766;
  int concurrent_collection_in_progress.144;
  _Bool D.25770;
  _Bool D.25771;
  _Bool D.25772;
  int D.25773;
  int D.25774;
  int allow_synchronous_major.145;
  gboolean * D.25784;
  int D.25787;
  int D.25792;
  int D.25796;
  int concurrent_collection_in_progress.146;
  _Bool D.25800;
  long int D.25801;
  long int D.25802;
  int D.25810;
  long long int D.25813;
  long long int D.25814;
  long long int D.25815;
  int D.25816;
  long long int D.25817;
  long long int D.25825;
  long long int D.25826;
  long long int D.25827;
  int D.25828;
  long long int D.25829;
  int gc_debug_level.147;
  _Bool D.25831;
  long int D.25832;
  long int D.25833;
  struct FILE * gc_debug_file.148;
  long long int D.25837;
  long unsigned int D.25838;
  unsigned int los_memory_usage.149;
  int D.25842;
  _Bool D.25845;
  long int D.25846;
  long int D.25847;
  int D.25850;
  int D.25851;
  _Bool D.25852;
  long int D.25853;
  long int D.25854;
  gint64 gc_end;
  struct GGTimingInfo infos[2];
  int overflow_generation_to_collect;
  int oldest_generation_collected;
  const char * overflow_reason;
  void done = <<< error >>>;

  try
    {
      overflow_generation_to_collect = -1;
      oldest_generation_collected = generation_to_collect;
      overflow_reason = 0B;
      if (wait_to_finish != 0) goto <D.25758>; else goto <D.25759>;
      <D.25758>:
      <D.25759>:
      generation_to_collect.143 = (unsigned int) generation_to_collect;
      D.25761 = generation_to_collect.143 > 1;
      D.25762 = (long int) D.25761;
      D.25763 = __builtin_expect (D.25762, 0);
      if (D.25763 != 0) goto <D.25764>; else goto <D.25765>;
      <D.25764>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3452, "generation_to_collect == GENERATION_NURSERY || generation_to_collect == GENERATION_OLD");
      <D.25765>:
      memset (&infos, 0, 80);
      mono_profiler_gc_event (0, generation_to_collect);
      infos[0].generation = generation_to_collect;
      infos[0].reason = reason;
      infos[0].is_overflow = 0;
      D.25766 = mono_100ns_ticks ();
      infos[0].total_time = D.25766;
      infos[1].generation = -1;
      sgen_stop_world (generation_to_collect);
      concurrent_collection_in_progress.144 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.144 != 0) goto <D.25768>; else goto <D.25769>;
      <D.25768>:
      D.25770 = wait_to_finish != 0;
      D.25771 = generation_to_collect == 1;
      D.25772 = D.25770 & D.25771;
      D.25773 = (int) D.25772;
      D.25774 = major_update_or_finish_concurrent_collection (D.25773);
      if (D.25774 != 0) goto <D.25775>; else goto <D.25776>;
      <D.25775>:
      oldest_generation_collected = 1;
      goto done;
      <D.25776>:
      if (generation_to_collect == 1) goto done; else goto <D.25777>;
      <D.25777>:
      goto <D.25778>;
      <D.25769>:
      if (generation_to_collect == 1) goto <D.25779>; else goto <D.25780>;
      <D.25779>:
      allow_synchronous_major.145 = allow_synchronous_major;
      if (allow_synchronous_major.145 != 0) goto <D.25782>; else goto <D.25783>;
      <D.25782>:
      D.25784 = major_collector.want_synchronous_collection;
      if (D.25784 != 0B) goto <D.25785>; else goto <D.25786>;
      <D.25785>:
      D.25784 = major_collector.want_synchronous_collection;
      D.25787 = *D.25784;
      if (D.25787 != 0) goto <D.25788>; else goto <D.25789>;
      <D.25788>:
      wait_to_finish = 1;
      <D.25789>:
      <D.25786>:
      <D.25783>:
      <D.25780>:
      <D.25778>:
      if (generation_to_collect == 0) goto <D.25790>; else goto <D.25791>;
      <D.25790>:
      D.25792 = collect_nursery (0B, 0);
      if (D.25792 != 0) goto <D.25793>; else goto <D.25794>;
      <D.25793>:
      overflow_generation_to_collect = 1;
      overflow_reason = "Minor overflow";
      <D.25794>:
      goto <D.25795>;
      <D.25791>:
      D.25796 = major_collector.is_concurrent;
      if (D.25796 != 0) goto <D.25797>; else goto <D.25798>;
      <D.25797>:
      concurrent_collection_in_progress.146 = concurrent_collection_in_progress;
      D.25800 = concurrent_collection_in_progress.146 != 0;
      D.25801 = (long int) D.25800;
      D.25802 = __builtin_expect (D.25801, 0);
      if (D.25802 != 0) goto <D.25803>; else goto <D.25804>;
      <D.25803>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3489, "!concurrent_collection_in_progress");
      <D.25804>:
      if (wait_to_finish == 0) goto <D.25805>; else goto <D.25806>;
      <D.25805>:
      collect_nursery (0B, 0);
      <D.25806>:
      <D.25798>:
      D.25796 = major_collector.is_concurrent;
      if (D.25796 != 0) goto <D.25808>; else goto <D.25807>;
      <D.25808>:
      if (wait_to_finish == 0) goto <D.25809>; else goto <D.25807>;
      <D.25809>:
      major_start_concurrent_collection (reason);
      goto done;
      <D.25807>:
      D.25810 = major_do_collection (reason);
      if (D.25810 != 0) goto <D.25811>; else goto <D.25812>;
      <D.25811>:
      overflow_generation_to_collect = 0;
      overflow_reason = "Excessive pinning";
      <D.25812>:
      <D.25795>:
      gc_end = mono_100ns_ticks ();
      D.25813 = infos[0].total_time;
      D.25814 = gc_end - D.25813;
      D.25815 = D.25814 / 10;
      D.25816 = (int) D.25815;
      D.25817 = (long long int) D.25816;
      infos[0].total_time = D.25817;
      D.25796 = major_collector.is_concurrent;
      if (D.25796 == 0) goto <D.25818>; else goto <D.25819>;
      <D.25818>:
      if (overflow_generation_to_collect != -1) goto <D.25820>; else goto <D.25821>;
      <D.25820>:
      mono_profiler_gc_event (0, overflow_generation_to_collect);
      infos[1].generation = overflow_generation_to_collect;
      infos[1].reason = overflow_reason;
      infos[1].is_overflow = 1;
      infos[1].total_time = gc_end;
      if (overflow_generation_to_collect == 0) goto <D.25822>; else goto <D.25823>;
      <D.25822>:
      collect_nursery (0B, 0);
      goto <D.25824>;
      <D.25823>:
      major_do_collection (overflow_reason);
      <D.25824>:
      gc_end = mono_100ns_ticks ();
      D.25825 = infos[1].total_time;
      D.25826 = gc_end - D.25825;
      D.25827 = D.25826 / 10;
      D.25828 = (int) D.25827;
      D.25829 = (long long int) D.25828;
      infos[1].total_time = D.25829;
      mono_profiler_gc_event (5, overflow_generation_to_collect);
      oldest_generation_collected = MAX_EXPR <overflow_generation_to_collect, oldest_generation_collected>;
      <D.25821>:
      <D.25819>:
      gc_debug_level.147 = gc_debug_level;
      D.25831 = gc_debug_level.147 > 1;
      D.25832 = (long int) D.25831;
      D.25833 = __builtin_expect (D.25832, 0);
      if (D.25833 != 0) goto <D.25834>; else goto <D.25835>;
      <D.25834>:
      gc_debug_file.148 = gc_debug_file;
      D.25837 = mono_gc_get_heap_size ();
      D.25838 = (long unsigned int) D.25837;
      los_memory_usage.149 = los_memory_usage;
      fprintf (gc_debug_file.148, "Heap size: %lu, LOS size: %lu\n", D.25838, los_memory_usage.149);
      gc_debug_file.148 = gc_debug_file;
      fflush (gc_debug_file.148);
      <D.25835>:
      if (generation_to_collect == 0) goto <D.25840>; else goto <D.25841>;
      <D.25840>:
      D.25842 = sgen_can_alloc_size (requested_size);
      if (D.25842 == 0) goto <D.25843>; else goto <D.25844>;
      <D.25843>:
      gc_debug_level.147 = gc_debug_level;
      D.25845 = gc_debug_level.147 > 0;
      D.25846 = (long int) D.25845;
      D.25847 = __builtin_expect (D.25846, 0);
      if (D.25847 != 0) goto <D.25848>; else goto <D.25849>;
      <D.25848>:
      gc_debug_file.148 = gc_debug_file;
      D.25850 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.148, "nursery collection didn\'t find enough room for %zd alloc (%d pinned)\n", requested_size, D.25850);
      gc_debug_file.148 = gc_debug_file;
      fflush (gc_debug_file.148);
      <D.25849>:
      sgen_dump_pin_queue ();
      degraded_mode = 1;
      <D.25844>:
      <D.25841>:
      done:
      D.25851 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.25852 = D.25851 == 0;
      D.25853 = (long int) D.25852;
      D.25854 = __builtin_expect (D.25853, 0);
      if (D.25854 != 0) goto <D.25855>; else goto <D.25856>;
      <D.25855>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3542, "sgen_gray_object_queue_is_empty (&gray_queue)");
      <D.25856>:
      sgen_restart_world (oldest_generation_collected, &infos);
      mono_profiler_gc_event (5, generation_to_collect);
    }
  finally
    {
      infos = {CLOBBER};
    }
}


major_update_or_finish_concurrent_collection (gboolean force_finish)
{
  int D.25857;
  _Bool D.25858;
  long int D.25859;
  long int D.25860;
  int D.25865;
  void (*<T11c0>) (void) D.25868;
  gboolean D.25869;
  int mod_union_consistency_check.150;
  int whole_heap_check_before_collection.151;
  struct SgenGrayQueue unpin_queue;

  try
    {
      memset (&unpin_queue, 0, 16);
      D.25857 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.25858 = D.25857 == 0;
      D.25859 = (long int) D.25858;
      D.25860 = __builtin_expect (D.25859, 0);
      if (D.25860 != 0) goto <D.25861>; else goto <D.25862>;
      <D.25861>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3350, "sgen_gray_object_queue_is_empty (&gray_queue)");
      <D.25862>:
      if (force_finish == 0) goto <D.25863>; else goto <D.25864>;
      <D.25863>:
      D.25865 = sgen_workers_all_done ();
      if (D.25865 == 0) goto <D.25866>; else goto <D.25867>;
      <D.25866>:
      D.25868 = major_collector.update_cardtable_mod_union;
      D.25868 ();
      sgen_los_update_cardtable_mod_union ();
      D.25869 = 0;
      return D.25869;
      <D.25867>:
      <D.25864>:
      wait_for_workers_to_finish ();
      D.25868 = major_collector.update_cardtable_mod_union;
      D.25868 ();
      sgen_los_update_cardtable_mod_union ();
      collect_nursery (&unpin_queue, 1);
      mod_union_consistency_check.150 = mod_union_consistency_check;
      if (mod_union_consistency_check.150 != 0) goto <D.25871>; else goto <D.25872>;
      <D.25871>:
      sgen_check_mod_union_consistency ();
      <D.25872>:
      current_collection_generation = 1;
      major_finish_collection ("finishing", -1, 1);
      whole_heap_check_before_collection.151 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.151 != 0) goto <D.25874>; else goto <D.25875>;
      <D.25874>:
      sgen_check_whole_heap (0);
      <D.25875>:
      unpin_objects_from_queue (&unpin_queue);
      sgen_gray_object_queue_deinit (&unpin_queue);
      current_collection_generation = -1;
      D.25869 = 1;
      return D.25869;
    }
  finally
    {
      unpin_queue = {CLOBBER};
    }
}


wait_for_workers_to_finish ()
{
  int D.25878;

  goto <D.23256>;
  <D.23255>:
  monoeg_g_usleep (200);
  <D.23256>:
  D.25878 = sgen_workers_all_done ();
  if (D.25878 == 0) goto <D.23255>; else goto <D.23257>;
  <D.23257>:
}


major_finish_collection (const char * reason, int old_next_pin_slot, gboolean scan_mod_union)
{
  int concurrent_collection_in_progress.152;
  int D.25883;
  int concurrent_collection_in_progress.153;
  int D.25887;
  _Bool D.25888;
  long int D.25889;
  long int D.25890;
  int do_concurrent_checks.154;
  struct SgenSectionGrayQueue * D.25897;
  int D.25898;
  _Bool D.25899;
  long int D.25900;
  long int D.25901;
  long long int D.25904;
  long long int D.25905;
  int D.25906;
  long long int D.25907;
  long long int time_major_finish_gray_stack.155;
  long long int time_major_finish_gray_stack.156;
  unsigned int objects_pinned.157;
  int concurrent_collection_in_progress.158;
  _Bool D.25914;
  long int D.25915;
  long int D.25916;
  struct GCMemSection * nursery_section.159;
  char * D.25920;
  unsigned int D.25921;
  char * D.25922;
  unsigned int D.25923;
  int check_mark_bits_after_major_collection.160;
  char[0:] * D.25927;
  unsigned int D.25928;
  unsigned int D.25929;
  _Bool D.25930;
  long int D.25931;
  long int D.25932;
  int D.25935;
  unsigned int D.25938;
  unsigned int D.25939;
  unsigned int D.25940;
  struct LOSObject * los_object_list.161;
  long long int D.25946;
  long long int D.25947;
  int D.25948;
  long long int D.25949;
  long long int time_major_free_bigobjs.162;
  long long int time_major_free_bigobjs.163;
  long long int time_major_los_sweep.164;
  long long int time_major_los_sweep.165;
  void (*<T11c0>) (void) D.25954;
  long long int time_major_sweep.166;
  long long int time_major_sweep.167;
  int concurrent_collection_in_progress.168;
  void * * D.25960;
  int D.25961;
  unsigned int D.25962;
  int concurrent_collection_in_progress.169;
  long long int time_major_fragment_creation.170;
  long long int time_major_fragment_creation.171;
  struct FILE * heap_dump_file.172;
  int stat_major_gcs.173;
  int D.25974;
  struct FinalizeReadyEntry * fin_ready_list.174;
  struct FinalizeReadyEntry * critical_fin_list.175;
  struct FILE * gc_debug_file.176;
  int num_ready_finalizers.177;
  int D.25984;
  _Bool D.25985;
  long int D.25986;
  long int D.25987;
  void (*<T11c0>) (void) D.25990;
  struct SgenSectionGrayQueue * D.25991;
  int D.25992;
  _Bool D.25993;
  long int D.25994;
  long int D.25995;
  int concurrent_collection_in_progress.178;
  struct LOSObject * bigobj;
  struct LOSObject * prevbo;
  gint64 atv;
  gint64 btv;

  btv = mono_100ns_ticks ();
  concurrent_collection_in_progress.152 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.152 != 0) goto <D.25879>; else goto <D.25882>;
  <D.25882>:
  D.25883 = major_collector.is_parallel;
  if (D.25883 != 0) goto <D.25879>; else goto <D.25880>;
  <D.25879>:
  join_workers ();
  <D.25880>:
  concurrent_collection_in_progress.153 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.153 != 0) goto <D.25885>; else goto <D.25886>;
  <D.25885>:
  current_object_ops = major_collector.major_concurrent_ops;
  major_copy_or_mark_from_roots (0B, 1, scan_mod_union);
  join_workers ();
  D.25887 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.25888 = D.25887 == 0;
  D.25889 = (long int) D.25888;
  D.25890 = __builtin_expect (D.25889, 0);
  if (D.25890 != 0) goto <D.25891>; else goto <D.25892>;
  <D.25891>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3147, "sgen_gray_object_queue_is_empty (&gray_queue)");
  <D.25892>:
  do_concurrent_checks.154 = do_concurrent_checks;
  if (do_concurrent_checks.154 != 0) goto <D.25894>; else goto <D.25895>;
  <D.25894>:
  check_nursery_is_clean ();
  <D.25895>:
  goto <D.25896>;
  <D.25886>:
  current_object_ops = major_collector.major_ops;
  <D.25896>:
  sgen_gray_object_queue_disable_alloc_prepare (&gray_queue);
  D.25897 = sgen_workers_get_distribute_section_gray_queue ();
  D.25898 = sgen_section_gray_queue_is_empty (D.25897);
  D.25899 = D.25898 == 0;
  D.25900 = (long int) D.25899;
  D.25901 = __builtin_expect (D.25900, 0);
  if (D.25901 != 0) goto <D.25902>; else goto <D.25903>;
  <D.25902>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3161, "sgen_section_gray_queue_is_empty (sgen_workers_get_distribute_section_gray_queue ())");
  <D.25903>:
  finish_gray_stack (1, &gray_queue);
  atv = mono_100ns_ticks ();
  D.25904 = atv - btv;
  D.25905 = D.25904 / 10;
  D.25906 = (int) D.25905;
  D.25907 = (long long int) D.25906;
  time_major_finish_gray_stack.155 = time_major_finish_gray_stack;
  time_major_finish_gray_stack.156 = D.25907 + time_major_finish_gray_stack.155;
  time_major_finish_gray_stack = time_major_finish_gray_stack.156;
  sgen_workers_reset_data ();
  objects_pinned.157 = objects_pinned;
  if (objects_pinned.157 != 0) goto <D.25911>; else goto <D.25912>;
  <D.25911>:
  concurrent_collection_in_progress.158 = concurrent_collection_in_progress;
  D.25914 = concurrent_collection_in_progress.158 != 0;
  D.25915 = (long int) D.25914;
  D.25916 = __builtin_expect (D.25915, 0);
  if (D.25916 != 0) goto <D.25917>; else goto <D.25918>;
  <D.25917>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3177, "!concurrent_collection_in_progress");
  <D.25918>:
  nursery_section.159 = nursery_section;
  sgen_pin_queue_clear_discarded_entries (nursery_section.159, old_next_pin_slot);
  sgen_optimize_pin_queue (0);
  nursery_section.159 = nursery_section;
  sgen_find_section_pin_queue_start_end (nursery_section.159);
  objects_pinned = 0;
  <D.25912>:
  reset_heap_boundaries ();
  D.25920 = sgen_get_nursery_start ();
  D.25921 = (unsigned int) D.25920;
  D.25922 = sgen_get_nursery_end ();
  D.25923 = (unsigned int) D.25922;
  sgen_update_heap_boundaries (D.25921, D.25923);
  check_mark_bits_after_major_collection.160 = check_mark_bits_after_major_collection;
  if (check_mark_bits_after_major_collection.160 != 0) goto <D.25925>; else goto <D.25926>;
  <D.25925>:
  sgen_check_major_heap_marked ();
  <D.25926>:
  prevbo = 0B;
  bigobj = los_object_list;
  goto <D.23271>;
  <D.23272>:
  D.25927 = &bigobj->data;
  D.25928 = MEM[(mword *)D.25927];
  D.25929 = D.25928 & 2;
  D.25930 = D.25929 != 0;
  D.25931 = (long int) D.25930;
  D.25932 = __builtin_expect (D.25931, 0);
  if (D.25932 != 0) goto <D.25933>; else goto <D.25934>;
  <D.25933>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3197, "!object_is_pinned (bigobj->data)");
  <D.25934>:
  D.25927 = &bigobj->data;
  D.25935 = sgen_los_object_is_pinned (D.25927);
  if (D.25935 != 0) goto <D.25936>; else goto <D.25937>;
  <D.25936>:
  D.25927 = &bigobj->data;
  sgen_los_unpin_object (D.25927);
  D.25927 = &bigobj->data;
  D.25938 = (unsigned int) D.25927;
  D.25927 = &bigobj->data;
  D.25938 = (unsigned int) D.25927;
  D.25939 = sgen_los_object_size (bigobj);
  D.25940 = D.25938 + D.25939;
  sgen_update_heap_boundaries (D.25938, D.25940);
  goto <D.25941>;
  <D.25937>:
  {
    struct LOSObject * to_free;

    if (prevbo != 0B) goto <D.25942>; else goto <D.25943>;
    <D.25942>:
    los_object_list.161 = bigobj->next;
    prevbo->next = los_object_list.161;
    goto <D.25945>;
    <D.25943>:
    los_object_list.161 = bigobj->next;
    los_object_list = los_object_list.161;
    <D.25945>:
    to_free = bigobj;
    bigobj = bigobj->next;
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.23271>;
  }
  <D.25941>:
  prevbo = bigobj;
  bigobj = bigobj->next;
  <D.23271>:
  if (bigobj != 0B) goto <D.23272>; else goto <D.23273>;
  <D.23273>:
  btv = mono_100ns_ticks ();
  D.25946 = btv - atv;
  D.25947 = D.25946 / 10;
  D.25948 = (int) D.25947;
  D.25949 = (long long int) D.25948;
  time_major_free_bigobjs.162 = time_major_free_bigobjs;
  time_major_free_bigobjs.163 = D.25949 + time_major_free_bigobjs.162;
  time_major_free_bigobjs = time_major_free_bigobjs.163;
  sgen_los_sweep ();
  atv = mono_100ns_ticks ();
  D.25904 = atv - btv;
  D.25905 = D.25904 / 10;
  D.25906 = (int) D.25905;
  D.25907 = (long long int) D.25906;
  time_major_los_sweep.164 = time_major_los_sweep;
  time_major_los_sweep.165 = D.25907 + time_major_los_sweep.164;
  time_major_los_sweep = time_major_los_sweep.165;
  D.25954 = major_collector.sweep;
  D.25954 ();
  btv = mono_100ns_ticks ();
  D.25946 = btv - atv;
  D.25947 = D.25946 / 10;
  D.25948 = (int) D.25947;
  D.25949 = (long long int) D.25948;
  time_major_sweep.166 = time_major_sweep;
  time_major_sweep.167 = D.25949 + time_major_sweep.166;
  time_major_sweep = time_major_sweep.167;
  concurrent_collection_in_progress.168 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.168 == 0) goto <D.25958>; else goto <D.25959>;
  <D.25958>:
  nursery_section.159 = nursery_section;
  nursery_section.159 = nursery_section;
  D.25960 = nursery_section.159->pin_queue_start;
  nursery_section.159 = nursery_section;
  D.25961 = nursery_section.159->pin_queue_num_entries;
  D.25962 = sgen_build_nursery_fragments (nursery_section.159, D.25960, D.25961, 0B);
  if (D.25962 == 0) goto <D.25963>; else goto <D.25964>;
  <D.25963>:
  degraded_mode = 1;
  <D.25964>:
  sgen_finish_pinning ();
  sgen_clear_tlabs ();
  sgen_pin_stats_reset ();
  <D.25959>:
  concurrent_collection_in_progress.169 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.169 != 0) goto <D.25966>; else goto <D.25967>;
  <D.25966>:
  sgen_cement_concurrent_finish ();
  <D.25967>:
  sgen_cement_clear_below_threshold ();
  atv = mono_100ns_ticks ();
  D.25904 = atv - btv;
  D.25905 = D.25904 / 10;
  D.25906 = (int) D.25905;
  D.25907 = (long long int) D.25906;
  time_major_fragment_creation.170 = time_major_fragment_creation;
  time_major_fragment_creation.171 = D.25907 + time_major_fragment_creation.170;
  time_major_fragment_creation = time_major_fragment_creation.171;
  heap_dump_file.172 = heap_dump_file;
  if (heap_dump_file.172 != 0B) goto <D.25971>; else goto <D.25972>;
  <D.25971>:
  stat_major_gcs.173 = stat_major_gcs;
  D.25974 = stat_major_gcs.173 + -1;
  dump_heap ("major", D.25974, reason);
  <D.25972>:
  fin_ready_list.174 = fin_ready_list;
  if (fin_ready_list.174 != 0B) goto <D.25975>; else goto <D.25978>;
  <D.25978>:
  critical_fin_list.175 = critical_fin_list;
  if (critical_fin_list.175 != 0B) goto <D.25975>; else goto <D.25976>;
  <D.25975>:
  if (0 != 0) goto <D.25980>; else goto <D.25981>;
  <D.25980>:
  gc_debug_file.176 = gc_debug_file;
  num_ready_finalizers.177 = num_ready_finalizers;
  fprintf (gc_debug_file.176, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.177);
  gc_debug_file.176 = gc_debug_file;
  fflush (gc_debug_file.176);
  <D.25981>:
  mono_gc_finalize_notify ();
  <D.25976>:
  D.25984 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.25985 = D.25984 == 0;
  D.25986 = (long int) D.25985;
  D.25987 = __builtin_expect (D.25986, 0);
  if (D.25987 != 0) goto <D.25988>; else goto <D.25989>;
  <D.25988>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3264, "sgen_gray_object_queue_is_empty (&gray_queue)");
  <D.25989>:
  sgen_memgov_major_collection_end ();
  current_collection_generation = -1;
  D.25990 = major_collector.finish_major_collection;
  D.25990 ();
  D.25991 = sgen_workers_get_distribute_section_gray_queue ();
  D.25992 = sgen_section_gray_queue_is_empty (D.25991);
  D.25993 = D.25992 == 0;
  D.25994 = (long int) D.25993;
  D.25995 = __builtin_expect (D.25994, 0);
  if (D.25995 != 0) goto <D.25996>; else goto <D.25997>;
  <D.25996>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3271, "sgen_section_gray_queue_is_empty (sgen_workers_get_distribute_section_gray_queue ())");
  <D.25997>:
  concurrent_collection_in_progress.178 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.178 != 0) goto <D.25999>; else goto <D.26000>;
  <D.25999>:
  concurrent_collection_in_progress = 0;
  <D.26000>:
  check_scan_starts ();
}


major_copy_or_mark_from_roots (int * old_next_pin_slot, gboolean finish_up_concurrent_mark, gboolean scan_mod_union)
{
  <unnamed type> D.26001;
  int D.26002;
  int concurrent_collection_in_progress.179;
  int do_concurrent_checks.180;
  int whole_heap_check_before_collection.181;
  long long int D.26013;
  long long int D.26014;
  int D.26015;
  long long int D.26016;
  long long int time_major_pre_collection_fragment_clear.182;
  long long int time_major_pre_collection_fragment_clear.183;
  int D.26019;
  struct GCMemSection * nursery_section.184;
  char * D.26023;
  gboolean * D.26024;
  int xdomain_checks.185;
  int concurrent_collection_in_progress.186;
  void (*<T11c0>) (void) D.26031;
  struct FILE * gc_debug_file.187;
  unsigned int lowest_heap_address.188;
  void * lowest_heap_address.189;
  unsigned int highest_heap_address.190;
  void * highest_heap_address.191;
  int concurrent_collection_in_progress.192;
  int D.26043;
  int concurrent_collection_in_progress.193;
  int concurrent_collection_in_progress.194;
  void (*<T3500>) (struct SgenGrayQueue *) D.26054;
  char[0:] * D.26057;
  unsigned int D.26058;
  char * D.26059;
  void * * D.26060;
  int D.26063;
  _Bool D.26066;
  long int D.26067;
  long int D.26068;
  unsigned int D.26071;
  unsigned int D.26072;
  struct MonoVTable * D.26073;
  void * D.26074;
  unsigned int D.26075;
  int D.26076;
  int iftmp.195;
  struct GrayQueueSection * D.26083;
  int D.26085;
  _Bool D.26086;
  long int D.26087;
  long int D.26088;
  int D.26092;
  int D.26093;
  int do_pin_stats.196;
  _Bool D.26095;
  long int D.26096;
  long int D.26097;
  unsigned int D.26100;
  const char * D.26103;
  unsigned int D.26104;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) iftmp.197;
  int concurrent_collection_in_progress.198;
  int concurrent_collection_in_progress.199;
  int D.26118;
  int check_nursery_objects_pinned.200;
  int iftmp.201;
  int concurrent_collection_in_progress.202;
  void (*<T3500>) (struct SgenGrayQueue *) D.26131;
  int D.26134;
  long long int time_major_pinning.203;
  long long int time_major_pinning.204;
  int gc_debug_level.205;
  _Bool D.26138;
  long int D.26139;
  long int D.26140;
  int D.26143;
  int D.26146;
  void (*<T11c0>) (void) D.26147;
  int concurrent_collection_in_progress.206;
  int D.26151;
  <unnamed type> D.26154;
  unsigned int D.26155;
  long long int D.26158;
  long long int D.26159;
  int D.26160;
  long long int D.26161;
  long long int time_major_scan_pinned.207;
  long long int time_major_scan_pinned.208;
  void (*<T35be>) (void * *, struct SgenGrayQueue *) D.26164;
  void (*<T35c3>) (char *, struct SgenGrayQueue *) D.26165;
  long long int time_major_scan_registered_roots.209;
  long long int time_major_scan_registered_roots.210;
  long long int time_major_scan_thread_data.211;
  long long int time_major_scan_thread_data.212;
  long long int time_major_scan_alloc_pinned.213;
  long long int time_major_scan_alloc_pinned.214;
  <unnamed type> D.26172;
  unsigned int D.26173;
  struct FinalizeReadyEntry * fin_ready_list.215;
  struct FinalizeReadyEntry * critical_fin_list.216;
  long long int time_major_scan_finalized.217;
  long long int time_major_scan_finalized.218;
  long long int time_major_scan_big_objects.219;
  long long int time_major_scan_big_objects.220;
  int concurrent_collection_in_progress.221;
  struct LOSObject * bigobj;
  gint64 atv;
  gint64 btv;
  char * heap_start;
  char * heap_end;
  gboolean profile_roots;
  struct GCRootReport root_report;
  struct ScanFromRegisteredRootsJobData * scrrjd_normal;
  struct ScanFromRegisteredRootsJobData * scrrjd_wbarrier;
  struct ScanThreadDataJobData * stdjd;
  struct ScanFinalizerEntriesJobData * sfejd_fin_ready;
  struct ScanFinalizerEntriesJobData * sfejd_critical_fin;
  struct ScanCopyContext ctx;

  try
    {
      heap_start = 0B;
      heap_end = 4294967295B;
      D.26001 = mono_profiler_get_events ();
      D.26002 = (int) D.26001;
      profile_roots = D.26002 & 1048576;
      root_report = {};
      concurrent_collection_in_progress.179 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.179 != 0) goto <D.26004>; else goto <D.26005>;
      <D.26004>:
      sgen_nursery_allocator_prepare_for_pinning ();
      do_concurrent_checks.180 = do_concurrent_checks;
      if (do_concurrent_checks.180 != 0) goto <D.26007>; else goto <D.26008>;
      <D.26007>:
      check_nursery_is_clean ();
      <D.26008>:
      goto <D.26009>;
      <D.26005>:
      sgen_nursery_alloc_prepare_for_major ();
      <D.26009>:
      init_gray_queue ();
      atv = mono_100ns_ticks ();
      sgen_clear_nursery_fragments ();
      whole_heap_check_before_collection.181 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.181 != 0) goto <D.26011>; else goto <D.26012>;
      <D.26011>:
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.26012>:
      btv = mono_100ns_ticks ();
      D.26013 = btv - atv;
      D.26014 = D.26013 / 10;
      D.26015 = (int) D.26014;
      D.26016 = (long long int) D.26015;
      time_major_pre_collection_fragment_clear.182 = time_major_pre_collection_fragment_clear;
      time_major_pre_collection_fragment_clear.183 = D.26016 + time_major_pre_collection_fragment_clear.182;
      time_major_pre_collection_fragment_clear = time_major_pre_collection_fragment_clear.183;
      D.26019 = sgen_collection_is_concurrent ();
      if (D.26019 == 0) goto <D.26020>; else goto <D.26021>;
      <D.26020>:
      nursery_section.184 = nursery_section;
      D.26023 = sgen_get_nursery_end ();
      nursery_section.184->next_data = D.26023;
      <D.26021>:
      objects_pinned = 0;
      D.26024 = major_collector.have_swept;
      *D.26024 = 0;
      xdomain_checks.185 = xdomain_checks;
      if (xdomain_checks.185 != 0) goto <D.26026>; else goto <D.26027>;
      <D.26026>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.26027>:
      concurrent_collection_in_progress.186 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.186 == 0) goto <D.26029>; else goto <D.26030>;
      <D.26029>:
      D.26031 = remset.prepare_for_major_collection;
      D.26031 ();
      <D.26030>:
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      atv = mono_100ns_ticks ();
      sgen_init_pinning ();
      if (0 != 0) goto <D.26032>; else goto <D.26033>;
      <D.26032>:
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Collecting pinned addresses\n");
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.26033>:
      lowest_heap_address.188 = lowest_heap_address;
      lowest_heap_address.189 = (void *) lowest_heap_address.188;
      highest_heap_address.190 = highest_heap_address;
      highest_heap_address.191 = (void *) highest_heap_address.190;
      pin_from_roots (lowest_heap_address.189, highest_heap_address.191, &gray_queue);
      concurrent_collection_in_progress.192 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.192 == 0) goto <D.26039>; else goto <D.26042>;
      <D.26042>:
      if (finish_up_concurrent_mark != 0) goto <D.26039>; else goto <D.26040>;
      <D.26039>:
      D.26043 = major_collector.is_concurrent;
      if (D.26043 != 0) goto <D.26044>; else goto <D.26045>;
      <D.26044>:
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      <D.26045>:
      concurrent_collection_in_progress.193 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.193 == 0) goto <D.26047>; else goto <D.26048>;
      <D.26047>:
      sgen_cement_reset ();
      <D.26048>:
      <D.26040>:
      sgen_optimize_pin_queue (0);
      concurrent_collection_in_progress.194 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.194 != 0) goto <D.26050>; else goto <D.26051>;
      <D.26050>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.26051>:
      if (0 != 0) goto <D.26052>; else goto <D.26053>;
      <D.26052>:
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Pinning from sections\n");
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.26053>:
      nursery_section.184 = nursery_section;
      sgen_find_section_pin_queue_start_end (nursery_section.184);
      D.26054 = major_collector.find_pin_queue_start_ends;
      D.26054 (&gray_queue);
      if (0 != 0) goto <D.26055>; else goto <D.26056>;
      <D.26055>:
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Pinning from large objects\n");
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.26056>:
      bigobj = los_object_list;
      goto <D.23246>;
      <D.23245>:
      {
        int dummy;

        try
          {
            D.26057 = &bigobj->data;
            D.26058 = sgen_los_object_size (bigobj);
            D.26059 = &bigobj->data[D.26058];
            D.26060 = sgen_find_optimized_pin_queue_area (D.26057, D.26059, &dummy);
            if (D.26060 != 0B) goto <D.26061>; else goto <D.26062>;
            <D.26061>:
            D.26057 = &bigobj->data;
            D.26063 = sgen_los_object_is_pinned (D.26057);
            if (D.26063 != 0) goto <D.26064>; else goto <D.26065>;
            <D.26064>:
            D.26066 = finish_up_concurrent_mark == 0;
            D.26067 = (long int) D.26066;
            D.26068 = __builtin_expect (D.26067, 0);
            if (D.26068 != 0) goto <D.26069>; else goto <D.26070>;
            <D.26069>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2919, "finish_up_concurrent_mark");
            <D.26070>:
            // predicted unlikely by continue predictor.
            goto <D.23244>;
            <D.26065>:
            D.26057 = &bigobj->data;
            sgen_los_pin_object (D.26057);
            D.26057 = &bigobj->data;
            D.26071 = MEM[(mword *)D.26057];
            D.26072 = D.26071 & 4294967292;
            D.26073 = (struct MonoVTable *) D.26072;
            D.26074 = D.26073->gc_descr;
            D.26075 = (unsigned int) D.26074;
            D.26076 = sgen_gc_descr_has_references (D.26075);
            if (D.26076 != 0) goto <D.26077>; else goto <D.26078>;
            <D.26077>:
            D.26083 = gray_queue.first;
            if (D.26083 == 0B) goto <D.26080>; else goto <D.26084>;
            <D.26084>:
            D.26083 = gray_queue.first;
            D.26085 = D.26083->end;
            if (D.26085 == 125) goto <D.26080>; else goto <D.26081>;
            <D.26080>:
            iftmp.195 = 1;
            goto <D.26082>;
            <D.26081>:
            iftmp.195 = 0;
            <D.26082>:
            D.26086 = iftmp.195 != 0;
            D.26087 = (long int) D.26086;
            D.26088 = __builtin_expect (D.26087, 0);
            if (D.26088 != 0) goto <D.26089>; else goto <D.26090>;
            <D.26089>:
            D.26057 = &bigobj->data;
            sgen_gray_object_enqueue (&gray_queue, D.26057);
            goto <D.26091>;
            <D.26090>:
            D.26083 = gray_queue.first;
            D.26083 = gray_queue.first;
            D.26085 = D.26083->end;
            D.26092 = D.26085;
            D.26093 = D.26092 + 1;
            D.26083->end = D.26093;
            D.26057 = &bigobj->data;
            D.26083->objects[D.26092] = D.26057;
            <D.26091>:
            D.26057 = &bigobj->data;
            __builtin_prefetch (D.26057);
            <D.26078>:
            do_pin_stats.196 = do_pin_stats;
            D.26095 = do_pin_stats.196 != 0;
            D.26096 = (long int) D.26095;
            D.26097 = __builtin_expect (D.26096, 0);
            if (D.26097 != 0) goto <D.26098>; else goto <D.26099>;
            <D.26098>:
            D.26057 = &bigobj->data;
            D.26057 = &bigobj->data;
            D.26100 = sgen_safe_object_get_size (D.26057);
            sgen_pin_stats_register_object (D.26057, D.26100);
            <D.26099>:
            if (0 != 0) goto <D.26101>; else goto <D.26102>;
            <D.26101>:
            gc_debug_file.187 = gc_debug_file;
            D.26057 = &bigobj->data;
            D.26057 = &bigobj->data;
            D.26103 = safe_name (D.26057);
            D.26104 = sgen_los_object_size (bigobj);
            fprintf (gc_debug_file.187, "Marked large object %p (%s) size: %lu from roots\n", D.26057, D.26103, D.26104);
            gc_debug_file.187 = gc_debug_file;
            fflush (gc_debug_file.187);
            <D.26102>:
            if (profile_roots != 0) goto <D.26105>; else goto <D.26106>;
            <D.26105>:
            D.26057 = &bigobj->data;
            add_profile_gc_root (&root_report, D.26057, 260, 0);
            <D.26106>:
            <D.26062>:
          }
        finally
          {
            dummy = {CLOBBER};
          }
      }
      <D.23244>:
      bigobj = bigobj->next;
      <D.23246>:
      if (bigobj != 0B) goto <D.23245>; else goto <D.23247>;
      <D.23247>:
      if (profile_roots != 0) goto <D.26107>; else goto <D.26108>;
      <D.26107>:
      notify_gc_roots (&root_report);
      <D.26108>:
      concurrent_collection_in_progress.198 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.198 != 0) goto <D.26111>; else goto <D.26112>;
      <D.26111>:
      iftmp.197 = current_object_ops.scan_object;
      goto <D.26113>;
      <D.26112>:
      iftmp.197 = 0B;
      <D.26113>:
      ctx.scan_func = iftmp.197;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      concurrent_collection_in_progress.199 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.199 != 0) goto <D.26117>; else goto <D.26114>;
      <D.26117>:
      D.26118 = sgen_minor_collector.is_split;
      if (D.26118 != 0) goto <D.26119>; else goto <D.26114>;
      <D.26119>:
      scan_nursery_objects (ctx);
      goto <D.26115>;
      <D.26114>:
      nursery_section.184 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.184, ctx);
      check_nursery_objects_pinned.200 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.200 != 0) goto <D.26121>; else goto <D.26122>;
      <D.26121>:
      D.26118 = sgen_minor_collector.is_split;
      if (D.26118 == 0) goto <D.26123>; else goto <D.26124>;
      <D.26123>:
      concurrent_collection_in_progress.202 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.202 == 0) goto <D.26126>; else goto <D.26130>;
      <D.26130>:
      if (finish_up_concurrent_mark != 0) goto <D.26126>; else goto <D.26127>;
      <D.26126>:
      iftmp.201 = 1;
      goto <D.26128>;
      <D.26127>:
      iftmp.201 = 0;
      <D.26128>:
      sgen_check_nursery_objects_pinned (iftmp.201);
      <D.26124>:
      <D.26122>:
      <D.26115>:
      D.26131 = major_collector.pin_objects;
      D.26131 (&gray_queue);
      if (old_next_pin_slot != 0B) goto <D.26132>; else goto <D.26133>;
      <D.26132>:
      D.26134 = sgen_get_pinned_count ();
      *old_next_pin_slot = D.26134;
      <D.26133>:
      btv = mono_100ns_ticks ();
      D.26013 = btv - atv;
      D.26014 = D.26013 / 10;
      D.26015 = (int) D.26014;
      D.26016 = (long long int) D.26015;
      time_major_pinning.203 = time_major_pinning;
      time_major_pinning.204 = D.26016 + time_major_pinning.203;
      time_major_pinning = time_major_pinning.204;
      gc_debug_level.205 = gc_debug_level;
      D.26138 = gc_debug_level.205 > 1;
      D.26139 = (long int) D.26138;
      D.26140 = __builtin_expect (D.26139, 0);
      if (D.26140 != 0) goto <D.26141>; else goto <D.26142>;
      <D.26141>:
      gc_debug_file.187 = gc_debug_file;
      D.26143 = sgen_get_pinned_count ();
      D.26013 = btv - atv;
      D.26014 = D.26013 / 10;
      D.26015 = (int) D.26014;
      fprintf (gc_debug_file.187, "Finding pinned pointers: %d in %d usecs\n", D.26143, D.26015);
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.26142>:
      if (0 != 0) goto <D.26144>; else goto <D.26145>;
      <D.26144>:
      gc_debug_file.187 = gc_debug_file;
      D.26146 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.187, "Start scan with %d pinned objects\n", D.26146);
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.26145>:
      D.26147 = major_collector.init_to_space;
      D.26147 ();
      concurrent_collection_in_progress.206 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.206 == 0) goto <D.26149>; else goto <D.26150>;
      <D.26149>:
      D.26151 = major_collector.is_parallel;
      if (D.26151 != 0) goto <D.26152>; else goto <D.26153>;
      <D.26152>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.26153>:
      <D.26150>:
      D.26154 = mono_profiler_get_events ();
      D.26155 = D.26154 & 1048576;
      if (D.26155 != 0) goto <D.26156>; else goto <D.26157>;
      <D.26156>:
      report_registered_roots ();
      <D.26157>:
      atv = mono_100ns_ticks ();
      D.26158 = atv - btv;
      D.26159 = D.26158 / 10;
      D.26160 = (int) D.26159;
      D.26161 = (long long int) D.26160;
      time_major_scan_pinned.207 = time_major_scan_pinned;
      time_major_scan_pinned.208 = D.26161 + time_major_scan_pinned.207;
      time_major_scan_pinned = time_major_scan_pinned.208;
      scrrjd_normal = sgen_alloc_internal_dynamic (20, 20, 1);
      D.26164 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.26164;
      D.26165 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.26165;
      scrrjd_normal->heap_start = heap_start;
      scrrjd_normal->heap_end = heap_end;
      scrrjd_normal->root_type = 0;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_normal);
      scrrjd_wbarrier = sgen_alloc_internal_dynamic (20, 20, 1);
      D.26164 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.26164;
      D.26165 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.26165;
      scrrjd_wbarrier->heap_start = heap_start;
      scrrjd_wbarrier->heap_end = heap_end;
      scrrjd_wbarrier->root_type = 2;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_wbarrier);
      btv = mono_100ns_ticks ();
      D.26013 = btv - atv;
      D.26014 = D.26013 / 10;
      D.26015 = (int) D.26014;
      D.26016 = (long long int) D.26015;
      time_major_scan_registered_roots.209 = time_major_scan_registered_roots;
      time_major_scan_registered_roots.210 = D.26016 + time_major_scan_registered_roots.209;
      time_major_scan_registered_roots = time_major_scan_registered_roots.210;
      stdjd = sgen_alloc_internal_dynamic (8, 20, 1);
      stdjd->heap_start = heap_start;
      stdjd->heap_end = heap_end;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.26158 = atv - btv;
      D.26159 = D.26158 / 10;
      D.26160 = (int) D.26159;
      D.26161 = (long long int) D.26160;
      time_major_scan_thread_data.211 = time_major_scan_thread_data;
      time_major_scan_thread_data.212 = D.26161 + time_major_scan_thread_data.211;
      time_major_scan_thread_data = time_major_scan_thread_data.212;
      btv = mono_100ns_ticks ();
      D.26013 = btv - atv;
      D.26014 = D.26013 / 10;
      D.26015 = (int) D.26014;
      D.26016 = (long long int) D.26015;
      time_major_scan_alloc_pinned.213 = time_major_scan_alloc_pinned;
      time_major_scan_alloc_pinned.214 = D.26016 + time_major_scan_alloc_pinned.213;
      time_major_scan_alloc_pinned = time_major_scan_alloc_pinned.214;
      D.26172 = mono_profiler_get_events ();
      D.26173 = D.26172 & 1048576;
      if (D.26173 != 0) goto <D.26174>; else goto <D.26175>;
      <D.26174>:
      report_finalizer_roots ();
      <D.26175>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (4, 20, 1);
      fin_ready_list.215 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.215;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (4, 20, 1);
      critical_fin_list.216 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.216;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      if (scan_mod_union != 0) goto <D.26178>; else goto <D.26179>;
      <D.26178>:
      D.26066 = finish_up_concurrent_mark == 0;
      D.26067 = (long int) D.26066;
      D.26068 = __builtin_expect (D.26067, 0);
      if (D.26068 != 0) goto <D.26180>; else goto <D.26181>;
      <D.26180>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3038, "finish_up_concurrent_mark");
      <D.26181>:
      sgen_workers_enqueue_job (job_scan_major_mod_union_cardtable, 0B);
      sgen_workers_enqueue_job (job_scan_los_mod_union_cardtable, 0B);
      <D.26179>:
      atv = mono_100ns_ticks ();
      D.26158 = atv - btv;
      D.26159 = D.26158 / 10;
      D.26160 = (int) D.26159;
      D.26161 = (long long int) D.26160;
      time_major_scan_finalized.217 = time_major_scan_finalized;
      time_major_scan_finalized.218 = D.26161 + time_major_scan_finalized.217;
      time_major_scan_finalized = time_major_scan_finalized.218;
      gc_debug_level.205 = gc_debug_level;
      D.26138 = gc_debug_level.205 > 1;
      D.26139 = (long int) D.26138;
      D.26140 = __builtin_expect (D.26139, 0);
      if (D.26140 != 0) goto <D.26184>; else goto <D.26185>;
      <D.26184>:
      gc_debug_file.187 = gc_debug_file;
      D.26158 = atv - btv;
      D.26159 = D.26158 / 10;
      D.26160 = (int) D.26159;
      fprintf (gc_debug_file.187, "Root scan: %d usecs\n", D.26160);
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.26185>:
      btv = mono_100ns_ticks ();
      D.26013 = btv - atv;
      D.26014 = D.26013 / 10;
      D.26015 = (int) D.26014;
      D.26016 = (long long int) D.26015;
      time_major_scan_big_objects.219 = time_major_scan_big_objects;
      time_major_scan_big_objects.220 = D.26016 + time_major_scan_big_objects.219;
      time_major_scan_big_objects = time_major_scan_big_objects.220;
      concurrent_collection_in_progress.221 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.221 != 0) goto <D.26189>; else goto <D.26190>;
      <D.26189>:
      sgen_finish_pinning ();
      sgen_pin_stats_reset ();
      do_concurrent_checks.180 = do_concurrent_checks;
      if (do_concurrent_checks.180 != 0) goto <D.26191>; else goto <D.26192>;
      <D.26191>:
      check_nursery_is_clean ();
      <D.26192>:
      <D.26190>:
    }
  finally
    {
      root_report = {CLOBBER};
      ctx = {CLOBBER};
    }
}


job_scan_los_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.222;
  _Bool D.26196;
  long int D.26197;
  long int D.26198;
  struct SgenGrayQueue * D.26201;

  concurrent_collection_in_progress.222 = concurrent_collection_in_progress;
  D.26196 = concurrent_collection_in_progress.222 == 0;
  D.26197 = (long int) D.26196;
  D.26198 = __builtin_expect (D.26197, 0);
  if (D.26198 != 0) goto <D.26199>; else goto <D.26200>;
  <D.26199>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2390, "concurrent_collection_in_progress");
  <D.26200>:
  D.26201 = sgen_workers_get_job_gray_queue (worker_data);
  sgen_los_scan_card_table (1, D.26201);
}


sgen_workers_get_job_gray_queue (struct WorkerData * worker_data)
{
  struct SgenGrayQueue * D.26202;
  struct SgenGrayQueue * iftmp.223;

  if (worker_data != 0B) goto <D.26204>; else goto <D.26205>;
  <D.26204>:
  iftmp.223 = &worker_data->private_gray_queue;
  goto <D.26206>;
  <D.26205>:
  iftmp.223 = &gray_queue;
  <D.26206>:
  D.26202 = iftmp.223;
  return D.26202;
}


job_scan_major_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.224;
  _Bool D.26209;
  long int D.26210;
  long int D.26211;
  void (*<T36c0>) (gboolean, struct SgenGrayQueue *) D.26214;
  struct SgenGrayQueue * D.26215;

  concurrent_collection_in_progress.224 = concurrent_collection_in_progress;
  D.26209 = concurrent_collection_in_progress.224 == 0;
  D.26210 = (long int) D.26209;
  D.26211 = __builtin_expect (D.26210, 0);
  if (D.26211 != 0) goto <D.26212>; else goto <D.26213>;
  <D.26212>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2383, "concurrent_collection_in_progress");
  <D.26213>:
  D.26214 = major_collector.scan_card_table;
  D.26215 = sgen_workers_get_job_gray_queue (worker_data);
  D.26214 (1, D.26215);
}


job_scan_finalizer_entries (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T35be>) (void * *, struct SgenGrayQueue *) D.26216;
  struct SgenGrayQueue * D.26217;
  struct FinalizeReadyEntry * D.26218;
  struct ScanFinalizerEntriesJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      ctx.scan_func = 0B;
      D.26216 = current_object_ops.copy_or_mark_object;
      ctx.copy_func = D.26216;
      D.26217 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.26217;
      D.26218 = job_data->list;
      scan_finalizer_entries (D.26218, ctx);
      sgen_free_internal_dynamic (job_data, 4, 20);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


scan_finalizer_entries (struct FinalizeReadyEntry * list, struct ScanCopyContext ctx)
{
  void * D.26219;
  struct FILE * gc_debug_file.225;
  const char * D.26225;
  void * * D.26226;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct SgenGrayQueue * queue;
  struct FinalizeReadyEntry * fin;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  fin = list;
  goto <D.22971>;
  <D.22970>:
  D.26219 = fin->object;
  if (D.26219 == 0B) goto <D.26220>; else goto <D.26221>;
  <D.26220>:
  // predicted unlikely by continue predictor.
  goto <D.22969>;
  <D.26221>:
  if (0 != 0) goto <D.26222>; else goto <D.26223>;
  <D.26222>:
  gc_debug_file.225 = gc_debug_file;
  D.26219 = fin->object;
  D.26219 = fin->object;
  D.26225 = safe_name (D.26219);
  fprintf (gc_debug_file.225, "Scan of fin ready object: %p (%s)\n\n", D.26219, D.26225);
  gc_debug_file.225 = gc_debug_file;
  fflush (gc_debug_file.225);
  <D.26223>:
  D.26226 = &fin->object;
  copy_func (D.26226, queue);
  <D.22969>:
  fin = fin->next;
  <D.22971>:
  if (fin != 0B) goto <D.22970>; else goto <D.22972>;
  <D.22972>:
}


job_scan_thread_data (struct WorkerData * worker_data, void * job_data_untyped)
{
  char * D.26227;
  char * D.26228;
  struct SgenGrayQueue * D.26229;
  struct ScanThreadDataJobData * job_data;

  job_data = job_data_untyped;
  D.26227 = job_data->heap_start;
  D.26228 = job_data->heap_end;
  D.26229 = sgen_workers_get_job_gray_queue (worker_data);
  scan_thread_data (D.26227, D.26228, 1, D.26229);
  sgen_free_internal_dynamic (job_data, 8, 20);
}


scan_thread_data (void * start_nursery, void * end_nursery, gboolean precise, struct GrayQueue * queue)
{
  struct MonoLinkedListSet * D.26230;
  struct MonoLinkedListSetNode * D.26231;
  unsigned int D.26232;
  int D.26235;
  struct FILE * gc_debug_file.226;
  void * D.26241;
  void * D.26242;
  int D.26243;
  int D.26244;
  int D.26245;
  int D.26246;
  int D.26251;
  int D.26252;
  int D.26259;
  void (*<T3477>) (void *, guint8 *, guint8 *, gboolean) D.26262;
  int conservative_stack_mark.227;
  void * D.26266;
  struct _IO_FILE * stderr.228;
  struct MonoContext * D.26274;
  void * * D.26275;
  struct SgenThreadInfo * info;

  scan_area_arg_start = start_nursery;
  scan_area_arg_end = end_nursery;
  {
    struct MonoLinkedListSetNode * __cur;

    D.26230 = mono_thread_info_list_head ();
    __cur = D.26230->head;
    goto <D.23475>;
    <D.23474>:
    D.26231 = __cur->next;
    D.26232 = mono_lls_pointer_get_mark (D.26231);
    if (D.26232 == 0) goto <D.26233>; else goto <D.26234>;
    <D.26233>:
    info = __cur;
    D.26235 = info->skip;
    if (D.26235 != 0) goto <D.26236>; else goto <D.26237>;
    <D.26236>:
    if (0 != 0) goto <D.26238>; else goto <D.26239>;
    <D.26238>:
    gc_debug_file.226 = gc_debug_file;
    D.26241 = info->stack_start;
    D.26242 = info->stack_end;
    D.26242 = info->stack_end;
    D.26243 = (int) D.26242;
    D.26241 = info->stack_start;
    D.26244 = (int) D.26241;
    D.26245 = D.26243 - D.26244;
    fprintf (gc_debug_file.226, "Skipping dead thread %p, range: %p-%p, size: %td\n", info, D.26241, D.26242, D.26245);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.26239>:
    // predicted unlikely by continue predictor.
    goto <D.23472>;
    <D.26237>:
    D.26246 = info->gc_disabled;
    if (D.26246 != 0) goto <D.26247>; else goto <D.26248>;
    <D.26247>:
    if (0 != 0) goto <D.26249>; else goto <D.26250>;
    <D.26249>:
    gc_debug_file.226 = gc_debug_file;
    D.26241 = info->stack_start;
    D.26242 = info->stack_end;
    D.26242 = info->stack_end;
    D.26243 = (int) D.26242;
    D.26241 = info->stack_start;
    D.26244 = (int) D.26241;
    D.26245 = D.26243 - D.26244;
    fprintf (gc_debug_file.226, "GC disabled for thread %p, range: %p-%p, size: %td\n", info, D.26241, D.26242, D.26245);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.26250>:
    // predicted unlikely by continue predictor.
    goto <D.23472>;
    <D.26248>:
    D.26251 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.26252 = D.26251 & 15;
    if (D.26252 != 1) goto <D.26253>; else goto <D.26254>;
    <D.26253>:
    if (0 != 0) goto <D.26255>; else goto <D.26256>;
    <D.26255>:
    gc_debug_file.226 = gc_debug_file;
    D.26241 = info->stack_start;
    D.26242 = info->stack_end;
    D.26242 = info->stack_end;
    D.26243 = (int) D.26242;
    D.26241 = info->stack_start;
    D.26244 = (int) D.26241;
    D.26245 = D.26243 - D.26244;
    D.26251 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.26252 = D.26251 & 15;
    fprintf (gc_debug_file.226, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)\n", info, D.26241, D.26242, D.26245, D.26252);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.26256>:
    // predicted unlikely by continue predictor.
    goto <D.23472>;
    <D.26254>:
    if (0 != 0) goto <D.26257>; else goto <D.26258>;
    <D.26257>:
    gc_debug_file.226 = gc_debug_file;
    D.26241 = info->stack_start;
    D.26242 = info->stack_end;
    D.26242 = info->stack_end;
    D.26243 = (int) D.26242;
    D.26241 = info->stack_start;
    D.26244 = (int) D.26241;
    D.26245 = D.26243 - D.26244;
    D.26259 = sgen_get_pinned_count ();
    fprintf (gc_debug_file.226, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d\n", info, D.26241, D.26242, D.26245, D.26259);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.26258>:
    D.26262 = gc_callbacks.thread_mark_func;
    if (D.26262 != 0B) goto <D.26263>; else goto <D.26260>;
    <D.26263>:
    conservative_stack_mark.227 = conservative_stack_mark;
    if (conservative_stack_mark.227 == 0) goto <D.26265>; else goto <D.26260>;
    <D.26265>:
    {
      struct UserCopyOrMarkData data;

      try
        {
          data.func = 0B;
          data.queue = queue;
          set_user_copy_or_mark_data (&data);
          D.26262 = gc_callbacks.thread_mark_func;
          D.26266 = info->runtime_data;
          D.26241 = info->stack_start;
          D.26242 = info->stack_end;
          D.26262 (D.26266, D.26241, D.26242, precise);
          set_user_copy_or_mark_data (0B);
        }
      finally
        {
          data = {CLOBBER};
        }
    }
    goto <D.26261>;
    <D.26260>:
    if (precise == 0) goto <D.26267>; else goto <D.26268>;
    <D.26267>:
    conservative_stack_mark.227 = conservative_stack_mark;
    if (conservative_stack_mark.227 == 0) goto <D.26269>; else goto <D.26270>;
    <D.26269>:
    stderr.228 = stderr;
    fprintf (stderr.228, "Precise stack mark not supported - disabling.\n");
    conservative_stack_mark = 1;
    <D.26270>:
    D.26241 = info->stack_start;
    D.26242 = info->stack_end;
    conservatively_pin_objects_from (D.26241, D.26242, start_nursery, end_nursery, 0);
    <D.26268>:
    <D.26261>:
    if (precise == 0) goto <D.26272>; else goto <D.26273>;
    <D.26272>:
    D.26274 = &info->ctx;
    D.26274 = &info->ctx;
    D.26275 = D.26274 + 56;
    conservatively_pin_objects_from (D.26274, D.26275, start_nursery, end_nursery, 0);
    <D.26273>:
    <D.26234>:
    <D.23472>:
    D.26231 = __cur->next;
    __cur = mono_lls_pointer_unmask (D.26231);
    <D.23475>:
    if (__cur != 0B) goto <D.23474>; else goto <D.23476>;
    <D.23476>:
  }
}


mono_lls_pointer_get_mark (void * n)
{
  uintptr_t D.26276;
  unsigned int n.229;

  n.229 = (unsigned int) n;
  D.26276 = n.229 & 1;
  return D.26276;
}


set_user_copy_or_mark_data (struct UserCopyOrMarkData * data)
{
  unsigned int user_copy_or_mark_key.230;

  user_copy_or_mark_key.230 = user_copy_or_mark_key;
  mono_native_tls_set_value (user_copy_or_mark_key.230, data);
}


mono_native_tls_set_value (pthread_key_t key, void * value)
{
  int D.26280;
  int D.26281;
  _Bool D.26282;

  D.26281 = pthread_setspecific (key, value);
  D.26282 = D.26281 == 0;
  D.26280 = (int) D.26282;
  return D.26280;
}


conservatively_pin_objects_from (void * * start, void * * end, void * start_nursery, void * end_nursery, int pin_type)
{
  volatile unsigned int D.22788;
  unsigned int start.231;
  int end.232;
  int start.233;
  int D.26287;
  unsigned int D.26288;
  void * D.26289;
  unsigned int start_nursery.234;
  _Bool D.26295;
  unsigned int end_nursery.235;
  _Bool D.26297;
  _Bool D.26298;
  struct FILE * gc_debug_file.236;
  void * addr.237;
  int do_pin_stats.238;
  _Bool D.26306;
  long int D.26307;
  long int D.26308;
  int D.26311;
  char * addr.239;
  int count;

  count = 0;
  {
    volatile unsigned int _zzq_args[6];
    volatile unsigned int _zzq_result;

    _zzq_args[0] = 1296236555;
    start.231 = (unsigned int) start;
    _zzq_args[1] = start.231;
    end.232 = (int) end;
    start.233 = (int) start;
    D.26287 = end.232 - start.233;
    D.26288 = (unsigned int) D.26287;
    _zzq_args[2] = D.26288;
    _zzq_args[3] = 0;
    _zzq_args[4] = 0;
    _zzq_args[5] = 0;
    __asm__ __volatile__("mov r3, %1
	mov r4, %2
	mov r12, r12, ror #3  ; mov r12, r12, ror #13 
	mov r12, r12, ror #29 ; mov r12, r12, ror #19 
	orr r10, r10, r10
	mov %0, r3" : "=r" _zzq_result : "r" 0, "r" &_zzq_args[0] : "r4", "r3", "memory", "cc");
    D.22788 = _zzq_result;
  }
  goto <D.22791>;
  <D.22790>:
  D.26289 = *start;
  if (D.26289 >= start_nursery) goto <D.26290>; else goto <D.26291>;
  <D.26290>:
  D.26289 = *start;
  if (D.26289 < end_nursery) goto <D.26292>; else goto <D.26293>;
  <D.26292>:
  {
    mword addr;

    D.26289 = *start;
    addr = (mword) D.26289;
    addr = addr & 4294967288;
    start_nursery.234 = (unsigned int) start_nursery;
    D.26295 = start_nursery.234 <= addr;
    end_nursery.235 = (unsigned int) end_nursery;
    D.26297 = end_nursery.235 > addr;
    D.26298 = D.26295 & D.26297;
    if (D.26298 != 0) goto <D.26299>; else goto <D.26300>;
    <D.26299>:
    if (0 != 0) goto <D.26301>; else goto <D.26302>;
    <D.26301>:
    gc_debug_file.236 = gc_debug_file;
    addr.237 = (void *) addr;
    fprintf (gc_debug_file.236, "Pinning address %p from %p\n", addr.237, start);
    gc_debug_file.236 = gc_debug_file;
    fflush (gc_debug_file.236);
    <D.26302>:
    addr.237 = (void *) addr;
    sgen_pin_stage_ptr (addr.237);
    count = count + 1;
    <D.26300>:
    do_pin_stats.238 = do_pin_stats;
    D.26306 = do_pin_stats.238 != 0;
    D.26307 = (long int) D.26306;
    D.26308 = __builtin_expect (D.26307, 0);
    if (D.26308 != 0) goto <D.26309>; else goto <D.26310>;
    <D.26309>:
    addr.237 = (void *) addr;
    D.26311 = sgen_ptr_in_nursery (addr.237);
    if (D.26311 != 0) goto <D.26312>; else goto <D.26313>;
    <D.26312>:
    addr.239 = (char *) addr;
    sgen_pin_stats_register_address (addr.239, pin_type);
    <D.26313>:
    <D.26310>:
  }
  <D.26293>:
  <D.26291>:
  start = start + 4;
  <D.22791>:
  if (start < end) goto <D.22790>; else goto <D.22792>;
  <D.22792>:
  if (count != 0) goto <D.26315>; else goto <D.26316>;
  <D.26315>:
  if (0 != 0) goto <D.26317>; else goto <D.26318>;
  <D.26317>:
  gc_debug_file.236 = gc_debug_file;
  fprintf (gc_debug_file.236, "found %d potential pinned heap pointers\n", count);
  gc_debug_file.236 = gc_debug_file;
  fflush (gc_debug_file.236);
  <D.26318>:
  <D.26316>:
}


mono_lls_pointer_unmask (void * p)
{
  void * D.26319;
  unsigned int p.240;
  unsigned int D.26321;

  p.240 = (unsigned int) p;
  D.26321 = p.240 & 4294967292;
  D.26319 = (void *) D.26321;
  return D.26319;
}


job_scan_from_registered_roots (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T35c3>) (char *, struct SgenGrayQueue *) D.26323;
  void (*<T35be>) (void * *, struct SgenGrayQueue *) D.26324;
  struct SgenGrayQueue * D.26325;
  char * D.26326;
  char * D.26327;
  int D.26328;
  struct ScanFromRegisteredRootsJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      D.26323 = job_data->scan_func;
      ctx.scan_func = D.26323;
      D.26324 = job_data->copy_or_mark_func;
      ctx.copy_func = D.26324;
      D.26325 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.26325;
      D.26326 = job_data->heap_start;
      D.26327 = job_data->heap_end;
      D.26328 = job_data->root_type;
      scan_from_registered_roots (D.26326, D.26327, D.26328, ctx);
      sgen_free_internal_dynamic (job_data, 20, 20);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


scan_from_registered_roots (char * addr_start, char * addr_end, int root_type, struct ScanCopyContext ctx)
{
  unsigned int D.26329;
  struct FILE * gc_debug_file.241;
  char * D.26333;
  unsigned int D.26334;
  void * D.26335;
  struct SgenHashTableEntry * D.26336;
  unsigned int D.26337;
  void * * start_root;
  struct RootRecord * root;

  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

    __hash_table = &roots_hash[root_type];
    __table = __hash_table->table;
    __i = 0;
    goto <D.23033>;
    <D.23032>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.26329 = __i * 4;
      __iter = __table + D.26329;
      goto <D.23030>;
      <D.23029>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.26330>; else goto <D.26331>;
        <D.26330>:
        gc_debug_file.241 = gc_debug_file;
        D.26333 = root->end_root;
        D.26334 = root->root_desc;
        D.26335 = (void *) D.26334;
        fprintf (gc_debug_file.241, "Precise root scan %p-%p (desc: %p)\n", start_root, D.26333, D.26335);
        gc_debug_file.241 = gc_debug_file;
        fflush (gc_debug_file.241);
        <D.26331>:
        D.26333 = root->end_root;
        D.26334 = root->root_desc;
        precisely_scan_objects_from (start_root, D.26333, addr_start, addr_end, D.26334, ctx);
      }
      __iter = __next;
      <D.23030>:
      D.26336 = *__iter;
      if (D.26336 != 0B) goto <D.23029>; else goto <D.23031>;
      <D.23031>:
    }
    __i = __i + 1;
    <D.23033>:
    D.26337 = roots_hash[root_type].size;
    if (D.26337 > __i) goto <D.23032>; else goto <D.23034>;
    <D.23034>:
  }
}


precisely_scan_objects_from (void * * start_root, void * * end_root, char * n_start, char * n_end, mword desc, struct ScanCopyContext ctx)
{
  unsigned int D.26338;
  unsigned int D.26339;
  void * D.26342;
  struct FILE * gc_debug_file.242;
  unsigned int D.26348;
  unsigned int D.26349;
  gsize * bitmap_data.243;
  unsigned int D.26351;
  void * D.26354;
  int bwords.244;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct SgenGrayQueue * queue;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  D.26338 = desc & 7;
  switch (D.26338) <default: <D.22864>, case 1: <D.22843>, case 2: <D.22863>, case 3: <D.22847>, case 4: <D.22860>>
  <D.22843>:
  desc = desc >> 3;
  goto <D.22845>;
  <D.22844>:
  D.26339 = desc & 1;
  if (D.26339 != 0) goto <D.26340>; else goto <D.26341>;
  <D.26340>:
  D.26342 = *start_root;
  if (D.26342 != 0B) goto <D.26343>; else goto <D.26344>;
  <D.26343>:
  copy_func (start_root, queue);
  if (0 != 0) goto <D.26345>; else goto <D.26346>;
  <D.26345>:
  gc_debug_file.242 = gc_debug_file;
  D.26342 = *start_root;
  fprintf (gc_debug_file.242, "Overwrote root at %p with %p\n", start_root, D.26342);
  gc_debug_file.242 = gc_debug_file;
  fflush (gc_debug_file.242);
  <D.26346>:
  sgen_drain_gray_stack (-1, ctx);
  <D.26344>:
  <D.26341>:
  desc = desc >> 1;
  start_root = start_root + 4;
  <D.22845>:
  if (desc != 0) goto <D.22844>; else goto <D.22846>;
  <D.22846>:
  return;
  <D.22847>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.26348 = *bitmap_data;
    D.26349 = D.26348 + 4294967295;
    bwords = (int) D.26349;
    start_run = start_root;
    bitmap_data = bitmap_data + 4;
    goto <D.22857>;
    <D.22856>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.243 = bitmap_data;
      bitmap_data = bitmap_data.243 + 4;
      bmap = *bitmap_data.243;
      objptr = start_run;
      goto <D.22854>;
      <D.22853>:
      D.26351 = bmap & 1;
      if (D.26351 != 0) goto <D.26352>; else goto <D.26353>;
      <D.26352>:
      D.26354 = *objptr;
      if (D.26354 != 0B) goto <D.26355>; else goto <D.26356>;
      <D.26355>:
      copy_func (objptr, queue);
      if (0 != 0) goto <D.26357>; else goto <D.26358>;
      <D.26357>:
      gc_debug_file.242 = gc_debug_file;
      D.26354 = *objptr;
      fprintf (gc_debug_file.242, "Overwrote root at %p with %p\n", objptr, D.26354);
      gc_debug_file.242 = gc_debug_file;
      fflush (gc_debug_file.242);
      <D.26358>:
      sgen_drain_gray_stack (-1, ctx);
      <D.26356>:
      <D.26353>:
      bmap = bmap >> 1;
      objptr = objptr + 4;
      <D.22854>:
      if (bmap != 0) goto <D.22853>; else goto <D.22855>;
      <D.22855>:
      start_run = start_run + 128;
    }
    <D.22857>:
    bwords.244 = bwords;
    bwords = bwords.244 + -1;
    if (bwords.244 > 0) goto <D.22856>; else goto <D.22858>;
    <D.22858>:
    goto <D.22859>;
  }
  <D.22860>:
  {
    struct UserCopyOrMarkData data;
    void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

    try
      {
        data.func = copy_func;
        data.queue = queue;
        marker = sgen_get_user_descriptor_func (desc);
        set_user_copy_or_mark_data (&data);
        marker (start_root, single_arg_user_copy_or_mark);
        set_user_copy_or_mark_data (0B);
        goto <D.22859>;
      }
    finally
      {
        data = {CLOBBER};
      }
  }
  <D.22863>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1637);
  <D.22864>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1639);
  <D.22859>:
}


single_arg_user_copy_or_mark (void * * obj)
{
  unsigned int user_copy_or_mark_key.245;
  void (*<T35be>) (void * *, struct SgenGrayQueue *) D.26363;
  struct GrayQueue * D.26364;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.245 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.245);
  D.26363 = data->func;
  D.26364 = data->queue;
  D.26363 (obj, D.26364);
}


pin_stage_object_callback (char * obj, size_t size, void * data)
{
  sgen_pin_stage_ptr (obj);
}


init_gray_queue ()
{
  int D.26368;
  int D.26370;
  struct SgenSectionGrayQueue * D.26371;

  D.26368 = sgen_collection_is_parallel ();
  if (D.26368 != 0) goto <D.26365>; else goto <D.26369>;
  <D.26369>:
  D.26370 = sgen_collection_is_concurrent ();
  if (D.26370 != 0) goto <D.26365>; else goto <D.26366>;
  <D.26365>:
  sgen_workers_init_distribute_gray_queue ();
  D.26371 = sgen_workers_get_distribute_section_gray_queue ();
  sgen_gray_object_queue_init_with_alloc_prepare (&gray_queue, 0B, gray_queue_redirect, D.26371);
  goto <D.26367>;
  <D.26366>:
  sgen_gray_object_queue_init (&gray_queue, 0B);
  <D.26367>:
}


gray_queue_redirect (struct SgenGrayQueue * queue)
{
  void * D.26373;
  int iftmp.246;
  int concurrent_collection_in_progress.247;
  int current_collection_generation.248;
  int D.26384;
  _Bool D.26385;
  long int D.26386;
  long int D.26387;
  int D.26390;
  int concurrent_collection_in_progress.249;
  _Bool D.26397;
  long int D.26398;
  long int D.26399;
  gboolean wake;

  wake = 0;
  <D.22157>:
  {
    struct GrayQueueSection * section;

    section = sgen_gray_object_dequeue_section (queue);
    if (section == 0B) goto <D.22156>; else goto <D.26372>;
    <D.26372>:
    D.26373 = queue->alloc_prepare_data;
    sgen_section_gray_queue_enqueue (D.26373, section);
    wake = 1;
  }
  goto <D.22157>;
  <D.22156>:
  if (wake != 0) goto <D.26374>; else goto <D.26375>;
  <D.26374>:
  concurrent_collection_in_progress.247 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.247 == 0) goto <D.26381>; else goto <D.26377>;
  <D.26381>:
  current_collection_generation.248 = current_collection_generation;
  if (current_collection_generation.248 != 1) goto <D.26378>; else goto <D.26383>;
  <D.26383>:
  D.26384 = major_collector.is_parallel;
  if (D.26384 == 0) goto <D.26378>; else goto <D.26377>;
  <D.26378>:
  iftmp.246 = 1;
  goto <D.26379>;
  <D.26377>:
  iftmp.246 = 0;
  <D.26379>:
  D.26385 = iftmp.246 != 0;
  D.26386 = (long int) D.26385;
  D.26387 = __builtin_expect (D.26386, 0);
  if (D.26387 != 0) goto <D.26388>; else goto <D.26389>;
  <D.26388>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 602, "concurrent_collection_in_progress || (current_collection_generation == GENERATION_OLD && major_collector.is_parallel)");
  <D.26389>:
  D.26390 = sgen_workers_have_started ();
  if (D.26390 != 0) goto <D.26391>; else goto <D.26392>;
  <D.26391>:
  sgen_workers_wake_up_all ();
  goto <D.26393>;
  <D.26392>:
  concurrent_collection_in_progress.249 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.249 != 0) goto <D.26395>; else goto <D.26396>;
  <D.26395>:
  current_collection_generation.248 = current_collection_generation;
  D.26397 = current_collection_generation.248 != -1;
  D.26398 = (long int) D.26397;
  D.26399 = __builtin_expect (D.26398, 0);
  if (D.26399 != 0) goto <D.26400>; else goto <D.26401>;
  <D.26400>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 607, "current_collection_generation == -1");
  <D.26401>:
  <D.26396>:
  <D.26393>:
  <D.26375>:
}


pin_from_roots (void * start_nursery, void * end_nursery, struct GrayQueue * queue)
{
  int gc_debug_level.250;
  _Bool D.26403;
  long int D.26404;
  long int D.26405;
  struct FILE * gc_debug_file.251;
  unsigned int roots_size.252;
  int roots_size.253;
  unsigned int D.26411;
  unsigned int D.26412;
  unsigned int D.26413;
  char * D.26416;
  struct SgenHashTableEntry * D.26417;
  unsigned int D.26418;
  void * * start_root;
  struct RootRecord * root;

  gc_debug_level.250 = gc_debug_level;
  D.26403 = gc_debug_level.250 > 1;
  D.26404 = (long int) D.26403;
  D.26405 = __builtin_expect (D.26404, 0);
  if (D.26405 != 0) goto <D.26406>; else goto <D.26407>;
  <D.26406>:
  gc_debug_file.251 = gc_debug_file;
  roots_size.252 = roots_size;
  roots_size.253 = (int) roots_size.252;
  D.26411 = roots_hash[0].num_entries;
  D.26412 = roots_hash[1].num_entries;
  fprintf (gc_debug_file.251, "Scanning pinned roots (%d bytes, %d/%d entries)\n", roots_size.253, D.26411, D.26412);
  gc_debug_file.251 = gc_debug_file;
  fflush (gc_debug_file.251);
  <D.26407>:
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

    __hash_table = &roots_hash[1];
    __table = __hash_table->table;
    __i = 0;
    goto <D.22810>;
    <D.22809>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.26413 = __i * 4;
      __iter = __table + D.26413;
      goto <D.22807>;
      <D.22806>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.26414>; else goto <D.26415>;
        <D.26414>:
        gc_debug_file.251 = gc_debug_file;
        D.26416 = root->end_root;
        fprintf (gc_debug_file.251, "Pinned roots %p-%p\n", start_root, D.26416);
        gc_debug_file.251 = gc_debug_file;
        fflush (gc_debug_file.251);
        <D.26415>:
        D.26416 = root->end_root;
        conservatively_pin_objects_from (start_root, D.26416, start_nursery, end_nursery, 2);
      }
      __iter = __next;
      <D.22807>:
      D.26417 = *__iter;
      if (D.26417 != 0B) goto <D.22806>; else goto <D.22808>;
      <D.22808>:
    }
    __i = __i + 1;
    <D.22810>:
    D.26418 = roots_hash[1].size;
    if (D.26418 > __i) goto <D.22809>; else goto <D.22811>;
    <D.22811>:
  }
  scan_thread_data (start_nursery, end_nursery, 0, queue);
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.26419;
  gboolean D.26422;
  unsigned int D.26423;
  unsigned int D.26426;

  D.26419 = desc & 4294901767;
  if (D.26419 == 1) goto <D.26420>; else goto <D.26421>;
  <D.26420>:
  D.26422 = 0;
  return D.26422;
  <D.26421>:
  D.26423 = desc & 49159;
  if (D.26423 == 4) goto <D.26424>; else goto <D.26425>;
  <D.26424>:
  D.26422 = 0;
  return D.26422;
  <D.26425>:
  D.26426 = desc & 7;
  if (D.26426 == 7) goto <D.26427>; else goto <D.26428>;
  <D.26427>:
  D.26422 = 0;
  return D.26422;
  <D.26428>:
  D.26422 = 1;
  return D.26422;
}


scan_nursery_objects (struct ScanCopyContext ctx)
{
  struct GCMemSection * nursery_section.254;
  char * D.26431;
  char * D.26432;

  nursery_section.254 = nursery_section;
  D.26431 = nursery_section.254->data;
  nursery_section.254 = nursery_section;
  D.26432 = nursery_section.254->end_data;
  sgen_scan_area_with_callback (D.26431, D.26432, scan_nursery_objects_callback, &ctx, 0);
}


scan_nursery_objects_callback (char * obj, size_t size, struct ScanCopyContext * ctx)
{
  void (*<T35c3>) (char *, struct SgenGrayQueue *) D.26433;
  struct SgenGrayQueue * D.26434;

  D.26433 = ctx->scan_func;
  D.26434 = ctx->queue;
  D.26433 (obj, D.26434);
}


report_registered_roots ()
{
  report_registered_roots_by_type (0);
  report_registered_roots_by_type (2);
}


report_registered_roots_by_type (int root_type)
{
  unsigned int D.26435;
  struct FILE * gc_debug_file.255;
  char * D.26439;
  unsigned int D.26440;
  void * D.26441;
  struct SgenHashTableEntry * D.26442;
  unsigned int D.26443;
  struct GCRootReport report;
  void * * start_root;
  struct RootRecord * root;

  try
    {
      report.count = 0;
      {
        struct SgenHashTable * __hash_table;
        struct SgenHashTableEntry * * __table;
        guint __i;

        __hash_table = &roots_hash[root_type];
        __table = __hash_table->table;
        __i = 0;
        goto <D.22957>;
        <D.22956>:
        {
          struct SgenHashTableEntry * * __iter;
          struct SgenHashTableEntry * * __next;

          D.26435 = __i * 4;
          __iter = __table + D.26435;
          goto <D.22954>;
          <D.22953>:
          {
            struct SgenHashTableEntry * __entry;

            __entry = *__iter;
            __next = &__entry->next;
            start_root = __entry->key;
            root = &__entry->data;
            if (0 != 0) goto <D.26436>; else goto <D.26437>;
            <D.26436>:
            gc_debug_file.255 = gc_debug_file;
            D.26439 = root->end_root;
            D.26440 = root->root_desc;
            D.26441 = (void *) D.26440;
            fprintf (gc_debug_file.255, "Precise root scan %p-%p (desc: %p)\n", start_root, D.26439, D.26441);
            gc_debug_file.255 = gc_debug_file;
            fflush (gc_debug_file.255);
            <D.26437>:
            D.26439 = root->end_root;
            D.26440 = root->root_desc;
            precisely_report_roots_from (&report, start_root, D.26439, D.26440);
          }
          __iter = __next;
          <D.22954>:
          D.26442 = *__iter;
          if (D.26442 != 0B) goto <D.22953>; else goto <D.22955>;
          <D.22955>:
        }
        __i = __i + 1;
        <D.22957>:
        D.26443 = roots_hash[root_type].size;
        if (D.26443 > __i) goto <D.22956>; else goto <D.22958>;
        <D.22958>:
      }
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


precisely_report_roots_from (struct GCRootReport * report, void * * start_root, void * * end_root, mword desc)
{
  unsigned int D.26444;
  unsigned int D.26445;
  void * D.26448;
  unsigned int D.26451;
  unsigned int D.26452;
  gsize * bitmap_data.256;
  unsigned int D.26454;
  void * D.26457;
  int bwords.257;

  D.26444 = desc & 7;
  switch (D.26444) <default: <D.22940>, case 1: <D.22920>, case 2: <D.22939>, case 3: <D.22924>, case 4: <D.22937>>
  <D.22920>:
  desc = desc >> 3;
  goto <D.22922>;
  <D.22921>:
  D.26445 = desc & 1;
  if (D.26445 != 0) goto <D.26446>; else goto <D.26447>;
  <D.26446>:
  D.26448 = *start_root;
  if (D.26448 != 0B) goto <D.26449>; else goto <D.26450>;
  <D.26449>:
  D.26448 = *start_root;
  add_profile_gc_root (report, D.26448, 3, 0);
  <D.26450>:
  <D.26447>:
  desc = desc >> 1;
  start_root = start_root + 4;
  <D.22922>:
  if (desc != 0) goto <D.22921>; else goto <D.22923>;
  <D.22923>:
  return;
  <D.22924>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.26451 = *bitmap_data;
    D.26452 = D.26451 + 4294967295;
    bwords = (int) D.26452;
    start_run = start_root;
    bitmap_data = bitmap_data + 4;
    goto <D.22934>;
    <D.22933>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.256 = bitmap_data;
      bitmap_data = bitmap_data.256 + 4;
      bmap = *bitmap_data.256;
      objptr = start_run;
      goto <D.22931>;
      <D.22930>:
      D.26454 = bmap & 1;
      if (D.26454 != 0) goto <D.26455>; else goto <D.26456>;
      <D.26455>:
      D.26457 = *objptr;
      if (D.26457 != 0B) goto <D.26458>; else goto <D.26459>;
      <D.26458>:
      D.26457 = *objptr;
      add_profile_gc_root (report, D.26457, 3, 0);
      <D.26459>:
      <D.26456>:
      bmap = bmap >> 1;
      objptr = objptr + 4;
      <D.22931>:
      if (bmap != 0) goto <D.22930>; else goto <D.22932>;
      <D.22932>:
      start_run = start_run + 128;
    }
    <D.22934>:
    bwords.257 = bwords;
    bwords = bwords.257 + -1;
    if (bwords.257 > 0) goto <D.22933>; else goto <D.22935>;
    <D.22935>:
    goto <D.22936>;
  }
  <D.22937>:
  {
    void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

    marker = sgen_get_user_descriptor_func (desc);
    root_report = report;
    marker (start_root, single_arg_report_root);
    goto <D.22936>;
  }
  <D.22939>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1821);
  <D.22940>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1823);
  <D.22936>:
}


single_arg_report_root (void * * obj)
{
  void * D.26462;
  struct GCRootReport * root_report.258;

  D.26462 = *obj;
  if (D.26462 != 0B) goto <D.26463>; else goto <D.26464>;
  <D.26463>:
  root_report.258 = root_report;
  D.26462 = *obj;
  add_profile_gc_root (root_report.258, D.26462, 3, 0);
  <D.26464>:
}


report_finalizer_roots ()
{
  struct FinalizeReadyEntry * fin_ready_list.259;
  struct FinalizeReadyEntry * critical_fin_list.260;

  fin_ready_list.259 = fin_ready_list;
  report_finalizer_roots_list (fin_ready_list.259);
  critical_fin_list.260 = critical_fin_list;
  report_finalizer_roots_list (critical_fin_list.260);
}


report_finalizer_roots_list (struct FinalizeReadyEntry * list)
{
  void * D.26468;
  struct GCRootReport report;
  struct FinalizeReadyEntry * fin;

  try
    {
      report.count = 0;
      fin = list;
      goto <D.22905>;
      <D.22904>:
      D.26468 = fin->object;
      if (D.26468 == 0B) goto <D.26469>; else goto <D.26470>;
      <D.26469>:
      // predicted unlikely by continue predictor.
      goto <D.22903>;
      <D.26470>:
      D.26468 = fin->object;
      add_profile_gc_root (&report, D.26468, 1, 0);
      <D.22903>:
      fin = fin->next;
      <D.22905>:
      if (fin != 0B) goto <D.22904>; else goto <D.22906>;
      <D.22906>:
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


join_workers ()
{
  int concurrent_collection_in_progress.261;
  int D.26475;
  int D.26476;
  _Bool D.26477;
  long int D.26478;
  long int D.26479;

  concurrent_collection_in_progress.261 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.261 != 0) goto <D.26471>; else goto <D.26474>;
  <D.26474>:
  D.26475 = major_collector.is_parallel;
  if (D.26475 != 0) goto <D.26471>; else goto <D.26472>;
  <D.26471>:
  gray_queue_redirect (&gray_queue);
  sgen_workers_join ();
  <D.26472>:
  D.26476 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.26477 = D.26476 == 0;
  D.26478 = (long int) D.26477;
  D.26479 = __builtin_expect (D.26478, 0);
  if (D.26479 != 0) goto <D.26480>; else goto <D.26481>;
  <D.26480>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3122, "sgen_gray_object_queue_is_empty (&gray_queue)");
  <D.26481>:
}


check_nursery_is_clean ()
{
  void * D.26482;
  int iftmp.262;
  unsigned int D.26488;
  unsigned int D.26489;
  unsigned int D.26491;
  _Bool D.26493;
  long int D.26494;
  long int D.26495;
  unsigned int D.26498;
  _Bool D.26499;
  long int D.26500;
  long int D.26501;
  unsigned int D.26504;
  unsigned int D.26505;
  char * D.26506;
  char * start;
  char * end;
  char * cur;

  cur = sgen_get_nursery_start ();
  start = cur;
  end = sgen_get_nursery_end ();
  goto <D.23187>;
  <D.23188>:
  {
    size_t ss;
    size_t size;

    D.26482 = MEM[(void * *)cur];
    if (D.26482 == 0B) goto <D.26483>; else goto <D.26484>;
    <D.26483>:
    cur = cur + 4;
    // predicted unlikely by continue predictor.
    goto <D.23187>;
    <D.26484>:
    D.26488 = MEM[(mword *)cur];
    D.26489 = D.26488 & 1;
    if (D.26489 != 0) goto <D.26490>; else goto <D.26486>;
    <D.26490>:
    D.26488 = MEM[(mword *)cur];
    D.26491 = D.26488 & 4294967292;
    if (D.26491 != 0) goto <D.26492>; else goto <D.26486>;
    <D.26492>:
    iftmp.262 = 1;
    goto <D.26487>;
    <D.26486>:
    iftmp.262 = 0;
    <D.26487>:
    D.26493 = iftmp.262 != 0;
    D.26494 = (long int) D.26493;
    D.26495 = __builtin_expect (D.26494, 0);
    if (D.26495 != 0) goto <D.26496>; else goto <D.26497>;
    <D.26496>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2468, "!object_is_forwarded (cur)");
    <D.26497>:
    D.26488 = MEM[(mword *)cur];
    D.26498 = D.26488 & 2;
    D.26499 = D.26498 != 0;
    D.26500 = (long int) D.26499;
    D.26501 = __builtin_expect (D.26500, 0);
    if (D.26501 != 0) goto <D.26502>; else goto <D.26503>;
    <D.26502>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2469, "!object_is_pinned (cur)");
    <D.26503>:
    ss = sgen_safe_object_get_size (cur);
    D.26504 = sgen_safe_object_get_size (cur);
    D.26505 = D.26504 + 7;
    size = D.26505 & 4294967288;
    D.26506 = cur + size;
    verify_scan_starts (cur, D.26506);
    cur = cur + size;
  }
  <D.23187>:
  if (cur < end) goto <D.23188>; else goto <D.23189>;
  <D.23189>:
}


verify_scan_starts (char * start, char * end)
{
  struct GCMemSection * nursery_section.263;
  char * * D.26508;
  unsigned int i.264;
  unsigned int D.26510;
  char * * D.26511;
  _Bool D.26512;
  _Bool D.26513;
  _Bool D.26514;
  int gc_debug_level.265;
  _Bool D.26518;
  long int D.26519;
  long int D.26520;
  struct FILE * gc_debug_file.266;
  unsigned int D.26524;
  int i;

  i = 0;
  goto <D.23165>;
  <D.23164>:
  {
    char * addr;

    nursery_section.263 = nursery_section;
    D.26508 = nursery_section.263->scan_starts;
    i.264 = (unsigned int) i;
    D.26510 = i.264 * 4;
    D.26511 = D.26508 + D.26510;
    addr = *D.26511;
    D.26512 = addr > start;
    D.26513 = addr < end;
    D.26514 = D.26512 & D.26513;
    if (D.26514 != 0) goto <D.26515>; else goto <D.26516>;
    <D.26515>:
    gc_debug_level.265 = gc_debug_level;
    D.26518 = gc_debug_level.265 > 0;
    D.26519 = (long int) D.26518;
    D.26520 = __builtin_expect (D.26519, 0);
    if (D.26520 != 0) goto <D.26521>; else goto <D.26522>;
    <D.26521>:
    gc_debug_file.266 = gc_debug_file;
    fprintf (gc_debug_file.266, "NFC-BAD SCAN START [%d] %p for obj [%p %p]\n", i, addr, start, end);
    gc_debug_file.266 = gc_debug_file;
    fflush (gc_debug_file.266);
    <D.26522>:
    <D.26516>:
  }
  i = i + 1;
  <D.23165>:
  i.264 = (unsigned int) i;
  nursery_section.263 = nursery_section;
  D.26524 = nursery_section.263->num_scan_start;
  if (i.264 < D.26524) goto <D.23164>; else goto <D.23166>;
  <D.23166>:
}


finish_gray_stack (int generation, struct GrayQueue * queue)
{
  char * iftmp.267;
  char * iftmp.268;
  int gc_debug_level.269;
  _Bool D.26534;
  long int D.26535;
  long int D.26536;
  struct FILE * gc_debug_file.270;
  const char * D.26540;
  int D.26541;
  int D.26544;
  const char * D.26557;
  long long int D.26558;
  long long int D.26559;
  int D.26560;
  int D.26561;
  _Bool D.26562;
  long int D.26563;
  long int D.26564;
  int D.26569;
  int D.26571;
  _Bool D.26572;
  long int D.26573;
  long int D.26574;
  gint64 atv;
  gint64 btv;
  int done_with_ephemerons;
  int ephemeron_rounds;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  struct ScanCopyContext ctx;
  char * start_addr;
  char * end_addr;

  try
    {
      ephemeron_rounds = 0;
      copy_func = current_object_ops.copy_or_mark_object;
      scan_func = current_object_ops.scan_object;
      ctx.scan_func = scan_func;
      ctx.copy_func = copy_func;
      ctx.queue = queue;
      if (generation == 0) goto <D.26526>; else goto <D.26527>;
      <D.26526>:
      iftmp.267 = sgen_get_nursery_start ();
      goto <D.26528>;
      <D.26527>:
      iftmp.267 = 0B;
      <D.26528>:
      start_addr = iftmp.267;
      if (generation == 0) goto <D.26530>; else goto <D.26531>;
      <D.26530>:
      iftmp.268 = sgen_get_nursery_end ();
      goto <D.26532>;
      <D.26531>:
      iftmp.268 = 4294967295B;
      <D.26532>:
      end_addr = iftmp.268;
      sgen_drain_gray_stack (-1, ctx);
      atv = mono_100ns_ticks ();
      gc_debug_level.269 = gc_debug_level;
      D.26534 = gc_debug_level.269 > 1;
      D.26535 = (long int) D.26534;
      D.26536 = __builtin_expect (D.26535, 0);
      if (D.26536 != 0) goto <D.26537>; else goto <D.26538>;
      <D.26537>:
      gc_debug_file.270 = gc_debug_file;
      D.26540 = generation_name (generation);
      fprintf (gc_debug_file.270, "%s generation done\n", D.26540);
      gc_debug_file.270 = gc_debug_file;
      fflush (gc_debug_file.270);
      <D.26538>:
      D.26541 = sgen_need_bridge_processing ();
      if (D.26541 != 0) goto <D.26542>; else goto <D.26543>;
      <D.26542>:
      sgen_bridge_reset_data ();
      <D.26543>:
      done_with_ephemerons = 0;
      <D.22998>:
      done_with_ephemerons = mark_ephemerons_in_range (ctx);
      sgen_drain_gray_stack (-1, ctx);
      ephemeron_rounds = ephemeron_rounds + 1;
      if (done_with_ephemerons == 0) goto <D.22998>; else goto <D.22999>;
      <D.22999>:
      sgen_scan_togglerefs (start_addr, end_addr, ctx);
      D.26544 = sgen_need_bridge_processing ();
      if (D.26544 != 0) goto <D.26545>; else goto <D.26546>;
      <D.26545>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_collect_bridge_objects (generation, ctx);
      if (generation == 1) goto <D.26547>; else goto <D.26548>;
      <D.26547>:
      sgen_collect_bridge_objects (0, ctx);
      <D.26548>:
      sgen_bridge_processing_stw_step ();
      <D.26546>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_null_link_in_range (generation, 1, ctx);
      if (generation == 1) goto <D.26549>; else goto <D.26550>;
      <D.26549>:
      sgen_null_link_in_range (0, 1, ctx);
      <D.26550>:
      sgen_finalize_in_range (generation, ctx);
      if (generation == 1) goto <D.26551>; else goto <D.26552>;
      <D.26551>:
      sgen_finalize_in_range (0, ctx);
      <D.26552>:
      if (0 != 0) goto <D.26553>; else goto <D.26554>;
      <D.26553>:
      gc_debug_file.270 = gc_debug_file;
      fprintf (gc_debug_file.270, "Precise scan of gray area post fin\n");
      gc_debug_file.270 = gc_debug_file;
      fflush (gc_debug_file.270);
      <D.26554>:
      sgen_drain_gray_stack (-1, ctx);
      done_with_ephemerons = 0;
      <D.23000>:
      done_with_ephemerons = mark_ephemerons_in_range (ctx);
      sgen_drain_gray_stack (-1, ctx);
      ephemeron_rounds = ephemeron_rounds + 1;
      if (done_with_ephemerons == 0) goto <D.23000>; else goto <D.23001>;
      <D.23001>:
      clear_unreachable_ephemerons (ctx);
      btv = mono_100ns_ticks ();
      gc_debug_level.269 = gc_debug_level;
      D.26534 = gc_debug_level.269 > 1;
      D.26535 = (long int) D.26534;
      D.26536 = __builtin_expect (D.26535, 0);
      if (D.26536 != 0) goto <D.26555>; else goto <D.26556>;
      <D.26555>:
      gc_debug_file.270 = gc_debug_file;
      D.26557 = generation_name (generation);
      D.26558 = btv - atv;
      D.26559 = D.26558 / 10;
      D.26560 = (int) D.26559;
      fprintf (gc_debug_file.270, "Finalize queue handling scan for %s generation: %d usecs %d ephemeron rounds\n", D.26557, D.26560, ephemeron_rounds);
      gc_debug_file.270 = gc_debug_file;
      fflush (gc_debug_file.270);
      <D.26556>:
      D.26561 = sgen_gray_object_queue_is_empty (queue);
      D.26562 = D.26561 == 0;
      D.26563 = (long int) D.26562;
      D.26564 = __builtin_expect (D.26563, 0);
      if (D.26564 != 0) goto <D.26565>; else goto <D.26566>;
      <D.26565>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2014, "sgen_gray_object_queue_is_empty (queue)");
      <D.26566>:
      <D.23003>:
      sgen_null_link_in_range (generation, 0, ctx);
      if (generation == 1) goto <D.26567>; else goto <D.26568>;
      <D.26567>:
      sgen_null_link_in_range (0, 0, ctx);
      <D.26568>:
      D.26569 = sgen_gray_object_queue_is_empty (queue);
      if (D.26569 != 0) goto <D.23002>; else goto <D.26570>;
      <D.26570>:
      sgen_drain_gray_stack (-1, ctx);
      goto <D.23003>;
      <D.23002>:
      D.26571 = sgen_gray_object_queue_is_empty (queue);
      D.26572 = D.26571 == 0;
      D.26573 = (long int) D.26572;
      D.26574 = __builtin_expect (D.26573, 0);
      if (D.26574 != 0) goto <D.26575>; else goto <D.26576>;
      <D.26575>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2024, "sgen_gray_object_queue_is_empty (queue)");
      <D.26576>:
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mark_ephemerons_in_range (struct ScanCopyContext ctx)
{
  char * object.271;
  struct FILE * gc_debug_file.272;
  char * object.273;
  int D.26582;
  unsigned int D.26587;
  unsigned int D.26588;
  unsigned int D.26589;
  unsigned int D.26590;
  struct MonoVTable * D.26591;
  struct MonoDomain * D.26592;
  _Bool D.26593;
  _Bool D.26594;
  _Bool D.26595;
  int cur.274;
  char * D.26601;
  int D.26602;
  int D.26603;
  int D.26604;
  const char * iftmp.275;
  int D.26606;
  void * D.26610;
  const char * iftmp.276;
  int D.26615;
  int D.26617;
  void * * D.26620;
  int D.26623;
  void * * D.26626;
  int D.26629;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct GrayQueue * queue;
  int nothing_marked;
  struct EphemeronLinkNode * current;
  struct MonoArray * array;
  struct Ephemeron * cur;
  struct Ephemeron * array_end;
  char * tombstone;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  nothing_marked = 1;
  current = ephemeron_list;
  current = ephemeron_list;
  goto <D.23388>;
  <D.23387>:
  {
    char * object;

    try
      {
        object.271 = current->array;
        object = object.271;
        if (0 != 0) goto <D.26578>; else goto <D.26579>;
        <D.26578>:
        gc_debug_file.272 = gc_debug_file;
        object.273 = object;
        fprintf (gc_debug_file.272, "Ephemeron array at %p\n", object.273);
        gc_debug_file.272 = gc_debug_file;
        fflush (gc_debug_file.272);
        <D.26579>:
        object.273 = object;
        D.26582 = sgen_is_object_alive_for_current_gen (object.273);
        if (D.26582 == 0) goto <D.26583>; else goto <D.26584>;
        <D.26583>:
        if (0 != 0) goto <D.26585>; else goto <D.26586>;
        <D.26585>:
        gc_debug_file.272 = gc_debug_file;
        fprintf (gc_debug_file.272, "\tnot reachable\n");
        gc_debug_file.272 = gc_debug_file;
        fflush (gc_debug_file.272);
        <D.26586>:
        // predicted unlikely by continue predictor.
        goto <D.23380>;
        <D.26584>:
        copy_func (&object, queue);
        array = object;
        cur = mono_array_addr_with_size (array, 8, 0);
        D.26587 = array->max_length;
        D.26588 = D.26587 * 8;
        array_end = cur + D.26588;
        object.273 = object;
        D.26589 = MEM[(mword *)object.273];
        D.26590 = D.26589 & 4294967292;
        D.26591 = (struct MonoVTable *) D.26590;
        D.26592 = D.26591->domain;
        tombstone = D.26592->ephemeron_tombstone;
        goto <D.23385>;
        <D.23384>:
        {
          char * key;

          key = cur->key;
          D.26593 = key == 0B;
          D.26594 = key == tombstone;
          D.26595 = D.26593 | D.26594;
          if (D.26595 != 0) goto <D.26596>; else goto <D.26597>;
          <D.26596>:
          // predicted unlikely by continue predictor.
          goto <D.23382>;
          <D.26597>:
          if (0 != 0) goto <D.26598>; else goto <D.26599>;
          <D.26598>:
          gc_debug_file.272 = gc_debug_file;
          cur.274 = (int) cur;
          D.26601 = mono_array_addr_with_size (array, 8, 0);
          D.26602 = (int) D.26601;
          D.26603 = cur.274 - D.26602;
          D.26604 = D.26603 /[ex] 8;
          D.26606 = sgen_is_object_alive_for_current_gen (key);
          if (D.26606 != 0) goto <D.26607>; else goto <D.26608>;
          <D.26607>:
          iftmp.275 = "reachable";
          goto <D.26609>;
          <D.26608>:
          iftmp.275 = "unreachable";
          <D.26609>:
          D.26610 = cur->value;
          D.26610 = cur->value;
          if (D.26610 != 0B) goto <D.26614>; else goto <D.26612>;
          <D.26614>:
          D.26610 = cur->value;
          D.26615 = sgen_is_object_alive_for_current_gen (D.26610);
          if (D.26615 != 0) goto <D.26616>; else goto <D.26612>;
          <D.26616>:
          iftmp.276 = "reachable";
          goto <D.26613>;
          <D.26612>:
          iftmp.276 = "unreachable";
          <D.26613>:
          fprintf (gc_debug_file.272, "[%td] key %p (%s) value %p (%s)\n", D.26604, key, iftmp.275, D.26610, iftmp.276);
          gc_debug_file.272 = gc_debug_file;
          fflush (gc_debug_file.272);
          <D.26599>:
          D.26617 = sgen_is_object_alive_for_current_gen (key);
          if (D.26617 != 0) goto <D.26618>; else goto <D.26619>;
          <D.26618>:
          {
            char * value;

            value = cur->value;
            D.26620 = &cur->key;
            copy_func (D.26620, queue);
            if (value != 0B) goto <D.26621>; else goto <D.26622>;
            <D.26621>:
            D.26623 = sgen_is_object_alive_for_current_gen (value);
            if (D.26623 == 0) goto <D.26624>; else goto <D.26625>;
            <D.26624>:
            nothing_marked = 0;
            <D.26625>:
            D.26626 = &cur->value;
            copy_func (D.26626, queue);
            <D.26622>:
          }
          <D.26619>:
        }
        <D.23382>:
        cur = cur + 8;
        <D.23385>:
        if (cur < array_end) goto <D.23384>; else goto <D.23386>;
        <D.23386>:
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.23380>:
  current = current->next;
  <D.23388>:
  if (current != 0B) goto <D.23387>; else goto <D.23389>;
  <D.23389>:
  if (0 != 0) goto <D.26627>; else goto <D.26628>;
  <D.26627>:
  gc_debug_file.272 = gc_debug_file;
  fprintf (gc_debug_file.272, "Ephemeron run finished. Is it done %d\n", nothing_marked);
  gc_debug_file.272 = gc_debug_file;
  fflush (gc_debug_file.272);
  <D.26628>:
  D.26629 = nothing_marked;
  return D.26629;
}


sgen_is_object_alive_for_current_gen (char * object)
{
  int D.26633;
  int D.26636;
  int current_collection_generation.277;

  D.26633 = sgen_ptr_in_nursery (object);
  if (D.26633 != 0) goto <D.26634>; else goto <D.26635>;
  <D.26634>:
  D.26636 = sgen_nursery_is_object_alive (object);
  return D.26636;
  <D.26635>:
  current_collection_generation.277 = current_collection_generation;
  if (current_collection_generation.277 == 0) goto <D.26638>; else goto <D.26639>;
  <D.26638>:
  D.26636 = 1;
  return D.26636;
  <D.26639>:
  D.26636 = sgen_major_is_object_alive (object);
  return D.26636;
}


sgen_nursery_is_object_alive (char * obj)
{
  int D.26641;
  _Bool D.26642;
  long int D.26643;
  long int D.26644;
  int D.26647;
  gboolean D.26650;
  unsigned int D.26653;
  unsigned int D.26654;
  unsigned int D.26656;
  unsigned int D.26658;

  D.26641 = sgen_ptr_in_nursery (obj);
  D.26642 = D.26641 == 0;
  D.26643 = (long int) D.26642;
  D.26644 = __builtin_expect (D.26643, 0);
  if (D.26644 != 0) goto <D.26645>; else goto <D.26646>;
  <D.26645>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "../../mono/metadata/sgen-gc.h", 576, "sgen_ptr_in_nursery (obj)");
  <D.26646>:
  D.26647 = sgen_nursery_is_to_space (obj);
  if (D.26647 != 0) goto <D.26648>; else goto <D.26649>;
  <D.26648>:
  D.26650 = 1;
  return D.26650;
  <D.26649>:
  D.26653 = MEM[(mword *)obj];
  D.26654 = D.26653 & 2;
  if (D.26654 != 0) goto <D.26651>; else goto <D.26655>;
  <D.26655>:
  D.26653 = MEM[(mword *)obj];
  D.26656 = D.26653 & 1;
  if (D.26656 != 0) goto <D.26657>; else goto <D.26652>;
  <D.26657>:
  D.26653 = MEM[(mword *)obj];
  D.26658 = D.26653 & 4294967292;
  if (D.26658 != 0) goto <D.26651>; else goto <D.26652>;
  <D.26651>:
  D.26650 = 1;
  return D.26650;
  <D.26652>:
  D.26650 = 0;
  return D.26650;
}


sgen_nursery_is_to_space (char * object)
{
  int object.278;
  char * sgen_nursery_start.279;
  int sgen_nursery_start.280;
  int D.26663;
  int D.26664;
  _Bool D.26665;
  long int D.26666;
  long int D.26667;
  char * D.26670;
  char * D.26671;
  int sgen_space_bitmap_size.281;
  _Bool D.26673;
  long int D.26674;
  long int D.26675;
  gboolean D.26678;
  char * sgen_space_bitmap.282;
  sizetype byte.283;
  char * D.26681;
  char D.26682;
  int D.26683;
  int D.26684;
  int D.26685;
  _Bool D.26686;
  int idx;
  int byte;
  int bit;

  object.278 = (int) object;
  sgen_nursery_start.279 = sgen_nursery_start;
  sgen_nursery_start.280 = (int) sgen_nursery_start.279;
  D.26663 = object.278 - sgen_nursery_start.280;
  idx = D.26663 >> 9;
  byte = idx / 8;
  bit = idx & 7;
  D.26664 = sgen_ptr_in_nursery (object);
  D.26665 = D.26664 == 0;
  D.26666 = (long int) D.26665;
  D.26667 = __builtin_expect (D.26666, 0);
  if (D.26667 != 0) goto <D.26668>; else goto <D.26669>;
  <D.26668>:
  D.26670 = sgen_get_nursery_start ();
  D.26671 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.26670, D.26671);
  <D.19226>:
  goto <D.19226>;
  <D.26669>:
  sgen_space_bitmap_size.281 = sgen_space_bitmap_size;
  D.26673 = byte >= sgen_space_bitmap_size.281;
  D.26674 = (long int) D.26673;
  D.26675 = __builtin_expect (D.26674, 0);
  if (D.26675 != 0) goto <D.26676>; else goto <D.26677>;
  <D.26676>:
  sgen_space_bitmap_size.281 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.281);
  <D.19227>:
  goto <D.19227>;
  <D.26677>:
  sgen_space_bitmap.282 = sgen_space_bitmap;
  byte.283 = (sizetype) byte;
  D.26681 = sgen_space_bitmap.282 + byte.283;
  D.26682 = *D.26681;
  D.26683 = (int) D.26682;
  D.26684 = D.26683 >> bit;
  D.26685 = D.26684 & 1;
  D.26686 = D.26685 != 0;
  D.26678 = (gboolean) D.26686;
  return D.26678;
}


sgen_major_is_object_alive (void * object)
{
  unsigned int D.26690;
  unsigned int D.26691;
  unsigned int D.26693;
  unsigned int D.26695;
  gboolean D.26696;
  unsigned int D.26697;
  unsigned int D.26698;
  gboolean (*<T365a>) (char *) D.26701;
  mword objsize;

  D.26690 = MEM[(mword *)object];
  D.26691 = D.26690 & 2;
  if (D.26691 != 0) goto <D.26688>; else goto <D.26692>;
  <D.26692>:
  D.26690 = MEM[(mword *)object];
  D.26693 = D.26690 & 1;
  if (D.26693 != 0) goto <D.26694>; else goto <D.26689>;
  <D.26694>:
  D.26690 = MEM[(mword *)object];
  D.26695 = D.26690 & 4294967292;
  if (D.26695 != 0) goto <D.26688>; else goto <D.26689>;
  <D.26688>:
  D.26696 = 1;
  return D.26696;
  <D.26689>:
  D.26697 = sgen_safe_object_get_size (object);
  D.26698 = D.26697 + 7;
  objsize = D.26698 & 4294967288;
  if (objsize > 8000) goto <D.26699>; else goto <D.26700>;
  <D.26699>:
  D.26696 = sgen_los_object_is_pinned (object);
  return D.26696;
  <D.26700>:
  D.26701 = major_collector.is_object_live;
  D.26696 = D.26701 (object);
  return D.26696;
}


clear_unreachable_ephemerons (struct ScanCopyContext ctx)
{
  char * object.284;
  char * object.285;
  int D.26705;
  struct FILE * gc_debug_file.286;
  struct EphemeronLinkNode * ephemeron_list.287;
  unsigned int D.26717;
  unsigned int D.26718;
  unsigned int D.26719;
  unsigned int D.26720;
  struct MonoVTable * D.26721;
  struct MonoDomain * D.26722;
  _Bool D.26723;
  _Bool D.26724;
  _Bool D.26725;
  int cur.288;
  char * D.26731;
  int D.26732;
  int D.26733;
  int D.26734;
  const char * iftmp.289;
  int D.26736;
  void * D.26740;
  const char * iftmp.290;
  int D.26745;
  int D.26747;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct GrayQueue * queue;
  struct EphemeronLinkNode * current;
  struct EphemeronLinkNode * prev;
  struct MonoArray * array;
  struct Ephemeron * cur;
  struct Ephemeron * array_end;
  char * tombstone;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  current = ephemeron_list;
  prev = 0B;
  goto <D.23360>;
  <D.23366>:
  {
    char * object;

    try
      {
        object.284 = current->array;
        object = object.284;
        object.285 = object;
        D.26705 = sgen_is_object_alive_for_current_gen (object.285);
        if (D.26705 == 0) goto <D.26706>; else goto <D.26707>;
        <D.26706>:
        {
          struct EphemeronLinkNode * tmp;

          tmp = current;
          if (0 != 0) goto <D.26708>; else goto <D.26709>;
          <D.26708>:
          gc_debug_file.286 = gc_debug_file;
          object.285 = object;
          fprintf (gc_debug_file.286, "Dead Ephemeron array at %p\n", object.285);
          gc_debug_file.286 = gc_debug_file;
          fflush (gc_debug_file.286);
          <D.26709>:
          if (prev != 0B) goto <D.26711>; else goto <D.26712>;
          <D.26711>:
          ephemeron_list.287 = current->next;
          prev->next = ephemeron_list.287;
          goto <D.26714>;
          <D.26712>:
          ephemeron_list.287 = current->next;
          ephemeron_list = ephemeron_list.287;
          <D.26714>:
          current = current->next;
          sgen_free_internal (tmp, 18);
          // predicted unlikely by continue predictor.
          goto <D.23360>;
        }
        <D.26707>:
        copy_func (&object, queue);
        object.285 = object;
        current->array = object.285;
        if (0 != 0) goto <D.26715>; else goto <D.26716>;
        <D.26715>:
        gc_debug_file.286 = gc_debug_file;
        object.285 = object;
        fprintf (gc_debug_file.286, "Clearing unreachable entries for ephemeron array at %p\n", object.285);
        gc_debug_file.286 = gc_debug_file;
        fflush (gc_debug_file.286);
        <D.26716>:
        array = object;
        cur = mono_array_addr_with_size (array, 8, 0);
        D.26717 = array->max_length;
        D.26718 = D.26717 * 8;
        array_end = cur + D.26718;
        object.285 = object;
        D.26719 = MEM[(mword *)object.285];
        D.26720 = D.26719 & 4294967292;
        D.26721 = (struct MonoVTable *) D.26720;
        D.26722 = D.26721->domain;
        tombstone = D.26722->ephemeron_tombstone;
        goto <D.23364>;
        <D.23363>:
        {
          char * key;

          key = cur->key;
          D.26723 = key == 0B;
          D.26724 = key == tombstone;
          D.26725 = D.26723 | D.26724;
          if (D.26725 != 0) goto <D.26726>; else goto <D.26727>;
          <D.26726>:
          // predicted unlikely by continue predictor.
          goto <D.23362>;
          <D.26727>:
          if (0 != 0) goto <D.26728>; else goto <D.26729>;
          <D.26728>:
          gc_debug_file.286 = gc_debug_file;
          cur.288 = (int) cur;
          D.26731 = mono_array_addr_with_size (array, 8, 0);
          D.26732 = (int) D.26731;
          D.26733 = cur.288 - D.26732;
          D.26734 = D.26733 /[ex] 8;
          D.26736 = sgen_is_object_alive_for_current_gen (key);
          if (D.26736 != 0) goto <D.26737>; else goto <D.26738>;
          <D.26737>:
          iftmp.289 = "reachable";
          goto <D.26739>;
          <D.26738>:
          iftmp.289 = "unreachable";
          <D.26739>:
          D.26740 = cur->value;
          D.26740 = cur->value;
          if (D.26740 != 0B) goto <D.26744>; else goto <D.26742>;
          <D.26744>:
          D.26740 = cur->value;
          D.26745 = sgen_is_object_alive_for_current_gen (D.26740);
          if (D.26745 != 0) goto <D.26746>; else goto <D.26742>;
          <D.26746>:
          iftmp.290 = "reachable";
          goto <D.26743>;
          <D.26742>:
          iftmp.290 = "unreachable";
          <D.26743>:
          fprintf (gc_debug_file.286, "[%td] key %p (%s) value %p (%s)\n", D.26734, key, iftmp.289, D.26740, iftmp.290);
          gc_debug_file.286 = gc_debug_file;
          fflush (gc_debug_file.286);
          <D.26729>:
          D.26747 = sgen_is_object_alive_for_current_gen (key);
          if (D.26747 == 0) goto <D.26748>; else goto <D.26749>;
          <D.26748>:
          cur->key = tombstone;
          cur->value = 0B;
          // predicted unlikely by continue predictor.
          goto <D.23362>;
          <D.26749>:
        }
        <D.23362>:
        cur = cur + 8;
        <D.23364>:
        if (cur < array_end) goto <D.23363>; else goto <D.23365>;
        <D.23365>:
        prev = current;
        current = current->next;
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.23360>:
  if (current != 0B) goto <D.23366>; else goto <D.23367>;
  <D.23367>:
}


reset_heap_boundaries ()
{
  lowest_heap_address = 4294967295;
  highest_heap_address = 0;
}


sgen_get_nursery_end ()
{
  char * D.26752;

  D.26752 = sgen_nursery_end;
  return D.26752;
}


dump_heap (const char * type, int num, const char * reason)
{
  struct FILE * heap_dump_file.291;
  long int D.26757;
  unsigned int D.26758;
  unsigned int D.26759;
  struct MonoObject * D.26760;
  struct GCMemSection * nursery_section.292;
  void (*<T36cc>) (struct FILE *) D.26762;
  char[0:] * D.26763;
  struct ObjectList * list;
  struct LOSObject * bigobj;

  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<collection type=\"%s\" num=\"%d\"", type, num);
  if (reason != 0B) goto <D.26755>; else goto <D.26756>;
  <D.26755>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, " reason=\"%s\"", reason);
  <D.26756>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, ">\n");
  heap_dump_file.291 = heap_dump_file;
  D.26757 = mono_mempool_get_bytes_allocated ();
  fprintf (heap_dump_file.291, "<other-mem-usage type=\"mempools\" size=\"%ld\"/>\n", D.26757);
  heap_dump_file.291 = heap_dump_file;
  sgen_dump_internal_mem_usage (heap_dump_file.291);
  heap_dump_file.291 = heap_dump_file;
  D.26758 = sgen_pin_stats_get_pinned_byte_count (0);
  fprintf (heap_dump_file.291, "<pinned type=\"stack\" bytes=\"%zu\"/>\n", D.26758);
  heap_dump_file.291 = heap_dump_file;
  D.26759 = sgen_pin_stats_get_pinned_byte_count (2);
  fprintf (heap_dump_file.291, "<pinned type=\"other\" bytes=\"%zu\"/>\n", D.26759);
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<pinned-objects>\n");
  list = sgen_pin_stats_get_object_list ();
  goto <D.23074>;
  <D.23073>:
  D.26760 = list->obj;
  dump_object (D.26760, 1);
  list = list->next;
  <D.23074>:
  if (list != 0B) goto <D.23073>; else goto <D.23075>;
  <D.23075>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "</pinned-objects>\n");
  nursery_section.292 = nursery_section;
  sgen_dump_section (nursery_section.292, "nursery");
  D.26762 = major_collector.dump_heap;
  heap_dump_file.291 = heap_dump_file;
  D.26762 (heap_dump_file.291);
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<los>\n");
  bigobj = los_object_list;
  goto <D.23077>;
  <D.23076>:
  D.26763 = &bigobj->data;
  dump_object (D.26763, 0);
  bigobj = bigobj->next;
  <D.23077>:
  if (bigobj != 0B) goto <D.23076>; else goto <D.23078>;
  <D.23078>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "</los>\n");
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "</collection>\n");
}


dump_object (struct MonoObject * obj, gboolean dump_location)
{
  struct MonoVTable * D.26764;
  const char * D.26765;
  sizetype i.293;
  const char * D.26767;
  char D.26768;
  int D.26769;
  char * D.26770;
  int j.294;
  unsigned int j.295;
  _Bool D.26776;
  long int D.26777;
  long int D.26778;
  struct FILE * heap_dump_file.296;
  const char * D.26782;
  unsigned int D.26783;
  int D.26786;
  unsigned int D.26790;
  static char class_name[1024];
  struct MonoClass * class;
  int i;
  int j;

  D.26764 = obj->vtable;
  class = D.26764->klass;
  j = 0;
  i = j;
  goto <D.23063>;
  <D.23062>:
  D.26765 = class->name;
  i.293 = (sizetype) i;
  D.26767 = D.26765 + i.293;
  D.26768 = *D.26767;
  D.26769 = (int) D.26768;
  D.26770 = __builtin_strchr ("<>\"", D.26769);
  if (D.26770 == 0B) goto <D.26771>; else goto <D.26772>;
  <D.26771>:
  j.294 = j;
  j = j.294 + 1;
  D.26765 = class->name;
  i.293 = (sizetype) i;
  D.26767 = D.26765 + i.293;
  D.26768 = *D.26767;
  class_name[j.294] = D.26768;
  <D.26772>:
  i = i + 1;
  <D.23063>:
  D.26765 = class->name;
  i.293 = (sizetype) i;
  D.26767 = D.26765 + i.293;
  D.26768 = *D.26767;
  if (D.26768 != 0) goto <D.26774>; else goto <D.23064>;
  <D.26774>:
  j.295 = (unsigned int) j;
  if (j.295 <= 1022) goto <D.23062>; else goto <D.23064>;
  <D.23064>:
  j.295 = (unsigned int) j;
  D.26776 = j.295 > 1023;
  D.26777 = (long int) D.26776;
  D.26778 = __builtin_expect (D.26777, 0);
  if (D.26778 != 0) goto <D.26779>; else goto <D.26780>;
  <D.26779>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2132, "j < sizeof (class_name)");
  <D.26780>:
  class_name[j] = 0;
  heap_dump_file.296 = heap_dump_file;
  D.26782 = class->name_space;
  D.26783 = sgen_safe_object_get_size (obj);
  fprintf (heap_dump_file.296, "<object class=\"%s.%s\" size=\"%d\"", D.26782, &class_name, D.26783);
  if (dump_location != 0) goto <D.26784>; else goto <D.26785>;
  <D.26784>:
  {
    const char * location;

    D.26786 = sgen_ptr_in_nursery (obj);
    if (D.26786 != 0) goto <D.26787>; else goto <D.26788>;
    <D.26787>:
    location = "nursery";
    goto <D.26789>;
    <D.26788>:
    D.26790 = sgen_safe_object_get_size (obj);
    if (D.26790 <= 8000) goto <D.26791>; else goto <D.26792>;
    <D.26791>:
    location = "major";
    goto <D.26793>;
    <D.26792>:
    location = "LOS";
    <D.26793>:
    <D.26789>:
    heap_dump_file.296 = heap_dump_file;
    fprintf (heap_dump_file.296, " location=\"%s\"", location);
  }
  <D.26785>:
  heap_dump_file.296 = heap_dump_file;
  fprintf (heap_dump_file.296, "/>\n");
}


check_scan_starts ()
{
  int do_scan_starts_check.297;
  struct GCMemSection * nursery_section.298;
  void (*<T11c0>) (void) D.26798;

  do_scan_starts_check.297 = do_scan_starts_check;
  if (do_scan_starts_check.297 == 0) goto <D.26795>; else goto <D.26796>;
  <D.26795>:
  return;
  <D.26796>:
  nursery_section.298 = nursery_section;
  sgen_check_section_scan_starts (nursery_section.298);
  D.26798 = major_collector.check_scan_starts;
  D.26798 ();
}


unpin_objects_from_queue (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.26800;
  int D.26804;
  _Bool D.26805;
  long int D.26806;
  long int D.26807;
  int D.26811;
  unsigned int D.26813;
  unsigned int D.26814;
  _Bool D.26815;
  long int D.26816;
  long int D.26817;
  unsigned int D.26820;

  <D.22817>:
  {
    char * addr;

    D.26800 = queue->first;
    if (D.26800 == 0B) goto <D.26801>; else goto <D.26802>;
    <D.26801>:
    addr = 0B;
    goto <D.26803>;
    <D.26802>:
    D.26800 = queue->first;
    D.26804 = D.26800->end;
    D.26805 = D.26804 == 1;
    D.26806 = (long int) D.26805;
    D.26807 = __builtin_expect (D.26806, 0);
    if (D.26807 != 0) goto <D.26808>; else goto <D.26809>;
    <D.26808>:
    addr = sgen_gray_object_dequeue (queue);
    goto <D.26810>;
    <D.26809>:
    D.26800 = queue->first;
    D.26800 = queue->first;
    D.26804 = D.26800->end;
    D.26811 = D.26804 + -1;
    D.26800->end = D.26811;
    D.26804 = D.26800->end;
    addr = D.26800->objects[D.26804];
    <D.26810>:
    <D.26803>:
    if (addr == 0B) goto <D.22816>; else goto <D.26812>;
    <D.26812>:
    D.26813 = MEM[(mword *)addr];
    D.26814 = D.26813 & 2;
    D.26815 = D.26814 == 0;
    D.26816 = (long int) D.26815;
    D.26817 = __builtin_expect (D.26816, 0);
    if (D.26817 != 0) goto <D.26818>; else goto <D.26819>;
    <D.26818>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1548, "SGEN_OBJECT_IS_PINNED (addr)");
    <D.26819>:
    D.26813 = MEM[(mword *)addr];
    D.26820 = D.26813 & 4294967293;
    MEM[(mword *)addr] = D.26820;
  }
  goto <D.22817>;
  <D.22816>:
}


major_start_concurrent_collection (const char * reason)
{
  int disable_major_collections.299;
  long long int (*<T36d1>) (void) D.26824;
  _Bool D.26825;
  long int D.26826;
  long int D.26827;
  long long int num_objects_marked;

  disable_major_collections.299 = disable_major_collections;
  if (disable_major_collections.299 != 0) goto <D.26822>; else goto <D.26823>;
  <D.26822>:
  return;
  <D.26823>:
  D.26824 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.26824 ();
  D.26825 = num_objects_marked != 0;
  D.26826 = (long int) D.26825;
  D.26827 = __builtin_expect (D.26826, 0);
  if (D.26827 != 0) goto <D.26828>; else goto <D.26829>;
  <D.26828>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3326, "num_objects_marked == 0");
  <D.26829>:
  major_start_collection (1, 0B);
  gray_queue_redirect (&gray_queue);
  sgen_workers_wait_for_jobs ();
  D.26824 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.26824 ();
  current_collection_generation = -1;
}


major_start_collection (gboolean concurrent, int * old_next_pin_slot)
{
  struct MonoPerfCounters * mono_perfcounters.300;
  unsigned int D.26832;
  unsigned int D.26833;
  struct SgenSectionGrayQueue * D.26834;
  int D.26835;
  _Bool D.26836;
  long int D.26837;
  long int D.26838;
  int D.26843;
  _Bool D.26844;
  long int D.26845;
  long int D.26846;
  int gc_debug_level.301;
  _Bool D.26851;
  long int D.26852;
  long int D.26853;
  struct FILE * gc_debug_file.302;
  int stat_major_gcs.303;
  int stat_major_gcs.304;
  int D.26859;
  int D.26860;
  void (*<T11c0>) (void) D.26861;

  current_collection_generation = 1;
  mono_perfcounters.300 = mono_perfcounters;
  D.26832 = mono_perfcounters.300->gc_collections1;
  D.26833 = D.26832 + 1;
  mono_perfcounters.300->gc_collections1 = D.26833;
  D.26834 = sgen_workers_get_distribute_section_gray_queue ();
  D.26835 = sgen_section_gray_queue_is_empty (D.26834);
  D.26836 = D.26835 == 0;
  D.26837 = (long int) D.26836;
  D.26838 = __builtin_expect (D.26837, 0);
  if (D.26838 != 0) goto <D.26839>; else goto <D.26840>;
  <D.26839>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3074, "sgen_section_gray_queue_is_empty (sgen_workers_get_distribute_section_gray_queue ())");
  <D.26840>:
  if (concurrent != 0) goto <D.26841>; else goto <D.26842>;
  <D.26841>:
  D.26843 = major_collector.is_concurrent;
  D.26844 = D.26843 == 0;
  D.26845 = (long int) D.26844;
  D.26846 = __builtin_expect (D.26845, 0);
  if (D.26846 != 0) goto <D.26847>; else goto <D.26848>;
  <D.26847>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3077, "major_collector.is_concurrent");
  <D.26848>:
  concurrent_collection_in_progress = 1;
  sgen_cement_concurrent_start ();
  current_object_ops = major_collector.major_concurrent_ops;
  goto <D.26849>;
  <D.26842>:
  current_object_ops = major_collector.major_ops;
  <D.26849>:
  reset_pinned_from_failed_allocation ();
  sgen_memgov_major_collection_start ();
  check_scan_starts ();
  degraded_mode = 0;
  gc_debug_level.301 = gc_debug_level;
  D.26851 = gc_debug_level.301 > 0;
  D.26852 = (long int) D.26851;
  D.26853 = __builtin_expect (D.26852, 0);
  if (D.26853 != 0) goto <D.26854>; else goto <D.26855>;
  <D.26854>:
  gc_debug_file.302 = gc_debug_file;
  stat_major_gcs.303 = stat_major_gcs;
  fprintf (gc_debug_file.302, "Start major collection %d\n", stat_major_gcs.303);
  gc_debug_file.302 = gc_debug_file;
  fflush (gc_debug_file.302);
  <D.26855>:
  stat_major_gcs.303 = stat_major_gcs;
  stat_major_gcs.304 = stat_major_gcs.303 + 1;
  stat_major_gcs = stat_major_gcs.304;
  D.26859 = gc_stats.major_gc_count;
  D.26860 = D.26859 + 1;
  gc_stats.major_gc_count = D.26860;
  D.26861 = major_collector.start_major_collection;
  if (D.26861 != 0B) goto <D.26862>; else goto <D.26863>;
  <D.26862>:
  D.26861 = major_collector.start_major_collection;
  D.26861 ();
  <D.26863>:
  major_copy_or_mark_from_roots (old_next_pin_slot, 0, 0);
}


reset_pinned_from_failed_allocation ()
{
  bytes_pinned_from_failed_allocation = 0;
}


collect_nursery (struct SgenGrayQueue * unpin_queue, gboolean finish_up_concurrent_mark)
{
  int disable_minor_collections.305;
  gboolean D.26867;
  struct MonoPerfCounters * mono_perfcounters.306;
  unsigned int D.26869;
  unsigned int D.26870;
  int D.26871;
  char * iftmp.307;
  char * D.26876;
  int gc_debug_level.308;
  _Bool D.26881;
  long int D.26882;
  long int D.26883;
  struct FILE * gc_debug_file.309;
  int stat_minor_gcs.310;
  char * D.26888;
  int nursery_next.311;
  char * D.26890;
  int D.26891;
  int D.26892;
  char * D.26893;
  int D.26894;
  int D.26895;
  struct GCMemSection * nursery_section.312;
  unsigned int D.26897;
  _Bool D.26898;
  long int D.26899;
  long int D.26900;
  long long int D.26903;
  long long int D.26904;
  int D.26905;
  long long int D.26906;
  long long int time_minor_pre_collection_fragment_clear.313;
  long long int time_minor_pre_collection_fragment_clear.314;
  int xdomain_checks.315;
  void (*<T11c0>) (void) D.26912;
  int stat_minor_gcs.316;
  int D.26914;
  int D.26915;
  char * D.26916;
  long long int D.26917;
  long long int D.26918;
  int D.26919;
  long long int D.26920;
  long long int time_minor_pinning.317;
  long long int time_minor_pinning.318;
  _Bool D.26923;
  long int D.26924;
  long int D.26925;
  int D.26928;
  int D.26931;
  int whole_heap_check_before_collection.319;
  int consistency_check_at_minor_collection.320;
  char * D.26938;
  long long int time_minor_scan_remsets.321;
  long long int time_minor_scan_remsets.322;
  int D.26943;
  void (*<T35c3>) (char *, struct SgenGrayQueue *) D.26946;
  <unnamed type> D.26947;
  unsigned int D.26948;
  <unnamed type> D.26951;
  unsigned int D.26952;
  long long int time_minor_scan_pinned.323;
  long long int time_minor_scan_pinned.324;
  void (*<T35be>) (void * *, struct SgenGrayQueue *) D.26957;
  char * D.26958;
  char * D.26959;
  long long int time_minor_scan_registered_roots.325;
  long long int time_minor_scan_registered_roots.326;
  char * D.26962;
  long long int time_minor_scan_thread_data.327;
  long long int time_minor_scan_thread_data.328;
  int iftmp.329;
  int D.26969;
  int D.26971;
  _Bool D.26972;
  long int D.26973;
  long int D.26974;
  int D.26979;
  int D.26981;
  int D.26982;
  _Bool D.26983;
  long int D.26984;
  long int D.26985;
  struct FinalizeReadyEntry * fin_ready_list.330;
  struct FinalizeReadyEntry * critical_fin_list.331;
  long long int time_minor_finish_gray_stack.332;
  long long int time_minor_finish_gray_stack.333;
  unsigned int objects_pinned.334;
  void * * D.26995;
  int D.26996;
  long long int time_minor_fragment_creation.335;
  long long int time_minor_fragment_creation.336;
  void (*<T11c0>) (void) D.27005;
  long long int D.27006;
  long long int D.27007;
  long long int D.27008;
  int D.27009;
  long long int D.27010;
  long long int D.27011;
  struct FILE * heap_dump_file.337;
  int D.27015;
  int num_ready_finalizers.338;
  int D.27022;
  _Bool D.27023;
  long int D.27024;
  long int D.27025;
  void (*<T11c0>) (void) D.27028;
  _Bool D.27029;
  int check_nursery_objects_pinned.339;
  int D.27033;
  _Bool D.27036;
  int D.27037;
  gboolean needs_major;
  size_t max_garbage_amount;
  char * nursery_next;
  struct FinishRememberedSetScanJobData * frssjd;
  struct ScanFromRegisteredRootsJobData * scrrjd_normal;
  struct ScanFromRegisteredRootsJobData * scrrjd_wbarrier;
  struct ScanFinalizerEntriesJobData * sfejd_fin_ready;
  struct ScanFinalizerEntriesJobData * sfejd_critical_fin;
  struct ScanThreadDataJobData * stdjd;
  mword fragment_total;
  struct ScanCopyContext ctx;
  gint64 all_atv;
  gint64 all_btv;
  gint64 atv;
  gint64 btv;

  try
    {
      disable_minor_collections.305 = disable_minor_collections;
      if (disable_minor_collections.305 != 0) goto <D.26865>; else goto <D.26866>;
      <D.26865>:
      D.26867 = 1;
      return D.26867;
      <D.26866>:
      verify_nursery ();
      mono_perfcounters.306 = mono_perfcounters;
      D.26869 = mono_perfcounters.306->gc_collections0;
      D.26870 = D.26869 + 1;
      mono_perfcounters.306->gc_collections0 = D.26870;
      current_collection_generation = 0;
      D.26871 = sgen_collection_is_parallel ();
      if (D.26871 != 0) goto <D.26872>; else goto <D.26873>;
      <D.26872>:
      current_object_ops = sgen_minor_collector.parallel_ops;
      goto <D.26874>;
      <D.26873>:
      current_object_ops = sgen_minor_collector.serial_ops;
      <D.26874>:
      reset_pinned_from_failed_allocation ();
      check_scan_starts ();
      sgen_nursery_alloc_prepare_for_minor ();
      degraded_mode = 0;
      objects_pinned = 0;
      nursery_next = sgen_nursery_alloc_get_upper_alloc_bound ();
      D.26876 = sgen_get_nursery_end ();
      if (D.26876 >= nursery_next) goto <D.26877>; else goto <D.26878>;
      <D.26877>:
      iftmp.307 = sgen_get_nursery_end ();
      goto <D.26879>;
      <D.26878>:
      iftmp.307 = nursery_next;
      <D.26879>:
      nursery_next = iftmp.307;
      gc_debug_level.308 = gc_debug_level;
      D.26881 = gc_debug_level.308 > 0;
      D.26882 = (long int) D.26881;
      D.26883 = __builtin_expect (D.26882, 0);
      if (D.26883 != 0) goto <D.26884>; else goto <D.26885>;
      <D.26884>:
      gc_debug_file.309 = gc_debug_file;
      stat_minor_gcs.310 = stat_minor_gcs;
      D.26888 = sgen_get_nursery_start ();
      nursery_next.311 = (int) nursery_next;
      D.26890 = sgen_get_nursery_start ();
      D.26891 = (int) D.26890;
      D.26892 = nursery_next.311 - D.26891;
      fprintf (gc_debug_file.309, "Start nursery collection %d %p-%p, size: %d\n", stat_minor_gcs.310, D.26888, nursery_next, D.26892);
      gc_debug_file.309 = gc_debug_file;
      fflush (gc_debug_file.309);
      <D.26885>:
      nursery_next.311 = (int) nursery_next;
      D.26893 = sgen_get_nursery_start ();
      D.26894 = (int) D.26893;
      D.26895 = nursery_next.311 - D.26894;
      max_garbage_amount = (size_t) D.26895;
      nursery_section.312 = nursery_section;
      D.26897 = nursery_section.312->size;
      D.26898 = D.26897 < max_garbage_amount;
      D.26899 = (long int) D.26898;
      D.26900 = __builtin_expect (D.26899, 0);
      if (D.26900 != 0) goto <D.26901>; else goto <D.26902>;
      <D.26901>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2551, "nursery_section->size >= max_garbage_amount");
      <D.26902>:
      all_atv = mono_100ns_ticks ();
      atv = all_atv;
      btv = mono_100ns_ticks ();
      D.26903 = btv - atv;
      D.26904 = D.26903 / 10;
      D.26905 = (int) D.26904;
      D.26906 = (long long int) D.26905;
      time_minor_pre_collection_fragment_clear.313 = time_minor_pre_collection_fragment_clear;
      time_minor_pre_collection_fragment_clear.314 = D.26906 + time_minor_pre_collection_fragment_clear.313;
      time_minor_pre_collection_fragment_clear = time_minor_pre_collection_fragment_clear.314;
      xdomain_checks.315 = xdomain_checks;
      if (xdomain_checks.315 != 0) goto <D.26910>; else goto <D.26911>;
      <D.26910>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.26911>:
      nursery_section.312 = nursery_section;
      nursery_section.312->next_data = nursery_next;
      D.26912 = major_collector.start_nursery_collection;
      D.26912 ();
      sgen_memgov_minor_collection_start ();
      init_gray_queue ();
      stat_minor_gcs.310 = stat_minor_gcs;
      stat_minor_gcs.316 = stat_minor_gcs.310 + 1;
      stat_minor_gcs = stat_minor_gcs.316;
      D.26914 = gc_stats.minor_gc_count;
      D.26915 = D.26914 + 1;
      gc_stats.minor_gc_count = D.26915;
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      sgen_init_pinning ();
      mono_profiler_gc_event (1, 0);
      D.26916 = sgen_get_nursery_start ();
      pin_from_roots (D.26916, nursery_next, &gray_queue);
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      sgen_optimize_pin_queue (0);
      nursery_section.312 = nursery_section;
      sgen_pinning_setup_section (nursery_section.312);
      ctx.scan_func = 0B;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      nursery_section.312 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.312, ctx);
      nursery_section.312 = nursery_section;
      sgen_pinning_trim_queue_to_section (nursery_section.312);
      atv = mono_100ns_ticks ();
      D.26917 = atv - btv;
      D.26918 = D.26917 / 10;
      D.26919 = (int) D.26918;
      D.26920 = (long long int) D.26919;
      time_minor_pinning.317 = time_minor_pinning;
      time_minor_pinning.318 = D.26920 + time_minor_pinning.317;
      time_minor_pinning = time_minor_pinning.318;
      gc_debug_level.308 = gc_debug_level;
      D.26923 = gc_debug_level.308 > 1;
      D.26924 = (long int) D.26923;
      D.26925 = __builtin_expect (D.26924, 0);
      if (D.26925 != 0) goto <D.26926>; else goto <D.26927>;
      <D.26926>:
      gc_debug_file.309 = gc_debug_file;
      D.26928 = sgen_get_pinned_count ();
      D.26917 = atv - btv;
      D.26918 = D.26917 / 10;
      D.26919 = (int) D.26918;
      fprintf (gc_debug_file.309, "Finding pinned pointers: %d in %d usecs\n", D.26928, D.26919);
      gc_debug_file.309 = gc_debug_file;
      fflush (gc_debug_file.309);
      <D.26927>:
      if (0 != 0) goto <D.26929>; else goto <D.26930>;
      <D.26929>:
      gc_debug_file.309 = gc_debug_file;
      D.26931 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.309, "Start scan with %d pinned objects\n", D.26931);
      gc_debug_file.309 = gc_debug_file;
      fflush (gc_debug_file.309);
      <D.26930>:
      whole_heap_check_before_collection.319 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.319 != 0) goto <D.26933>; else goto <D.26934>;
      <D.26933>:
      sgen_clear_nursery_fragments ();
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.26934>:
      consistency_check_at_minor_collection.320 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.320 != 0) goto <D.26936>; else goto <D.26937>;
      <D.26936>:
      sgen_check_consistency ();
      <D.26937>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      frssjd = sgen_alloc_internal_dynamic (8, 20, 1);
      D.26938 = sgen_get_nursery_start ();
      frssjd->heap_start = D.26938;
      frssjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_finish_remembered_set_scan, frssjd);
      btv = mono_100ns_ticks ();
      D.26903 = btv - atv;
      D.26904 = D.26903 / 10;
      D.26905 = (int) D.26904;
      D.26906 = (long long int) D.26905;
      time_minor_scan_remsets.321 = time_minor_scan_remsets;
      time_minor_scan_remsets.322 = D.26906 + time_minor_scan_remsets.321;
      time_minor_scan_remsets = time_minor_scan_remsets.322;
      gc_debug_level.308 = gc_debug_level;
      D.26923 = gc_debug_level.308 > 1;
      D.26924 = (long int) D.26923;
      D.26925 = __builtin_expect (D.26924, 0);
      if (D.26925 != 0) goto <D.26941>; else goto <D.26942>;
      <D.26941>:
      gc_debug_file.309 = gc_debug_file;
      D.26903 = btv - atv;
      D.26904 = D.26903 / 10;
      D.26905 = (int) D.26904;
      fprintf (gc_debug_file.309, "Old generation scan: %d usecs\n", D.26905);
      gc_debug_file.309 = gc_debug_file;
      fflush (gc_debug_file.309);
      <D.26942>:
      D.26943 = sgen_collection_is_parallel ();
      if (D.26943 == 0) goto <D.26944>; else goto <D.26945>;
      <D.26944>:
      D.26946 = current_object_ops.scan_object;
      ctx.scan_func = D.26946;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      sgen_drain_gray_stack (-1, ctx);
      <D.26945>:
      D.26947 = mono_profiler_get_events ();
      D.26948 = D.26947 & 1048576;
      if (D.26948 != 0) goto <D.26949>; else goto <D.26950>;
      <D.26949>:
      report_registered_roots ();
      <D.26950>:
      D.26951 = mono_profiler_get_events ();
      D.26952 = D.26951 & 1048576;
      if (D.26952 != 0) goto <D.26953>; else goto <D.26954>;
      <D.26953>:
      report_finalizer_roots ();
      <D.26954>:
      atv = mono_100ns_ticks ();
      D.26917 = atv - btv;
      D.26918 = D.26917 / 10;
      D.26919 = (int) D.26918;
      D.26920 = (long long int) D.26919;
      time_minor_scan_pinned.323 = time_minor_scan_pinned;
      time_minor_scan_pinned.324 = D.26920 + time_minor_scan_pinned.323;
      time_minor_scan_pinned = time_minor_scan_pinned.324;
      scrrjd_normal = sgen_alloc_internal_dynamic (20, 20, 1);
      D.26957 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.26957;
      D.26946 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.26946;
      D.26958 = sgen_get_nursery_start ();
      scrrjd_normal->heap_start = D.26958;
      scrrjd_normal->heap_end = nursery_next;
      scrrjd_normal->root_type = 0;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_normal);
      scrrjd_wbarrier = sgen_alloc_internal_dynamic (20, 20, 1);
      D.26957 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.26957;
      D.26946 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.26946;
      D.26959 = sgen_get_nursery_start ();
      scrrjd_wbarrier->heap_start = D.26959;
      scrrjd_wbarrier->heap_end = nursery_next;
      scrrjd_wbarrier->root_type = 2;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_wbarrier);
      btv = mono_100ns_ticks ();
      D.26903 = btv - atv;
      D.26904 = D.26903 / 10;
      D.26905 = (int) D.26904;
      D.26906 = (long long int) D.26905;
      time_minor_scan_registered_roots.325 = time_minor_scan_registered_roots;
      time_minor_scan_registered_roots.326 = D.26906 + time_minor_scan_registered_roots.325;
      time_minor_scan_registered_roots = time_minor_scan_registered_roots.326;
      stdjd = sgen_alloc_internal_dynamic (8, 20, 1);
      D.26962 = sgen_get_nursery_start ();
      stdjd->heap_start = D.26962;
      stdjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.26917 = atv - btv;
      D.26918 = D.26917 / 10;
      D.26919 = (int) D.26918;
      D.26920 = (long long int) D.26919;
      time_minor_scan_thread_data.327 = time_minor_scan_thread_data;
      time_minor_scan_thread_data.328 = D.26920 + time_minor_scan_thread_data.327;
      time_minor_scan_thread_data = time_minor_scan_thread_data.328;
      btv = atv;
      D.26969 = sgen_collection_is_parallel ();
      if (D.26969 != 0) goto <D.26966>; else goto <D.26970>;
      <D.26970>:
      D.26971 = sgen_collection_is_concurrent ();
      if (D.26971 != 0) goto <D.26966>; else goto <D.26967>;
      <D.26966>:
      iftmp.329 = 1;
      goto <D.26968>;
      <D.26967>:
      iftmp.329 = 0;
      <D.26968>:
      D.26972 = iftmp.329 != 0;
      D.26973 = (long int) D.26972;
      D.26974 = __builtin_expect (D.26973, 0);
      if (D.26974 != 0) goto <D.26975>; else goto <D.26976>;
      <D.26975>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2677, "!sgen_collection_is_parallel () && !sgen_collection_is_concurrent ()");
      <D.26976>:
      D.26979 = sgen_collection_is_parallel ();
      if (D.26979 != 0) goto <D.26977>; else goto <D.26980>;
      <D.26980>:
      D.26981 = sgen_collection_is_concurrent ();
      if (D.26981 != 0) goto <D.26977>; else goto <D.26978>;
      <D.26977>:
      D.26982 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.26983 = D.26982 == 0;
      D.26984 = (long int) D.26983;
      D.26985 = __builtin_expect (D.26984, 0);
      if (D.26985 != 0) goto <D.26986>; else goto <D.26987>;
      <D.26986>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2680, "sgen_gray_object_queue_is_empty (&gray_queue)");
      <D.26987>:
      <D.26978>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (4, 20, 1);
      fin_ready_list.330 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.330;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (4, 20, 1);
      critical_fin_list.331 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.331;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      finish_gray_stack (0, &gray_queue);
      atv = mono_100ns_ticks ();
      D.26917 = atv - btv;
      D.26918 = D.26917 / 10;
      D.26919 = (int) D.26918;
      D.26920 = (long long int) D.26919;
      time_minor_finish_gray_stack.332 = time_minor_finish_gray_stack;
      time_minor_finish_gray_stack.333 = D.26920 + time_minor_finish_gray_stack.332;
      time_minor_finish_gray_stack = time_minor_finish_gray_stack.333;
      mono_profiler_gc_event (2, 0);
      sgen_workers_reset_data ();
      objects_pinned.334 = objects_pinned;
      if (objects_pinned.334 != 0) goto <D.26993>; else goto <D.26994>;
      <D.26993>:
      sgen_optimize_pin_queue (0);
      nursery_section.312 = nursery_section;
      sgen_pinning_setup_section (nursery_section.312);
      <D.26994>:
      mono_profiler_gc_event (3, 0);
      nursery_section.312 = nursery_section;
      nursery_section.312 = nursery_section;
      D.26995 = nursery_section.312->pin_queue_start;
      nursery_section.312 = nursery_section;
      D.26996 = nursery_section.312->pin_queue_num_entries;
      fragment_total = sgen_build_nursery_fragments (nursery_section.312, D.26995, D.26996, unpin_queue);
      if (fragment_total == 0) goto <D.26997>; else goto <D.26998>;
      <D.26997>:
      degraded_mode = 1;
      <D.26998>:
      sgen_clear_tlabs ();
      mono_profiler_gc_event (4, 0);
      btv = mono_100ns_ticks ();
      D.26903 = btv - atv;
      D.26904 = D.26903 / 10;
      D.26905 = (int) D.26904;
      D.26906 = (long long int) D.26905;
      time_minor_fragment_creation.335 = time_minor_fragment_creation;
      time_minor_fragment_creation.336 = D.26906 + time_minor_fragment_creation.335;
      time_minor_fragment_creation = time_minor_fragment_creation.336;
      gc_debug_level.308 = gc_debug_level;
      D.26923 = gc_debug_level.308 > 1;
      D.26924 = (long int) D.26923;
      D.26925 = __builtin_expect (D.26924, 0);
      if (D.26925 != 0) goto <D.27001>; else goto <D.27002>;
      <D.27001>:
      gc_debug_file.309 = gc_debug_file;
      D.26903 = btv - atv;
      D.26904 = D.26903 / 10;
      D.26905 = (int) D.26904;
      fprintf (gc_debug_file.309, "Fragment creation: %d usecs, %lu bytes available\n", D.26905, fragment_total);
      gc_debug_file.309 = gc_debug_file;
      fflush (gc_debug_file.309);
      <D.27002>:
      consistency_check_at_minor_collection.320 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.320 != 0) goto <D.27003>; else goto <D.27004>;
      <D.27003>:
      sgen_check_major_refs ();
      <D.27004>:
      D.27005 = major_collector.finish_nursery_collection;
      D.27005 ();
      all_btv = mono_100ns_ticks ();
      D.27006 = gc_stats.minor_gc_time_usecs;
      D.27007 = all_btv - all_atv;
      D.27008 = D.27007 / 10;
      D.27009 = (int) D.27008;
      D.27010 = (long long int) D.27009;
      D.27011 = D.27006 + D.27010;
      gc_stats.minor_gc_time_usecs = D.27011;
      heap_dump_file.337 = heap_dump_file;
      if (heap_dump_file.337 != 0B) goto <D.27013>; else goto <D.27014>;
      <D.27013>:
      stat_minor_gcs.310 = stat_minor_gcs;
      D.27015 = stat_minor_gcs.310 + -1;
      dump_heap ("minor", D.27015, 0B);
      <D.27014>:
      sgen_finish_pinning ();
      fin_ready_list.330 = fin_ready_list;
      if (fin_ready_list.330 != 0B) goto <D.27016>; else goto <D.27018>;
      <D.27018>:
      critical_fin_list.331 = critical_fin_list;
      if (critical_fin_list.331 != 0B) goto <D.27016>; else goto <D.27017>;
      <D.27016>:
      if (0 != 0) goto <D.27019>; else goto <D.27020>;
      <D.27019>:
      gc_debug_file.309 = gc_debug_file;
      num_ready_finalizers.338 = num_ready_finalizers;
      fprintf (gc_debug_file.309, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.338);
      gc_debug_file.309 = gc_debug_file;
      fflush (gc_debug_file.309);
      <D.27020>:
      mono_gc_finalize_notify ();
      <D.27017>:
      sgen_pin_stats_reset ();
      sgen_cement_clear_below_threshold ();
      D.27022 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.27023 = D.27022 == 0;
      D.27024 = (long int) D.27023;
      D.27025 = __builtin_expect (D.27024, 0);
      if (D.27025 != 0) goto <D.27026>; else goto <D.27027>;
      <D.27026>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2753, "sgen_gray_object_queue_is_empty (&gray_queue)");
      <D.27027>:
      D.27028 = remset.finish_minor_collection;
      D.27028 ();
      check_scan_starts ();
      sgen_memgov_minor_collection_end ();
      objects_pinned.334 = objects_pinned;
      D.27029 = objects_pinned.334 != 0;
      needs_major = (gboolean) D.27029;
      current_collection_generation = -1;
      objects_pinned = 0;
      check_nursery_objects_pinned.339 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.339 != 0) goto <D.27031>; else goto <D.27032>;
      <D.27031>:
      D.27033 = sgen_minor_collector.is_split;
      if (D.27033 == 0) goto <D.27034>; else goto <D.27035>;
      <D.27034>:
      D.27036 = unpin_queue != 0B;
      D.27037 = (int) D.27036;
      sgen_check_nursery_objects_pinned (D.27037);
      <D.27035>:
      <D.27032>:
      D.26867 = needs_major;
      return D.26867;
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


job_finish_remembered_set_scan (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T372d>) (void *, void *, struct SgenGrayQueue *) D.27040;
  char * D.27041;
  char * D.27042;
  struct SgenGrayQueue * D.27043;
  struct FinishRememberedSetScanJobData * job_data;

  job_data = job_data_untyped;
  D.27040 = remset.finish_scan_remsets;
  D.27041 = job_data->heap_start;
  D.27042 = job_data->heap_end;
  D.27043 = sgen_workers_get_job_gray_queue (worker_data);
  D.27040 (D.27041, D.27042, D.27043);
  sgen_free_internal_dynamic (job_data, 8, 20);
}


verify_nursery ()
{
  int do_verify_nursery.340;
  void * D.27047;
  unsigned int D.27052;
  unsigned int D.27053;
  unsigned int D.27055;
  int gc_debug_level.341;
  _Bool D.27058;
  long int D.27059;
  long int D.27060;
  struct FILE * gc_debug_file.342;
  unsigned int D.27064;
  unsigned int D.27069;
  unsigned int D.27070;
  char * D.27071;
  int do_dump_nursery_content.343;
  int cur.344;
  int hole_start.345;
  int D.27081;
  int size.346;
  int ss.347;
  const char * D.27086;
  void * D.27087;
  struct MonoVTable * D.27088;
  _Bool D.27089;
  int D.27090;
  char * start;
  char * end;
  char * cur;
  char * hole_start;

  do_verify_nursery.340 = do_verify_nursery;
  if (do_verify_nursery.340 == 0) goto <D.27045>; else goto <D.27046>;
  <D.27045>:
  return;
  <D.27046>:
  sgen_nursery_allocator_prepare_for_pinning ();
  cur = sgen_get_nursery_start ();
  start = cur;
  hole_start = start;
  end = sgen_get_nursery_end ();
  goto <D.23176>;
  <D.23177>:
  {
    size_t ss;
    size_t size;

    D.27047 = MEM[(void * *)cur];
    if (D.27047 == 0B) goto <D.27048>; else goto <D.27049>;
    <D.27048>:
    cur = cur + 4;
    // predicted unlikely by continue predictor.
    goto <D.23176>;
    <D.27049>:
    D.27052 = MEM[(mword *)cur];
    D.27053 = D.27052 & 1;
    if (D.27053 != 0) goto <D.27054>; else goto <D.27050>;
    <D.27054>:
    D.27052 = MEM[(mword *)cur];
    D.27055 = D.27052 & 4294967292;
    if (D.27055 != 0) goto <D.27056>; else goto <D.27050>;
    <D.27056>:
    gc_debug_level.341 = gc_debug_level;
    D.27058 = gc_debug_level.341 > 0;
    D.27059 = (long int) D.27058;
    D.27060 = __builtin_expect (D.27059, 0);
    if (D.27060 != 0) goto <D.27061>; else goto <D.27062>;
    <D.27061>:
    gc_debug_file.342 = gc_debug_file;
    fprintf (gc_debug_file.342, "FORWARDED OBJ %p\n", cur);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.27062>:
    goto <D.27051>;
    <D.27050>:
    D.27052 = MEM[(mword *)cur];
    D.27064 = D.27052 & 2;
    if (D.27064 != 0) goto <D.27065>; else goto <D.27066>;
    <D.27065>:
    gc_debug_level.341 = gc_debug_level;
    D.27058 = gc_debug_level.341 > 0;
    D.27059 = (long int) D.27058;
    D.27060 = __builtin_expect (D.27059, 0);
    if (D.27060 != 0) goto <D.27067>; else goto <D.27068>;
    <D.27067>:
    gc_debug_file.342 = gc_debug_file;
    fprintf (gc_debug_file.342, "PINNED OBJ %p\n", cur);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.27068>:
    <D.27066>:
    <D.27051>:
    ss = sgen_safe_object_get_size (cur);
    D.27069 = sgen_safe_object_get_size (cur);
    D.27070 = D.27069 + 7;
    size = D.27070 & 4294967288;
    D.27071 = cur + size;
    verify_scan_starts (cur, D.27071);
    do_dump_nursery_content.343 = do_dump_nursery_content;
    if (do_dump_nursery_content.343 != 0) goto <D.27073>; else goto <D.27074>;
    <D.27073>:
    if (cur > hole_start) goto <D.27075>; else goto <D.27076>;
    <D.27075>:
    gc_debug_level.341 = gc_debug_level;
    D.27058 = gc_debug_level.341 > 0;
    D.27059 = (long int) D.27058;
    D.27060 = __builtin_expect (D.27059, 0);
    if (D.27060 != 0) goto <D.27077>; else goto <D.27078>;
    <D.27077>:
    gc_debug_file.342 = gc_debug_file;
    cur.344 = (int) cur;
    hole_start.345 = (int) hole_start;
    D.27081 = cur.344 - hole_start.345;
    fprintf (gc_debug_file.342, "HOLE [%p %p %d]\n", hole_start, cur, D.27081);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.27078>:
    <D.27076>:
    gc_debug_level.341 = gc_debug_level;
    D.27058 = gc_debug_level.341 > 0;
    D.27059 = (long int) D.27058;
    D.27060 = __builtin_expect (D.27059, 0);
    if (D.27060 != 0) goto <D.27082>; else goto <D.27083>;
    <D.27082>:
    gc_debug_file.342 = gc_debug_file;
    D.27071 = cur + size;
    size.346 = (int) size;
    ss.347 = (int) ss;
    D.27086 = sgen_safe_name (cur);
    D.27052 = MEM[(mword *)cur];
    D.27055 = D.27052 & 4294967292;
    D.27087 = (void *) D.27055;
    D.27088 = sgen_get_array_fill_vtable ();
    D.27089 = D.27087 == D.27088;
    D.27090 = (int) D.27089;
    fprintf (gc_debug_file.342, "OBJ  [%p %p %d %d %s %d]\n", cur, D.27071, size.346, ss.347, D.27086, D.27090);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.27083>:
    <D.27074>:
    cur = cur + size;
    hole_start = cur;
  }
  <D.23176>:
  if (cur < end) goto <D.23177>; else goto <D.23178>;
  <D.23178>:
}


major_do_collection (const char * reason)
{
  int disable_major_collections.348;
  gboolean D.27095;
  long long int (*<T36d1>) (void) D.27096;
  _Bool D.27099;
  long int D.27100;
  long int D.27101;
  int old_next_pin_slot.349;
  long long int D.27105;
  long long int D.27106;
  long long int D.27107;
  int D.27108;
  long long int D.27109;
  long long int D.27110;
  unsigned int bytes_pinned_from_failed_allocation.350;
  _Bool D.27114;
  gint64 all_atv;
  gint64 all_btv;
  int old_next_pin_slot;

  try
    {
      disable_major_collections.348 = disable_major_collections;
      if (disable_major_collections.348 != 0) goto <D.27093>; else goto <D.27094>;
      <D.27093>:
      D.27095 = 0;
      return D.27095;
      <D.27094>:
      D.27096 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.27096 != 0B) goto <D.27097>; else goto <D.27098>;
      <D.27097>:
      {
        long long int num_marked;

        D.27096 = major_collector.get_and_reset_num_major_objects_marked;
        num_marked = D.27096 ();
        D.27099 = num_marked != 0;
        D.27100 = (long int) D.27099;
        D.27101 = __builtin_expect (D.27100, 0);
        if (D.27101 != 0) goto <D.27102>; else goto <D.27103>;
        <D.27102>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3298, "!num_marked");
        <D.27103>:
      }
      <D.27098>:
      all_atv = mono_100ns_ticks ();
      major_start_collection (0, &old_next_pin_slot);
      old_next_pin_slot.349 = old_next_pin_slot;
      major_finish_collection (reason, old_next_pin_slot.349, 0);
      all_btv = mono_100ns_ticks ();
      D.27105 = gc_stats.major_gc_time_usecs;
      D.27106 = all_btv - all_atv;
      D.27107 = D.27106 / 10;
      D.27108 = (int) D.27107;
      D.27109 = (long long int) D.27108;
      D.27110 = D.27105 + D.27109;
      gc_stats.major_gc_time_usecs = D.27110;
      D.27096 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.27096 != 0B) goto <D.27111>; else goto <D.27112>;
      <D.27111>:
      D.27096 = major_collector.get_and_reset_num_major_objects_marked;
      D.27096 ();
      <D.27112>:
      bytes_pinned_from_failed_allocation.350 = bytes_pinned_from_failed_allocation;
      D.27114 = bytes_pinned_from_failed_allocation.350 != 0;
      D.27095 = (gboolean) D.27114;
      return D.27095;
    }
  finally
    {
      old_next_pin_slot = {CLOBBER};
    }
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.27117;
  struct GrayQueueSection * D.27118;
  _Bool D.27119;

  D.27118 = queue->first;
  D.27119 = D.27118 == 0B;
  D.27117 = (gboolean) D.27119;
  return D.27117;
}


sgen_gc_is_object_ready_for_finalization (void * object)
{
  gboolean D.27121;
  int D.27122;
  _Bool D.27123;

  D.27122 = sgen_is_object_alive (object);
  D.27123 = D.27122 == 0;
  D.27121 = (gboolean) D.27123;
  return D.27121;
}


sgen_is_object_alive (void * object)
{
  int D.27125;
  gboolean D.27128;

  D.27125 = sgen_ptr_in_nursery (object);
  if (D.27125 != 0) goto <D.27126>; else goto <D.27127>;
  <D.27126>:
  D.27128 = sgen_nursery_is_object_alive (object);
  return D.27128;
  <D.27127>:
  D.27128 = sgen_major_is_object_alive (object);
  return D.27128;
}


sgen_queue_finalization_entry (struct MonoObject * obj)
{
  struct FinalizeReadyEntry * critical_fin_list.351;
  struct FinalizeReadyEntry * fin_ready_list.352;
  struct FinalizeReadyEntry * entry;
  gboolean critical;

  entry = sgen_alloc_internal (6);
  critical = has_critical_finalizer (obj);
  entry->object = obj;
  if (critical != 0) goto <D.27130>; else goto <D.27131>;
  <D.27130>:
  critical_fin_list.351 = critical_fin_list;
  entry->next = critical_fin_list.351;
  critical_fin_list = entry;
  goto <D.27133>;
  <D.27131>:
  fin_ready_list.352 = fin_ready_list;
  entry->next = fin_ready_list.352;
  fin_ready_list = entry;
  <D.27133>:
}


has_critical_finalizer (struct MonoObject * obj)
{
  struct MonoClass * D.27135;
  gboolean D.27138;
  unsigned int D.27139;
  unsigned int D.27140;
  struct MonoVTable * D.27141;
  struct MonoClass * class;

  D.27135 = mono_defaults.critical_finalizer_object;
  if (D.27135 == 0B) goto <D.27136>; else goto <D.27137>;
  <D.27136>:
  D.27138 = 0;
  return D.27138;
  <D.27137>:
  D.27139 = MEM[(mword *)obj];
  D.27140 = D.27139 & 4294967292;
  D.27141 = (struct MonoVTable *) D.27140;
  class = D.27141->klass;
  D.27135 = mono_defaults.critical_finalizer_object;
  D.27138 = mono_class_has_parent_fast (class, D.27135);
  return D.27138;
}


sgen_object_is_live (void * obj)
{
  gboolean D.27143;

  D.27143 = sgen_is_object_alive_and_on_current_collection (obj);
  return D.27143;
}


sgen_is_object_alive_and_on_current_collection (char * object)
{
  int D.27145;
  int D.27148;
  int current_collection_generation.353;

  D.27145 = sgen_ptr_in_nursery (object);
  if (D.27145 != 0) goto <D.27146>; else goto <D.27147>;
  <D.27146>:
  D.27148 = sgen_nursery_is_object_alive (object);
  return D.27148;
  <D.27147>:
  current_collection_generation.353 = current_collection_generation;
  if (current_collection_generation.353 == 0) goto <D.27150>; else goto <D.27151>;
  <D.27150>:
  D.27148 = 0;
  return D.27148;
  <D.27151>:
  D.27148 = sgen_major_is_object_alive (object);
  return D.27148;
}


mono_gc_invoke_finalizers ()
{
  struct FinalizeReadyEntry * * iftmp.354;
  struct FinalizeReadyEntry * D.27159;
  struct FinalizeReadyEntry * D.27162;
  struct FinalizeReadyEntry * D.27164;
  void * D.27166;
  _Bool D.27173;
  long int D.27174;
  long int D.27175;
  int num_ready_finalizers.355;
  int num_ready_finalizers.356;
  struct FILE * gc_debug_file.357;
  const char * D.27183;
  _Bool D.27185;
  long int D.27186;
  long int D.27187;
  struct FinalizeReadyEntry * fin_ready_list.358;
  struct FinalizeReadyEntry * critical_fin_list.359;
  _Bool D.27193;
  long int D.27194;
  long int D.27195;
  int D.27198;
  struct FinalizeReadyEntry * entry;
  gboolean entry_is_critical;
  int count;
  void * obj;

  entry = 0B;
  entry_is_critical = 0;
  count = 0;
  goto <D.23410>;
  <D.23409>:
  pthread_mutex_lock (&gc_mutex);
  if (entry != 0B) goto <D.27153>; else goto <D.27154>;
  <D.27153>:
  {
    struct FinalizeReadyEntry * * list;

    if (entry_is_critical != 0) goto <D.27156>; else goto <D.27157>;
    <D.27156>:
    iftmp.354 = &critical_fin_list;
    goto <D.27158>;
    <D.27157>:
    iftmp.354 = &fin_ready_list;
    <D.27158>:
    list = iftmp.354;
    D.27159 = *list;
    if (D.27159 == entry) goto <D.27160>; else goto <D.27161>;
    <D.27160>:
    D.27162 = entry->next;
    *list = D.27162;
    goto <D.27163>;
    <D.27161>:
    {
      struct FinalizeReadyEntry * e;

      e = *list;
      goto <D.23400>;
      <D.23399>:
      e = e->next;
      <D.23400>:
      D.27164 = e->next;
      if (D.27164 != entry) goto <D.23399>; else goto <D.23401>;
      <D.23401>:
      D.27162 = entry->next;
      e->next = D.27162;
    }
    <D.27163>:
    sgen_free_internal (entry, 6);
    entry = 0B;
  }
  <D.27154>:
  entry = fin_ready_list;
  goto <D.23403>;
  <D.23402>:
  entry = entry->next;
  <D.23403>:
  if (entry != 0B) goto <D.27165>; else goto <D.23404>;
  <D.27165>:
  D.27166 = entry->object;
  if (D.27166 == 0B) goto <D.23402>; else goto <D.23404>;
  <D.23404>:
  if (entry != 0B) goto <D.27167>; else goto <D.27168>;
  <D.27167>:
  entry_is_critical = 0;
  goto <D.27169>;
  <D.27168>:
  entry_is_critical = 1;
  entry = critical_fin_list;
  goto <D.23406>;
  <D.23405>:
  entry = entry->next;
  <D.23406>:
  if (entry != 0B) goto <D.27170>; else goto <D.23407>;
  <D.27170>:
  D.27166 = entry->object;
  if (D.27166 == 0B) goto <D.23405>; else goto <D.23407>;
  <D.23407>:
  <D.27169>:
  if (entry != 0B) goto <D.27171>; else goto <D.27172>;
  <D.27171>:
  D.27166 = entry->object;
  D.27173 = D.27166 == 0B;
  D.27174 = (long int) D.27173;
  D.27175 = __builtin_expect (D.27174, 0);
  if (D.27175 != 0) goto <D.27176>; else goto <D.27177>;
  <D.27176>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3882, "entry->object");
  <D.27177>:
  num_ready_finalizers.355 = num_ready_finalizers;
  num_ready_finalizers.356 = num_ready_finalizers.355 + -1;
  num_ready_finalizers = num_ready_finalizers.356;
  obj = entry->object;
  entry->object = 0B;
  if (0 != 0) goto <D.27180>; else goto <D.27181>;
  <D.27180>:
  gc_debug_file.357 = gc_debug_file;
  D.27183 = safe_name (obj);
  fprintf (gc_debug_file.357, "Finalizing object %p (%s)\n", obj, D.27183);
  gc_debug_file.357 = gc_debug_file;
  fflush (gc_debug_file.357);
  <D.27181>:
  <D.27172>:
  sgen_gc_unlock ();
  if (entry == 0B) goto <D.23408>; else goto <D.27184>;
  <D.27184>:
  D.27166 = entry->object;
  D.27185 = D.27166 != 0B;
  D.27186 = (long int) D.27185;
  D.27187 = __builtin_expect (D.27186, 0);
  if (D.27187 != 0) goto <D.27188>; else goto <D.27189>;
  <D.27188>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3894, "entry->object == NULL");
  <D.27189>:
  count = count + 1;
  mono_gc_run_finalize (obj, 0B);
  <D.23410>:
  fin_ready_list.358 = fin_ready_list;
  if (fin_ready_list.358 != 0B) goto <D.23409>; else goto <D.27191>;
  <D.27191>:
  critical_fin_list.359 = critical_fin_list;
  if (critical_fin_list.359 != 0B) goto <D.23409>; else goto <D.23408>;
  <D.23408>:
  D.27193 = entry != 0B;
  D.27194 = (long int) D.27193;
  D.27195 = __builtin_expect (D.27194, 0);
  if (D.27195 != 0) goto <D.27196>; else goto <D.27197>;
  <D.27196>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3900, "!entry");
  <D.27197>:
  D.27198 = count;
  return D.27198;
}


mono_gc_pending_finalizers ()
{
  gboolean D.27200;
  int iftmp.360;
  struct FinalizeReadyEntry * fin_ready_list.361;
  struct FinalizeReadyEntry * critical_fin_list.362;

  fin_ready_list.361 = fin_ready_list;
  if (fin_ready_list.361 != 0B) goto <D.27202>; else goto <D.27206>;
  <D.27206>:
  critical_fin_list.362 = critical_fin_list;
  if (critical_fin_list.362 != 0B) goto <D.27202>; else goto <D.27203>;
  <D.27202>:
  iftmp.360 = 1;
  goto <D.27204>;
  <D.27203>:
  iftmp.360 = 0;
  <D.27204>:
  D.27200 = iftmp.360;
  return D.27200;
}


mono_gc_register_root (char * start, size_t size, void * descr)
{
  int D.27209;
  _Bool D.27210;
  int D.27211;

  D.27210 = descr == 0B;
  D.27211 = (int) D.27210;
  D.27209 = mono_gc_register_root_inner (start, size, descr, D.27211);
  return D.27209;
}


mono_gc_register_root_inner (char * start, size_t size, void * descr, int root_type)
{
  struct SgenHashTable * D.27213;
  char * D.27216;
  int D.27217;
  int start.363;
  int D.27219;
  char * D.27220;
  int iftmp.364;
  unsigned int D.27226;
  _Bool D.27229;
  long int D.27230;
  long int D.27231;
  unsigned int descr.365;
  unsigned int roots_size.366;
  unsigned int roots_size.367;
  unsigned int roots_size.368;
  int D.27238;
  struct SgenHashTable * D.27239;
  struct FILE * gc_debug_file.369;
  char * D.27243;
  int size.370;
  int roots_size.371;
  struct RootRecord new_root;
  int i;

  try
    {
      pthread_mutex_lock (&gc_mutex);
      i = 0;
      goto <D.23425>;
      <D.23424>:
      {
        struct RootRecord * root;

        D.27213 = &roots_hash[i];
        root = sgen_hash_table_lookup (D.27213, start);
        if (root != 0B) goto <D.27214>; else goto <D.27215>;
        <D.27214>:
        {
          size_t old_size;

          D.27216 = root->end_root;
          D.27217 = (int) D.27216;
          start.363 = (int) start;
          D.27219 = D.27217 - start.363;
          old_size = (size_t) D.27219;
          D.27220 = start + size;
          root->end_root = D.27220;
          D.27226 = root->root_desc;
          if (D.27226 == 0) goto <D.27222>; else goto <D.27227>;
          <D.27227>:
          if (descr == 0B) goto <D.27222>; else goto <D.27223>;
          <D.27222>:
          D.27226 = root->root_desc;
          if (D.27226 != 0) goto <D.27224>; else goto <D.27228>;
          <D.27228>:
          if (descr != 0B) goto <D.27224>; else goto <D.27223>;
          <D.27224>:
          iftmp.364 = 1;
          goto <D.27225>;
          <D.27223>:
          iftmp.364 = 0;
          <D.27225>:
          D.27229 = iftmp.364 != 0;
          D.27230 = (long int) D.27229;
          D.27231 = __builtin_expect (D.27230, 0);
          if (D.27231 != 0) goto <D.27232>; else goto <D.27233>;
          <D.27232>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3932, "((root->root_desc != 0) && (descr != NULL)) || ((root->root_desc == 0) && (descr == NULL))");
          <D.27233>:
          descr.365 = (unsigned int) descr;
          root->root_desc = descr.365;
          roots_size.366 = roots_size;
          roots_size.367 = roots_size.366 + size;
          roots_size = roots_size.367;
          roots_size.366 = roots_size;
          roots_size.368 = roots_size.366 - old_size;
          roots_size = roots_size.368;
          sgen_gc_unlock ();
          D.27238 = 1;
          return D.27238;
        }
        <D.27215>:
      }
      i = i + 1;
      <D.23425>:
      if (i <= 2) goto <D.23424>; else goto <D.23426>;
      <D.23426>:
      D.27220 = start + size;
      new_root.end_root = D.27220;
      descr.365 = (unsigned int) descr;
      new_root.root_desc = descr.365;
      D.27239 = &roots_hash[root_type];
      sgen_hash_table_replace (D.27239, start, &new_root, 0B);
      roots_size.366 = roots_size;
      roots_size.367 = roots_size.366 + size;
      roots_size = roots_size.367;
      if (0 != 0) goto <D.27240>; else goto <D.27241>;
      <D.27240>:
      gc_debug_file.369 = gc_debug_file;
      D.27243 = new_root.end_root;
      size.370 = (int) size;
      roots_size.366 = roots_size;
      roots_size.371 = (int) roots_size.366;
      fprintf (gc_debug_file.369, "Added root for range: %p-%p, descr: %p  (%d/%d bytes)\n", start, D.27243, descr, size.370, roots_size.371);
      gc_debug_file.369 = gc_debug_file;
      fflush (gc_debug_file.369);
      <D.27241>:
      sgen_gc_unlock ();
      D.27238 = 1;
      return D.27238;
    }
  finally
    {
      new_root = {CLOBBER};
    }
}


mono_gc_register_root_wbarrier (char * start, size_t size, void * descr)
{
  int D.27248;

  D.27248 = mono_gc_register_root_inner (start, size, descr, 2);
  return D.27248;
}


mono_gc_deregister_root (char * addr)
{
  struct SgenHashTable * D.27250;
  int D.27251;
  int addr.372;
  char * D.27255;
  int D.27256;
  int D.27257;
  unsigned int D.27258;
  unsigned int roots_size.373;
  unsigned int roots_size.374;
  int root_type;
  struct RootRecord root;

  try
    {
      pthread_mutex_lock (&gc_mutex);
      root_type = 0;
      goto <D.23443>;
      <D.23442>:
      D.27250 = &roots_hash[root_type];
      D.27251 = sgen_hash_table_remove (D.27250, addr, &root);
      if (D.27251 != 0) goto <D.27252>; else goto <D.27253>;
      <D.27252>:
      addr.372 = (int) addr;
      D.27255 = root.end_root;
      D.27256 = (int) D.27255;
      D.27257 = addr.372 - D.27256;
      D.27258 = (unsigned int) D.27257;
      roots_size.373 = roots_size;
      roots_size.374 = D.27258 + roots_size.373;
      roots_size = roots_size.374;
      <D.27253>:
      root_type = root_type + 1;
      <D.23443>:
      if (root_type <= 2) goto <D.23442>; else goto <D.23444>;
      <D.23444>:
      sgen_gc_unlock ();
    }
  finally
    {
      root = {CLOBBER};
    }
}


sgen_get_current_collection_generation ()
{
  int D.27261;

  D.27261 = current_collection_generation;
  return D.27261;
}


mono_gc_set_gc_callbacks (struct MonoGCCallbacks * callbacks)
{
  gc_callbacks = *callbacks;
}


mono_gc_get_gc_callbacks ()
{
  struct MonoGCCallbacks * D.27263;

  D.27263 = &gc_callbacks;
  return D.27263;
}


mono_gc_conservatively_scan_area (void * start, void * end)
{
  void * scan_area_arg_start.375;
  void * scan_area_arg_end.376;

  scan_area_arg_start.375 = scan_area_arg_start;
  scan_area_arg_end.376 = scan_area_arg_end;
  conservatively_pin_objects_from (start, end, scan_area_arg_start.375, scan_area_arg_end.376, 0);
}


mono_gc_scan_object (void * obj)
{
  unsigned int user_copy_or_mark_key.377;
  void (*<T35be>) (void * *, struct SgenGrayQueue *) D.27268;
  struct GrayQueue * D.27269;
  void * D.27270;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.377 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.377);
  D.27268 = current_object_ops.copy_or_mark_object;
  D.27269 = data->queue;
  D.27268 (&obj, D.27269);
  D.27270 = obj;
  return D.27270;
}


mono_gc_register_thread (void * baseptr)
{
  gboolean D.27272;
  struct SgenThreadInfo * D.27273;
  _Bool D.27274;

  D.27273 = mono_thread_info_attach (baseptr);
  D.27274 = D.27273 != 0B;
  D.27272 = (gboolean) D.27274;
  return D.27272;
}


mono_gc_set_stack_end (void * stack_end)
{
  void * D.27278;
  _Bool D.27279;
  long int D.27280;
  long int D.27281;
  struct SgenThreadInfo * info;

  pthread_mutex_lock (&gc_mutex);
  info = mono_thread_info_current ();
  if (info != 0B) goto <D.27276>; else goto <D.27277>;
  <D.27276>:
  D.27278 = info->stack_end;
  D.27279 = D.27278 <= stack_end;
  D.27280 = (long int) D.27279;
  D.27281 = __builtin_expect (D.27280, 0);
  if (D.27281 != 0) goto <D.27282>; else goto <D.27283>;
  <D.27282>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4224, "stack_end < info->stack_end");
  <D.27283>:
  info->stack_end = stack_end;
  <D.27277>:
  sgen_gc_unlock ();
}


mono_gc_pthread_create (pthread_t * new_thread, const union pthread_attr_t * attr, void * (*<T1141>) (void *) start_routine, void * arg)
{
  int D.27284;

  D.27284 = pthread_create (new_thread, attr, start_routine, arg);
  return D.27284;
}


mono_gc_pthread_join (pthread_t thread, void * * retval)
{
  int D.27286;

  D.27286 = pthread_join (thread, retval);
  return D.27286;
}


mono_gc_pthread_detach (pthread_t thread)
{
  int D.27288;

  D.27288 = pthread_detach (thread);
  return D.27288;
}


mono_gc_pthread_exit (void * retval)
{
  mono_thread_info_dettach ();
  pthread_exit (retval);
}


mono_gc_wbarrier_set_field (struct MonoObject * obj, void * field_ptr, struct MonoObject * value)
{
  int D.27290;
  struct FILE * gc_debug_file.378;
  void (*<T3715>) (struct MonoObject *, void *, struct MonoObject *) D.27298;

  D.27290 = sgen_ptr_in_nursery (field_ptr);
  if (D.27290 != 0) goto <D.27291>; else goto <D.27292>;
  <D.27291>:
  MEM[(void * *)field_ptr] = value;
  return;
  <D.27292>:
  if (0 != 0) goto <D.27293>; else goto <D.27294>;
  <D.27293>:
  gc_debug_file.378 = gc_debug_file;
  fprintf (gc_debug_file.378, "Adding remset at %p\n", field_ptr);
  gc_debug_file.378 = gc_debug_file;
  fflush (gc_debug_file.378);
  <D.27294>:
  if (value != 0B) goto <D.27296>; else goto <D.27297>;
  <D.27296>:
  <D.27297>:
  D.27298 = remset.wbarrier_set_field;
  D.27298 (obj, field_ptr, value);
}


mono_gc_wbarrier_set_arrayref (struct MonoArray * arr, void * slot_ptr, struct MonoObject * value)
{
  int D.27300;
  struct FILE * gc_debug_file.379;
  void (*<T3719>) (struct MonoArray *, void *, struct MonoObject *) D.27308;

  D.27300 = sgen_ptr_in_nursery (slot_ptr);
  if (D.27300 != 0) goto <D.27301>; else goto <D.27302>;
  <D.27301>:
  MEM[(void * *)slot_ptr] = value;
  return;
  <D.27302>:
  if (0 != 0) goto <D.27303>; else goto <D.27304>;
  <D.27303>:
  gc_debug_file.379 = gc_debug_file;
  fprintf (gc_debug_file.379, "Adding remset at %p\n", slot_ptr);
  gc_debug_file.379 = gc_debug_file;
  fflush (gc_debug_file.379);
  <D.27304>:
  if (value != 0B) goto <D.27306>; else goto <D.27307>;
  <D.27306>:
  <D.27307>:
  D.27308 = remset.wbarrier_set_arrayref;
  D.27308 (arr, slot_ptr, value);
}


mono_gc_wbarrier_arrayref_copy (void * dest_ptr, void * src_ptr, int count)
{
  int D.27312;
  unsigned int count.380;
  unsigned int D.27315;
  void (*<T371d>) (void *, void *, int) D.27316;

  D.27312 = sgen_ptr_in_nursery (dest_ptr);
  if (D.27312 != 0) goto <D.27310>; else goto <D.27313>;
  <D.27313>:
  if (count <= 0) goto <D.27310>; else goto <D.27311>;
  <D.27310>:
  count.380 = (unsigned int) count;
  D.27315 = count.380 * 4;
  mono_gc_memmove_aligned (dest_ptr, src_ptr, D.27315);
  return;
  <D.27311>:
  D.27316 = remset.wbarrier_arrayref_copy;
  D.27316 (dest_ptr, src_ptr, count);
}


find_object_for_ptr (char * ptr)
{
  struct GCMemSection * nursery_section.381;
  char * D.27319;
  char * D.27322;
  char * found_obj.382;
  char * D.27328;
  void (*<T36b4>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.27331;

  nursery_section.381 = nursery_section;
  D.27319 = nursery_section.381->data;
  if (D.27319 <= ptr) goto <D.27320>; else goto <D.27321>;
  <D.27320>:
  nursery_section.381 = nursery_section;
  D.27322 = nursery_section.381->end_data;
  if (D.27322 > ptr) goto <D.27323>; else goto <D.27324>;
  <D.27323>:
  found_obj = 0B;
  nursery_section.381 = nursery_section;
  D.27319 = nursery_section.381->data;
  nursery_section.381 = nursery_section;
  D.27322 = nursery_section.381->end_data;
  sgen_scan_area_with_callback (D.27319, D.27322, find_object_for_ptr_callback, ptr, 1);
  found_obj.382 = found_obj;
  if (found_obj.382 != 0B) goto <D.27326>; else goto <D.27327>;
  <D.27326>:
  D.27328 = found_obj;
  return D.27328;
  <D.27327>:
  <D.27324>:
  <D.27321>:
  found_obj = 0B;
  sgen_los_iterate_objects (find_object_for_ptr_callback, ptr);
  found_obj.382 = found_obj;
  if (found_obj.382 != 0B) goto <D.27329>; else goto <D.27330>;
  <D.27329>:
  D.27328 = found_obj;
  return D.27328;
  <D.27330>:
  found_obj = 0B;
  D.27331 = major_collector.iterate_objects;
  D.27331 (1, 1, find_object_for_ptr_callback, ptr);
  D.27328 = found_obj;
  return D.27328;
}


find_object_for_ptr_callback (char * obj, size_t size, void * user_data)
{
  char * D.27335;
  char * found_obj.383;
  _Bool D.27339;
  long int D.27340;
  long int D.27341;
  char * ptr;

  ptr = user_data;
  if (ptr >= obj) goto <D.27333>; else goto <D.27334>;
  <D.27333>:
  D.27335 = obj + size;
  if (D.27335 > ptr) goto <D.27336>; else goto <D.27337>;
  <D.27336>:
  found_obj.383 = found_obj;
  D.27339 = found_obj.383 != 0B;
  D.27340 = (long int) D.27339;
  D.27341 = __builtin_expect (D.27340, 0);
  if (D.27341 != 0) goto <D.27342>; else goto <D.27343>;
  <D.27342>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4335, "!found_obj");
  <D.27343>:
  found_obj = obj;
  <D.27337>:
  <D.27334>:
}


mono_gc_wbarrier_generic_nostore (void * ptr)
{
  int D.27348;
  int D.27350;
  struct FILE * gc_debug_file.384;
  int D.27354;
  int concurrent_collection_in_progress.385;
  void (*<T1b97>) (void *) D.27364;
  void * obj;

  obj = MEM[(void * *)ptr];
  if (obj != 0B) goto <D.27344>; else goto <D.27345>;
  <D.27344>:
  <D.27345>:
  D.27348 = sgen_ptr_in_nursery (ptr);
  if (D.27348 != 0) goto <D.27346>; else goto <D.27349>;
  <D.27349>:
  D.27350 = ptr_on_stack (ptr);
  if (D.27350 != 0) goto <D.27346>; else goto <D.27347>;
  <D.27346>:
  if (0 != 0) goto <D.27351>; else goto <D.27352>;
  <D.27351>:
  gc_debug_file.384 = gc_debug_file;
  fprintf (gc_debug_file.384, "Skipping remset at %p\n", ptr);
  gc_debug_file.384 = gc_debug_file;
  fflush (gc_debug_file.384);
  <D.27352>:
  return;
  <D.27347>:
  D.27354 = sgen_ptr_in_nursery (obj);
  if (D.27354 == 0) goto <D.27355>; else goto <D.27356>;
  <D.27355>:
  concurrent_collection_in_progress.385 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.385 == 0) goto <D.27358>; else goto <D.27359>;
  <D.27358>:
  if (0 != 0) goto <D.27360>; else goto <D.27361>;
  <D.27360>:
  gc_debug_file.384 = gc_debug_file;
  fprintf (gc_debug_file.384, "Skipping remset at %p\n", ptr);
  gc_debug_file.384 = gc_debug_file;
  fflush (gc_debug_file.384);
  <D.27361>:
  return;
  <D.27359>:
  <D.27356>:
  if (0 != 0) goto <D.27362>; else goto <D.27363>;
  <D.27362>:
  gc_debug_file.384 = gc_debug_file;
  fprintf (gc_debug_file.384, "Adding remset at %p\n", ptr);
  gc_debug_file.384 = gc_debug_file;
  fflush (gc_debug_file.384);
  <D.27363>:
  D.27364 = remset.wbarrier_generic_nostore;
  D.27364 (ptr);
}


ptr_on_stack (void * ptr)
{
  void * stack_start.386;
  void * D.27369;
  gboolean D.27372;
  void * stack_start;
  struct SgenThreadInfo * info;

  try
    {
      stack_start = &stack_start;
      info = mono_thread_info_current ();
      stack_start.386 = stack_start;
      if (ptr >= stack_start.386) goto <D.27367>; else goto <D.27368>;
      <D.27367>:
      D.27369 = info->stack_end;
      if (D.27369 > ptr) goto <D.27370>; else goto <D.27371>;
      <D.27370>:
      D.27372 = 1;
      return D.27372;
      <D.27371>:
      <D.27368>:
      D.27372 = 0;
      return D.27372;
    }
  finally
    {
      stack_start = {CLOBBER};
    }
}


mono_gc_wbarrier_generic_store (void * ptr, struct MonoObject * value)
{
  struct FILE * gc_debug_file.387;
  const char * iftmp.388;
  int D.27382;

  if (0 != 0) goto <D.27375>; else goto <D.27376>;
  <D.27375>:
  gc_debug_file.387 = gc_debug_file;
  if (value != 0B) goto <D.27379>; else goto <D.27380>;
  <D.27379>:
  iftmp.388 = safe_name (value);
  goto <D.27381>;
  <D.27380>:
  iftmp.388 = "null";
  <D.27381>:
  fprintf (gc_debug_file.387, "Wbarrier store at %p to %p (%s)\n", ptr, value, iftmp.388);
  gc_debug_file.387 = gc_debug_file;
  fflush (gc_debug_file.387);
  <D.27376>:
  MEM[(void * *)ptr] = value;
  D.27382 = sgen_ptr_in_nursery (value);
  if (D.27382 != 0) goto <D.27383>; else goto <D.27384>;
  <D.27383>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.27384>:
  sgen_dummy_use (value);
}


sgen_dummy_use (void * v)
{
  __asm__ __volatile__("" : "=r" v : "r" v);
}


mono_gc_wbarrier_generic_store_atomic (void * ptr, struct MonoObject * value)
{
  struct FILE * gc_debug_file.389;
  const char * iftmp.390;
  int D.27392;

  if (0 != 0) goto <D.27385>; else goto <D.27386>;
  <D.27385>:
  gc_debug_file.389 = gc_debug_file;
  if (value != 0B) goto <D.27389>; else goto <D.27390>;
  <D.27389>:
  iftmp.390 = safe_name (value);
  goto <D.27391>;
  <D.27390>:
  iftmp.390 = "null";
  <D.27391>:
  fprintf (gc_debug_file.389, "Wbarrier atomic store at %p to %p (%s)\n", ptr, value, iftmp.390);
  gc_debug_file.389 = gc_debug_file;
  fflush (gc_debug_file.389);
  <D.27386>:
  InterlockedWritePointer (ptr, value);
  D.27392 = sgen_ptr_in_nursery (value);
  if (D.27392 != 0) goto <D.27393>; else goto <D.27394>;
  <D.27393>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.27394>:
  sgen_dummy_use (value);
}


InterlockedWritePointer (void * volatile * dst, void * val)
{
  InterlockedExchangePointer (dst, val);
}


InterlockedExchangePointer (void * volatile * val, void * new_val)
{
  unsigned int old_val.391;
  unsigned int new_val.392;
  unsigned int D.27397;
  void * D.27398;
  void * D.27399;
  void * old_val;

  <D.14389>:
  old_val = *val;
  old_val.391 = (unsigned int) old_val;
  new_val.392 = (unsigned int) new_val;
  D.27397 = __sync_val_compare_and_swap_4 (val, old_val.391, new_val.392);
  D.27398 = (void *) D.27397;
  if (D.27398 != old_val) goto <D.14389>; else goto <D.14390>;
  <D.14390>:
  D.27399 = old_val;
  return D.27399;
}


mono_gc_wbarrier_value_copy_bitmap (void * _dest, void * _src, int size, unsigned int bitmap)
{
  unsigned int D.27401;
  unsigned int D.27404;
  struct MonoObject * D.27405;
  mword * dest;
  mword * src;

  dest = _dest;
  src = _src;
  goto <D.23570>;
  <D.23569>:
  D.27401 = bitmap & 1;
  if (D.27401 != 0) goto <D.27402>; else goto <D.27403>;
  <D.27402>:
  D.27404 = *src;
  D.27405 = (struct MonoObject *) D.27404;
  mono_gc_wbarrier_generic_store (dest, D.27405);
  goto <D.27406>;
  <D.27403>:
  D.27404 = *src;
  *dest = D.27404;
  <D.27406>:
  src = src + 4;
  dest = dest + 4;
  size = size + -4;
  bitmap = bitmap >> 1;
  <D.23570>:
  if (size != 0) goto <D.23569>; else goto <D.23571>;
  <D.23571>:
}


mono_gc_wbarrier_value_copy (void * dest, void * src, int count, struct MonoClass * klass)
{
  unsigned char D.27407;
  unsigned char D.27408;
  _Bool D.27409;
  long int D.27410;
  long int D.27411;
  struct FILE * gc_debug_file.393;
  void * D.27417;
  const char * D.27418;
  int D.27421;
  int D.27423;
  unsigned int D.27425;
  int D.27426;
  int D.27427;
  unsigned int count.394;
  void (*<T3721>) (void *, void *, int, struct MonoClass *) D.27429;

  D.27407 = BIT_FIELD_REF <*klass, 8, 160>;
  D.27408 = D.27407 & 8;
  D.27409 = D.27408 == 0;
  D.27410 = (long int) D.27409;
  D.27411 = __builtin_expect (D.27410, 0);
  if (D.27411 != 0) goto <D.27412>; else goto <D.27413>;
  <D.27412>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4480, "klass->valuetype");
  <D.27413>:
  if (0 != 0) goto <D.27414>; else goto <D.27415>;
  <D.27414>:
  gc_debug_file.393 = gc_debug_file;
  D.27417 = klass->gc_descr;
  D.27418 = klass->name;
  fprintf (gc_debug_file.393, "Adding value remset at %p, count %d, descr %p for class %s (%p)\n", dest, count, D.27417, D.27418, klass);
  gc_debug_file.393 = gc_debug_file;
  fflush (gc_debug_file.393);
  <D.27415>:
  D.27421 = sgen_ptr_in_nursery (dest);
  if (D.27421 != 0) goto <D.27419>; else goto <D.27422>;
  <D.27422>:
  D.27423 = ptr_on_stack (dest);
  if (D.27423 != 0) goto <D.27419>; else goto <D.27424>;
  <D.27424>:
  D.27417 = klass->gc_descr;
  D.27425 = (unsigned int) D.27417;
  D.27426 = sgen_gc_descr_has_references (D.27425);
  if (D.27426 == 0) goto <D.27419>; else goto <D.27420>;
  <D.27419>:
  {
    size_t element_size;
    size_t size;

    D.27427 = mono_class_value_size (klass, 0B);
    element_size = (size_t) D.27427;
    count.394 = (unsigned int) count;
    size = count.394 * element_size;
    mono_gc_memmove_atomic (dest, src, size);
    return;
  }
  <D.27420>:
  D.27429 = remset.wbarrier_value_copy;
  D.27429 (dest, src, count, klass);
}


mono_gc_wbarrier_object_copy (struct MonoObject * obj, struct MonoObject * src)
{
  int D.27433;
  int D.27435;
  struct MonoVTable * D.27436;
  struct MonoClass * D.27437;
  void * D.27438;
  const void * D.27439;
  unsigned int size.395;
  unsigned int D.27441;
  void (*<T3725>) (struct MonoObject *, struct MonoObject *) D.27442;
  int size;

  D.27433 = sgen_ptr_in_nursery (obj);
  if (D.27433 != 0) goto <D.27431>; else goto <D.27434>;
  <D.27434>:
  D.27435 = ptr_on_stack (obj);
  if (D.27435 != 0) goto <D.27431>; else goto <D.27432>;
  <D.27431>:
  D.27436 = obj->vtable;
  D.27437 = D.27436->klass;
  size = D.27437->instance_size;
  D.27438 = obj + 8;
  D.27439 = src + 8;
  size.395 = (unsigned int) size;
  D.27441 = size.395 + 4294967288;
  mono_gc_memmove_aligned (D.27438, D.27439, D.27441);
  return;
  <D.27432>:
  D.27442 = remset.wbarrier_object_copy;
  D.27442 (obj, src);
}


mono_gc_walk_heap (int flags, int (*MonoGCReferences) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) callback, void * data)
{
  struct GCMemSection * nursery_section.396;
  char * D.27445;
  char * D.27446;
  void (*<T36b4>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.27447;
  int D.27448;
  struct HeapWalkInfo hwi;

  try
    {
      hwi.flags = flags;
      hwi.callback = callback;
      hwi.data = data;
      sgen_clear_nursery_fragments ();
      nursery_section.396 = nursery_section;
      D.27445 = nursery_section.396->data;
      nursery_section.396 = nursery_section;
      D.27446 = nursery_section.396->end_data;
      sgen_scan_area_with_callback (D.27445, D.27446, walk_references, &hwi, 0);
      D.27447 = major_collector.iterate_objects;
      D.27447 (1, 1, walk_references, &hwi);
      sgen_los_iterate_objects (walk_references, &hwi);
      D.27448 = 0;
      return D.27448;
    }
  finally
    {
      hwi = {CLOBBER};
    }
}


walk_references (char * start, size_t size, void * data)
{
  int D.27453;
  int D.27455;
  int (*<T391c>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.27456;
  struct MonoVTable * D.27457;
  struct MonoClass * D.27458;
  size_t iftmp.397;
  unsigned int D.27463;
  struct MonoObject *[128] * D.27464;
  uintptr_t[128] * D.27465;
  void * D.27466;
  struct HeapWalkInfo * hwi;

  hwi = data;
  hwi->called = 0;
  hwi->count = 0;
  collect_references (hwi, start, size);
  D.27453 = hwi->count;
  if (D.27453 != 0) goto <D.27451>; else goto <D.27454>;
  <D.27454>:
  D.27455 = hwi->called;
  if (D.27455 == 0) goto <D.27451>; else goto <D.27452>;
  <D.27451>:
  D.27456 = hwi->callback;
  D.27457 = MEM[(struct MonoObject *)start].vtable;
  D.27458 = D.27457->klass;
  D.27455 = hwi->called;
  if (D.27455 == 0) goto <D.27460>; else goto <D.27461>;
  <D.27460>:
  iftmp.397 = size;
  goto <D.27462>;
  <D.27461>:
  iftmp.397 = 0;
  <D.27462>:
  D.27453 = hwi->count;
  D.27463 = (unsigned int) D.27453;
  D.27464 = &hwi->refs;
  D.27465 = &hwi->offsets;
  D.27466 = hwi->data;
  D.27456 (start, D.27458, iftmp.397, D.27463, D.27464, D.27465, D.27466);
  <D.27452>:
}


collect_references (struct HeapWalkInfo * hwi, char * start, size_t size)
{
  unsigned int D.27467;
  unsigned int D.27468;
  unsigned int D.27469;
  unsigned int D.27470;
  unsigned int D.27473;
  unsigned int D.27474;
  unsigned int D.27475;
  unsigned int D.27476;
  unsigned int D.27477;
  void * D.27478;
  int D.27481;
  int (*<T391c>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.27484;
  struct MonoVTable * D.27485;
  struct MonoClass * D.27486;
  size_t iftmp.398;
  int D.27488;
  unsigned int D.27492;
  struct MonoObject *[128] * D.27493;
  uintptr_t[128] * D.27494;
  void * D.27495;
  int _objptr.399;
  int start.400;
  int D.27498;
  unsigned int D.27499;
  int D.27500;
  int D.27501;
  size_t iftmp.401;
  int D.27510;
  int D.27511;
  unsigned int _index.402;
  unsigned int D.27513;
  int D.27514;
  void * D.27515;
  size_t iftmp.403;
  int _objptr.404;
  int D.27525;
  unsigned int D.27526;
  int D.27527;
  int D.27528;
  unsigned int _index.405;
  unsigned int D.27530;
  int D.27531;
  size_t iftmp.406;
  int D.27540;
  int D.27541;
  unsigned int D.27542;
  unsigned int D.27545;
  int D.27546;
  int desc.407;
  unsigned int D.27550;
  unsigned int el_size.408;
  unsigned int D.27552;
  void * D.27553;
  size_t iftmp.409;
  int p.410;
  int D.27563;
  unsigned int D.27564;
  int D.27565;
  int D.27566;
  int D.27570;
  unsigned int offset.411;
  unsigned int D.27572;
  unsigned int i.412;
  unsigned int D.27574;
  void * * D.27575;
  void * D.27576;
  size_t iftmp.413;
  char * D.27585;
  int D.27586;
  int D.27587;
  unsigned int D.27588;
  int D.27589;
  int D.27590;
  sizetype el_size.414;
  unsigned int D.27595;
  void * D.27598;
  size_t iftmp.415;
  int p.416;
  int D.27608;
  unsigned int D.27609;
  int D.27610;
  int D.27611;
  unsigned int D.27612;
  void * D.27615;
  size_t iftmp.417;
  int _objptr.418;
  int D.27625;
  unsigned int D.27626;
  int D.27627;
  int D.27628;
  unsigned int D.27629;
  unsigned int D.27630;
  struct MonoVTable * D.27633;
  struct MonoClass * D.27634;
  const char * D.27635;
  const char * D.27636;
  gsize * bitmap_data.419;
  unsigned int D.27638;
  void * D.27641;
  size_t iftmp.420;
  int _objptr.421;
  int D.27651;
  unsigned int D.27652;
  int D.27653;
  int D.27654;
  int bwords.422;
  unsigned int D.27656;
  gsize * mbitmap_data.423;
  unsigned int D.27658;
  unsigned int D.27659;
  struct MonoClass * D.27660;
  unsigned int el_size.424;
  unsigned int D.27662;
  const char * D.27665;
  const char * D.27666;
  gsize * bitmap_data.425;
  unsigned int D.27668;
  void * D.27671;
  size_t iftmp.426;
  int _objptr.427;
  int D.27681;
  unsigned int D.27682;
  int D.27683;
  int D.27684;
  unsigned int bwords.428;
  sizetype el_size.429;

  {
    struct GCVTable * vt;
    mword desc;

    D.27467 = MEM[(mword *)start];
    D.27468 = D.27467 & 4294967292;
    vt = (struct GCVTable *) D.27468;
    desc = vt->desc;
    D.27469 = desc & 7;
    switch (D.27469) <default: <D.23686>, case 1: <D.23601>, case 2: <D.23608>, case 3: <D.23652>, case 4: <D.23616>, case 5: <D.23646>, case 6: <D.23665>, case 7: <D.23685>>
    <D.23601>:
    D.27470 = desc & 4294901760;
    if (D.27470 != 0) goto <D.27471>; else goto <D.27472>;
    <D.27471>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.27473 = desc >> 16;
      D.27474 = D.27473 & 255;
      D.27475 = D.27474 * 4;
      _objptr = _objptr + D.27475;
      D.27476 = desc >> 24;
      D.27477 = D.27476 * 4;
      _objptr_end = _objptr + D.27477;
      D.27478 = *_objptr;
      if (D.27478 != 0B) goto <D.27479>; else goto <D.27480>;
      <D.27479>:
      D.27481 = hwi->count;
      if (D.27481 == 128) goto <D.27482>; else goto <D.27483>;
      <D.27482>:
      D.27484 = hwi->callback;
      D.27485 = MEM[(struct MonoObject *)start].vtable;
      D.27486 = D.27485->klass;
      D.27488 = hwi->called;
      if (D.27488 == 0) goto <D.27489>; else goto <D.27490>;
      <D.27489>:
      iftmp.398 = size;
      goto <D.27491>;
      <D.27490>:
      iftmp.398 = 0;
      <D.27491>:
      D.27481 = hwi->count;
      D.27492 = (unsigned int) D.27481;
      D.27493 = &hwi->refs;
      D.27494 = &hwi->offsets;
      D.27495 = hwi->data;
      D.27484 (start, D.27486, iftmp.398, D.27492, D.27493, D.27494, D.27495);
      hwi->count = 0;
      hwi->called = 1;
      <D.27483>:
      D.27481 = hwi->count;
      _objptr.399 = (int) _objptr;
      start.400 = (int) start;
      D.27498 = _objptr.399 - start.400;
      D.27499 = (unsigned int) D.27498;
      hwi->offsets[D.27481] = D.27499;
      D.27481 = hwi->count;
      D.27500 = D.27481;
      D.27501 = D.27500 + 1;
      hwi->count = D.27501;
      D.27478 = *_objptr;
      hwi->refs[D.27500] = D.27478;
      <D.27480>:
      _objptr = _objptr + 4;
      goto <D.23605>;
      <D.23604>:
      D.27478 = *_objptr;
      if (D.27478 != 0B) goto <D.27502>; else goto <D.27503>;
      <D.27502>:
      D.27481 = hwi->count;
      if (D.27481 == 128) goto <D.27504>; else goto <D.27505>;
      <D.27504>:
      D.27484 = hwi->callback;
      D.27485 = MEM[(struct MonoObject *)start].vtable;
      D.27486 = D.27485->klass;
      D.27488 = hwi->called;
      if (D.27488 == 0) goto <D.27507>; else goto <D.27508>;
      <D.27507>:
      iftmp.401 = size;
      goto <D.27509>;
      <D.27508>:
      iftmp.401 = 0;
      <D.27509>:
      D.27481 = hwi->count;
      D.27492 = (unsigned int) D.27481;
      D.27493 = &hwi->refs;
      D.27494 = &hwi->offsets;
      D.27495 = hwi->data;
      D.27484 (start, D.27486, iftmp.401, D.27492, D.27493, D.27494, D.27495);
      hwi->count = 0;
      hwi->called = 1;
      <D.27505>:
      D.27481 = hwi->count;
      _objptr.399 = (int) _objptr;
      start.400 = (int) start;
      D.27498 = _objptr.399 - start.400;
      D.27499 = (unsigned int) D.27498;
      hwi->offsets[D.27481] = D.27499;
      D.27481 = hwi->count;
      D.27510 = D.27481;
      D.27511 = D.27510 + 1;
      hwi->count = D.27511;
      D.27478 = *_objptr;
      hwi->refs[D.27510] = D.27478;
      <D.27503>:
      _objptr = _objptr + 4;
      <D.23605>:
      if (_objptr < _objptr_end) goto <D.23604>; else goto <D.23606>;
      <D.23606>:
    }
    <D.27472>:
    goto <D.23607>;
    <D.23608>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 16;
      _objptr = _objptr + 8;
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.402 = (unsigned int) _index;
        D.27513 = _index.402 * 4;
        _objptr = _objptr + D.27513;
        D.27514 = _index + 1;
        _bmap = _bmap >> D.27514;
        D.27515 = *_objptr;
        if (D.27515 != 0B) goto <D.27516>; else goto <D.27517>;
        <D.27516>:
        D.27481 = hwi->count;
        if (D.27481 == 128) goto <D.27518>; else goto <D.27519>;
        <D.27518>:
        D.27484 = hwi->callback;
        D.27485 = MEM[(struct MonoObject *)start].vtable;
        D.27486 = D.27485->klass;
        D.27488 = hwi->called;
        if (D.27488 == 0) goto <D.27521>; else goto <D.27522>;
        <D.27521>:
        iftmp.403 = size;
        goto <D.27523>;
        <D.27522>:
        iftmp.403 = 0;
        <D.27523>:
        D.27481 = hwi->count;
        D.27492 = (unsigned int) D.27481;
        D.27493 = &hwi->refs;
        D.27494 = &hwi->offsets;
        D.27495 = hwi->data;
        D.27484 (start, D.27486, iftmp.403, D.27492, D.27493, D.27494, D.27495);
        hwi->count = 0;
        hwi->called = 1;
        <D.27519>:
        D.27481 = hwi->count;
        _objptr.404 = (int) _objptr;
        start.400 = (int) start;
        D.27525 = _objptr.404 - start.400;
        D.27526 = (unsigned int) D.27525;
        hwi->offsets[D.27481] = D.27526;
        D.27481 = hwi->count;
        D.27527 = D.27481;
        D.27528 = D.27527 + 1;
        hwi->count = D.27528;
        D.27515 = *_objptr;
        hwi->refs[D.27527] = D.27515;
        <D.27517>:
        _objptr = _objptr + 4;
      }
      goto <D.23614>;
      <D.23613>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.405 = (unsigned int) _index;
        D.27530 = _index.405 * 4;
        _objptr = _objptr + D.27530;
        D.27531 = _index + 1;
        _bmap = _bmap >> D.27531;
        D.27515 = *_objptr;
        if (D.27515 != 0B) goto <D.27532>; else goto <D.27533>;
        <D.27532>:
        D.27481 = hwi->count;
        if (D.27481 == 128) goto <D.27534>; else goto <D.27535>;
        <D.27534>:
        D.27484 = hwi->callback;
        D.27485 = MEM[(struct MonoObject *)start].vtable;
        D.27486 = D.27485->klass;
        D.27488 = hwi->called;
        if (D.27488 == 0) goto <D.27537>; else goto <D.27538>;
        <D.27537>:
        iftmp.406 = size;
        goto <D.27539>;
        <D.27538>:
        iftmp.406 = 0;
        <D.27539>:
        D.27481 = hwi->count;
        D.27492 = (unsigned int) D.27481;
        D.27493 = &hwi->refs;
        D.27494 = &hwi->offsets;
        D.27495 = hwi->data;
        D.27484 (start, D.27486, iftmp.406, D.27492, D.27493, D.27494, D.27495);
        hwi->count = 0;
        hwi->called = 1;
        <D.27535>:
        D.27481 = hwi->count;
        _objptr.404 = (int) _objptr;
        start.400 = (int) start;
        D.27525 = _objptr.404 - start.400;
        D.27526 = (unsigned int) D.27525;
        hwi->offsets[D.27481] = D.27526;
        D.27481 = hwi->count;
        D.27540 = D.27481;
        D.27541 = D.27540 + 1;
        hwi->count = D.27541;
        D.27515 = *_objptr;
        hwi->refs[D.27540] = D.27515;
        <D.27533>:
        _objptr = _objptr + 4;
      }
      <D.23614>:
      if (_bmap != 0) goto <D.23613>; else goto <D.23615>;
      <D.23615>:
    }
    goto <D.23607>;
    <D.23616>:
    D.27542 = desc & 4294950912;
    if (D.27542 != 0) goto <D.27543>; else goto <D.27544>;
    <D.27543>:
    {
      int el_size;
      int etype;

      D.27545 = desc >> 3;
      D.27546 = (int) D.27545;
      el_size = D.27546 & 1023;
      desc.407 = (int) desc;
      etype = desc.407 & 49152;
      if (etype == 16384) goto <D.27548>; else goto <D.27549>;
      <D.27548>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.27550 = MEM[(struct MonoArray *)start].max_length;
        el_size.408 = (unsigned int) el_size;
        D.27552 = D.27550 * el_size.408;
        end_refs = p + D.27552;
        goto <D.23622>;
        <D.23621>:
        D.27553 = *p;
        if (D.27553 != 0B) goto <D.27554>; else goto <D.27555>;
        <D.27554>:
        D.27481 = hwi->count;
        if (D.27481 == 128) goto <D.27556>; else goto <D.27557>;
        <D.27556>:
        D.27484 = hwi->callback;
        D.27485 = MEM[(struct MonoObject *)start].vtable;
        D.27486 = D.27485->klass;
        D.27488 = hwi->called;
        if (D.27488 == 0) goto <D.27559>; else goto <D.27560>;
        <D.27559>:
        iftmp.409 = size;
        goto <D.27561>;
        <D.27560>:
        iftmp.409 = 0;
        <D.27561>:
        D.27481 = hwi->count;
        D.27492 = (unsigned int) D.27481;
        D.27493 = &hwi->refs;
        D.27494 = &hwi->offsets;
        D.27495 = hwi->data;
        D.27484 (start, D.27486, iftmp.409, D.27492, D.27493, D.27494, D.27495);
        hwi->count = 0;
        hwi->called = 1;
        <D.27557>:
        D.27481 = hwi->count;
        p.410 = (int) p;
        start.400 = (int) start;
        D.27563 = p.410 - start.400;
        D.27564 = (unsigned int) D.27563;
        hwi->offsets[D.27481] = D.27564;
        D.27481 = hwi->count;
        D.27565 = D.27481;
        D.27566 = D.27565 + 1;
        hwi->count = D.27566;
        D.27553 = *p;
        hwi->refs[D.27565] = D.27553;
        <D.27555>:
        p = p + 4;
        <D.23622>:
        if (p < end_refs) goto <D.23621>; else goto <D.23623>;
        <D.23623>:
      }
      goto <D.27567>;
      <D.27549>:
      if (etype == 32768) goto <D.27568>; else goto <D.27569>;
      <D.27568>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.27473 = desc >> 16;
        D.27570 = (int) D.27473;
        offset = D.27570 & 255;
        D.27476 = desc >> 24;
        num_refs = (int) D.27476;
        e_start = start + 16;
        D.27550 = MEM[(struct MonoArray *)start].max_length;
        el_size.408 = (unsigned int) el_size;
        D.27552 = D.27550 * el_size.408;
        e_end = e_start + D.27552;
        goto <D.23634>;
        <D.23633>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.411 = (unsigned int) offset;
          D.27572 = offset.411 * 4;
          p = p + D.27572;
          i = 0;
          goto <D.23631>;
          <D.23630>:
          i.412 = (unsigned int) i;
          D.27574 = i.412 * 4;
          D.27575 = p + D.27574;
          D.27576 = *D.27575;
          if (D.27576 != 0B) goto <D.27577>; else goto <D.27578>;
          <D.27577>:
          D.27481 = hwi->count;
          if (D.27481 == 128) goto <D.27579>; else goto <D.27580>;
          <D.27579>:
          D.27484 = hwi->callback;
          D.27485 = MEM[(struct MonoObject *)start].vtable;
          D.27486 = D.27485->klass;
          D.27488 = hwi->called;
          if (D.27488 == 0) goto <D.27582>; else goto <D.27583>;
          <D.27582>:
          iftmp.413 = size;
          goto <D.27584>;
          <D.27583>:
          iftmp.413 = 0;
          <D.27584>:
          D.27481 = hwi->count;
          D.27492 = (unsigned int) D.27481;
          D.27493 = &hwi->refs;
          D.27494 = &hwi->offsets;
          D.27495 = hwi->data;
          D.27484 (start, D.27486, iftmp.413, D.27492, D.27493, D.27494, D.27495);
          hwi->count = 0;
          hwi->called = 1;
          <D.27580>:
          D.27481 = hwi->count;
          i.412 = (unsigned int) i;
          D.27574 = i.412 * 4;
          D.27585 = p + D.27574;
          D.27586 = (int) D.27585;
          start.400 = (int) start;
          D.27587 = D.27586 - start.400;
          D.27588 = (unsigned int) D.27587;
          hwi->offsets[D.27481] = D.27588;
          D.27481 = hwi->count;
          D.27589 = D.27481;
          D.27590 = D.27589 + 1;
          hwi->count = D.27590;
          i.412 = (unsigned int) i;
          D.27574 = i.412 * 4;
          D.27575 = p + D.27574;
          D.27576 = *D.27575;
          hwi->refs[D.27589] = D.27576;
          <D.27578>:
          i = i + 1;
          <D.23631>:
          if (i < num_refs) goto <D.23630>; else goto <D.23632>;
          <D.23632>:
          el_size.414 = (sizetype) el_size;
          e_start = e_start + el_size.414;
        }
        <D.23634>:
        if (e_start < e_end) goto <D.23633>; else goto <D.23635>;
        <D.23635>:
      }
      goto <D.27592>;
      <D.27569>:
      if (etype == 49152) goto <D.27593>; else goto <D.27594>;
      <D.27593>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.27550 = MEM[(struct MonoArray *)start].max_length;
        el_size.408 = (unsigned int) el_size;
        D.27552 = D.27550 * el_size.408;
        e_end = e_start + D.27552;
        goto <D.23644>;
        <D.23643>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.23641>;
          <D.23640>:
          D.27595 = _bmap & 1;
          if (D.27595 != 0) goto <D.27596>; else goto <D.27597>;
          <D.27596>:
          D.27598 = *p;
          if (D.27598 != 0B) goto <D.27599>; else goto <D.27600>;
          <D.27599>:
          D.27481 = hwi->count;
          if (D.27481 == 128) goto <D.27601>; else goto <D.27602>;
          <D.27601>:
          D.27484 = hwi->callback;
          D.27485 = MEM[(struct MonoObject *)start].vtable;
          D.27486 = D.27485->klass;
          D.27488 = hwi->called;
          if (D.27488 == 0) goto <D.27604>; else goto <D.27605>;
          <D.27604>:
          iftmp.415 = size;
          goto <D.27606>;
          <D.27605>:
          iftmp.415 = 0;
          <D.27606>:
          D.27481 = hwi->count;
          D.27492 = (unsigned int) D.27481;
          D.27493 = &hwi->refs;
          D.27494 = &hwi->offsets;
          D.27495 = hwi->data;
          D.27484 (start, D.27486, iftmp.415, D.27492, D.27493, D.27494, D.27495);
          hwi->count = 0;
          hwi->called = 1;
          <D.27602>:
          D.27481 = hwi->count;
          p.416 = (int) p;
          start.400 = (int) start;
          D.27608 = p.416 - start.400;
          D.27609 = (unsigned int) D.27608;
          hwi->offsets[D.27481] = D.27609;
          D.27481 = hwi->count;
          D.27610 = D.27481;
          D.27611 = D.27610 + 1;
          hwi->count = D.27611;
          D.27598 = *p;
          hwi->refs[D.27610] = D.27598;
          <D.27600>:
          <D.27597>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.23641>:
          if (_bmap != 0) goto <D.23640>; else goto <D.23642>;
          <D.23642>:
          el_size.414 = (sizetype) el_size;
          e_start = e_start + el_size.414;
        }
        <D.23644>:
        if (e_start < e_end) goto <D.23643>; else goto <D.23645>;
        <D.23645>:
      }
      <D.27594>:
      <D.27592>:
      <D.27567>:
    }
    <D.27544>:
    goto <D.23607>;
    <D.23646>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.23650>;
      <D.23649>:
      D.27612 = _bmap & 1;
      if (D.27612 != 0) goto <D.27613>; else goto <D.27614>;
      <D.27613>:
      D.27615 = *_objptr;
      if (D.27615 != 0B) goto <D.27616>; else goto <D.27617>;
      <D.27616>:
      D.27481 = hwi->count;
      if (D.27481 == 128) goto <D.27618>; else goto <D.27619>;
      <D.27618>:
      D.27484 = hwi->callback;
      D.27485 = MEM[(struct MonoObject *)start].vtable;
      D.27486 = D.27485->klass;
      D.27488 = hwi->called;
      if (D.27488 == 0) goto <D.27621>; else goto <D.27622>;
      <D.27621>:
      iftmp.417 = size;
      goto <D.27623>;
      <D.27622>:
      iftmp.417 = 0;
      <D.27623>:
      D.27481 = hwi->count;
      D.27492 = (unsigned int) D.27481;
      D.27493 = &hwi->refs;
      D.27494 = &hwi->offsets;
      D.27495 = hwi->data;
      D.27484 (start, D.27486, iftmp.417, D.27492, D.27493, D.27494, D.27495);
      hwi->count = 0;
      hwi->called = 1;
      <D.27619>:
      D.27481 = hwi->count;
      _objptr.418 = (int) _objptr;
      start.400 = (int) start;
      D.27625 = _objptr.418 - start.400;
      D.27626 = (unsigned int) D.27625;
      hwi->offsets[D.27481] = D.27626;
      D.27481 = hwi->count;
      D.27627 = D.27481;
      D.27628 = D.27627 + 1;
      hwi->count = D.27628;
      D.27615 = *_objptr;
      hwi->refs[D.27627] = D.27615;
      <D.27617>:
      <D.27614>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.23650>:
      if (_bmap != 0) goto <D.23649>; else goto <D.23651>;
      <D.23651>:
    }
    goto <D.23607>;
    <D.23652>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.27629 = *bitmap_data;
      D.27630 = D.27629 + 4294967295;
      bwords = (int) D.27630;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.27631>; else goto <D.27632>;
      <D.27631>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.27633 = myobj->vtable;
        D.27634 = D.27633->klass;
        D.27635 = D.27634->name_space;
        D.27633 = myobj->vtable;
        D.27634 = D.27633->klass;
        D.27636 = D.27634->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.27635, D.27636);
      }
      <D.27632>:
      goto <D.23663>;
      <D.23662>:
      {
        gsize _bmap;

        bitmap_data.419 = bitmap_data;
        bitmap_data = bitmap_data.419 + 4;
        _bmap = *bitmap_data.419;
        _objptr = start_run;
        goto <D.23660>;
        <D.23659>:
        D.27638 = _bmap & 1;
        if (D.27638 != 0) goto <D.27639>; else goto <D.27640>;
        <D.27639>:
        D.27641 = *_objptr;
        if (D.27641 != 0B) goto <D.27642>; else goto <D.27643>;
        <D.27642>:
        D.27481 = hwi->count;
        if (D.27481 == 128) goto <D.27644>; else goto <D.27645>;
        <D.27644>:
        D.27484 = hwi->callback;
        D.27485 = MEM[(struct MonoObject *)start].vtable;
        D.27486 = D.27485->klass;
        D.27488 = hwi->called;
        if (D.27488 == 0) goto <D.27647>; else goto <D.27648>;
        <D.27647>:
        iftmp.420 = size;
        goto <D.27649>;
        <D.27648>:
        iftmp.420 = 0;
        <D.27649>:
        D.27481 = hwi->count;
        D.27492 = (unsigned int) D.27481;
        D.27493 = &hwi->refs;
        D.27494 = &hwi->offsets;
        D.27495 = hwi->data;
        D.27484 (start, D.27486, iftmp.420, D.27492, D.27493, D.27494, D.27495);
        hwi->count = 0;
        hwi->called = 1;
        <D.27645>:
        D.27481 = hwi->count;
        _objptr.421 = (int) _objptr;
        start.400 = (int) start;
        D.27651 = _objptr.421 - start.400;
        D.27652 = (unsigned int) D.27651;
        hwi->offsets[D.27481] = D.27652;
        D.27481 = hwi->count;
        D.27653 = D.27481;
        D.27654 = D.27653 + 1;
        hwi->count = D.27654;
        D.27641 = *_objptr;
        hwi->refs[D.27653] = D.27641;
        <D.27643>:
        <D.27640>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.23660>:
        if (_bmap != 0) goto <D.23659>; else goto <D.23661>;
        <D.23661>:
        start_run = start_run + 128;
      }
      <D.23663>:
      bwords.422 = bwords;
      bwords = bwords.422 + -1;
      if (bwords.422 > 0) goto <D.23662>; else goto <D.23664>;
      <D.23664>:
    }
    goto <D.23607>;
    <D.23665>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.27656 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.27656);
      mbitmap_data.423 = mbitmap_data;
      mbitmap_data = mbitmap_data.423 + 4;
      D.27658 = *mbitmap_data.423;
      D.27659 = D.27658 + 4294967295;
      mbwords = (int) D.27659;
      D.27660 = vt->klass;
      el_size = mono_array_element_size (D.27660);
      e_start = start + 16;
      D.27550 = MEM[(struct MonoArray *)start].max_length;
      el_size.424 = (unsigned int) el_size;
      D.27662 = D.27550 * el_size.424;
      e_end = e_start + D.27662;
      if (0 != 0) goto <D.27663>; else goto <D.27664>;
      <D.27663>:
      D.27656 = vt->desc;
      D.27660 = vt->klass;
      D.27665 = D.27660->name_space;
      D.27660 = vt->klass;
      D.27666 = D.27660->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.27656, D.27665, D.27666);
      <D.27664>:
      goto <D.23683>;
      <D.23682>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.23680>;
        <D.23679>:
        {
          gsize _bmap;
          void * * start_run;

          bitmap_data.425 = bitmap_data;
          bitmap_data = bitmap_data.425 + 4;
          _bmap = *bitmap_data.425;
          start_run = _objptr;
          goto <D.23677>;
          <D.23676>:
          D.27668 = _bmap & 1;
          if (D.27668 != 0) goto <D.27669>; else goto <D.27670>;
          <D.27669>:
          D.27671 = *_objptr;
          if (D.27671 != 0B) goto <D.27672>; else goto <D.27673>;
          <D.27672>:
          D.27481 = hwi->count;
          if (D.27481 == 128) goto <D.27674>; else goto <D.27675>;
          <D.27674>:
          D.27484 = hwi->callback;
          D.27485 = MEM[(struct MonoObject *)start].vtable;
          D.27486 = D.27485->klass;
          D.27488 = hwi->called;
          if (D.27488 == 0) goto <D.27677>; else goto <D.27678>;
          <D.27677>:
          iftmp.426 = size;
          goto <D.27679>;
          <D.27678>:
          iftmp.426 = 0;
          <D.27679>:
          D.27481 = hwi->count;
          D.27492 = (unsigned int) D.27481;
          D.27493 = &hwi->refs;
          D.27494 = &hwi->offsets;
          D.27495 = hwi->data;
          D.27484 (start, D.27486, iftmp.426, D.27492, D.27493, D.27494, D.27495);
          hwi->count = 0;
          hwi->called = 1;
          <D.27675>:
          D.27481 = hwi->count;
          _objptr.427 = (int) _objptr;
          start.400 = (int) start;
          D.27681 = _objptr.427 - start.400;
          D.27682 = (unsigned int) D.27681;
          hwi->offsets[D.27481] = D.27682;
          D.27481 = hwi->count;
          D.27683 = D.27481;
          D.27684 = D.27683 + 1;
          hwi->count = D.27684;
          D.27671 = *_objptr;
          hwi->refs[D.27683] = D.27671;
          <D.27673>:
          <D.27670>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.23677>:
          if (_bmap != 0) goto <D.23676>; else goto <D.23678>;
          <D.23678>:
          _objptr = start_run + 128;
        }
        <D.23680>:
        bwords.428 = bwords;
        bwords = bwords.428 + 4294967295;
        if (bwords.428 != 0) goto <D.23679>; else goto <D.23681>;
        <D.23681>:
        el_size.429 = (sizetype) el_size;
        e_start = e_start + el_size.429;
      }
      <D.23683>:
      if (e_start < e_end) goto <D.23682>; else goto <D.23684>;
      <D.23684>:
    }
    goto <D.23607>;
    <D.23685>:
    goto <D.23607>;
    <D.23686>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.23607>:
  }
}


mono_gc_collect (int generation)
{
  pthread_mutex_lock (&gc_mutex);
  if (generation > 1) goto <D.27688>; else goto <D.27689>;
  <D.27688>:
  generation = 1;
  <D.27689>:
  sgen_perform_collection (0, generation, "user request", 1);
  sgen_gc_unlock ();
}


mono_gc_max_generation ()
{
  int D.27690;

  D.27690 = 1;
  return D.27690;
}


mono_gc_collection_count (int generation)
{
  int D.27694;

  if (generation == 0) goto <D.27692>; else goto <D.27693>;
  <D.27692>:
  D.27694 = stat_minor_gcs;
  return D.27694;
  <D.27693>:
  D.27694 = stat_major_gcs;
  return D.27694;
}


mono_gc_get_used_size ()
{
  unsigned int los_memory_usage.430;
  struct GCMemSection * nursery_section.431;
  char * D.27698;
  int D.27699;
  char * D.27700;
  int D.27701;
  int D.27702;
  long long int D.27703;
  gint64 (*<T36d0>) (void) D.27704;
  long long int D.27705;
  int64_t D.27706;
  gint64 tot;

  tot = 0;
  pthread_mutex_lock (&gc_mutex);
  los_memory_usage.430 = los_memory_usage;
  tot = (gint64) los_memory_usage.430;
  nursery_section.431 = nursery_section;
  D.27698 = nursery_section.431->next_data;
  D.27699 = (int) D.27698;
  nursery_section.431 = nursery_section;
  D.27700 = nursery_section.431->data;
  D.27701 = (int) D.27700;
  D.27702 = D.27699 - D.27701;
  D.27703 = (long long int) D.27702;
  tot = D.27703 + tot;
  D.27704 = major_collector.get_used_size;
  D.27705 = D.27704 ();
  tot = D.27705 + tot;
  sgen_gc_unlock ();
  D.27706 = tot;
  return D.27706;
}


mono_gc_get_los_limit ()
{
  int D.27708;

  D.27708 = 8000;
  return D.27708;
}


mono_gc_user_markers_supported ()
{
  gboolean D.27710;

  D.27710 = 1;
  return D.27710;
}


mono_object_is_alive (struct MonoObject * o)
{
  gboolean D.27712;

  D.27712 = 1;
  return D.27712;
}


mono_gc_get_generation (struct MonoObject * obj)
{
  int D.27714;
  int D.27717;

  D.27714 = sgen_ptr_in_nursery (obj);
  if (D.27714 != 0) goto <D.27715>; else goto <D.27716>;
  <D.27715>:
  D.27717 = 0;
  return D.27717;
  <D.27716>:
  D.27717 = 1;
  return D.27717;
}


mono_gc_enable_events ()
{

}


mono_gc_weak_link_add (void * * link_addr, struct MonoObject * obj, gboolean track)
{
  sgen_register_disappearing_link (obj, link_addr, track, 0);
}


mono_gc_weak_link_remove (void * * link_addr, gboolean track)
{
  sgen_register_disappearing_link (0B, link_addr, track, 0);
}


mono_gc_weak_link_get (void * * link_addr)
{
  long unsigned int ptr.432;
  long unsigned int D.27722;
  long unsigned int D.27723;
  struct MonoObject * D.27725;
  int bridge_processing_in_progress.433;
  _Bool D.27727;
  long int D.27728;
  long int D.27729;
  void * D.27732;
  void * volatile * link_addr_volatile;
  void * ptr;
  struct MonoObject * obj;
  void retry = <<< error >>>;

  retry:
  link_addr_volatile = link_addr;
  ptr = *link_addr_volatile;
  if (ptr != 0B) goto <D.27719>; else goto <D.27720>;
  <D.27719>:
  ptr.432 = (long unsigned int) ptr;
  D.27722 = ~ptr.432;
  D.27723 = D.27722 & 4294967292;
  obj = (struct MonoObject *) D.27723;
  goto <D.27724>;
  <D.27720>:
  D.27725 = 0B;
  return D.27725;
  <D.27724>:
  mono_memory_barrier ();
  bridge_processing_in_progress.433 = bridge_processing_in_progress;
  D.27727 = bridge_processing_in_progress.433 != 0;
  D.27728 = (long int) D.27727;
  D.27729 = __builtin_expect (D.27728, 0);
  if (D.27729 != 0) goto <D.27730>; else goto <D.27731>;
  <D.27730>:
  mono_gc_wait_for_bridge_processing ();
  <D.27731>:
  D.27732 = *link_addr_volatile;
  if (D.27732 != ptr) goto retry; else goto <D.27733>;
  <D.27733>:
  D.27725 = obj;
  return D.27725;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


mono_gc_ephemeron_array_add (struct MonoObject * obj)
{
  gboolean D.27737;
  struct EphemeronLinkNode * ephemeron_list.434;
  struct FILE * gc_debug_file.435;
  struct EphemeronLinkNode * node;

  pthread_mutex_lock (&gc_mutex);
  node = sgen_alloc_internal (18);
  if (node == 0B) goto <D.27735>; else goto <D.27736>;
  <D.27735>:
  sgen_gc_unlock ();
  D.27737 = 0;
  return D.27737;
  <D.27736>:
  node->array = obj;
  ephemeron_list.434 = ephemeron_list;
  node->next = ephemeron_list.434;
  ephemeron_list = node;
  if (0 != 0) goto <D.27739>; else goto <D.27740>;
  <D.27739>:
  gc_debug_file.435 = gc_debug_file;
  fprintf (gc_debug_file.435, "Registered ephemeron array %p\n", obj);
  gc_debug_file.435 = gc_debug_file;
  fflush (gc_debug_file.435);
  <D.27740>:
  sgen_gc_unlock ();
  D.27737 = 1;
  return D.27737;
}


mono_gc_set_allow_synchronous_major (gboolean flag)
{
  int D.27743;
  gboolean D.27746;

  D.27743 = major_collector.is_concurrent;
  if (D.27743 == 0) goto <D.27744>; else goto <D.27745>;
  <D.27744>:
  D.27746 = flag;
  return D.27746;
  <D.27745>:
  allow_synchronous_major = flag;
  D.27746 = 1;
  return D.27746;
}


mono_gc_invoke_with_gc_lock (void * (*MonoGCLockedCallbackFunc) (void *) func, void * data)
{
  void * D.27748;
  void * result;

  pthread_mutex_lock (&sgen_interruption_mutex);
  result = func (data);
  pthread_mutex_unlock (&sgen_interruption_mutex);
  D.27748 = result;
  return D.27748;
}


mono_gc_is_gc_thread ()
{
  struct SgenThreadInfo * D.27750;
  _Bool D.27751;
  gboolean D.27752;
  gboolean result;

  pthread_mutex_lock (&gc_mutex);
  D.27750 = mono_thread_info_current ();
  D.27751 = D.27750 != 0B;
  result = (gboolean) D.27751;
  sgen_gc_unlock ();
  D.27752 = result;
  return D.27752;
}


sgen_env_var_error (const char * env_var, const char * fallback, const char * description_format)
{
  struct _IO_FILE * stderr.436;
  struct va_list ap;

  try
    {
      __builtin_va_start (&ap, 0);
      stderr.436 = stderr;
      fprintf (stderr.436, "Warning: In environment variable `%s\': ", env_var);
      stderr.436 = stderr;
      vfprintf (stderr.436, description_format, ap);
      if (fallback != 0B) goto <D.27755>; else goto <D.27756>;
      <D.27755>:
      stderr.436 = stderr;
      fprintf (stderr.436, " - %s", fallback);
      <D.27756>:
      stderr.436 = stderr;
      fprintf (stderr.436, "\n");
      __builtin_va_end (&ap);
    }
  finally
    {
      ap = {CLOBBER};
    }
}


vfprintf (struct FILE * restrict __stream, const char * restrict __fmt, struct __gnuc_va_list __ap)
{
  int D.27757;

  D.27757 = __vfprintf_chk (__stream, 1, __fmt, __ap);
  return D.27757;
}


mono_gc_base_init ()
{
  int D.27759;
  unsigned int pagesize.437;
  struct _IO_FILE * stderr.438;
  int D.27764;
  char * D.27767;
  int D.27769;
  char * D.27772;
  char * D.27773;
  int D.23817;
  int iftmp.439;
  int D.23816;
  const char[7] * D.27781;
  unsigned char D.27782;
  int D.27783;
  unsigned char D.27784;
  int D.27785;
  _Bool D.27786;
  _Bool D.27787;
  _Bool D.27788;
  const unsigned char * D.27791;
  unsigned char D.27792;
  int D.27793;
  const unsigned char * D.27794;
  unsigned char D.27795;
  int D.27796;
  _Bool D.27797;
  _Bool D.27798;
  const unsigned char * D.27801;
  unsigned char D.27802;
  int D.27803;
  const unsigned char * D.27804;
  unsigned char D.27805;
  int D.27806;
  _Bool D.27807;
  _Bool D.27808;
  const unsigned char * D.27811;
  unsigned char D.27812;
  int D.27813;
  const unsigned char * D.27814;
  unsigned char D.27815;
  int D.27816;
  int D.23827;
  int iftmp.440;
  int D.23826;
  const char[6] * D.27824;
  unsigned char D.27825;
  int D.27826;
  unsigned char D.27827;
  int D.27828;
  _Bool D.27829;
  _Bool D.27830;
  _Bool D.27831;
  const unsigned char * D.27834;
  unsigned char D.27835;
  int D.27836;
  const unsigned char * D.27837;
  unsigned char D.27838;
  int D.27839;
  _Bool D.27840;
  _Bool D.27841;
  const unsigned char * D.27844;
  unsigned char D.27845;
  int D.27846;
  const unsigned char * D.27847;
  unsigned char D.27848;
  int D.27849;
  _Bool D.27850;
  _Bool D.27851;
  const unsigned char * D.27854;
  unsigned char D.27855;
  int D.27856;
  const unsigned char * D.27857;
  unsigned char D.27858;
  int D.27859;
  int D.23836;
  int iftmp.441;
  int D.23835;
  const char[10] * D.27871;
  unsigned char D.27872;
  int D.27873;
  unsigned char D.27874;
  int D.27875;
  _Bool D.27876;
  _Bool D.27877;
  _Bool D.27878;
  const unsigned char * D.27881;
  unsigned char D.27882;
  int D.27883;
  const unsigned char * D.27884;
  unsigned char D.27885;
  int D.27886;
  _Bool D.27887;
  _Bool D.27888;
  const unsigned char * D.27891;
  unsigned char D.27892;
  int D.27893;
  const unsigned char * D.27894;
  unsigned char D.27895;
  int D.27896;
  _Bool D.27897;
  _Bool D.27898;
  const unsigned char * D.27901;
  unsigned char D.27902;
  int D.27903;
  const unsigned char * D.27904;
  unsigned char D.27905;
  int D.27906;
  int D.23846;
  int iftmp.442;
  int D.23845;
  const char[16] * D.27915;
  unsigned char D.27916;
  int D.27917;
  unsigned char D.27918;
  int D.27919;
  _Bool D.27920;
  _Bool D.27921;
  _Bool D.27922;
  const unsigned char * D.27925;
  unsigned char D.27926;
  int D.27927;
  const unsigned char * D.27928;
  unsigned char D.27929;
  int D.27930;
  _Bool D.27931;
  _Bool D.27932;
  const unsigned char * D.27935;
  unsigned char D.27936;
  int D.27937;
  const unsigned char * D.27938;
  unsigned char D.27939;
  int D.27940;
  _Bool D.27941;
  _Bool D.27942;
  const unsigned char * D.27945;
  unsigned char D.27946;
  int D.27947;
  const unsigned char * D.27948;
  unsigned char D.27949;
  int D.27950;
  int D.23855;
  int iftmp.443;
  int D.23854;
  const char[14] * D.27959;
  unsigned char D.27960;
  int D.27961;
  unsigned char D.27962;
  int D.27963;
  _Bool D.27964;
  _Bool D.27965;
  _Bool D.27966;
  const unsigned char * D.27969;
  unsigned char D.27970;
  int D.27971;
  const unsigned char * D.27972;
  unsigned char D.27973;
  int D.27974;
  _Bool D.27975;
  _Bool D.27976;
  const unsigned char * D.27979;
  unsigned char D.27980;
  int D.27981;
  const unsigned char * D.27982;
  unsigned char D.27983;
  int D.27984;
  _Bool D.27985;
  _Bool D.27986;
  const unsigned char * D.27989;
  unsigned char D.27990;
  int D.27991;
  const unsigned char * D.27992;
  unsigned char D.27993;
  int D.27994;
  int D.23864;
  int iftmp.444;
  int D.23863;
  const char[20] * D.28003;
  unsigned char D.28004;
  int D.28005;
  unsigned char D.28006;
  int D.28007;
  _Bool D.28008;
  _Bool D.28009;
  _Bool D.28010;
  const unsigned char * D.28013;
  unsigned char D.28014;
  int D.28015;
  const unsigned char * D.28016;
  unsigned char D.28017;
  int D.28018;
  _Bool D.28019;
  _Bool D.28020;
  const unsigned char * D.28023;
  unsigned char D.28024;
  int D.28025;
  const unsigned char * D.28026;
  unsigned char D.28027;
  int D.28028;
  _Bool D.28029;
  _Bool D.28030;
  const unsigned char * D.28033;
  unsigned char D.28034;
  int D.28035;
  const unsigned char * D.28036;
  unsigned char D.28037;
  int D.28038;
  int D.23873;
  int iftmp.445;
  int D.23872;
  const char[15] * D.28047;
  unsigned char D.28048;
  int D.28049;
  unsigned char D.28050;
  int D.28051;
  _Bool D.28052;
  _Bool D.28053;
  _Bool D.28054;
  const unsigned char * D.28057;
  unsigned char D.28058;
  int D.28059;
  const unsigned char * D.28060;
  unsigned char D.28061;
  int D.28062;
  _Bool D.28063;
  _Bool D.28064;
  const unsigned char * D.28067;
  unsigned char D.28068;
  int D.28069;
  const unsigned char * D.28070;
  unsigned char D.28071;
  int D.28072;
  _Bool D.28073;
  _Bool D.28074;
  const unsigned char * D.28077;
  unsigned char D.28078;
  int D.28079;
  const unsigned char * D.28080;
  unsigned char D.28081;
  int D.28082;
  int D.28086;
  _Bool D.28089;
  long int D.28090;
  long int D.28091;
  int sgen_nursery_size.446;
  int D.23884;
  int iftmp.447;
  int D.23883;
  const char[1] * D.28102;
  unsigned char D.28103;
  int D.28104;
  unsigned char D.28105;
  int D.28106;
  _Bool D.28107;
  _Bool D.28108;
  _Bool D.28109;
  const unsigned char * D.28112;
  unsigned char D.28113;
  int D.28114;
  const unsigned char * D.28115;
  unsigned char D.28116;
  int D.28117;
  _Bool D.28118;
  _Bool D.28119;
  const unsigned char * D.28122;
  unsigned char D.28123;
  int D.28124;
  const unsigned char * D.28125;
  unsigned char D.28126;
  int D.28127;
  _Bool D.28128;
  _Bool D.28129;
  const unsigned char * D.28132;
  unsigned char D.28133;
  int D.28134;
  const unsigned char * D.28135;
  unsigned char D.28136;
  int D.28137;
  unsigned char D.28139;
  int D.28142;
  int D.28145;
  int D.28148;
  char * D.28151;
  char D.28154;
  int D.28156;
  int D.28158;
  long int max_heap_candidate.448;
  long int D.28160;
  long int D.28161;
  int D.28162;
  int D.28163;
  int D.28166;
  int D.28167;
  char * D.28170;
  int D.28174;
  long int soft_limit.449;
  int D.28179;
  char * D.28184;
  char * endptr.450;
  char D.28189;
  unsigned int val.451;
  unsigned int D.28191;
  int D.28194;
  char * D.28197;
  int D.23897;
  int iftmp.452;
  int D.23896;
  const char[8] * D.28201;
  unsigned char D.28202;
  int D.28203;
  unsigned char D.28204;
  int D.28205;
  _Bool D.28206;
  _Bool D.28207;
  _Bool D.28208;
  const unsigned char * D.28211;
  unsigned char D.28212;
  int D.28213;
  const unsigned char * D.28214;
  unsigned char D.28215;
  int D.28216;
  _Bool D.28217;
  _Bool D.28218;
  const unsigned char * D.28221;
  unsigned char D.28222;
  int D.28223;
  const unsigned char * D.28224;
  unsigned char D.28225;
  int D.28226;
  _Bool D.28227;
  _Bool D.28228;
  const unsigned char * D.28231;
  unsigned char D.28232;
  int D.28233;
  const unsigned char * D.28234;
  unsigned char D.28235;
  int D.28236;
  int D.23906;
  int iftmp.453;
  int D.23905;
  const char[13] * D.28244;
  unsigned char D.28245;
  int D.28246;
  unsigned char D.28247;
  int D.28248;
  _Bool D.28249;
  _Bool D.28250;
  _Bool D.28251;
  const unsigned char * D.28254;
  unsigned char D.28255;
  int D.28256;
  const unsigned char * D.28257;
  unsigned char D.28258;
  int D.28259;
  _Bool D.28260;
  _Bool D.28261;
  const unsigned char * D.28264;
  unsigned char D.28265;
  int D.28266;
  const unsigned char * D.28267;
  unsigned char D.28268;
  int D.28269;
  _Bool D.28270;
  _Bool D.28271;
  const unsigned char * D.28274;
  unsigned char D.28275;
  int D.28276;
  const unsigned char * D.28277;
  unsigned char D.28278;
  int D.28279;
  const char * iftmp.454;
  int conservative_stack_mark.455;
  int D.28289;
  char * D.28292;
  gchar * D.28293;
  int D.28294;
  char * D.28297;
  int D.28301;
  long int val.456;
  long int D.28304;
  long int D.28305;
  int sgen_nursery_bits.457;
  int sgen_nursery_bits.458;
  int D.28312;
  int D.28313;
  char * D.28316;
  int D.28317;
  int D.28320;
  char * D.28323;
  int D.28324;
  int D.28327;
  int D.28330;
  char * D.28333;
  int D.23921;
  int iftmp.459;
  int D.23920;
  const char[4] * D.28337;
  unsigned char D.28338;
  int D.28339;
  unsigned char D.28340;
  int D.28341;
  _Bool D.28342;
  _Bool D.28343;
  _Bool D.28344;
  const unsigned char * D.28347;
  unsigned char D.28348;
  int D.28349;
  const unsigned char * D.28350;
  unsigned char D.28351;
  int D.28352;
  _Bool D.28353;
  _Bool D.28354;
  const unsigned char * D.28357;
  unsigned char D.28358;
  int D.28359;
  const unsigned char * D.28360;
  unsigned char D.28361;
  int D.28362;
  _Bool D.28363;
  _Bool D.28364;
  const unsigned char * D.28367;
  unsigned char D.28368;
  int D.28369;
  const unsigned char * D.28370;
  unsigned char D.28371;
  int D.28372;
  int D.23930;
  int iftmp.460;
  int D.23929;
  const char[3] * D.28380;
  unsigned char D.28381;
  int D.28382;
  unsigned char D.28383;
  int D.28384;
  _Bool D.28385;
  _Bool D.28386;
  _Bool D.28387;
  const unsigned char * D.28390;
  unsigned char D.28391;
  int D.28392;
  const unsigned char * D.28393;
  unsigned char D.28394;
  int D.28395;
  _Bool D.28396;
  _Bool D.28397;
  const unsigned char * D.28400;
  unsigned char D.28401;
  int D.28402;
  const unsigned char * D.28403;
  unsigned char D.28404;
  int D.28405;
  _Bool D.28406;
  _Bool D.28407;
  const unsigned char * D.28410;
  unsigned char D.28411;
  int D.28412;
  const unsigned char * D.28413;
  unsigned char D.28414;
  int D.28415;
  int D.23939;
  int iftmp.461;
  int D.23938;
  const char[10] * D.28423;
  unsigned char D.28424;
  int D.28425;
  unsigned char D.28426;
  int D.28427;
  _Bool D.28428;
  _Bool D.28429;
  _Bool D.28430;
  const unsigned char * D.28433;
  unsigned char D.28434;
  int D.28435;
  const unsigned char * D.28436;
  unsigned char D.28437;
  int D.28438;
  _Bool D.28439;
  _Bool D.28440;
  const unsigned char * D.28443;
  unsigned char D.28444;
  int D.28445;
  const unsigned char * D.28446;
  unsigned char D.28447;
  int D.28448;
  _Bool D.28449;
  _Bool D.28450;
  const unsigned char * D.28453;
  unsigned char D.28454;
  int D.28455;
  const unsigned char * D.28456;
  unsigned char D.28457;
  int D.28458;
  int D.23948;
  int iftmp.462;
  int D.23947;
  const char[13] * D.28467;
  unsigned char D.28468;
  int D.28469;
  unsigned char D.28470;
  int D.28471;
  _Bool D.28472;
  _Bool D.28473;
  _Bool D.28474;
  const unsigned char * D.28477;
  unsigned char D.28478;
  int D.28479;
  const unsigned char * D.28480;
  unsigned char D.28481;
  int D.28482;
  _Bool D.28483;
  _Bool D.28484;
  const unsigned char * D.28487;
  unsigned char D.28488;
  int D.28489;
  const unsigned char * D.28490;
  unsigned char D.28491;
  int D.28492;
  _Bool D.28493;
  _Bool D.28494;
  const unsigned char * D.28497;
  unsigned char D.28498;
  int D.28499;
  const unsigned char * D.28500;
  unsigned char D.28501;
  int D.28502;
  gboolean (*<T3682>) (const char *) D.28506;
  int D.28509;
  gboolean (*<T3682>) (const char *) D.28512;
  int D.28515;
  void (*<T11c0>) (void) D.28522;
  void (*<T11c0>) (void) D.28525;
  int D.23962;
  int iftmp.463;
  int D.23961;
  unsigned char D.28542;
  int D.28543;
  _Bool D.28544;
  _Bool D.28545;
  _Bool D.28546;
  const unsigned char * D.28549;
  unsigned char D.28550;
  int D.28551;
  _Bool D.28552;
  _Bool D.28553;
  const unsigned char * D.28556;
  unsigned char D.28557;
  int D.28558;
  _Bool D.28559;
  _Bool D.28560;
  const unsigned char * D.28563;
  unsigned char D.28564;
  int D.28565;
  unsigned char D.28567;
  char D.28570;
  char D.28571;
  int gc_debug_level.464;
  int D.28579;
  struct FILE * gc_debug_file.465;
  struct FILE * gc_debug_file.466;
  int D.23973;
  int iftmp.467;
  int D.23972;
  const char[16] * D.28588;
  unsigned char D.28589;
  int D.28590;
  unsigned char D.28591;
  int D.28592;
  _Bool D.28593;
  _Bool D.28594;
  _Bool D.28595;
  const unsigned char * D.28598;
  unsigned char D.28599;
  int D.28600;
  const unsigned char * D.28601;
  unsigned char D.28602;
  int D.28603;
  _Bool D.28604;
  _Bool D.28605;
  const unsigned char * D.28608;
  unsigned char D.28609;
  int D.28610;
  const unsigned char * D.28611;
  unsigned char D.28612;
  int D.28613;
  _Bool D.28614;
  _Bool D.28615;
  const unsigned char * D.28618;
  unsigned char D.28619;
  int D.28620;
  const unsigned char * D.28621;
  unsigned char D.28622;
  int D.28623;
  int D.23982;
  int iftmp.468;
  int D.23981;
  const char[14] * D.28631;
  unsigned char D.28632;
  int D.28633;
  unsigned char D.28634;
  int D.28635;
  _Bool D.28636;
  _Bool D.28637;
  _Bool D.28638;
  const unsigned char * D.28641;
  unsigned char D.28642;
  int D.28643;
  const unsigned char * D.28644;
  unsigned char D.28645;
  int D.28646;
  _Bool D.28647;
  _Bool D.28648;
  const unsigned char * D.28651;
  unsigned char D.28652;
  int D.28653;
  const unsigned char * D.28654;
  unsigned char D.28655;
  int D.28656;
  _Bool D.28657;
  _Bool D.28658;
  const unsigned char * D.28661;
  unsigned char D.28662;
  int D.28663;
  const unsigned char * D.28664;
  unsigned char D.28665;
  int D.28666;
  int D.23991;
  int iftmp.469;
  int D.23990;
  const char[21] * D.28674;
  unsigned char D.28675;
  int D.28676;
  unsigned char D.28677;
  int D.28678;
  _Bool D.28679;
  _Bool D.28680;
  _Bool D.28681;
  const unsigned char * D.28684;
  unsigned char D.28685;
  int D.28686;
  const unsigned char * D.28687;
  unsigned char D.28688;
  int D.28689;
  _Bool D.28690;
  _Bool D.28691;
  const unsigned char * D.28694;
  unsigned char D.28695;
  int D.28696;
  const unsigned char * D.28697;
  unsigned char D.28698;
  int D.28699;
  _Bool D.28700;
  _Bool D.28701;
  const unsigned char * D.28704;
  unsigned char D.28705;
  int D.28706;
  const unsigned char * D.28707;
  unsigned char D.28708;
  int D.28709;
  int D.28714;
  char * D.28717;
  int D.28718;
  unsigned int verify_before_allocs.470;
  int D.24001;
  int iftmp.471;
  int D.24000;
  const char[22] * D.28724;
  unsigned char D.28725;
  int D.28726;
  unsigned char D.28727;
  int D.28728;
  _Bool D.28729;
  _Bool D.28730;
  _Bool D.28731;
  const unsigned char * D.28734;
  unsigned char D.28735;
  int D.28736;
  const unsigned char * D.28737;
  unsigned char D.28738;
  int D.28739;
  _Bool D.28740;
  _Bool D.28741;
  const unsigned char * D.28744;
  unsigned char D.28745;
  int D.28746;
  const unsigned char * D.28747;
  unsigned char D.28748;
  int D.28749;
  _Bool D.28750;
  _Bool D.28751;
  const unsigned char * D.28754;
  unsigned char D.28755;
  int D.28756;
  const unsigned char * D.28757;
  unsigned char D.28758;
  int D.28759;
  int D.28764;
  char * D.28767;
  int D.28768;
  unsigned int collect_before_allocs.472;
  int D.24011;
  int iftmp.473;
  int D.24010;
  const char[26] * D.28774;
  unsigned char D.28775;
  int D.28776;
  unsigned char D.28777;
  int D.28778;
  _Bool D.28779;
  _Bool D.28780;
  _Bool D.28781;
  const unsigned char * D.28784;
  unsigned char D.28785;
  int D.28786;
  const unsigned char * D.28787;
  unsigned char D.28788;
  int D.28789;
  _Bool D.28790;
  _Bool D.28791;
  const unsigned char * D.28794;
  unsigned char D.28795;
  int D.28796;
  const unsigned char * D.28797;
  unsigned char D.28798;
  int D.28799;
  _Bool D.28800;
  _Bool D.28801;
  const unsigned char * D.28804;
  unsigned char D.28805;
  int D.28806;
  const unsigned char * D.28807;
  unsigned char D.28808;
  int D.28809;
  int D.24020;
  int iftmp.474;
  int D.24019;
  const char[27] * D.28817;
  unsigned char D.28818;
  int D.28819;
  unsigned char D.28820;
  int D.28821;
  _Bool D.28822;
  _Bool D.28823;
  _Bool D.28824;
  const unsigned char * D.28827;
  unsigned char D.28828;
  int D.28829;
  const unsigned char * D.28830;
  unsigned char D.28831;
  int D.28832;
  _Bool D.28833;
  _Bool D.28834;
  const unsigned char * D.28837;
  unsigned char D.28838;
  int D.28839;
  const unsigned char * D.28840;
  unsigned char D.28841;
  int D.28842;
  _Bool D.28843;
  _Bool D.28844;
  const unsigned char * D.28847;
  unsigned char D.28848;
  int D.28849;
  const unsigned char * D.28850;
  unsigned char D.28851;
  int D.28852;
  int D.24029;
  int iftmp.475;
  int D.24028;
  const char[28] * D.28860;
  unsigned char D.28861;
  int D.28862;
  unsigned char D.28863;
  int D.28864;
  _Bool D.28865;
  _Bool D.28866;
  _Bool D.28867;
  const unsigned char * D.28870;
  unsigned char D.28871;
  int D.28872;
  const unsigned char * D.28873;
  unsigned char D.28874;
  int D.28875;
  _Bool D.28876;
  _Bool D.28877;
  const unsigned char * D.28880;
  unsigned char D.28881;
  int D.28882;
  const unsigned char * D.28883;
  unsigned char D.28884;
  int D.28885;
  _Bool D.28886;
  _Bool D.28887;
  const unsigned char * D.28890;
  unsigned char D.28891;
  int D.28892;
  const unsigned char * D.28893;
  unsigned char D.28894;
  int D.28895;
  int D.24038;
  int iftmp.476;
  int D.24037;
  const char[16] * D.28905;
  unsigned char D.28906;
  int D.28907;
  unsigned char D.28908;
  int D.28909;
  _Bool D.28910;
  _Bool D.28911;
  _Bool D.28912;
  const unsigned char * D.28915;
  unsigned char D.28916;
  int D.28917;
  const unsigned char * D.28918;
  unsigned char D.28919;
  int D.28920;
  _Bool D.28921;
  _Bool D.28922;
  const unsigned char * D.28925;
  unsigned char D.28926;
  int D.28927;
  const unsigned char * D.28928;
  unsigned char D.28929;
  int D.28930;
  _Bool D.28931;
  _Bool D.28932;
  const unsigned char * D.28935;
  unsigned char D.28936;
  int D.28937;
  const unsigned char * D.28938;
  unsigned char D.28939;
  int D.28940;
  int D.24047;
  int iftmp.477;
  int D.24046;
  const char[21] * D.28948;
  unsigned char D.28949;
  int D.28950;
  unsigned char D.28951;
  int D.28952;
  _Bool D.28953;
  _Bool D.28954;
  _Bool D.28955;
  const unsigned char * D.28958;
  unsigned char D.28959;
  int D.28960;
  const unsigned char * D.28961;
  unsigned char D.28962;
  int D.28963;
  _Bool D.28964;
  _Bool D.28965;
  const unsigned char * D.28968;
  unsigned char D.28969;
  int D.28970;
  const unsigned char * D.28971;
  unsigned char D.28972;
  int D.28973;
  _Bool D.28974;
  _Bool D.28975;
  const unsigned char * D.28978;
  unsigned char D.28979;
  int D.28980;
  const unsigned char * D.28981;
  unsigned char D.28982;
  int D.28983;
  int D.24056;
  int iftmp.478;
  int D.24055;
  const char[15] * D.28991;
  unsigned char D.28992;
  int D.28993;
  unsigned char D.28994;
  int D.28995;
  _Bool D.28996;
  _Bool D.28997;
  _Bool D.28998;
  const unsigned char * D.29001;
  unsigned char D.29002;
  int D.29003;
  const unsigned char * D.29004;
  unsigned char D.29005;
  int D.29006;
  _Bool D.29007;
  _Bool D.29008;
  const unsigned char * D.29011;
  unsigned char D.29012;
  int D.29013;
  const unsigned char * D.29014;
  unsigned char D.29015;
  int D.29016;
  _Bool D.29017;
  _Bool D.29018;
  const unsigned char * D.29021;
  unsigned char D.29022;
  int D.29023;
  const unsigned char * D.29024;
  unsigned char D.29025;
  int D.29026;
  int D.24065;
  int iftmp.479;
  int D.24064;
  const char[12] * D.29034;
  unsigned char D.29035;
  int D.29036;
  unsigned char D.29037;
  int D.29038;
  _Bool D.29039;
  _Bool D.29040;
  _Bool D.29041;
  const unsigned char * D.29044;
  unsigned char D.29045;
  int D.29046;
  const unsigned char * D.29047;
  unsigned char D.29048;
  int D.29049;
  _Bool D.29050;
  _Bool D.29051;
  const unsigned char * D.29054;
  unsigned char D.29055;
  int D.29056;
  const unsigned char * D.29057;
  unsigned char D.29058;
  int D.29059;
  _Bool D.29060;
  _Bool D.29061;
  const unsigned char * D.29064;
  unsigned char D.29065;
  int D.29066;
  const unsigned char * D.29067;
  unsigned char D.29068;
  int D.29069;
  int D.24074;
  int iftmp.480;
  int D.24073;
  const char[20] * D.29077;
  unsigned char D.29078;
  int D.29079;
  unsigned char D.29080;
  int D.29081;
  _Bool D.29082;
  _Bool D.29083;
  _Bool D.29084;
  const unsigned char * D.29087;
  unsigned char D.29088;
  int D.29089;
  const unsigned char * D.29090;
  unsigned char D.29091;
  int D.29092;
  _Bool D.29093;
  _Bool D.29094;
  const unsigned char * D.29097;
  unsigned char D.29098;
  int D.29099;
  const unsigned char * D.29100;
  unsigned char D.29101;
  int D.29102;
  _Bool D.29103;
  _Bool D.29104;
  const unsigned char * D.29107;
  unsigned char D.29108;
  int D.29109;
  const unsigned char * D.29110;
  unsigned char D.29111;
  int D.29112;
  int D.24083;
  int iftmp.481;
  int D.24082;
  const char[18] * D.29120;
  unsigned char D.29121;
  int D.29122;
  unsigned char D.29123;
  int D.29124;
  _Bool D.29125;
  _Bool D.29126;
  _Bool D.29127;
  const unsigned char * D.29130;
  unsigned char D.29131;
  int D.29132;
  const unsigned char * D.29133;
  unsigned char D.29134;
  int D.29135;
  _Bool D.29136;
  _Bool D.29137;
  const unsigned char * D.29140;
  unsigned char D.29141;
  int D.29142;
  const unsigned char * D.29143;
  unsigned char D.29144;
  int D.29145;
  _Bool D.29146;
  _Bool D.29147;
  const unsigned char * D.29150;
  unsigned char D.29151;
  int D.29152;
  const unsigned char * D.29153;
  unsigned char D.29154;
  int D.29155;
  int D.24092;
  int iftmp.482;
  int D.24091;
  const char[27] * D.29163;
  unsigned char D.29164;
  int D.29165;
  unsigned char D.29166;
  int D.29167;
  _Bool D.29168;
  _Bool D.29169;
  _Bool D.29170;
  const unsigned char * D.29173;
  unsigned char D.29174;
  int D.29175;
  const unsigned char * D.29176;
  unsigned char D.29177;
  int D.29178;
  _Bool D.29179;
  _Bool D.29180;
  const unsigned char * D.29183;
  unsigned char D.29184;
  int D.29185;
  const unsigned char * D.29186;
  unsigned char D.29187;
  int D.29188;
  _Bool D.29189;
  _Bool D.29190;
  const unsigned char * D.29193;
  unsigned char D.29194;
  int D.29195;
  const unsigned char * D.29196;
  unsigned char D.29197;
  int D.29198;
  int D.24101;
  int iftmp.483;
  int D.24100;
  const char[17] * D.29206;
  unsigned char D.29207;
  int D.29208;
  unsigned char D.29209;
  int D.29210;
  _Bool D.29211;
  _Bool D.29212;
  _Bool D.29213;
  const unsigned char * D.29216;
  unsigned char D.29217;
  int D.29218;
  const unsigned char * D.29219;
  unsigned char D.29220;
  int D.29221;
  _Bool D.29222;
  _Bool D.29223;
  const unsigned char * D.29226;
  unsigned char D.29227;
  int D.29228;
  const unsigned char * D.29229;
  unsigned char D.29230;
  int D.29231;
  _Bool D.29232;
  _Bool D.29233;
  const unsigned char * D.29236;
  unsigned char D.29237;
  int D.29238;
  const unsigned char * D.29239;
  unsigned char D.29240;
  int D.29241;
  int D.24110;
  int iftmp.484;
  int D.24109;
  const char[25] * D.29251;
  unsigned char D.29252;
  int D.29253;
  unsigned char D.29254;
  int D.29255;
  _Bool D.29256;
  _Bool D.29257;
  _Bool D.29258;
  const unsigned char * D.29261;
  unsigned char D.29262;
  int D.29263;
  const unsigned char * D.29264;
  unsigned char D.29265;
  int D.29266;
  _Bool D.29267;
  _Bool D.29268;
  const unsigned char * D.29271;
  unsigned char D.29272;
  int D.29273;
  const unsigned char * D.29274;
  unsigned char D.29275;
  int D.29276;
  _Bool D.29277;
  _Bool D.29278;
  const unsigned char * D.29281;
  unsigned char D.29282;
  int D.29283;
  const unsigned char * D.29284;
  unsigned char D.29285;
  int D.29286;
  int D.24119;
  int iftmp.485;
  int D.24118;
  const char[21] * D.29294;
  unsigned char D.29295;
  int D.29296;
  unsigned char D.29297;
  int D.29298;
  _Bool D.29299;
  _Bool D.29300;
  _Bool D.29301;
  const unsigned char * D.29304;
  unsigned char D.29305;
  int D.29306;
  const unsigned char * D.29307;
  unsigned char D.29308;
  int D.29309;
  _Bool D.29310;
  _Bool D.29311;
  const unsigned char * D.29314;
  unsigned char D.29315;
  int D.29316;
  const unsigned char * D.29317;
  unsigned char D.29318;
  int D.29319;
  _Bool D.29320;
  _Bool D.29321;
  const unsigned char * D.29324;
  unsigned char D.29325;
  int D.29326;
  const unsigned char * D.29327;
  unsigned char D.29328;
  int D.29329;
  int D.24128;
  int iftmp.486;
  int D.24127;
  const char[14] * D.29337;
  unsigned char D.29338;
  int D.29339;
  unsigned char D.29340;
  int D.29341;
  _Bool D.29342;
  _Bool D.29343;
  _Bool D.29344;
  const unsigned char * D.29347;
  unsigned char D.29348;
  int D.29349;
  const unsigned char * D.29350;
  unsigned char D.29351;
  int D.29352;
  _Bool D.29353;
  _Bool D.29354;
  const unsigned char * D.29357;
  unsigned char D.29358;
  int D.29359;
  const unsigned char * D.29360;
  unsigned char D.29361;
  int D.29362;
  _Bool D.29363;
  _Bool D.29364;
  const unsigned char * D.29367;
  unsigned char D.29368;
  int D.29369;
  const unsigned char * D.29370;
  unsigned char D.29371;
  int D.29372;
  int D.24137;
  int iftmp.487;
  int D.24136;
  const char[14] * D.29380;
  unsigned char D.29381;
  int D.29382;
  unsigned char D.29383;
  int D.29384;
  _Bool D.29385;
  _Bool D.29386;
  _Bool D.29387;
  const unsigned char * D.29390;
  unsigned char D.29391;
  int D.29392;
  const unsigned char * D.29393;
  unsigned char D.29394;
  int D.29395;
  _Bool D.29396;
  _Bool D.29397;
  const unsigned char * D.29400;
  unsigned char D.29401;
  int D.29402;
  const unsigned char * D.29403;
  unsigned char D.29404;
  int D.29405;
  _Bool D.29406;
  _Bool D.29407;
  const unsigned char * D.29410;
  unsigned char D.29411;
  int D.29412;
  const unsigned char * D.29413;
  unsigned char D.29414;
  int D.29415;
  int D.29420;
  char * D.29423;
  struct FILE * heap_dump_file.488;
  struct FILE * heap_dump_file.489;
  int do_pin_stats.490;
  void (*<T36ea>) (struct SgenMajorCollector *) D.29439;
  struct MonoThreadInfoCallbacks cb;
  const char * env;
  char * * opts;
  char * * ptr;
  char * major_collector_opt;
  char * minor_collector_opt;
  glong max_heap;
  glong soft_limit;
  int num_workers;
  int result;
  int dummy;
  gboolean debug_print_allowance;
  double allowance_ratio;
  double save_target;
  gboolean have_split_nursery;
  gboolean cement_enabled;
  void use_simple_nursery = <<< error >>>;
  void use_marksweep_major = <<< error >>>;

  try
    {
      major_collector_opt = 0B;
      minor_collector_opt = 0B;
      max_heap = 0;
      soft_limit = 0;
      debug_print_allowance = 0;
      allowance_ratio = 0.0;
      save_target = 0.0;
      have_split_nursery = 0;
      cement_enabled = 1;
      <D.23802>:
      result = InterlockedCompareExchange (&gc_initialized, -1, 0);
      switch (result) <default: <D.23801>, case -1: <D.23798>, case 0: <D.23800>, case 1: <D.23797>>
      <D.23797>:
      return;
      <D.23798>:
      monoeg_g_usleep (1000);
      goto <D.23799>;
      <D.23800>:
      goto <D.23799>;
      <D.23801>:
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 4863);
      <D.23799>:
      if (result != 0) goto <D.23802>; else goto <D.23803>;
      <D.23803>:
      pthread_mutex_init (&gc_mutex, 0B);
      D.27759 = mono_pagesize ();
      pagesize.437 = (unsigned int) D.27759;
      pagesize = pagesize.437;
      stderr.438 = stderr;
      gc_debug_file = stderr.438;
      cb.thread_register = sgen_thread_register;
      cb.thread_detach = sgen_thread_detach;
      cb.thread_unregister = sgen_thread_unregister;
      cb.thread_attach = sgen_thread_attach;
      cb.mono_method_is_critical = is_critical_method;
      cb.mono_gc_pthread_create = mono_gc_pthread_create;
      mono_threads_init (&cb, 616);
      pthread_mutex_init (&sgen_interruption_mutex, 0B);
      pthread_mutex_init (&pin_queue_mutex, 0B);
      init_user_copy_or_mark_key ();
      env = monoeg_g_getenv ("MONO_GC_PARAMS");
      if (env != 0B) goto <D.27762>; else goto <D.27763>;
      <D.27762>:
      opts = monoeg_g_strsplit (env, ",", -1);
      ptr = opts;
      goto <D.23806>;
      <D.23805>:
      {
        char * opt;

        opt = *ptr;
        D.27764 = monoeg_g_str_has_prefix (opt, "major=");
        if (D.27764 != 0) goto <D.27765>; else goto <D.27766>;
        <D.27765>:
        D.27767 = __builtin_strchr (opt, 61);
        opt = D.27767 + 1;
        major_collector_opt = monoeg_strdup (opt);
        goto <D.27768>;
        <D.27766>:
        D.27769 = monoeg_g_str_has_prefix (opt, "minor=");
        if (D.27769 != 0) goto <D.27770>; else goto <D.27771>;
        <D.27770>:
        D.27772 = __builtin_strchr (opt, 61);
        opt = D.27772 + 1;
        minor_collector_opt = monoeg_strdup (opt);
        <D.27771>:
        <D.27768>:
      }
      ptr = ptr + 4;
      <D.23806>:
      D.27773 = *ptr;
      if (D.27773 != 0B) goto <D.23805>; else goto <D.23807>;
      <D.23807>:
      goto <D.27774>;
      <D.27763>:
      opts = 0B;
      <D.27774>:
      init_stats ();
      sgen_init_internal_allocator ();
      sgen_init_nursery_allocator ();
      sgen_init_fin_weak_hash ();
      sgen_register_fixed_internal_mem_type (2, 32);
      sgen_register_fixed_internal_mem_type (6, 8);
      sgen_register_fixed_internal_mem_type (14, 508);
      sgen_register_fixed_internal_mem_type (18, 8);
      {
        int tls_offset;

        tls_offset = -1;
        __asm__("	ldr	%0, 1f; b 2f; 1: .word sgen_thread_info(tpoff); 2:" : "=r" tls_offset);
        mono_tls_key_set_offset (4, tls_offset);
      }
      sgen_os_init ();
      mono_thread_info_attach (&dummy);
      if (minor_collector_opt == 0B) goto <D.27775>; else goto <D.27776>;
      <D.27775>:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.27777>;
      <D.27776>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 6;
        if (__s2_len <= 3) goto <D.27779>; else goto <D.27780>;
        <D.27779>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = minor_collector_opt;
          D.27781 = "simple";
          D.27782 = MEM[(const unsigned char *)D.27781];
          D.27783 = (int) D.27782;
          D.27784 = *__s2;
          D.27785 = (int) D.27784;
          __result = D.27783 - D.27785;
          {
            D.27786 = __s2_len != 0;
            D.27787 = __result == 0;
            D.27788 = D.27786 & D.27787;
            if (D.27788 != 0) goto <D.27789>; else goto <D.27790>;
            <D.27789>:
            D.27791 = &MEM[(void *)"simple" + 1B];
            D.27792 = *D.27791;
            D.27793 = (int) D.27792;
            D.27794 = __s2 + 1;
            D.27795 = *D.27794;
            D.27796 = (int) D.27795;
            __result = D.27793 - D.27796;
            D.27797 = __s2_len > 1;
            D.27787 = __result == 0;
            D.27798 = D.27797 & D.27787;
            if (D.27798 != 0) goto <D.27799>; else goto <D.27800>;
            <D.27799>:
            D.27801 = &MEM[(void *)"simple" + 2B];
            D.27802 = *D.27801;
            D.27803 = (int) D.27802;
            D.27804 = __s2 + 2;
            D.27805 = *D.27804;
            D.27806 = (int) D.27805;
            __result = D.27803 - D.27806;
            D.27807 = __s2_len > 2;
            D.27787 = __result == 0;
            D.27808 = D.27807 & D.27787;
            if (D.27808 != 0) goto <D.27809>; else goto <D.27810>;
            <D.27809>:
            D.27811 = &MEM[(void *)"simple" + 3B];
            D.27812 = *D.27811;
            D.27813 = (int) D.27812;
            D.27814 = __s2 + 3;
            D.27815 = *D.27814;
            D.27816 = (int) D.27815;
            __result = D.27813 - D.27816;
            <D.27810>:
            <D.27800>:
            <D.27790>:
          }
          D.23816 = __result;
        }
        iftmp.439 = -D.23816;
        goto <D.27817>;
        <D.27780>:
        iftmp.439 = __builtin_strcmp (minor_collector_opt, "simple");
        <D.27817>:
        D.23817 = iftmp.439;
      }
      if (D.23817 == 0) goto <D.27818>; else goto <D.27819>;
      <D.27818>:
      use_simple_nursery:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.27820>;
      <D.27819>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 5;
        if (__s2_len <= 3) goto <D.27822>; else goto <D.27823>;
        <D.27822>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = minor_collector_opt;
          D.27824 = "split";
          D.27825 = MEM[(const unsigned char *)D.27824];
          D.27826 = (int) D.27825;
          D.27827 = *__s2;
          D.27828 = (int) D.27827;
          __result = D.27826 - D.27828;
          {
            D.27829 = __s2_len != 0;
            D.27830 = __result == 0;
            D.27831 = D.27829 & D.27830;
            if (D.27831 != 0) goto <D.27832>; else goto <D.27833>;
            <D.27832>:
            D.27834 = &MEM[(void *)"split" + 1B];
            D.27835 = *D.27834;
            D.27836 = (int) D.27835;
            D.27837 = __s2 + 1;
            D.27838 = *D.27837;
            D.27839 = (int) D.27838;
            __result = D.27836 - D.27839;
            D.27840 = __s2_len > 1;
            D.27830 = __result == 0;
            D.27841 = D.27840 & D.27830;
            if (D.27841 != 0) goto <D.27842>; else goto <D.27843>;
            <D.27842>:
            D.27844 = &MEM[(void *)"split" + 2B];
            D.27845 = *D.27844;
            D.27846 = (int) D.27845;
            D.27847 = __s2 + 2;
            D.27848 = *D.27847;
            D.27849 = (int) D.27848;
            __result = D.27846 - D.27849;
            D.27850 = __s2_len > 2;
            D.27830 = __result == 0;
            D.27851 = D.27850 & D.27830;
            if (D.27851 != 0) goto <D.27852>; else goto <D.27853>;
            <D.27852>:
            D.27854 = &MEM[(void *)"split" + 3B];
            D.27855 = *D.27854;
            D.27856 = (int) D.27855;
            D.27857 = __s2 + 3;
            D.27858 = *D.27857;
            D.27859 = (int) D.27858;
            __result = D.27856 - D.27859;
            <D.27853>:
            <D.27843>:
            <D.27833>:
          }
          D.23826 = __result;
        }
        iftmp.440 = -D.23826;
        goto <D.27860>;
        <D.27823>:
        iftmp.440 = __builtin_strcmp (minor_collector_opt, "split");
        <D.27860>:
        D.23827 = iftmp.440;
      }
      if (D.23827 == 0) goto <D.27861>; else goto <D.27862>;
      <D.27861>:
      sgen_split_nursery_init (&sgen_minor_collector);
      have_split_nursery = 1;
      goto <D.27863>;
      <D.27862>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `simple` instead.", "Unknown minor collector `%s\'.", minor_collector_opt);
      goto use_simple_nursery;
      <D.27863>:
      <D.27820>:
      <D.27777>:
      if (major_collector_opt == 0B) goto <D.27864>; else goto <D.27867>;
      <D.27867>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 9;
        if (__s2_len <= 3) goto <D.27869>; else goto <D.27870>;
        <D.27869>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = major_collector_opt;
          D.27871 = "marksweep";
          D.27872 = MEM[(const unsigned char *)D.27871];
          D.27873 = (int) D.27872;
          D.27874 = *__s2;
          D.27875 = (int) D.27874;
          __result = D.27873 - D.27875;
          {
            D.27876 = __s2_len != 0;
            D.27877 = __result == 0;
            D.27878 = D.27876 & D.27877;
            if (D.27878 != 0) goto <D.27879>; else goto <D.27880>;
            <D.27879>:
            D.27881 = &MEM[(void *)"marksweep" + 1B];
            D.27882 = *D.27881;
            D.27883 = (int) D.27882;
            D.27884 = __s2 + 1;
            D.27885 = *D.27884;
            D.27886 = (int) D.27885;
            __result = D.27883 - D.27886;
            D.27887 = __s2_len > 1;
            D.27877 = __result == 0;
            D.27888 = D.27887 & D.27877;
            if (D.27888 != 0) goto <D.27889>; else goto <D.27890>;
            <D.27889>:
            D.27891 = &MEM[(void *)"marksweep" + 2B];
            D.27892 = *D.27891;
            D.27893 = (int) D.27892;
            D.27894 = __s2 + 2;
            D.27895 = *D.27894;
            D.27896 = (int) D.27895;
            __result = D.27893 - D.27896;
            D.27897 = __s2_len > 2;
            D.27877 = __result == 0;
            D.27898 = D.27897 & D.27877;
            if (D.27898 != 0) goto <D.27899>; else goto <D.27900>;
            <D.27899>:
            D.27901 = &MEM[(void *)"marksweep" + 3B];
            D.27902 = *D.27901;
            D.27903 = (int) D.27902;
            D.27904 = __s2 + 3;
            D.27905 = *D.27904;
            D.27906 = (int) D.27905;
            __result = D.27903 - D.27906;
            <D.27900>:
            <D.27890>:
            <D.27880>:
          }
          D.23835 = __result;
        }
        iftmp.441 = -D.23835;
        goto <D.27907>;
        <D.27870>:
        iftmp.441 = __builtin_strcmp (major_collector_opt, "marksweep");
        <D.27907>:
        D.23836 = iftmp.441;
      }
      if (D.23836 == 0) goto <D.27864>; else goto <D.27865>;
      <D.27864>:
      use_marksweep_major:
      sgen_marksweep_init (&major_collector);
      goto <D.27866>;
      <D.27865>:
      if (major_collector_opt == 0B) goto <D.27908>; else goto <D.27911>;
      <D.27911>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 15;
        if (__s2_len <= 3) goto <D.27913>; else goto <D.27914>;
        <D.27913>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = major_collector_opt;
          D.27915 = "marksweep-fixed";
          D.27916 = MEM[(const unsigned char *)D.27915];
          D.27917 = (int) D.27916;
          D.27918 = *__s2;
          D.27919 = (int) D.27918;
          __result = D.27917 - D.27919;
          {
            D.27920 = __s2_len != 0;
            D.27921 = __result == 0;
            D.27922 = D.27920 & D.27921;
            if (D.27922 != 0) goto <D.27923>; else goto <D.27924>;
            <D.27923>:
            D.27925 = &MEM[(void *)"marksweep-fixed" + 1B];
            D.27926 = *D.27925;
            D.27927 = (int) D.27926;
            D.27928 = __s2 + 1;
            D.27929 = *D.27928;
            D.27930 = (int) D.27929;
            __result = D.27927 - D.27930;
            D.27931 = __s2_len > 1;
            D.27921 = __result == 0;
            D.27932 = D.27931 & D.27921;
            if (D.27932 != 0) goto <D.27933>; else goto <D.27934>;
            <D.27933>:
            D.27935 = &MEM[(void *)"marksweep-fixed" + 2B];
            D.27936 = *D.27935;
            D.27937 = (int) D.27936;
            D.27938 = __s2 + 2;
            D.27939 = *D.27938;
            D.27940 = (int) D.27939;
            __result = D.27937 - D.27940;
            D.27941 = __s2_len > 2;
            D.27921 = __result == 0;
            D.27942 = D.27941 & D.27921;
            if (D.27942 != 0) goto <D.27943>; else goto <D.27944>;
            <D.27943>:
            D.27945 = &MEM[(void *)"marksweep-fixed" + 3B];
            D.27946 = *D.27945;
            D.27947 = (int) D.27946;
            D.27948 = __s2 + 3;
            D.27949 = *D.27948;
            D.27950 = (int) D.27949;
            __result = D.27947 - D.27950;
            <D.27944>:
            <D.27934>:
            <D.27924>:
          }
          D.23845 = __result;
        }
        iftmp.442 = -D.23845;
        goto <D.27951>;
        <D.27914>:
        iftmp.442 = __builtin_strcmp (major_collector_opt, "marksweep-fixed");
        <D.27951>:
        D.23846 = iftmp.442;
      }
      if (D.23846 == 0) goto <D.27908>; else goto <D.27909>;
      <D.27908>:
      sgen_marksweep_fixed_init (&major_collector);
      goto <D.27910>;
      <D.27909>:
      if (major_collector_opt == 0B) goto <D.27952>; else goto <D.27955>;
      <D.27955>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 13;
        if (__s2_len <= 3) goto <D.27957>; else goto <D.27958>;
        <D.27957>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = major_collector_opt;
          D.27959 = "marksweep-par";
          D.27960 = MEM[(const unsigned char *)D.27959];
          D.27961 = (int) D.27960;
          D.27962 = *__s2;
          D.27963 = (int) D.27962;
          __result = D.27961 - D.27963;
          {
            D.27964 = __s2_len != 0;
            D.27965 = __result == 0;
            D.27966 = D.27964 & D.27965;
            if (D.27966 != 0) goto <D.27967>; else goto <D.27968>;
            <D.27967>:
            D.27969 = &MEM[(void *)"marksweep-par" + 1B];
            D.27970 = *D.27969;
            D.27971 = (int) D.27970;
            D.27972 = __s2 + 1;
            D.27973 = *D.27972;
            D.27974 = (int) D.27973;
            __result = D.27971 - D.27974;
            D.27975 = __s2_len > 1;
            D.27965 = __result == 0;
            D.27976 = D.27975 & D.27965;
            if (D.27976 != 0) goto <D.27977>; else goto <D.27978>;
            <D.27977>:
            D.27979 = &MEM[(void *)"marksweep-par" + 2B];
            D.27980 = *D.27979;
            D.27981 = (int) D.27980;
            D.27982 = __s2 + 2;
            D.27983 = *D.27982;
            D.27984 = (int) D.27983;
            __result = D.27981 - D.27984;
            D.27985 = __s2_len > 2;
            D.27965 = __result == 0;
            D.27986 = D.27985 & D.27965;
            if (D.27986 != 0) goto <D.27987>; else goto <D.27988>;
            <D.27987>:
            D.27989 = &MEM[(void *)"marksweep-par" + 3B];
            D.27990 = *D.27989;
            D.27991 = (int) D.27990;
            D.27992 = __s2 + 3;
            D.27993 = *D.27992;
            D.27994 = (int) D.27993;
            __result = D.27991 - D.27994;
            <D.27988>:
            <D.27978>:
            <D.27968>:
          }
          D.23854 = __result;
        }
        iftmp.443 = -D.23854;
        goto <D.27995>;
        <D.27958>:
        iftmp.443 = __builtin_strcmp (major_collector_opt, "marksweep-par");
        <D.27995>:
        D.23855 = iftmp.443;
      }
      if (D.23855 == 0) goto <D.27952>; else goto <D.27953>;
      <D.27952>:
      sgen_marksweep_par_init (&major_collector);
      goto <D.27954>;
      <D.27953>:
      if (major_collector_opt == 0B) goto <D.27996>; else goto <D.27999>;
      <D.27999>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 19;
        if (__s2_len <= 3) goto <D.28001>; else goto <D.28002>;
        <D.28001>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = major_collector_opt;
          D.28003 = "marksweep-fixed-par";
          D.28004 = MEM[(const unsigned char *)D.28003];
          D.28005 = (int) D.28004;
          D.28006 = *__s2;
          D.28007 = (int) D.28006;
          __result = D.28005 - D.28007;
          {
            D.28008 = __s2_len != 0;
            D.28009 = __result == 0;
            D.28010 = D.28008 & D.28009;
            if (D.28010 != 0) goto <D.28011>; else goto <D.28012>;
            <D.28011>:
            D.28013 = &MEM[(void *)"marksweep-fixed-par" + 1B];
            D.28014 = *D.28013;
            D.28015 = (int) D.28014;
            D.28016 = __s2 + 1;
            D.28017 = *D.28016;
            D.28018 = (int) D.28017;
            __result = D.28015 - D.28018;
            D.28019 = __s2_len > 1;
            D.28009 = __result == 0;
            D.28020 = D.28019 & D.28009;
            if (D.28020 != 0) goto <D.28021>; else goto <D.28022>;
            <D.28021>:
            D.28023 = &MEM[(void *)"marksweep-fixed-par" + 2B];
            D.28024 = *D.28023;
            D.28025 = (int) D.28024;
            D.28026 = __s2 + 2;
            D.28027 = *D.28026;
            D.28028 = (int) D.28027;
            __result = D.28025 - D.28028;
            D.28029 = __s2_len > 2;
            D.28009 = __result == 0;
            D.28030 = D.28029 & D.28009;
            if (D.28030 != 0) goto <D.28031>; else goto <D.28032>;
            <D.28031>:
            D.28033 = &MEM[(void *)"marksweep-fixed-par" + 3B];
            D.28034 = *D.28033;
            D.28035 = (int) D.28034;
            D.28036 = __s2 + 3;
            D.28037 = *D.28036;
            D.28038 = (int) D.28037;
            __result = D.28035 - D.28038;
            <D.28032>:
            <D.28022>:
            <D.28012>:
          }
          D.23863 = __result;
        }
        iftmp.444 = -D.23863;
        goto <D.28039>;
        <D.28002>:
        iftmp.444 = __builtin_strcmp (major_collector_opt, "marksweep-fixed-par");
        <D.28039>:
        D.23864 = iftmp.444;
      }
      if (D.23864 == 0) goto <D.27996>; else goto <D.27997>;
      <D.27996>:
      sgen_marksweep_fixed_par_init (&major_collector);
      goto <D.27998>;
      <D.27997>:
      if (major_collector_opt == 0B) goto <D.28040>; else goto <D.28043>;
      <D.28043>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 14;
        if (__s2_len <= 3) goto <D.28045>; else goto <D.28046>;
        <D.28045>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = major_collector_opt;
          D.28047 = "marksweep-conc";
          D.28048 = MEM[(const unsigned char *)D.28047];
          D.28049 = (int) D.28048;
          D.28050 = *__s2;
          D.28051 = (int) D.28050;
          __result = D.28049 - D.28051;
          {
            D.28052 = __s2_len != 0;
            D.28053 = __result == 0;
            D.28054 = D.28052 & D.28053;
            if (D.28054 != 0) goto <D.28055>; else goto <D.28056>;
            <D.28055>:
            D.28057 = &MEM[(void *)"marksweep-conc" + 1B];
            D.28058 = *D.28057;
            D.28059 = (int) D.28058;
            D.28060 = __s2 + 1;
            D.28061 = *D.28060;
            D.28062 = (int) D.28061;
            __result = D.28059 - D.28062;
            D.28063 = __s2_len > 1;
            D.28053 = __result == 0;
            D.28064 = D.28063 & D.28053;
            if (D.28064 != 0) goto <D.28065>; else goto <D.28066>;
            <D.28065>:
            D.28067 = &MEM[(void *)"marksweep-conc" + 2B];
            D.28068 = *D.28067;
            D.28069 = (int) D.28068;
            D.28070 = __s2 + 2;
            D.28071 = *D.28070;
            D.28072 = (int) D.28071;
            __result = D.28069 - D.28072;
            D.28073 = __s2_len > 2;
            D.28053 = __result == 0;
            D.28074 = D.28073 & D.28053;
            if (D.28074 != 0) goto <D.28075>; else goto <D.28076>;
            <D.28075>:
            D.28077 = &MEM[(void *)"marksweep-conc" + 3B];
            D.28078 = *D.28077;
            D.28079 = (int) D.28078;
            D.28080 = __s2 + 3;
            D.28081 = *D.28080;
            D.28082 = (int) D.28081;
            __result = D.28079 - D.28082;
            <D.28076>:
            <D.28066>:
            <D.28056>:
          }
          D.23872 = __result;
        }
        iftmp.445 = -D.23872;
        goto <D.28083>;
        <D.28046>:
        iftmp.445 = __builtin_strcmp (major_collector_opt, "marksweep-conc");
        <D.28083>:
        D.23873 = iftmp.445;
      }
      if (D.23873 == 0) goto <D.28040>; else goto <D.28041>;
      <D.28040>:
      sgen_marksweep_conc_init (&major_collector);
      goto <D.28042>;
      <D.28041>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `marksweep` instead.", "Unknown major collector `%s\'.", major_collector_opt);
      goto use_marksweep_major;
      <D.28042>:
      <D.27998>:
      <D.27954>:
      <D.27910>:
      <D.27866>:
      if (have_split_nursery != 0) goto <D.28084>; else goto <D.28085>;
      <D.28084>:
      D.28086 = major_collector.is_parallel;
      if (D.28086 != 0) goto <D.28087>; else goto <D.28088>;
      <D.28087>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Disabling split minor collector.", "`minor=split` is not supported with the parallel collector yet.");
      have_split_nursery = 0;
      <D.28088>:
      <D.28085>:
      num_workers = mono_cpu_count ();
      D.28089 = num_workers <= 0;
      D.28090 = (long int) D.28089;
      D.28091 = __builtin_expect (D.28090, 0);
      if (D.28091 != 0) goto <D.28092>; else goto <D.28093>;
      <D.28092>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4977, "num_workers > 0");
      <D.28093>:
      if (num_workers > 16) goto <D.28094>; else goto <D.28095>;
      <D.28094>:
      num_workers = 16;
      <D.28095>:
      conservative_stack_mark = 1;
      sgen_nursery_size.446 = sgen_nursery_size;
      sgen_nursery_size = sgen_nursery_size.446;
      if (opts != 0B) goto <D.28097>; else goto <D.28098>;
      <D.28097>:
      {
        gboolean usage_printed;

        usage_printed = 0;
        ptr = opts;
        goto <D.23950>;
        <D.23949>:
        {
          char * opt;

          opt = *ptr;
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 0;
            if (__s2_len <= 3) goto <D.28100>; else goto <D.28101>;
            <D.28100>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28102 = "";
              D.28103 = MEM[(const unsigned char *)D.28102];
              D.28104 = (int) D.28103;
              D.28105 = *__s2;
              D.28106 = (int) D.28105;
              __result = D.28104 - D.28106;
              {
                D.28107 = __s2_len != 0;
                D.28108 = __result == 0;
                D.28109 = D.28107 & D.28108;
                if (D.28109 != 0) goto <D.28110>; else goto <D.28111>;
                <D.28110>:
                D.28112 = &MEM[(void *)"" + 1B];
                D.28113 = *D.28112;
                D.28114 = (int) D.28113;
                D.28115 = __s2 + 1;
                D.28116 = *D.28115;
                D.28117 = (int) D.28116;
                __result = D.28114 - D.28117;
                D.28118 = __s2_len > 1;
                D.28108 = __result == 0;
                D.28119 = D.28118 & D.28108;
                if (D.28119 != 0) goto <D.28120>; else goto <D.28121>;
                <D.28120>:
                D.28122 = &MEM[(void *)"" + 2B];
                D.28123 = *D.28122;
                D.28124 = (int) D.28123;
                D.28125 = __s2 + 2;
                D.28126 = *D.28125;
                D.28127 = (int) D.28126;
                __result = D.28124 - D.28127;
                D.28128 = __s2_len > 2;
                D.28108 = __result == 0;
                D.28129 = D.28128 & D.28108;
                if (D.28129 != 0) goto <D.28130>; else goto <D.28131>;
                <D.28130>:
                D.28132 = &MEM[(void *)"" + 3B];
                D.28133 = *D.28132;
                D.28134 = (int) D.28133;
                D.28135 = __s2 + 3;
                D.28136 = *D.28135;
                D.28137 = (int) D.28136;
                __result = D.28134 - D.28137;
                <D.28131>:
                <D.28121>:
                <D.28111>:
              }
              D.23883 = __result;
            }
            iftmp.447 = -D.23883;
            goto <D.28138>;
            <D.28101>:
            D.28139 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.447 = (int) D.28139;
            <D.28138>:
            D.23884 = iftmp.447;
          }
          if (D.23884 == 0) goto <D.28140>; else goto <D.28141>;
          <D.28140>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28141>:
          D.28142 = monoeg_g_str_has_prefix (opt, "major=");
          if (D.28142 != 0) goto <D.28143>; else goto <D.28144>;
          <D.28143>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28144>:
          D.28145 = monoeg_g_str_has_prefix (opt, "minor=");
          if (D.28145 != 0) goto <D.28146>; else goto <D.28147>;
          <D.28146>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28147>:
          D.28148 = monoeg_g_str_has_prefix (opt, "max-heap-size=");
          if (D.28148 != 0) goto <D.28149>; else goto <D.28150>;
          <D.28149>:
          {
            glong max_heap_candidate;

            try
              {
                max_heap_candidate = 0;
                D.28151 = __builtin_strchr (opt, 61);
                opt = D.28151 + 1;
                D.28154 = *opt;
                if (D.28154 != 0) goto <D.28155>; else goto <D.28152>;
                <D.28155>:
                D.28156 = mono_gc_parse_environment_string_extract_number (opt, &max_heap_candidate);
                if (D.28156 != 0) goto <D.28157>; else goto <D.28152>;
                <D.28157>:
                D.28158 = mono_pagesize ();
                max_heap_candidate.448 = max_heap_candidate;
                D.28160 = D.28158 + max_heap_candidate.448;
                D.28161 = D.28160 + -1;
                D.28162 = mono_pagesize ();
                D.28163 = -D.28162;
                max_heap = D.28161 & D.28163;
                max_heap_candidate.448 = max_heap_candidate;
                if (max_heap != max_heap_candidate.448) goto <D.28164>; else goto <D.28165>;
                <D.28164>:
                D.28166 = mono_pagesize ();
                sgen_env_var_error ("MONO_GC_PARAMS", "Rounding up.", "`max-heap-size` size must be a multiple of %d.", D.28166);
                <D.28165>:
                goto <D.28153>;
                <D.28152>:
                sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`max-heap-size` must be an integer.");
                <D.28153>:
                // predicted unlikely by continue predictor.
                goto <D.23885>;
              }
            finally
              {
                max_heap_candidate = {CLOBBER};
              }
          }
          <D.28150>:
          D.28167 = monoeg_g_str_has_prefix (opt, "soft-heap-limit=");
          if (D.28167 != 0) goto <D.28168>; else goto <D.28169>;
          <D.28168>:
          D.28170 = __builtin_strchr (opt, 61);
          opt = D.28170 + 1;
          D.28154 = *opt;
          if (D.28154 != 0) goto <D.28173>; else goto <D.28171>;
          <D.28173>:
          D.28174 = mono_gc_parse_environment_string_extract_number (opt, &soft_limit);
          if (D.28174 != 0) goto <D.28175>; else goto <D.28171>;
          <D.28175>:
          soft_limit.449 = soft_limit;
          if (soft_limit.449 <= 0) goto <D.28177>; else goto <D.28178>;
          <D.28177>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be positive.");
          soft_limit = 0;
          <D.28178>:
          goto <D.28172>;
          <D.28171>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be an integer.");
          <D.28172>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28169>:
          D.28179 = monoeg_g_str_has_prefix (opt, "workers=");
          if (D.28179 != 0) goto <D.28180>; else goto <D.28181>;
          <D.28180>:
          {
            long int val;
            char * endptr;

            try
              {
                D.28086 = major_collector.is_parallel;
                if (D.28086 == 0) goto <D.28182>; else goto <D.28183>;
                <D.28182>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "The `workers` option can only be used for parallel collectors.");
                // predicted unlikely by continue predictor.
                goto <D.23885>;
                <D.28183>:
                D.28184 = __builtin_strchr (opt, 61);
                opt = D.28184 + 1;
                val = strtol (opt, &endptr, 10);
                D.28154 = *opt;
                if (D.28154 == 0) goto <D.28185>; else goto <D.28187>;
                <D.28187>:
                endptr.450 = endptr;
                D.28189 = *endptr.450;
                if (D.28189 != 0) goto <D.28185>; else goto <D.28186>;
                <D.28185>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Cannot parse the `workers` option value.");
                // predicted unlikely by continue predictor.
                goto <D.23885>;
                <D.28186>:
                val.451 = (unsigned int) val;
                D.28191 = val.451 + 4294967295;
                if (D.28191 > 15) goto <D.28192>; else goto <D.28193>;
                <D.28192>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "The number of `workers` must be in the range 1 to 16.");
                // predicted unlikely by continue predictor.
                goto <D.23885>;
                <D.28193>:
                num_workers = val;
                // predicted unlikely by continue predictor.
                goto <D.23885>;
              }
            finally
              {
                endptr = {CLOBBER};
              }
          }
          <D.28181>:
          D.28194 = monoeg_g_str_has_prefix (opt, "stack-mark=");
          if (D.28194 != 0) goto <D.28195>; else goto <D.28196>;
          <D.28195>:
          D.28197 = __builtin_strchr (opt, 61);
          opt = D.28197 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 7;
            if (__s2_len <= 3) goto <D.28199>; else goto <D.28200>;
            <D.28199>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28201 = "precise";
              D.28202 = MEM[(const unsigned char *)D.28201];
              D.28203 = (int) D.28202;
              D.28204 = *__s2;
              D.28205 = (int) D.28204;
              __result = D.28203 - D.28205;
              {
                D.28206 = __s2_len != 0;
                D.28207 = __result == 0;
                D.28208 = D.28206 & D.28207;
                if (D.28208 != 0) goto <D.28209>; else goto <D.28210>;
                <D.28209>:
                D.28211 = &MEM[(void *)"precise" + 1B];
                D.28212 = *D.28211;
                D.28213 = (int) D.28212;
                D.28214 = __s2 + 1;
                D.28215 = *D.28214;
                D.28216 = (int) D.28215;
                __result = D.28213 - D.28216;
                D.28217 = __s2_len > 1;
                D.28207 = __result == 0;
                D.28218 = D.28217 & D.28207;
                if (D.28218 != 0) goto <D.28219>; else goto <D.28220>;
                <D.28219>:
                D.28221 = &MEM[(void *)"precise" + 2B];
                D.28222 = *D.28221;
                D.28223 = (int) D.28222;
                D.28224 = __s2 + 2;
                D.28225 = *D.28224;
                D.28226 = (int) D.28225;
                __result = D.28223 - D.28226;
                D.28227 = __s2_len > 2;
                D.28207 = __result == 0;
                D.28228 = D.28227 & D.28207;
                if (D.28228 != 0) goto <D.28229>; else goto <D.28230>;
                <D.28229>:
                D.28231 = &MEM[(void *)"precise" + 3B];
                D.28232 = *D.28231;
                D.28233 = (int) D.28232;
                D.28234 = __s2 + 3;
                D.28235 = *D.28234;
                D.28236 = (int) D.28235;
                __result = D.28233 - D.28236;
                <D.28230>:
                <D.28220>:
                <D.28210>:
              }
              D.23896 = __result;
            }
            iftmp.452 = -D.23896;
            goto <D.28237>;
            <D.28200>:
            iftmp.452 = __builtin_strcmp (opt, "precise");
            <D.28237>:
            D.23897 = iftmp.452;
          }
          if (D.23897 == 0) goto <D.28238>; else goto <D.28239>;
          <D.28238>:
          conservative_stack_mark = 0;
          goto <D.28240>;
          <D.28239>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 12;
            if (__s2_len <= 3) goto <D.28242>; else goto <D.28243>;
            <D.28242>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28244 = "conservative";
              D.28245 = MEM[(const unsigned char *)D.28244];
              D.28246 = (int) D.28245;
              D.28247 = *__s2;
              D.28248 = (int) D.28247;
              __result = D.28246 - D.28248;
              {
                D.28249 = __s2_len != 0;
                D.28250 = __result == 0;
                D.28251 = D.28249 & D.28250;
                if (D.28251 != 0) goto <D.28252>; else goto <D.28253>;
                <D.28252>:
                D.28254 = &MEM[(void *)"conservative" + 1B];
                D.28255 = *D.28254;
                D.28256 = (int) D.28255;
                D.28257 = __s2 + 1;
                D.28258 = *D.28257;
                D.28259 = (int) D.28258;
                __result = D.28256 - D.28259;
                D.28260 = __s2_len > 1;
                D.28250 = __result == 0;
                D.28261 = D.28260 & D.28250;
                if (D.28261 != 0) goto <D.28262>; else goto <D.28263>;
                <D.28262>:
                D.28264 = &MEM[(void *)"conservative" + 2B];
                D.28265 = *D.28264;
                D.28266 = (int) D.28265;
                D.28267 = __s2 + 2;
                D.28268 = *D.28267;
                D.28269 = (int) D.28268;
                __result = D.28266 - D.28269;
                D.28270 = __s2_len > 2;
                D.28250 = __result == 0;
                D.28271 = D.28270 & D.28250;
                if (D.28271 != 0) goto <D.28272>; else goto <D.28273>;
                <D.28272>:
                D.28274 = &MEM[(void *)"conservative" + 3B];
                D.28275 = *D.28274;
                D.28276 = (int) D.28275;
                D.28277 = __s2 + 3;
                D.28278 = *D.28277;
                D.28279 = (int) D.28278;
                __result = D.28276 - D.28279;
                <D.28273>:
                <D.28263>:
                <D.28253>:
              }
              D.23905 = __result;
            }
            iftmp.453 = -D.23905;
            goto <D.28280>;
            <D.28243>:
            iftmp.453 = __builtin_strcmp (opt, "conservative");
            <D.28280>:
            D.23906 = iftmp.453;
          }
          if (D.23906 == 0) goto <D.28281>; else goto <D.28282>;
          <D.28281>:
          conservative_stack_mark = 1;
          goto <D.28283>;
          <D.28282>:
          conservative_stack_mark.455 = conservative_stack_mark;
          if (conservative_stack_mark.455 != 0) goto <D.28286>; else goto <D.28287>;
          <D.28286>:
          iftmp.454 = "Using `conservative`.";
          goto <D.28288>;
          <D.28287>:
          iftmp.454 = "Using `precise`.";
          <D.28288>:
          sgen_env_var_error ("MONO_GC_PARAMS", iftmp.454, "Invalid value `%s` for `stack-mark` option, possible values are: `precise`, `conservative`.", opt);
          <D.28283>:
          <D.28240>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28196>:
          D.28289 = monoeg_g_str_has_prefix (opt, "bridge=");
          if (D.28289 != 0) goto <D.28290>; else goto <D.28291>;
          <D.28290>:
          D.28292 = __builtin_strchr (opt, 61);
          opt = D.28292 + 1;
          D.28293 = monoeg_strdup (opt);
          sgen_register_test_bridge_callbacks (D.28293);
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28291>:
          D.28294 = monoeg_g_str_has_prefix (opt, "nursery-size=");
          if (D.28294 != 0) goto <D.28295>; else goto <D.28296>;
          <D.28295>:
          {
            long int val;

            try
              {
                D.28297 = __builtin_strchr (opt, 61);
                opt = D.28297 + 1;
                D.28154 = *opt;
                if (D.28154 != 0) goto <D.28300>; else goto <D.28298>;
                <D.28300>:
                D.28301 = mono_gc_parse_environment_string_extract_number (opt, &val);
                if (D.28301 != 0) goto <D.28302>; else goto <D.28298>;
                <D.28302>:
                val.456 = val;
                D.28304 = val.456 + -1;
                val.456 = val;
                D.28305 = D.28304 & val.456;
                if (D.28305 != 0) goto <D.28306>; else goto <D.28307>;
                <D.28306>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be a power of two.");
                // predicted unlikely by continue predictor.
                goto <D.23885>;
                <D.28307>:
                val.456 = val;
                if (val.456 <= 511) goto <D.28308>; else goto <D.28309>;
                <D.28308>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be at least %d bytes.\n", 512);
                // predicted unlikely by continue predictor.
                goto <D.23885>;
                <D.28309>:
                val.456 = val;
                sgen_nursery_size = val.456;
                sgen_nursery_bits = 0;
                goto <D.23909>;
                <D.23908>:
                <D.23909>:
                sgen_nursery_bits.457 = sgen_nursery_bits;
                sgen_nursery_bits.458 = sgen_nursery_bits.457 + 1;
                sgen_nursery_bits = sgen_nursery_bits.458;
                sgen_nursery_bits.457 = sgen_nursery_bits;
                D.28312 = 1 << sgen_nursery_bits.457;
                sgen_nursery_size.446 = sgen_nursery_size;
                if (D.28312 != sgen_nursery_size.446) goto <D.23908>; else goto <D.23910>;
                <D.23910>:
                goto <D.28299>;
                <D.28298>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be an integer.");
                // predicted unlikely by continue predictor.
                goto <D.23885>;
                <D.28299>:
                // predicted unlikely by continue predictor.
                goto <D.23885>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.28296>:
          D.28313 = monoeg_g_str_has_prefix (opt, "save-target-ratio=");
          if (D.28313 != 0) goto <D.28314>; else goto <D.28315>;
          <D.28314>:
          {
            double val;

            try
              {
                D.28316 = __builtin_strchr (opt, 61);
                opt = D.28316 + 1;
                D.28317 = parse_double_in_interval ("MONO_GC_PARAMS", "save-target-ratio", opt, 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0, &val);
                if (D.28317 != 0) goto <D.28318>; else goto <D.28319>;
                <D.28318>:
                save_target = val;
                <D.28319>:
                // predicted unlikely by continue predictor.
                goto <D.23885>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.28315>:
          D.28320 = monoeg_g_str_has_prefix (opt, "default-allowance-ratio=");
          if (D.28320 != 0) goto <D.28321>; else goto <D.28322>;
          <D.28321>:
          {
            double val;

            try
              {
                D.28323 = __builtin_strchr (opt, 61);
                opt = D.28323 + 1;
                D.28324 = parse_double_in_interval ("MONO_GC_PARAMS", "default-allowance-ratio", opt, 1.0e+0, 1.0e+0, &val);
                if (D.28324 != 0) goto <D.28325>; else goto <D.28326>;
                <D.28325>:
                allowance_ratio = val;
                <D.28326>:
                // predicted unlikely by continue predictor.
                goto <D.23885>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.28322>:
          D.28327 = monoeg_g_str_has_prefix (opt, "allow-synchronous-major=");
          if (D.28327 != 0) goto <D.28328>; else goto <D.28329>;
          <D.28328>:
          D.28330 = major_collector.is_concurrent;
          if (D.28330 == 0) goto <D.28331>; else goto <D.28332>;
          <D.28331>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "`allow-synchronous-major` is only valid for the concurrent major collector.");
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28332>:
          D.28333 = __builtin_strchr (opt, 61);
          opt = D.28333 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 3;
            if (__s2_len <= 3) goto <D.28335>; else goto <D.28336>;
            <D.28335>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28337 = "yes";
              D.28338 = MEM[(const unsigned char *)D.28337];
              D.28339 = (int) D.28338;
              D.28340 = *__s2;
              D.28341 = (int) D.28340;
              __result = D.28339 - D.28341;
              {
                D.28342 = __s2_len != 0;
                D.28343 = __result == 0;
                D.28344 = D.28342 & D.28343;
                if (D.28344 != 0) goto <D.28345>; else goto <D.28346>;
                <D.28345>:
                D.28347 = &MEM[(void *)"yes" + 1B];
                D.28348 = *D.28347;
                D.28349 = (int) D.28348;
                D.28350 = __s2 + 1;
                D.28351 = *D.28350;
                D.28352 = (int) D.28351;
                __result = D.28349 - D.28352;
                D.28353 = __s2_len > 1;
                D.28343 = __result == 0;
                D.28354 = D.28353 & D.28343;
                if (D.28354 != 0) goto <D.28355>; else goto <D.28356>;
                <D.28355>:
                D.28357 = &MEM[(void *)"yes" + 2B];
                D.28358 = *D.28357;
                D.28359 = (int) D.28358;
                D.28360 = __s2 + 2;
                D.28361 = *D.28360;
                D.28362 = (int) D.28361;
                __result = D.28359 - D.28362;
                D.28363 = __s2_len > 2;
                D.28343 = __result == 0;
                D.28364 = D.28363 & D.28343;
                if (D.28364 != 0) goto <D.28365>; else goto <D.28366>;
                <D.28365>:
                D.28367 = &MEM[(void *)"yes" + 3B];
                D.28368 = *D.28367;
                D.28369 = (int) D.28368;
                D.28370 = __s2 + 3;
                D.28371 = *D.28370;
                D.28372 = (int) D.28371;
                __result = D.28369 - D.28372;
                <D.28366>:
                <D.28356>:
                <D.28346>:
              }
              D.23920 = __result;
            }
            iftmp.459 = -D.23920;
            goto <D.28373>;
            <D.28336>:
            iftmp.459 = __builtin_strcmp (opt, "yes");
            <D.28373>:
            D.23921 = iftmp.459;
          }
          if (D.23921 == 0) goto <D.28374>; else goto <D.28375>;
          <D.28374>:
          allow_synchronous_major = 1;
          goto <D.28376>;
          <D.28375>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 2;
            if (__s2_len <= 3) goto <D.28378>; else goto <D.28379>;
            <D.28378>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28380 = "no";
              D.28381 = MEM[(const unsigned char *)D.28380];
              D.28382 = (int) D.28381;
              D.28383 = *__s2;
              D.28384 = (int) D.28383;
              __result = D.28382 - D.28384;
              {
                D.28385 = __s2_len != 0;
                D.28386 = __result == 0;
                D.28387 = D.28385 & D.28386;
                if (D.28387 != 0) goto <D.28388>; else goto <D.28389>;
                <D.28388>:
                D.28390 = &MEM[(void *)"no" + 1B];
                D.28391 = *D.28390;
                D.28392 = (int) D.28391;
                D.28393 = __s2 + 1;
                D.28394 = *D.28393;
                D.28395 = (int) D.28394;
                __result = D.28392 - D.28395;
                D.28396 = __s2_len > 1;
                D.28386 = __result == 0;
                D.28397 = D.28396 & D.28386;
                if (D.28397 != 0) goto <D.28398>; else goto <D.28399>;
                <D.28398>:
                D.28400 = &MEM[(void *)"no" + 2B];
                D.28401 = *D.28400;
                D.28402 = (int) D.28401;
                D.28403 = __s2 + 2;
                D.28404 = *D.28403;
                D.28405 = (int) D.28404;
                __result = D.28402 - D.28405;
                D.28406 = __s2_len > 2;
                D.28386 = __result == 0;
                D.28407 = D.28406 & D.28386;
                if (D.28407 != 0) goto <D.28408>; else goto <D.28409>;
                <D.28408>:
                D.28410 = &MEM[(void *)"no" + 3B];
                D.28411 = *D.28410;
                D.28412 = (int) D.28411;
                D.28413 = __s2 + 3;
                D.28414 = *D.28413;
                D.28415 = (int) D.28414;
                __result = D.28412 - D.28415;
                <D.28409>:
                <D.28399>:
                <D.28389>:
              }
              D.23929 = __result;
            }
            iftmp.460 = -D.23929;
            goto <D.28416>;
            <D.28379>:
            iftmp.460 = __builtin_strcmp (opt, "no");
            <D.28416>:
            D.23930 = iftmp.460;
          }
          if (D.23930 == 0) goto <D.28417>; else goto <D.28418>;
          <D.28417>:
          allow_synchronous_major = 0;
          goto <D.28419>;
          <D.28418>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`allow-synchronous-major` must be either `yes\' or `no\'.");
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28419>:
          <D.28376>:
          <D.28329>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 9;
            if (__s2_len <= 3) goto <D.28421>; else goto <D.28422>;
            <D.28421>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28423 = "cementing";
              D.28424 = MEM[(const unsigned char *)D.28423];
              D.28425 = (int) D.28424;
              D.28426 = *__s2;
              D.28427 = (int) D.28426;
              __result = D.28425 - D.28427;
              {
                D.28428 = __s2_len != 0;
                D.28429 = __result == 0;
                D.28430 = D.28428 & D.28429;
                if (D.28430 != 0) goto <D.28431>; else goto <D.28432>;
                <D.28431>:
                D.28433 = &MEM[(void *)"cementing" + 1B];
                D.28434 = *D.28433;
                D.28435 = (int) D.28434;
                D.28436 = __s2 + 1;
                D.28437 = *D.28436;
                D.28438 = (int) D.28437;
                __result = D.28435 - D.28438;
                D.28439 = __s2_len > 1;
                D.28429 = __result == 0;
                D.28440 = D.28439 & D.28429;
                if (D.28440 != 0) goto <D.28441>; else goto <D.28442>;
                <D.28441>:
                D.28443 = &MEM[(void *)"cementing" + 2B];
                D.28444 = *D.28443;
                D.28445 = (int) D.28444;
                D.28446 = __s2 + 2;
                D.28447 = *D.28446;
                D.28448 = (int) D.28447;
                __result = D.28445 - D.28448;
                D.28449 = __s2_len > 2;
                D.28429 = __result == 0;
                D.28450 = D.28449 & D.28429;
                if (D.28450 != 0) goto <D.28451>; else goto <D.28452>;
                <D.28451>:
                D.28453 = &MEM[(void *)"cementing" + 3B];
                D.28454 = *D.28453;
                D.28455 = (int) D.28454;
                D.28456 = __s2 + 3;
                D.28457 = *D.28456;
                D.28458 = (int) D.28457;
                __result = D.28455 - D.28458;
                <D.28452>:
                <D.28442>:
                <D.28432>:
              }
              D.23938 = __result;
            }
            iftmp.461 = -D.23938;
            goto <D.28459>;
            <D.28422>:
            iftmp.461 = __builtin_strcmp (opt, "cementing");
            <D.28459>:
            D.23939 = iftmp.461;
          }
          if (D.23939 == 0) goto <D.28460>; else goto <D.28461>;
          <D.28460>:
          D.28086 = major_collector.is_parallel;
          if (D.28086 != 0) goto <D.28462>; else goto <D.28463>;
          <D.28462>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "`cementing` is not supported for the parallel major collector.");
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28463>:
          cement_enabled = 1;
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28461>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 12;
            if (__s2_len <= 3) goto <D.28465>; else goto <D.28466>;
            <D.28465>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28467 = "no-cementing";
              D.28468 = MEM[(const unsigned char *)D.28467];
              D.28469 = (int) D.28468;
              D.28470 = *__s2;
              D.28471 = (int) D.28470;
              __result = D.28469 - D.28471;
              {
                D.28472 = __s2_len != 0;
                D.28473 = __result == 0;
                D.28474 = D.28472 & D.28473;
                if (D.28474 != 0) goto <D.28475>; else goto <D.28476>;
                <D.28475>:
                D.28477 = &MEM[(void *)"no-cementing" + 1B];
                D.28478 = *D.28477;
                D.28479 = (int) D.28478;
                D.28480 = __s2 + 1;
                D.28481 = *D.28480;
                D.28482 = (int) D.28481;
                __result = D.28479 - D.28482;
                D.28483 = __s2_len > 1;
                D.28473 = __result == 0;
                D.28484 = D.28483 & D.28473;
                if (D.28484 != 0) goto <D.28485>; else goto <D.28486>;
                <D.28485>:
                D.28487 = &MEM[(void *)"no-cementing" + 2B];
                D.28488 = *D.28487;
                D.28489 = (int) D.28488;
                D.28490 = __s2 + 2;
                D.28491 = *D.28490;
                D.28492 = (int) D.28491;
                __result = D.28489 - D.28492;
                D.28493 = __s2_len > 2;
                D.28473 = __result == 0;
                D.28494 = D.28493 & D.28473;
                if (D.28494 != 0) goto <D.28495>; else goto <D.28496>;
                <D.28495>:
                D.28497 = &MEM[(void *)"no-cementing" + 3B];
                D.28498 = *D.28497;
                D.28499 = (int) D.28498;
                D.28500 = __s2 + 3;
                D.28501 = *D.28500;
                D.28502 = (int) D.28501;
                __result = D.28499 - D.28502;
                <D.28496>:
                <D.28486>:
                <D.28476>:
              }
              D.23947 = __result;
            }
            iftmp.462 = -D.23947;
            goto <D.28503>;
            <D.28466>:
            iftmp.462 = __builtin_strcmp (opt, "no-cementing");
            <D.28503>:
            D.23948 = iftmp.462;
          }
          if (D.23948 == 0) goto <D.28504>; else goto <D.28505>;
          <D.28504>:
          cement_enabled = 0;
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28505>:
          D.28506 = major_collector.handle_gc_param;
          if (D.28506 != 0B) goto <D.28507>; else goto <D.28508>;
          <D.28507>:
          D.28506 = major_collector.handle_gc_param;
          D.28509 = D.28506 (opt);
          if (D.28509 != 0) goto <D.28510>; else goto <D.28511>;
          <D.28510>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28511>:
          <D.28508>:
          D.28512 = sgen_minor_collector.handle_gc_param;
          if (D.28512 != 0B) goto <D.28513>; else goto <D.28514>;
          <D.28513>:
          D.28512 = sgen_minor_collector.handle_gc_param;
          D.28515 = D.28512 (opt);
          if (D.28515 != 0) goto <D.28516>; else goto <D.28517>;
          <D.28516>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28517>:
          <D.28514>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.28518>; else goto <D.28519>;
          <D.28518>:
          // predicted unlikely by continue predictor.
          goto <D.23885>;
          <D.28519>:
          stderr.438 = stderr;
          fprintf (stderr.438, "\n%s must be a comma-delimited list of one or more of the following:\n", "MONO_GC_PARAMS");
          stderr.438 = stderr;
          fprintf (stderr.438, "  max-heap-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  soft-heap-limit=n (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  nursery-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  major=COLLECTOR (where COLLECTOR is `marksweep\', `marksweep-conc\', `marksweep-par\', \'marksweep-fixed\' or \'marksweep-fixed-par\')\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  minor=COLLECTOR (where COLLECTOR is `simple\' or `split\')\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  wbarrier=WBARRIER (where WBARRIER is `remset\' or `cardtable\')\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  stack-mark=MARK-METHOD (where MARK-METHOD is \'precise\' or \'conservative\')\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  [no-]cementing\n");
          D.28330 = major_collector.is_concurrent;
          if (D.28330 != 0) goto <D.28520>; else goto <D.28521>;
          <D.28520>:
          stderr.438 = stderr;
          fprintf (stderr.438, "  allow-synchronous-major=FLAG (where FLAG is `yes\' or `no\')\n");
          <D.28521>:
          D.28522 = major_collector.print_gc_param_usage;
          if (D.28522 != 0B) goto <D.28523>; else goto <D.28524>;
          <D.28523>:
          D.28522 = major_collector.print_gc_param_usage;
          D.28522 ();
          <D.28524>:
          D.28525 = sgen_minor_collector.print_gc_param_usage;
          if (D.28525 != 0B) goto <D.28526>; else goto <D.28527>;
          <D.28526>:
          D.28525 = sgen_minor_collector.print_gc_param_usage;
          D.28525 ();
          <D.28527>:
          stderr.438 = stderr;
          fprintf (stderr.438, " Experimental options:\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  save-target-ratio=R (where R must be between %.2f - %.2f).\n", 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0);
          stderr.438 = stderr;
          fprintf (stderr.438, "  default-allowance-ratio=R (where R must be between %.2f - %.2f).\n", 1.0e+0, 1.0e+1);
          stderr.438 = stderr;
          fprintf (stderr.438, "\n");
          usage_printed = 1;
        }
        <D.23885>:
        ptr = ptr + 4;
        <D.23950>:
        D.27773 = *ptr;
        if (D.27773 != 0B) goto <D.23949>; else goto <D.23951>;
        <D.23951>:
        monoeg_g_strfreev (opts);
      }
      <D.28098>:
      D.28086 = major_collector.is_parallel;
      if (D.28086 != 0) goto <D.28528>; else goto <D.28529>;
      <D.28528>:
      cement_enabled = 0;
      sgen_workers_init (num_workers);
      goto <D.28530>;
      <D.28529>:
      D.28330 = major_collector.is_concurrent;
      if (D.28330 != 0) goto <D.28531>; else goto <D.28532>;
      <D.28531>:
      sgen_workers_init (1);
      <D.28532>:
      <D.28530>:
      if (major_collector_opt != 0B) goto <D.28533>; else goto <D.28534>;
      <D.28533>:
      monoeg_g_free (major_collector_opt);
      <D.28534>:
      if (minor_collector_opt != 0B) goto <D.28535>; else goto <D.28536>;
      <D.28535>:
      monoeg_g_free (minor_collector_opt);
      <D.28536>:
      alloc_nursery ();
      sgen_cement_init (cement_enabled);
      env = monoeg_g_getenv ("MONO_GC_DEBUG");
      if (env != 0B) goto <D.28537>; else goto <D.28538>;
      <D.28537>:
      {
        gboolean usage_printed;

        usage_printed = 0;
        opts = monoeg_g_strsplit (env, ",", -1);
        ptr = opts;
        goto <D.24140>;
        <D.24139>:
        {
          char * opt;

          opt = *ptr;
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 0;
            if (__s2_len <= 3) goto <D.28540>; else goto <D.28541>;
            <D.28540>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28102 = "";
              D.28103 = MEM[(const unsigned char *)D.28102];
              D.28104 = (int) D.28103;
              D.28542 = *__s2;
              D.28543 = (int) D.28542;
              __result = D.28104 - D.28543;
              {
                D.28544 = __s2_len != 0;
                D.28545 = __result == 0;
                D.28546 = D.28544 & D.28545;
                if (D.28546 != 0) goto <D.28547>; else goto <D.28548>;
                <D.28547>:
                D.28112 = &MEM[(void *)"" + 1B];
                D.28113 = *D.28112;
                D.28114 = (int) D.28113;
                D.28549 = __s2 + 1;
                D.28550 = *D.28549;
                D.28551 = (int) D.28550;
                __result = D.28114 - D.28551;
                D.28552 = __s2_len > 1;
                D.28545 = __result == 0;
                D.28553 = D.28552 & D.28545;
                if (D.28553 != 0) goto <D.28554>; else goto <D.28555>;
                <D.28554>:
                D.28122 = &MEM[(void *)"" + 2B];
                D.28123 = *D.28122;
                D.28124 = (int) D.28123;
                D.28556 = __s2 + 2;
                D.28557 = *D.28556;
                D.28558 = (int) D.28557;
                __result = D.28124 - D.28558;
                D.28559 = __s2_len > 2;
                D.28545 = __result == 0;
                D.28560 = D.28559 & D.28545;
                if (D.28560 != 0) goto <D.28561>; else goto <D.28562>;
                <D.28561>:
                D.28132 = &MEM[(void *)"" + 3B];
                D.28133 = *D.28132;
                D.28134 = (int) D.28133;
                D.28563 = __s2 + 3;
                D.28564 = *D.28563;
                D.28565 = (int) D.28564;
                __result = D.28134 - D.28565;
                <D.28562>:
                <D.28555>:
                <D.28548>:
              }
              D.23961 = __result;
            }
            iftmp.463 = -D.23961;
            goto <D.28566>;
            <D.28541>:
            D.28567 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.463 = (int) D.28567;
            <D.28566>:
            D.23962 = iftmp.463;
          }
          if (D.23962 == 0) goto <D.28568>; else goto <D.28569>;
          <D.28568>:
          // predicted unlikely by continue predictor.
          goto <D.23963>;
          <D.28569>:
          D.28570 = *opt;
          D.28571 = D.28570 + 208;
          if (D.28571 <= 9) goto <D.28572>; else goto <D.28573>;
          <D.28572>:
          gc_debug_level.464 = atoi (opt);
          gc_debug_level = gc_debug_level.464;
          opt = opt + 1;
          D.28570 = *opt;
          if (D.28570 == 58) goto <D.28575>; else goto <D.28576>;
          <D.28575>:
          opt = opt + 1;
          <D.28576>:
          D.28570 = *opt;
          if (D.28570 != 0) goto <D.28577>; else goto <D.28578>;
          <D.28577>:
          {
            char * rf;

            D.28579 = getpid ();
            rf = monoeg_g_strdup_printf ("%s.%d", opt, D.28579);
            gc_debug_file.465 = fopen (rf, "wb");
            gc_debug_file = gc_debug_file.465;
            gc_debug_file.466 = gc_debug_file;
            if (gc_debug_file.466 == 0B) goto <D.28582>; else goto <D.28583>;
            <D.28582>:
            stderr.438 = stderr;
            gc_debug_file = stderr.438;
            <D.28583>:
            monoeg_g_free (rf);
          }
          <D.28578>:
          goto <D.28584>;
          <D.28573>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 15;
            if (__s2_len <= 3) goto <D.28586>; else goto <D.28587>;
            <D.28586>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28588 = "print-allowance";
              D.28589 = MEM[(const unsigned char *)D.28588];
              D.28590 = (int) D.28589;
              D.28591 = *__s2;
              D.28592 = (int) D.28591;
              __result = D.28590 - D.28592;
              {
                D.28593 = __s2_len != 0;
                D.28594 = __result == 0;
                D.28595 = D.28593 & D.28594;
                if (D.28595 != 0) goto <D.28596>; else goto <D.28597>;
                <D.28596>:
                D.28598 = &MEM[(void *)"print-allowance" + 1B];
                D.28599 = *D.28598;
                D.28600 = (int) D.28599;
                D.28601 = __s2 + 1;
                D.28602 = *D.28601;
                D.28603 = (int) D.28602;
                __result = D.28600 - D.28603;
                D.28604 = __s2_len > 1;
                D.28594 = __result == 0;
                D.28605 = D.28604 & D.28594;
                if (D.28605 != 0) goto <D.28606>; else goto <D.28607>;
                <D.28606>:
                D.28608 = &MEM[(void *)"print-allowance" + 2B];
                D.28609 = *D.28608;
                D.28610 = (int) D.28609;
                D.28611 = __s2 + 2;
                D.28612 = *D.28611;
                D.28613 = (int) D.28612;
                __result = D.28610 - D.28613;
                D.28614 = __s2_len > 2;
                D.28594 = __result == 0;
                D.28615 = D.28614 & D.28594;
                if (D.28615 != 0) goto <D.28616>; else goto <D.28617>;
                <D.28616>:
                D.28618 = &MEM[(void *)"print-allowance" + 3B];
                D.28619 = *D.28618;
                D.28620 = (int) D.28619;
                D.28621 = __s2 + 3;
                D.28622 = *D.28621;
                D.28623 = (int) D.28622;
                __result = D.28620 - D.28623;
                <D.28617>:
                <D.28607>:
                <D.28597>:
              }
              D.23972 = __result;
            }
            iftmp.467 = -D.23972;
            goto <D.28624>;
            <D.28587>:
            iftmp.467 = __builtin_strcmp (opt, "print-allowance");
            <D.28624>:
            D.23973 = iftmp.467;
          }
          if (D.23973 == 0) goto <D.28625>; else goto <D.28626>;
          <D.28625>:
          debug_print_allowance = 1;
          goto <D.28627>;
          <D.28626>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 13;
            if (__s2_len <= 3) goto <D.28629>; else goto <D.28630>;
            <D.28629>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28631 = "print-pinning";
              D.28632 = MEM[(const unsigned char *)D.28631];
              D.28633 = (int) D.28632;
              D.28634 = *__s2;
              D.28635 = (int) D.28634;
              __result = D.28633 - D.28635;
              {
                D.28636 = __s2_len != 0;
                D.28637 = __result == 0;
                D.28638 = D.28636 & D.28637;
                if (D.28638 != 0) goto <D.28639>; else goto <D.28640>;
                <D.28639>:
                D.28641 = &MEM[(void *)"print-pinning" + 1B];
                D.28642 = *D.28641;
                D.28643 = (int) D.28642;
                D.28644 = __s2 + 1;
                D.28645 = *D.28644;
                D.28646 = (int) D.28645;
                __result = D.28643 - D.28646;
                D.28647 = __s2_len > 1;
                D.28637 = __result == 0;
                D.28648 = D.28647 & D.28637;
                if (D.28648 != 0) goto <D.28649>; else goto <D.28650>;
                <D.28649>:
                D.28651 = &MEM[(void *)"print-pinning" + 2B];
                D.28652 = *D.28651;
                D.28653 = (int) D.28652;
                D.28654 = __s2 + 2;
                D.28655 = *D.28654;
                D.28656 = (int) D.28655;
                __result = D.28653 - D.28656;
                D.28657 = __s2_len > 2;
                D.28637 = __result == 0;
                D.28658 = D.28657 & D.28637;
                if (D.28658 != 0) goto <D.28659>; else goto <D.28660>;
                <D.28659>:
                D.28661 = &MEM[(void *)"print-pinning" + 3B];
                D.28662 = *D.28661;
                D.28663 = (int) D.28662;
                D.28664 = __s2 + 3;
                D.28665 = *D.28664;
                D.28666 = (int) D.28665;
                __result = D.28663 - D.28666;
                <D.28660>:
                <D.28650>:
                <D.28640>:
              }
              D.23981 = __result;
            }
            iftmp.468 = -D.23981;
            goto <D.28667>;
            <D.28630>:
            iftmp.468 = __builtin_strcmp (opt, "print-pinning");
            <D.28667>:
            D.23982 = iftmp.468;
          }
          if (D.23982 == 0) goto <D.28668>; else goto <D.28669>;
          <D.28668>:
          do_pin_stats = 1;
          goto <D.28670>;
          <D.28669>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 20;
            if (__s2_len <= 3) goto <D.28672>; else goto <D.28673>;
            <D.28672>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28674 = "verify-before-allocs";
              D.28675 = MEM[(const unsigned char *)D.28674];
              D.28676 = (int) D.28675;
              D.28677 = *__s2;
              D.28678 = (int) D.28677;
              __result = D.28676 - D.28678;
              {
                D.28679 = __s2_len != 0;
                D.28680 = __result == 0;
                D.28681 = D.28679 & D.28680;
                if (D.28681 != 0) goto <D.28682>; else goto <D.28683>;
                <D.28682>:
                D.28684 = &MEM[(void *)"verify-before-allocs" + 1B];
                D.28685 = *D.28684;
                D.28686 = (int) D.28685;
                D.28687 = __s2 + 1;
                D.28688 = *D.28687;
                D.28689 = (int) D.28688;
                __result = D.28686 - D.28689;
                D.28690 = __s2_len > 1;
                D.28680 = __result == 0;
                D.28691 = D.28690 & D.28680;
                if (D.28691 != 0) goto <D.28692>; else goto <D.28693>;
                <D.28692>:
                D.28694 = &MEM[(void *)"verify-before-allocs" + 2B];
                D.28695 = *D.28694;
                D.28696 = (int) D.28695;
                D.28697 = __s2 + 2;
                D.28698 = *D.28697;
                D.28699 = (int) D.28698;
                __result = D.28696 - D.28699;
                D.28700 = __s2_len > 2;
                D.28680 = __result == 0;
                D.28701 = D.28700 & D.28680;
                if (D.28701 != 0) goto <D.28702>; else goto <D.28703>;
                <D.28702>:
                D.28704 = &MEM[(void *)"verify-before-allocs" + 3B];
                D.28705 = *D.28704;
                D.28706 = (int) D.28705;
                D.28707 = __s2 + 3;
                D.28708 = *D.28707;
                D.28709 = (int) D.28708;
                __result = D.28706 - D.28709;
                <D.28703>:
                <D.28693>:
                <D.28683>:
              }
              D.23990 = __result;
            }
            iftmp.469 = -D.23990;
            goto <D.28710>;
            <D.28673>:
            iftmp.469 = __builtin_strcmp (opt, "verify-before-allocs");
            <D.28710>:
            D.23991 = iftmp.469;
          }
          if (D.23991 == 0) goto <D.28711>; else goto <D.28712>;
          <D.28711>:
          verify_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.28713>;
          <D.28712>:
          D.28714 = monoeg_g_str_has_prefix (opt, "verify-before-allocs=");
          if (D.28714 != 0) goto <D.28715>; else goto <D.28716>;
          <D.28715>:
          {
            char * arg;

            D.28717 = __builtin_strchr (opt, 61);
            arg = D.28717 + 1;
            D.28718 = atoi (arg);
            verify_before_allocs.470 = (unsigned int) D.28718;
            verify_before_allocs = verify_before_allocs.470;
            has_per_allocation_action = 1;
          }
          goto <D.28720>;
          <D.28716>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 21;
            if (__s2_len <= 3) goto <D.28722>; else goto <D.28723>;
            <D.28722>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28724 = "collect-before-allocs";
              D.28725 = MEM[(const unsigned char *)D.28724];
              D.28726 = (int) D.28725;
              D.28727 = *__s2;
              D.28728 = (int) D.28727;
              __result = D.28726 - D.28728;
              {
                D.28729 = __s2_len != 0;
                D.28730 = __result == 0;
                D.28731 = D.28729 & D.28730;
                if (D.28731 != 0) goto <D.28732>; else goto <D.28733>;
                <D.28732>:
                D.28734 = &MEM[(void *)"collect-before-allocs" + 1B];
                D.28735 = *D.28734;
                D.28736 = (int) D.28735;
                D.28737 = __s2 + 1;
                D.28738 = *D.28737;
                D.28739 = (int) D.28738;
                __result = D.28736 - D.28739;
                D.28740 = __s2_len > 1;
                D.28730 = __result == 0;
                D.28741 = D.28740 & D.28730;
                if (D.28741 != 0) goto <D.28742>; else goto <D.28743>;
                <D.28742>:
                D.28744 = &MEM[(void *)"collect-before-allocs" + 2B];
                D.28745 = *D.28744;
                D.28746 = (int) D.28745;
                D.28747 = __s2 + 2;
                D.28748 = *D.28747;
                D.28749 = (int) D.28748;
                __result = D.28746 - D.28749;
                D.28750 = __s2_len > 2;
                D.28730 = __result == 0;
                D.28751 = D.28750 & D.28730;
                if (D.28751 != 0) goto <D.28752>; else goto <D.28753>;
                <D.28752>:
                D.28754 = &MEM[(void *)"collect-before-allocs" + 3B];
                D.28755 = *D.28754;
                D.28756 = (int) D.28755;
                D.28757 = __s2 + 3;
                D.28758 = *D.28757;
                D.28759 = (int) D.28758;
                __result = D.28756 - D.28759;
                <D.28753>:
                <D.28743>:
                <D.28733>:
              }
              D.24000 = __result;
            }
            iftmp.471 = -D.24000;
            goto <D.28760>;
            <D.28723>:
            iftmp.471 = __builtin_strcmp (opt, "collect-before-allocs");
            <D.28760>:
            D.24001 = iftmp.471;
          }
          if (D.24001 == 0) goto <D.28761>; else goto <D.28762>;
          <D.28761>:
          collect_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.28763>;
          <D.28762>:
          D.28764 = monoeg_g_str_has_prefix (opt, "collect-before-allocs=");
          if (D.28764 != 0) goto <D.28765>; else goto <D.28766>;
          <D.28765>:
          {
            char * arg;

            D.28767 = __builtin_strchr (opt, 61);
            arg = D.28767 + 1;
            has_per_allocation_action = 1;
            D.28768 = atoi (arg);
            collect_before_allocs.472 = (unsigned int) D.28768;
            collect_before_allocs = collect_before_allocs.472;
          }
          goto <D.28770>;
          <D.28766>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 25;
            if (__s2_len <= 3) goto <D.28772>; else goto <D.28773>;
            <D.28772>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28774 = "verify-before-collections";
              D.28775 = MEM[(const unsigned char *)D.28774];
              D.28776 = (int) D.28775;
              D.28777 = *__s2;
              D.28778 = (int) D.28777;
              __result = D.28776 - D.28778;
              {
                D.28779 = __s2_len != 0;
                D.28780 = __result == 0;
                D.28781 = D.28779 & D.28780;
                if (D.28781 != 0) goto <D.28782>; else goto <D.28783>;
                <D.28782>:
                D.28784 = &MEM[(void *)"verify-before-collections" + 1B];
                D.28785 = *D.28784;
                D.28786 = (int) D.28785;
                D.28787 = __s2 + 1;
                D.28788 = *D.28787;
                D.28789 = (int) D.28788;
                __result = D.28786 - D.28789;
                D.28790 = __s2_len > 1;
                D.28780 = __result == 0;
                D.28791 = D.28790 & D.28780;
                if (D.28791 != 0) goto <D.28792>; else goto <D.28793>;
                <D.28792>:
                D.28794 = &MEM[(void *)"verify-before-collections" + 2B];
                D.28795 = *D.28794;
                D.28796 = (int) D.28795;
                D.28797 = __s2 + 2;
                D.28798 = *D.28797;
                D.28799 = (int) D.28798;
                __result = D.28796 - D.28799;
                D.28800 = __s2_len > 2;
                D.28780 = __result == 0;
                D.28801 = D.28800 & D.28780;
                if (D.28801 != 0) goto <D.28802>; else goto <D.28803>;
                <D.28802>:
                D.28804 = &MEM[(void *)"verify-before-collections" + 3B];
                D.28805 = *D.28804;
                D.28806 = (int) D.28805;
                D.28807 = __s2 + 3;
                D.28808 = *D.28807;
                D.28809 = (int) D.28808;
                __result = D.28806 - D.28809;
                <D.28803>:
                <D.28793>:
                <D.28783>:
              }
              D.24010 = __result;
            }
            iftmp.473 = -D.24010;
            goto <D.28810>;
            <D.28773>:
            iftmp.473 = __builtin_strcmp (opt, "verify-before-collections");
            <D.28810>:
            D.24011 = iftmp.473;
          }
          if (D.24011 == 0) goto <D.28811>; else goto <D.28812>;
          <D.28811>:
          whole_heap_check_before_collection = 1;
          goto <D.28813>;
          <D.28812>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 26;
            if (__s2_len <= 3) goto <D.28815>; else goto <D.28816>;
            <D.28815>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28817 = "check-at-minor-collections";
              D.28818 = MEM[(const unsigned char *)D.28817];
              D.28819 = (int) D.28818;
              D.28820 = *__s2;
              D.28821 = (int) D.28820;
              __result = D.28819 - D.28821;
              {
                D.28822 = __s2_len != 0;
                D.28823 = __result == 0;
                D.28824 = D.28822 & D.28823;
                if (D.28824 != 0) goto <D.28825>; else goto <D.28826>;
                <D.28825>:
                D.28827 = &MEM[(void *)"check-at-minor-collections" + 1B];
                D.28828 = *D.28827;
                D.28829 = (int) D.28828;
                D.28830 = __s2 + 1;
                D.28831 = *D.28830;
                D.28832 = (int) D.28831;
                __result = D.28829 - D.28832;
                D.28833 = __s2_len > 1;
                D.28823 = __result == 0;
                D.28834 = D.28833 & D.28823;
                if (D.28834 != 0) goto <D.28835>; else goto <D.28836>;
                <D.28835>:
                D.28837 = &MEM[(void *)"check-at-minor-collections" + 2B];
                D.28838 = *D.28837;
                D.28839 = (int) D.28838;
                D.28840 = __s2 + 2;
                D.28841 = *D.28840;
                D.28842 = (int) D.28841;
                __result = D.28839 - D.28842;
                D.28843 = __s2_len > 2;
                D.28823 = __result == 0;
                D.28844 = D.28843 & D.28823;
                if (D.28844 != 0) goto <D.28845>; else goto <D.28846>;
                <D.28845>:
                D.28847 = &MEM[(void *)"check-at-minor-collections" + 3B];
                D.28848 = *D.28847;
                D.28849 = (int) D.28848;
                D.28850 = __s2 + 3;
                D.28851 = *D.28850;
                D.28852 = (int) D.28851;
                __result = D.28849 - D.28852;
                <D.28846>:
                <D.28836>:
                <D.28826>:
              }
              D.24019 = __result;
            }
            iftmp.474 = -D.24019;
            goto <D.28853>;
            <D.28816>:
            iftmp.474 = __builtin_strcmp (opt, "check-at-minor-collections");
            <D.28853>:
            D.24020 = iftmp.474;
          }
          if (D.24020 == 0) goto <D.28854>; else goto <D.28855>;
          <D.28854>:
          consistency_check_at_minor_collection = 1;
          nursery_clear_policy = 0;
          goto <D.28856>;
          <D.28855>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 27;
            if (__s2_len <= 3) goto <D.28858>; else goto <D.28859>;
            <D.28858>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28860 = "mod-union-consistency-check";
              D.28861 = MEM[(const unsigned char *)D.28860];
              D.28862 = (int) D.28861;
              D.28863 = *__s2;
              D.28864 = (int) D.28863;
              __result = D.28862 - D.28864;
              {
                D.28865 = __s2_len != 0;
                D.28866 = __result == 0;
                D.28867 = D.28865 & D.28866;
                if (D.28867 != 0) goto <D.28868>; else goto <D.28869>;
                <D.28868>:
                D.28870 = &MEM[(void *)"mod-union-consistency-check" + 1B];
                D.28871 = *D.28870;
                D.28872 = (int) D.28871;
                D.28873 = __s2 + 1;
                D.28874 = *D.28873;
                D.28875 = (int) D.28874;
                __result = D.28872 - D.28875;
                D.28876 = __s2_len > 1;
                D.28866 = __result == 0;
                D.28877 = D.28876 & D.28866;
                if (D.28877 != 0) goto <D.28878>; else goto <D.28879>;
                <D.28878>:
                D.28880 = &MEM[(void *)"mod-union-consistency-check" + 2B];
                D.28881 = *D.28880;
                D.28882 = (int) D.28881;
                D.28883 = __s2 + 2;
                D.28884 = *D.28883;
                D.28885 = (int) D.28884;
                __result = D.28882 - D.28885;
                D.28886 = __s2_len > 2;
                D.28866 = __result == 0;
                D.28887 = D.28886 & D.28866;
                if (D.28887 != 0) goto <D.28888>; else goto <D.28889>;
                <D.28888>:
                D.28890 = &MEM[(void *)"mod-union-consistency-check" + 3B];
                D.28891 = *D.28890;
                D.28892 = (int) D.28891;
                D.28893 = __s2 + 3;
                D.28894 = *D.28893;
                D.28895 = (int) D.28894;
                __result = D.28892 - D.28895;
                <D.28889>:
                <D.28879>:
                <D.28869>:
              }
              D.24028 = __result;
            }
            iftmp.475 = -D.24028;
            goto <D.28896>;
            <D.28859>:
            iftmp.475 = __builtin_strcmp (opt, "mod-union-consistency-check");
            <D.28896>:
            D.24029 = iftmp.475;
          }
          if (D.24029 == 0) goto <D.28897>; else goto <D.28898>;
          <D.28897>:
          D.28330 = major_collector.is_concurrent;
          if (D.28330 == 0) goto <D.28899>; else goto <D.28900>;
          <D.28899>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "`mod-union-consistency-check` only works with concurrent major collector.");
          // predicted unlikely by continue predictor.
          goto <D.23963>;
          <D.28900>:
          mod_union_consistency_check = 1;
          goto <D.28901>;
          <D.28898>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 15;
            if (__s2_len <= 3) goto <D.28903>; else goto <D.28904>;
            <D.28903>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28905 = "check-mark-bits";
              D.28906 = MEM[(const unsigned char *)D.28905];
              D.28907 = (int) D.28906;
              D.28908 = *__s2;
              D.28909 = (int) D.28908;
              __result = D.28907 - D.28909;
              {
                D.28910 = __s2_len != 0;
                D.28911 = __result == 0;
                D.28912 = D.28910 & D.28911;
                if (D.28912 != 0) goto <D.28913>; else goto <D.28914>;
                <D.28913>:
                D.28915 = &MEM[(void *)"check-mark-bits" + 1B];
                D.28916 = *D.28915;
                D.28917 = (int) D.28916;
                D.28918 = __s2 + 1;
                D.28919 = *D.28918;
                D.28920 = (int) D.28919;
                __result = D.28917 - D.28920;
                D.28921 = __s2_len > 1;
                D.28911 = __result == 0;
                D.28922 = D.28921 & D.28911;
                if (D.28922 != 0) goto <D.28923>; else goto <D.28924>;
                <D.28923>:
                D.28925 = &MEM[(void *)"check-mark-bits" + 2B];
                D.28926 = *D.28925;
                D.28927 = (int) D.28926;
                D.28928 = __s2 + 2;
                D.28929 = *D.28928;
                D.28930 = (int) D.28929;
                __result = D.28927 - D.28930;
                D.28931 = __s2_len > 2;
                D.28911 = __result == 0;
                D.28932 = D.28931 & D.28911;
                if (D.28932 != 0) goto <D.28933>; else goto <D.28934>;
                <D.28933>:
                D.28935 = &MEM[(void *)"check-mark-bits" + 3B];
                D.28936 = *D.28935;
                D.28937 = (int) D.28936;
                D.28938 = __s2 + 3;
                D.28939 = *D.28938;
                D.28940 = (int) D.28939;
                __result = D.28937 - D.28940;
                <D.28934>:
                <D.28924>:
                <D.28914>:
              }
              D.24037 = __result;
            }
            iftmp.476 = -D.24037;
            goto <D.28941>;
            <D.28904>:
            iftmp.476 = __builtin_strcmp (opt, "check-mark-bits");
            <D.28941>:
            D.24038 = iftmp.476;
          }
          if (D.24038 == 0) goto <D.28942>; else goto <D.28943>;
          <D.28942>:
          check_mark_bits_after_major_collection = 1;
          goto <D.28944>;
          <D.28943>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 20;
            if (__s2_len <= 3) goto <D.28946>; else goto <D.28947>;
            <D.28946>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28948 = "check-nursery-pinned";
              D.28949 = MEM[(const unsigned char *)D.28948];
              D.28950 = (int) D.28949;
              D.28951 = *__s2;
              D.28952 = (int) D.28951;
              __result = D.28950 - D.28952;
              {
                D.28953 = __s2_len != 0;
                D.28954 = __result == 0;
                D.28955 = D.28953 & D.28954;
                if (D.28955 != 0) goto <D.28956>; else goto <D.28957>;
                <D.28956>:
                D.28958 = &MEM[(void *)"check-nursery-pinned" + 1B];
                D.28959 = *D.28958;
                D.28960 = (int) D.28959;
                D.28961 = __s2 + 1;
                D.28962 = *D.28961;
                D.28963 = (int) D.28962;
                __result = D.28960 - D.28963;
                D.28964 = __s2_len > 1;
                D.28954 = __result == 0;
                D.28965 = D.28964 & D.28954;
                if (D.28965 != 0) goto <D.28966>; else goto <D.28967>;
                <D.28966>:
                D.28968 = &MEM[(void *)"check-nursery-pinned" + 2B];
                D.28969 = *D.28968;
                D.28970 = (int) D.28969;
                D.28971 = __s2 + 2;
                D.28972 = *D.28971;
                D.28973 = (int) D.28972;
                __result = D.28970 - D.28973;
                D.28974 = __s2_len > 2;
                D.28954 = __result == 0;
                D.28975 = D.28974 & D.28954;
                if (D.28975 != 0) goto <D.28976>; else goto <D.28977>;
                <D.28976>:
                D.28978 = &MEM[(void *)"check-nursery-pinned" + 3B];
                D.28979 = *D.28978;
                D.28980 = (int) D.28979;
                D.28981 = __s2 + 3;
                D.28982 = *D.28981;
                D.28983 = (int) D.28982;
                __result = D.28980 - D.28983;
                <D.28977>:
                <D.28967>:
                <D.28957>:
              }
              D.24046 = __result;
            }
            iftmp.477 = -D.24046;
            goto <D.28984>;
            <D.28947>:
            iftmp.477 = __builtin_strcmp (opt, "check-nursery-pinned");
            <D.28984>:
            D.24047 = iftmp.477;
          }
          if (D.24047 == 0) goto <D.28985>; else goto <D.28986>;
          <D.28985>:
          check_nursery_objects_pinned = 1;
          goto <D.28987>;
          <D.28986>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 14;
            if (__s2_len <= 3) goto <D.28989>; else goto <D.28990>;
            <D.28989>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.28991 = "xdomain-checks";
              D.28992 = MEM[(const unsigned char *)D.28991];
              D.28993 = (int) D.28992;
              D.28994 = *__s2;
              D.28995 = (int) D.28994;
              __result = D.28993 - D.28995;
              {
                D.28996 = __s2_len != 0;
                D.28997 = __result == 0;
                D.28998 = D.28996 & D.28997;
                if (D.28998 != 0) goto <D.28999>; else goto <D.29000>;
                <D.28999>:
                D.29001 = &MEM[(void *)"xdomain-checks" + 1B];
                D.29002 = *D.29001;
                D.29003 = (int) D.29002;
                D.29004 = __s2 + 1;
                D.29005 = *D.29004;
                D.29006 = (int) D.29005;
                __result = D.29003 - D.29006;
                D.29007 = __s2_len > 1;
                D.28997 = __result == 0;
                D.29008 = D.29007 & D.28997;
                if (D.29008 != 0) goto <D.29009>; else goto <D.29010>;
                <D.29009>:
                D.29011 = &MEM[(void *)"xdomain-checks" + 2B];
                D.29012 = *D.29011;
                D.29013 = (int) D.29012;
                D.29014 = __s2 + 2;
                D.29015 = *D.29014;
                D.29016 = (int) D.29015;
                __result = D.29013 - D.29016;
                D.29017 = __s2_len > 2;
                D.28997 = __result == 0;
                D.29018 = D.29017 & D.28997;
                if (D.29018 != 0) goto <D.29019>; else goto <D.29020>;
                <D.29019>:
                D.29021 = &MEM[(void *)"xdomain-checks" + 3B];
                D.29022 = *D.29021;
                D.29023 = (int) D.29022;
                D.29024 = __s2 + 3;
                D.29025 = *D.29024;
                D.29026 = (int) D.29025;
                __result = D.29023 - D.29026;
                <D.29020>:
                <D.29010>:
                <D.29000>:
              }
              D.24055 = __result;
            }
            iftmp.478 = -D.24055;
            goto <D.29027>;
            <D.28990>:
            iftmp.478 = __builtin_strcmp (opt, "xdomain-checks");
            <D.29027>:
            D.24056 = iftmp.478;
          }
          if (D.24056 == 0) goto <D.29028>; else goto <D.29029>;
          <D.29028>:
          xdomain_checks = 1;
          goto <D.29030>;
          <D.29029>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 11;
            if (__s2_len <= 3) goto <D.29032>; else goto <D.29033>;
            <D.29032>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29034 = "clear-at-gc";
              D.29035 = MEM[(const unsigned char *)D.29034];
              D.29036 = (int) D.29035;
              D.29037 = *__s2;
              D.29038 = (int) D.29037;
              __result = D.29036 - D.29038;
              {
                D.29039 = __s2_len != 0;
                D.29040 = __result == 0;
                D.29041 = D.29039 & D.29040;
                if (D.29041 != 0) goto <D.29042>; else goto <D.29043>;
                <D.29042>:
                D.29044 = &MEM[(void *)"clear-at-gc" + 1B];
                D.29045 = *D.29044;
                D.29046 = (int) D.29045;
                D.29047 = __s2 + 1;
                D.29048 = *D.29047;
                D.29049 = (int) D.29048;
                __result = D.29046 - D.29049;
                D.29050 = __s2_len > 1;
                D.29040 = __result == 0;
                D.29051 = D.29050 & D.29040;
                if (D.29051 != 0) goto <D.29052>; else goto <D.29053>;
                <D.29052>:
                D.29054 = &MEM[(void *)"clear-at-gc" + 2B];
                D.29055 = *D.29054;
                D.29056 = (int) D.29055;
                D.29057 = __s2 + 2;
                D.29058 = *D.29057;
                D.29059 = (int) D.29058;
                __result = D.29056 - D.29059;
                D.29060 = __s2_len > 2;
                D.29040 = __result == 0;
                D.29061 = D.29060 & D.29040;
                if (D.29061 != 0) goto <D.29062>; else goto <D.29063>;
                <D.29062>:
                D.29064 = &MEM[(void *)"clear-at-gc" + 3B];
                D.29065 = *D.29064;
                D.29066 = (int) D.29065;
                D.29067 = __s2 + 3;
                D.29068 = *D.29067;
                D.29069 = (int) D.29068;
                __result = D.29066 - D.29069;
                <D.29063>:
                <D.29053>:
                <D.29043>:
              }
              D.24064 = __result;
            }
            iftmp.479 = -D.24064;
            goto <D.29070>;
            <D.29033>:
            iftmp.479 = __builtin_strcmp (opt, "clear-at-gc");
            <D.29070>:
            D.24065 = iftmp.479;
          }
          if (D.24065 == 0) goto <D.29071>; else goto <D.29072>;
          <D.29071>:
          nursery_clear_policy = 0;
          goto <D.29073>;
          <D.29072>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 19;
            if (__s2_len <= 3) goto <D.29075>; else goto <D.29076>;
            <D.29075>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29077 = "clear-nursery-at-gc";
              D.29078 = MEM[(const unsigned char *)D.29077];
              D.29079 = (int) D.29078;
              D.29080 = *__s2;
              D.29081 = (int) D.29080;
              __result = D.29079 - D.29081;
              {
                D.29082 = __s2_len != 0;
                D.29083 = __result == 0;
                D.29084 = D.29082 & D.29083;
                if (D.29084 != 0) goto <D.29085>; else goto <D.29086>;
                <D.29085>:
                D.29087 = &MEM[(void *)"clear-nursery-at-gc" + 1B];
                D.29088 = *D.29087;
                D.29089 = (int) D.29088;
                D.29090 = __s2 + 1;
                D.29091 = *D.29090;
                D.29092 = (int) D.29091;
                __result = D.29089 - D.29092;
                D.29093 = __s2_len > 1;
                D.29083 = __result == 0;
                D.29094 = D.29093 & D.29083;
                if (D.29094 != 0) goto <D.29095>; else goto <D.29096>;
                <D.29095>:
                D.29097 = &MEM[(void *)"clear-nursery-at-gc" + 2B];
                D.29098 = *D.29097;
                D.29099 = (int) D.29098;
                D.29100 = __s2 + 2;
                D.29101 = *D.29100;
                D.29102 = (int) D.29101;
                __result = D.29099 - D.29102;
                D.29103 = __s2_len > 2;
                D.29083 = __result == 0;
                D.29104 = D.29103 & D.29083;
                if (D.29104 != 0) goto <D.29105>; else goto <D.29106>;
                <D.29105>:
                D.29107 = &MEM[(void *)"clear-nursery-at-gc" + 3B];
                D.29108 = *D.29107;
                D.29109 = (int) D.29108;
                D.29110 = __s2 + 3;
                D.29111 = *D.29110;
                D.29112 = (int) D.29111;
                __result = D.29109 - D.29112;
                <D.29106>:
                <D.29096>:
                <D.29086>:
              }
              D.24073 = __result;
            }
            iftmp.480 = -D.24073;
            goto <D.29113>;
            <D.29076>:
            iftmp.480 = __builtin_strcmp (opt, "clear-nursery-at-gc");
            <D.29113>:
            D.24074 = iftmp.480;
          }
          if (D.24074 == 0) goto <D.29114>; else goto <D.29115>;
          <D.29114>:
          nursery_clear_policy = 0;
          goto <D.29116>;
          <D.29115>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 17;
            if (__s2_len <= 3) goto <D.29118>; else goto <D.29119>;
            <D.29118>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29120 = "check-scan-starts";
              D.29121 = MEM[(const unsigned char *)D.29120];
              D.29122 = (int) D.29121;
              D.29123 = *__s2;
              D.29124 = (int) D.29123;
              __result = D.29122 - D.29124;
              {
                D.29125 = __s2_len != 0;
                D.29126 = __result == 0;
                D.29127 = D.29125 & D.29126;
                if (D.29127 != 0) goto <D.29128>; else goto <D.29129>;
                <D.29128>:
                D.29130 = &MEM[(void *)"check-scan-starts" + 1B];
                D.29131 = *D.29130;
                D.29132 = (int) D.29131;
                D.29133 = __s2 + 1;
                D.29134 = *D.29133;
                D.29135 = (int) D.29134;
                __result = D.29132 - D.29135;
                D.29136 = __s2_len > 1;
                D.29126 = __result == 0;
                D.29137 = D.29136 & D.29126;
                if (D.29137 != 0) goto <D.29138>; else goto <D.29139>;
                <D.29138>:
                D.29140 = &MEM[(void *)"check-scan-starts" + 2B];
                D.29141 = *D.29140;
                D.29142 = (int) D.29141;
                D.29143 = __s2 + 2;
                D.29144 = *D.29143;
                D.29145 = (int) D.29144;
                __result = D.29142 - D.29145;
                D.29146 = __s2_len > 2;
                D.29126 = __result == 0;
                D.29147 = D.29146 & D.29126;
                if (D.29147 != 0) goto <D.29148>; else goto <D.29149>;
                <D.29148>:
                D.29150 = &MEM[(void *)"check-scan-starts" + 3B];
                D.29151 = *D.29150;
                D.29152 = (int) D.29151;
                D.29153 = __s2 + 3;
                D.29154 = *D.29153;
                D.29155 = (int) D.29154;
                __result = D.29152 - D.29155;
                <D.29149>:
                <D.29139>:
                <D.29129>:
              }
              D.24082 = __result;
            }
            iftmp.481 = -D.24082;
            goto <D.29156>;
            <D.29119>:
            iftmp.481 = __builtin_strcmp (opt, "check-scan-starts");
            <D.29156>:
            D.24083 = iftmp.481;
          }
          if (D.24083 == 0) goto <D.29157>; else goto <D.29158>;
          <D.29157>:
          do_scan_starts_check = 1;
          goto <D.29159>;
          <D.29158>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 26;
            if (__s2_len <= 3) goto <D.29161>; else goto <D.29162>;
            <D.29161>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29163 = "verify-nursery-at-minor-gc";
              D.29164 = MEM[(const unsigned char *)D.29163];
              D.29165 = (int) D.29164;
              D.29166 = *__s2;
              D.29167 = (int) D.29166;
              __result = D.29165 - D.29167;
              {
                D.29168 = __s2_len != 0;
                D.29169 = __result == 0;
                D.29170 = D.29168 & D.29169;
                if (D.29170 != 0) goto <D.29171>; else goto <D.29172>;
                <D.29171>:
                D.29173 = &MEM[(void *)"verify-nursery-at-minor-gc" + 1B];
                D.29174 = *D.29173;
                D.29175 = (int) D.29174;
                D.29176 = __s2 + 1;
                D.29177 = *D.29176;
                D.29178 = (int) D.29177;
                __result = D.29175 - D.29178;
                D.29179 = __s2_len > 1;
                D.29169 = __result == 0;
                D.29180 = D.29179 & D.29169;
                if (D.29180 != 0) goto <D.29181>; else goto <D.29182>;
                <D.29181>:
                D.29183 = &MEM[(void *)"verify-nursery-at-minor-gc" + 2B];
                D.29184 = *D.29183;
                D.29185 = (int) D.29184;
                D.29186 = __s2 + 2;
                D.29187 = *D.29186;
                D.29188 = (int) D.29187;
                __result = D.29185 - D.29188;
                D.29189 = __s2_len > 2;
                D.29169 = __result == 0;
                D.29190 = D.29189 & D.29169;
                if (D.29190 != 0) goto <D.29191>; else goto <D.29192>;
                <D.29191>:
                D.29193 = &MEM[(void *)"verify-nursery-at-minor-gc" + 3B];
                D.29194 = *D.29193;
                D.29195 = (int) D.29194;
                D.29196 = __s2 + 3;
                D.29197 = *D.29196;
                D.29198 = (int) D.29197;
                __result = D.29195 - D.29198;
                <D.29192>:
                <D.29182>:
                <D.29172>:
              }
              D.24091 = __result;
            }
            iftmp.482 = -D.24091;
            goto <D.29199>;
            <D.29162>:
            iftmp.482 = __builtin_strcmp (opt, "verify-nursery-at-minor-gc");
            <D.29199>:
            D.24092 = iftmp.482;
          }
          if (D.24092 == 0) goto <D.29200>; else goto <D.29201>;
          <D.29200>:
          do_verify_nursery = 1;
          goto <D.29202>;
          <D.29201>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 16;
            if (__s2_len <= 3) goto <D.29204>; else goto <D.29205>;
            <D.29204>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29206 = "check-concurrent";
              D.29207 = MEM[(const unsigned char *)D.29206];
              D.29208 = (int) D.29207;
              D.29209 = *__s2;
              D.29210 = (int) D.29209;
              __result = D.29208 - D.29210;
              {
                D.29211 = __s2_len != 0;
                D.29212 = __result == 0;
                D.29213 = D.29211 & D.29212;
                if (D.29213 != 0) goto <D.29214>; else goto <D.29215>;
                <D.29214>:
                D.29216 = &MEM[(void *)"check-concurrent" + 1B];
                D.29217 = *D.29216;
                D.29218 = (int) D.29217;
                D.29219 = __s2 + 1;
                D.29220 = *D.29219;
                D.29221 = (int) D.29220;
                __result = D.29218 - D.29221;
                D.29222 = __s2_len > 1;
                D.29212 = __result == 0;
                D.29223 = D.29222 & D.29212;
                if (D.29223 != 0) goto <D.29224>; else goto <D.29225>;
                <D.29224>:
                D.29226 = &MEM[(void *)"check-concurrent" + 2B];
                D.29227 = *D.29226;
                D.29228 = (int) D.29227;
                D.29229 = __s2 + 2;
                D.29230 = *D.29229;
                D.29231 = (int) D.29230;
                __result = D.29228 - D.29231;
                D.29232 = __s2_len > 2;
                D.29212 = __result == 0;
                D.29233 = D.29232 & D.29212;
                if (D.29233 != 0) goto <D.29234>; else goto <D.29235>;
                <D.29234>:
                D.29236 = &MEM[(void *)"check-concurrent" + 3B];
                D.29237 = *D.29236;
                D.29238 = (int) D.29237;
                D.29239 = __s2 + 3;
                D.29240 = *D.29239;
                D.29241 = (int) D.29240;
                __result = D.29238 - D.29241;
                <D.29235>:
                <D.29225>:
                <D.29215>:
              }
              D.24100 = __result;
            }
            iftmp.483 = -D.24100;
            goto <D.29242>;
            <D.29205>:
            iftmp.483 = __builtin_strcmp (opt, "check-concurrent");
            <D.29242>:
            D.24101 = iftmp.483;
          }
          if (D.24101 == 0) goto <D.29243>; else goto <D.29244>;
          <D.29243>:
          D.28330 = major_collector.is_concurrent;
          if (D.28330 == 0) goto <D.29245>; else goto <D.29246>;
          <D.29245>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "`check-concurrent` only works with concurrent major collectors.");
          // predicted unlikely by continue predictor.
          goto <D.23963>;
          <D.29246>:
          do_concurrent_checks = 1;
          goto <D.29247>;
          <D.29244>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 24;
            if (__s2_len <= 3) goto <D.29249>; else goto <D.29250>;
            <D.29249>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29251 = "dump-nursery-at-minor-gc";
              D.29252 = MEM[(const unsigned char *)D.29251];
              D.29253 = (int) D.29252;
              D.29254 = *__s2;
              D.29255 = (int) D.29254;
              __result = D.29253 - D.29255;
              {
                D.29256 = __s2_len != 0;
                D.29257 = __result == 0;
                D.29258 = D.29256 & D.29257;
                if (D.29258 != 0) goto <D.29259>; else goto <D.29260>;
                <D.29259>:
                D.29261 = &MEM[(void *)"dump-nursery-at-minor-gc" + 1B];
                D.29262 = *D.29261;
                D.29263 = (int) D.29262;
                D.29264 = __s2 + 1;
                D.29265 = *D.29264;
                D.29266 = (int) D.29265;
                __result = D.29263 - D.29266;
                D.29267 = __s2_len > 1;
                D.29257 = __result == 0;
                D.29268 = D.29267 & D.29257;
                if (D.29268 != 0) goto <D.29269>; else goto <D.29270>;
                <D.29269>:
                D.29271 = &MEM[(void *)"dump-nursery-at-minor-gc" + 2B];
                D.29272 = *D.29271;
                D.29273 = (int) D.29272;
                D.29274 = __s2 + 2;
                D.29275 = *D.29274;
                D.29276 = (int) D.29275;
                __result = D.29273 - D.29276;
                D.29277 = __s2_len > 2;
                D.29257 = __result == 0;
                D.29278 = D.29277 & D.29257;
                if (D.29278 != 0) goto <D.29279>; else goto <D.29280>;
                <D.29279>:
                D.29281 = &MEM[(void *)"dump-nursery-at-minor-gc" + 3B];
                D.29282 = *D.29281;
                D.29283 = (int) D.29282;
                D.29284 = __s2 + 3;
                D.29285 = *D.29284;
                D.29286 = (int) D.29285;
                __result = D.29283 - D.29286;
                <D.29280>:
                <D.29270>:
                <D.29260>:
              }
              D.24109 = __result;
            }
            iftmp.484 = -D.24109;
            goto <D.29287>;
            <D.29250>:
            iftmp.484 = __builtin_strcmp (opt, "dump-nursery-at-minor-gc");
            <D.29287>:
            D.24110 = iftmp.484;
          }
          if (D.24110 == 0) goto <D.29288>; else goto <D.29289>;
          <D.29288>:
          do_dump_nursery_content = 1;
          goto <D.29290>;
          <D.29289>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 20;
            if (__s2_len <= 3) goto <D.29292>; else goto <D.29293>;
            <D.29292>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29294 = "no-managed-allocator";
              D.29295 = MEM[(const unsigned char *)D.29294];
              D.29296 = (int) D.29295;
              D.29297 = *__s2;
              D.29298 = (int) D.29297;
              __result = D.29296 - D.29298;
              {
                D.29299 = __s2_len != 0;
                D.29300 = __result == 0;
                D.29301 = D.29299 & D.29300;
                if (D.29301 != 0) goto <D.29302>; else goto <D.29303>;
                <D.29302>:
                D.29304 = &MEM[(void *)"no-managed-allocator" + 1B];
                D.29305 = *D.29304;
                D.29306 = (int) D.29305;
                D.29307 = __s2 + 1;
                D.29308 = *D.29307;
                D.29309 = (int) D.29308;
                __result = D.29306 - D.29309;
                D.29310 = __s2_len > 1;
                D.29300 = __result == 0;
                D.29311 = D.29310 & D.29300;
                if (D.29311 != 0) goto <D.29312>; else goto <D.29313>;
                <D.29312>:
                D.29314 = &MEM[(void *)"no-managed-allocator" + 2B];
                D.29315 = *D.29314;
                D.29316 = (int) D.29315;
                D.29317 = __s2 + 2;
                D.29318 = *D.29317;
                D.29319 = (int) D.29318;
                __result = D.29316 - D.29319;
                D.29320 = __s2_len > 2;
                D.29300 = __result == 0;
                D.29321 = D.29320 & D.29300;
                if (D.29321 != 0) goto <D.29322>; else goto <D.29323>;
                <D.29322>:
                D.29324 = &MEM[(void *)"no-managed-allocator" + 3B];
                D.29325 = *D.29324;
                D.29326 = (int) D.29325;
                D.29327 = __s2 + 3;
                D.29328 = *D.29327;
                D.29329 = (int) D.29328;
                __result = D.29326 - D.29329;
                <D.29323>:
                <D.29313>:
                <D.29303>:
              }
              D.24118 = __result;
            }
            iftmp.485 = -D.24118;
            goto <D.29330>;
            <D.29293>:
            iftmp.485 = __builtin_strcmp (opt, "no-managed-allocator");
            <D.29330>:
            D.24119 = iftmp.485;
          }
          if (D.24119 == 0) goto <D.29331>; else goto <D.29332>;
          <D.29331>:
          sgen_set_use_managed_allocator (0);
          goto <D.29333>;
          <D.29332>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 13;
            if (__s2_len <= 3) goto <D.29335>; else goto <D.29336>;
            <D.29335>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29337 = "disable-minor";
              D.29338 = MEM[(const unsigned char *)D.29337];
              D.29339 = (int) D.29338;
              D.29340 = *__s2;
              D.29341 = (int) D.29340;
              __result = D.29339 - D.29341;
              {
                D.29342 = __s2_len != 0;
                D.29343 = __result == 0;
                D.29344 = D.29342 & D.29343;
                if (D.29344 != 0) goto <D.29345>; else goto <D.29346>;
                <D.29345>:
                D.29347 = &MEM[(void *)"disable-minor" + 1B];
                D.29348 = *D.29347;
                D.29349 = (int) D.29348;
                D.29350 = __s2 + 1;
                D.29351 = *D.29350;
                D.29352 = (int) D.29351;
                __result = D.29349 - D.29352;
                D.29353 = __s2_len > 1;
                D.29343 = __result == 0;
                D.29354 = D.29353 & D.29343;
                if (D.29354 != 0) goto <D.29355>; else goto <D.29356>;
                <D.29355>:
                D.29357 = &MEM[(void *)"disable-minor" + 2B];
                D.29358 = *D.29357;
                D.29359 = (int) D.29358;
                D.29360 = __s2 + 2;
                D.29361 = *D.29360;
                D.29362 = (int) D.29361;
                __result = D.29359 - D.29362;
                D.29363 = __s2_len > 2;
                D.29343 = __result == 0;
                D.29364 = D.29363 & D.29343;
                if (D.29364 != 0) goto <D.29365>; else goto <D.29366>;
                <D.29365>:
                D.29367 = &MEM[(void *)"disable-minor" + 3B];
                D.29368 = *D.29367;
                D.29369 = (int) D.29368;
                D.29370 = __s2 + 3;
                D.29371 = *D.29370;
                D.29372 = (int) D.29371;
                __result = D.29369 - D.29372;
                <D.29366>:
                <D.29356>:
                <D.29346>:
              }
              D.24127 = __result;
            }
            iftmp.486 = -D.24127;
            goto <D.29373>;
            <D.29336>:
            iftmp.486 = __builtin_strcmp (opt, "disable-minor");
            <D.29373>:
            D.24128 = iftmp.486;
          }
          if (D.24128 == 0) goto <D.29374>; else goto <D.29375>;
          <D.29374>:
          disable_minor_collections = 1;
          goto <D.29376>;
          <D.29375>:
          {
            size_t __s1_len;
            size_t __s2_len;

            __s2_len = 13;
            if (__s2_len <= 3) goto <D.29378>; else goto <D.29379>;
            <D.29378>:
            {
              const unsigned char * __s2;
              int __result;

              __s2 = opt;
              D.29380 = "disable-major";
              D.29381 = MEM[(const unsigned char *)D.29380];
              D.29382 = (int) D.29381;
              D.29383 = *__s2;
              D.29384 = (int) D.29383;
              __result = D.29382 - D.29384;
              {
                D.29385 = __s2_len != 0;
                D.29386 = __result == 0;
                D.29387 = D.29385 & D.29386;
                if (D.29387 != 0) goto <D.29388>; else goto <D.29389>;
                <D.29388>:
                D.29390 = &MEM[(void *)"disable-major" + 1B];
                D.29391 = *D.29390;
                D.29392 = (int) D.29391;
                D.29393 = __s2 + 1;
                D.29394 = *D.29393;
                D.29395 = (int) D.29394;
                __result = D.29392 - D.29395;
                D.29396 = __s2_len > 1;
                D.29386 = __result == 0;
                D.29397 = D.29396 & D.29386;
                if (D.29397 != 0) goto <D.29398>; else goto <D.29399>;
                <D.29398>:
                D.29400 = &MEM[(void *)"disable-major" + 2B];
                D.29401 = *D.29400;
                D.29402 = (int) D.29401;
                D.29403 = __s2 + 2;
                D.29404 = *D.29403;
                D.29405 = (int) D.29404;
                __result = D.29402 - D.29405;
                D.29406 = __s2_len > 2;
                D.29386 = __result == 0;
                D.29407 = D.29406 & D.29386;
                if (D.29407 != 0) goto <D.29408>; else goto <D.29409>;
                <D.29408>:
                D.29410 = &MEM[(void *)"disable-major" + 3B];
                D.29411 = *D.29410;
                D.29412 = (int) D.29411;
                D.29413 = __s2 + 3;
                D.29414 = *D.29413;
                D.29415 = (int) D.29414;
                __result = D.29412 - D.29415;
                <D.29409>:
                <D.29399>:
                <D.29389>:
              }
              D.24136 = __result;
            }
            iftmp.487 = -D.24136;
            goto <D.29416>;
            <D.29379>:
            iftmp.487 = __builtin_strcmp (opt, "disable-major");
            <D.29416>:
            D.24137 = iftmp.487;
          }
          if (D.24137 == 0) goto <D.29417>; else goto <D.29418>;
          <D.29417>:
          disable_major_collections = 1;
          goto <D.29419>;
          <D.29418>:
          D.29420 = monoeg_g_str_has_prefix (opt, "heap-dump=");
          if (D.29420 != 0) goto <D.29421>; else goto <D.29422>;
          <D.29421>:
          {
            char * filename;

            D.29423 = __builtin_strchr (opt, 61);
            filename = D.29423 + 1;
            nursery_clear_policy = 0;
            heap_dump_file.488 = fopen (filename, "w");
            heap_dump_file = heap_dump_file.488;
            heap_dump_file.489 = heap_dump_file;
            if (heap_dump_file.489 != 0B) goto <D.29426>; else goto <D.29427>;
            <D.29426>:
            heap_dump_file.489 = heap_dump_file;
            fprintf (heap_dump_file.489, "<sgen-dump>\n");
            do_pin_stats = 1;
            <D.29427>:
          }
          goto <D.29428>;
          <D.29422>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.29429>; else goto <D.29430>;
          <D.29429>:
          // predicted unlikely by continue predictor.
          goto <D.23963>;
          <D.29430>:
          stderr.438 = stderr;
          fprintf (stderr.438, "\n%s must be of the format [<l>[:<filename>]|<option>]+ where <l> is a debug level 0-9.\n", "MONO_GC_DEBUG");
          stderr.438 = stderr;
          fprintf (stderr.438, "Valid <option>s are:\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  collect-before-allocs[=<n>]\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  verify-before-allocs[=<n>]\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  check-at-minor-collections\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  check-mark-bits\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  check-nursery-pinned\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  verify-before-collections\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  verify-nursery-at-minor-gc\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  dump-nursery-at-minor-gc\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  disable-minor\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  disable-major\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  xdomain-checks\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  check-concurrent\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  clear-at-gc\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  clear-nursery-at-gc\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  check-scan-starts\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  no-managed-allocator\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  print-allowance\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  print-pinning\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "  heap-dump=<filename>\n");
          stderr.438 = stderr;
          fprintf (stderr.438, "\n");
          usage_printed = 1;
          <D.29428>:
          <D.29419>:
          <D.29376>:
          <D.29333>:
          <D.29290>:
          <D.29247>:
          <D.29202>:
          <D.29159>:
          <D.29116>:
          <D.29073>:
          <D.29030>:
          <D.28987>:
          <D.28944>:
          <D.28901>:
          <D.28856>:
          <D.28813>:
          <D.28770>:
          <D.28763>:
          <D.28720>:
          <D.28713>:
          <D.28670>:
          <D.28627>:
          <D.28584>:
        }
        <D.23963>:
        ptr = ptr + 4;
        <D.24140>:
        if (ptr != 0B) goto <D.29431>; else goto <D.24141>;
        <D.29431>:
        D.27773 = *ptr;
        if (D.27773 != 0B) goto <D.24139>; else goto <D.24141>;
        <D.24141>:
        monoeg_g_strfreev (opts);
      }
      <D.28538>:
      D.28086 = major_collector.is_parallel;
      if (D.28086 != 0) goto <D.29432>; else goto <D.29433>;
      <D.29432>:
      heap_dump_file.489 = heap_dump_file;
      if (heap_dump_file.489 != 0B) goto <D.29434>; else goto <D.29435>;
      <D.29434>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "Cannot do `heap-dump` with the parallel collector.");
      heap_dump_file.489 = heap_dump_file;
      fclose (heap_dump_file.489);
      heap_dump_file = 0B;
      <D.29435>:
      do_pin_stats.490 = do_pin_stats;
      if (do_pin_stats.490 != 0) goto <D.29437>; else goto <D.29438>;
      <D.29437>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "`print-pinning` is not supported with the parallel collector.");
      do_pin_stats = 0;
      <D.29438>:
      <D.29433>:
      D.29439 = major_collector.post_param_init;
      if (D.29439 != 0B) goto <D.29440>; else goto <D.29441>;
      <D.29440>:
      D.29439 = major_collector.post_param_init;
      D.29439 (&major_collector);
      <D.29441>:
      soft_limit.449 = soft_limit;
      sgen_memgov_init (max_heap, soft_limit.449, debug_print_allowance, allowance_ratio, save_target);
      memset (&remset, 0, 48);
      sgen_card_table_init (&remset);
      gc_initialized = 1;
    }
  finally
    {
      cb = {CLOBBER};
      soft_limit = {CLOBBER};
      dummy = {CLOBBER};
    }
}


is_critical_method (struct MonoMethod * method)
{
  gboolean D.29452;
  int iftmp.491;
  int D.29457;
  int D.29459;

  D.29457 = mono_runtime_is_critical_method (method);
  if (D.29457 != 0) goto <D.29454>; else goto <D.29458>;
  <D.29458>:
  D.29459 = sgen_is_critical_method (method);
  if (D.29459 != 0) goto <D.29454>; else goto <D.29455>;
  <D.29454>:
  iftmp.491 = 1;
  goto <D.29456>;
  <D.29455>:
  iftmp.491 = 0;
  <D.29456>:
  D.29452 = iftmp.491;
  return D.29452;
}


sgen_thread_attach (struct SgenThreadInfo * info)
{
  void * (*<T346d>) (void) D.29461;
  void * D.29464;
  void * D.29467;

  pthread_mutex_lock (&gc_mutex);
  init_stats ();
  sgen_gc_unlock ();
  D.29461 = gc_callbacks.thread_attach_func;
  if (D.29461 != 0B) goto <D.29462>; else goto <D.29463>;
  <D.29462>:
  D.29464 = info->runtime_data;
  if (D.29464 == 0B) goto <D.29465>; else goto <D.29466>;
  <D.29465>:
  D.29461 = gc_callbacks.thread_attach_func;
  D.29467 = D.29461 ();
  info->runtime_data = D.29467;
  <D.29466>:
  <D.29463>:
}


sgen_thread_unregister (struct SgenThreadInfo * p)
{
  struct FILE * gc_debug_file.492;
  unsigned int D.29471;
  void * D.29472;
  void (*<T1b97>) (void *) D.29473;
  void * D.29476;

  if (0 != 0) goto <D.29468>; else goto <D.29469>;
  <D.29468>:
  gc_debug_file.492 = gc_debug_file;
  D.29471 = MEM[(struct MonoThreadInfo *)p].node.key;
  D.29472 = (void *) D.29471;
  fprintf (gc_debug_file.492, "unregister thread %p (%p)\n", p, D.29472);
  gc_debug_file.492 = gc_debug_file;
  fflush (gc_debug_file.492);
  <D.29469>:
  D.29473 = gc_callbacks.thread_detach_func;
  if (D.29473 != 0B) goto <D.29474>; else goto <D.29475>;
  <D.29474>:
  D.29473 = gc_callbacks.thread_detach_func;
  D.29476 = p->runtime_data;
  D.29473 (D.29476);
  p->runtime_data = 0B;
  <D.29475>:
}


sgen_thread_detach (struct SgenThreadInfo * p)
{
  struct MonoDomain * D.29477;
  struct MonoThread * D.29480;

  D.29477 = mono_domain_get ();
  if (D.29477 != 0B) goto <D.29478>; else goto <D.29479>;
  <D.29478>:
  D.29480 = mono_thread_current ();
  mono_thread_detach (D.29480);
  <D.29479>:
}


sgen_thread_register (struct SgenThreadInfo * info, void * addr)
{
  struct MonoContext * D.29481;
  long unsigned int D.29482;
  void * sstart.493;
  unsigned int size.494;
  void * D.29485;
  void * stack_end.495;
  struct FILE * gc_debug_file.496;
  unsigned int D.29490;
  void * D.29491;
  void * (*<T346d>) (void) D.29492;
  void * D.29495;
  void * D.29496;

  sgen_thread_info = info;
  info->stop_count = 4294967295;
  info->signal = 0;
  info->skip = 0;
  info->stack_start = 0B;
  info->stopped_ip = 0B;
  info->stopped_domain = 0B;
  D.29481 = &info->ctx;
  memset (D.29481, 0, 208);
  sgen_init_tlab_info (info);
  {
    size_t size;
    void * sstart;
    union pthread_attr_t attr;

    try
      {
        D.29482 = pthread_self ();
        pthread_getattr_np (D.29482, &attr);
        pthread_attr_getstack (&attr, &sstart, &size);
        sstart.493 = sstart;
        info->stack_start_limit = sstart.493;
        sstart.493 = sstart;
        size.494 = size;
        D.29485 = sstart.493 + size.494;
        info->stack_end = D.29485;
        pthread_attr_destroy (&attr);
      }
    finally
      {
        size = {CLOBBER};
        sstart = {CLOBBER};
        attr = {CLOBBER};
      }
  }
  stack_end.495 = info->stack_end;
  stack_end = stack_end.495;
  if (0 != 0) goto <D.29487>; else goto <D.29488>;
  <D.29487>:
  gc_debug_file.496 = gc_debug_file;
  D.29490 = MEM[(struct MonoThreadInfo *)info].node.key;
  D.29491 = (void *) D.29490;
  stack_end.495 = info->stack_end;
  fprintf (gc_debug_file.496, "registered thread %p (%p) stack end %p\n", info, D.29491, stack_end.495);
  gc_debug_file.496 = gc_debug_file;
  fflush (gc_debug_file.496);
  <D.29488>:
  D.29492 = gc_callbacks.thread_attach_func;
  if (D.29492 != 0B) goto <D.29493>; else goto <D.29494>;
  <D.29493>:
  D.29492 = gc_callbacks.thread_attach_func;
  D.29495 = D.29492 ();
  info->runtime_data = D.29495;
  <D.29494>:
  D.29496 = info;
  return D.29496;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.29498;
  unsigned int comp.497;
  unsigned int exch.498;
  unsigned int D.29501;

  comp.497 = (unsigned int) comp;
  exch.498 = (unsigned int) exch;
  D.29501 = __sync_val_compare_and_swap_4 (dest, comp.497, exch.498);
  D.29498 = (gint32) D.29501;
  return D.29498;
}


init_user_copy_or_mark_key ()
{
  mono_native_tls_alloc (&user_copy_or_mark_key, 0B);
}


mono_native_tls_alloc (pthread_key_t * key, void * destructor)
{
  int D.29503;
  void (*<Tc1>) (void *) destructor.499;
  int D.29505;
  _Bool D.29506;

  destructor.499 = (void (*<Tc1>) (void *)) destructor;
  D.29505 = pthread_key_create (key, destructor.499);
  D.29506 = D.29505 == 0;
  D.29503 = (int) D.29506;
  return D.29503;
}


init_stats ()
{
  int inited.500;
  static gboolean inited = 0;

  inited.500 = inited;
  if (inited.500 != 0) goto <D.29509>; else goto <D.29510>;
  <D.29509>:
  return;
  <D.29510>:
  mono_counters_register ("Minor fragment clear", 519, &time_minor_pre_collection_fragment_clear);
  mono_counters_register ("Minor pinning", 519, &time_minor_pinning);
  mono_counters_register ("Minor scan remembered set", 519, &time_minor_scan_remsets);
  mono_counters_register ("Minor scan pinned", 519, &time_minor_scan_pinned);
  mono_counters_register ("Minor scan registered roots", 519, &time_minor_scan_registered_roots);
  mono_counters_register ("Minor scan thread data", 519, &time_minor_scan_thread_data);
  mono_counters_register ("Minor finish gray stack", 519, &time_minor_finish_gray_stack);
  mono_counters_register ("Minor fragment creation", 519, &time_minor_fragment_creation);
  mono_counters_register ("Major fragment clear", 519, &time_major_pre_collection_fragment_clear);
  mono_counters_register ("Major pinning", 519, &time_major_pinning);
  mono_counters_register ("Major scan pinned", 519, &time_major_scan_pinned);
  mono_counters_register ("Major scan registered roots", 519, &time_major_scan_registered_roots);
  mono_counters_register ("Major scan thread data", 519, &time_major_scan_thread_data);
  mono_counters_register ("Major scan alloc_pinned", 519, &time_major_scan_alloc_pinned);
  mono_counters_register ("Major scan finalized", 519, &time_major_scan_finalized);
  mono_counters_register ("Major scan big objects", 519, &time_major_scan_big_objects);
  mono_counters_register ("Major finish gray stack", 519, &time_major_finish_gray_stack);
  mono_counters_register ("Major free big objects", 519, &time_major_free_bigobjs);
  mono_counters_register ("Major LOS sweep", 519, &time_major_los_sweep);
  mono_counters_register ("Major sweep", 519, &time_major_sweep);
  mono_counters_register ("Major fragment creation", 519, &time_major_fragment_creation);
  mono_counters_register ("Number of pinned objects", 515, &stat_pinned_objects);
  inited = 1;
}


monoeg_strdup (const gchar * str)
{
  gchar * D.29514;

  if (str != 0B) goto <D.29512>; else goto <D.29513>;
  <D.29512>:
  D.29514 = __strdup (str);
  return D.29514;
  <D.29513>:
  D.29514 = 0B;
  return D.29514;
}


parse_double_in_interval (const char * env_var, const char * opt_name, const char * opt, double min, double max, double * result)
{
  char * endptr.501;
  gboolean D.29519;
  char * endptr;
  double val;

  try
    {
      val = strtod (opt, &endptr);
      endptr.501 = endptr;
      if (endptr.501 == opt) goto <D.29517>; else goto <D.29518>;
      <D.29517>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be a number.", opt_name);
      D.29519 = 0;
      return D.29519;
      <D.29518>:
      if (val < min) goto <D.29520>; else goto <D.29522>;
      <D.29522>:
      if (val > max) goto <D.29520>; else goto <D.29521>;
      <D.29520>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be between %.2f - %.2f.", opt_name, min, max);
      D.29519 = 0;
      return D.29519;
      <D.29521>:
      *result = val;
      D.29519 = 1;
      return D.29519;
    }
  finally
    {
      endptr = {CLOBBER};
    }
}


alloc_nursery ()
{
  struct GCMemSection * nursery_section.502;
  int gc_debug_level.503;
  _Bool D.29529;
  long int D.29530;
  long int D.29531;
  struct FILE * gc_debug_file.504;
  int sgen_nursery_size.505;
  long unsigned int sgen_nursery_size.506;
  unsigned int alloc_size.507;
  int D.29538;
  _Bool D.29539;
  long int D.29540;
  long int D.29541;
  void * (*<T369c>) (mword, mword, int) D.29544;
  int sgen_nursery_bits.508;
  unsigned int data.509;
  sizetype sgen_nursery_size.510;
  char * D.29548;
  unsigned int D.29549;
  sizetype alloc_size.511;
  char * D.29553;
  long long int D.29554;
  long unsigned int D.29555;
  char * D.29556;
  int D.29557;
  unsigned int scan_starts.512;
  unsigned int D.29559;
  void * D.29560;
  struct GCMemSection * section;
  char * data;
  int scan_starts;
  int alloc_size;

  nursery_section.502 = nursery_section;
  if (nursery_section.502 != 0B) goto <D.29526>; else goto <D.29527>;
  <D.29526>:
  return;
  <D.29527>:
  gc_debug_level.503 = gc_debug_level;
  D.29529 = gc_debug_level.503 > 1;
  D.29530 = (long int) D.29529;
  D.29531 = __builtin_expect (D.29530, 0);
  if (D.29531 != 0) goto <D.29532>; else goto <D.29533>;
  <D.29532>:
  gc_debug_file.504 = gc_debug_file;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.506 = (long unsigned int) sgen_nursery_size.505;
  fprintf (gc_debug_file.504, "Allocating nursery size: %lu\n", sgen_nursery_size.506);
  gc_debug_file.504 = gc_debug_file;
  fflush (gc_debug_file.504);
  <D.29533>:
  section = sgen_alloc_internal (2);
  alloc_size = sgen_nursery_size;
  alloc_size.507 = (unsigned int) alloc_size;
  D.29538 = sgen_memgov_try_alloc_space (alloc_size.507, 0);
  D.29539 = D.29538 == 0;
  D.29540 = (long int) D.29539;
  D.29541 = __builtin_expect (D.29540, 0);
  if (D.29541 != 0) goto <D.29542>; else goto <D.29543>;
  <D.29542>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1693, "sgen_memgov_try_alloc_space (alloc_size, SPACE_NURSERY)");
  <D.29543>:
  D.29544 = major_collector.alloc_heap;
  alloc_size.507 = (unsigned int) alloc_size;
  alloc_size.507 = (unsigned int) alloc_size;
  sgen_nursery_bits.508 = sgen_nursery_bits;
  data = D.29544 (alloc_size.507, alloc_size.507, sgen_nursery_bits.508);
  data.509 = (unsigned int) data;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.510 = (sizetype) sgen_nursery_size.505;
  D.29548 = data + sgen_nursery_size.510;
  D.29549 = (unsigned int) D.29548;
  sgen_update_heap_boundaries (data.509, D.29549);
  if (0 != 0) goto <D.29550>; else goto <D.29551>;
  <D.29550>:
  gc_debug_file.504 = gc_debug_file;
  alloc_size.511 = (sizetype) alloc_size;
  D.29553 = data + alloc_size.511;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.506 = (long unsigned int) sgen_nursery_size.505;
  D.29554 = mono_gc_get_heap_size ();
  D.29555 = (long unsigned int) D.29554;
  fprintf (gc_debug_file.504, "Expanding nursery size (%p-%p): %lu, total: %lu\n", data, D.29553, sgen_nursery_size.506, D.29555);
  gc_debug_file.504 = gc_debug_file;
  fflush (gc_debug_file.504);
  <D.29551>:
  section->next_data = data;
  D.29556 = section->next_data;
  section->data = D.29556;
  alloc_size.507 = (unsigned int) alloc_size;
  section->size = alloc_size.507;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.510 = (sizetype) sgen_nursery_size.505;
  D.29548 = data + sgen_nursery_size.510;
  section->end_data = D.29548;
  D.29557 = alloc_size + 8191;
  scan_starts = D.29557 / 8192;
  scan_starts.512 = (unsigned int) scan_starts;
  D.29559 = scan_starts.512 * 4;
  D.29560 = sgen_alloc_internal_dynamic (D.29559, 3, 1);
  section->scan_starts = D.29560;
  scan_starts.512 = (unsigned int) scan_starts;
  section->num_scan_start = scan_starts.512;
  nursery_section = section;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.510 = (sizetype) sgen_nursery_size.505;
  D.29548 = data + sgen_nursery_size.510;
  sgen_nursery_allocator_set_nursery_bounds (data, D.29548);
}


atoi (const char * __nptr)
{
  int D.29562;

  D.29562 = strtol (__nptr, 0B, 10);
  return D.29562;
}


mono_gc_get_gc_name ()
{
  const char * D.29564;

  D.29564 = "sgen";
  return D.29564;
}


sgen_is_critical_method (struct MonoMethod * method)
{
  gboolean D.29566;
  int iftmp.513;
  struct MonoMethod * write_barrier_method.514;
  int D.29573;

  write_barrier_method.514 = write_barrier_method;
  if (method == write_barrier_method.514) goto <D.29568>; else goto <D.29572>;
  <D.29572>:
  D.29573 = sgen_is_managed_allocator (method);
  if (D.29573 != 0) goto <D.29568>; else goto <D.29569>;
  <D.29568>:
  iftmp.513 = 1;
  goto <D.29570>;
  <D.29569>:
  iftmp.513 = 0;
  <D.29570>:
  D.29566 = iftmp.513;
  return D.29566;
}


sgen_has_critical_method ()
{
  gboolean D.29575;
  int iftmp.515;
  struct MonoMethod * write_barrier_method.516;
  int D.29582;

  write_barrier_method.516 = write_barrier_method;
  if (write_barrier_method.516 != 0B) goto <D.29577>; else goto <D.29581>;
  <D.29581>:
  D.29582 = sgen_has_managed_allocator ();
  if (D.29582 != 0) goto <D.29577>; else goto <D.29578>;
  <D.29577>:
  iftmp.515 = 1;
  goto <D.29579>;
  <D.29578>:
  iftmp.515 = 0;
  <D.29579>:
  D.29575 = iftmp.515;
  return D.29575;
}


mono_gc_get_write_barrier ()
{
  _Bool D.29584;
  long int D.29585;
  long int D.29586;
  struct MonoMethod * write_barrier_method.517;
  struct MonoMethod * D.29592;
  struct MonoImage * D.29593;
  struct MonoClass * D.29594;
  struct MonoType * D.29595;
  struct MonoClass * D.29596;
  struct MonoType * D.29597;
  struct MonoClass * D.29598;
  guint8 * sgen_cardtable.518;
  int D.29600;
  unsigned int D.29603;
  struct MonoMethod * res;
  struct MonoMethodBuilder * mb;
  struct MonoMethodSignature * sig;
  int i;
  int nursery_check_labels[3];
  int stack_end_offset;

  try
    {
      stack_end_offset = -1;
      __asm__("	ldr	%0, 1f; b 2f; 1: .word stack_end(tpoff); 2:" : "=r" stack_end_offset);
      D.29584 = stack_end_offset == -1;
      D.29585 = (long int) D.29584;
      D.29586 = __builtin_expect (D.29585, 0);
      if (D.29586 != 0) goto <D.29587>; else goto <D.29588>;
      <D.29587>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5450, "stack_end_offset != -1");
      <D.29588>:
      write_barrier_method.517 = write_barrier_method;
      if (write_barrier_method.517 != 0B) goto <D.29590>; else goto <D.29591>;
      <D.29590>:
      D.29592 = write_barrier_method;
      return D.29592;
      <D.29591>:
      D.29593 = mono_defaults.corlib;
      sig = mono_metadata_signature_alloc (D.29593, 1);
      D.29594 = mono_defaults.void_class;
      D.29595 = &D.29594->byval_arg;
      sig->ret = D.29595;
      D.29596 = mono_defaults.int_class;
      D.29597 = &D.29596->byval_arg;
      sig->params[0] = D.29597;
      D.29598 = mono_defaults.object_class;
      mb = mono_mb_new (D.29598, "wbarrier", 24);
      emit_nursery_check (mb, &nursery_check_labels);
      sgen_cardtable.518 = sgen_cardtable;
      mono_mb_emit_ptr (mb, sgen_cardtable.518);
      mono_mb_emit_ldarg (mb, 0);
      mono_mb_emit_icon (mb, 9);
      mono_mb_emit_byte (mb, 100);
      mono_mb_emit_byte (mb, 88);
      mono_mb_emit_icon (mb, 1);
      mono_mb_emit_byte (mb, 82);
      i = 0;
      goto <D.24166>;
      <D.24165>:
      D.29600 = nursery_check_labels[i];
      if (D.29600 != 0) goto <D.29601>; else goto <D.29602>;
      <D.29601>:
      D.29600 = nursery_check_labels[i];
      D.29603 = (unsigned int) D.29600;
      mono_mb_patch_branch (mb, D.29603);
      <D.29602>:
      i = i + 1;
      <D.24166>:
      if (i <= 2) goto <D.24165>; else goto <D.24167>;
      <D.24167>:
      mono_mb_emit_byte (mb, 42);
      res = mono_mb_create_method (mb, sig, 16);
      mono_mb_free (mb);
      pthread_mutex_lock (&gc_mutex);
      write_barrier_method.517 = write_barrier_method;
      if (write_barrier_method.517 != 0B) goto <D.29604>; else goto <D.29605>;
      <D.29604>:
      mono_free_method (res);
      goto <D.29606>;
      <D.29605>:
      mono_memory_barrier ();
      write_barrier_method = res;
      <D.29606>:
      sgen_gc_unlock ();
      D.29592 = write_barrier_method;
      return D.29592;
    }
  finally
    {
      nursery_check_labels = {CLOBBER};
    }
}


emit_nursery_check (struct MonoMethodBuilder * mb, int * nursery_check_return_labels)
{
  int sgen_nursery_bits.519;
  char * D.29610;
  unsigned int D.29611;
  unsigned int D.29612;
  int D.29613;
  unsigned int D.29614;
  int D.29615;
  int D.29616;
  char * D.29619;
  unsigned int D.29620;
  unsigned int D.29621;
  int D.29622;
  int * D.29623;
  unsigned int D.29624;
  int D.29625;

  memset (nursery_check_return_labels, 0, 12);
  mono_mb_emit_ldarg (mb, 0);
  sgen_nursery_bits.519 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.519);
  mono_mb_emit_byte (mb, 100);
  D.29610 = sgen_get_nursery_start ();
  D.29611 = (unsigned int) D.29610;
  sgen_nursery_bits.519 = sgen_nursery_bits;
  D.29612 = D.29611 >> sgen_nursery_bits.519;
  D.29613 = (int) D.29612;
  mono_mb_emit_icon (mb, D.29613);
  D.29614 = mono_mb_emit_branch (mb, 59);
  D.29615 = (int) D.29614;
  *nursery_check_return_labels = D.29615;
  D.29616 = major_collector.is_concurrent;
  if (D.29616 == 0) goto <D.29617>; else goto <D.29618>;
  <D.29617>:
  mono_mb_emit_ldarg (mb, 0);
  mono_mb_emit_byte (mb, 77);
  sgen_nursery_bits.519 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.519);
  mono_mb_emit_byte (mb, 100);
  D.29619 = sgen_get_nursery_start ();
  D.29620 = (unsigned int) D.29619;
  sgen_nursery_bits.519 = sgen_nursery_bits;
  D.29621 = D.29620 >> sgen_nursery_bits.519;
  D.29622 = (int) D.29621;
  mono_mb_emit_icon (mb, D.29622);
  D.29623 = nursery_check_return_labels + 4;
  D.29624 = mono_mb_emit_branch (mb, 64);
  D.29625 = (int) D.29624;
  *D.29623 = D.29625;
  <D.29618>:
}


mono_gc_get_description ()
{
  char * D.29626;

  D.29626 = monoeg_strdup ("sgen");
  return D.29626;
}


mono_gc_set_desktop_mode ()
{

}


mono_gc_is_moving ()
{
  gboolean D.29628;

  D.29628 = 1;
  return D.29628;
}


mono_gc_is_disabled ()
{
  gboolean D.29630;

  D.29630 = 0;
  return D.29630;
}


sgen_get_nursery_clear_policy ()
{
  NurseryClearPolicy D.29632;

  D.29632 = nursery_clear_policy;
  return D.29632;
}


sgen_get_array_fill_vtable ()
{
  struct MonoVTable * array_fill_vtable.520;
  _Bool D.29637;
  long int D.29638;
  long int D.29639;
  struct MonoClass * D.29642;
  void * D.29643;
  struct MonoVTable * D.29644;

  array_fill_vtable.520 = array_fill_vtable;
  if (array_fill_vtable.520 == 0B) goto <D.29635>; else goto <D.29636>;
  <D.29635>:
  {
    static struct MonoClass klass;
    static struct MonoVTable vtable;
    gsize bmap;
    struct MonoDomain * domain;

    try
      {
        domain = mono_get_root_domain ();
        D.29637 = domain == 0B;
        D.29638 = (long int) D.29637;
        D.29639 = __builtin_expect (D.29638, 0);
        if (D.29639 != 0) goto <D.29640>; else goto <D.29641>;
        <D.29640>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5574, "domain");
        <D.29641>:
        D.29642 = mono_defaults.byte_class;
        klass.element_class = D.29642;
        klass.rank = 1;
        klass.instance_size = 16;
        klass.sizes.element_size = 1;
        klass.name = "array_filler_type";
        vtable.klass = &klass;
        bmap = 0;
        D.29643 = mono_gc_make_descr_for_array (1, &bmap, 0, 1);
        vtable.gc_descr = D.29643;
        vtable.rank = 1;
        array_fill_vtable = &vtable;
      }
    finally
      {
        bmap = {CLOBBER};
      }
  }
  <D.29636>:
  D.29644 = array_fill_vtable;
  return D.29644;
}


sgen_gc_lock ()
{
  pthread_mutex_lock (&gc_mutex);
}


sgen_gc_unlock ()
{
  gboolean try_free;

  try_free = sgen_try_free_some_memory;
  sgen_try_free_some_memory = 0;
  pthread_mutex_unlock (&gc_mutex);
  if (try_free != 0) goto <D.29646>; else goto <D.29647>;
  <D.29646>:
  mono_thread_hazardous_try_free_some ();
  <D.29647>:
}


sgen_major_collector_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  void (*<T36c4>) (void (*sgen_cardtable_block_callback) (mword, mword)) D.29648;

  D.29648 = major_collector.iterate_live_block_ranges;
  D.29648 (callback);
}


sgen_major_collector_scan_card_table (struct SgenGrayQueue * queue)
{
  void (*<T36c0>) (gboolean, struct SgenGrayQueue *) D.29649;

  D.29649 = major_collector.scan_card_table;
  D.29649 (0, queue);
}


sgen_get_major_collector ()
{
  struct SgenMajorCollector * D.29650;

  D.29650 = &major_collector;
  return D.29650;
}


mono_gc_set_skip_thread (gboolean skip)
{
  struct SgenThreadInfo * info;

  info = mono_thread_info_current ();
  pthread_mutex_lock (&gc_mutex);
  info->gc_disabled = skip;
  sgen_gc_unlock ();
}


sgen_get_remset ()
{
  struct SgenRemeberedSet * D.29652;

  D.29652 = &remset;
  return D.29652;
}


mono_gc_get_vtable_bits (struct MonoClass * class)
{
  int D.29654;
  int D.29657;
  guint D.29660;

  D.29654 = sgen_need_bridge_processing ();
  if (D.29654 != 0) goto <D.29655>; else goto <D.29656>;
  <D.29655>:
  D.29657 = sgen_is_bridge_class (class);
  if (D.29657 != 0) goto <D.29658>; else goto <D.29659>;
  <D.29658>:
  D.29660 = 1;
  return D.29660;
  <D.29659>:
  <D.29656>:
  D.29660 = 0;
  return D.29660;
}


mono_gc_register_altstack (void * stack, gint32 stack_size, void * altstack, gint32 altstack_size)
{

}


sgen_check_whole_heap_stw ()
{
  sgen_stop_world (0);
  sgen_clear_nursery_fragments ();
  sgen_check_whole_heap (0);
  sgen_restart_world (0, 0B);
}


sgen_gc_event_moves ()
{
  int moved_objects_idx.521;

  moved_objects_idx.521 = moved_objects_idx;
  if (moved_objects_idx.521 != 0) goto <D.29663>; else goto <D.29664>;
  <D.29663>:
  moved_objects_idx.521 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.521);
  moved_objects_idx = 0;
  <D.29664>:
}


