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

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


safe_name (void * obj)
{
  long unsigned int D.22035;
  long unsigned int D.22036;
  const char * D.22037;
  struct MonoClass * D.22038;
  struct MonoVTable * vt;

  D.22035 = MEM[(mword *)obj];
  D.22036 = D.22035 & 18446744073709551612;
  vt = (struct MonoVTable *) D.22036;
  D.22038 = vt->klass;
  D.22037 = D.22038->name;
  return D.22037;
}


sgen_scan_area_with_callback (char * start, char * end, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data, gboolean allow_flags)
{
  void * D.22040;
  char * iftmp.0;
  long unsigned int D.22046;
  long unsigned int D.22047;
  long unsigned int D.22050;
  unsigned int D.22055;
  unsigned int D.22056;
  long unsigned int D.22057;
  long unsigned int D.22058;
  long unsigned int D.22059;
  struct MonoVTable * D.22060;
  struct MonoVTable * array_fill_vtable.1;

  goto <D.20297>;
  <D.20298>:
  {
    size_t size;
    char * obj;

    D.22040 = MEM[(void * *)start];
    if (D.22040 == 0B) goto <D.22041>; else goto <D.22042>;
    <D.22041>:
    start = start + 8;
    // predicted unlikely by continue predictor.
    goto <D.20297>;
    <D.22042>:
    if (allow_flags != 0) goto <D.22043>; else goto <D.22044>;
    <D.22043>:
    D.22046 = MEM[(mword *)start];
    D.22047 = D.22046 & 1;
    if (D.22047 != 0) goto <D.22048>; else goto <D.22049>;
    <D.22048>:
    D.22046 = MEM[(mword *)start];
    D.22050 = D.22046 & 18446744073709551612;
    iftmp.0 = (char *) D.22050;
    goto <D.22051>;
    <D.22049>:
    iftmp.0 = 0B;
    <D.22051>:
    obj = iftmp.0;
    if (obj == 0B) goto <D.22052>; else goto <D.22053>;
    <D.22052>:
    obj = start;
    <D.22053>:
    goto <D.22054>;
    <D.22044>:
    obj = start;
    <D.22054>:
    D.22055 = sgen_safe_object_get_size (obj);
    D.22056 = D.22055 + 7;
    D.22057 = (long unsigned int) D.22056;
    size = D.22057 & 4294967288;
    D.22058 = MEM[(mword *)obj];
    D.22059 = D.22058 & 18446744073709551612;
    D.22060 = (struct MonoVTable *) D.22059;
    array_fill_vtable.1 = array_fill_vtable;
    if (D.22060 != array_fill_vtable.1) goto <D.22062>; else goto <D.22063>;
    <D.22062>:
    callback (obj, size, data);
    <D.22063>:
    start = start + size;
  }
  <D.20297>:
  if (start < end) goto <D.20298>; else goto <D.20299>;
  <D.20299>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.2;
  long unsigned int D.22065;
  long unsigned int D.22066;
  long unsigned int D.22069;
  guint D.22073;
  struct MonoVTable * D.22074;
  char * forwarded;

  D.22065 = MEM[(mword *)obj];
  D.22066 = D.22065 & 1;
  if (D.22066 != 0) goto <D.22067>; else goto <D.22068>;
  <D.22067>:
  D.22065 = MEM[(mword *)obj];
  D.22069 = D.22065 & 18446744073709551612;
  iftmp.2 = (char *) D.22069;
  goto <D.22070>;
  <D.22068>:
  iftmp.2 = 0B;
  <D.22070>:
  forwarded = iftmp.2;
  if (forwarded != 0B) goto <D.22071>; else goto <D.22072>;
  <D.22071>:
  obj = forwarded;
  <D.22072>:
  D.22065 = MEM[(mword *)obj];
  D.22069 = D.22065 & 18446744073709551612;
  D.22074 = (struct MonoVTable *) D.22069;
  D.22073 = sgen_par_object_get_size (D.22074, obj);
  return D.22073;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.22076;
  long unsigned int D.22077;
  guint D.22082;
  int D.22083;
  int D.22084;
  unsigned int D.22085;
  long unsigned int D.22088;
  int D.22089;
  unsigned int D.22090;
  unsigned int element_size.3;
  unsigned int D.22092;
  long unsigned int D.22093;
  long unsigned int D.22094;
  struct MonoClass * D.22097;
  unsigned char D.22098;
  long unsigned int D.22099;
  long unsigned int D.22100;
  mword descr;
  mword type;

  D.22076 = vtable->gc_descr;
  descr = (mword) D.22076;
  type = descr & 7;
  D.22077 = type + 18446744073709551615;
  if (D.22077 <= 1) goto <D.22078>; else goto <D.22079>;
  <D.22078>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.22080>; else goto <D.22081>;
    <D.22080>:
    D.22083 = MEM[(struct MonoString *)o].length;
    D.22084 = D.22083 * 2;
    D.22085 = (unsigned int) D.22084;
    D.22082 = D.22085 + 26;
    return D.22082;
    <D.22081>:
    D.22082 = (guint) size;
    return D.22082;
  }
  <D.22079>:
  if (type == 4) goto <D.22086>; else goto <D.22087>;
  <D.22086>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.22088 = descr >> 3;
    D.22089 = (int) D.22088;
    element_size = D.22089 & 1023;
    array = o;
    D.22090 = array->max_length;
    element_size.3 = (unsigned int) element_size;
    D.22092 = D.22090 * element_size.3;
    D.22093 = (long unsigned int) D.22092;
    size = D.22093 + 32;
    D.22094 = descr & 8192;
    if (D.22094 != 0) goto <D.22095>; else goto <D.22096>;
    <D.22095>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.22097 = vtable->klass;
    D.22098 = D.22097->rank;
    D.22099 = (long unsigned int) D.22098;
    D.22100 = D.22099 * 8;
    size = D.22100 + size;
    <D.22096>:
    D.22082 = (guint) size;
    return D.22082;
  }
  <D.22087>:
  D.22082 = slow_object_get_size (vtable, o);
  return D.22082;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.22102;
  guint D.22105;
  int D.22106;
  int D.22107;
  unsigned int D.22108;
  unsigned char D.22109;
  int D.22112;
  unsigned int D.22113;
  unsigned int D.22114;
  unsigned int D.22115;
  long unsigned int D.22116;
  struct MonoArrayBounds * D.22117;
  _Bool D.22118;
  long int D.22119;
  long int D.22120;
  long unsigned int D.22123;
  long unsigned int D.22124;
  int D.22125;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.22102 = mono_defaults.string_class;
  if (D.22102 == klass) goto <D.22103>; else goto <D.22104>;
  <D.22103>:
  D.22106 = MEM[(struct MonoString *)o].length;
  D.22107 = D.22106 * 2;
  D.22108 = (unsigned int) D.22107;
  D.22105 = D.22108 + 26;
  return D.22105;
  <D.22104>:
  D.22109 = klass->rank;
  if (D.22109 != 0) goto <D.22110>; else goto <D.22111>;
  <D.22110>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.22112 = klass->sizes.element_size;
    D.22113 = (unsigned int) D.22112;
    D.22114 = array->max_length;
    D.22115 = D.22113 * D.22114;
    D.22116 = (long unsigned int) D.22115;
    size = D.22116 + 32;
    D.22117 = array->bounds;
    D.22118 = D.22117 != 0B;
    D.22119 = (long int) D.22118;
    D.22120 = __builtin_expect (D.22119, 0);
    if (D.22120 != 0) goto <D.22121>; else goto <D.22122>;
    <D.22121>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.22109 = klass->rank;
    D.22123 = (long unsigned int) D.22109;
    D.22124 = D.22123 * 8;
    size = D.22124 + size;
    <D.22122>:
    D.22105 = (guint) size;
    return D.22105;
  }
  <D.22111>:
  D.22125 = klass->instance_size;
  D.22105 = (guint) D.22125;
  return D.22105;
}


mono_gc_scan_for_specific_ref (struct MonoObject * key, gboolean precise)
{
  struct GCMemSection * nursery_section.4;
  char * D.22128;
  char * D.22129;
  void (*<T2cf5>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22130;
  long unsigned int D.22131;
  long unsigned int D.22132;
  void * D.22133;
  char * D.22134;
  struct SgenHashTableEntry * D.22135;
  unsigned int D.22136;
  void * * ptr;
  struct RootRecord * root;

  scan_object_for_specific_ref_precise = precise;
  nursery_section.4 = nursery_section;
  D.22128 = nursery_section.4->end_data;
  nursery_section.4 = nursery_section;
  D.22129 = nursery_section.4->data;
  sgen_scan_area_with_callback (D.22129, D.22128, scan_object_for_specific_ref_callback, key, 1);
  D.22130 = major_collector.iterate_objects;
  D.22130 (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.20374>;
    <D.20373>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22131 = (long unsigned int) __i;
      D.22132 = D.22131 * 8;
      __iter = __table + D.22132;
      goto <D.20371>;
      <D.20370>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        ptr = __entry->key;
        root = &__entry->data;
        goto <D.20368>;
        <D.20367>:
        D.22133 = *ptr;
        check_root_obj_specific_ref (root, D.22133, key);
        ptr = ptr + 8;
        <D.20368>:
        D.22134 = root->end_root;
        if (D.22134 > ptr) goto <D.20367>; else goto <D.20369>;
        <D.20369>:
      }
      __iter = __next;
      <D.20371>:
      D.22135 = *__iter;
      if (D.22135 != 0B) goto <D.20370>; else goto <D.20372>;
      <D.20372>:
    }
    __i = __i + 1;
    <D.20374>:
    D.22136 = roots_hash[1].size;
    if (D.22136 > __i) goto <D.20373>; else goto <D.20375>;
    <D.20375>:
  }
}


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;
  long unsigned int D.22138;
  long unsigned int D.22139;
  long unsigned int D.22142;
  int scan_object_for_specific_ref_precise.6;
  long unsigned int D.22149;
  long unsigned int D.22150;
  long unsigned int D.22153;
  long unsigned int D.22154;
  long unsigned int D.22155;
  long unsigned int D.22156;
  long unsigned int D.22157;
  long unsigned int D.22158;
  void * D.22159;
  long int _objptr.7;
  long int start.8;
  long int D.22164;
  const char * D.22165;
  const char * D.22168;
  long unsigned int D.22169;
  long unsigned int D.22170;
  int D.22171;
  void * D.22172;
  long int _objptr.9;
  long int D.22176;
  const char * D.22177;
  long unsigned int D.22178;
  long unsigned int D.22179;
  int D.22180;
  const char * D.22183;
  long unsigned int D.22184;
  long unsigned int D.22187;
  int D.22188;
  int D.22189;
  unsigned int D.22192;
  unsigned int el_size.10;
  unsigned int D.22194;
  sizetype D.22195;
  void * D.22196;
  long int p.11;
  long int D.22200;
  const char * D.22201;
  int D.22205;
  int D.22206;
  long unsigned int D.22207;
  long unsigned int D.22208;
  long unsigned int D.22209;
  long unsigned int D.22210;
  void * * D.22211;
  void * D.22212;
  char * D.22215;
  long int D.22216;
  long int D.22217;
  const char * D.22218;
  sizetype D.22219;
  long unsigned int D.22223;
  void * D.22226;
  long int p.12;
  long int D.22230;
  const char * D.22231;
  long unsigned int D.22232;
  void * D.22235;
  long int _objptr.13;
  long int D.22239;
  const char * D.22240;
  long unsigned int D.22241;
  unsigned int D.22242;
  unsigned int D.22243;
  struct MonoVTable * D.22246;
  struct MonoClass * D.22247;
  const char * D.22248;
  const char * D.22249;
  gsize * bitmap_data.14;
  long unsigned int D.22251;
  void * D.22254;
  long int _objptr.15;
  long int D.22258;
  const char * D.22259;
  int bwords.16;
  long unsigned int D.22261;
  gsize * mbitmap_data.17;
  long unsigned int D.22263;
  unsigned int D.22264;
  unsigned int D.22265;
  struct MonoClass * D.22266;
  unsigned int el_size.18;
  unsigned int D.22268;
  sizetype D.22269;
  const char * D.22272;
  const char * D.22273;
  gsize * bitmap_data.19;
  long unsigned int D.22275;
  void * D.22278;
  long int _objptr.20;
  long int D.22282;
  const char * D.22283;
  unsigned int bwords.21;
  sizetype D.22285;
  unsigned int D.22287;
  long unsigned int D.22288;
  long unsigned int D.22289;
  mword * D.22290;
  long unsigned int D.22291;
  long unsigned int key.22;
  const char * D.22295;
  long unsigned int D.22296;
  char * forwarded;

  D.22138 = MEM[(mword *)start];
  D.22139 = D.22138 & 1;
  if (D.22139 != 0) goto <D.22140>; else goto <D.22141>;
  <D.22140>:
  D.22138 = MEM[(mword *)start];
  D.22142 = D.22138 & 18446744073709551612;
  iftmp.5 = (char *) D.22142;
  goto <D.22143>;
  <D.22141>:
  iftmp.5 = 0B;
  <D.22143>:
  forwarded = iftmp.5;
  if (forwarded != 0B) goto <D.22144>; else goto <D.22145>;
  <D.22144>:
  start = forwarded;
  <D.22145>:
  scan_object_for_specific_ref_precise.6 = scan_object_for_specific_ref_precise;
  if (scan_object_for_specific_ref_precise.6 != 0) goto <D.22147>; else goto <D.22148>;
  <D.22147>:
  {
    struct GCVTable * vt;
    mword desc;

    D.22138 = MEM[(mword *)start];
    D.22142 = D.22138 & 18446744073709551612;
    vt = (struct GCVTable *) D.22142;
    desc = vt->desc;
    D.22149 = desc & 7;
    switch (D.22149) <default: <D.20281>, case 1: <D.20196>, case 2: <D.20203>, case 3: <D.20247>, case 4: <D.20211>, case 5: <D.20241>, case 6: <D.20260>, case 7: <D.20280>>
    <D.20196>:
    D.22150 = desc & 4294901760;
    if (D.22150 != 0) goto <D.22151>; else goto <D.22152>;
    <D.22151>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.22153 = desc >> 16;
      D.22154 = D.22153 & 255;
      D.22155 = D.22154 * 8;
      _objptr = _objptr + D.22155;
      D.22156 = desc >> 24;
      D.22157 = D.22156 & 255;
      D.22158 = D.22157 * 8;
      _objptr_end = _objptr + D.22158;
      D.22159 = *_objptr;
      if (D.22159 == key) goto <D.22160>; else goto <D.22161>;
      <D.22160>:
      _objptr.7 = (long int) _objptr;
      start.8 = (long int) start;
      D.22164 = _objptr.7 - start.8;
      D.22165 = safe_name (start);
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22165, D.22164);
      <D.22161>:
      _objptr = _objptr + 8;
      goto <D.20200>;
      <D.20199>:
      D.22159 = *_objptr;
      if (D.22159 == key) goto <D.22166>; else goto <D.22167>;
      <D.22166>:
      _objptr.7 = (long int) _objptr;
      start.8 = (long int) start;
      D.22164 = _objptr.7 - start.8;
      D.22168 = safe_name (start);
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22168, D.22164);
      <D.22167>:
      _objptr = _objptr + 8;
      <D.20200>:
      if (_objptr < _objptr_end) goto <D.20199>; else goto <D.20201>;
      <D.20201>:
    }
    <D.22152>:
    goto <D.20202>;
    <D.20203>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.22169 = (long unsigned int) _index;
        D.22170 = D.22169 * 8;
        _objptr = _objptr + D.22170;
        D.22171 = _index + 1;
        _bmap = _bmap >> D.22171;
        D.22172 = *_objptr;
        if (D.22172 == key) goto <D.22173>; else goto <D.22174>;
        <D.22173>:
        _objptr.9 = (long int) _objptr;
        start.8 = (long int) start;
        D.22176 = _objptr.9 - start.8;
        D.22177 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22177, D.22176);
        <D.22174>:
        _objptr = _objptr + 8;
      }
      goto <D.20209>;
      <D.20208>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.22178 = (long unsigned int) _index;
        D.22179 = D.22178 * 8;
        _objptr = _objptr + D.22179;
        D.22180 = _index + 1;
        _bmap = _bmap >> D.22180;
        D.22172 = *_objptr;
        if (D.22172 == key) goto <D.22181>; else goto <D.22182>;
        <D.22181>:
        _objptr.9 = (long int) _objptr;
        start.8 = (long int) start;
        D.22176 = _objptr.9 - start.8;
        D.22183 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22183, D.22176);
        <D.22182>:
        _objptr = _objptr + 8;
      }
      <D.20209>:
      if (_bmap != 0) goto <D.20208>; else goto <D.20210>;
      <D.20210>:
    }
    goto <D.20202>;
    <D.20211>:
    D.22184 = desc & 4294950912;
    if (D.22184 != 0) goto <D.22185>; else goto <D.22186>;
    <D.22185>:
    {
      int el_size;
      int etype;

      D.22187 = desc >> 3;
      D.22188 = (int) D.22187;
      el_size = D.22188 & 1023;
      D.22189 = (int) desc;
      etype = D.22189 & 49152;
      if (etype == 16384) goto <D.22190>; else goto <D.22191>;
      <D.22190>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.22192 = MEM[(struct MonoArray *)start].max_length;
        el_size.10 = (unsigned int) el_size;
        D.22194 = D.22192 * el_size.10;
        D.22195 = (sizetype) D.22194;
        end_refs = p + D.22195;
        goto <D.20217>;
        <D.20216>:
        D.22196 = *p;
        if (D.22196 == key) goto <D.22197>; else goto <D.22198>;
        <D.22197>:
        p.11 = (long int) p;
        start.8 = (long int) start;
        D.22200 = p.11 - start.8;
        D.22201 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22201, D.22200);
        <D.22198>:
        p = p + 8;
        <D.20217>:
        if (p < end_refs) goto <D.20216>; else goto <D.20218>;
        <D.20218>:
      }
      goto <D.22202>;
      <D.22191>:
      if (etype == 32768) goto <D.22203>; else goto <D.22204>;
      <D.22203>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.22153 = desc >> 16;
        D.22205 = (int) D.22153;
        offset = D.22205 & 255;
        D.22156 = desc >> 24;
        D.22206 = (int) D.22156;
        num_refs = D.22206 & 255;
        e_start = start + 32;
        D.22192 = MEM[(struct MonoArray *)start].max_length;
        el_size.10 = (unsigned int) el_size;
        D.22194 = D.22192 * el_size.10;
        D.22195 = (sizetype) D.22194;
        e_end = e_start + D.22195;
        goto <D.20229>;
        <D.20228>:
        {
          void * * p;
          int i;

          p = e_start;
          D.22207 = (long unsigned int) offset;
          D.22208 = D.22207 * 8;
          p = p + D.22208;
          i = 0;
          goto <D.20226>;
          <D.20225>:
          D.22209 = (long unsigned int) i;
          D.22210 = D.22209 * 8;
          D.22211 = p + D.22210;
          D.22212 = *D.22211;
          if (D.22212 == key) goto <D.22213>; else goto <D.22214>;
          <D.22213>:
          D.22209 = (long unsigned int) i;
          D.22210 = D.22209 * 8;
          D.22215 = p + D.22210;
          D.22216 = (long int) D.22215;
          start.8 = (long int) start;
          D.22217 = D.22216 - start.8;
          D.22218 = safe_name (start);
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22218, D.22217);
          <D.22214>:
          i = i + 1;
          <D.20226>:
          if (i < num_refs) goto <D.20225>; else goto <D.20227>;
          <D.20227>:
          D.22219 = (sizetype) el_size;
          e_start = e_start + D.22219;
        }
        <D.20229>:
        if (e_start < e_end) goto <D.20228>; else goto <D.20230>;
        <D.20230>:
      }
      goto <D.22220>;
      <D.22204>:
      if (etype == 49152) goto <D.22221>; else goto <D.22222>;
      <D.22221>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.22192 = MEM[(struct MonoArray *)start].max_length;
        el_size.10 = (unsigned int) el_size;
        D.22194 = D.22192 * el_size.10;
        D.22195 = (sizetype) D.22194;
        e_end = e_start + D.22195;
        goto <D.20239>;
        <D.20238>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20236>;
          <D.20235>:
          D.22223 = _bmap & 1;
          if (D.22223 != 0) goto <D.22224>; else goto <D.22225>;
          <D.22224>:
          D.22226 = *p;
          if (D.22226 == key) goto <D.22227>; else goto <D.22228>;
          <D.22227>:
          p.12 = (long int) p;
          start.8 = (long int) start;
          D.22230 = p.12 - start.8;
          D.22231 = safe_name (start);
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22231, D.22230);
          <D.22228>:
          <D.22225>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20236>:
          if (_bmap != 0) goto <D.20235>; else goto <D.20237>;
          <D.20237>:
          D.22219 = (sizetype) el_size;
          e_start = e_start + D.22219;
        }
        <D.20239>:
        if (e_start < e_end) goto <D.20238>; else goto <D.20240>;
        <D.20240>:
      }
      <D.22222>:
      <D.22220>:
      <D.22202>:
    }
    <D.22186>:
    goto <D.20202>;
    <D.20241>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20245>;
      <D.20244>:
      D.22232 = _bmap & 1;
      if (D.22232 != 0) goto <D.22233>; else goto <D.22234>;
      <D.22233>:
      D.22235 = *_objptr;
      if (D.22235 == key) goto <D.22236>; else goto <D.22237>;
      <D.22236>:
      _objptr.13 = (long int) _objptr;
      start.8 = (long int) start;
      D.22239 = _objptr.13 - start.8;
      D.22240 = safe_name (start);
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22240, D.22239);
      <D.22237>:
      <D.22234>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20245>:
      if (_bmap != 0) goto <D.20244>; else goto <D.20246>;
      <D.20246>:
    }
    goto <D.20202>;
    <D.20247>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.22241 = *bitmap_data;
      D.22242 = (unsigned int) D.22241;
      D.22243 = D.22242 + 4294967295;
      bwords = (int) D.22243;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.22244>; else goto <D.22245>;
      <D.22244>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.22246 = myobj->vtable;
        D.22247 = D.22246->klass;
        D.22248 = D.22247->name;
        D.22246 = myobj->vtable;
        D.22247 = D.22246->klass;
        D.22249 = D.22247->name_space;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.22249, D.22248);
      }
      <D.22245>:
      goto <D.20258>;
      <D.20257>:
      {
        gsize _bmap;

        bitmap_data.14 = bitmap_data;
        bitmap_data = bitmap_data.14 + 8;
        _bmap = *bitmap_data.14;
        _objptr = start_run;
        goto <D.20255>;
        <D.20254>:
        D.22251 = _bmap & 1;
        if (D.22251 != 0) goto <D.22252>; else goto <D.22253>;
        <D.22252>:
        D.22254 = *_objptr;
        if (D.22254 == key) goto <D.22255>; else goto <D.22256>;
        <D.22255>:
        _objptr.15 = (long int) _objptr;
        start.8 = (long int) start;
        D.22258 = _objptr.15 - start.8;
        D.22259 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22259, D.22258);
        <D.22256>:
        <D.22253>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20255>:
        if (_bmap != 0) goto <D.20254>; else goto <D.20256>;
        <D.20256>:
        start_run = start_run + 512;
      }
      <D.20258>:
      bwords.16 = bwords;
      bwords = bwords.16 + -1;
      if (bwords.16 > 0) goto <D.20257>; else goto <D.20259>;
      <D.20259>:
    }
    goto <D.20202>;
    <D.20260>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.22261 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.22261);
      mbitmap_data.17 = mbitmap_data;
      mbitmap_data = mbitmap_data.17 + 8;
      D.22263 = *mbitmap_data.17;
      D.22264 = (unsigned int) D.22263;
      D.22265 = D.22264 + 4294967295;
      mbwords = (int) D.22265;
      D.22266 = vt->klass;
      el_size = mono_array_element_size (D.22266);
      e_start = start + 32;
      D.22192 = MEM[(struct MonoArray *)start].max_length;
      el_size.18 = (unsigned int) el_size;
      D.22268 = D.22192 * el_size.18;
      D.22269 = (sizetype) D.22268;
      e_end = e_start + D.22269;
      if (0 != 0) goto <D.22270>; else goto <D.22271>;
      <D.22270>:
      D.22266 = vt->klass;
      D.22272 = D.22266->name;
      D.22266 = vt->klass;
      D.22273 = D.22266->name_space;
      D.22261 = vt->desc;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.22261, D.22273, D.22272);
      <D.22271>:
      goto <D.20278>;
      <D.20277>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.19 = bitmap_data;
          bitmap_data = bitmap_data.19 + 8;
          _bmap = *bitmap_data.19;
          start_run = _objptr;
          goto <D.20272>;
          <D.20271>:
          D.22275 = _bmap & 1;
          if (D.22275 != 0) goto <D.22276>; else goto <D.22277>;
          <D.22276>:
          D.22278 = *_objptr;
          if (D.22278 == key) goto <D.22279>; else goto <D.22280>;
          <D.22279>:
          _objptr.20 = (long int) _objptr;
          start.8 = (long int) start;
          D.22282 = _objptr.20 - start.8;
          D.22283 = safe_name (start);
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22283, D.22282);
          <D.22280>:
          <D.22277>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20272>:
          if (_bmap != 0) goto <D.20271>; else goto <D.20273>;
          <D.20273>:
          _objptr = start_run + 512;
        }
        <D.20275>:
        bwords.21 = bwords;
        bwords = bwords.21 + 4294967295;
        if (bwords.21 != 0) goto <D.20274>; else goto <D.20276>;
        <D.20276>:
        D.22285 = (sizetype) el_size;
        e_start = e_start + D.22285;
      }
      <D.20278>:
      if (e_start < e_end) goto <D.20277>; else goto <D.20279>;
      <D.20279>:
    }
    goto <D.20202>;
    <D.20280>:
    goto <D.20202>;
    <D.20281>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20202>:
  }
  goto <D.22286>;
  <D.22148>:
  {
    mword * words;
    size_t size;
    int i;

    words = start;
    D.22287 = sgen_safe_object_get_size (start);
    size = (size_t) D.22287;
    i = 0;
    goto <D.20286>;
    <D.20285>:
    D.22288 = (long unsigned int) i;
    D.22289 = D.22288 * 8;
    D.22290 = words + D.22289;
    D.22291 = *D.22290;
    key.22 = (long unsigned int) key;
    if (D.22291 == key.22) goto <D.22293>; else goto <D.22294>;
    <D.22293>:
    D.22288 = (long unsigned int) i;
    D.22289 = D.22288 * 8;
    D.22295 = safe_name (start);
    monoeg_g_print ("found possible ref to %p in object %p (%s) at offset %td\n", key, start, D.22295, D.22289);
    <D.22294>:
    i = i + 1;
    <D.20286>:
    D.22288 = (long unsigned int) i;
    D.22296 = size / 8;
    if (D.22288 < D.22296) goto <D.20285>; else goto <D.20287>;
    <D.20287>:
  }
  <D.22286>:
}


scan_roots_for_specific_ref (struct MonoObject * key, int root_type)
{
  long unsigned int D.22299;
  long unsigned int D.22300;
  long unsigned int D.22301;
  long unsigned int D.22302;
  void * D.22305;
  long unsigned int D.22306;
  unsigned int D.22307;
  unsigned int D.22308;
  gsize * bitmap_data.23;
  long unsigned int D.22310;
  void * D.22313;
  int bwords.24;
  struct SgenHashTableEntry * D.22315;
  unsigned int D.22316;
  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.20353>;
    <D.20352>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22299 = (long unsigned int) __i;
      D.22300 = D.22299 * 8;
      __iter = __table + D.22300;
      goto <D.20350>;
      <D.20349>:
      {
        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.22301 = desc & 7;
          switch (D.22301) <default: <D.20348>, case 1: <D.20328>, case 2: <D.20347>, case 3: <D.20332>, case 4: <D.20345>>
          <D.20328>:
          desc = desc >> 3;
          goto <D.20330>;
          <D.20329>:
          D.22302 = desc & 1;
          if (D.22302 != 0) goto <D.22303>; else goto <D.22304>;
          <D.22303>:
          D.22305 = *start_root;
          check_root_obj_specific_ref (root, key, D.22305);
          <D.22304>:
          desc = desc >> 1;
          start_root = start_root + 8;
          <D.20330>:
          if (desc != 0) goto <D.20329>; else goto <D.20331>;
          <D.20331>:
          return;
          <D.20332>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.22306 = *bitmap_data;
            D.22307 = (unsigned int) D.22306;
            D.22308 = D.22307 + 4294967295;
            bwords = (int) D.22308;
            start_run = start_root;
            bitmap_data = bitmap_data + 8;
            goto <D.20342>;
            <D.20341>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.23 = bitmap_data;
              bitmap_data = bitmap_data.23 + 8;
              bmap = *bitmap_data.23;
              objptr = start_run;
              goto <D.20339>;
              <D.20338>:
              D.22310 = bmap & 1;
              if (D.22310 != 0) goto <D.22311>; else goto <D.22312>;
              <D.22311>:
              D.22313 = *objptr;
              check_root_obj_specific_ref (root, key, D.22313);
              <D.22312>:
              bmap = bmap >> 1;
              objptr = objptr + 8;
              <D.20339>:
              if (bmap != 0) goto <D.20338>; else goto <D.20340>;
              <D.20340>:
              start_run = start_run + 512;
            }
            <D.20342>:
            bwords.24 = bwords;
            bwords = bwords.24 + -1;
            if (bwords.24 > 0) goto <D.20341>; else goto <D.20343>;
            <D.20343>:
            goto <D.20344>;
          }
          <D.20345>:
          {
            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.20344>;
          }
          <D.20347>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 844);
          <D.20348>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 846);
          <D.20344>:
        }
      }
      __iter = __next;
      <D.20350>:
      D.22315 = *__iter;
      if (D.22315 != 0B) goto <D.20349>; else goto <D.20351>;
      <D.20351>:
    }
    __i = __i + 1;
    <D.20353>:
    D.22316 = roots_hash[root_type].size;
    if (D.22316 > __i) goto <D.20352>; else goto <D.20354>;
    <D.20354>:
  }
  check_key = 0B;
  check_root = 0B;
}


check_root_obj_specific_ref_from_marker (void * * obj)
{
  void * D.22318;
  struct MonoObject * check_key.25;
  struct RootRecord * check_root.26;

  D.22318 = *obj;
  check_key.25 = check_key;
  check_root.26 = check_root;
  check_root_obj_specific_ref (check_root.26, check_key.25, D.22318);
}


check_root_obj_specific_ref (struct RootRecord * root, struct MonoObject * key, struct MonoObject * obj)
{
  if (key != obj) goto <D.22321>; else goto <D.22322>;
  <D.22321>:
  return;
  <D.22322>:
  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.27;
  int concurrent_collection_in_progress.28;
  _Bool D.22328;
  long int D.22329;
  long int D.22330;
  int xdomain_checks.29;
  struct MonoDomain * D.22336;
  struct GCMemSection * nursery_section.30;
  char * D.22340;
  char * D.22341;
  void (*<T2cf5>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22342;
  char[0:] * D.22343;
  int D.22344;
  struct LOSObject * los_object_list.31;
  struct FILE * gc_debug_file.32;
  struct MonoDomain * D.22354;
  int do_pin_stats.33;
  _Bool D.22358;
  long int D.22359;
  long int D.22360;
  struct LOSObject * bigobj;
  struct LOSObject * prev;
  int i;

  pthread_mutex_lock (&gc_mutex);
  sgen_stop_world (0);
  concurrent_collection_in_progress.27 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.27 != 0) goto <D.22325>; else goto <D.22326>;
  <D.22325>:
  sgen_perform_collection (0, 1, "clear domain", 1);
  <D.22326>:
  concurrent_collection_in_progress.28 = concurrent_collection_in_progress;
  D.22328 = concurrent_collection_in_progress.28 != 0;
  D.22329 = (long int) D.22328;
  D.22330 = __builtin_expect (D.22329, 0);
  if (D.22330 != 0) goto <D.22331>; else goto <D.22332>;
  <D.22331>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1059, "!concurrent_collection_in_progress");
  <D.22332>:
  sgen_process_fin_stage_entries ();
  sgen_process_dislink_stage_entries ();
  sgen_clear_nursery_fragments ();
  xdomain_checks.29 = xdomain_checks;
  if (xdomain_checks.29 != 0) goto <D.22334>; else goto <D.22335>;
  <D.22334>:
  D.22336 = mono_get_root_domain ();
  if (D.22336 != domain) goto <D.22337>; else goto <D.22338>;
  <D.22337>:
  scan_for_registered_roots_in_domain (domain, 0);
  scan_for_registered_roots_in_domain (domain, 2);
  check_for_xdomain_refs ();
  <D.22338>:
  <D.22335>:
  null_ephemerons_for_domain (domain);
  i = 0;
  goto <D.20471>;
  <D.20470>:
  sgen_null_links_for_domain (domain, i);
  i = i + 1;
  <D.20471>:
  if (i <= 1) goto <D.20470>; else goto <D.20472>;
  <D.20472>:
  i = 0;
  goto <D.20474>;
  <D.20473>:
  sgen_remove_finalizers_for_domain (domain, i);
  i = i + 1;
  <D.20474>:
  if (i <= 1) goto <D.20473>; else goto <D.20475>;
  <D.20475>:
  nursery_section.30 = nursery_section;
  D.22340 = nursery_section.30->end_data;
  nursery_section.30 = nursery_section;
  D.22341 = nursery_section.30->data;
  sgen_scan_area_with_callback (D.22341, D.22340, clear_domain_process_minor_object_callback, domain, 0);
  D.22342 = major_collector.iterate_objects;
  D.22342 (1, 1, clear_domain_process_major_object_callback, domain);
  bigobj = los_object_list;
  goto <D.20477>;
  <D.20476>:
  D.22343 = &bigobj->data;
  clear_domain_process_object (D.22343, domain);
  bigobj = bigobj->next;
  <D.20477>:
  if (bigobj != 0B) goto <D.20476>; else goto <D.20478>;
  <D.20478>:
  prev = 0B;
  bigobj = los_object_list;
  goto <D.20480>;
  <D.20481>:
  D.22343 = &bigobj->data;
  D.22344 = need_remove_object_for_domain (D.22343, domain);
  if (D.22344 != 0) goto <D.22345>; else goto <D.22346>;
  <D.22345>:
  {
    struct LOSObject * to_free;

    to_free = bigobj;
    if (prev != 0B) goto <D.22347>; else goto <D.22348>;
    <D.22347>:
    los_object_list.31 = bigobj->next;
    prev->next = los_object_list.31;
    goto <D.22350>;
    <D.22348>:
    los_object_list.31 = bigobj->next;
    los_object_list = los_object_list.31;
    <D.22350>:
    bigobj = bigobj->next;
    if (0 != 0) goto <D.22351>; else goto <D.22352>;
    <D.22351>:
    D.22343 = &bigobj->data;
    gc_debug_file.32 = gc_debug_file;
    fprintf (gc_debug_file.32, "Freeing large object %p\n", D.22343);
    gc_debug_file.32 = gc_debug_file;
    fflush (gc_debug_file.32);
    <D.22352>:
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.20480>;
  }
  <D.22346>:
  prev = bigobj;
  bigobj = bigobj->next;
  <D.20480>:
  if (bigobj != 0B) goto <D.20481>; else goto <D.20482>;
  <D.20482>:
  D.22342 = major_collector.iterate_objects;
  D.22342 (1, 0, clear_domain_free_major_non_pinned_object_callback, domain);
  D.22342 = major_collector.iterate_objects;
  D.22342 (0, 1, clear_domain_free_major_pinned_object_callback, domain);
  D.22354 = mono_get_root_domain ();
  if (D.22354 == domain) goto <D.22355>; else goto <D.22356>;
  <D.22355>:
  do_pin_stats.33 = do_pin_stats;
  D.22358 = do_pin_stats.33 != 0;
  D.22359 = (long int) D.22358;
  D.22360 = __builtin_expect (D.22359, 0);
  if (D.22360 != 0) goto <D.22361>; else goto <D.22362>;
  <D.22361>:
  sgen_pin_stats_print_class_stats ();
  <D.22362>:
  <D.22356>:
  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.22363;
  void (*<T2cf1>) (char *, size_t) D.22366;

  D.22363 = need_remove_object_for_domain (obj, domain);
  if (D.22363 != 0) goto <D.22364>; else goto <D.22365>;
  <D.22364>:
  D.22366 = major_collector.free_pinned_object;
  D.22366 (obj, size);
  <D.22365>:
}


clear_domain_free_major_non_pinned_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.22367;
  void (*<T2cf1>) (char *, size_t) D.22370;

  D.22367 = need_remove_object_for_domain (obj, domain);
  if (D.22367 != 0) goto <D.22368>; else goto <D.22369>;
  <D.22368>:
  D.22370 = major_collector.free_non_pinned_object;
  D.22370 (obj, size);
  <D.22369>:
}


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.22371;

  D.22371 = clear_domain_process_object (obj, domain);
  if (D.22371 != 0) goto <D.22372>; else goto <D.22373>;
  <D.22372>:
  memset (obj, 0, size);
  <D.22373>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22376;
  int D.22381;
  void * D.22383;
  long unsigned int D.22384;

  D.22376 = __builtin_constant_p (__len);
  if (D.22376 != 0) goto <D.22377>; else goto <D.22378>;
  <D.22377>:
  if (__len == 0) goto <D.22379>; else goto <D.22380>;
  <D.22379>:
  D.22381 = __builtin_constant_p (__ch);
  if (D.22381 == 0) goto <D.22374>; else goto <D.22382>;
  <D.22382>:
  if (__ch != 0) goto <D.22374>; else goto <D.22375>;
  <D.22374>:
  __warn_memset_zero_len ();
  D.22383 = __dest;
  return D.22383;
  <D.22375>:
  <D.22380>:
  <D.22378>:
  D.22384 = __builtin_object_size (__dest, 0);
  D.22383 = __builtin___memset_chk (__dest, __ch, __len, D.22384);
  return D.22383;
}


scan_for_registered_roots_in_domain (struct MonoDomain * domain, int root_type)
{
  long unsigned int D.22386;
  long unsigned int D.22387;
  long unsigned int D.22390;
  long unsigned int D.22391;
  void * D.22394;
  long unsigned int D.22397;
  unsigned int D.22398;
  unsigned int D.22399;
  gsize * bitmap_data.34;
  long unsigned int D.22401;
  void * D.22404;
  int bwords.35;
  struct SgenHashTableEntry * D.22408;
  unsigned int D.22409;
  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.20429>;
    <D.20428>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22386 = (long unsigned int) __i;
      D.22387 = D.22386 * 8;
      __iter = __table + D.22387;
      goto <D.20426>;
      <D.20425>:
      {
        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.22388>; else goto <D.22389>;
          <D.22388>:
          // predicted unlikely by continue predictor.
          goto <D.20403>;
          <D.22389>:
          D.22390 = desc & 7;
          switch (D.22390) <default: <D.20424>, case 1: <D.20404>, case 2: <D.20423>, case 3: <D.20409>, case 4: <D.20421>>
          <D.20404>:
          desc = desc >> 3;
          goto <D.20406>;
          <D.20405>:
          D.22391 = desc & 1;
          if (D.22391 != 0) goto <D.22392>; else goto <D.22393>;
          <D.22392>:
          D.22394 = *start_root;
          if (D.22394 != 0B) goto <D.22395>; else goto <D.22396>;
          <D.22395>:
          D.22394 = *start_root;
          check_obj_not_in_domain (D.22394);
          <D.22396>:
          <D.22393>:
          desc = desc >> 1;
          start_root = start_root + 8;
          <D.20406>:
          if (desc != 0) goto <D.20405>; else goto <D.20407>;
          <D.20407>:
          goto <D.20408>;
          <D.20409>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.22397 = *bitmap_data;
            D.22398 = (unsigned int) D.22397;
            D.22399 = D.22398 + 4294967295;
            bwords = (int) D.22399;
            start_run = start_root;
            bitmap_data = bitmap_data + 8;
            goto <D.20419>;
            <D.20418>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.34 = bitmap_data;
              bitmap_data = bitmap_data.34 + 8;
              bmap = *bitmap_data.34;
              objptr = start_run;
              goto <D.20416>;
              <D.20415>:
              D.22401 = bmap & 1;
              if (D.22401 != 0) goto <D.22402>; else goto <D.22403>;
              <D.22402>:
              D.22404 = *objptr;
              if (D.22404 != 0B) goto <D.22405>; else goto <D.22406>;
              <D.22405>:
              D.22404 = *objptr;
              check_obj_not_in_domain (D.22404);
              <D.22406>:
              <D.22403>:
              bmap = bmap >> 1;
              objptr = objptr + 8;
              <D.20416>:
              if (bmap != 0) goto <D.20415>; else goto <D.20417>;
              <D.20417>:
              start_run = start_run + 512;
            }
            <D.20419>:
            bwords.35 = bwords;
            bwords = bwords.35 + -1;
            if (bwords.35 > 0) goto <D.20418>; else goto <D.20420>;
            <D.20420>:
            goto <D.20408>;
          }
          <D.20421>:
          {
            void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

            marker = sgen_get_user_descriptor_func (desc);
            marker (start_root, check_obj_not_in_domain);
            goto <D.20408>;
          }
          <D.20423>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 969);
          <D.20424>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 971);
          <D.20408>:
        }
      }
      <D.20403>:
      __iter = __next;
      <D.20426>:
      D.22408 = *__iter;
      if (D.22408 != 0B) goto <D.20425>; else goto <D.20427>;
      <D.20427>:
    }
    __i = __i + 1;
    <D.20429>:
    D.22409 = roots_hash[root_type].size;
    if (D.22409 > __i) goto <D.20428>; else goto <D.20430>;
    <D.20430>:
  }
  check_domain = 0B;
}


check_obj_not_in_domain (void * * o)
{
  void * D.22410;
  struct MonoVTable * D.22411;
  struct MonoDomain * D.22412;
  struct MonoDomain * check_domain.36;
  _Bool D.22414;
  long int D.22415;
  long int D.22416;

  D.22410 = *o;
  D.22411 = MEM[(struct MonoObject *)D.22410].vtable;
  D.22412 = D.22411->domain;
  check_domain.36 = check_domain;
  D.22414 = D.22412 == check_domain.36;
  D.22415 = (long int) D.22414;
  D.22416 = __builtin_expect (D.22415, 0);
  if (D.22416 != 0) goto <D.22417>; else goto <D.22418>;
  <D.22417>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 918, "((MonoObject*)(*o))->vtable->domain != check_domain");
  <D.22418>:
}


check_for_xdomain_refs ()
{
  struct GCMemSection * nursery_section.37;
  char * D.22420;
  char * D.22421;
  void (*<T2cf5>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22422;
  long unsigned int D.22423;
  char[0:] * D.22424;
  struct LOSObject * bigobj;

  nursery_section.37 = nursery_section;
  D.22420 = nursery_section.37->end_data;
  nursery_section.37 = nursery_section;
  D.22421 = nursery_section.37->data;
  sgen_scan_area_with_callback (D.22421, D.22420, scan_object_for_xdomain_refs, 0B, 0);
  D.22422 = major_collector.iterate_objects;
  D.22422 (1, 1, scan_object_for_xdomain_refs, 0B);
  bigobj = los_object_list;
  goto <D.20436>;
  <D.20435>:
  D.22423 = sgen_los_object_size (bigobj);
  D.22424 = &bigobj->data;
  scan_object_for_xdomain_refs (D.22424, D.22423, 0B);
  bigobj = bigobj->next;
  <D.20436>:
  if (bigobj != 0B) goto <D.20435>; else goto <D.20437>;
  <D.20437>:
}


scan_object_for_xdomain_refs (char * start, mword size, void * data)
{
  struct MonoVTable * D.22425;
  long unsigned int D.22426;
  long unsigned int D.22427;
  long unsigned int D.22428;
  long unsigned int D.22429;
  long unsigned int D.22432;
  long unsigned int D.22433;
  long unsigned int D.22434;
  long unsigned int D.22435;
  long unsigned int D.22436;
  long unsigned int D.22437;
  long unsigned int D.22438;
  long unsigned int D.22439;
  int D.22440;
  long unsigned int D.22441;
  long unsigned int D.22442;
  int D.22443;
  long unsigned int D.22444;
  long unsigned int D.22447;
  int D.22448;
  int D.22449;
  unsigned int D.22452;
  unsigned int el_size.38;
  unsigned int D.22454;
  sizetype D.22455;
  int D.22459;
  int D.22460;
  long unsigned int D.22461;
  long unsigned int D.22462;
  long unsigned int D.22463;
  long unsigned int D.22464;
  void * * D.22465;
  sizetype D.22466;
  long unsigned int D.22470;
  long unsigned int D.22473;
  long unsigned int D.22476;
  unsigned int D.22477;
  unsigned int D.22478;
  struct MonoVTable * D.22481;
  struct MonoClass * D.22482;
  const char * D.22483;
  const char * D.22484;
  gsize * bitmap_data.39;
  long unsigned int D.22486;
  int bwords.40;
  long unsigned int D.22490;
  gsize * mbitmap_data.41;
  long unsigned int D.22492;
  unsigned int D.22493;
  unsigned int D.22494;
  struct MonoClass * D.22495;
  unsigned int el_size.42;
  unsigned int D.22497;
  sizetype D.22498;
  const char * D.22501;
  const char * D.22502;
  gsize * bitmap_data.43;
  long unsigned int D.22504;
  unsigned int bwords.44;
  sizetype D.22508;
  struct MonoDomain * domain;

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

    D.22426 = MEM[(mword *)start];
    D.22427 = D.22426 & 18446744073709551612;
    vt = (struct GCVTable *) D.22427;
    desc = vt->desc;
    D.22428 = desc & 7;
    switch (D.22428) <default: <D.20187>, case 1: <D.20102>, case 2: <D.20109>, case 3: <D.20153>, case 4: <D.20117>, case 5: <D.20147>, case 6: <D.20166>, case 7: <D.20186>>
    <D.20102>:
    D.22429 = desc & 4294901760;
    if (D.22429 != 0) goto <D.22430>; else goto <D.22431>;
    <D.22430>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.22432 = desc >> 16;
      D.22433 = D.22432 & 255;
      D.22434 = D.22433 * 8;
      _objptr = _objptr + D.22434;
      D.22435 = desc >> 24;
      D.22436 = D.22435 & 255;
      D.22437 = D.22436 * 8;
      _objptr_end = _objptr + D.22437;
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 8;
      goto <D.20106>;
      <D.20105>:
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 8;
      <D.20106>:
      if (_objptr < _objptr_end) goto <D.20105>; else goto <D.20107>;
      <D.20107>:
    }
    <D.22431>:
    goto <D.20108>;
    <D.20109>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.22438 = (long unsigned int) _index;
        D.22439 = D.22438 * 8;
        _objptr = _objptr + D.22439;
        D.22440 = _index + 1;
        _bmap = _bmap >> D.22440;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 8;
      }
      goto <D.20115>;
      <D.20114>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.22441 = (long unsigned int) _index;
        D.22442 = D.22441 * 8;
        _objptr = _objptr + D.22442;
        D.22443 = _index + 1;
        _bmap = _bmap >> D.22443;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 8;
      }
      <D.20115>:
      if (_bmap != 0) goto <D.20114>; else goto <D.20116>;
      <D.20116>:
    }
    goto <D.20108>;
    <D.20117>:
    D.22444 = desc & 4294950912;
    if (D.22444 != 0) goto <D.22445>; else goto <D.22446>;
    <D.22445>:
    {
      int el_size;
      int etype;

      D.22447 = desc >> 3;
      D.22448 = (int) D.22447;
      el_size = D.22448 & 1023;
      D.22449 = (int) desc;
      etype = D.22449 & 49152;
      if (etype == 16384) goto <D.22450>; else goto <D.22451>;
      <D.22450>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.22452 = MEM[(struct MonoArray *)start].max_length;
        el_size.38 = (unsigned int) el_size;
        D.22454 = D.22452 * el_size.38;
        D.22455 = (sizetype) D.22454;
        end_refs = p + D.22455;
        goto <D.20123>;
        <D.20122>:
        check_reference_for_xdomain (p, start, domain);
        p = p + 8;
        <D.20123>:
        if (p < end_refs) goto <D.20122>; else goto <D.20124>;
        <D.20124>:
      }
      goto <D.22456>;
      <D.22451>:
      if (etype == 32768) goto <D.22457>; else goto <D.22458>;
      <D.22457>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.22432 = desc >> 16;
        D.22459 = (int) D.22432;
        offset = D.22459 & 255;
        D.22435 = desc >> 24;
        D.22460 = (int) D.22435;
        num_refs = D.22460 & 255;
        e_start = start + 32;
        D.22452 = MEM[(struct MonoArray *)start].max_length;
        el_size.38 = (unsigned int) el_size;
        D.22454 = D.22452 * el_size.38;
        D.22455 = (sizetype) D.22454;
        e_end = e_start + D.22455;
        goto <D.20135>;
        <D.20134>:
        {
          void * * p;
          int i;

          p = e_start;
          D.22461 = (long unsigned int) offset;
          D.22462 = D.22461 * 8;
          p = p + D.22462;
          i = 0;
          goto <D.20132>;
          <D.20131>:
          D.22463 = (long unsigned int) i;
          D.22464 = D.22463 * 8;
          D.22465 = p + D.22464;
          check_reference_for_xdomain (D.22465, start, domain);
          i = i + 1;
          <D.20132>:
          if (i < num_refs) goto <D.20131>; else goto <D.20133>;
          <D.20133>:
          D.22466 = (sizetype) el_size;
          e_start = e_start + D.22466;
        }
        <D.20135>:
        if (e_start < e_end) goto <D.20134>; else goto <D.20136>;
        <D.20136>:
      }
      goto <D.22467>;
      <D.22458>:
      if (etype == 49152) goto <D.22468>; else goto <D.22469>;
      <D.22468>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.22452 = MEM[(struct MonoArray *)start].max_length;
        el_size.38 = (unsigned int) el_size;
        D.22454 = D.22452 * el_size.38;
        D.22455 = (sizetype) D.22454;
        e_end = e_start + D.22455;
        goto <D.20145>;
        <D.20144>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20142>;
          <D.20141>:
          D.22470 = _bmap & 1;
          if (D.22470 != 0) goto <D.22471>; else goto <D.22472>;
          <D.22471>:
          check_reference_for_xdomain (p, start, domain);
          <D.22472>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20142>:
          if (_bmap != 0) goto <D.20141>; else goto <D.20143>;
          <D.20143>:
          D.22466 = (sizetype) el_size;
          e_start = e_start + D.22466;
        }
        <D.20145>:
        if (e_start < e_end) goto <D.20144>; else goto <D.20146>;
        <D.20146>:
      }
      <D.22469>:
      <D.22467>:
      <D.22456>:
    }
    <D.22446>:
    goto <D.20108>;
    <D.20147>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20151>;
      <D.20150>:
      D.22473 = _bmap & 1;
      if (D.22473 != 0) goto <D.22474>; else goto <D.22475>;
      <D.22474>:
      check_reference_for_xdomain (_objptr, start, domain);
      <D.22475>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20151>:
      if (_bmap != 0) goto <D.20150>; else goto <D.20152>;
      <D.20152>:
    }
    goto <D.20108>;
    <D.20153>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.22476 = *bitmap_data;
      D.22477 = (unsigned int) D.22476;
      D.22478 = D.22477 + 4294967295;
      bwords = (int) D.22478;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.22479>; else goto <D.22480>;
      <D.22479>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.22481 = myobj->vtable;
        D.22482 = D.22481->klass;
        D.22483 = D.22482->name;
        D.22481 = myobj->vtable;
        D.22482 = D.22481->klass;
        D.22484 = D.22482->name_space;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.22484, D.22483);
      }
      <D.22480>:
      goto <D.20164>;
      <D.20163>:
      {
        gsize _bmap;

        bitmap_data.39 = bitmap_data;
        bitmap_data = bitmap_data.39 + 8;
        _bmap = *bitmap_data.39;
        _objptr = start_run;
        goto <D.20161>;
        <D.20160>:
        D.22486 = _bmap & 1;
        if (D.22486 != 0) goto <D.22487>; else goto <D.22488>;
        <D.22487>:
        check_reference_for_xdomain (_objptr, start, domain);
        <D.22488>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20161>:
        if (_bmap != 0) goto <D.20160>; else goto <D.20162>;
        <D.20162>:
        start_run = start_run + 512;
      }
      <D.20164>:
      bwords.40 = bwords;
      bwords = bwords.40 + -1;
      if (bwords.40 > 0) goto <D.20163>; else goto <D.20165>;
      <D.20165>:
    }
    goto <D.20108>;
    <D.20166>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.22490 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.22490);
      mbitmap_data.41 = mbitmap_data;
      mbitmap_data = mbitmap_data.41 + 8;
      D.22492 = *mbitmap_data.41;
      D.22493 = (unsigned int) D.22492;
      D.22494 = D.22493 + 4294967295;
      mbwords = (int) D.22494;
      D.22495 = vt->klass;
      el_size = mono_array_element_size (D.22495);
      e_start = start + 32;
      D.22452 = MEM[(struct MonoArray *)start].max_length;
      el_size.42 = (unsigned int) el_size;
      D.22497 = D.22452 * el_size.42;
      D.22498 = (sizetype) D.22497;
      e_end = e_start + D.22498;
      if (0 != 0) goto <D.22499>; else goto <D.22500>;
      <D.22499>:
      D.22495 = vt->klass;
      D.22501 = D.22495->name;
      D.22495 = vt->klass;
      D.22502 = D.22495->name_space;
      D.22490 = vt->desc;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.22490, D.22502, D.22501);
      <D.22500>:
      goto <D.20184>;
      <D.20183>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.43 = bitmap_data;
          bitmap_data = bitmap_data.43 + 8;
          _bmap = *bitmap_data.43;
          start_run = _objptr;
          goto <D.20178>;
          <D.20177>:
          D.22504 = _bmap & 1;
          if (D.22504 != 0) goto <D.22505>; else goto <D.22506>;
          <D.22505>:
          check_reference_for_xdomain (_objptr, start, domain);
          <D.22506>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20178>:
          if (_bmap != 0) goto <D.20177>; else goto <D.20179>;
          <D.20179>:
          _objptr = start_run + 512;
        }
        <D.20181>:
        bwords.44 = bwords;
        bwords = bwords.44 + 4294967295;
        if (bwords.44 != 0) goto <D.20180>; else goto <D.20182>;
        <D.20182>:
        D.22508 = (sizetype) el_size;
        e_start = e_start + D.22508;
      }
      <D.20184>:
      if (e_start < e_end) goto <D.20183>; else goto <D.20185>;
      <D.20185>:
    }
    goto <D.20108>;
    <D.20186>:
    goto <D.20108>;
    <D.20187>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20108>:
  }
}


check_reference_for_xdomain (void * * ptr, char * obj, struct MonoDomain * domain)
{
  long int ptr.45;
  long int o.46;
  long int D.22512;
  struct MonoVTable * D.22516;
  struct MonoDomain * D.22517;
  int D.22518;
  struct MonoVTable * D.22521;
  struct MonoClassField * D.22522;
  long unsigned int D.22523;
  long unsigned int D.22524;
  struct MonoClassField * D.22525;
  int D.22526;
  unsigned int i.47;
  unsigned int D.22530;
  struct MonoClass * D.22532;
  struct MonoClass * D.22533;
  const char * iftmp.48;
  const char * D.22541;
  const char * D.22542;
  const char * iftmp.49;
  struct MonoClass * D.22547;
  const char * D.22548;
  const char * D.22549;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;
  struct MonoClass * class;
  struct MonoClassField * field;
  char * str;

  o = obj;
  ref = *ptr;
  ptr.45 = (long int) ptr;
  o.46 = (long int) o;
  D.22512 = ptr.45 - o.46;
  offset = (int) D.22512;
  if (ref == 0B) goto <D.22513>; else goto <D.22515>;
  <D.22515>:
  D.22516 = ref->vtable;
  D.22517 = D.22516->domain;
  if (D.22517 == domain) goto <D.22513>; else goto <D.22514>;
  <D.22513>:
  return;
  <D.22514>:
  D.22518 = is_xdomain_ref_allowed (ptr, obj, domain);
  if (D.22518 != 0) goto <D.22519>; else goto <D.22520>;
  <D.22519>:
  return;
  <D.22520>:
  field = 0B;
  D.22521 = o->vtable;
  class = D.22521->klass;
  goto <D.20093>;
  <D.20092>:
  {
    int i;

    i = 0;
    goto <D.20090>;
    <D.20089>:
    D.22522 = class->fields;
    D.22523 = (long unsigned int) i;
    D.22524 = D.22523 * 32;
    D.22525 = D.22522 + D.22524;
    D.22526 = D.22525->offset;
    if (D.22526 == offset) goto <D.22527>; else goto <D.22528>;
    <D.22527>:
    D.22522 = class->fields;
    D.22523 = (long unsigned int) i;
    D.22524 = D.22523 * 32;
    field = D.22522 + D.22524;
    goto <D.20088>;
    <D.22528>:
    i = i + 1;
    <D.20090>:
    i.47 = (unsigned int) i;
    D.22530 = class->field.count;
    if (i.47 < D.22530) goto <D.20089>; else goto <D.20088>;
    <D.20088>:
    if (field != 0B) goto <D.20091>; else goto <D.22531>;
    <D.22531>:
  }
  class = class->parent;
  <D.20093>:
  if (class != 0B) goto <D.20092>; else goto <D.20091>;
  <D.20091>:
  D.22516 = ref->vtable;
  D.22532 = D.22516->klass;
  D.22533 = mono_defaults.string_class;
  if (D.22532 == D.22533) goto <D.22534>; else goto <D.22535>;
  <D.22534>:
  str = mono_string_to_utf8 (ref);
  goto <D.22536>;
  <D.22535>:
  str = 0B;
  <D.22536>:
  if (str != 0B) goto <D.22538>; else goto <D.22539>;
  <D.22538>:
  iftmp.48 = str;
  goto <D.22540>;
  <D.22539>:
  iftmp.48 = "";
  <D.22540>:
  D.22516 = ref->vtable;
  D.22532 = D.22516->klass;
  D.22541 = D.22532->name;
  D.22516 = ref->vtable;
  D.22532 = D.22516->klass;
  D.22542 = D.22532->name_space;
  if (field != 0B) goto <D.22544>; else goto <D.22545>;
  <D.22544>:
  iftmp.49 = field->name;
  goto <D.22546>;
  <D.22545>:
  iftmp.49 = "";
  <D.22546>:
  D.22521 = o->vtable;
  D.22547 = D.22521->klass;
  D.22548 = D.22547->name;
  D.22521 = o->vtable;
  D.22547 = D.22521->klass;
  D.22549 = D.22547->name_space;
  monoeg_g_print ("xdomain reference in %p (%s.%s) at offset %d (%s) to %p (%s.%s) (%s)  -  pointed to by:\n", o, D.22549, D.22548, offset, iftmp.49, ref, D.22542, D.22541, iftmp.48);
  mono_gc_scan_for_specific_ref (o, 1);
  if (str != 0B) goto <D.22550>; else goto <D.22551>;
  <D.22550>:
  monoeg_g_free (str);
  <D.22551>:
}


is_xdomain_ref_allowed (void * * ptr, char * obj, struct MonoDomain * domain)
{
  long int ptr.50;
  long int o.51;
  long int D.22555;
  struct MonoVTable * D.22556;
  struct MonoClass * D.22557;
  struct MonoClass * D.22558;
  gboolean D.22563;
  struct MonoClass * D.22564;
  struct MonoClass * D.22569;
  int D.22570;
  int D.19976;
  int iftmp.52;
  int D.19975;
  struct MonoVTable * D.22578;
  struct MonoClass * D.22579;
  const char[21] * D.22580;
  unsigned char D.22581;
  int D.22582;
  unsigned char D.22583;
  int D.22584;
  _Bool D.22585;
  _Bool D.22586;
  _Bool D.22587;
  const unsigned char * D.22590;
  unsigned char D.22591;
  int D.22592;
  const unsigned char * D.22593;
  unsigned char D.22594;
  int D.22595;
  _Bool D.22596;
  _Bool D.22597;
  const unsigned char * D.22600;
  unsigned char D.22601;
  int D.22602;
  const unsigned char * D.22603;
  unsigned char D.22604;
  int D.22605;
  _Bool D.22606;
  _Bool D.22607;
  const unsigned char * D.22610;
  unsigned char D.22611;
  int D.22612;
  const unsigned char * D.22613;
  unsigned char D.22614;
  int D.22615;
  const char * D.22617;
  int D.19985;
  int iftmp.53;
  int D.19984;
  const char[12] * D.22623;
  unsigned char D.22624;
  int D.22625;
  unsigned char D.22626;
  int D.22627;
  _Bool D.22628;
  _Bool D.22629;
  _Bool D.22630;
  const unsigned char * D.22633;
  unsigned char D.22634;
  int D.22635;
  const unsigned char * D.22636;
  unsigned char D.22637;
  int D.22638;
  _Bool D.22639;
  _Bool D.22640;
  const unsigned char * D.22643;
  unsigned char D.22644;
  int D.22645;
  const unsigned char * D.22646;
  unsigned char D.22647;
  int D.22648;
  _Bool D.22649;
  _Bool D.22650;
  const unsigned char * D.22653;
  unsigned char D.22654;
  int D.22655;
  const unsigned char * D.22656;
  unsigned char D.22657;
  int D.22658;
  const char * D.22660;
  int D.19994;
  int iftmp.54;
  int D.19993;
  const char[7] * D.22666;
  unsigned char D.22667;
  int D.22668;
  unsigned char D.22669;
  int D.22670;
  _Bool D.22671;
  _Bool D.22672;
  _Bool D.22673;
  const unsigned char * D.22676;
  unsigned char D.22677;
  int D.22678;
  const unsigned char * D.22679;
  unsigned char D.22680;
  int D.22681;
  _Bool D.22682;
  _Bool D.22683;
  const unsigned char * D.22686;
  unsigned char D.22687;
  int D.22688;
  const unsigned char * D.22689;
  unsigned char D.22690;
  int D.22691;
  _Bool D.22692;
  _Bool D.22693;
  const unsigned char * D.22696;
  unsigned char D.22697;
  int D.22698;
  const unsigned char * D.22699;
  unsigned char D.22700;
  int D.22701;
  const char * D.22703;
  int D.20003;
  int iftmp.55;
  int D.20002;
  const char[9] * D.22709;
  unsigned char D.22710;
  int D.22711;
  unsigned char D.22712;
  int D.22713;
  _Bool D.22714;
  _Bool D.22715;
  _Bool D.22716;
  const unsigned char * D.22719;
  unsigned char D.22720;
  int D.22721;
  const unsigned char * D.22722;
  unsigned char D.22723;
  int D.22724;
  _Bool D.22725;
  _Bool D.22726;
  const unsigned char * D.22729;
  unsigned char D.22730;
  int D.22731;
  const unsigned char * D.22732;
  unsigned char D.22733;
  int D.22734;
  _Bool D.22735;
  _Bool D.22736;
  const unsigned char * D.22739;
  unsigned char D.22740;
  int D.22741;
  const unsigned char * D.22742;
  unsigned char D.22743;
  int D.22744;
  const char * D.22746;
  int D.20012;
  int iftmp.56;
  int D.20011;
  unsigned char D.22752;
  int D.22753;
  _Bool D.22754;
  _Bool D.22755;
  _Bool D.22756;
  const unsigned char * D.22759;
  unsigned char D.22760;
  int D.22761;
  _Bool D.22762;
  _Bool D.22763;
  const unsigned char * D.22766;
  unsigned char D.22767;
  int D.22768;
  _Bool D.22769;
  _Bool D.22770;
  const unsigned char * D.22773;
  unsigned char D.22774;
  int D.22775;
  int D.20021;
  int iftmp.57;
  int D.20020;
  const char[7] * D.22782;
  unsigned char D.22783;
  int D.22784;
  unsigned char D.22785;
  int D.22786;
  _Bool D.22787;
  _Bool D.22788;
  _Bool D.22789;
  const unsigned char * D.22792;
  unsigned char D.22793;
  int D.22794;
  const unsigned char * D.22795;
  unsigned char D.22796;
  int D.22797;
  _Bool D.22798;
  _Bool D.22799;
  const unsigned char * D.22802;
  unsigned char D.22803;
  int D.22804;
  const unsigned char * D.22805;
  unsigned char D.22806;
  int D.22807;
  _Bool D.22808;
  _Bool D.22809;
  const unsigned char * D.22812;
  unsigned char D.22813;
  int D.22814;
  const unsigned char * D.22815;
  unsigned char D.22816;
  int D.22817;
  int D.20030;
  int iftmp.58;
  int D.20029;
  const char[10] * D.22824;
  unsigned char D.22825;
  int D.22826;
  unsigned char D.22827;
  int D.22828;
  _Bool D.22829;
  _Bool D.22830;
  _Bool D.22831;
  const unsigned char * D.22834;
  unsigned char D.22835;
  int D.22836;
  const unsigned char * D.22837;
  unsigned char D.22838;
  int D.22839;
  _Bool D.22840;
  _Bool D.22841;
  const unsigned char * D.22844;
  unsigned char D.22845;
  int D.22846;
  const unsigned char * D.22847;
  unsigned char D.22848;
  int D.22849;
  _Bool D.22850;
  _Bool D.22851;
  const unsigned char * D.22854;
  unsigned char D.22855;
  int D.22856;
  const unsigned char * D.22857;
  unsigned char D.22858;
  int D.22859;
  int D.20039;
  int iftmp.59;
  int D.20038;
  const char[13] * D.22866;
  unsigned char D.22867;
  int D.22868;
  unsigned char D.22869;
  int D.22870;
  _Bool D.22871;
  _Bool D.22872;
  _Bool D.22873;
  const unsigned char * D.22876;
  unsigned char D.22877;
  int D.22878;
  const unsigned char * D.22879;
  unsigned char D.22880;
  int D.22881;
  _Bool D.22882;
  _Bool D.22883;
  const unsigned char * D.22886;
  unsigned char D.22887;
  int D.22888;
  const unsigned char * D.22889;
  unsigned char D.22890;
  int D.22891;
  _Bool D.22892;
  _Bool D.22893;
  const unsigned char * D.22896;
  unsigned char D.22897;
  int D.22898;
  const unsigned char * D.22899;
  unsigned char D.22900;
  int D.22901;
  int D.20048;
  int iftmp.60;
  int D.20047;
  const char[34] * D.22908;
  unsigned char D.22909;
  int D.22910;
  unsigned char D.22911;
  int D.22912;
  _Bool D.22913;
  _Bool D.22914;
  _Bool D.22915;
  const unsigned char * D.22918;
  unsigned char D.22919;
  int D.22920;
  const unsigned char * D.22921;
  unsigned char D.22922;
  int D.22923;
  _Bool D.22924;
  _Bool D.22925;
  const unsigned char * D.22928;
  unsigned char D.22929;
  int D.22930;
  const unsigned char * D.22931;
  unsigned char D.22932;
  int D.22933;
  _Bool D.22934;
  _Bool D.22935;
  const unsigned char * D.22938;
  unsigned char D.22939;
  int D.22940;
  const unsigned char * D.22941;
  unsigned char D.22942;
  int D.22943;
  int D.20057;
  int iftmp.61;
  int D.20056;
  const char[12] * D.22950;
  unsigned char D.22951;
  int D.22952;
  unsigned char D.22953;
  int D.22954;
  _Bool D.22955;
  _Bool D.22956;
  _Bool D.22957;
  const unsigned char * D.22960;
  unsigned char D.22961;
  int D.22962;
  const unsigned char * D.22963;
  unsigned char D.22964;
  int D.22965;
  _Bool D.22966;
  _Bool D.22967;
  const unsigned char * D.22970;
  unsigned char D.22971;
  int D.22972;
  const unsigned char * D.22973;
  unsigned char D.22974;
  int D.22975;
  _Bool D.22976;
  _Bool D.22977;
  const unsigned char * D.22980;
  unsigned char D.22981;
  int D.22982;
  const unsigned char * D.22983;
  unsigned char D.22984;
  int D.22985;
  int D.20066;
  int iftmp.62;
  int D.20065;
  unsigned char D.22992;
  int D.22993;
  _Bool D.22994;
  _Bool D.22995;
  _Bool D.22996;
  const unsigned char * D.22999;
  unsigned char D.23000;
  int D.23001;
  _Bool D.23002;
  _Bool D.23003;
  const unsigned char * D.23006;
  unsigned char D.23007;
  int D.23008;
  _Bool D.23009;
  _Bool D.23010;
  const unsigned char * D.23013;
  unsigned char D.23014;
  int D.23015;
  int D.20075;
  int iftmp.63;
  int D.20074;
  unsigned char D.23022;
  int D.23023;
  _Bool D.23024;
  _Bool D.23025;
  _Bool D.23026;
  const unsigned char * D.23029;
  unsigned char D.23030;
  int D.23031;
  _Bool D.23032;
  _Bool D.23033;
  const unsigned char * D.23036;
  unsigned char D.23037;
  int D.23038;
  _Bool D.23039;
  _Bool D.23040;
  const unsigned char * D.23043;
  unsigned char D.23044;
  int D.23045;
  int D.23049;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;

  o = obj;
  ref = *ptr;
  ptr.50 = (long int) ptr;
  o.51 = (long int) o;
  D.22555 = ptr.50 - o.51;
  offset = (int) D.22555;
  D.22556 = o->vtable;
  D.22557 = D.22556->klass;
  D.22558 = mono_defaults.thread_class;
  if (D.22557 == D.22558) goto <D.22559>; else goto <D.22560>;
  <D.22559>:
  if (offset == 16) goto <D.22561>; else goto <D.22562>;
  <D.22561>:
  D.22563 = 1;
  return D.22563;
  <D.22562>:
  <D.22560>:
  D.22556 = o->vtable;
  D.22557 = D.22556->klass;
  D.22564 = mono_defaults.internal_thread_class;
  if (D.22557 == D.22564) goto <D.22565>; else goto <D.22566>;
  <D.22565>:
  if (offset == 120) goto <D.22567>; else goto <D.22568>;
  <D.22567>:
  D.22563 = 1;
  return D.22563;
  <D.22568>:
  <D.22566>:
  D.22569 = mono_defaults.real_proxy_class;
  D.22556 = o->vtable;
  D.22557 = D.22556->klass;
  D.22570 = mono_class_has_parent_fast (D.22557, D.22569);
  if (D.22570 != 0) goto <D.22571>; else goto <D.22572>;
  <D.22571>:
  if (offset == 32) goto <D.22573>; else goto <D.22574>;
  <D.22573>:
  D.22563 = 1;
  return D.22563;
  <D.22574>:
  <D.22572>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22578 = ref->vtable;
      D.22579 = D.22578->klass;
      __s2 = D.22579->name_space;
      D.22580 = "System.Globalization";
      D.22581 = MEM[(const unsigned char *)D.22580];
      D.22582 = (int) D.22581;
      D.22583 = *__s2;
      D.22584 = (int) D.22583;
      __result = D.22582 - D.22584;
      {
        D.22585 = __s2_len != 0;
        D.22586 = __result == 0;
        D.22587 = D.22585 & D.22586;
        if (D.22587 != 0) goto <D.22588>; else goto <D.22589>;
        <D.22588>:
        D.22590 = &MEM[(void *)"System.Globalization" + 1B];
        D.22591 = *D.22590;
        D.22592 = (int) D.22591;
        D.22593 = __s2 + 1;
        D.22594 = *D.22593;
        D.22595 = (int) D.22594;
        __result = D.22592 - D.22595;
        D.22596 = __s2_len > 1;
        D.22586 = __result == 0;
        D.22597 = D.22596 & D.22586;
        if (D.22597 != 0) goto <D.22598>; else goto <D.22599>;
        <D.22598>:
        D.22600 = &MEM[(void *)"System.Globalization" + 2B];
        D.22601 = *D.22600;
        D.22602 = (int) D.22601;
        D.22603 = __s2 + 2;
        D.22604 = *D.22603;
        D.22605 = (int) D.22604;
        __result = D.22602 - D.22605;
        D.22606 = __s2_len > 2;
        D.22586 = __result == 0;
        D.22607 = D.22606 & D.22586;
        if (D.22607 != 0) goto <D.22608>; else goto <D.22609>;
        <D.22608>:
        D.22610 = &MEM[(void *)"System.Globalization" + 3B];
        D.22611 = *D.22610;
        D.22612 = (int) D.22611;
        D.22613 = __s2 + 3;
        D.22614 = *D.22613;
        D.22615 = (int) D.22614;
        __result = D.22612 - D.22615;
        <D.22609>:
        <D.22599>:
        <D.22589>:
      }
      D.19975 = __result;
    }
    iftmp.52 = -D.19975;
    goto <D.22616>;
    <D.22577>:
    D.22578 = ref->vtable;
    D.22579 = D.22578->klass;
    D.22617 = D.22579->name_space;
    iftmp.52 = __builtin_strcmp (D.22617, "System.Globalization");
    <D.22616>:
    D.19976 = iftmp.52;
  }
  if (D.19976 == 0) goto <D.22618>; else goto <D.22619>;
  <D.22618>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22578 = ref->vtable;
      D.22579 = D.22578->klass;
      __s2 = D.22579->name;
      D.22623 = "CultureInfo";
      D.22624 = MEM[(const unsigned char *)D.22623];
      D.22625 = (int) D.22624;
      D.22626 = *__s2;
      D.22627 = (int) D.22626;
      __result = D.22625 - D.22627;
      {
        D.22628 = __s2_len != 0;
        D.22629 = __result == 0;
        D.22630 = D.22628 & D.22629;
        if (D.22630 != 0) goto <D.22631>; else goto <D.22632>;
        <D.22631>:
        D.22633 = &MEM[(void *)"CultureInfo" + 1B];
        D.22634 = *D.22633;
        D.22635 = (int) D.22634;
        D.22636 = __s2 + 1;
        D.22637 = *D.22636;
        D.22638 = (int) D.22637;
        __result = D.22635 - D.22638;
        D.22639 = __s2_len > 1;
        D.22629 = __result == 0;
        D.22640 = D.22639 & D.22629;
        if (D.22640 != 0) goto <D.22641>; else goto <D.22642>;
        <D.22641>:
        D.22643 = &MEM[(void *)"CultureInfo" + 2B];
        D.22644 = *D.22643;
        D.22645 = (int) D.22644;
        D.22646 = __s2 + 2;
        D.22647 = *D.22646;
        D.22648 = (int) D.22647;
        __result = D.22645 - D.22648;
        D.22649 = __s2_len > 2;
        D.22629 = __result == 0;
        D.22650 = D.22649 & D.22629;
        if (D.22650 != 0) goto <D.22651>; else goto <D.22652>;
        <D.22651>:
        D.22653 = &MEM[(void *)"CultureInfo" + 3B];
        D.22654 = *D.22653;
        D.22655 = (int) D.22654;
        D.22656 = __s2 + 3;
        D.22657 = *D.22656;
        D.22658 = (int) D.22657;
        __result = D.22655 - D.22658;
        <D.22652>:
        <D.22642>:
        <D.22632>:
      }
      D.19984 = __result;
    }
    iftmp.53 = -D.19984;
    goto <D.22659>;
    <D.22622>:
    D.22578 = ref->vtable;
    D.22579 = D.22578->klass;
    D.22660 = D.22579->name;
    iftmp.53 = __builtin_strcmp (D.22660, "CultureInfo");
    <D.22659>:
    D.19985 = iftmp.53;
  }
  if (D.19985 == 0) goto <D.22661>; else goto <D.22662>;
  <D.22661>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22556 = o->vtable;
      D.22557 = D.22556->klass;
      __s2 = D.22557->name_space;
      D.22666 = "System";
      D.22667 = MEM[(const unsigned char *)D.22666];
      D.22668 = (int) D.22667;
      D.22669 = *__s2;
      D.22670 = (int) D.22669;
      __result = D.22668 - D.22670;
      {
        D.22671 = __s2_len != 0;
        D.22672 = __result == 0;
        D.22673 = D.22671 & D.22672;
        if (D.22673 != 0) goto <D.22674>; else goto <D.22675>;
        <D.22674>:
        D.22676 = &MEM[(void *)"System" + 1B];
        D.22677 = *D.22676;
        D.22678 = (int) D.22677;
        D.22679 = __s2 + 1;
        D.22680 = *D.22679;
        D.22681 = (int) D.22680;
        __result = D.22678 - D.22681;
        D.22682 = __s2_len > 1;
        D.22672 = __result == 0;
        D.22683 = D.22682 & D.22672;
        if (D.22683 != 0) goto <D.22684>; else goto <D.22685>;
        <D.22684>:
        D.22686 = &MEM[(void *)"System" + 2B];
        D.22687 = *D.22686;
        D.22688 = (int) D.22687;
        D.22689 = __s2 + 2;
        D.22690 = *D.22689;
        D.22691 = (int) D.22690;
        __result = D.22688 - D.22691;
        D.22692 = __s2_len > 2;
        D.22672 = __result == 0;
        D.22693 = D.22692 & D.22672;
        if (D.22693 != 0) goto <D.22694>; else goto <D.22695>;
        <D.22694>:
        D.22696 = &MEM[(void *)"System" + 3B];
        D.22697 = *D.22696;
        D.22698 = (int) D.22697;
        D.22699 = __s2 + 3;
        D.22700 = *D.22699;
        D.22701 = (int) D.22700;
        __result = D.22698 - D.22701;
        <D.22695>:
        <D.22685>:
        <D.22675>:
      }
      D.19993 = __result;
    }
    iftmp.54 = -D.19993;
    goto <D.22702>;
    <D.22665>:
    D.22556 = o->vtable;
    D.22557 = D.22556->klass;
    D.22703 = D.22557->name_space;
    iftmp.54 = __builtin_strcmp (D.22703, "System");
    <D.22702>:
    D.19994 = iftmp.54;
  }
  if (D.19994 == 0) goto <D.22704>; else goto <D.22705>;
  <D.22704>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22556 = o->vtable;
      D.22557 = D.22556->klass;
      __s2 = D.22557->name;
      D.22709 = "Object[]";
      D.22710 = MEM[(const unsigned char *)D.22709];
      D.22711 = (int) D.22710;
      D.22712 = *__s2;
      D.22713 = (int) D.22712;
      __result = D.22711 - D.22713;
      {
        D.22714 = __s2_len != 0;
        D.22715 = __result == 0;
        D.22716 = D.22714 & D.22715;
        if (D.22716 != 0) goto <D.22717>; else goto <D.22718>;
        <D.22717>:
        D.22719 = &MEM[(void *)"Object[]" + 1B];
        D.22720 = *D.22719;
        D.22721 = (int) D.22720;
        D.22722 = __s2 + 1;
        D.22723 = *D.22722;
        D.22724 = (int) D.22723;
        __result = D.22721 - D.22724;
        D.22725 = __s2_len > 1;
        D.22715 = __result == 0;
        D.22726 = D.22725 & D.22715;
        if (D.22726 != 0) goto <D.22727>; else goto <D.22728>;
        <D.22727>:
        D.22729 = &MEM[(void *)"Object[]" + 2B];
        D.22730 = *D.22729;
        D.22731 = (int) D.22730;
        D.22732 = __s2 + 2;
        D.22733 = *D.22732;
        D.22734 = (int) D.22733;
        __result = D.22731 - D.22734;
        D.22735 = __s2_len > 2;
        D.22715 = __result == 0;
        D.22736 = D.22735 & D.22715;
        if (D.22736 != 0) goto <D.22737>; else goto <D.22738>;
        <D.22737>:
        D.22739 = &MEM[(void *)"Object[]" + 3B];
        D.22740 = *D.22739;
        D.22741 = (int) D.22740;
        D.22742 = __s2 + 3;
        D.22743 = *D.22742;
        D.22744 = (int) D.22743;
        __result = D.22741 - D.22744;
        <D.22738>:
        <D.22728>:
        <D.22718>:
      }
      D.20002 = __result;
    }
    iftmp.55 = -D.20002;
    goto <D.22745>;
    <D.22708>:
    D.22556 = o->vtable;
    D.22557 = D.22556->klass;
    D.22746 = D.22557->name;
    iftmp.55 = __builtin_strcmp (D.22746, "Object[]");
    <D.22745>:
    D.20003 = iftmp.55;
  }
  if (D.20003 == 0) goto <D.22747>; else goto <D.22748>;
  <D.22747>:
  D.22563 = 1;
  return D.22563;
  <D.22748>:
  <D.22705>:
  <D.22662>:
  <D.22619>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22578 = ref->vtable;
      D.22579 = D.22578->klass;
      __s2 = D.22579->name_space;
      D.22666 = "System";
      D.22667 = MEM[(const unsigned char *)D.22666];
      D.22668 = (int) D.22667;
      D.22752 = *__s2;
      D.22753 = (int) D.22752;
      __result = D.22668 - D.22753;
      {
        D.22754 = __s2_len != 0;
        D.22755 = __result == 0;
        D.22756 = D.22754 & D.22755;
        if (D.22756 != 0) goto <D.22757>; else goto <D.22758>;
        <D.22757>:
        D.22676 = &MEM[(void *)"System" + 1B];
        D.22677 = *D.22676;
        D.22678 = (int) D.22677;
        D.22759 = __s2 + 1;
        D.22760 = *D.22759;
        D.22761 = (int) D.22760;
        __result = D.22678 - D.22761;
        D.22762 = __s2_len > 1;
        D.22755 = __result == 0;
        D.22763 = D.22762 & D.22755;
        if (D.22763 != 0) goto <D.22764>; else goto <D.22765>;
        <D.22764>:
        D.22686 = &MEM[(void *)"System" + 2B];
        D.22687 = *D.22686;
        D.22688 = (int) D.22687;
        D.22766 = __s2 + 2;
        D.22767 = *D.22766;
        D.22768 = (int) D.22767;
        __result = D.22688 - D.22768;
        D.22769 = __s2_len > 2;
        D.22755 = __result == 0;
        D.22770 = D.22769 & D.22755;
        if (D.22770 != 0) goto <D.22771>; else goto <D.22772>;
        <D.22771>:
        D.22696 = &MEM[(void *)"System" + 3B];
        D.22697 = *D.22696;
        D.22698 = (int) D.22697;
        D.22773 = __s2 + 3;
        D.22774 = *D.22773;
        D.22775 = (int) D.22774;
        __result = D.22698 - D.22775;
        <D.22772>:
        <D.22765>:
        <D.22758>:
      }
      D.20011 = __result;
    }
    iftmp.56 = -D.20011;
    goto <D.22776>;
    <D.22751>:
    D.22578 = ref->vtable;
    D.22579 = D.22578->klass;
    D.22617 = D.22579->name_space;
    iftmp.56 = __builtin_strcmp (D.22617, "System");
    <D.22776>:
    D.20012 = iftmp.56;
  }
  if (D.20012 == 0) goto <D.22777>; else goto <D.22778>;
  <D.22777>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22578 = ref->vtable;
      D.22579 = D.22578->klass;
      __s2 = D.22579->name;
      D.22782 = "Byte[]";
      D.22783 = MEM[(const unsigned char *)D.22782];
      D.22784 = (int) D.22783;
      D.22785 = *__s2;
      D.22786 = (int) D.22785;
      __result = D.22784 - D.22786;
      {
        D.22787 = __s2_len != 0;
        D.22788 = __result == 0;
        D.22789 = D.22787 & D.22788;
        if (D.22789 != 0) goto <D.22790>; else goto <D.22791>;
        <D.22790>:
        D.22792 = &MEM[(void *)"Byte[]" + 1B];
        D.22793 = *D.22792;
        D.22794 = (int) D.22793;
        D.22795 = __s2 + 1;
        D.22796 = *D.22795;
        D.22797 = (int) D.22796;
        __result = D.22794 - D.22797;
        D.22798 = __s2_len > 1;
        D.22788 = __result == 0;
        D.22799 = D.22798 & D.22788;
        if (D.22799 != 0) goto <D.22800>; else goto <D.22801>;
        <D.22800>:
        D.22802 = &MEM[(void *)"Byte[]" + 2B];
        D.22803 = *D.22802;
        D.22804 = (int) D.22803;
        D.22805 = __s2 + 2;
        D.22806 = *D.22805;
        D.22807 = (int) D.22806;
        __result = D.22804 - D.22807;
        D.22808 = __s2_len > 2;
        D.22788 = __result == 0;
        D.22809 = D.22808 & D.22788;
        if (D.22809 != 0) goto <D.22810>; else goto <D.22811>;
        <D.22810>:
        D.22812 = &MEM[(void *)"Byte[]" + 3B];
        D.22813 = *D.22812;
        D.22814 = (int) D.22813;
        D.22815 = __s2 + 3;
        D.22816 = *D.22815;
        D.22817 = (int) D.22816;
        __result = D.22814 - D.22817;
        <D.22811>:
        <D.22801>:
        <D.22791>:
      }
      D.20020 = __result;
    }
    iftmp.57 = -D.20020;
    goto <D.22818>;
    <D.22781>:
    D.22578 = ref->vtable;
    D.22579 = D.22578->klass;
    D.22660 = D.22579->name;
    iftmp.57 = __builtin_strcmp (D.22660, "Byte[]");
    <D.22818>:
    D.20021 = iftmp.57;
  }
  if (D.20021 == 0) goto <D.22819>; else goto <D.22820>;
  <D.22819>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22556 = o->vtable;
      D.22557 = D.22556->klass;
      __s2 = D.22557->name_space;
      D.22824 = "System.IO";
      D.22825 = MEM[(const unsigned char *)D.22824];
      D.22826 = (int) D.22825;
      D.22827 = *__s2;
      D.22828 = (int) D.22827;
      __result = D.22826 - D.22828;
      {
        D.22829 = __s2_len != 0;
        D.22830 = __result == 0;
        D.22831 = D.22829 & D.22830;
        if (D.22831 != 0) goto <D.22832>; else goto <D.22833>;
        <D.22832>:
        D.22834 = &MEM[(void *)"System.IO" + 1B];
        D.22835 = *D.22834;
        D.22836 = (int) D.22835;
        D.22837 = __s2 + 1;
        D.22838 = *D.22837;
        D.22839 = (int) D.22838;
        __result = D.22836 - D.22839;
        D.22840 = __s2_len > 1;
        D.22830 = __result == 0;
        D.22841 = D.22840 & D.22830;
        if (D.22841 != 0) goto <D.22842>; else goto <D.22843>;
        <D.22842>:
        D.22844 = &MEM[(void *)"System.IO" + 2B];
        D.22845 = *D.22844;
        D.22846 = (int) D.22845;
        D.22847 = __s2 + 2;
        D.22848 = *D.22847;
        D.22849 = (int) D.22848;
        __result = D.22846 - D.22849;
        D.22850 = __s2_len > 2;
        D.22830 = __result == 0;
        D.22851 = D.22850 & D.22830;
        if (D.22851 != 0) goto <D.22852>; else goto <D.22853>;
        <D.22852>:
        D.22854 = &MEM[(void *)"System.IO" + 3B];
        D.22855 = *D.22854;
        D.22856 = (int) D.22855;
        D.22857 = __s2 + 3;
        D.22858 = *D.22857;
        D.22859 = (int) D.22858;
        __result = D.22856 - D.22859;
        <D.22853>:
        <D.22843>:
        <D.22833>:
      }
      D.20029 = __result;
    }
    iftmp.58 = -D.20029;
    goto <D.22860>;
    <D.22823>:
    D.22556 = o->vtable;
    D.22557 = D.22556->klass;
    D.22703 = D.22557->name_space;
    iftmp.58 = __builtin_strcmp (D.22703, "System.IO");
    <D.22860>:
    D.20030 = iftmp.58;
  }
  if (D.20030 == 0) goto <D.22861>; else goto <D.22862>;
  <D.22861>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22556 = o->vtable;
      D.22557 = D.22556->klass;
      __s2 = D.22557->name;
      D.22866 = "MemoryStream";
      D.22867 = MEM[(const unsigned char *)D.22866];
      D.22868 = (int) D.22867;
      D.22869 = *__s2;
      D.22870 = (int) D.22869;
      __result = D.22868 - D.22870;
      {
        D.22871 = __s2_len != 0;
        D.22872 = __result == 0;
        D.22873 = D.22871 & D.22872;
        if (D.22873 != 0) goto <D.22874>; else goto <D.22875>;
        <D.22874>:
        D.22876 = &MEM[(void *)"MemoryStream" + 1B];
        D.22877 = *D.22876;
        D.22878 = (int) D.22877;
        D.22879 = __s2 + 1;
        D.22880 = *D.22879;
        D.22881 = (int) D.22880;
        __result = D.22878 - D.22881;
        D.22882 = __s2_len > 1;
        D.22872 = __result == 0;
        D.22883 = D.22882 & D.22872;
        if (D.22883 != 0) goto <D.22884>; else goto <D.22885>;
        <D.22884>:
        D.22886 = &MEM[(void *)"MemoryStream" + 2B];
        D.22887 = *D.22886;
        D.22888 = (int) D.22887;
        D.22889 = __s2 + 2;
        D.22890 = *D.22889;
        D.22891 = (int) D.22890;
        __result = D.22888 - D.22891;
        D.22892 = __s2_len > 2;
        D.22872 = __result == 0;
        D.22893 = D.22892 & D.22872;
        if (D.22893 != 0) goto <D.22894>; else goto <D.22895>;
        <D.22894>:
        D.22896 = &MEM[(void *)"MemoryStream" + 3B];
        D.22897 = *D.22896;
        D.22898 = (int) D.22897;
        D.22899 = __s2 + 3;
        D.22900 = *D.22899;
        D.22901 = (int) D.22900;
        __result = D.22898 - D.22901;
        <D.22895>:
        <D.22885>:
        <D.22875>:
      }
      D.20038 = __result;
    }
    iftmp.59 = -D.20038;
    goto <D.22902>;
    <D.22865>:
    D.22556 = o->vtable;
    D.22557 = D.22556->klass;
    D.22746 = D.22557->name;
    iftmp.59 = __builtin_strcmp (D.22746, "MemoryStream");
    <D.22902>:
    D.20039 = iftmp.59;
  }
  if (D.20039 == 0) goto <D.22903>; else goto <D.22904>;
  <D.22903>:
  D.22563 = 1;
  return D.22563;
  <D.22904>:
  <D.22862>:
  <D.22820>:
  <D.22778>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22578 = ref->vtable;
      D.22579 = D.22578->klass;
      __s2 = D.22579->name_space;
      D.22908 = "System.Runtime.Remoting.Messaging";
      D.22909 = MEM[(const unsigned char *)D.22908];
      D.22910 = (int) D.22909;
      D.22911 = *__s2;
      D.22912 = (int) D.22911;
      __result = D.22910 - D.22912;
      {
        D.22913 = __s2_len != 0;
        D.22914 = __result == 0;
        D.22915 = D.22913 & D.22914;
        if (D.22915 != 0) goto <D.22916>; else goto <D.22917>;
        <D.22916>:
        D.22918 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 1B];
        D.22919 = *D.22918;
        D.22920 = (int) D.22919;
        D.22921 = __s2 + 1;
        D.22922 = *D.22921;
        D.22923 = (int) D.22922;
        __result = D.22920 - D.22923;
        D.22924 = __s2_len > 1;
        D.22914 = __result == 0;
        D.22925 = D.22924 & D.22914;
        if (D.22925 != 0) goto <D.22926>; else goto <D.22927>;
        <D.22926>:
        D.22928 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 2B];
        D.22929 = *D.22928;
        D.22930 = (int) D.22929;
        D.22931 = __s2 + 2;
        D.22932 = *D.22931;
        D.22933 = (int) D.22932;
        __result = D.22930 - D.22933;
        D.22934 = __s2_len > 2;
        D.22914 = __result == 0;
        D.22935 = D.22934 & D.22914;
        if (D.22935 != 0) goto <D.22936>; else goto <D.22937>;
        <D.22936>:
        D.22938 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 3B];
        D.22939 = *D.22938;
        D.22940 = (int) D.22939;
        D.22941 = __s2 + 3;
        D.22942 = *D.22941;
        D.22943 = (int) D.22942;
        __result = D.22940 - D.22943;
        <D.22937>:
        <D.22927>:
        <D.22917>:
      }
      D.20047 = __result;
    }
    iftmp.60 = -D.20047;
    goto <D.22944>;
    <D.22907>:
    D.22578 = ref->vtable;
    D.22579 = D.22578->klass;
    D.22617 = D.22579->name_space;
    iftmp.60 = __builtin_strcmp (D.22617, "System.Runtime.Remoting.Messaging");
    <D.22944>:
    D.20048 = iftmp.60;
  }
  if (D.20048 == 0) goto <D.22945>; else goto <D.22946>;
  <D.22945>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22578 = ref->vtable;
      D.22579 = D.22578->klass;
      __s2 = D.22579->name;
      D.22950 = "AsyncResult";
      D.22951 = MEM[(const unsigned char *)D.22950];
      D.22952 = (int) D.22951;
      D.22953 = *__s2;
      D.22954 = (int) D.22953;
      __result = D.22952 - D.22954;
      {
        D.22955 = __s2_len != 0;
        D.22956 = __result == 0;
        D.22957 = D.22955 & D.22956;
        if (D.22957 != 0) goto <D.22958>; else goto <D.22959>;
        <D.22958>:
        D.22960 = &MEM[(void *)"AsyncResult" + 1B];
        D.22961 = *D.22960;
        D.22962 = (int) D.22961;
        D.22963 = __s2 + 1;
        D.22964 = *D.22963;
        D.22965 = (int) D.22964;
        __result = D.22962 - D.22965;
        D.22966 = __s2_len > 1;
        D.22956 = __result == 0;
        D.22967 = D.22966 & D.22956;
        if (D.22967 != 0) goto <D.22968>; else goto <D.22969>;
        <D.22968>:
        D.22970 = &MEM[(void *)"AsyncResult" + 2B];
        D.22971 = *D.22970;
        D.22972 = (int) D.22971;
        D.22973 = __s2 + 2;
        D.22974 = *D.22973;
        D.22975 = (int) D.22974;
        __result = D.22972 - D.22975;
        D.22976 = __s2_len > 2;
        D.22956 = __result == 0;
        D.22977 = D.22976 & D.22956;
        if (D.22977 != 0) goto <D.22978>; else goto <D.22979>;
        <D.22978>:
        D.22980 = &MEM[(void *)"AsyncResult" + 3B];
        D.22981 = *D.22980;
        D.22982 = (int) D.22981;
        D.22983 = __s2 + 3;
        D.22984 = *D.22983;
        D.22985 = (int) D.22984;
        __result = D.22982 - D.22985;
        <D.22979>:
        <D.22969>:
        <D.22959>:
      }
      D.20056 = __result;
    }
    iftmp.61 = -D.20056;
    goto <D.22986>;
    <D.22949>:
    D.22578 = ref->vtable;
    D.22579 = D.22578->klass;
    D.22660 = D.22579->name;
    iftmp.61 = __builtin_strcmp (D.22660, "AsyncResult");
    <D.22986>:
    D.20057 = iftmp.61;
  }
  if (D.20057 == 0) goto <D.22987>; else goto <D.22988>;
  <D.22987>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22556 = o->vtable;
      D.22557 = D.22556->klass;
      __s2 = D.22557->name_space;
      D.22666 = "System";
      D.22667 = MEM[(const unsigned char *)D.22666];
      D.22668 = (int) D.22667;
      D.22992 = *__s2;
      D.22993 = (int) D.22992;
      __result = D.22668 - D.22993;
      {
        D.22994 = __s2_len != 0;
        D.22995 = __result == 0;
        D.22996 = D.22994 & D.22995;
        if (D.22996 != 0) goto <D.22997>; else goto <D.22998>;
        <D.22997>:
        D.22676 = &MEM[(void *)"System" + 1B];
        D.22677 = *D.22676;
        D.22678 = (int) D.22677;
        D.22999 = __s2 + 1;
        D.23000 = *D.22999;
        D.23001 = (int) D.23000;
        __result = D.22678 - D.23001;
        D.23002 = __s2_len > 1;
        D.22995 = __result == 0;
        D.23003 = D.23002 & D.22995;
        if (D.23003 != 0) goto <D.23004>; else goto <D.23005>;
        <D.23004>:
        D.22686 = &MEM[(void *)"System" + 2B];
        D.22687 = *D.22686;
        D.22688 = (int) D.22687;
        D.23006 = __s2 + 2;
        D.23007 = *D.23006;
        D.23008 = (int) D.23007;
        __result = D.22688 - D.23008;
        D.23009 = __s2_len > 2;
        D.22995 = __result == 0;
        D.23010 = D.23009 & D.22995;
        if (D.23010 != 0) goto <D.23011>; else goto <D.23012>;
        <D.23011>:
        D.22696 = &MEM[(void *)"System" + 3B];
        D.22697 = *D.22696;
        D.22698 = (int) D.22697;
        D.23013 = __s2 + 3;
        D.23014 = *D.23013;
        D.23015 = (int) D.23014;
        __result = D.22698 - D.23015;
        <D.23012>:
        <D.23005>:
        <D.22998>:
      }
      D.20065 = __result;
    }
    iftmp.62 = -D.20065;
    goto <D.23016>;
    <D.22991>:
    D.22556 = o->vtable;
    D.22557 = D.22556->klass;
    D.22703 = D.22557->name_space;
    iftmp.62 = __builtin_strcmp (D.22703, "System");
    <D.23016>:
    D.20066 = iftmp.62;
  }
  if (D.20066 == 0) goto <D.23017>; else goto <D.23018>;
  <D.23017>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22556 = o->vtable;
      D.22557 = D.22556->klass;
      __s2 = D.22557->name;
      D.22709 = "Object[]";
      D.22710 = MEM[(const unsigned char *)D.22709];
      D.22711 = (int) D.22710;
      D.23022 = *__s2;
      D.23023 = (int) D.23022;
      __result = D.22711 - D.23023;
      {
        D.23024 = __s2_len != 0;
        D.23025 = __result == 0;
        D.23026 = D.23024 & D.23025;
        if (D.23026 != 0) goto <D.23027>; else goto <D.23028>;
        <D.23027>:
        D.22719 = &MEM[(void *)"Object[]" + 1B];
        D.22720 = *D.22719;
        D.22721 = (int) D.22720;
        D.23029 = __s2 + 1;
        D.23030 = *D.23029;
        D.23031 = (int) D.23030;
        __result = D.22721 - D.23031;
        D.23032 = __s2_len > 1;
        D.23025 = __result == 0;
        D.23033 = D.23032 & D.23025;
        if (D.23033 != 0) goto <D.23034>; else goto <D.23035>;
        <D.23034>:
        D.22729 = &MEM[(void *)"Object[]" + 2B];
        D.22730 = *D.22729;
        D.22731 = (int) D.22730;
        D.23036 = __s2 + 2;
        D.23037 = *D.23036;
        D.23038 = (int) D.23037;
        __result = D.22731 - D.23038;
        D.23039 = __s2_len > 2;
        D.23025 = __result == 0;
        D.23040 = D.23039 & D.23025;
        if (D.23040 != 0) goto <D.23041>; else goto <D.23042>;
        <D.23041>:
        D.22739 = &MEM[(void *)"Object[]" + 3B];
        D.22740 = *D.22739;
        D.22741 = (int) D.22740;
        D.23043 = __s2 + 3;
        D.23044 = *D.23043;
        D.23045 = (int) D.23044;
        __result = D.22741 - D.23045;
        <D.23042>:
        <D.23035>:
        <D.23028>:
      }
      D.20074 = __result;
    }
    iftmp.63 = -D.20074;
    goto <D.23046>;
    <D.23021>:
    D.22556 = o->vtable;
    D.22557 = D.22556->klass;
    D.22746 = D.22557->name;
    iftmp.63 = __builtin_strcmp (D.22746, "Object[]");
    <D.23046>:
    D.20075 = iftmp.63;
  }
  if (D.20075 == 0) goto <D.23047>; else goto <D.23048>;
  <D.23047>:
  D.23049 = mono_thread_pool_is_queue_array (o);
  if (D.23049 != 0) goto <D.23050>; else goto <D.23051>;
  <D.23050>:
  D.22563 = 1;
  return D.22563;
  <D.23051>:
  <D.23048>:
  <D.23018>:
  <D.22988>:
  <D.22946>:
  D.22563 = 0;
  return D.22563;
}


mono_class_has_parent_fast (struct MonoClass * klass, struct MonoClass * parent)
{
  gboolean D.23053;
  int iftmp.64;
  short unsigned int D.23057;
  short unsigned int D.23058;
  struct MonoClass * * D.23060;
  long unsigned int D.23061;
  long unsigned int D.23062;
  sizetype D.23063;
  struct MonoClass * * D.23064;
  struct MonoClass * D.23065;

  D.23057 = klass->idepth;
  D.23058 = parent->idepth;
  if (D.23057 >= D.23058) goto <D.23059>; else goto <D.23055>;
  <D.23059>:
  D.23060 = klass->supertypes;
  D.23058 = parent->idepth;
  D.23061 = (long unsigned int) D.23058;
  D.23062 = D.23061 * 8;
  D.23063 = D.23062 + 18446744073709551608;
  D.23064 = D.23060 + D.23063;
  D.23065 = *D.23064;
  if (D.23065 == parent) goto <D.23066>; else goto <D.23055>;
  <D.23066>:
  iftmp.64 = 1;
  goto <D.23056>;
  <D.23055>:
  iftmp.64 = 0;
  <D.23056>:
  D.23053 = iftmp.64;
  return D.23053;
}


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

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

    object = current->array;
    if (object != 0B) goto <D.23070>; else goto <D.23068>;
    <D.23070>:
    D.23071 = object->vtable;
    if (D.23071 == 0B) goto <D.23072>; else goto <D.23068>;
    <D.23072>:
    {
      struct EphemeronLinkNode * tmp;

      tmp = current;
      if (prev != 0B) goto <D.23073>; else goto <D.23074>;
      <D.23073>:
      ephemeron_list.65 = current->next;
      prev->next = ephemeron_list.65;
      goto <D.23076>;
      <D.23074>:
      ephemeron_list.65 = current->next;
      ephemeron_list = ephemeron_list.65;
      <D.23076>:
      current = current->next;
      sgen_free_internal (tmp, 18);
    }
    goto <D.23069>;
    <D.23068>:
    prev = current;
    current = current->next;
    <D.23069>:
  }
  <D.21147>:
  if (current != 0B) goto <D.21146>; else goto <D.21148>;
  <D.21148>:
}


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

  process_object_for_domain_clearing (obj, domain);
  remove = need_remove_object_for_domain (obj, domain);
  if (remove != 0) goto <D.23077>; else goto <D.23078>;
  <D.23077>:
  D.23079 = MEM[(struct MonoObject *)obj].synchronisation;
  if (D.23079 != 0B) goto <D.23080>; else goto <D.23081>;
  <D.23080>:
  {
    void * * dislink;

    dislink = mono_monitor_get_object_monitor_weak_link (obj);
    if (dislink != 0B) goto <D.23082>; else goto <D.23083>;
    <D.23082>:
    sgen_register_disappearing_link (0B, dislink, 0, 1);
    <D.23083>:
  }
  <D.23081>:
  <D.23078>:
  D.23084 = remove;
  return D.23084;
}


process_object_for_domain_clearing (char * start, struct MonoDomain * domain)
{
  long unsigned int D.23086;
  long unsigned int D.23087;
  struct MonoClass * D.23088;
  struct MonoClass * D.23089;
  struct MonoVTable * D.23092;
  struct MonoDomain * D.23093;
  struct MonoDomain * D.23094;
  _Bool D.23095;
  long int D.23096;
  long int D.23097;
  struct MonoClass * D.23100;
  int D.23101;
  long unsigned int D.23108;
  long unsigned int D.23109;
  struct MonoVTable * D.23111;
  struct MonoDomain * D.23112;
  struct FILE * gc_debug_file.66;
  struct GCVTable * vt;

  D.23086 = MEM[(mword *)start];
  D.23087 = D.23086 & 18446744073709551612;
  vt = (struct GCVTable *) D.23087;
  D.23088 = vt->klass;
  D.23089 = mono_defaults.internal_thread_class;
  if (D.23088 == D.23089) goto <D.23090>; else goto <D.23091>;
  <D.23090>:
  D.23092 = MEM[(struct MonoObject *)start].vtable;
  D.23093 = D.23092->domain;
  D.23094 = mono_get_root_domain ();
  D.23095 = D.23093 != D.23094;
  D.23096 = (long int) D.23095;
  D.23097 = __builtin_expect (D.23096, 0);
  if (D.23097 != 0) goto <D.23098>; else goto <D.23099>;
  <D.23098>:
  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.23099>:
  <D.23091>:
  D.23100 = mono_defaults.real_proxy_class;
  D.23088 = vt->klass;
  D.23101 = mono_class_has_parent_fast (D.23088, D.23100);
  if (D.23101 != 0) goto <D.23102>; else goto <D.23103>;
  <D.23102>:
  {
    struct MonoObject * server;

    server = MEM[(struct MonoRealProxy *)start].unwrapped_server;
    if (server != 0B) goto <D.23106>; else goto <D.23107>;
    <D.23106>:
    D.23108 = MEM[(mword *)server];
    D.23109 = D.23108 & 18446744073709551612;
    if (D.23109 == 0) goto <D.23104>; else goto <D.23110>;
    <D.23110>:
    D.23111 = server->vtable;
    D.23112 = D.23111->domain;
    if (D.23112 == domain) goto <D.23104>; else goto <D.23105>;
    <D.23104>:
    if (0 != 0) goto <D.23113>; else goto <D.23114>;
    <D.23113>:
    gc_debug_file.66 = gc_debug_file;
    fprintf (gc_debug_file.66, "Cleaning up remote pointer in %p to object %p\n", start, server);
    gc_debug_file.66 = gc_debug_file;
    fflush (gc_debug_file.66);
    <D.23114>:
    MEM[(struct MonoRealProxy *)start].unwrapped_server = 0B;
    <D.23105>:
    <D.23107>:
  }
  <D.23103>:
}


need_remove_object_for_domain (char * start, struct MonoDomain * domain)
{
  struct MonoVTable * D.23116;
  struct MonoDomain * D.23117;
  struct FILE * gc_debug_file.67;
  gboolean D.23123;

  D.23116 = MEM[(struct MonoObject *)start].vtable;
  D.23117 = D.23116->domain;
  if (D.23117 == domain) goto <D.23118>; else goto <D.23119>;
  <D.23118>:
  if (0 != 0) goto <D.23120>; else goto <D.23121>;
  <D.23120>:
  gc_debug_file.67 = gc_debug_file;
  fprintf (gc_debug_file.67, "Need to cleanup object %p\n", start);
  gc_debug_file.67 = gc_debug_file;
  fflush (gc_debug_file.67);
  <D.23121>:
  D.23123 = 1;
  return D.23123;
  <D.23119>:
  D.23123 = 0;
  return D.23123;
}


sgen_add_to_global_remset (void * ptr, void * obj)
{
  int D.23125;
  _Bool D.23126;
  long int D.23127;
  long int D.23128;
  int D.23131;
  int current_collection_generation.68;
  _Bool D.23135;
  long int D.23136;
  long int D.23137;
  int D.23143;
  _Bool D.23144;
  long int D.23145;
  long int D.23146;
  long unsigned int D.23149;
  long unsigned int D.23150;
  int iftmp.69;
  int D.23156;
  int D.23158;
  _Bool D.23160;
  long int D.23161;
  long int D.23162;
  int D.23166;
  void (*<T11da>) (void *) D.23169;
  int do_pin_stats.70;
  _Bool D.23171;
  long int D.23172;
  long int D.23173;
  struct FILE * gc_debug_file.71;

  D.23125 = sgen_ptr_in_nursery (obj);
  D.23126 = D.23125 == 0;
  D.23127 = (long int) D.23126;
  D.23128 = __builtin_expect (D.23127, 0);
  if (D.23128 != 0) goto <D.23129>; else goto <D.23130>;
  <D.23129>:
  monoeg_g_log (0B, 4, "Target pointer of global remset must be in the nursery");
  <D.20487>:
  goto <D.20487>;
  <D.23130>:
  D.23131 = major_collector.is_concurrent;
  if (D.23131 == 0) goto <D.23132>; else goto <D.23133>;
  <D.23132>:
  current_collection_generation.68 = current_collection_generation;
  D.23135 = current_collection_generation.68 == -1;
  D.23136 = (long int) D.23135;
  D.23137 = __builtin_expect (D.23136, 0);
  if (D.23137 != 0) goto <D.23138>; else goto <D.23139>;
  <D.23138>:
  monoeg_g_log (0B, 4, "Global remsets can only be added during collections");
  <D.20488>:
  goto <D.20488>;
  <D.23139>:
  goto <D.23140>;
  <D.23133>:
  current_collection_generation.68 = current_collection_generation;
  if (current_collection_generation.68 == -1) goto <D.23141>; else goto <D.23142>;
  <D.23141>:
  D.23143 = sgen_concurrent_collection_in_progress ();
  D.23144 = D.23143 == 0;
  D.23145 = (long int) D.23144;
  D.23146 = __builtin_expect (D.23145, 0);
  if (D.23146 != 0) goto <D.23147>; else goto <D.23148>;
  <D.23147>:
  monoeg_g_log (0B, 4, "Global remsets outside of collection pauses can only be added by the concurrent collector");
  <D.20489>:
  goto <D.20489>;
  <D.23148>:
  <D.23142>:
  <D.23140>:
  D.23149 = MEM[(mword *)obj];
  D.23150 = D.23149 & 2;
  if (D.23150 == 0) goto <D.23151>; else goto <D.23152>;
  <D.23151>:
  D.23156 = sgen_minor_collector.is_split;
  if (D.23156 == 0) goto <D.23157>; else goto <D.23154>;
  <D.23157>:
  D.23158 = sgen_concurrent_collection_in_progress ();
  if (D.23158 == 0) goto <D.23159>; else goto <D.23154>;
  <D.23159>:
  iftmp.69 = 1;
  goto <D.23155>;
  <D.23154>:
  iftmp.69 = 0;
  <D.23155>:
  D.23160 = iftmp.69 != 0;
  D.23161 = (long int) D.23160;
  D.23162 = __builtin_expect (D.23161, 0);
  if (D.23162 != 0) goto <D.23163>; else goto <D.23164>;
  <D.23163>:
  monoeg_g_log (0B, 4, "Non-pinned objects can only remain in nursery if it is a split nursery");
  <D.20490>:
  goto <D.20490>;
  <D.23164>:
  goto <D.23165>;
  <D.23152>:
  D.23166 = sgen_cement_lookup_or_register (obj);
  if (D.23166 != 0) goto <D.23167>; else goto <D.23168>;
  <D.23167>:
  return;
  <D.23168>:
  <D.23165>:
  D.23169 = remset.record_pointer;
  D.23169 (ptr);
  do_pin_stats.70 = do_pin_stats;
  D.23171 = do_pin_stats.70 != 0;
  D.23172 = (long int) D.23171;
  D.23173 = __builtin_expect (D.23172, 0);
  if (D.23173 != 0) goto <D.23174>; else goto <D.23175>;
  <D.23174>:
  sgen_pin_stats_register_global_remset (obj);
  <D.23175>:
  if (0 != 0) goto <D.23176>; else goto <D.23177>;
  <D.23176>:
  gc_debug_file.71 = gc_debug_file;
  fprintf (gc_debug_file.71, "Adding global remset for %p\n", ptr);
  gc_debug_file.71 = gc_debug_file;
  fflush (gc_debug_file.71);
  <D.23177>:
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.23180;
  int sgen_nursery_bits.72;
  int D.23182;
  int D.23183;
  long unsigned int D.23184;
  long unsigned int p.73;
  long unsigned int D.23186;
  char * sgen_nursery_start.74;
  long unsigned int sgen_nursery_start.75;
  _Bool D.23189;

  sgen_nursery_bits.72 = sgen_nursery_bits;
  D.23182 = 1 << sgen_nursery_bits.72;
  D.23183 = -D.23182;
  D.23184 = (long unsigned int) D.23183;
  p.73 = (long unsigned int) p;
  D.23186 = D.23184 & p.73;
  sgen_nursery_start.74 = sgen_nursery_start;
  sgen_nursery_start.75 = (long unsigned int) sgen_nursery_start.74;
  D.23189 = D.23186 == sgen_nursery_start.75;
  D.23180 = (gboolean) D.23189;
  return D.23180;
}


sgen_drain_gray_stack (int max_objs, struct ScanCopyContext ctx)
{
  struct GrayQueueSection * D.23193;
  int D.23197;
  _Bool D.23198;
  long int D.23199;
  long int D.23200;
  int D.23204;
  gboolean D.23207;
  const char * D.23210;
  struct FILE * gc_debug_file.76;
  const char * D.23222;
  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.23191>; else goto <D.23192>;
  <D.23191>:
  <D.20498>:
  D.23193 = queue->first;
  if (D.23193 == 0B) goto <D.23194>; else goto <D.23195>;
  <D.23194>:
  obj = 0B;
  goto <D.23196>;
  <D.23195>:
  D.23193 = queue->first;
  D.23197 = D.23193->end;
  D.23198 = D.23197 == 1;
  D.23199 = (long int) D.23198;
  D.23200 = __builtin_expect (D.23199, 0);
  if (D.23200 != 0) goto <D.23201>; else goto <D.23202>;
  <D.23201>:
  obj = sgen_gray_object_dequeue (queue);
  goto <D.23203>;
  <D.23202>:
  D.23193 = queue->first;
  D.23193 = queue->first;
  D.23197 = D.23193->end;
  D.23204 = D.23197 + -1;
  D.23193->end = D.23204;
  D.23197 = D.23193->end;
  obj = D.23193->objects[D.23197];
  <D.23203>:
  <D.23196>:
  if (obj == 0B) goto <D.23205>; else goto <D.23206>;
  <D.23205>:
  D.23207 = 1;
  return D.23207;
  <D.23206>:
  if (0 != 0) goto <D.23208>; else goto <D.23209>;
  <D.23208>:
  D.23210 = safe_name (obj);
  gc_debug_file.76 = gc_debug_file;
  fprintf (gc_debug_file.76, "Precise gray object scan %p (%s)\n", obj, D.23210);
  gc_debug_file.76 = gc_debug_file;
  fflush (gc_debug_file.76);
  <D.23209>:
  scan_func (obj, queue);
  goto <D.20498>;
  <D.23192>:
  {
    int i;

    <D.20503>:
    i = 0;
    goto <D.20501>;
    <D.20500>:
    D.23193 = queue->first;
    if (D.23193 == 0B) goto <D.23212>; else goto <D.23213>;
    <D.23212>:
    obj = 0B;
    goto <D.23214>;
    <D.23213>:
    D.23193 = queue->first;
    D.23197 = D.23193->end;
    D.23198 = D.23197 == 1;
    D.23199 = (long int) D.23198;
    D.23200 = __builtin_expect (D.23199, 0);
    if (D.23200 != 0) goto <D.23215>; else goto <D.23216>;
    <D.23215>:
    obj = sgen_gray_object_dequeue (queue);
    goto <D.23217>;
    <D.23216>:
    D.23193 = queue->first;
    D.23193 = queue->first;
    D.23197 = D.23193->end;
    D.23204 = D.23197 + -1;
    D.23193->end = D.23204;
    D.23197 = D.23193->end;
    obj = D.23193->objects[D.23197];
    <D.23217>:
    <D.23214>:
    if (obj == 0B) goto <D.23218>; else goto <D.23219>;
    <D.23218>:
    D.23207 = 1;
    return D.23207;
    <D.23219>:
    if (0 != 0) goto <D.23220>; else goto <D.23221>;
    <D.23220>:
    D.23222 = safe_name (obj);
    gc_debug_file.76 = gc_debug_file;
    fprintf (gc_debug_file.76, "Precise gray object scan %p (%s)\n", obj, D.23222);
    gc_debug_file.76 = gc_debug_file;
    fflush (gc_debug_file.76);
    <D.23221>:
    scan_func (obj, queue);
    i = i + 1;
    <D.20501>:
    if (i != max_objs) goto <D.20500>; else goto <D.20502>;
    <D.20502>:
    if (max_objs < 0) goto <D.20503>; else goto <D.20504>;
    <D.20504>:
    D.23207 = 0;
    return D.23207;
  }
}


sgen_pin_objects_in_section (struct GCMemSection * section, struct ScanCopyContext ctx)
{
  char * D.23226;
  char * D.23227;
  long unsigned int D.23228;
  long unsigned int D.23229;
  void * * D.23230;
  int num_entries;

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

    start = section->pin_queue_start;
    D.23226 = section->next_data;
    D.23227 = section->data;
    D.23228 = (long unsigned int) num_entries;
    D.23229 = D.23228 * 8;
    D.23230 = start + D.23229;
    reduced_to = pin_objects_from_addresses (section, start, D.23230, D.23227, D.23226, ctx);
    section->pin_queue_num_entries = reduced_to;
    if (reduced_to == 0) goto <D.23231>; else goto <D.23232>;
    <D.23231>:
    section->pin_queue_start = 0B;
    <D.23232>:
  }
  <D.23225>:
}


pin_objects_from_addresses (struct GCMemSection * section, void * * start, void * * end, void * start_nursery, void * end_nursery, struct ScanCopyContext ctx)
{
  _Bool D.23233;
  _Bool D.23234;
  _Bool D.23235;
  struct FILE * gc_debug_file.77;
  char * D.23245;
  long int addr.78;
  char * D.23249;
  long int D.23250;
  long int D.23251;
  long int D.23252;
  unsigned int idx.79;
  unsigned int D.23254;
  _Bool D.23255;
  long int D.23256;
  long int D.23257;
  char * * D.23260;
  long unsigned int D.23261;
  long unsigned int D.23262;
  char * * D.23263;
  _Bool D.23264;
  _Bool D.23265;
  _Bool D.23266;
  _Bool D.23269;
  _Bool D.23270;
  _Bool D.23271;
  void * D.23277;
  long unsigned int search_start.80;
  long unsigned int D.23281;
  long unsigned int D.23282;
  unsigned int D.23283;
  unsigned int D.23284;
  long unsigned int D.23285;
  struct MonoThreadsSync * D.23286;
  const char * D.23292;
  const char * D.23302;
  long unsigned int D.23303;
  long unsigned int D.23304;
  int iftmp.81;
  struct GrayQueueSection * D.23309;
  int D.23311;
  _Bool D.23312;
  long int D.23313;
  long int D.23314;
  int D.23318;
  int D.23319;
  int do_pin_stats.82;
  _Bool D.23321;
  long int D.23322;
  long int D.23323;
  long unsigned int D.23326;
  long unsigned int D.23327;
  void * * D.23328;
  <unnamed type> D.23329;
  unsigned int D.23330;
  void * * D.23333;
  void * D.23334;
  long long int D.23335;
  long long int stat_pinned_objects.83;
  long long int stat_pinned_objects.84;
  int D.23338;
  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.20523>;
  <D.20530>:
  addr = *start;
  D.23233 = addr != last;
  D.23234 = addr >= start_nursery;
  D.23235 = D.23233 & D.23234;
  if (D.23235 != 0) goto <D.23236>; else goto <D.23237>;
  <D.23236>:
  if (addr < end_nursery) goto <D.23238>; else goto <D.23239>;
  <D.23238>:
  if (0 != 0) goto <D.23240>; else goto <D.23241>;
  <D.23240>:
  gc_debug_file.77 = gc_debug_file;
  fprintf (gc_debug_file.77, "Considering pinning addr %p\n", addr);
  gc_debug_file.77 = gc_debug_file;
  fflush (gc_debug_file.77);
  <D.23241>:
  if (addr >= last_obj) goto <D.23243>; else goto <D.23244>;
  <D.23243>:
  D.23245 = last_obj + last_obj_size;
  if (D.23245 > addr) goto <D.23246>; else goto <D.23247>;
  <D.23246>:
  start = start + 8;
  // predicted unlikely by continue predictor.
  goto <D.20523>;
  <D.23247>:
  <D.23244>:
  addr.78 = (long int) addr;
  D.23249 = section->data;
  D.23250 = (long int) D.23249;
  D.23251 = addr.78 - D.23250;
  D.23252 = D.23251 / 8192;
  idx = (int) D.23252;
  idx.79 = (unsigned int) idx;
  D.23254 = section->num_scan_start;
  D.23255 = idx.79 >= D.23254;
  D.23256 = (long int) D.23255;
  D.23257 = __builtin_expect (D.23256, 0);
  if (D.23257 != 0) goto <D.23258>; else goto <D.23259>;
  <D.23258>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1246, "idx < section->num_scan_start");
  <D.23259>:
  D.23260 = section->scan_starts;
  D.23261 = (long unsigned int) idx;
  D.23262 = D.23261 * 8;
  D.23263 = D.23260 + D.23262;
  search_start = *D.23263;
  D.23264 = search_start == 0B;
  D.23265 = search_start > addr;
  D.23266 = D.23264 | D.23265;
  if (D.23266 != 0) goto <D.23267>; else goto <D.23268>;
  <D.23267>:
  goto <D.20526>;
  <D.20525>:
  idx = idx + -1;
  D.23260 = section->scan_starts;
  D.23261 = (long unsigned int) idx;
  D.23262 = D.23261 * 8;
  D.23263 = D.23260 + D.23262;
  search_start = *D.23263;
  D.23269 = search_start != 0B;
  D.23270 = search_start <= addr;
  D.23271 = D.23269 & D.23270;
  if (D.23271 != 0) goto <D.20524>; else goto <D.23272>;
  <D.23272>:
  <D.20526>:
  if (idx != 0) goto <D.20525>; else goto <D.20524>;
  <D.20524>:
  D.23264 = search_start == 0B;
  D.23265 = search_start > addr;
  D.23266 = D.23264 | D.23265;
  if (D.23266 != 0) goto <D.23273>; else goto <D.23274>;
  <D.23273>:
  search_start = start_nursery;
  <D.23274>:
  <D.23268>:
  if (search_start < last_obj) goto <D.23275>; else goto <D.23276>;
  <D.23275>:
  search_start = last_obj + last_obj_size;
  <D.23276>:
  <D.20529>:
  D.23277 = MEM[(void * *)search_start];
  if (D.23277 == 0B) goto <D.23278>; else goto <D.23279>;
  <D.23278>:
  search_start.80 = (long unsigned int) search_start;
  D.23281 = search_start.80 + 15;
  D.23282 = D.23281 & 18446744073709551608;
  search_start = (void *) D.23282;
  // predicted unlikely by continue predictor.
  goto <D.20527>;
  <D.23279>:
  last_obj = search_start;
  D.23283 = sgen_safe_object_get_size (search_start);
  D.23284 = D.23283 + 7;
  D.23285 = (long unsigned int) D.23284;
  last_obj_size = D.23285 & 4294967288;
  D.23286 = MEM[(struct MonoObject *)last_obj].synchronisation;
  if (D.23286 == -1B) goto <D.23287>; else goto <D.23288>;
  <D.23287>:
  goto <D.23289>;
  <D.23288>:
  if (0 != 0) goto <D.23290>; else goto <D.23291>;
  <D.23290>:
  D.23292 = safe_name (last_obj);
  gc_debug_file.77 = gc_debug_file;
  fprintf (gc_debug_file.77, "Pinned try match %p (%s), size %zd\n", last_obj, D.23292, last_obj_size);
  gc_debug_file.77 = gc_debug_file;
  fflush (gc_debug_file.77);
  <D.23291>:
  if (addr >= search_start) goto <D.23293>; else goto <D.23294>;
  <D.23293>:
  D.23245 = last_obj + last_obj_size;
  if (D.23245 > addr) goto <D.23295>; else goto <D.23296>;
  <D.23295>:
  if (scan_func != 0B) goto <D.23297>; else goto <D.23298>;
  <D.23297>:
  scan_func (search_start, queue);
  goto <D.23299>;
  <D.23298>:
  if (0 != 0) goto <D.23300>; else goto <D.23301>;
  <D.23300>:
  D.23302 = safe_name (search_start);
  D.23277 = MEM[(void * *)search_start];
  gc_debug_file.77 = gc_debug_file;
  fprintf (gc_debug_file.77, "Pinned object %p, vtable %p (%s), count %d\n\n", search_start, D.23277, D.23302, count);
  gc_debug_file.77 = gc_debug_file;
  fflush (gc_debug_file.77);
  <D.23301>:
  D.23303 = MEM[(mword *)search_start];
  D.23304 = D.23303 | 2;
  MEM[(mword *)search_start] = D.23304;
  D.23309 = queue->first;
  if (D.23309 == 0B) goto <D.23306>; else goto <D.23310>;
  <D.23310>:
  D.23309 = queue->first;
  D.23311 = D.23309->end;
  if (D.23311 == 125) goto <D.23306>; else goto <D.23307>;
  <D.23306>:
  iftmp.81 = 1;
  goto <D.23308>;
  <D.23307>:
  iftmp.81 = 0;
  <D.23308>:
  D.23312 = iftmp.81 != 0;
  D.23313 = (long int) D.23312;
  D.23314 = __builtin_expect (D.23313, 0);
  if (D.23314 != 0) goto <D.23315>; else goto <D.23316>;
  <D.23315>:
  sgen_gray_object_enqueue (queue, search_start);
  goto <D.23317>;
  <D.23316>:
  D.23309 = queue->first;
  D.23309 = queue->first;
  D.23311 = D.23309->end;
  D.23318 = D.23311;
  D.23319 = D.23318 + 1;
  D.23309->end = D.23319;
  D.23309->objects[D.23318] = search_start;
  <D.23317>:
  __builtin_prefetch (search_start);
  do_pin_stats.82 = do_pin_stats;
  D.23321 = do_pin_stats.82 != 0;
  D.23322 = (long int) D.23321;
  D.23323 = __builtin_expect (D.23322, 0);
  if (D.23323 != 0) goto <D.23324>; else goto <D.23325>;
  <D.23324>:
  sgen_pin_stats_register_object (search_start, last_obj_size);
  <D.23325>:
  D.23326 = (long unsigned int) count;
  D.23327 = D.23326 * 8;
  D.23328 = definitely_pinned + D.23327;
  *D.23328 = search_start;
  count = count + 1;
  <D.23299>:
  goto <D.20528>;
  <D.23296>:
  <D.23294>:
  <D.23289>:
  search_start = search_start + last_obj_size;
  <D.20527>:
  if (search_start <= addr) goto <D.20529>; else goto <D.20528>;
  <D.20528>:
  last = addr;
  <D.23239>:
  <D.23237>:
  start = start + 8;
  <D.20523>:
  if (start < end) goto <D.20530>; else goto <D.20531>;
  <D.20531>:
  D.23329 = mono_profiler_get_events ();
  D.23330 = D.23329 & 1048576;
  if (D.23330 != 0) goto <D.23331>; else goto <D.23332>;
  <D.23331>:
  {
    struct GCRootReport report;

    try
      {
        report.count = 0;
        idx = 0;
        goto <D.20534>;
        <D.20533>:
        D.23261 = (long unsigned int) idx;
        D.23262 = D.23261 * 8;
        D.23333 = definitely_pinned + D.23262;
        D.23334 = *D.23333;
        add_profile_gc_root (&report, D.23334, 260, 0);
        idx = idx + 1;
        <D.20534>:
        if (idx < count) goto <D.20533>; else goto <D.20535>;
        <D.20535>:
        notify_gc_roots (&report);
      }
    finally
      {
        report = {CLOBBER};
      }
  }
  <D.23332>:
  D.23335 = (long long int) count;
  stat_pinned_objects.83 = stat_pinned_objects;
  stat_pinned_objects.84 = D.23335 + stat_pinned_objects.83;
  stat_pinned_objects = stat_pinned_objects.84;
  D.23338 = count;
  return D.23338;
}


add_profile_gc_root (struct GCRootReport * report, void * object, int rtype, uintptr_t extra_info)
{
  int D.23340;
  int D.23343;
  int D.23344;
  long unsigned int D.23345;
  long unsigned int D.23346;
  struct MonoVTable * D.23347;
  struct MonoClass * D.23348;
  long unsigned int D.23349;

  D.23340 = report->count;
  if (D.23340 == 32) goto <D.23341>; else goto <D.23342>;
  <D.23341>:
  notify_gc_roots (report);
  <D.23342>:
  D.23340 = report->count;
  report->objects[D.23340] = object;
  D.23340 = report->count;
  report->root_types[D.23340] = rtype;
  D.23340 = report->count;
  D.23343 = D.23340;
  D.23344 = D.23343 + 1;
  report->count = D.23344;
  D.23345 = MEM[(mword *)object];
  D.23346 = D.23345 & 18446744073709551612;
  D.23347 = (struct MonoVTable *) D.23346;
  D.23348 = D.23347->klass;
  D.23349 = (long unsigned int) D.23348;
  report->extra_info[D.23343] = D.23349;
}


notify_gc_roots (struct GCRootReport * report)
{
  int D.23350;
  uintptr_t[32] * D.23353;
  int[32] * D.23354;
  void *[32] * D.23355;

  D.23350 = report->count;
  if (D.23350 == 0) goto <D.23351>; else goto <D.23352>;
  <D.23351>:
  return;
  <D.23352>:
  D.23353 = &report->extra_info;
  D.23354 = &report->root_types;
  D.23355 = &report->objects;
  D.23350 = report->count;
  mono_profiler_gc_roots (D.23350, D.23355, D.23354, D.23353);
  report->count = 0;
}


sgen_pin_object (void * object, struct GrayQueue * queue)
{
  int concurrent_collection_in_progress.85;
  _Bool D.23358;
  long int D.23359;
  long int D.23360;
  int D.23363;
  long unsigned int objects_pinned.86;
  long unsigned int objects_pinned.87;
  long unsigned int D.23369;
  long unsigned int D.23370;
  int do_pin_stats.88;
  _Bool D.23372;
  long int D.23373;
  long int D.23374;
  unsigned int D.23377;
  long unsigned int D.23378;
  int iftmp.89;
  struct GrayQueueSection * D.23383;
  int D.23385;
  _Bool D.23386;
  long int D.23387;
  long int D.23388;
  int D.23392;
  int D.23393;

  concurrent_collection_in_progress.85 = concurrent_collection_in_progress;
  D.23358 = concurrent_collection_in_progress.85 != 0;
  D.23359 = (long int) D.23358;
  D.23360 = __builtin_expect (D.23359, 0);
  if (D.23360 != 0) goto <D.23361>; else goto <D.23362>;
  <D.23361>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1355, "!concurrent_collection_in_progress");
  <D.23362>:
  D.23363 = sgen_collection_is_parallel ();
  if (D.23363 != 0) goto <D.23364>; else goto <D.23365>;
  <D.23364>:
  pthread_mutex_lock (&pin_queue_mutex);
  sgen_pin_stage_ptr (object);
  objects_pinned.86 = objects_pinned;
  objects_pinned.87 = objects_pinned.86 + 1;
  objects_pinned = objects_pinned.87;
  pthread_mutex_unlock (&pin_queue_mutex);
  goto <D.23368>;
  <D.23365>:
  D.23369 = MEM[(mword *)object];
  D.23370 = D.23369 | 2;
  MEM[(mword *)object] = D.23370;
  sgen_pin_stage_ptr (object);
  objects_pinned.86 = objects_pinned;
  objects_pinned.87 = objects_pinned.86 + 1;
  objects_pinned = objects_pinned.87;
  do_pin_stats.88 = do_pin_stats;
  D.23372 = do_pin_stats.88 != 0;
  D.23373 = (long int) D.23372;
  D.23374 = __builtin_expect (D.23373, 0);
  if (D.23374 != 0) goto <D.23375>; else goto <D.23376>;
  <D.23375>:
  D.23377 = sgen_safe_object_get_size (object);
  D.23378 = (long unsigned int) D.23377;
  sgen_pin_stats_register_object (object, D.23378);
  <D.23376>:
  <D.23368>:
  D.23383 = queue->first;
  if (D.23383 == 0B) goto <D.23380>; else goto <D.23384>;
  <D.23384>:
  D.23383 = queue->first;
  D.23385 = D.23383->end;
  if (D.23385 == 125) goto <D.23380>; else goto <D.23381>;
  <D.23380>:
  iftmp.89 = 1;
  goto <D.23382>;
  <D.23381>:
  iftmp.89 = 0;
  <D.23382>:
  D.23386 = iftmp.89 != 0;
  D.23387 = (long int) D.23386;
  D.23388 = __builtin_expect (D.23387, 0);
  if (D.23388 != 0) goto <D.23389>; else goto <D.23390>;
  <D.23389>:
  sgen_gray_object_enqueue (queue, object);
  goto <D.23391>;
  <D.23390>:
  D.23383 = queue->first;
  D.23383 = queue->first;
  D.23385 = D.23383->end;
  D.23392 = D.23385;
  D.23393 = D.23392 + 1;
  D.23383->end = D.23393;
  D.23383->objects[D.23392] = object;
  <D.23391>:
  __builtin_prefetch (object);
}


sgen_parallel_pin_or_update (void * * ptr, void * obj, struct MonoVTable * vt, struct SgenGrayQueue * queue)
{
  int D.23394;
  long unsigned int vt.90;
  long unsigned int D.23398;
  void * D.23399;
  void * D.23400;
  void (*<T2c04>) (char *, struct SgenGrayQueue *) D.23404;
  long unsigned int D.23405;
  long unsigned int D.23408;
  void * D.23409;
  long unsigned int D.23410;

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

    major_pinned = 0;
    D.23394 = sgen_ptr_in_nursery (obj);
    if (D.23394 != 0) goto <D.23395>; else goto <D.23396>;
    <D.23395>:
    vt.90 = (long unsigned int) vt;
    D.23398 = vt.90 | 2;
    D.23399 = (void *) D.23398;
    D.23400 = InterlockedCompareExchangePointer (obj, D.23399, vt);
    if (D.23400 == vt) goto <D.23401>; else goto <D.23402>;
    <D.23401>:
    sgen_pin_object (obj, queue);
    goto <D.20555>;
    <D.23402>:
    goto <D.23403>;
    <D.23396>:
    D.23404 = major_collector.pin_major_object;
    D.23404 (obj, queue);
    major_pinned = 1;
    <D.23403>:
    vtable_word = MEM[(mword *)obj];
    D.23405 = vtable_word & 1;
    if (D.23405 != 0) goto <D.23406>; else goto <D.23407>;
    <D.23406>:
    D.23408 = vtable_word & 18446744073709551612;
    D.23409 = (void *) D.23408;
    *ptr = D.23409;
    goto <D.20555>;
    <D.23407>:
    D.23410 = vtable_word & 2;
    if (D.23410 != 0) goto <D.20555>; else goto <D.23411>;
    <D.23411>:
    if (major_pinned != 0) goto <D.20555>; else goto <D.23412>;
    <D.23412>:
  }
  goto <D.20556>;
  <D.20555>:
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.23413;
  long unsigned int exch.91;
  long unsigned int comp.92;
  long unsigned int D.23416;

  exch.91 = (long unsigned int) exch;
  comp.92 = (long unsigned int) comp;
  D.23416 = __sync_val_compare_and_swap_8 (dest, comp.92, exch.91);
  D.23413 = (void *) D.23416;
  return D.23413;
}


sgen_sort_addresses (void * * array, int size)
{
  int D.23418;
  long unsigned int D.23419;
  long unsigned int D.23420;
  void * * D.23421;
  void * D.23422;
  long unsigned int D.23423;
  long unsigned int D.23424;
  void * * D.23425;
  void * D.23426;
  long unsigned int D.23428;
  long unsigned int D.23429;
  void * * D.23430;
  void * D.23431;
  int D.23432;
  long unsigned int D.23435;
  long unsigned int D.23436;
  void * * D.23437;
  void * D.23438;
  sizetype D.23439;
  sizetype D.23440;
  sizetype D.23441;
  void * * D.23442;
  void * D.23443;
  long unsigned int D.23446;
  long unsigned int D.23447;
  void * * D.23448;
  void * D.23449;
  int i;
  void * tmp;

  i = 1;
  goto <D.20569>;
  <D.20568>:
  {
    int child;

    child = i;
    goto <D.20567>;
    <D.20566>:
    {
      int parent;

      D.23418 = child + -1;
      parent = D.23418 / 2;
      D.23419 = (long unsigned int) parent;
      D.23420 = D.23419 * 8;
      D.23421 = array + D.23420;
      D.23422 = *D.23421;
      D.23423 = (long unsigned int) child;
      D.23424 = D.23423 * 8;
      D.23425 = array + D.23424;
      D.23426 = *D.23425;
      if (D.23422 >= D.23426) goto <D.20565>; else goto <D.23427>;
      <D.23427>:
      D.23419 = (long unsigned int) parent;
      D.23420 = D.23419 * 8;
      D.23421 = array + D.23420;
      tmp = *D.23421;
      D.23419 = (long unsigned int) parent;
      D.23420 = D.23419 * 8;
      D.23421 = array + D.23420;
      D.23423 = (long unsigned int) child;
      D.23424 = D.23423 * 8;
      D.23425 = array + D.23424;
      D.23426 = *D.23425;
      *D.23421 = D.23426;
      D.23423 = (long unsigned int) child;
      D.23424 = D.23423 * 8;
      D.23425 = array + D.23424;
      *D.23425 = tmp;
      child = parent;
    }
    <D.20567>:
    if (child > 0) goto <D.20566>; else goto <D.20565>;
    <D.20565>:
  }
  i = i + 1;
  <D.20569>:
  if (i < size) goto <D.20568>; else goto <D.20570>;
  <D.20570>:
  i = size + -1;
  goto <D.20578>;
  <D.20577>:
  {
    int end;
    int root;

    D.23428 = (long unsigned int) i;
    D.23429 = D.23428 * 8;
    D.23430 = array + D.23429;
    tmp = *D.23430;
    D.23428 = (long unsigned int) i;
    D.23429 = D.23428 * 8;
    D.23430 = array + D.23429;
    D.23431 = *array;
    *D.23430 = D.23431;
    *array = tmp;
    end = i + -1;
    root = 0;
    goto <D.20576>;
    <D.20575>:
    {
      int child;

      D.23432 = root * 2;
      child = D.23432 + 1;
      if (child < end) goto <D.23433>; else goto <D.23434>;
      <D.23433>:
      D.23435 = (long unsigned int) child;
      D.23436 = D.23435 * 8;
      D.23437 = array + D.23436;
      D.23438 = *D.23437;
      D.23439 = (sizetype) child;
      D.23440 = D.23439 + 1;
      D.23441 = D.23440 * 8;
      D.23442 = array + D.23441;
      D.23443 = *D.23442;
      if (D.23438 < D.23443) goto <D.23444>; else goto <D.23445>;
      <D.23444>:
      child = child + 1;
      <D.23445>:
      <D.23434>:
      D.23446 = (long unsigned int) root;
      D.23447 = D.23446 * 8;
      D.23448 = array + D.23447;
      D.23449 = *D.23448;
      D.23435 = (long unsigned int) child;
      D.23436 = D.23435 * 8;
      D.23437 = array + D.23436;
      D.23438 = *D.23437;
      if (D.23449 >= D.23438) goto <D.20574>; else goto <D.23450>;
      <D.23450>:
      D.23446 = (long unsigned int) root;
      D.23447 = D.23446 * 8;
      D.23448 = array + D.23447;
      tmp = *D.23448;
      D.23446 = (long unsigned int) root;
      D.23447 = D.23446 * 8;
      D.23448 = array + D.23447;
      D.23435 = (long unsigned int) child;
      D.23436 = D.23435 * 8;
      D.23437 = array + D.23436;
      D.23438 = *D.23437;
      *D.23448 = D.23438;
      D.23435 = (long unsigned int) child;
      D.23436 = D.23435 * 8;
      D.23437 = array + D.23436;
      *D.23437 = tmp;
      root = child;
    }
    <D.20576>:
    D.23432 = root * 2;
    if (D.23432 < end) goto <D.20575>; else goto <D.20574>;
    <D.20574>:
  }
  i = i + -1;
  <D.20578>:
  if (i > 0) goto <D.20577>; else goto <D.20579>;
  <D.20579>:
}


sgen_update_heap_boundaries (mword low, mword high)
{
  void * old.93;
  void * low.94;
  void * D.23454;
  void * high.95;
  void * D.23457;
  mword old;

  <D.20676>:
  old = lowest_heap_address;
  if (low >= old) goto <D.20675>; else goto <D.23451>;
  <D.23451>:
  old.93 = (void *) old;
  low.94 = (void *) low;
  D.23454 = InterlockedCompareExchangePointer (&lowest_heap_address, low.94, old.93);
  old.93 = (void *) old;
  if (D.23454 != old.93) goto <D.20676>; else goto <D.20675>;
  <D.20675>:
  <D.20678>:
  old = highest_heap_address;
  if (high <= old) goto <D.20677>; else goto <D.23455>;
  <D.23455>:
  old.93 = (void *) old;
  high.95 = (void *) high;
  D.23457 = InterlockedCompareExchangePointer (&highest_heap_address, high.95, old.93);
  old.93 = (void *) old;
  if (D.23457 != old.93) goto <D.20678>; else goto <D.20677>;
  <D.20677>:
}


mono_gc_get_nursery (int * shift_bits, size_t * size)
{
  int sgen_nursery_size.96;
  long unsigned int D.23459;
  int sgen_nursery_bits.97;
  void * D.23461;

  sgen_nursery_size.96 = sgen_nursery_size;
  D.23459 = (long unsigned int) sgen_nursery_size.96;
  *size = D.23459;
  sgen_nursery_bits.97 = sgen_nursery_bits;
  *shift_bits = sgen_nursery_bits.97;
  D.23461 = sgen_get_nursery_start ();
  return D.23461;
}


sgen_get_nursery_start ()
{
  char * D.23463;

  D.23463 = sgen_nursery_start;
  return D.23463;
}


mono_gc_set_current_thread_appdomain (struct MonoDomain * domain)
{
  _Bool D.23467;
  long int D.23468;
  long int D.23469;
  struct SgenThreadInfo * info;

  info = mono_thread_info_current ();
  if (domain != 0B) goto <D.23465>; else goto <D.23466>;
  <D.23465>:
  D.23467 = info == 0B;
  D.23468 = (long int) D.23467;
  D.23469 = __builtin_expect (D.23468, 0);
  if (D.23469 != 0) goto <D.23470>; else goto <D.23471>;
  <D.23470>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1733, "info");
  <D.23471>:
  info->stopped_domain = domain;
  <D.23466>:
}


mono_gc_precise_stack_mark_enabled ()
{
  gboolean D.23472;
  int conservative_stack_mark.98;
  _Bool D.23474;

  conservative_stack_mark.98 = conservative_stack_mark;
  D.23474 = conservative_stack_mark.98 == 0;
  D.23472 = (gboolean) D.23474;
  return D.23472;
}


mono_gc_get_logfile ()
{
  struct FILE * D.23476;

  D.23476 = gc_debug_file;
  return D.23476;
}


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

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


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

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


sgen_get_current_object_ops ()
{
  struct SgenObjectOperations * D.23482;

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


sgen_check_section_scan_starts (struct GCMemSection * section)
{
  char * * D.23484;
  long unsigned int D.23485;
  long unsigned int D.23486;
  char * * D.23487;
  char * D.23488;
  unsigned int D.23491;
  _Bool D.23492;
  long int D.23493;
  long int D.23494;
  unsigned int i.99;
  unsigned int D.23498;
  int i;

  i = 0;
  goto <D.20812>;
  <D.20811>:
  D.23484 = section->scan_starts;
  D.23485 = (long unsigned int) i;
  D.23486 = D.23485 * 8;
  D.23487 = D.23484 + D.23486;
  D.23488 = *D.23487;
  if (D.23488 != 0B) goto <D.23489>; else goto <D.23490>;
  <D.23489>:
  {
    guint size;

    D.23484 = section->scan_starts;
    D.23485 = (long unsigned int) i;
    D.23486 = D.23485 * 8;
    D.23487 = D.23484 + D.23486;
    D.23488 = *D.23487;
    size = sgen_safe_object_get_size (D.23488);
    D.23491 = size + 4294967280;
    D.23492 = D.23491 > 7984;
    D.23493 = (long int) D.23492;
    D.23494 = __builtin_expect (D.23493, 0);
    if (D.23494 != 0) goto <D.23495>; else goto <D.23496>;
    <D.23495>:
    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.23496>:
  }
  <D.23490>:
  i = i + 1;
  <D.20812>:
  i.99 = (unsigned int) i;
  D.23498 = section->num_scan_start;
  if (i.99 < D.23498) goto <D.20811>; else goto <D.20813>;
  <D.20813>:
}


sgen_dump_occupied (char * start, char * end, char * section_start)
{
  long int end.100;
  long int start.101;
  long int D.23501;
  long int section_start.102;
  long int D.23503;
  struct FILE * heap_dump_file.103;

  end.100 = (long int) end;
  start.101 = (long int) start;
  D.23501 = end.100 - start.101;
  start.101 = (long int) start;
  section_start.102 = (long int) section_start;
  D.23503 = start.101 - section_start.102;
  heap_dump_file.103 = heap_dump_file;
  fprintf (heap_dump_file.103, "<occupied offset=\"%td\" size=\"%td\"/>\n", D.23503, D.23501);
}


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

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


sgen_dump_section (struct GCMemSection * section, const char * type)
{
  char * D.23507;
  long unsigned int D.23508;
  struct FILE * heap_dump_file.104;
  void * D.23510;
  char * D.23515;
  _Bool D.23516;
  long int D.23517;
  long int D.23518;
  long unsigned int D.23523;
  long unsigned int D.23524;
  unsigned int D.23525;
  unsigned int D.23526;
  sizetype D.23527;
  char * start;
  char * end;
  char * occ_start;
  struct GCVTable * vt;
  char * old_start;

  start = section->data;
  D.23507 = section->data;
  D.23508 = section->size;
  end = D.23507 + D.23508;
  occ_start = 0B;
  old_start = 0B;
  D.23508 = section->size;
  heap_dump_file.104 = heap_dump_file;
  fprintf (heap_dump_file.104, "<section type=\"%s\" size=\"%lu\">\n", type, D.23508);
  goto <D.20853>;
  <D.20854>:
  {
    guint size;
    struct MonoClass * class;

    D.23510 = MEM[(void * *)start];
    if (D.23510 == 0B) goto <D.23511>; else goto <D.23512>;
    <D.23511>:
    if (occ_start != 0B) goto <D.23513>; else goto <D.23514>;
    <D.23513>:
    D.23507 = section->data;
    sgen_dump_occupied (occ_start, start, D.23507);
    occ_start = 0B;
    <D.23514>:
    start = start + 8;
    // predicted unlikely by continue predictor.
    goto <D.20853>;
    <D.23512>:
    D.23515 = section->next_data;
    D.23516 = D.23515 <= start;
    D.23517 = (long int) D.23516;
    D.23518 = __builtin_expect (D.23517, 0);
    if (D.23518 != 0) goto <D.23519>; else goto <D.23520>;
    <D.23519>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2088, "start < section->next_data");
    <D.23520>:
    if (occ_start == 0B) goto <D.23521>; else goto <D.23522>;
    <D.23521>:
    occ_start = start;
    <D.23522>:
    D.23523 = MEM[(mword *)start];
    D.23524 = D.23523 & 18446744073709551612;
    vt = (struct GCVTable *) D.23524;
    class = vt->klass;
    D.23525 = sgen_safe_object_get_size (start);
    D.23526 = D.23525 + 7;
    size = D.23526 & 4294967288;
    old_start = start;
    D.23527 = (sizetype) size;
    start = start + D.23527;
  }
  <D.20853>:
  if (start < end) goto <D.20854>; else goto <D.20855>;
  <D.20855>:
  if (occ_start != 0B) goto <D.23528>; else goto <D.23529>;
  <D.23528>:
  D.23507 = section->data;
  sgen_dump_occupied (occ_start, start, D.23507);
  <D.23529>:
  heap_dump_file.104 = heap_dump_file;
  fprintf (heap_dump_file.104, "</section>\n");
}


sgen_register_moved_object (void * obj, void * destination)
{
  <unnamed type> mono_profiler_events.105;
  unsigned int D.23531;
  _Bool D.23532;
  long int D.23533;
  long int D.23534;
  int D.23537;
  _Bool D.23538;
  long int D.23539;
  long int D.23540;
  int moved_objects_idx.106;
  int moved_objects_idx.107;
  int moved_objects_idx.108;
  int moved_objects_idx.109;
  int moved_objects_idx.110;

  mono_profiler_events.105 = mono_profiler_events;
  D.23531 = mono_profiler_events.105 & 524288;
  D.23532 = D.23531 == 0;
  D.23533 = (long int) D.23532;
  D.23534 = __builtin_expect (D.23533, 0);
  if (D.23534 != 0) goto <D.23535>; else goto <D.23536>;
  <D.23535>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2187, "mono_profiler_events & MONO_PROFILE_GC_MOVES");
  <D.23536>:
  D.23537 = sgen_collection_is_parallel ();
  D.23538 = D.23537 != 0;
  D.23539 = (long int) D.23538;
  D.23540 = __builtin_expect (D.23539, 0);
  if (D.23540 != 0) goto <D.23541>; else goto <D.23542>;
  <D.23541>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2190, "!sgen_collection_is_parallel ()");
  <D.23542>:
  moved_objects_idx.106 = moved_objects_idx;
  if (moved_objects_idx.106 == 64) goto <D.23544>; else goto <D.23545>;
  <D.23544>:
  moved_objects_idx.106 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.106);
  moved_objects_idx = 0;
  <D.23545>:
  moved_objects_idx.106 = moved_objects_idx;
  moved_objects_idx.107 = moved_objects_idx.106;
  moved_objects_idx.108 = moved_objects_idx.107 + 1;
  moved_objects_idx = moved_objects_idx.108;
  moved_objects[moved_objects_idx.107] = obj;
  moved_objects_idx.106 = moved_objects_idx;
  moved_objects_idx.109 = moved_objects_idx.106;
  moved_objects_idx.110 = moved_objects_idx.109 + 1;
  moved_objects_idx = moved_objects_idx.110;
  moved_objects[moved_objects_idx.109] = destination;
}


sgen_set_pinned_from_failed_allocation (mword objsize)
{
  long unsigned int bytes_pinned_from_failed_allocation.111;
  long unsigned int bytes_pinned_from_failed_allocation.112;

  bytes_pinned_from_failed_allocation.111 = bytes_pinned_from_failed_allocation;
  bytes_pinned_from_failed_allocation.112 = bytes_pinned_from_failed_allocation.111 + objsize;
  bytes_pinned_from_failed_allocation = bytes_pinned_from_failed_allocation.112;
}


sgen_collection_is_parallel ()
{
  int current_collection_generation.113;
  gboolean D.23553;

  current_collection_generation.113 = current_collection_generation;
  switch (current_collection_generation.113) <default: <D.20900>, case 0: <D.20898>, case 1: <D.20899>>
  <D.20898>:
  D.23553 = nursery_collection_is_parallel;
  return D.23553;
  <D.20899>:
  D.23553 = major_collector.is_parallel;
  return D.23553;
  <D.20900>:
  current_collection_generation.113 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.113);
  <D.20901>:
  goto <D.20901>;
}


sgen_collection_is_concurrent ()
{
  int current_collection_generation.114;
  gboolean D.23556;

  current_collection_generation.114 = current_collection_generation;
  switch (current_collection_generation.114) <default: <D.20907>, case 0: <D.20905>, case 1: <D.20906>>
  <D.20905>:
  D.23556 = 0;
  return D.23556;
  <D.20906>:
  D.23556 = concurrent_collection_in_progress;
  return D.23556;
  <D.20907>:
  current_collection_generation.114 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.114);
  <D.20908>:
  goto <D.20908>;
}


sgen_concurrent_collection_in_progress ()
{
  gboolean D.23558;

  D.23558 = concurrent_collection_in_progress;
  return D.23558;
}


sgen_ensure_free_space (size_t size)
{
  int D.23562;
  int degraded_mode.115;
  int D.23569;
  int D.23573;
  int concurrent_collection_in_progress.116;
  int D.23582;
  int generation_to_collect;
  const char * reason;

  generation_to_collect = -1;
  reason = 0B;
  if (size > 8000) goto <D.23560>; else goto <D.23561>;
  <D.23560>:
  D.23562 = sgen_need_major_collection (size);
  if (D.23562 != 0) goto <D.23563>; else goto <D.23564>;
  <D.23563>:
  reason = "LOS overflow";
  generation_to_collect = 1;
  <D.23564>:
  goto <D.23565>;
  <D.23561>:
  degraded_mode.115 = degraded_mode;
  if (degraded_mode.115 != 0) goto <D.23567>; else goto <D.23568>;
  <D.23567>:
  D.23569 = sgen_need_major_collection (size);
  if (D.23569 != 0) goto <D.23570>; else goto <D.23571>;
  <D.23570>:
  reason = "Degraded mode overflow";
  generation_to_collect = 1;
  <D.23571>:
  goto <D.23572>;
  <D.23568>:
  D.23573 = sgen_need_major_collection (size);
  if (D.23573 != 0) goto <D.23574>; else goto <D.23575>;
  <D.23574>:
  reason = "Minor allowance";
  generation_to_collect = 1;
  goto <D.23576>;
  <D.23575>:
  generation_to_collect = 0;
  reason = "Nursery full";
  <D.23576>:
  <D.23572>:
  <D.23565>:
  if (generation_to_collect == -1) goto <D.23577>; else goto <D.23578>;
  <D.23577>:
  concurrent_collection_in_progress.116 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.116 != 0) goto <D.23580>; else goto <D.23581>;
  <D.23580>:
  D.23582 = sgen_workers_all_done ();
  if (D.23582 != 0) goto <D.23583>; else goto <D.23584>;
  <D.23583>:
  generation_to_collect = 1;
  reason = "Finish concurrent collection";
  <D.23584>:
  <D.23581>:
  <D.23578>:
  if (generation_to_collect == -1) goto <D.23585>; else goto <D.23586>;
  <D.23585>:
  return;
  <D.23586>:
  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.117;
  _Bool D.23591;
  long int D.23592;
  long int D.23593;
  long int D.23596;
  int concurrent_collection_in_progress.118;
  _Bool D.23600;
  _Bool D.23601;
  _Bool D.23602;
  int D.23603;
  int D.23604;
  int allow_synchronous_major.119;
  gboolean * D.23614;
  int D.23617;
  int D.23622;
  int D.23626;
  int concurrent_collection_in_progress.120;
  _Bool D.23630;
  long int D.23631;
  long int D.23632;
  int D.23640;
  long int D.23643;
  long int D.23644;
  long int D.23645;
  int D.23646;
  long int D.23647;
  long int D.23655;
  long int D.23656;
  long int D.23657;
  int D.23658;
  long int D.23659;
  int gc_debug_level.121;
  _Bool D.23661;
  long int D.23662;
  long int D.23663;
  long unsigned int los_memory_usage.122;
  long int D.23667;
  long unsigned int D.23668;
  struct FILE * gc_debug_file.123;
  int D.23672;
  _Bool D.23675;
  long int D.23676;
  long int D.23677;
  int D.23680;
  int D.23681;
  _Bool D.23682;
  long int D.23683;
  long int D.23684;
  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.23588>; else goto <D.23589>;
      <D.23588>:
      <D.23589>:
      generation_to_collect.117 = (unsigned int) generation_to_collect;
      D.23591 = generation_to_collect.117 > 1;
      D.23592 = (long int) D.23591;
      D.23593 = __builtin_expect (D.23592, 0);
      if (D.23593 != 0) goto <D.23594>; else goto <D.23595>;
      <D.23594>:
      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.23595>:
      memset (&infos, 0, 96);
      mono_profiler_gc_event (0, generation_to_collect);
      infos[0].generation = generation_to_collect;
      infos[0].reason = reason;
      infos[0].is_overflow = 0;
      D.23596 = mono_100ns_ticks ();
      infos[0].total_time = D.23596;
      infos[1].generation = -1;
      sgen_stop_world (generation_to_collect);
      concurrent_collection_in_progress.118 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.118 != 0) goto <D.23598>; else goto <D.23599>;
      <D.23598>:
      D.23600 = wait_to_finish != 0;
      D.23601 = generation_to_collect == 1;
      D.23602 = D.23600 & D.23601;
      D.23603 = (int) D.23602;
      D.23604 = major_update_or_finish_concurrent_collection (D.23603);
      if (D.23604 != 0) goto <D.23605>; else goto <D.23606>;
      <D.23605>:
      oldest_generation_collected = 1;
      goto done;
      <D.23606>:
      if (generation_to_collect == 1) goto done; else goto <D.23607>;
      <D.23607>:
      goto <D.23608>;
      <D.23599>:
      if (generation_to_collect == 1) goto <D.23609>; else goto <D.23610>;
      <D.23609>:
      allow_synchronous_major.119 = allow_synchronous_major;
      if (allow_synchronous_major.119 != 0) goto <D.23612>; else goto <D.23613>;
      <D.23612>:
      D.23614 = major_collector.want_synchronous_collection;
      if (D.23614 != 0B) goto <D.23615>; else goto <D.23616>;
      <D.23615>:
      D.23614 = major_collector.want_synchronous_collection;
      D.23617 = *D.23614;
      if (D.23617 != 0) goto <D.23618>; else goto <D.23619>;
      <D.23618>:
      wait_to_finish = 1;
      <D.23619>:
      <D.23616>:
      <D.23613>:
      <D.23610>:
      <D.23608>:
      if (generation_to_collect == 0) goto <D.23620>; else goto <D.23621>;
      <D.23620>:
      D.23622 = collect_nursery (0B, 0);
      if (D.23622 != 0) goto <D.23623>; else goto <D.23624>;
      <D.23623>:
      overflow_generation_to_collect = 1;
      overflow_reason = "Minor overflow";
      <D.23624>:
      goto <D.23625>;
      <D.23621>:
      D.23626 = major_collector.is_concurrent;
      if (D.23626 != 0) goto <D.23627>; else goto <D.23628>;
      <D.23627>:
      concurrent_collection_in_progress.120 = concurrent_collection_in_progress;
      D.23630 = concurrent_collection_in_progress.120 != 0;
      D.23631 = (long int) D.23630;
      D.23632 = __builtin_expect (D.23631, 0);
      if (D.23632 != 0) goto <D.23633>; else goto <D.23634>;
      <D.23633>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3489, "!concurrent_collection_in_progress");
      <D.23634>:
      if (wait_to_finish == 0) goto <D.23635>; else goto <D.23636>;
      <D.23635>:
      collect_nursery (0B, 0);
      <D.23636>:
      <D.23628>:
      D.23626 = major_collector.is_concurrent;
      if (D.23626 != 0) goto <D.23638>; else goto <D.23637>;
      <D.23638>:
      if (wait_to_finish == 0) goto <D.23639>; else goto <D.23637>;
      <D.23639>:
      major_start_concurrent_collection (reason);
      goto done;
      <D.23637>:
      D.23640 = major_do_collection (reason);
      if (D.23640 != 0) goto <D.23641>; else goto <D.23642>;
      <D.23641>:
      overflow_generation_to_collect = 0;
      overflow_reason = "Excessive pinning";
      <D.23642>:
      <D.23625>:
      gc_end = mono_100ns_ticks ();
      D.23643 = infos[0].total_time;
      D.23644 = gc_end - D.23643;
      D.23645 = D.23644 / 10;
      D.23646 = (int) D.23645;
      D.23647 = (long int) D.23646;
      infos[0].total_time = D.23647;
      D.23626 = major_collector.is_concurrent;
      if (D.23626 == 0) goto <D.23648>; else goto <D.23649>;
      <D.23648>:
      if (overflow_generation_to_collect != -1) goto <D.23650>; else goto <D.23651>;
      <D.23650>:
      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.23652>; else goto <D.23653>;
      <D.23652>:
      collect_nursery (0B, 0);
      goto <D.23654>;
      <D.23653>:
      major_do_collection (overflow_reason);
      <D.23654>:
      gc_end = mono_100ns_ticks ();
      D.23655 = infos[1].total_time;
      D.23656 = gc_end - D.23655;
      D.23657 = D.23656 / 10;
      D.23658 = (int) D.23657;
      D.23659 = (long int) D.23658;
      infos[1].total_time = D.23659;
      mono_profiler_gc_event (5, overflow_generation_to_collect);
      oldest_generation_collected = MAX_EXPR <overflow_generation_to_collect, oldest_generation_collected>;
      <D.23651>:
      <D.23649>:
      gc_debug_level.121 = gc_debug_level;
      D.23661 = gc_debug_level.121 > 1;
      D.23662 = (long int) D.23661;
      D.23663 = __builtin_expect (D.23662, 0);
      if (D.23663 != 0) goto <D.23664>; else goto <D.23665>;
      <D.23664>:
      los_memory_usage.122 = los_memory_usage;
      D.23667 = mono_gc_get_heap_size ();
      D.23668 = (long unsigned int) D.23667;
      gc_debug_file.123 = gc_debug_file;
      fprintf (gc_debug_file.123, "Heap size: %lu, LOS size: %lu\n", D.23668, los_memory_usage.122);
      gc_debug_file.123 = gc_debug_file;
      fflush (gc_debug_file.123);
      <D.23665>:
      if (generation_to_collect == 0) goto <D.23670>; else goto <D.23671>;
      <D.23670>:
      D.23672 = sgen_can_alloc_size (requested_size);
      if (D.23672 == 0) goto <D.23673>; else goto <D.23674>;
      <D.23673>:
      gc_debug_level.121 = gc_debug_level;
      D.23675 = gc_debug_level.121 > 0;
      D.23676 = (long int) D.23675;
      D.23677 = __builtin_expect (D.23676, 0);
      if (D.23677 != 0) goto <D.23678>; else goto <D.23679>;
      <D.23678>:
      D.23680 = sgen_get_pinned_count ();
      gc_debug_file.123 = gc_debug_file;
      fprintf (gc_debug_file.123, "nursery collection didn\'t find enough room for %zd alloc (%d pinned)\n", requested_size, D.23680);
      gc_debug_file.123 = gc_debug_file;
      fflush (gc_debug_file.123);
      <D.23679>:
      sgen_dump_pin_queue ();
      degraded_mode = 1;
      <D.23674>:
      <D.23671>:
      done:
      D.23681 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.23682 = D.23681 == 0;
      D.23683 = (long int) D.23682;
      D.23684 = __builtin_expect (D.23683, 0);
      if (D.23684 != 0) goto <D.23685>; else goto <D.23686>;
      <D.23685>:
      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.23686>:
      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.23687;
  _Bool D.23688;
  long int D.23689;
  long int D.23690;
  int D.23695;
  void (*<T7e7>) (void) D.23698;
  gboolean D.23699;
  int mod_union_consistency_check.124;
  int whole_heap_check_before_collection.125;
  struct SgenGrayQueue unpin_queue;

  try
    {
      memset (&unpin_queue, 0, 32);
      D.23687 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.23688 = D.23687 == 0;
      D.23689 = (long int) D.23688;
      D.23690 = __builtin_expect (D.23689, 0);
      if (D.23690 != 0) goto <D.23691>; else goto <D.23692>;
      <D.23691>:
      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.23692>:
      if (force_finish == 0) goto <D.23693>; else goto <D.23694>;
      <D.23693>:
      D.23695 = sgen_workers_all_done ();
      if (D.23695 == 0) goto <D.23696>; else goto <D.23697>;
      <D.23696>:
      D.23698 = major_collector.update_cardtable_mod_union;
      D.23698 ();
      sgen_los_update_cardtable_mod_union ();
      D.23699 = 0;
      return D.23699;
      <D.23697>:
      <D.23694>:
      wait_for_workers_to_finish ();
      D.23698 = major_collector.update_cardtable_mod_union;
      D.23698 ();
      sgen_los_update_cardtable_mod_union ();
      collect_nursery (&unpin_queue, 1);
      mod_union_consistency_check.124 = mod_union_consistency_check;
      if (mod_union_consistency_check.124 != 0) goto <D.23701>; else goto <D.23702>;
      <D.23701>:
      sgen_check_mod_union_consistency ();
      <D.23702>:
      current_collection_generation = 1;
      major_finish_collection ("finishing", -1, 1);
      whole_heap_check_before_collection.125 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.125 != 0) goto <D.23704>; else goto <D.23705>;
      <D.23704>:
      sgen_check_whole_heap (0);
      <D.23705>:
      unpin_objects_from_queue (&unpin_queue);
      sgen_gray_object_queue_deinit (&unpin_queue);
      current_collection_generation = -1;
      D.23699 = 1;
      return D.23699;
    }
  finally
    {
      unpin_queue = {CLOBBER};
    }
}


wait_for_workers_to_finish ()
{
  int D.23708;

  goto <D.21058>;
  <D.21057>:
  monoeg_g_usleep (200);
  <D.21058>:
  D.23708 = sgen_workers_all_done ();
  if (D.23708 == 0) goto <D.21057>; else goto <D.21059>;
  <D.21059>:
}


major_finish_collection (const char * reason, int old_next_pin_slot, gboolean scan_mod_union)
{
  int concurrent_collection_in_progress.126;
  int D.23713;
  int concurrent_collection_in_progress.127;
  int D.23717;
  _Bool D.23718;
  long int D.23719;
  long int D.23720;
  int do_concurrent_checks.128;
  struct SgenSectionGrayQueue * D.23727;
  int D.23728;
  _Bool D.23729;
  long int D.23730;
  long int D.23731;
  long int D.23734;
  long int D.23735;
  int D.23736;
  long long int D.23737;
  long long int time_major_finish_gray_stack.129;
  long long int time_major_finish_gray_stack.130;
  long unsigned int objects_pinned.131;
  int concurrent_collection_in_progress.132;
  _Bool D.23744;
  long int D.23745;
  long int D.23746;
  struct GCMemSection * nursery_section.133;
  char * D.23750;
  long unsigned int D.23751;
  char * D.23752;
  long unsigned int D.23753;
  int check_mark_bits_after_major_collection.134;
  char[0:] * D.23757;
  long unsigned int D.23758;
  long unsigned int D.23759;
  _Bool D.23760;
  long int D.23761;
  long int D.23762;
  int D.23765;
  long unsigned int D.23768;
  long unsigned int D.23769;
  long unsigned int D.23770;
  struct LOSObject * los_object_list.135;
  long int D.23776;
  long int D.23777;
  int D.23778;
  long long int D.23779;
  long long int time_major_free_bigobjs.136;
  long long int time_major_free_bigobjs.137;
  long long int time_major_los_sweep.138;
  long long int time_major_los_sweep.139;
  void (*<T7e7>) (void) D.23784;
  long long int time_major_sweep.140;
  long long int time_major_sweep.141;
  int concurrent_collection_in_progress.142;
  int D.23790;
  void * * D.23791;
  long unsigned int D.23792;
  int concurrent_collection_in_progress.143;
  long long int time_major_fragment_creation.144;
  long long int time_major_fragment_creation.145;
  struct FILE * heap_dump_file.146;
  int stat_major_gcs.147;
  int D.23804;
  struct FinalizeReadyEntry * fin_ready_list.148;
  struct FinalizeReadyEntry * critical_fin_list.149;
  int num_ready_finalizers.150;
  struct FILE * gc_debug_file.151;
  int D.23814;
  _Bool D.23815;
  long int D.23816;
  long int D.23817;
  void (*<T7e7>) (void) D.23820;
  struct SgenSectionGrayQueue * D.23821;
  int D.23822;
  _Bool D.23823;
  long int D.23824;
  long int D.23825;
  int concurrent_collection_in_progress.152;
  struct LOSObject * bigobj;
  struct LOSObject * prevbo;
  gint64 atv;
  gint64 btv;

  btv = mono_100ns_ticks ();
  concurrent_collection_in_progress.126 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.126 != 0) goto <D.23709>; else goto <D.23712>;
  <D.23712>:
  D.23713 = major_collector.is_parallel;
  if (D.23713 != 0) goto <D.23709>; else goto <D.23710>;
  <D.23709>:
  join_workers ();
  <D.23710>:
  concurrent_collection_in_progress.127 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.127 != 0) goto <D.23715>; else goto <D.23716>;
  <D.23715>:
  current_object_ops = major_collector.major_concurrent_ops;
  major_copy_or_mark_from_roots (0B, 1, scan_mod_union);
  join_workers ();
  D.23717 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23718 = D.23717 == 0;
  D.23719 = (long int) D.23718;
  D.23720 = __builtin_expect (D.23719, 0);
  if (D.23720 != 0) goto <D.23721>; else goto <D.23722>;
  <D.23721>:
  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.23722>:
  do_concurrent_checks.128 = do_concurrent_checks;
  if (do_concurrent_checks.128 != 0) goto <D.23724>; else goto <D.23725>;
  <D.23724>:
  check_nursery_is_clean ();
  <D.23725>:
  goto <D.23726>;
  <D.23716>:
  current_object_ops = major_collector.major_ops;
  <D.23726>:
  sgen_gray_object_queue_disable_alloc_prepare (&gray_queue);
  D.23727 = sgen_workers_get_distribute_section_gray_queue ();
  D.23728 = sgen_section_gray_queue_is_empty (D.23727);
  D.23729 = D.23728 == 0;
  D.23730 = (long int) D.23729;
  D.23731 = __builtin_expect (D.23730, 0);
  if (D.23731 != 0) goto <D.23732>; else goto <D.23733>;
  <D.23732>:
  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.23733>:
  finish_gray_stack (1, &gray_queue);
  atv = mono_100ns_ticks ();
  D.23734 = atv - btv;
  D.23735 = D.23734 / 10;
  D.23736 = (int) D.23735;
  D.23737 = (long long int) D.23736;
  time_major_finish_gray_stack.129 = time_major_finish_gray_stack;
  time_major_finish_gray_stack.130 = D.23737 + time_major_finish_gray_stack.129;
  time_major_finish_gray_stack = time_major_finish_gray_stack.130;
  sgen_workers_reset_data ();
  objects_pinned.131 = objects_pinned;
  if (objects_pinned.131 != 0) goto <D.23741>; else goto <D.23742>;
  <D.23741>:
  concurrent_collection_in_progress.132 = concurrent_collection_in_progress;
  D.23744 = concurrent_collection_in_progress.132 != 0;
  D.23745 = (long int) D.23744;
  D.23746 = __builtin_expect (D.23745, 0);
  if (D.23746 != 0) goto <D.23747>; else goto <D.23748>;
  <D.23747>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3177, "!concurrent_collection_in_progress");
  <D.23748>:
  nursery_section.133 = nursery_section;
  sgen_pin_queue_clear_discarded_entries (nursery_section.133, old_next_pin_slot);
  sgen_optimize_pin_queue (0);
  nursery_section.133 = nursery_section;
  sgen_find_section_pin_queue_start_end (nursery_section.133);
  objects_pinned = 0;
  <D.23742>:
  reset_heap_boundaries ();
  D.23750 = sgen_get_nursery_end ();
  D.23751 = (long unsigned int) D.23750;
  D.23752 = sgen_get_nursery_start ();
  D.23753 = (long unsigned int) D.23752;
  sgen_update_heap_boundaries (D.23753, D.23751);
  check_mark_bits_after_major_collection.134 = check_mark_bits_after_major_collection;
  if (check_mark_bits_after_major_collection.134 != 0) goto <D.23755>; else goto <D.23756>;
  <D.23755>:
  sgen_check_major_heap_marked ();
  <D.23756>:
  prevbo = 0B;
  bigobj = los_object_list;
  goto <D.21073>;
  <D.21074>:
  D.23757 = &bigobj->data;
  D.23758 = MEM[(mword *)D.23757];
  D.23759 = D.23758 & 2;
  D.23760 = D.23759 != 0;
  D.23761 = (long int) D.23760;
  D.23762 = __builtin_expect (D.23761, 0);
  if (D.23762 != 0) goto <D.23763>; else goto <D.23764>;
  <D.23763>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3197, "!object_is_pinned (bigobj->data)");
  <D.23764>:
  D.23757 = &bigobj->data;
  D.23765 = sgen_los_object_is_pinned (D.23757);
  if (D.23765 != 0) goto <D.23766>; else goto <D.23767>;
  <D.23766>:
  D.23757 = &bigobj->data;
  sgen_los_unpin_object (D.23757);
  D.23757 = &bigobj->data;
  D.23768 = (long unsigned int) D.23757;
  D.23769 = sgen_los_object_size (bigobj);
  D.23770 = D.23768 + D.23769;
  D.23757 = &bigobj->data;
  D.23768 = (long unsigned int) D.23757;
  sgen_update_heap_boundaries (D.23768, D.23770);
  goto <D.23771>;
  <D.23767>:
  {
    struct LOSObject * to_free;

    if (prevbo != 0B) goto <D.23772>; else goto <D.23773>;
    <D.23772>:
    los_object_list.135 = bigobj->next;
    prevbo->next = los_object_list.135;
    goto <D.23775>;
    <D.23773>:
    los_object_list.135 = bigobj->next;
    los_object_list = los_object_list.135;
    <D.23775>:
    to_free = bigobj;
    bigobj = bigobj->next;
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.21073>;
  }
  <D.23771>:
  prevbo = bigobj;
  bigobj = bigobj->next;
  <D.21073>:
  if (bigobj != 0B) goto <D.21074>; else goto <D.21075>;
  <D.21075>:
  btv = mono_100ns_ticks ();
  D.23776 = btv - atv;
  D.23777 = D.23776 / 10;
  D.23778 = (int) D.23777;
  D.23779 = (long long int) D.23778;
  time_major_free_bigobjs.136 = time_major_free_bigobjs;
  time_major_free_bigobjs.137 = D.23779 + time_major_free_bigobjs.136;
  time_major_free_bigobjs = time_major_free_bigobjs.137;
  sgen_los_sweep ();
  atv = mono_100ns_ticks ();
  D.23734 = atv - btv;
  D.23735 = D.23734 / 10;
  D.23736 = (int) D.23735;
  D.23737 = (long long int) D.23736;
  time_major_los_sweep.138 = time_major_los_sweep;
  time_major_los_sweep.139 = D.23737 + time_major_los_sweep.138;
  time_major_los_sweep = time_major_los_sweep.139;
  D.23784 = major_collector.sweep;
  D.23784 ();
  btv = mono_100ns_ticks ();
  D.23776 = btv - atv;
  D.23777 = D.23776 / 10;
  D.23778 = (int) D.23777;
  D.23779 = (long long int) D.23778;
  time_major_sweep.140 = time_major_sweep;
  time_major_sweep.141 = D.23779 + time_major_sweep.140;
  time_major_sweep = time_major_sweep.141;
  concurrent_collection_in_progress.142 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.142 == 0) goto <D.23788>; else goto <D.23789>;
  <D.23788>:
  nursery_section.133 = nursery_section;
  D.23790 = nursery_section.133->pin_queue_num_entries;
  nursery_section.133 = nursery_section;
  D.23791 = nursery_section.133->pin_queue_start;
  nursery_section.133 = nursery_section;
  D.23792 = sgen_build_nursery_fragments (nursery_section.133, D.23791, D.23790, 0B);
  if (D.23792 == 0) goto <D.23793>; else goto <D.23794>;
  <D.23793>:
  degraded_mode = 1;
  <D.23794>:
  sgen_finish_pinning ();
  sgen_clear_tlabs ();
  sgen_pin_stats_reset ();
  <D.23789>:
  concurrent_collection_in_progress.143 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.143 != 0) goto <D.23796>; else goto <D.23797>;
  <D.23796>:
  sgen_cement_concurrent_finish ();
  <D.23797>:
  sgen_cement_clear_below_threshold ();
  atv = mono_100ns_ticks ();
  D.23734 = atv - btv;
  D.23735 = D.23734 / 10;
  D.23736 = (int) D.23735;
  D.23737 = (long long int) D.23736;
  time_major_fragment_creation.144 = time_major_fragment_creation;
  time_major_fragment_creation.145 = D.23737 + time_major_fragment_creation.144;
  time_major_fragment_creation = time_major_fragment_creation.145;
  heap_dump_file.146 = heap_dump_file;
  if (heap_dump_file.146 != 0B) goto <D.23801>; else goto <D.23802>;
  <D.23801>:
  stat_major_gcs.147 = stat_major_gcs;
  D.23804 = stat_major_gcs.147 + -1;
  dump_heap ("major", D.23804, reason);
  <D.23802>:
  fin_ready_list.148 = fin_ready_list;
  if (fin_ready_list.148 != 0B) goto <D.23805>; else goto <D.23808>;
  <D.23808>:
  critical_fin_list.149 = critical_fin_list;
  if (critical_fin_list.149 != 0B) goto <D.23805>; else goto <D.23806>;
  <D.23805>:
  if (0 != 0) goto <D.23810>; else goto <D.23811>;
  <D.23810>:
  num_ready_finalizers.150 = num_ready_finalizers;
  gc_debug_file.151 = gc_debug_file;
  fprintf (gc_debug_file.151, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.150);
  gc_debug_file.151 = gc_debug_file;
  fflush (gc_debug_file.151);
  <D.23811>:
  mono_gc_finalize_notify ();
  <D.23806>:
  D.23814 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23815 = D.23814 == 0;
  D.23816 = (long int) D.23815;
  D.23817 = __builtin_expect (D.23816, 0);
  if (D.23817 != 0) goto <D.23818>; else goto <D.23819>;
  <D.23818>:
  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.23819>:
  sgen_memgov_major_collection_end ();
  current_collection_generation = -1;
  D.23820 = major_collector.finish_major_collection;
  D.23820 ();
  D.23821 = sgen_workers_get_distribute_section_gray_queue ();
  D.23822 = sgen_section_gray_queue_is_empty (D.23821);
  D.23823 = D.23822 == 0;
  D.23824 = (long int) D.23823;
  D.23825 = __builtin_expect (D.23824, 0);
  if (D.23825 != 0) goto <D.23826>; else goto <D.23827>;
  <D.23826>:
  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.23827>:
  concurrent_collection_in_progress.152 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.152 != 0) goto <D.23829>; else goto <D.23830>;
  <D.23829>:
  concurrent_collection_in_progress = 0;
  <D.23830>:
  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.23831;
  int D.23832;
  int concurrent_collection_in_progress.153;
  int do_concurrent_checks.154;
  int whole_heap_check_before_collection.155;
  long int D.23843;
  long int D.23844;
  int D.23845;
  long long int D.23846;
  long long int time_major_pre_collection_fragment_clear.156;
  long long int time_major_pre_collection_fragment_clear.157;
  int D.23849;
  struct GCMemSection * nursery_section.158;
  char * D.23853;
  gboolean * D.23854;
  int xdomain_checks.159;
  int concurrent_collection_in_progress.160;
  void (*<T7e7>) (void) D.23861;
  struct FILE * gc_debug_file.161;
  long unsigned int highest_heap_address.162;
  void * highest_heap_address.163;
  long unsigned int lowest_heap_address.164;
  void * lowest_heap_address.165;
  int concurrent_collection_in_progress.166;
  int D.23873;
  int concurrent_collection_in_progress.167;
  int concurrent_collection_in_progress.168;
  void (*<T2b41>) (struct SgenGrayQueue *) D.23884;
  long unsigned int D.23887;
  char * D.23888;
  char[0:] * D.23889;
  void * * D.23890;
  int D.23893;
  _Bool D.23896;
  long int D.23897;
  long int D.23898;
  long unsigned int D.23901;
  long unsigned int D.23902;
  struct MonoVTable * D.23903;
  void * D.23904;
  long unsigned int D.23905;
  int D.23906;
  int iftmp.169;
  struct GrayQueueSection * D.23913;
  int D.23915;
  _Bool D.23916;
  long int D.23917;
  long int D.23918;
  int D.23922;
  int D.23923;
  int do_pin_stats.170;
  _Bool D.23925;
  long int D.23926;
  long int D.23927;
  unsigned int D.23930;
  long unsigned int D.23931;
  long unsigned int D.23934;
  const char * D.23935;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) iftmp.171;
  int concurrent_collection_in_progress.172;
  int concurrent_collection_in_progress.173;
  int D.23949;
  int check_nursery_objects_pinned.174;
  int iftmp.175;
  int concurrent_collection_in_progress.176;
  void (*<T2b41>) (struct SgenGrayQueue *) D.23962;
  int D.23965;
  long long int time_major_pinning.177;
  long long int time_major_pinning.178;
  int gc_debug_level.179;
  _Bool D.23969;
  long int D.23970;
  long int D.23971;
  int D.23974;
  int D.23977;
  void (*<T7e7>) (void) D.23978;
  int concurrent_collection_in_progress.180;
  int D.23982;
  <unnamed type> D.23985;
  unsigned int D.23986;
  long int D.23989;
  long int D.23990;
  int D.23991;
  long long int D.23992;
  long long int time_major_scan_pinned.181;
  long long int time_major_scan_pinned.182;
  void (*<T2bff>) (void * *, struct SgenGrayQueue *) D.23995;
  void (*<T2c04>) (char *, struct SgenGrayQueue *) D.23996;
  long long int time_major_scan_registered_roots.183;
  long long int time_major_scan_registered_roots.184;
  long long int time_major_scan_thread_data.185;
  long long int time_major_scan_thread_data.186;
  long long int time_major_scan_alloc_pinned.187;
  long long int time_major_scan_alloc_pinned.188;
  <unnamed type> D.24003;
  unsigned int D.24004;
  struct FinalizeReadyEntry * fin_ready_list.189;
  struct FinalizeReadyEntry * critical_fin_list.190;
  long long int time_major_scan_finalized.191;
  long long int time_major_scan_finalized.192;
  long long int time_major_scan_big_objects.193;
  long long int time_major_scan_big_objects.194;
  int concurrent_collection_in_progress.195;
  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 = -1B;
      D.23831 = mono_profiler_get_events ();
      D.23832 = (int) D.23831;
      profile_roots = D.23832 & 1048576;
      root_report = {};
      concurrent_collection_in_progress.153 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.153 != 0) goto <D.23834>; else goto <D.23835>;
      <D.23834>:
      sgen_nursery_allocator_prepare_for_pinning ();
      do_concurrent_checks.154 = do_concurrent_checks;
      if (do_concurrent_checks.154 != 0) goto <D.23837>; else goto <D.23838>;
      <D.23837>:
      check_nursery_is_clean ();
      <D.23838>:
      goto <D.23839>;
      <D.23835>:
      sgen_nursery_alloc_prepare_for_major ();
      <D.23839>:
      init_gray_queue ();
      atv = mono_100ns_ticks ();
      sgen_clear_nursery_fragments ();
      whole_heap_check_before_collection.155 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.155 != 0) goto <D.23841>; else goto <D.23842>;
      <D.23841>:
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.23842>:
      btv = mono_100ns_ticks ();
      D.23843 = btv - atv;
      D.23844 = D.23843 / 10;
      D.23845 = (int) D.23844;
      D.23846 = (long long int) D.23845;
      time_major_pre_collection_fragment_clear.156 = time_major_pre_collection_fragment_clear;
      time_major_pre_collection_fragment_clear.157 = D.23846 + time_major_pre_collection_fragment_clear.156;
      time_major_pre_collection_fragment_clear = time_major_pre_collection_fragment_clear.157;
      D.23849 = sgen_collection_is_concurrent ();
      if (D.23849 == 0) goto <D.23850>; else goto <D.23851>;
      <D.23850>:
      nursery_section.158 = nursery_section;
      D.23853 = sgen_get_nursery_end ();
      nursery_section.158->next_data = D.23853;
      <D.23851>:
      objects_pinned = 0;
      D.23854 = major_collector.have_swept;
      *D.23854 = 0;
      xdomain_checks.159 = xdomain_checks;
      if (xdomain_checks.159 != 0) goto <D.23856>; else goto <D.23857>;
      <D.23856>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.23857>:
      concurrent_collection_in_progress.160 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.160 == 0) goto <D.23859>; else goto <D.23860>;
      <D.23859>:
      D.23861 = remset.prepare_for_major_collection;
      D.23861 ();
      <D.23860>:
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      atv = mono_100ns_ticks ();
      sgen_init_pinning ();
      if (0 != 0) goto <D.23862>; else goto <D.23863>;
      <D.23862>:
      gc_debug_file.161 = gc_debug_file;
      fprintf (gc_debug_file.161, "Collecting pinned addresses\n");
      gc_debug_file.161 = gc_debug_file;
      fflush (gc_debug_file.161);
      <D.23863>:
      highest_heap_address.162 = highest_heap_address;
      highest_heap_address.163 = (void *) highest_heap_address.162;
      lowest_heap_address.164 = lowest_heap_address;
      lowest_heap_address.165 = (void *) lowest_heap_address.164;
      pin_from_roots (lowest_heap_address.165, highest_heap_address.163, &gray_queue);
      concurrent_collection_in_progress.166 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.166 == 0) goto <D.23869>; else goto <D.23872>;
      <D.23872>:
      if (finish_up_concurrent_mark != 0) goto <D.23869>; else goto <D.23870>;
      <D.23869>:
      D.23873 = major_collector.is_concurrent;
      if (D.23873 != 0) goto <D.23874>; else goto <D.23875>;
      <D.23874>:
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      <D.23875>:
      concurrent_collection_in_progress.167 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.167 == 0) goto <D.23877>; else goto <D.23878>;
      <D.23877>:
      sgen_cement_reset ();
      <D.23878>:
      <D.23870>:
      sgen_optimize_pin_queue (0);
      concurrent_collection_in_progress.168 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.168 != 0) goto <D.23880>; else goto <D.23881>;
      <D.23880>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.23881>:
      if (0 != 0) goto <D.23882>; else goto <D.23883>;
      <D.23882>:
      gc_debug_file.161 = gc_debug_file;
      fprintf (gc_debug_file.161, "Pinning from sections\n");
      gc_debug_file.161 = gc_debug_file;
      fflush (gc_debug_file.161);
      <D.23883>:
      nursery_section.158 = nursery_section;
      sgen_find_section_pin_queue_start_end (nursery_section.158);
      D.23884 = major_collector.find_pin_queue_start_ends;
      D.23884 (&gray_queue);
      if (0 != 0) goto <D.23885>; else goto <D.23886>;
      <D.23885>:
      gc_debug_file.161 = gc_debug_file;
      fprintf (gc_debug_file.161, "Pinning from large objects\n");
      gc_debug_file.161 = gc_debug_file;
      fflush (gc_debug_file.161);
      <D.23886>:
      bigobj = los_object_list;
      goto <D.21048>;
      <D.21047>:
      {
        int dummy;

        try
          {
            D.23887 = sgen_los_object_size (bigobj);
            D.23888 = &bigobj->data[D.23887];
            D.23889 = &bigobj->data;
            D.23890 = sgen_find_optimized_pin_queue_area (D.23889, D.23888, &dummy);
            if (D.23890 != 0B) goto <D.23891>; else goto <D.23892>;
            <D.23891>:
            D.23889 = &bigobj->data;
            D.23893 = sgen_los_object_is_pinned (D.23889);
            if (D.23893 != 0) goto <D.23894>; else goto <D.23895>;
            <D.23894>:
            D.23896 = finish_up_concurrent_mark == 0;
            D.23897 = (long int) D.23896;
            D.23898 = __builtin_expect (D.23897, 0);
            if (D.23898 != 0) goto <D.23899>; else goto <D.23900>;
            <D.23899>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2919, "finish_up_concurrent_mark");
            <D.23900>:
            // predicted unlikely by continue predictor.
            goto <D.21046>;
            <D.23895>:
            D.23889 = &bigobj->data;
            sgen_los_pin_object (D.23889);
            D.23889 = &bigobj->data;
            D.23901 = MEM[(mword *)D.23889];
            D.23902 = D.23901 & 18446744073709551612;
            D.23903 = (struct MonoVTable *) D.23902;
            D.23904 = D.23903->gc_descr;
            D.23905 = (long unsigned int) D.23904;
            D.23906 = sgen_gc_descr_has_references (D.23905);
            if (D.23906 != 0) goto <D.23907>; else goto <D.23908>;
            <D.23907>:
            D.23913 = gray_queue.first;
            if (D.23913 == 0B) goto <D.23910>; else goto <D.23914>;
            <D.23914>:
            D.23913 = gray_queue.first;
            D.23915 = D.23913->end;
            if (D.23915 == 125) goto <D.23910>; else goto <D.23911>;
            <D.23910>:
            iftmp.169 = 1;
            goto <D.23912>;
            <D.23911>:
            iftmp.169 = 0;
            <D.23912>:
            D.23916 = iftmp.169 != 0;
            D.23917 = (long int) D.23916;
            D.23918 = __builtin_expect (D.23917, 0);
            if (D.23918 != 0) goto <D.23919>; else goto <D.23920>;
            <D.23919>:
            D.23889 = &bigobj->data;
            sgen_gray_object_enqueue (&gray_queue, D.23889);
            goto <D.23921>;
            <D.23920>:
            D.23913 = gray_queue.first;
            D.23913 = gray_queue.first;
            D.23915 = D.23913->end;
            D.23922 = D.23915;
            D.23923 = D.23922 + 1;
            D.23913->end = D.23923;
            D.23889 = &bigobj->data;
            D.23913->objects[D.23922] = D.23889;
            <D.23921>:
            D.23889 = &bigobj->data;
            __builtin_prefetch (D.23889);
            <D.23908>:
            do_pin_stats.170 = do_pin_stats;
            D.23925 = do_pin_stats.170 != 0;
            D.23926 = (long int) D.23925;
            D.23927 = __builtin_expect (D.23926, 0);
            if (D.23927 != 0) goto <D.23928>; else goto <D.23929>;
            <D.23928>:
            D.23889 = &bigobj->data;
            D.23930 = sgen_safe_object_get_size (D.23889);
            D.23931 = (long unsigned int) D.23930;
            D.23889 = &bigobj->data;
            sgen_pin_stats_register_object (D.23889, D.23931);
            <D.23929>:
            if (0 != 0) goto <D.23932>; else goto <D.23933>;
            <D.23932>:
            D.23934 = sgen_los_object_size (bigobj);
            D.23889 = &bigobj->data;
            D.23935 = safe_name (D.23889);
            D.23889 = &bigobj->data;
            gc_debug_file.161 = gc_debug_file;
            fprintf (gc_debug_file.161, "Marked large object %p (%s) size: %lu from roots\n", D.23889, D.23935, D.23934);
            gc_debug_file.161 = gc_debug_file;
            fflush (gc_debug_file.161);
            <D.23933>:
            if (profile_roots != 0) goto <D.23936>; else goto <D.23937>;
            <D.23936>:
            D.23889 = &bigobj->data;
            add_profile_gc_root (&root_report, D.23889, 260, 0);
            <D.23937>:
            <D.23892>:
          }
        finally
          {
            dummy = {CLOBBER};
          }
      }
      <D.21046>:
      bigobj = bigobj->next;
      <D.21048>:
      if (bigobj != 0B) goto <D.21047>; else goto <D.21049>;
      <D.21049>:
      if (profile_roots != 0) goto <D.23938>; else goto <D.23939>;
      <D.23938>:
      notify_gc_roots (&root_report);
      <D.23939>:
      concurrent_collection_in_progress.172 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.172 != 0) goto <D.23942>; else goto <D.23943>;
      <D.23942>:
      iftmp.171 = current_object_ops.scan_object;
      goto <D.23944>;
      <D.23943>:
      iftmp.171 = 0B;
      <D.23944>:
      ctx.scan_func = iftmp.171;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      concurrent_collection_in_progress.173 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.173 != 0) goto <D.23948>; else goto <D.23945>;
      <D.23948>:
      D.23949 = sgen_minor_collector.is_split;
      if (D.23949 != 0) goto <D.23950>; else goto <D.23945>;
      <D.23950>:
      scan_nursery_objects (ctx);
      goto <D.23946>;
      <D.23945>:
      nursery_section.158 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.158, ctx);
      check_nursery_objects_pinned.174 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.174 != 0) goto <D.23952>; else goto <D.23953>;
      <D.23952>:
      D.23949 = sgen_minor_collector.is_split;
      if (D.23949 == 0) goto <D.23954>; else goto <D.23955>;
      <D.23954>:
      concurrent_collection_in_progress.176 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.176 == 0) goto <D.23957>; else goto <D.23961>;
      <D.23961>:
      if (finish_up_concurrent_mark != 0) goto <D.23957>; else goto <D.23958>;
      <D.23957>:
      iftmp.175 = 1;
      goto <D.23959>;
      <D.23958>:
      iftmp.175 = 0;
      <D.23959>:
      sgen_check_nursery_objects_pinned (iftmp.175);
      <D.23955>:
      <D.23953>:
      <D.23946>:
      D.23962 = major_collector.pin_objects;
      D.23962 (&gray_queue);
      if (old_next_pin_slot != 0B) goto <D.23963>; else goto <D.23964>;
      <D.23963>:
      D.23965 = sgen_get_pinned_count ();
      *old_next_pin_slot = D.23965;
      <D.23964>:
      btv = mono_100ns_ticks ();
      D.23843 = btv - atv;
      D.23844 = D.23843 / 10;
      D.23845 = (int) D.23844;
      D.23846 = (long long int) D.23845;
      time_major_pinning.177 = time_major_pinning;
      time_major_pinning.178 = D.23846 + time_major_pinning.177;
      time_major_pinning = time_major_pinning.178;
      gc_debug_level.179 = gc_debug_level;
      D.23969 = gc_debug_level.179 > 1;
      D.23970 = (long int) D.23969;
      D.23971 = __builtin_expect (D.23970, 0);
      if (D.23971 != 0) goto <D.23972>; else goto <D.23973>;
      <D.23972>:
      D.23843 = btv - atv;
      D.23844 = D.23843 / 10;
      D.23845 = (int) D.23844;
      D.23974 = sgen_get_pinned_count ();
      gc_debug_file.161 = gc_debug_file;
      fprintf (gc_debug_file.161, "Finding pinned pointers: %d in %d usecs\n", D.23974, D.23845);
      gc_debug_file.161 = gc_debug_file;
      fflush (gc_debug_file.161);
      <D.23973>:
      if (0 != 0) goto <D.23975>; else goto <D.23976>;
      <D.23975>:
      D.23977 = sgen_get_pinned_count ();
      gc_debug_file.161 = gc_debug_file;
      fprintf (gc_debug_file.161, "Start scan with %d pinned objects\n", D.23977);
      gc_debug_file.161 = gc_debug_file;
      fflush (gc_debug_file.161);
      <D.23976>:
      D.23978 = major_collector.init_to_space;
      D.23978 ();
      concurrent_collection_in_progress.180 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.180 == 0) goto <D.23980>; else goto <D.23981>;
      <D.23980>:
      D.23982 = major_collector.is_parallel;
      if (D.23982 != 0) goto <D.23983>; else goto <D.23984>;
      <D.23983>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.23984>:
      <D.23981>:
      D.23985 = mono_profiler_get_events ();
      D.23986 = D.23985 & 1048576;
      if (D.23986 != 0) goto <D.23987>; else goto <D.23988>;
      <D.23987>:
      report_registered_roots ();
      <D.23988>:
      atv = mono_100ns_ticks ();
      D.23989 = atv - btv;
      D.23990 = D.23989 / 10;
      D.23991 = (int) D.23990;
      D.23992 = (long long int) D.23991;
      time_major_scan_pinned.181 = time_major_scan_pinned;
      time_major_scan_pinned.182 = D.23992 + time_major_scan_pinned.181;
      time_major_scan_pinned = time_major_scan_pinned.182;
      scrrjd_normal = sgen_alloc_internal_dynamic (40, 20, 1);
      D.23995 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.23995;
      D.23996 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.23996;
      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 (40, 20, 1);
      D.23995 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.23995;
      D.23996 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.23996;
      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.23843 = btv - atv;
      D.23844 = D.23843 / 10;
      D.23845 = (int) D.23844;
      D.23846 = (long long int) D.23845;
      time_major_scan_registered_roots.183 = time_major_scan_registered_roots;
      time_major_scan_registered_roots.184 = D.23846 + time_major_scan_registered_roots.183;
      time_major_scan_registered_roots = time_major_scan_registered_roots.184;
      stdjd = sgen_alloc_internal_dynamic (16, 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.23989 = atv - btv;
      D.23990 = D.23989 / 10;
      D.23991 = (int) D.23990;
      D.23992 = (long long int) D.23991;
      time_major_scan_thread_data.185 = time_major_scan_thread_data;
      time_major_scan_thread_data.186 = D.23992 + time_major_scan_thread_data.185;
      time_major_scan_thread_data = time_major_scan_thread_data.186;
      btv = mono_100ns_ticks ();
      D.23843 = btv - atv;
      D.23844 = D.23843 / 10;
      D.23845 = (int) D.23844;
      D.23846 = (long long int) D.23845;
      time_major_scan_alloc_pinned.187 = time_major_scan_alloc_pinned;
      time_major_scan_alloc_pinned.188 = D.23846 + time_major_scan_alloc_pinned.187;
      time_major_scan_alloc_pinned = time_major_scan_alloc_pinned.188;
      D.24003 = mono_profiler_get_events ();
      D.24004 = D.24003 & 1048576;
      if (D.24004 != 0) goto <D.24005>; else goto <D.24006>;
      <D.24005>:
      report_finalizer_roots ();
      <D.24006>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (8, 20, 1);
      fin_ready_list.189 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.189;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (8, 20, 1);
      critical_fin_list.190 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.190;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      if (scan_mod_union != 0) goto <D.24009>; else goto <D.24010>;
      <D.24009>:
      D.23896 = finish_up_concurrent_mark == 0;
      D.23897 = (long int) D.23896;
      D.23898 = __builtin_expect (D.23897, 0);
      if (D.23898 != 0) goto <D.24011>; else goto <D.24012>;
      <D.24011>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3038, "finish_up_concurrent_mark");
      <D.24012>:
      sgen_workers_enqueue_job (job_scan_major_mod_union_cardtable, 0B);
      sgen_workers_enqueue_job (job_scan_los_mod_union_cardtable, 0B);
      <D.24010>:
      atv = mono_100ns_ticks ();
      D.23989 = atv - btv;
      D.23990 = D.23989 / 10;
      D.23991 = (int) D.23990;
      D.23992 = (long long int) D.23991;
      time_major_scan_finalized.191 = time_major_scan_finalized;
      time_major_scan_finalized.192 = D.23992 + time_major_scan_finalized.191;
      time_major_scan_finalized = time_major_scan_finalized.192;
      gc_debug_level.179 = gc_debug_level;
      D.23969 = gc_debug_level.179 > 1;
      D.23970 = (long int) D.23969;
      D.23971 = __builtin_expect (D.23970, 0);
      if (D.23971 != 0) goto <D.24015>; else goto <D.24016>;
      <D.24015>:
      D.23989 = atv - btv;
      D.23990 = D.23989 / 10;
      D.23991 = (int) D.23990;
      gc_debug_file.161 = gc_debug_file;
      fprintf (gc_debug_file.161, "Root scan: %d usecs\n", D.23991);
      gc_debug_file.161 = gc_debug_file;
      fflush (gc_debug_file.161);
      <D.24016>:
      btv = mono_100ns_ticks ();
      D.23843 = btv - atv;
      D.23844 = D.23843 / 10;
      D.23845 = (int) D.23844;
      D.23846 = (long long int) D.23845;
      time_major_scan_big_objects.193 = time_major_scan_big_objects;
      time_major_scan_big_objects.194 = D.23846 + time_major_scan_big_objects.193;
      time_major_scan_big_objects = time_major_scan_big_objects.194;
      concurrent_collection_in_progress.195 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.195 != 0) goto <D.24020>; else goto <D.24021>;
      <D.24020>:
      sgen_finish_pinning ();
      sgen_pin_stats_reset ();
      do_concurrent_checks.154 = do_concurrent_checks;
      if (do_concurrent_checks.154 != 0) goto <D.24022>; else goto <D.24023>;
      <D.24022>:
      check_nursery_is_clean ();
      <D.24023>:
      <D.24021>:
    }
  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.196;
  _Bool D.24027;
  long int D.24028;
  long int D.24029;
  struct SgenGrayQueue * D.24032;

  concurrent_collection_in_progress.196 = concurrent_collection_in_progress;
  D.24027 = concurrent_collection_in_progress.196 == 0;
  D.24028 = (long int) D.24027;
  D.24029 = __builtin_expect (D.24028, 0);
  if (D.24029 != 0) goto <D.24030>; else goto <D.24031>;
  <D.24030>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2390, "concurrent_collection_in_progress");
  <D.24031>:
  D.24032 = sgen_workers_get_job_gray_queue (worker_data);
  sgen_los_scan_card_table (1, D.24032);
}


sgen_workers_get_job_gray_queue (struct WorkerData * worker_data)
{
  struct SgenGrayQueue * D.24033;
  struct SgenGrayQueue * iftmp.197;

  if (worker_data != 0B) goto <D.24035>; else goto <D.24036>;
  <D.24035>:
  iftmp.197 = &worker_data->private_gray_queue;
  goto <D.24037>;
  <D.24036>:
  iftmp.197 = &gray_queue;
  <D.24037>:
  D.24033 = iftmp.197;
  return D.24033;
}


job_scan_major_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.198;
  _Bool D.24040;
  long int D.24041;
  long int D.24042;
  void (*<T2d01>) (gboolean, struct SgenGrayQueue *) D.24045;
  struct SgenGrayQueue * D.24046;

  concurrent_collection_in_progress.198 = concurrent_collection_in_progress;
  D.24040 = concurrent_collection_in_progress.198 == 0;
  D.24041 = (long int) D.24040;
  D.24042 = __builtin_expect (D.24041, 0);
  if (D.24042 != 0) goto <D.24043>; else goto <D.24044>;
  <D.24043>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2383, "concurrent_collection_in_progress");
  <D.24044>:
  D.24045 = major_collector.scan_card_table;
  D.24046 = sgen_workers_get_job_gray_queue (worker_data);
  D.24045 (1, D.24046);
}


job_scan_finalizer_entries (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2bff>) (void * *, struct SgenGrayQueue *) D.24047;
  struct SgenGrayQueue * D.24048;
  struct FinalizeReadyEntry * D.24049;
  struct ScanFinalizerEntriesJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      ctx.scan_func = 0B;
      D.24047 = current_object_ops.copy_or_mark_object;
      ctx.copy_func = D.24047;
      D.24048 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.24048;
      D.24049 = job_data->list;
      scan_finalizer_entries (D.24049, ctx);
      sgen_free_internal_dynamic (job_data, 8, 20);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


scan_finalizer_entries (struct FinalizeReadyEntry * list, struct ScanCopyContext ctx)
{
  void * D.24050;
  const char * D.24055;
  struct FILE * gc_debug_file.199;
  void * * D.24057;
  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.20773>;
  <D.20772>:
  D.24050 = fin->object;
  if (D.24050 == 0B) goto <D.24051>; else goto <D.24052>;
  <D.24051>:
  // predicted unlikely by continue predictor.
  goto <D.20771>;
  <D.24052>:
  if (0 != 0) goto <D.24053>; else goto <D.24054>;
  <D.24053>:
  D.24050 = fin->object;
  D.24055 = safe_name (D.24050);
  D.24050 = fin->object;
  gc_debug_file.199 = gc_debug_file;
  fprintf (gc_debug_file.199, "Scan of fin ready object: %p (%s)\n\n", D.24050, D.24055);
  gc_debug_file.199 = gc_debug_file;
  fflush (gc_debug_file.199);
  <D.24054>:
  D.24057 = &fin->object;
  copy_func (D.24057, queue);
  <D.20771>:
  fin = fin->next;
  <D.20773>:
  if (fin != 0B) goto <D.20772>; else goto <D.20774>;
  <D.20774>:
}


job_scan_thread_data (struct WorkerData * worker_data, void * job_data_untyped)
{
  struct SgenGrayQueue * D.24058;
  char * D.24059;
  char * D.24060;
  struct ScanThreadDataJobData * job_data;

  job_data = job_data_untyped;
  D.24058 = sgen_workers_get_job_gray_queue (worker_data);
  D.24059 = job_data->heap_end;
  D.24060 = job_data->heap_start;
  scan_thread_data (D.24060, D.24059, 1, D.24058);
  sgen_free_internal_dynamic (job_data, 16, 20);
}


scan_thread_data (void * start_nursery, void * end_nursery, gboolean precise, struct GrayQueue * queue)
{
  struct MonoLinkedListSet * D.24061;
  struct MonoLinkedListSetNode * D.24062;
  long unsigned int D.24063;
  int D.24066;
  void * D.24071;
  long int D.24072;
  void * D.24073;
  long int D.24074;
  long int D.24075;
  struct FILE * gc_debug_file.200;
  int D.24077;
  int D.24082;
  int D.24083;
  int D.24090;
  void (*<T2ab8>) (void *, guint8 *, guint8 *, gboolean) D.24093;
  int conservative_stack_mark.201;
  void * D.24097;
  struct _IO_FILE * stderr.202;
  struct MonoContext * D.24105;
  void * * D.24106;
  struct SgenThreadInfo * info;

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

    D.24061 = mono_thread_info_list_head ();
    __cur = D.24061->head;
    goto <D.21277>;
    <D.21276>:
    D.24062 = __cur->next;
    D.24063 = mono_lls_pointer_get_mark (D.24062);
    if (D.24063 == 0) goto <D.24064>; else goto <D.24065>;
    <D.24064>:
    info = __cur;
    D.24066 = info->skip;
    if (D.24066 != 0) goto <D.24067>; else goto <D.24068>;
    <D.24067>:
    if (0 != 0) goto <D.24069>; else goto <D.24070>;
    <D.24069>:
    D.24071 = info->stack_end;
    D.24072 = (long int) D.24071;
    D.24073 = info->stack_start;
    D.24074 = (long int) D.24073;
    D.24075 = D.24072 - D.24074;
    D.24071 = info->stack_end;
    D.24073 = info->stack_start;
    gc_debug_file.200 = gc_debug_file;
    fprintf (gc_debug_file.200, "Skipping dead thread %p, range: %p-%p, size: %td\n", info, D.24073, D.24071, D.24075);
    gc_debug_file.200 = gc_debug_file;
    fflush (gc_debug_file.200);
    <D.24070>:
    // predicted unlikely by continue predictor.
    goto <D.21274>;
    <D.24068>:
    D.24077 = info->gc_disabled;
    if (D.24077 != 0) goto <D.24078>; else goto <D.24079>;
    <D.24078>:
    if (0 != 0) goto <D.24080>; else goto <D.24081>;
    <D.24080>:
    D.24071 = info->stack_end;
    D.24072 = (long int) D.24071;
    D.24073 = info->stack_start;
    D.24074 = (long int) D.24073;
    D.24075 = D.24072 - D.24074;
    D.24071 = info->stack_end;
    D.24073 = info->stack_start;
    gc_debug_file.200 = gc_debug_file;
    fprintf (gc_debug_file.200, "GC disabled for thread %p, range: %p-%p, size: %td\n", info, D.24073, D.24071, D.24075);
    gc_debug_file.200 = gc_debug_file;
    fflush (gc_debug_file.200);
    <D.24081>:
    // predicted unlikely by continue predictor.
    goto <D.21274>;
    <D.24079>:
    D.24082 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.24083 = D.24082 & 15;
    if (D.24083 != 1) goto <D.24084>; else goto <D.24085>;
    <D.24084>:
    if (0 != 0) goto <D.24086>; else goto <D.24087>;
    <D.24086>:
    D.24082 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.24083 = D.24082 & 15;
    D.24071 = info->stack_end;
    D.24072 = (long int) D.24071;
    D.24073 = info->stack_start;
    D.24074 = (long int) D.24073;
    D.24075 = D.24072 - D.24074;
    D.24071 = info->stack_end;
    D.24073 = info->stack_start;
    gc_debug_file.200 = gc_debug_file;
    fprintf (gc_debug_file.200, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)\n", info, D.24073, D.24071, D.24075, D.24083);
    gc_debug_file.200 = gc_debug_file;
    fflush (gc_debug_file.200);
    <D.24087>:
    // predicted unlikely by continue predictor.
    goto <D.21274>;
    <D.24085>:
    if (0 != 0) goto <D.24088>; else goto <D.24089>;
    <D.24088>:
    D.24090 = sgen_get_pinned_count ();
    D.24071 = info->stack_end;
    D.24072 = (long int) D.24071;
    D.24073 = info->stack_start;
    D.24074 = (long int) D.24073;
    D.24075 = D.24072 - D.24074;
    D.24071 = info->stack_end;
    D.24073 = info->stack_start;
    gc_debug_file.200 = gc_debug_file;
    fprintf (gc_debug_file.200, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d\n", info, D.24073, D.24071, D.24075, D.24090);
    gc_debug_file.200 = gc_debug_file;
    fflush (gc_debug_file.200);
    <D.24089>:
    D.24093 = gc_callbacks.thread_mark_func;
    if (D.24093 != 0B) goto <D.24094>; else goto <D.24091>;
    <D.24094>:
    conservative_stack_mark.201 = conservative_stack_mark;
    if (conservative_stack_mark.201 == 0) goto <D.24096>; else goto <D.24091>;
    <D.24096>:
    {
      struct UserCopyOrMarkData data;

      try
        {
          data.func = 0B;
          data.queue = queue;
          set_user_copy_or_mark_data (&data);
          D.24093 = gc_callbacks.thread_mark_func;
          D.24071 = info->stack_end;
          D.24073 = info->stack_start;
          D.24097 = info->runtime_data;
          D.24093 (D.24097, D.24073, D.24071, precise);
          set_user_copy_or_mark_data (0B);
        }
      finally
        {
          data = {CLOBBER};
        }
    }
    goto <D.24092>;
    <D.24091>:
    if (precise == 0) goto <D.24098>; else goto <D.24099>;
    <D.24098>:
    conservative_stack_mark.201 = conservative_stack_mark;
    if (conservative_stack_mark.201 == 0) goto <D.24100>; else goto <D.24101>;
    <D.24100>:
    stderr.202 = stderr;
    fprintf (stderr.202, "Precise stack mark not supported - disabling.\n");
    conservative_stack_mark = 1;
    <D.24101>:
    D.24071 = info->stack_end;
    D.24073 = info->stack_start;
    conservatively_pin_objects_from (D.24073, D.24071, start_nursery, end_nursery, 0);
    <D.24099>:
    <D.24092>:
    if (precise == 0) goto <D.24103>; else goto <D.24104>;
    <D.24103>:
    D.24105 = &info->ctx;
    D.24106 = D.24105 + 128;
    D.24105 = &info->ctx;
    conservatively_pin_objects_from (D.24105, D.24106, start_nursery, end_nursery, 0);
    <D.24104>:
    <D.24065>:
    <D.21274>:
    D.24062 = __cur->next;
    __cur = mono_lls_pointer_unmask (D.24062);
    <D.21277>:
    if (__cur != 0B) goto <D.21276>; else goto <D.21278>;
    <D.21278>:
  }
}


mono_lls_pointer_get_mark (void * n)
{
  uintptr_t D.24107;
  long unsigned int n.203;

  n.203 = (long unsigned int) n;
  D.24107 = n.203 & 1;
  return D.24107;
}


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

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


mono_native_tls_set_value (pthread_key_t key, void * value)
{
  int D.24111;
  int D.24112;
  _Bool D.24113;

  D.24112 = pthread_setspecific (key, value);
  D.24113 = D.24112 == 0;
  D.24111 = (int) D.24113;
  return D.24111;
}


conservatively_pin_objects_from (void * * start, void * * end, void * start_nursery, void * end_nursery, int pin_type)
{
  volatile long long unsigned int D.20590;
  long long unsigned int start.205;
  long int end.206;
  long int start.207;
  long int D.24118;
  long long unsigned int D.24119;
  void * D.24120;
  long unsigned int start_nursery.208;
  _Bool D.24126;
  long unsigned int end_nursery.209;
  _Bool D.24128;
  _Bool D.24129;
  void * addr.210;
  struct FILE * gc_debug_file.211;
  int do_pin_stats.212;
  _Bool D.24137;
  long int D.24138;
  long int D.24139;
  int D.24142;
  char * addr.213;
  int count;

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

    _zzq_args[0] = 1296236555;
    start.205 = (long long unsigned int) start;
    _zzq_args[1] = start.205;
    end.206 = (long int) end;
    start.207 = (long int) start;
    D.24118 = end.206 - start.207;
    D.24119 = (long long unsigned int) D.24118;
    _zzq_args[2] = D.24119;
    _zzq_args[3] = 0;
    _zzq_args[4] = 0;
    _zzq_args[5] = 0;
    __asm__ __volatile__("rolq $3,  %%rdi ; rolq $13, %%rdi
	rolq $61, %%rdi ; rolq $51, %%rdi
	xchgq %%rbx,%%rbx" : "=d" _zzq_result : "a" &_zzq_args[0], "0" 0 : "memory", "cc");
    D.20590 = _zzq_result;
  }
  goto <D.20593>;
  <D.20592>:
  D.24120 = *start;
  if (D.24120 >= start_nursery) goto <D.24121>; else goto <D.24122>;
  <D.24121>:
  D.24120 = *start;
  if (D.24120 < end_nursery) goto <D.24123>; else goto <D.24124>;
  <D.24123>:
  {
    mword addr;

    D.24120 = *start;
    addr = (mword) D.24120;
    addr = addr & 18446744073709551608;
    start_nursery.208 = (long unsigned int) start_nursery;
    D.24126 = start_nursery.208 <= addr;
    end_nursery.209 = (long unsigned int) end_nursery;
    D.24128 = end_nursery.209 > addr;
    D.24129 = D.24126 & D.24128;
    if (D.24129 != 0) goto <D.24130>; else goto <D.24131>;
    <D.24130>:
    if (0 != 0) goto <D.24132>; else goto <D.24133>;
    <D.24132>:
    addr.210 = (void *) addr;
    gc_debug_file.211 = gc_debug_file;
    fprintf (gc_debug_file.211, "Pinning address %p from %p\n", addr.210, start);
    gc_debug_file.211 = gc_debug_file;
    fflush (gc_debug_file.211);
    <D.24133>:
    addr.210 = (void *) addr;
    sgen_pin_stage_ptr (addr.210);
    count = count + 1;
    <D.24131>:
    do_pin_stats.212 = do_pin_stats;
    D.24137 = do_pin_stats.212 != 0;
    D.24138 = (long int) D.24137;
    D.24139 = __builtin_expect (D.24138, 0);
    if (D.24139 != 0) goto <D.24140>; else goto <D.24141>;
    <D.24140>:
    addr.210 = (void *) addr;
    D.24142 = sgen_ptr_in_nursery (addr.210);
    if (D.24142 != 0) goto <D.24143>; else goto <D.24144>;
    <D.24143>:
    addr.213 = (char *) addr;
    sgen_pin_stats_register_address (addr.213, pin_type);
    <D.24144>:
    <D.24141>:
  }
  <D.24124>:
  <D.24122>:
  start = start + 8;
  <D.20593>:
  if (start < end) goto <D.20592>; else goto <D.20594>;
  <D.20594>:
  if (count != 0) goto <D.24146>; else goto <D.24147>;
  <D.24146>:
  if (0 != 0) goto <D.24148>; else goto <D.24149>;
  <D.24148>:
  gc_debug_file.211 = gc_debug_file;
  fprintf (gc_debug_file.211, "found %d potential pinned heap pointers\n", count);
  gc_debug_file.211 = gc_debug_file;
  fflush (gc_debug_file.211);
  <D.24149>:
  <D.24147>:
}


mono_lls_pointer_unmask (void * p)
{
  void * D.24150;
  long unsigned int p.214;
  long unsigned int D.24152;

  p.214 = (long unsigned int) p;
  D.24152 = p.214 & 18446744073709551612;
  D.24150 = (void *) D.24152;
  return D.24150;
}


job_scan_from_registered_roots (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2c04>) (char *, struct SgenGrayQueue *) D.24154;
  void (*<T2bff>) (void * *, struct SgenGrayQueue *) D.24155;
  struct SgenGrayQueue * D.24156;
  int D.24157;
  char * D.24158;
  char * D.24159;
  struct ScanFromRegisteredRootsJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      D.24154 = job_data->scan_func;
      ctx.scan_func = D.24154;
      D.24155 = job_data->copy_or_mark_func;
      ctx.copy_func = D.24155;
      D.24156 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.24156;
      D.24157 = job_data->root_type;
      D.24158 = job_data->heap_end;
      D.24159 = job_data->heap_start;
      scan_from_registered_roots (D.24159, D.24158, D.24157, ctx);
      sgen_free_internal_dynamic (job_data, 40, 20);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


scan_from_registered_roots (char * addr_start, char * addr_end, int root_type, struct ScanCopyContext ctx)
{
  long unsigned int D.24160;
  long unsigned int D.24161;
  long unsigned int D.24164;
  void * D.24165;
  char * D.24166;
  struct FILE * gc_debug_file.215;
  struct SgenHashTableEntry * D.24168;
  unsigned int D.24169;
  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.20835>;
    <D.20834>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.24160 = (long unsigned int) __i;
      D.24161 = D.24160 * 8;
      __iter = __table + D.24161;
      goto <D.20832>;
      <D.20831>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.24162>; else goto <D.24163>;
        <D.24162>:
        D.24164 = root->root_desc;
        D.24165 = (void *) D.24164;
        D.24166 = root->end_root;
        gc_debug_file.215 = gc_debug_file;
        fprintf (gc_debug_file.215, "Precise root scan %p-%p (desc: %p)\n", start_root, D.24166, D.24165);
        gc_debug_file.215 = gc_debug_file;
        fflush (gc_debug_file.215);
        <D.24163>:
        D.24164 = root->root_desc;
        D.24166 = root->end_root;
        precisely_scan_objects_from (start_root, D.24166, addr_start, addr_end, D.24164, ctx);
      }
      __iter = __next;
      <D.20832>:
      D.24168 = *__iter;
      if (D.24168 != 0B) goto <D.20831>; else goto <D.20833>;
      <D.20833>:
    }
    __i = __i + 1;
    <D.20835>:
    D.24169 = roots_hash[root_type].size;
    if (D.24169 > __i) goto <D.20834>; else goto <D.20836>;
    <D.20836>:
  }
}


precisely_scan_objects_from (void * * start_root, void * * end_root, char * n_start, char * n_end, mword desc, struct ScanCopyContext ctx)
{
  long unsigned int D.24170;
  long unsigned int D.24171;
  void * D.24174;
  struct FILE * gc_debug_file.216;
  long unsigned int D.24180;
  unsigned int D.24181;
  unsigned int D.24182;
  gsize * bitmap_data.217;
  long unsigned int D.24184;
  void * D.24187;
  int bwords.218;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct SgenGrayQueue * queue;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  D.24170 = desc & 7;
  switch (D.24170) <default: <D.20666>, case 1: <D.20645>, case 2: <D.20665>, case 3: <D.20649>, case 4: <D.20662>>
  <D.20645>:
  desc = desc >> 3;
  goto <D.20647>;
  <D.20646>:
  D.24171 = desc & 1;
  if (D.24171 != 0) goto <D.24172>; else goto <D.24173>;
  <D.24172>:
  D.24174 = *start_root;
  if (D.24174 != 0B) goto <D.24175>; else goto <D.24176>;
  <D.24175>:
  copy_func (start_root, queue);
  if (0 != 0) goto <D.24177>; else goto <D.24178>;
  <D.24177>:
  D.24174 = *start_root;
  gc_debug_file.216 = gc_debug_file;
  fprintf (gc_debug_file.216, "Overwrote root at %p with %p\n", start_root, D.24174);
  gc_debug_file.216 = gc_debug_file;
  fflush (gc_debug_file.216);
  <D.24178>:
  sgen_drain_gray_stack (-1, ctx);
  <D.24176>:
  <D.24173>:
  desc = desc >> 1;
  start_root = start_root + 8;
  <D.20647>:
  if (desc != 0) goto <D.20646>; else goto <D.20648>;
  <D.20648>:
  return;
  <D.20649>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.24180 = *bitmap_data;
    D.24181 = (unsigned int) D.24180;
    D.24182 = D.24181 + 4294967295;
    bwords = (int) D.24182;
    start_run = start_root;
    bitmap_data = bitmap_data + 8;
    goto <D.20659>;
    <D.20658>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.217 = bitmap_data;
      bitmap_data = bitmap_data.217 + 8;
      bmap = *bitmap_data.217;
      objptr = start_run;
      goto <D.20656>;
      <D.20655>:
      D.24184 = bmap & 1;
      if (D.24184 != 0) goto <D.24185>; else goto <D.24186>;
      <D.24185>:
      D.24187 = *objptr;
      if (D.24187 != 0B) goto <D.24188>; else goto <D.24189>;
      <D.24188>:
      copy_func (objptr, queue);
      if (0 != 0) goto <D.24190>; else goto <D.24191>;
      <D.24190>:
      D.24187 = *objptr;
      gc_debug_file.216 = gc_debug_file;
      fprintf (gc_debug_file.216, "Overwrote root at %p with %p\n", objptr, D.24187);
      gc_debug_file.216 = gc_debug_file;
      fflush (gc_debug_file.216);
      <D.24191>:
      sgen_drain_gray_stack (-1, ctx);
      <D.24189>:
      <D.24186>:
      bmap = bmap >> 1;
      objptr = objptr + 8;
      <D.20656>:
      if (bmap != 0) goto <D.20655>; else goto <D.20657>;
      <D.20657>:
      start_run = start_run + 512;
    }
    <D.20659>:
    bwords.218 = bwords;
    bwords = bwords.218 + -1;
    if (bwords.218 > 0) goto <D.20658>; else goto <D.20660>;
    <D.20660>:
    goto <D.20661>;
  }
  <D.20662>:
  {
    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.20661>;
      }
    finally
      {
        data = {CLOBBER};
      }
  }
  <D.20665>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1637);
  <D.20666>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1639);
  <D.20661>:
}


single_arg_user_copy_or_mark (void * * obj)
{
  unsigned int user_copy_or_mark_key.219;
  void (*<T2bff>) (void * *, struct SgenGrayQueue *) D.24196;
  struct GrayQueue * D.24197;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.219 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.219);
  D.24196 = data->func;
  D.24197 = data->queue;
  D.24196 (obj, D.24197);
}


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


init_gray_queue ()
{
  int D.24201;
  int D.24203;
  struct SgenSectionGrayQueue * D.24204;

  D.24201 = sgen_collection_is_parallel ();
  if (D.24201 != 0) goto <D.24198>; else goto <D.24202>;
  <D.24202>:
  D.24203 = sgen_collection_is_concurrent ();
  if (D.24203 != 0) goto <D.24198>; else goto <D.24199>;
  <D.24198>:
  sgen_workers_init_distribute_gray_queue ();
  D.24204 = sgen_workers_get_distribute_section_gray_queue ();
  sgen_gray_object_queue_init_with_alloc_prepare (&gray_queue, 0B, gray_queue_redirect, D.24204);
  goto <D.24200>;
  <D.24199>:
  sgen_gray_object_queue_init (&gray_queue, 0B);
  <D.24200>:
}


gray_queue_redirect (struct SgenGrayQueue * queue)
{
  void * D.24206;
  int iftmp.220;
  int concurrent_collection_in_progress.221;
  int current_collection_generation.222;
  int D.24217;
  _Bool D.24218;
  long int D.24219;
  long int D.24220;
  int D.24223;
  int concurrent_collection_in_progress.223;
  _Bool D.24230;
  long int D.24231;
  long int D.24232;
  gboolean wake;

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

    section = sgen_gray_object_dequeue_section (queue);
    if (section == 0B) goto <D.19958>; else goto <D.24205>;
    <D.24205>:
    D.24206 = queue->alloc_prepare_data;
    sgen_section_gray_queue_enqueue (D.24206, section);
    wake = 1;
  }
  goto <D.19959>;
  <D.19958>:
  if (wake != 0) goto <D.24207>; else goto <D.24208>;
  <D.24207>:
  concurrent_collection_in_progress.221 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.221 == 0) goto <D.24214>; else goto <D.24210>;
  <D.24214>:
  current_collection_generation.222 = current_collection_generation;
  if (current_collection_generation.222 != 1) goto <D.24211>; else goto <D.24216>;
  <D.24216>:
  D.24217 = major_collector.is_parallel;
  if (D.24217 == 0) goto <D.24211>; else goto <D.24210>;
  <D.24211>:
  iftmp.220 = 1;
  goto <D.24212>;
  <D.24210>:
  iftmp.220 = 0;
  <D.24212>:
  D.24218 = iftmp.220 != 0;
  D.24219 = (long int) D.24218;
  D.24220 = __builtin_expect (D.24219, 0);
  if (D.24220 != 0) goto <D.24221>; else goto <D.24222>;
  <D.24221>:
  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.24222>:
  D.24223 = sgen_workers_have_started ();
  if (D.24223 != 0) goto <D.24224>; else goto <D.24225>;
  <D.24224>:
  sgen_workers_wake_up_all ();
  goto <D.24226>;
  <D.24225>:
  concurrent_collection_in_progress.223 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.223 != 0) goto <D.24228>; else goto <D.24229>;
  <D.24228>:
  current_collection_generation.222 = current_collection_generation;
  D.24230 = current_collection_generation.222 != -1;
  D.24231 = (long int) D.24230;
  D.24232 = __builtin_expect (D.24231, 0);
  if (D.24232 != 0) goto <D.24233>; else goto <D.24234>;
  <D.24233>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 607, "current_collection_generation == -1");
  <D.24234>:
  <D.24229>:
  <D.24226>:
  <D.24208>:
}


pin_from_roots (void * start_nursery, void * end_nursery, struct GrayQueue * queue)
{
  int gc_debug_level.224;
  _Bool D.24236;
  long int D.24237;
  long int D.24238;
  unsigned int D.24241;
  unsigned int D.24242;
  long unsigned int roots_size.225;
  int D.24244;
  struct FILE * gc_debug_file.226;
  long unsigned int D.24246;
  long unsigned int D.24247;
  char * D.24250;
  struct SgenHashTableEntry * D.24251;
  unsigned int D.24252;
  void * * start_root;
  struct RootRecord * root;

  gc_debug_level.224 = gc_debug_level;
  D.24236 = gc_debug_level.224 > 1;
  D.24237 = (long int) D.24236;
  D.24238 = __builtin_expect (D.24237, 0);
  if (D.24238 != 0) goto <D.24239>; else goto <D.24240>;
  <D.24239>:
  D.24241 = roots_hash[1].num_entries;
  D.24242 = roots_hash[0].num_entries;
  roots_size.225 = roots_size;
  D.24244 = (int) roots_size.225;
  gc_debug_file.226 = gc_debug_file;
  fprintf (gc_debug_file.226, "Scanning pinned roots (%d bytes, %d/%d entries)\n", D.24244, D.24242, D.24241);
  gc_debug_file.226 = gc_debug_file;
  fflush (gc_debug_file.226);
  <D.24240>:
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

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

      D.24246 = (long unsigned int) __i;
      D.24247 = D.24246 * 8;
      __iter = __table + D.24247;
      goto <D.20609>;
      <D.20608>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.24248>; else goto <D.24249>;
        <D.24248>:
        D.24250 = root->end_root;
        gc_debug_file.226 = gc_debug_file;
        fprintf (gc_debug_file.226, "Pinned roots %p-%p\n", start_root, D.24250);
        gc_debug_file.226 = gc_debug_file;
        fflush (gc_debug_file.226);
        <D.24249>:
        D.24250 = root->end_root;
        conservatively_pin_objects_from (start_root, D.24250, start_nursery, end_nursery, 2);
      }
      __iter = __next;
      <D.20609>:
      D.24251 = *__iter;
      if (D.24251 != 0B) goto <D.20608>; else goto <D.20610>;
      <D.20610>:
    }
    __i = __i + 1;
    <D.20612>:
    D.24252 = roots_hash[1].size;
    if (D.24252 > __i) goto <D.20611>; else goto <D.20613>;
    <D.20613>:
  }
  scan_thread_data (start_nursery, end_nursery, 0, queue);
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.24253;
  gboolean D.24256;
  long unsigned int D.24257;
  long unsigned int D.24260;

  D.24253 = desc & 4294901767;
  if (D.24253 == 1) goto <D.24254>; else goto <D.24255>;
  <D.24254>:
  D.24256 = 0;
  return D.24256;
  <D.24255>:
  D.24257 = desc & 49159;
  if (D.24257 == 4) goto <D.24258>; else goto <D.24259>;
  <D.24258>:
  D.24256 = 0;
  return D.24256;
  <D.24259>:
  D.24260 = desc & 7;
  if (D.24260 == 7) goto <D.24261>; else goto <D.24262>;
  <D.24261>:
  D.24256 = 0;
  return D.24256;
  <D.24262>:
  D.24256 = 1;
  return D.24256;
}


scan_nursery_objects (struct ScanCopyContext ctx)
{
  struct GCMemSection * nursery_section.227;
  char * D.24265;
  char * D.24266;

  nursery_section.227 = nursery_section;
  D.24265 = nursery_section.227->end_data;
  nursery_section.227 = nursery_section;
  D.24266 = nursery_section.227->data;
  sgen_scan_area_with_callback (D.24266, D.24265, scan_nursery_objects_callback, &ctx, 0);
}


scan_nursery_objects_callback (char * obj, size_t size, struct ScanCopyContext * ctx)
{
  void (*<T2c04>) (char *, struct SgenGrayQueue *) D.24267;
  struct SgenGrayQueue * D.24268;

  D.24267 = ctx->scan_func;
  D.24268 = ctx->queue;
  D.24267 (obj, D.24268);
}


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


report_registered_roots_by_type (int root_type)
{
  long unsigned int D.24269;
  long unsigned int D.24270;
  long unsigned int D.24273;
  void * D.24274;
  char * D.24275;
  struct FILE * gc_debug_file.228;
  struct SgenHashTableEntry * D.24277;
  unsigned int D.24278;
  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.20759>;
        <D.20758>:
        {
          struct SgenHashTableEntry * * __iter;
          struct SgenHashTableEntry * * __next;

          D.24269 = (long unsigned int) __i;
          D.24270 = D.24269 * 8;
          __iter = __table + D.24270;
          goto <D.20756>;
          <D.20755>:
          {
            struct SgenHashTableEntry * __entry;

            __entry = *__iter;
            __next = &__entry->next;
            start_root = __entry->key;
            root = &__entry->data;
            if (0 != 0) goto <D.24271>; else goto <D.24272>;
            <D.24271>:
            D.24273 = root->root_desc;
            D.24274 = (void *) D.24273;
            D.24275 = root->end_root;
            gc_debug_file.228 = gc_debug_file;
            fprintf (gc_debug_file.228, "Precise root scan %p-%p (desc: %p)\n", start_root, D.24275, D.24274);
            gc_debug_file.228 = gc_debug_file;
            fflush (gc_debug_file.228);
            <D.24272>:
            D.24273 = root->root_desc;
            D.24275 = root->end_root;
            precisely_report_roots_from (&report, start_root, D.24275, D.24273);
          }
          __iter = __next;
          <D.20756>:
          D.24277 = *__iter;
          if (D.24277 != 0B) goto <D.20755>; else goto <D.20757>;
          <D.20757>:
        }
        __i = __i + 1;
        <D.20759>:
        D.24278 = roots_hash[root_type].size;
        if (D.24278 > __i) goto <D.20758>; else goto <D.20760>;
        <D.20760>:
      }
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


precisely_report_roots_from (struct GCRootReport * report, void * * start_root, void * * end_root, mword desc)
{
  long unsigned int D.24279;
  long unsigned int D.24280;
  void * D.24283;
  long unsigned int D.24286;
  unsigned int D.24287;
  unsigned int D.24288;
  gsize * bitmap_data.229;
  long unsigned int D.24290;
  void * D.24293;
  int bwords.230;

  D.24279 = desc & 7;
  switch (D.24279) <default: <D.20742>, case 1: <D.20722>, case 2: <D.20741>, case 3: <D.20726>, case 4: <D.20739>>
  <D.20722>:
  desc = desc >> 3;
  goto <D.20724>;
  <D.20723>:
  D.24280 = desc & 1;
  if (D.24280 != 0) goto <D.24281>; else goto <D.24282>;
  <D.24281>:
  D.24283 = *start_root;
  if (D.24283 != 0B) goto <D.24284>; else goto <D.24285>;
  <D.24284>:
  D.24283 = *start_root;
  add_profile_gc_root (report, D.24283, 3, 0);
  <D.24285>:
  <D.24282>:
  desc = desc >> 1;
  start_root = start_root + 8;
  <D.20724>:
  if (desc != 0) goto <D.20723>; else goto <D.20725>;
  <D.20725>:
  return;
  <D.20726>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.24286 = *bitmap_data;
    D.24287 = (unsigned int) D.24286;
    D.24288 = D.24287 + 4294967295;
    bwords = (int) D.24288;
    start_run = start_root;
    bitmap_data = bitmap_data + 8;
    goto <D.20736>;
    <D.20735>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.229 = bitmap_data;
      bitmap_data = bitmap_data.229 + 8;
      bmap = *bitmap_data.229;
      objptr = start_run;
      goto <D.20733>;
      <D.20732>:
      D.24290 = bmap & 1;
      if (D.24290 != 0) goto <D.24291>; else goto <D.24292>;
      <D.24291>:
      D.24293 = *objptr;
      if (D.24293 != 0B) goto <D.24294>; else goto <D.24295>;
      <D.24294>:
      D.24293 = *objptr;
      add_profile_gc_root (report, D.24293, 3, 0);
      <D.24295>:
      <D.24292>:
      bmap = bmap >> 1;
      objptr = objptr + 8;
      <D.20733>:
      if (bmap != 0) goto <D.20732>; else goto <D.20734>;
      <D.20734>:
      start_run = start_run + 512;
    }
    <D.20736>:
    bwords.230 = bwords;
    bwords = bwords.230 + -1;
    if (bwords.230 > 0) goto <D.20735>; else goto <D.20737>;
    <D.20737>:
    goto <D.20738>;
  }
  <D.20739>:
  {
    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.20738>;
  }
  <D.20741>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1821);
  <D.20742>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1823);
  <D.20738>:
}


single_arg_report_root (void * * obj)
{
  void * D.24298;
  struct GCRootReport * root_report.231;

  D.24298 = *obj;
  if (D.24298 != 0B) goto <D.24299>; else goto <D.24300>;
  <D.24299>:
  D.24298 = *obj;
  root_report.231 = root_report;
  add_profile_gc_root (root_report.231, D.24298, 3, 0);
  <D.24300>:
}


report_finalizer_roots ()
{
  struct FinalizeReadyEntry * fin_ready_list.232;
  struct FinalizeReadyEntry * critical_fin_list.233;

  fin_ready_list.232 = fin_ready_list;
  report_finalizer_roots_list (fin_ready_list.232);
  critical_fin_list.233 = critical_fin_list;
  report_finalizer_roots_list (critical_fin_list.233);
}


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

  try
    {
      report.count = 0;
      fin = list;
      goto <D.20707>;
      <D.20706>:
      D.24304 = fin->object;
      if (D.24304 == 0B) goto <D.24305>; else goto <D.24306>;
      <D.24305>:
      // predicted unlikely by continue predictor.
      goto <D.20705>;
      <D.24306>:
      D.24304 = fin->object;
      add_profile_gc_root (&report, D.24304, 1, 0);
      <D.20705>:
      fin = fin->next;
      <D.20707>:
      if (fin != 0B) goto <D.20706>; else goto <D.20708>;
      <D.20708>:
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


join_workers ()
{
  int concurrent_collection_in_progress.234;
  int D.24311;
  int D.24312;
  _Bool D.24313;
  long int D.24314;
  long int D.24315;

  concurrent_collection_in_progress.234 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.234 != 0) goto <D.24307>; else goto <D.24310>;
  <D.24310>:
  D.24311 = major_collector.is_parallel;
  if (D.24311 != 0) goto <D.24307>; else goto <D.24308>;
  <D.24307>:
  gray_queue_redirect (&gray_queue);
  sgen_workers_join ();
  <D.24308>:
  D.24312 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.24313 = D.24312 == 0;
  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>:
  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.24317>:
}


check_nursery_is_clean ()
{
  void * D.24318;
  int iftmp.235;
  long unsigned int D.24324;
  long unsigned int D.24325;
  long unsigned int D.24327;
  _Bool D.24329;
  long int D.24330;
  long int D.24331;
  long unsigned int D.24334;
  _Bool D.24335;
  long int D.24336;
  long int D.24337;
  unsigned int D.24340;
  unsigned int D.24341;
  unsigned int D.24342;
  long unsigned int D.24343;
  char * D.24344;
  char * start;
  char * end;
  char * cur;

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

    D.24318 = MEM[(void * *)cur];
    if (D.24318 == 0B) goto <D.24319>; else goto <D.24320>;
    <D.24319>:
    cur = cur + 8;
    // predicted unlikely by continue predictor.
    goto <D.20989>;
    <D.24320>:
    D.24324 = MEM[(mword *)cur];
    D.24325 = D.24324 & 1;
    if (D.24325 != 0) goto <D.24326>; else goto <D.24322>;
    <D.24326>:
    D.24324 = MEM[(mword *)cur];
    D.24327 = D.24324 & 18446744073709551612;
    if (D.24327 != 0) goto <D.24328>; else goto <D.24322>;
    <D.24328>:
    iftmp.235 = 1;
    goto <D.24323>;
    <D.24322>:
    iftmp.235 = 0;
    <D.24323>:
    D.24329 = iftmp.235 != 0;
    D.24330 = (long int) D.24329;
    D.24331 = __builtin_expect (D.24330, 0);
    if (D.24331 != 0) goto <D.24332>; else goto <D.24333>;
    <D.24332>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2468, "!object_is_forwarded (cur)");
    <D.24333>:
    D.24324 = MEM[(mword *)cur];
    D.24334 = D.24324 & 2;
    D.24335 = D.24334 != 0;
    D.24336 = (long int) D.24335;
    D.24337 = __builtin_expect (D.24336, 0);
    if (D.24337 != 0) goto <D.24338>; else goto <D.24339>;
    <D.24338>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2469, "!object_is_pinned (cur)");
    <D.24339>:
    D.24340 = sgen_safe_object_get_size (cur);
    ss = (size_t) D.24340;
    D.24341 = sgen_safe_object_get_size (cur);
    D.24342 = D.24341 + 7;
    D.24343 = (long unsigned int) D.24342;
    size = D.24343 & 4294967288;
    D.24344 = cur + size;
    verify_scan_starts (cur, D.24344);
    cur = cur + size;
  }
  <D.20989>:
  if (cur < end) goto <D.20990>; else goto <D.20991>;
  <D.20991>:
}


verify_scan_starts (char * start, char * end)
{
  struct GCMemSection * nursery_section.236;
  char * * D.24346;
  long unsigned int D.24347;
  long unsigned int D.24348;
  char * * D.24349;
  _Bool D.24350;
  _Bool D.24351;
  _Bool D.24352;
  int gc_debug_level.237;
  _Bool D.24356;
  long int D.24357;
  long int D.24358;
  struct FILE * gc_debug_file.238;
  unsigned int i.239;
  unsigned int D.24363;
  int i;

  i = 0;
  goto <D.20967>;
  <D.20966>:
  {
    char * addr;

    nursery_section.236 = nursery_section;
    D.24346 = nursery_section.236->scan_starts;
    D.24347 = (long unsigned int) i;
    D.24348 = D.24347 * 8;
    D.24349 = D.24346 + D.24348;
    addr = *D.24349;
    D.24350 = addr > start;
    D.24351 = addr < end;
    D.24352 = D.24350 & D.24351;
    if (D.24352 != 0) goto <D.24353>; else goto <D.24354>;
    <D.24353>:
    gc_debug_level.237 = gc_debug_level;
    D.24356 = gc_debug_level.237 > 0;
    D.24357 = (long int) D.24356;
    D.24358 = __builtin_expect (D.24357, 0);
    if (D.24358 != 0) goto <D.24359>; else goto <D.24360>;
    <D.24359>:
    gc_debug_file.238 = gc_debug_file;
    fprintf (gc_debug_file.238, "NFC-BAD SCAN START [%d] %p for obj [%p %p]\n", i, addr, start, end);
    gc_debug_file.238 = gc_debug_file;
    fflush (gc_debug_file.238);
    <D.24360>:
    <D.24354>:
  }
  i = i + 1;
  <D.20967>:
  i.239 = (unsigned int) i;
  nursery_section.236 = nursery_section;
  D.24363 = nursery_section.236->num_scan_start;
  if (i.239 < D.24363) goto <D.20966>; else goto <D.20968>;
  <D.20968>:
}


finish_gray_stack (int generation, struct GrayQueue * queue)
{
  char * iftmp.240;
  char * iftmp.241;
  int gc_debug_level.242;
  _Bool D.24373;
  long int D.24374;
  long int D.24375;
  const char * D.24378;
  struct FILE * gc_debug_file.243;
  int D.24380;
  int D.24383;
  long int D.24396;
  long int D.24397;
  int D.24398;
  const char * D.24399;
  int D.24400;
  _Bool D.24401;
  long int D.24402;
  long int D.24403;
  int D.24408;
  int D.24410;
  _Bool D.24411;
  long int D.24412;
  long int D.24413;
  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.24365>; else goto <D.24366>;
      <D.24365>:
      iftmp.240 = sgen_get_nursery_start ();
      goto <D.24367>;
      <D.24366>:
      iftmp.240 = 0B;
      <D.24367>:
      start_addr = iftmp.240;
      if (generation == 0) goto <D.24369>; else goto <D.24370>;
      <D.24369>:
      iftmp.241 = sgen_get_nursery_end ();
      goto <D.24371>;
      <D.24370>:
      iftmp.241 = -1B;
      <D.24371>:
      end_addr = iftmp.241;
      sgen_drain_gray_stack (-1, ctx);
      atv = mono_100ns_ticks ();
      gc_debug_level.242 = gc_debug_level;
      D.24373 = gc_debug_level.242 > 1;
      D.24374 = (long int) D.24373;
      D.24375 = __builtin_expect (D.24374, 0);
      if (D.24375 != 0) goto <D.24376>; else goto <D.24377>;
      <D.24376>:
      D.24378 = generation_name (generation);
      gc_debug_file.243 = gc_debug_file;
      fprintf (gc_debug_file.243, "%s generation done\n", D.24378);
      gc_debug_file.243 = gc_debug_file;
      fflush (gc_debug_file.243);
      <D.24377>:
      D.24380 = sgen_need_bridge_processing ();
      if (D.24380 != 0) goto <D.24381>; else goto <D.24382>;
      <D.24381>:
      sgen_bridge_reset_data ();
      <D.24382>:
      done_with_ephemerons = 0;
      <D.20800>:
      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.20800>; else goto <D.20801>;
      <D.20801>:
      sgen_scan_togglerefs (start_addr, end_addr, ctx);
      D.24383 = sgen_need_bridge_processing ();
      if (D.24383 != 0) goto <D.24384>; else goto <D.24385>;
      <D.24384>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_collect_bridge_objects (generation, ctx);
      if (generation == 1) goto <D.24386>; else goto <D.24387>;
      <D.24386>:
      sgen_collect_bridge_objects (0, ctx);
      <D.24387>:
      sgen_bridge_processing_stw_step ();
      <D.24385>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_null_link_in_range (generation, 1, ctx);
      if (generation == 1) goto <D.24388>; else goto <D.24389>;
      <D.24388>:
      sgen_null_link_in_range (0, 1, ctx);
      <D.24389>:
      sgen_finalize_in_range (generation, ctx);
      if (generation == 1) goto <D.24390>; else goto <D.24391>;
      <D.24390>:
      sgen_finalize_in_range (0, ctx);
      <D.24391>:
      if (0 != 0) goto <D.24392>; else goto <D.24393>;
      <D.24392>:
      gc_debug_file.243 = gc_debug_file;
      fprintf (gc_debug_file.243, "Precise scan of gray area post fin\n");
      gc_debug_file.243 = gc_debug_file;
      fflush (gc_debug_file.243);
      <D.24393>:
      sgen_drain_gray_stack (-1, ctx);
      done_with_ephemerons = 0;
      <D.20802>:
      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.20802>; else goto <D.20803>;
      <D.20803>:
      clear_unreachable_ephemerons (ctx);
      btv = mono_100ns_ticks ();
      gc_debug_level.242 = gc_debug_level;
      D.24373 = gc_debug_level.242 > 1;
      D.24374 = (long int) D.24373;
      D.24375 = __builtin_expect (D.24374, 0);
      if (D.24375 != 0) goto <D.24394>; else goto <D.24395>;
      <D.24394>:
      D.24396 = btv - atv;
      D.24397 = D.24396 / 10;
      D.24398 = (int) D.24397;
      D.24399 = generation_name (generation);
      gc_debug_file.243 = gc_debug_file;
      fprintf (gc_debug_file.243, "Finalize queue handling scan for %s generation: %d usecs %d ephemeron rounds\n", D.24399, D.24398, ephemeron_rounds);
      gc_debug_file.243 = gc_debug_file;
      fflush (gc_debug_file.243);
      <D.24395>:
      D.24400 = sgen_gray_object_queue_is_empty (queue);
      D.24401 = D.24400 == 0;
      D.24402 = (long int) D.24401;
      D.24403 = __builtin_expect (D.24402, 0);
      if (D.24403 != 0) goto <D.24404>; else goto <D.24405>;
      <D.24404>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2014, "sgen_gray_object_queue_is_empty (queue)");
      <D.24405>:
      <D.20805>:
      sgen_null_link_in_range (generation, 0, ctx);
      if (generation == 1) goto <D.24406>; else goto <D.24407>;
      <D.24406>:
      sgen_null_link_in_range (0, 0, ctx);
      <D.24407>:
      D.24408 = sgen_gray_object_queue_is_empty (queue);
      if (D.24408 != 0) goto <D.20804>; else goto <D.24409>;
      <D.24409>:
      sgen_drain_gray_stack (-1, ctx);
      goto <D.20805>;
      <D.20804>:
      D.24410 = sgen_gray_object_queue_is_empty (queue);
      D.24411 = D.24410 == 0;
      D.24412 = (long int) D.24411;
      D.24413 = __builtin_expect (D.24412, 0);
      if (D.24413 != 0) goto <D.24414>; else goto <D.24415>;
      <D.24414>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2024, "sgen_gray_object_queue_is_empty (queue)");
      <D.24415>:
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mark_ephemerons_in_range (struct ScanCopyContext ctx)
{
  char * object.244;
  char * object.245;
  struct FILE * gc_debug_file.246;
  int D.24421;
  unsigned int D.24426;
  long unsigned int D.24427;
  long unsigned int D.24428;
  long unsigned int D.24429;
  long unsigned int D.24430;
  struct MonoVTable * D.24431;
  struct MonoDomain * D.24432;
  _Bool D.24433;
  _Bool D.24434;
  _Bool D.24435;
  const char * iftmp.247;
  void * D.24443;
  int D.24445;
  const char * iftmp.248;
  int D.24448;
  long int cur.249;
  char * D.24453;
  long int D.24454;
  long int D.24455;
  long int D.24456;
  int D.24457;
  void * * D.24460;
  int D.24463;
  void * * D.24466;
  int D.24469;
  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.21190>;
  <D.21189>:
  {
    char * object;

    try
      {
        object.244 = current->array;
        object = object.244;
        if (0 != 0) goto <D.24417>; else goto <D.24418>;
        <D.24417>:
        object.245 = object;
        gc_debug_file.246 = gc_debug_file;
        fprintf (gc_debug_file.246, "Ephemeron array at %p\n", object.245);
        gc_debug_file.246 = gc_debug_file;
        fflush (gc_debug_file.246);
        <D.24418>:
        object.245 = object;
        D.24421 = sgen_is_object_alive_for_current_gen (object.245);
        if (D.24421 == 0) goto <D.24422>; else goto <D.24423>;
        <D.24422>:
        if (0 != 0) goto <D.24424>; else goto <D.24425>;
        <D.24424>:
        gc_debug_file.246 = gc_debug_file;
        fprintf (gc_debug_file.246, "\tnot reachable\n");
        gc_debug_file.246 = gc_debug_file;
        fflush (gc_debug_file.246);
        <D.24425>:
        // predicted unlikely by continue predictor.
        goto <D.21182>;
        <D.24423>:
        copy_func (&object, queue);
        array = object;
        cur = mono_array_addr_with_size (array, 16, 0);
        D.24426 = array->max_length;
        D.24427 = (long unsigned int) D.24426;
        D.24428 = D.24427 * 16;
        array_end = cur + D.24428;
        object.245 = object;
        D.24429 = MEM[(mword *)object.245];
        D.24430 = D.24429 & 18446744073709551612;
        D.24431 = (struct MonoVTable *) D.24430;
        D.24432 = D.24431->domain;
        tombstone = D.24432->ephemeron_tombstone;
        goto <D.21187>;
        <D.21186>:
        {
          char * key;

          key = cur->key;
          D.24433 = key == 0B;
          D.24434 = key == tombstone;
          D.24435 = D.24433 | D.24434;
          if (D.24435 != 0) goto <D.24436>; else goto <D.24437>;
          <D.24436>:
          // predicted unlikely by continue predictor.
          goto <D.21184>;
          <D.24437>:
          if (0 != 0) goto <D.24438>; else goto <D.24439>;
          <D.24438>:
          D.24443 = cur->value;
          if (D.24443 != 0B) goto <D.24444>; else goto <D.24441>;
          <D.24444>:
          D.24443 = cur->value;
          D.24445 = sgen_is_object_alive_for_current_gen (D.24443);
          if (D.24445 != 0) goto <D.24446>; else goto <D.24441>;
          <D.24446>:
          iftmp.247 = "reachable";
          goto <D.24442>;
          <D.24441>:
          iftmp.247 = "unreachable";
          <D.24442>:
          D.24443 = cur->value;
          D.24448 = sgen_is_object_alive_for_current_gen (key);
          if (D.24448 != 0) goto <D.24449>; else goto <D.24450>;
          <D.24449>:
          iftmp.248 = "reachable";
          goto <D.24451>;
          <D.24450>:
          iftmp.248 = "unreachable";
          <D.24451>:
          cur.249 = (long int) cur;
          D.24453 = mono_array_addr_with_size (array, 16, 0);
          D.24454 = (long int) D.24453;
          D.24455 = cur.249 - D.24454;
          D.24456 = D.24455 /[ex] 16;
          gc_debug_file.246 = gc_debug_file;
          fprintf (gc_debug_file.246, "[%td] key %p (%s) value %p (%s)\n", D.24456, key, iftmp.248, D.24443, iftmp.247);
          gc_debug_file.246 = gc_debug_file;
          fflush (gc_debug_file.246);
          <D.24439>:
          D.24457 = sgen_is_object_alive_for_current_gen (key);
          if (D.24457 != 0) goto <D.24458>; else goto <D.24459>;
          <D.24458>:
          {
            char * value;

            value = cur->value;
            D.24460 = &cur->key;
            copy_func (D.24460, queue);
            if (value != 0B) goto <D.24461>; else goto <D.24462>;
            <D.24461>:
            D.24463 = sgen_is_object_alive_for_current_gen (value);
            if (D.24463 == 0) goto <D.24464>; else goto <D.24465>;
            <D.24464>:
            nothing_marked = 0;
            <D.24465>:
            D.24466 = &cur->value;
            copy_func (D.24466, queue);
            <D.24462>:
          }
          <D.24459>:
        }
        <D.21184>:
        cur = cur + 16;
        <D.21187>:
        if (cur < array_end) goto <D.21186>; else goto <D.21188>;
        <D.21188>:
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.21182>:
  current = current->next;
  <D.21190>:
  if (current != 0B) goto <D.21189>; else goto <D.21191>;
  <D.21191>:
  if (0 != 0) goto <D.24467>; else goto <D.24468>;
  <D.24467>:
  gc_debug_file.246 = gc_debug_file;
  fprintf (gc_debug_file.246, "Ephemeron run finished. Is it done %d\n", nothing_marked);
  gc_debug_file.246 = gc_debug_file;
  fflush (gc_debug_file.246);
  <D.24468>:
  D.24469 = nothing_marked;
  return D.24469;
}


sgen_is_object_alive_for_current_gen (char * object)
{
  int D.24473;
  int D.24476;
  int current_collection_generation.250;

  D.24473 = sgen_ptr_in_nursery (object);
  if (D.24473 != 0) goto <D.24474>; else goto <D.24475>;
  <D.24474>:
  D.24476 = sgen_nursery_is_object_alive (object);
  return D.24476;
  <D.24475>:
  current_collection_generation.250 = current_collection_generation;
  if (current_collection_generation.250 == 0) goto <D.24478>; else goto <D.24479>;
  <D.24478>:
  D.24476 = 1;
  return D.24476;
  <D.24479>:
  D.24476 = sgen_major_is_object_alive (object);
  return D.24476;
}


sgen_nursery_is_object_alive (char * obj)
{
  int D.24481;
  _Bool D.24482;
  long int D.24483;
  long int D.24484;
  int D.24487;
  gboolean D.24490;
  long unsigned int D.24493;
  long unsigned int D.24494;
  long unsigned int D.24496;
  long unsigned int D.24498;

  D.24481 = sgen_ptr_in_nursery (obj);
  D.24482 = D.24481 == 0;
  D.24483 = (long int) D.24482;
  D.24484 = __builtin_expect (D.24483, 0);
  if (D.24484 != 0) goto <D.24485>; else goto <D.24486>;
  <D.24485>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "../../mono/metadata/sgen-gc.h", 576, "sgen_ptr_in_nursery (obj)");
  <D.24486>:
  D.24487 = sgen_nursery_is_to_space (obj);
  if (D.24487 != 0) goto <D.24488>; else goto <D.24489>;
  <D.24488>:
  D.24490 = 1;
  return D.24490;
  <D.24489>:
  D.24493 = MEM[(mword *)obj];
  D.24494 = D.24493 & 2;
  if (D.24494 != 0) goto <D.24491>; else goto <D.24495>;
  <D.24495>:
  D.24493 = MEM[(mword *)obj];
  D.24496 = D.24493 & 1;
  if (D.24496 != 0) goto <D.24497>; else goto <D.24492>;
  <D.24497>:
  D.24493 = MEM[(mword *)obj];
  D.24498 = D.24493 & 18446744073709551612;
  if (D.24498 != 0) goto <D.24491>; else goto <D.24492>;
  <D.24491>:
  D.24490 = 1;
  return D.24490;
  <D.24492>:
  D.24490 = 0;
  return D.24490;
}


sgen_nursery_is_to_space (char * object)
{
  long int object.251;
  char * sgen_nursery_start.252;
  long int sgen_nursery_start.253;
  long int D.24503;
  long int D.24504;
  int D.24505;
  _Bool D.24506;
  long int D.24507;
  long int D.24508;
  char * D.24511;
  char * D.24512;
  int sgen_space_bitmap_size.254;
  _Bool D.24514;
  long int D.24515;
  long int D.24516;
  gboolean D.24519;
  char * sgen_space_bitmap.255;
  sizetype D.24521;
  char * D.24522;
  char D.24523;
  int D.24524;
  int D.24525;
  int D.24526;
  _Bool D.24527;
  int idx;
  int byte;
  int bit;

  object.251 = (long int) object;
  sgen_nursery_start.252 = sgen_nursery_start;
  sgen_nursery_start.253 = (long int) sgen_nursery_start.252;
  D.24503 = object.251 - sgen_nursery_start.253;
  D.24504 = D.24503 >> 9;
  idx = (int) D.24504;
  byte = idx / 8;
  bit = idx & 7;
  D.24505 = sgen_ptr_in_nursery (object);
  D.24506 = D.24505 == 0;
  D.24507 = (long int) D.24506;
  D.24508 = __builtin_expect (D.24507, 0);
  if (D.24508 != 0) goto <D.24509>; else goto <D.24510>;
  <D.24509>:
  D.24511 = sgen_get_nursery_end ();
  D.24512 = sgen_get_nursery_start ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.24512, D.24511);
  <D.17027>:
  goto <D.17027>;
  <D.24510>:
  sgen_space_bitmap_size.254 = sgen_space_bitmap_size;
  D.24514 = byte >= sgen_space_bitmap_size.254;
  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>:
  sgen_space_bitmap_size.254 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.254);
  <D.17028>:
  goto <D.17028>;
  <D.24518>:
  sgen_space_bitmap.255 = sgen_space_bitmap;
  D.24521 = (sizetype) byte;
  D.24522 = sgen_space_bitmap.255 + D.24521;
  D.24523 = *D.24522;
  D.24524 = (int) D.24523;
  D.24525 = D.24524 >> bit;
  D.24526 = D.24525 & 1;
  D.24527 = D.24526 != 0;
  D.24519 = (gboolean) D.24527;
  return D.24519;
}


sgen_major_is_object_alive (void * object)
{
  long unsigned int D.24531;
  long unsigned int D.24532;
  long unsigned int D.24534;
  long unsigned int D.24536;
  gboolean D.24537;
  unsigned int D.24538;
  unsigned int D.24539;
  long unsigned int D.24540;
  gboolean (*<T2c9b>) (char *) D.24543;
  mword objsize;

  D.24531 = MEM[(mword *)object];
  D.24532 = D.24531 & 2;
  if (D.24532 != 0) goto <D.24529>; else goto <D.24533>;
  <D.24533>:
  D.24531 = MEM[(mword *)object];
  D.24534 = D.24531 & 1;
  if (D.24534 != 0) goto <D.24535>; else goto <D.24530>;
  <D.24535>:
  D.24531 = MEM[(mword *)object];
  D.24536 = D.24531 & 18446744073709551612;
  if (D.24536 != 0) goto <D.24529>; else goto <D.24530>;
  <D.24529>:
  D.24537 = 1;
  return D.24537;
  <D.24530>:
  D.24538 = sgen_safe_object_get_size (object);
  D.24539 = D.24538 + 7;
  D.24540 = (long unsigned int) D.24539;
  objsize = D.24540 & 4294967288;
  if (objsize > 8000) goto <D.24541>; else goto <D.24542>;
  <D.24541>:
  D.24537 = sgen_los_object_is_pinned (object);
  return D.24537;
  <D.24542>:
  D.24543 = major_collector.is_object_live;
  D.24537 = D.24543 (object);
  return D.24537;
}


clear_unreachable_ephemerons (struct ScanCopyContext ctx)
{
  char * object.256;
  char * object.257;
  int D.24547;
  struct FILE * gc_debug_file.258;
  struct EphemeronLinkNode * ephemeron_list.259;
  unsigned int D.24559;
  long unsigned int D.24560;
  long unsigned int D.24561;
  long unsigned int D.24562;
  long unsigned int D.24563;
  struct MonoVTable * D.24564;
  struct MonoDomain * D.24565;
  _Bool D.24566;
  _Bool D.24567;
  _Bool D.24568;
  const char * iftmp.260;
  void * D.24576;
  int D.24578;
  const char * iftmp.261;
  int D.24581;
  long int cur.262;
  char * D.24586;
  long int D.24587;
  long int D.24588;
  long int D.24589;
  int D.24590;
  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.21162>;
  <D.21168>:
  {
    char * object;

    try
      {
        object.256 = current->array;
        object = object.256;
        object.257 = object;
        D.24547 = sgen_is_object_alive_for_current_gen (object.257);
        if (D.24547 == 0) goto <D.24548>; else goto <D.24549>;
        <D.24548>:
        {
          struct EphemeronLinkNode * tmp;

          tmp = current;
          if (0 != 0) goto <D.24550>; else goto <D.24551>;
          <D.24550>:
          object.257 = object;
          gc_debug_file.258 = gc_debug_file;
          fprintf (gc_debug_file.258, "Dead Ephemeron array at %p\n", object.257);
          gc_debug_file.258 = gc_debug_file;
          fflush (gc_debug_file.258);
          <D.24551>:
          if (prev != 0B) goto <D.24553>; else goto <D.24554>;
          <D.24553>:
          ephemeron_list.259 = current->next;
          prev->next = ephemeron_list.259;
          goto <D.24556>;
          <D.24554>:
          ephemeron_list.259 = current->next;
          ephemeron_list = ephemeron_list.259;
          <D.24556>:
          current = current->next;
          sgen_free_internal (tmp, 18);
          // predicted unlikely by continue predictor.
          goto <D.21162>;
        }
        <D.24549>:
        copy_func (&object, queue);
        object.257 = object;
        current->array = object.257;
        if (0 != 0) goto <D.24557>; else goto <D.24558>;
        <D.24557>:
        object.257 = object;
        gc_debug_file.258 = gc_debug_file;
        fprintf (gc_debug_file.258, "Clearing unreachable entries for ephemeron array at %p\n", object.257);
        gc_debug_file.258 = gc_debug_file;
        fflush (gc_debug_file.258);
        <D.24558>:
        array = object;
        cur = mono_array_addr_with_size (array, 16, 0);
        D.24559 = array->max_length;
        D.24560 = (long unsigned int) D.24559;
        D.24561 = D.24560 * 16;
        array_end = cur + D.24561;
        object.257 = object;
        D.24562 = MEM[(mword *)object.257];
        D.24563 = D.24562 & 18446744073709551612;
        D.24564 = (struct MonoVTable *) D.24563;
        D.24565 = D.24564->domain;
        tombstone = D.24565->ephemeron_tombstone;
        goto <D.21166>;
        <D.21165>:
        {
          char * key;

          key = cur->key;
          D.24566 = key == 0B;
          D.24567 = key == tombstone;
          D.24568 = D.24566 | D.24567;
          if (D.24568 != 0) goto <D.24569>; else goto <D.24570>;
          <D.24569>:
          // predicted unlikely by continue predictor.
          goto <D.21164>;
          <D.24570>:
          if (0 != 0) goto <D.24571>; else goto <D.24572>;
          <D.24571>:
          D.24576 = cur->value;
          if (D.24576 != 0B) goto <D.24577>; else goto <D.24574>;
          <D.24577>:
          D.24576 = cur->value;
          D.24578 = sgen_is_object_alive_for_current_gen (D.24576);
          if (D.24578 != 0) goto <D.24579>; else goto <D.24574>;
          <D.24579>:
          iftmp.260 = "reachable";
          goto <D.24575>;
          <D.24574>:
          iftmp.260 = "unreachable";
          <D.24575>:
          D.24576 = cur->value;
          D.24581 = sgen_is_object_alive_for_current_gen (key);
          if (D.24581 != 0) goto <D.24582>; else goto <D.24583>;
          <D.24582>:
          iftmp.261 = "reachable";
          goto <D.24584>;
          <D.24583>:
          iftmp.261 = "unreachable";
          <D.24584>:
          cur.262 = (long int) cur;
          D.24586 = mono_array_addr_with_size (array, 16, 0);
          D.24587 = (long int) D.24586;
          D.24588 = cur.262 - D.24587;
          D.24589 = D.24588 /[ex] 16;
          gc_debug_file.258 = gc_debug_file;
          fprintf (gc_debug_file.258, "[%td] key %p (%s) value %p (%s)\n", D.24589, key, iftmp.261, D.24576, iftmp.260);
          gc_debug_file.258 = gc_debug_file;
          fflush (gc_debug_file.258);
          <D.24572>:
          D.24590 = sgen_is_object_alive_for_current_gen (key);
          if (D.24590 == 0) goto <D.24591>; else goto <D.24592>;
          <D.24591>:
          cur->key = tombstone;
          cur->value = 0B;
          // predicted unlikely by continue predictor.
          goto <D.21164>;
          <D.24592>:
        }
        <D.21164>:
        cur = cur + 16;
        <D.21166>:
        if (cur < array_end) goto <D.21165>; else goto <D.21167>;
        <D.21167>:
        prev = current;
        current = current->next;
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.21162>:
  if (current != 0B) goto <D.21168>; else goto <D.21169>;
  <D.21169>:
}


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


sgen_get_nursery_end ()
{
  char * D.24595;

  D.24595 = sgen_nursery_end;
  return D.24595;
}


dump_heap (const char * type, int num, const char * reason)
{
  struct FILE * heap_dump_file.263;
  long int D.24600;
  long unsigned int D.24601;
  long unsigned int D.24602;
  struct MonoObject * D.24603;
  struct GCMemSection * nursery_section.264;
  void (*<T2d0d>) (struct FILE *) D.24605;
  char[0:] * D.24606;
  struct ObjectList * list;
  struct LOSObject * bigobj;

  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "<collection type=\"%s\" num=\"%d\"", type, num);
  if (reason != 0B) goto <D.24598>; else goto <D.24599>;
  <D.24598>:
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, " reason=\"%s\"", reason);
  <D.24599>:
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, ">\n");
  D.24600 = mono_mempool_get_bytes_allocated ();
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "<other-mem-usage type=\"mempools\" size=\"%ld\"/>\n", D.24600);
  heap_dump_file.263 = heap_dump_file;
  sgen_dump_internal_mem_usage (heap_dump_file.263);
  D.24601 = sgen_pin_stats_get_pinned_byte_count (0);
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "<pinned type=\"stack\" bytes=\"%zu\"/>\n", D.24601);
  D.24602 = sgen_pin_stats_get_pinned_byte_count (2);
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "<pinned type=\"other\" bytes=\"%zu\"/>\n", D.24602);
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "<pinned-objects>\n");
  list = sgen_pin_stats_get_object_list ();
  goto <D.20876>;
  <D.20875>:
  D.24603 = list->obj;
  dump_object (D.24603, 1);
  list = list->next;
  <D.20876>:
  if (list != 0B) goto <D.20875>; else goto <D.20877>;
  <D.20877>:
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "</pinned-objects>\n");
  nursery_section.264 = nursery_section;
  sgen_dump_section (nursery_section.264, "nursery");
  D.24605 = major_collector.dump_heap;
  heap_dump_file.263 = heap_dump_file;
  D.24605 (heap_dump_file.263);
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "<los>\n");
  bigobj = los_object_list;
  goto <D.20879>;
  <D.20878>:
  D.24606 = &bigobj->data;
  dump_object (D.24606, 0);
  bigobj = bigobj->next;
  <D.20879>:
  if (bigobj != 0B) goto <D.20878>; else goto <D.20880>;
  <D.20880>:
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "</los>\n");
  heap_dump_file.263 = heap_dump_file;
  fprintf (heap_dump_file.263, "</collection>\n");
}


dump_object (struct MonoObject * obj, gboolean dump_location)
{
  struct MonoVTable * D.24607;
  const char * D.24608;
  sizetype D.24609;
  const char * D.24610;
  char D.24611;
  int D.24612;
  char * D.24613;
  int j.265;
  unsigned int j.266;
  _Bool D.24619;
  long int D.24620;
  long int D.24621;
  unsigned int D.24624;
  const char * D.24625;
  struct FILE * heap_dump_file.267;
  int D.24629;
  unsigned int D.24633;
  static char class_name[1024];
  struct MonoClass * class;
  int i;
  int j;

  D.24607 = obj->vtable;
  class = D.24607->klass;
  j = 0;
  i = j;
  goto <D.20865>;
  <D.20864>:
  D.24608 = class->name;
  D.24609 = (sizetype) i;
  D.24610 = D.24608 + D.24609;
  D.24611 = *D.24610;
  D.24612 = (int) D.24611;
  D.24613 = __builtin_strchr ("<>\"", D.24612);
  if (D.24613 == 0B) goto <D.24614>; else goto <D.24615>;
  <D.24614>:
  j.265 = j;
  j = j.265 + 1;
  D.24608 = class->name;
  D.24609 = (sizetype) i;
  D.24610 = D.24608 + D.24609;
  D.24611 = *D.24610;
  class_name[j.265] = D.24611;
  <D.24615>:
  i = i + 1;
  <D.20865>:
  D.24608 = class->name;
  D.24609 = (sizetype) i;
  D.24610 = D.24608 + D.24609;
  D.24611 = *D.24610;
  if (D.24611 != 0) goto <D.24617>; else goto <D.20866>;
  <D.24617>:
  j.266 = (unsigned int) j;
  if (j.266 <= 1022) goto <D.20864>; else goto <D.20866>;
  <D.20866>:
  j.266 = (unsigned int) j;
  D.24619 = j.266 > 1023;
  D.24620 = (long int) D.24619;
  D.24621 = __builtin_expect (D.24620, 0);
  if (D.24621 != 0) goto <D.24622>; else goto <D.24623>;
  <D.24622>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2132, "j < sizeof (class_name)");
  <D.24623>:
  class_name[j] = 0;
  D.24624 = sgen_safe_object_get_size (obj);
  D.24625 = class->name_space;
  heap_dump_file.267 = heap_dump_file;
  fprintf (heap_dump_file.267, "<object class=\"%s.%s\" size=\"%d\"", D.24625, &class_name, D.24624);
  if (dump_location != 0) goto <D.24627>; else goto <D.24628>;
  <D.24627>:
  {
    const char * location;

    D.24629 = sgen_ptr_in_nursery (obj);
    if (D.24629 != 0) goto <D.24630>; else goto <D.24631>;
    <D.24630>:
    location = "nursery";
    goto <D.24632>;
    <D.24631>:
    D.24633 = sgen_safe_object_get_size (obj);
    if (D.24633 <= 8000) goto <D.24634>; else goto <D.24635>;
    <D.24634>:
    location = "major";
    goto <D.24636>;
    <D.24635>:
    location = "LOS";
    <D.24636>:
    <D.24632>:
    heap_dump_file.267 = heap_dump_file;
    fprintf (heap_dump_file.267, " location=\"%s\"", location);
  }
  <D.24628>:
  heap_dump_file.267 = heap_dump_file;
  fprintf (heap_dump_file.267, "/>\n");
}


check_scan_starts ()
{
  int do_scan_starts_check.268;
  struct GCMemSection * nursery_section.269;
  void (*<T7e7>) (void) D.24641;

  do_scan_starts_check.268 = do_scan_starts_check;
  if (do_scan_starts_check.268 == 0) goto <D.24638>; else goto <D.24639>;
  <D.24638>:
  return;
  <D.24639>:
  nursery_section.269 = nursery_section;
  sgen_check_section_scan_starts (nursery_section.269);
  D.24641 = major_collector.check_scan_starts;
  D.24641 ();
}


unpin_objects_from_queue (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.24643;
  int D.24647;
  _Bool D.24648;
  long int D.24649;
  long int D.24650;
  int D.24654;
  long unsigned int D.24656;
  long unsigned int D.24657;
  _Bool D.24658;
  long int D.24659;
  long int D.24660;
  long unsigned int D.24663;

  <D.20619>:
  {
    char * addr;

    D.24643 = queue->first;
    if (D.24643 == 0B) goto <D.24644>; else goto <D.24645>;
    <D.24644>:
    addr = 0B;
    goto <D.24646>;
    <D.24645>:
    D.24643 = queue->first;
    D.24647 = D.24643->end;
    D.24648 = D.24647 == 1;
    D.24649 = (long int) D.24648;
    D.24650 = __builtin_expect (D.24649, 0);
    if (D.24650 != 0) goto <D.24651>; else goto <D.24652>;
    <D.24651>:
    addr = sgen_gray_object_dequeue (queue);
    goto <D.24653>;
    <D.24652>:
    D.24643 = queue->first;
    D.24643 = queue->first;
    D.24647 = D.24643->end;
    D.24654 = D.24647 + -1;
    D.24643->end = D.24654;
    D.24647 = D.24643->end;
    addr = D.24643->objects[D.24647];
    <D.24653>:
    <D.24646>:
    if (addr == 0B) goto <D.20618>; else goto <D.24655>;
    <D.24655>:
    D.24656 = MEM[(mword *)addr];
    D.24657 = D.24656 & 2;
    D.24658 = D.24657 == 0;
    D.24659 = (long int) D.24658;
    D.24660 = __builtin_expect (D.24659, 0);
    if (D.24660 != 0) goto <D.24661>; else goto <D.24662>;
    <D.24661>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1548, "SGEN_OBJECT_IS_PINNED (addr)");
    <D.24662>:
    D.24656 = MEM[(mword *)addr];
    D.24663 = D.24656 & 18446744073709551613;
    MEM[(mword *)addr] = D.24663;
  }
  goto <D.20619>;
  <D.20618>:
}


major_start_concurrent_collection (const char * reason)
{
  int disable_major_collections.270;
  long long int (*<T2d3b>) (void) D.24667;
  _Bool D.24668;
  long int D.24669;
  long int D.24670;
  long long int num_objects_marked;

  disable_major_collections.270 = disable_major_collections;
  if (disable_major_collections.270 != 0) goto <D.24665>; else goto <D.24666>;
  <D.24665>:
  return;
  <D.24666>:
  D.24667 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.24667 ();
  D.24668 = num_objects_marked != 0;
  D.24669 = (long int) D.24668;
  D.24670 = __builtin_expect (D.24669, 0);
  if (D.24670 != 0) goto <D.24671>; else goto <D.24672>;
  <D.24671>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3326, "num_objects_marked == 0");
  <D.24672>:
  major_start_collection (1, 0B);
  gray_queue_redirect (&gray_queue);
  sgen_workers_wait_for_jobs ();
  D.24667 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.24667 ();
  current_collection_generation = -1;
}


major_start_collection (gboolean concurrent, int * old_next_pin_slot)
{
  struct MonoPerfCounters * mono_perfcounters.271;
  unsigned int D.24675;
  unsigned int D.24676;
  struct SgenSectionGrayQueue * D.24677;
  int D.24678;
  _Bool D.24679;
  long int D.24680;
  long int D.24681;
  int D.24686;
  _Bool D.24687;
  long int D.24688;
  long int D.24689;
  int gc_debug_level.272;
  _Bool D.24694;
  long int D.24695;
  long int D.24696;
  int stat_major_gcs.273;
  struct FILE * gc_debug_file.274;
  int stat_major_gcs.275;
  int D.24702;
  int D.24703;
  void (*<T7e7>) (void) D.24704;

  current_collection_generation = 1;
  mono_perfcounters.271 = mono_perfcounters;
  D.24675 = mono_perfcounters.271->gc_collections1;
  D.24676 = D.24675 + 1;
  mono_perfcounters.271->gc_collections1 = D.24676;
  D.24677 = sgen_workers_get_distribute_section_gray_queue ();
  D.24678 = sgen_section_gray_queue_is_empty (D.24677);
  D.24679 = D.24678 == 0;
  D.24680 = (long int) D.24679;
  D.24681 = __builtin_expect (D.24680, 0);
  if (D.24681 != 0) goto <D.24682>; else goto <D.24683>;
  <D.24682>:
  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.24683>:
  if (concurrent != 0) goto <D.24684>; else goto <D.24685>;
  <D.24684>:
  D.24686 = major_collector.is_concurrent;
  D.24687 = D.24686 == 0;
  D.24688 = (long int) D.24687;
  D.24689 = __builtin_expect (D.24688, 0);
  if (D.24689 != 0) goto <D.24690>; else goto <D.24691>;
  <D.24690>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3077, "major_collector.is_concurrent");
  <D.24691>:
  concurrent_collection_in_progress = 1;
  sgen_cement_concurrent_start ();
  current_object_ops = major_collector.major_concurrent_ops;
  goto <D.24692>;
  <D.24685>:
  current_object_ops = major_collector.major_ops;
  <D.24692>:
  reset_pinned_from_failed_allocation ();
  sgen_memgov_major_collection_start ();
  check_scan_starts ();
  degraded_mode = 0;
  gc_debug_level.272 = gc_debug_level;
  D.24694 = gc_debug_level.272 > 0;
  D.24695 = (long int) D.24694;
  D.24696 = __builtin_expect (D.24695, 0);
  if (D.24696 != 0) goto <D.24697>; else goto <D.24698>;
  <D.24697>:
  stat_major_gcs.273 = stat_major_gcs;
  gc_debug_file.274 = gc_debug_file;
  fprintf (gc_debug_file.274, "Start major collection %d\n", stat_major_gcs.273);
  gc_debug_file.274 = gc_debug_file;
  fflush (gc_debug_file.274);
  <D.24698>:
  stat_major_gcs.273 = stat_major_gcs;
  stat_major_gcs.275 = stat_major_gcs.273 + 1;
  stat_major_gcs = stat_major_gcs.275;
  D.24702 = gc_stats.major_gc_count;
  D.24703 = D.24702 + 1;
  gc_stats.major_gc_count = D.24703;
  D.24704 = major_collector.start_major_collection;
  if (D.24704 != 0B) goto <D.24705>; else goto <D.24706>;
  <D.24705>:
  D.24704 = major_collector.start_major_collection;
  D.24704 ();
  <D.24706>:
  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.276;
  gboolean D.24710;
  struct MonoPerfCounters * mono_perfcounters.277;
  unsigned int D.24712;
  unsigned int D.24713;
  int D.24714;
  char * iftmp.278;
  char * D.24719;
  int gc_debug_level.279;
  _Bool D.24724;
  long int D.24725;
  long int D.24726;
  long int nursery_next.280;
  char * D.24730;
  long int D.24731;
  long int D.24732;
  int D.24733;
  char * D.24734;
  int stat_minor_gcs.281;
  struct FILE * gc_debug_file.282;
  char * D.24737;
  long int D.24738;
  long int D.24739;
  struct GCMemSection * nursery_section.283;
  long unsigned int D.24741;
  _Bool D.24742;
  long int D.24743;
  long int D.24744;
  long int D.24747;
  long int D.24748;
  int D.24749;
  long long int D.24750;
  long long int time_minor_pre_collection_fragment_clear.284;
  long long int time_minor_pre_collection_fragment_clear.285;
  int xdomain_checks.286;
  void (*<T7e7>) (void) D.24756;
  int stat_minor_gcs.287;
  int D.24758;
  int D.24759;
  char * D.24760;
  long int D.24761;
  long int D.24762;
  int D.24763;
  long long int D.24764;
  long long int time_minor_pinning.288;
  long long int time_minor_pinning.289;
  _Bool D.24767;
  long int D.24768;
  long int D.24769;
  int D.24772;
  int D.24775;
  int whole_heap_check_before_collection.290;
  int consistency_check_at_minor_collection.291;
  char * D.24782;
  long long int time_minor_scan_remsets.292;
  long long int time_minor_scan_remsets.293;
  int D.24787;
  void (*<T2c04>) (char *, struct SgenGrayQueue *) D.24790;
  <unnamed type> D.24791;
  unsigned int D.24792;
  <unnamed type> D.24795;
  unsigned int D.24796;
  long long int time_minor_scan_pinned.294;
  long long int time_minor_scan_pinned.295;
  void (*<T2bff>) (void * *, struct SgenGrayQueue *) D.24801;
  char * D.24802;
  char * D.24803;
  long long int time_minor_scan_registered_roots.296;
  long long int time_minor_scan_registered_roots.297;
  char * D.24806;
  long long int time_minor_scan_thread_data.298;
  long long int time_minor_scan_thread_data.299;
  int iftmp.300;
  int D.24813;
  int D.24815;
  _Bool D.24816;
  long int D.24817;
  long int D.24818;
  int D.24823;
  int D.24825;
  int D.24826;
  _Bool D.24827;
  long int D.24828;
  long int D.24829;
  struct FinalizeReadyEntry * fin_ready_list.301;
  struct FinalizeReadyEntry * critical_fin_list.302;
  long long int time_minor_finish_gray_stack.303;
  long long int time_minor_finish_gray_stack.304;
  long unsigned int objects_pinned.305;
  int D.24839;
  void * * D.24840;
  long long int time_minor_fragment_creation.306;
  long long int time_minor_fragment_creation.307;
  void (*<T7e7>) (void) D.24849;
  long long int D.24850;
  long int D.24851;
  long int D.24852;
  int D.24853;
  long long int D.24854;
  long long int D.24855;
  struct FILE * heap_dump_file.308;
  int D.24859;
  int num_ready_finalizers.309;
  int D.24866;
  _Bool D.24867;
  long int D.24868;
  long int D.24869;
  void (*<T7e7>) (void) D.24872;
  _Bool D.24873;
  int check_nursery_objects_pinned.310;
  int D.24877;
  _Bool D.24880;
  int D.24881;
  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.276 = disable_minor_collections;
      if (disable_minor_collections.276 != 0) goto <D.24708>; else goto <D.24709>;
      <D.24708>:
      D.24710 = 1;
      return D.24710;
      <D.24709>:
      verify_nursery ();
      mono_perfcounters.277 = mono_perfcounters;
      D.24712 = mono_perfcounters.277->gc_collections0;
      D.24713 = D.24712 + 1;
      mono_perfcounters.277->gc_collections0 = D.24713;
      current_collection_generation = 0;
      D.24714 = sgen_collection_is_parallel ();
      if (D.24714 != 0) goto <D.24715>; else goto <D.24716>;
      <D.24715>:
      current_object_ops = sgen_minor_collector.parallel_ops;
      goto <D.24717>;
      <D.24716>:
      current_object_ops = sgen_minor_collector.serial_ops;
      <D.24717>:
      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.24719 = sgen_get_nursery_end ();
      if (D.24719 >= nursery_next) goto <D.24720>; else goto <D.24721>;
      <D.24720>:
      iftmp.278 = sgen_get_nursery_end ();
      goto <D.24722>;
      <D.24721>:
      iftmp.278 = nursery_next;
      <D.24722>:
      nursery_next = iftmp.278;
      gc_debug_level.279 = gc_debug_level;
      D.24724 = gc_debug_level.279 > 0;
      D.24725 = (long int) D.24724;
      D.24726 = __builtin_expect (D.24725, 0);
      if (D.24726 != 0) goto <D.24727>; else goto <D.24728>;
      <D.24727>:
      nursery_next.280 = (long int) nursery_next;
      D.24730 = sgen_get_nursery_start ();
      D.24731 = (long int) D.24730;
      D.24732 = nursery_next.280 - D.24731;
      D.24733 = (int) D.24732;
      D.24734 = sgen_get_nursery_start ();
      stat_minor_gcs.281 = stat_minor_gcs;
      gc_debug_file.282 = gc_debug_file;
      fprintf (gc_debug_file.282, "Start nursery collection %d %p-%p, size: %d\n", stat_minor_gcs.281, D.24734, nursery_next, D.24733);
      gc_debug_file.282 = gc_debug_file;
      fflush (gc_debug_file.282);
      <D.24728>:
      nursery_next.280 = (long int) nursery_next;
      D.24737 = sgen_get_nursery_start ();
      D.24738 = (long int) D.24737;
      D.24739 = nursery_next.280 - D.24738;
      max_garbage_amount = (size_t) D.24739;
      nursery_section.283 = nursery_section;
      D.24741 = nursery_section.283->size;
      D.24742 = D.24741 < max_garbage_amount;
      D.24743 = (long int) D.24742;
      D.24744 = __builtin_expect (D.24743, 0);
      if (D.24744 != 0) goto <D.24745>; else goto <D.24746>;
      <D.24745>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2551, "nursery_section->size >= max_garbage_amount");
      <D.24746>:
      all_atv = mono_100ns_ticks ();
      atv = all_atv;
      btv = mono_100ns_ticks ();
      D.24747 = btv - atv;
      D.24748 = D.24747 / 10;
      D.24749 = (int) D.24748;
      D.24750 = (long long int) D.24749;
      time_minor_pre_collection_fragment_clear.284 = time_minor_pre_collection_fragment_clear;
      time_minor_pre_collection_fragment_clear.285 = D.24750 + time_minor_pre_collection_fragment_clear.284;
      time_minor_pre_collection_fragment_clear = time_minor_pre_collection_fragment_clear.285;
      xdomain_checks.286 = xdomain_checks;
      if (xdomain_checks.286 != 0) goto <D.24754>; else goto <D.24755>;
      <D.24754>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.24755>:
      nursery_section.283 = nursery_section;
      nursery_section.283->next_data = nursery_next;
      D.24756 = major_collector.start_nursery_collection;
      D.24756 ();
      sgen_memgov_minor_collection_start ();
      init_gray_queue ();
      stat_minor_gcs.281 = stat_minor_gcs;
      stat_minor_gcs.287 = stat_minor_gcs.281 + 1;
      stat_minor_gcs = stat_minor_gcs.287;
      D.24758 = gc_stats.minor_gc_count;
      D.24759 = D.24758 + 1;
      gc_stats.minor_gc_count = D.24759;
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      sgen_init_pinning ();
      mono_profiler_gc_event (1, 0);
      D.24760 = sgen_get_nursery_start ();
      pin_from_roots (D.24760, nursery_next, &gray_queue);
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      sgen_optimize_pin_queue (0);
      nursery_section.283 = nursery_section;
      sgen_pinning_setup_section (nursery_section.283);
      ctx.scan_func = 0B;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      nursery_section.283 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.283, ctx);
      nursery_section.283 = nursery_section;
      sgen_pinning_trim_queue_to_section (nursery_section.283);
      atv = mono_100ns_ticks ();
      D.24761 = atv - btv;
      D.24762 = D.24761 / 10;
      D.24763 = (int) D.24762;
      D.24764 = (long long int) D.24763;
      time_minor_pinning.288 = time_minor_pinning;
      time_minor_pinning.289 = D.24764 + time_minor_pinning.288;
      time_minor_pinning = time_minor_pinning.289;
      gc_debug_level.279 = gc_debug_level;
      D.24767 = gc_debug_level.279 > 1;
      D.24768 = (long int) D.24767;
      D.24769 = __builtin_expect (D.24768, 0);
      if (D.24769 != 0) goto <D.24770>; else goto <D.24771>;
      <D.24770>:
      D.24761 = atv - btv;
      D.24762 = D.24761 / 10;
      D.24763 = (int) D.24762;
      D.24772 = sgen_get_pinned_count ();
      gc_debug_file.282 = gc_debug_file;
      fprintf (gc_debug_file.282, "Finding pinned pointers: %d in %d usecs\n", D.24772, D.24763);
      gc_debug_file.282 = gc_debug_file;
      fflush (gc_debug_file.282);
      <D.24771>:
      if (0 != 0) goto <D.24773>; else goto <D.24774>;
      <D.24773>:
      D.24775 = sgen_get_pinned_count ();
      gc_debug_file.282 = gc_debug_file;
      fprintf (gc_debug_file.282, "Start scan with %d pinned objects\n", D.24775);
      gc_debug_file.282 = gc_debug_file;
      fflush (gc_debug_file.282);
      <D.24774>:
      whole_heap_check_before_collection.290 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.290 != 0) goto <D.24777>; else goto <D.24778>;
      <D.24777>:
      sgen_clear_nursery_fragments ();
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.24778>:
      consistency_check_at_minor_collection.291 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.291 != 0) goto <D.24780>; else goto <D.24781>;
      <D.24780>:
      sgen_check_consistency ();
      <D.24781>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      frssjd = sgen_alloc_internal_dynamic (16, 20, 1);
      D.24782 = sgen_get_nursery_start ();
      frssjd->heap_start = D.24782;
      frssjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_finish_remembered_set_scan, frssjd);
      btv = mono_100ns_ticks ();
      D.24747 = btv - atv;
      D.24748 = D.24747 / 10;
      D.24749 = (int) D.24748;
      D.24750 = (long long int) D.24749;
      time_minor_scan_remsets.292 = time_minor_scan_remsets;
      time_minor_scan_remsets.293 = D.24750 + time_minor_scan_remsets.292;
      time_minor_scan_remsets = time_minor_scan_remsets.293;
      gc_debug_level.279 = gc_debug_level;
      D.24767 = gc_debug_level.279 > 1;
      D.24768 = (long int) D.24767;
      D.24769 = __builtin_expect (D.24768, 0);
      if (D.24769 != 0) goto <D.24785>; else goto <D.24786>;
      <D.24785>:
      D.24747 = btv - atv;
      D.24748 = D.24747 / 10;
      D.24749 = (int) D.24748;
      gc_debug_file.282 = gc_debug_file;
      fprintf (gc_debug_file.282, "Old generation scan: %d usecs\n", D.24749);
      gc_debug_file.282 = gc_debug_file;
      fflush (gc_debug_file.282);
      <D.24786>:
      D.24787 = sgen_collection_is_parallel ();
      if (D.24787 == 0) goto <D.24788>; else goto <D.24789>;
      <D.24788>:
      D.24790 = current_object_ops.scan_object;
      ctx.scan_func = D.24790;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      sgen_drain_gray_stack (-1, ctx);
      <D.24789>:
      D.24791 = mono_profiler_get_events ();
      D.24792 = D.24791 & 1048576;
      if (D.24792 != 0) goto <D.24793>; else goto <D.24794>;
      <D.24793>:
      report_registered_roots ();
      <D.24794>:
      D.24795 = mono_profiler_get_events ();
      D.24796 = D.24795 & 1048576;
      if (D.24796 != 0) goto <D.24797>; else goto <D.24798>;
      <D.24797>:
      report_finalizer_roots ();
      <D.24798>:
      atv = mono_100ns_ticks ();
      D.24761 = atv - btv;
      D.24762 = D.24761 / 10;
      D.24763 = (int) D.24762;
      D.24764 = (long long int) D.24763;
      time_minor_scan_pinned.294 = time_minor_scan_pinned;
      time_minor_scan_pinned.295 = D.24764 + time_minor_scan_pinned.294;
      time_minor_scan_pinned = time_minor_scan_pinned.295;
      scrrjd_normal = sgen_alloc_internal_dynamic (40, 20, 1);
      D.24801 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.24801;
      D.24790 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.24790;
      D.24802 = sgen_get_nursery_start ();
      scrrjd_normal->heap_start = D.24802;
      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 (40, 20, 1);
      D.24801 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.24801;
      D.24790 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.24790;
      D.24803 = sgen_get_nursery_start ();
      scrrjd_wbarrier->heap_start = D.24803;
      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.24747 = btv - atv;
      D.24748 = D.24747 / 10;
      D.24749 = (int) D.24748;
      D.24750 = (long long int) D.24749;
      time_minor_scan_registered_roots.296 = time_minor_scan_registered_roots;
      time_minor_scan_registered_roots.297 = D.24750 + time_minor_scan_registered_roots.296;
      time_minor_scan_registered_roots = time_minor_scan_registered_roots.297;
      stdjd = sgen_alloc_internal_dynamic (16, 20, 1);
      D.24806 = sgen_get_nursery_start ();
      stdjd->heap_start = D.24806;
      stdjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.24761 = atv - btv;
      D.24762 = D.24761 / 10;
      D.24763 = (int) D.24762;
      D.24764 = (long long int) D.24763;
      time_minor_scan_thread_data.298 = time_minor_scan_thread_data;
      time_minor_scan_thread_data.299 = D.24764 + time_minor_scan_thread_data.298;
      time_minor_scan_thread_data = time_minor_scan_thread_data.299;
      btv = atv;
      D.24813 = sgen_collection_is_parallel ();
      if (D.24813 != 0) goto <D.24810>; else goto <D.24814>;
      <D.24814>:
      D.24815 = sgen_collection_is_concurrent ();
      if (D.24815 != 0) goto <D.24810>; else goto <D.24811>;
      <D.24810>:
      iftmp.300 = 1;
      goto <D.24812>;
      <D.24811>:
      iftmp.300 = 0;
      <D.24812>:
      D.24816 = iftmp.300 != 0;
      D.24817 = (long int) D.24816;
      D.24818 = __builtin_expect (D.24817, 0);
      if (D.24818 != 0) goto <D.24819>; else goto <D.24820>;
      <D.24819>:
      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.24820>:
      D.24823 = sgen_collection_is_parallel ();
      if (D.24823 != 0) goto <D.24821>; else goto <D.24824>;
      <D.24824>:
      D.24825 = sgen_collection_is_concurrent ();
      if (D.24825 != 0) goto <D.24821>; else goto <D.24822>;
      <D.24821>:
      D.24826 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24827 = D.24826 == 0;
      D.24828 = (long int) D.24827;
      D.24829 = __builtin_expect (D.24828, 0);
      if (D.24829 != 0) goto <D.24830>; else goto <D.24831>;
      <D.24830>:
      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.24831>:
      <D.24822>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (8, 20, 1);
      fin_ready_list.301 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.301;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (8, 20, 1);
      critical_fin_list.302 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.302;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      finish_gray_stack (0, &gray_queue);
      atv = mono_100ns_ticks ();
      D.24761 = atv - btv;
      D.24762 = D.24761 / 10;
      D.24763 = (int) D.24762;
      D.24764 = (long long int) D.24763;
      time_minor_finish_gray_stack.303 = time_minor_finish_gray_stack;
      time_minor_finish_gray_stack.304 = D.24764 + time_minor_finish_gray_stack.303;
      time_minor_finish_gray_stack = time_minor_finish_gray_stack.304;
      mono_profiler_gc_event (2, 0);
      sgen_workers_reset_data ();
      objects_pinned.305 = objects_pinned;
      if (objects_pinned.305 != 0) goto <D.24837>; else goto <D.24838>;
      <D.24837>:
      sgen_optimize_pin_queue (0);
      nursery_section.283 = nursery_section;
      sgen_pinning_setup_section (nursery_section.283);
      <D.24838>:
      mono_profiler_gc_event (3, 0);
      nursery_section.283 = nursery_section;
      D.24839 = nursery_section.283->pin_queue_num_entries;
      nursery_section.283 = nursery_section;
      D.24840 = nursery_section.283->pin_queue_start;
      nursery_section.283 = nursery_section;
      fragment_total = sgen_build_nursery_fragments (nursery_section.283, D.24840, D.24839, unpin_queue);
      if (fragment_total == 0) goto <D.24841>; else goto <D.24842>;
      <D.24841>:
      degraded_mode = 1;
      <D.24842>:
      sgen_clear_tlabs ();
      mono_profiler_gc_event (4, 0);
      btv = mono_100ns_ticks ();
      D.24747 = btv - atv;
      D.24748 = D.24747 / 10;
      D.24749 = (int) D.24748;
      D.24750 = (long long int) D.24749;
      time_minor_fragment_creation.306 = time_minor_fragment_creation;
      time_minor_fragment_creation.307 = D.24750 + time_minor_fragment_creation.306;
      time_minor_fragment_creation = time_minor_fragment_creation.307;
      gc_debug_level.279 = gc_debug_level;
      D.24767 = gc_debug_level.279 > 1;
      D.24768 = (long int) D.24767;
      D.24769 = __builtin_expect (D.24768, 0);
      if (D.24769 != 0) goto <D.24845>; else goto <D.24846>;
      <D.24845>:
      D.24747 = btv - atv;
      D.24748 = D.24747 / 10;
      D.24749 = (int) D.24748;
      gc_debug_file.282 = gc_debug_file;
      fprintf (gc_debug_file.282, "Fragment creation: %d usecs, %lu bytes available\n", D.24749, fragment_total);
      gc_debug_file.282 = gc_debug_file;
      fflush (gc_debug_file.282);
      <D.24846>:
      consistency_check_at_minor_collection.291 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.291 != 0) goto <D.24847>; else goto <D.24848>;
      <D.24847>:
      sgen_check_major_refs ();
      <D.24848>:
      D.24849 = major_collector.finish_nursery_collection;
      D.24849 ();
      all_btv = mono_100ns_ticks ();
      D.24850 = gc_stats.minor_gc_time_usecs;
      D.24851 = all_btv - all_atv;
      D.24852 = D.24851 / 10;
      D.24853 = (int) D.24852;
      D.24854 = (long long int) D.24853;
      D.24855 = D.24850 + D.24854;
      gc_stats.minor_gc_time_usecs = D.24855;
      heap_dump_file.308 = heap_dump_file;
      if (heap_dump_file.308 != 0B) goto <D.24857>; else goto <D.24858>;
      <D.24857>:
      stat_minor_gcs.281 = stat_minor_gcs;
      D.24859 = stat_minor_gcs.281 + -1;
      dump_heap ("minor", D.24859, 0B);
      <D.24858>:
      sgen_finish_pinning ();
      fin_ready_list.301 = fin_ready_list;
      if (fin_ready_list.301 != 0B) goto <D.24860>; else goto <D.24862>;
      <D.24862>:
      critical_fin_list.302 = critical_fin_list;
      if (critical_fin_list.302 != 0B) goto <D.24860>; else goto <D.24861>;
      <D.24860>:
      if (0 != 0) goto <D.24863>; else goto <D.24864>;
      <D.24863>:
      num_ready_finalizers.309 = num_ready_finalizers;
      gc_debug_file.282 = gc_debug_file;
      fprintf (gc_debug_file.282, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.309);
      gc_debug_file.282 = gc_debug_file;
      fflush (gc_debug_file.282);
      <D.24864>:
      mono_gc_finalize_notify ();
      <D.24861>:
      sgen_pin_stats_reset ();
      sgen_cement_clear_below_threshold ();
      D.24866 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24867 = D.24866 == 0;
      D.24868 = (long int) D.24867;
      D.24869 = __builtin_expect (D.24868, 0);
      if (D.24869 != 0) goto <D.24870>; else goto <D.24871>;
      <D.24870>:
      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.24871>:
      D.24872 = remset.finish_minor_collection;
      D.24872 ();
      check_scan_starts ();
      sgen_memgov_minor_collection_end ();
      objects_pinned.305 = objects_pinned;
      D.24873 = objects_pinned.305 != 0;
      needs_major = (gboolean) D.24873;
      current_collection_generation = -1;
      objects_pinned = 0;
      check_nursery_objects_pinned.310 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.310 != 0) goto <D.24875>; else goto <D.24876>;
      <D.24875>:
      D.24877 = sgen_minor_collector.is_split;
      if (D.24877 == 0) goto <D.24878>; else goto <D.24879>;
      <D.24878>:
      D.24880 = unpin_queue != 0B;
      D.24881 = (int) D.24880;
      sgen_check_nursery_objects_pinned (D.24881);
      <D.24879>:
      <D.24876>:
      D.24710 = needs_major;
      return D.24710;
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


job_finish_remembered_set_scan (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2d6f>) (void *, void *, struct SgenGrayQueue *) D.24884;
  struct SgenGrayQueue * D.24885;
  char * D.24886;
  char * D.24887;
  struct FinishRememberedSetScanJobData * job_data;

  job_data = job_data_untyped;
  D.24884 = remset.finish_scan_remsets;
  D.24885 = sgen_workers_get_job_gray_queue (worker_data);
  D.24886 = job_data->heap_end;
  D.24887 = job_data->heap_start;
  D.24884 (D.24887, D.24886, D.24885);
  sgen_free_internal_dynamic (job_data, 16, 20);
}


verify_nursery ()
{
  int do_verify_nursery.311;
  void * D.24891;
  long unsigned int D.24896;
  long unsigned int D.24897;
  long unsigned int D.24899;
  int gc_debug_level.312;
  _Bool D.24902;
  long int D.24903;
  long int D.24904;
  struct FILE * gc_debug_file.313;
  long unsigned int D.24908;
  unsigned int D.24913;
  unsigned int D.24914;
  unsigned int D.24915;
  long unsigned int D.24916;
  char * D.24917;
  int do_dump_nursery_content.314;
  long int cur.315;
  long int hole_start.316;
  long int D.24927;
  int D.24928;
  void * D.24931;
  struct MonoVTable * D.24932;
  _Bool D.24933;
  int D.24934;
  const char * D.24935;
  int D.24936;
  int D.24937;
  char * start;
  char * end;
  char * cur;
  char * hole_start;

  do_verify_nursery.311 = do_verify_nursery;
  if (do_verify_nursery.311 == 0) goto <D.24889>; else goto <D.24890>;
  <D.24889>:
  return;
  <D.24890>:
  sgen_nursery_allocator_prepare_for_pinning ();
  cur = sgen_get_nursery_start ();
  start = cur;
  hole_start = start;
  end = sgen_get_nursery_end ();
  goto <D.20978>;
  <D.20979>:
  {
    size_t ss;
    size_t size;

    D.24891 = MEM[(void * *)cur];
    if (D.24891 == 0B) goto <D.24892>; else goto <D.24893>;
    <D.24892>:
    cur = cur + 8;
    // predicted unlikely by continue predictor.
    goto <D.20978>;
    <D.24893>:
    D.24896 = MEM[(mword *)cur];
    D.24897 = D.24896 & 1;
    if (D.24897 != 0) goto <D.24898>; else goto <D.24894>;
    <D.24898>:
    D.24896 = MEM[(mword *)cur];
    D.24899 = D.24896 & 18446744073709551612;
    if (D.24899 != 0) goto <D.24900>; else goto <D.24894>;
    <D.24900>:
    gc_debug_level.312 = gc_debug_level;
    D.24902 = gc_debug_level.312 > 0;
    D.24903 = (long int) D.24902;
    D.24904 = __builtin_expect (D.24903, 0);
    if (D.24904 != 0) goto <D.24905>; else goto <D.24906>;
    <D.24905>:
    gc_debug_file.313 = gc_debug_file;
    fprintf (gc_debug_file.313, "FORWARDED OBJ %p\n", cur);
    gc_debug_file.313 = gc_debug_file;
    fflush (gc_debug_file.313);
    <D.24906>:
    goto <D.24895>;
    <D.24894>:
    D.24896 = MEM[(mword *)cur];
    D.24908 = D.24896 & 2;
    if (D.24908 != 0) goto <D.24909>; else goto <D.24910>;
    <D.24909>:
    gc_debug_level.312 = gc_debug_level;
    D.24902 = gc_debug_level.312 > 0;
    D.24903 = (long int) D.24902;
    D.24904 = __builtin_expect (D.24903, 0);
    if (D.24904 != 0) goto <D.24911>; else goto <D.24912>;
    <D.24911>:
    gc_debug_file.313 = gc_debug_file;
    fprintf (gc_debug_file.313, "PINNED OBJ %p\n", cur);
    gc_debug_file.313 = gc_debug_file;
    fflush (gc_debug_file.313);
    <D.24912>:
    <D.24910>:
    <D.24895>:
    D.24913 = sgen_safe_object_get_size (cur);
    ss = (size_t) D.24913;
    D.24914 = sgen_safe_object_get_size (cur);
    D.24915 = D.24914 + 7;
    D.24916 = (long unsigned int) D.24915;
    size = D.24916 & 4294967288;
    D.24917 = cur + size;
    verify_scan_starts (cur, D.24917);
    do_dump_nursery_content.314 = do_dump_nursery_content;
    if (do_dump_nursery_content.314 != 0) goto <D.24919>; else goto <D.24920>;
    <D.24919>:
    if (cur > hole_start) goto <D.24921>; else goto <D.24922>;
    <D.24921>:
    gc_debug_level.312 = gc_debug_level;
    D.24902 = gc_debug_level.312 > 0;
    D.24903 = (long int) D.24902;
    D.24904 = __builtin_expect (D.24903, 0);
    if (D.24904 != 0) goto <D.24923>; else goto <D.24924>;
    <D.24923>:
    cur.315 = (long int) cur;
    hole_start.316 = (long int) hole_start;
    D.24927 = cur.315 - hole_start.316;
    D.24928 = (int) D.24927;
    gc_debug_file.313 = gc_debug_file;
    fprintf (gc_debug_file.313, "HOLE [%p %p %d]\n", hole_start, cur, D.24928);
    gc_debug_file.313 = gc_debug_file;
    fflush (gc_debug_file.313);
    <D.24924>:
    <D.24922>:
    gc_debug_level.312 = gc_debug_level;
    D.24902 = gc_debug_level.312 > 0;
    D.24903 = (long int) D.24902;
    D.24904 = __builtin_expect (D.24903, 0);
    if (D.24904 != 0) goto <D.24929>; else goto <D.24930>;
    <D.24929>:
    D.24896 = MEM[(mword *)cur];
    D.24899 = D.24896 & 18446744073709551612;
    D.24931 = (void *) D.24899;
    D.24932 = sgen_get_array_fill_vtable ();
    D.24933 = D.24931 == D.24932;
    D.24934 = (int) D.24933;
    D.24935 = sgen_safe_name (cur);
    D.24936 = (int) ss;
    D.24937 = (int) size;
    D.24917 = cur + size;
    gc_debug_file.313 = gc_debug_file;
    fprintf (gc_debug_file.313, "OBJ  [%p %p %d %d %s %d]\n", cur, D.24917, D.24937, D.24936, D.24935, D.24934);
    gc_debug_file.313 = gc_debug_file;
    fflush (gc_debug_file.313);
    <D.24930>:
    <D.24920>:
    cur = cur + size;
    hole_start = cur;
  }
  <D.20978>:
  if (cur < end) goto <D.20979>; else goto <D.20980>;
  <D.20980>:
}


major_do_collection (const char * reason)
{
  int disable_major_collections.317;
  gboolean D.24942;
  long long int (*<T2d3b>) (void) D.24943;
  _Bool D.24946;
  long int D.24947;
  long int D.24948;
  int old_next_pin_slot.318;
  long long int D.24952;
  long int D.24953;
  long int D.24954;
  int D.24955;
  long long int D.24956;
  long long int D.24957;
  long unsigned int bytes_pinned_from_failed_allocation.319;
  _Bool D.24961;
  gint64 all_atv;
  gint64 all_btv;
  int old_next_pin_slot;

  try
    {
      disable_major_collections.317 = disable_major_collections;
      if (disable_major_collections.317 != 0) goto <D.24940>; else goto <D.24941>;
      <D.24940>:
      D.24942 = 0;
      return D.24942;
      <D.24941>:
      D.24943 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.24943 != 0B) goto <D.24944>; else goto <D.24945>;
      <D.24944>:
      {
        long long int num_marked;

        D.24943 = major_collector.get_and_reset_num_major_objects_marked;
        num_marked = D.24943 ();
        D.24946 = num_marked != 0;
        D.24947 = (long int) D.24946;
        D.24948 = __builtin_expect (D.24947, 0);
        if (D.24948 != 0) goto <D.24949>; else goto <D.24950>;
        <D.24949>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3298, "!num_marked");
        <D.24950>:
      }
      <D.24945>:
      all_atv = mono_100ns_ticks ();
      major_start_collection (0, &old_next_pin_slot);
      old_next_pin_slot.318 = old_next_pin_slot;
      major_finish_collection (reason, old_next_pin_slot.318, 0);
      all_btv = mono_100ns_ticks ();
      D.24952 = gc_stats.major_gc_time_usecs;
      D.24953 = all_btv - all_atv;
      D.24954 = D.24953 / 10;
      D.24955 = (int) D.24954;
      D.24956 = (long long int) D.24955;
      D.24957 = D.24952 + D.24956;
      gc_stats.major_gc_time_usecs = D.24957;
      D.24943 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.24943 != 0B) goto <D.24958>; else goto <D.24959>;
      <D.24958>:
      D.24943 = major_collector.get_and_reset_num_major_objects_marked;
      D.24943 ();
      <D.24959>:
      bytes_pinned_from_failed_allocation.319 = bytes_pinned_from_failed_allocation;
      D.24961 = bytes_pinned_from_failed_allocation.319 != 0;
      D.24942 = (gboolean) D.24961;
      return D.24942;
    }
  finally
    {
      old_next_pin_slot = {CLOBBER};
    }
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.24964;
  struct GrayQueueSection * D.24965;
  _Bool D.24966;

  D.24965 = queue->first;
  D.24966 = D.24965 == 0B;
  D.24964 = (gboolean) D.24966;
  return D.24964;
}


sgen_gc_is_object_ready_for_finalization (void * object)
{
  gboolean D.24968;
  int D.24969;
  _Bool D.24970;

  D.24969 = sgen_is_object_alive (object);
  D.24970 = D.24969 == 0;
  D.24968 = (gboolean) D.24970;
  return D.24968;
}


sgen_is_object_alive (void * object)
{
  int D.24972;
  gboolean D.24975;

  D.24972 = sgen_ptr_in_nursery (object);
  if (D.24972 != 0) goto <D.24973>; else goto <D.24974>;
  <D.24973>:
  D.24975 = sgen_nursery_is_object_alive (object);
  return D.24975;
  <D.24974>:
  D.24975 = sgen_major_is_object_alive (object);
  return D.24975;
}


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

  entry = sgen_alloc_internal (6);
  critical = has_critical_finalizer (obj);
  entry->object = obj;
  if (critical != 0) goto <D.24977>; else goto <D.24978>;
  <D.24977>:
  critical_fin_list.320 = critical_fin_list;
  entry->next = critical_fin_list.320;
  critical_fin_list = entry;
  goto <D.24980>;
  <D.24978>:
  fin_ready_list.321 = fin_ready_list;
  entry->next = fin_ready_list.321;
  fin_ready_list = entry;
  <D.24980>:
}


has_critical_finalizer (struct MonoObject * obj)
{
  struct MonoClass * D.24982;
  gboolean D.24985;
  long unsigned int D.24986;
  long unsigned int D.24987;
  struct MonoVTable * D.24988;
  struct MonoClass * class;

  D.24982 = mono_defaults.critical_finalizer_object;
  if (D.24982 == 0B) goto <D.24983>; else goto <D.24984>;
  <D.24983>:
  D.24985 = 0;
  return D.24985;
  <D.24984>:
  D.24986 = MEM[(mword *)obj];
  D.24987 = D.24986 & 18446744073709551612;
  D.24988 = (struct MonoVTable *) D.24987;
  class = D.24988->klass;
  D.24982 = mono_defaults.critical_finalizer_object;
  D.24985 = mono_class_has_parent_fast (class, D.24982);
  return D.24985;
}


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

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


sgen_is_object_alive_and_on_current_collection (char * object)
{
  int D.24992;
  int D.24995;
  int current_collection_generation.322;

  D.24992 = sgen_ptr_in_nursery (object);
  if (D.24992 != 0) goto <D.24993>; else goto <D.24994>;
  <D.24993>:
  D.24995 = sgen_nursery_is_object_alive (object);
  return D.24995;
  <D.24994>:
  current_collection_generation.322 = current_collection_generation;
  if (current_collection_generation.322 == 0) goto <D.24997>; else goto <D.24998>;
  <D.24997>:
  D.24995 = 0;
  return D.24995;
  <D.24998>:
  D.24995 = sgen_major_is_object_alive (object);
  return D.24995;
}


mono_gc_invoke_finalizers ()
{
  struct FinalizeReadyEntry * * iftmp.323;
  struct FinalizeReadyEntry * D.25006;
  struct FinalizeReadyEntry * D.25009;
  struct FinalizeReadyEntry * D.25011;
  void * D.25013;
  _Bool D.25020;
  long int D.25021;
  long int D.25022;
  int num_ready_finalizers.324;
  int num_ready_finalizers.325;
  const char * D.25029;
  struct FILE * gc_debug_file.326;
  _Bool D.25032;
  long int D.25033;
  long int D.25034;
  struct FinalizeReadyEntry * fin_ready_list.327;
  struct FinalizeReadyEntry * critical_fin_list.328;
  _Bool D.25040;
  long int D.25041;
  long int D.25042;
  int D.25045;
  struct FinalizeReadyEntry * entry;
  gboolean entry_is_critical;
  int count;
  void * obj;

  entry = 0B;
  entry_is_critical = 0;
  count = 0;
  goto <D.21212>;
  <D.21211>:
  pthread_mutex_lock (&gc_mutex);
  if (entry != 0B) goto <D.25000>; else goto <D.25001>;
  <D.25000>:
  {
    struct FinalizeReadyEntry * * list;

    if (entry_is_critical != 0) goto <D.25003>; else goto <D.25004>;
    <D.25003>:
    iftmp.323 = &critical_fin_list;
    goto <D.25005>;
    <D.25004>:
    iftmp.323 = &fin_ready_list;
    <D.25005>:
    list = iftmp.323;
    D.25006 = *list;
    if (D.25006 == entry) goto <D.25007>; else goto <D.25008>;
    <D.25007>:
    D.25009 = entry->next;
    *list = D.25009;
    goto <D.25010>;
    <D.25008>:
    {
      struct FinalizeReadyEntry * e;

      e = *list;
      goto <D.21202>;
      <D.21201>:
      e = e->next;
      <D.21202>:
      D.25011 = e->next;
      if (D.25011 != entry) goto <D.21201>; else goto <D.21203>;
      <D.21203>:
      D.25009 = entry->next;
      e->next = D.25009;
    }
    <D.25010>:
    sgen_free_internal (entry, 6);
    entry = 0B;
  }
  <D.25001>:
  entry = fin_ready_list;
  goto <D.21205>;
  <D.21204>:
  entry = entry->next;
  <D.21205>:
  if (entry != 0B) goto <D.25012>; else goto <D.21206>;
  <D.25012>:
  D.25013 = entry->object;
  if (D.25013 == 0B) goto <D.21204>; else goto <D.21206>;
  <D.21206>:
  if (entry != 0B) goto <D.25014>; else goto <D.25015>;
  <D.25014>:
  entry_is_critical = 0;
  goto <D.25016>;
  <D.25015>:
  entry_is_critical = 1;
  entry = critical_fin_list;
  goto <D.21208>;
  <D.21207>:
  entry = entry->next;
  <D.21208>:
  if (entry != 0B) goto <D.25017>; else goto <D.21209>;
  <D.25017>:
  D.25013 = entry->object;
  if (D.25013 == 0B) goto <D.21207>; else goto <D.21209>;
  <D.21209>:
  <D.25016>:
  if (entry != 0B) goto <D.25018>; else goto <D.25019>;
  <D.25018>:
  D.25013 = entry->object;
  D.25020 = D.25013 == 0B;
  D.25021 = (long int) D.25020;
  D.25022 = __builtin_expect (D.25021, 0);
  if (D.25022 != 0) goto <D.25023>; else goto <D.25024>;
  <D.25023>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3882, "entry->object");
  <D.25024>:
  num_ready_finalizers.324 = num_ready_finalizers;
  num_ready_finalizers.325 = num_ready_finalizers.324 + -1;
  num_ready_finalizers = num_ready_finalizers.325;
  obj = entry->object;
  entry->object = 0B;
  if (0 != 0) goto <D.25027>; else goto <D.25028>;
  <D.25027>:
  D.25029 = safe_name (obj);
  gc_debug_file.326 = gc_debug_file;
  fprintf (gc_debug_file.326, "Finalizing object %p (%s)\n", obj, D.25029);
  gc_debug_file.326 = gc_debug_file;
  fflush (gc_debug_file.326);
  <D.25028>:
  <D.25019>:
  sgen_gc_unlock ();
  if (entry == 0B) goto <D.21210>; else goto <D.25031>;
  <D.25031>:
  D.25013 = entry->object;
  D.25032 = D.25013 != 0B;
  D.25033 = (long int) D.25032;
  D.25034 = __builtin_expect (D.25033, 0);
  if (D.25034 != 0) goto <D.25035>; else goto <D.25036>;
  <D.25035>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3894, "entry->object == NULL");
  <D.25036>:
  count = count + 1;
  mono_gc_run_finalize (obj, 0B);
  <D.21212>:
  fin_ready_list.327 = fin_ready_list;
  if (fin_ready_list.327 != 0B) goto <D.21211>; else goto <D.25038>;
  <D.25038>:
  critical_fin_list.328 = critical_fin_list;
  if (critical_fin_list.328 != 0B) goto <D.21211>; else goto <D.21210>;
  <D.21210>:
  D.25040 = entry != 0B;
  D.25041 = (long int) D.25040;
  D.25042 = __builtin_expect (D.25041, 0);
  if (D.25042 != 0) goto <D.25043>; else goto <D.25044>;
  <D.25043>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3900, "!entry");
  <D.25044>:
  D.25045 = count;
  return D.25045;
}


mono_gc_pending_finalizers ()
{
  gboolean D.25047;
  int iftmp.329;
  struct FinalizeReadyEntry * fin_ready_list.330;
  struct FinalizeReadyEntry * critical_fin_list.331;

  fin_ready_list.330 = fin_ready_list;
  if (fin_ready_list.330 != 0B) goto <D.25049>; else goto <D.25053>;
  <D.25053>:
  critical_fin_list.331 = critical_fin_list;
  if (critical_fin_list.331 != 0B) goto <D.25049>; else goto <D.25050>;
  <D.25049>:
  iftmp.329 = 1;
  goto <D.25051>;
  <D.25050>:
  iftmp.329 = 0;
  <D.25051>:
  D.25047 = iftmp.329;
  return D.25047;
}


mono_gc_register_root (char * start, size_t size, void * descr)
{
  int D.25056;
  _Bool D.25057;
  int D.25058;

  D.25057 = descr == 0B;
  D.25058 = (int) D.25057;
  D.25056 = mono_gc_register_root_inner (start, size, descr, D.25058);
  return D.25056;
}


mono_gc_register_root_inner (char * start, size_t size, void * descr, int root_type)
{
  struct SgenHashTable * D.25060;
  char * D.25063;
  long int D.25064;
  long int start.332;
  long int D.25066;
  char * D.25067;
  int iftmp.333;
  long unsigned int D.25073;
  _Bool D.25076;
  long int D.25077;
  long int D.25078;
  long unsigned int descr.334;
  long unsigned int roots_size.335;
  long unsigned int roots_size.336;
  long unsigned int roots_size.337;
  int D.25085;
  struct SgenHashTable * D.25086;
  int D.25089;
  int D.25090;
  char * D.25091;
  struct FILE * gc_debug_file.338;
  struct RootRecord new_root;
  int i;

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

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

          D.25063 = root->end_root;
          D.25064 = (long int) D.25063;
          start.332 = (long int) start;
          D.25066 = D.25064 - start.332;
          old_size = (size_t) D.25066;
          D.25067 = start + size;
          root->end_root = D.25067;
          D.25073 = root->root_desc;
          if (D.25073 == 0) goto <D.25069>; else goto <D.25074>;
          <D.25074>:
          if (descr == 0B) goto <D.25069>; else goto <D.25070>;
          <D.25069>:
          D.25073 = root->root_desc;
          if (D.25073 != 0) goto <D.25071>; else goto <D.25075>;
          <D.25075>:
          if (descr != 0B) goto <D.25071>; else goto <D.25070>;
          <D.25071>:
          iftmp.333 = 1;
          goto <D.25072>;
          <D.25070>:
          iftmp.333 = 0;
          <D.25072>:
          D.25076 = iftmp.333 != 0;
          D.25077 = (long int) D.25076;
          D.25078 = __builtin_expect (D.25077, 0);
          if (D.25078 != 0) goto <D.25079>; else goto <D.25080>;
          <D.25079>:
          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.25080>:
          descr.334 = (long unsigned int) descr;
          root->root_desc = descr.334;
          roots_size.335 = roots_size;
          roots_size.336 = roots_size.335 + size;
          roots_size = roots_size.336;
          roots_size.335 = roots_size;
          roots_size.337 = roots_size.335 - old_size;
          roots_size = roots_size.337;
          sgen_gc_unlock ();
          D.25085 = 1;
          return D.25085;
        }
        <D.25062>:
      }
      i = i + 1;
      <D.21227>:
      if (i <= 2) goto <D.21226>; else goto <D.21228>;
      <D.21228>:
      D.25067 = start + size;
      new_root.end_root = D.25067;
      descr.334 = (long unsigned int) descr;
      new_root.root_desc = descr.334;
      D.25086 = &roots_hash[root_type];
      sgen_hash_table_replace (D.25086, start, &new_root, 0B);
      roots_size.335 = roots_size;
      roots_size.336 = roots_size.335 + size;
      roots_size = roots_size.336;
      if (0 != 0) goto <D.25087>; else goto <D.25088>;
      <D.25087>:
      roots_size.335 = roots_size;
      D.25089 = (int) roots_size.335;
      D.25090 = (int) size;
      D.25091 = new_root.end_root;
      gc_debug_file.338 = gc_debug_file;
      fprintf (gc_debug_file.338, "Added root for range: %p-%p, descr: %p  (%d/%d bytes)\n", start, D.25091, descr, D.25090, D.25089);
      gc_debug_file.338 = gc_debug_file;
      fflush (gc_debug_file.338);
      <D.25088>:
      sgen_gc_unlock ();
      D.25085 = 1;
      return D.25085;
    }
  finally
    {
      new_root = {CLOBBER};
    }
}


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

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


mono_gc_deregister_root (char * addr)
{
  struct SgenHashTable * D.25097;
  int D.25098;
  long int addr.339;
  char * D.25102;
  long int D.25103;
  long int D.25104;
  long unsigned int D.25105;
  long unsigned int roots_size.340;
  long unsigned int roots_size.341;
  int root_type;
  struct RootRecord root;

  try
    {
      pthread_mutex_lock (&gc_mutex);
      root_type = 0;
      goto <D.21245>;
      <D.21244>:
      D.25097 = &roots_hash[root_type];
      D.25098 = sgen_hash_table_remove (D.25097, addr, &root);
      if (D.25098 != 0) goto <D.25099>; else goto <D.25100>;
      <D.25099>:
      addr.339 = (long int) addr;
      D.25102 = root.end_root;
      D.25103 = (long int) D.25102;
      D.25104 = addr.339 - D.25103;
      D.25105 = (long unsigned int) D.25104;
      roots_size.340 = roots_size;
      roots_size.341 = D.25105 + roots_size.340;
      roots_size = roots_size.341;
      <D.25100>:
      root_type = root_type + 1;
      <D.21245>:
      if (root_type <= 2) goto <D.21244>; else goto <D.21246>;
      <D.21246>:
      sgen_gc_unlock ();
    }
  finally
    {
      root = {CLOBBER};
    }
}


sgen_get_current_collection_generation ()
{
  int D.25108;

  D.25108 = current_collection_generation;
  return D.25108;
}


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


mono_gc_get_gc_callbacks ()
{
  struct MonoGCCallbacks * D.25110;

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


mono_gc_conservatively_scan_area (void * start, void * end)
{
  void * scan_area_arg_end.342;
  void * scan_area_arg_start.343;

  scan_area_arg_end.342 = scan_area_arg_end;
  scan_area_arg_start.343 = scan_area_arg_start;
  conservatively_pin_objects_from (start, end, scan_area_arg_start.343, scan_area_arg_end.342, 0);
}


mono_gc_scan_object (void * obj)
{
  unsigned int user_copy_or_mark_key.344;
  void (*<T2bff>) (void * *, struct SgenGrayQueue *) D.25115;
  struct GrayQueue * D.25116;
  void * D.25117;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.344 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.344);
  D.25115 = current_object_ops.copy_or_mark_object;
  D.25116 = data->queue;
  D.25115 (&obj, D.25116);
  D.25117 = obj;
  return D.25117;
}


mono_gc_register_thread (void * baseptr)
{
  gboolean D.25119;
  struct SgenThreadInfo * D.25120;
  _Bool D.25121;

  D.25120 = mono_thread_info_attach (baseptr);
  D.25121 = D.25120 != 0B;
  D.25119 = (gboolean) D.25121;
  return D.25119;
}


mono_gc_set_stack_end (void * stack_end)
{
  void * D.25125;
  _Bool D.25126;
  long int D.25127;
  long int D.25128;
  struct SgenThreadInfo * info;

  pthread_mutex_lock (&gc_mutex);
  info = mono_thread_info_current ();
  if (info != 0B) goto <D.25123>; else goto <D.25124>;
  <D.25123>:
  D.25125 = info->stack_end;
  D.25126 = D.25125 <= stack_end;
  D.25127 = (long int) D.25126;
  D.25128 = __builtin_expect (D.25127, 0);
  if (D.25128 != 0) goto <D.25129>; else goto <D.25130>;
  <D.25129>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4224, "stack_end < info->stack_end");
  <D.25130>:
  info->stack_end = stack_end;
  <D.25124>:
  sgen_gc_unlock ();
}


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

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


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

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


mono_gc_pthread_detach (pthread_t thread)
{
  int D.25135;

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


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.25137;
  struct FILE * gc_debug_file.345;
  void (*<T2d57>) (struct MonoObject *, void *, struct MonoObject *) D.25145;

  D.25137 = sgen_ptr_in_nursery (field_ptr);
  if (D.25137 != 0) goto <D.25138>; else goto <D.25139>;
  <D.25138>:
  MEM[(void * *)field_ptr] = value;
  return;
  <D.25139>:
  if (0 != 0) goto <D.25140>; else goto <D.25141>;
  <D.25140>:
  gc_debug_file.345 = gc_debug_file;
  fprintf (gc_debug_file.345, "Adding remset at %p\n", field_ptr);
  gc_debug_file.345 = gc_debug_file;
  fflush (gc_debug_file.345);
  <D.25141>:
  if (value != 0B) goto <D.25143>; else goto <D.25144>;
  <D.25143>:
  <D.25144>:
  D.25145 = remset.wbarrier_set_field;
  D.25145 (obj, field_ptr, value);
}


mono_gc_wbarrier_set_arrayref (struct MonoArray * arr, void * slot_ptr, struct MonoObject * value)
{
  int D.25147;
  struct FILE * gc_debug_file.346;
  void (*<T2d5b>) (struct MonoArray *, void *, struct MonoObject *) D.25155;

  D.25147 = sgen_ptr_in_nursery (slot_ptr);
  if (D.25147 != 0) goto <D.25148>; else goto <D.25149>;
  <D.25148>:
  MEM[(void * *)slot_ptr] = value;
  return;
  <D.25149>:
  if (0 != 0) goto <D.25150>; else goto <D.25151>;
  <D.25150>:
  gc_debug_file.346 = gc_debug_file;
  fprintf (gc_debug_file.346, "Adding remset at %p\n", slot_ptr);
  gc_debug_file.346 = gc_debug_file;
  fflush (gc_debug_file.346);
  <D.25151>:
  if (value != 0B) goto <D.25153>; else goto <D.25154>;
  <D.25153>:
  <D.25154>:
  D.25155 = remset.wbarrier_set_arrayref;
  D.25155 (arr, slot_ptr, value);
}


mono_gc_wbarrier_arrayref_copy (void * dest_ptr, void * src_ptr, int count)
{
  int D.25159;
  long unsigned int D.25161;
  long unsigned int D.25162;
  void (*<T2d5f>) (void *, void *, int) D.25163;

  D.25159 = sgen_ptr_in_nursery (dest_ptr);
  if (D.25159 != 0) goto <D.25157>; else goto <D.25160>;
  <D.25160>:
  if (count <= 0) goto <D.25157>; else goto <D.25158>;
  <D.25157>:
  D.25161 = (long unsigned int) count;
  D.25162 = D.25161 * 8;
  mono_gc_memmove_aligned (dest_ptr, src_ptr, D.25162);
  return;
  <D.25158>:
  D.25163 = remset.wbarrier_arrayref_copy;
  D.25163 (dest_ptr, src_ptr, count);
}


find_object_for_ptr (char * ptr)
{
  struct GCMemSection * nursery_section.347;
  char * D.25166;
  char * D.25169;
  char * found_obj.348;
  char * D.25175;
  void (*<T2cf5>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.25178;

  nursery_section.347 = nursery_section;
  D.25166 = nursery_section.347->data;
  if (D.25166 <= ptr) goto <D.25167>; else goto <D.25168>;
  <D.25167>:
  nursery_section.347 = nursery_section;
  D.25169 = nursery_section.347->end_data;
  if (D.25169 > ptr) goto <D.25170>; else goto <D.25171>;
  <D.25170>:
  found_obj = 0B;
  nursery_section.347 = nursery_section;
  D.25169 = nursery_section.347->end_data;
  nursery_section.347 = nursery_section;
  D.25166 = nursery_section.347->data;
  sgen_scan_area_with_callback (D.25166, D.25169, find_object_for_ptr_callback, ptr, 1);
  found_obj.348 = found_obj;
  if (found_obj.348 != 0B) goto <D.25173>; else goto <D.25174>;
  <D.25173>:
  D.25175 = found_obj;
  return D.25175;
  <D.25174>:
  <D.25171>:
  <D.25168>:
  found_obj = 0B;
  sgen_los_iterate_objects (find_object_for_ptr_callback, ptr);
  found_obj.348 = found_obj;
  if (found_obj.348 != 0B) goto <D.25176>; else goto <D.25177>;
  <D.25176>:
  D.25175 = found_obj;
  return D.25175;
  <D.25177>:
  found_obj = 0B;
  D.25178 = major_collector.iterate_objects;
  D.25178 (1, 1, find_object_for_ptr_callback, ptr);
  D.25175 = found_obj;
  return D.25175;
}


find_object_for_ptr_callback (char * obj, size_t size, void * user_data)
{
  char * D.25182;
  char * found_obj.349;
  _Bool D.25186;
  long int D.25187;
  long int D.25188;
  char * ptr;

  ptr = user_data;
  if (ptr >= obj) goto <D.25180>; else goto <D.25181>;
  <D.25180>:
  D.25182 = obj + size;
  if (D.25182 > ptr) goto <D.25183>; else goto <D.25184>;
  <D.25183>:
  found_obj.349 = found_obj;
  D.25186 = found_obj.349 != 0B;
  D.25187 = (long int) D.25186;
  D.25188 = __builtin_expect (D.25187, 0);
  if (D.25188 != 0) goto <D.25189>; else goto <D.25190>;
  <D.25189>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4335, "!found_obj");
  <D.25190>:
  found_obj = obj;
  <D.25184>:
  <D.25181>:
}


mono_gc_wbarrier_generic_nostore (void * ptr)
{
  int D.25195;
  int D.25197;
  struct FILE * gc_debug_file.350;
  int D.25201;
  int concurrent_collection_in_progress.351;
  void (*<T11da>) (void *) D.25211;
  void * obj;

  obj = MEM[(void * *)ptr];
  if (obj != 0B) goto <D.25191>; else goto <D.25192>;
  <D.25191>:
  <D.25192>:
  D.25195 = sgen_ptr_in_nursery (ptr);
  if (D.25195 != 0) goto <D.25193>; else goto <D.25196>;
  <D.25196>:
  D.25197 = ptr_on_stack (ptr);
  if (D.25197 != 0) goto <D.25193>; else goto <D.25194>;
  <D.25193>:
  if (0 != 0) goto <D.25198>; else goto <D.25199>;
  <D.25198>:
  gc_debug_file.350 = gc_debug_file;
  fprintf (gc_debug_file.350, "Skipping remset at %p\n", ptr);
  gc_debug_file.350 = gc_debug_file;
  fflush (gc_debug_file.350);
  <D.25199>:
  return;
  <D.25194>:
  D.25201 = sgen_ptr_in_nursery (obj);
  if (D.25201 == 0) goto <D.25202>; else goto <D.25203>;
  <D.25202>:
  concurrent_collection_in_progress.351 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.351 == 0) goto <D.25205>; else goto <D.25206>;
  <D.25205>:
  if (0 != 0) goto <D.25207>; else goto <D.25208>;
  <D.25207>:
  gc_debug_file.350 = gc_debug_file;
  fprintf (gc_debug_file.350, "Skipping remset at %p\n", ptr);
  gc_debug_file.350 = gc_debug_file;
  fflush (gc_debug_file.350);
  <D.25208>:
  return;
  <D.25206>:
  <D.25203>:
  if (0 != 0) goto <D.25209>; else goto <D.25210>;
  <D.25209>:
  gc_debug_file.350 = gc_debug_file;
  fprintf (gc_debug_file.350, "Adding remset at %p\n", ptr);
  gc_debug_file.350 = gc_debug_file;
  fflush (gc_debug_file.350);
  <D.25210>:
  D.25211 = remset.wbarrier_generic_nostore;
  D.25211 (ptr);
}


ptr_on_stack (void * ptr)
{
  void * stack_start.352;
  void * D.25216;
  gboolean D.25219;
  void * stack_start;
  struct SgenThreadInfo * info;

  try
    {
      stack_start = &stack_start;
      info = mono_thread_info_current ();
      stack_start.352 = stack_start;
      if (ptr >= stack_start.352) goto <D.25214>; else goto <D.25215>;
      <D.25214>:
      D.25216 = info->stack_end;
      if (D.25216 > ptr) goto <D.25217>; else goto <D.25218>;
      <D.25217>:
      D.25219 = 1;
      return D.25219;
      <D.25218>:
      <D.25215>:
      D.25219 = 0;
      return D.25219;
    }
  finally
    {
      stack_start = {CLOBBER};
    }
}


mono_gc_wbarrier_generic_store (void * ptr, struct MonoObject * value)
{
  const char * iftmp.353;
  struct FILE * gc_debug_file.354;
  int D.25229;

  if (0 != 0) goto <D.25222>; else goto <D.25223>;
  <D.25222>:
  if (value != 0B) goto <D.25225>; else goto <D.25226>;
  <D.25225>:
  iftmp.353 = safe_name (value);
  goto <D.25227>;
  <D.25226>:
  iftmp.353 = "null";
  <D.25227>:
  gc_debug_file.354 = gc_debug_file;
  fprintf (gc_debug_file.354, "Wbarrier store at %p to %p (%s)\n", ptr, value, iftmp.353);
  gc_debug_file.354 = gc_debug_file;
  fflush (gc_debug_file.354);
  <D.25223>:
  MEM[(void * *)ptr] = value;
  D.25229 = sgen_ptr_in_nursery (value);
  if (D.25229 != 0) goto <D.25230>; else goto <D.25231>;
  <D.25230>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.25231>:
  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)
{
  const char * iftmp.355;
  struct FILE * gc_debug_file.356;
  int D.25239;

  if (0 != 0) goto <D.25232>; else goto <D.25233>;
  <D.25232>:
  if (value != 0B) goto <D.25235>; else goto <D.25236>;
  <D.25235>:
  iftmp.355 = safe_name (value);
  goto <D.25237>;
  <D.25236>:
  iftmp.355 = "null";
  <D.25237>:
  gc_debug_file.356 = gc_debug_file;
  fprintf (gc_debug_file.356, "Wbarrier atomic store at %p to %p (%s)\n", ptr, value, iftmp.355);
  gc_debug_file.356 = gc_debug_file;
  fflush (gc_debug_file.356);
  <D.25233>:
  InterlockedWritePointer (ptr, value);
  D.25239 = sgen_ptr_in_nursery (value);
  if (D.25239 != 0) goto <D.25240>; else goto <D.25241>;
  <D.25240>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.25241>:
  sgen_dummy_use (value);
}


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


InterlockedExchangePointer (void * volatile * val, void * new_val)
{
  long unsigned int new_val.357;
  long unsigned int old_val.358;
  long unsigned int D.25244;
  void * D.25245;
  void * D.25246;
  void * old_val;

  <D.12204>:
  old_val = *val;
  new_val.357 = (long unsigned int) new_val;
  old_val.358 = (long unsigned int) old_val;
  D.25244 = __sync_val_compare_and_swap_8 (val, old_val.358, new_val.357);
  D.25245 = (void *) D.25244;
  if (D.25245 != old_val) goto <D.12204>; else goto <D.12205>;
  <D.12205>:
  D.25246 = old_val;
  return D.25246;
}


mono_gc_wbarrier_value_copy_bitmap (void * _dest, void * _src, int size, unsigned int bitmap)
{
  unsigned int D.25248;
  long unsigned int D.25251;
  struct MonoObject * D.25252;
  mword * dest;
  mword * src;

  dest = _dest;
  src = _src;
  goto <D.21372>;
  <D.21371>:
  D.25248 = bitmap & 1;
  if (D.25248 != 0) goto <D.25249>; else goto <D.25250>;
  <D.25249>:
  D.25251 = *src;
  D.25252 = (struct MonoObject *) D.25251;
  mono_gc_wbarrier_generic_store (dest, D.25252);
  goto <D.25253>;
  <D.25250>:
  D.25251 = *src;
  *dest = D.25251;
  <D.25253>:
  src = src + 8;
  dest = dest + 8;
  size = size + -8;
  bitmap = bitmap >> 1;
  <D.21372>:
  if (size != 0) goto <D.21371>; else goto <D.21373>;
  <D.21373>:
}


mono_gc_wbarrier_value_copy (void * dest, void * src, int count, struct MonoClass * klass)
{
  unsigned char D.25254;
  unsigned char D.25255;
  _Bool D.25256;
  long int D.25257;
  long int D.25258;
  const char * D.25263;
  void * D.25264;
  struct FILE * gc_debug_file.359;
  int D.25268;
  int D.25270;
  long unsigned int D.25272;
  int D.25273;
  int D.25274;
  long unsigned int D.25275;
  void (*<T2d63>) (void *, void *, int, struct MonoClass *) D.25276;

  D.25254 = BIT_FIELD_REF <*klass, 8, 256>;
  D.25255 = D.25254 & 8;
  D.25256 = D.25255 == 0;
  D.25257 = (long int) D.25256;
  D.25258 = __builtin_expect (D.25257, 0);
  if (D.25258 != 0) goto <D.25259>; else goto <D.25260>;
  <D.25259>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4480, "klass->valuetype");
  <D.25260>:
  if (0 != 0) goto <D.25261>; else goto <D.25262>;
  <D.25261>:
  D.25263 = klass->name;
  D.25264 = klass->gc_descr;
  gc_debug_file.359 = gc_debug_file;
  fprintf (gc_debug_file.359, "Adding value remset at %p, count %d, descr %p for class %s (%p)\n", dest, count, D.25264, D.25263, klass);
  gc_debug_file.359 = gc_debug_file;
  fflush (gc_debug_file.359);
  <D.25262>:
  D.25268 = sgen_ptr_in_nursery (dest);
  if (D.25268 != 0) goto <D.25266>; else goto <D.25269>;
  <D.25269>:
  D.25270 = ptr_on_stack (dest);
  if (D.25270 != 0) goto <D.25266>; else goto <D.25271>;
  <D.25271>:
  D.25264 = klass->gc_descr;
  D.25272 = (long unsigned int) D.25264;
  D.25273 = sgen_gc_descr_has_references (D.25272);
  if (D.25273 == 0) goto <D.25266>; else goto <D.25267>;
  <D.25266>:
  {
    size_t element_size;
    size_t size;

    D.25274 = mono_class_value_size (klass, 0B);
    element_size = (size_t) D.25274;
    D.25275 = (long unsigned int) count;
    size = D.25275 * element_size;
    mono_gc_memmove_atomic (dest, src, size);
    return;
  }
  <D.25267>:
  D.25276 = remset.wbarrier_value_copy;
  D.25276 (dest, src, count, klass);
}


mono_gc_wbarrier_object_copy (struct MonoObject * obj, struct MonoObject * src)
{
  int D.25280;
  int D.25282;
  struct MonoVTable * D.25283;
  struct MonoClass * D.25284;
  long unsigned int D.25285;
  long unsigned int D.25286;
  const void * D.25287;
  void * D.25288;
  void (*<T2d67>) (struct MonoObject *, struct MonoObject *) D.25289;
  int size;

  D.25280 = sgen_ptr_in_nursery (obj);
  if (D.25280 != 0) goto <D.25278>; else goto <D.25281>;
  <D.25281>:
  D.25282 = ptr_on_stack (obj);
  if (D.25282 != 0) goto <D.25278>; else goto <D.25279>;
  <D.25278>:
  D.25283 = obj->vtable;
  D.25284 = D.25283->klass;
  size = D.25284->instance_size;
  D.25285 = (long unsigned int) size;
  D.25286 = D.25285 + 18446744073709551600;
  D.25287 = src + 16;
  D.25288 = obj + 16;
  mono_gc_memmove_aligned (D.25288, D.25287, D.25286);
  return;
  <D.25279>:
  D.25289 = remset.wbarrier_object_copy;
  D.25289 (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.360;
  char * D.25292;
  char * D.25293;
  void (*<T2cf5>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.25294;
  int D.25295;
  struct HeapWalkInfo hwi;

  try
    {
      hwi.flags = flags;
      hwi.callback = callback;
      hwi.data = data;
      sgen_clear_nursery_fragments ();
      nursery_section.360 = nursery_section;
      D.25292 = nursery_section.360->end_data;
      nursery_section.360 = nursery_section;
      D.25293 = nursery_section.360->data;
      sgen_scan_area_with_callback (D.25293, D.25292, walk_references, &hwi, 0);
      D.25294 = major_collector.iterate_objects;
      D.25294 (1, 1, walk_references, &hwi);
      sgen_los_iterate_objects (walk_references, &hwi);
      D.25295 = 0;
      return D.25295;
    }
  finally
    {
      hwi = {CLOBBER};
    }
}


walk_references (char * start, size_t size, void * data)
{
  int D.25300;
  int D.25302;
  int (*<T2f62>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.25303;
  void * D.25304;
  uintptr_t[128] * D.25305;
  struct MonoObject *[128] * D.25306;
  long unsigned int D.25307;
  size_t iftmp.361;
  struct MonoVTable * D.25312;
  struct MonoClass * D.25313;
  struct HeapWalkInfo * hwi;

  hwi = data;
  hwi->called = 0;
  hwi->count = 0;
  collect_references (hwi, start, size);
  D.25300 = hwi->count;
  if (D.25300 != 0) goto <D.25298>; else goto <D.25301>;
  <D.25301>:
  D.25302 = hwi->called;
  if (D.25302 == 0) goto <D.25298>; else goto <D.25299>;
  <D.25298>:
  D.25303 = hwi->callback;
  D.25304 = hwi->data;
  D.25305 = &hwi->offsets;
  D.25306 = &hwi->refs;
  D.25300 = hwi->count;
  D.25307 = (long unsigned int) D.25300;
  D.25302 = hwi->called;
  if (D.25302 == 0) goto <D.25309>; else goto <D.25310>;
  <D.25309>:
  iftmp.361 = size;
  goto <D.25311>;
  <D.25310>:
  iftmp.361 = 0;
  <D.25311>:
  D.25312 = MEM[(struct MonoObject *)start].vtable;
  D.25313 = D.25312->klass;
  D.25303 (start, D.25313, iftmp.361, D.25307, D.25306, D.25305, D.25304);
  <D.25299>:
}


collect_references (struct HeapWalkInfo * hwi, char * start, size_t size)
{
  long unsigned int D.25314;
  long unsigned int D.25315;
  long unsigned int D.25316;
  long unsigned int D.25317;
  long unsigned int D.25320;
  long unsigned int D.25321;
  long unsigned int D.25322;
  long unsigned int D.25323;
  long unsigned int D.25324;
  long unsigned int D.25325;
  void * D.25326;
  int D.25329;
  int (*<T2f62>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.25332;
  void * D.25333;
  uintptr_t[128] * D.25334;
  struct MonoObject *[128] * D.25335;
  long unsigned int D.25336;
  size_t iftmp.362;
  int D.25338;
  struct MonoVTable * D.25342;
  struct MonoClass * D.25343;
  long int _objptr.363;
  long int start.364;
  long int D.25346;
  long unsigned int D.25347;
  int D.25348;
  int D.25349;
  size_t iftmp.365;
  int D.25358;
  int D.25359;
  long unsigned int D.25360;
  long unsigned int D.25361;
  int D.25362;
  void * D.25363;
  size_t iftmp.366;
  long int _objptr.367;
  long int D.25373;
  long unsigned int D.25374;
  int D.25375;
  int D.25376;
  long unsigned int D.25377;
  long unsigned int D.25378;
  int D.25379;
  size_t iftmp.368;
  int D.25388;
  int D.25389;
  long unsigned int D.25390;
  long unsigned int D.25393;
  int D.25394;
  int D.25395;
  unsigned int D.25398;
  unsigned int el_size.369;
  unsigned int D.25400;
  sizetype D.25401;
  void * D.25402;
  size_t iftmp.370;
  long int p.371;
  long int D.25412;
  long unsigned int D.25413;
  int D.25414;
  int D.25415;
  int D.25419;
  int D.25420;
  long unsigned int D.25421;
  long unsigned int D.25422;
  long unsigned int D.25423;
  long unsigned int D.25424;
  void * * D.25425;
  void * D.25426;
  size_t iftmp.372;
  char * D.25435;
  long int D.25436;
  long int D.25437;
  long unsigned int D.25438;
  int D.25439;
  int D.25440;
  sizetype D.25441;
  long unsigned int D.25445;
  void * D.25448;
  size_t iftmp.373;
  long int p.374;
  long int D.25458;
  long unsigned int D.25459;
  int D.25460;
  int D.25461;
  long unsigned int D.25462;
  void * D.25465;
  size_t iftmp.375;
  long int _objptr.376;
  long int D.25475;
  long unsigned int D.25476;
  int D.25477;
  int D.25478;
  long unsigned int D.25479;
  unsigned int D.25480;
  unsigned int D.25481;
  struct MonoVTable * D.25484;
  struct MonoClass * D.25485;
  const char * D.25486;
  const char * D.25487;
  gsize * bitmap_data.377;
  long unsigned int D.25489;
  void * D.25492;
  size_t iftmp.378;
  long int _objptr.379;
  long int D.25502;
  long unsigned int D.25503;
  int D.25504;
  int D.25505;
  int bwords.380;
  long unsigned int D.25507;
  gsize * mbitmap_data.381;
  long unsigned int D.25509;
  unsigned int D.25510;
  unsigned int D.25511;
  struct MonoClass * D.25512;
  unsigned int el_size.382;
  unsigned int D.25514;
  sizetype D.25515;
  const char * D.25518;
  const char * D.25519;
  gsize * bitmap_data.383;
  long unsigned int D.25521;
  void * D.25524;
  size_t iftmp.384;
  long int _objptr.385;
  long int D.25534;
  long unsigned int D.25535;
  int D.25536;
  int D.25537;
  unsigned int bwords.386;
  sizetype D.25539;

  {
    struct GCVTable * vt;
    mword desc;

    D.25314 = MEM[(mword *)start];
    D.25315 = D.25314 & 18446744073709551612;
    vt = (struct GCVTable *) D.25315;
    desc = vt->desc;
    D.25316 = desc & 7;
    switch (D.25316) <default: <D.21488>, case 1: <D.21403>, case 2: <D.21410>, case 3: <D.21454>, case 4: <D.21418>, case 5: <D.21448>, case 6: <D.21467>, case 7: <D.21487>>
    <D.21403>:
    D.25317 = desc & 4294901760;
    if (D.25317 != 0) goto <D.25318>; else goto <D.25319>;
    <D.25318>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.25320 = desc >> 16;
      D.25321 = D.25320 & 255;
      D.25322 = D.25321 * 8;
      _objptr = _objptr + D.25322;
      D.25323 = desc >> 24;
      D.25324 = D.25323 & 255;
      D.25325 = D.25324 * 8;
      _objptr_end = _objptr + D.25325;
      D.25326 = *_objptr;
      if (D.25326 != 0B) goto <D.25327>; else goto <D.25328>;
      <D.25327>:
      D.25329 = hwi->count;
      if (D.25329 == 128) goto <D.25330>; else goto <D.25331>;
      <D.25330>:
      D.25332 = hwi->callback;
      D.25333 = hwi->data;
      D.25334 = &hwi->offsets;
      D.25335 = &hwi->refs;
      D.25329 = hwi->count;
      D.25336 = (long unsigned int) D.25329;
      D.25338 = hwi->called;
      if (D.25338 == 0) goto <D.25339>; else goto <D.25340>;
      <D.25339>:
      iftmp.362 = size;
      goto <D.25341>;
      <D.25340>:
      iftmp.362 = 0;
      <D.25341>:
      D.25342 = MEM[(struct MonoObject *)start].vtable;
      D.25343 = D.25342->klass;
      D.25332 (start, D.25343, iftmp.362, D.25336, D.25335, D.25334, D.25333);
      hwi->count = 0;
      hwi->called = 1;
      <D.25331>:
      D.25329 = hwi->count;
      _objptr.363 = (long int) _objptr;
      start.364 = (long int) start;
      D.25346 = _objptr.363 - start.364;
      D.25347 = (long unsigned int) D.25346;
      hwi->offsets[D.25329] = D.25347;
      D.25329 = hwi->count;
      D.25348 = D.25329;
      D.25349 = D.25348 + 1;
      hwi->count = D.25349;
      D.25326 = *_objptr;
      hwi->refs[D.25348] = D.25326;
      <D.25328>:
      _objptr = _objptr + 8;
      goto <D.21407>;
      <D.21406>:
      D.25326 = *_objptr;
      if (D.25326 != 0B) goto <D.25350>; else goto <D.25351>;
      <D.25350>:
      D.25329 = hwi->count;
      if (D.25329 == 128) goto <D.25352>; else goto <D.25353>;
      <D.25352>:
      D.25332 = hwi->callback;
      D.25333 = hwi->data;
      D.25334 = &hwi->offsets;
      D.25335 = &hwi->refs;
      D.25329 = hwi->count;
      D.25336 = (long unsigned int) D.25329;
      D.25338 = hwi->called;
      if (D.25338 == 0) goto <D.25355>; else goto <D.25356>;
      <D.25355>:
      iftmp.365 = size;
      goto <D.25357>;
      <D.25356>:
      iftmp.365 = 0;
      <D.25357>:
      D.25342 = MEM[(struct MonoObject *)start].vtable;
      D.25343 = D.25342->klass;
      D.25332 (start, D.25343, iftmp.365, D.25336, D.25335, D.25334, D.25333);
      hwi->count = 0;
      hwi->called = 1;
      <D.25353>:
      D.25329 = hwi->count;
      _objptr.363 = (long int) _objptr;
      start.364 = (long int) start;
      D.25346 = _objptr.363 - start.364;
      D.25347 = (long unsigned int) D.25346;
      hwi->offsets[D.25329] = D.25347;
      D.25329 = hwi->count;
      D.25358 = D.25329;
      D.25359 = D.25358 + 1;
      hwi->count = D.25359;
      D.25326 = *_objptr;
      hwi->refs[D.25358] = D.25326;
      <D.25351>:
      _objptr = _objptr + 8;
      <D.21407>:
      if (_objptr < _objptr_end) goto <D.21406>; else goto <D.21408>;
      <D.21408>:
    }
    <D.25319>:
    goto <D.21409>;
    <D.21410>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.25360 = (long unsigned int) _index;
        D.25361 = D.25360 * 8;
        _objptr = _objptr + D.25361;
        D.25362 = _index + 1;
        _bmap = _bmap >> D.25362;
        D.25363 = *_objptr;
        if (D.25363 != 0B) goto <D.25364>; else goto <D.25365>;
        <D.25364>:
        D.25329 = hwi->count;
        if (D.25329 == 128) goto <D.25366>; else goto <D.25367>;
        <D.25366>:
        D.25332 = hwi->callback;
        D.25333 = hwi->data;
        D.25334 = &hwi->offsets;
        D.25335 = &hwi->refs;
        D.25329 = hwi->count;
        D.25336 = (long unsigned int) D.25329;
        D.25338 = hwi->called;
        if (D.25338 == 0) goto <D.25369>; else goto <D.25370>;
        <D.25369>:
        iftmp.366 = size;
        goto <D.25371>;
        <D.25370>:
        iftmp.366 = 0;
        <D.25371>:
        D.25342 = MEM[(struct MonoObject *)start].vtable;
        D.25343 = D.25342->klass;
        D.25332 (start, D.25343, iftmp.366, D.25336, D.25335, D.25334, D.25333);
        hwi->count = 0;
        hwi->called = 1;
        <D.25367>:
        D.25329 = hwi->count;
        _objptr.367 = (long int) _objptr;
        start.364 = (long int) start;
        D.25373 = _objptr.367 - start.364;
        D.25374 = (long unsigned int) D.25373;
        hwi->offsets[D.25329] = D.25374;
        D.25329 = hwi->count;
        D.25375 = D.25329;
        D.25376 = D.25375 + 1;
        hwi->count = D.25376;
        D.25363 = *_objptr;
        hwi->refs[D.25375] = D.25363;
        <D.25365>:
        _objptr = _objptr + 8;
      }
      goto <D.21416>;
      <D.21415>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.25377 = (long unsigned int) _index;
        D.25378 = D.25377 * 8;
        _objptr = _objptr + D.25378;
        D.25379 = _index + 1;
        _bmap = _bmap >> D.25379;
        D.25363 = *_objptr;
        if (D.25363 != 0B) goto <D.25380>; else goto <D.25381>;
        <D.25380>:
        D.25329 = hwi->count;
        if (D.25329 == 128) goto <D.25382>; else goto <D.25383>;
        <D.25382>:
        D.25332 = hwi->callback;
        D.25333 = hwi->data;
        D.25334 = &hwi->offsets;
        D.25335 = &hwi->refs;
        D.25329 = hwi->count;
        D.25336 = (long unsigned int) D.25329;
        D.25338 = hwi->called;
        if (D.25338 == 0) goto <D.25385>; else goto <D.25386>;
        <D.25385>:
        iftmp.368 = size;
        goto <D.25387>;
        <D.25386>:
        iftmp.368 = 0;
        <D.25387>:
        D.25342 = MEM[(struct MonoObject *)start].vtable;
        D.25343 = D.25342->klass;
        D.25332 (start, D.25343, iftmp.368, D.25336, D.25335, D.25334, D.25333);
        hwi->count = 0;
        hwi->called = 1;
        <D.25383>:
        D.25329 = hwi->count;
        _objptr.367 = (long int) _objptr;
        start.364 = (long int) start;
        D.25373 = _objptr.367 - start.364;
        D.25374 = (long unsigned int) D.25373;
        hwi->offsets[D.25329] = D.25374;
        D.25329 = hwi->count;
        D.25388 = D.25329;
        D.25389 = D.25388 + 1;
        hwi->count = D.25389;
        D.25363 = *_objptr;
        hwi->refs[D.25388] = D.25363;
        <D.25381>:
        _objptr = _objptr + 8;
      }
      <D.21416>:
      if (_bmap != 0) goto <D.21415>; else goto <D.21417>;
      <D.21417>:
    }
    goto <D.21409>;
    <D.21418>:
    D.25390 = desc & 4294950912;
    if (D.25390 != 0) goto <D.25391>; else goto <D.25392>;
    <D.25391>:
    {
      int el_size;
      int etype;

      D.25393 = desc >> 3;
      D.25394 = (int) D.25393;
      el_size = D.25394 & 1023;
      D.25395 = (int) desc;
      etype = D.25395 & 49152;
      if (etype == 16384) goto <D.25396>; else goto <D.25397>;
      <D.25396>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.25398 = MEM[(struct MonoArray *)start].max_length;
        el_size.369 = (unsigned int) el_size;
        D.25400 = D.25398 * el_size.369;
        D.25401 = (sizetype) D.25400;
        end_refs = p + D.25401;
        goto <D.21424>;
        <D.21423>:
        D.25402 = *p;
        if (D.25402 != 0B) goto <D.25403>; else goto <D.25404>;
        <D.25403>:
        D.25329 = hwi->count;
        if (D.25329 == 128) goto <D.25405>; else goto <D.25406>;
        <D.25405>:
        D.25332 = hwi->callback;
        D.25333 = hwi->data;
        D.25334 = &hwi->offsets;
        D.25335 = &hwi->refs;
        D.25329 = hwi->count;
        D.25336 = (long unsigned int) D.25329;
        D.25338 = hwi->called;
        if (D.25338 == 0) goto <D.25408>; else goto <D.25409>;
        <D.25408>:
        iftmp.370 = size;
        goto <D.25410>;
        <D.25409>:
        iftmp.370 = 0;
        <D.25410>:
        D.25342 = MEM[(struct MonoObject *)start].vtable;
        D.25343 = D.25342->klass;
        D.25332 (start, D.25343, iftmp.370, D.25336, D.25335, D.25334, D.25333);
        hwi->count = 0;
        hwi->called = 1;
        <D.25406>:
        D.25329 = hwi->count;
        p.371 = (long int) p;
        start.364 = (long int) start;
        D.25412 = p.371 - start.364;
        D.25413 = (long unsigned int) D.25412;
        hwi->offsets[D.25329] = D.25413;
        D.25329 = hwi->count;
        D.25414 = D.25329;
        D.25415 = D.25414 + 1;
        hwi->count = D.25415;
        D.25402 = *p;
        hwi->refs[D.25414] = D.25402;
        <D.25404>:
        p = p + 8;
        <D.21424>:
        if (p < end_refs) goto <D.21423>; else goto <D.21425>;
        <D.21425>:
      }
      goto <D.25416>;
      <D.25397>:
      if (etype == 32768) goto <D.25417>; else goto <D.25418>;
      <D.25417>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.25320 = desc >> 16;
        D.25419 = (int) D.25320;
        offset = D.25419 & 255;
        D.25323 = desc >> 24;
        D.25420 = (int) D.25323;
        num_refs = D.25420 & 255;
        e_start = start + 32;
        D.25398 = MEM[(struct MonoArray *)start].max_length;
        el_size.369 = (unsigned int) el_size;
        D.25400 = D.25398 * el_size.369;
        D.25401 = (sizetype) D.25400;
        e_end = e_start + D.25401;
        goto <D.21436>;
        <D.21435>:
        {
          void * * p;
          int i;

          p = e_start;
          D.25421 = (long unsigned int) offset;
          D.25422 = D.25421 * 8;
          p = p + D.25422;
          i = 0;
          goto <D.21433>;
          <D.21432>:
          D.25423 = (long unsigned int) i;
          D.25424 = D.25423 * 8;
          D.25425 = p + D.25424;
          D.25426 = *D.25425;
          if (D.25426 != 0B) goto <D.25427>; else goto <D.25428>;
          <D.25427>:
          D.25329 = hwi->count;
          if (D.25329 == 128) goto <D.25429>; else goto <D.25430>;
          <D.25429>:
          D.25332 = hwi->callback;
          D.25333 = hwi->data;
          D.25334 = &hwi->offsets;
          D.25335 = &hwi->refs;
          D.25329 = hwi->count;
          D.25336 = (long unsigned int) D.25329;
          D.25338 = hwi->called;
          if (D.25338 == 0) goto <D.25432>; else goto <D.25433>;
          <D.25432>:
          iftmp.372 = size;
          goto <D.25434>;
          <D.25433>:
          iftmp.372 = 0;
          <D.25434>:
          D.25342 = MEM[(struct MonoObject *)start].vtable;
          D.25343 = D.25342->klass;
          D.25332 (start, D.25343, iftmp.372, D.25336, D.25335, D.25334, D.25333);
          hwi->count = 0;
          hwi->called = 1;
          <D.25430>:
          D.25329 = hwi->count;
          D.25423 = (long unsigned int) i;
          D.25424 = D.25423 * 8;
          D.25435 = p + D.25424;
          D.25436 = (long int) D.25435;
          start.364 = (long int) start;
          D.25437 = D.25436 - start.364;
          D.25438 = (long unsigned int) D.25437;
          hwi->offsets[D.25329] = D.25438;
          D.25329 = hwi->count;
          D.25439 = D.25329;
          D.25440 = D.25439 + 1;
          hwi->count = D.25440;
          D.25423 = (long unsigned int) i;
          D.25424 = D.25423 * 8;
          D.25425 = p + D.25424;
          D.25426 = *D.25425;
          hwi->refs[D.25439] = D.25426;
          <D.25428>:
          i = i + 1;
          <D.21433>:
          if (i < num_refs) goto <D.21432>; else goto <D.21434>;
          <D.21434>:
          D.25441 = (sizetype) el_size;
          e_start = e_start + D.25441;
        }
        <D.21436>:
        if (e_start < e_end) goto <D.21435>; else goto <D.21437>;
        <D.21437>:
      }
      goto <D.25442>;
      <D.25418>:
      if (etype == 49152) goto <D.25443>; else goto <D.25444>;
      <D.25443>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.25398 = MEM[(struct MonoArray *)start].max_length;
        el_size.369 = (unsigned int) el_size;
        D.25400 = D.25398 * el_size.369;
        D.25401 = (sizetype) D.25400;
        e_end = e_start + D.25401;
        goto <D.21446>;
        <D.21445>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.21443>;
          <D.21442>:
          D.25445 = _bmap & 1;
          if (D.25445 != 0) goto <D.25446>; else goto <D.25447>;
          <D.25446>:
          D.25448 = *p;
          if (D.25448 != 0B) goto <D.25449>; else goto <D.25450>;
          <D.25449>:
          D.25329 = hwi->count;
          if (D.25329 == 128) goto <D.25451>; else goto <D.25452>;
          <D.25451>:
          D.25332 = hwi->callback;
          D.25333 = hwi->data;
          D.25334 = &hwi->offsets;
          D.25335 = &hwi->refs;
          D.25329 = hwi->count;
          D.25336 = (long unsigned int) D.25329;
          D.25338 = hwi->called;
          if (D.25338 == 0) goto <D.25454>; else goto <D.25455>;
          <D.25454>:
          iftmp.373 = size;
          goto <D.25456>;
          <D.25455>:
          iftmp.373 = 0;
          <D.25456>:
          D.25342 = MEM[(struct MonoObject *)start].vtable;
          D.25343 = D.25342->klass;
          D.25332 (start, D.25343, iftmp.373, D.25336, D.25335, D.25334, D.25333);
          hwi->count = 0;
          hwi->called = 1;
          <D.25452>:
          D.25329 = hwi->count;
          p.374 = (long int) p;
          start.364 = (long int) start;
          D.25458 = p.374 - start.364;
          D.25459 = (long unsigned int) D.25458;
          hwi->offsets[D.25329] = D.25459;
          D.25329 = hwi->count;
          D.25460 = D.25329;
          D.25461 = D.25460 + 1;
          hwi->count = D.25461;
          D.25448 = *p;
          hwi->refs[D.25460] = D.25448;
          <D.25450>:
          <D.25447>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.21443>:
          if (_bmap != 0) goto <D.21442>; else goto <D.21444>;
          <D.21444>:
          D.25441 = (sizetype) el_size;
          e_start = e_start + D.25441;
        }
        <D.21446>:
        if (e_start < e_end) goto <D.21445>; else goto <D.21447>;
        <D.21447>:
      }
      <D.25444>:
      <D.25442>:
      <D.25416>:
    }
    <D.25392>:
    goto <D.21409>;
    <D.21448>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.21452>;
      <D.21451>:
      D.25462 = _bmap & 1;
      if (D.25462 != 0) goto <D.25463>; else goto <D.25464>;
      <D.25463>:
      D.25465 = *_objptr;
      if (D.25465 != 0B) goto <D.25466>; else goto <D.25467>;
      <D.25466>:
      D.25329 = hwi->count;
      if (D.25329 == 128) goto <D.25468>; else goto <D.25469>;
      <D.25468>:
      D.25332 = hwi->callback;
      D.25333 = hwi->data;
      D.25334 = &hwi->offsets;
      D.25335 = &hwi->refs;
      D.25329 = hwi->count;
      D.25336 = (long unsigned int) D.25329;
      D.25338 = hwi->called;
      if (D.25338 == 0) goto <D.25471>; else goto <D.25472>;
      <D.25471>:
      iftmp.375 = size;
      goto <D.25473>;
      <D.25472>:
      iftmp.375 = 0;
      <D.25473>:
      D.25342 = MEM[(struct MonoObject *)start].vtable;
      D.25343 = D.25342->klass;
      D.25332 (start, D.25343, iftmp.375, D.25336, D.25335, D.25334, D.25333);
      hwi->count = 0;
      hwi->called = 1;
      <D.25469>:
      D.25329 = hwi->count;
      _objptr.376 = (long int) _objptr;
      start.364 = (long int) start;
      D.25475 = _objptr.376 - start.364;
      D.25476 = (long unsigned int) D.25475;
      hwi->offsets[D.25329] = D.25476;
      D.25329 = hwi->count;
      D.25477 = D.25329;
      D.25478 = D.25477 + 1;
      hwi->count = D.25478;
      D.25465 = *_objptr;
      hwi->refs[D.25477] = D.25465;
      <D.25467>:
      <D.25464>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.21452>:
      if (_bmap != 0) goto <D.21451>; else goto <D.21453>;
      <D.21453>:
    }
    goto <D.21409>;
    <D.21454>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.25479 = *bitmap_data;
      D.25480 = (unsigned int) D.25479;
      D.25481 = D.25480 + 4294967295;
      bwords = (int) D.25481;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.25482>; else goto <D.25483>;
      <D.25482>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.25484 = myobj->vtable;
        D.25485 = D.25484->klass;
        D.25486 = D.25485->name;
        D.25484 = myobj->vtable;
        D.25485 = D.25484->klass;
        D.25487 = D.25485->name_space;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.25487, D.25486);
      }
      <D.25483>:
      goto <D.21465>;
      <D.21464>:
      {
        gsize _bmap;

        bitmap_data.377 = bitmap_data;
        bitmap_data = bitmap_data.377 + 8;
        _bmap = *bitmap_data.377;
        _objptr = start_run;
        goto <D.21462>;
        <D.21461>:
        D.25489 = _bmap & 1;
        if (D.25489 != 0) goto <D.25490>; else goto <D.25491>;
        <D.25490>:
        D.25492 = *_objptr;
        if (D.25492 != 0B) goto <D.25493>; else goto <D.25494>;
        <D.25493>:
        D.25329 = hwi->count;
        if (D.25329 == 128) goto <D.25495>; else goto <D.25496>;
        <D.25495>:
        D.25332 = hwi->callback;
        D.25333 = hwi->data;
        D.25334 = &hwi->offsets;
        D.25335 = &hwi->refs;
        D.25329 = hwi->count;
        D.25336 = (long unsigned int) D.25329;
        D.25338 = hwi->called;
        if (D.25338 == 0) goto <D.25498>; else goto <D.25499>;
        <D.25498>:
        iftmp.378 = size;
        goto <D.25500>;
        <D.25499>:
        iftmp.378 = 0;
        <D.25500>:
        D.25342 = MEM[(struct MonoObject *)start].vtable;
        D.25343 = D.25342->klass;
        D.25332 (start, D.25343, iftmp.378, D.25336, D.25335, D.25334, D.25333);
        hwi->count = 0;
        hwi->called = 1;
        <D.25496>:
        D.25329 = hwi->count;
        _objptr.379 = (long int) _objptr;
        start.364 = (long int) start;
        D.25502 = _objptr.379 - start.364;
        D.25503 = (long unsigned int) D.25502;
        hwi->offsets[D.25329] = D.25503;
        D.25329 = hwi->count;
        D.25504 = D.25329;
        D.25505 = D.25504 + 1;
        hwi->count = D.25505;
        D.25492 = *_objptr;
        hwi->refs[D.25504] = D.25492;
        <D.25494>:
        <D.25491>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.21462>:
        if (_bmap != 0) goto <D.21461>; else goto <D.21463>;
        <D.21463>:
        start_run = start_run + 512;
      }
      <D.21465>:
      bwords.380 = bwords;
      bwords = bwords.380 + -1;
      if (bwords.380 > 0) goto <D.21464>; else goto <D.21466>;
      <D.21466>:
    }
    goto <D.21409>;
    <D.21467>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.25507 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.25507);
      mbitmap_data.381 = mbitmap_data;
      mbitmap_data = mbitmap_data.381 + 8;
      D.25509 = *mbitmap_data.381;
      D.25510 = (unsigned int) D.25509;
      D.25511 = D.25510 + 4294967295;
      mbwords = (int) D.25511;
      D.25512 = vt->klass;
      el_size = mono_array_element_size (D.25512);
      e_start = start + 32;
      D.25398 = MEM[(struct MonoArray *)start].max_length;
      el_size.382 = (unsigned int) el_size;
      D.25514 = D.25398 * el_size.382;
      D.25515 = (sizetype) D.25514;
      e_end = e_start + D.25515;
      if (0 != 0) goto <D.25516>; else goto <D.25517>;
      <D.25516>:
      D.25512 = vt->klass;
      D.25518 = D.25512->name;
      D.25512 = vt->klass;
      D.25519 = D.25512->name_space;
      D.25507 = vt->desc;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.25507, D.25519, D.25518);
      <D.25517>:
      goto <D.21485>;
      <D.21484>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.383 = bitmap_data;
          bitmap_data = bitmap_data.383 + 8;
          _bmap = *bitmap_data.383;
          start_run = _objptr;
          goto <D.21479>;
          <D.21478>:
          D.25521 = _bmap & 1;
          if (D.25521 != 0) goto <D.25522>; else goto <D.25523>;
          <D.25522>:
          D.25524 = *_objptr;
          if (D.25524 != 0B) goto <D.25525>; else goto <D.25526>;
          <D.25525>:
          D.25329 = hwi->count;
          if (D.25329 == 128) goto <D.25527>; else goto <D.25528>;
          <D.25527>:
          D.25332 = hwi->callback;
          D.25333 = hwi->data;
          D.25334 = &hwi->offsets;
          D.25335 = &hwi->refs;
          D.25329 = hwi->count;
          D.25336 = (long unsigned int) D.25329;
          D.25338 = hwi->called;
          if (D.25338 == 0) goto <D.25530>; else goto <D.25531>;
          <D.25530>:
          iftmp.384 = size;
          goto <D.25532>;
          <D.25531>:
          iftmp.384 = 0;
          <D.25532>:
          D.25342 = MEM[(struct MonoObject *)start].vtable;
          D.25343 = D.25342->klass;
          D.25332 (start, D.25343, iftmp.384, D.25336, D.25335, D.25334, D.25333);
          hwi->count = 0;
          hwi->called = 1;
          <D.25528>:
          D.25329 = hwi->count;
          _objptr.385 = (long int) _objptr;
          start.364 = (long int) start;
          D.25534 = _objptr.385 - start.364;
          D.25535 = (long unsigned int) D.25534;
          hwi->offsets[D.25329] = D.25535;
          D.25329 = hwi->count;
          D.25536 = D.25329;
          D.25537 = D.25536 + 1;
          hwi->count = D.25537;
          D.25524 = *_objptr;
          hwi->refs[D.25536] = D.25524;
          <D.25526>:
          <D.25523>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.21479>:
          if (_bmap != 0) goto <D.21478>; else goto <D.21480>;
          <D.21480>:
          _objptr = start_run + 512;
        }
        <D.21482>:
        bwords.386 = bwords;
        bwords = bwords.386 + 4294967295;
        if (bwords.386 != 0) goto <D.21481>; else goto <D.21483>;
        <D.21483>:
        D.25539 = (sizetype) el_size;
        e_start = e_start + D.25539;
      }
      <D.21485>:
      if (e_start < e_end) goto <D.21484>; else goto <D.21486>;
      <D.21486>:
    }
    goto <D.21409>;
    <D.21487>:
    goto <D.21409>;
    <D.21488>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.21409>:
  }
}


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


mono_gc_max_generation ()
{
  int D.25543;

  D.25543 = 1;
  return D.25543;
}


mono_gc_collection_count (int generation)
{
  int D.25547;

  if (generation == 0) goto <D.25545>; else goto <D.25546>;
  <D.25545>:
  D.25547 = stat_minor_gcs;
  return D.25547;
  <D.25546>:
  D.25547 = stat_major_gcs;
  return D.25547;
}


mono_gc_get_used_size ()
{
  long unsigned int los_memory_usage.387;
  struct GCMemSection * nursery_section.388;
  char * D.25551;
  long int D.25552;
  char * D.25553;
  long int D.25554;
  long int D.25555;
  gint64 (*<T2d11>) (void) D.25556;
  long int D.25557;
  int64_t D.25558;
  gint64 tot;

  tot = 0;
  pthread_mutex_lock (&gc_mutex);
  los_memory_usage.387 = los_memory_usage;
  tot = (gint64) los_memory_usage.387;
  nursery_section.388 = nursery_section;
  D.25551 = nursery_section.388->next_data;
  D.25552 = (long int) D.25551;
  nursery_section.388 = nursery_section;
  D.25553 = nursery_section.388->data;
  D.25554 = (long int) D.25553;
  D.25555 = D.25552 - D.25554;
  tot = D.25555 + tot;
  D.25556 = major_collector.get_used_size;
  D.25557 = D.25556 ();
  tot = D.25557 + tot;
  sgen_gc_unlock ();
  D.25558 = tot;
  return D.25558;
}


mono_gc_get_los_limit ()
{
  int D.25560;

  D.25560 = 8000;
  return D.25560;
}


mono_gc_user_markers_supported ()
{
  gboolean D.25562;

  D.25562 = 1;
  return D.25562;
}


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

  D.25564 = 1;
  return D.25564;
}


mono_gc_get_generation (struct MonoObject * obj)
{
  int D.25566;
  int D.25569;

  D.25566 = sgen_ptr_in_nursery (obj);
  if (D.25566 != 0) goto <D.25567>; else goto <D.25568>;
  <D.25567>:
  D.25569 = 0;
  return D.25569;
  <D.25568>:
  D.25569 = 1;
  return D.25569;
}


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.389;
  long unsigned int D.25574;
  long unsigned int D.25575;
  struct MonoObject * D.25577;
  int bridge_processing_in_progress.390;
  _Bool D.25579;
  long int D.25580;
  long int D.25581;
  void * D.25584;
  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.25571>; else goto <D.25572>;
  <D.25571>:
  ptr.389 = (long unsigned int) ptr;
  D.25574 = ~ptr.389;
  D.25575 = D.25574 & 18446744073709551612;
  obj = (struct MonoObject *) D.25575;
  goto <D.25576>;
  <D.25572>:
  D.25577 = 0B;
  return D.25577;
  <D.25576>:
  mono_memory_barrier ();
  bridge_processing_in_progress.390 = bridge_processing_in_progress;
  D.25579 = bridge_processing_in_progress.390 != 0;
  D.25580 = (long int) D.25579;
  D.25581 = __builtin_expect (D.25580, 0);
  if (D.25581 != 0) goto <D.25582>; else goto <D.25583>;
  <D.25582>:
  mono_gc_wait_for_bridge_processing ();
  <D.25583>:
  D.25584 = *link_addr_volatile;
  if (D.25584 != ptr) goto retry; else goto <D.25585>;
  <D.25585>:
  D.25577 = obj;
  return D.25577;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


mono_gc_ephemeron_array_add (struct MonoObject * obj)
{
  gboolean D.25589;
  struct EphemeronLinkNode * ephemeron_list.391;
  struct FILE * gc_debug_file.392;
  struct EphemeronLinkNode * node;

  pthread_mutex_lock (&gc_mutex);
  node = sgen_alloc_internal (18);
  if (node == 0B) goto <D.25587>; else goto <D.25588>;
  <D.25587>:
  sgen_gc_unlock ();
  D.25589 = 0;
  return D.25589;
  <D.25588>:
  node->array = obj;
  ephemeron_list.391 = ephemeron_list;
  node->next = ephemeron_list.391;
  ephemeron_list = node;
  if (0 != 0) goto <D.25591>; else goto <D.25592>;
  <D.25591>:
  gc_debug_file.392 = gc_debug_file;
  fprintf (gc_debug_file.392, "Registered ephemeron array %p\n", obj);
  gc_debug_file.392 = gc_debug_file;
  fflush (gc_debug_file.392);
  <D.25592>:
  sgen_gc_unlock ();
  D.25589 = 1;
  return D.25589;
}


mono_gc_set_allow_synchronous_major (gboolean flag)
{
  int D.25595;
  gboolean D.25598;

  D.25595 = major_collector.is_concurrent;
  if (D.25595 == 0) goto <D.25596>; else goto <D.25597>;
  <D.25596>:
  D.25598 = flag;
  return D.25598;
  <D.25597>:
  allow_synchronous_major = flag;
  D.25598 = 1;
  return D.25598;
}


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

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


mono_gc_is_gc_thread ()
{
  struct SgenThreadInfo * D.25602;
  _Bool D.25603;
  gboolean D.25604;
  gboolean result;

  pthread_mutex_lock (&gc_mutex);
  D.25602 = mono_thread_info_current ();
  D.25603 = D.25602 != 0B;
  result = (gboolean) D.25603;
  sgen_gc_unlock ();
  D.25604 = result;
  return D.25604;
}


sgen_env_var_error (const char * env_var, const char * fallback, const char * description_format)
{
  struct _IO_FILE * stderr.393;
  struct  ap[1];

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


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

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


mono_gc_base_init ()
{
  int D.25611;
  long unsigned int pagesize.394;
  struct _IO_FILE * stderr.395;
  int D.25616;
  char * D.25619;
  int D.25621;
  char * D.25624;
  char * D.25625;
  int D.21620;
  int iftmp.396;
  int D.21619;
  const char[7] * D.25633;
  unsigned char D.25634;
  int D.25635;
  unsigned char D.25636;
  int D.25637;
  _Bool D.25638;
  _Bool D.25639;
  _Bool D.25640;
  const unsigned char * D.25643;
  unsigned char D.25644;
  int D.25645;
  const unsigned char * D.25646;
  unsigned char D.25647;
  int D.25648;
  _Bool D.25649;
  _Bool D.25650;
  const unsigned char * D.25653;
  unsigned char D.25654;
  int D.25655;
  const unsigned char * D.25656;
  unsigned char D.25657;
  int D.25658;
  _Bool D.25659;
  _Bool D.25660;
  const unsigned char * D.25663;
  unsigned char D.25664;
  int D.25665;
  const unsigned char * D.25666;
  unsigned char D.25667;
  int D.25668;
  int D.21630;
  int iftmp.397;
  int D.21629;
  const char[6] * D.25676;
  unsigned char D.25677;
  int D.25678;
  unsigned char D.25679;
  int D.25680;
  _Bool D.25681;
  _Bool D.25682;
  _Bool D.25683;
  const unsigned char * D.25686;
  unsigned char D.25687;
  int D.25688;
  const unsigned char * D.25689;
  unsigned char D.25690;
  int D.25691;
  _Bool D.25692;
  _Bool D.25693;
  const unsigned char * D.25696;
  unsigned char D.25697;
  int D.25698;
  const unsigned char * D.25699;
  unsigned char D.25700;
  int D.25701;
  _Bool D.25702;
  _Bool D.25703;
  const unsigned char * D.25706;
  unsigned char D.25707;
  int D.25708;
  const unsigned char * D.25709;
  unsigned char D.25710;
  int D.25711;
  int D.21639;
  int iftmp.398;
  int D.21638;
  const char[10] * D.25723;
  unsigned char D.25724;
  int D.25725;
  unsigned char D.25726;
  int D.25727;
  _Bool D.25728;
  _Bool D.25729;
  _Bool D.25730;
  const unsigned char * D.25733;
  unsigned char D.25734;
  int D.25735;
  const unsigned char * D.25736;
  unsigned char D.25737;
  int D.25738;
  _Bool D.25739;
  _Bool D.25740;
  const unsigned char * D.25743;
  unsigned char D.25744;
  int D.25745;
  const unsigned char * D.25746;
  unsigned char D.25747;
  int D.25748;
  _Bool D.25749;
  _Bool D.25750;
  const unsigned char * D.25753;
  unsigned char D.25754;
  int D.25755;
  const unsigned char * D.25756;
  unsigned char D.25757;
  int D.25758;
  int D.21649;
  int iftmp.399;
  int D.21648;
  const char[16] * D.25767;
  unsigned char D.25768;
  int D.25769;
  unsigned char D.25770;
  int D.25771;
  _Bool D.25772;
  _Bool D.25773;
  _Bool D.25774;
  const unsigned char * D.25777;
  unsigned char D.25778;
  int D.25779;
  const unsigned char * D.25780;
  unsigned char D.25781;
  int D.25782;
  _Bool D.25783;
  _Bool D.25784;
  const unsigned char * D.25787;
  unsigned char D.25788;
  int D.25789;
  const unsigned char * D.25790;
  unsigned char D.25791;
  int D.25792;
  _Bool D.25793;
  _Bool D.25794;
  const unsigned char * D.25797;
  unsigned char D.25798;
  int D.25799;
  const unsigned char * D.25800;
  unsigned char D.25801;
  int D.25802;
  int D.21658;
  int iftmp.400;
  int D.21657;
  const char[14] * D.25811;
  unsigned char D.25812;
  int D.25813;
  unsigned char D.25814;
  int D.25815;
  _Bool D.25816;
  _Bool D.25817;
  _Bool D.25818;
  const unsigned char * D.25821;
  unsigned char D.25822;
  int D.25823;
  const unsigned char * D.25824;
  unsigned char D.25825;
  int D.25826;
  _Bool D.25827;
  _Bool D.25828;
  const unsigned char * D.25831;
  unsigned char D.25832;
  int D.25833;
  const unsigned char * D.25834;
  unsigned char D.25835;
  int D.25836;
  _Bool D.25837;
  _Bool D.25838;
  const unsigned char * D.25841;
  unsigned char D.25842;
  int D.25843;
  const unsigned char * D.25844;
  unsigned char D.25845;
  int D.25846;
  int D.21667;
  int iftmp.401;
  int D.21666;
  const char[20] * D.25855;
  unsigned char D.25856;
  int D.25857;
  unsigned char D.25858;
  int D.25859;
  _Bool D.25860;
  _Bool D.25861;
  _Bool D.25862;
  const unsigned char * D.25865;
  unsigned char D.25866;
  int D.25867;
  const unsigned char * D.25868;
  unsigned char D.25869;
  int D.25870;
  _Bool D.25871;
  _Bool D.25872;
  const unsigned char * D.25875;
  unsigned char D.25876;
  int D.25877;
  const unsigned char * D.25878;
  unsigned char D.25879;
  int D.25880;
  _Bool D.25881;
  _Bool D.25882;
  const unsigned char * D.25885;
  unsigned char D.25886;
  int D.25887;
  const unsigned char * D.25888;
  unsigned char D.25889;
  int D.25890;
  int D.21676;
  int iftmp.402;
  int D.21675;
  const char[15] * D.25899;
  unsigned char D.25900;
  int D.25901;
  unsigned char D.25902;
  int D.25903;
  _Bool D.25904;
  _Bool D.25905;
  _Bool D.25906;
  const unsigned char * D.25909;
  unsigned char D.25910;
  int D.25911;
  const unsigned char * D.25912;
  unsigned char D.25913;
  int D.25914;
  _Bool D.25915;
  _Bool D.25916;
  const unsigned char * D.25919;
  unsigned char D.25920;
  int D.25921;
  const unsigned char * D.25922;
  unsigned char D.25923;
  int D.25924;
  _Bool D.25925;
  _Bool D.25926;
  const unsigned char * D.25929;
  unsigned char D.25930;
  int D.25931;
  const unsigned char * D.25932;
  unsigned char D.25933;
  int D.25934;
  int D.25938;
  _Bool D.25941;
  long int D.25942;
  long int D.25943;
  int sgen_nursery_size.403;
  int D.21687;
  int iftmp.404;
  int D.21686;
  const char[1] * D.25954;
  unsigned char D.25955;
  int D.25956;
  unsigned char D.25957;
  int D.25958;
  _Bool D.25959;
  _Bool D.25960;
  _Bool D.25961;
  const unsigned char * D.25964;
  unsigned char D.25965;
  int D.25966;
  const unsigned char * D.25967;
  unsigned char D.25968;
  int D.25969;
  _Bool D.25970;
  _Bool D.25971;
  const unsigned char * D.25974;
  unsigned char D.25975;
  int D.25976;
  const unsigned char * D.25977;
  unsigned char D.25978;
  int D.25979;
  _Bool D.25980;
  _Bool D.25981;
  const unsigned char * D.25984;
  unsigned char D.25985;
  int D.25986;
  const unsigned char * D.25987;
  unsigned char D.25988;
  int D.25989;
  unsigned char D.25991;
  int D.25994;
  int D.25997;
  int D.26000;
  char * D.26003;
  char D.26006;
  int D.26008;
  int D.26010;
  long int D.26011;
  long int max_heap_candidate.405;
  long int D.26013;
  long int D.26014;
  int D.26015;
  int D.26016;
  long int D.26017;
  long int D.26018;
  int D.26021;
  int D.26022;
  char * D.26025;
  int D.26029;
  long int soft_limit.406;
  int D.26034;
  char * D.26039;
  char * endptr.407;
  char D.26044;
  unsigned long val.408;
  unsigned long D.26046;
  int D.26049;
  char * D.26052;
  int D.21700;
  int iftmp.409;
  int D.21699;
  const char[8] * D.26056;
  unsigned char D.26057;
  int D.26058;
  unsigned char D.26059;
  int D.26060;
  _Bool D.26061;
  _Bool D.26062;
  _Bool D.26063;
  const unsigned char * D.26066;
  unsigned char D.26067;
  int D.26068;
  const unsigned char * D.26069;
  unsigned char D.26070;
  int D.26071;
  _Bool D.26072;
  _Bool D.26073;
  const unsigned char * D.26076;
  unsigned char D.26077;
  int D.26078;
  const unsigned char * D.26079;
  unsigned char D.26080;
  int D.26081;
  _Bool D.26082;
  _Bool D.26083;
  const unsigned char * D.26086;
  unsigned char D.26087;
  int D.26088;
  const unsigned char * D.26089;
  unsigned char D.26090;
  int D.26091;
  int D.21709;
  int iftmp.410;
  int D.21708;
  const char[13] * D.26099;
  unsigned char D.26100;
  int D.26101;
  unsigned char D.26102;
  int D.26103;
  _Bool D.26104;
  _Bool D.26105;
  _Bool D.26106;
  const unsigned char * D.26109;
  unsigned char D.26110;
  int D.26111;
  const unsigned char * D.26112;
  unsigned char D.26113;
  int D.26114;
  _Bool D.26115;
  _Bool D.26116;
  const unsigned char * D.26119;
  unsigned char D.26120;
  int D.26121;
  const unsigned char * D.26122;
  unsigned char D.26123;
  int D.26124;
  _Bool D.26125;
  _Bool D.26126;
  const unsigned char * D.26129;
  unsigned char D.26130;
  int D.26131;
  const unsigned char * D.26132;
  unsigned char D.26133;
  int D.26134;
  const char * iftmp.411;
  int conservative_stack_mark.412;
  int D.26144;
  char * D.26147;
  gchar * D.26148;
  int D.26149;
  char * D.26152;
  int D.26156;
  long int val.413;
  long int D.26159;
  long int D.26160;
  int sgen_nursery_size.414;
  int sgen_nursery_bits.415;
  int sgen_nursery_bits.416;
  int D.26168;
  int D.26169;
  char * D.26172;
  int D.26173;
  int D.26176;
  char * D.26179;
  int D.26180;
  int D.26183;
  int D.26186;
  char * D.26189;
  int D.21724;
  int iftmp.417;
  int D.21723;
  const char[4] * D.26193;
  unsigned char D.26194;
  int D.26195;
  unsigned char D.26196;
  int D.26197;
  _Bool D.26198;
  _Bool D.26199;
  _Bool D.26200;
  const unsigned char * D.26203;
  unsigned char D.26204;
  int D.26205;
  const unsigned char * D.26206;
  unsigned char D.26207;
  int D.26208;
  _Bool D.26209;
  _Bool D.26210;
  const unsigned char * D.26213;
  unsigned char D.26214;
  int D.26215;
  const unsigned char * D.26216;
  unsigned char D.26217;
  int D.26218;
  _Bool D.26219;
  _Bool D.26220;
  const unsigned char * D.26223;
  unsigned char D.26224;
  int D.26225;
  const unsigned char * D.26226;
  unsigned char D.26227;
  int D.26228;
  int D.21733;
  int iftmp.418;
  int D.21732;
  const char[3] * D.26236;
  unsigned char D.26237;
  int D.26238;
  unsigned char D.26239;
  int D.26240;
  _Bool D.26241;
  _Bool D.26242;
  _Bool D.26243;
  const unsigned char * D.26246;
  unsigned char D.26247;
  int D.26248;
  const unsigned char * D.26249;
  unsigned char D.26250;
  int D.26251;
  _Bool D.26252;
  _Bool D.26253;
  const unsigned char * D.26256;
  unsigned char D.26257;
  int D.26258;
  const unsigned char * D.26259;
  unsigned char D.26260;
  int D.26261;
  _Bool D.26262;
  _Bool D.26263;
  const unsigned char * D.26266;
  unsigned char D.26267;
  int D.26268;
  const unsigned char * D.26269;
  unsigned char D.26270;
  int D.26271;
  int D.21742;
  int iftmp.419;
  int D.21741;
  const char[10] * D.26279;
  unsigned char D.26280;
  int D.26281;
  unsigned char D.26282;
  int D.26283;
  _Bool D.26284;
  _Bool D.26285;
  _Bool D.26286;
  const unsigned char * D.26289;
  unsigned char D.26290;
  int D.26291;
  const unsigned char * D.26292;
  unsigned char D.26293;
  int D.26294;
  _Bool D.26295;
  _Bool D.26296;
  const unsigned char * D.26299;
  unsigned char D.26300;
  int D.26301;
  const unsigned char * D.26302;
  unsigned char D.26303;
  int D.26304;
  _Bool D.26305;
  _Bool D.26306;
  const unsigned char * D.26309;
  unsigned char D.26310;
  int D.26311;
  const unsigned char * D.26312;
  unsigned char D.26313;
  int D.26314;
  int D.21751;
  int iftmp.420;
  int D.21750;
  const char[13] * D.26323;
  unsigned char D.26324;
  int D.26325;
  unsigned char D.26326;
  int D.26327;
  _Bool D.26328;
  _Bool D.26329;
  _Bool D.26330;
  const unsigned char * D.26333;
  unsigned char D.26334;
  int D.26335;
  const unsigned char * D.26336;
  unsigned char D.26337;
  int D.26338;
  _Bool D.26339;
  _Bool D.26340;
  const unsigned char * D.26343;
  unsigned char D.26344;
  int D.26345;
  const unsigned char * D.26346;
  unsigned char D.26347;
  int D.26348;
  _Bool D.26349;
  _Bool D.26350;
  const unsigned char * D.26353;
  unsigned char D.26354;
  int D.26355;
  const unsigned char * D.26356;
  unsigned char D.26357;
  int D.26358;
  gboolean (*<T2cc3>) (const char *) D.26362;
  int D.26365;
  gboolean (*<T2cc3>) (const char *) D.26368;
  int D.26371;
  void (*<T7e7>) (void) D.26378;
  void (*<T7e7>) (void) D.26381;
  int D.21765;
  int iftmp.421;
  int D.21764;
  unsigned char D.26398;
  int D.26399;
  _Bool D.26400;
  _Bool D.26401;
  _Bool D.26402;
  const unsigned char * D.26405;
  unsigned char D.26406;
  int D.26407;
  _Bool D.26408;
  _Bool D.26409;
  const unsigned char * D.26412;
  unsigned char D.26413;
  int D.26414;
  _Bool D.26415;
  _Bool D.26416;
  const unsigned char * D.26419;
  unsigned char D.26420;
  int D.26421;
  unsigned char D.26423;
  char D.26426;
  unsigned char D.26427;
  unsigned char D.26428;
  int gc_debug_level.422;
  int D.26436;
  struct FILE * gc_debug_file.423;
  struct FILE * gc_debug_file.424;
  int D.21776;
  int iftmp.425;
  int D.21775;
  const char[16] * D.26445;
  unsigned char D.26446;
  int D.26447;
  unsigned char D.26448;
  int D.26449;
  _Bool D.26450;
  _Bool D.26451;
  _Bool D.26452;
  const unsigned char * D.26455;
  unsigned char D.26456;
  int D.26457;
  const unsigned char * D.26458;
  unsigned char D.26459;
  int D.26460;
  _Bool D.26461;
  _Bool D.26462;
  const unsigned char * D.26465;
  unsigned char D.26466;
  int D.26467;
  const unsigned char * D.26468;
  unsigned char D.26469;
  int D.26470;
  _Bool D.26471;
  _Bool D.26472;
  const unsigned char * D.26475;
  unsigned char D.26476;
  int D.26477;
  const unsigned char * D.26478;
  unsigned char D.26479;
  int D.26480;
  int D.21785;
  int iftmp.426;
  int D.21784;
  const char[14] * D.26488;
  unsigned char D.26489;
  int D.26490;
  unsigned char D.26491;
  int D.26492;
  _Bool D.26493;
  _Bool D.26494;
  _Bool D.26495;
  const unsigned char * D.26498;
  unsigned char D.26499;
  int D.26500;
  const unsigned char * D.26501;
  unsigned char D.26502;
  int D.26503;
  _Bool D.26504;
  _Bool D.26505;
  const unsigned char * D.26508;
  unsigned char D.26509;
  int D.26510;
  const unsigned char * D.26511;
  unsigned char D.26512;
  int D.26513;
  _Bool D.26514;
  _Bool D.26515;
  const unsigned char * D.26518;
  unsigned char D.26519;
  int D.26520;
  const unsigned char * D.26521;
  unsigned char D.26522;
  int D.26523;
  int D.21794;
  int iftmp.427;
  int D.21793;
  const char[21] * D.26531;
  unsigned char D.26532;
  int D.26533;
  unsigned char D.26534;
  int D.26535;
  _Bool D.26536;
  _Bool D.26537;
  _Bool D.26538;
  const unsigned char * D.26541;
  unsigned char D.26542;
  int D.26543;
  const unsigned char * D.26544;
  unsigned char D.26545;
  int D.26546;
  _Bool D.26547;
  _Bool D.26548;
  const unsigned char * D.26551;
  unsigned char D.26552;
  int D.26553;
  const unsigned char * D.26554;
  unsigned char D.26555;
  int D.26556;
  _Bool D.26557;
  _Bool D.26558;
  const unsigned char * D.26561;
  unsigned char D.26562;
  int D.26563;
  const unsigned char * D.26564;
  unsigned char D.26565;
  int D.26566;
  int D.26571;
  char * D.26574;
  int D.26575;
  unsigned int verify_before_allocs.428;
  int D.21804;
  int iftmp.429;
  int D.21803;
  const char[22] * D.26581;
  unsigned char D.26582;
  int D.26583;
  unsigned char D.26584;
  int D.26585;
  _Bool D.26586;
  _Bool D.26587;
  _Bool D.26588;
  const unsigned char * D.26591;
  unsigned char D.26592;
  int D.26593;
  const unsigned char * D.26594;
  unsigned char D.26595;
  int D.26596;
  _Bool D.26597;
  _Bool D.26598;
  const unsigned char * D.26601;
  unsigned char D.26602;
  int D.26603;
  const unsigned char * D.26604;
  unsigned char D.26605;
  int D.26606;
  _Bool D.26607;
  _Bool D.26608;
  const unsigned char * D.26611;
  unsigned char D.26612;
  int D.26613;
  const unsigned char * D.26614;
  unsigned char D.26615;
  int D.26616;
  int D.26621;
  char * D.26624;
  int D.26625;
  unsigned int collect_before_allocs.430;
  int D.21814;
  int iftmp.431;
  int D.21813;
  const char[26] * D.26631;
  unsigned char D.26632;
  int D.26633;
  unsigned char D.26634;
  int D.26635;
  _Bool D.26636;
  _Bool D.26637;
  _Bool D.26638;
  const unsigned char * D.26641;
  unsigned char D.26642;
  int D.26643;
  const unsigned char * D.26644;
  unsigned char D.26645;
  int D.26646;
  _Bool D.26647;
  _Bool D.26648;
  const unsigned char * D.26651;
  unsigned char D.26652;
  int D.26653;
  const unsigned char * D.26654;
  unsigned char D.26655;
  int D.26656;
  _Bool D.26657;
  _Bool D.26658;
  const unsigned char * D.26661;
  unsigned char D.26662;
  int D.26663;
  const unsigned char * D.26664;
  unsigned char D.26665;
  int D.26666;
  int D.21823;
  int iftmp.432;
  int D.21822;
  const char[27] * D.26674;
  unsigned char D.26675;
  int D.26676;
  unsigned char D.26677;
  int D.26678;
  _Bool D.26679;
  _Bool D.26680;
  _Bool D.26681;
  const unsigned char * D.26684;
  unsigned char D.26685;
  int D.26686;
  const unsigned char * D.26687;
  unsigned char D.26688;
  int D.26689;
  _Bool D.26690;
  _Bool D.26691;
  const unsigned char * D.26694;
  unsigned char D.26695;
  int D.26696;
  const unsigned char * D.26697;
  unsigned char D.26698;
  int D.26699;
  _Bool D.26700;
  _Bool D.26701;
  const unsigned char * D.26704;
  unsigned char D.26705;
  int D.26706;
  const unsigned char * D.26707;
  unsigned char D.26708;
  int D.26709;
  int D.21832;
  int iftmp.433;
  int D.21831;
  const char[28] * D.26717;
  unsigned char D.26718;
  int D.26719;
  unsigned char D.26720;
  int D.26721;
  _Bool D.26722;
  _Bool D.26723;
  _Bool D.26724;
  const unsigned char * D.26727;
  unsigned char D.26728;
  int D.26729;
  const unsigned char * D.26730;
  unsigned char D.26731;
  int D.26732;
  _Bool D.26733;
  _Bool D.26734;
  const unsigned char * D.26737;
  unsigned char D.26738;
  int D.26739;
  const unsigned char * D.26740;
  unsigned char D.26741;
  int D.26742;
  _Bool D.26743;
  _Bool D.26744;
  const unsigned char * D.26747;
  unsigned char D.26748;
  int D.26749;
  const unsigned char * D.26750;
  unsigned char D.26751;
  int D.26752;
  int D.21841;
  int iftmp.434;
  int D.21840;
  const char[16] * D.26762;
  unsigned char D.26763;
  int D.26764;
  unsigned char D.26765;
  int D.26766;
  _Bool D.26767;
  _Bool D.26768;
  _Bool D.26769;
  const unsigned char * D.26772;
  unsigned char D.26773;
  int D.26774;
  const unsigned char * D.26775;
  unsigned char D.26776;
  int D.26777;
  _Bool D.26778;
  _Bool D.26779;
  const unsigned char * D.26782;
  unsigned char D.26783;
  int D.26784;
  const unsigned char * D.26785;
  unsigned char D.26786;
  int D.26787;
  _Bool D.26788;
  _Bool D.26789;
  const unsigned char * D.26792;
  unsigned char D.26793;
  int D.26794;
  const unsigned char * D.26795;
  unsigned char D.26796;
  int D.26797;
  int D.21850;
  int iftmp.435;
  int D.21849;
  const char[21] * D.26805;
  unsigned char D.26806;
  int D.26807;
  unsigned char D.26808;
  int D.26809;
  _Bool D.26810;
  _Bool D.26811;
  _Bool D.26812;
  const unsigned char * D.26815;
  unsigned char D.26816;
  int D.26817;
  const unsigned char * D.26818;
  unsigned char D.26819;
  int D.26820;
  _Bool D.26821;
  _Bool D.26822;
  const unsigned char * D.26825;
  unsigned char D.26826;
  int D.26827;
  const unsigned char * D.26828;
  unsigned char D.26829;
  int D.26830;
  _Bool D.26831;
  _Bool D.26832;
  const unsigned char * D.26835;
  unsigned char D.26836;
  int D.26837;
  const unsigned char * D.26838;
  unsigned char D.26839;
  int D.26840;
  int D.21859;
  int iftmp.436;
  int D.21858;
  const char[15] * D.26848;
  unsigned char D.26849;
  int D.26850;
  unsigned char D.26851;
  int D.26852;
  _Bool D.26853;
  _Bool D.26854;
  _Bool D.26855;
  const unsigned char * D.26858;
  unsigned char D.26859;
  int D.26860;
  const unsigned char * D.26861;
  unsigned char D.26862;
  int D.26863;
  _Bool D.26864;
  _Bool D.26865;
  const unsigned char * D.26868;
  unsigned char D.26869;
  int D.26870;
  const unsigned char * D.26871;
  unsigned char D.26872;
  int D.26873;
  _Bool D.26874;
  _Bool D.26875;
  const unsigned char * D.26878;
  unsigned char D.26879;
  int D.26880;
  const unsigned char * D.26881;
  unsigned char D.26882;
  int D.26883;
  int D.21868;
  int iftmp.437;
  int D.21867;
  const char[12] * D.26891;
  unsigned char D.26892;
  int D.26893;
  unsigned char D.26894;
  int D.26895;
  _Bool D.26896;
  _Bool D.26897;
  _Bool D.26898;
  const unsigned char * D.26901;
  unsigned char D.26902;
  int D.26903;
  const unsigned char * D.26904;
  unsigned char D.26905;
  int D.26906;
  _Bool D.26907;
  _Bool D.26908;
  const unsigned char * D.26911;
  unsigned char D.26912;
  int D.26913;
  const unsigned char * D.26914;
  unsigned char D.26915;
  int D.26916;
  _Bool D.26917;
  _Bool D.26918;
  const unsigned char * D.26921;
  unsigned char D.26922;
  int D.26923;
  const unsigned char * D.26924;
  unsigned char D.26925;
  int D.26926;
  int D.21877;
  int iftmp.438;
  int D.21876;
  const char[20] * D.26934;
  unsigned char D.26935;
  int D.26936;
  unsigned char D.26937;
  int D.26938;
  _Bool D.26939;
  _Bool D.26940;
  _Bool D.26941;
  const unsigned char * D.26944;
  unsigned char D.26945;
  int D.26946;
  const unsigned char * D.26947;
  unsigned char D.26948;
  int D.26949;
  _Bool D.26950;
  _Bool D.26951;
  const unsigned char * D.26954;
  unsigned char D.26955;
  int D.26956;
  const unsigned char * D.26957;
  unsigned char D.26958;
  int D.26959;
  _Bool D.26960;
  _Bool D.26961;
  const unsigned char * D.26964;
  unsigned char D.26965;
  int D.26966;
  const unsigned char * D.26967;
  unsigned char D.26968;
  int D.26969;
  int D.21886;
  int iftmp.439;
  int D.21885;
  const char[18] * D.26977;
  unsigned char D.26978;
  int D.26979;
  unsigned char D.26980;
  int D.26981;
  _Bool D.26982;
  _Bool D.26983;
  _Bool D.26984;
  const unsigned char * D.26987;
  unsigned char D.26988;
  int D.26989;
  const unsigned char * D.26990;
  unsigned char D.26991;
  int D.26992;
  _Bool D.26993;
  _Bool D.26994;
  const unsigned char * D.26997;
  unsigned char D.26998;
  int D.26999;
  const unsigned char * D.27000;
  unsigned char D.27001;
  int D.27002;
  _Bool D.27003;
  _Bool D.27004;
  const unsigned char * D.27007;
  unsigned char D.27008;
  int D.27009;
  const unsigned char * D.27010;
  unsigned char D.27011;
  int D.27012;
  int D.21895;
  int iftmp.440;
  int D.21894;
  const char[27] * D.27020;
  unsigned char D.27021;
  int D.27022;
  unsigned char D.27023;
  int D.27024;
  _Bool D.27025;
  _Bool D.27026;
  _Bool D.27027;
  const unsigned char * D.27030;
  unsigned char D.27031;
  int D.27032;
  const unsigned char * D.27033;
  unsigned char D.27034;
  int D.27035;
  _Bool D.27036;
  _Bool D.27037;
  const unsigned char * D.27040;
  unsigned char D.27041;
  int D.27042;
  const unsigned char * D.27043;
  unsigned char D.27044;
  int D.27045;
  _Bool D.27046;
  _Bool D.27047;
  const unsigned char * D.27050;
  unsigned char D.27051;
  int D.27052;
  const unsigned char * D.27053;
  unsigned char D.27054;
  int D.27055;
  int D.21904;
  int iftmp.441;
  int D.21903;
  const char[17] * D.27063;
  unsigned char D.27064;
  int D.27065;
  unsigned char D.27066;
  int D.27067;
  _Bool D.27068;
  _Bool D.27069;
  _Bool D.27070;
  const unsigned char * D.27073;
  unsigned char D.27074;
  int D.27075;
  const unsigned char * D.27076;
  unsigned char D.27077;
  int D.27078;
  _Bool D.27079;
  _Bool D.27080;
  const unsigned char * D.27083;
  unsigned char D.27084;
  int D.27085;
  const unsigned char * D.27086;
  unsigned char D.27087;
  int D.27088;
  _Bool D.27089;
  _Bool D.27090;
  const unsigned char * D.27093;
  unsigned char D.27094;
  int D.27095;
  const unsigned char * D.27096;
  unsigned char D.27097;
  int D.27098;
  int D.21913;
  int iftmp.442;
  int D.21912;
  const char[25] * D.27108;
  unsigned char D.27109;
  int D.27110;
  unsigned char D.27111;
  int D.27112;
  _Bool D.27113;
  _Bool D.27114;
  _Bool D.27115;
  const unsigned char * D.27118;
  unsigned char D.27119;
  int D.27120;
  const unsigned char * D.27121;
  unsigned char D.27122;
  int D.27123;
  _Bool D.27124;
  _Bool D.27125;
  const unsigned char * D.27128;
  unsigned char D.27129;
  int D.27130;
  const unsigned char * D.27131;
  unsigned char D.27132;
  int D.27133;
  _Bool D.27134;
  _Bool D.27135;
  const unsigned char * D.27138;
  unsigned char D.27139;
  int D.27140;
  const unsigned char * D.27141;
  unsigned char D.27142;
  int D.27143;
  int D.21922;
  int iftmp.443;
  int D.21921;
  const char[21] * D.27151;
  unsigned char D.27152;
  int D.27153;
  unsigned char D.27154;
  int D.27155;
  _Bool D.27156;
  _Bool D.27157;
  _Bool D.27158;
  const unsigned char * D.27161;
  unsigned char D.27162;
  int D.27163;
  const unsigned char * D.27164;
  unsigned char D.27165;
  int D.27166;
  _Bool D.27167;
  _Bool D.27168;
  const unsigned char * D.27171;
  unsigned char D.27172;
  int D.27173;
  const unsigned char * D.27174;
  unsigned char D.27175;
  int D.27176;
  _Bool D.27177;
  _Bool D.27178;
  const unsigned char * D.27181;
  unsigned char D.27182;
  int D.27183;
  const unsigned char * D.27184;
  unsigned char D.27185;
  int D.27186;
  int D.21931;
  int iftmp.444;
  int D.21930;
  const char[14] * D.27194;
  unsigned char D.27195;
  int D.27196;
  unsigned char D.27197;
  int D.27198;
  _Bool D.27199;
  _Bool D.27200;
  _Bool D.27201;
  const unsigned char * D.27204;
  unsigned char D.27205;
  int D.27206;
  const unsigned char * D.27207;
  unsigned char D.27208;
  int D.27209;
  _Bool D.27210;
  _Bool D.27211;
  const unsigned char * D.27214;
  unsigned char D.27215;
  int D.27216;
  const unsigned char * D.27217;
  unsigned char D.27218;
  int D.27219;
  _Bool D.27220;
  _Bool D.27221;
  const unsigned char * D.27224;
  unsigned char D.27225;
  int D.27226;
  const unsigned char * D.27227;
  unsigned char D.27228;
  int D.27229;
  int D.21940;
  int iftmp.445;
  int D.21939;
  const char[14] * D.27237;
  unsigned char D.27238;
  int D.27239;
  unsigned char D.27240;
  int D.27241;
  _Bool D.27242;
  _Bool D.27243;
  _Bool D.27244;
  const unsigned char * D.27247;
  unsigned char D.27248;
  int D.27249;
  const unsigned char * D.27250;
  unsigned char D.27251;
  int D.27252;
  _Bool D.27253;
  _Bool D.27254;
  const unsigned char * D.27257;
  unsigned char D.27258;
  int D.27259;
  const unsigned char * D.27260;
  unsigned char D.27261;
  int D.27262;
  _Bool D.27263;
  _Bool D.27264;
  const unsigned char * D.27267;
  unsigned char D.27268;
  int D.27269;
  const unsigned char * D.27270;
  unsigned char D.27271;
  int D.27272;
  int D.27277;
  char * D.27280;
  struct FILE * heap_dump_file.446;
  struct FILE * heap_dump_file.447;
  int do_pin_stats.448;
  void (*<T2d2b>) (struct SgenMajorCollector *) D.27296;
  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.21604>:
      result = InterlockedCompareExchange (&gc_initialized, -1, 0);
      switch (result) <default: <D.21603>, case -1: <D.21600>, case 0: <D.21602>, case 1: <D.21599>>
      <D.21599>:
      return;
      <D.21600>:
      monoeg_g_usleep (1000);
      goto <D.21601>;
      <D.21602>:
      goto <D.21601>;
      <D.21603>:
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 4863);
      <D.21601>:
      if (result != 0) goto <D.21604>; else goto <D.21605>;
      <D.21605>:
      pthread_mutex_init (&gc_mutex, 0B);
      D.25611 = mono_pagesize ();
      pagesize.394 = (long unsigned int) D.25611;
      pagesize = pagesize.394;
      stderr.395 = stderr;
      gc_debug_file = stderr.395;
      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, 608);
      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.25614>; else goto <D.25615>;
      <D.25614>:
      opts = monoeg_g_strsplit (env, ",", -1);
      ptr = opts;
      goto <D.21608>;
      <D.21607>:
      {
        char * opt;

        opt = *ptr;
        D.25616 = monoeg_g_str_has_prefix (opt, "major=");
        if (D.25616 != 0) goto <D.25617>; else goto <D.25618>;
        <D.25617>:
        D.25619 = __builtin_strchr (opt, 61);
        opt = D.25619 + 1;
        major_collector_opt = monoeg_strdup (opt);
        goto <D.25620>;
        <D.25618>:
        D.25621 = monoeg_g_str_has_prefix (opt, "minor=");
        if (D.25621 != 0) goto <D.25622>; else goto <D.25623>;
        <D.25622>:
        D.25624 = __builtin_strchr (opt, 61);
        opt = D.25624 + 1;
        minor_collector_opt = monoeg_strdup (opt);
        <D.25623>:
        <D.25620>:
      }
      ptr = ptr + 8;
      <D.21608>:
      D.25625 = *ptr;
      if (D.25625 != 0B) goto <D.21607>; else goto <D.21609>;
      <D.21609>:
      goto <D.25626>;
      <D.25615>:
      opts = 0B;
      <D.25626>:
      init_stats ();
      sgen_init_internal_allocator ();
      sgen_init_nursery_allocator ();
      sgen_init_fin_weak_hash ();
      sgen_register_fixed_internal_mem_type (2, 56);
      sgen_register_fixed_internal_mem_type (6, 16);
      sgen_register_fixed_internal_mem_type (14, 1016);
      sgen_register_fixed_internal_mem_type (18, 16);
      {
        int tls_offset;

        tls_offset = -1;
        {
          guint64 foo;

          __asm__("movq $sgen_thread_info@TPOFF, %0" : "=r" foo);
          tls_offset = (int) foo;
        }
        mono_tls_key_set_offset (4, tls_offset);
      }
      sgen_os_init ();
      mono_thread_info_attach (&dummy);
      if (minor_collector_opt == 0B) goto <D.25627>; else goto <D.25628>;
      <D.25627>:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.25629>;
      <D.25628>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.25633 = "simple";
          D.25634 = MEM[(const unsigned char *)D.25633];
          D.25635 = (int) D.25634;
          D.25636 = *__s2;
          D.25637 = (int) D.25636;
          __result = D.25635 - D.25637;
          {
            D.25638 = __s2_len != 0;
            D.25639 = __result == 0;
            D.25640 = D.25638 & D.25639;
            if (D.25640 != 0) goto <D.25641>; else goto <D.25642>;
            <D.25641>:
            D.25643 = &MEM[(void *)"simple" + 1B];
            D.25644 = *D.25643;
            D.25645 = (int) D.25644;
            D.25646 = __s2 + 1;
            D.25647 = *D.25646;
            D.25648 = (int) D.25647;
            __result = D.25645 - D.25648;
            D.25649 = __s2_len > 1;
            D.25639 = __result == 0;
            D.25650 = D.25649 & D.25639;
            if (D.25650 != 0) goto <D.25651>; else goto <D.25652>;
            <D.25651>:
            D.25653 = &MEM[(void *)"simple" + 2B];
            D.25654 = *D.25653;
            D.25655 = (int) D.25654;
            D.25656 = __s2 + 2;
            D.25657 = *D.25656;
            D.25658 = (int) D.25657;
            __result = D.25655 - D.25658;
            D.25659 = __s2_len > 2;
            D.25639 = __result == 0;
            D.25660 = D.25659 & D.25639;
            if (D.25660 != 0) goto <D.25661>; else goto <D.25662>;
            <D.25661>:
            D.25663 = &MEM[(void *)"simple" + 3B];
            D.25664 = *D.25663;
            D.25665 = (int) D.25664;
            D.25666 = __s2 + 3;
            D.25667 = *D.25666;
            D.25668 = (int) D.25667;
            __result = D.25665 - D.25668;
            <D.25662>:
            <D.25652>:
            <D.25642>:
          }
          D.21619 = __result;
        }
        iftmp.396 = -D.21619;
        goto <D.25669>;
        <D.25632>:
        iftmp.396 = __builtin_strcmp (minor_collector_opt, "simple");
        <D.25669>:
        D.21620 = iftmp.396;
      }
      if (D.21620 == 0) goto <D.25670>; else goto <D.25671>;
      <D.25670>:
      use_simple_nursery:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.25672>;
      <D.25671>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.25676 = "split";
          D.25677 = MEM[(const unsigned char *)D.25676];
          D.25678 = (int) D.25677;
          D.25679 = *__s2;
          D.25680 = (int) D.25679;
          __result = D.25678 - D.25680;
          {
            D.25681 = __s2_len != 0;
            D.25682 = __result == 0;
            D.25683 = D.25681 & D.25682;
            if (D.25683 != 0) goto <D.25684>; else goto <D.25685>;
            <D.25684>:
            D.25686 = &MEM[(void *)"split" + 1B];
            D.25687 = *D.25686;
            D.25688 = (int) D.25687;
            D.25689 = __s2 + 1;
            D.25690 = *D.25689;
            D.25691 = (int) D.25690;
            __result = D.25688 - D.25691;
            D.25692 = __s2_len > 1;
            D.25682 = __result == 0;
            D.25693 = D.25692 & D.25682;
            if (D.25693 != 0) goto <D.25694>; else goto <D.25695>;
            <D.25694>:
            D.25696 = &MEM[(void *)"split" + 2B];
            D.25697 = *D.25696;
            D.25698 = (int) D.25697;
            D.25699 = __s2 + 2;
            D.25700 = *D.25699;
            D.25701 = (int) D.25700;
            __result = D.25698 - D.25701;
            D.25702 = __s2_len > 2;
            D.25682 = __result == 0;
            D.25703 = D.25702 & D.25682;
            if (D.25703 != 0) goto <D.25704>; else goto <D.25705>;
            <D.25704>:
            D.25706 = &MEM[(void *)"split" + 3B];
            D.25707 = *D.25706;
            D.25708 = (int) D.25707;
            D.25709 = __s2 + 3;
            D.25710 = *D.25709;
            D.25711 = (int) D.25710;
            __result = D.25708 - D.25711;
            <D.25705>:
            <D.25695>:
            <D.25685>:
          }
          D.21629 = __result;
        }
        iftmp.397 = -D.21629;
        goto <D.25712>;
        <D.25675>:
        iftmp.397 = __builtin_strcmp (minor_collector_opt, "split");
        <D.25712>:
        D.21630 = iftmp.397;
      }
      if (D.21630 == 0) goto <D.25713>; else goto <D.25714>;
      <D.25713>:
      sgen_split_nursery_init (&sgen_minor_collector);
      have_split_nursery = 1;
      goto <D.25715>;
      <D.25714>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `simple` instead.", "Unknown minor collector `%s\'.", minor_collector_opt);
      goto use_simple_nursery;
      <D.25715>:
      <D.25672>:
      <D.25629>:
      if (major_collector_opt == 0B) goto <D.25716>; else goto <D.25719>;
      <D.25719>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25723 = "marksweep";
          D.25724 = MEM[(const unsigned char *)D.25723];
          D.25725 = (int) D.25724;
          D.25726 = *__s2;
          D.25727 = (int) D.25726;
          __result = D.25725 - D.25727;
          {
            D.25728 = __s2_len != 0;
            D.25729 = __result == 0;
            D.25730 = D.25728 & D.25729;
            if (D.25730 != 0) goto <D.25731>; else goto <D.25732>;
            <D.25731>:
            D.25733 = &MEM[(void *)"marksweep" + 1B];
            D.25734 = *D.25733;
            D.25735 = (int) D.25734;
            D.25736 = __s2 + 1;
            D.25737 = *D.25736;
            D.25738 = (int) D.25737;
            __result = D.25735 - D.25738;
            D.25739 = __s2_len > 1;
            D.25729 = __result == 0;
            D.25740 = D.25739 & D.25729;
            if (D.25740 != 0) goto <D.25741>; else goto <D.25742>;
            <D.25741>:
            D.25743 = &MEM[(void *)"marksweep" + 2B];
            D.25744 = *D.25743;
            D.25745 = (int) D.25744;
            D.25746 = __s2 + 2;
            D.25747 = *D.25746;
            D.25748 = (int) D.25747;
            __result = D.25745 - D.25748;
            D.25749 = __s2_len > 2;
            D.25729 = __result == 0;
            D.25750 = D.25749 & D.25729;
            if (D.25750 != 0) goto <D.25751>; else goto <D.25752>;
            <D.25751>:
            D.25753 = &MEM[(void *)"marksweep" + 3B];
            D.25754 = *D.25753;
            D.25755 = (int) D.25754;
            D.25756 = __s2 + 3;
            D.25757 = *D.25756;
            D.25758 = (int) D.25757;
            __result = D.25755 - D.25758;
            <D.25752>:
            <D.25742>:
            <D.25732>:
          }
          D.21638 = __result;
        }
        iftmp.398 = -D.21638;
        goto <D.25759>;
        <D.25722>:
        iftmp.398 = __builtin_strcmp (major_collector_opt, "marksweep");
        <D.25759>:
        D.21639 = iftmp.398;
      }
      if (D.21639 == 0) goto <D.25716>; else goto <D.25717>;
      <D.25716>:
      use_marksweep_major:
      sgen_marksweep_init (&major_collector);
      goto <D.25718>;
      <D.25717>:
      if (major_collector_opt == 0B) goto <D.25760>; else goto <D.25763>;
      <D.25763>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25767 = "marksweep-fixed";
          D.25768 = MEM[(const unsigned char *)D.25767];
          D.25769 = (int) D.25768;
          D.25770 = *__s2;
          D.25771 = (int) D.25770;
          __result = D.25769 - D.25771;
          {
            D.25772 = __s2_len != 0;
            D.25773 = __result == 0;
            D.25774 = D.25772 & D.25773;
            if (D.25774 != 0) goto <D.25775>; else goto <D.25776>;
            <D.25775>:
            D.25777 = &MEM[(void *)"marksweep-fixed" + 1B];
            D.25778 = *D.25777;
            D.25779 = (int) D.25778;
            D.25780 = __s2 + 1;
            D.25781 = *D.25780;
            D.25782 = (int) D.25781;
            __result = D.25779 - D.25782;
            D.25783 = __s2_len > 1;
            D.25773 = __result == 0;
            D.25784 = D.25783 & D.25773;
            if (D.25784 != 0) goto <D.25785>; else goto <D.25786>;
            <D.25785>:
            D.25787 = &MEM[(void *)"marksweep-fixed" + 2B];
            D.25788 = *D.25787;
            D.25789 = (int) D.25788;
            D.25790 = __s2 + 2;
            D.25791 = *D.25790;
            D.25792 = (int) D.25791;
            __result = D.25789 - D.25792;
            D.25793 = __s2_len > 2;
            D.25773 = __result == 0;
            D.25794 = D.25793 & D.25773;
            if (D.25794 != 0) goto <D.25795>; else goto <D.25796>;
            <D.25795>:
            D.25797 = &MEM[(void *)"marksweep-fixed" + 3B];
            D.25798 = *D.25797;
            D.25799 = (int) D.25798;
            D.25800 = __s2 + 3;
            D.25801 = *D.25800;
            D.25802 = (int) D.25801;
            __result = D.25799 - D.25802;
            <D.25796>:
            <D.25786>:
            <D.25776>:
          }
          D.21648 = __result;
        }
        iftmp.399 = -D.21648;
        goto <D.25803>;
        <D.25766>:
        iftmp.399 = __builtin_strcmp (major_collector_opt, "marksweep-fixed");
        <D.25803>:
        D.21649 = iftmp.399;
      }
      if (D.21649 == 0) goto <D.25760>; else goto <D.25761>;
      <D.25760>:
      sgen_marksweep_fixed_init (&major_collector);
      goto <D.25762>;
      <D.25761>:
      if (major_collector_opt == 0B) goto <D.25804>; else goto <D.25807>;
      <D.25807>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25811 = "marksweep-par";
          D.25812 = MEM[(const unsigned char *)D.25811];
          D.25813 = (int) D.25812;
          D.25814 = *__s2;
          D.25815 = (int) D.25814;
          __result = D.25813 - D.25815;
          {
            D.25816 = __s2_len != 0;
            D.25817 = __result == 0;
            D.25818 = D.25816 & D.25817;
            if (D.25818 != 0) goto <D.25819>; else goto <D.25820>;
            <D.25819>:
            D.25821 = &MEM[(void *)"marksweep-par" + 1B];
            D.25822 = *D.25821;
            D.25823 = (int) D.25822;
            D.25824 = __s2 + 1;
            D.25825 = *D.25824;
            D.25826 = (int) D.25825;
            __result = D.25823 - D.25826;
            D.25827 = __s2_len > 1;
            D.25817 = __result == 0;
            D.25828 = D.25827 & D.25817;
            if (D.25828 != 0) goto <D.25829>; else goto <D.25830>;
            <D.25829>:
            D.25831 = &MEM[(void *)"marksweep-par" + 2B];
            D.25832 = *D.25831;
            D.25833 = (int) D.25832;
            D.25834 = __s2 + 2;
            D.25835 = *D.25834;
            D.25836 = (int) D.25835;
            __result = D.25833 - D.25836;
            D.25837 = __s2_len > 2;
            D.25817 = __result == 0;
            D.25838 = D.25837 & D.25817;
            if (D.25838 != 0) goto <D.25839>; else goto <D.25840>;
            <D.25839>:
            D.25841 = &MEM[(void *)"marksweep-par" + 3B];
            D.25842 = *D.25841;
            D.25843 = (int) D.25842;
            D.25844 = __s2 + 3;
            D.25845 = *D.25844;
            D.25846 = (int) D.25845;
            __result = D.25843 - D.25846;
            <D.25840>:
            <D.25830>:
            <D.25820>:
          }
          D.21657 = __result;
        }
        iftmp.400 = -D.21657;
        goto <D.25847>;
        <D.25810>:
        iftmp.400 = __builtin_strcmp (major_collector_opt, "marksweep-par");
        <D.25847>:
        D.21658 = iftmp.400;
      }
      if (D.21658 == 0) goto <D.25804>; else goto <D.25805>;
      <D.25804>:
      sgen_marksweep_par_init (&major_collector);
      goto <D.25806>;
      <D.25805>:
      if (major_collector_opt == 0B) goto <D.25848>; else goto <D.25851>;
      <D.25851>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25855 = "marksweep-fixed-par";
          D.25856 = MEM[(const unsigned char *)D.25855];
          D.25857 = (int) D.25856;
          D.25858 = *__s2;
          D.25859 = (int) D.25858;
          __result = D.25857 - D.25859;
          {
            D.25860 = __s2_len != 0;
            D.25861 = __result == 0;
            D.25862 = D.25860 & D.25861;
            if (D.25862 != 0) goto <D.25863>; else goto <D.25864>;
            <D.25863>:
            D.25865 = &MEM[(void *)"marksweep-fixed-par" + 1B];
            D.25866 = *D.25865;
            D.25867 = (int) D.25866;
            D.25868 = __s2 + 1;
            D.25869 = *D.25868;
            D.25870 = (int) D.25869;
            __result = D.25867 - D.25870;
            D.25871 = __s2_len > 1;
            D.25861 = __result == 0;
            D.25872 = D.25871 & D.25861;
            if (D.25872 != 0) goto <D.25873>; else goto <D.25874>;
            <D.25873>:
            D.25875 = &MEM[(void *)"marksweep-fixed-par" + 2B];
            D.25876 = *D.25875;
            D.25877 = (int) D.25876;
            D.25878 = __s2 + 2;
            D.25879 = *D.25878;
            D.25880 = (int) D.25879;
            __result = D.25877 - D.25880;
            D.25881 = __s2_len > 2;
            D.25861 = __result == 0;
            D.25882 = D.25881 & D.25861;
            if (D.25882 != 0) goto <D.25883>; else goto <D.25884>;
            <D.25883>:
            D.25885 = &MEM[(void *)"marksweep-fixed-par" + 3B];
            D.25886 = *D.25885;
            D.25887 = (int) D.25886;
            D.25888 = __s2 + 3;
            D.25889 = *D.25888;
            D.25890 = (int) D.25889;
            __result = D.25887 - D.25890;
            <D.25884>:
            <D.25874>:
            <D.25864>:
          }
          D.21666 = __result;
        }
        iftmp.401 = -D.21666;
        goto <D.25891>;
        <D.25854>:
        iftmp.401 = __builtin_strcmp (major_collector_opt, "marksweep-fixed-par");
        <D.25891>:
        D.21667 = iftmp.401;
      }
      if (D.21667 == 0) goto <D.25848>; else goto <D.25849>;
      <D.25848>:
      sgen_marksweep_fixed_par_init (&major_collector);
      goto <D.25850>;
      <D.25849>:
      if (major_collector_opt == 0B) goto <D.25892>; else goto <D.25895>;
      <D.25895>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25899 = "marksweep-conc";
          D.25900 = MEM[(const unsigned char *)D.25899];
          D.25901 = (int) D.25900;
          D.25902 = *__s2;
          D.25903 = (int) D.25902;
          __result = D.25901 - D.25903;
          {
            D.25904 = __s2_len != 0;
            D.25905 = __result == 0;
            D.25906 = D.25904 & D.25905;
            if (D.25906 != 0) goto <D.25907>; else goto <D.25908>;
            <D.25907>:
            D.25909 = &MEM[(void *)"marksweep-conc" + 1B];
            D.25910 = *D.25909;
            D.25911 = (int) D.25910;
            D.25912 = __s2 + 1;
            D.25913 = *D.25912;
            D.25914 = (int) D.25913;
            __result = D.25911 - D.25914;
            D.25915 = __s2_len > 1;
            D.25905 = __result == 0;
            D.25916 = D.25915 & D.25905;
            if (D.25916 != 0) goto <D.25917>; else goto <D.25918>;
            <D.25917>:
            D.25919 = &MEM[(void *)"marksweep-conc" + 2B];
            D.25920 = *D.25919;
            D.25921 = (int) D.25920;
            D.25922 = __s2 + 2;
            D.25923 = *D.25922;
            D.25924 = (int) D.25923;
            __result = D.25921 - D.25924;
            D.25925 = __s2_len > 2;
            D.25905 = __result == 0;
            D.25926 = D.25925 & D.25905;
            if (D.25926 != 0) goto <D.25927>; else goto <D.25928>;
            <D.25927>:
            D.25929 = &MEM[(void *)"marksweep-conc" + 3B];
            D.25930 = *D.25929;
            D.25931 = (int) D.25930;
            D.25932 = __s2 + 3;
            D.25933 = *D.25932;
            D.25934 = (int) D.25933;
            __result = D.25931 - D.25934;
            <D.25928>:
            <D.25918>:
            <D.25908>:
          }
          D.21675 = __result;
        }
        iftmp.402 = -D.21675;
        goto <D.25935>;
        <D.25898>:
        iftmp.402 = __builtin_strcmp (major_collector_opt, "marksweep-conc");
        <D.25935>:
        D.21676 = iftmp.402;
      }
      if (D.21676 == 0) goto <D.25892>; else goto <D.25893>;
      <D.25892>:
      sgen_marksweep_conc_init (&major_collector);
      goto <D.25894>;
      <D.25893>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `marksweep` instead.", "Unknown major collector `%s\'.", major_collector_opt);
      goto use_marksweep_major;
      <D.25894>:
      <D.25850>:
      <D.25806>:
      <D.25762>:
      <D.25718>:
      if (have_split_nursery != 0) goto <D.25936>; else goto <D.25937>;
      <D.25936>:
      D.25938 = major_collector.is_parallel;
      if (D.25938 != 0) goto <D.25939>; else goto <D.25940>;
      <D.25939>:
      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.25940>:
      <D.25937>:
      num_workers = mono_cpu_count ();
      D.25941 = num_workers <= 0;
      D.25942 = (long int) D.25941;
      D.25943 = __builtin_expect (D.25942, 0);
      if (D.25943 != 0) goto <D.25944>; else goto <D.25945>;
      <D.25944>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4977, "num_workers > 0");
      <D.25945>:
      if (num_workers > 16) goto <D.25946>; else goto <D.25947>;
      <D.25946>:
      num_workers = 16;
      <D.25947>:
      conservative_stack_mark = 1;
      sgen_nursery_size.403 = sgen_nursery_size;
      sgen_nursery_size = sgen_nursery_size.403;
      if (opts != 0B) goto <D.25949>; else goto <D.25950>;
      <D.25949>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.25954 = "";
              D.25955 = MEM[(const unsigned char *)D.25954];
              D.25956 = (int) D.25955;
              D.25957 = *__s2;
              D.25958 = (int) D.25957;
              __result = D.25956 - D.25958;
              {
                D.25959 = __s2_len != 0;
                D.25960 = __result == 0;
                D.25961 = D.25959 & D.25960;
                if (D.25961 != 0) goto <D.25962>; else goto <D.25963>;
                <D.25962>:
                D.25964 = &MEM[(void *)"" + 1B];
                D.25965 = *D.25964;
                D.25966 = (int) D.25965;
                D.25967 = __s2 + 1;
                D.25968 = *D.25967;
                D.25969 = (int) D.25968;
                __result = D.25966 - D.25969;
                D.25970 = __s2_len > 1;
                D.25960 = __result == 0;
                D.25971 = D.25970 & D.25960;
                if (D.25971 != 0) goto <D.25972>; else goto <D.25973>;
                <D.25972>:
                D.25974 = &MEM[(void *)"" + 2B];
                D.25975 = *D.25974;
                D.25976 = (int) D.25975;
                D.25977 = __s2 + 2;
                D.25978 = *D.25977;
                D.25979 = (int) D.25978;
                __result = D.25976 - D.25979;
                D.25980 = __s2_len > 2;
                D.25960 = __result == 0;
                D.25981 = D.25980 & D.25960;
                if (D.25981 != 0) goto <D.25982>; else goto <D.25983>;
                <D.25982>:
                D.25984 = &MEM[(void *)"" + 3B];
                D.25985 = *D.25984;
                D.25986 = (int) D.25985;
                D.25987 = __s2 + 3;
                D.25988 = *D.25987;
                D.25989 = (int) D.25988;
                __result = D.25986 - D.25989;
                <D.25983>:
                <D.25973>:
                <D.25963>:
              }
              D.21686 = __result;
            }
            iftmp.404 = -D.21686;
            goto <D.25990>;
            <D.25953>:
            D.25991 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.404 = (int) D.25991;
            <D.25990>:
            D.21687 = iftmp.404;
          }
          if (D.21687 == 0) goto <D.25992>; else goto <D.25993>;
          <D.25992>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.25993>:
          D.25994 = monoeg_g_str_has_prefix (opt, "major=");
          if (D.25994 != 0) goto <D.25995>; else goto <D.25996>;
          <D.25995>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.25996>:
          D.25997 = monoeg_g_str_has_prefix (opt, "minor=");
          if (D.25997 != 0) goto <D.25998>; else goto <D.25999>;
          <D.25998>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.25999>:
          D.26000 = monoeg_g_str_has_prefix (opt, "max-heap-size=");
          if (D.26000 != 0) goto <D.26001>; else goto <D.26002>;
          <D.26001>:
          {
            glong max_heap_candidate;

            try
              {
                max_heap_candidate = 0;
                D.26003 = __builtin_strchr (opt, 61);
                opt = D.26003 + 1;
                D.26006 = *opt;
                if (D.26006 != 0) goto <D.26007>; else goto <D.26004>;
                <D.26007>:
                D.26008 = mono_gc_parse_environment_string_extract_number (opt, &max_heap_candidate);
                if (D.26008 != 0) goto <D.26009>; else goto <D.26004>;
                <D.26009>:
                D.26010 = mono_pagesize ();
                D.26011 = (long int) D.26010;
                max_heap_candidate.405 = max_heap_candidate;
                D.26013 = D.26011 + max_heap_candidate.405;
                D.26014 = D.26013 + -1;
                D.26015 = mono_pagesize ();
                D.26016 = D.26015 + -1;
                D.26017 = (long int) D.26016;
                D.26018 = ~D.26017;
                max_heap = D.26014 & D.26018;
                max_heap_candidate.405 = max_heap_candidate;
                if (max_heap != max_heap_candidate.405) goto <D.26019>; else goto <D.26020>;
                <D.26019>:
                D.26021 = mono_pagesize ();
                sgen_env_var_error ("MONO_GC_PARAMS", "Rounding up.", "`max-heap-size` size must be a multiple of %d.", D.26021);
                <D.26020>:
                goto <D.26005>;
                <D.26004>:
                sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`max-heap-size` must be an integer.");
                <D.26005>:
                // predicted unlikely by continue predictor.
                goto <D.21688>;
              }
            finally
              {
                max_heap_candidate = {CLOBBER};
              }
          }
          <D.26002>:
          D.26022 = monoeg_g_str_has_prefix (opt, "soft-heap-limit=");
          if (D.26022 != 0) goto <D.26023>; else goto <D.26024>;
          <D.26023>:
          D.26025 = __builtin_strchr (opt, 61);
          opt = D.26025 + 1;
          D.26006 = *opt;
          if (D.26006 != 0) goto <D.26028>; else goto <D.26026>;
          <D.26028>:
          D.26029 = mono_gc_parse_environment_string_extract_number (opt, &soft_limit);
          if (D.26029 != 0) goto <D.26030>; else goto <D.26026>;
          <D.26030>:
          soft_limit.406 = soft_limit;
          if (soft_limit.406 <= 0) goto <D.26032>; else goto <D.26033>;
          <D.26032>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be positive.");
          soft_limit = 0;
          <D.26033>:
          goto <D.26027>;
          <D.26026>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be an integer.");
          <D.26027>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26024>:
          D.26034 = monoeg_g_str_has_prefix (opt, "workers=");
          if (D.26034 != 0) goto <D.26035>; else goto <D.26036>;
          <D.26035>:
          {
            long int val;
            char * endptr;

            try
              {
                D.25938 = major_collector.is_parallel;
                if (D.25938 == 0) goto <D.26037>; else goto <D.26038>;
                <D.26037>:
                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.21688>;
                <D.26038>:
                D.26039 = __builtin_strchr (opt, 61);
                opt = D.26039 + 1;
                val = strtol (opt, &endptr, 10);
                D.26006 = *opt;
                if (D.26006 == 0) goto <D.26040>; else goto <D.26042>;
                <D.26042>:
                endptr.407 = endptr;
                D.26044 = *endptr.407;
                if (D.26044 != 0) goto <D.26040>; else goto <D.26041>;
                <D.26040>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Cannot parse the `workers` option value.");
                // predicted unlikely by continue predictor.
                goto <D.21688>;
                <D.26041>:
                val.408 = (unsigned long) val;
                D.26046 = val.408 + 18446744073709551615;
                if (D.26046 > 15) goto <D.26047>; else goto <D.26048>;
                <D.26047>:
                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.21688>;
                <D.26048>:
                num_workers = (int) val;
                // predicted unlikely by continue predictor.
                goto <D.21688>;
              }
            finally
              {
                endptr = {CLOBBER};
              }
          }
          <D.26036>:
          D.26049 = monoeg_g_str_has_prefix (opt, "stack-mark=");
          if (D.26049 != 0) goto <D.26050>; else goto <D.26051>;
          <D.26050>:
          D.26052 = __builtin_strchr (opt, 61);
          opt = D.26052 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26056 = "precise";
              D.26057 = MEM[(const unsigned char *)D.26056];
              D.26058 = (int) D.26057;
              D.26059 = *__s2;
              D.26060 = (int) D.26059;
              __result = D.26058 - D.26060;
              {
                D.26061 = __s2_len != 0;
                D.26062 = __result == 0;
                D.26063 = D.26061 & D.26062;
                if (D.26063 != 0) goto <D.26064>; else goto <D.26065>;
                <D.26064>:
                D.26066 = &MEM[(void *)"precise" + 1B];
                D.26067 = *D.26066;
                D.26068 = (int) D.26067;
                D.26069 = __s2 + 1;
                D.26070 = *D.26069;
                D.26071 = (int) D.26070;
                __result = D.26068 - D.26071;
                D.26072 = __s2_len > 1;
                D.26062 = __result == 0;
                D.26073 = D.26072 & D.26062;
                if (D.26073 != 0) goto <D.26074>; else goto <D.26075>;
                <D.26074>:
                D.26076 = &MEM[(void *)"precise" + 2B];
                D.26077 = *D.26076;
                D.26078 = (int) D.26077;
                D.26079 = __s2 + 2;
                D.26080 = *D.26079;
                D.26081 = (int) D.26080;
                __result = D.26078 - D.26081;
                D.26082 = __s2_len > 2;
                D.26062 = __result == 0;
                D.26083 = D.26082 & D.26062;
                if (D.26083 != 0) goto <D.26084>; else goto <D.26085>;
                <D.26084>:
                D.26086 = &MEM[(void *)"precise" + 3B];
                D.26087 = *D.26086;
                D.26088 = (int) D.26087;
                D.26089 = __s2 + 3;
                D.26090 = *D.26089;
                D.26091 = (int) D.26090;
                __result = D.26088 - D.26091;
                <D.26085>:
                <D.26075>:
                <D.26065>:
              }
              D.21699 = __result;
            }
            iftmp.409 = -D.21699;
            goto <D.26092>;
            <D.26055>:
            iftmp.409 = __builtin_strcmp (opt, "precise");
            <D.26092>:
            D.21700 = iftmp.409;
          }
          if (D.21700 == 0) goto <D.26093>; else goto <D.26094>;
          <D.26093>:
          conservative_stack_mark = 0;
          goto <D.26095>;
          <D.26094>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26099 = "conservative";
              D.26100 = MEM[(const unsigned char *)D.26099];
              D.26101 = (int) D.26100;
              D.26102 = *__s2;
              D.26103 = (int) D.26102;
              __result = D.26101 - D.26103;
              {
                D.26104 = __s2_len != 0;
                D.26105 = __result == 0;
                D.26106 = D.26104 & D.26105;
                if (D.26106 != 0) goto <D.26107>; else goto <D.26108>;
                <D.26107>:
                D.26109 = &MEM[(void *)"conservative" + 1B];
                D.26110 = *D.26109;
                D.26111 = (int) D.26110;
                D.26112 = __s2 + 1;
                D.26113 = *D.26112;
                D.26114 = (int) D.26113;
                __result = D.26111 - D.26114;
                D.26115 = __s2_len > 1;
                D.26105 = __result == 0;
                D.26116 = D.26115 & D.26105;
                if (D.26116 != 0) goto <D.26117>; else goto <D.26118>;
                <D.26117>:
                D.26119 = &MEM[(void *)"conservative" + 2B];
                D.26120 = *D.26119;
                D.26121 = (int) D.26120;
                D.26122 = __s2 + 2;
                D.26123 = *D.26122;
                D.26124 = (int) D.26123;
                __result = D.26121 - D.26124;
                D.26125 = __s2_len > 2;
                D.26105 = __result == 0;
                D.26126 = D.26125 & D.26105;
                if (D.26126 != 0) goto <D.26127>; else goto <D.26128>;
                <D.26127>:
                D.26129 = &MEM[(void *)"conservative" + 3B];
                D.26130 = *D.26129;
                D.26131 = (int) D.26130;
                D.26132 = __s2 + 3;
                D.26133 = *D.26132;
                D.26134 = (int) D.26133;
                __result = D.26131 - D.26134;
                <D.26128>:
                <D.26118>:
                <D.26108>:
              }
              D.21708 = __result;
            }
            iftmp.410 = -D.21708;
            goto <D.26135>;
            <D.26098>:
            iftmp.410 = __builtin_strcmp (opt, "conservative");
            <D.26135>:
            D.21709 = iftmp.410;
          }
          if (D.21709 == 0) goto <D.26136>; else goto <D.26137>;
          <D.26136>:
          conservative_stack_mark = 1;
          goto <D.26138>;
          <D.26137>:
          conservative_stack_mark.412 = conservative_stack_mark;
          if (conservative_stack_mark.412 != 0) goto <D.26141>; else goto <D.26142>;
          <D.26141>:
          iftmp.411 = "Using `conservative`.";
          goto <D.26143>;
          <D.26142>:
          iftmp.411 = "Using `precise`.";
          <D.26143>:
          sgen_env_var_error ("MONO_GC_PARAMS", iftmp.411, "Invalid value `%s` for `stack-mark` option, possible values are: `precise`, `conservative`.", opt);
          <D.26138>:
          <D.26095>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26051>:
          D.26144 = monoeg_g_str_has_prefix (opt, "bridge=");
          if (D.26144 != 0) goto <D.26145>; else goto <D.26146>;
          <D.26145>:
          D.26147 = __builtin_strchr (opt, 61);
          opt = D.26147 + 1;
          D.26148 = monoeg_strdup (opt);
          sgen_register_test_bridge_callbacks (D.26148);
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26146>:
          D.26149 = monoeg_g_str_has_prefix (opt, "nursery-size=");
          if (D.26149 != 0) goto <D.26150>; else goto <D.26151>;
          <D.26150>:
          {
            long int val;

            try
              {
                D.26152 = __builtin_strchr (opt, 61);
                opt = D.26152 + 1;
                D.26006 = *opt;
                if (D.26006 != 0) goto <D.26155>; else goto <D.26153>;
                <D.26155>:
                D.26156 = mono_gc_parse_environment_string_extract_number (opt, &val);
                if (D.26156 != 0) goto <D.26157>; else goto <D.26153>;
                <D.26157>:
                val.413 = val;
                D.26159 = val.413 + -1;
                val.413 = val;
                D.26160 = D.26159 & val.413;
                if (D.26160 != 0) goto <D.26161>; else goto <D.26162>;
                <D.26161>:
                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.21688>;
                <D.26162>:
                val.413 = val;
                if (val.413 <= 511) goto <D.26163>; else goto <D.26164>;
                <D.26163>:
                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.21688>;
                <D.26164>:
                val.413 = val;
                sgen_nursery_size.414 = (int) val.413;
                sgen_nursery_size = sgen_nursery_size.414;
                sgen_nursery_bits = 0;
                goto <D.21712>;
                <D.21711>:
                <D.21712>:
                sgen_nursery_bits.415 = sgen_nursery_bits;
                sgen_nursery_bits.416 = sgen_nursery_bits.415 + 1;
                sgen_nursery_bits = sgen_nursery_bits.416;
                sgen_nursery_bits.415 = sgen_nursery_bits;
                D.26168 = 1 << sgen_nursery_bits.415;
                sgen_nursery_size.403 = sgen_nursery_size;
                if (D.26168 != sgen_nursery_size.403) goto <D.21711>; else goto <D.21713>;
                <D.21713>:
                goto <D.26154>;
                <D.26153>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be an integer.");
                // predicted unlikely by continue predictor.
                goto <D.21688>;
                <D.26154>:
                // predicted unlikely by continue predictor.
                goto <D.21688>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.26151>:
          D.26169 = monoeg_g_str_has_prefix (opt, "save-target-ratio=");
          if (D.26169 != 0) goto <D.26170>; else goto <D.26171>;
          <D.26170>:
          {
            double val;

            try
              {
                D.26172 = __builtin_strchr (opt, 61);
                opt = D.26172 + 1;
                D.26173 = parse_double_in_interval ("MONO_GC_PARAMS", "save-target-ratio", opt, 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0, &val);
                if (D.26173 != 0) goto <D.26174>; else goto <D.26175>;
                <D.26174>:
                save_target = val;
                <D.26175>:
                // predicted unlikely by continue predictor.
                goto <D.21688>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.26171>:
          D.26176 = monoeg_g_str_has_prefix (opt, "default-allowance-ratio=");
          if (D.26176 != 0) goto <D.26177>; else goto <D.26178>;
          <D.26177>:
          {
            double val;

            try
              {
                D.26179 = __builtin_strchr (opt, 61);
                opt = D.26179 + 1;
                D.26180 = parse_double_in_interval ("MONO_GC_PARAMS", "default-allowance-ratio", opt, 1.0e+0, 1.0e+0, &val);
                if (D.26180 != 0) goto <D.26181>; else goto <D.26182>;
                <D.26181>:
                allowance_ratio = val;
                <D.26182>:
                // predicted unlikely by continue predictor.
                goto <D.21688>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.26178>:
          D.26183 = monoeg_g_str_has_prefix (opt, "allow-synchronous-major=");
          if (D.26183 != 0) goto <D.26184>; else goto <D.26185>;
          <D.26184>:
          D.26186 = major_collector.is_concurrent;
          if (D.26186 == 0) goto <D.26187>; else goto <D.26188>;
          <D.26187>:
          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.21688>;
          <D.26188>:
          D.26189 = __builtin_strchr (opt, 61);
          opt = D.26189 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26193 = "yes";
              D.26194 = MEM[(const unsigned char *)D.26193];
              D.26195 = (int) D.26194;
              D.26196 = *__s2;
              D.26197 = (int) D.26196;
              __result = D.26195 - D.26197;
              {
                D.26198 = __s2_len != 0;
                D.26199 = __result == 0;
                D.26200 = D.26198 & D.26199;
                if (D.26200 != 0) goto <D.26201>; else goto <D.26202>;
                <D.26201>:
                D.26203 = &MEM[(void *)"yes" + 1B];
                D.26204 = *D.26203;
                D.26205 = (int) D.26204;
                D.26206 = __s2 + 1;
                D.26207 = *D.26206;
                D.26208 = (int) D.26207;
                __result = D.26205 - D.26208;
                D.26209 = __s2_len > 1;
                D.26199 = __result == 0;
                D.26210 = D.26209 & D.26199;
                if (D.26210 != 0) goto <D.26211>; else goto <D.26212>;
                <D.26211>:
                D.26213 = &MEM[(void *)"yes" + 2B];
                D.26214 = *D.26213;
                D.26215 = (int) D.26214;
                D.26216 = __s2 + 2;
                D.26217 = *D.26216;
                D.26218 = (int) D.26217;
                __result = D.26215 - D.26218;
                D.26219 = __s2_len > 2;
                D.26199 = __result == 0;
                D.26220 = D.26219 & D.26199;
                if (D.26220 != 0) goto <D.26221>; else goto <D.26222>;
                <D.26221>:
                D.26223 = &MEM[(void *)"yes" + 3B];
                D.26224 = *D.26223;
                D.26225 = (int) D.26224;
                D.26226 = __s2 + 3;
                D.26227 = *D.26226;
                D.26228 = (int) D.26227;
                __result = D.26225 - D.26228;
                <D.26222>:
                <D.26212>:
                <D.26202>:
              }
              D.21723 = __result;
            }
            iftmp.417 = -D.21723;
            goto <D.26229>;
            <D.26192>:
            iftmp.417 = __builtin_strcmp (opt, "yes");
            <D.26229>:
            D.21724 = iftmp.417;
          }
          if (D.21724 == 0) goto <D.26230>; else goto <D.26231>;
          <D.26230>:
          allow_synchronous_major = 1;
          goto <D.26232>;
          <D.26231>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26236 = "no";
              D.26237 = MEM[(const unsigned char *)D.26236];
              D.26238 = (int) D.26237;
              D.26239 = *__s2;
              D.26240 = (int) D.26239;
              __result = D.26238 - D.26240;
              {
                D.26241 = __s2_len != 0;
                D.26242 = __result == 0;
                D.26243 = D.26241 & D.26242;
                if (D.26243 != 0) goto <D.26244>; else goto <D.26245>;
                <D.26244>:
                D.26246 = &MEM[(void *)"no" + 1B];
                D.26247 = *D.26246;
                D.26248 = (int) D.26247;
                D.26249 = __s2 + 1;
                D.26250 = *D.26249;
                D.26251 = (int) D.26250;
                __result = D.26248 - D.26251;
                D.26252 = __s2_len > 1;
                D.26242 = __result == 0;
                D.26253 = D.26252 & D.26242;
                if (D.26253 != 0) goto <D.26254>; else goto <D.26255>;
                <D.26254>:
                D.26256 = &MEM[(void *)"no" + 2B];
                D.26257 = *D.26256;
                D.26258 = (int) D.26257;
                D.26259 = __s2 + 2;
                D.26260 = *D.26259;
                D.26261 = (int) D.26260;
                __result = D.26258 - D.26261;
                D.26262 = __s2_len > 2;
                D.26242 = __result == 0;
                D.26263 = D.26262 & D.26242;
                if (D.26263 != 0) goto <D.26264>; else goto <D.26265>;
                <D.26264>:
                D.26266 = &MEM[(void *)"no" + 3B];
                D.26267 = *D.26266;
                D.26268 = (int) D.26267;
                D.26269 = __s2 + 3;
                D.26270 = *D.26269;
                D.26271 = (int) D.26270;
                __result = D.26268 - D.26271;
                <D.26265>:
                <D.26255>:
                <D.26245>:
              }
              D.21732 = __result;
            }
            iftmp.418 = -D.21732;
            goto <D.26272>;
            <D.26235>:
            iftmp.418 = __builtin_strcmp (opt, "no");
            <D.26272>:
            D.21733 = iftmp.418;
          }
          if (D.21733 == 0) goto <D.26273>; else goto <D.26274>;
          <D.26273>:
          allow_synchronous_major = 0;
          goto <D.26275>;
          <D.26274>:
          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.21688>;
          <D.26275>:
          <D.26232>:
          <D.26185>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26279 = "cementing";
              D.26280 = MEM[(const unsigned char *)D.26279];
              D.26281 = (int) D.26280;
              D.26282 = *__s2;
              D.26283 = (int) D.26282;
              __result = D.26281 - D.26283;
              {
                D.26284 = __s2_len != 0;
                D.26285 = __result == 0;
                D.26286 = D.26284 & D.26285;
                if (D.26286 != 0) goto <D.26287>; else goto <D.26288>;
                <D.26287>:
                D.26289 = &MEM[(void *)"cementing" + 1B];
                D.26290 = *D.26289;
                D.26291 = (int) D.26290;
                D.26292 = __s2 + 1;
                D.26293 = *D.26292;
                D.26294 = (int) D.26293;
                __result = D.26291 - D.26294;
                D.26295 = __s2_len > 1;
                D.26285 = __result == 0;
                D.26296 = D.26295 & D.26285;
                if (D.26296 != 0) goto <D.26297>; else goto <D.26298>;
                <D.26297>:
                D.26299 = &MEM[(void *)"cementing" + 2B];
                D.26300 = *D.26299;
                D.26301 = (int) D.26300;
                D.26302 = __s2 + 2;
                D.26303 = *D.26302;
                D.26304 = (int) D.26303;
                __result = D.26301 - D.26304;
                D.26305 = __s2_len > 2;
                D.26285 = __result == 0;
                D.26306 = D.26305 & D.26285;
                if (D.26306 != 0) goto <D.26307>; else goto <D.26308>;
                <D.26307>:
                D.26309 = &MEM[(void *)"cementing" + 3B];
                D.26310 = *D.26309;
                D.26311 = (int) D.26310;
                D.26312 = __s2 + 3;
                D.26313 = *D.26312;
                D.26314 = (int) D.26313;
                __result = D.26311 - D.26314;
                <D.26308>:
                <D.26298>:
                <D.26288>:
              }
              D.21741 = __result;
            }
            iftmp.419 = -D.21741;
            goto <D.26315>;
            <D.26278>:
            iftmp.419 = __builtin_strcmp (opt, "cementing");
            <D.26315>:
            D.21742 = iftmp.419;
          }
          if (D.21742 == 0) goto <D.26316>; else goto <D.26317>;
          <D.26316>:
          D.25938 = major_collector.is_parallel;
          if (D.25938 != 0) goto <D.26318>; else goto <D.26319>;
          <D.26318>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "`cementing` is not supported for the parallel major collector.");
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26319>:
          cement_enabled = 1;
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26317>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26323 = "no-cementing";
              D.26324 = MEM[(const unsigned char *)D.26323];
              D.26325 = (int) D.26324;
              D.26326 = *__s2;
              D.26327 = (int) D.26326;
              __result = D.26325 - D.26327;
              {
                D.26328 = __s2_len != 0;
                D.26329 = __result == 0;
                D.26330 = D.26328 & D.26329;
                if (D.26330 != 0) goto <D.26331>; else goto <D.26332>;
                <D.26331>:
                D.26333 = &MEM[(void *)"no-cementing" + 1B];
                D.26334 = *D.26333;
                D.26335 = (int) D.26334;
                D.26336 = __s2 + 1;
                D.26337 = *D.26336;
                D.26338 = (int) D.26337;
                __result = D.26335 - D.26338;
                D.26339 = __s2_len > 1;
                D.26329 = __result == 0;
                D.26340 = D.26339 & D.26329;
                if (D.26340 != 0) goto <D.26341>; else goto <D.26342>;
                <D.26341>:
                D.26343 = &MEM[(void *)"no-cementing" + 2B];
                D.26344 = *D.26343;
                D.26345 = (int) D.26344;
                D.26346 = __s2 + 2;
                D.26347 = *D.26346;
                D.26348 = (int) D.26347;
                __result = D.26345 - D.26348;
                D.26349 = __s2_len > 2;
                D.26329 = __result == 0;
                D.26350 = D.26349 & D.26329;
                if (D.26350 != 0) goto <D.26351>; else goto <D.26352>;
                <D.26351>:
                D.26353 = &MEM[(void *)"no-cementing" + 3B];
                D.26354 = *D.26353;
                D.26355 = (int) D.26354;
                D.26356 = __s2 + 3;
                D.26357 = *D.26356;
                D.26358 = (int) D.26357;
                __result = D.26355 - D.26358;
                <D.26352>:
                <D.26342>:
                <D.26332>:
              }
              D.21750 = __result;
            }
            iftmp.420 = -D.21750;
            goto <D.26359>;
            <D.26322>:
            iftmp.420 = __builtin_strcmp (opt, "no-cementing");
            <D.26359>:
            D.21751 = iftmp.420;
          }
          if (D.21751 == 0) goto <D.26360>; else goto <D.26361>;
          <D.26360>:
          cement_enabled = 0;
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26361>:
          D.26362 = major_collector.handle_gc_param;
          if (D.26362 != 0B) goto <D.26363>; else goto <D.26364>;
          <D.26363>:
          D.26362 = major_collector.handle_gc_param;
          D.26365 = D.26362 (opt);
          if (D.26365 != 0) goto <D.26366>; else goto <D.26367>;
          <D.26366>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26367>:
          <D.26364>:
          D.26368 = sgen_minor_collector.handle_gc_param;
          if (D.26368 != 0B) goto <D.26369>; else goto <D.26370>;
          <D.26369>:
          D.26368 = sgen_minor_collector.handle_gc_param;
          D.26371 = D.26368 (opt);
          if (D.26371 != 0) goto <D.26372>; else goto <D.26373>;
          <D.26372>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26373>:
          <D.26370>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.26374>; else goto <D.26375>;
          <D.26374>:
          // predicted unlikely by continue predictor.
          goto <D.21688>;
          <D.26375>:
          stderr.395 = stderr;
          fprintf (stderr.395, "\n%s must be a comma-delimited list of one or more of the following:\n", "MONO_GC_PARAMS");
          stderr.395 = stderr;
          fprintf (stderr.395, "  max-heap-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  soft-heap-limit=n (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  nursery-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  major=COLLECTOR (where COLLECTOR is `marksweep\', `marksweep-conc\', `marksweep-par\', \'marksweep-fixed\' or \'marksweep-fixed-par\')\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  minor=COLLECTOR (where COLLECTOR is `simple\' or `split\')\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  wbarrier=WBARRIER (where WBARRIER is `remset\' or `cardtable\')\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  stack-mark=MARK-METHOD (where MARK-METHOD is \'precise\' or \'conservative\')\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  [no-]cementing\n");
          D.26186 = major_collector.is_concurrent;
          if (D.26186 != 0) goto <D.26376>; else goto <D.26377>;
          <D.26376>:
          stderr.395 = stderr;
          fprintf (stderr.395, "  allow-synchronous-major=FLAG (where FLAG is `yes\' or `no\')\n");
          <D.26377>:
          D.26378 = major_collector.print_gc_param_usage;
          if (D.26378 != 0B) goto <D.26379>; else goto <D.26380>;
          <D.26379>:
          D.26378 = major_collector.print_gc_param_usage;
          D.26378 ();
          <D.26380>:
          D.26381 = sgen_minor_collector.print_gc_param_usage;
          if (D.26381 != 0B) goto <D.26382>; else goto <D.26383>;
          <D.26382>:
          D.26381 = sgen_minor_collector.print_gc_param_usage;
          D.26381 ();
          <D.26383>:
          stderr.395 = stderr;
          fprintf (stderr.395, " Experimental options:\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  save-target-ratio=R (where R must be between %.2f - %.2f).\n", 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0);
          stderr.395 = stderr;
          fprintf (stderr.395, "  default-allowance-ratio=R (where R must be between %.2f - %.2f).\n", 1.0e+0, 1.0e+1);
          stderr.395 = stderr;
          fprintf (stderr.395, "\n");
          usage_printed = 1;
        }
        <D.21688>:
        ptr = ptr + 8;
        <D.21753>:
        D.25625 = *ptr;
        if (D.25625 != 0B) goto <D.21752>; else goto <D.21754>;
        <D.21754>:
        monoeg_g_strfreev (opts);
      }
      <D.25950>:
      D.25938 = major_collector.is_parallel;
      if (D.25938 != 0) goto <D.26384>; else goto <D.26385>;
      <D.26384>:
      cement_enabled = 0;
      sgen_workers_init (num_workers);
      goto <D.26386>;
      <D.26385>:
      D.26186 = major_collector.is_concurrent;
      if (D.26186 != 0) goto <D.26387>; else goto <D.26388>;
      <D.26387>:
      sgen_workers_init (1);
      <D.26388>:
      <D.26386>:
      if (major_collector_opt != 0B) goto <D.26389>; else goto <D.26390>;
      <D.26389>:
      monoeg_g_free (major_collector_opt);
      <D.26390>:
      if (minor_collector_opt != 0B) goto <D.26391>; else goto <D.26392>;
      <D.26391>:
      monoeg_g_free (minor_collector_opt);
      <D.26392>:
      alloc_nursery ();
      sgen_cement_init (cement_enabled);
      env = monoeg_g_getenv ("MONO_GC_DEBUG");
      if (env != 0B) goto <D.26393>; else goto <D.26394>;
      <D.26393>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.25954 = "";
              D.25955 = MEM[(const unsigned char *)D.25954];
              D.25956 = (int) D.25955;
              D.26398 = *__s2;
              D.26399 = (int) D.26398;
              __result = D.25956 - D.26399;
              {
                D.26400 = __s2_len != 0;
                D.26401 = __result == 0;
                D.26402 = D.26400 & D.26401;
                if (D.26402 != 0) goto <D.26403>; else goto <D.26404>;
                <D.26403>:
                D.25964 = &MEM[(void *)"" + 1B];
                D.25965 = *D.25964;
                D.25966 = (int) D.25965;
                D.26405 = __s2 + 1;
                D.26406 = *D.26405;
                D.26407 = (int) D.26406;
                __result = D.25966 - D.26407;
                D.26408 = __s2_len > 1;
                D.26401 = __result == 0;
                D.26409 = D.26408 & D.26401;
                if (D.26409 != 0) goto <D.26410>; else goto <D.26411>;
                <D.26410>:
                D.25974 = &MEM[(void *)"" + 2B];
                D.25975 = *D.25974;
                D.25976 = (int) D.25975;
                D.26412 = __s2 + 2;
                D.26413 = *D.26412;
                D.26414 = (int) D.26413;
                __result = D.25976 - D.26414;
                D.26415 = __s2_len > 2;
                D.26401 = __result == 0;
                D.26416 = D.26415 & D.26401;
                if (D.26416 != 0) goto <D.26417>; else goto <D.26418>;
                <D.26417>:
                D.25984 = &MEM[(void *)"" + 3B];
                D.25985 = *D.25984;
                D.25986 = (int) D.25985;
                D.26419 = __s2 + 3;
                D.26420 = *D.26419;
                D.26421 = (int) D.26420;
                __result = D.25986 - D.26421;
                <D.26418>:
                <D.26411>:
                <D.26404>:
              }
              D.21764 = __result;
            }
            iftmp.421 = -D.21764;
            goto <D.26422>;
            <D.26397>:
            D.26423 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.421 = (int) D.26423;
            <D.26422>:
            D.21765 = iftmp.421;
          }
          if (D.21765 == 0) goto <D.26424>; else goto <D.26425>;
          <D.26424>:
          // predicted unlikely by continue predictor.
          goto <D.21766>;
          <D.26425>:
          D.26426 = *opt;
          D.26427 = (unsigned char) D.26426;
          D.26428 = D.26427 + 208;
          if (D.26428 <= 9) goto <D.26429>; else goto <D.26430>;
          <D.26429>:
          gc_debug_level.422 = atoi (opt);
          gc_debug_level = gc_debug_level.422;
          opt = opt + 1;
          D.26426 = *opt;
          if (D.26426 == 58) goto <D.26432>; else goto <D.26433>;
          <D.26432>:
          opt = opt + 1;
          <D.26433>:
          D.26426 = *opt;
          if (D.26426 != 0) goto <D.26434>; else goto <D.26435>;
          <D.26434>:
          {
            char * rf;

            D.26436 = getpid ();
            rf = monoeg_g_strdup_printf ("%s.%d", opt, D.26436);
            gc_debug_file.423 = fopen (rf, "wb");
            gc_debug_file = gc_debug_file.423;
            gc_debug_file.424 = gc_debug_file;
            if (gc_debug_file.424 == 0B) goto <D.26439>; else goto <D.26440>;
            <D.26439>:
            stderr.395 = stderr;
            gc_debug_file = stderr.395;
            <D.26440>:
            monoeg_g_free (rf);
          }
          <D.26435>:
          goto <D.26441>;
          <D.26430>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26445 = "print-allowance";
              D.26446 = MEM[(const unsigned char *)D.26445];
              D.26447 = (int) D.26446;
              D.26448 = *__s2;
              D.26449 = (int) D.26448;
              __result = D.26447 - D.26449;
              {
                D.26450 = __s2_len != 0;
                D.26451 = __result == 0;
                D.26452 = D.26450 & D.26451;
                if (D.26452 != 0) goto <D.26453>; else goto <D.26454>;
                <D.26453>:
                D.26455 = &MEM[(void *)"print-allowance" + 1B];
                D.26456 = *D.26455;
                D.26457 = (int) D.26456;
                D.26458 = __s2 + 1;
                D.26459 = *D.26458;
                D.26460 = (int) D.26459;
                __result = D.26457 - D.26460;
                D.26461 = __s2_len > 1;
                D.26451 = __result == 0;
                D.26462 = D.26461 & D.26451;
                if (D.26462 != 0) goto <D.26463>; else goto <D.26464>;
                <D.26463>:
                D.26465 = &MEM[(void *)"print-allowance" + 2B];
                D.26466 = *D.26465;
                D.26467 = (int) D.26466;
                D.26468 = __s2 + 2;
                D.26469 = *D.26468;
                D.26470 = (int) D.26469;
                __result = D.26467 - D.26470;
                D.26471 = __s2_len > 2;
                D.26451 = __result == 0;
                D.26472 = D.26471 & D.26451;
                if (D.26472 != 0) goto <D.26473>; else goto <D.26474>;
                <D.26473>:
                D.26475 = &MEM[(void *)"print-allowance" + 3B];
                D.26476 = *D.26475;
                D.26477 = (int) D.26476;
                D.26478 = __s2 + 3;
                D.26479 = *D.26478;
                D.26480 = (int) D.26479;
                __result = D.26477 - D.26480;
                <D.26474>:
                <D.26464>:
                <D.26454>:
              }
              D.21775 = __result;
            }
            iftmp.425 = -D.21775;
            goto <D.26481>;
            <D.26444>:
            iftmp.425 = __builtin_strcmp (opt, "print-allowance");
            <D.26481>:
            D.21776 = iftmp.425;
          }
          if (D.21776 == 0) goto <D.26482>; else goto <D.26483>;
          <D.26482>:
          debug_print_allowance = 1;
          goto <D.26484>;
          <D.26483>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26488 = "print-pinning";
              D.26489 = MEM[(const unsigned char *)D.26488];
              D.26490 = (int) D.26489;
              D.26491 = *__s2;
              D.26492 = (int) D.26491;
              __result = D.26490 - D.26492;
              {
                D.26493 = __s2_len != 0;
                D.26494 = __result == 0;
                D.26495 = D.26493 & D.26494;
                if (D.26495 != 0) goto <D.26496>; else goto <D.26497>;
                <D.26496>:
                D.26498 = &MEM[(void *)"print-pinning" + 1B];
                D.26499 = *D.26498;
                D.26500 = (int) D.26499;
                D.26501 = __s2 + 1;
                D.26502 = *D.26501;
                D.26503 = (int) D.26502;
                __result = D.26500 - D.26503;
                D.26504 = __s2_len > 1;
                D.26494 = __result == 0;
                D.26505 = D.26504 & D.26494;
                if (D.26505 != 0) goto <D.26506>; else goto <D.26507>;
                <D.26506>:
                D.26508 = &MEM[(void *)"print-pinning" + 2B];
                D.26509 = *D.26508;
                D.26510 = (int) D.26509;
                D.26511 = __s2 + 2;
                D.26512 = *D.26511;
                D.26513 = (int) D.26512;
                __result = D.26510 - D.26513;
                D.26514 = __s2_len > 2;
                D.26494 = __result == 0;
                D.26515 = D.26514 & D.26494;
                if (D.26515 != 0) goto <D.26516>; else goto <D.26517>;
                <D.26516>:
                D.26518 = &MEM[(void *)"print-pinning" + 3B];
                D.26519 = *D.26518;
                D.26520 = (int) D.26519;
                D.26521 = __s2 + 3;
                D.26522 = *D.26521;
                D.26523 = (int) D.26522;
                __result = D.26520 - D.26523;
                <D.26517>:
                <D.26507>:
                <D.26497>:
              }
              D.21784 = __result;
            }
            iftmp.426 = -D.21784;
            goto <D.26524>;
            <D.26487>:
            iftmp.426 = __builtin_strcmp (opt, "print-pinning");
            <D.26524>:
            D.21785 = iftmp.426;
          }
          if (D.21785 == 0) goto <D.26525>; else goto <D.26526>;
          <D.26525>:
          do_pin_stats = 1;
          goto <D.26527>;
          <D.26526>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26531 = "verify-before-allocs";
              D.26532 = MEM[(const unsigned char *)D.26531];
              D.26533 = (int) D.26532;
              D.26534 = *__s2;
              D.26535 = (int) D.26534;
              __result = D.26533 - D.26535;
              {
                D.26536 = __s2_len != 0;
                D.26537 = __result == 0;
                D.26538 = D.26536 & D.26537;
                if (D.26538 != 0) goto <D.26539>; else goto <D.26540>;
                <D.26539>:
                D.26541 = &MEM[(void *)"verify-before-allocs" + 1B];
                D.26542 = *D.26541;
                D.26543 = (int) D.26542;
                D.26544 = __s2 + 1;
                D.26545 = *D.26544;
                D.26546 = (int) D.26545;
                __result = D.26543 - D.26546;
                D.26547 = __s2_len > 1;
                D.26537 = __result == 0;
                D.26548 = D.26547 & D.26537;
                if (D.26548 != 0) goto <D.26549>; else goto <D.26550>;
                <D.26549>:
                D.26551 = &MEM[(void *)"verify-before-allocs" + 2B];
                D.26552 = *D.26551;
                D.26553 = (int) D.26552;
                D.26554 = __s2 + 2;
                D.26555 = *D.26554;
                D.26556 = (int) D.26555;
                __result = D.26553 - D.26556;
                D.26557 = __s2_len > 2;
                D.26537 = __result == 0;
                D.26558 = D.26557 & D.26537;
                if (D.26558 != 0) goto <D.26559>; else goto <D.26560>;
                <D.26559>:
                D.26561 = &MEM[(void *)"verify-before-allocs" + 3B];
                D.26562 = *D.26561;
                D.26563 = (int) D.26562;
                D.26564 = __s2 + 3;
                D.26565 = *D.26564;
                D.26566 = (int) D.26565;
                __result = D.26563 - D.26566;
                <D.26560>:
                <D.26550>:
                <D.26540>:
              }
              D.21793 = __result;
            }
            iftmp.427 = -D.21793;
            goto <D.26567>;
            <D.26530>:
            iftmp.427 = __builtin_strcmp (opt, "verify-before-allocs");
            <D.26567>:
            D.21794 = iftmp.427;
          }
          if (D.21794 == 0) goto <D.26568>; else goto <D.26569>;
          <D.26568>:
          verify_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.26570>;
          <D.26569>:
          D.26571 = monoeg_g_str_has_prefix (opt, "verify-before-allocs=");
          if (D.26571 != 0) goto <D.26572>; else goto <D.26573>;
          <D.26572>:
          {
            char * arg;

            D.26574 = __builtin_strchr (opt, 61);
            arg = D.26574 + 1;
            D.26575 = atoi (arg);
            verify_before_allocs.428 = (unsigned int) D.26575;
            verify_before_allocs = verify_before_allocs.428;
            has_per_allocation_action = 1;
          }
          goto <D.26577>;
          <D.26573>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26581 = "collect-before-allocs";
              D.26582 = MEM[(const unsigned char *)D.26581];
              D.26583 = (int) D.26582;
              D.26584 = *__s2;
              D.26585 = (int) D.26584;
              __result = D.26583 - D.26585;
              {
                D.26586 = __s2_len != 0;
                D.26587 = __result == 0;
                D.26588 = D.26586 & D.26587;
                if (D.26588 != 0) goto <D.26589>; else goto <D.26590>;
                <D.26589>:
                D.26591 = &MEM[(void *)"collect-before-allocs" + 1B];
                D.26592 = *D.26591;
                D.26593 = (int) D.26592;
                D.26594 = __s2 + 1;
                D.26595 = *D.26594;
                D.26596 = (int) D.26595;
                __result = D.26593 - D.26596;
                D.26597 = __s2_len > 1;
                D.26587 = __result == 0;
                D.26598 = D.26597 & D.26587;
                if (D.26598 != 0) goto <D.26599>; else goto <D.26600>;
                <D.26599>:
                D.26601 = &MEM[(void *)"collect-before-allocs" + 2B];
                D.26602 = *D.26601;
                D.26603 = (int) D.26602;
                D.26604 = __s2 + 2;
                D.26605 = *D.26604;
                D.26606 = (int) D.26605;
                __result = D.26603 - D.26606;
                D.26607 = __s2_len > 2;
                D.26587 = __result == 0;
                D.26608 = D.26607 & D.26587;
                if (D.26608 != 0) goto <D.26609>; else goto <D.26610>;
                <D.26609>:
                D.26611 = &MEM[(void *)"collect-before-allocs" + 3B];
                D.26612 = *D.26611;
                D.26613 = (int) D.26612;
                D.26614 = __s2 + 3;
                D.26615 = *D.26614;
                D.26616 = (int) D.26615;
                __result = D.26613 - D.26616;
                <D.26610>:
                <D.26600>:
                <D.26590>:
              }
              D.21803 = __result;
            }
            iftmp.429 = -D.21803;
            goto <D.26617>;
            <D.26580>:
            iftmp.429 = __builtin_strcmp (opt, "collect-before-allocs");
            <D.26617>:
            D.21804 = iftmp.429;
          }
          if (D.21804 == 0) goto <D.26618>; else goto <D.26619>;
          <D.26618>:
          collect_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.26620>;
          <D.26619>:
          D.26621 = monoeg_g_str_has_prefix (opt, "collect-before-allocs=");
          if (D.26621 != 0) goto <D.26622>; else goto <D.26623>;
          <D.26622>:
          {
            char * arg;

            D.26624 = __builtin_strchr (opt, 61);
            arg = D.26624 + 1;
            has_per_allocation_action = 1;
            D.26625 = atoi (arg);
            collect_before_allocs.430 = (unsigned int) D.26625;
            collect_before_allocs = collect_before_allocs.430;
          }
          goto <D.26627>;
          <D.26623>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26631 = "verify-before-collections";
              D.26632 = MEM[(const unsigned char *)D.26631];
              D.26633 = (int) D.26632;
              D.26634 = *__s2;
              D.26635 = (int) D.26634;
              __result = D.26633 - D.26635;
              {
                D.26636 = __s2_len != 0;
                D.26637 = __result == 0;
                D.26638 = D.26636 & D.26637;
                if (D.26638 != 0) goto <D.26639>; else goto <D.26640>;
                <D.26639>:
                D.26641 = &MEM[(void *)"verify-before-collections" + 1B];
                D.26642 = *D.26641;
                D.26643 = (int) D.26642;
                D.26644 = __s2 + 1;
                D.26645 = *D.26644;
                D.26646 = (int) D.26645;
                __result = D.26643 - D.26646;
                D.26647 = __s2_len > 1;
                D.26637 = __result == 0;
                D.26648 = D.26647 & D.26637;
                if (D.26648 != 0) goto <D.26649>; else goto <D.26650>;
                <D.26649>:
                D.26651 = &MEM[(void *)"verify-before-collections" + 2B];
                D.26652 = *D.26651;
                D.26653 = (int) D.26652;
                D.26654 = __s2 + 2;
                D.26655 = *D.26654;
                D.26656 = (int) D.26655;
                __result = D.26653 - D.26656;
                D.26657 = __s2_len > 2;
                D.26637 = __result == 0;
                D.26658 = D.26657 & D.26637;
                if (D.26658 != 0) goto <D.26659>; else goto <D.26660>;
                <D.26659>:
                D.26661 = &MEM[(void *)"verify-before-collections" + 3B];
                D.26662 = *D.26661;
                D.26663 = (int) D.26662;
                D.26664 = __s2 + 3;
                D.26665 = *D.26664;
                D.26666 = (int) D.26665;
                __result = D.26663 - D.26666;
                <D.26660>:
                <D.26650>:
                <D.26640>:
              }
              D.21813 = __result;
            }
            iftmp.431 = -D.21813;
            goto <D.26667>;
            <D.26630>:
            iftmp.431 = __builtin_strcmp (opt, "verify-before-collections");
            <D.26667>:
            D.21814 = iftmp.431;
          }
          if (D.21814 == 0) goto <D.26668>; else goto <D.26669>;
          <D.26668>:
          whole_heap_check_before_collection = 1;
          goto <D.26670>;
          <D.26669>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26674 = "check-at-minor-collections";
              D.26675 = MEM[(const unsigned char *)D.26674];
              D.26676 = (int) D.26675;
              D.26677 = *__s2;
              D.26678 = (int) D.26677;
              __result = D.26676 - D.26678;
              {
                D.26679 = __s2_len != 0;
                D.26680 = __result == 0;
                D.26681 = D.26679 & D.26680;
                if (D.26681 != 0) goto <D.26682>; else goto <D.26683>;
                <D.26682>:
                D.26684 = &MEM[(void *)"check-at-minor-collections" + 1B];
                D.26685 = *D.26684;
                D.26686 = (int) D.26685;
                D.26687 = __s2 + 1;
                D.26688 = *D.26687;
                D.26689 = (int) D.26688;
                __result = D.26686 - D.26689;
                D.26690 = __s2_len > 1;
                D.26680 = __result == 0;
                D.26691 = D.26690 & D.26680;
                if (D.26691 != 0) goto <D.26692>; else goto <D.26693>;
                <D.26692>:
                D.26694 = &MEM[(void *)"check-at-minor-collections" + 2B];
                D.26695 = *D.26694;
                D.26696 = (int) D.26695;
                D.26697 = __s2 + 2;
                D.26698 = *D.26697;
                D.26699 = (int) D.26698;
                __result = D.26696 - D.26699;
                D.26700 = __s2_len > 2;
                D.26680 = __result == 0;
                D.26701 = D.26700 & D.26680;
                if (D.26701 != 0) goto <D.26702>; else goto <D.26703>;
                <D.26702>:
                D.26704 = &MEM[(void *)"check-at-minor-collections" + 3B];
                D.26705 = *D.26704;
                D.26706 = (int) D.26705;
                D.26707 = __s2 + 3;
                D.26708 = *D.26707;
                D.26709 = (int) D.26708;
                __result = D.26706 - D.26709;
                <D.26703>:
                <D.26693>:
                <D.26683>:
              }
              D.21822 = __result;
            }
            iftmp.432 = -D.21822;
            goto <D.26710>;
            <D.26673>:
            iftmp.432 = __builtin_strcmp (opt, "check-at-minor-collections");
            <D.26710>:
            D.21823 = iftmp.432;
          }
          if (D.21823 == 0) goto <D.26711>; else goto <D.26712>;
          <D.26711>:
          consistency_check_at_minor_collection = 1;
          nursery_clear_policy = 0;
          goto <D.26713>;
          <D.26712>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26717 = "mod-union-consistency-check";
              D.26718 = MEM[(const unsigned char *)D.26717];
              D.26719 = (int) D.26718;
              D.26720 = *__s2;
              D.26721 = (int) D.26720;
              __result = D.26719 - D.26721;
              {
                D.26722 = __s2_len != 0;
                D.26723 = __result == 0;
                D.26724 = D.26722 & D.26723;
                if (D.26724 != 0) goto <D.26725>; else goto <D.26726>;
                <D.26725>:
                D.26727 = &MEM[(void *)"mod-union-consistency-check" + 1B];
                D.26728 = *D.26727;
                D.26729 = (int) D.26728;
                D.26730 = __s2 + 1;
                D.26731 = *D.26730;
                D.26732 = (int) D.26731;
                __result = D.26729 - D.26732;
                D.26733 = __s2_len > 1;
                D.26723 = __result == 0;
                D.26734 = D.26733 & D.26723;
                if (D.26734 != 0) goto <D.26735>; else goto <D.26736>;
                <D.26735>:
                D.26737 = &MEM[(void *)"mod-union-consistency-check" + 2B];
                D.26738 = *D.26737;
                D.26739 = (int) D.26738;
                D.26740 = __s2 + 2;
                D.26741 = *D.26740;
                D.26742 = (int) D.26741;
                __result = D.26739 - D.26742;
                D.26743 = __s2_len > 2;
                D.26723 = __result == 0;
                D.26744 = D.26743 & D.26723;
                if (D.26744 != 0) goto <D.26745>; else goto <D.26746>;
                <D.26745>:
                D.26747 = &MEM[(void *)"mod-union-consistency-check" + 3B];
                D.26748 = *D.26747;
                D.26749 = (int) D.26748;
                D.26750 = __s2 + 3;
                D.26751 = *D.26750;
                D.26752 = (int) D.26751;
                __result = D.26749 - D.26752;
                <D.26746>:
                <D.26736>:
                <D.26726>:
              }
              D.21831 = __result;
            }
            iftmp.433 = -D.21831;
            goto <D.26753>;
            <D.26716>:
            iftmp.433 = __builtin_strcmp (opt, "mod-union-consistency-check");
            <D.26753>:
            D.21832 = iftmp.433;
          }
          if (D.21832 == 0) goto <D.26754>; else goto <D.26755>;
          <D.26754>:
          D.26186 = major_collector.is_concurrent;
          if (D.26186 == 0) goto <D.26756>; else goto <D.26757>;
          <D.26756>:
          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.21766>;
          <D.26757>:
          mod_union_consistency_check = 1;
          goto <D.26758>;
          <D.26755>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26762 = "check-mark-bits";
              D.26763 = MEM[(const unsigned char *)D.26762];
              D.26764 = (int) D.26763;
              D.26765 = *__s2;
              D.26766 = (int) D.26765;
              __result = D.26764 - D.26766;
              {
                D.26767 = __s2_len != 0;
                D.26768 = __result == 0;
                D.26769 = D.26767 & D.26768;
                if (D.26769 != 0) goto <D.26770>; else goto <D.26771>;
                <D.26770>:
                D.26772 = &MEM[(void *)"check-mark-bits" + 1B];
                D.26773 = *D.26772;
                D.26774 = (int) D.26773;
                D.26775 = __s2 + 1;
                D.26776 = *D.26775;
                D.26777 = (int) D.26776;
                __result = D.26774 - D.26777;
                D.26778 = __s2_len > 1;
                D.26768 = __result == 0;
                D.26779 = D.26778 & D.26768;
                if (D.26779 != 0) goto <D.26780>; else goto <D.26781>;
                <D.26780>:
                D.26782 = &MEM[(void *)"check-mark-bits" + 2B];
                D.26783 = *D.26782;
                D.26784 = (int) D.26783;
                D.26785 = __s2 + 2;
                D.26786 = *D.26785;
                D.26787 = (int) D.26786;
                __result = D.26784 - D.26787;
                D.26788 = __s2_len > 2;
                D.26768 = __result == 0;
                D.26789 = D.26788 & D.26768;
                if (D.26789 != 0) goto <D.26790>; else goto <D.26791>;
                <D.26790>:
                D.26792 = &MEM[(void *)"check-mark-bits" + 3B];
                D.26793 = *D.26792;
                D.26794 = (int) D.26793;
                D.26795 = __s2 + 3;
                D.26796 = *D.26795;
                D.26797 = (int) D.26796;
                __result = D.26794 - D.26797;
                <D.26791>:
                <D.26781>:
                <D.26771>:
              }
              D.21840 = __result;
            }
            iftmp.434 = -D.21840;
            goto <D.26798>;
            <D.26761>:
            iftmp.434 = __builtin_strcmp (opt, "check-mark-bits");
            <D.26798>:
            D.21841 = iftmp.434;
          }
          if (D.21841 == 0) goto <D.26799>; else goto <D.26800>;
          <D.26799>:
          check_mark_bits_after_major_collection = 1;
          goto <D.26801>;
          <D.26800>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26805 = "check-nursery-pinned";
              D.26806 = MEM[(const unsigned char *)D.26805];
              D.26807 = (int) D.26806;
              D.26808 = *__s2;
              D.26809 = (int) D.26808;
              __result = D.26807 - D.26809;
              {
                D.26810 = __s2_len != 0;
                D.26811 = __result == 0;
                D.26812 = D.26810 & D.26811;
                if (D.26812 != 0) goto <D.26813>; else goto <D.26814>;
                <D.26813>:
                D.26815 = &MEM[(void *)"check-nursery-pinned" + 1B];
                D.26816 = *D.26815;
                D.26817 = (int) D.26816;
                D.26818 = __s2 + 1;
                D.26819 = *D.26818;
                D.26820 = (int) D.26819;
                __result = D.26817 - D.26820;
                D.26821 = __s2_len > 1;
                D.26811 = __result == 0;
                D.26822 = D.26821 & D.26811;
                if (D.26822 != 0) goto <D.26823>; else goto <D.26824>;
                <D.26823>:
                D.26825 = &MEM[(void *)"check-nursery-pinned" + 2B];
                D.26826 = *D.26825;
                D.26827 = (int) D.26826;
                D.26828 = __s2 + 2;
                D.26829 = *D.26828;
                D.26830 = (int) D.26829;
                __result = D.26827 - D.26830;
                D.26831 = __s2_len > 2;
                D.26811 = __result == 0;
                D.26832 = D.26831 & D.26811;
                if (D.26832 != 0) goto <D.26833>; else goto <D.26834>;
                <D.26833>:
                D.26835 = &MEM[(void *)"check-nursery-pinned" + 3B];
                D.26836 = *D.26835;
                D.26837 = (int) D.26836;
                D.26838 = __s2 + 3;
                D.26839 = *D.26838;
                D.26840 = (int) D.26839;
                __result = D.26837 - D.26840;
                <D.26834>:
                <D.26824>:
                <D.26814>:
              }
              D.21849 = __result;
            }
            iftmp.435 = -D.21849;
            goto <D.26841>;
            <D.26804>:
            iftmp.435 = __builtin_strcmp (opt, "check-nursery-pinned");
            <D.26841>:
            D.21850 = iftmp.435;
          }
          if (D.21850 == 0) goto <D.26842>; else goto <D.26843>;
          <D.26842>:
          check_nursery_objects_pinned = 1;
          goto <D.26844>;
          <D.26843>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26848 = "xdomain-checks";
              D.26849 = MEM[(const unsigned char *)D.26848];
              D.26850 = (int) D.26849;
              D.26851 = *__s2;
              D.26852 = (int) D.26851;
              __result = D.26850 - D.26852;
              {
                D.26853 = __s2_len != 0;
                D.26854 = __result == 0;
                D.26855 = D.26853 & D.26854;
                if (D.26855 != 0) goto <D.26856>; else goto <D.26857>;
                <D.26856>:
                D.26858 = &MEM[(void *)"xdomain-checks" + 1B];
                D.26859 = *D.26858;
                D.26860 = (int) D.26859;
                D.26861 = __s2 + 1;
                D.26862 = *D.26861;
                D.26863 = (int) D.26862;
                __result = D.26860 - D.26863;
                D.26864 = __s2_len > 1;
                D.26854 = __result == 0;
                D.26865 = D.26864 & D.26854;
                if (D.26865 != 0) goto <D.26866>; else goto <D.26867>;
                <D.26866>:
                D.26868 = &MEM[(void *)"xdomain-checks" + 2B];
                D.26869 = *D.26868;
                D.26870 = (int) D.26869;
                D.26871 = __s2 + 2;
                D.26872 = *D.26871;
                D.26873 = (int) D.26872;
                __result = D.26870 - D.26873;
                D.26874 = __s2_len > 2;
                D.26854 = __result == 0;
                D.26875 = D.26874 & D.26854;
                if (D.26875 != 0) goto <D.26876>; else goto <D.26877>;
                <D.26876>:
                D.26878 = &MEM[(void *)"xdomain-checks" + 3B];
                D.26879 = *D.26878;
                D.26880 = (int) D.26879;
                D.26881 = __s2 + 3;
                D.26882 = *D.26881;
                D.26883 = (int) D.26882;
                __result = D.26880 - D.26883;
                <D.26877>:
                <D.26867>:
                <D.26857>:
              }
              D.21858 = __result;
            }
            iftmp.436 = -D.21858;
            goto <D.26884>;
            <D.26847>:
            iftmp.436 = __builtin_strcmp (opt, "xdomain-checks");
            <D.26884>:
            D.21859 = iftmp.436;
          }
          if (D.21859 == 0) goto <D.26885>; else goto <D.26886>;
          <D.26885>:
          xdomain_checks = 1;
          goto <D.26887>;
          <D.26886>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26891 = "clear-at-gc";
              D.26892 = MEM[(const unsigned char *)D.26891];
              D.26893 = (int) D.26892;
              D.26894 = *__s2;
              D.26895 = (int) D.26894;
              __result = D.26893 - D.26895;
              {
                D.26896 = __s2_len != 0;
                D.26897 = __result == 0;
                D.26898 = D.26896 & D.26897;
                if (D.26898 != 0) goto <D.26899>; else goto <D.26900>;
                <D.26899>:
                D.26901 = &MEM[(void *)"clear-at-gc" + 1B];
                D.26902 = *D.26901;
                D.26903 = (int) D.26902;
                D.26904 = __s2 + 1;
                D.26905 = *D.26904;
                D.26906 = (int) D.26905;
                __result = D.26903 - D.26906;
                D.26907 = __s2_len > 1;
                D.26897 = __result == 0;
                D.26908 = D.26907 & D.26897;
                if (D.26908 != 0) goto <D.26909>; else goto <D.26910>;
                <D.26909>:
                D.26911 = &MEM[(void *)"clear-at-gc" + 2B];
                D.26912 = *D.26911;
                D.26913 = (int) D.26912;
                D.26914 = __s2 + 2;
                D.26915 = *D.26914;
                D.26916 = (int) D.26915;
                __result = D.26913 - D.26916;
                D.26917 = __s2_len > 2;
                D.26897 = __result == 0;
                D.26918 = D.26917 & D.26897;
                if (D.26918 != 0) goto <D.26919>; else goto <D.26920>;
                <D.26919>:
                D.26921 = &MEM[(void *)"clear-at-gc" + 3B];
                D.26922 = *D.26921;
                D.26923 = (int) D.26922;
                D.26924 = __s2 + 3;
                D.26925 = *D.26924;
                D.26926 = (int) D.26925;
                __result = D.26923 - D.26926;
                <D.26920>:
                <D.26910>:
                <D.26900>:
              }
              D.21867 = __result;
            }
            iftmp.437 = -D.21867;
            goto <D.26927>;
            <D.26890>:
            iftmp.437 = __builtin_strcmp (opt, "clear-at-gc");
            <D.26927>:
            D.21868 = iftmp.437;
          }
          if (D.21868 == 0) goto <D.26928>; else goto <D.26929>;
          <D.26928>:
          nursery_clear_policy = 0;
          goto <D.26930>;
          <D.26929>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26934 = "clear-nursery-at-gc";
              D.26935 = MEM[(const unsigned char *)D.26934];
              D.26936 = (int) D.26935;
              D.26937 = *__s2;
              D.26938 = (int) D.26937;
              __result = D.26936 - D.26938;
              {
                D.26939 = __s2_len != 0;
                D.26940 = __result == 0;
                D.26941 = D.26939 & D.26940;
                if (D.26941 != 0) goto <D.26942>; else goto <D.26943>;
                <D.26942>:
                D.26944 = &MEM[(void *)"clear-nursery-at-gc" + 1B];
                D.26945 = *D.26944;
                D.26946 = (int) D.26945;
                D.26947 = __s2 + 1;
                D.26948 = *D.26947;
                D.26949 = (int) D.26948;
                __result = D.26946 - D.26949;
                D.26950 = __s2_len > 1;
                D.26940 = __result == 0;
                D.26951 = D.26950 & D.26940;
                if (D.26951 != 0) goto <D.26952>; else goto <D.26953>;
                <D.26952>:
                D.26954 = &MEM[(void *)"clear-nursery-at-gc" + 2B];
                D.26955 = *D.26954;
                D.26956 = (int) D.26955;
                D.26957 = __s2 + 2;
                D.26958 = *D.26957;
                D.26959 = (int) D.26958;
                __result = D.26956 - D.26959;
                D.26960 = __s2_len > 2;
                D.26940 = __result == 0;
                D.26961 = D.26960 & D.26940;
                if (D.26961 != 0) goto <D.26962>; else goto <D.26963>;
                <D.26962>:
                D.26964 = &MEM[(void *)"clear-nursery-at-gc" + 3B];
                D.26965 = *D.26964;
                D.26966 = (int) D.26965;
                D.26967 = __s2 + 3;
                D.26968 = *D.26967;
                D.26969 = (int) D.26968;
                __result = D.26966 - D.26969;
                <D.26963>:
                <D.26953>:
                <D.26943>:
              }
              D.21876 = __result;
            }
            iftmp.438 = -D.21876;
            goto <D.26970>;
            <D.26933>:
            iftmp.438 = __builtin_strcmp (opt, "clear-nursery-at-gc");
            <D.26970>:
            D.21877 = iftmp.438;
          }
          if (D.21877 == 0) goto <D.26971>; else goto <D.26972>;
          <D.26971>:
          nursery_clear_policy = 0;
          goto <D.26973>;
          <D.26972>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26977 = "check-scan-starts";
              D.26978 = MEM[(const unsigned char *)D.26977];
              D.26979 = (int) D.26978;
              D.26980 = *__s2;
              D.26981 = (int) D.26980;
              __result = D.26979 - D.26981;
              {
                D.26982 = __s2_len != 0;
                D.26983 = __result == 0;
                D.26984 = D.26982 & D.26983;
                if (D.26984 != 0) goto <D.26985>; else goto <D.26986>;
                <D.26985>:
                D.26987 = &MEM[(void *)"check-scan-starts" + 1B];
                D.26988 = *D.26987;
                D.26989 = (int) D.26988;
                D.26990 = __s2 + 1;
                D.26991 = *D.26990;
                D.26992 = (int) D.26991;
                __result = D.26989 - D.26992;
                D.26993 = __s2_len > 1;
                D.26983 = __result == 0;
                D.26994 = D.26993 & D.26983;
                if (D.26994 != 0) goto <D.26995>; else goto <D.26996>;
                <D.26995>:
                D.26997 = &MEM[(void *)"check-scan-starts" + 2B];
                D.26998 = *D.26997;
                D.26999 = (int) D.26998;
                D.27000 = __s2 + 2;
                D.27001 = *D.27000;
                D.27002 = (int) D.27001;
                __result = D.26999 - D.27002;
                D.27003 = __s2_len > 2;
                D.26983 = __result == 0;
                D.27004 = D.27003 & D.26983;
                if (D.27004 != 0) goto <D.27005>; else goto <D.27006>;
                <D.27005>:
                D.27007 = &MEM[(void *)"check-scan-starts" + 3B];
                D.27008 = *D.27007;
                D.27009 = (int) D.27008;
                D.27010 = __s2 + 3;
                D.27011 = *D.27010;
                D.27012 = (int) D.27011;
                __result = D.27009 - D.27012;
                <D.27006>:
                <D.26996>:
                <D.26986>:
              }
              D.21885 = __result;
            }
            iftmp.439 = -D.21885;
            goto <D.27013>;
            <D.26976>:
            iftmp.439 = __builtin_strcmp (opt, "check-scan-starts");
            <D.27013>:
            D.21886 = iftmp.439;
          }
          if (D.21886 == 0) goto <D.27014>; else goto <D.27015>;
          <D.27014>:
          do_scan_starts_check = 1;
          goto <D.27016>;
          <D.27015>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27020 = "verify-nursery-at-minor-gc";
              D.27021 = MEM[(const unsigned char *)D.27020];
              D.27022 = (int) D.27021;
              D.27023 = *__s2;
              D.27024 = (int) D.27023;
              __result = D.27022 - D.27024;
              {
                D.27025 = __s2_len != 0;
                D.27026 = __result == 0;
                D.27027 = D.27025 & D.27026;
                if (D.27027 != 0) goto <D.27028>; else goto <D.27029>;
                <D.27028>:
                D.27030 = &MEM[(void *)"verify-nursery-at-minor-gc" + 1B];
                D.27031 = *D.27030;
                D.27032 = (int) D.27031;
                D.27033 = __s2 + 1;
                D.27034 = *D.27033;
                D.27035 = (int) D.27034;
                __result = D.27032 - D.27035;
                D.27036 = __s2_len > 1;
                D.27026 = __result == 0;
                D.27037 = D.27036 & D.27026;
                if (D.27037 != 0) goto <D.27038>; else goto <D.27039>;
                <D.27038>:
                D.27040 = &MEM[(void *)"verify-nursery-at-minor-gc" + 2B];
                D.27041 = *D.27040;
                D.27042 = (int) D.27041;
                D.27043 = __s2 + 2;
                D.27044 = *D.27043;
                D.27045 = (int) D.27044;
                __result = D.27042 - D.27045;
                D.27046 = __s2_len > 2;
                D.27026 = __result == 0;
                D.27047 = D.27046 & D.27026;
                if (D.27047 != 0) goto <D.27048>; else goto <D.27049>;
                <D.27048>:
                D.27050 = &MEM[(void *)"verify-nursery-at-minor-gc" + 3B];
                D.27051 = *D.27050;
                D.27052 = (int) D.27051;
                D.27053 = __s2 + 3;
                D.27054 = *D.27053;
                D.27055 = (int) D.27054;
                __result = D.27052 - D.27055;
                <D.27049>:
                <D.27039>:
                <D.27029>:
              }
              D.21894 = __result;
            }
            iftmp.440 = -D.21894;
            goto <D.27056>;
            <D.27019>:
            iftmp.440 = __builtin_strcmp (opt, "verify-nursery-at-minor-gc");
            <D.27056>:
            D.21895 = iftmp.440;
          }
          if (D.21895 == 0) goto <D.27057>; else goto <D.27058>;
          <D.27057>:
          do_verify_nursery = 1;
          goto <D.27059>;
          <D.27058>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27063 = "check-concurrent";
              D.27064 = MEM[(const unsigned char *)D.27063];
              D.27065 = (int) D.27064;
              D.27066 = *__s2;
              D.27067 = (int) D.27066;
              __result = D.27065 - D.27067;
              {
                D.27068 = __s2_len != 0;
                D.27069 = __result == 0;
                D.27070 = D.27068 & D.27069;
                if (D.27070 != 0) goto <D.27071>; else goto <D.27072>;
                <D.27071>:
                D.27073 = &MEM[(void *)"check-concurrent" + 1B];
                D.27074 = *D.27073;
                D.27075 = (int) D.27074;
                D.27076 = __s2 + 1;
                D.27077 = *D.27076;
                D.27078 = (int) D.27077;
                __result = D.27075 - D.27078;
                D.27079 = __s2_len > 1;
                D.27069 = __result == 0;
                D.27080 = D.27079 & D.27069;
                if (D.27080 != 0) goto <D.27081>; else goto <D.27082>;
                <D.27081>:
                D.27083 = &MEM[(void *)"check-concurrent" + 2B];
                D.27084 = *D.27083;
                D.27085 = (int) D.27084;
                D.27086 = __s2 + 2;
                D.27087 = *D.27086;
                D.27088 = (int) D.27087;
                __result = D.27085 - D.27088;
                D.27089 = __s2_len > 2;
                D.27069 = __result == 0;
                D.27090 = D.27089 & D.27069;
                if (D.27090 != 0) goto <D.27091>; else goto <D.27092>;
                <D.27091>:
                D.27093 = &MEM[(void *)"check-concurrent" + 3B];
                D.27094 = *D.27093;
                D.27095 = (int) D.27094;
                D.27096 = __s2 + 3;
                D.27097 = *D.27096;
                D.27098 = (int) D.27097;
                __result = D.27095 - D.27098;
                <D.27092>:
                <D.27082>:
                <D.27072>:
              }
              D.21903 = __result;
            }
            iftmp.441 = -D.21903;
            goto <D.27099>;
            <D.27062>:
            iftmp.441 = __builtin_strcmp (opt, "check-concurrent");
            <D.27099>:
            D.21904 = iftmp.441;
          }
          if (D.21904 == 0) goto <D.27100>; else goto <D.27101>;
          <D.27100>:
          D.26186 = major_collector.is_concurrent;
          if (D.26186 == 0) goto <D.27102>; else goto <D.27103>;
          <D.27102>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "`check-concurrent` only works with concurrent major collectors.");
          // predicted unlikely by continue predictor.
          goto <D.21766>;
          <D.27103>:
          do_concurrent_checks = 1;
          goto <D.27104>;
          <D.27101>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27108 = "dump-nursery-at-minor-gc";
              D.27109 = MEM[(const unsigned char *)D.27108];
              D.27110 = (int) D.27109;
              D.27111 = *__s2;
              D.27112 = (int) D.27111;
              __result = D.27110 - D.27112;
              {
                D.27113 = __s2_len != 0;
                D.27114 = __result == 0;
                D.27115 = D.27113 & D.27114;
                if (D.27115 != 0) goto <D.27116>; else goto <D.27117>;
                <D.27116>:
                D.27118 = &MEM[(void *)"dump-nursery-at-minor-gc" + 1B];
                D.27119 = *D.27118;
                D.27120 = (int) D.27119;
                D.27121 = __s2 + 1;
                D.27122 = *D.27121;
                D.27123 = (int) D.27122;
                __result = D.27120 - D.27123;
                D.27124 = __s2_len > 1;
                D.27114 = __result == 0;
                D.27125 = D.27124 & D.27114;
                if (D.27125 != 0) goto <D.27126>; else goto <D.27127>;
                <D.27126>:
                D.27128 = &MEM[(void *)"dump-nursery-at-minor-gc" + 2B];
                D.27129 = *D.27128;
                D.27130 = (int) D.27129;
                D.27131 = __s2 + 2;
                D.27132 = *D.27131;
                D.27133 = (int) D.27132;
                __result = D.27130 - D.27133;
                D.27134 = __s2_len > 2;
                D.27114 = __result == 0;
                D.27135 = D.27134 & D.27114;
                if (D.27135 != 0) goto <D.27136>; else goto <D.27137>;
                <D.27136>:
                D.27138 = &MEM[(void *)"dump-nursery-at-minor-gc" + 3B];
                D.27139 = *D.27138;
                D.27140 = (int) D.27139;
                D.27141 = __s2 + 3;
                D.27142 = *D.27141;
                D.27143 = (int) D.27142;
                __result = D.27140 - D.27143;
                <D.27137>:
                <D.27127>:
                <D.27117>:
              }
              D.21912 = __result;
            }
            iftmp.442 = -D.21912;
            goto <D.27144>;
            <D.27107>:
            iftmp.442 = __builtin_strcmp (opt, "dump-nursery-at-minor-gc");
            <D.27144>:
            D.21913 = iftmp.442;
          }
          if (D.21913 == 0) goto <D.27145>; else goto <D.27146>;
          <D.27145>:
          do_dump_nursery_content = 1;
          goto <D.27147>;
          <D.27146>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27151 = "no-managed-allocator";
              D.27152 = MEM[(const unsigned char *)D.27151];
              D.27153 = (int) D.27152;
              D.27154 = *__s2;
              D.27155 = (int) D.27154;
              __result = D.27153 - D.27155;
              {
                D.27156 = __s2_len != 0;
                D.27157 = __result == 0;
                D.27158 = D.27156 & D.27157;
                if (D.27158 != 0) goto <D.27159>; else goto <D.27160>;
                <D.27159>:
                D.27161 = &MEM[(void *)"no-managed-allocator" + 1B];
                D.27162 = *D.27161;
                D.27163 = (int) D.27162;
                D.27164 = __s2 + 1;
                D.27165 = *D.27164;
                D.27166 = (int) D.27165;
                __result = D.27163 - D.27166;
                D.27167 = __s2_len > 1;
                D.27157 = __result == 0;
                D.27168 = D.27167 & D.27157;
                if (D.27168 != 0) goto <D.27169>; else goto <D.27170>;
                <D.27169>:
                D.27171 = &MEM[(void *)"no-managed-allocator" + 2B];
                D.27172 = *D.27171;
                D.27173 = (int) D.27172;
                D.27174 = __s2 + 2;
                D.27175 = *D.27174;
                D.27176 = (int) D.27175;
                __result = D.27173 - D.27176;
                D.27177 = __s2_len > 2;
                D.27157 = __result == 0;
                D.27178 = D.27177 & D.27157;
                if (D.27178 != 0) goto <D.27179>; else goto <D.27180>;
                <D.27179>:
                D.27181 = &MEM[(void *)"no-managed-allocator" + 3B];
                D.27182 = *D.27181;
                D.27183 = (int) D.27182;
                D.27184 = __s2 + 3;
                D.27185 = *D.27184;
                D.27186 = (int) D.27185;
                __result = D.27183 - D.27186;
                <D.27180>:
                <D.27170>:
                <D.27160>:
              }
              D.21921 = __result;
            }
            iftmp.443 = -D.21921;
            goto <D.27187>;
            <D.27150>:
            iftmp.443 = __builtin_strcmp (opt, "no-managed-allocator");
            <D.27187>:
            D.21922 = iftmp.443;
          }
          if (D.21922 == 0) goto <D.27188>; else goto <D.27189>;
          <D.27188>:
          sgen_set_use_managed_allocator (0);
          goto <D.27190>;
          <D.27189>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27194 = "disable-minor";
              D.27195 = MEM[(const unsigned char *)D.27194];
              D.27196 = (int) D.27195;
              D.27197 = *__s2;
              D.27198 = (int) D.27197;
              __result = D.27196 - D.27198;
              {
                D.27199 = __s2_len != 0;
                D.27200 = __result == 0;
                D.27201 = D.27199 & D.27200;
                if (D.27201 != 0) goto <D.27202>; else goto <D.27203>;
                <D.27202>:
                D.27204 = &MEM[(void *)"disable-minor" + 1B];
                D.27205 = *D.27204;
                D.27206 = (int) D.27205;
                D.27207 = __s2 + 1;
                D.27208 = *D.27207;
                D.27209 = (int) D.27208;
                __result = D.27206 - D.27209;
                D.27210 = __s2_len > 1;
                D.27200 = __result == 0;
                D.27211 = D.27210 & D.27200;
                if (D.27211 != 0) goto <D.27212>; else goto <D.27213>;
                <D.27212>:
                D.27214 = &MEM[(void *)"disable-minor" + 2B];
                D.27215 = *D.27214;
                D.27216 = (int) D.27215;
                D.27217 = __s2 + 2;
                D.27218 = *D.27217;
                D.27219 = (int) D.27218;
                __result = D.27216 - D.27219;
                D.27220 = __s2_len > 2;
                D.27200 = __result == 0;
                D.27221 = D.27220 & D.27200;
                if (D.27221 != 0) goto <D.27222>; else goto <D.27223>;
                <D.27222>:
                D.27224 = &MEM[(void *)"disable-minor" + 3B];
                D.27225 = *D.27224;
                D.27226 = (int) D.27225;
                D.27227 = __s2 + 3;
                D.27228 = *D.27227;
                D.27229 = (int) D.27228;
                __result = D.27226 - D.27229;
                <D.27223>:
                <D.27213>:
                <D.27203>:
              }
              D.21930 = __result;
            }
            iftmp.444 = -D.21930;
            goto <D.27230>;
            <D.27193>:
            iftmp.444 = __builtin_strcmp (opt, "disable-minor");
            <D.27230>:
            D.21931 = iftmp.444;
          }
          if (D.21931 == 0) goto <D.27231>; else goto <D.27232>;
          <D.27231>:
          disable_minor_collections = 1;
          goto <D.27233>;
          <D.27232>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27237 = "disable-major";
              D.27238 = MEM[(const unsigned char *)D.27237];
              D.27239 = (int) D.27238;
              D.27240 = *__s2;
              D.27241 = (int) D.27240;
              __result = D.27239 - D.27241;
              {
                D.27242 = __s2_len != 0;
                D.27243 = __result == 0;
                D.27244 = D.27242 & D.27243;
                if (D.27244 != 0) goto <D.27245>; else goto <D.27246>;
                <D.27245>:
                D.27247 = &MEM[(void *)"disable-major" + 1B];
                D.27248 = *D.27247;
                D.27249 = (int) D.27248;
                D.27250 = __s2 + 1;
                D.27251 = *D.27250;
                D.27252 = (int) D.27251;
                __result = D.27249 - D.27252;
                D.27253 = __s2_len > 1;
                D.27243 = __result == 0;
                D.27254 = D.27253 & D.27243;
                if (D.27254 != 0) goto <D.27255>; else goto <D.27256>;
                <D.27255>:
                D.27257 = &MEM[(void *)"disable-major" + 2B];
                D.27258 = *D.27257;
                D.27259 = (int) D.27258;
                D.27260 = __s2 + 2;
                D.27261 = *D.27260;
                D.27262 = (int) D.27261;
                __result = D.27259 - D.27262;
                D.27263 = __s2_len > 2;
                D.27243 = __result == 0;
                D.27264 = D.27263 & D.27243;
                if (D.27264 != 0) goto <D.27265>; else goto <D.27266>;
                <D.27265>:
                D.27267 = &MEM[(void *)"disable-major" + 3B];
                D.27268 = *D.27267;
                D.27269 = (int) D.27268;
                D.27270 = __s2 + 3;
                D.27271 = *D.27270;
                D.27272 = (int) D.27271;
                __result = D.27269 - D.27272;
                <D.27266>:
                <D.27256>:
                <D.27246>:
              }
              D.21939 = __result;
            }
            iftmp.445 = -D.21939;
            goto <D.27273>;
            <D.27236>:
            iftmp.445 = __builtin_strcmp (opt, "disable-major");
            <D.27273>:
            D.21940 = iftmp.445;
          }
          if (D.21940 == 0) goto <D.27274>; else goto <D.27275>;
          <D.27274>:
          disable_major_collections = 1;
          goto <D.27276>;
          <D.27275>:
          D.27277 = monoeg_g_str_has_prefix (opt, "heap-dump=");
          if (D.27277 != 0) goto <D.27278>; else goto <D.27279>;
          <D.27278>:
          {
            char * filename;

            D.27280 = __builtin_strchr (opt, 61);
            filename = D.27280 + 1;
            nursery_clear_policy = 0;
            heap_dump_file.446 = fopen (filename, "w");
            heap_dump_file = heap_dump_file.446;
            heap_dump_file.447 = heap_dump_file;
            if (heap_dump_file.447 != 0B) goto <D.27283>; else goto <D.27284>;
            <D.27283>:
            heap_dump_file.447 = heap_dump_file;
            fprintf (heap_dump_file.447, "<sgen-dump>\n");
            do_pin_stats = 1;
            <D.27284>:
          }
          goto <D.27285>;
          <D.27279>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.27286>; else goto <D.27287>;
          <D.27286>:
          // predicted unlikely by continue predictor.
          goto <D.21766>;
          <D.27287>:
          stderr.395 = stderr;
          fprintf (stderr.395, "\n%s must be of the format [<l>[:<filename>]|<option>]+ where <l> is a debug level 0-9.\n", "MONO_GC_DEBUG");
          stderr.395 = stderr;
          fprintf (stderr.395, "Valid <option>s are:\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  collect-before-allocs[=<n>]\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  verify-before-allocs[=<n>]\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  check-at-minor-collections\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  check-mark-bits\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  check-nursery-pinned\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  verify-before-collections\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  verify-nursery-at-minor-gc\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  dump-nursery-at-minor-gc\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  disable-minor\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  disable-major\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  xdomain-checks\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  check-concurrent\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  clear-at-gc\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  clear-nursery-at-gc\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  check-scan-starts\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  no-managed-allocator\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  print-allowance\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  print-pinning\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "  heap-dump=<filename>\n");
          stderr.395 = stderr;
          fprintf (stderr.395, "\n");
          usage_printed = 1;
          <D.27285>:
          <D.27276>:
          <D.27233>:
          <D.27190>:
          <D.27147>:
          <D.27104>:
          <D.27059>:
          <D.27016>:
          <D.26973>:
          <D.26930>:
          <D.26887>:
          <D.26844>:
          <D.26801>:
          <D.26758>:
          <D.26713>:
          <D.26670>:
          <D.26627>:
          <D.26620>:
          <D.26577>:
          <D.26570>:
          <D.26527>:
          <D.26484>:
          <D.26441>:
        }
        <D.21766>:
        ptr = ptr + 8;
        <D.21943>:
        if (ptr != 0B) goto <D.27288>; else goto <D.21944>;
        <D.27288>:
        D.25625 = *ptr;
        if (D.25625 != 0B) goto <D.21942>; else goto <D.21944>;
        <D.21944>:
        monoeg_g_strfreev (opts);
      }
      <D.26394>:
      D.25938 = major_collector.is_parallel;
      if (D.25938 != 0) goto <D.27289>; else goto <D.27290>;
      <D.27289>:
      heap_dump_file.447 = heap_dump_file;
      if (heap_dump_file.447 != 0B) goto <D.27291>; else goto <D.27292>;
      <D.27291>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "Cannot do `heap-dump` with the parallel collector.");
      heap_dump_file.447 = heap_dump_file;
      fclose (heap_dump_file.447);
      heap_dump_file = 0B;
      <D.27292>:
      do_pin_stats.448 = do_pin_stats;
      if (do_pin_stats.448 != 0) goto <D.27294>; else goto <D.27295>;
      <D.27294>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "`print-pinning` is not supported with the parallel collector.");
      do_pin_stats = 0;
      <D.27295>:
      <D.27290>:
      D.27296 = major_collector.post_param_init;
      if (D.27296 != 0B) goto <D.27297>; else goto <D.27298>;
      <D.27297>:
      D.27296 = major_collector.post_param_init;
      D.27296 (&major_collector);
      <D.27298>:
      soft_limit.406 = soft_limit;
      sgen_memgov_init (max_heap, soft_limit.406, debug_print_allowance, allowance_ratio, save_target);
      memset (&remset, 0, 96);
      sgen_card_table_init (&remset);
      gc_initialized = 1;
    }
  finally
    {
      cb = {CLOBBER};
      soft_limit = {CLOBBER};
      dummy = {CLOBBER};
    }
}


is_critical_method (struct MonoMethod * method)
{
  gboolean D.27309;
  int iftmp.449;
  int D.27314;
  int D.27316;

  D.27314 = mono_runtime_is_critical_method (method);
  if (D.27314 != 0) goto <D.27311>; else goto <D.27315>;
  <D.27315>:
  D.27316 = sgen_is_critical_method (method);
  if (D.27316 != 0) goto <D.27311>; else goto <D.27312>;
  <D.27311>:
  iftmp.449 = 1;
  goto <D.27313>;
  <D.27312>:
  iftmp.449 = 0;
  <D.27313>:
  D.27309 = iftmp.449;
  return D.27309;
}


sgen_thread_attach (struct SgenThreadInfo * info)
{
  void * (*<T2aae>) (void) D.27318;
  void * D.27321;
  void * D.27324;

  pthread_mutex_lock (&gc_mutex);
  init_stats ();
  sgen_gc_unlock ();
  D.27318 = gc_callbacks.thread_attach_func;
  if (D.27318 != 0B) goto <D.27319>; else goto <D.27320>;
  <D.27319>:
  D.27321 = info->runtime_data;
  if (D.27321 == 0B) goto <D.27322>; else goto <D.27323>;
  <D.27322>:
  D.27318 = gc_callbacks.thread_attach_func;
  D.27324 = D.27318 ();
  info->runtime_data = D.27324;
  <D.27323>:
  <D.27320>:
}


sgen_thread_unregister (struct SgenThreadInfo * p)
{
  long unsigned int D.27327;
  void * D.27328;
  struct FILE * gc_debug_file.450;
  void (*<T11da>) (void *) D.27330;
  void * D.27333;

  if (0 != 0) goto <D.27325>; else goto <D.27326>;
  <D.27325>:
  D.27327 = MEM[(struct MonoThreadInfo *)p].node.key;
  D.27328 = (void *) D.27327;
  gc_debug_file.450 = gc_debug_file;
  fprintf (gc_debug_file.450, "unregister thread %p (%p)\n", p, D.27328);
  gc_debug_file.450 = gc_debug_file;
  fflush (gc_debug_file.450);
  <D.27326>:
  D.27330 = gc_callbacks.thread_detach_func;
  if (D.27330 != 0B) goto <D.27331>; else goto <D.27332>;
  <D.27331>:
  D.27330 = gc_callbacks.thread_detach_func;
  D.27333 = p->runtime_data;
  D.27330 (D.27333);
  p->runtime_data = 0B;
  <D.27332>:
}


sgen_thread_detach (struct SgenThreadInfo * p)
{
  struct MonoDomain * D.27334;
  struct MonoThread * D.27337;

  D.27334 = mono_domain_get ();
  if (D.27334 != 0B) goto <D.27335>; else goto <D.27336>;
  <D.27335>:
  D.27337 = mono_thread_current ();
  mono_thread_detach (D.27337);
  <D.27336>:
}


sgen_thread_register (struct SgenThreadInfo * info, void * addr)
{
  struct MonoContext * D.27338;
  long unsigned int D.27339;
  void * sstart.451;
  long unsigned int size.452;
  void * D.27342;
  void * stack_end.453;
  long unsigned int D.27346;
  void * D.27347;
  struct FILE * gc_debug_file.454;
  void * (*<T2aae>) (void) D.27349;
  void * D.27352;
  void * D.27353;

  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.27338 = &info->ctx;
  memset (D.27338, 0, 136);
  sgen_init_tlab_info (info);
  {
    size_t size;
    void * sstart;
    union pthread_attr_t attr;

    try
      {
        D.27339 = pthread_self ();
        pthread_getattr_np (D.27339, &attr);
        pthread_attr_getstack (&attr, &sstart, &size);
        sstart.451 = sstart;
        info->stack_start_limit = sstart.451;
        sstart.451 = sstart;
        size.452 = size;
        D.27342 = sstart.451 + size.452;
        info->stack_end = D.27342;
        pthread_attr_destroy (&attr);
      }
    finally
      {
        size = {CLOBBER};
        sstart = {CLOBBER};
        attr = {CLOBBER};
      }
  }
  stack_end.453 = info->stack_end;
  stack_end = stack_end.453;
  if (0 != 0) goto <D.27344>; else goto <D.27345>;
  <D.27344>:
  stack_end.453 = info->stack_end;
  D.27346 = MEM[(struct MonoThreadInfo *)info].node.key;
  D.27347 = (void *) D.27346;
  gc_debug_file.454 = gc_debug_file;
  fprintf (gc_debug_file.454, "registered thread %p (%p) stack end %p\n", info, D.27347, stack_end.453);
  gc_debug_file.454 = gc_debug_file;
  fflush (gc_debug_file.454);
  <D.27345>:
  D.27349 = gc_callbacks.thread_attach_func;
  if (D.27349 != 0B) goto <D.27350>; else goto <D.27351>;
  <D.27350>:
  D.27349 = gc_callbacks.thread_attach_func;
  D.27352 = D.27349 ();
  info->runtime_data = D.27352;
  <D.27351>:
  D.27353 = info;
  return D.27353;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.27355;
  unsigned int exch.455;
  unsigned int comp.456;
  unsigned int D.27358;

  exch.455 = (unsigned int) exch;
  comp.456 = (unsigned int) comp;
  D.27358 = __sync_val_compare_and_swap_4 (dest, comp.456, exch.455);
  D.27355 = (gint32) D.27358;
  return D.27355;
}


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.27360;
  void (*<Tc2>) (void *) destructor.457;
  int D.27362;
  _Bool D.27363;

  destructor.457 = (void (*<Tc2>) (void *)) destructor;
  D.27362 = pthread_key_create (key, destructor.457);
  D.27363 = D.27362 == 0;
  D.27360 = (int) D.27363;
  return D.27360;
}


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

  inited.458 = inited;
  if (inited.458 != 0) goto <D.27366>; else goto <D.27367>;
  <D.27366>:
  return;
  <D.27367>:
  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.27371;

  if (str != 0B) goto <D.27369>; else goto <D.27370>;
  <D.27369>:
  D.27371 = __strdup (str);
  return D.27371;
  <D.27370>:
  D.27371 = 0B;
  return D.27371;
}


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

  try
    {
      val = strtod (opt, &endptr);
      endptr.459 = endptr;
      if (endptr.459 == opt) goto <D.27374>; else goto <D.27375>;
      <D.27374>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be a number.", opt_name);
      D.27376 = 0;
      return D.27376;
      <D.27375>:
      if (val < min) goto <D.27377>; else goto <D.27379>;
      <D.27379>:
      if (val > max) goto <D.27377>; else goto <D.27378>;
      <D.27377>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be between %.2f - %.2f.", opt_name, min, max);
      D.27376 = 0;
      return D.27376;
      <D.27378>:
      *result = val;
      D.27376 = 1;
      return D.27376;
    }
  finally
    {
      endptr = {CLOBBER};
    }
}


alloc_nursery ()
{
  struct GCMemSection * nursery_section.460;
  int gc_debug_level.461;
  _Bool D.27386;
  long int D.27387;
  long int D.27388;
  int sgen_nursery_size.462;
  long unsigned int D.27392;
  struct FILE * gc_debug_file.463;
  long unsigned int D.27394;
  int D.27395;
  _Bool D.27396;
  long int D.27397;
  long int D.27398;
  void * (*<T2cdd>) (mword, mword, int) D.27401;
  int sgen_nursery_bits.464;
  sizetype D.27403;
  char * D.27404;
  long unsigned int D.27405;
  long unsigned int data.465;
  long int D.27409;
  long unsigned int D.27410;
  sizetype D.27411;
  char * D.27412;
  char * D.27413;
  int D.27414;
  long unsigned int D.27415;
  long unsigned int D.27416;
  void * D.27417;
  unsigned int scan_starts.466;
  struct GCMemSection * section;
  char * data;
  int scan_starts;
  int alloc_size;

  nursery_section.460 = nursery_section;
  if (nursery_section.460 != 0B) goto <D.27383>; else goto <D.27384>;
  <D.27383>:
  return;
  <D.27384>:
  gc_debug_level.461 = gc_debug_level;
  D.27386 = gc_debug_level.461 > 1;
  D.27387 = (long int) D.27386;
  D.27388 = __builtin_expect (D.27387, 0);
  if (D.27388 != 0) goto <D.27389>; else goto <D.27390>;
  <D.27389>:
  sgen_nursery_size.462 = sgen_nursery_size;
  D.27392 = (long unsigned int) sgen_nursery_size.462;
  gc_debug_file.463 = gc_debug_file;
  fprintf (gc_debug_file.463, "Allocating nursery size: %lu\n", D.27392);
  gc_debug_file.463 = gc_debug_file;
  fflush (gc_debug_file.463);
  <D.27390>:
  section = sgen_alloc_internal (2);
  alloc_size = sgen_nursery_size;
  D.27394 = (long unsigned int) alloc_size;
  D.27395 = sgen_memgov_try_alloc_space (D.27394, 0);
  D.27396 = D.27395 == 0;
  D.27397 = (long int) D.27396;
  D.27398 = __builtin_expect (D.27397, 0);
  if (D.27398 != 0) goto <D.27399>; else goto <D.27400>;
  <D.27399>:
  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.27400>:
  D.27401 = major_collector.alloc_heap;
  sgen_nursery_bits.464 = sgen_nursery_bits;
  D.27394 = (long unsigned int) alloc_size;
  D.27394 = (long unsigned int) alloc_size;
  data = D.27401 (D.27394, D.27394, sgen_nursery_bits.464);
  sgen_nursery_size.462 = sgen_nursery_size;
  D.27403 = (sizetype) sgen_nursery_size.462;
  D.27404 = data + D.27403;
  D.27405 = (long unsigned int) D.27404;
  data.465 = (long unsigned int) data;
  sgen_update_heap_boundaries (data.465, D.27405);
  if (0 != 0) goto <D.27407>; else goto <D.27408>;
  <D.27407>:
  D.27409 = mono_gc_get_heap_size ();
  D.27410 = (long unsigned int) D.27409;
  sgen_nursery_size.462 = sgen_nursery_size;
  D.27392 = (long unsigned int) sgen_nursery_size.462;
  D.27411 = (sizetype) alloc_size;
  D.27412 = data + D.27411;
  gc_debug_file.463 = gc_debug_file;
  fprintf (gc_debug_file.463, "Expanding nursery size (%p-%p): %lu, total: %lu\n", data, D.27412, D.27392, D.27410);
  gc_debug_file.463 = gc_debug_file;
  fflush (gc_debug_file.463);
  <D.27408>:
  section->next_data = data;
  D.27413 = section->next_data;
  section->data = D.27413;
  D.27394 = (long unsigned int) alloc_size;
  section->size = D.27394;
  sgen_nursery_size.462 = sgen_nursery_size;
  D.27403 = (sizetype) sgen_nursery_size.462;
  D.27404 = data + D.27403;
  section->end_data = D.27404;
  D.27414 = alloc_size + 8191;
  scan_starts = D.27414 / 8192;
  D.27415 = (long unsigned int) scan_starts;
  D.27416 = D.27415 * 8;
  D.27417 = sgen_alloc_internal_dynamic (D.27416, 3, 1);
  section->scan_starts = D.27417;
  scan_starts.466 = (unsigned int) scan_starts;
  section->num_scan_start = scan_starts.466;
  nursery_section = section;
  sgen_nursery_size.462 = sgen_nursery_size;
  D.27403 = (sizetype) sgen_nursery_size.462;
  D.27404 = data + D.27403;
  sgen_nursery_allocator_set_nursery_bounds (data, D.27404);
}


atoi (const char * __nptr)
{
  int D.27420;
  long int D.27421;

  D.27421 = strtol (__nptr, 0B, 10);
  D.27420 = (int) D.27421;
  return D.27420;
}


mono_gc_get_gc_name ()
{
  const char * D.27423;

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


sgen_is_critical_method (struct MonoMethod * method)
{
  gboolean D.27425;
  int iftmp.467;
  struct MonoMethod * write_barrier_method.468;
  int D.27432;

  write_barrier_method.468 = write_barrier_method;
  if (method == write_barrier_method.468) goto <D.27427>; else goto <D.27431>;
  <D.27431>:
  D.27432 = sgen_is_managed_allocator (method);
  if (D.27432 != 0) goto <D.27427>; else goto <D.27428>;
  <D.27427>:
  iftmp.467 = 1;
  goto <D.27429>;
  <D.27428>:
  iftmp.467 = 0;
  <D.27429>:
  D.27425 = iftmp.467;
  return D.27425;
}


sgen_has_critical_method ()
{
  gboolean D.27434;
  int iftmp.469;
  struct MonoMethod * write_barrier_method.470;
  int D.27441;

  write_barrier_method.470 = write_barrier_method;
  if (write_barrier_method.470 != 0B) goto <D.27436>; else goto <D.27440>;
  <D.27440>:
  D.27441 = sgen_has_managed_allocator ();
  if (D.27441 != 0) goto <D.27436>; else goto <D.27437>;
  <D.27436>:
  iftmp.469 = 1;
  goto <D.27438>;
  <D.27437>:
  iftmp.469 = 0;
  <D.27438>:
  D.27434 = iftmp.469;
  return D.27434;
}


mono_gc_get_write_barrier ()
{
  _Bool D.27443;
  long int D.27444;
  long int D.27445;
  struct MonoMethod * write_barrier_method.471;
  struct MonoMethod * D.27451;
  struct MonoImage * D.27452;
  struct MonoClass * D.27453;
  struct MonoType * D.27454;
  struct MonoClass * D.27455;
  struct MonoType * D.27456;
  struct MonoClass * D.27457;
  guint8 * sgen_cardtable.472;
  int D.27459;
  unsigned int D.27462;
  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;
      {
        guint64 foo;

        __asm__("movq $stack_end@TPOFF, %0" : "=r" foo);
        stack_end_offset = (int) foo;
      }
      D.27443 = stack_end_offset == -1;
      D.27444 = (long int) D.27443;
      D.27445 = __builtin_expect (D.27444, 0);
      if (D.27445 != 0) goto <D.27446>; else goto <D.27447>;
      <D.27446>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5450, "stack_end_offset != -1");
      <D.27447>:
      write_barrier_method.471 = write_barrier_method;
      if (write_barrier_method.471 != 0B) goto <D.27449>; else goto <D.27450>;
      <D.27449>:
      D.27451 = write_barrier_method;
      return D.27451;
      <D.27450>:
      D.27452 = mono_defaults.corlib;
      sig = mono_metadata_signature_alloc (D.27452, 1);
      D.27453 = mono_defaults.void_class;
      D.27454 = &D.27453->byval_arg;
      sig->ret = D.27454;
      D.27455 = mono_defaults.int_class;
      D.27456 = &D.27455->byval_arg;
      sig->params[0] = D.27456;
      D.27457 = mono_defaults.object_class;
      mb = mono_mb_new (D.27457, "wbarrier", 24);
      emit_nursery_check (mb, &nursery_check_labels);
      sgen_cardtable.472 = sgen_cardtable;
      mono_mb_emit_ptr (mb, sgen_cardtable.472);
      mono_mb_emit_ldarg (mb, 0);
      mono_mb_emit_icon (mb, 9);
      mono_mb_emit_byte (mb, 100);
      mono_mb_emit_ptr (mb, 8388607B);
      mono_mb_emit_byte (mb, 95);
      mono_mb_emit_byte (mb, 88);
      mono_mb_emit_icon (mb, 1);
      mono_mb_emit_byte (mb, 82);
      i = 0;
      goto <D.21970>;
      <D.21969>:
      D.27459 = nursery_check_labels[i];
      if (D.27459 != 0) goto <D.27460>; else goto <D.27461>;
      <D.27460>:
      D.27459 = nursery_check_labels[i];
      D.27462 = (unsigned int) D.27459;
      mono_mb_patch_branch (mb, D.27462);
      <D.27461>:
      i = i + 1;
      <D.21970>:
      if (i <= 2) goto <D.21969>; else goto <D.21971>;
      <D.21971>:
      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.471 = write_barrier_method;
      if (write_barrier_method.471 != 0B) goto <D.27463>; else goto <D.27464>;
      <D.27463>:
      mono_free_method (res);
      goto <D.27465>;
      <D.27464>:
      mono_memory_barrier ();
      write_barrier_method = res;
      <D.27465>:
      sgen_gc_unlock ();
      D.27451 = write_barrier_method;
      return D.27451;
    }
  finally
    {
      nursery_check_labels = {CLOBBER};
    }
}


emit_nursery_check (struct MonoMethodBuilder * mb, int * nursery_check_return_labels)
{
  int sgen_nursery_bits.473;
  char * D.27469;
  long unsigned int D.27470;
  long unsigned int D.27471;
  int D.27472;
  unsigned int D.27473;
  int D.27474;
  int D.27475;
  char * D.27478;
  long unsigned int D.27479;
  long unsigned int D.27480;
  int D.27481;
  int * D.27482;
  unsigned int D.27483;
  int D.27484;

  memset (nursery_check_return_labels, 0, 12);
  mono_mb_emit_ldarg (mb, 0);
  sgen_nursery_bits.473 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.473);
  mono_mb_emit_byte (mb, 100);
  D.27469 = sgen_get_nursery_start ();
  D.27470 = (long unsigned int) D.27469;
  sgen_nursery_bits.473 = sgen_nursery_bits;
  D.27471 = D.27470 >> sgen_nursery_bits.473;
  D.27472 = (int) D.27471;
  mono_mb_emit_icon (mb, D.27472);
  D.27473 = mono_mb_emit_branch (mb, 59);
  D.27474 = (int) D.27473;
  *nursery_check_return_labels = D.27474;
  D.27475 = major_collector.is_concurrent;
  if (D.27475 == 0) goto <D.27476>; else goto <D.27477>;
  <D.27476>:
  mono_mb_emit_ldarg (mb, 0);
  mono_mb_emit_byte (mb, 77);
  sgen_nursery_bits.473 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.473);
  mono_mb_emit_byte (mb, 100);
  D.27478 = sgen_get_nursery_start ();
  D.27479 = (long unsigned int) D.27478;
  sgen_nursery_bits.473 = sgen_nursery_bits;
  D.27480 = D.27479 >> sgen_nursery_bits.473;
  D.27481 = (int) D.27480;
  mono_mb_emit_icon (mb, D.27481);
  D.27482 = nursery_check_return_labels + 4;
  D.27483 = mono_mb_emit_branch (mb, 64);
  D.27484 = (int) D.27483;
  *D.27482 = D.27484;
  <D.27477>:
}


mono_gc_get_description ()
{
  char * D.27485;

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


mono_gc_set_desktop_mode ()
{

}


mono_gc_is_moving ()
{
  gboolean D.27487;

  D.27487 = 1;
  return D.27487;
}


mono_gc_is_disabled ()
{
  gboolean D.27489;

  D.27489 = 0;
  return D.27489;
}


sgen_get_nursery_clear_policy ()
{
  NurseryClearPolicy D.27491;

  D.27491 = nursery_clear_policy;
  return D.27491;
}


sgen_get_array_fill_vtable ()
{
  struct MonoVTable * array_fill_vtable.474;
  _Bool D.27496;
  long int D.27497;
  long int D.27498;
  struct MonoClass * D.27501;
  void * D.27502;
  struct MonoVTable * D.27503;

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

    try
      {
        domain = mono_get_root_domain ();
        D.27496 = domain == 0B;
        D.27497 = (long int) D.27496;
        D.27498 = __builtin_expect (D.27497, 0);
        if (D.27498 != 0) goto <D.27499>; else goto <D.27500>;
        <D.27499>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5574, "domain");
        <D.27500>:
        D.27501 = mono_defaults.byte_class;
        klass.element_class = D.27501;
        klass.rank = 1;
        klass.instance_size = 32;
        klass.sizes.element_size = 1;
        klass.name = "array_filler_type";
        vtable.klass = &klass;
        bmap = 0;
        D.27502 = mono_gc_make_descr_for_array (1, &bmap, 0, 1);
        vtable.gc_descr = D.27502;
        vtable.rank = 1;
        array_fill_vtable = &vtable;
      }
    finally
      {
        bmap = {CLOBBER};
      }
  }
  <D.27495>:
  D.27503 = array_fill_vtable;
  return D.27503;
}


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.27505>; else goto <D.27506>;
  <D.27505>:
  mono_thread_hazardous_try_free_some ();
  <D.27506>:
}


sgen_major_collector_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  void (*<T2d05>) (void (*sgen_cardtable_block_callback) (mword, mword)) D.27507;

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


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

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


sgen_get_major_collector ()
{
  struct SgenMajorCollector * D.27509;

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


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.27511;

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


mono_gc_get_vtable_bits (struct MonoClass * class)
{
  int D.27513;
  int D.27516;
  guint D.27519;

  D.27513 = sgen_need_bridge_processing ();
  if (D.27513 != 0) goto <D.27514>; else goto <D.27515>;
  <D.27514>:
  D.27516 = sgen_is_bridge_class (class);
  if (D.27516 != 0) goto <D.27517>; else goto <D.27518>;
  <D.27517>:
  D.27519 = 1;
  return D.27519;
  <D.27518>:
  <D.27515>:
  D.27519 = 0;
  return D.27519;
}


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.475;

  moved_objects_idx.475 = moved_objects_idx;
  if (moved_objects_idx.475 != 0) goto <D.27522>; else goto <D.27523>;
  <D.27522>:
  moved_objects_idx.475 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.475);
  moved_objects_idx = 0;
  <D.27523>:
}


