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

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


safe_name (void * obj)
{
  unsigned int D.21648;
  unsigned int D.21649;
  const char * D.21650;
  struct MonoClass * D.21651;
  struct MonoVTable * vt;

  D.21648 = MEM[(mword *)obj];
  D.21649 = D.21648 & 4294967292;
  vt = (struct MonoVTable *) D.21649;
  D.21651 = vt->klass;
  D.21650 = D.21651->name;
  return D.21650;
}


sgen_scan_area_with_callback (char * start, char * end, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data, gboolean allow_flags)
{
  void * D.21653;
  char * iftmp.0;
  unsigned int D.21659;
  unsigned int D.21660;
  unsigned int D.21663;
  unsigned int D.21668;
  unsigned int D.21669;
  unsigned int D.21670;
  unsigned int D.21671;
  struct MonoVTable * D.21672;
  struct MonoVTable * array_fill_vtable.1;

  goto <D.19912>;
  <D.19913>:
  {
    size_t size;
    char * obj;

    D.21653 = MEM[(void * *)start];
    if (D.21653 == 0B) goto <D.21654>; else goto <D.21655>;
    <D.21654>:
    start = start + 4;
    // predicted unlikely by continue predictor.
    goto <D.19912>;
    <D.21655>:
    if (allow_flags != 0) goto <D.21656>; else goto <D.21657>;
    <D.21656>:
    D.21659 = MEM[(mword *)start];
    D.21660 = D.21659 & 1;
    if (D.21660 != 0) goto <D.21661>; else goto <D.21662>;
    <D.21661>:
    D.21659 = MEM[(mword *)start];
    D.21663 = D.21659 & 4294967292;
    iftmp.0 = (char *) D.21663;
    goto <D.21664>;
    <D.21662>:
    iftmp.0 = 0B;
    <D.21664>:
    obj = iftmp.0;
    if (obj == 0B) goto <D.21665>; else goto <D.21666>;
    <D.21665>:
    obj = start;
    <D.21666>:
    goto <D.21667>;
    <D.21657>:
    obj = start;
    <D.21667>:
    D.21668 = sgen_safe_object_get_size (obj);
    D.21669 = D.21668 + 7;
    size = D.21669 & 4294967288;
    D.21670 = MEM[(mword *)obj];
    D.21671 = D.21670 & 4294967292;
    D.21672 = (struct MonoVTable *) D.21671;
    array_fill_vtable.1 = array_fill_vtable;
    if (D.21672 != array_fill_vtable.1) goto <D.21674>; else goto <D.21675>;
    <D.21674>:
    callback (obj, size, data);
    <D.21675>:
    start = start + size;
  }
  <D.19912>:
  if (start < end) goto <D.19913>; else goto <D.19914>;
  <D.19914>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.2;
  unsigned int D.21677;
  unsigned int D.21678;
  unsigned int D.21681;
  guint D.21685;
  struct MonoVTable * D.21686;
  char * forwarded;

  D.21677 = MEM[(mword *)obj];
  D.21678 = D.21677 & 1;
  if (D.21678 != 0) goto <D.21679>; else goto <D.21680>;
  <D.21679>:
  D.21677 = MEM[(mword *)obj];
  D.21681 = D.21677 & 4294967292;
  iftmp.2 = (char *) D.21681;
  goto <D.21682>;
  <D.21680>:
  iftmp.2 = 0B;
  <D.21682>:
  forwarded = iftmp.2;
  if (forwarded != 0B) goto <D.21683>; else goto <D.21684>;
  <D.21683>:
  obj = forwarded;
  <D.21684>:
  D.21677 = MEM[(mword *)obj];
  D.21681 = D.21677 & 4294967292;
  D.21686 = (struct MonoVTable *) D.21681;
  D.21685 = sgen_par_object_get_size (D.21686, obj);
  return D.21685;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.21688;
  unsigned int D.21689;
  guint D.21694;
  int D.21695;
  int D.21696;
  unsigned int D.21697;
  unsigned int D.21700;
  int D.21701;
  unsigned int D.21702;
  unsigned int element_size.3;
  unsigned int D.21704;
  unsigned int D.21705;
  struct MonoClass * D.21708;
  unsigned char D.21709;
  unsigned int D.21710;
  unsigned int D.21711;
  mword descr;
  mword type;

  D.21688 = vtable->gc_descr;
  descr = (mword) D.21688;
  type = descr & 7;
  D.21689 = type + 4294967295;
  if (D.21689 <= 1) goto <D.21690>; else goto <D.21691>;
  <D.21690>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.21692>; else goto <D.21693>;
    <D.21692>:
    D.21695 = MEM[(struct MonoString *)o].length;
    D.21696 = D.21695 * 2;
    D.21697 = (unsigned int) D.21696;
    D.21694 = D.21697 + 14;
    return D.21694;
    <D.21693>:
    D.21694 = size;
    return D.21694;
  }
  <D.21691>:
  if (type == 4) goto <D.21698>; else goto <D.21699>;
  <D.21698>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.21700 = descr >> 3;
    D.21701 = (int) D.21700;
    element_size = D.21701 & 1023;
    array = o;
    D.21702 = array->max_length;
    element_size.3 = (unsigned int) element_size;
    D.21704 = D.21702 * element_size.3;
    size = D.21704 + 16;
    D.21705 = descr & 8192;
    if (D.21705 != 0) goto <D.21706>; else goto <D.21707>;
    <D.21706>:
    size = size + 3;
    size = size & 4294967292;
    D.21708 = vtable->klass;
    D.21709 = D.21708->rank;
    D.21710 = (unsigned int) D.21709;
    D.21711 = D.21710 * 8;
    size = D.21711 + size;
    <D.21707>:
    D.21694 = size;
    return D.21694;
  }
  <D.21699>:
  D.21694 = slow_object_get_size (vtable, o);
  return D.21694;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.21713;
  guint D.21716;
  int D.21717;
  int D.21718;
  unsigned int D.21719;
  unsigned char D.21720;
  int D.21723;
  unsigned int D.21724;
  unsigned int D.21725;
  unsigned int D.21726;
  struct MonoArrayBounds * D.21727;
  _Bool D.21728;
  long int D.21729;
  long int D.21730;
  unsigned int D.21733;
  unsigned int D.21734;
  int D.21735;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.21713 = mono_defaults.string_class;
  if (D.21713 == klass) goto <D.21714>; else goto <D.21715>;
  <D.21714>:
  D.21717 = MEM[(struct MonoString *)o].length;
  D.21718 = D.21717 * 2;
  D.21719 = (unsigned int) D.21718;
  D.21716 = D.21719 + 14;
  return D.21716;
  <D.21715>:
  D.21720 = klass->rank;
  if (D.21720 != 0) goto <D.21721>; else goto <D.21722>;
  <D.21721>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.21723 = klass->sizes.element_size;
    D.21724 = (unsigned int) D.21723;
    D.21725 = array->max_length;
    D.21726 = D.21724 * D.21725;
    size = D.21726 + 16;
    D.21727 = array->bounds;
    D.21728 = D.21727 != 0B;
    D.21729 = (long int) D.21728;
    D.21730 = __builtin_expect (D.21729, 0);
    if (D.21730 != 0) goto <D.21731>; else goto <D.21732>;
    <D.21731>:
    size = size + 3;
    size = size & 4294967292;
    D.21720 = klass->rank;
    D.21733 = (unsigned int) D.21720;
    D.21734 = D.21733 * 8;
    size = D.21734 + size;
    <D.21732>:
    D.21716 = size;
    return D.21716;
  }
  <D.21722>:
  D.21735 = klass->instance_size;
  D.21716 = (guint) D.21735;
  return D.21716;
}


mono_gc_scan_for_specific_ref (struct MonoObject * key, gboolean precise)
{
  struct GCMemSection * nursery_section.4;
  char * D.21738;
  char * D.21739;
  void (*<T2c43>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.21740;
  unsigned int D.21741;
  void * D.21742;
  char * D.21743;
  struct SgenHashTableEntry * D.21744;
  unsigned int D.21745;
  void * * ptr;
  struct RootRecord * root;

  scan_object_for_specific_ref_precise = precise;
  nursery_section.4 = nursery_section;
  D.21738 = nursery_section.4->data;
  nursery_section.4 = nursery_section;
  D.21739 = nursery_section.4->end_data;
  sgen_scan_area_with_callback (D.21738, D.21739, scan_object_for_specific_ref_callback, key, 1);
  D.21740 = major_collector.iterate_objects;
  D.21740 (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.19989>;
    <D.19988>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.21741 = __i * 4;
      __iter = __table + D.21741;
      goto <D.19986>;
      <D.19985>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        ptr = __entry->key;
        root = &__entry->data;
        goto <D.19983>;
        <D.19982>:
        D.21742 = *ptr;
        check_root_obj_specific_ref (root, D.21742, key);
        ptr = ptr + 4;
        <D.19983>:
        D.21743 = root->end_root;
        if (D.21743 > ptr) goto <D.19982>; else goto <D.19984>;
        <D.19984>:
      }
      __iter = __next;
      <D.19986>:
      D.21744 = *__iter;
      if (D.21744 != 0B) goto <D.19985>; else goto <D.19987>;
      <D.19987>:
    }
    __i = __i + 1;
    <D.19989>:
    D.21745 = roots_hash[1].size;
    if (D.21745 > __i) goto <D.19988>; else goto <D.19990>;
    <D.19990>:
  }
}


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


scan_object_for_specific_ref (char * start, struct MonoObject * key)
{
  char * iftmp.5;
  unsigned int D.21747;
  unsigned int D.21748;
  unsigned int D.21751;
  int scan_object_for_specific_ref_precise.6;
  unsigned int D.21758;
  unsigned int D.21759;
  unsigned int D.21762;
  unsigned int D.21763;
  unsigned int D.21764;
  unsigned int D.21765;
  unsigned int D.21766;
  void * D.21767;
  const char * D.21770;
  int _objptr.7;
  int start.8;
  int D.21773;
  const char * D.21776;
  unsigned int _index.9;
  unsigned int D.21778;
  int D.21779;
  void * D.21780;
  const char * D.21783;
  int _objptr.10;
  int D.21785;
  unsigned int _index.11;
  unsigned int D.21787;
  int D.21788;
  const char * D.21791;
  unsigned int D.21792;
  unsigned int D.21795;
  int D.21796;
  int desc.12;
  unsigned int D.21800;
  unsigned int el_size.13;
  unsigned int D.21802;
  void * D.21803;
  const char * D.21806;
  int p.14;
  int D.21808;
  int D.21812;
  unsigned int offset.15;
  unsigned int D.21814;
  unsigned int i.16;
  unsigned int D.21816;
  void * * D.21817;
  void * D.21818;
  const char * D.21821;
  char * D.21822;
  int D.21823;
  int D.21824;
  sizetype el_size.17;
  unsigned int D.21829;
  void * D.21832;
  const char * D.21835;
  int p.18;
  int D.21837;
  unsigned int D.21838;
  void * D.21841;
  const char * D.21844;
  int _objptr.19;
  int D.21846;
  unsigned int D.21847;
  unsigned int D.21848;
  struct MonoVTable * D.21851;
  struct MonoClass * D.21852;
  const char * D.21853;
  const char * D.21854;
  gsize * bitmap_data.20;
  unsigned int D.21856;
  void * D.21859;
  const char * D.21862;
  int _objptr.21;
  int D.21864;
  int bwords.22;
  unsigned int D.21866;
  gsize * mbitmap_data.23;
  unsigned int D.21868;
  unsigned int D.21869;
  struct MonoClass * D.21870;
  unsigned int el_size.24;
  unsigned int D.21872;
  const char * D.21875;
  const char * D.21876;
  gsize * bitmap_data.25;
  unsigned int D.21878;
  void * D.21881;
  const char * D.21884;
  int _objptr.26;
  int D.21886;
  unsigned int bwords.27;
  sizetype el_size.28;
  unsigned int i.29;
  unsigned int D.21891;
  mword * D.21892;
  unsigned int D.21893;
  unsigned int key.30;
  const char * D.21897;
  unsigned int i.31;
  unsigned int D.21899;
  char * forwarded;

  D.21747 = MEM[(mword *)start];
  D.21748 = D.21747 & 1;
  if (D.21748 != 0) goto <D.21749>; else goto <D.21750>;
  <D.21749>:
  D.21747 = MEM[(mword *)start];
  D.21751 = D.21747 & 4294967292;
  iftmp.5 = (char *) D.21751;
  goto <D.21752>;
  <D.21750>:
  iftmp.5 = 0B;
  <D.21752>:
  forwarded = iftmp.5;
  if (forwarded != 0B) goto <D.21753>; else goto <D.21754>;
  <D.21753>:
  start = forwarded;
  <D.21754>:
  scan_object_for_specific_ref_precise.6 = scan_object_for_specific_ref_precise;
  if (scan_object_for_specific_ref_precise.6 != 0) goto <D.21756>; else goto <D.21757>;
  <D.21756>:
  {
    struct GCVTable * vt;
    mword desc;

    D.21747 = MEM[(mword *)start];
    D.21751 = D.21747 & 4294967292;
    vt = (struct GCVTable *) D.21751;
    desc = vt->desc;
    D.21758 = desc & 7;
    switch (D.21758) <default: <D.19896>, case 1: <D.19811>, case 2: <D.19818>, case 3: <D.19862>, case 4: <D.19826>, case 5: <D.19856>, case 6: <D.19875>, case 7: <D.19895>>
    <D.19811>:
    D.21759 = desc & 4294901760;
    if (D.21759 != 0) goto <D.21760>; else goto <D.21761>;
    <D.21760>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.21762 = desc >> 16;
      D.21763 = D.21762 & 255;
      D.21764 = D.21763 * 4;
      _objptr = _objptr + D.21764;
      D.21765 = desc >> 24;
      D.21766 = D.21765 * 4;
      _objptr_end = _objptr + D.21766;
      D.21767 = *_objptr;
      if (D.21767 == key) goto <D.21768>; else goto <D.21769>;
      <D.21768>:
      D.21770 = safe_name (start);
      _objptr.7 = (int) _objptr;
      start.8 = (int) start;
      D.21773 = _objptr.7 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21770, D.21773);
      <D.21769>:
      _objptr = _objptr + 4;
      goto <D.19815>;
      <D.19814>:
      D.21767 = *_objptr;
      if (D.21767 == key) goto <D.21774>; else goto <D.21775>;
      <D.21774>:
      D.21776 = safe_name (start);
      _objptr.7 = (int) _objptr;
      start.8 = (int) start;
      D.21773 = _objptr.7 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21776, D.21773);
      <D.21775>:
      _objptr = _objptr + 4;
      <D.19815>:
      if (_objptr < _objptr_end) goto <D.19814>; else goto <D.19816>;
      <D.19816>:
    }
    <D.21761>:
    goto <D.19817>;
    <D.19818>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.9 = (unsigned int) _index;
        D.21778 = _index.9 * 4;
        _objptr = _objptr + D.21778;
        D.21779 = _index + 1;
        _bmap = _bmap >> D.21779;
        D.21780 = *_objptr;
        if (D.21780 == key) goto <D.21781>; else goto <D.21782>;
        <D.21781>:
        D.21783 = safe_name (start);
        _objptr.10 = (int) _objptr;
        start.8 = (int) start;
        D.21785 = _objptr.10 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21783, D.21785);
        <D.21782>:
        _objptr = _objptr + 4;
      }
      goto <D.19824>;
      <D.19823>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.11 = (unsigned int) _index;
        D.21787 = _index.11 * 4;
        _objptr = _objptr + D.21787;
        D.21788 = _index + 1;
        _bmap = _bmap >> D.21788;
        D.21780 = *_objptr;
        if (D.21780 == key) goto <D.21789>; else goto <D.21790>;
        <D.21789>:
        D.21791 = safe_name (start);
        _objptr.10 = (int) _objptr;
        start.8 = (int) start;
        D.21785 = _objptr.10 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21791, D.21785);
        <D.21790>:
        _objptr = _objptr + 4;
      }
      <D.19824>:
      if (_bmap != 0) goto <D.19823>; else goto <D.19825>;
      <D.19825>:
    }
    goto <D.19817>;
    <D.19826>:
    D.21792 = desc & 4294950912;
    if (D.21792 != 0) goto <D.21793>; else goto <D.21794>;
    <D.21793>:
    {
      int el_size;
      int etype;

      D.21795 = desc >> 3;
      D.21796 = (int) D.21795;
      el_size = D.21796 & 1023;
      desc.12 = (int) desc;
      etype = desc.12 & 49152;
      if (etype == 16384) goto <D.21798>; else goto <D.21799>;
      <D.21798>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.21800 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.21802 = D.21800 * el_size.13;
        end_refs = p + D.21802;
        goto <D.19832>;
        <D.19831>:
        D.21803 = *p;
        if (D.21803 == key) goto <D.21804>; else goto <D.21805>;
        <D.21804>:
        D.21806 = safe_name (start);
        p.14 = (int) p;
        start.8 = (int) start;
        D.21808 = p.14 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21806, D.21808);
        <D.21805>:
        p = p + 4;
        <D.19832>:
        if (p < end_refs) goto <D.19831>; else goto <D.19833>;
        <D.19833>:
      }
      goto <D.21809>;
      <D.21799>:
      if (etype == 32768) goto <D.21810>; else goto <D.21811>;
      <D.21810>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.21762 = desc >> 16;
        D.21812 = (int) D.21762;
        offset = D.21812 & 255;
        D.21765 = desc >> 24;
        num_refs = (int) D.21765;
        e_start = start + 16;
        D.21800 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.21802 = D.21800 * el_size.13;
        e_end = e_start + D.21802;
        goto <D.19844>;
        <D.19843>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.15 = (unsigned int) offset;
          D.21814 = offset.15 * 4;
          p = p + D.21814;
          i = 0;
          goto <D.19841>;
          <D.19840>:
          i.16 = (unsigned int) i;
          D.21816 = i.16 * 4;
          D.21817 = p + D.21816;
          D.21818 = *D.21817;
          if (D.21818 == key) goto <D.21819>; else goto <D.21820>;
          <D.21819>:
          D.21821 = safe_name (start);
          i.16 = (unsigned int) i;
          D.21816 = i.16 * 4;
          D.21822 = p + D.21816;
          D.21823 = (int) D.21822;
          start.8 = (int) start;
          D.21824 = D.21823 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21821, D.21824);
          <D.21820>:
          i = i + 1;
          <D.19841>:
          if (i < num_refs) goto <D.19840>; else goto <D.19842>;
          <D.19842>:
          el_size.17 = (sizetype) el_size;
          e_start = e_start + el_size.17;
        }
        <D.19844>:
        if (e_start < e_end) goto <D.19843>; else goto <D.19845>;
        <D.19845>:
      }
      goto <D.21826>;
      <D.21811>:
      if (etype == 49152) goto <D.21827>; else goto <D.21828>;
      <D.21827>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.21800 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.21802 = D.21800 * el_size.13;
        e_end = e_start + D.21802;
        goto <D.19854>;
        <D.19853>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.19851>;
          <D.19850>:
          D.21829 = _bmap & 1;
          if (D.21829 != 0) goto <D.21830>; else goto <D.21831>;
          <D.21830>:
          D.21832 = *p;
          if (D.21832 == key) goto <D.21833>; else goto <D.21834>;
          <D.21833>:
          D.21835 = safe_name (start);
          p.18 = (int) p;
          start.8 = (int) start;
          D.21837 = p.18 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21835, D.21837);
          <D.21834>:
          <D.21831>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.19851>:
          if (_bmap != 0) goto <D.19850>; else goto <D.19852>;
          <D.19852>:
          el_size.17 = (sizetype) el_size;
          e_start = e_start + el_size.17;
        }
        <D.19854>:
        if (e_start < e_end) goto <D.19853>; else goto <D.19855>;
        <D.19855>:
      }
      <D.21828>:
      <D.21826>:
      <D.21809>:
    }
    <D.21794>:
    goto <D.19817>;
    <D.19856>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.19860>;
      <D.19859>:
      D.21838 = _bmap & 1;
      if (D.21838 != 0) goto <D.21839>; else goto <D.21840>;
      <D.21839>:
      D.21841 = *_objptr;
      if (D.21841 == key) goto <D.21842>; else goto <D.21843>;
      <D.21842>:
      D.21844 = safe_name (start);
      _objptr.19 = (int) _objptr;
      start.8 = (int) start;
      D.21846 = _objptr.19 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21844, D.21846);
      <D.21843>:
      <D.21840>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19860>:
      if (_bmap != 0) goto <D.19859>; else goto <D.19861>;
      <D.19861>:
    }
    goto <D.19817>;
    <D.19862>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.21847 = *bitmap_data;
      D.21848 = D.21847 + 4294967295;
      bwords = (int) D.21848;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.21849>; else goto <D.21850>;
      <D.21849>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.21851 = myobj->vtable;
        D.21852 = D.21851->klass;
        D.21853 = D.21852->name_space;
        D.21851 = myobj->vtable;
        D.21852 = D.21851->klass;
        D.21854 = D.21852->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21853, D.21854);
      }
      <D.21850>:
      goto <D.19873>;
      <D.19872>:
      {
        gsize _bmap;

        bitmap_data.20 = bitmap_data;
        bitmap_data = bitmap_data.20 + 4;
        _bmap = *bitmap_data.20;
        _objptr = start_run;
        goto <D.19870>;
        <D.19869>:
        D.21856 = _bmap & 1;
        if (D.21856 != 0) goto <D.21857>; else goto <D.21858>;
        <D.21857>:
        D.21859 = *_objptr;
        if (D.21859 == key) goto <D.21860>; else goto <D.21861>;
        <D.21860>:
        D.21862 = safe_name (start);
        _objptr.21 = (int) _objptr;
        start.8 = (int) start;
        D.21864 = _objptr.21 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21862, D.21864);
        <D.21861>:
        <D.21858>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.19870>:
        if (_bmap != 0) goto <D.19869>; else goto <D.19871>;
        <D.19871>:
        start_run = start_run + 128;
      }
      <D.19873>:
      bwords.22 = bwords;
      bwords = bwords.22 + -1;
      if (bwords.22 > 0) goto <D.19872>; else goto <D.19874>;
      <D.19874>:
    }
    goto <D.19817>;
    <D.19875>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.21866 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.21866);
      mbitmap_data.23 = mbitmap_data;
      mbitmap_data = mbitmap_data.23 + 4;
      D.21868 = *mbitmap_data.23;
      D.21869 = D.21868 + 4294967295;
      mbwords = (int) D.21869;
      D.21870 = vt->klass;
      el_size = mono_array_element_size (D.21870);
      e_start = start + 16;
      D.21800 = MEM[(struct MonoArray *)start].max_length;
      el_size.24 = (unsigned int) el_size;
      D.21872 = D.21800 * el_size.24;
      e_end = e_start + D.21872;
      if (0 != 0) goto <D.21873>; else goto <D.21874>;
      <D.21873>:
      D.21866 = vt->desc;
      D.21870 = vt->klass;
      D.21875 = D.21870->name_space;
      D.21870 = vt->klass;
      D.21876 = D.21870->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.21866, D.21875, D.21876);
      <D.21874>:
      goto <D.19893>;
      <D.19892>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.25 = bitmap_data;
          bitmap_data = bitmap_data.25 + 4;
          _bmap = *bitmap_data.25;
          start_run = _objptr;
          goto <D.19887>;
          <D.19886>:
          D.21878 = _bmap & 1;
          if (D.21878 != 0) goto <D.21879>; else goto <D.21880>;
          <D.21879>:
          D.21881 = *_objptr;
          if (D.21881 == key) goto <D.21882>; else goto <D.21883>;
          <D.21882>:
          D.21884 = safe_name (start);
          _objptr.26 = (int) _objptr;
          start.8 = (int) start;
          D.21886 = _objptr.26 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21884, D.21886);
          <D.21883>:
          <D.21880>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.19887>:
          if (_bmap != 0) goto <D.19886>; else goto <D.19888>;
          <D.19888>:
          _objptr = start_run + 128;
        }
        <D.19890>:
        bwords.27 = bwords;
        bwords = bwords.27 + 4294967295;
        if (bwords.27 != 0) goto <D.19889>; else goto <D.19891>;
        <D.19891>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.19893>:
      if (e_start < e_end) goto <D.19892>; else goto <D.19894>;
      <D.19894>:
    }
    goto <D.19817>;
    <D.19895>:
    goto <D.19817>;
    <D.19896>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.19817>:
  }
  goto <D.21889>;
  <D.21757>:
  {
    mword * words;
    size_t size;
    int i;

    words = start;
    size = sgen_safe_object_get_size (start);
    i = 0;
    goto <D.19901>;
    <D.19900>:
    i.29 = (unsigned int) i;
    D.21891 = i.29 * 4;
    D.21892 = words + D.21891;
    D.21893 = *D.21892;
    key.30 = (unsigned int) key;
    if (D.21893 == key.30) goto <D.21895>; else goto <D.21896>;
    <D.21895>:
    D.21897 = safe_name (start);
    i.29 = (unsigned int) i;
    D.21891 = i.29 * 4;
    monoeg_g_print ("found possible ref to %p in object %p (%s) at offset %td\n", key, start, D.21897, D.21891);
    <D.21896>:
    i = i + 1;
    <D.19901>:
    i.31 = (unsigned int) i;
    D.21899 = size / 4;
    if (i.31 < D.21899) goto <D.19900>; else goto <D.19902>;
    <D.19902>:
  }
  <D.21889>:
}


scan_roots_for_specific_ref (struct MonoObject * key, int root_type)
{
  unsigned int D.21902;
  unsigned int D.21903;
  unsigned int D.21904;
  void * D.21907;
  unsigned int D.21908;
  unsigned int D.21909;
  gsize * bitmap_data.32;
  unsigned int D.21911;
  void * D.21914;
  int bwords.33;
  struct SgenHashTableEntry * D.21916;
  unsigned int D.21917;
  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.19968>;
    <D.19967>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.21902 = __i * 4;
      __iter = __table + D.21902;
      goto <D.19965>;
      <D.19964>:
      {
        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.21903 = desc & 7;
          switch (D.21903) <default: <D.19963>, case 1: <D.19943>, case 2: <D.19962>, case 3: <D.19947>, case 4: <D.19960>>
          <D.19943>:
          desc = desc >> 3;
          goto <D.19945>;
          <D.19944>:
          D.21904 = desc & 1;
          if (D.21904 != 0) goto <D.21905>; else goto <D.21906>;
          <D.21905>:
          D.21907 = *start_root;
          check_root_obj_specific_ref (root, key, D.21907);
          <D.21906>:
          desc = desc >> 1;
          start_root = start_root + 4;
          <D.19945>:
          if (desc != 0) goto <D.19944>; else goto <D.19946>;
          <D.19946>:
          return;
          <D.19947>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.21908 = *bitmap_data;
            D.21909 = D.21908 + 4294967295;
            bwords = (int) D.21909;
            start_run = start_root;
            bitmap_data = bitmap_data + 4;
            goto <D.19957>;
            <D.19956>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.32 = bitmap_data;
              bitmap_data = bitmap_data.32 + 4;
              bmap = *bitmap_data.32;
              objptr = start_run;
              goto <D.19954>;
              <D.19953>:
              D.21911 = bmap & 1;
              if (D.21911 != 0) goto <D.21912>; else goto <D.21913>;
              <D.21912>:
              D.21914 = *objptr;
              check_root_obj_specific_ref (root, key, D.21914);
              <D.21913>:
              bmap = bmap >> 1;
              objptr = objptr + 4;
              <D.19954>:
              if (bmap != 0) goto <D.19953>; else goto <D.19955>;
              <D.19955>:
              start_run = start_run + 128;
            }
            <D.19957>:
            bwords.33 = bwords;
            bwords = bwords.33 + -1;
            if (bwords.33 > 0) goto <D.19956>; else goto <D.19958>;
            <D.19958>:
            goto <D.19959>;
          }
          <D.19960>:
          {
            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.19959>;
          }
          <D.19962>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 844);
          <D.19963>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 846);
          <D.19959>:
        }
      }
      __iter = __next;
      <D.19965>:
      D.21916 = *__iter;
      if (D.21916 != 0B) goto <D.19964>; else goto <D.19966>;
      <D.19966>:
    }
    __i = __i + 1;
    <D.19968>:
    D.21917 = roots_hash[root_type].size;
    if (D.21917 > __i) goto <D.19967>; else goto <D.19969>;
    <D.19969>:
  }
  check_key = 0B;
  check_root = 0B;
}


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

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


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


mono_gc_clear_domain (struct MonoDomain * domain)
{
  int concurrent_collection_in_progress.36;
  int concurrent_collection_in_progress.37;
  _Bool D.21929;
  long int D.21930;
  long int D.21931;
  int xdomain_checks.38;
  struct MonoDomain * D.21937;
  struct GCMemSection * nursery_section.39;
  char * D.21941;
  char * D.21942;
  void (*<T2c43>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.21943;
  char[0:] * D.21944;
  int D.21945;
  struct LOSObject * los_object_list.40;
  struct FILE * gc_debug_file.41;
  struct MonoDomain * D.21955;
  int do_pin_stats.42;
  _Bool D.21959;
  long int D.21960;
  long int D.21961;
  struct LOSObject * bigobj;
  struct LOSObject * prev;
  int i;

  pthread_mutex_lock (&gc_mutex);
  sgen_stop_world (0);
  concurrent_collection_in_progress.36 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.36 != 0) goto <D.21926>; else goto <D.21927>;
  <D.21926>:
  sgen_perform_collection (0, 1, "clear domain", 1);
  <D.21927>:
  concurrent_collection_in_progress.37 = concurrent_collection_in_progress;
  D.21929 = concurrent_collection_in_progress.37 != 0;
  D.21930 = (long int) D.21929;
  D.21931 = __builtin_expect (D.21930, 0);
  if (D.21931 != 0) goto <D.21932>; else goto <D.21933>;
  <D.21932>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1059, "!concurrent_collection_in_progress");
  <D.21933>:
  sgen_process_fin_stage_entries ();
  sgen_process_dislink_stage_entries ();
  sgen_clear_nursery_fragments ();
  xdomain_checks.38 = xdomain_checks;
  if (xdomain_checks.38 != 0) goto <D.21935>; else goto <D.21936>;
  <D.21935>:
  D.21937 = mono_get_root_domain ();
  if (D.21937 != domain) goto <D.21938>; else goto <D.21939>;
  <D.21938>:
  scan_for_registered_roots_in_domain (domain, 0);
  scan_for_registered_roots_in_domain (domain, 2);
  check_for_xdomain_refs ();
  <D.21939>:
  <D.21936>:
  null_ephemerons_for_domain (domain);
  i = 0;
  goto <D.20086>;
  <D.20085>:
  sgen_null_links_for_domain (domain, i);
  i = i + 1;
  <D.20086>:
  if (i <= 1) goto <D.20085>; else goto <D.20087>;
  <D.20087>:
  i = 0;
  goto <D.20089>;
  <D.20088>:
  sgen_remove_finalizers_for_domain (domain, i);
  i = i + 1;
  <D.20089>:
  if (i <= 1) goto <D.20088>; else goto <D.20090>;
  <D.20090>:
  nursery_section.39 = nursery_section;
  D.21941 = nursery_section.39->data;
  nursery_section.39 = nursery_section;
  D.21942 = nursery_section.39->end_data;
  sgen_scan_area_with_callback (D.21941, D.21942, clear_domain_process_minor_object_callback, domain, 0);
  D.21943 = major_collector.iterate_objects;
  D.21943 (1, 1, clear_domain_process_major_object_callback, domain);
  bigobj = los_object_list;
  goto <D.20092>;
  <D.20091>:
  D.21944 = &bigobj->data;
  clear_domain_process_object (D.21944, domain);
  bigobj = bigobj->next;
  <D.20092>:
  if (bigobj != 0B) goto <D.20091>; else goto <D.20093>;
  <D.20093>:
  prev = 0B;
  bigobj = los_object_list;
  goto <D.20095>;
  <D.20096>:
  D.21944 = &bigobj->data;
  D.21945 = need_remove_object_for_domain (D.21944, domain);
  if (D.21945 != 0) goto <D.21946>; else goto <D.21947>;
  <D.21946>:
  {
    struct LOSObject * to_free;

    to_free = bigobj;
    if (prev != 0B) goto <D.21948>; else goto <D.21949>;
    <D.21948>:
    los_object_list.40 = bigobj->next;
    prev->next = los_object_list.40;
    goto <D.21951>;
    <D.21949>:
    los_object_list.40 = bigobj->next;
    los_object_list = los_object_list.40;
    <D.21951>:
    bigobj = bigobj->next;
    if (0 != 0) goto <D.21952>; else goto <D.21953>;
    <D.21952>:
    gc_debug_file.41 = gc_debug_file;
    D.21944 = &bigobj->data;
    fprintf (gc_debug_file.41, "Freeing large object %p\n", D.21944);
    gc_debug_file.41 = gc_debug_file;
    fflush (gc_debug_file.41);
    <D.21953>:
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.20095>;
  }
  <D.21947>:
  prev = bigobj;
  bigobj = bigobj->next;
  <D.20095>:
  if (bigobj != 0B) goto <D.20096>; else goto <D.20097>;
  <D.20097>:
  D.21943 = major_collector.iterate_objects;
  D.21943 (1, 0, clear_domain_free_major_non_pinned_object_callback, domain);
  D.21943 = major_collector.iterate_objects;
  D.21943 (0, 1, clear_domain_free_major_pinned_object_callback, domain);
  D.21955 = mono_get_root_domain ();
  if (D.21955 == domain) goto <D.21956>; else goto <D.21957>;
  <D.21956>:
  do_pin_stats.42 = do_pin_stats;
  D.21959 = do_pin_stats.42 != 0;
  D.21960 = (long int) D.21959;
  D.21961 = __builtin_expect (D.21960, 0);
  if (D.21961 != 0) goto <D.21962>; else goto <D.21963>;
  <D.21962>:
  sgen_pin_stats_print_class_stats ();
  <D.21963>:
  <D.21957>:
  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.21964;
  void (*<T2c3f>) (char *, size_t) D.21967;

  D.21964 = need_remove_object_for_domain (obj, domain);
  if (D.21964 != 0) goto <D.21965>; else goto <D.21966>;
  <D.21965>:
  D.21967 = major_collector.free_pinned_object;
  D.21967 (obj, size);
  <D.21966>:
}


clear_domain_free_major_non_pinned_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.21968;
  void (*<T2c3f>) (char *, size_t) D.21971;

  D.21968 = need_remove_object_for_domain (obj, domain);
  if (D.21968 != 0) goto <D.21969>; else goto <D.21970>;
  <D.21969>:
  D.21971 = major_collector.free_non_pinned_object;
  D.21971 (obj, size);
  <D.21970>:
}


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

  D.21972 = clear_domain_process_object (obj, domain);
  if (D.21972 != 0) goto <D.21973>; else goto <D.21974>;
  <D.21973>:
  memset (obj, 0, size);
  <D.21974>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.21977;
  int D.21982;
  void * D.21984;
  unsigned int D.21985;

  D.21977 = __builtin_constant_p (__len);
  if (D.21977 != 0) goto <D.21978>; else goto <D.21979>;
  <D.21978>:
  if (__len == 0) goto <D.21980>; else goto <D.21981>;
  <D.21980>:
  D.21982 = __builtin_constant_p (__ch);
  if (D.21982 == 0) goto <D.21975>; else goto <D.21983>;
  <D.21983>:
  if (__ch != 0) goto <D.21975>; else goto <D.21976>;
  <D.21975>:
  __warn_memset_zero_len ();
  D.21984 = __dest;
  return D.21984;
  <D.21976>:
  <D.21981>:
  <D.21979>:
  D.21985 = __builtin_object_size (__dest, 0);
  D.21984 = __builtin___memset_chk (__dest, __ch, __len, D.21985);
  return D.21984;
}


scan_for_registered_roots_in_domain (struct MonoDomain * domain, int root_type)
{
  unsigned int D.21987;
  unsigned int D.21990;
  unsigned int D.21991;
  void * D.21994;
  unsigned int D.21997;
  unsigned int D.21998;
  gsize * bitmap_data.43;
  unsigned int D.22000;
  void * D.22003;
  int bwords.44;
  struct SgenHashTableEntry * D.22007;
  unsigned int D.22008;
  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.20044>;
    <D.20043>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.21987 = __i * 4;
      __iter = __table + D.21987;
      goto <D.20041>;
      <D.20040>:
      {
        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.21988>; else goto <D.21989>;
          <D.21988>:
          // predicted unlikely by continue predictor.
          goto <D.20018>;
          <D.21989>:
          D.21990 = desc & 7;
          switch (D.21990) <default: <D.20039>, case 1: <D.20019>, case 2: <D.20038>, case 3: <D.20024>, case 4: <D.20036>>
          <D.20019>:
          desc = desc >> 3;
          goto <D.20021>;
          <D.20020>:
          D.21991 = desc & 1;
          if (D.21991 != 0) goto <D.21992>; else goto <D.21993>;
          <D.21992>:
          D.21994 = *start_root;
          if (D.21994 != 0B) goto <D.21995>; else goto <D.21996>;
          <D.21995>:
          D.21994 = *start_root;
          check_obj_not_in_domain (D.21994);
          <D.21996>:
          <D.21993>:
          desc = desc >> 1;
          start_root = start_root + 4;
          <D.20021>:
          if (desc != 0) goto <D.20020>; else goto <D.20022>;
          <D.20022>:
          goto <D.20023>;
          <D.20024>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.21997 = *bitmap_data;
            D.21998 = D.21997 + 4294967295;
            bwords = (int) D.21998;
            start_run = start_root;
            bitmap_data = bitmap_data + 4;
            goto <D.20034>;
            <D.20033>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.43 = bitmap_data;
              bitmap_data = bitmap_data.43 + 4;
              bmap = *bitmap_data.43;
              objptr = start_run;
              goto <D.20031>;
              <D.20030>:
              D.22000 = bmap & 1;
              if (D.22000 != 0) goto <D.22001>; else goto <D.22002>;
              <D.22001>:
              D.22003 = *objptr;
              if (D.22003 != 0B) goto <D.22004>; else goto <D.22005>;
              <D.22004>:
              D.22003 = *objptr;
              check_obj_not_in_domain (D.22003);
              <D.22005>:
              <D.22002>:
              bmap = bmap >> 1;
              objptr = objptr + 4;
              <D.20031>:
              if (bmap != 0) goto <D.20030>; else goto <D.20032>;
              <D.20032>:
              start_run = start_run + 128;
            }
            <D.20034>:
            bwords.44 = bwords;
            bwords = bwords.44 + -1;
            if (bwords.44 > 0) goto <D.20033>; else goto <D.20035>;
            <D.20035>:
            goto <D.20023>;
          }
          <D.20036>:
          {
            void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

            marker = sgen_get_user_descriptor_func (desc);
            marker (start_root, check_obj_not_in_domain);
            goto <D.20023>;
          }
          <D.20038>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 969);
          <D.20039>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 971);
          <D.20023>:
        }
      }
      <D.20018>:
      __iter = __next;
      <D.20041>:
      D.22007 = *__iter;
      if (D.22007 != 0B) goto <D.20040>; else goto <D.20042>;
      <D.20042>:
    }
    __i = __i + 1;
    <D.20044>:
    D.22008 = roots_hash[root_type].size;
    if (D.22008 > __i) goto <D.20043>; else goto <D.20045>;
    <D.20045>:
  }
  check_domain = 0B;
}


check_obj_not_in_domain (void * * o)
{
  void * D.22009;
  struct MonoVTable * D.22010;
  struct MonoDomain * D.22011;
  struct MonoDomain * check_domain.45;
  _Bool D.22013;
  long int D.22014;
  long int D.22015;

  D.22009 = *o;
  D.22010 = MEM[(struct MonoObject *)D.22009].vtable;
  D.22011 = D.22010->domain;
  check_domain.45 = check_domain;
  D.22013 = D.22011 == check_domain.45;
  D.22014 = (long int) D.22013;
  D.22015 = __builtin_expect (D.22014, 0);
  if (D.22015 != 0) goto <D.22016>; else goto <D.22017>;
  <D.22016>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 918, "((MonoObject*)(*o))->vtable->domain != check_domain");
  <D.22017>:
}


check_for_xdomain_refs ()
{
  struct GCMemSection * nursery_section.46;
  char * D.22019;
  char * D.22020;
  void (*<T2c43>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22021;
  char[0:] * D.22022;
  unsigned int D.22023;
  struct LOSObject * bigobj;

  nursery_section.46 = nursery_section;
  D.22019 = nursery_section.46->data;
  nursery_section.46 = nursery_section;
  D.22020 = nursery_section.46->end_data;
  sgen_scan_area_with_callback (D.22019, D.22020, scan_object_for_xdomain_refs, 0B, 0);
  D.22021 = major_collector.iterate_objects;
  D.22021 (1, 1, scan_object_for_xdomain_refs, 0B);
  bigobj = los_object_list;
  goto <D.20051>;
  <D.20050>:
  D.22022 = &bigobj->data;
  D.22023 = sgen_los_object_size (bigobj);
  scan_object_for_xdomain_refs (D.22022, D.22023, 0B);
  bigobj = bigobj->next;
  <D.20051>:
  if (bigobj != 0B) goto <D.20050>; else goto <D.20052>;
  <D.20052>:
}


scan_object_for_xdomain_refs (char * start, mword size, void * data)
{
  struct MonoVTable * D.22024;
  unsigned int D.22025;
  unsigned int D.22026;
  unsigned int D.22027;
  unsigned int D.22028;
  unsigned int D.22031;
  unsigned int D.22032;
  unsigned int D.22033;
  unsigned int D.22034;
  unsigned int D.22035;
  unsigned int _index.47;
  unsigned int D.22037;
  int D.22038;
  unsigned int _index.48;
  unsigned int D.22040;
  int D.22041;
  unsigned int D.22042;
  unsigned int D.22045;
  int D.22046;
  int desc.49;
  unsigned int D.22050;
  unsigned int el_size.50;
  unsigned int D.22052;
  int D.22056;
  unsigned int offset.51;
  unsigned int D.22058;
  unsigned int i.52;
  unsigned int D.22060;
  void * * D.22061;
  sizetype el_size.53;
  unsigned int D.22066;
  unsigned int D.22069;
  unsigned int D.22072;
  unsigned int D.22073;
  struct MonoVTable * D.22076;
  struct MonoClass * D.22077;
  const char * D.22078;
  const char * D.22079;
  gsize * bitmap_data.54;
  unsigned int D.22081;
  int bwords.55;
  unsigned int D.22085;
  gsize * mbitmap_data.56;
  unsigned int D.22087;
  unsigned int D.22088;
  struct MonoClass * D.22089;
  unsigned int el_size.57;
  unsigned int D.22091;
  const char * D.22094;
  const char * D.22095;
  gsize * bitmap_data.58;
  unsigned int D.22097;
  unsigned int bwords.59;
  sizetype el_size.60;
  struct MonoDomain * domain;

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

    D.22025 = MEM[(mword *)start];
    D.22026 = D.22025 & 4294967292;
    vt = (struct GCVTable *) D.22026;
    desc = vt->desc;
    D.22027 = desc & 7;
    switch (D.22027) <default: <D.19802>, case 1: <D.19717>, case 2: <D.19724>, case 3: <D.19768>, case 4: <D.19732>, case 5: <D.19762>, case 6: <D.19781>, case 7: <D.19801>>
    <D.19717>:
    D.22028 = desc & 4294901760;
    if (D.22028 != 0) goto <D.22029>; else goto <D.22030>;
    <D.22029>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.22031 = desc >> 16;
      D.22032 = D.22031 & 255;
      D.22033 = D.22032 * 4;
      _objptr = _objptr + D.22033;
      D.22034 = desc >> 24;
      D.22035 = D.22034 * 4;
      _objptr_end = _objptr + D.22035;
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 4;
      goto <D.19721>;
      <D.19720>:
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 4;
      <D.19721>:
      if (_objptr < _objptr_end) goto <D.19720>; else goto <D.19722>;
      <D.19722>:
    }
    <D.22030>:
    goto <D.19723>;
    <D.19724>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.47 = (unsigned int) _index;
        D.22037 = _index.47 * 4;
        _objptr = _objptr + D.22037;
        D.22038 = _index + 1;
        _bmap = _bmap >> D.22038;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 4;
      }
      goto <D.19730>;
      <D.19729>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.48 = (unsigned int) _index;
        D.22040 = _index.48 * 4;
        _objptr = _objptr + D.22040;
        D.22041 = _index + 1;
        _bmap = _bmap >> D.22041;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 4;
      }
      <D.19730>:
      if (_bmap != 0) goto <D.19729>; else goto <D.19731>;
      <D.19731>:
    }
    goto <D.19723>;
    <D.19732>:
    D.22042 = desc & 4294950912;
    if (D.22042 != 0) goto <D.22043>; else goto <D.22044>;
    <D.22043>:
    {
      int el_size;
      int etype;

      D.22045 = desc >> 3;
      D.22046 = (int) D.22045;
      el_size = D.22046 & 1023;
      desc.49 = (int) desc;
      etype = desc.49 & 49152;
      if (etype == 16384) goto <D.22048>; else goto <D.22049>;
      <D.22048>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.22050 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.22052 = D.22050 * el_size.50;
        end_refs = p + D.22052;
        goto <D.19738>;
        <D.19737>:
        check_reference_for_xdomain (p, start, domain);
        p = p + 4;
        <D.19738>:
        if (p < end_refs) goto <D.19737>; else goto <D.19739>;
        <D.19739>:
      }
      goto <D.22053>;
      <D.22049>:
      if (etype == 32768) goto <D.22054>; else goto <D.22055>;
      <D.22054>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.22031 = desc >> 16;
        D.22056 = (int) D.22031;
        offset = D.22056 & 255;
        D.22034 = desc >> 24;
        num_refs = (int) D.22034;
        e_start = start + 16;
        D.22050 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.22052 = D.22050 * el_size.50;
        e_end = e_start + D.22052;
        goto <D.19750>;
        <D.19749>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.51 = (unsigned int) offset;
          D.22058 = offset.51 * 4;
          p = p + D.22058;
          i = 0;
          goto <D.19747>;
          <D.19746>:
          i.52 = (unsigned int) i;
          D.22060 = i.52 * 4;
          D.22061 = p + D.22060;
          check_reference_for_xdomain (D.22061, start, domain);
          i = i + 1;
          <D.19747>:
          if (i < num_refs) goto <D.19746>; else goto <D.19748>;
          <D.19748>:
          el_size.53 = (sizetype) el_size;
          e_start = e_start + el_size.53;
        }
        <D.19750>:
        if (e_start < e_end) goto <D.19749>; else goto <D.19751>;
        <D.19751>:
      }
      goto <D.22063>;
      <D.22055>:
      if (etype == 49152) goto <D.22064>; else goto <D.22065>;
      <D.22064>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.22050 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.22052 = D.22050 * el_size.50;
        e_end = e_start + D.22052;
        goto <D.19760>;
        <D.19759>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.19757>;
          <D.19756>:
          D.22066 = _bmap & 1;
          if (D.22066 != 0) goto <D.22067>; else goto <D.22068>;
          <D.22067>:
          check_reference_for_xdomain (p, start, domain);
          <D.22068>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.19757>:
          if (_bmap != 0) goto <D.19756>; else goto <D.19758>;
          <D.19758>:
          el_size.53 = (sizetype) el_size;
          e_start = e_start + el_size.53;
        }
        <D.19760>:
        if (e_start < e_end) goto <D.19759>; else goto <D.19761>;
        <D.19761>:
      }
      <D.22065>:
      <D.22063>:
      <D.22053>:
    }
    <D.22044>:
    goto <D.19723>;
    <D.19762>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.19766>;
      <D.19765>:
      D.22069 = _bmap & 1;
      if (D.22069 != 0) goto <D.22070>; else goto <D.22071>;
      <D.22070>:
      check_reference_for_xdomain (_objptr, start, domain);
      <D.22071>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19766>:
      if (_bmap != 0) goto <D.19765>; else goto <D.19767>;
      <D.19767>:
    }
    goto <D.19723>;
    <D.19768>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.22072 = *bitmap_data;
      D.22073 = D.22072 + 4294967295;
      bwords = (int) D.22073;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.22074>; else goto <D.22075>;
      <D.22074>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.22076 = myobj->vtable;
        D.22077 = D.22076->klass;
        D.22078 = D.22077->name_space;
        D.22076 = myobj->vtable;
        D.22077 = D.22076->klass;
        D.22079 = D.22077->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.22078, D.22079);
      }
      <D.22075>:
      goto <D.19779>;
      <D.19778>:
      {
        gsize _bmap;

        bitmap_data.54 = bitmap_data;
        bitmap_data = bitmap_data.54 + 4;
        _bmap = *bitmap_data.54;
        _objptr = start_run;
        goto <D.19776>;
        <D.19775>:
        D.22081 = _bmap & 1;
        if (D.22081 != 0) goto <D.22082>; else goto <D.22083>;
        <D.22082>:
        check_reference_for_xdomain (_objptr, start, domain);
        <D.22083>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.19776>:
        if (_bmap != 0) goto <D.19775>; else goto <D.19777>;
        <D.19777>:
        start_run = start_run + 128;
      }
      <D.19779>:
      bwords.55 = bwords;
      bwords = bwords.55 + -1;
      if (bwords.55 > 0) goto <D.19778>; else goto <D.19780>;
      <D.19780>:
    }
    goto <D.19723>;
    <D.19781>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.22085 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.22085);
      mbitmap_data.56 = mbitmap_data;
      mbitmap_data = mbitmap_data.56 + 4;
      D.22087 = *mbitmap_data.56;
      D.22088 = D.22087 + 4294967295;
      mbwords = (int) D.22088;
      D.22089 = vt->klass;
      el_size = mono_array_element_size (D.22089);
      e_start = start + 16;
      D.22050 = MEM[(struct MonoArray *)start].max_length;
      el_size.57 = (unsigned int) el_size;
      D.22091 = D.22050 * el_size.57;
      e_end = e_start + D.22091;
      if (0 != 0) goto <D.22092>; else goto <D.22093>;
      <D.22092>:
      D.22085 = vt->desc;
      D.22089 = vt->klass;
      D.22094 = D.22089->name_space;
      D.22089 = vt->klass;
      D.22095 = D.22089->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.22085, D.22094, D.22095);
      <D.22093>:
      goto <D.19799>;
      <D.19798>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.58 = bitmap_data;
          bitmap_data = bitmap_data.58 + 4;
          _bmap = *bitmap_data.58;
          start_run = _objptr;
          goto <D.19793>;
          <D.19792>:
          D.22097 = _bmap & 1;
          if (D.22097 != 0) goto <D.22098>; else goto <D.22099>;
          <D.22098>:
          check_reference_for_xdomain (_objptr, start, domain);
          <D.22099>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.19793>:
          if (_bmap != 0) goto <D.19792>; else goto <D.19794>;
          <D.19794>:
          _objptr = start_run + 128;
        }
        <D.19796>:
        bwords.59 = bwords;
        bwords = bwords.59 + 4294967295;
        if (bwords.59 != 0) goto <D.19795>; else goto <D.19797>;
        <D.19797>:
        el_size.60 = (sizetype) el_size;
        e_start = e_start + el_size.60;
      }
      <D.19799>:
      if (e_start < e_end) goto <D.19798>; else goto <D.19800>;
      <D.19800>:
    }
    goto <D.19723>;
    <D.19801>:
    goto <D.19723>;
    <D.19802>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.19723>:
  }
}


check_reference_for_xdomain (void * * ptr, char * obj, struct MonoDomain * domain)
{
  int ptr.61;
  int o.62;
  struct MonoVTable * D.22108;
  struct MonoDomain * D.22109;
  int D.22110;
  struct MonoVTable * D.22113;
  struct MonoClassField * D.22114;
  unsigned int i.63;
  unsigned int D.22116;
  struct MonoClassField * D.22117;
  int D.22118;
  unsigned int i.64;
  unsigned int D.22122;
  struct MonoClass * D.22124;
  struct MonoClass * D.22125;
  struct MonoClass * D.22129;
  const char * D.22130;
  const char * D.22131;
  const char * iftmp.65;
  const char * D.22136;
  const char * D.22137;
  const char * iftmp.66;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;
  struct MonoClass * class;
  struct MonoClassField * field;
  char * str;

  o = obj;
  ref = *ptr;
  ptr.61 = (int) ptr;
  o.62 = (int) o;
  offset = ptr.61 - o.62;
  if (ref == 0B) goto <D.22105>; else goto <D.22107>;
  <D.22107>:
  D.22108 = ref->vtable;
  D.22109 = D.22108->domain;
  if (D.22109 == domain) goto <D.22105>; else goto <D.22106>;
  <D.22105>:
  return;
  <D.22106>:
  D.22110 = is_xdomain_ref_allowed (ptr, obj, domain);
  if (D.22110 != 0) goto <D.22111>; else goto <D.22112>;
  <D.22111>:
  return;
  <D.22112>:
  field = 0B;
  D.22113 = o->vtable;
  class = D.22113->klass;
  goto <D.19708>;
  <D.19707>:
  {
    int i;

    i = 0;
    goto <D.19705>;
    <D.19704>:
    D.22114 = class->fields;
    i.63 = (unsigned int) i;
    D.22116 = i.63 * 16;
    D.22117 = D.22114 + D.22116;
    D.22118 = D.22117->offset;
    if (D.22118 == offset) goto <D.22119>; else goto <D.22120>;
    <D.22119>:
    D.22114 = class->fields;
    i.63 = (unsigned int) i;
    D.22116 = i.63 * 16;
    field = D.22114 + D.22116;
    goto <D.19703>;
    <D.22120>:
    i = i + 1;
    <D.19705>:
    i.64 = (unsigned int) i;
    D.22122 = class->field.count;
    if (i.64 < D.22122) goto <D.19704>; else goto <D.19703>;
    <D.19703>:
    if (field != 0B) goto <D.19706>; else goto <D.22123>;
    <D.22123>:
  }
  class = class->parent;
  <D.19708>:
  if (class != 0B) goto <D.19707>; else goto <D.19706>;
  <D.19706>:
  D.22108 = ref->vtable;
  D.22124 = D.22108->klass;
  D.22125 = mono_defaults.string_class;
  if (D.22124 == D.22125) goto <D.22126>; else goto <D.22127>;
  <D.22126>:
  str = mono_string_to_utf8 (ref);
  goto <D.22128>;
  <D.22127>:
  str = 0B;
  <D.22128>:
  D.22113 = o->vtable;
  D.22129 = D.22113->klass;
  D.22130 = D.22129->name_space;
  D.22113 = o->vtable;
  D.22129 = D.22113->klass;
  D.22131 = D.22129->name;
  if (field != 0B) goto <D.22133>; else goto <D.22134>;
  <D.22133>:
  iftmp.65 = field->name;
  goto <D.22135>;
  <D.22134>:
  iftmp.65 = "";
  <D.22135>:
  D.22108 = ref->vtable;
  D.22124 = D.22108->klass;
  D.22136 = D.22124->name_space;
  D.22108 = ref->vtable;
  D.22124 = D.22108->klass;
  D.22137 = D.22124->name;
  if (str != 0B) goto <D.22139>; else goto <D.22140>;
  <D.22139>:
  iftmp.66 = str;
  goto <D.22141>;
  <D.22140>:
  iftmp.66 = "";
  <D.22141>:
  monoeg_g_print ("xdomain reference in %p (%s.%s) at offset %d (%s) to %p (%s.%s) (%s)  -  pointed to by:\n", o, D.22130, D.22131, offset, iftmp.65, ref, D.22136, D.22137, iftmp.66);
  mono_gc_scan_for_specific_ref (o, 1);
  if (str != 0B) goto <D.22142>; else goto <D.22143>;
  <D.22142>:
  monoeg_g_free (str);
  <D.22143>:
}


is_xdomain_ref_allowed (void * * ptr, char * obj, struct MonoDomain * domain)
{
  int ptr.67;
  int o.68;
  struct MonoVTable * D.22147;
  struct MonoClass * D.22148;
  struct MonoClass * D.22149;
  gboolean D.22154;
  struct MonoClass * D.22155;
  struct MonoClass * D.22160;
  int D.22161;
  int D.19591;
  int iftmp.69;
  int D.19590;
  struct MonoVTable * D.22169;
  struct MonoClass * D.22170;
  const char[21] * D.22171;
  unsigned char D.22172;
  int D.22173;
  unsigned char D.22174;
  int D.22175;
  const unsigned char * D.22180;
  unsigned char D.22181;
  int D.22182;
  const unsigned char * D.22183;
  unsigned char D.22184;
  int D.22185;
  const unsigned char * D.22190;
  unsigned char D.22191;
  int D.22192;
  const unsigned char * D.22193;
  unsigned char D.22194;
  int D.22195;
  const unsigned char * D.22200;
  unsigned char D.22201;
  int D.22202;
  const unsigned char * D.22203;
  unsigned char D.22204;
  int D.22205;
  const char * D.22207;
  int D.19600;
  int iftmp.70;
  int D.19599;
  const char[12] * D.22213;
  unsigned char D.22214;
  int D.22215;
  unsigned char D.22216;
  int D.22217;
  const unsigned char * D.22222;
  unsigned char D.22223;
  int D.22224;
  const unsigned char * D.22225;
  unsigned char D.22226;
  int D.22227;
  const unsigned char * D.22232;
  unsigned char D.22233;
  int D.22234;
  const unsigned char * D.22235;
  unsigned char D.22236;
  int D.22237;
  const unsigned char * D.22242;
  unsigned char D.22243;
  int D.22244;
  const unsigned char * D.22245;
  unsigned char D.22246;
  int D.22247;
  const char * D.22249;
  int D.19609;
  int iftmp.71;
  int D.19608;
  const char[7] * D.22255;
  unsigned char D.22256;
  int D.22257;
  unsigned char D.22258;
  int D.22259;
  const unsigned char * D.22264;
  unsigned char D.22265;
  int D.22266;
  const unsigned char * D.22267;
  unsigned char D.22268;
  int D.22269;
  const unsigned char * D.22274;
  unsigned char D.22275;
  int D.22276;
  const unsigned char * D.22277;
  unsigned char D.22278;
  int D.22279;
  const unsigned char * D.22284;
  unsigned char D.22285;
  int D.22286;
  const unsigned char * D.22287;
  unsigned char D.22288;
  int D.22289;
  const char * D.22291;
  int D.19618;
  int iftmp.72;
  int D.19617;
  const char[9] * D.22297;
  unsigned char D.22298;
  int D.22299;
  unsigned char D.22300;
  int D.22301;
  const unsigned char * D.22306;
  unsigned char D.22307;
  int D.22308;
  const unsigned char * D.22309;
  unsigned char D.22310;
  int D.22311;
  const unsigned char * D.22316;
  unsigned char D.22317;
  int D.22318;
  const unsigned char * D.22319;
  unsigned char D.22320;
  int D.22321;
  const unsigned char * D.22326;
  unsigned char D.22327;
  int D.22328;
  const unsigned char * D.22329;
  unsigned char D.22330;
  int D.22331;
  const char * D.22333;
  int D.19627;
  int iftmp.73;
  int D.19626;
  unsigned char D.22339;
  int D.22340;
  const unsigned char * D.22345;
  unsigned char D.22346;
  int D.22347;
  const unsigned char * D.22352;
  unsigned char D.22353;
  int D.22354;
  const unsigned char * D.22359;
  unsigned char D.22360;
  int D.22361;
  int D.19636;
  int iftmp.74;
  int D.19635;
  const char[7] * D.22368;
  unsigned char D.22369;
  int D.22370;
  unsigned char D.22371;
  int D.22372;
  const unsigned char * D.22377;
  unsigned char D.22378;
  int D.22379;
  const unsigned char * D.22380;
  unsigned char D.22381;
  int D.22382;
  const unsigned char * D.22387;
  unsigned char D.22388;
  int D.22389;
  const unsigned char * D.22390;
  unsigned char D.22391;
  int D.22392;
  const unsigned char * D.22397;
  unsigned char D.22398;
  int D.22399;
  const unsigned char * D.22400;
  unsigned char D.22401;
  int D.22402;
  int D.19645;
  int iftmp.75;
  int D.19644;
  const char[10] * D.22409;
  unsigned char D.22410;
  int D.22411;
  unsigned char D.22412;
  int D.22413;
  const unsigned char * D.22418;
  unsigned char D.22419;
  int D.22420;
  const unsigned char * D.22421;
  unsigned char D.22422;
  int D.22423;
  const unsigned char * D.22428;
  unsigned char D.22429;
  int D.22430;
  const unsigned char * D.22431;
  unsigned char D.22432;
  int D.22433;
  const unsigned char * D.22438;
  unsigned char D.22439;
  int D.22440;
  const unsigned char * D.22441;
  unsigned char D.22442;
  int D.22443;
  int D.19654;
  int iftmp.76;
  int D.19653;
  const char[13] * D.22450;
  unsigned char D.22451;
  int D.22452;
  unsigned char D.22453;
  int D.22454;
  const unsigned char * D.22459;
  unsigned char D.22460;
  int D.22461;
  const unsigned char * D.22462;
  unsigned char D.22463;
  int D.22464;
  const unsigned char * D.22469;
  unsigned char D.22470;
  int D.22471;
  const unsigned char * D.22472;
  unsigned char D.22473;
  int D.22474;
  const unsigned char * D.22479;
  unsigned char D.22480;
  int D.22481;
  const unsigned char * D.22482;
  unsigned char D.22483;
  int D.22484;
  int D.19663;
  int iftmp.77;
  int D.19662;
  const char[34] * D.22491;
  unsigned char D.22492;
  int D.22493;
  unsigned char D.22494;
  int D.22495;
  const unsigned char * D.22500;
  unsigned char D.22501;
  int D.22502;
  const unsigned char * D.22503;
  unsigned char D.22504;
  int D.22505;
  const unsigned char * D.22510;
  unsigned char D.22511;
  int D.22512;
  const unsigned char * D.22513;
  unsigned char D.22514;
  int D.22515;
  const unsigned char * D.22520;
  unsigned char D.22521;
  int D.22522;
  const unsigned char * D.22523;
  unsigned char D.22524;
  int D.22525;
  int D.19672;
  int iftmp.78;
  int D.19671;
  const char[12] * D.22532;
  unsigned char D.22533;
  int D.22534;
  unsigned char D.22535;
  int D.22536;
  const unsigned char * D.22541;
  unsigned char D.22542;
  int D.22543;
  const unsigned char * D.22544;
  unsigned char D.22545;
  int D.22546;
  const unsigned char * D.22551;
  unsigned char D.22552;
  int D.22553;
  const unsigned char * D.22554;
  unsigned char D.22555;
  int D.22556;
  const unsigned char * D.22561;
  unsigned char D.22562;
  int D.22563;
  const unsigned char * D.22564;
  unsigned char D.22565;
  int D.22566;
  int D.19681;
  int iftmp.79;
  int D.19680;
  unsigned char D.22573;
  int D.22574;
  const unsigned char * D.22579;
  unsigned char D.22580;
  int D.22581;
  const unsigned char * D.22586;
  unsigned char D.22587;
  int D.22588;
  const unsigned char * D.22593;
  unsigned char D.22594;
  int D.22595;
  int D.19690;
  int iftmp.80;
  int D.19689;
  unsigned char D.22602;
  int D.22603;
  const unsigned char * D.22608;
  unsigned char D.22609;
  int D.22610;
  const unsigned char * D.22615;
  unsigned char D.22616;
  int D.22617;
  const unsigned char * D.22622;
  unsigned char D.22623;
  int D.22624;
  int D.22628;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;

  o = obj;
  ref = *ptr;
  ptr.67 = (int) ptr;
  o.68 = (int) o;
  offset = ptr.67 - o.68;
  D.22147 = o->vtable;
  D.22148 = D.22147->klass;
  D.22149 = mono_defaults.thread_class;
  if (D.22148 == D.22149) goto <D.22150>; else goto <D.22151>;
  <D.22150>:
  if (offset == 8) goto <D.22152>; else goto <D.22153>;
  <D.22152>:
  D.22154 = 1;
  return D.22154;
  <D.22153>:
  <D.22151>:
  D.22147 = o->vtable;
  D.22148 = D.22147->klass;
  D.22155 = mono_defaults.internal_thread_class;
  if (D.22148 == D.22155) goto <D.22156>; else goto <D.22157>;
  <D.22156>:
  if (offset == 68) goto <D.22158>; else goto <D.22159>;
  <D.22158>:
  D.22154 = 1;
  return D.22154;
  <D.22159>:
  <D.22157>:
  D.22147 = o->vtable;
  D.22148 = D.22147->klass;
  D.22160 = mono_defaults.real_proxy_class;
  D.22161 = mono_class_has_parent_fast (D.22148, D.22160);
  if (D.22161 != 0) goto <D.22162>; else goto <D.22163>;
  <D.22162>:
  if (offset == 16) goto <D.22164>; else goto <D.22165>;
  <D.22164>:
  D.22154 = 1;
  return D.22154;
  <D.22165>:
  <D.22163>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22169 = ref->vtable;
      D.22170 = D.22169->klass;
      __s2 = D.22170->name_space;
      D.22171 = "System.Globalization";
      D.22172 = MEM[(const unsigned char *)D.22171];
      D.22173 = (int) D.22172;
      D.22174 = *__s2;
      D.22175 = (int) D.22174;
      __result = D.22173 - D.22175;
      {
        if (__s2_len != 0) goto <D.22176>; else goto <D.22177>;
        <D.22176>:
        if (__result == 0) goto <D.22178>; else goto <D.22179>;
        <D.22178>:
        D.22180 = &MEM[(void *)"System.Globalization" + 1B];
        D.22181 = *D.22180;
        D.22182 = (int) D.22181;
        D.22183 = __s2 + 1;
        D.22184 = *D.22183;
        D.22185 = (int) D.22184;
        __result = D.22182 - D.22185;
        if (__s2_len > 1) goto <D.22186>; else goto <D.22187>;
        <D.22186>:
        if (__result == 0) goto <D.22188>; else goto <D.22189>;
        <D.22188>:
        D.22190 = &MEM[(void *)"System.Globalization" + 2B];
        D.22191 = *D.22190;
        D.22192 = (int) D.22191;
        D.22193 = __s2 + 2;
        D.22194 = *D.22193;
        D.22195 = (int) D.22194;
        __result = D.22192 - D.22195;
        if (__s2_len > 2) goto <D.22196>; else goto <D.22197>;
        <D.22196>:
        if (__result == 0) goto <D.22198>; else goto <D.22199>;
        <D.22198>:
        D.22200 = &MEM[(void *)"System.Globalization" + 3B];
        D.22201 = *D.22200;
        D.22202 = (int) D.22201;
        D.22203 = __s2 + 3;
        D.22204 = *D.22203;
        D.22205 = (int) D.22204;
        __result = D.22202 - D.22205;
        <D.22199>:
        <D.22197>:
        <D.22189>:
        <D.22187>:
        <D.22179>:
        <D.22177>:
      }
      D.19590 = __result;
    }
    iftmp.69 = -D.19590;
    goto <D.22206>;
    <D.22168>:
    D.22169 = ref->vtable;
    D.22170 = D.22169->klass;
    D.22207 = D.22170->name_space;
    iftmp.69 = __builtin_strcmp (D.22207, "System.Globalization");
    <D.22206>:
    D.19591 = iftmp.69;
  }
  if (D.19591 == 0) goto <D.22208>; else goto <D.22209>;
  <D.22208>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22169 = ref->vtable;
      D.22170 = D.22169->klass;
      __s2 = D.22170->name;
      D.22213 = "CultureInfo";
      D.22214 = MEM[(const unsigned char *)D.22213];
      D.22215 = (int) D.22214;
      D.22216 = *__s2;
      D.22217 = (int) D.22216;
      __result = D.22215 - D.22217;
      {
        if (__s2_len != 0) goto <D.22218>; else goto <D.22219>;
        <D.22218>:
        if (__result == 0) goto <D.22220>; else goto <D.22221>;
        <D.22220>:
        D.22222 = &MEM[(void *)"CultureInfo" + 1B];
        D.22223 = *D.22222;
        D.22224 = (int) D.22223;
        D.22225 = __s2 + 1;
        D.22226 = *D.22225;
        D.22227 = (int) D.22226;
        __result = D.22224 - D.22227;
        if (__s2_len > 1) goto <D.22228>; else goto <D.22229>;
        <D.22228>:
        if (__result == 0) goto <D.22230>; else goto <D.22231>;
        <D.22230>:
        D.22232 = &MEM[(void *)"CultureInfo" + 2B];
        D.22233 = *D.22232;
        D.22234 = (int) D.22233;
        D.22235 = __s2 + 2;
        D.22236 = *D.22235;
        D.22237 = (int) D.22236;
        __result = D.22234 - D.22237;
        if (__s2_len > 2) goto <D.22238>; else goto <D.22239>;
        <D.22238>:
        if (__result == 0) goto <D.22240>; else goto <D.22241>;
        <D.22240>:
        D.22242 = &MEM[(void *)"CultureInfo" + 3B];
        D.22243 = *D.22242;
        D.22244 = (int) D.22243;
        D.22245 = __s2 + 3;
        D.22246 = *D.22245;
        D.22247 = (int) D.22246;
        __result = D.22244 - D.22247;
        <D.22241>:
        <D.22239>:
        <D.22231>:
        <D.22229>:
        <D.22221>:
        <D.22219>:
      }
      D.19599 = __result;
    }
    iftmp.70 = -D.19599;
    goto <D.22248>;
    <D.22212>:
    D.22169 = ref->vtable;
    D.22170 = D.22169->klass;
    D.22249 = D.22170->name;
    iftmp.70 = __builtin_strcmp (D.22249, "CultureInfo");
    <D.22248>:
    D.19600 = iftmp.70;
  }
  if (D.19600 == 0) goto <D.22250>; else goto <D.22251>;
  <D.22250>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22147 = o->vtable;
      D.22148 = D.22147->klass;
      __s2 = D.22148->name_space;
      D.22255 = "System";
      D.22256 = MEM[(const unsigned char *)D.22255];
      D.22257 = (int) D.22256;
      D.22258 = *__s2;
      D.22259 = (int) D.22258;
      __result = D.22257 - D.22259;
      {
        if (__s2_len != 0) goto <D.22260>; else goto <D.22261>;
        <D.22260>:
        if (__result == 0) goto <D.22262>; else goto <D.22263>;
        <D.22262>:
        D.22264 = &MEM[(void *)"System" + 1B];
        D.22265 = *D.22264;
        D.22266 = (int) D.22265;
        D.22267 = __s2 + 1;
        D.22268 = *D.22267;
        D.22269 = (int) D.22268;
        __result = D.22266 - D.22269;
        if (__s2_len > 1) goto <D.22270>; else goto <D.22271>;
        <D.22270>:
        if (__result == 0) goto <D.22272>; else goto <D.22273>;
        <D.22272>:
        D.22274 = &MEM[(void *)"System" + 2B];
        D.22275 = *D.22274;
        D.22276 = (int) D.22275;
        D.22277 = __s2 + 2;
        D.22278 = *D.22277;
        D.22279 = (int) D.22278;
        __result = D.22276 - D.22279;
        if (__s2_len > 2) goto <D.22280>; else goto <D.22281>;
        <D.22280>:
        if (__result == 0) goto <D.22282>; else goto <D.22283>;
        <D.22282>:
        D.22284 = &MEM[(void *)"System" + 3B];
        D.22285 = *D.22284;
        D.22286 = (int) D.22285;
        D.22287 = __s2 + 3;
        D.22288 = *D.22287;
        D.22289 = (int) D.22288;
        __result = D.22286 - D.22289;
        <D.22283>:
        <D.22281>:
        <D.22273>:
        <D.22271>:
        <D.22263>:
        <D.22261>:
      }
      D.19608 = __result;
    }
    iftmp.71 = -D.19608;
    goto <D.22290>;
    <D.22254>:
    D.22147 = o->vtable;
    D.22148 = D.22147->klass;
    D.22291 = D.22148->name_space;
    iftmp.71 = __builtin_strcmp (D.22291, "System");
    <D.22290>:
    D.19609 = iftmp.71;
  }
  if (D.19609 == 0) goto <D.22292>; else goto <D.22293>;
  <D.22292>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22147 = o->vtable;
      D.22148 = D.22147->klass;
      __s2 = D.22148->name;
      D.22297 = "Object[]";
      D.22298 = MEM[(const unsigned char *)D.22297];
      D.22299 = (int) D.22298;
      D.22300 = *__s2;
      D.22301 = (int) D.22300;
      __result = D.22299 - D.22301;
      {
        if (__s2_len != 0) goto <D.22302>; else goto <D.22303>;
        <D.22302>:
        if (__result == 0) goto <D.22304>; else goto <D.22305>;
        <D.22304>:
        D.22306 = &MEM[(void *)"Object[]" + 1B];
        D.22307 = *D.22306;
        D.22308 = (int) D.22307;
        D.22309 = __s2 + 1;
        D.22310 = *D.22309;
        D.22311 = (int) D.22310;
        __result = D.22308 - D.22311;
        if (__s2_len > 1) goto <D.22312>; else goto <D.22313>;
        <D.22312>:
        if (__result == 0) goto <D.22314>; else goto <D.22315>;
        <D.22314>:
        D.22316 = &MEM[(void *)"Object[]" + 2B];
        D.22317 = *D.22316;
        D.22318 = (int) D.22317;
        D.22319 = __s2 + 2;
        D.22320 = *D.22319;
        D.22321 = (int) D.22320;
        __result = D.22318 - D.22321;
        if (__s2_len > 2) goto <D.22322>; else goto <D.22323>;
        <D.22322>:
        if (__result == 0) goto <D.22324>; else goto <D.22325>;
        <D.22324>:
        D.22326 = &MEM[(void *)"Object[]" + 3B];
        D.22327 = *D.22326;
        D.22328 = (int) D.22327;
        D.22329 = __s2 + 3;
        D.22330 = *D.22329;
        D.22331 = (int) D.22330;
        __result = D.22328 - D.22331;
        <D.22325>:
        <D.22323>:
        <D.22315>:
        <D.22313>:
        <D.22305>:
        <D.22303>:
      }
      D.19617 = __result;
    }
    iftmp.72 = -D.19617;
    goto <D.22332>;
    <D.22296>:
    D.22147 = o->vtable;
    D.22148 = D.22147->klass;
    D.22333 = D.22148->name;
    iftmp.72 = __builtin_strcmp (D.22333, "Object[]");
    <D.22332>:
    D.19618 = iftmp.72;
  }
  if (D.19618 == 0) goto <D.22334>; else goto <D.22335>;
  <D.22334>:
  D.22154 = 1;
  return D.22154;
  <D.22335>:
  <D.22293>:
  <D.22251>:
  <D.22209>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22169 = ref->vtable;
      D.22170 = D.22169->klass;
      __s2 = D.22170->name_space;
      D.22255 = "System";
      D.22256 = MEM[(const unsigned char *)D.22255];
      D.22257 = (int) D.22256;
      D.22339 = *__s2;
      D.22340 = (int) D.22339;
      __result = D.22257 - D.22340;
      {
        if (__s2_len != 0) goto <D.22341>; else goto <D.22342>;
        <D.22341>:
        if (__result == 0) goto <D.22343>; else goto <D.22344>;
        <D.22343>:
        D.22264 = &MEM[(void *)"System" + 1B];
        D.22265 = *D.22264;
        D.22266 = (int) D.22265;
        D.22345 = __s2 + 1;
        D.22346 = *D.22345;
        D.22347 = (int) D.22346;
        __result = D.22266 - D.22347;
        if (__s2_len > 1) goto <D.22348>; else goto <D.22349>;
        <D.22348>:
        if (__result == 0) goto <D.22350>; else goto <D.22351>;
        <D.22350>:
        D.22274 = &MEM[(void *)"System" + 2B];
        D.22275 = *D.22274;
        D.22276 = (int) D.22275;
        D.22352 = __s2 + 2;
        D.22353 = *D.22352;
        D.22354 = (int) D.22353;
        __result = D.22276 - D.22354;
        if (__s2_len > 2) goto <D.22355>; else goto <D.22356>;
        <D.22355>:
        if (__result == 0) goto <D.22357>; else goto <D.22358>;
        <D.22357>:
        D.22284 = &MEM[(void *)"System" + 3B];
        D.22285 = *D.22284;
        D.22286 = (int) D.22285;
        D.22359 = __s2 + 3;
        D.22360 = *D.22359;
        D.22361 = (int) D.22360;
        __result = D.22286 - D.22361;
        <D.22358>:
        <D.22356>:
        <D.22351>:
        <D.22349>:
        <D.22344>:
        <D.22342>:
      }
      D.19626 = __result;
    }
    iftmp.73 = -D.19626;
    goto <D.22362>;
    <D.22338>:
    D.22169 = ref->vtable;
    D.22170 = D.22169->klass;
    D.22207 = D.22170->name_space;
    iftmp.73 = __builtin_strcmp (D.22207, "System");
    <D.22362>:
    D.19627 = iftmp.73;
  }
  if (D.19627 == 0) goto <D.22363>; else goto <D.22364>;
  <D.22363>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22169 = ref->vtable;
      D.22170 = D.22169->klass;
      __s2 = D.22170->name;
      D.22368 = "Byte[]";
      D.22369 = MEM[(const unsigned char *)D.22368];
      D.22370 = (int) D.22369;
      D.22371 = *__s2;
      D.22372 = (int) D.22371;
      __result = D.22370 - D.22372;
      {
        if (__s2_len != 0) goto <D.22373>; else goto <D.22374>;
        <D.22373>:
        if (__result == 0) goto <D.22375>; else goto <D.22376>;
        <D.22375>:
        D.22377 = &MEM[(void *)"Byte[]" + 1B];
        D.22378 = *D.22377;
        D.22379 = (int) D.22378;
        D.22380 = __s2 + 1;
        D.22381 = *D.22380;
        D.22382 = (int) D.22381;
        __result = D.22379 - D.22382;
        if (__s2_len > 1) goto <D.22383>; else goto <D.22384>;
        <D.22383>:
        if (__result == 0) goto <D.22385>; else goto <D.22386>;
        <D.22385>:
        D.22387 = &MEM[(void *)"Byte[]" + 2B];
        D.22388 = *D.22387;
        D.22389 = (int) D.22388;
        D.22390 = __s2 + 2;
        D.22391 = *D.22390;
        D.22392 = (int) D.22391;
        __result = D.22389 - D.22392;
        if (__s2_len > 2) goto <D.22393>; else goto <D.22394>;
        <D.22393>:
        if (__result == 0) goto <D.22395>; else goto <D.22396>;
        <D.22395>:
        D.22397 = &MEM[(void *)"Byte[]" + 3B];
        D.22398 = *D.22397;
        D.22399 = (int) D.22398;
        D.22400 = __s2 + 3;
        D.22401 = *D.22400;
        D.22402 = (int) D.22401;
        __result = D.22399 - D.22402;
        <D.22396>:
        <D.22394>:
        <D.22386>:
        <D.22384>:
        <D.22376>:
        <D.22374>:
      }
      D.19635 = __result;
    }
    iftmp.74 = -D.19635;
    goto <D.22403>;
    <D.22367>:
    D.22169 = ref->vtable;
    D.22170 = D.22169->klass;
    D.22249 = D.22170->name;
    iftmp.74 = __builtin_strcmp (D.22249, "Byte[]");
    <D.22403>:
    D.19636 = iftmp.74;
  }
  if (D.19636 == 0) goto <D.22404>; else goto <D.22405>;
  <D.22404>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22147 = o->vtable;
      D.22148 = D.22147->klass;
      __s2 = D.22148->name_space;
      D.22409 = "System.IO";
      D.22410 = MEM[(const unsigned char *)D.22409];
      D.22411 = (int) D.22410;
      D.22412 = *__s2;
      D.22413 = (int) D.22412;
      __result = D.22411 - D.22413;
      {
        if (__s2_len != 0) goto <D.22414>; else goto <D.22415>;
        <D.22414>:
        if (__result == 0) goto <D.22416>; else goto <D.22417>;
        <D.22416>:
        D.22418 = &MEM[(void *)"System.IO" + 1B];
        D.22419 = *D.22418;
        D.22420 = (int) D.22419;
        D.22421 = __s2 + 1;
        D.22422 = *D.22421;
        D.22423 = (int) D.22422;
        __result = D.22420 - D.22423;
        if (__s2_len > 1) goto <D.22424>; else goto <D.22425>;
        <D.22424>:
        if (__result == 0) goto <D.22426>; else goto <D.22427>;
        <D.22426>:
        D.22428 = &MEM[(void *)"System.IO" + 2B];
        D.22429 = *D.22428;
        D.22430 = (int) D.22429;
        D.22431 = __s2 + 2;
        D.22432 = *D.22431;
        D.22433 = (int) D.22432;
        __result = D.22430 - D.22433;
        if (__s2_len > 2) goto <D.22434>; else goto <D.22435>;
        <D.22434>:
        if (__result == 0) goto <D.22436>; else goto <D.22437>;
        <D.22436>:
        D.22438 = &MEM[(void *)"System.IO" + 3B];
        D.22439 = *D.22438;
        D.22440 = (int) D.22439;
        D.22441 = __s2 + 3;
        D.22442 = *D.22441;
        D.22443 = (int) D.22442;
        __result = D.22440 - D.22443;
        <D.22437>:
        <D.22435>:
        <D.22427>:
        <D.22425>:
        <D.22417>:
        <D.22415>:
      }
      D.19644 = __result;
    }
    iftmp.75 = -D.19644;
    goto <D.22444>;
    <D.22408>:
    D.22147 = o->vtable;
    D.22148 = D.22147->klass;
    D.22291 = D.22148->name_space;
    iftmp.75 = __builtin_strcmp (D.22291, "System.IO");
    <D.22444>:
    D.19645 = iftmp.75;
  }
  if (D.19645 == 0) goto <D.22445>; else goto <D.22446>;
  <D.22445>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22147 = o->vtable;
      D.22148 = D.22147->klass;
      __s2 = D.22148->name;
      D.22450 = "MemoryStream";
      D.22451 = MEM[(const unsigned char *)D.22450];
      D.22452 = (int) D.22451;
      D.22453 = *__s2;
      D.22454 = (int) D.22453;
      __result = D.22452 - D.22454;
      {
        if (__s2_len != 0) goto <D.22455>; else goto <D.22456>;
        <D.22455>:
        if (__result == 0) goto <D.22457>; else goto <D.22458>;
        <D.22457>:
        D.22459 = &MEM[(void *)"MemoryStream" + 1B];
        D.22460 = *D.22459;
        D.22461 = (int) D.22460;
        D.22462 = __s2 + 1;
        D.22463 = *D.22462;
        D.22464 = (int) D.22463;
        __result = D.22461 - D.22464;
        if (__s2_len > 1) goto <D.22465>; else goto <D.22466>;
        <D.22465>:
        if (__result == 0) goto <D.22467>; else goto <D.22468>;
        <D.22467>:
        D.22469 = &MEM[(void *)"MemoryStream" + 2B];
        D.22470 = *D.22469;
        D.22471 = (int) D.22470;
        D.22472 = __s2 + 2;
        D.22473 = *D.22472;
        D.22474 = (int) D.22473;
        __result = D.22471 - D.22474;
        if (__s2_len > 2) goto <D.22475>; else goto <D.22476>;
        <D.22475>:
        if (__result == 0) goto <D.22477>; else goto <D.22478>;
        <D.22477>:
        D.22479 = &MEM[(void *)"MemoryStream" + 3B];
        D.22480 = *D.22479;
        D.22481 = (int) D.22480;
        D.22482 = __s2 + 3;
        D.22483 = *D.22482;
        D.22484 = (int) D.22483;
        __result = D.22481 - D.22484;
        <D.22478>:
        <D.22476>:
        <D.22468>:
        <D.22466>:
        <D.22458>:
        <D.22456>:
      }
      D.19653 = __result;
    }
    iftmp.76 = -D.19653;
    goto <D.22485>;
    <D.22449>:
    D.22147 = o->vtable;
    D.22148 = D.22147->klass;
    D.22333 = D.22148->name;
    iftmp.76 = __builtin_strcmp (D.22333, "MemoryStream");
    <D.22485>:
    D.19654 = iftmp.76;
  }
  if (D.19654 == 0) goto <D.22486>; else goto <D.22487>;
  <D.22486>:
  D.22154 = 1;
  return D.22154;
  <D.22487>:
  <D.22446>:
  <D.22405>:
  <D.22364>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22169 = ref->vtable;
      D.22170 = D.22169->klass;
      __s2 = D.22170->name_space;
      D.22491 = "System.Runtime.Remoting.Messaging";
      D.22492 = MEM[(const unsigned char *)D.22491];
      D.22493 = (int) D.22492;
      D.22494 = *__s2;
      D.22495 = (int) D.22494;
      __result = D.22493 - D.22495;
      {
        if (__s2_len != 0) goto <D.22496>; else goto <D.22497>;
        <D.22496>:
        if (__result == 0) goto <D.22498>; else goto <D.22499>;
        <D.22498>:
        D.22500 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 1B];
        D.22501 = *D.22500;
        D.22502 = (int) D.22501;
        D.22503 = __s2 + 1;
        D.22504 = *D.22503;
        D.22505 = (int) D.22504;
        __result = D.22502 - D.22505;
        if (__s2_len > 1) goto <D.22506>; else goto <D.22507>;
        <D.22506>:
        if (__result == 0) goto <D.22508>; else goto <D.22509>;
        <D.22508>:
        D.22510 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 2B];
        D.22511 = *D.22510;
        D.22512 = (int) D.22511;
        D.22513 = __s2 + 2;
        D.22514 = *D.22513;
        D.22515 = (int) D.22514;
        __result = D.22512 - D.22515;
        if (__s2_len > 2) goto <D.22516>; else goto <D.22517>;
        <D.22516>:
        if (__result == 0) goto <D.22518>; else goto <D.22519>;
        <D.22518>:
        D.22520 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 3B];
        D.22521 = *D.22520;
        D.22522 = (int) D.22521;
        D.22523 = __s2 + 3;
        D.22524 = *D.22523;
        D.22525 = (int) D.22524;
        __result = D.22522 - D.22525;
        <D.22519>:
        <D.22517>:
        <D.22509>:
        <D.22507>:
        <D.22499>:
        <D.22497>:
      }
      D.19662 = __result;
    }
    iftmp.77 = -D.19662;
    goto <D.22526>;
    <D.22490>:
    D.22169 = ref->vtable;
    D.22170 = D.22169->klass;
    D.22207 = D.22170->name_space;
    iftmp.77 = __builtin_strcmp (D.22207, "System.Runtime.Remoting.Messaging");
    <D.22526>:
    D.19663 = iftmp.77;
  }
  if (D.19663 == 0) goto <D.22527>; else goto <D.22528>;
  <D.22527>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22169 = ref->vtable;
      D.22170 = D.22169->klass;
      __s2 = D.22170->name;
      D.22532 = "AsyncResult";
      D.22533 = MEM[(const unsigned char *)D.22532];
      D.22534 = (int) D.22533;
      D.22535 = *__s2;
      D.22536 = (int) D.22535;
      __result = D.22534 - D.22536;
      {
        if (__s2_len != 0) goto <D.22537>; else goto <D.22538>;
        <D.22537>:
        if (__result == 0) goto <D.22539>; else goto <D.22540>;
        <D.22539>:
        D.22541 = &MEM[(void *)"AsyncResult" + 1B];
        D.22542 = *D.22541;
        D.22543 = (int) D.22542;
        D.22544 = __s2 + 1;
        D.22545 = *D.22544;
        D.22546 = (int) D.22545;
        __result = D.22543 - D.22546;
        if (__s2_len > 1) goto <D.22547>; else goto <D.22548>;
        <D.22547>:
        if (__result == 0) goto <D.22549>; else goto <D.22550>;
        <D.22549>:
        D.22551 = &MEM[(void *)"AsyncResult" + 2B];
        D.22552 = *D.22551;
        D.22553 = (int) D.22552;
        D.22554 = __s2 + 2;
        D.22555 = *D.22554;
        D.22556 = (int) D.22555;
        __result = D.22553 - D.22556;
        if (__s2_len > 2) goto <D.22557>; else goto <D.22558>;
        <D.22557>:
        if (__result == 0) goto <D.22559>; else goto <D.22560>;
        <D.22559>:
        D.22561 = &MEM[(void *)"AsyncResult" + 3B];
        D.22562 = *D.22561;
        D.22563 = (int) D.22562;
        D.22564 = __s2 + 3;
        D.22565 = *D.22564;
        D.22566 = (int) D.22565;
        __result = D.22563 - D.22566;
        <D.22560>:
        <D.22558>:
        <D.22550>:
        <D.22548>:
        <D.22540>:
        <D.22538>:
      }
      D.19671 = __result;
    }
    iftmp.78 = -D.19671;
    goto <D.22567>;
    <D.22531>:
    D.22169 = ref->vtable;
    D.22170 = D.22169->klass;
    D.22249 = D.22170->name;
    iftmp.78 = __builtin_strcmp (D.22249, "AsyncResult");
    <D.22567>:
    D.19672 = iftmp.78;
  }
  if (D.19672 == 0) goto <D.22568>; else goto <D.22569>;
  <D.22568>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22147 = o->vtable;
      D.22148 = D.22147->klass;
      __s2 = D.22148->name_space;
      D.22255 = "System";
      D.22256 = MEM[(const unsigned char *)D.22255];
      D.22257 = (int) D.22256;
      D.22573 = *__s2;
      D.22574 = (int) D.22573;
      __result = D.22257 - D.22574;
      {
        if (__s2_len != 0) goto <D.22575>; else goto <D.22576>;
        <D.22575>:
        if (__result == 0) goto <D.22577>; else goto <D.22578>;
        <D.22577>:
        D.22264 = &MEM[(void *)"System" + 1B];
        D.22265 = *D.22264;
        D.22266 = (int) D.22265;
        D.22579 = __s2 + 1;
        D.22580 = *D.22579;
        D.22581 = (int) D.22580;
        __result = D.22266 - D.22581;
        if (__s2_len > 1) goto <D.22582>; else goto <D.22583>;
        <D.22582>:
        if (__result == 0) goto <D.22584>; else goto <D.22585>;
        <D.22584>:
        D.22274 = &MEM[(void *)"System" + 2B];
        D.22275 = *D.22274;
        D.22276 = (int) D.22275;
        D.22586 = __s2 + 2;
        D.22587 = *D.22586;
        D.22588 = (int) D.22587;
        __result = D.22276 - D.22588;
        if (__s2_len > 2) goto <D.22589>; else goto <D.22590>;
        <D.22589>:
        if (__result == 0) goto <D.22591>; else goto <D.22592>;
        <D.22591>:
        D.22284 = &MEM[(void *)"System" + 3B];
        D.22285 = *D.22284;
        D.22286 = (int) D.22285;
        D.22593 = __s2 + 3;
        D.22594 = *D.22593;
        D.22595 = (int) D.22594;
        __result = D.22286 - D.22595;
        <D.22592>:
        <D.22590>:
        <D.22585>:
        <D.22583>:
        <D.22578>:
        <D.22576>:
      }
      D.19680 = __result;
    }
    iftmp.79 = -D.19680;
    goto <D.22596>;
    <D.22572>:
    D.22147 = o->vtable;
    D.22148 = D.22147->klass;
    D.22291 = D.22148->name_space;
    iftmp.79 = __builtin_strcmp (D.22291, "System");
    <D.22596>:
    D.19681 = iftmp.79;
  }
  if (D.19681 == 0) goto <D.22597>; else goto <D.22598>;
  <D.22597>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22147 = o->vtable;
      D.22148 = D.22147->klass;
      __s2 = D.22148->name;
      D.22297 = "Object[]";
      D.22298 = MEM[(const unsigned char *)D.22297];
      D.22299 = (int) D.22298;
      D.22602 = *__s2;
      D.22603 = (int) D.22602;
      __result = D.22299 - D.22603;
      {
        if (__s2_len != 0) goto <D.22604>; else goto <D.22605>;
        <D.22604>:
        if (__result == 0) goto <D.22606>; else goto <D.22607>;
        <D.22606>:
        D.22306 = &MEM[(void *)"Object[]" + 1B];
        D.22307 = *D.22306;
        D.22308 = (int) D.22307;
        D.22608 = __s2 + 1;
        D.22609 = *D.22608;
        D.22610 = (int) D.22609;
        __result = D.22308 - D.22610;
        if (__s2_len > 1) goto <D.22611>; else goto <D.22612>;
        <D.22611>:
        if (__result == 0) goto <D.22613>; else goto <D.22614>;
        <D.22613>:
        D.22316 = &MEM[(void *)"Object[]" + 2B];
        D.22317 = *D.22316;
        D.22318 = (int) D.22317;
        D.22615 = __s2 + 2;
        D.22616 = *D.22615;
        D.22617 = (int) D.22616;
        __result = D.22318 - D.22617;
        if (__s2_len > 2) goto <D.22618>; else goto <D.22619>;
        <D.22618>:
        if (__result == 0) goto <D.22620>; else goto <D.22621>;
        <D.22620>:
        D.22326 = &MEM[(void *)"Object[]" + 3B];
        D.22327 = *D.22326;
        D.22328 = (int) D.22327;
        D.22622 = __s2 + 3;
        D.22623 = *D.22622;
        D.22624 = (int) D.22623;
        __result = D.22328 - D.22624;
        <D.22621>:
        <D.22619>:
        <D.22614>:
        <D.22612>:
        <D.22607>:
        <D.22605>:
      }
      D.19689 = __result;
    }
    iftmp.80 = -D.19689;
    goto <D.22625>;
    <D.22601>:
    D.22147 = o->vtable;
    D.22148 = D.22147->klass;
    D.22333 = D.22148->name;
    iftmp.80 = __builtin_strcmp (D.22333, "Object[]");
    <D.22625>:
    D.19690 = iftmp.80;
  }
  if (D.19690 == 0) goto <D.22626>; else goto <D.22627>;
  <D.22626>:
  D.22628 = mono_thread_pool_is_queue_array (o);
  if (D.22628 != 0) goto <D.22629>; else goto <D.22630>;
  <D.22629>:
  D.22154 = 1;
  return D.22154;
  <D.22630>:
  <D.22627>:
  <D.22598>:
  <D.22569>:
  <D.22528>:
  D.22154 = 0;
  return D.22154;
}


mono_class_has_parent_fast (struct MonoClass * klass, struct MonoClass * parent)
{
  gboolean D.22632;
  int iftmp.81;
  short unsigned int D.22636;
  short unsigned int D.22637;
  struct MonoClass * * D.22639;
  sizetype D.22640;
  sizetype D.22641;
  sizetype D.22642;
  struct MonoClass * * D.22643;
  struct MonoClass * D.22644;

  D.22636 = klass->idepth;
  D.22637 = parent->idepth;
  if (D.22636 >= D.22637) goto <D.22638>; else goto <D.22634>;
  <D.22638>:
  D.22639 = klass->supertypes;
  D.22637 = parent->idepth;
  D.22640 = (sizetype) D.22637;
  D.22641 = D.22640 + 1073741823;
  D.22642 = D.22641 * 4;
  D.22643 = D.22639 + D.22642;
  D.22644 = *D.22643;
  if (D.22644 == parent) goto <D.22645>; else goto <D.22634>;
  <D.22645>:
  iftmp.81 = 1;
  goto <D.22635>;
  <D.22634>:
  iftmp.81 = 0;
  <D.22635>:
  D.22632 = iftmp.81;
  return D.22632;
}


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

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

    object = current->array;
    if (object != 0B) goto <D.22649>; else goto <D.22647>;
    <D.22649>:
    D.22650 = object->vtable;
    if (D.22650 == 0B) goto <D.22651>; else goto <D.22647>;
    <D.22651>:
    {
      struct EphemeronLinkNode * tmp;

      tmp = current;
      if (prev != 0B) goto <D.22652>; else goto <D.22653>;
      <D.22652>:
      ephemeron_list.82 = current->next;
      prev->next = ephemeron_list.82;
      goto <D.22655>;
      <D.22653>:
      ephemeron_list.82 = current->next;
      ephemeron_list = ephemeron_list.82;
      <D.22655>:
      current = current->next;
      sgen_free_internal (tmp, 18);
    }
    goto <D.22648>;
    <D.22647>:
    prev = current;
    current = current->next;
    <D.22648>:
  }
  <D.20762>:
  if (current != 0B) goto <D.20761>; else goto <D.20763>;
  <D.20763>:
}


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

  process_object_for_domain_clearing (obj, domain);
  remove = need_remove_object_for_domain (obj, domain);
  if (remove != 0) goto <D.22656>; else goto <D.22657>;
  <D.22656>:
  D.22658 = MEM[(struct MonoObject *)obj].synchronisation;
  if (D.22658 != 0B) goto <D.22659>; else goto <D.22660>;
  <D.22659>:
  {
    void * * dislink;

    dislink = mono_monitor_get_object_monitor_weak_link (obj);
    if (dislink != 0B) goto <D.22661>; else goto <D.22662>;
    <D.22661>:
    sgen_register_disappearing_link (0B, dislink, 0, 1);
    <D.22662>:
  }
  <D.22660>:
  <D.22657>:
  D.22663 = remove;
  return D.22663;
}


process_object_for_domain_clearing (char * start, struct MonoDomain * domain)
{
  unsigned int D.22665;
  unsigned int D.22666;
  struct MonoClass * D.22667;
  struct MonoClass * D.22668;
  struct MonoVTable * D.22671;
  struct MonoDomain * D.22672;
  struct MonoDomain * D.22673;
  _Bool D.22674;
  long int D.22675;
  long int D.22676;
  struct MonoClass * D.22679;
  int D.22680;
  unsigned int D.22687;
  unsigned int D.22688;
  struct MonoVTable * D.22690;
  struct MonoDomain * D.22691;
  struct FILE * gc_debug_file.83;
  struct GCVTable * vt;

  D.22665 = MEM[(mword *)start];
  D.22666 = D.22665 & 4294967292;
  vt = (struct GCVTable *) D.22666;
  D.22667 = vt->klass;
  D.22668 = mono_defaults.internal_thread_class;
  if (D.22667 == D.22668) goto <D.22669>; else goto <D.22670>;
  <D.22669>:
  D.22671 = MEM[(struct MonoObject *)start].vtable;
  D.22672 = D.22671->domain;
  D.22673 = mono_get_root_domain ();
  D.22674 = D.22672 != D.22673;
  D.22675 = (long int) D.22674;
  D.22676 = __builtin_expect (D.22675, 0);
  if (D.22676 != 0) goto <D.22677>; else goto <D.22678>;
  <D.22677>:
  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.22678>:
  <D.22670>:
  D.22667 = vt->klass;
  D.22679 = mono_defaults.real_proxy_class;
  D.22680 = mono_class_has_parent_fast (D.22667, D.22679);
  if (D.22680 != 0) goto <D.22681>; else goto <D.22682>;
  <D.22681>:
  {
    struct MonoObject * server;

    server = MEM[(struct MonoRealProxy *)start].unwrapped_server;
    if (server != 0B) goto <D.22685>; else goto <D.22686>;
    <D.22685>:
    D.22687 = MEM[(mword *)server];
    D.22688 = D.22687 & 4294967292;
    if (D.22688 == 0) goto <D.22683>; else goto <D.22689>;
    <D.22689>:
    D.22690 = server->vtable;
    D.22691 = D.22690->domain;
    if (D.22691 == domain) goto <D.22683>; else goto <D.22684>;
    <D.22683>:
    if (0 != 0) goto <D.22692>; else goto <D.22693>;
    <D.22692>:
    gc_debug_file.83 = gc_debug_file;
    fprintf (gc_debug_file.83, "Cleaning up remote pointer in %p to object %p\n", start, server);
    gc_debug_file.83 = gc_debug_file;
    fflush (gc_debug_file.83);
    <D.22693>:
    MEM[(struct MonoRealProxy *)start].unwrapped_server = 0B;
    <D.22684>:
    <D.22686>:
  }
  <D.22682>:
}


need_remove_object_for_domain (char * start, struct MonoDomain * domain)
{
  struct MonoVTable * D.22695;
  struct MonoDomain * D.22696;
  struct FILE * gc_debug_file.84;
  gboolean D.22702;

  D.22695 = MEM[(struct MonoObject *)start].vtable;
  D.22696 = D.22695->domain;
  if (D.22696 == domain) goto <D.22697>; else goto <D.22698>;
  <D.22697>:
  if (0 != 0) goto <D.22699>; else goto <D.22700>;
  <D.22699>:
  gc_debug_file.84 = gc_debug_file;
  fprintf (gc_debug_file.84, "Need to cleanup object %p\n", start);
  gc_debug_file.84 = gc_debug_file;
  fflush (gc_debug_file.84);
  <D.22700>:
  D.22702 = 1;
  return D.22702;
  <D.22698>:
  D.22702 = 0;
  return D.22702;
}


sgen_add_to_global_remset (void * ptr, void * obj)
{
  int D.22704;
  _Bool D.22705;
  long int D.22706;
  long int D.22707;
  int D.22710;
  int current_collection_generation.85;
  _Bool D.22714;
  long int D.22715;
  long int D.22716;
  int D.22722;
  _Bool D.22723;
  long int D.22724;
  long int D.22725;
  unsigned int D.22728;
  unsigned int D.22729;
  int iftmp.86;
  int D.22735;
  int D.22737;
  _Bool D.22739;
  long int D.22740;
  long int D.22741;
  int D.22745;
  void (*<T1113>) (void *) D.22748;
  int do_pin_stats.87;
  _Bool D.22750;
  long int D.22751;
  long int D.22752;
  struct FILE * gc_debug_file.88;

  D.22704 = sgen_ptr_in_nursery (obj);
  D.22705 = D.22704 == 0;
  D.22706 = (long int) D.22705;
  D.22707 = __builtin_expect (D.22706, 0);
  if (D.22707 != 0) goto <D.22708>; else goto <D.22709>;
  <D.22708>:
  monoeg_g_log (0B, 4, "Target pointer of global remset must be in the nursery");
  <D.20102>:
  goto <D.20102>;
  <D.22709>:
  D.22710 = major_collector.is_concurrent;
  if (D.22710 == 0) goto <D.22711>; else goto <D.22712>;
  <D.22711>:
  current_collection_generation.85 = current_collection_generation;
  D.22714 = current_collection_generation.85 == -1;
  D.22715 = (long int) D.22714;
  D.22716 = __builtin_expect (D.22715, 0);
  if (D.22716 != 0) goto <D.22717>; else goto <D.22718>;
  <D.22717>:
  monoeg_g_log (0B, 4, "Global remsets can only be added during collections");
  <D.20103>:
  goto <D.20103>;
  <D.22718>:
  goto <D.22719>;
  <D.22712>:
  current_collection_generation.85 = current_collection_generation;
  if (current_collection_generation.85 == -1) goto <D.22720>; else goto <D.22721>;
  <D.22720>:
  D.22722 = sgen_concurrent_collection_in_progress ();
  D.22723 = D.22722 == 0;
  D.22724 = (long int) D.22723;
  D.22725 = __builtin_expect (D.22724, 0);
  if (D.22725 != 0) goto <D.22726>; else goto <D.22727>;
  <D.22726>:
  monoeg_g_log (0B, 4, "Global remsets outside of collection pauses can only be added by the concurrent collector");
  <D.20104>:
  goto <D.20104>;
  <D.22727>:
  <D.22721>:
  <D.22719>:
  D.22728 = MEM[(mword *)obj];
  D.22729 = D.22728 & 2;
  if (D.22729 == 0) goto <D.22730>; else goto <D.22731>;
  <D.22730>:
  D.22735 = sgen_minor_collector.is_split;
  if (D.22735 == 0) goto <D.22736>; else goto <D.22733>;
  <D.22736>:
  D.22737 = sgen_concurrent_collection_in_progress ();
  if (D.22737 == 0) goto <D.22738>; else goto <D.22733>;
  <D.22738>:
  iftmp.86 = 1;
  goto <D.22734>;
  <D.22733>:
  iftmp.86 = 0;
  <D.22734>:
  D.22739 = iftmp.86 != 0;
  D.22740 = (long int) D.22739;
  D.22741 = __builtin_expect (D.22740, 0);
  if (D.22741 != 0) goto <D.22742>; else goto <D.22743>;
  <D.22742>:
  monoeg_g_log (0B, 4, "Non-pinned objects can only remain in nursery if it is a split nursery");
  <D.20105>:
  goto <D.20105>;
  <D.22743>:
  goto <D.22744>;
  <D.22731>:
  D.22745 = sgen_cement_lookup_or_register (obj);
  if (D.22745 != 0) goto <D.22746>; else goto <D.22747>;
  <D.22746>:
  return;
  <D.22747>:
  <D.22744>:
  D.22748 = remset.record_pointer;
  D.22748 (ptr);
  do_pin_stats.87 = do_pin_stats;
  D.22750 = do_pin_stats.87 != 0;
  D.22751 = (long int) D.22750;
  D.22752 = __builtin_expect (D.22751, 0);
  if (D.22752 != 0) goto <D.22753>; else goto <D.22754>;
  <D.22753>:
  sgen_pin_stats_register_global_remset (obj);
  <D.22754>:
  if (0 != 0) goto <D.22755>; else goto <D.22756>;
  <D.22755>:
  gc_debug_file.88 = gc_debug_file;
  fprintf (gc_debug_file.88, "Adding global remset for %p\n", ptr);
  gc_debug_file.88 = gc_debug_file;
  fflush (gc_debug_file.88);
  <D.22756>:
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.22759;
  int sgen_nursery_bits.89;
  int D.22761;
  int D.22762;
  unsigned int D.22763;
  unsigned int p.90;
  unsigned int D.22765;
  char * sgen_nursery_start.91;
  unsigned int sgen_nursery_start.92;
  _Bool D.22768;

  sgen_nursery_bits.89 = sgen_nursery_bits;
  D.22761 = 1 << sgen_nursery_bits.89;
  D.22762 = -D.22761;
  D.22763 = (unsigned int) D.22762;
  p.90 = (unsigned int) p;
  D.22765 = D.22763 & p.90;
  sgen_nursery_start.91 = sgen_nursery_start;
  sgen_nursery_start.92 = (unsigned int) sgen_nursery_start.91;
  D.22768 = D.22765 == sgen_nursery_start.92;
  D.22759 = (gboolean) D.22768;
  return D.22759;
}


sgen_drain_gray_stack (int max_objs, struct ScanCopyContext ctx)
{
  struct GrayQueueSection * D.22772;
  int D.22776;
  _Bool D.22777;
  long int D.22778;
  long int D.22779;
  int D.22783;
  gboolean D.22786;
  struct FILE * gc_debug_file.93;
  const char * D.22790;
  const char * D.22801;
  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.22770>; else goto <D.22771>;
  <D.22770>:
  <D.20113>:
  D.22772 = queue->first;
  if (D.22772 == 0B) goto <D.22773>; else goto <D.22774>;
  <D.22773>:
  obj = 0B;
  goto <D.22775>;
  <D.22774>:
  D.22772 = queue->first;
  D.22776 = D.22772->end;
  D.22777 = D.22776 == 1;
  D.22778 = (long int) D.22777;
  D.22779 = __builtin_expect (D.22778, 0);
  if (D.22779 != 0) goto <D.22780>; else goto <D.22781>;
  <D.22780>:
  obj = sgen_gray_object_dequeue (queue);
  goto <D.22782>;
  <D.22781>:
  D.22772 = queue->first;
  D.22772 = queue->first;
  D.22776 = D.22772->end;
  D.22783 = D.22776 + -1;
  D.22772->end = D.22783;
  D.22776 = D.22772->end;
  obj = D.22772->objects[D.22776];
  <D.22782>:
  <D.22775>:
  if (obj == 0B) goto <D.22784>; else goto <D.22785>;
  <D.22784>:
  D.22786 = 1;
  return D.22786;
  <D.22785>:
  if (0 != 0) goto <D.22787>; else goto <D.22788>;
  <D.22787>:
  gc_debug_file.93 = gc_debug_file;
  D.22790 = safe_name (obj);
  fprintf (gc_debug_file.93, "Precise gray object scan %p (%s)\n", obj, D.22790);
  gc_debug_file.93 = gc_debug_file;
  fflush (gc_debug_file.93);
  <D.22788>:
  scan_func (obj, queue);
  goto <D.20113>;
  <D.22771>:
  {
    int i;

    <D.20118>:
    i = 0;
    goto <D.20116>;
    <D.20115>:
    D.22772 = queue->first;
    if (D.22772 == 0B) goto <D.22791>; else goto <D.22792>;
    <D.22791>:
    obj = 0B;
    goto <D.22793>;
    <D.22792>:
    D.22772 = queue->first;
    D.22776 = D.22772->end;
    D.22777 = D.22776 == 1;
    D.22778 = (long int) D.22777;
    D.22779 = __builtin_expect (D.22778, 0);
    if (D.22779 != 0) goto <D.22794>; else goto <D.22795>;
    <D.22794>:
    obj = sgen_gray_object_dequeue (queue);
    goto <D.22796>;
    <D.22795>:
    D.22772 = queue->first;
    D.22772 = queue->first;
    D.22776 = D.22772->end;
    D.22783 = D.22776 + -1;
    D.22772->end = D.22783;
    D.22776 = D.22772->end;
    obj = D.22772->objects[D.22776];
    <D.22796>:
    <D.22793>:
    if (obj == 0B) goto <D.22797>; else goto <D.22798>;
    <D.22797>:
    D.22786 = 1;
    return D.22786;
    <D.22798>:
    if (0 != 0) goto <D.22799>; else goto <D.22800>;
    <D.22799>:
    gc_debug_file.93 = gc_debug_file;
    D.22801 = safe_name (obj);
    fprintf (gc_debug_file.93, "Precise gray object scan %p (%s)\n", obj, D.22801);
    gc_debug_file.93 = gc_debug_file;
    fflush (gc_debug_file.93);
    <D.22800>:
    scan_func (obj, queue);
    i = i + 1;
    <D.20116>:
    if (i != max_objs) goto <D.20115>; else goto <D.20117>;
    <D.20117>:
    if (max_objs < 0) goto <D.20118>; else goto <D.20119>;
    <D.20119>:
    D.22786 = 0;
    return D.22786;
  }
}


sgen_pin_objects_in_section (struct GCMemSection * section, struct ScanCopyContext ctx)
{
  unsigned int num_entries.94;
  unsigned int D.22806;
  void * * D.22807;
  char * D.22808;
  char * D.22809;
  int num_entries;

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

    start = section->pin_queue_start;
    num_entries.94 = (unsigned int) num_entries;
    D.22806 = num_entries.94 * 4;
    D.22807 = start + D.22806;
    D.22808 = section->data;
    D.22809 = section->next_data;
    reduced_to = pin_objects_from_addresses (section, start, D.22807, D.22808, D.22809, ctx);
    section->pin_queue_num_entries = reduced_to;
    if (reduced_to == 0) goto <D.22810>; else goto <D.22811>;
    <D.22810>:
    section->pin_queue_start = 0B;
    <D.22811>:
  }
  <D.22804>:
}


pin_objects_from_addresses (struct GCMemSection * section, void * * start, void * * end, void * start_nursery, void * end_nursery, struct ScanCopyContext ctx)
{
  struct FILE * gc_debug_file.95;
  char * D.22823;
  int addr.96;
  char * D.22827;
  int D.22828;
  int D.22829;
  unsigned int idx.97;
  unsigned int D.22831;
  _Bool D.22832;
  long int D.22833;
  long int D.22834;
  char * * D.22837;
  unsigned int D.22838;
  char * * D.22839;
  void * D.22851;
  unsigned int search_start.98;
  unsigned int D.22855;
  unsigned int D.22856;
  unsigned int D.22857;
  unsigned int D.22858;
  struct MonoThreadsSync * D.22859;
  const char * D.22865;
  const char * D.22875;
  unsigned int D.22876;
  unsigned int D.22877;
  int iftmp.99;
  struct GrayQueueSection * D.22882;
  int D.22884;
  _Bool D.22885;
  long int D.22886;
  long int D.22887;
  int D.22891;
  int D.22892;
  int do_pin_stats.100;
  _Bool D.22894;
  long int D.22895;
  long int D.22896;
  unsigned int count.101;
  unsigned int D.22900;
  void * * D.22901;
  <unnamed type> D.22902;
  unsigned int D.22903;
  void * * D.22906;
  void * D.22907;
  long long int D.22908;
  long long int stat_pinned_objects.102;
  long long int stat_pinned_objects.103;
  int D.22911;
  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.20138>;
  <D.20145>:
  addr = *start;
  if (addr != last) goto <D.22812>; else goto <D.22813>;
  <D.22812>:
  if (addr >= start_nursery) goto <D.22814>; else goto <D.22815>;
  <D.22814>:
  if (addr < end_nursery) goto <D.22816>; else goto <D.22817>;
  <D.22816>:
  if (0 != 0) goto <D.22818>; else goto <D.22819>;
  <D.22818>:
  gc_debug_file.95 = gc_debug_file;
  fprintf (gc_debug_file.95, "Considering pinning addr %p\n", addr);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.22819>:
  if (addr >= last_obj) goto <D.22821>; else goto <D.22822>;
  <D.22821>:
  D.22823 = last_obj + last_obj_size;
  if (D.22823 > addr) goto <D.22824>; else goto <D.22825>;
  <D.22824>:
  start = start + 4;
  // predicted unlikely by continue predictor.
  goto <D.20138>;
  <D.22825>:
  <D.22822>:
  addr.96 = (int) addr;
  D.22827 = section->data;
  D.22828 = (int) D.22827;
  D.22829 = addr.96 - D.22828;
  idx = D.22829 / 8192;
  idx.97 = (unsigned int) idx;
  D.22831 = section->num_scan_start;
  D.22832 = idx.97 >= D.22831;
  D.22833 = (long int) D.22832;
  D.22834 = __builtin_expect (D.22833, 0);
  if (D.22834 != 0) goto <D.22835>; else goto <D.22836>;
  <D.22835>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1246, "idx < section->num_scan_start");
  <D.22836>:
  D.22837 = section->scan_starts;
  idx.97 = (unsigned int) idx;
  D.22838 = idx.97 * 4;
  D.22839 = D.22837 + D.22838;
  search_start = *D.22839;
  if (search_start == 0B) goto <D.22840>; else goto <D.22842>;
  <D.22842>:
  if (search_start > addr) goto <D.22840>; else goto <D.22841>;
  <D.22840>:
  goto <D.20141>;
  <D.20140>:
  idx = idx + -1;
  D.22837 = section->scan_starts;
  idx.97 = (unsigned int) idx;
  D.22838 = idx.97 * 4;
  D.22839 = D.22837 + D.22838;
  search_start = *D.22839;
  if (search_start != 0B) goto <D.22843>; else goto <D.22844>;
  <D.22843>:
  if (search_start <= addr) goto <D.20139>; else goto <D.22845>;
  <D.22845>:
  <D.22844>:
  <D.20141>:
  if (idx != 0) goto <D.20140>; else goto <D.20139>;
  <D.20139>:
  if (search_start == 0B) goto <D.22846>; else goto <D.22848>;
  <D.22848>:
  if (search_start > addr) goto <D.22846>; else goto <D.22847>;
  <D.22846>:
  search_start = start_nursery;
  <D.22847>:
  <D.22841>:
  if (search_start < last_obj) goto <D.22849>; else goto <D.22850>;
  <D.22849>:
  search_start = last_obj + last_obj_size;
  <D.22850>:
  <D.20144>:
  D.22851 = MEM[(void * *)search_start];
  if (D.22851 == 0B) goto <D.22852>; else goto <D.22853>;
  <D.22852>:
  search_start.98 = (unsigned int) search_start;
  D.22855 = search_start.98 + 11;
  D.22856 = D.22855 & 4294967288;
  search_start = (void *) D.22856;
  // predicted unlikely by continue predictor.
  goto <D.20142>;
  <D.22853>:
  last_obj = search_start;
  D.22857 = sgen_safe_object_get_size (search_start);
  D.22858 = D.22857 + 7;
  last_obj_size = D.22858 & 4294967288;
  D.22859 = MEM[(struct MonoObject *)last_obj].synchronisation;
  if (D.22859 == 4294967295B) goto <D.22860>; else goto <D.22861>;
  <D.22860>:
  goto <D.22862>;
  <D.22861>:
  if (0 != 0) goto <D.22863>; else goto <D.22864>;
  <D.22863>:
  gc_debug_file.95 = gc_debug_file;
  D.22865 = safe_name (last_obj);
  fprintf (gc_debug_file.95, "Pinned try match %p (%s), size %zd\n", last_obj, D.22865, last_obj_size);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.22864>:
  if (addr >= search_start) goto <D.22866>; else goto <D.22867>;
  <D.22866>:
  D.22823 = last_obj + last_obj_size;
  if (D.22823 > addr) goto <D.22868>; else goto <D.22869>;
  <D.22868>:
  if (scan_func != 0B) goto <D.22870>; else goto <D.22871>;
  <D.22870>:
  scan_func (search_start, queue);
  goto <D.22872>;
  <D.22871>:
  if (0 != 0) goto <D.22873>; else goto <D.22874>;
  <D.22873>:
  gc_debug_file.95 = gc_debug_file;
  D.22851 = MEM[(void * *)search_start];
  D.22875 = safe_name (search_start);
  fprintf (gc_debug_file.95, "Pinned object %p, vtable %p (%s), count %d\n\n", search_start, D.22851, D.22875, count);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.22874>:
  D.22876 = MEM[(mword *)search_start];
  D.22877 = D.22876 | 2;
  MEM[(mword *)search_start] = D.22877;
  D.22882 = queue->first;
  if (D.22882 == 0B) goto <D.22879>; else goto <D.22883>;
  <D.22883>:
  D.22882 = queue->first;
  D.22884 = D.22882->end;
  if (D.22884 == 125) goto <D.22879>; else goto <D.22880>;
  <D.22879>:
  iftmp.99 = 1;
  goto <D.22881>;
  <D.22880>:
  iftmp.99 = 0;
  <D.22881>:
  D.22885 = iftmp.99 != 0;
  D.22886 = (long int) D.22885;
  D.22887 = __builtin_expect (D.22886, 0);
  if (D.22887 != 0) goto <D.22888>; else goto <D.22889>;
  <D.22888>:
  sgen_gray_object_enqueue (queue, search_start);
  goto <D.22890>;
  <D.22889>:
  D.22882 = queue->first;
  D.22882 = queue->first;
  D.22884 = D.22882->end;
  D.22891 = D.22884;
  D.22892 = D.22891 + 1;
  D.22882->end = D.22892;
  D.22882->objects[D.22891] = search_start;
  <D.22890>:
  __builtin_prefetch (search_start);
  do_pin_stats.100 = do_pin_stats;
  D.22894 = do_pin_stats.100 != 0;
  D.22895 = (long int) D.22894;
  D.22896 = __builtin_expect (D.22895, 0);
  if (D.22896 != 0) goto <D.22897>; else goto <D.22898>;
  <D.22897>:
  sgen_pin_stats_register_object (search_start, last_obj_size);
  <D.22898>:
  count.101 = (unsigned int) count;
  D.22900 = count.101 * 4;
  D.22901 = definitely_pinned + D.22900;
  *D.22901 = search_start;
  count = count + 1;
  <D.22872>:
  goto <D.20143>;
  <D.22869>:
  <D.22867>:
  <D.22862>:
  search_start = search_start + last_obj_size;
  <D.20142>:
  if (search_start <= addr) goto <D.20144>; else goto <D.20143>;
  <D.20143>:
  last = addr;
  <D.22817>:
  <D.22815>:
  <D.22813>:
  start = start + 4;
  <D.20138>:
  if (start < end) goto <D.20145>; else goto <D.20146>;
  <D.20146>:
  D.22902 = mono_profiler_get_events ();
  D.22903 = D.22902 & 1048576;
  if (D.22903 != 0) goto <D.22904>; else goto <D.22905>;
  <D.22904>:
  {
    struct GCRootReport report;

    try
      {
        report.count = 0;
        idx = 0;
        goto <D.20149>;
        <D.20148>:
        idx.97 = (unsigned int) idx;
        D.22838 = idx.97 * 4;
        D.22906 = definitely_pinned + D.22838;
        D.22907 = *D.22906;
        add_profile_gc_root (&report, D.22907, 260, 0);
        idx = idx + 1;
        <D.20149>:
        if (idx < count) goto <D.20148>; else goto <D.20150>;
        <D.20150>:
        notify_gc_roots (&report);
      }
    finally
      {
        report = {CLOBBER};
      }
  }
  <D.22905>:
  D.22908 = (long long int) count;
  stat_pinned_objects.102 = stat_pinned_objects;
  stat_pinned_objects.103 = D.22908 + stat_pinned_objects.102;
  stat_pinned_objects = stat_pinned_objects.103;
  D.22911 = count;
  return D.22911;
}


add_profile_gc_root (struct GCRootReport * report, void * object, int rtype, uintptr_t extra_info)
{
  int D.22913;
  int D.22916;
  int D.22917;
  unsigned int D.22918;
  unsigned int D.22919;
  struct MonoVTable * D.22920;
  struct MonoClass * D.22921;
  unsigned int D.22922;

  D.22913 = report->count;
  if (D.22913 == 32) goto <D.22914>; else goto <D.22915>;
  <D.22914>:
  notify_gc_roots (report);
  <D.22915>:
  D.22913 = report->count;
  report->objects[D.22913] = object;
  D.22913 = report->count;
  report->root_types[D.22913] = rtype;
  D.22913 = report->count;
  D.22916 = D.22913;
  D.22917 = D.22916 + 1;
  report->count = D.22917;
  D.22918 = MEM[(mword *)object];
  D.22919 = D.22918 & 4294967292;
  D.22920 = (struct MonoVTable *) D.22919;
  D.22921 = D.22920->klass;
  D.22922 = (unsigned int) D.22921;
  report->extra_info[D.22916] = D.22922;
}


notify_gc_roots (struct GCRootReport * report)
{
  int D.22923;
  void *[32] * D.22926;
  int[32] * D.22927;
  uintptr_t[32] * D.22928;

  D.22923 = report->count;
  if (D.22923 == 0) goto <D.22924>; else goto <D.22925>;
  <D.22924>:
  return;
  <D.22925>:
  D.22923 = report->count;
  D.22926 = &report->objects;
  D.22927 = &report->root_types;
  D.22928 = &report->extra_info;
  mono_profiler_gc_roots (D.22923, D.22926, D.22927, D.22928);
  report->count = 0;
}


sgen_pin_object (void * object, struct GrayQueue * queue)
{
  int concurrent_collection_in_progress.104;
  _Bool D.22931;
  long int D.22932;
  long int D.22933;
  int D.22936;
  unsigned int objects_pinned.105;
  unsigned int objects_pinned.106;
  unsigned int D.22942;
  unsigned int D.22943;
  int do_pin_stats.107;
  _Bool D.22945;
  long int D.22946;
  long int D.22947;
  unsigned int D.22950;
  int iftmp.108;
  struct GrayQueueSection * D.22955;
  int D.22957;
  _Bool D.22958;
  long int D.22959;
  long int D.22960;
  int D.22964;
  int D.22965;

  concurrent_collection_in_progress.104 = concurrent_collection_in_progress;
  D.22931 = concurrent_collection_in_progress.104 != 0;
  D.22932 = (long int) D.22931;
  D.22933 = __builtin_expect (D.22932, 0);
  if (D.22933 != 0) goto <D.22934>; else goto <D.22935>;
  <D.22934>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1355, "!concurrent_collection_in_progress");
  <D.22935>:
  D.22936 = sgen_collection_is_parallel ();
  if (D.22936 != 0) goto <D.22937>; else goto <D.22938>;
  <D.22937>:
  pthread_mutex_lock (&pin_queue_mutex);
  sgen_pin_stage_ptr (object);
  objects_pinned.105 = objects_pinned;
  objects_pinned.106 = objects_pinned.105 + 1;
  objects_pinned = objects_pinned.106;
  pthread_mutex_unlock (&pin_queue_mutex);
  goto <D.22941>;
  <D.22938>:
  D.22942 = MEM[(mword *)object];
  D.22943 = D.22942 | 2;
  MEM[(mword *)object] = D.22943;
  sgen_pin_stage_ptr (object);
  objects_pinned.105 = objects_pinned;
  objects_pinned.106 = objects_pinned.105 + 1;
  objects_pinned = objects_pinned.106;
  do_pin_stats.107 = do_pin_stats;
  D.22945 = do_pin_stats.107 != 0;
  D.22946 = (long int) D.22945;
  D.22947 = __builtin_expect (D.22946, 0);
  if (D.22947 != 0) goto <D.22948>; else goto <D.22949>;
  <D.22948>:
  D.22950 = sgen_safe_object_get_size (object);
  sgen_pin_stats_register_object (object, D.22950);
  <D.22949>:
  <D.22941>:
  D.22955 = queue->first;
  if (D.22955 == 0B) goto <D.22952>; else goto <D.22956>;
  <D.22956>:
  D.22955 = queue->first;
  D.22957 = D.22955->end;
  if (D.22957 == 125) goto <D.22952>; else goto <D.22953>;
  <D.22952>:
  iftmp.108 = 1;
  goto <D.22954>;
  <D.22953>:
  iftmp.108 = 0;
  <D.22954>:
  D.22958 = iftmp.108 != 0;
  D.22959 = (long int) D.22958;
  D.22960 = __builtin_expect (D.22959, 0);
  if (D.22960 != 0) goto <D.22961>; else goto <D.22962>;
  <D.22961>:
  sgen_gray_object_enqueue (queue, object);
  goto <D.22963>;
  <D.22962>:
  D.22955 = queue->first;
  D.22955 = queue->first;
  D.22957 = D.22955->end;
  D.22964 = D.22957;
  D.22965 = D.22964 + 1;
  D.22955->end = D.22965;
  D.22955->objects[D.22964] = object;
  <D.22963>:
  __builtin_prefetch (object);
}


sgen_parallel_pin_or_update (void * * ptr, void * obj, struct MonoVTable * vt, struct SgenGrayQueue * queue)
{
  int D.22966;
  unsigned int vt.109;
  unsigned int D.22970;
  void * D.22971;
  void * D.22972;
  void (*<T2b52>) (char *, struct SgenGrayQueue *) D.22976;
  unsigned int D.22977;
  unsigned int D.22980;
  void * D.22981;
  unsigned int D.22982;

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

    major_pinned = 0;
    D.22966 = sgen_ptr_in_nursery (obj);
    if (D.22966 != 0) goto <D.22967>; else goto <D.22968>;
    <D.22967>:
    vt.109 = (unsigned int) vt;
    D.22970 = vt.109 | 2;
    D.22971 = (void *) D.22970;
    D.22972 = InterlockedCompareExchangePointer (obj, D.22971, vt);
    if (D.22972 == vt) goto <D.22973>; else goto <D.22974>;
    <D.22973>:
    sgen_pin_object (obj, queue);
    goto <D.20170>;
    <D.22974>:
    goto <D.22975>;
    <D.22968>:
    D.22976 = major_collector.pin_major_object;
    D.22976 (obj, queue);
    major_pinned = 1;
    <D.22975>:
    vtable_word = MEM[(mword *)obj];
    D.22977 = vtable_word & 1;
    if (D.22977 != 0) goto <D.22978>; else goto <D.22979>;
    <D.22978>:
    D.22980 = vtable_word & 4294967292;
    D.22981 = (void *) D.22980;
    *ptr = D.22981;
    goto <D.20170>;
    <D.22979>:
    D.22982 = vtable_word & 2;
    if (D.22982 != 0) goto <D.20170>; else goto <D.22983>;
    <D.22983>:
    if (major_pinned != 0) goto <D.20170>; else goto <D.22984>;
    <D.22984>:
  }
  goto <D.20171>;
  <D.20170>:
}


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

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


sgen_sort_addresses (void * * array, int size)
{
  int D.22990;
  unsigned int parent.112;
  unsigned int D.22992;
  void * * D.22993;
  void * D.22994;
  unsigned int child.113;
  unsigned int D.22996;
  void * * D.22997;
  void * D.22998;
  unsigned int i.114;
  unsigned int D.23001;
  void * * D.23002;
  void * D.23003;
  int D.23004;
  unsigned int child.115;
  unsigned int D.23008;
  void * * D.23009;
  void * D.23010;
  sizetype child.116;
  sizetype D.23012;
  sizetype D.23013;
  void * * D.23014;
  void * D.23015;
  unsigned int root.117;
  unsigned int D.23019;
  void * * D.23020;
  void * D.23021;
  int i;
  void * tmp;

  i = 1;
  goto <D.20184>;
  <D.20183>:
  {
    int child;

    child = i;
    goto <D.20182>;
    <D.20181>:
    {
      int parent;

      D.22990 = child + -1;
      parent = D.22990 / 2;
      parent.112 = (unsigned int) parent;
      D.22992 = parent.112 * 4;
      D.22993 = array + D.22992;
      D.22994 = *D.22993;
      child.113 = (unsigned int) child;
      D.22996 = child.113 * 4;
      D.22997 = array + D.22996;
      D.22998 = *D.22997;
      if (D.22994 >= D.22998) goto <D.20180>; else goto <D.22999>;
      <D.22999>:
      parent.112 = (unsigned int) parent;
      D.22992 = parent.112 * 4;
      D.22993 = array + D.22992;
      tmp = *D.22993;
      parent.112 = (unsigned int) parent;
      D.22992 = parent.112 * 4;
      D.22993 = array + D.22992;
      child.113 = (unsigned int) child;
      D.22996 = child.113 * 4;
      D.22997 = array + D.22996;
      D.22998 = *D.22997;
      *D.22993 = D.22998;
      child.113 = (unsigned int) child;
      D.22996 = child.113 * 4;
      D.22997 = array + D.22996;
      *D.22997 = tmp;
      child = parent;
    }
    <D.20182>:
    if (child > 0) goto <D.20181>; else goto <D.20180>;
    <D.20180>:
  }
  i = i + 1;
  <D.20184>:
  if (i < size) goto <D.20183>; else goto <D.20185>;
  <D.20185>:
  i = size + -1;
  goto <D.20193>;
  <D.20192>:
  {
    int end;
    int root;

    i.114 = (unsigned int) i;
    D.23001 = i.114 * 4;
    D.23002 = array + D.23001;
    tmp = *D.23002;
    i.114 = (unsigned int) i;
    D.23001 = i.114 * 4;
    D.23002 = array + D.23001;
    D.23003 = *array;
    *D.23002 = D.23003;
    *array = tmp;
    end = i + -1;
    root = 0;
    goto <D.20191>;
    <D.20190>:
    {
      int child;

      D.23004 = root * 2;
      child = D.23004 + 1;
      if (child < end) goto <D.23005>; else goto <D.23006>;
      <D.23005>:
      child.115 = (unsigned int) child;
      D.23008 = child.115 * 4;
      D.23009 = array + D.23008;
      D.23010 = *D.23009;
      child.116 = (sizetype) child;
      D.23012 = child.116 + 1;
      D.23013 = D.23012 * 4;
      D.23014 = array + D.23013;
      D.23015 = *D.23014;
      if (D.23010 < D.23015) goto <D.23016>; else goto <D.23017>;
      <D.23016>:
      child = child + 1;
      <D.23017>:
      <D.23006>:
      root.117 = (unsigned int) root;
      D.23019 = root.117 * 4;
      D.23020 = array + D.23019;
      D.23021 = *D.23020;
      child.115 = (unsigned int) child;
      D.23008 = child.115 * 4;
      D.23009 = array + D.23008;
      D.23010 = *D.23009;
      if (D.23021 >= D.23010) goto <D.20189>; else goto <D.23022>;
      <D.23022>:
      root.117 = (unsigned int) root;
      D.23019 = root.117 * 4;
      D.23020 = array + D.23019;
      tmp = *D.23020;
      root.117 = (unsigned int) root;
      D.23019 = root.117 * 4;
      D.23020 = array + D.23019;
      child.115 = (unsigned int) child;
      D.23008 = child.115 * 4;
      D.23009 = array + D.23008;
      D.23010 = *D.23009;
      *D.23020 = D.23010;
      child.115 = (unsigned int) child;
      D.23008 = child.115 * 4;
      D.23009 = array + D.23008;
      *D.23009 = tmp;
      root = child;
    }
    <D.20191>:
    D.23004 = root * 2;
    if (D.23004 < end) goto <D.20190>; else goto <D.20189>;
    <D.20189>:
  }
  i = i + -1;
  <D.20193>:
  if (i > 0) goto <D.20192>; else goto <D.20194>;
  <D.20194>:
}


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

  <D.20291>:
  old = lowest_heap_address;
  if (low >= old) goto <D.20290>; else goto <D.23023>;
  <D.23023>:
  low.118 = (void *) low;
  old.119 = (void *) old;
  D.23026 = InterlockedCompareExchangePointer (&lowest_heap_address, low.118, old.119);
  old.119 = (void *) old;
  if (D.23026 != old.119) goto <D.20291>; else goto <D.20290>;
  <D.20290>:
  <D.20293>:
  old = highest_heap_address;
  if (high <= old) goto <D.20292>; else goto <D.23027>;
  <D.23027>:
  high.120 = (void *) high;
  old.119 = (void *) old;
  D.23029 = InterlockedCompareExchangePointer (&highest_heap_address, high.120, old.119);
  old.119 = (void *) old;
  if (D.23029 != old.119) goto <D.20293>; else goto <D.20292>;
  <D.20292>:
}


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

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


sgen_get_nursery_start ()
{
  char * D.23035;

  D.23035 = sgen_nursery_start;
  return D.23035;
}


mono_gc_set_current_thread_appdomain (struct MonoDomain * domain)
{
  _Bool D.23039;
  long int D.23040;
  long int D.23041;
  struct SgenThreadInfo * info;

  info = mono_thread_info_current ();
  if (domain != 0B) goto <D.23037>; else goto <D.23038>;
  <D.23037>:
  D.23039 = info == 0B;
  D.23040 = (long int) D.23039;
  D.23041 = __builtin_expect (D.23040, 0);
  if (D.23041 != 0) goto <D.23042>; else goto <D.23043>;
  <D.23042>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1733, "info");
  <D.23043>:
  info->stopped_domain = domain;
  <D.23038>:
}


mono_gc_precise_stack_mark_enabled ()
{
  gboolean D.23044;
  int conservative_stack_mark.124;
  _Bool D.23046;

  conservative_stack_mark.124 = conservative_stack_mark;
  D.23046 = conservative_stack_mark.124 == 0;
  D.23044 = (gboolean) D.23046;
  return D.23044;
}


mono_gc_get_logfile ()
{
  struct FILE * D.23048;

  D.23048 = gc_debug_file;
  return D.23048;
}


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

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


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

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


sgen_get_current_object_ops ()
{
  struct SgenObjectOperations * D.23054;

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


sgen_check_section_scan_starts (struct GCMemSection * section)
{
  char * * D.23056;
  unsigned int i.125;
  unsigned int D.23058;
  char * * D.23059;
  char * D.23060;
  unsigned int D.23063;
  _Bool D.23064;
  long int D.23065;
  long int D.23066;
  unsigned int D.23069;
  int i;

  i = 0;
  goto <D.20427>;
  <D.20426>:
  D.23056 = section->scan_starts;
  i.125 = (unsigned int) i;
  D.23058 = i.125 * 4;
  D.23059 = D.23056 + D.23058;
  D.23060 = *D.23059;
  if (D.23060 != 0B) goto <D.23061>; else goto <D.23062>;
  <D.23061>:
  {
    guint size;

    D.23056 = section->scan_starts;
    i.125 = (unsigned int) i;
    D.23058 = i.125 * 4;
    D.23059 = D.23056 + D.23058;
    D.23060 = *D.23059;
    size = sgen_safe_object_get_size (D.23060);
    D.23063 = size + 4294967288;
    D.23064 = D.23063 > 7992;
    D.23065 = (long int) D.23064;
    D.23066 = __builtin_expect (D.23065, 0);
    if (D.23066 != 0) goto <D.23067>; else goto <D.23068>;
    <D.23067>:
    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.23068>:
  }
  <D.23062>:
  i = i + 1;
  <D.20427>:
  i.125 = (unsigned int) i;
  D.23069 = section->num_scan_start;
  if (i.125 < D.23069) goto <D.20426>; else goto <D.20428>;
  <D.20428>:
}


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

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


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

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


sgen_dump_section (struct GCMemSection * section, const char * type)
{
  char * D.23078;
  unsigned int D.23079;
  struct FILE * heap_dump_file.130;
  void * D.23081;
  char * D.23086;
  _Bool D.23087;
  long int D.23088;
  long int D.23089;
  unsigned int D.23094;
  unsigned int D.23095;
  unsigned int D.23096;
  unsigned int D.23097;
  char * start;
  char * end;
  char * occ_start;
  struct GCVTable * vt;
  char * old_start;

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

    D.23081 = MEM[(void * *)start];
    if (D.23081 == 0B) goto <D.23082>; else goto <D.23083>;
    <D.23082>:
    if (occ_start != 0B) goto <D.23084>; else goto <D.23085>;
    <D.23084>:
    D.23078 = section->data;
    sgen_dump_occupied (occ_start, start, D.23078);
    occ_start = 0B;
    <D.23085>:
    start = start + 4;
    // predicted unlikely by continue predictor.
    goto <D.20468>;
    <D.23083>:
    D.23086 = section->next_data;
    D.23087 = D.23086 <= start;
    D.23088 = (long int) D.23087;
    D.23089 = __builtin_expect (D.23088, 0);
    if (D.23089 != 0) goto <D.23090>; else goto <D.23091>;
    <D.23090>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2088, "start < section->next_data");
    <D.23091>:
    if (occ_start == 0B) goto <D.23092>; else goto <D.23093>;
    <D.23092>:
    occ_start = start;
    <D.23093>:
    D.23094 = MEM[(mword *)start];
    D.23095 = D.23094 & 4294967292;
    vt = (struct GCVTable *) D.23095;
    class = vt->klass;
    D.23096 = sgen_safe_object_get_size (start);
    D.23097 = D.23096 + 7;
    size = D.23097 & 4294967288;
    old_start = start;
    start = start + size;
  }
  <D.20468>:
  if (start < end) goto <D.20469>; else goto <D.20470>;
  <D.20470>:
  if (occ_start != 0B) goto <D.23098>; else goto <D.23099>;
  <D.23098>:
  D.23078 = section->data;
  sgen_dump_occupied (occ_start, start, D.23078);
  <D.23099>:
  heap_dump_file.130 = heap_dump_file;
  fprintf (heap_dump_file.130, "</section>\n");
}


sgen_register_moved_object (void * obj, void * destination)
{
  <unnamed type> mono_profiler_events.131;
  unsigned int D.23101;
  _Bool D.23102;
  long int D.23103;
  long int D.23104;
  int D.23107;
  _Bool D.23108;
  long int D.23109;
  long int D.23110;
  int moved_objects_idx.132;
  int moved_objects_idx.133;
  int moved_objects_idx.134;
  int moved_objects_idx.135;
  int moved_objects_idx.136;

  mono_profiler_events.131 = mono_profiler_events;
  D.23101 = mono_profiler_events.131 & 524288;
  D.23102 = D.23101 == 0;
  D.23103 = (long int) D.23102;
  D.23104 = __builtin_expect (D.23103, 0);
  if (D.23104 != 0) goto <D.23105>; else goto <D.23106>;
  <D.23105>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2187, "mono_profiler_events & MONO_PROFILE_GC_MOVES");
  <D.23106>:
  D.23107 = sgen_collection_is_parallel ();
  D.23108 = D.23107 != 0;
  D.23109 = (long int) D.23108;
  D.23110 = __builtin_expect (D.23109, 0);
  if (D.23110 != 0) goto <D.23111>; else goto <D.23112>;
  <D.23111>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2190, "!sgen_collection_is_parallel ()");
  <D.23112>:
  moved_objects_idx.132 = moved_objects_idx;
  if (moved_objects_idx.132 == 64) goto <D.23114>; else goto <D.23115>;
  <D.23114>:
  moved_objects_idx.132 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.132);
  moved_objects_idx = 0;
  <D.23115>:
  moved_objects_idx.132 = moved_objects_idx;
  moved_objects_idx.133 = moved_objects_idx.132;
  moved_objects_idx.134 = moved_objects_idx.133 + 1;
  moved_objects_idx = moved_objects_idx.134;
  moved_objects[moved_objects_idx.133] = obj;
  moved_objects_idx.132 = moved_objects_idx;
  moved_objects_idx.135 = moved_objects_idx.132;
  moved_objects_idx.136 = moved_objects_idx.135 + 1;
  moved_objects_idx = moved_objects_idx.136;
  moved_objects[moved_objects_idx.135] = destination;
}


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

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


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

  current_collection_generation.139 = current_collection_generation;
  switch (current_collection_generation.139) <default: <D.20515>, case 0: <D.20513>, case 1: <D.20514>>
  <D.20513>:
  D.23123 = nursery_collection_is_parallel;
  return D.23123;
  <D.20514>:
  D.23123 = major_collector.is_parallel;
  return D.23123;
  <D.20515>:
  current_collection_generation.139 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.139);
  <D.20516>:
  goto <D.20516>;
}


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

  current_collection_generation.140 = current_collection_generation;
  switch (current_collection_generation.140) <default: <D.20522>, case 0: <D.20520>, case 1: <D.20521>>
  <D.20520>:
  D.23126 = 0;
  return D.23126;
  <D.20521>:
  D.23126 = concurrent_collection_in_progress;
  return D.23126;
  <D.20522>:
  current_collection_generation.140 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.140);
  <D.20523>:
  goto <D.20523>;
}


sgen_concurrent_collection_in_progress ()
{
  gboolean D.23128;

  D.23128 = concurrent_collection_in_progress;
  return D.23128;
}


sgen_ensure_free_space (size_t size)
{
  int D.23132;
  int degraded_mode.141;
  int D.23139;
  int D.23143;
  int concurrent_collection_in_progress.142;
  int D.23152;
  int generation_to_collect;
  const char * reason;

  generation_to_collect = -1;
  reason = 0B;
  if (size > 8000) goto <D.23130>; else goto <D.23131>;
  <D.23130>:
  D.23132 = sgen_need_major_collection (size);
  if (D.23132 != 0) goto <D.23133>; else goto <D.23134>;
  <D.23133>:
  reason = "LOS overflow";
  generation_to_collect = 1;
  <D.23134>:
  goto <D.23135>;
  <D.23131>:
  degraded_mode.141 = degraded_mode;
  if (degraded_mode.141 != 0) goto <D.23137>; else goto <D.23138>;
  <D.23137>:
  D.23139 = sgen_need_major_collection (size);
  if (D.23139 != 0) goto <D.23140>; else goto <D.23141>;
  <D.23140>:
  reason = "Degraded mode overflow";
  generation_to_collect = 1;
  <D.23141>:
  goto <D.23142>;
  <D.23138>:
  D.23143 = sgen_need_major_collection (size);
  if (D.23143 != 0) goto <D.23144>; else goto <D.23145>;
  <D.23144>:
  reason = "Minor allowance";
  generation_to_collect = 1;
  goto <D.23146>;
  <D.23145>:
  generation_to_collect = 0;
  reason = "Nursery full";
  <D.23146>:
  <D.23142>:
  <D.23135>:
  if (generation_to_collect == -1) goto <D.23147>; else goto <D.23148>;
  <D.23147>:
  concurrent_collection_in_progress.142 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.142 != 0) goto <D.23150>; else goto <D.23151>;
  <D.23150>:
  D.23152 = sgen_workers_all_done ();
  if (D.23152 != 0) goto <D.23153>; else goto <D.23154>;
  <D.23153>:
  generation_to_collect = 1;
  reason = "Finish concurrent collection";
  <D.23154>:
  <D.23151>:
  <D.23148>:
  if (generation_to_collect == -1) goto <D.23155>; else goto <D.23156>;
  <D.23155>:
  return;
  <D.23156>:
  sgen_perform_collection (size, generation_to_collect, reason, 0);
}


sgen_perform_collection (size_t requested_size, int generation_to_collect, const char * reason, gboolean wait_to_finish)
{
  unsigned int generation_to_collect.143;
  _Bool D.23161;
  long int D.23162;
  long int D.23163;
  long long int D.23166;
  int concurrent_collection_in_progress.144;
  int iftmp.145;
  int D.23175;
  int allow_synchronous_major.146;
  gboolean * D.23185;
  int D.23188;
  int D.23193;
  int D.23197;
  int concurrent_collection_in_progress.147;
  _Bool D.23201;
  long int D.23202;
  long int D.23203;
  int D.23211;
  long long int D.23214;
  long long int D.23215;
  long long int D.23216;
  int D.23217;
  long long int D.23218;
  long long int D.23226;
  long long int D.23227;
  long long int D.23228;
  int D.23229;
  long long int D.23230;
  int gc_debug_level.148;
  _Bool D.23232;
  long int D.23233;
  long int D.23234;
  struct FILE * gc_debug_file.149;
  long long int D.23238;
  long unsigned int D.23239;
  unsigned int los_memory_usage.150;
  int D.23243;
  _Bool D.23246;
  long int D.23247;
  long int D.23248;
  int D.23251;
  int D.23252;
  _Bool D.23253;
  long int D.23254;
  long int D.23255;
  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.23158>; else goto <D.23159>;
      <D.23158>:
      <D.23159>:
      generation_to_collect.143 = (unsigned int) generation_to_collect;
      D.23161 = generation_to_collect.143 > 1;
      D.23162 = (long int) D.23161;
      D.23163 = __builtin_expect (D.23162, 0);
      if (D.23163 != 0) goto <D.23164>; else goto <D.23165>;
      <D.23164>:
      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.23165>:
      memset (&infos, 0, 80);
      mono_profiler_gc_event (0, generation_to_collect);
      infos[0].generation = generation_to_collect;
      infos[0].reason = reason;
      infos[0].is_overflow = 0;
      D.23166 = mono_100ns_ticks ();
      infos[0].total_time = D.23166;
      infos[1].generation = -1;
      sgen_stop_world (generation_to_collect);
      concurrent_collection_in_progress.144 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.144 != 0) goto <D.23168>; else goto <D.23169>;
      <D.23168>:
      if (wait_to_finish != 0) goto <D.23173>; else goto <D.23171>;
      <D.23173>:
      if (generation_to_collect == 1) goto <D.23174>; else goto <D.23171>;
      <D.23174>:
      iftmp.145 = 1;
      goto <D.23172>;
      <D.23171>:
      iftmp.145 = 0;
      <D.23172>:
      D.23175 = major_update_or_finish_concurrent_collection (iftmp.145);
      if (D.23175 != 0) goto <D.23176>; else goto <D.23177>;
      <D.23176>:
      oldest_generation_collected = 1;
      goto done;
      <D.23177>:
      if (generation_to_collect == 1) goto done; else goto <D.23178>;
      <D.23178>:
      goto <D.23179>;
      <D.23169>:
      if (generation_to_collect == 1) goto <D.23180>; else goto <D.23181>;
      <D.23180>:
      allow_synchronous_major.146 = allow_synchronous_major;
      if (allow_synchronous_major.146 != 0) goto <D.23183>; else goto <D.23184>;
      <D.23183>:
      D.23185 = major_collector.want_synchronous_collection;
      if (D.23185 != 0B) goto <D.23186>; else goto <D.23187>;
      <D.23186>:
      D.23185 = major_collector.want_synchronous_collection;
      D.23188 = *D.23185;
      if (D.23188 != 0) goto <D.23189>; else goto <D.23190>;
      <D.23189>:
      wait_to_finish = 1;
      <D.23190>:
      <D.23187>:
      <D.23184>:
      <D.23181>:
      <D.23179>:
      if (generation_to_collect == 0) goto <D.23191>; else goto <D.23192>;
      <D.23191>:
      D.23193 = collect_nursery (0B, 0);
      if (D.23193 != 0) goto <D.23194>; else goto <D.23195>;
      <D.23194>:
      overflow_generation_to_collect = 1;
      overflow_reason = "Minor overflow";
      <D.23195>:
      goto <D.23196>;
      <D.23192>:
      D.23197 = major_collector.is_concurrent;
      if (D.23197 != 0) goto <D.23198>; else goto <D.23199>;
      <D.23198>:
      concurrent_collection_in_progress.147 = concurrent_collection_in_progress;
      D.23201 = concurrent_collection_in_progress.147 != 0;
      D.23202 = (long int) D.23201;
      D.23203 = __builtin_expect (D.23202, 0);
      if (D.23203 != 0) goto <D.23204>; else goto <D.23205>;
      <D.23204>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3489, "!concurrent_collection_in_progress");
      <D.23205>:
      if (wait_to_finish == 0) goto <D.23206>; else goto <D.23207>;
      <D.23206>:
      collect_nursery (0B, 0);
      <D.23207>:
      <D.23199>:
      D.23197 = major_collector.is_concurrent;
      if (D.23197 != 0) goto <D.23209>; else goto <D.23208>;
      <D.23209>:
      if (wait_to_finish == 0) goto <D.23210>; else goto <D.23208>;
      <D.23210>:
      major_start_concurrent_collection (reason);
      goto done;
      <D.23208>:
      D.23211 = major_do_collection (reason);
      if (D.23211 != 0) goto <D.23212>; else goto <D.23213>;
      <D.23212>:
      overflow_generation_to_collect = 0;
      overflow_reason = "Excessive pinning";
      <D.23213>:
      <D.23196>:
      gc_end = mono_100ns_ticks ();
      D.23214 = infos[0].total_time;
      D.23215 = gc_end - D.23214;
      D.23216 = D.23215 / 10;
      D.23217 = (int) D.23216;
      D.23218 = (long long int) D.23217;
      infos[0].total_time = D.23218;
      D.23197 = major_collector.is_concurrent;
      if (D.23197 == 0) goto <D.23219>; else goto <D.23220>;
      <D.23219>:
      if (overflow_generation_to_collect != -1) goto <D.23221>; else goto <D.23222>;
      <D.23221>:
      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.23223>; else goto <D.23224>;
      <D.23223>:
      collect_nursery (0B, 0);
      goto <D.23225>;
      <D.23224>:
      major_do_collection (overflow_reason);
      <D.23225>:
      gc_end = mono_100ns_ticks ();
      D.23226 = infos[1].total_time;
      D.23227 = gc_end - D.23226;
      D.23228 = D.23227 / 10;
      D.23229 = (int) D.23228;
      D.23230 = (long long int) D.23229;
      infos[1].total_time = D.23230;
      mono_profiler_gc_event (5, overflow_generation_to_collect);
      oldest_generation_collected = MAX_EXPR <overflow_generation_to_collect, oldest_generation_collected>;
      <D.23222>:
      <D.23220>:
      gc_debug_level.148 = gc_debug_level;
      D.23232 = gc_debug_level.148 > 1;
      D.23233 = (long int) D.23232;
      D.23234 = __builtin_expect (D.23233, 0);
      if (D.23234 != 0) goto <D.23235>; else goto <D.23236>;
      <D.23235>:
      gc_debug_file.149 = gc_debug_file;
      D.23238 = mono_gc_get_heap_size ();
      D.23239 = (long unsigned int) D.23238;
      los_memory_usage.150 = los_memory_usage;
      fprintf (gc_debug_file.149, "Heap size: %lu, LOS size: %lu\n", D.23239, los_memory_usage.150);
      gc_debug_file.149 = gc_debug_file;
      fflush (gc_debug_file.149);
      <D.23236>:
      if (generation_to_collect == 0) goto <D.23241>; else goto <D.23242>;
      <D.23241>:
      D.23243 = sgen_can_alloc_size (requested_size);
      if (D.23243 == 0) goto <D.23244>; else goto <D.23245>;
      <D.23244>:
      gc_debug_level.148 = gc_debug_level;
      D.23246 = gc_debug_level.148 > 0;
      D.23247 = (long int) D.23246;
      D.23248 = __builtin_expect (D.23247, 0);
      if (D.23248 != 0) goto <D.23249>; else goto <D.23250>;
      <D.23249>:
      gc_debug_file.149 = gc_debug_file;
      D.23251 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.149, "nursery collection didn\'t find enough room for %zd alloc (%d pinned)\n", requested_size, D.23251);
      gc_debug_file.149 = gc_debug_file;
      fflush (gc_debug_file.149);
      <D.23250>:
      sgen_dump_pin_queue ();
      degraded_mode = 1;
      <D.23245>:
      <D.23242>:
      done:
      D.23252 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.23253 = D.23252 == 0;
      D.23254 = (long int) D.23253;
      D.23255 = __builtin_expect (D.23254, 0);
      if (D.23255 != 0) goto <D.23256>; else goto <D.23257>;
      <D.23256>:
      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.23257>:
      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.23258;
  _Bool D.23259;
  long int D.23260;
  long int D.23261;
  int D.23266;
  void (*<T70e>) (void) D.23269;
  gboolean D.23270;
  int mod_union_consistency_check.151;
  int whole_heap_check_before_collection.152;
  struct SgenGrayQueue unpin_queue;

  try
    {
      memset (&unpin_queue, 0, 16);
      D.23258 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.23259 = D.23258 == 0;
      D.23260 = (long int) D.23259;
      D.23261 = __builtin_expect (D.23260, 0);
      if (D.23261 != 0) goto <D.23262>; else goto <D.23263>;
      <D.23262>:
      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.23263>:
      if (force_finish == 0) goto <D.23264>; else goto <D.23265>;
      <D.23264>:
      D.23266 = sgen_workers_all_done ();
      if (D.23266 == 0) goto <D.23267>; else goto <D.23268>;
      <D.23267>:
      D.23269 = major_collector.update_cardtable_mod_union;
      D.23269 ();
      sgen_los_update_cardtable_mod_union ();
      D.23270 = 0;
      return D.23270;
      <D.23268>:
      <D.23265>:
      wait_for_workers_to_finish ();
      D.23269 = major_collector.update_cardtable_mod_union;
      D.23269 ();
      sgen_los_update_cardtable_mod_union ();
      collect_nursery (&unpin_queue, 1);
      mod_union_consistency_check.151 = mod_union_consistency_check;
      if (mod_union_consistency_check.151 != 0) goto <D.23272>; else goto <D.23273>;
      <D.23272>:
      sgen_check_mod_union_consistency ();
      <D.23273>:
      current_collection_generation = 1;
      major_finish_collection ("finishing", -1, 1);
      whole_heap_check_before_collection.152 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.152 != 0) goto <D.23275>; else goto <D.23276>;
      <D.23275>:
      sgen_check_whole_heap (0);
      <D.23276>:
      unpin_objects_from_queue (&unpin_queue);
      sgen_gray_object_queue_deinit (&unpin_queue);
      current_collection_generation = -1;
      D.23270 = 1;
      return D.23270;
    }
  finally
    {
      unpin_queue = {CLOBBER};
    }
}


wait_for_workers_to_finish ()
{
  int D.23279;

  goto <D.20673>;
  <D.20672>:
  monoeg_g_usleep (200);
  <D.20673>:
  D.23279 = sgen_workers_all_done ();
  if (D.23279 == 0) goto <D.20672>; else goto <D.20674>;
  <D.20674>:
}


major_finish_collection (const char * reason, int old_next_pin_slot, gboolean scan_mod_union)
{
  int concurrent_collection_in_progress.153;
  int D.23284;
  int concurrent_collection_in_progress.154;
  int D.23288;
  _Bool D.23289;
  long int D.23290;
  long int D.23291;
  int do_concurrent_checks.155;
  struct SgenSectionGrayQueue * D.23298;
  int D.23299;
  _Bool D.23300;
  long int D.23301;
  long int D.23302;
  long long int D.23305;
  long long int D.23306;
  int D.23307;
  long long int D.23308;
  long long int time_major_finish_gray_stack.156;
  long long int time_major_finish_gray_stack.157;
  unsigned int objects_pinned.158;
  int concurrent_collection_in_progress.159;
  _Bool D.23315;
  long int D.23316;
  long int D.23317;
  struct GCMemSection * nursery_section.160;
  char * D.23321;
  unsigned int D.23322;
  char * D.23323;
  unsigned int D.23324;
  int check_mark_bits_after_major_collection.161;
  char[0:] * D.23328;
  unsigned int D.23329;
  unsigned int D.23330;
  _Bool D.23331;
  long int D.23332;
  long int D.23333;
  int D.23336;
  unsigned int D.23339;
  unsigned int D.23340;
  unsigned int D.23341;
  struct LOSObject * los_object_list.162;
  long long int D.23347;
  long long int D.23348;
  int D.23349;
  long long int D.23350;
  long long int time_major_free_bigobjs.163;
  long long int time_major_free_bigobjs.164;
  long long int time_major_los_sweep.165;
  long long int time_major_los_sweep.166;
  void (*<T70e>) (void) D.23355;
  long long int time_major_sweep.167;
  long long int time_major_sweep.168;
  int concurrent_collection_in_progress.169;
  void * * D.23361;
  int D.23362;
  unsigned int D.23363;
  int concurrent_collection_in_progress.170;
  long long int time_major_fragment_creation.171;
  long long int time_major_fragment_creation.172;
  struct FILE * heap_dump_file.173;
  int stat_major_gcs.174;
  int D.23375;
  struct FinalizeReadyEntry * fin_ready_list.175;
  struct FinalizeReadyEntry * critical_fin_list.176;
  struct FILE * gc_debug_file.177;
  int num_ready_finalizers.178;
  int D.23385;
  _Bool D.23386;
  long int D.23387;
  long int D.23388;
  void (*<T70e>) (void) D.23391;
  struct SgenSectionGrayQueue * D.23392;
  int D.23393;
  _Bool D.23394;
  long int D.23395;
  long int D.23396;
  int concurrent_collection_in_progress.179;
  struct LOSObject * bigobj;
  struct LOSObject * prevbo;
  gint64 atv;
  gint64 btv;

  btv = mono_100ns_ticks ();
  concurrent_collection_in_progress.153 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.153 != 0) goto <D.23280>; else goto <D.23283>;
  <D.23283>:
  D.23284 = major_collector.is_parallel;
  if (D.23284 != 0) goto <D.23280>; else goto <D.23281>;
  <D.23280>:
  join_workers ();
  <D.23281>:
  concurrent_collection_in_progress.154 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.154 != 0) goto <D.23286>; else goto <D.23287>;
  <D.23286>:
  current_object_ops = major_collector.major_concurrent_ops;
  major_copy_or_mark_from_roots (0B, 1, scan_mod_union);
  join_workers ();
  D.23288 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23289 = D.23288 == 0;
  D.23290 = (long int) D.23289;
  D.23291 = __builtin_expect (D.23290, 0);
  if (D.23291 != 0) goto <D.23292>; else goto <D.23293>;
  <D.23292>:
  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.23293>:
  do_concurrent_checks.155 = do_concurrent_checks;
  if (do_concurrent_checks.155 != 0) goto <D.23295>; else goto <D.23296>;
  <D.23295>:
  check_nursery_is_clean ();
  <D.23296>:
  goto <D.23297>;
  <D.23287>:
  current_object_ops = major_collector.major_ops;
  <D.23297>:
  sgen_gray_object_queue_disable_alloc_prepare (&gray_queue);
  D.23298 = sgen_workers_get_distribute_section_gray_queue ();
  D.23299 = sgen_section_gray_queue_is_empty (D.23298);
  D.23300 = D.23299 == 0;
  D.23301 = (long int) D.23300;
  D.23302 = __builtin_expect (D.23301, 0);
  if (D.23302 != 0) goto <D.23303>; else goto <D.23304>;
  <D.23303>:
  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.23304>:
  finish_gray_stack (1, &gray_queue);
  atv = mono_100ns_ticks ();
  D.23305 = atv - btv;
  D.23306 = D.23305 / 10;
  D.23307 = (int) D.23306;
  D.23308 = (long long int) D.23307;
  time_major_finish_gray_stack.156 = time_major_finish_gray_stack;
  time_major_finish_gray_stack.157 = D.23308 + time_major_finish_gray_stack.156;
  time_major_finish_gray_stack = time_major_finish_gray_stack.157;
  sgen_workers_reset_data ();
  objects_pinned.158 = objects_pinned;
  if (objects_pinned.158 != 0) goto <D.23312>; else goto <D.23313>;
  <D.23312>:
  concurrent_collection_in_progress.159 = concurrent_collection_in_progress;
  D.23315 = concurrent_collection_in_progress.159 != 0;
  D.23316 = (long int) D.23315;
  D.23317 = __builtin_expect (D.23316, 0);
  if (D.23317 != 0) goto <D.23318>; else goto <D.23319>;
  <D.23318>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3177, "!concurrent_collection_in_progress");
  <D.23319>:
  nursery_section.160 = nursery_section;
  sgen_pin_queue_clear_discarded_entries (nursery_section.160, old_next_pin_slot);
  sgen_optimize_pin_queue (0);
  nursery_section.160 = nursery_section;
  sgen_find_section_pin_queue_start_end (nursery_section.160);
  objects_pinned = 0;
  <D.23313>:
  reset_heap_boundaries ();
  D.23321 = sgen_get_nursery_start ();
  D.23322 = (unsigned int) D.23321;
  D.23323 = sgen_get_nursery_end ();
  D.23324 = (unsigned int) D.23323;
  sgen_update_heap_boundaries (D.23322, D.23324);
  check_mark_bits_after_major_collection.161 = check_mark_bits_after_major_collection;
  if (check_mark_bits_after_major_collection.161 != 0) goto <D.23326>; else goto <D.23327>;
  <D.23326>:
  sgen_check_major_heap_marked ();
  <D.23327>:
  prevbo = 0B;
  bigobj = los_object_list;
  goto <D.20688>;
  <D.20689>:
  D.23328 = &bigobj->data;
  D.23329 = MEM[(mword *)D.23328];
  D.23330 = D.23329 & 2;
  D.23331 = D.23330 != 0;
  D.23332 = (long int) D.23331;
  D.23333 = __builtin_expect (D.23332, 0);
  if (D.23333 != 0) goto <D.23334>; else goto <D.23335>;
  <D.23334>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3197, "!object_is_pinned (bigobj->data)");
  <D.23335>:
  D.23328 = &bigobj->data;
  D.23336 = sgen_los_object_is_pinned (D.23328);
  if (D.23336 != 0) goto <D.23337>; else goto <D.23338>;
  <D.23337>:
  D.23328 = &bigobj->data;
  sgen_los_unpin_object (D.23328);
  D.23328 = &bigobj->data;
  D.23339 = (unsigned int) D.23328;
  D.23328 = &bigobj->data;
  D.23339 = (unsigned int) D.23328;
  D.23340 = sgen_los_object_size (bigobj);
  D.23341 = D.23339 + D.23340;
  sgen_update_heap_boundaries (D.23339, D.23341);
  goto <D.23342>;
  <D.23338>:
  {
    struct LOSObject * to_free;

    if (prevbo != 0B) goto <D.23343>; else goto <D.23344>;
    <D.23343>:
    los_object_list.162 = bigobj->next;
    prevbo->next = los_object_list.162;
    goto <D.23346>;
    <D.23344>:
    los_object_list.162 = bigobj->next;
    los_object_list = los_object_list.162;
    <D.23346>:
    to_free = bigobj;
    bigobj = bigobj->next;
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.20688>;
  }
  <D.23342>:
  prevbo = bigobj;
  bigobj = bigobj->next;
  <D.20688>:
  if (bigobj != 0B) goto <D.20689>; else goto <D.20690>;
  <D.20690>:
  btv = mono_100ns_ticks ();
  D.23347 = btv - atv;
  D.23348 = D.23347 / 10;
  D.23349 = (int) D.23348;
  D.23350 = (long long int) D.23349;
  time_major_free_bigobjs.163 = time_major_free_bigobjs;
  time_major_free_bigobjs.164 = D.23350 + time_major_free_bigobjs.163;
  time_major_free_bigobjs = time_major_free_bigobjs.164;
  sgen_los_sweep ();
  atv = mono_100ns_ticks ();
  D.23305 = atv - btv;
  D.23306 = D.23305 / 10;
  D.23307 = (int) D.23306;
  D.23308 = (long long int) D.23307;
  time_major_los_sweep.165 = time_major_los_sweep;
  time_major_los_sweep.166 = D.23308 + time_major_los_sweep.165;
  time_major_los_sweep = time_major_los_sweep.166;
  D.23355 = major_collector.sweep;
  D.23355 ();
  btv = mono_100ns_ticks ();
  D.23347 = btv - atv;
  D.23348 = D.23347 / 10;
  D.23349 = (int) D.23348;
  D.23350 = (long long int) D.23349;
  time_major_sweep.167 = time_major_sweep;
  time_major_sweep.168 = D.23350 + time_major_sweep.167;
  time_major_sweep = time_major_sweep.168;
  concurrent_collection_in_progress.169 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.169 == 0) goto <D.23359>; else goto <D.23360>;
  <D.23359>:
  nursery_section.160 = nursery_section;
  nursery_section.160 = nursery_section;
  D.23361 = nursery_section.160->pin_queue_start;
  nursery_section.160 = nursery_section;
  D.23362 = nursery_section.160->pin_queue_num_entries;
  D.23363 = sgen_build_nursery_fragments (nursery_section.160, D.23361, D.23362, 0B);
  if (D.23363 == 0) goto <D.23364>; else goto <D.23365>;
  <D.23364>:
  degraded_mode = 1;
  <D.23365>:
  sgen_finish_pinning ();
  sgen_clear_tlabs ();
  sgen_pin_stats_reset ();
  <D.23360>:
  concurrent_collection_in_progress.170 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.170 != 0) goto <D.23367>; else goto <D.23368>;
  <D.23367>:
  sgen_cement_concurrent_finish ();
  <D.23368>:
  sgen_cement_clear_below_threshold ();
  atv = mono_100ns_ticks ();
  D.23305 = atv - btv;
  D.23306 = D.23305 / 10;
  D.23307 = (int) D.23306;
  D.23308 = (long long int) D.23307;
  time_major_fragment_creation.171 = time_major_fragment_creation;
  time_major_fragment_creation.172 = D.23308 + time_major_fragment_creation.171;
  time_major_fragment_creation = time_major_fragment_creation.172;
  heap_dump_file.173 = heap_dump_file;
  if (heap_dump_file.173 != 0B) goto <D.23372>; else goto <D.23373>;
  <D.23372>:
  stat_major_gcs.174 = stat_major_gcs;
  D.23375 = stat_major_gcs.174 + -1;
  dump_heap ("major", D.23375, reason);
  <D.23373>:
  fin_ready_list.175 = fin_ready_list;
  if (fin_ready_list.175 != 0B) goto <D.23376>; else goto <D.23379>;
  <D.23379>:
  critical_fin_list.176 = critical_fin_list;
  if (critical_fin_list.176 != 0B) goto <D.23376>; else goto <D.23377>;
  <D.23376>:
  if (0 != 0) goto <D.23381>; else goto <D.23382>;
  <D.23381>:
  gc_debug_file.177 = gc_debug_file;
  num_ready_finalizers.178 = num_ready_finalizers;
  fprintf (gc_debug_file.177, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.178);
  gc_debug_file.177 = gc_debug_file;
  fflush (gc_debug_file.177);
  <D.23382>:
  mono_gc_finalize_notify ();
  <D.23377>:
  D.23385 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23386 = D.23385 == 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>:
  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.23390>:
  sgen_memgov_major_collection_end ();
  current_collection_generation = -1;
  D.23391 = major_collector.finish_major_collection;
  D.23391 ();
  D.23392 = sgen_workers_get_distribute_section_gray_queue ();
  D.23393 = sgen_section_gray_queue_is_empty (D.23392);
  D.23394 = D.23393 == 0;
  D.23395 = (long int) D.23394;
  D.23396 = __builtin_expect (D.23395, 0);
  if (D.23396 != 0) goto <D.23397>; else goto <D.23398>;
  <D.23397>:
  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.23398>:
  concurrent_collection_in_progress.179 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.179 != 0) goto <D.23400>; else goto <D.23401>;
  <D.23400>:
  concurrent_collection_in_progress = 0;
  <D.23401>:
  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.23402;
  int D.23403;
  int concurrent_collection_in_progress.180;
  int do_concurrent_checks.181;
  int whole_heap_check_before_collection.182;
  long long int D.23414;
  long long int D.23415;
  int D.23416;
  long long int D.23417;
  long long int time_major_pre_collection_fragment_clear.183;
  long long int time_major_pre_collection_fragment_clear.184;
  int D.23420;
  struct GCMemSection * nursery_section.185;
  char * D.23424;
  gboolean * D.23425;
  int xdomain_checks.186;
  int concurrent_collection_in_progress.187;
  void (*<T70e>) (void) D.23432;
  struct FILE * gc_debug_file.188;
  unsigned int lowest_heap_address.189;
  void * lowest_heap_address.190;
  unsigned int highest_heap_address.191;
  void * highest_heap_address.192;
  int concurrent_collection_in_progress.193;
  int D.23444;
  int concurrent_collection_in_progress.194;
  int concurrent_collection_in_progress.195;
  void (*<T2a8f>) (struct SgenGrayQueue *) D.23455;
  char[0:] * D.23458;
  unsigned int D.23459;
  char * D.23460;
  void * * D.23461;
  int D.23464;
  _Bool D.23467;
  long int D.23468;
  long int D.23469;
  unsigned int D.23472;
  unsigned int D.23473;
  struct MonoVTable * D.23474;
  void * D.23475;
  unsigned int D.23476;
  int D.23477;
  int iftmp.196;
  struct GrayQueueSection * D.23484;
  int D.23486;
  _Bool D.23487;
  long int D.23488;
  long int D.23489;
  int D.23493;
  int D.23494;
  int do_pin_stats.197;
  _Bool D.23496;
  long int D.23497;
  long int D.23498;
  unsigned int D.23501;
  const char * D.23504;
  unsigned int D.23505;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) iftmp.198;
  int concurrent_collection_in_progress.199;
  int concurrent_collection_in_progress.200;
  int D.23519;
  int check_nursery_objects_pinned.201;
  int iftmp.202;
  int concurrent_collection_in_progress.203;
  void (*<T2a8f>) (struct SgenGrayQueue *) D.23532;
  int D.23535;
  long long int time_major_pinning.204;
  long long int time_major_pinning.205;
  int gc_debug_level.206;
  _Bool D.23539;
  long int D.23540;
  long int D.23541;
  int D.23544;
  int D.23547;
  void (*<T70e>) (void) D.23548;
  int concurrent_collection_in_progress.207;
  int D.23552;
  <unnamed type> D.23555;
  unsigned int D.23556;
  long long int D.23559;
  long long int D.23560;
  int D.23561;
  long long int D.23562;
  long long int time_major_scan_pinned.208;
  long long int time_major_scan_pinned.209;
  void (*<T2b4d>) (void * *, struct SgenGrayQueue *) D.23565;
  void (*<T2b52>) (char *, struct SgenGrayQueue *) D.23566;
  long long int time_major_scan_registered_roots.210;
  long long int time_major_scan_registered_roots.211;
  long long int time_major_scan_thread_data.212;
  long long int time_major_scan_thread_data.213;
  long long int time_major_scan_alloc_pinned.214;
  long long int time_major_scan_alloc_pinned.215;
  <unnamed type> D.23573;
  unsigned int D.23574;
  struct FinalizeReadyEntry * fin_ready_list.216;
  struct FinalizeReadyEntry * critical_fin_list.217;
  long long int time_major_scan_finalized.218;
  long long int time_major_scan_finalized.219;
  long long int time_major_scan_big_objects.220;
  long long int time_major_scan_big_objects.221;
  int concurrent_collection_in_progress.222;
  struct LOSObject * bigobj;
  gint64 atv;
  gint64 btv;
  char * heap_start;
  char * heap_end;
  gboolean profile_roots;
  struct GCRootReport root_report;
  struct ScanFromRegisteredRootsJobData * scrrjd_normal;
  struct ScanFromRegisteredRootsJobData * scrrjd_wbarrier;
  struct ScanThreadDataJobData * stdjd;
  struct ScanFinalizerEntriesJobData * sfejd_fin_ready;
  struct ScanFinalizerEntriesJobData * sfejd_critical_fin;
  struct ScanCopyContext ctx;

  try
    {
      heap_start = 0B;
      heap_end = 4294967295B;
      D.23402 = mono_profiler_get_events ();
      D.23403 = (int) D.23402;
      profile_roots = D.23403 & 1048576;
      root_report = {};
      concurrent_collection_in_progress.180 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.180 != 0) goto <D.23405>; else goto <D.23406>;
      <D.23405>:
      sgen_nursery_allocator_prepare_for_pinning ();
      do_concurrent_checks.181 = do_concurrent_checks;
      if (do_concurrent_checks.181 != 0) goto <D.23408>; else goto <D.23409>;
      <D.23408>:
      check_nursery_is_clean ();
      <D.23409>:
      goto <D.23410>;
      <D.23406>:
      sgen_nursery_alloc_prepare_for_major ();
      <D.23410>:
      init_gray_queue ();
      atv = mono_100ns_ticks ();
      sgen_clear_nursery_fragments ();
      whole_heap_check_before_collection.182 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.182 != 0) goto <D.23412>; else goto <D.23413>;
      <D.23412>:
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.23413>:
      btv = mono_100ns_ticks ();
      D.23414 = btv - atv;
      D.23415 = D.23414 / 10;
      D.23416 = (int) D.23415;
      D.23417 = (long long int) D.23416;
      time_major_pre_collection_fragment_clear.183 = time_major_pre_collection_fragment_clear;
      time_major_pre_collection_fragment_clear.184 = D.23417 + time_major_pre_collection_fragment_clear.183;
      time_major_pre_collection_fragment_clear = time_major_pre_collection_fragment_clear.184;
      D.23420 = sgen_collection_is_concurrent ();
      if (D.23420 == 0) goto <D.23421>; else goto <D.23422>;
      <D.23421>:
      nursery_section.185 = nursery_section;
      D.23424 = sgen_get_nursery_end ();
      nursery_section.185->next_data = D.23424;
      <D.23422>:
      objects_pinned = 0;
      D.23425 = major_collector.have_swept;
      *D.23425 = 0;
      xdomain_checks.186 = xdomain_checks;
      if (xdomain_checks.186 != 0) goto <D.23427>; else goto <D.23428>;
      <D.23427>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.23428>:
      concurrent_collection_in_progress.187 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.187 == 0) goto <D.23430>; else goto <D.23431>;
      <D.23430>:
      D.23432 = remset.prepare_for_major_collection;
      D.23432 ();
      <D.23431>:
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      atv = mono_100ns_ticks ();
      sgen_init_pinning ();
      if (0 != 0) goto <D.23433>; else goto <D.23434>;
      <D.23433>:
      gc_debug_file.188 = gc_debug_file;
      fprintf (gc_debug_file.188, "Collecting pinned addresses\n");
      gc_debug_file.188 = gc_debug_file;
      fflush (gc_debug_file.188);
      <D.23434>:
      lowest_heap_address.189 = lowest_heap_address;
      lowest_heap_address.190 = (void *) lowest_heap_address.189;
      highest_heap_address.191 = highest_heap_address;
      highest_heap_address.192 = (void *) highest_heap_address.191;
      pin_from_roots (lowest_heap_address.190, highest_heap_address.192, &gray_queue);
      concurrent_collection_in_progress.193 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.193 == 0) goto <D.23440>; else goto <D.23443>;
      <D.23443>:
      if (finish_up_concurrent_mark != 0) goto <D.23440>; else goto <D.23441>;
      <D.23440>:
      D.23444 = major_collector.is_concurrent;
      if (D.23444 != 0) goto <D.23445>; else goto <D.23446>;
      <D.23445>:
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      <D.23446>:
      concurrent_collection_in_progress.194 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.194 == 0) goto <D.23448>; else goto <D.23449>;
      <D.23448>:
      sgen_cement_reset ();
      <D.23449>:
      <D.23441>:
      sgen_optimize_pin_queue (0);
      concurrent_collection_in_progress.195 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.195 != 0) goto <D.23451>; else goto <D.23452>;
      <D.23451>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.23452>:
      if (0 != 0) goto <D.23453>; else goto <D.23454>;
      <D.23453>:
      gc_debug_file.188 = gc_debug_file;
      fprintf (gc_debug_file.188, "Pinning from sections\n");
      gc_debug_file.188 = gc_debug_file;
      fflush (gc_debug_file.188);
      <D.23454>:
      nursery_section.185 = nursery_section;
      sgen_find_section_pin_queue_start_end (nursery_section.185);
      D.23455 = major_collector.find_pin_queue_start_ends;
      D.23455 (&gray_queue);
      if (0 != 0) goto <D.23456>; else goto <D.23457>;
      <D.23456>:
      gc_debug_file.188 = gc_debug_file;
      fprintf (gc_debug_file.188, "Pinning from large objects\n");
      gc_debug_file.188 = gc_debug_file;
      fflush (gc_debug_file.188);
      <D.23457>:
      bigobj = los_object_list;
      goto <D.20663>;
      <D.20662>:
      {
        int dummy;

        try
          {
            D.23458 = &bigobj->data;
            D.23459 = sgen_los_object_size (bigobj);
            D.23460 = &bigobj->data[D.23459];
            D.23461 = sgen_find_optimized_pin_queue_area (D.23458, D.23460, &dummy);
            if (D.23461 != 0B) goto <D.23462>; else goto <D.23463>;
            <D.23462>:
            D.23458 = &bigobj->data;
            D.23464 = sgen_los_object_is_pinned (D.23458);
            if (D.23464 != 0) goto <D.23465>; else goto <D.23466>;
            <D.23465>:
            D.23467 = finish_up_concurrent_mark == 0;
            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", 2919, "finish_up_concurrent_mark");
            <D.23471>:
            // predicted unlikely by continue predictor.
            goto <D.20661>;
            <D.23466>:
            D.23458 = &bigobj->data;
            sgen_los_pin_object (D.23458);
            D.23458 = &bigobj->data;
            D.23472 = MEM[(mword *)D.23458];
            D.23473 = D.23472 & 4294967292;
            D.23474 = (struct MonoVTable *) D.23473;
            D.23475 = D.23474->gc_descr;
            D.23476 = (unsigned int) D.23475;
            D.23477 = sgen_gc_descr_has_references (D.23476);
            if (D.23477 != 0) goto <D.23478>; else goto <D.23479>;
            <D.23478>:
            D.23484 = gray_queue.first;
            if (D.23484 == 0B) goto <D.23481>; else goto <D.23485>;
            <D.23485>:
            D.23484 = gray_queue.first;
            D.23486 = D.23484->end;
            if (D.23486 == 125) goto <D.23481>; else goto <D.23482>;
            <D.23481>:
            iftmp.196 = 1;
            goto <D.23483>;
            <D.23482>:
            iftmp.196 = 0;
            <D.23483>:
            D.23487 = iftmp.196 != 0;
            D.23488 = (long int) D.23487;
            D.23489 = __builtin_expect (D.23488, 0);
            if (D.23489 != 0) goto <D.23490>; else goto <D.23491>;
            <D.23490>:
            D.23458 = &bigobj->data;
            sgen_gray_object_enqueue (&gray_queue, D.23458);
            goto <D.23492>;
            <D.23491>:
            D.23484 = gray_queue.first;
            D.23484 = gray_queue.first;
            D.23486 = D.23484->end;
            D.23493 = D.23486;
            D.23494 = D.23493 + 1;
            D.23484->end = D.23494;
            D.23458 = &bigobj->data;
            D.23484->objects[D.23493] = D.23458;
            <D.23492>:
            D.23458 = &bigobj->data;
            __builtin_prefetch (D.23458);
            <D.23479>:
            do_pin_stats.197 = do_pin_stats;
            D.23496 = do_pin_stats.197 != 0;
            D.23497 = (long int) D.23496;
            D.23498 = __builtin_expect (D.23497, 0);
            if (D.23498 != 0) goto <D.23499>; else goto <D.23500>;
            <D.23499>:
            D.23458 = &bigobj->data;
            D.23458 = &bigobj->data;
            D.23501 = sgen_safe_object_get_size (D.23458);
            sgen_pin_stats_register_object (D.23458, D.23501);
            <D.23500>:
            if (0 != 0) goto <D.23502>; else goto <D.23503>;
            <D.23502>:
            gc_debug_file.188 = gc_debug_file;
            D.23458 = &bigobj->data;
            D.23458 = &bigobj->data;
            D.23504 = safe_name (D.23458);
            D.23505 = sgen_los_object_size (bigobj);
            fprintf (gc_debug_file.188, "Marked large object %p (%s) size: %lu from roots\n", D.23458, D.23504, D.23505);
            gc_debug_file.188 = gc_debug_file;
            fflush (gc_debug_file.188);
            <D.23503>:
            if (profile_roots != 0) goto <D.23506>; else goto <D.23507>;
            <D.23506>:
            D.23458 = &bigobj->data;
            add_profile_gc_root (&root_report, D.23458, 260, 0);
            <D.23507>:
            <D.23463>:
          }
        finally
          {
            dummy = {CLOBBER};
          }
      }
      <D.20661>:
      bigobj = bigobj->next;
      <D.20663>:
      if (bigobj != 0B) goto <D.20662>; else goto <D.20664>;
      <D.20664>:
      if (profile_roots != 0) goto <D.23508>; else goto <D.23509>;
      <D.23508>:
      notify_gc_roots (&root_report);
      <D.23509>:
      concurrent_collection_in_progress.199 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.199 != 0) goto <D.23512>; else goto <D.23513>;
      <D.23512>:
      iftmp.198 = current_object_ops.scan_object;
      goto <D.23514>;
      <D.23513>:
      iftmp.198 = 0B;
      <D.23514>:
      ctx.scan_func = iftmp.198;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      concurrent_collection_in_progress.200 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.200 != 0) goto <D.23518>; else goto <D.23515>;
      <D.23518>:
      D.23519 = sgen_minor_collector.is_split;
      if (D.23519 != 0) goto <D.23520>; else goto <D.23515>;
      <D.23520>:
      scan_nursery_objects (ctx);
      goto <D.23516>;
      <D.23515>:
      nursery_section.185 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.185, ctx);
      check_nursery_objects_pinned.201 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.201 != 0) goto <D.23522>; else goto <D.23523>;
      <D.23522>:
      D.23519 = sgen_minor_collector.is_split;
      if (D.23519 == 0) goto <D.23524>; else goto <D.23525>;
      <D.23524>:
      concurrent_collection_in_progress.203 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.203 == 0) goto <D.23527>; else goto <D.23531>;
      <D.23531>:
      if (finish_up_concurrent_mark != 0) goto <D.23527>; else goto <D.23528>;
      <D.23527>:
      iftmp.202 = 1;
      goto <D.23529>;
      <D.23528>:
      iftmp.202 = 0;
      <D.23529>:
      sgen_check_nursery_objects_pinned (iftmp.202);
      <D.23525>:
      <D.23523>:
      <D.23516>:
      D.23532 = major_collector.pin_objects;
      D.23532 (&gray_queue);
      if (old_next_pin_slot != 0B) goto <D.23533>; else goto <D.23534>;
      <D.23533>:
      D.23535 = sgen_get_pinned_count ();
      *old_next_pin_slot = D.23535;
      <D.23534>:
      btv = mono_100ns_ticks ();
      D.23414 = btv - atv;
      D.23415 = D.23414 / 10;
      D.23416 = (int) D.23415;
      D.23417 = (long long int) D.23416;
      time_major_pinning.204 = time_major_pinning;
      time_major_pinning.205 = D.23417 + time_major_pinning.204;
      time_major_pinning = time_major_pinning.205;
      gc_debug_level.206 = gc_debug_level;
      D.23539 = gc_debug_level.206 > 1;
      D.23540 = (long int) D.23539;
      D.23541 = __builtin_expect (D.23540, 0);
      if (D.23541 != 0) goto <D.23542>; else goto <D.23543>;
      <D.23542>:
      gc_debug_file.188 = gc_debug_file;
      D.23544 = sgen_get_pinned_count ();
      D.23414 = btv - atv;
      D.23415 = D.23414 / 10;
      D.23416 = (int) D.23415;
      fprintf (gc_debug_file.188, "Finding pinned pointers: %d in %d usecs\n", D.23544, D.23416);
      gc_debug_file.188 = gc_debug_file;
      fflush (gc_debug_file.188);
      <D.23543>:
      if (0 != 0) goto <D.23545>; else goto <D.23546>;
      <D.23545>:
      gc_debug_file.188 = gc_debug_file;
      D.23547 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.188, "Start scan with %d pinned objects\n", D.23547);
      gc_debug_file.188 = gc_debug_file;
      fflush (gc_debug_file.188);
      <D.23546>:
      D.23548 = major_collector.init_to_space;
      D.23548 ();
      concurrent_collection_in_progress.207 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.207 == 0) goto <D.23550>; else goto <D.23551>;
      <D.23550>:
      D.23552 = major_collector.is_parallel;
      if (D.23552 != 0) goto <D.23553>; else goto <D.23554>;
      <D.23553>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.23554>:
      <D.23551>:
      D.23555 = mono_profiler_get_events ();
      D.23556 = D.23555 & 1048576;
      if (D.23556 != 0) goto <D.23557>; else goto <D.23558>;
      <D.23557>:
      report_registered_roots ();
      <D.23558>:
      atv = mono_100ns_ticks ();
      D.23559 = atv - btv;
      D.23560 = D.23559 / 10;
      D.23561 = (int) D.23560;
      D.23562 = (long long int) D.23561;
      time_major_scan_pinned.208 = time_major_scan_pinned;
      time_major_scan_pinned.209 = D.23562 + time_major_scan_pinned.208;
      time_major_scan_pinned = time_major_scan_pinned.209;
      scrrjd_normal = sgen_alloc_internal_dynamic (20, 20, 1);
      D.23565 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.23565;
      D.23566 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.23566;
      scrrjd_normal->heap_start = heap_start;
      scrrjd_normal->heap_end = heap_end;
      scrrjd_normal->root_type = 0;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_normal);
      scrrjd_wbarrier = sgen_alloc_internal_dynamic (20, 20, 1);
      D.23565 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.23565;
      D.23566 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.23566;
      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.23414 = btv - atv;
      D.23415 = D.23414 / 10;
      D.23416 = (int) D.23415;
      D.23417 = (long long int) D.23416;
      time_major_scan_registered_roots.210 = time_major_scan_registered_roots;
      time_major_scan_registered_roots.211 = D.23417 + time_major_scan_registered_roots.210;
      time_major_scan_registered_roots = time_major_scan_registered_roots.211;
      stdjd = sgen_alloc_internal_dynamic (8, 20, 1);
      stdjd->heap_start = heap_start;
      stdjd->heap_end = heap_end;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.23559 = atv - btv;
      D.23560 = D.23559 / 10;
      D.23561 = (int) D.23560;
      D.23562 = (long long int) D.23561;
      time_major_scan_thread_data.212 = time_major_scan_thread_data;
      time_major_scan_thread_data.213 = D.23562 + time_major_scan_thread_data.212;
      time_major_scan_thread_data = time_major_scan_thread_data.213;
      btv = mono_100ns_ticks ();
      D.23414 = btv - atv;
      D.23415 = D.23414 / 10;
      D.23416 = (int) D.23415;
      D.23417 = (long long int) D.23416;
      time_major_scan_alloc_pinned.214 = time_major_scan_alloc_pinned;
      time_major_scan_alloc_pinned.215 = D.23417 + time_major_scan_alloc_pinned.214;
      time_major_scan_alloc_pinned = time_major_scan_alloc_pinned.215;
      D.23573 = mono_profiler_get_events ();
      D.23574 = D.23573 & 1048576;
      if (D.23574 != 0) goto <D.23575>; else goto <D.23576>;
      <D.23575>:
      report_finalizer_roots ();
      <D.23576>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (4, 20, 1);
      fin_ready_list.216 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.216;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (4, 20, 1);
      critical_fin_list.217 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.217;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      if (scan_mod_union != 0) goto <D.23579>; else goto <D.23580>;
      <D.23579>:
      D.23467 = finish_up_concurrent_mark == 0;
      D.23468 = (long int) D.23467;
      D.23469 = __builtin_expect (D.23468, 0);
      if (D.23469 != 0) goto <D.23581>; else goto <D.23582>;
      <D.23581>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3038, "finish_up_concurrent_mark");
      <D.23582>:
      sgen_workers_enqueue_job (job_scan_major_mod_union_cardtable, 0B);
      sgen_workers_enqueue_job (job_scan_los_mod_union_cardtable, 0B);
      <D.23580>:
      atv = mono_100ns_ticks ();
      D.23559 = atv - btv;
      D.23560 = D.23559 / 10;
      D.23561 = (int) D.23560;
      D.23562 = (long long int) D.23561;
      time_major_scan_finalized.218 = time_major_scan_finalized;
      time_major_scan_finalized.219 = D.23562 + time_major_scan_finalized.218;
      time_major_scan_finalized = time_major_scan_finalized.219;
      gc_debug_level.206 = gc_debug_level;
      D.23539 = gc_debug_level.206 > 1;
      D.23540 = (long int) D.23539;
      D.23541 = __builtin_expect (D.23540, 0);
      if (D.23541 != 0) goto <D.23585>; else goto <D.23586>;
      <D.23585>:
      gc_debug_file.188 = gc_debug_file;
      D.23559 = atv - btv;
      D.23560 = D.23559 / 10;
      D.23561 = (int) D.23560;
      fprintf (gc_debug_file.188, "Root scan: %d usecs\n", D.23561);
      gc_debug_file.188 = gc_debug_file;
      fflush (gc_debug_file.188);
      <D.23586>:
      btv = mono_100ns_ticks ();
      D.23414 = btv - atv;
      D.23415 = D.23414 / 10;
      D.23416 = (int) D.23415;
      D.23417 = (long long int) D.23416;
      time_major_scan_big_objects.220 = time_major_scan_big_objects;
      time_major_scan_big_objects.221 = D.23417 + time_major_scan_big_objects.220;
      time_major_scan_big_objects = time_major_scan_big_objects.221;
      concurrent_collection_in_progress.222 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.222 != 0) goto <D.23590>; else goto <D.23591>;
      <D.23590>:
      sgen_finish_pinning ();
      sgen_pin_stats_reset ();
      do_concurrent_checks.181 = do_concurrent_checks;
      if (do_concurrent_checks.181 != 0) goto <D.23592>; else goto <D.23593>;
      <D.23592>:
      check_nursery_is_clean ();
      <D.23593>:
      <D.23591>:
    }
  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.223;
  _Bool D.23597;
  long int D.23598;
  long int D.23599;
  struct SgenGrayQueue * D.23602;

  concurrent_collection_in_progress.223 = concurrent_collection_in_progress;
  D.23597 = concurrent_collection_in_progress.223 == 0;
  D.23598 = (long int) D.23597;
  D.23599 = __builtin_expect (D.23598, 0);
  if (D.23599 != 0) goto <D.23600>; else goto <D.23601>;
  <D.23600>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2390, "concurrent_collection_in_progress");
  <D.23601>:
  D.23602 = sgen_workers_get_job_gray_queue (worker_data);
  sgen_los_scan_card_table (1, D.23602);
}


sgen_workers_get_job_gray_queue (struct WorkerData * worker_data)
{
  struct SgenGrayQueue * D.23603;
  struct SgenGrayQueue * iftmp.224;

  if (worker_data != 0B) goto <D.23605>; else goto <D.23606>;
  <D.23605>:
  iftmp.224 = &worker_data->private_gray_queue;
  goto <D.23607>;
  <D.23606>:
  iftmp.224 = &gray_queue;
  <D.23607>:
  D.23603 = iftmp.224;
  return D.23603;
}


job_scan_major_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.225;
  _Bool D.23610;
  long int D.23611;
  long int D.23612;
  void (*<T2c4f>) (gboolean, struct SgenGrayQueue *) D.23615;
  struct SgenGrayQueue * D.23616;

  concurrent_collection_in_progress.225 = concurrent_collection_in_progress;
  D.23610 = concurrent_collection_in_progress.225 == 0;
  D.23611 = (long int) D.23610;
  D.23612 = __builtin_expect (D.23611, 0);
  if (D.23612 != 0) goto <D.23613>; else goto <D.23614>;
  <D.23613>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2383, "concurrent_collection_in_progress");
  <D.23614>:
  D.23615 = major_collector.scan_card_table;
  D.23616 = sgen_workers_get_job_gray_queue (worker_data);
  D.23615 (1, D.23616);
}


job_scan_finalizer_entries (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2b4d>) (void * *, struct SgenGrayQueue *) D.23617;
  struct SgenGrayQueue * D.23618;
  struct FinalizeReadyEntry * D.23619;
  struct ScanFinalizerEntriesJobData * job_data;
  struct ScanCopyContext ctx;

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


scan_finalizer_entries (struct FinalizeReadyEntry * list, struct ScanCopyContext ctx)
{
  void * D.23620;
  struct FILE * gc_debug_file.226;
  const char * D.23626;
  void * * D.23627;
  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.20388>;
  <D.20387>:
  D.23620 = fin->object;
  if (D.23620 == 0B) goto <D.23621>; else goto <D.23622>;
  <D.23621>:
  // predicted unlikely by continue predictor.
  goto <D.20386>;
  <D.23622>:
  if (0 != 0) goto <D.23623>; else goto <D.23624>;
  <D.23623>:
  gc_debug_file.226 = gc_debug_file;
  D.23620 = fin->object;
  D.23620 = fin->object;
  D.23626 = safe_name (D.23620);
  fprintf (gc_debug_file.226, "Scan of fin ready object: %p (%s)\n\n", D.23620, D.23626);
  gc_debug_file.226 = gc_debug_file;
  fflush (gc_debug_file.226);
  <D.23624>:
  D.23627 = &fin->object;
  copy_func (D.23627, queue);
  <D.20386>:
  fin = fin->next;
  <D.20388>:
  if (fin != 0B) goto <D.20387>; else goto <D.20389>;
  <D.20389>:
}


job_scan_thread_data (struct WorkerData * worker_data, void * job_data_untyped)
{
  char * D.23628;
  char * D.23629;
  struct SgenGrayQueue * D.23630;
  struct ScanThreadDataJobData * job_data;

  job_data = job_data_untyped;
  D.23628 = job_data->heap_start;
  D.23629 = job_data->heap_end;
  D.23630 = sgen_workers_get_job_gray_queue (worker_data);
  scan_thread_data (D.23628, D.23629, 1, D.23630);
  sgen_free_internal_dynamic (job_data, 8, 20);
}


scan_thread_data (void * start_nursery, void * end_nursery, gboolean precise, struct GrayQueue * queue)
{
  struct MonoLinkedListSet * D.23631;
  struct MonoLinkedListSetNode * D.23632;
  unsigned int D.23633;
  int D.23636;
  struct FILE * gc_debug_file.227;
  void * D.23642;
  void * D.23643;
  int D.23644;
  int D.23645;
  int D.23646;
  int D.23647;
  int D.23652;
  int D.23653;
  int D.23660;
  void (*<T2a06>) (void *, guint8 *, guint8 *, gboolean) D.23663;
  int conservative_stack_mark.228;
  void * D.23667;
  struct _IO_FILE * stderr.229;
  struct MonoContext * D.23675;
  void * * D.23676;
  struct SgenThreadInfo * info;

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

    D.23631 = mono_thread_info_list_head ();
    __cur = D.23631->head;
    goto <D.20892>;
    <D.20891>:
    D.23632 = __cur->next;
    D.23633 = mono_lls_pointer_get_mark (D.23632);
    if (D.23633 == 0) goto <D.23634>; else goto <D.23635>;
    <D.23634>:
    info = __cur;
    D.23636 = info->skip;
    if (D.23636 != 0) goto <D.23637>; else goto <D.23638>;
    <D.23637>:
    if (0 != 0) goto <D.23639>; else goto <D.23640>;
    <D.23639>:
    gc_debug_file.227 = gc_debug_file;
    D.23642 = info->stack_start;
    D.23643 = info->stack_end;
    D.23643 = info->stack_end;
    D.23644 = (int) D.23643;
    D.23642 = info->stack_start;
    D.23645 = (int) D.23642;
    D.23646 = D.23644 - D.23645;
    fprintf (gc_debug_file.227, "Skipping dead thread %p, range: %p-%p, size: %td\n", info, D.23642, D.23643, D.23646);
    gc_debug_file.227 = gc_debug_file;
    fflush (gc_debug_file.227);
    <D.23640>:
    // predicted unlikely by continue predictor.
    goto <D.20889>;
    <D.23638>:
    D.23647 = info->gc_disabled;
    if (D.23647 != 0) goto <D.23648>; else goto <D.23649>;
    <D.23648>:
    if (0 != 0) goto <D.23650>; else goto <D.23651>;
    <D.23650>:
    gc_debug_file.227 = gc_debug_file;
    D.23642 = info->stack_start;
    D.23643 = info->stack_end;
    D.23643 = info->stack_end;
    D.23644 = (int) D.23643;
    D.23642 = info->stack_start;
    D.23645 = (int) D.23642;
    D.23646 = D.23644 - D.23645;
    fprintf (gc_debug_file.227, "GC disabled for thread %p, range: %p-%p, size: %td\n", info, D.23642, D.23643, D.23646);
    gc_debug_file.227 = gc_debug_file;
    fflush (gc_debug_file.227);
    <D.23651>:
    // predicted unlikely by continue predictor.
    goto <D.20889>;
    <D.23649>:
    D.23652 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.23653 = D.23652 & 15;
    if (D.23653 != 1) goto <D.23654>; else goto <D.23655>;
    <D.23654>:
    if (0 != 0) goto <D.23656>; else goto <D.23657>;
    <D.23656>:
    gc_debug_file.227 = gc_debug_file;
    D.23642 = info->stack_start;
    D.23643 = info->stack_end;
    D.23643 = info->stack_end;
    D.23644 = (int) D.23643;
    D.23642 = info->stack_start;
    D.23645 = (int) D.23642;
    D.23646 = D.23644 - D.23645;
    D.23652 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.23653 = D.23652 & 15;
    fprintf (gc_debug_file.227, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)\n", info, D.23642, D.23643, D.23646, D.23653);
    gc_debug_file.227 = gc_debug_file;
    fflush (gc_debug_file.227);
    <D.23657>:
    // predicted unlikely by continue predictor.
    goto <D.20889>;
    <D.23655>:
    if (0 != 0) goto <D.23658>; else goto <D.23659>;
    <D.23658>:
    gc_debug_file.227 = gc_debug_file;
    D.23642 = info->stack_start;
    D.23643 = info->stack_end;
    D.23643 = info->stack_end;
    D.23644 = (int) D.23643;
    D.23642 = info->stack_start;
    D.23645 = (int) D.23642;
    D.23646 = D.23644 - D.23645;
    D.23660 = sgen_get_pinned_count ();
    fprintf (gc_debug_file.227, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d\n", info, D.23642, D.23643, D.23646, D.23660);
    gc_debug_file.227 = gc_debug_file;
    fflush (gc_debug_file.227);
    <D.23659>:
    D.23663 = gc_callbacks.thread_mark_func;
    if (D.23663 != 0B) goto <D.23664>; else goto <D.23661>;
    <D.23664>:
    conservative_stack_mark.228 = conservative_stack_mark;
    if (conservative_stack_mark.228 == 0) goto <D.23666>; else goto <D.23661>;
    <D.23666>:
    {
      struct UserCopyOrMarkData data;

      try
        {
          data.func = 0B;
          data.queue = queue;
          set_user_copy_or_mark_data (&data);
          D.23663 = gc_callbacks.thread_mark_func;
          D.23667 = info->runtime_data;
          D.23642 = info->stack_start;
          D.23643 = info->stack_end;
          D.23663 (D.23667, D.23642, D.23643, precise);
          set_user_copy_or_mark_data (0B);
        }
      finally
        {
          data = {CLOBBER};
        }
    }
    goto <D.23662>;
    <D.23661>:
    if (precise == 0) goto <D.23668>; else goto <D.23669>;
    <D.23668>:
    conservative_stack_mark.228 = conservative_stack_mark;
    if (conservative_stack_mark.228 == 0) goto <D.23670>; else goto <D.23671>;
    <D.23670>:
    stderr.229 = stderr;
    fprintf (stderr.229, "Precise stack mark not supported - disabling.\n");
    conservative_stack_mark = 1;
    <D.23671>:
    D.23642 = info->stack_start;
    D.23643 = info->stack_end;
    conservatively_pin_objects_from (D.23642, D.23643, start_nursery, end_nursery, 0);
    <D.23669>:
    <D.23662>:
    if (precise == 0) goto <D.23673>; else goto <D.23674>;
    <D.23673>:
    D.23675 = &info->ctx;
    D.23675 = &info->ctx;
    D.23676 = D.23675 + 128;
    conservatively_pin_objects_from (D.23675, D.23676, start_nursery, end_nursery, 0);
    <D.23674>:
    <D.23635>:
    <D.20889>:
    D.23632 = __cur->next;
    __cur = mono_lls_pointer_unmask (D.23632);
    <D.20892>:
    if (__cur != 0B) goto <D.20891>; else goto <D.20893>;
    <D.20893>:
  }
}


mono_lls_pointer_get_mark (void * n)
{
  uintptr_t D.23677;
  unsigned int n.230;

  n.230 = (unsigned int) n;
  D.23677 = n.230 & 1;
  return D.23677;
}


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

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


mono_native_tls_set_value (pthread_key_t key, void * value)
{
  int D.23681;
  int D.23682;
  _Bool D.23683;

  D.23682 = pthread_setspecific (key, value);
  D.23683 = D.23682 == 0;
  D.23681 = (int) D.23683;
  return D.23681;
}


conservatively_pin_objects_from (void * * start, void * * end, void * start_nursery, void * end_nursery, int pin_type)
{
  volatile unsigned int D.20205;
  unsigned int start.232;
  int end.233;
  int start.234;
  int D.23688;
  unsigned int D.23689;
  void * D.23690;
  unsigned int start_nursery.235;
  unsigned int end_nursery.236;
  struct FILE * gc_debug_file.237;
  void * addr.238;
  int do_pin_stats.239;
  _Bool D.23706;
  long int D.23707;
  long int D.23708;
  int D.23711;
  char * addr.240;
  int count;

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

    _zzq_args[0] = 1296236555;
    start.232 = (unsigned int) start;
    _zzq_args[1] = start.232;
    end.233 = (int) end;
    start.234 = (int) start;
    D.23688 = end.233 - start.234;
    D.23689 = (unsigned int) D.23688;
    _zzq_args[2] = D.23689;
    _zzq_args[3] = 0;
    _zzq_args[4] = 0;
    _zzq_args[5] = 0;
    __asm__ __volatile__("move $11, %1
	move $12, %2
	srl $0, $0, 13
	srl $0, $0, 29
	srl $0, $0, 3
	srl $0, $0, 19
	or $13, $13, $13
	move %0, $11
	" : "=r" _zzq_result : "r" 0, "r" &_zzq_args[0] : "t4", "t3", "memory", "cc");
    D.20205 = _zzq_result;
  }
  goto <D.20208>;
  <D.20207>:
  D.23690 = *start;
  if (D.23690 >= start_nursery) goto <D.23691>; else goto <D.23692>;
  <D.23691>:
  D.23690 = *start;
  if (D.23690 < end_nursery) goto <D.23693>; else goto <D.23694>;
  <D.23693>:
  {
    mword addr;

    D.23690 = *start;
    addr = (mword) D.23690;
    addr = addr & 4294967288;
    start_nursery.235 = (unsigned int) start_nursery;
    if (start_nursery.235 <= addr) goto <D.23696>; else goto <D.23697>;
    <D.23696>:
    end_nursery.236 = (unsigned int) end_nursery;
    if (end_nursery.236 > addr) goto <D.23699>; else goto <D.23700>;
    <D.23699>:
    if (0 != 0) goto <D.23701>; else goto <D.23702>;
    <D.23701>:
    gc_debug_file.237 = gc_debug_file;
    addr.238 = (void *) addr;
    fprintf (gc_debug_file.237, "Pinning address %p from %p\n", addr.238, start);
    gc_debug_file.237 = gc_debug_file;
    fflush (gc_debug_file.237);
    <D.23702>:
    addr.238 = (void *) addr;
    sgen_pin_stage_ptr (addr.238);
    count = count + 1;
    <D.23700>:
    <D.23697>:
    do_pin_stats.239 = do_pin_stats;
    D.23706 = do_pin_stats.239 != 0;
    D.23707 = (long int) D.23706;
    D.23708 = __builtin_expect (D.23707, 0);
    if (D.23708 != 0) goto <D.23709>; else goto <D.23710>;
    <D.23709>:
    addr.238 = (void *) addr;
    D.23711 = sgen_ptr_in_nursery (addr.238);
    if (D.23711 != 0) goto <D.23712>; else goto <D.23713>;
    <D.23712>:
    addr.240 = (char *) addr;
    sgen_pin_stats_register_address (addr.240, pin_type);
    <D.23713>:
    <D.23710>:
  }
  <D.23694>:
  <D.23692>:
  start = start + 4;
  <D.20208>:
  if (start < end) goto <D.20207>; else goto <D.20209>;
  <D.20209>:
  if (count != 0) goto <D.23715>; else goto <D.23716>;
  <D.23715>:
  if (0 != 0) goto <D.23717>; else goto <D.23718>;
  <D.23717>:
  gc_debug_file.237 = gc_debug_file;
  fprintf (gc_debug_file.237, "found %d potential pinned heap pointers\n", count);
  gc_debug_file.237 = gc_debug_file;
  fflush (gc_debug_file.237);
  <D.23718>:
  <D.23716>:
}


mono_lls_pointer_unmask (void * p)
{
  void * D.23719;
  unsigned int p.241;
  unsigned int D.23721;

  p.241 = (unsigned int) p;
  D.23721 = p.241 & 4294967292;
  D.23719 = (void *) D.23721;
  return D.23719;
}


job_scan_from_registered_roots (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2b52>) (char *, struct SgenGrayQueue *) D.23723;
  void (*<T2b4d>) (void * *, struct SgenGrayQueue *) D.23724;
  struct SgenGrayQueue * D.23725;
  char * D.23726;
  char * D.23727;
  int D.23728;
  struct ScanFromRegisteredRootsJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      D.23723 = job_data->scan_func;
      ctx.scan_func = D.23723;
      D.23724 = job_data->copy_or_mark_func;
      ctx.copy_func = D.23724;
      D.23725 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.23725;
      D.23726 = job_data->heap_start;
      D.23727 = job_data->heap_end;
      D.23728 = job_data->root_type;
      scan_from_registered_roots (D.23726, D.23727, D.23728, ctx);
      sgen_free_internal_dynamic (job_data, 20, 20);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


scan_from_registered_roots (char * addr_start, char * addr_end, int root_type, struct ScanCopyContext ctx)
{
  unsigned int D.23729;
  struct FILE * gc_debug_file.242;
  char * D.23733;
  unsigned int D.23734;
  void * D.23735;
  struct SgenHashTableEntry * D.23736;
  unsigned int D.23737;
  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.20450>;
    <D.20449>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.23729 = __i * 4;
      __iter = __table + D.23729;
      goto <D.20447>;
      <D.20446>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.23730>; else goto <D.23731>;
        <D.23730>:
        gc_debug_file.242 = gc_debug_file;
        D.23733 = root->end_root;
        D.23734 = root->root_desc;
        D.23735 = (void *) D.23734;
        fprintf (gc_debug_file.242, "Precise root scan %p-%p (desc: %p)\n", start_root, D.23733, D.23735);
        gc_debug_file.242 = gc_debug_file;
        fflush (gc_debug_file.242);
        <D.23731>:
        D.23733 = root->end_root;
        D.23734 = root->root_desc;
        precisely_scan_objects_from (start_root, D.23733, addr_start, addr_end, D.23734, ctx);
      }
      __iter = __next;
      <D.20447>:
      D.23736 = *__iter;
      if (D.23736 != 0B) goto <D.20446>; else goto <D.20448>;
      <D.20448>:
    }
    __i = __i + 1;
    <D.20450>:
    D.23737 = roots_hash[root_type].size;
    if (D.23737 > __i) goto <D.20449>; else goto <D.20451>;
    <D.20451>:
  }
}


precisely_scan_objects_from (void * * start_root, void * * end_root, char * n_start, char * n_end, mword desc, struct ScanCopyContext ctx)
{
  unsigned int D.23738;
  unsigned int D.23739;
  void * D.23742;
  struct FILE * gc_debug_file.243;
  unsigned int D.23748;
  unsigned int D.23749;
  gsize * bitmap_data.244;
  unsigned int D.23751;
  void * D.23754;
  int bwords.245;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct SgenGrayQueue * queue;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  D.23738 = desc & 7;
  switch (D.23738) <default: <D.20281>, case 1: <D.20260>, case 2: <D.20280>, case 3: <D.20264>, case 4: <D.20277>>
  <D.20260>:
  desc = desc >> 3;
  goto <D.20262>;
  <D.20261>:
  D.23739 = desc & 1;
  if (D.23739 != 0) goto <D.23740>; else goto <D.23741>;
  <D.23740>:
  D.23742 = *start_root;
  if (D.23742 != 0B) goto <D.23743>; else goto <D.23744>;
  <D.23743>:
  copy_func (start_root, queue);
  if (0 != 0) goto <D.23745>; else goto <D.23746>;
  <D.23745>:
  gc_debug_file.243 = gc_debug_file;
  D.23742 = *start_root;
  fprintf (gc_debug_file.243, "Overwrote root at %p with %p\n", start_root, D.23742);
  gc_debug_file.243 = gc_debug_file;
  fflush (gc_debug_file.243);
  <D.23746>:
  sgen_drain_gray_stack (-1, ctx);
  <D.23744>:
  <D.23741>:
  desc = desc >> 1;
  start_root = start_root + 4;
  <D.20262>:
  if (desc != 0) goto <D.20261>; else goto <D.20263>;
  <D.20263>:
  return;
  <D.20264>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.23748 = *bitmap_data;
    D.23749 = D.23748 + 4294967295;
    bwords = (int) D.23749;
    start_run = start_root;
    bitmap_data = bitmap_data + 4;
    goto <D.20274>;
    <D.20273>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.244 = bitmap_data;
      bitmap_data = bitmap_data.244 + 4;
      bmap = *bitmap_data.244;
      objptr = start_run;
      goto <D.20271>;
      <D.20270>:
      D.23751 = bmap & 1;
      if (D.23751 != 0) goto <D.23752>; else goto <D.23753>;
      <D.23752>:
      D.23754 = *objptr;
      if (D.23754 != 0B) goto <D.23755>; else goto <D.23756>;
      <D.23755>:
      copy_func (objptr, queue);
      if (0 != 0) goto <D.23757>; else goto <D.23758>;
      <D.23757>:
      gc_debug_file.243 = gc_debug_file;
      D.23754 = *objptr;
      fprintf (gc_debug_file.243, "Overwrote root at %p with %p\n", objptr, D.23754);
      gc_debug_file.243 = gc_debug_file;
      fflush (gc_debug_file.243);
      <D.23758>:
      sgen_drain_gray_stack (-1, ctx);
      <D.23756>:
      <D.23753>:
      bmap = bmap >> 1;
      objptr = objptr + 4;
      <D.20271>:
      if (bmap != 0) goto <D.20270>; else goto <D.20272>;
      <D.20272>:
      start_run = start_run + 128;
    }
    <D.20274>:
    bwords.245 = bwords;
    bwords = bwords.245 + -1;
    if (bwords.245 > 0) goto <D.20273>; else goto <D.20275>;
    <D.20275>:
    goto <D.20276>;
  }
  <D.20277>:
  {
    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.20276>;
      }
    finally
      {
        data = {CLOBBER};
      }
  }
  <D.20280>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1637);
  <D.20281>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1639);
  <D.20276>:
}


single_arg_user_copy_or_mark (void * * obj)
{
  unsigned int user_copy_or_mark_key.246;
  void (*<T2b4d>) (void * *, struct SgenGrayQueue *) D.23763;
  struct GrayQueue * D.23764;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.246 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.246);
  D.23763 = data->func;
  D.23764 = data->queue;
  D.23763 (obj, D.23764);
}


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


init_gray_queue ()
{
  int D.23768;
  int D.23770;
  struct SgenSectionGrayQueue * D.23771;

  D.23768 = sgen_collection_is_parallel ();
  if (D.23768 != 0) goto <D.23765>; else goto <D.23769>;
  <D.23769>:
  D.23770 = sgen_collection_is_concurrent ();
  if (D.23770 != 0) goto <D.23765>; else goto <D.23766>;
  <D.23765>:
  sgen_workers_init_distribute_gray_queue ();
  D.23771 = sgen_workers_get_distribute_section_gray_queue ();
  sgen_gray_object_queue_init_with_alloc_prepare (&gray_queue, 0B, gray_queue_redirect, D.23771);
  goto <D.23767>;
  <D.23766>:
  sgen_gray_object_queue_init (&gray_queue, 0B);
  <D.23767>:
}


gray_queue_redirect (struct SgenGrayQueue * queue)
{
  void * D.23773;
  int iftmp.247;
  int concurrent_collection_in_progress.248;
  int current_collection_generation.249;
  int D.23784;
  _Bool D.23785;
  long int D.23786;
  long int D.23787;
  int D.23790;
  int concurrent_collection_in_progress.250;
  _Bool D.23797;
  long int D.23798;
  long int D.23799;
  gboolean wake;

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

    section = sgen_gray_object_dequeue_section (queue);
    if (section == 0B) goto <D.19573>; else goto <D.23772>;
    <D.23772>:
    D.23773 = queue->alloc_prepare_data;
    sgen_section_gray_queue_enqueue (D.23773, section);
    wake = 1;
  }
  goto <D.19574>;
  <D.19573>:
  if (wake != 0) goto <D.23774>; else goto <D.23775>;
  <D.23774>:
  concurrent_collection_in_progress.248 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.248 == 0) goto <D.23781>; else goto <D.23777>;
  <D.23781>:
  current_collection_generation.249 = current_collection_generation;
  if (current_collection_generation.249 != 1) goto <D.23778>; else goto <D.23783>;
  <D.23783>:
  D.23784 = major_collector.is_parallel;
  if (D.23784 == 0) goto <D.23778>; else goto <D.23777>;
  <D.23778>:
  iftmp.247 = 1;
  goto <D.23779>;
  <D.23777>:
  iftmp.247 = 0;
  <D.23779>:
  D.23785 = iftmp.247 != 0;
  D.23786 = (long int) D.23785;
  D.23787 = __builtin_expect (D.23786, 0);
  if (D.23787 != 0) goto <D.23788>; else goto <D.23789>;
  <D.23788>:
  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.23789>:
  D.23790 = sgen_workers_have_started ();
  if (D.23790 != 0) goto <D.23791>; else goto <D.23792>;
  <D.23791>:
  sgen_workers_wake_up_all ();
  goto <D.23793>;
  <D.23792>:
  concurrent_collection_in_progress.250 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.250 != 0) goto <D.23795>; else goto <D.23796>;
  <D.23795>:
  current_collection_generation.249 = current_collection_generation;
  D.23797 = current_collection_generation.249 != -1;
  D.23798 = (long int) D.23797;
  D.23799 = __builtin_expect (D.23798, 0);
  if (D.23799 != 0) goto <D.23800>; else goto <D.23801>;
  <D.23800>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 607, "current_collection_generation == -1");
  <D.23801>:
  <D.23796>:
  <D.23793>:
  <D.23775>:
}


pin_from_roots (void * start_nursery, void * end_nursery, struct GrayQueue * queue)
{
  int gc_debug_level.251;
  _Bool D.23803;
  long int D.23804;
  long int D.23805;
  struct FILE * gc_debug_file.252;
  unsigned int roots_size.253;
  int roots_size.254;
  unsigned int D.23811;
  unsigned int D.23812;
  unsigned int D.23813;
  char * D.23816;
  struct SgenHashTableEntry * D.23817;
  unsigned int D.23818;
  void * * start_root;
  struct RootRecord * root;

  gc_debug_level.251 = gc_debug_level;
  D.23803 = gc_debug_level.251 > 1;
  D.23804 = (long int) D.23803;
  D.23805 = __builtin_expect (D.23804, 0);
  if (D.23805 != 0) goto <D.23806>; else goto <D.23807>;
  <D.23806>:
  gc_debug_file.252 = gc_debug_file;
  roots_size.253 = roots_size;
  roots_size.254 = (int) roots_size.253;
  D.23811 = roots_hash[0].num_entries;
  D.23812 = roots_hash[1].num_entries;
  fprintf (gc_debug_file.252, "Scanning pinned roots (%d bytes, %d/%d entries)\n", roots_size.254, D.23811, D.23812);
  gc_debug_file.252 = gc_debug_file;
  fflush (gc_debug_file.252);
  <D.23807>:
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

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

      D.23813 = __i * 4;
      __iter = __table + D.23813;
      goto <D.20224>;
      <D.20223>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.23814>; else goto <D.23815>;
        <D.23814>:
        gc_debug_file.252 = gc_debug_file;
        D.23816 = root->end_root;
        fprintf (gc_debug_file.252, "Pinned roots %p-%p\n", start_root, D.23816);
        gc_debug_file.252 = gc_debug_file;
        fflush (gc_debug_file.252);
        <D.23815>:
        D.23816 = root->end_root;
        conservatively_pin_objects_from (start_root, D.23816, start_nursery, end_nursery, 2);
      }
      __iter = __next;
      <D.20224>:
      D.23817 = *__iter;
      if (D.23817 != 0B) goto <D.20223>; else goto <D.20225>;
      <D.20225>:
    }
    __i = __i + 1;
    <D.20227>:
    D.23818 = roots_hash[1].size;
    if (D.23818 > __i) goto <D.20226>; else goto <D.20228>;
    <D.20228>:
  }
  scan_thread_data (start_nursery, end_nursery, 0, queue);
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.23819;
  gboolean D.23822;
  unsigned int D.23823;
  unsigned int D.23826;

  D.23819 = desc & 4294901767;
  if (D.23819 == 1) goto <D.23820>; else goto <D.23821>;
  <D.23820>:
  D.23822 = 0;
  return D.23822;
  <D.23821>:
  D.23823 = desc & 49159;
  if (D.23823 == 4) goto <D.23824>; else goto <D.23825>;
  <D.23824>:
  D.23822 = 0;
  return D.23822;
  <D.23825>:
  D.23826 = desc & 7;
  if (D.23826 == 7) goto <D.23827>; else goto <D.23828>;
  <D.23827>:
  D.23822 = 0;
  return D.23822;
  <D.23828>:
  D.23822 = 1;
  return D.23822;
}


scan_nursery_objects (struct ScanCopyContext ctx)
{
  struct GCMemSection * nursery_section.255;
  char * D.23831;
  char * D.23832;

  nursery_section.255 = nursery_section;
  D.23831 = nursery_section.255->data;
  nursery_section.255 = nursery_section;
  D.23832 = nursery_section.255->end_data;
  sgen_scan_area_with_callback (D.23831, D.23832, scan_nursery_objects_callback, &ctx, 0);
}


scan_nursery_objects_callback (char * obj, size_t size, struct ScanCopyContext * ctx)
{
  void (*<T2b52>) (char *, struct SgenGrayQueue *) D.23833;
  struct SgenGrayQueue * D.23834;

  D.23833 = ctx->scan_func;
  D.23834 = ctx->queue;
  D.23833 (obj, D.23834);
}


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


report_registered_roots_by_type (int root_type)
{
  unsigned int D.23835;
  struct FILE * gc_debug_file.256;
  char * D.23839;
  unsigned int D.23840;
  void * D.23841;
  struct SgenHashTableEntry * D.23842;
  unsigned int D.23843;
  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.20374>;
        <D.20373>:
        {
          struct SgenHashTableEntry * * __iter;
          struct SgenHashTableEntry * * __next;

          D.23835 = __i * 4;
          __iter = __table + D.23835;
          goto <D.20371>;
          <D.20370>:
          {
            struct SgenHashTableEntry * __entry;

            __entry = *__iter;
            __next = &__entry->next;
            start_root = __entry->key;
            root = &__entry->data;
            if (0 != 0) goto <D.23836>; else goto <D.23837>;
            <D.23836>:
            gc_debug_file.256 = gc_debug_file;
            D.23839 = root->end_root;
            D.23840 = root->root_desc;
            D.23841 = (void *) D.23840;
            fprintf (gc_debug_file.256, "Precise root scan %p-%p (desc: %p)\n", start_root, D.23839, D.23841);
            gc_debug_file.256 = gc_debug_file;
            fflush (gc_debug_file.256);
            <D.23837>:
            D.23839 = root->end_root;
            D.23840 = root->root_desc;
            precisely_report_roots_from (&report, start_root, D.23839, D.23840);
          }
          __iter = __next;
          <D.20371>:
          D.23842 = *__iter;
          if (D.23842 != 0B) goto <D.20370>; else goto <D.20372>;
          <D.20372>:
        }
        __i = __i + 1;
        <D.20374>:
        D.23843 = roots_hash[root_type].size;
        if (D.23843 > __i) goto <D.20373>; else goto <D.20375>;
        <D.20375>:
      }
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


precisely_report_roots_from (struct GCRootReport * report, void * * start_root, void * * end_root, mword desc)
{
  unsigned int D.23844;
  unsigned int D.23845;
  void * D.23848;
  unsigned int D.23851;
  unsigned int D.23852;
  gsize * bitmap_data.257;
  unsigned int D.23854;
  void * D.23857;
  int bwords.258;

  D.23844 = desc & 7;
  switch (D.23844) <default: <D.20357>, case 1: <D.20337>, case 2: <D.20356>, case 3: <D.20341>, case 4: <D.20354>>
  <D.20337>:
  desc = desc >> 3;
  goto <D.20339>;
  <D.20338>:
  D.23845 = desc & 1;
  if (D.23845 != 0) goto <D.23846>; else goto <D.23847>;
  <D.23846>:
  D.23848 = *start_root;
  if (D.23848 != 0B) goto <D.23849>; else goto <D.23850>;
  <D.23849>:
  D.23848 = *start_root;
  add_profile_gc_root (report, D.23848, 3, 0);
  <D.23850>:
  <D.23847>:
  desc = desc >> 1;
  start_root = start_root + 4;
  <D.20339>:
  if (desc != 0) goto <D.20338>; else goto <D.20340>;
  <D.20340>:
  return;
  <D.20341>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.23851 = *bitmap_data;
    D.23852 = D.23851 + 4294967295;
    bwords = (int) D.23852;
    start_run = start_root;
    bitmap_data = bitmap_data + 4;
    goto <D.20351>;
    <D.20350>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.257 = bitmap_data;
      bitmap_data = bitmap_data.257 + 4;
      bmap = *bitmap_data.257;
      objptr = start_run;
      goto <D.20348>;
      <D.20347>:
      D.23854 = bmap & 1;
      if (D.23854 != 0) goto <D.23855>; else goto <D.23856>;
      <D.23855>:
      D.23857 = *objptr;
      if (D.23857 != 0B) goto <D.23858>; else goto <D.23859>;
      <D.23858>:
      D.23857 = *objptr;
      add_profile_gc_root (report, D.23857, 3, 0);
      <D.23859>:
      <D.23856>:
      bmap = bmap >> 1;
      objptr = objptr + 4;
      <D.20348>:
      if (bmap != 0) goto <D.20347>; else goto <D.20349>;
      <D.20349>:
      start_run = start_run + 128;
    }
    <D.20351>:
    bwords.258 = bwords;
    bwords = bwords.258 + -1;
    if (bwords.258 > 0) goto <D.20350>; else goto <D.20352>;
    <D.20352>:
    goto <D.20353>;
  }
  <D.20354>:
  {
    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.20353>;
  }
  <D.20356>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1821);
  <D.20357>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1823);
  <D.20353>:
}


single_arg_report_root (void * * obj)
{
  void * D.23862;
  struct GCRootReport * root_report.259;

  D.23862 = *obj;
  if (D.23862 != 0B) goto <D.23863>; else goto <D.23864>;
  <D.23863>:
  root_report.259 = root_report;
  D.23862 = *obj;
  add_profile_gc_root (root_report.259, D.23862, 3, 0);
  <D.23864>:
}


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

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


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

  try
    {
      report.count = 0;
      fin = list;
      goto <D.20322>;
      <D.20321>:
      D.23868 = fin->object;
      if (D.23868 == 0B) goto <D.23869>; else goto <D.23870>;
      <D.23869>:
      // predicted unlikely by continue predictor.
      goto <D.20320>;
      <D.23870>:
      D.23868 = fin->object;
      add_profile_gc_root (&report, D.23868, 1, 0);
      <D.20320>:
      fin = fin->next;
      <D.20322>:
      if (fin != 0B) goto <D.20321>; else goto <D.20323>;
      <D.20323>:
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


join_workers ()
{
  int concurrent_collection_in_progress.262;
  int D.23875;
  int D.23876;
  _Bool D.23877;
  long int D.23878;
  long int D.23879;

  concurrent_collection_in_progress.262 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.262 != 0) goto <D.23871>; else goto <D.23874>;
  <D.23874>:
  D.23875 = major_collector.is_parallel;
  if (D.23875 != 0) goto <D.23871>; else goto <D.23872>;
  <D.23871>:
  gray_queue_redirect (&gray_queue);
  sgen_workers_join ();
  <D.23872>:
  D.23876 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23877 = D.23876 == 0;
  D.23878 = (long int) D.23877;
  D.23879 = __builtin_expect (D.23878, 0);
  if (D.23879 != 0) goto <D.23880>; else goto <D.23881>;
  <D.23880>:
  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.23881>:
}


check_nursery_is_clean ()
{
  void * D.23882;
  int iftmp.263;
  unsigned int D.23888;
  unsigned int D.23889;
  unsigned int D.23891;
  _Bool D.23893;
  long int D.23894;
  long int D.23895;
  unsigned int D.23898;
  _Bool D.23899;
  long int D.23900;
  long int D.23901;
  unsigned int D.23904;
  unsigned int D.23905;
  char * D.23906;
  char * start;
  char * end;
  char * cur;

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

    D.23882 = MEM[(void * *)cur];
    if (D.23882 == 0B) goto <D.23883>; else goto <D.23884>;
    <D.23883>:
    cur = cur + 4;
    // predicted unlikely by continue predictor.
    goto <D.20604>;
    <D.23884>:
    D.23888 = MEM[(mword *)cur];
    D.23889 = D.23888 & 1;
    if (D.23889 != 0) goto <D.23890>; else goto <D.23886>;
    <D.23890>:
    D.23888 = MEM[(mword *)cur];
    D.23891 = D.23888 & 4294967292;
    if (D.23891 != 0) goto <D.23892>; else goto <D.23886>;
    <D.23892>:
    iftmp.263 = 1;
    goto <D.23887>;
    <D.23886>:
    iftmp.263 = 0;
    <D.23887>:
    D.23893 = iftmp.263 != 0;
    D.23894 = (long int) D.23893;
    D.23895 = __builtin_expect (D.23894, 0);
    if (D.23895 != 0) goto <D.23896>; else goto <D.23897>;
    <D.23896>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2468, "!object_is_forwarded (cur)");
    <D.23897>:
    D.23888 = MEM[(mword *)cur];
    D.23898 = D.23888 & 2;
    D.23899 = D.23898 != 0;
    D.23900 = (long int) D.23899;
    D.23901 = __builtin_expect (D.23900, 0);
    if (D.23901 != 0) goto <D.23902>; else goto <D.23903>;
    <D.23902>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2469, "!object_is_pinned (cur)");
    <D.23903>:
    ss = sgen_safe_object_get_size (cur);
    D.23904 = sgen_safe_object_get_size (cur);
    D.23905 = D.23904 + 7;
    size = D.23905 & 4294967288;
    D.23906 = cur + size;
    verify_scan_starts (cur, D.23906);
    cur = cur + size;
  }
  <D.20604>:
  if (cur < end) goto <D.20605>; else goto <D.20606>;
  <D.20606>:
}


verify_scan_starts (char * start, char * end)
{
  struct GCMemSection * nursery_section.264;
  char * * D.23908;
  unsigned int i.265;
  unsigned int D.23910;
  char * * D.23911;
  int gc_debug_level.266;
  _Bool D.23917;
  long int D.23918;
  long int D.23919;
  struct FILE * gc_debug_file.267;
  unsigned int D.23923;
  int i;

  i = 0;
  goto <D.20582>;
  <D.20581>:
  {
    char * addr;

    nursery_section.264 = nursery_section;
    D.23908 = nursery_section.264->scan_starts;
    i.265 = (unsigned int) i;
    D.23910 = i.265 * 4;
    D.23911 = D.23908 + D.23910;
    addr = *D.23911;
    if (addr > start) goto <D.23912>; else goto <D.23913>;
    <D.23912>:
    if (addr < end) goto <D.23914>; else goto <D.23915>;
    <D.23914>:
    gc_debug_level.266 = gc_debug_level;
    D.23917 = gc_debug_level.266 > 0;
    D.23918 = (long int) D.23917;
    D.23919 = __builtin_expect (D.23918, 0);
    if (D.23919 != 0) goto <D.23920>; else goto <D.23921>;
    <D.23920>:
    gc_debug_file.267 = gc_debug_file;
    fprintf (gc_debug_file.267, "NFC-BAD SCAN START [%d] %p for obj [%p %p]\n", i, addr, start, end);
    gc_debug_file.267 = gc_debug_file;
    fflush (gc_debug_file.267);
    <D.23921>:
    <D.23915>:
    <D.23913>:
  }
  i = i + 1;
  <D.20582>:
  i.265 = (unsigned int) i;
  nursery_section.264 = nursery_section;
  D.23923 = nursery_section.264->num_scan_start;
  if (i.265 < D.23923) goto <D.20581>; else goto <D.20583>;
  <D.20583>:
}


finish_gray_stack (int generation, struct GrayQueue * queue)
{
  char * iftmp.268;
  char * iftmp.269;
  int gc_debug_level.270;
  _Bool D.23933;
  long int D.23934;
  long int D.23935;
  struct FILE * gc_debug_file.271;
  const char * D.23939;
  int D.23940;
  int D.23943;
  const char * D.23956;
  long long int D.23957;
  long long int D.23958;
  int D.23959;
  int D.23960;
  _Bool D.23961;
  long int D.23962;
  long int D.23963;
  int D.23968;
  int D.23970;
  _Bool D.23971;
  long int D.23972;
  long int D.23973;
  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.23925>; else goto <D.23926>;
      <D.23925>:
      iftmp.268 = sgen_get_nursery_start ();
      goto <D.23927>;
      <D.23926>:
      iftmp.268 = 0B;
      <D.23927>:
      start_addr = iftmp.268;
      if (generation == 0) goto <D.23929>; else goto <D.23930>;
      <D.23929>:
      iftmp.269 = sgen_get_nursery_end ();
      goto <D.23931>;
      <D.23930>:
      iftmp.269 = 4294967295B;
      <D.23931>:
      end_addr = iftmp.269;
      sgen_drain_gray_stack (-1, ctx);
      atv = mono_100ns_ticks ();
      gc_debug_level.270 = gc_debug_level;
      D.23933 = gc_debug_level.270 > 1;
      D.23934 = (long int) D.23933;
      D.23935 = __builtin_expect (D.23934, 0);
      if (D.23935 != 0) goto <D.23936>; else goto <D.23937>;
      <D.23936>:
      gc_debug_file.271 = gc_debug_file;
      D.23939 = generation_name (generation);
      fprintf (gc_debug_file.271, "%s generation done\n", D.23939);
      gc_debug_file.271 = gc_debug_file;
      fflush (gc_debug_file.271);
      <D.23937>:
      D.23940 = sgen_need_bridge_processing ();
      if (D.23940 != 0) goto <D.23941>; else goto <D.23942>;
      <D.23941>:
      sgen_bridge_reset_data ();
      <D.23942>:
      done_with_ephemerons = 0;
      <D.20415>:
      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.20415>; else goto <D.20416>;
      <D.20416>:
      sgen_scan_togglerefs (start_addr, end_addr, ctx);
      D.23943 = sgen_need_bridge_processing ();
      if (D.23943 != 0) goto <D.23944>; else goto <D.23945>;
      <D.23944>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_collect_bridge_objects (generation, ctx);
      if (generation == 1) goto <D.23946>; else goto <D.23947>;
      <D.23946>:
      sgen_collect_bridge_objects (0, ctx);
      <D.23947>:
      sgen_bridge_processing_stw_step ();
      <D.23945>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_null_link_in_range (generation, 1, ctx);
      if (generation == 1) goto <D.23948>; else goto <D.23949>;
      <D.23948>:
      sgen_null_link_in_range (0, 1, ctx);
      <D.23949>:
      sgen_finalize_in_range (generation, ctx);
      if (generation == 1) goto <D.23950>; else goto <D.23951>;
      <D.23950>:
      sgen_finalize_in_range (0, ctx);
      <D.23951>:
      if (0 != 0) goto <D.23952>; else goto <D.23953>;
      <D.23952>:
      gc_debug_file.271 = gc_debug_file;
      fprintf (gc_debug_file.271, "Precise scan of gray area post fin\n");
      gc_debug_file.271 = gc_debug_file;
      fflush (gc_debug_file.271);
      <D.23953>:
      sgen_drain_gray_stack (-1, ctx);
      done_with_ephemerons = 0;
      <D.20417>:
      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.20417>; else goto <D.20418>;
      <D.20418>:
      clear_unreachable_ephemerons (ctx);
      btv = mono_100ns_ticks ();
      gc_debug_level.270 = gc_debug_level;
      D.23933 = gc_debug_level.270 > 1;
      D.23934 = (long int) D.23933;
      D.23935 = __builtin_expect (D.23934, 0);
      if (D.23935 != 0) goto <D.23954>; else goto <D.23955>;
      <D.23954>:
      gc_debug_file.271 = gc_debug_file;
      D.23956 = generation_name (generation);
      D.23957 = btv - atv;
      D.23958 = D.23957 / 10;
      D.23959 = (int) D.23958;
      fprintf (gc_debug_file.271, "Finalize queue handling scan for %s generation: %d usecs %d ephemeron rounds\n", D.23956, D.23959, ephemeron_rounds);
      gc_debug_file.271 = gc_debug_file;
      fflush (gc_debug_file.271);
      <D.23955>:
      D.23960 = sgen_gray_object_queue_is_empty (queue);
      D.23961 = D.23960 == 0;
      D.23962 = (long int) D.23961;
      D.23963 = __builtin_expect (D.23962, 0);
      if (D.23963 != 0) goto <D.23964>; else goto <D.23965>;
      <D.23964>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2014, "sgen_gray_object_queue_is_empty (queue)");
      <D.23965>:
      <D.20420>:
      sgen_null_link_in_range (generation, 0, ctx);
      if (generation == 1) goto <D.23966>; else goto <D.23967>;
      <D.23966>:
      sgen_null_link_in_range (0, 0, ctx);
      <D.23967>:
      D.23968 = sgen_gray_object_queue_is_empty (queue);
      if (D.23968 != 0) goto <D.20419>; else goto <D.23969>;
      <D.23969>:
      sgen_drain_gray_stack (-1, ctx);
      goto <D.20420>;
      <D.20419>:
      D.23970 = sgen_gray_object_queue_is_empty (queue);
      D.23971 = D.23970 == 0;
      D.23972 = (long int) D.23971;
      D.23973 = __builtin_expect (D.23972, 0);
      if (D.23973 != 0) goto <D.23974>; else goto <D.23975>;
      <D.23974>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2024, "sgen_gray_object_queue_is_empty (queue)");
      <D.23975>:
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mark_ephemerons_in_range (struct ScanCopyContext ctx)
{
  char * object.272;
  struct FILE * gc_debug_file.273;
  char * object.274;
  int D.23981;
  unsigned int D.23986;
  unsigned int D.23987;
  unsigned int D.23988;
  unsigned int D.23989;
  struct MonoVTable * D.23990;
  struct MonoDomain * D.23991;
  int cur.275;
  char * D.23998;
  int D.23999;
  int D.24000;
  int D.24001;
  const char * iftmp.276;
  int D.24003;
  void * D.24007;
  const char * iftmp.277;
  int D.24012;
  int D.24014;
  void * * D.24017;
  int D.24020;
  void * * D.24023;
  int D.24026;
  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.20805>;
  <D.20804>:
  {
    char * object;

    try
      {
        object.272 = current->array;
        object = object.272;
        if (0 != 0) goto <D.23977>; else goto <D.23978>;
        <D.23977>:
        gc_debug_file.273 = gc_debug_file;
        object.274 = object;
        fprintf (gc_debug_file.273, "Ephemeron array at %p\n", object.274);
        gc_debug_file.273 = gc_debug_file;
        fflush (gc_debug_file.273);
        <D.23978>:
        object.274 = object;
        D.23981 = sgen_is_object_alive_for_current_gen (object.274);
        if (D.23981 == 0) goto <D.23982>; else goto <D.23983>;
        <D.23982>:
        if (0 != 0) goto <D.23984>; else goto <D.23985>;
        <D.23984>:
        gc_debug_file.273 = gc_debug_file;
        fprintf (gc_debug_file.273, "\tnot reachable\n");
        gc_debug_file.273 = gc_debug_file;
        fflush (gc_debug_file.273);
        <D.23985>:
        // predicted unlikely by continue predictor.
        goto <D.20797>;
        <D.23983>:
        copy_func (&object, queue);
        array = object;
        cur = mono_array_addr_with_size (array, 8, 0);
        D.23986 = array->max_length;
        D.23987 = D.23986 * 8;
        array_end = cur + D.23987;
        object.274 = object;
        D.23988 = MEM[(mword *)object.274];
        D.23989 = D.23988 & 4294967292;
        D.23990 = (struct MonoVTable *) D.23989;
        D.23991 = D.23990->domain;
        tombstone = D.23991->ephemeron_tombstone;
        goto <D.20802>;
        <D.20801>:
        {
          char * key;

          key = cur->key;
          if (key == 0B) goto <D.23992>; else goto <D.23994>;
          <D.23994>:
          if (key == tombstone) goto <D.23992>; else goto <D.23993>;
          <D.23992>:
          // predicted unlikely by continue predictor.
          goto <D.20799>;
          <D.23993>:
          if (0 != 0) goto <D.23995>; else goto <D.23996>;
          <D.23995>:
          gc_debug_file.273 = gc_debug_file;
          cur.275 = (int) cur;
          D.23998 = mono_array_addr_with_size (array, 8, 0);
          D.23999 = (int) D.23998;
          D.24000 = cur.275 - D.23999;
          D.24001 = D.24000 /[ex] 8;
          D.24003 = sgen_is_object_alive_for_current_gen (key);
          if (D.24003 != 0) goto <D.24004>; else goto <D.24005>;
          <D.24004>:
          iftmp.276 = "reachable";
          goto <D.24006>;
          <D.24005>:
          iftmp.276 = "unreachable";
          <D.24006>:
          D.24007 = cur->value;
          D.24007 = cur->value;
          if (D.24007 != 0B) goto <D.24011>; else goto <D.24009>;
          <D.24011>:
          D.24007 = cur->value;
          D.24012 = sgen_is_object_alive_for_current_gen (D.24007);
          if (D.24012 != 0) goto <D.24013>; else goto <D.24009>;
          <D.24013>:
          iftmp.277 = "reachable";
          goto <D.24010>;
          <D.24009>:
          iftmp.277 = "unreachable";
          <D.24010>:
          fprintf (gc_debug_file.273, "[%td] key %p (%s) value %p (%s)\n", D.24001, key, iftmp.276, D.24007, iftmp.277);
          gc_debug_file.273 = gc_debug_file;
          fflush (gc_debug_file.273);
          <D.23996>:
          D.24014 = sgen_is_object_alive_for_current_gen (key);
          if (D.24014 != 0) goto <D.24015>; else goto <D.24016>;
          <D.24015>:
          {
            char * value;

            value = cur->value;
            D.24017 = &cur->key;
            copy_func (D.24017, queue);
            if (value != 0B) goto <D.24018>; else goto <D.24019>;
            <D.24018>:
            D.24020 = sgen_is_object_alive_for_current_gen (value);
            if (D.24020 == 0) goto <D.24021>; else goto <D.24022>;
            <D.24021>:
            nothing_marked = 0;
            <D.24022>:
            D.24023 = &cur->value;
            copy_func (D.24023, queue);
            <D.24019>:
          }
          <D.24016>:
        }
        <D.20799>:
        cur = cur + 8;
        <D.20802>:
        if (cur < array_end) goto <D.20801>; else goto <D.20803>;
        <D.20803>:
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.20797>:
  current = current->next;
  <D.20805>:
  if (current != 0B) goto <D.20804>; else goto <D.20806>;
  <D.20806>:
  if (0 != 0) goto <D.24024>; else goto <D.24025>;
  <D.24024>:
  gc_debug_file.273 = gc_debug_file;
  fprintf (gc_debug_file.273, "Ephemeron run finished. Is it done %d\n", nothing_marked);
  gc_debug_file.273 = gc_debug_file;
  fflush (gc_debug_file.273);
  <D.24025>:
  D.24026 = nothing_marked;
  return D.24026;
}


sgen_is_object_alive_for_current_gen (char * object)
{
  int D.24030;
  int D.24033;
  int current_collection_generation.278;

  D.24030 = sgen_ptr_in_nursery (object);
  if (D.24030 != 0) goto <D.24031>; else goto <D.24032>;
  <D.24031>:
  D.24033 = sgen_nursery_is_object_alive (object);
  return D.24033;
  <D.24032>:
  current_collection_generation.278 = current_collection_generation;
  if (current_collection_generation.278 == 0) goto <D.24035>; else goto <D.24036>;
  <D.24035>:
  D.24033 = 1;
  return D.24033;
  <D.24036>:
  D.24033 = sgen_major_is_object_alive (object);
  return D.24033;
}


sgen_nursery_is_object_alive (char * obj)
{
  int D.24038;
  _Bool D.24039;
  long int D.24040;
  long int D.24041;
  int D.24044;
  gboolean D.24047;
  unsigned int D.24050;
  unsigned int D.24051;
  unsigned int D.24053;
  unsigned int D.24055;

  D.24038 = sgen_ptr_in_nursery (obj);
  D.24039 = D.24038 == 0;
  D.24040 = (long int) D.24039;
  D.24041 = __builtin_expect (D.24040, 0);
  if (D.24041 != 0) goto <D.24042>; else goto <D.24043>;
  <D.24042>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "../../mono/metadata/sgen-gc.h", 576, "sgen_ptr_in_nursery (obj)");
  <D.24043>:
  D.24044 = sgen_nursery_is_to_space (obj);
  if (D.24044 != 0) goto <D.24045>; else goto <D.24046>;
  <D.24045>:
  D.24047 = 1;
  return D.24047;
  <D.24046>:
  D.24050 = MEM[(mword *)obj];
  D.24051 = D.24050 & 2;
  if (D.24051 != 0) goto <D.24048>; else goto <D.24052>;
  <D.24052>:
  D.24050 = MEM[(mword *)obj];
  D.24053 = D.24050 & 1;
  if (D.24053 != 0) goto <D.24054>; else goto <D.24049>;
  <D.24054>:
  D.24050 = MEM[(mword *)obj];
  D.24055 = D.24050 & 4294967292;
  if (D.24055 != 0) goto <D.24048>; else goto <D.24049>;
  <D.24048>:
  D.24047 = 1;
  return D.24047;
  <D.24049>:
  D.24047 = 0;
  return D.24047;
}


sgen_nursery_is_to_space (char * object)
{
  int object.279;
  char * sgen_nursery_start.280;
  int sgen_nursery_start.281;
  int D.24060;
  int D.24061;
  _Bool D.24062;
  long int D.24063;
  long int D.24064;
  char * D.24067;
  char * D.24068;
  int sgen_space_bitmap_size.282;
  _Bool D.24070;
  long int D.24071;
  long int D.24072;
  gboolean D.24075;
  char * sgen_space_bitmap.283;
  sizetype byte.284;
  char * D.24078;
  char D.24079;
  int D.24080;
  int D.24081;
  int D.24082;
  _Bool D.24083;
  int idx;
  int byte;
  int bit;

  object.279 = (int) object;
  sgen_nursery_start.280 = sgen_nursery_start;
  sgen_nursery_start.281 = (int) sgen_nursery_start.280;
  D.24060 = object.279 - sgen_nursery_start.281;
  idx = D.24060 >> 9;
  byte = idx / 8;
  bit = idx & 7;
  D.24061 = sgen_ptr_in_nursery (object);
  D.24062 = D.24061 == 0;
  D.24063 = (long int) D.24062;
  D.24064 = __builtin_expect (D.24063, 0);
  if (D.24064 != 0) goto <D.24065>; else goto <D.24066>;
  <D.24065>:
  D.24067 = sgen_get_nursery_start ();
  D.24068 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.24067, D.24068);
  <D.16643>:
  goto <D.16643>;
  <D.24066>:
  sgen_space_bitmap_size.282 = sgen_space_bitmap_size;
  D.24070 = byte >= sgen_space_bitmap_size.282;
  D.24071 = (long int) D.24070;
  D.24072 = __builtin_expect (D.24071, 0);
  if (D.24072 != 0) goto <D.24073>; else goto <D.24074>;
  <D.24073>:
  sgen_space_bitmap_size.282 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.282);
  <D.16644>:
  goto <D.16644>;
  <D.24074>:
  sgen_space_bitmap.283 = sgen_space_bitmap;
  byte.284 = (sizetype) byte;
  D.24078 = sgen_space_bitmap.283 + byte.284;
  D.24079 = *D.24078;
  D.24080 = (int) D.24079;
  D.24081 = D.24080 >> bit;
  D.24082 = D.24081 & 1;
  D.24083 = D.24082 != 0;
  D.24075 = (gboolean) D.24083;
  return D.24075;
}


sgen_major_is_object_alive (void * object)
{
  unsigned int D.24087;
  unsigned int D.24088;
  unsigned int D.24090;
  unsigned int D.24092;
  gboolean D.24093;
  unsigned int D.24094;
  unsigned int D.24095;
  gboolean (*<T2be9>) (char *) D.24098;
  mword objsize;

  D.24087 = MEM[(mword *)object];
  D.24088 = D.24087 & 2;
  if (D.24088 != 0) goto <D.24085>; else goto <D.24089>;
  <D.24089>:
  D.24087 = MEM[(mword *)object];
  D.24090 = D.24087 & 1;
  if (D.24090 != 0) goto <D.24091>; else goto <D.24086>;
  <D.24091>:
  D.24087 = MEM[(mword *)object];
  D.24092 = D.24087 & 4294967292;
  if (D.24092 != 0) goto <D.24085>; else goto <D.24086>;
  <D.24085>:
  D.24093 = 1;
  return D.24093;
  <D.24086>:
  D.24094 = sgen_safe_object_get_size (object);
  D.24095 = D.24094 + 7;
  objsize = D.24095 & 4294967288;
  if (objsize > 8000) goto <D.24096>; else goto <D.24097>;
  <D.24096>:
  D.24093 = sgen_los_object_is_pinned (object);
  return D.24093;
  <D.24097>:
  D.24098 = major_collector.is_object_live;
  D.24093 = D.24098 (object);
  return D.24093;
}


clear_unreachable_ephemerons (struct ScanCopyContext ctx)
{
  char * object.285;
  char * object.286;
  int D.24102;
  struct FILE * gc_debug_file.287;
  struct EphemeronLinkNode * ephemeron_list.288;
  unsigned int D.24114;
  unsigned int D.24115;
  unsigned int D.24116;
  unsigned int D.24117;
  struct MonoVTable * D.24118;
  struct MonoDomain * D.24119;
  int cur.289;
  char * D.24126;
  int D.24127;
  int D.24128;
  int D.24129;
  const char * iftmp.290;
  int D.24131;
  void * D.24135;
  const char * iftmp.291;
  int D.24140;
  int D.24142;
  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.20777>;
  <D.20783>:
  {
    char * object;

    try
      {
        object.285 = current->array;
        object = object.285;
        object.286 = object;
        D.24102 = sgen_is_object_alive_for_current_gen (object.286);
        if (D.24102 == 0) goto <D.24103>; else goto <D.24104>;
        <D.24103>:
        {
          struct EphemeronLinkNode * tmp;

          tmp = current;
          if (0 != 0) goto <D.24105>; else goto <D.24106>;
          <D.24105>:
          gc_debug_file.287 = gc_debug_file;
          object.286 = object;
          fprintf (gc_debug_file.287, "Dead Ephemeron array at %p\n", object.286);
          gc_debug_file.287 = gc_debug_file;
          fflush (gc_debug_file.287);
          <D.24106>:
          if (prev != 0B) goto <D.24108>; else goto <D.24109>;
          <D.24108>:
          ephemeron_list.288 = current->next;
          prev->next = ephemeron_list.288;
          goto <D.24111>;
          <D.24109>:
          ephemeron_list.288 = current->next;
          ephemeron_list = ephemeron_list.288;
          <D.24111>:
          current = current->next;
          sgen_free_internal (tmp, 18);
          // predicted unlikely by continue predictor.
          goto <D.20777>;
        }
        <D.24104>:
        copy_func (&object, queue);
        object.286 = object;
        current->array = object.286;
        if (0 != 0) goto <D.24112>; else goto <D.24113>;
        <D.24112>:
        gc_debug_file.287 = gc_debug_file;
        object.286 = object;
        fprintf (gc_debug_file.287, "Clearing unreachable entries for ephemeron array at %p\n", object.286);
        gc_debug_file.287 = gc_debug_file;
        fflush (gc_debug_file.287);
        <D.24113>:
        array = object;
        cur = mono_array_addr_with_size (array, 8, 0);
        D.24114 = array->max_length;
        D.24115 = D.24114 * 8;
        array_end = cur + D.24115;
        object.286 = object;
        D.24116 = MEM[(mword *)object.286];
        D.24117 = D.24116 & 4294967292;
        D.24118 = (struct MonoVTable *) D.24117;
        D.24119 = D.24118->domain;
        tombstone = D.24119->ephemeron_tombstone;
        goto <D.20781>;
        <D.20780>:
        {
          char * key;

          key = cur->key;
          if (key == 0B) goto <D.24120>; else goto <D.24122>;
          <D.24122>:
          if (key == tombstone) goto <D.24120>; else goto <D.24121>;
          <D.24120>:
          // predicted unlikely by continue predictor.
          goto <D.20779>;
          <D.24121>:
          if (0 != 0) goto <D.24123>; else goto <D.24124>;
          <D.24123>:
          gc_debug_file.287 = gc_debug_file;
          cur.289 = (int) cur;
          D.24126 = mono_array_addr_with_size (array, 8, 0);
          D.24127 = (int) D.24126;
          D.24128 = cur.289 - D.24127;
          D.24129 = D.24128 /[ex] 8;
          D.24131 = sgen_is_object_alive_for_current_gen (key);
          if (D.24131 != 0) goto <D.24132>; else goto <D.24133>;
          <D.24132>:
          iftmp.290 = "reachable";
          goto <D.24134>;
          <D.24133>:
          iftmp.290 = "unreachable";
          <D.24134>:
          D.24135 = cur->value;
          D.24135 = cur->value;
          if (D.24135 != 0B) goto <D.24139>; else goto <D.24137>;
          <D.24139>:
          D.24135 = cur->value;
          D.24140 = sgen_is_object_alive_for_current_gen (D.24135);
          if (D.24140 != 0) goto <D.24141>; else goto <D.24137>;
          <D.24141>:
          iftmp.291 = "reachable";
          goto <D.24138>;
          <D.24137>:
          iftmp.291 = "unreachable";
          <D.24138>:
          fprintf (gc_debug_file.287, "[%td] key %p (%s) value %p (%s)\n", D.24129, key, iftmp.290, D.24135, iftmp.291);
          gc_debug_file.287 = gc_debug_file;
          fflush (gc_debug_file.287);
          <D.24124>:
          D.24142 = sgen_is_object_alive_for_current_gen (key);
          if (D.24142 == 0) goto <D.24143>; else goto <D.24144>;
          <D.24143>:
          cur->key = tombstone;
          cur->value = 0B;
          // predicted unlikely by continue predictor.
          goto <D.20779>;
          <D.24144>:
        }
        <D.20779>:
        cur = cur + 8;
        <D.20781>:
        if (cur < array_end) goto <D.20780>; else goto <D.20782>;
        <D.20782>:
        prev = current;
        current = current->next;
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.20777>:
  if (current != 0B) goto <D.20783>; else goto <D.20784>;
  <D.20784>:
}


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


sgen_get_nursery_end ()
{
  char * D.24147;

  D.24147 = sgen_nursery_end;
  return D.24147;
}


dump_heap (const char * type, int num, const char * reason)
{
  struct FILE * heap_dump_file.292;
  long int D.24152;
  unsigned int D.24153;
  unsigned int D.24154;
  struct MonoObject * D.24155;
  struct GCMemSection * nursery_section.293;
  void (*<T2c5b>) (struct FILE *) D.24157;
  char[0:] * D.24158;
  struct ObjectList * list;
  struct LOSObject * bigobj;

  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, "<collection type=\"%s\" num=\"%d\"", type, num);
  if (reason != 0B) goto <D.24150>; else goto <D.24151>;
  <D.24150>:
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, " reason=\"%s\"", reason);
  <D.24151>:
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, ">\n");
  heap_dump_file.292 = heap_dump_file;
  D.24152 = mono_mempool_get_bytes_allocated ();
  fprintf (heap_dump_file.292, "<other-mem-usage type=\"mempools\" size=\"%ld\"/>\n", D.24152);
  heap_dump_file.292 = heap_dump_file;
  sgen_dump_internal_mem_usage (heap_dump_file.292);
  heap_dump_file.292 = heap_dump_file;
  D.24153 = sgen_pin_stats_get_pinned_byte_count (0);
  fprintf (heap_dump_file.292, "<pinned type=\"stack\" bytes=\"%zu\"/>\n", D.24153);
  heap_dump_file.292 = heap_dump_file;
  D.24154 = sgen_pin_stats_get_pinned_byte_count (2);
  fprintf (heap_dump_file.292, "<pinned type=\"other\" bytes=\"%zu\"/>\n", D.24154);
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, "<pinned-objects>\n");
  list = sgen_pin_stats_get_object_list ();
  goto <D.20491>;
  <D.20490>:
  D.24155 = list->obj;
  dump_object (D.24155, 1);
  list = list->next;
  <D.20491>:
  if (list != 0B) goto <D.20490>; else goto <D.20492>;
  <D.20492>:
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, "</pinned-objects>\n");
  nursery_section.293 = nursery_section;
  sgen_dump_section (nursery_section.293, "nursery");
  D.24157 = major_collector.dump_heap;
  heap_dump_file.292 = heap_dump_file;
  D.24157 (heap_dump_file.292);
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, "<los>\n");
  bigobj = los_object_list;
  goto <D.20494>;
  <D.20493>:
  D.24158 = &bigobj->data;
  dump_object (D.24158, 0);
  bigobj = bigobj->next;
  <D.20494>:
  if (bigobj != 0B) goto <D.20493>; else goto <D.20495>;
  <D.20495>:
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, "</los>\n");
  heap_dump_file.292 = heap_dump_file;
  fprintf (heap_dump_file.292, "</collection>\n");
}


dump_object (struct MonoObject * obj, gboolean dump_location)
{
  struct MonoVTable * D.24159;
  const char * D.24160;
  sizetype i.294;
  const char * D.24162;
  char D.24163;
  int D.24164;
  char * D.24165;
  int j.295;
  unsigned int j.296;
  _Bool D.24171;
  long int D.24172;
  long int D.24173;
  struct FILE * heap_dump_file.297;
  const char * D.24177;
  unsigned int D.24178;
  int D.24181;
  unsigned int D.24185;
  static char class_name[1024];
  struct MonoClass * class;
  int i;
  int j;

  D.24159 = obj->vtable;
  class = D.24159->klass;
  j = 0;
  i = j;
  goto <D.20480>;
  <D.20479>:
  D.24160 = class->name;
  i.294 = (sizetype) i;
  D.24162 = D.24160 + i.294;
  D.24163 = *D.24162;
  D.24164 = (int) D.24163;
  D.24165 = __builtin_strchr ("<>\"", D.24164);
  if (D.24165 == 0B) goto <D.24166>; else goto <D.24167>;
  <D.24166>:
  j.295 = j;
  j = j.295 + 1;
  D.24160 = class->name;
  i.294 = (sizetype) i;
  D.24162 = D.24160 + i.294;
  D.24163 = *D.24162;
  class_name[j.295] = D.24163;
  <D.24167>:
  i = i + 1;
  <D.20480>:
  D.24160 = class->name;
  i.294 = (sizetype) i;
  D.24162 = D.24160 + i.294;
  D.24163 = *D.24162;
  if (D.24163 != 0) goto <D.24169>; else goto <D.20481>;
  <D.24169>:
  j.296 = (unsigned int) j;
  if (j.296 <= 1022) goto <D.20479>; else goto <D.20481>;
  <D.20481>:
  j.296 = (unsigned int) j;
  D.24171 = j.296 > 1023;
  D.24172 = (long int) D.24171;
  D.24173 = __builtin_expect (D.24172, 0);
  if (D.24173 != 0) goto <D.24174>; else goto <D.24175>;
  <D.24174>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2132, "j < sizeof (class_name)");
  <D.24175>:
  class_name[j] = 0;
  heap_dump_file.297 = heap_dump_file;
  D.24177 = class->name_space;
  D.24178 = sgen_safe_object_get_size (obj);
  fprintf (heap_dump_file.297, "<object class=\"%s.%s\" size=\"%d\"", D.24177, &class_name, D.24178);
  if (dump_location != 0) goto <D.24179>; else goto <D.24180>;
  <D.24179>:
  {
    const char * location;

    D.24181 = sgen_ptr_in_nursery (obj);
    if (D.24181 != 0) goto <D.24182>; else goto <D.24183>;
    <D.24182>:
    location = "nursery";
    goto <D.24184>;
    <D.24183>:
    D.24185 = sgen_safe_object_get_size (obj);
    if (D.24185 <= 8000) goto <D.24186>; else goto <D.24187>;
    <D.24186>:
    location = "major";
    goto <D.24188>;
    <D.24187>:
    location = "LOS";
    <D.24188>:
    <D.24184>:
    heap_dump_file.297 = heap_dump_file;
    fprintf (heap_dump_file.297, " location=\"%s\"", location);
  }
  <D.24180>:
  heap_dump_file.297 = heap_dump_file;
  fprintf (heap_dump_file.297, "/>\n");
}


check_scan_starts ()
{
  int do_scan_starts_check.298;
  struct GCMemSection * nursery_section.299;
  void (*<T70e>) (void) D.24193;

  do_scan_starts_check.298 = do_scan_starts_check;
  if (do_scan_starts_check.298 == 0) goto <D.24190>; else goto <D.24191>;
  <D.24190>:
  return;
  <D.24191>:
  nursery_section.299 = nursery_section;
  sgen_check_section_scan_starts (nursery_section.299);
  D.24193 = major_collector.check_scan_starts;
  D.24193 ();
}


unpin_objects_from_queue (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.24195;
  int D.24199;
  _Bool D.24200;
  long int D.24201;
  long int D.24202;
  int D.24206;
  unsigned int D.24208;
  unsigned int D.24209;
  _Bool D.24210;
  long int D.24211;
  long int D.24212;
  unsigned int D.24215;

  <D.20234>:
  {
    char * addr;

    D.24195 = queue->first;
    if (D.24195 == 0B) goto <D.24196>; else goto <D.24197>;
    <D.24196>:
    addr = 0B;
    goto <D.24198>;
    <D.24197>:
    D.24195 = queue->first;
    D.24199 = D.24195->end;
    D.24200 = D.24199 == 1;
    D.24201 = (long int) D.24200;
    D.24202 = __builtin_expect (D.24201, 0);
    if (D.24202 != 0) goto <D.24203>; else goto <D.24204>;
    <D.24203>:
    addr = sgen_gray_object_dequeue (queue);
    goto <D.24205>;
    <D.24204>:
    D.24195 = queue->first;
    D.24195 = queue->first;
    D.24199 = D.24195->end;
    D.24206 = D.24199 + -1;
    D.24195->end = D.24206;
    D.24199 = D.24195->end;
    addr = D.24195->objects[D.24199];
    <D.24205>:
    <D.24198>:
    if (addr == 0B) goto <D.20233>; else goto <D.24207>;
    <D.24207>:
    D.24208 = MEM[(mword *)addr];
    D.24209 = D.24208 & 2;
    D.24210 = D.24209 == 0;
    D.24211 = (long int) D.24210;
    D.24212 = __builtin_expect (D.24211, 0);
    if (D.24212 != 0) goto <D.24213>; else goto <D.24214>;
    <D.24213>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1548, "SGEN_OBJECT_IS_PINNED (addr)");
    <D.24214>:
    D.24208 = MEM[(mword *)addr];
    D.24215 = D.24208 & 4294967293;
    MEM[(mword *)addr] = D.24215;
  }
  goto <D.20234>;
  <D.20233>:
}


major_start_concurrent_collection (const char * reason)
{
  int disable_major_collections.300;
  long long int (*<T2c60>) (void) D.24219;
  _Bool D.24220;
  long int D.24221;
  long int D.24222;
  long long int num_objects_marked;

  disable_major_collections.300 = disable_major_collections;
  if (disable_major_collections.300 != 0) goto <D.24217>; else goto <D.24218>;
  <D.24217>:
  return;
  <D.24218>:
  D.24219 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.24219 ();
  D.24220 = num_objects_marked != 0;
  D.24221 = (long int) D.24220;
  D.24222 = __builtin_expect (D.24221, 0);
  if (D.24222 != 0) goto <D.24223>; else goto <D.24224>;
  <D.24223>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3326, "num_objects_marked == 0");
  <D.24224>:
  major_start_collection (1, 0B);
  gray_queue_redirect (&gray_queue);
  sgen_workers_wait_for_jobs ();
  D.24219 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.24219 ();
  current_collection_generation = -1;
}


major_start_collection (gboolean concurrent, int * old_next_pin_slot)
{
  struct MonoPerfCounters * mono_perfcounters.301;
  unsigned int D.24227;
  unsigned int D.24228;
  struct SgenSectionGrayQueue * D.24229;
  int D.24230;
  _Bool D.24231;
  long int D.24232;
  long int D.24233;
  int D.24238;
  _Bool D.24239;
  long int D.24240;
  long int D.24241;
  int gc_debug_level.302;
  _Bool D.24246;
  long int D.24247;
  long int D.24248;
  struct FILE * gc_debug_file.303;
  int stat_major_gcs.304;
  int stat_major_gcs.305;
  int D.24254;
  int D.24255;
  void (*<T70e>) (void) D.24256;

  current_collection_generation = 1;
  mono_perfcounters.301 = mono_perfcounters;
  D.24227 = mono_perfcounters.301->gc_collections1;
  D.24228 = D.24227 + 1;
  mono_perfcounters.301->gc_collections1 = D.24228;
  D.24229 = sgen_workers_get_distribute_section_gray_queue ();
  D.24230 = sgen_section_gray_queue_is_empty (D.24229);
  D.24231 = D.24230 == 0;
  D.24232 = (long int) D.24231;
  D.24233 = __builtin_expect (D.24232, 0);
  if (D.24233 != 0) goto <D.24234>; else goto <D.24235>;
  <D.24234>:
  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.24235>:
  if (concurrent != 0) goto <D.24236>; else goto <D.24237>;
  <D.24236>:
  D.24238 = major_collector.is_concurrent;
  D.24239 = D.24238 == 0;
  D.24240 = (long int) D.24239;
  D.24241 = __builtin_expect (D.24240, 0);
  if (D.24241 != 0) goto <D.24242>; else goto <D.24243>;
  <D.24242>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3077, "major_collector.is_concurrent");
  <D.24243>:
  concurrent_collection_in_progress = 1;
  sgen_cement_concurrent_start ();
  current_object_ops = major_collector.major_concurrent_ops;
  goto <D.24244>;
  <D.24237>:
  current_object_ops = major_collector.major_ops;
  <D.24244>:
  reset_pinned_from_failed_allocation ();
  sgen_memgov_major_collection_start ();
  check_scan_starts ();
  degraded_mode = 0;
  gc_debug_level.302 = gc_debug_level;
  D.24246 = gc_debug_level.302 > 0;
  D.24247 = (long int) D.24246;
  D.24248 = __builtin_expect (D.24247, 0);
  if (D.24248 != 0) goto <D.24249>; else goto <D.24250>;
  <D.24249>:
  gc_debug_file.303 = gc_debug_file;
  stat_major_gcs.304 = stat_major_gcs;
  fprintf (gc_debug_file.303, "Start major collection %d\n", stat_major_gcs.304);
  gc_debug_file.303 = gc_debug_file;
  fflush (gc_debug_file.303);
  <D.24250>:
  stat_major_gcs.304 = stat_major_gcs;
  stat_major_gcs.305 = stat_major_gcs.304 + 1;
  stat_major_gcs = stat_major_gcs.305;
  D.24254 = gc_stats.major_gc_count;
  D.24255 = D.24254 + 1;
  gc_stats.major_gc_count = D.24255;
  D.24256 = major_collector.start_major_collection;
  if (D.24256 != 0B) goto <D.24257>; else goto <D.24258>;
  <D.24257>:
  D.24256 = major_collector.start_major_collection;
  D.24256 ();
  <D.24258>:
  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.306;
  gboolean D.24262;
  struct MonoPerfCounters * mono_perfcounters.307;
  unsigned int D.24264;
  unsigned int D.24265;
  int D.24266;
  char * iftmp.308;
  char * D.24271;
  int gc_debug_level.309;
  _Bool D.24276;
  long int D.24277;
  long int D.24278;
  struct FILE * gc_debug_file.310;
  int stat_minor_gcs.311;
  char * D.24283;
  int nursery_next.312;
  char * D.24285;
  int D.24286;
  int D.24287;
  char * D.24288;
  int D.24289;
  int D.24290;
  struct GCMemSection * nursery_section.313;
  unsigned int D.24292;
  _Bool D.24293;
  long int D.24294;
  long int D.24295;
  long long int D.24298;
  long long int D.24299;
  int D.24300;
  long long int D.24301;
  long long int time_minor_pre_collection_fragment_clear.314;
  long long int time_minor_pre_collection_fragment_clear.315;
  int xdomain_checks.316;
  void (*<T70e>) (void) D.24307;
  int stat_minor_gcs.317;
  int D.24309;
  int D.24310;
  char * D.24311;
  long long int D.24312;
  long long int D.24313;
  int D.24314;
  long long int D.24315;
  long long int time_minor_pinning.318;
  long long int time_minor_pinning.319;
  _Bool D.24318;
  long int D.24319;
  long int D.24320;
  int D.24323;
  int D.24326;
  int whole_heap_check_before_collection.320;
  int consistency_check_at_minor_collection.321;
  char * D.24333;
  long long int time_minor_scan_remsets.322;
  long long int time_minor_scan_remsets.323;
  int D.24338;
  void (*<T2b52>) (char *, struct SgenGrayQueue *) D.24341;
  <unnamed type> D.24342;
  unsigned int D.24343;
  <unnamed type> D.24346;
  unsigned int D.24347;
  long long int time_minor_scan_pinned.324;
  long long int time_minor_scan_pinned.325;
  void (*<T2b4d>) (void * *, struct SgenGrayQueue *) D.24352;
  char * D.24353;
  char * D.24354;
  long long int time_minor_scan_registered_roots.326;
  long long int time_minor_scan_registered_roots.327;
  char * D.24357;
  long long int time_minor_scan_thread_data.328;
  long long int time_minor_scan_thread_data.329;
  int iftmp.330;
  int D.24364;
  int D.24366;
  _Bool D.24367;
  long int D.24368;
  long int D.24369;
  int D.24374;
  int D.24376;
  int D.24377;
  _Bool D.24378;
  long int D.24379;
  long int D.24380;
  struct FinalizeReadyEntry * fin_ready_list.331;
  struct FinalizeReadyEntry * critical_fin_list.332;
  long long int time_minor_finish_gray_stack.333;
  long long int time_minor_finish_gray_stack.334;
  unsigned int objects_pinned.335;
  void * * D.24390;
  int D.24391;
  long long int time_minor_fragment_creation.336;
  long long int time_minor_fragment_creation.337;
  void (*<T70e>) (void) D.24400;
  long long int D.24401;
  long long int D.24402;
  long long int D.24403;
  int D.24404;
  long long int D.24405;
  long long int D.24406;
  struct FILE * heap_dump_file.338;
  int D.24410;
  int num_ready_finalizers.339;
  int D.24417;
  _Bool D.24418;
  long int D.24419;
  long int D.24420;
  void (*<T70e>) (void) D.24423;
  _Bool D.24424;
  int check_nursery_objects_pinned.340;
  int D.24428;
  _Bool D.24431;
  int D.24432;
  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.306 = disable_minor_collections;
      if (disable_minor_collections.306 != 0) goto <D.24260>; else goto <D.24261>;
      <D.24260>:
      D.24262 = 1;
      return D.24262;
      <D.24261>:
      verify_nursery ();
      mono_perfcounters.307 = mono_perfcounters;
      D.24264 = mono_perfcounters.307->gc_collections0;
      D.24265 = D.24264 + 1;
      mono_perfcounters.307->gc_collections0 = D.24265;
      current_collection_generation = 0;
      D.24266 = sgen_collection_is_parallel ();
      if (D.24266 != 0) goto <D.24267>; else goto <D.24268>;
      <D.24267>:
      current_object_ops = sgen_minor_collector.parallel_ops;
      goto <D.24269>;
      <D.24268>:
      current_object_ops = sgen_minor_collector.serial_ops;
      <D.24269>:
      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.24271 = sgen_get_nursery_end ();
      if (D.24271 >= nursery_next) goto <D.24272>; else goto <D.24273>;
      <D.24272>:
      iftmp.308 = sgen_get_nursery_end ();
      goto <D.24274>;
      <D.24273>:
      iftmp.308 = nursery_next;
      <D.24274>:
      nursery_next = iftmp.308;
      gc_debug_level.309 = gc_debug_level;
      D.24276 = gc_debug_level.309 > 0;
      D.24277 = (long int) D.24276;
      D.24278 = __builtin_expect (D.24277, 0);
      if (D.24278 != 0) goto <D.24279>; else goto <D.24280>;
      <D.24279>:
      gc_debug_file.310 = gc_debug_file;
      stat_minor_gcs.311 = stat_minor_gcs;
      D.24283 = sgen_get_nursery_start ();
      nursery_next.312 = (int) nursery_next;
      D.24285 = sgen_get_nursery_start ();
      D.24286 = (int) D.24285;
      D.24287 = nursery_next.312 - D.24286;
      fprintf (gc_debug_file.310, "Start nursery collection %d %p-%p, size: %d\n", stat_minor_gcs.311, D.24283, nursery_next, D.24287);
      gc_debug_file.310 = gc_debug_file;
      fflush (gc_debug_file.310);
      <D.24280>:
      nursery_next.312 = (int) nursery_next;
      D.24288 = sgen_get_nursery_start ();
      D.24289 = (int) D.24288;
      D.24290 = nursery_next.312 - D.24289;
      max_garbage_amount = (size_t) D.24290;
      nursery_section.313 = nursery_section;
      D.24292 = nursery_section.313->size;
      D.24293 = D.24292 < max_garbage_amount;
      D.24294 = (long int) D.24293;
      D.24295 = __builtin_expect (D.24294, 0);
      if (D.24295 != 0) goto <D.24296>; else goto <D.24297>;
      <D.24296>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2551, "nursery_section->size >= max_garbage_amount");
      <D.24297>:
      all_atv = mono_100ns_ticks ();
      atv = all_atv;
      btv = mono_100ns_ticks ();
      D.24298 = btv - atv;
      D.24299 = D.24298 / 10;
      D.24300 = (int) D.24299;
      D.24301 = (long long int) D.24300;
      time_minor_pre_collection_fragment_clear.314 = time_minor_pre_collection_fragment_clear;
      time_minor_pre_collection_fragment_clear.315 = D.24301 + time_minor_pre_collection_fragment_clear.314;
      time_minor_pre_collection_fragment_clear = time_minor_pre_collection_fragment_clear.315;
      xdomain_checks.316 = xdomain_checks;
      if (xdomain_checks.316 != 0) goto <D.24305>; else goto <D.24306>;
      <D.24305>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.24306>:
      nursery_section.313 = nursery_section;
      nursery_section.313->next_data = nursery_next;
      D.24307 = major_collector.start_nursery_collection;
      D.24307 ();
      sgen_memgov_minor_collection_start ();
      init_gray_queue ();
      stat_minor_gcs.311 = stat_minor_gcs;
      stat_minor_gcs.317 = stat_minor_gcs.311 + 1;
      stat_minor_gcs = stat_minor_gcs.317;
      D.24309 = gc_stats.minor_gc_count;
      D.24310 = D.24309 + 1;
      gc_stats.minor_gc_count = D.24310;
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      sgen_init_pinning ();
      mono_profiler_gc_event (1, 0);
      D.24311 = sgen_get_nursery_start ();
      pin_from_roots (D.24311, nursery_next, &gray_queue);
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      sgen_optimize_pin_queue (0);
      nursery_section.313 = nursery_section;
      sgen_pinning_setup_section (nursery_section.313);
      ctx.scan_func = 0B;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      nursery_section.313 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.313, ctx);
      nursery_section.313 = nursery_section;
      sgen_pinning_trim_queue_to_section (nursery_section.313);
      atv = mono_100ns_ticks ();
      D.24312 = atv - btv;
      D.24313 = D.24312 / 10;
      D.24314 = (int) D.24313;
      D.24315 = (long long int) D.24314;
      time_minor_pinning.318 = time_minor_pinning;
      time_minor_pinning.319 = D.24315 + time_minor_pinning.318;
      time_minor_pinning = time_minor_pinning.319;
      gc_debug_level.309 = gc_debug_level;
      D.24318 = gc_debug_level.309 > 1;
      D.24319 = (long int) D.24318;
      D.24320 = __builtin_expect (D.24319, 0);
      if (D.24320 != 0) goto <D.24321>; else goto <D.24322>;
      <D.24321>:
      gc_debug_file.310 = gc_debug_file;
      D.24323 = sgen_get_pinned_count ();
      D.24312 = atv - btv;
      D.24313 = D.24312 / 10;
      D.24314 = (int) D.24313;
      fprintf (gc_debug_file.310, "Finding pinned pointers: %d in %d usecs\n", D.24323, D.24314);
      gc_debug_file.310 = gc_debug_file;
      fflush (gc_debug_file.310);
      <D.24322>:
      if (0 != 0) goto <D.24324>; else goto <D.24325>;
      <D.24324>:
      gc_debug_file.310 = gc_debug_file;
      D.24326 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.310, "Start scan with %d pinned objects\n", D.24326);
      gc_debug_file.310 = gc_debug_file;
      fflush (gc_debug_file.310);
      <D.24325>:
      whole_heap_check_before_collection.320 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.320 != 0) goto <D.24328>; else goto <D.24329>;
      <D.24328>:
      sgen_clear_nursery_fragments ();
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.24329>:
      consistency_check_at_minor_collection.321 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.321 != 0) goto <D.24331>; else goto <D.24332>;
      <D.24331>:
      sgen_check_consistency ();
      <D.24332>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      frssjd = sgen_alloc_internal_dynamic (8, 20, 1);
      D.24333 = sgen_get_nursery_start ();
      frssjd->heap_start = D.24333;
      frssjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_finish_remembered_set_scan, frssjd);
      btv = mono_100ns_ticks ();
      D.24298 = btv - atv;
      D.24299 = D.24298 / 10;
      D.24300 = (int) D.24299;
      D.24301 = (long long int) D.24300;
      time_minor_scan_remsets.322 = time_minor_scan_remsets;
      time_minor_scan_remsets.323 = D.24301 + time_minor_scan_remsets.322;
      time_minor_scan_remsets = time_minor_scan_remsets.323;
      gc_debug_level.309 = gc_debug_level;
      D.24318 = gc_debug_level.309 > 1;
      D.24319 = (long int) D.24318;
      D.24320 = __builtin_expect (D.24319, 0);
      if (D.24320 != 0) goto <D.24336>; else goto <D.24337>;
      <D.24336>:
      gc_debug_file.310 = gc_debug_file;
      D.24298 = btv - atv;
      D.24299 = D.24298 / 10;
      D.24300 = (int) D.24299;
      fprintf (gc_debug_file.310, "Old generation scan: %d usecs\n", D.24300);
      gc_debug_file.310 = gc_debug_file;
      fflush (gc_debug_file.310);
      <D.24337>:
      D.24338 = sgen_collection_is_parallel ();
      if (D.24338 == 0) goto <D.24339>; else goto <D.24340>;
      <D.24339>:
      D.24341 = current_object_ops.scan_object;
      ctx.scan_func = D.24341;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      sgen_drain_gray_stack (-1, ctx);
      <D.24340>:
      D.24342 = mono_profiler_get_events ();
      D.24343 = D.24342 & 1048576;
      if (D.24343 != 0) goto <D.24344>; else goto <D.24345>;
      <D.24344>:
      report_registered_roots ();
      <D.24345>:
      D.24346 = mono_profiler_get_events ();
      D.24347 = D.24346 & 1048576;
      if (D.24347 != 0) goto <D.24348>; else goto <D.24349>;
      <D.24348>:
      report_finalizer_roots ();
      <D.24349>:
      atv = mono_100ns_ticks ();
      D.24312 = atv - btv;
      D.24313 = D.24312 / 10;
      D.24314 = (int) D.24313;
      D.24315 = (long long int) D.24314;
      time_minor_scan_pinned.324 = time_minor_scan_pinned;
      time_minor_scan_pinned.325 = D.24315 + time_minor_scan_pinned.324;
      time_minor_scan_pinned = time_minor_scan_pinned.325;
      scrrjd_normal = sgen_alloc_internal_dynamic (20, 20, 1);
      D.24352 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.24352;
      D.24341 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.24341;
      D.24353 = sgen_get_nursery_start ();
      scrrjd_normal->heap_start = D.24353;
      scrrjd_normal->heap_end = nursery_next;
      scrrjd_normal->root_type = 0;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_normal);
      scrrjd_wbarrier = sgen_alloc_internal_dynamic (20, 20, 1);
      D.24352 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.24352;
      D.24341 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.24341;
      D.24354 = sgen_get_nursery_start ();
      scrrjd_wbarrier->heap_start = D.24354;
      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.24298 = btv - atv;
      D.24299 = D.24298 / 10;
      D.24300 = (int) D.24299;
      D.24301 = (long long int) D.24300;
      time_minor_scan_registered_roots.326 = time_minor_scan_registered_roots;
      time_minor_scan_registered_roots.327 = D.24301 + time_minor_scan_registered_roots.326;
      time_minor_scan_registered_roots = time_minor_scan_registered_roots.327;
      stdjd = sgen_alloc_internal_dynamic (8, 20, 1);
      D.24357 = sgen_get_nursery_start ();
      stdjd->heap_start = D.24357;
      stdjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.24312 = atv - btv;
      D.24313 = D.24312 / 10;
      D.24314 = (int) D.24313;
      D.24315 = (long long int) D.24314;
      time_minor_scan_thread_data.328 = time_minor_scan_thread_data;
      time_minor_scan_thread_data.329 = D.24315 + time_minor_scan_thread_data.328;
      time_minor_scan_thread_data = time_minor_scan_thread_data.329;
      btv = atv;
      D.24364 = sgen_collection_is_parallel ();
      if (D.24364 != 0) goto <D.24361>; else goto <D.24365>;
      <D.24365>:
      D.24366 = sgen_collection_is_concurrent ();
      if (D.24366 != 0) goto <D.24361>; else goto <D.24362>;
      <D.24361>:
      iftmp.330 = 1;
      goto <D.24363>;
      <D.24362>:
      iftmp.330 = 0;
      <D.24363>:
      D.24367 = iftmp.330 != 0;
      D.24368 = (long int) D.24367;
      D.24369 = __builtin_expect (D.24368, 0);
      if (D.24369 != 0) goto <D.24370>; else goto <D.24371>;
      <D.24370>:
      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.24371>:
      D.24374 = sgen_collection_is_parallel ();
      if (D.24374 != 0) goto <D.24372>; else goto <D.24375>;
      <D.24375>:
      D.24376 = sgen_collection_is_concurrent ();
      if (D.24376 != 0) goto <D.24372>; else goto <D.24373>;
      <D.24372>:
      D.24377 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24378 = D.24377 == 0;
      D.24379 = (long int) D.24378;
      D.24380 = __builtin_expect (D.24379, 0);
      if (D.24380 != 0) goto <D.24381>; else goto <D.24382>;
      <D.24381>:
      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.24382>:
      <D.24373>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (4, 20, 1);
      fin_ready_list.331 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.331;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (4, 20, 1);
      critical_fin_list.332 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.332;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      finish_gray_stack (0, &gray_queue);
      atv = mono_100ns_ticks ();
      D.24312 = atv - btv;
      D.24313 = D.24312 / 10;
      D.24314 = (int) D.24313;
      D.24315 = (long long int) D.24314;
      time_minor_finish_gray_stack.333 = time_minor_finish_gray_stack;
      time_minor_finish_gray_stack.334 = D.24315 + time_minor_finish_gray_stack.333;
      time_minor_finish_gray_stack = time_minor_finish_gray_stack.334;
      mono_profiler_gc_event (2, 0);
      sgen_workers_reset_data ();
      objects_pinned.335 = objects_pinned;
      if (objects_pinned.335 != 0) goto <D.24388>; else goto <D.24389>;
      <D.24388>:
      sgen_optimize_pin_queue (0);
      nursery_section.313 = nursery_section;
      sgen_pinning_setup_section (nursery_section.313);
      <D.24389>:
      mono_profiler_gc_event (3, 0);
      nursery_section.313 = nursery_section;
      nursery_section.313 = nursery_section;
      D.24390 = nursery_section.313->pin_queue_start;
      nursery_section.313 = nursery_section;
      D.24391 = nursery_section.313->pin_queue_num_entries;
      fragment_total = sgen_build_nursery_fragments (nursery_section.313, D.24390, D.24391, unpin_queue);
      if (fragment_total == 0) goto <D.24392>; else goto <D.24393>;
      <D.24392>:
      degraded_mode = 1;
      <D.24393>:
      sgen_clear_tlabs ();
      mono_profiler_gc_event (4, 0);
      btv = mono_100ns_ticks ();
      D.24298 = btv - atv;
      D.24299 = D.24298 / 10;
      D.24300 = (int) D.24299;
      D.24301 = (long long int) D.24300;
      time_minor_fragment_creation.336 = time_minor_fragment_creation;
      time_minor_fragment_creation.337 = D.24301 + time_minor_fragment_creation.336;
      time_minor_fragment_creation = time_minor_fragment_creation.337;
      gc_debug_level.309 = gc_debug_level;
      D.24318 = gc_debug_level.309 > 1;
      D.24319 = (long int) D.24318;
      D.24320 = __builtin_expect (D.24319, 0);
      if (D.24320 != 0) goto <D.24396>; else goto <D.24397>;
      <D.24396>:
      gc_debug_file.310 = gc_debug_file;
      D.24298 = btv - atv;
      D.24299 = D.24298 / 10;
      D.24300 = (int) D.24299;
      fprintf (gc_debug_file.310, "Fragment creation: %d usecs, %lu bytes available\n", D.24300, fragment_total);
      gc_debug_file.310 = gc_debug_file;
      fflush (gc_debug_file.310);
      <D.24397>:
      consistency_check_at_minor_collection.321 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.321 != 0) goto <D.24398>; else goto <D.24399>;
      <D.24398>:
      sgen_check_major_refs ();
      <D.24399>:
      D.24400 = major_collector.finish_nursery_collection;
      D.24400 ();
      all_btv = mono_100ns_ticks ();
      D.24401 = gc_stats.minor_gc_time_usecs;
      D.24402 = all_btv - all_atv;
      D.24403 = D.24402 / 10;
      D.24404 = (int) D.24403;
      D.24405 = (long long int) D.24404;
      D.24406 = D.24401 + D.24405;
      gc_stats.minor_gc_time_usecs = D.24406;
      heap_dump_file.338 = heap_dump_file;
      if (heap_dump_file.338 != 0B) goto <D.24408>; else goto <D.24409>;
      <D.24408>:
      stat_minor_gcs.311 = stat_minor_gcs;
      D.24410 = stat_minor_gcs.311 + -1;
      dump_heap ("minor", D.24410, 0B);
      <D.24409>:
      sgen_finish_pinning ();
      fin_ready_list.331 = fin_ready_list;
      if (fin_ready_list.331 != 0B) goto <D.24411>; else goto <D.24413>;
      <D.24413>:
      critical_fin_list.332 = critical_fin_list;
      if (critical_fin_list.332 != 0B) goto <D.24411>; else goto <D.24412>;
      <D.24411>:
      if (0 != 0) goto <D.24414>; else goto <D.24415>;
      <D.24414>:
      gc_debug_file.310 = gc_debug_file;
      num_ready_finalizers.339 = num_ready_finalizers;
      fprintf (gc_debug_file.310, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.339);
      gc_debug_file.310 = gc_debug_file;
      fflush (gc_debug_file.310);
      <D.24415>:
      mono_gc_finalize_notify ();
      <D.24412>:
      sgen_pin_stats_reset ();
      sgen_cement_clear_below_threshold ();
      D.24417 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24418 = D.24417 == 0;
      D.24419 = (long int) D.24418;
      D.24420 = __builtin_expect (D.24419, 0);
      if (D.24420 != 0) goto <D.24421>; else goto <D.24422>;
      <D.24421>:
      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.24422>:
      D.24423 = remset.finish_minor_collection;
      D.24423 ();
      check_scan_starts ();
      sgen_memgov_minor_collection_end ();
      objects_pinned.335 = objects_pinned;
      D.24424 = objects_pinned.335 != 0;
      needs_major = (gboolean) D.24424;
      current_collection_generation = -1;
      objects_pinned = 0;
      check_nursery_objects_pinned.340 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.340 != 0) goto <D.24426>; else goto <D.24427>;
      <D.24426>:
      D.24428 = sgen_minor_collector.is_split;
      if (D.24428 == 0) goto <D.24429>; else goto <D.24430>;
      <D.24429>:
      D.24431 = unpin_queue != 0B;
      D.24432 = (int) D.24431;
      sgen_check_nursery_objects_pinned (D.24432);
      <D.24430>:
      <D.24427>:
      D.24262 = needs_major;
      return D.24262;
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


job_finish_remembered_set_scan (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2cbc>) (void *, void *, struct SgenGrayQueue *) D.24435;
  char * D.24436;
  char * D.24437;
  struct SgenGrayQueue * D.24438;
  struct FinishRememberedSetScanJobData * job_data;

  job_data = job_data_untyped;
  D.24435 = remset.finish_scan_remsets;
  D.24436 = job_data->heap_start;
  D.24437 = job_data->heap_end;
  D.24438 = sgen_workers_get_job_gray_queue (worker_data);
  D.24435 (D.24436, D.24437, D.24438);
  sgen_free_internal_dynamic (job_data, 8, 20);
}


verify_nursery ()
{
  int do_verify_nursery.341;
  void * D.24442;
  unsigned int D.24447;
  unsigned int D.24448;
  unsigned int D.24450;
  int gc_debug_level.342;
  _Bool D.24453;
  long int D.24454;
  long int D.24455;
  struct FILE * gc_debug_file.343;
  unsigned int D.24459;
  unsigned int D.24464;
  unsigned int D.24465;
  char * D.24466;
  int do_dump_nursery_content.344;
  int cur.345;
  int hole_start.346;
  int D.24476;
  int size.347;
  int ss.348;
  const char * D.24481;
  void * D.24482;
  struct MonoVTable * D.24483;
  _Bool D.24484;
  int D.24485;
  char * start;
  char * end;
  char * cur;
  char * hole_start;

  do_verify_nursery.341 = do_verify_nursery;
  if (do_verify_nursery.341 == 0) goto <D.24440>; else goto <D.24441>;
  <D.24440>:
  return;
  <D.24441>:
  sgen_nursery_allocator_prepare_for_pinning ();
  cur = sgen_get_nursery_start ();
  start = cur;
  hole_start = start;
  end = sgen_get_nursery_end ();
  goto <D.20593>;
  <D.20594>:
  {
    size_t ss;
    size_t size;

    D.24442 = MEM[(void * *)cur];
    if (D.24442 == 0B) goto <D.24443>; else goto <D.24444>;
    <D.24443>:
    cur = cur + 4;
    // predicted unlikely by continue predictor.
    goto <D.20593>;
    <D.24444>:
    D.24447 = MEM[(mword *)cur];
    D.24448 = D.24447 & 1;
    if (D.24448 != 0) goto <D.24449>; else goto <D.24445>;
    <D.24449>:
    D.24447 = MEM[(mword *)cur];
    D.24450 = D.24447 & 4294967292;
    if (D.24450 != 0) goto <D.24451>; else goto <D.24445>;
    <D.24451>:
    gc_debug_level.342 = gc_debug_level;
    D.24453 = gc_debug_level.342 > 0;
    D.24454 = (long int) D.24453;
    D.24455 = __builtin_expect (D.24454, 0);
    if (D.24455 != 0) goto <D.24456>; else goto <D.24457>;
    <D.24456>:
    gc_debug_file.343 = gc_debug_file;
    fprintf (gc_debug_file.343, "FORWARDED OBJ %p\n", cur);
    gc_debug_file.343 = gc_debug_file;
    fflush (gc_debug_file.343);
    <D.24457>:
    goto <D.24446>;
    <D.24445>:
    D.24447 = MEM[(mword *)cur];
    D.24459 = D.24447 & 2;
    if (D.24459 != 0) goto <D.24460>; else goto <D.24461>;
    <D.24460>:
    gc_debug_level.342 = gc_debug_level;
    D.24453 = gc_debug_level.342 > 0;
    D.24454 = (long int) D.24453;
    D.24455 = __builtin_expect (D.24454, 0);
    if (D.24455 != 0) goto <D.24462>; else goto <D.24463>;
    <D.24462>:
    gc_debug_file.343 = gc_debug_file;
    fprintf (gc_debug_file.343, "PINNED OBJ %p\n", cur);
    gc_debug_file.343 = gc_debug_file;
    fflush (gc_debug_file.343);
    <D.24463>:
    <D.24461>:
    <D.24446>:
    ss = sgen_safe_object_get_size (cur);
    D.24464 = sgen_safe_object_get_size (cur);
    D.24465 = D.24464 + 7;
    size = D.24465 & 4294967288;
    D.24466 = cur + size;
    verify_scan_starts (cur, D.24466);
    do_dump_nursery_content.344 = do_dump_nursery_content;
    if (do_dump_nursery_content.344 != 0) goto <D.24468>; else goto <D.24469>;
    <D.24468>:
    if (cur > hole_start) goto <D.24470>; else goto <D.24471>;
    <D.24470>:
    gc_debug_level.342 = gc_debug_level;
    D.24453 = gc_debug_level.342 > 0;
    D.24454 = (long int) D.24453;
    D.24455 = __builtin_expect (D.24454, 0);
    if (D.24455 != 0) goto <D.24472>; else goto <D.24473>;
    <D.24472>:
    gc_debug_file.343 = gc_debug_file;
    cur.345 = (int) cur;
    hole_start.346 = (int) hole_start;
    D.24476 = cur.345 - hole_start.346;
    fprintf (gc_debug_file.343, "HOLE [%p %p %d]\n", hole_start, cur, D.24476);
    gc_debug_file.343 = gc_debug_file;
    fflush (gc_debug_file.343);
    <D.24473>:
    <D.24471>:
    gc_debug_level.342 = gc_debug_level;
    D.24453 = gc_debug_level.342 > 0;
    D.24454 = (long int) D.24453;
    D.24455 = __builtin_expect (D.24454, 0);
    if (D.24455 != 0) goto <D.24477>; else goto <D.24478>;
    <D.24477>:
    gc_debug_file.343 = gc_debug_file;
    D.24466 = cur + size;
    size.347 = (int) size;
    ss.348 = (int) ss;
    D.24481 = sgen_safe_name (cur);
    D.24447 = MEM[(mword *)cur];
    D.24450 = D.24447 & 4294967292;
    D.24482 = (void *) D.24450;
    D.24483 = sgen_get_array_fill_vtable ();
    D.24484 = D.24482 == D.24483;
    D.24485 = (int) D.24484;
    fprintf (gc_debug_file.343, "OBJ  [%p %p %d %d %s %d]\n", cur, D.24466, size.347, ss.348, D.24481, D.24485);
    gc_debug_file.343 = gc_debug_file;
    fflush (gc_debug_file.343);
    <D.24478>:
    <D.24469>:
    cur = cur + size;
    hole_start = cur;
  }
  <D.20593>:
  if (cur < end) goto <D.20594>; else goto <D.20595>;
  <D.20595>:
}


major_do_collection (const char * reason)
{
  int disable_major_collections.349;
  gboolean D.24490;
  long long int (*<T2c60>) (void) D.24491;
  _Bool D.24494;
  long int D.24495;
  long int D.24496;
  int old_next_pin_slot.350;
  long long int D.24500;
  long long int D.24501;
  long long int D.24502;
  int D.24503;
  long long int D.24504;
  long long int D.24505;
  unsigned int bytes_pinned_from_failed_allocation.351;
  _Bool D.24509;
  gint64 all_atv;
  gint64 all_btv;
  int old_next_pin_slot;

  try
    {
      disable_major_collections.349 = disable_major_collections;
      if (disable_major_collections.349 != 0) goto <D.24488>; else goto <D.24489>;
      <D.24488>:
      D.24490 = 0;
      return D.24490;
      <D.24489>:
      D.24491 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.24491 != 0B) goto <D.24492>; else goto <D.24493>;
      <D.24492>:
      {
        long long int num_marked;

        D.24491 = major_collector.get_and_reset_num_major_objects_marked;
        num_marked = D.24491 ();
        D.24494 = num_marked != 0;
        D.24495 = (long int) D.24494;
        D.24496 = __builtin_expect (D.24495, 0);
        if (D.24496 != 0) goto <D.24497>; else goto <D.24498>;
        <D.24497>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3298, "!num_marked");
        <D.24498>:
      }
      <D.24493>:
      all_atv = mono_100ns_ticks ();
      major_start_collection (0, &old_next_pin_slot);
      old_next_pin_slot.350 = old_next_pin_slot;
      major_finish_collection (reason, old_next_pin_slot.350, 0);
      all_btv = mono_100ns_ticks ();
      D.24500 = gc_stats.major_gc_time_usecs;
      D.24501 = all_btv - all_atv;
      D.24502 = D.24501 / 10;
      D.24503 = (int) D.24502;
      D.24504 = (long long int) D.24503;
      D.24505 = D.24500 + D.24504;
      gc_stats.major_gc_time_usecs = D.24505;
      D.24491 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.24491 != 0B) goto <D.24506>; else goto <D.24507>;
      <D.24506>:
      D.24491 = major_collector.get_and_reset_num_major_objects_marked;
      D.24491 ();
      <D.24507>:
      bytes_pinned_from_failed_allocation.351 = bytes_pinned_from_failed_allocation;
      D.24509 = bytes_pinned_from_failed_allocation.351 != 0;
      D.24490 = (gboolean) D.24509;
      return D.24490;
    }
  finally
    {
      old_next_pin_slot = {CLOBBER};
    }
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.24512;
  struct GrayQueueSection * D.24513;
  _Bool D.24514;

  D.24513 = queue->first;
  D.24514 = D.24513 == 0B;
  D.24512 = (gboolean) D.24514;
  return D.24512;
}


sgen_gc_is_object_ready_for_finalization (void * object)
{
  gboolean D.24516;
  int D.24517;
  _Bool D.24518;

  D.24517 = sgen_is_object_alive (object);
  D.24518 = D.24517 == 0;
  D.24516 = (gboolean) D.24518;
  return D.24516;
}


sgen_is_object_alive (void * object)
{
  int D.24520;
  gboolean D.24523;

  D.24520 = sgen_ptr_in_nursery (object);
  if (D.24520 != 0) goto <D.24521>; else goto <D.24522>;
  <D.24521>:
  D.24523 = sgen_nursery_is_object_alive (object);
  return D.24523;
  <D.24522>:
  D.24523 = sgen_major_is_object_alive (object);
  return D.24523;
}


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

  entry = sgen_alloc_internal (6);
  critical = has_critical_finalizer (obj);
  entry->object = obj;
  if (critical != 0) goto <D.24525>; else goto <D.24526>;
  <D.24525>:
  critical_fin_list.352 = critical_fin_list;
  entry->next = critical_fin_list.352;
  critical_fin_list = entry;
  goto <D.24528>;
  <D.24526>:
  fin_ready_list.353 = fin_ready_list;
  entry->next = fin_ready_list.353;
  fin_ready_list = entry;
  <D.24528>:
}


has_critical_finalizer (struct MonoObject * obj)
{
  struct MonoClass * D.24530;
  gboolean D.24533;
  unsigned int D.24534;
  unsigned int D.24535;
  struct MonoVTable * D.24536;
  struct MonoClass * class;

  D.24530 = mono_defaults.critical_finalizer_object;
  if (D.24530 == 0B) goto <D.24531>; else goto <D.24532>;
  <D.24531>:
  D.24533 = 0;
  return D.24533;
  <D.24532>:
  D.24534 = MEM[(mword *)obj];
  D.24535 = D.24534 & 4294967292;
  D.24536 = (struct MonoVTable *) D.24535;
  class = D.24536->klass;
  D.24530 = mono_defaults.critical_finalizer_object;
  D.24533 = mono_class_has_parent_fast (class, D.24530);
  return D.24533;
}


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

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


sgen_is_object_alive_and_on_current_collection (char * object)
{
  int D.24540;
  int D.24543;
  int current_collection_generation.354;

  D.24540 = sgen_ptr_in_nursery (object);
  if (D.24540 != 0) goto <D.24541>; else goto <D.24542>;
  <D.24541>:
  D.24543 = sgen_nursery_is_object_alive (object);
  return D.24543;
  <D.24542>:
  current_collection_generation.354 = current_collection_generation;
  if (current_collection_generation.354 == 0) goto <D.24545>; else goto <D.24546>;
  <D.24545>:
  D.24543 = 0;
  return D.24543;
  <D.24546>:
  D.24543 = sgen_major_is_object_alive (object);
  return D.24543;
}


mono_gc_invoke_finalizers ()
{
  struct FinalizeReadyEntry * * iftmp.355;
  struct FinalizeReadyEntry * D.24554;
  struct FinalizeReadyEntry * D.24557;
  struct FinalizeReadyEntry * D.24559;
  void * D.24561;
  _Bool D.24568;
  long int D.24569;
  long int D.24570;
  int num_ready_finalizers.356;
  int num_ready_finalizers.357;
  struct FILE * gc_debug_file.358;
  const char * D.24578;
  _Bool D.24580;
  long int D.24581;
  long int D.24582;
  struct FinalizeReadyEntry * fin_ready_list.359;
  struct FinalizeReadyEntry * critical_fin_list.360;
  _Bool D.24588;
  long int D.24589;
  long int D.24590;
  int D.24593;
  struct FinalizeReadyEntry * entry;
  gboolean entry_is_critical;
  int count;
  void * obj;

  entry = 0B;
  entry_is_critical = 0;
  count = 0;
  goto <D.20827>;
  <D.20826>:
  pthread_mutex_lock (&gc_mutex);
  if (entry != 0B) goto <D.24548>; else goto <D.24549>;
  <D.24548>:
  {
    struct FinalizeReadyEntry * * list;

    if (entry_is_critical != 0) goto <D.24551>; else goto <D.24552>;
    <D.24551>:
    iftmp.355 = &critical_fin_list;
    goto <D.24553>;
    <D.24552>:
    iftmp.355 = &fin_ready_list;
    <D.24553>:
    list = iftmp.355;
    D.24554 = *list;
    if (D.24554 == entry) goto <D.24555>; else goto <D.24556>;
    <D.24555>:
    D.24557 = entry->next;
    *list = D.24557;
    goto <D.24558>;
    <D.24556>:
    {
      struct FinalizeReadyEntry * e;

      e = *list;
      goto <D.20817>;
      <D.20816>:
      e = e->next;
      <D.20817>:
      D.24559 = e->next;
      if (D.24559 != entry) goto <D.20816>; else goto <D.20818>;
      <D.20818>:
      D.24557 = entry->next;
      e->next = D.24557;
    }
    <D.24558>:
    sgen_free_internal (entry, 6);
    entry = 0B;
  }
  <D.24549>:
  entry = fin_ready_list;
  goto <D.20820>;
  <D.20819>:
  entry = entry->next;
  <D.20820>:
  if (entry != 0B) goto <D.24560>; else goto <D.20821>;
  <D.24560>:
  D.24561 = entry->object;
  if (D.24561 == 0B) goto <D.20819>; else goto <D.20821>;
  <D.20821>:
  if (entry != 0B) goto <D.24562>; else goto <D.24563>;
  <D.24562>:
  entry_is_critical = 0;
  goto <D.24564>;
  <D.24563>:
  entry_is_critical = 1;
  entry = critical_fin_list;
  goto <D.20823>;
  <D.20822>:
  entry = entry->next;
  <D.20823>:
  if (entry != 0B) goto <D.24565>; else goto <D.20824>;
  <D.24565>:
  D.24561 = entry->object;
  if (D.24561 == 0B) goto <D.20822>; else goto <D.20824>;
  <D.20824>:
  <D.24564>:
  if (entry != 0B) goto <D.24566>; else goto <D.24567>;
  <D.24566>:
  D.24561 = entry->object;
  D.24568 = D.24561 == 0B;
  D.24569 = (long int) D.24568;
  D.24570 = __builtin_expect (D.24569, 0);
  if (D.24570 != 0) goto <D.24571>; else goto <D.24572>;
  <D.24571>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3882, "entry->object");
  <D.24572>:
  num_ready_finalizers.356 = num_ready_finalizers;
  num_ready_finalizers.357 = num_ready_finalizers.356 + -1;
  num_ready_finalizers = num_ready_finalizers.357;
  obj = entry->object;
  entry->object = 0B;
  if (0 != 0) goto <D.24575>; else goto <D.24576>;
  <D.24575>:
  gc_debug_file.358 = gc_debug_file;
  D.24578 = safe_name (obj);
  fprintf (gc_debug_file.358, "Finalizing object %p (%s)\n", obj, D.24578);
  gc_debug_file.358 = gc_debug_file;
  fflush (gc_debug_file.358);
  <D.24576>:
  <D.24567>:
  sgen_gc_unlock ();
  if (entry == 0B) goto <D.20825>; else goto <D.24579>;
  <D.24579>:
  D.24561 = entry->object;
  D.24580 = D.24561 != 0B;
  D.24581 = (long int) D.24580;
  D.24582 = __builtin_expect (D.24581, 0);
  if (D.24582 != 0) goto <D.24583>; else goto <D.24584>;
  <D.24583>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3894, "entry->object == NULL");
  <D.24584>:
  count = count + 1;
  mono_gc_run_finalize (obj, 0B);
  <D.20827>:
  fin_ready_list.359 = fin_ready_list;
  if (fin_ready_list.359 != 0B) goto <D.20826>; else goto <D.24586>;
  <D.24586>:
  critical_fin_list.360 = critical_fin_list;
  if (critical_fin_list.360 != 0B) goto <D.20826>; else goto <D.20825>;
  <D.20825>:
  D.24588 = entry != 0B;
  D.24589 = (long int) D.24588;
  D.24590 = __builtin_expect (D.24589, 0);
  if (D.24590 != 0) goto <D.24591>; else goto <D.24592>;
  <D.24591>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3900, "!entry");
  <D.24592>:
  D.24593 = count;
  return D.24593;
}


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

  fin_ready_list.362 = fin_ready_list;
  if (fin_ready_list.362 != 0B) goto <D.24597>; else goto <D.24601>;
  <D.24601>:
  critical_fin_list.363 = critical_fin_list;
  if (critical_fin_list.363 != 0B) goto <D.24597>; else goto <D.24598>;
  <D.24597>:
  iftmp.361 = 1;
  goto <D.24599>;
  <D.24598>:
  iftmp.361 = 0;
  <D.24599>:
  D.24595 = iftmp.361;
  return D.24595;
}


mono_gc_register_root (char * start, size_t size, void * descr)
{
  int D.24604;
  _Bool D.24605;
  int D.24606;

  D.24605 = descr == 0B;
  D.24606 = (int) D.24605;
  D.24604 = mono_gc_register_root_inner (start, size, descr, D.24606);
  return D.24604;
}


mono_gc_register_root_inner (char * start, size_t size, void * descr, int root_type)
{
  struct SgenHashTable * D.24608;
  char * D.24611;
  int D.24612;
  int start.364;
  int D.24614;
  char * D.24615;
  int iftmp.365;
  unsigned int D.24621;
  _Bool D.24624;
  long int D.24625;
  long int D.24626;
  unsigned int descr.366;
  unsigned int roots_size.367;
  unsigned int roots_size.368;
  unsigned int roots_size.369;
  int D.24633;
  struct SgenHashTable * D.24634;
  struct FILE * gc_debug_file.370;
  char * D.24638;
  int size.371;
  int roots_size.372;
  struct RootRecord new_root;
  int i;

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

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

          D.24611 = root->end_root;
          D.24612 = (int) D.24611;
          start.364 = (int) start;
          D.24614 = D.24612 - start.364;
          old_size = (size_t) D.24614;
          D.24615 = start + size;
          root->end_root = D.24615;
          D.24621 = root->root_desc;
          if (D.24621 == 0) goto <D.24617>; else goto <D.24622>;
          <D.24622>:
          if (descr == 0B) goto <D.24617>; else goto <D.24618>;
          <D.24617>:
          D.24621 = root->root_desc;
          if (D.24621 != 0) goto <D.24619>; else goto <D.24623>;
          <D.24623>:
          if (descr != 0B) goto <D.24619>; else goto <D.24618>;
          <D.24619>:
          iftmp.365 = 1;
          goto <D.24620>;
          <D.24618>:
          iftmp.365 = 0;
          <D.24620>:
          D.24624 = iftmp.365 != 0;
          D.24625 = (long int) D.24624;
          D.24626 = __builtin_expect (D.24625, 0);
          if (D.24626 != 0) goto <D.24627>; else goto <D.24628>;
          <D.24627>:
          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.24628>:
          descr.366 = (unsigned int) descr;
          root->root_desc = descr.366;
          roots_size.367 = roots_size;
          roots_size.368 = roots_size.367 + size;
          roots_size = roots_size.368;
          roots_size.367 = roots_size;
          roots_size.369 = roots_size.367 - old_size;
          roots_size = roots_size.369;
          sgen_gc_unlock ();
          D.24633 = 1;
          return D.24633;
        }
        <D.24610>:
      }
      i = i + 1;
      <D.20842>:
      if (i <= 2) goto <D.20841>; else goto <D.20843>;
      <D.20843>:
      D.24615 = start + size;
      new_root.end_root = D.24615;
      descr.366 = (unsigned int) descr;
      new_root.root_desc = descr.366;
      D.24634 = &roots_hash[root_type];
      sgen_hash_table_replace (D.24634, start, &new_root, 0B);
      roots_size.367 = roots_size;
      roots_size.368 = roots_size.367 + size;
      roots_size = roots_size.368;
      if (0 != 0) goto <D.24635>; else goto <D.24636>;
      <D.24635>:
      gc_debug_file.370 = gc_debug_file;
      D.24638 = new_root.end_root;
      size.371 = (int) size;
      roots_size.367 = roots_size;
      roots_size.372 = (int) roots_size.367;
      fprintf (gc_debug_file.370, "Added root for range: %p-%p, descr: %p  (%d/%d bytes)\n", start, D.24638, descr, size.371, roots_size.372);
      gc_debug_file.370 = gc_debug_file;
      fflush (gc_debug_file.370);
      <D.24636>:
      sgen_gc_unlock ();
      D.24633 = 1;
      return D.24633;
    }
  finally
    {
      new_root = {CLOBBER};
    }
}


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

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


mono_gc_deregister_root (char * addr)
{
  struct SgenHashTable * D.24645;
  int D.24646;
  int addr.373;
  char * D.24650;
  int D.24651;
  int D.24652;
  unsigned int D.24653;
  unsigned int roots_size.374;
  unsigned int roots_size.375;
  int root_type;
  struct RootRecord root;

  try
    {
      pthread_mutex_lock (&gc_mutex);
      root_type = 0;
      goto <D.20860>;
      <D.20859>:
      D.24645 = &roots_hash[root_type];
      D.24646 = sgen_hash_table_remove (D.24645, addr, &root);
      if (D.24646 != 0) goto <D.24647>; else goto <D.24648>;
      <D.24647>:
      addr.373 = (int) addr;
      D.24650 = root.end_root;
      D.24651 = (int) D.24650;
      D.24652 = addr.373 - D.24651;
      D.24653 = (unsigned int) D.24652;
      roots_size.374 = roots_size;
      roots_size.375 = D.24653 + roots_size.374;
      roots_size = roots_size.375;
      <D.24648>:
      root_type = root_type + 1;
      <D.20860>:
      if (root_type <= 2) goto <D.20859>; else goto <D.20861>;
      <D.20861>:
      sgen_gc_unlock ();
    }
  finally
    {
      root = {CLOBBER};
    }
}


sgen_get_current_collection_generation ()
{
  int D.24656;

  D.24656 = current_collection_generation;
  return D.24656;
}


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


mono_gc_get_gc_callbacks ()
{
  struct MonoGCCallbacks * D.24658;

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


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

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


mono_gc_scan_object (void * obj)
{
  unsigned int user_copy_or_mark_key.378;
  void (*<T2b4d>) (void * *, struct SgenGrayQueue *) D.24663;
  struct GrayQueue * D.24664;
  void * D.24665;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.378 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.378);
  D.24663 = current_object_ops.copy_or_mark_object;
  D.24664 = data->queue;
  D.24663 (&obj, D.24664);
  D.24665 = obj;
  return D.24665;
}


mono_gc_register_thread (void * baseptr)
{
  gboolean D.24667;
  struct SgenThreadInfo * D.24668;
  _Bool D.24669;

  D.24668 = mono_thread_info_attach (baseptr);
  D.24669 = D.24668 != 0B;
  D.24667 = (gboolean) D.24669;
  return D.24667;
}


mono_gc_set_stack_end (void * stack_end)
{
  void * D.24673;
  _Bool D.24674;
  long int D.24675;
  long int D.24676;
  struct SgenThreadInfo * info;

  pthread_mutex_lock (&gc_mutex);
  info = mono_thread_info_current ();
  if (info != 0B) goto <D.24671>; else goto <D.24672>;
  <D.24671>:
  D.24673 = info->stack_end;
  D.24674 = D.24673 <= stack_end;
  D.24675 = (long int) D.24674;
  D.24676 = __builtin_expect (D.24675, 0);
  if (D.24676 != 0) goto <D.24677>; else goto <D.24678>;
  <D.24677>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4224, "stack_end < info->stack_end");
  <D.24678>:
  info->stack_end = stack_end;
  <D.24672>:
  sgen_gc_unlock ();
}


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

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


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

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


mono_gc_pthread_detach (pthread_t thread)
{
  int D.24683;

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


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.24685;
  struct FILE * gc_debug_file.379;
  void (*<T2ca4>) (struct MonoObject *, void *, struct MonoObject *) D.24693;

  D.24685 = sgen_ptr_in_nursery (field_ptr);
  if (D.24685 != 0) goto <D.24686>; else goto <D.24687>;
  <D.24686>:
  MEM[(void * *)field_ptr] = value;
  return;
  <D.24687>:
  if (0 != 0) goto <D.24688>; else goto <D.24689>;
  <D.24688>:
  gc_debug_file.379 = gc_debug_file;
  fprintf (gc_debug_file.379, "Adding remset at %p\n", field_ptr);
  gc_debug_file.379 = gc_debug_file;
  fflush (gc_debug_file.379);
  <D.24689>:
  if (value != 0B) goto <D.24691>; else goto <D.24692>;
  <D.24691>:
  <D.24692>:
  D.24693 = remset.wbarrier_set_field;
  D.24693 (obj, field_ptr, value);
}


mono_gc_wbarrier_set_arrayref (struct MonoArray * arr, void * slot_ptr, struct MonoObject * value)
{
  int D.24695;
  struct FILE * gc_debug_file.380;
  void (*<T2ca8>) (struct MonoArray *, void *, struct MonoObject *) D.24703;

  D.24695 = sgen_ptr_in_nursery (slot_ptr);
  if (D.24695 != 0) goto <D.24696>; else goto <D.24697>;
  <D.24696>:
  MEM[(void * *)slot_ptr] = value;
  return;
  <D.24697>:
  if (0 != 0) goto <D.24698>; else goto <D.24699>;
  <D.24698>:
  gc_debug_file.380 = gc_debug_file;
  fprintf (gc_debug_file.380, "Adding remset at %p\n", slot_ptr);
  gc_debug_file.380 = gc_debug_file;
  fflush (gc_debug_file.380);
  <D.24699>:
  if (value != 0B) goto <D.24701>; else goto <D.24702>;
  <D.24701>:
  <D.24702>:
  D.24703 = remset.wbarrier_set_arrayref;
  D.24703 (arr, slot_ptr, value);
}


mono_gc_wbarrier_arrayref_copy (void * dest_ptr, void * src_ptr, int count)
{
  int D.24707;
  unsigned int count.381;
  unsigned int D.24710;
  void (*<T2cac>) (void *, void *, int) D.24711;

  D.24707 = sgen_ptr_in_nursery (dest_ptr);
  if (D.24707 != 0) goto <D.24705>; else goto <D.24708>;
  <D.24708>:
  if (count <= 0) goto <D.24705>; else goto <D.24706>;
  <D.24705>:
  count.381 = (unsigned int) count;
  D.24710 = count.381 * 4;
  mono_gc_memmove_aligned (dest_ptr, src_ptr, D.24710);
  return;
  <D.24706>:
  D.24711 = remset.wbarrier_arrayref_copy;
  D.24711 (dest_ptr, src_ptr, count);
}


find_object_for_ptr (char * ptr)
{
  struct GCMemSection * nursery_section.382;
  char * D.24714;
  char * D.24717;
  char * found_obj.383;
  char * D.24723;
  void (*<T2c43>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24726;

  nursery_section.382 = nursery_section;
  D.24714 = nursery_section.382->data;
  if (D.24714 <= ptr) goto <D.24715>; else goto <D.24716>;
  <D.24715>:
  nursery_section.382 = nursery_section;
  D.24717 = nursery_section.382->end_data;
  if (D.24717 > ptr) goto <D.24718>; else goto <D.24719>;
  <D.24718>:
  found_obj = 0B;
  nursery_section.382 = nursery_section;
  D.24714 = nursery_section.382->data;
  nursery_section.382 = nursery_section;
  D.24717 = nursery_section.382->end_data;
  sgen_scan_area_with_callback (D.24714, D.24717, find_object_for_ptr_callback, ptr, 1);
  found_obj.383 = found_obj;
  if (found_obj.383 != 0B) goto <D.24721>; else goto <D.24722>;
  <D.24721>:
  D.24723 = found_obj;
  return D.24723;
  <D.24722>:
  <D.24719>:
  <D.24716>:
  found_obj = 0B;
  sgen_los_iterate_objects (find_object_for_ptr_callback, ptr);
  found_obj.383 = found_obj;
  if (found_obj.383 != 0B) goto <D.24724>; else goto <D.24725>;
  <D.24724>:
  D.24723 = found_obj;
  return D.24723;
  <D.24725>:
  found_obj = 0B;
  D.24726 = major_collector.iterate_objects;
  D.24726 (1, 1, find_object_for_ptr_callback, ptr);
  D.24723 = found_obj;
  return D.24723;
}


find_object_for_ptr_callback (char * obj, size_t size, void * user_data)
{
  char * D.24730;
  char * found_obj.384;
  _Bool D.24734;
  long int D.24735;
  long int D.24736;
  char * ptr;

  ptr = user_data;
  if (ptr >= obj) goto <D.24728>; else goto <D.24729>;
  <D.24728>:
  D.24730 = obj + size;
  if (D.24730 > ptr) goto <D.24731>; else goto <D.24732>;
  <D.24731>:
  found_obj.384 = found_obj;
  D.24734 = found_obj.384 != 0B;
  D.24735 = (long int) D.24734;
  D.24736 = __builtin_expect (D.24735, 0);
  if (D.24736 != 0) goto <D.24737>; else goto <D.24738>;
  <D.24737>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4335, "!found_obj");
  <D.24738>:
  found_obj = obj;
  <D.24732>:
  <D.24729>:
}


mono_gc_wbarrier_generic_nostore (void * ptr)
{
  int D.24743;
  int D.24745;
  struct FILE * gc_debug_file.385;
  int D.24749;
  int concurrent_collection_in_progress.386;
  void (*<T1113>) (void *) D.24759;
  void * obj;

  obj = MEM[(void * *)ptr];
  if (obj != 0B) goto <D.24739>; else goto <D.24740>;
  <D.24739>:
  <D.24740>:
  D.24743 = sgen_ptr_in_nursery (ptr);
  if (D.24743 != 0) goto <D.24741>; else goto <D.24744>;
  <D.24744>:
  D.24745 = ptr_on_stack (ptr);
  if (D.24745 != 0) goto <D.24741>; else goto <D.24742>;
  <D.24741>:
  if (0 != 0) goto <D.24746>; else goto <D.24747>;
  <D.24746>:
  gc_debug_file.385 = gc_debug_file;
  fprintf (gc_debug_file.385, "Skipping remset at %p\n", ptr);
  gc_debug_file.385 = gc_debug_file;
  fflush (gc_debug_file.385);
  <D.24747>:
  return;
  <D.24742>:
  D.24749 = sgen_ptr_in_nursery (obj);
  if (D.24749 == 0) goto <D.24750>; else goto <D.24751>;
  <D.24750>:
  concurrent_collection_in_progress.386 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.386 == 0) goto <D.24753>; else goto <D.24754>;
  <D.24753>:
  if (0 != 0) goto <D.24755>; else goto <D.24756>;
  <D.24755>:
  gc_debug_file.385 = gc_debug_file;
  fprintf (gc_debug_file.385, "Skipping remset at %p\n", ptr);
  gc_debug_file.385 = gc_debug_file;
  fflush (gc_debug_file.385);
  <D.24756>:
  return;
  <D.24754>:
  <D.24751>:
  if (0 != 0) goto <D.24757>; else goto <D.24758>;
  <D.24757>:
  gc_debug_file.385 = gc_debug_file;
  fprintf (gc_debug_file.385, "Adding remset at %p\n", ptr);
  gc_debug_file.385 = gc_debug_file;
  fflush (gc_debug_file.385);
  <D.24758>:
  D.24759 = remset.wbarrier_generic_nostore;
  D.24759 (ptr);
}


ptr_on_stack (void * ptr)
{
  void * stack_start.387;
  void * D.24764;
  gboolean D.24767;
  void * stack_start;
  struct SgenThreadInfo * info;

  try
    {
      stack_start = &stack_start;
      info = mono_thread_info_current ();
      stack_start.387 = stack_start;
      if (ptr >= stack_start.387) goto <D.24762>; else goto <D.24763>;
      <D.24762>:
      D.24764 = info->stack_end;
      if (D.24764 > ptr) goto <D.24765>; else goto <D.24766>;
      <D.24765>:
      D.24767 = 1;
      return D.24767;
      <D.24766>:
      <D.24763>:
      D.24767 = 0;
      return D.24767;
    }
  finally
    {
      stack_start = {CLOBBER};
    }
}


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

  if (0 != 0) goto <D.24770>; else goto <D.24771>;
  <D.24770>:
  gc_debug_file.388 = gc_debug_file;
  if (value != 0B) goto <D.24774>; else goto <D.24775>;
  <D.24774>:
  iftmp.389 = safe_name (value);
  goto <D.24776>;
  <D.24775>:
  iftmp.389 = "null";
  <D.24776>:
  fprintf (gc_debug_file.388, "Wbarrier store at %p to %p (%s)\n", ptr, value, iftmp.389);
  gc_debug_file.388 = gc_debug_file;
  fflush (gc_debug_file.388);
  <D.24771>:
  MEM[(void * *)ptr] = value;
  D.24777 = sgen_ptr_in_nursery (value);
  if (D.24777 != 0) goto <D.24778>; else goto <D.24779>;
  <D.24778>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.24779>:
  sgen_dummy_use (value);
}


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


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

  if (0 != 0) goto <D.24780>; else goto <D.24781>;
  <D.24780>:
  gc_debug_file.390 = gc_debug_file;
  if (value != 0B) goto <D.24784>; else goto <D.24785>;
  <D.24784>:
  iftmp.391 = safe_name (value);
  goto <D.24786>;
  <D.24785>:
  iftmp.391 = "null";
  <D.24786>:
  fprintf (gc_debug_file.390, "Wbarrier atomic store at %p to %p (%s)\n", ptr, value, iftmp.391);
  gc_debug_file.390 = gc_debug_file;
  fflush (gc_debug_file.390);
  <D.24781>:
  InterlockedWritePointer (ptr, value);
  D.24787 = sgen_ptr_in_nursery (value);
  if (D.24787 != 0) goto <D.24788>; else goto <D.24789>;
  <D.24788>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.24789>:
  sgen_dummy_use (value);
}


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


InterlockedExchangePointer (void * volatile * val, void * new_val)
{
  unsigned int old_val.392;
  unsigned int new_val.393;
  unsigned int D.24792;
  void * D.24793;
  void * D.24794;
  void * old_val;

  <D.11806>:
  old_val = *val;
  old_val.392 = (unsigned int) old_val;
  new_val.393 = (unsigned int) new_val;
  D.24792 = __sync_val_compare_and_swap_4 (val, old_val.392, new_val.393);
  D.24793 = (void *) D.24792;
  if (D.24793 != old_val) goto <D.11806>; else goto <D.11807>;
  <D.11807>:
  D.24794 = old_val;
  return D.24794;
}


mono_gc_wbarrier_value_copy_bitmap (void * _dest, void * _src, int size, unsigned int bitmap)
{
  unsigned int D.24796;
  unsigned int D.24799;
  struct MonoObject * D.24800;
  mword * dest;
  mword * src;

  dest = _dest;
  src = _src;
  goto <D.20987>;
  <D.20986>:
  D.24796 = bitmap & 1;
  if (D.24796 != 0) goto <D.24797>; else goto <D.24798>;
  <D.24797>:
  D.24799 = *src;
  D.24800 = (struct MonoObject *) D.24799;
  mono_gc_wbarrier_generic_store (dest, D.24800);
  goto <D.24801>;
  <D.24798>:
  D.24799 = *src;
  *dest = D.24799;
  <D.24801>:
  src = src + 4;
  dest = dest + 4;
  size = size + -4;
  bitmap = bitmap >> 1;
  <D.20987>:
  if (size != 0) goto <D.20986>; else goto <D.20988>;
  <D.20988>:
}


mono_gc_wbarrier_value_copy (void * dest, void * src, int count, struct MonoClass * klass)
{
  unsigned int D.24802;
  unsigned int D.24803;
  _Bool D.24804;
  long int D.24805;
  long int D.24806;
  struct FILE * gc_debug_file.394;
  void * D.24812;
  const char * D.24813;
  int D.24816;
  int D.24818;
  unsigned int D.24820;
  int D.24821;
  int D.24822;
  unsigned int count.395;
  void (*<T2cb0>) (void *, void *, int, struct MonoClass *) D.24824;

  D.24802 = BIT_FIELD_REF <*klass, 32, 160>;
  D.24803 = D.24802 & 8;
  D.24804 = D.24803 == 0;
  D.24805 = (long int) D.24804;
  D.24806 = __builtin_expect (D.24805, 0);
  if (D.24806 != 0) goto <D.24807>; else goto <D.24808>;
  <D.24807>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4480, "klass->valuetype");
  <D.24808>:
  if (0 != 0) goto <D.24809>; else goto <D.24810>;
  <D.24809>:
  gc_debug_file.394 = gc_debug_file;
  D.24812 = klass->gc_descr;
  D.24813 = klass->name;
  fprintf (gc_debug_file.394, "Adding value remset at %p, count %d, descr %p for class %s (%p)\n", dest, count, D.24812, D.24813, klass);
  gc_debug_file.394 = gc_debug_file;
  fflush (gc_debug_file.394);
  <D.24810>:
  D.24816 = sgen_ptr_in_nursery (dest);
  if (D.24816 != 0) goto <D.24814>; else goto <D.24817>;
  <D.24817>:
  D.24818 = ptr_on_stack (dest);
  if (D.24818 != 0) goto <D.24814>; else goto <D.24819>;
  <D.24819>:
  D.24812 = klass->gc_descr;
  D.24820 = (unsigned int) D.24812;
  D.24821 = sgen_gc_descr_has_references (D.24820);
  if (D.24821 == 0) goto <D.24814>; else goto <D.24815>;
  <D.24814>:
  {
    size_t element_size;
    size_t size;

    D.24822 = mono_class_value_size (klass, 0B);
    element_size = (size_t) D.24822;
    count.395 = (unsigned int) count;
    size = count.395 * element_size;
    mono_gc_memmove_atomic (dest, src, size);
    return;
  }
  <D.24815>:
  D.24824 = remset.wbarrier_value_copy;
  D.24824 (dest, src, count, klass);
}


mono_gc_wbarrier_object_copy (struct MonoObject * obj, struct MonoObject * src)
{
  int D.24828;
  int D.24830;
  struct MonoVTable * D.24831;
  struct MonoClass * D.24832;
  void * D.24833;
  const void * D.24834;
  unsigned int size.396;
  unsigned int D.24836;
  void (*<T2cb4>) (struct MonoObject *, struct MonoObject *) D.24837;
  int size;

  D.24828 = sgen_ptr_in_nursery (obj);
  if (D.24828 != 0) goto <D.24826>; else goto <D.24829>;
  <D.24829>:
  D.24830 = ptr_on_stack (obj);
  if (D.24830 != 0) goto <D.24826>; else goto <D.24827>;
  <D.24826>:
  D.24831 = obj->vtable;
  D.24832 = D.24831->klass;
  size = D.24832->instance_size;
  D.24833 = obj + 8;
  D.24834 = src + 8;
  size.396 = (unsigned int) size;
  D.24836 = size.396 + 4294967288;
  mono_gc_memmove_aligned (D.24833, D.24834, D.24836);
  return;
  <D.24827>:
  D.24837 = remset.wbarrier_object_copy;
  D.24837 (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.397;
  char * D.24840;
  char * D.24841;
  void (*<T2c43>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24842;
  int D.24843;
  struct HeapWalkInfo hwi;

  try
    {
      hwi.flags = flags;
      hwi.callback = callback;
      hwi.data = data;
      sgen_clear_nursery_fragments ();
      nursery_section.397 = nursery_section;
      D.24840 = nursery_section.397->data;
      nursery_section.397 = nursery_section;
      D.24841 = nursery_section.397->end_data;
      sgen_scan_area_with_callback (D.24840, D.24841, walk_references, &hwi, 0);
      D.24842 = major_collector.iterate_objects;
      D.24842 (1, 1, walk_references, &hwi);
      sgen_los_iterate_objects (walk_references, &hwi);
      D.24843 = 0;
      return D.24843;
    }
  finally
    {
      hwi = {CLOBBER};
    }
}


walk_references (char * start, size_t size, void * data)
{
  int D.24848;
  int D.24850;
  int (*<T2eab>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.24851;
  struct MonoVTable * D.24852;
  struct MonoClass * D.24853;
  size_t iftmp.398;
  unsigned int D.24858;
  struct MonoObject *[128] * D.24859;
  uintptr_t[128] * D.24860;
  void * D.24861;
  struct HeapWalkInfo * hwi;

  hwi = data;
  hwi->called = 0;
  hwi->count = 0;
  collect_references (hwi, start, size);
  D.24848 = hwi->count;
  if (D.24848 != 0) goto <D.24846>; else goto <D.24849>;
  <D.24849>:
  D.24850 = hwi->called;
  if (D.24850 == 0) goto <D.24846>; else goto <D.24847>;
  <D.24846>:
  D.24851 = hwi->callback;
  D.24852 = MEM[(struct MonoObject *)start].vtable;
  D.24853 = D.24852->klass;
  D.24850 = hwi->called;
  if (D.24850 == 0) goto <D.24855>; else goto <D.24856>;
  <D.24855>:
  iftmp.398 = size;
  goto <D.24857>;
  <D.24856>:
  iftmp.398 = 0;
  <D.24857>:
  D.24848 = hwi->count;
  D.24858 = (unsigned int) D.24848;
  D.24859 = &hwi->refs;
  D.24860 = &hwi->offsets;
  D.24861 = hwi->data;
  D.24851 (start, D.24853, iftmp.398, D.24858, D.24859, D.24860, D.24861);
  <D.24847>:
}


collect_references (struct HeapWalkInfo * hwi, char * start, size_t size)
{
  unsigned int D.24862;
  unsigned int D.24863;
  unsigned int D.24864;
  unsigned int D.24865;
  unsigned int D.24868;
  unsigned int D.24869;
  unsigned int D.24870;
  unsigned int D.24871;
  unsigned int D.24872;
  void * D.24873;
  int D.24876;
  int (*<T2eab>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.24879;
  struct MonoVTable * D.24880;
  struct MonoClass * D.24881;
  size_t iftmp.399;
  int D.24883;
  unsigned int D.24887;
  struct MonoObject *[128] * D.24888;
  uintptr_t[128] * D.24889;
  void * D.24890;
  int _objptr.400;
  int start.401;
  int D.24893;
  unsigned int D.24894;
  int D.24895;
  int D.24896;
  size_t iftmp.402;
  int D.24905;
  int D.24906;
  unsigned int _index.403;
  unsigned int D.24908;
  int D.24909;
  void * D.24910;
  size_t iftmp.404;
  int _objptr.405;
  int D.24920;
  unsigned int D.24921;
  int D.24922;
  int D.24923;
  unsigned int _index.406;
  unsigned int D.24925;
  int D.24926;
  size_t iftmp.407;
  int D.24935;
  int D.24936;
  unsigned int D.24937;
  unsigned int D.24940;
  int D.24941;
  int desc.408;
  unsigned int D.24945;
  unsigned int el_size.409;
  unsigned int D.24947;
  void * D.24948;
  size_t iftmp.410;
  int p.411;
  int D.24958;
  unsigned int D.24959;
  int D.24960;
  int D.24961;
  int D.24965;
  unsigned int offset.412;
  unsigned int D.24967;
  unsigned int i.413;
  unsigned int D.24969;
  void * * D.24970;
  void * D.24971;
  size_t iftmp.414;
  char * D.24980;
  int D.24981;
  int D.24982;
  unsigned int D.24983;
  int D.24984;
  int D.24985;
  sizetype el_size.415;
  unsigned int D.24990;
  void * D.24993;
  size_t iftmp.416;
  int p.417;
  int D.25003;
  unsigned int D.25004;
  int D.25005;
  int D.25006;
  unsigned int D.25007;
  void * D.25010;
  size_t iftmp.418;
  int _objptr.419;
  int D.25020;
  unsigned int D.25021;
  int D.25022;
  int D.25023;
  unsigned int D.25024;
  unsigned int D.25025;
  struct MonoVTable * D.25028;
  struct MonoClass * D.25029;
  const char * D.25030;
  const char * D.25031;
  gsize * bitmap_data.420;
  unsigned int D.25033;
  void * D.25036;
  size_t iftmp.421;
  int _objptr.422;
  int D.25046;
  unsigned int D.25047;
  int D.25048;
  int D.25049;
  int bwords.423;
  unsigned int D.25051;
  gsize * mbitmap_data.424;
  unsigned int D.25053;
  unsigned int D.25054;
  struct MonoClass * D.25055;
  unsigned int el_size.425;
  unsigned int D.25057;
  const char * D.25060;
  const char * D.25061;
  gsize * bitmap_data.426;
  unsigned int D.25063;
  void * D.25066;
  size_t iftmp.427;
  int _objptr.428;
  int D.25076;
  unsigned int D.25077;
  int D.25078;
  int D.25079;
  unsigned int bwords.429;
  sizetype el_size.430;

  {
    struct GCVTable * vt;
    mword desc;

    D.24862 = MEM[(mword *)start];
    D.24863 = D.24862 & 4294967292;
    vt = (struct GCVTable *) D.24863;
    desc = vt->desc;
    D.24864 = desc & 7;
    switch (D.24864) <default: <D.21103>, case 1: <D.21018>, case 2: <D.21025>, case 3: <D.21069>, case 4: <D.21033>, case 5: <D.21063>, case 6: <D.21082>, case 7: <D.21102>>
    <D.21018>:
    D.24865 = desc & 4294901760;
    if (D.24865 != 0) goto <D.24866>; else goto <D.24867>;
    <D.24866>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.24868 = desc >> 16;
      D.24869 = D.24868 & 255;
      D.24870 = D.24869 * 4;
      _objptr = _objptr + D.24870;
      D.24871 = desc >> 24;
      D.24872 = D.24871 * 4;
      _objptr_end = _objptr + D.24872;
      D.24873 = *_objptr;
      if (D.24873 != 0B) goto <D.24874>; else goto <D.24875>;
      <D.24874>:
      D.24876 = hwi->count;
      if (D.24876 == 128) goto <D.24877>; else goto <D.24878>;
      <D.24877>:
      D.24879 = hwi->callback;
      D.24880 = MEM[(struct MonoObject *)start].vtable;
      D.24881 = D.24880->klass;
      D.24883 = hwi->called;
      if (D.24883 == 0) goto <D.24884>; else goto <D.24885>;
      <D.24884>:
      iftmp.399 = size;
      goto <D.24886>;
      <D.24885>:
      iftmp.399 = 0;
      <D.24886>:
      D.24876 = hwi->count;
      D.24887 = (unsigned int) D.24876;
      D.24888 = &hwi->refs;
      D.24889 = &hwi->offsets;
      D.24890 = hwi->data;
      D.24879 (start, D.24881, iftmp.399, D.24887, D.24888, D.24889, D.24890);
      hwi->count = 0;
      hwi->called = 1;
      <D.24878>:
      D.24876 = hwi->count;
      _objptr.400 = (int) _objptr;
      start.401 = (int) start;
      D.24893 = _objptr.400 - start.401;
      D.24894 = (unsigned int) D.24893;
      hwi->offsets[D.24876] = D.24894;
      D.24876 = hwi->count;
      D.24895 = D.24876;
      D.24896 = D.24895 + 1;
      hwi->count = D.24896;
      D.24873 = *_objptr;
      hwi->refs[D.24895] = D.24873;
      <D.24875>:
      _objptr = _objptr + 4;
      goto <D.21022>;
      <D.21021>:
      D.24873 = *_objptr;
      if (D.24873 != 0B) goto <D.24897>; else goto <D.24898>;
      <D.24897>:
      D.24876 = hwi->count;
      if (D.24876 == 128) goto <D.24899>; else goto <D.24900>;
      <D.24899>:
      D.24879 = hwi->callback;
      D.24880 = MEM[(struct MonoObject *)start].vtable;
      D.24881 = D.24880->klass;
      D.24883 = hwi->called;
      if (D.24883 == 0) goto <D.24902>; else goto <D.24903>;
      <D.24902>:
      iftmp.402 = size;
      goto <D.24904>;
      <D.24903>:
      iftmp.402 = 0;
      <D.24904>:
      D.24876 = hwi->count;
      D.24887 = (unsigned int) D.24876;
      D.24888 = &hwi->refs;
      D.24889 = &hwi->offsets;
      D.24890 = hwi->data;
      D.24879 (start, D.24881, iftmp.402, D.24887, D.24888, D.24889, D.24890);
      hwi->count = 0;
      hwi->called = 1;
      <D.24900>:
      D.24876 = hwi->count;
      _objptr.400 = (int) _objptr;
      start.401 = (int) start;
      D.24893 = _objptr.400 - start.401;
      D.24894 = (unsigned int) D.24893;
      hwi->offsets[D.24876] = D.24894;
      D.24876 = hwi->count;
      D.24905 = D.24876;
      D.24906 = D.24905 + 1;
      hwi->count = D.24906;
      D.24873 = *_objptr;
      hwi->refs[D.24905] = D.24873;
      <D.24898>:
      _objptr = _objptr + 4;
      <D.21022>:
      if (_objptr < _objptr_end) goto <D.21021>; else goto <D.21023>;
      <D.21023>:
    }
    <D.24867>:
    goto <D.21024>;
    <D.21025>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.403 = (unsigned int) _index;
        D.24908 = _index.403 * 4;
        _objptr = _objptr + D.24908;
        D.24909 = _index + 1;
        _bmap = _bmap >> D.24909;
        D.24910 = *_objptr;
        if (D.24910 != 0B) goto <D.24911>; else goto <D.24912>;
        <D.24911>:
        D.24876 = hwi->count;
        if (D.24876 == 128) goto <D.24913>; else goto <D.24914>;
        <D.24913>:
        D.24879 = hwi->callback;
        D.24880 = MEM[(struct MonoObject *)start].vtable;
        D.24881 = D.24880->klass;
        D.24883 = hwi->called;
        if (D.24883 == 0) goto <D.24916>; else goto <D.24917>;
        <D.24916>:
        iftmp.404 = size;
        goto <D.24918>;
        <D.24917>:
        iftmp.404 = 0;
        <D.24918>:
        D.24876 = hwi->count;
        D.24887 = (unsigned int) D.24876;
        D.24888 = &hwi->refs;
        D.24889 = &hwi->offsets;
        D.24890 = hwi->data;
        D.24879 (start, D.24881, iftmp.404, D.24887, D.24888, D.24889, D.24890);
        hwi->count = 0;
        hwi->called = 1;
        <D.24914>:
        D.24876 = hwi->count;
        _objptr.405 = (int) _objptr;
        start.401 = (int) start;
        D.24920 = _objptr.405 - start.401;
        D.24921 = (unsigned int) D.24920;
        hwi->offsets[D.24876] = D.24921;
        D.24876 = hwi->count;
        D.24922 = D.24876;
        D.24923 = D.24922 + 1;
        hwi->count = D.24923;
        D.24910 = *_objptr;
        hwi->refs[D.24922] = D.24910;
        <D.24912>:
        _objptr = _objptr + 4;
      }
      goto <D.21031>;
      <D.21030>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.406 = (unsigned int) _index;
        D.24925 = _index.406 * 4;
        _objptr = _objptr + D.24925;
        D.24926 = _index + 1;
        _bmap = _bmap >> D.24926;
        D.24910 = *_objptr;
        if (D.24910 != 0B) goto <D.24927>; else goto <D.24928>;
        <D.24927>:
        D.24876 = hwi->count;
        if (D.24876 == 128) goto <D.24929>; else goto <D.24930>;
        <D.24929>:
        D.24879 = hwi->callback;
        D.24880 = MEM[(struct MonoObject *)start].vtable;
        D.24881 = D.24880->klass;
        D.24883 = hwi->called;
        if (D.24883 == 0) goto <D.24932>; else goto <D.24933>;
        <D.24932>:
        iftmp.407 = size;
        goto <D.24934>;
        <D.24933>:
        iftmp.407 = 0;
        <D.24934>:
        D.24876 = hwi->count;
        D.24887 = (unsigned int) D.24876;
        D.24888 = &hwi->refs;
        D.24889 = &hwi->offsets;
        D.24890 = hwi->data;
        D.24879 (start, D.24881, iftmp.407, D.24887, D.24888, D.24889, D.24890);
        hwi->count = 0;
        hwi->called = 1;
        <D.24930>:
        D.24876 = hwi->count;
        _objptr.405 = (int) _objptr;
        start.401 = (int) start;
        D.24920 = _objptr.405 - start.401;
        D.24921 = (unsigned int) D.24920;
        hwi->offsets[D.24876] = D.24921;
        D.24876 = hwi->count;
        D.24935 = D.24876;
        D.24936 = D.24935 + 1;
        hwi->count = D.24936;
        D.24910 = *_objptr;
        hwi->refs[D.24935] = D.24910;
        <D.24928>:
        _objptr = _objptr + 4;
      }
      <D.21031>:
      if (_bmap != 0) goto <D.21030>; else goto <D.21032>;
      <D.21032>:
    }
    goto <D.21024>;
    <D.21033>:
    D.24937 = desc & 4294950912;
    if (D.24937 != 0) goto <D.24938>; else goto <D.24939>;
    <D.24938>:
    {
      int el_size;
      int etype;

      D.24940 = desc >> 3;
      D.24941 = (int) D.24940;
      el_size = D.24941 & 1023;
      desc.408 = (int) desc;
      etype = desc.408 & 49152;
      if (etype == 16384) goto <D.24943>; else goto <D.24944>;
      <D.24943>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.24945 = MEM[(struct MonoArray *)start].max_length;
        el_size.409 = (unsigned int) el_size;
        D.24947 = D.24945 * el_size.409;
        end_refs = p + D.24947;
        goto <D.21039>;
        <D.21038>:
        D.24948 = *p;
        if (D.24948 != 0B) goto <D.24949>; else goto <D.24950>;
        <D.24949>:
        D.24876 = hwi->count;
        if (D.24876 == 128) goto <D.24951>; else goto <D.24952>;
        <D.24951>:
        D.24879 = hwi->callback;
        D.24880 = MEM[(struct MonoObject *)start].vtable;
        D.24881 = D.24880->klass;
        D.24883 = hwi->called;
        if (D.24883 == 0) goto <D.24954>; else goto <D.24955>;
        <D.24954>:
        iftmp.410 = size;
        goto <D.24956>;
        <D.24955>:
        iftmp.410 = 0;
        <D.24956>:
        D.24876 = hwi->count;
        D.24887 = (unsigned int) D.24876;
        D.24888 = &hwi->refs;
        D.24889 = &hwi->offsets;
        D.24890 = hwi->data;
        D.24879 (start, D.24881, iftmp.410, D.24887, D.24888, D.24889, D.24890);
        hwi->count = 0;
        hwi->called = 1;
        <D.24952>:
        D.24876 = hwi->count;
        p.411 = (int) p;
        start.401 = (int) start;
        D.24958 = p.411 - start.401;
        D.24959 = (unsigned int) D.24958;
        hwi->offsets[D.24876] = D.24959;
        D.24876 = hwi->count;
        D.24960 = D.24876;
        D.24961 = D.24960 + 1;
        hwi->count = D.24961;
        D.24948 = *p;
        hwi->refs[D.24960] = D.24948;
        <D.24950>:
        p = p + 4;
        <D.21039>:
        if (p < end_refs) goto <D.21038>; else goto <D.21040>;
        <D.21040>:
      }
      goto <D.24962>;
      <D.24944>:
      if (etype == 32768) goto <D.24963>; else goto <D.24964>;
      <D.24963>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.24868 = desc >> 16;
        D.24965 = (int) D.24868;
        offset = D.24965 & 255;
        D.24871 = desc >> 24;
        num_refs = (int) D.24871;
        e_start = start + 16;
        D.24945 = MEM[(struct MonoArray *)start].max_length;
        el_size.409 = (unsigned int) el_size;
        D.24947 = D.24945 * el_size.409;
        e_end = e_start + D.24947;
        goto <D.21051>;
        <D.21050>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.412 = (unsigned int) offset;
          D.24967 = offset.412 * 4;
          p = p + D.24967;
          i = 0;
          goto <D.21048>;
          <D.21047>:
          i.413 = (unsigned int) i;
          D.24969 = i.413 * 4;
          D.24970 = p + D.24969;
          D.24971 = *D.24970;
          if (D.24971 != 0B) goto <D.24972>; else goto <D.24973>;
          <D.24972>:
          D.24876 = hwi->count;
          if (D.24876 == 128) goto <D.24974>; else goto <D.24975>;
          <D.24974>:
          D.24879 = hwi->callback;
          D.24880 = MEM[(struct MonoObject *)start].vtable;
          D.24881 = D.24880->klass;
          D.24883 = hwi->called;
          if (D.24883 == 0) goto <D.24977>; else goto <D.24978>;
          <D.24977>:
          iftmp.414 = size;
          goto <D.24979>;
          <D.24978>:
          iftmp.414 = 0;
          <D.24979>:
          D.24876 = hwi->count;
          D.24887 = (unsigned int) D.24876;
          D.24888 = &hwi->refs;
          D.24889 = &hwi->offsets;
          D.24890 = hwi->data;
          D.24879 (start, D.24881, iftmp.414, D.24887, D.24888, D.24889, D.24890);
          hwi->count = 0;
          hwi->called = 1;
          <D.24975>:
          D.24876 = hwi->count;
          i.413 = (unsigned int) i;
          D.24969 = i.413 * 4;
          D.24980 = p + D.24969;
          D.24981 = (int) D.24980;
          start.401 = (int) start;
          D.24982 = D.24981 - start.401;
          D.24983 = (unsigned int) D.24982;
          hwi->offsets[D.24876] = D.24983;
          D.24876 = hwi->count;
          D.24984 = D.24876;
          D.24985 = D.24984 + 1;
          hwi->count = D.24985;
          i.413 = (unsigned int) i;
          D.24969 = i.413 * 4;
          D.24970 = p + D.24969;
          D.24971 = *D.24970;
          hwi->refs[D.24984] = D.24971;
          <D.24973>:
          i = i + 1;
          <D.21048>:
          if (i < num_refs) goto <D.21047>; else goto <D.21049>;
          <D.21049>:
          el_size.415 = (sizetype) el_size;
          e_start = e_start + el_size.415;
        }
        <D.21051>:
        if (e_start < e_end) goto <D.21050>; else goto <D.21052>;
        <D.21052>:
      }
      goto <D.24987>;
      <D.24964>:
      if (etype == 49152) goto <D.24988>; else goto <D.24989>;
      <D.24988>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.24945 = MEM[(struct MonoArray *)start].max_length;
        el_size.409 = (unsigned int) el_size;
        D.24947 = D.24945 * el_size.409;
        e_end = e_start + D.24947;
        goto <D.21061>;
        <D.21060>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.21058>;
          <D.21057>:
          D.24990 = _bmap & 1;
          if (D.24990 != 0) goto <D.24991>; else goto <D.24992>;
          <D.24991>:
          D.24993 = *p;
          if (D.24993 != 0B) goto <D.24994>; else goto <D.24995>;
          <D.24994>:
          D.24876 = hwi->count;
          if (D.24876 == 128) goto <D.24996>; else goto <D.24997>;
          <D.24996>:
          D.24879 = hwi->callback;
          D.24880 = MEM[(struct MonoObject *)start].vtable;
          D.24881 = D.24880->klass;
          D.24883 = hwi->called;
          if (D.24883 == 0) goto <D.24999>; else goto <D.25000>;
          <D.24999>:
          iftmp.416 = size;
          goto <D.25001>;
          <D.25000>:
          iftmp.416 = 0;
          <D.25001>:
          D.24876 = hwi->count;
          D.24887 = (unsigned int) D.24876;
          D.24888 = &hwi->refs;
          D.24889 = &hwi->offsets;
          D.24890 = hwi->data;
          D.24879 (start, D.24881, iftmp.416, D.24887, D.24888, D.24889, D.24890);
          hwi->count = 0;
          hwi->called = 1;
          <D.24997>:
          D.24876 = hwi->count;
          p.417 = (int) p;
          start.401 = (int) start;
          D.25003 = p.417 - start.401;
          D.25004 = (unsigned int) D.25003;
          hwi->offsets[D.24876] = D.25004;
          D.24876 = hwi->count;
          D.25005 = D.24876;
          D.25006 = D.25005 + 1;
          hwi->count = D.25006;
          D.24993 = *p;
          hwi->refs[D.25005] = D.24993;
          <D.24995>:
          <D.24992>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.21058>:
          if (_bmap != 0) goto <D.21057>; else goto <D.21059>;
          <D.21059>:
          el_size.415 = (sizetype) el_size;
          e_start = e_start + el_size.415;
        }
        <D.21061>:
        if (e_start < e_end) goto <D.21060>; else goto <D.21062>;
        <D.21062>:
      }
      <D.24989>:
      <D.24987>:
      <D.24962>:
    }
    <D.24939>:
    goto <D.21024>;
    <D.21063>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.21067>;
      <D.21066>:
      D.25007 = _bmap & 1;
      if (D.25007 != 0) goto <D.25008>; else goto <D.25009>;
      <D.25008>:
      D.25010 = *_objptr;
      if (D.25010 != 0B) goto <D.25011>; else goto <D.25012>;
      <D.25011>:
      D.24876 = hwi->count;
      if (D.24876 == 128) goto <D.25013>; else goto <D.25014>;
      <D.25013>:
      D.24879 = hwi->callback;
      D.24880 = MEM[(struct MonoObject *)start].vtable;
      D.24881 = D.24880->klass;
      D.24883 = hwi->called;
      if (D.24883 == 0) goto <D.25016>; else goto <D.25017>;
      <D.25016>:
      iftmp.418 = size;
      goto <D.25018>;
      <D.25017>:
      iftmp.418 = 0;
      <D.25018>:
      D.24876 = hwi->count;
      D.24887 = (unsigned int) D.24876;
      D.24888 = &hwi->refs;
      D.24889 = &hwi->offsets;
      D.24890 = hwi->data;
      D.24879 (start, D.24881, iftmp.418, D.24887, D.24888, D.24889, D.24890);
      hwi->count = 0;
      hwi->called = 1;
      <D.25014>:
      D.24876 = hwi->count;
      _objptr.419 = (int) _objptr;
      start.401 = (int) start;
      D.25020 = _objptr.419 - start.401;
      D.25021 = (unsigned int) D.25020;
      hwi->offsets[D.24876] = D.25021;
      D.24876 = hwi->count;
      D.25022 = D.24876;
      D.25023 = D.25022 + 1;
      hwi->count = D.25023;
      D.25010 = *_objptr;
      hwi->refs[D.25022] = D.25010;
      <D.25012>:
      <D.25009>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.21067>:
      if (_bmap != 0) goto <D.21066>; else goto <D.21068>;
      <D.21068>:
    }
    goto <D.21024>;
    <D.21069>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.25024 = *bitmap_data;
      D.25025 = D.25024 + 4294967295;
      bwords = (int) D.25025;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.25026>; else goto <D.25027>;
      <D.25026>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.25028 = myobj->vtable;
        D.25029 = D.25028->klass;
        D.25030 = D.25029->name_space;
        D.25028 = myobj->vtable;
        D.25029 = D.25028->klass;
        D.25031 = D.25029->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.25030, D.25031);
      }
      <D.25027>:
      goto <D.21080>;
      <D.21079>:
      {
        gsize _bmap;

        bitmap_data.420 = bitmap_data;
        bitmap_data = bitmap_data.420 + 4;
        _bmap = *bitmap_data.420;
        _objptr = start_run;
        goto <D.21077>;
        <D.21076>:
        D.25033 = _bmap & 1;
        if (D.25033 != 0) goto <D.25034>; else goto <D.25035>;
        <D.25034>:
        D.25036 = *_objptr;
        if (D.25036 != 0B) goto <D.25037>; else goto <D.25038>;
        <D.25037>:
        D.24876 = hwi->count;
        if (D.24876 == 128) goto <D.25039>; else goto <D.25040>;
        <D.25039>:
        D.24879 = hwi->callback;
        D.24880 = MEM[(struct MonoObject *)start].vtable;
        D.24881 = D.24880->klass;
        D.24883 = hwi->called;
        if (D.24883 == 0) goto <D.25042>; else goto <D.25043>;
        <D.25042>:
        iftmp.421 = size;
        goto <D.25044>;
        <D.25043>:
        iftmp.421 = 0;
        <D.25044>:
        D.24876 = hwi->count;
        D.24887 = (unsigned int) D.24876;
        D.24888 = &hwi->refs;
        D.24889 = &hwi->offsets;
        D.24890 = hwi->data;
        D.24879 (start, D.24881, iftmp.421, D.24887, D.24888, D.24889, D.24890);
        hwi->count = 0;
        hwi->called = 1;
        <D.25040>:
        D.24876 = hwi->count;
        _objptr.422 = (int) _objptr;
        start.401 = (int) start;
        D.25046 = _objptr.422 - start.401;
        D.25047 = (unsigned int) D.25046;
        hwi->offsets[D.24876] = D.25047;
        D.24876 = hwi->count;
        D.25048 = D.24876;
        D.25049 = D.25048 + 1;
        hwi->count = D.25049;
        D.25036 = *_objptr;
        hwi->refs[D.25048] = D.25036;
        <D.25038>:
        <D.25035>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.21077>:
        if (_bmap != 0) goto <D.21076>; else goto <D.21078>;
        <D.21078>:
        start_run = start_run + 128;
      }
      <D.21080>:
      bwords.423 = bwords;
      bwords = bwords.423 + -1;
      if (bwords.423 > 0) goto <D.21079>; else goto <D.21081>;
      <D.21081>:
    }
    goto <D.21024>;
    <D.21082>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.25051 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.25051);
      mbitmap_data.424 = mbitmap_data;
      mbitmap_data = mbitmap_data.424 + 4;
      D.25053 = *mbitmap_data.424;
      D.25054 = D.25053 + 4294967295;
      mbwords = (int) D.25054;
      D.25055 = vt->klass;
      el_size = mono_array_element_size (D.25055);
      e_start = start + 16;
      D.24945 = MEM[(struct MonoArray *)start].max_length;
      el_size.425 = (unsigned int) el_size;
      D.25057 = D.24945 * el_size.425;
      e_end = e_start + D.25057;
      if (0 != 0) goto <D.25058>; else goto <D.25059>;
      <D.25058>:
      D.25051 = vt->desc;
      D.25055 = vt->klass;
      D.25060 = D.25055->name_space;
      D.25055 = vt->klass;
      D.25061 = D.25055->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.25051, D.25060, D.25061);
      <D.25059>:
      goto <D.21100>;
      <D.21099>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.426 = bitmap_data;
          bitmap_data = bitmap_data.426 + 4;
          _bmap = *bitmap_data.426;
          start_run = _objptr;
          goto <D.21094>;
          <D.21093>:
          D.25063 = _bmap & 1;
          if (D.25063 != 0) goto <D.25064>; else goto <D.25065>;
          <D.25064>:
          D.25066 = *_objptr;
          if (D.25066 != 0B) goto <D.25067>; else goto <D.25068>;
          <D.25067>:
          D.24876 = hwi->count;
          if (D.24876 == 128) goto <D.25069>; else goto <D.25070>;
          <D.25069>:
          D.24879 = hwi->callback;
          D.24880 = MEM[(struct MonoObject *)start].vtable;
          D.24881 = D.24880->klass;
          D.24883 = hwi->called;
          if (D.24883 == 0) goto <D.25072>; else goto <D.25073>;
          <D.25072>:
          iftmp.427 = size;
          goto <D.25074>;
          <D.25073>:
          iftmp.427 = 0;
          <D.25074>:
          D.24876 = hwi->count;
          D.24887 = (unsigned int) D.24876;
          D.24888 = &hwi->refs;
          D.24889 = &hwi->offsets;
          D.24890 = hwi->data;
          D.24879 (start, D.24881, iftmp.427, D.24887, D.24888, D.24889, D.24890);
          hwi->count = 0;
          hwi->called = 1;
          <D.25070>:
          D.24876 = hwi->count;
          _objptr.428 = (int) _objptr;
          start.401 = (int) start;
          D.25076 = _objptr.428 - start.401;
          D.25077 = (unsigned int) D.25076;
          hwi->offsets[D.24876] = D.25077;
          D.24876 = hwi->count;
          D.25078 = D.24876;
          D.25079 = D.25078 + 1;
          hwi->count = D.25079;
          D.25066 = *_objptr;
          hwi->refs[D.25078] = D.25066;
          <D.25068>:
          <D.25065>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.21094>:
          if (_bmap != 0) goto <D.21093>; else goto <D.21095>;
          <D.21095>:
          _objptr = start_run + 128;
        }
        <D.21097>:
        bwords.429 = bwords;
        bwords = bwords.429 + 4294967295;
        if (bwords.429 != 0) goto <D.21096>; else goto <D.21098>;
        <D.21098>:
        el_size.430 = (sizetype) el_size;
        e_start = e_start + el_size.430;
      }
      <D.21100>:
      if (e_start < e_end) goto <D.21099>; else goto <D.21101>;
      <D.21101>:
    }
    goto <D.21024>;
    <D.21102>:
    goto <D.21024>;
    <D.21103>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.21024>:
  }
}


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


mono_gc_max_generation ()
{
  int D.25085;

  D.25085 = 1;
  return D.25085;
}


mono_gc_collection_count (int generation)
{
  int D.25089;

  if (generation == 0) goto <D.25087>; else goto <D.25088>;
  <D.25087>:
  D.25089 = stat_minor_gcs;
  return D.25089;
  <D.25088>:
  D.25089 = stat_major_gcs;
  return D.25089;
}


mono_gc_get_used_size ()
{
  unsigned int los_memory_usage.431;
  struct GCMemSection * nursery_section.432;
  char * D.25093;
  int D.25094;
  char * D.25095;
  int D.25096;
  int D.25097;
  long long int D.25098;
  gint64 (*<T2c5f>) (void) D.25099;
  long long int D.25100;
  int64_t D.25101;
  gint64 tot;

  tot = 0;
  pthread_mutex_lock (&gc_mutex);
  los_memory_usage.431 = los_memory_usage;
  tot = (gint64) los_memory_usage.431;
  nursery_section.432 = nursery_section;
  D.25093 = nursery_section.432->next_data;
  D.25094 = (int) D.25093;
  nursery_section.432 = nursery_section;
  D.25095 = nursery_section.432->data;
  D.25096 = (int) D.25095;
  D.25097 = D.25094 - D.25096;
  D.25098 = (long long int) D.25097;
  tot = D.25098 + tot;
  D.25099 = major_collector.get_used_size;
  D.25100 = D.25099 ();
  tot = D.25100 + tot;
  sgen_gc_unlock ();
  D.25101 = tot;
  return D.25101;
}


mono_gc_get_los_limit ()
{
  int D.25103;

  D.25103 = 8000;
  return D.25103;
}


mono_gc_user_markers_supported ()
{
  gboolean D.25105;

  D.25105 = 1;
  return D.25105;
}


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

  D.25107 = 1;
  return D.25107;
}


mono_gc_get_generation (struct MonoObject * obj)
{
  int D.25109;
  int D.25112;

  D.25109 = sgen_ptr_in_nursery (obj);
  if (D.25109 != 0) goto <D.25110>; else goto <D.25111>;
  <D.25110>:
  D.25112 = 0;
  return D.25112;
  <D.25111>:
  D.25112 = 1;
  return D.25112;
}


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.433;
  long unsigned int D.25117;
  long unsigned int D.25118;
  struct MonoObject * D.25120;
  int bridge_processing_in_progress.434;
  _Bool D.25122;
  long int D.25123;
  long int D.25124;
  void * D.25127;
  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.25114>; else goto <D.25115>;
  <D.25114>:
  ptr.433 = (long unsigned int) ptr;
  D.25117 = ~ptr.433;
  D.25118 = D.25117 & 4294967292;
  obj = (struct MonoObject *) D.25118;
  goto <D.25119>;
  <D.25115>:
  D.25120 = 0B;
  return D.25120;
  <D.25119>:
  mono_memory_barrier ();
  bridge_processing_in_progress.434 = bridge_processing_in_progress;
  D.25122 = bridge_processing_in_progress.434 != 0;
  D.25123 = (long int) D.25122;
  D.25124 = __builtin_expect (D.25123, 0);
  if (D.25124 != 0) goto <D.25125>; else goto <D.25126>;
  <D.25125>:
  mono_gc_wait_for_bridge_processing ();
  <D.25126>:
  D.25127 = *link_addr_volatile;
  if (D.25127 != ptr) goto retry; else goto <D.25128>;
  <D.25128>:
  D.25120 = obj;
  return D.25120;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


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

  pthread_mutex_lock (&gc_mutex);
  node = sgen_alloc_internal (18);
  if (node == 0B) goto <D.25130>; else goto <D.25131>;
  <D.25130>:
  sgen_gc_unlock ();
  D.25132 = 0;
  return D.25132;
  <D.25131>:
  node->array = obj;
  ephemeron_list.435 = ephemeron_list;
  node->next = ephemeron_list.435;
  ephemeron_list = node;
  if (0 != 0) goto <D.25134>; else goto <D.25135>;
  <D.25134>:
  gc_debug_file.436 = gc_debug_file;
  fprintf (gc_debug_file.436, "Registered ephemeron array %p\n", obj);
  gc_debug_file.436 = gc_debug_file;
  fflush (gc_debug_file.436);
  <D.25135>:
  sgen_gc_unlock ();
  D.25132 = 1;
  return D.25132;
}


mono_gc_set_allow_synchronous_major (gboolean flag)
{
  int D.25138;
  gboolean D.25141;

  D.25138 = major_collector.is_concurrent;
  if (D.25138 == 0) goto <D.25139>; else goto <D.25140>;
  <D.25139>:
  D.25141 = flag;
  return D.25141;
  <D.25140>:
  allow_synchronous_major = flag;
  D.25141 = 1;
  return D.25141;
}


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

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


mono_gc_is_gc_thread ()
{
  struct SgenThreadInfo * D.25145;
  _Bool D.25146;
  gboolean D.25147;
  gboolean result;

  pthread_mutex_lock (&gc_mutex);
  D.25145 = mono_thread_info_current ();
  D.25146 = D.25145 != 0B;
  result = (gboolean) D.25146;
  sgen_gc_unlock ();
  D.25147 = result;
  return D.25147;
}


sgen_env_var_error (const char * env_var, const char * fallback, const char * description_format)
{
  struct _IO_FILE * stderr.437;
  void * ap.438;
  void * ap;

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


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

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


mono_gc_base_init ()
{
  int D.25155;
  unsigned int pagesize.439;
  struct _IO_FILE * stderr.440;
  int D.25160;
  char * D.25163;
  int D.25165;
  char * D.25168;
  char * D.25169;
  int D.21234;
  int iftmp.441;
  int D.21233;
  const char[7] * D.25177;
  unsigned char D.25178;
  int D.25179;
  unsigned char D.25180;
  int D.25181;
  const unsigned char * D.25186;
  unsigned char D.25187;
  int D.25188;
  const unsigned char * D.25189;
  unsigned char D.25190;
  int D.25191;
  const unsigned char * D.25196;
  unsigned char D.25197;
  int D.25198;
  const unsigned char * D.25199;
  unsigned char D.25200;
  int D.25201;
  const unsigned char * D.25206;
  unsigned char D.25207;
  int D.25208;
  const unsigned char * D.25209;
  unsigned char D.25210;
  int D.25211;
  int D.21244;
  int iftmp.442;
  int D.21243;
  const char[6] * D.25219;
  unsigned char D.25220;
  int D.25221;
  unsigned char D.25222;
  int D.25223;
  const unsigned char * D.25228;
  unsigned char D.25229;
  int D.25230;
  const unsigned char * D.25231;
  unsigned char D.25232;
  int D.25233;
  const unsigned char * D.25238;
  unsigned char D.25239;
  int D.25240;
  const unsigned char * D.25241;
  unsigned char D.25242;
  int D.25243;
  const unsigned char * D.25248;
  unsigned char D.25249;
  int D.25250;
  const unsigned char * D.25251;
  unsigned char D.25252;
  int D.25253;
  int D.21253;
  int iftmp.443;
  int D.21252;
  const char[10] * D.25265;
  unsigned char D.25266;
  int D.25267;
  unsigned char D.25268;
  int D.25269;
  const unsigned char * D.25274;
  unsigned char D.25275;
  int D.25276;
  const unsigned char * D.25277;
  unsigned char D.25278;
  int D.25279;
  const unsigned char * D.25284;
  unsigned char D.25285;
  int D.25286;
  const unsigned char * D.25287;
  unsigned char D.25288;
  int D.25289;
  const unsigned char * D.25294;
  unsigned char D.25295;
  int D.25296;
  const unsigned char * D.25297;
  unsigned char D.25298;
  int D.25299;
  int D.21263;
  int iftmp.444;
  int D.21262;
  const char[16] * D.25308;
  unsigned char D.25309;
  int D.25310;
  unsigned char D.25311;
  int D.25312;
  const unsigned char * D.25317;
  unsigned char D.25318;
  int D.25319;
  const unsigned char * D.25320;
  unsigned char D.25321;
  int D.25322;
  const unsigned char * D.25327;
  unsigned char D.25328;
  int D.25329;
  const unsigned char * D.25330;
  unsigned char D.25331;
  int D.25332;
  const unsigned char * D.25337;
  unsigned char D.25338;
  int D.25339;
  const unsigned char * D.25340;
  unsigned char D.25341;
  int D.25342;
  int D.21272;
  int iftmp.445;
  int D.21271;
  const char[14] * D.25351;
  unsigned char D.25352;
  int D.25353;
  unsigned char D.25354;
  int D.25355;
  const unsigned char * D.25360;
  unsigned char D.25361;
  int D.25362;
  const unsigned char * D.25363;
  unsigned char D.25364;
  int D.25365;
  const unsigned char * D.25370;
  unsigned char D.25371;
  int D.25372;
  const unsigned char * D.25373;
  unsigned char D.25374;
  int D.25375;
  const unsigned char * D.25380;
  unsigned char D.25381;
  int D.25382;
  const unsigned char * D.25383;
  unsigned char D.25384;
  int D.25385;
  int D.21281;
  int iftmp.446;
  int D.21280;
  const char[20] * D.25394;
  unsigned char D.25395;
  int D.25396;
  unsigned char D.25397;
  int D.25398;
  const unsigned char * D.25403;
  unsigned char D.25404;
  int D.25405;
  const unsigned char * D.25406;
  unsigned char D.25407;
  int D.25408;
  const unsigned char * D.25413;
  unsigned char D.25414;
  int D.25415;
  const unsigned char * D.25416;
  unsigned char D.25417;
  int D.25418;
  const unsigned char * D.25423;
  unsigned char D.25424;
  int D.25425;
  const unsigned char * D.25426;
  unsigned char D.25427;
  int D.25428;
  int D.21290;
  int iftmp.447;
  int D.21289;
  const char[15] * D.25437;
  unsigned char D.25438;
  int D.25439;
  unsigned char D.25440;
  int D.25441;
  const unsigned char * D.25446;
  unsigned char D.25447;
  int D.25448;
  const unsigned char * D.25449;
  unsigned char D.25450;
  int D.25451;
  const unsigned char * D.25456;
  unsigned char D.25457;
  int D.25458;
  const unsigned char * D.25459;
  unsigned char D.25460;
  int D.25461;
  const unsigned char * D.25466;
  unsigned char D.25467;
  int D.25468;
  const unsigned char * D.25469;
  unsigned char D.25470;
  int D.25471;
  int D.25475;
  _Bool D.25478;
  long int D.25479;
  long int D.25480;
  int sgen_nursery_size.448;
  int D.21301;
  int iftmp.449;
  int D.21300;
  const char[1] * D.25491;
  unsigned char D.25492;
  int D.25493;
  unsigned char D.25494;
  int D.25495;
  const unsigned char * D.25500;
  unsigned char D.25501;
  int D.25502;
  const unsigned char * D.25503;
  unsigned char D.25504;
  int D.25505;
  const unsigned char * D.25510;
  unsigned char D.25511;
  int D.25512;
  const unsigned char * D.25513;
  unsigned char D.25514;
  int D.25515;
  const unsigned char * D.25520;
  unsigned char D.25521;
  int D.25522;
  const unsigned char * D.25523;
  unsigned char D.25524;
  int D.25525;
  unsigned char D.25527;
  int D.25530;
  int D.25533;
  int D.25536;
  char * D.25539;
  char D.25542;
  int D.25544;
  int D.25546;
  long int max_heap_candidate.450;
  long int D.25548;
  long int D.25549;
  int D.25550;
  long int D.25551;
  int D.25554;
  int D.25555;
  char * D.25558;
  int D.25562;
  long int soft_limit.451;
  int D.25567;
  char * D.25572;
  char * endptr.452;
  char D.25577;
  unsigned int val.453;
  unsigned int D.25579;
  int D.25582;
  char * D.25585;
  int D.21314;
  int iftmp.454;
  int D.21313;
  const char[8] * D.25589;
  unsigned char D.25590;
  int D.25591;
  unsigned char D.25592;
  int D.25593;
  const unsigned char * D.25598;
  unsigned char D.25599;
  int D.25600;
  const unsigned char * D.25601;
  unsigned char D.25602;
  int D.25603;
  const unsigned char * D.25608;
  unsigned char D.25609;
  int D.25610;
  const unsigned char * D.25611;
  unsigned char D.25612;
  int D.25613;
  const unsigned char * D.25618;
  unsigned char D.25619;
  int D.25620;
  const unsigned char * D.25621;
  unsigned char D.25622;
  int D.25623;
  int D.21323;
  int iftmp.455;
  int D.21322;
  const char[13] * D.25631;
  unsigned char D.25632;
  int D.25633;
  unsigned char D.25634;
  int D.25635;
  const unsigned char * D.25640;
  unsigned char D.25641;
  int D.25642;
  const unsigned char * D.25643;
  unsigned char D.25644;
  int D.25645;
  const unsigned char * D.25650;
  unsigned char D.25651;
  int D.25652;
  const unsigned char * D.25653;
  unsigned char D.25654;
  int D.25655;
  const unsigned char * D.25660;
  unsigned char D.25661;
  int D.25662;
  const unsigned char * D.25663;
  unsigned char D.25664;
  int D.25665;
  const char * iftmp.456;
  int conservative_stack_mark.457;
  int D.25675;
  char * D.25678;
  gchar * D.25679;
  int D.25680;
  char * D.25683;
  int D.25687;
  long int val.458;
  long int D.25690;
  long int D.25691;
  int sgen_nursery_bits.459;
  int sgen_nursery_bits.460;
  int D.25698;
  int D.25699;
  char * D.25702;
  int D.25703;
  int D.25706;
  char * D.25709;
  int D.25710;
  int D.25713;
  int D.25716;
  char * D.25719;
  int D.21338;
  int iftmp.461;
  int D.21337;
  const char[4] * D.25723;
  unsigned char D.25724;
  int D.25725;
  unsigned char D.25726;
  int D.25727;
  const unsigned char * D.25732;
  unsigned char D.25733;
  int D.25734;
  const unsigned char * D.25735;
  unsigned char D.25736;
  int D.25737;
  const unsigned char * D.25742;
  unsigned char D.25743;
  int D.25744;
  const unsigned char * D.25745;
  unsigned char D.25746;
  int D.25747;
  const unsigned char * D.25752;
  unsigned char D.25753;
  int D.25754;
  const unsigned char * D.25755;
  unsigned char D.25756;
  int D.25757;
  int D.21347;
  int iftmp.462;
  int D.21346;
  const char[3] * D.25765;
  unsigned char D.25766;
  int D.25767;
  unsigned char D.25768;
  int D.25769;
  const unsigned char * D.25774;
  unsigned char D.25775;
  int D.25776;
  const unsigned char * D.25777;
  unsigned char D.25778;
  int D.25779;
  const unsigned char * D.25784;
  unsigned char D.25785;
  int D.25786;
  const unsigned char * D.25787;
  unsigned char D.25788;
  int D.25789;
  const unsigned char * D.25794;
  unsigned char D.25795;
  int D.25796;
  const unsigned char * D.25797;
  unsigned char D.25798;
  int D.25799;
  int D.21356;
  int iftmp.463;
  int D.21355;
  const char[10] * D.25807;
  unsigned char D.25808;
  int D.25809;
  unsigned char D.25810;
  int D.25811;
  const unsigned char * D.25816;
  unsigned char D.25817;
  int D.25818;
  const unsigned char * D.25819;
  unsigned char D.25820;
  int D.25821;
  const unsigned char * D.25826;
  unsigned char D.25827;
  int D.25828;
  const unsigned char * D.25829;
  unsigned char D.25830;
  int D.25831;
  const unsigned char * D.25836;
  unsigned char D.25837;
  int D.25838;
  const unsigned char * D.25839;
  unsigned char D.25840;
  int D.25841;
  int D.21365;
  int iftmp.464;
  int D.21364;
  const char[13] * D.25850;
  unsigned char D.25851;
  int D.25852;
  unsigned char D.25853;
  int D.25854;
  const unsigned char * D.25859;
  unsigned char D.25860;
  int D.25861;
  const unsigned char * D.25862;
  unsigned char D.25863;
  int D.25864;
  const unsigned char * D.25869;
  unsigned char D.25870;
  int D.25871;
  const unsigned char * D.25872;
  unsigned char D.25873;
  int D.25874;
  const unsigned char * D.25879;
  unsigned char D.25880;
  int D.25881;
  const unsigned char * D.25882;
  unsigned char D.25883;
  int D.25884;
  gboolean (*<T2c11>) (const char *) D.25888;
  int D.25891;
  gboolean (*<T2c11>) (const char *) D.25894;
  int D.25897;
  void (*<T70e>) (void) D.25904;
  void (*<T70e>) (void) D.25907;
  int D.21379;
  int iftmp.465;
  int D.21378;
  unsigned char D.25924;
  int D.25925;
  const unsigned char * D.25930;
  unsigned char D.25931;
  int D.25932;
  const unsigned char * D.25937;
  unsigned char D.25938;
  int D.25939;
  const unsigned char * D.25944;
  unsigned char D.25945;
  int D.25946;
  unsigned char D.25948;
  char D.25951;
  unsigned char D.25952;
  unsigned char D.25953;
  int gc_debug_level.466;
  int D.25961;
  struct FILE * gc_debug_file.467;
  struct FILE * gc_debug_file.468;
  int D.21390;
  int iftmp.469;
  int D.21389;
  const char[16] * D.25970;
  unsigned char D.25971;
  int D.25972;
  unsigned char D.25973;
  int D.25974;
  const unsigned char * D.25979;
  unsigned char D.25980;
  int D.25981;
  const unsigned char * D.25982;
  unsigned char D.25983;
  int D.25984;
  const unsigned char * D.25989;
  unsigned char D.25990;
  int D.25991;
  const unsigned char * D.25992;
  unsigned char D.25993;
  int D.25994;
  const unsigned char * D.25999;
  unsigned char D.26000;
  int D.26001;
  const unsigned char * D.26002;
  unsigned char D.26003;
  int D.26004;
  int D.21399;
  int iftmp.470;
  int D.21398;
  const char[14] * D.26012;
  unsigned char D.26013;
  int D.26014;
  unsigned char D.26015;
  int D.26016;
  const unsigned char * D.26021;
  unsigned char D.26022;
  int D.26023;
  const unsigned char * D.26024;
  unsigned char D.26025;
  int D.26026;
  const unsigned char * D.26031;
  unsigned char D.26032;
  int D.26033;
  const unsigned char * D.26034;
  unsigned char D.26035;
  int D.26036;
  const unsigned char * D.26041;
  unsigned char D.26042;
  int D.26043;
  const unsigned char * D.26044;
  unsigned char D.26045;
  int D.26046;
  int D.21408;
  int iftmp.471;
  int D.21407;
  const char[21] * D.26054;
  unsigned char D.26055;
  int D.26056;
  unsigned char D.26057;
  int D.26058;
  const unsigned char * D.26063;
  unsigned char D.26064;
  int D.26065;
  const unsigned char * D.26066;
  unsigned char D.26067;
  int D.26068;
  const unsigned char * D.26073;
  unsigned char D.26074;
  int D.26075;
  const unsigned char * D.26076;
  unsigned char D.26077;
  int D.26078;
  const unsigned char * D.26083;
  unsigned char D.26084;
  int D.26085;
  const unsigned char * D.26086;
  unsigned char D.26087;
  int D.26088;
  int D.26093;
  char * D.26096;
  int D.26097;
  unsigned int verify_before_allocs.472;
  int D.21418;
  int iftmp.473;
  int D.21417;
  const char[22] * D.26103;
  unsigned char D.26104;
  int D.26105;
  unsigned char D.26106;
  int D.26107;
  const unsigned char * D.26112;
  unsigned char D.26113;
  int D.26114;
  const unsigned char * D.26115;
  unsigned char D.26116;
  int D.26117;
  const unsigned char * D.26122;
  unsigned char D.26123;
  int D.26124;
  const unsigned char * D.26125;
  unsigned char D.26126;
  int D.26127;
  const unsigned char * D.26132;
  unsigned char D.26133;
  int D.26134;
  const unsigned char * D.26135;
  unsigned char D.26136;
  int D.26137;
  int D.26142;
  char * D.26145;
  int D.26146;
  unsigned int collect_before_allocs.474;
  int D.21428;
  int iftmp.475;
  int D.21427;
  const char[26] * D.26152;
  unsigned char D.26153;
  int D.26154;
  unsigned char D.26155;
  int D.26156;
  const unsigned char * D.26161;
  unsigned char D.26162;
  int D.26163;
  const unsigned char * D.26164;
  unsigned char D.26165;
  int D.26166;
  const unsigned char * D.26171;
  unsigned char D.26172;
  int D.26173;
  const unsigned char * D.26174;
  unsigned char D.26175;
  int D.26176;
  const unsigned char * D.26181;
  unsigned char D.26182;
  int D.26183;
  const unsigned char * D.26184;
  unsigned char D.26185;
  int D.26186;
  int D.21437;
  int iftmp.476;
  int D.21436;
  const char[27] * D.26194;
  unsigned char D.26195;
  int D.26196;
  unsigned char D.26197;
  int D.26198;
  const unsigned char * D.26203;
  unsigned char D.26204;
  int D.26205;
  const unsigned char * D.26206;
  unsigned char D.26207;
  int D.26208;
  const unsigned char * D.26213;
  unsigned char D.26214;
  int D.26215;
  const unsigned char * D.26216;
  unsigned char D.26217;
  int D.26218;
  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.21446;
  int iftmp.477;
  int D.21445;
  const char[28] * D.26236;
  unsigned char D.26237;
  int D.26238;
  unsigned char D.26239;
  int D.26240;
  const unsigned char * D.26245;
  unsigned char D.26246;
  int D.26247;
  const unsigned char * D.26248;
  unsigned char D.26249;
  int D.26250;
  const unsigned char * D.26255;
  unsigned char D.26256;
  int D.26257;
  const unsigned char * D.26258;
  unsigned char D.26259;
  int D.26260;
  const unsigned char * D.26265;
  unsigned char D.26266;
  int D.26267;
  const unsigned char * D.26268;
  unsigned char D.26269;
  int D.26270;
  int D.21455;
  int iftmp.478;
  int D.21454;
  const char[16] * D.26280;
  unsigned char D.26281;
  int D.26282;
  unsigned char D.26283;
  int D.26284;
  const unsigned char * D.26289;
  unsigned char D.26290;
  int D.26291;
  const unsigned char * D.26292;
  unsigned char D.26293;
  int D.26294;
  const unsigned char * D.26299;
  unsigned char D.26300;
  int D.26301;
  const unsigned char * D.26302;
  unsigned char D.26303;
  int D.26304;
  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.21464;
  int iftmp.479;
  int D.21463;
  const char[21] * D.26322;
  unsigned char D.26323;
  int D.26324;
  unsigned char D.26325;
  int D.26326;
  const unsigned char * D.26331;
  unsigned char D.26332;
  int D.26333;
  const unsigned char * D.26334;
  unsigned char D.26335;
  int D.26336;
  const unsigned char * D.26341;
  unsigned char D.26342;
  int D.26343;
  const unsigned char * D.26344;
  unsigned char D.26345;
  int D.26346;
  const unsigned char * D.26351;
  unsigned char D.26352;
  int D.26353;
  const unsigned char * D.26354;
  unsigned char D.26355;
  int D.26356;
  int D.21473;
  int iftmp.480;
  int D.21472;
  const char[15] * D.26364;
  unsigned char D.26365;
  int D.26366;
  unsigned char D.26367;
  int D.26368;
  const unsigned char * D.26373;
  unsigned char D.26374;
  int D.26375;
  const unsigned char * D.26376;
  unsigned char D.26377;
  int D.26378;
  const unsigned char * D.26383;
  unsigned char D.26384;
  int D.26385;
  const unsigned char * D.26386;
  unsigned char D.26387;
  int D.26388;
  const unsigned char * D.26393;
  unsigned char D.26394;
  int D.26395;
  const unsigned char * D.26396;
  unsigned char D.26397;
  int D.26398;
  int D.21482;
  int iftmp.481;
  int D.21481;
  const char[12] * D.26406;
  unsigned char D.26407;
  int D.26408;
  unsigned char D.26409;
  int D.26410;
  const unsigned char * D.26415;
  unsigned char D.26416;
  int D.26417;
  const unsigned char * D.26418;
  unsigned char D.26419;
  int D.26420;
  const unsigned char * D.26425;
  unsigned char D.26426;
  int D.26427;
  const unsigned char * D.26428;
  unsigned char D.26429;
  int D.26430;
  const unsigned char * D.26435;
  unsigned char D.26436;
  int D.26437;
  const unsigned char * D.26438;
  unsigned char D.26439;
  int D.26440;
  int D.21491;
  int iftmp.482;
  int D.21490;
  const char[20] * D.26448;
  unsigned char D.26449;
  int D.26450;
  unsigned char D.26451;
  int D.26452;
  const unsigned char * D.26457;
  unsigned char D.26458;
  int D.26459;
  const unsigned char * D.26460;
  unsigned char D.26461;
  int D.26462;
  const unsigned char * D.26467;
  unsigned char D.26468;
  int D.26469;
  const unsigned char * D.26470;
  unsigned char D.26471;
  int D.26472;
  const unsigned char * D.26477;
  unsigned char D.26478;
  int D.26479;
  const unsigned char * D.26480;
  unsigned char D.26481;
  int D.26482;
  int D.21500;
  int iftmp.483;
  int D.21499;
  const char[18] * D.26490;
  unsigned char D.26491;
  int D.26492;
  unsigned char D.26493;
  int D.26494;
  const unsigned char * D.26499;
  unsigned char D.26500;
  int D.26501;
  const unsigned char * D.26502;
  unsigned char D.26503;
  int D.26504;
  const unsigned char * D.26509;
  unsigned char D.26510;
  int D.26511;
  const unsigned char * D.26512;
  unsigned char D.26513;
  int D.26514;
  const unsigned char * D.26519;
  unsigned char D.26520;
  int D.26521;
  const unsigned char * D.26522;
  unsigned char D.26523;
  int D.26524;
  int D.21509;
  int iftmp.484;
  int D.21508;
  const char[27] * D.26532;
  unsigned char D.26533;
  int D.26534;
  unsigned char D.26535;
  int D.26536;
  const unsigned char * D.26541;
  unsigned char D.26542;
  int D.26543;
  const unsigned char * D.26544;
  unsigned char D.26545;
  int D.26546;
  const unsigned char * D.26551;
  unsigned char D.26552;
  int D.26553;
  const unsigned char * D.26554;
  unsigned char D.26555;
  int D.26556;
  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.21518;
  int iftmp.485;
  int D.21517;
  const char[17] * D.26574;
  unsigned char D.26575;
  int D.26576;
  unsigned char D.26577;
  int D.26578;
  const unsigned char * D.26583;
  unsigned char D.26584;
  int D.26585;
  const unsigned char * D.26586;
  unsigned char D.26587;
  int D.26588;
  const unsigned char * D.26593;
  unsigned char D.26594;
  int D.26595;
  const unsigned char * D.26596;
  unsigned char D.26597;
  int D.26598;
  const unsigned char * D.26603;
  unsigned char D.26604;
  int D.26605;
  const unsigned char * D.26606;
  unsigned char D.26607;
  int D.26608;
  int D.21527;
  int iftmp.486;
  int D.21526;
  const char[25] * D.26618;
  unsigned char D.26619;
  int D.26620;
  unsigned char D.26621;
  int D.26622;
  const unsigned char * D.26627;
  unsigned char D.26628;
  int D.26629;
  const unsigned char * D.26630;
  unsigned char D.26631;
  int D.26632;
  const unsigned char * D.26637;
  unsigned char D.26638;
  int D.26639;
  const unsigned char * D.26640;
  unsigned char D.26641;
  int D.26642;
  const unsigned char * D.26647;
  unsigned char D.26648;
  int D.26649;
  const unsigned char * D.26650;
  unsigned char D.26651;
  int D.26652;
  int D.21536;
  int iftmp.487;
  int D.21535;
  const char[21] * D.26660;
  unsigned char D.26661;
  int D.26662;
  unsigned char D.26663;
  int D.26664;
  const unsigned char * D.26669;
  unsigned char D.26670;
  int D.26671;
  const unsigned char * D.26672;
  unsigned char D.26673;
  int D.26674;
  const unsigned char * D.26679;
  unsigned char D.26680;
  int D.26681;
  const unsigned char * D.26682;
  unsigned char D.26683;
  int D.26684;
  const unsigned char * D.26689;
  unsigned char D.26690;
  int D.26691;
  const unsigned char * D.26692;
  unsigned char D.26693;
  int D.26694;
  int D.21545;
  int iftmp.488;
  int D.21544;
  const char[14] * D.26702;
  unsigned char D.26703;
  int D.26704;
  unsigned char D.26705;
  int D.26706;
  const unsigned char * D.26711;
  unsigned char D.26712;
  int D.26713;
  const unsigned char * D.26714;
  unsigned char D.26715;
  int D.26716;
  const unsigned char * D.26721;
  unsigned char D.26722;
  int D.26723;
  const unsigned char * D.26724;
  unsigned char D.26725;
  int D.26726;
  const unsigned char * D.26731;
  unsigned char D.26732;
  int D.26733;
  const unsigned char * D.26734;
  unsigned char D.26735;
  int D.26736;
  int D.21554;
  int iftmp.489;
  int D.21553;
  const char[14] * D.26744;
  unsigned char D.26745;
  int D.26746;
  unsigned char D.26747;
  int D.26748;
  const unsigned char * D.26753;
  unsigned char D.26754;
  int D.26755;
  const unsigned char * D.26756;
  unsigned char D.26757;
  int D.26758;
  const unsigned char * D.26763;
  unsigned char D.26764;
  int D.26765;
  const unsigned char * D.26766;
  unsigned char D.26767;
  int D.26768;
  const unsigned char * D.26773;
  unsigned char D.26774;
  int D.26775;
  const unsigned char * D.26776;
  unsigned char D.26777;
  int D.26778;
  int D.26783;
  char * D.26786;
  struct FILE * heap_dump_file.490;
  struct FILE * heap_dump_file.491;
  int do_pin_stats.492;
  void (*<T2c79>) (struct SgenMajorCollector *) D.26802;
  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.21219>:
      result = InterlockedCompareExchange (&gc_initialized, -1, 0);
      switch (result) <default: <D.21218>, case -1: <D.21215>, case 0: <D.21217>, case 1: <D.21214>>
      <D.21214>:
      return;
      <D.21215>:
      monoeg_g_usleep (1000);
      goto <D.21216>;
      <D.21217>:
      goto <D.21216>;
      <D.21218>:
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 4863);
      <D.21216>:
      if (result != 0) goto <D.21219>; else goto <D.21220>;
      <D.21220>:
      pthread_mutex_init (&gc_mutex, 0B);
      D.25155 = mono_pagesize ();
      pagesize.439 = (unsigned int) D.25155;
      pagesize = pagesize.439;
      stderr.440 = stderr;
      gc_debug_file = stderr.440;
      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, 712);
      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.25158>; else goto <D.25159>;
      <D.25158>:
      opts = monoeg_g_strsplit (env, ",", -1);
      ptr = opts;
      goto <D.21223>;
      <D.21222>:
      {
        char * opt;

        opt = *ptr;
        D.25160 = monoeg_g_str_has_prefix (opt, "major=");
        if (D.25160 != 0) goto <D.25161>; else goto <D.25162>;
        <D.25161>:
        D.25163 = __builtin_strchr (opt, 61);
        opt = D.25163 + 1;
        major_collector_opt = monoeg_strdup (opt);
        goto <D.25164>;
        <D.25162>:
        D.25165 = monoeg_g_str_has_prefix (opt, "minor=");
        if (D.25165 != 0) goto <D.25166>; else goto <D.25167>;
        <D.25166>:
        D.25168 = __builtin_strchr (opt, 61);
        opt = D.25168 + 1;
        minor_collector_opt = monoeg_strdup (opt);
        <D.25167>:
        <D.25164>:
      }
      ptr = ptr + 4;
      <D.21223>:
      D.25169 = *ptr;
      if (D.25169 != 0B) goto <D.21222>; else goto <D.21224>;
      <D.21224>:
      goto <D.25170>;
      <D.25159>:
      opts = 0B;
      <D.25170>:
      init_stats ();
      sgen_init_internal_allocator ();
      sgen_init_nursery_allocator ();
      sgen_init_fin_weak_hash ();
      sgen_register_fixed_internal_mem_type (2, 32);
      sgen_register_fixed_internal_mem_type (6, 8);
      sgen_register_fixed_internal_mem_type (14, 508);
      sgen_register_fixed_internal_mem_type (18, 8);
      {
        int tls_offset;

        tls_offset = -1;
        tls_offset = -1;
        mono_tls_key_set_offset (4, tls_offset);
      }
      sgen_os_init ();
      mono_thread_info_attach (&dummy);
      if (minor_collector_opt == 0B) goto <D.25171>; else goto <D.25172>;
      <D.25171>:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.25173>;
      <D.25172>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.25177 = "simple";
          D.25178 = MEM[(const unsigned char *)D.25177];
          D.25179 = (int) D.25178;
          D.25180 = *__s2;
          D.25181 = (int) D.25180;
          __result = D.25179 - D.25181;
          {
            if (__s2_len != 0) goto <D.25182>; else goto <D.25183>;
            <D.25182>:
            if (__result == 0) goto <D.25184>; else goto <D.25185>;
            <D.25184>:
            D.25186 = &MEM[(void *)"simple" + 1B];
            D.25187 = *D.25186;
            D.25188 = (int) D.25187;
            D.25189 = __s2 + 1;
            D.25190 = *D.25189;
            D.25191 = (int) D.25190;
            __result = D.25188 - D.25191;
            if (__s2_len > 1) goto <D.25192>; else goto <D.25193>;
            <D.25192>:
            if (__result == 0) goto <D.25194>; else goto <D.25195>;
            <D.25194>:
            D.25196 = &MEM[(void *)"simple" + 2B];
            D.25197 = *D.25196;
            D.25198 = (int) D.25197;
            D.25199 = __s2 + 2;
            D.25200 = *D.25199;
            D.25201 = (int) D.25200;
            __result = D.25198 - D.25201;
            if (__s2_len > 2) goto <D.25202>; else goto <D.25203>;
            <D.25202>:
            if (__result == 0) goto <D.25204>; else goto <D.25205>;
            <D.25204>:
            D.25206 = &MEM[(void *)"simple" + 3B];
            D.25207 = *D.25206;
            D.25208 = (int) D.25207;
            D.25209 = __s2 + 3;
            D.25210 = *D.25209;
            D.25211 = (int) D.25210;
            __result = D.25208 - D.25211;
            <D.25205>:
            <D.25203>:
            <D.25195>:
            <D.25193>:
            <D.25185>:
            <D.25183>:
          }
          D.21233 = __result;
        }
        iftmp.441 = -D.21233;
        goto <D.25212>;
        <D.25176>:
        iftmp.441 = __builtin_strcmp (minor_collector_opt, "simple");
        <D.25212>:
        D.21234 = iftmp.441;
      }
      if (D.21234 == 0) goto <D.25213>; else goto <D.25214>;
      <D.25213>:
      use_simple_nursery:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.25215>;
      <D.25214>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.25219 = "split";
          D.25220 = MEM[(const unsigned char *)D.25219];
          D.25221 = (int) D.25220;
          D.25222 = *__s2;
          D.25223 = (int) D.25222;
          __result = D.25221 - D.25223;
          {
            if (__s2_len != 0) goto <D.25224>; else goto <D.25225>;
            <D.25224>:
            if (__result == 0) goto <D.25226>; else goto <D.25227>;
            <D.25226>:
            D.25228 = &MEM[(void *)"split" + 1B];
            D.25229 = *D.25228;
            D.25230 = (int) D.25229;
            D.25231 = __s2 + 1;
            D.25232 = *D.25231;
            D.25233 = (int) D.25232;
            __result = D.25230 - D.25233;
            if (__s2_len > 1) goto <D.25234>; else goto <D.25235>;
            <D.25234>:
            if (__result == 0) goto <D.25236>; else goto <D.25237>;
            <D.25236>:
            D.25238 = &MEM[(void *)"split" + 2B];
            D.25239 = *D.25238;
            D.25240 = (int) D.25239;
            D.25241 = __s2 + 2;
            D.25242 = *D.25241;
            D.25243 = (int) D.25242;
            __result = D.25240 - D.25243;
            if (__s2_len > 2) goto <D.25244>; else goto <D.25245>;
            <D.25244>:
            if (__result == 0) goto <D.25246>; else goto <D.25247>;
            <D.25246>:
            D.25248 = &MEM[(void *)"split" + 3B];
            D.25249 = *D.25248;
            D.25250 = (int) D.25249;
            D.25251 = __s2 + 3;
            D.25252 = *D.25251;
            D.25253 = (int) D.25252;
            __result = D.25250 - D.25253;
            <D.25247>:
            <D.25245>:
            <D.25237>:
            <D.25235>:
            <D.25227>:
            <D.25225>:
          }
          D.21243 = __result;
        }
        iftmp.442 = -D.21243;
        goto <D.25254>;
        <D.25218>:
        iftmp.442 = __builtin_strcmp (minor_collector_opt, "split");
        <D.25254>:
        D.21244 = iftmp.442;
      }
      if (D.21244 == 0) goto <D.25255>; else goto <D.25256>;
      <D.25255>:
      sgen_split_nursery_init (&sgen_minor_collector);
      have_split_nursery = 1;
      goto <D.25257>;
      <D.25256>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `simple` instead.", "Unknown minor collector `%s\'.", minor_collector_opt);
      goto use_simple_nursery;
      <D.25257>:
      <D.25215>:
      <D.25173>:
      if (major_collector_opt == 0B) goto <D.25258>; else goto <D.25261>;
      <D.25261>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25265 = "marksweep";
          D.25266 = MEM[(const unsigned char *)D.25265];
          D.25267 = (int) D.25266;
          D.25268 = *__s2;
          D.25269 = (int) D.25268;
          __result = D.25267 - D.25269;
          {
            if (__s2_len != 0) goto <D.25270>; else goto <D.25271>;
            <D.25270>:
            if (__result == 0) goto <D.25272>; else goto <D.25273>;
            <D.25272>:
            D.25274 = &MEM[(void *)"marksweep" + 1B];
            D.25275 = *D.25274;
            D.25276 = (int) D.25275;
            D.25277 = __s2 + 1;
            D.25278 = *D.25277;
            D.25279 = (int) D.25278;
            __result = D.25276 - D.25279;
            if (__s2_len > 1) goto <D.25280>; else goto <D.25281>;
            <D.25280>:
            if (__result == 0) goto <D.25282>; else goto <D.25283>;
            <D.25282>:
            D.25284 = &MEM[(void *)"marksweep" + 2B];
            D.25285 = *D.25284;
            D.25286 = (int) D.25285;
            D.25287 = __s2 + 2;
            D.25288 = *D.25287;
            D.25289 = (int) D.25288;
            __result = D.25286 - D.25289;
            if (__s2_len > 2) goto <D.25290>; else goto <D.25291>;
            <D.25290>:
            if (__result == 0) goto <D.25292>; else goto <D.25293>;
            <D.25292>:
            D.25294 = &MEM[(void *)"marksweep" + 3B];
            D.25295 = *D.25294;
            D.25296 = (int) D.25295;
            D.25297 = __s2 + 3;
            D.25298 = *D.25297;
            D.25299 = (int) D.25298;
            __result = D.25296 - D.25299;
            <D.25293>:
            <D.25291>:
            <D.25283>:
            <D.25281>:
            <D.25273>:
            <D.25271>:
          }
          D.21252 = __result;
        }
        iftmp.443 = -D.21252;
        goto <D.25300>;
        <D.25264>:
        iftmp.443 = __builtin_strcmp (major_collector_opt, "marksweep");
        <D.25300>:
        D.21253 = iftmp.443;
      }
      if (D.21253 == 0) goto <D.25258>; else goto <D.25259>;
      <D.25258>:
      use_marksweep_major:
      sgen_marksweep_init (&major_collector);
      goto <D.25260>;
      <D.25259>:
      if (major_collector_opt == 0B) goto <D.25301>; else goto <D.25304>;
      <D.25304>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25308 = "marksweep-fixed";
          D.25309 = MEM[(const unsigned char *)D.25308];
          D.25310 = (int) D.25309;
          D.25311 = *__s2;
          D.25312 = (int) D.25311;
          __result = D.25310 - D.25312;
          {
            if (__s2_len != 0) goto <D.25313>; else goto <D.25314>;
            <D.25313>:
            if (__result == 0) goto <D.25315>; else goto <D.25316>;
            <D.25315>:
            D.25317 = &MEM[(void *)"marksweep-fixed" + 1B];
            D.25318 = *D.25317;
            D.25319 = (int) D.25318;
            D.25320 = __s2 + 1;
            D.25321 = *D.25320;
            D.25322 = (int) D.25321;
            __result = D.25319 - D.25322;
            if (__s2_len > 1) goto <D.25323>; else goto <D.25324>;
            <D.25323>:
            if (__result == 0) goto <D.25325>; else goto <D.25326>;
            <D.25325>:
            D.25327 = &MEM[(void *)"marksweep-fixed" + 2B];
            D.25328 = *D.25327;
            D.25329 = (int) D.25328;
            D.25330 = __s2 + 2;
            D.25331 = *D.25330;
            D.25332 = (int) D.25331;
            __result = D.25329 - D.25332;
            if (__s2_len > 2) goto <D.25333>; else goto <D.25334>;
            <D.25333>:
            if (__result == 0) goto <D.25335>; else goto <D.25336>;
            <D.25335>:
            D.25337 = &MEM[(void *)"marksweep-fixed" + 3B];
            D.25338 = *D.25337;
            D.25339 = (int) D.25338;
            D.25340 = __s2 + 3;
            D.25341 = *D.25340;
            D.25342 = (int) D.25341;
            __result = D.25339 - D.25342;
            <D.25336>:
            <D.25334>:
            <D.25326>:
            <D.25324>:
            <D.25316>:
            <D.25314>:
          }
          D.21262 = __result;
        }
        iftmp.444 = -D.21262;
        goto <D.25343>;
        <D.25307>:
        iftmp.444 = __builtin_strcmp (major_collector_opt, "marksweep-fixed");
        <D.25343>:
        D.21263 = iftmp.444;
      }
      if (D.21263 == 0) goto <D.25301>; else goto <D.25302>;
      <D.25301>:
      sgen_marksweep_fixed_init (&major_collector);
      goto <D.25303>;
      <D.25302>:
      if (major_collector_opt == 0B) goto <D.25344>; else goto <D.25347>;
      <D.25347>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25351 = "marksweep-par";
          D.25352 = MEM[(const unsigned char *)D.25351];
          D.25353 = (int) D.25352;
          D.25354 = *__s2;
          D.25355 = (int) D.25354;
          __result = D.25353 - D.25355;
          {
            if (__s2_len != 0) goto <D.25356>; else goto <D.25357>;
            <D.25356>:
            if (__result == 0) goto <D.25358>; else goto <D.25359>;
            <D.25358>:
            D.25360 = &MEM[(void *)"marksweep-par" + 1B];
            D.25361 = *D.25360;
            D.25362 = (int) D.25361;
            D.25363 = __s2 + 1;
            D.25364 = *D.25363;
            D.25365 = (int) D.25364;
            __result = D.25362 - D.25365;
            if (__s2_len > 1) goto <D.25366>; else goto <D.25367>;
            <D.25366>:
            if (__result == 0) goto <D.25368>; else goto <D.25369>;
            <D.25368>:
            D.25370 = &MEM[(void *)"marksweep-par" + 2B];
            D.25371 = *D.25370;
            D.25372 = (int) D.25371;
            D.25373 = __s2 + 2;
            D.25374 = *D.25373;
            D.25375 = (int) D.25374;
            __result = D.25372 - D.25375;
            if (__s2_len > 2) goto <D.25376>; else goto <D.25377>;
            <D.25376>:
            if (__result == 0) goto <D.25378>; else goto <D.25379>;
            <D.25378>:
            D.25380 = &MEM[(void *)"marksweep-par" + 3B];
            D.25381 = *D.25380;
            D.25382 = (int) D.25381;
            D.25383 = __s2 + 3;
            D.25384 = *D.25383;
            D.25385 = (int) D.25384;
            __result = D.25382 - D.25385;
            <D.25379>:
            <D.25377>:
            <D.25369>:
            <D.25367>:
            <D.25359>:
            <D.25357>:
          }
          D.21271 = __result;
        }
        iftmp.445 = -D.21271;
        goto <D.25386>;
        <D.25350>:
        iftmp.445 = __builtin_strcmp (major_collector_opt, "marksweep-par");
        <D.25386>:
        D.21272 = iftmp.445;
      }
      if (D.21272 == 0) goto <D.25344>; else goto <D.25345>;
      <D.25344>:
      sgen_marksweep_par_init (&major_collector);
      goto <D.25346>;
      <D.25345>:
      if (major_collector_opt == 0B) goto <D.25387>; else goto <D.25390>;
      <D.25390>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25394 = "marksweep-fixed-par";
          D.25395 = MEM[(const unsigned char *)D.25394];
          D.25396 = (int) D.25395;
          D.25397 = *__s2;
          D.25398 = (int) D.25397;
          __result = D.25396 - D.25398;
          {
            if (__s2_len != 0) goto <D.25399>; else goto <D.25400>;
            <D.25399>:
            if (__result == 0) goto <D.25401>; else goto <D.25402>;
            <D.25401>:
            D.25403 = &MEM[(void *)"marksweep-fixed-par" + 1B];
            D.25404 = *D.25403;
            D.25405 = (int) D.25404;
            D.25406 = __s2 + 1;
            D.25407 = *D.25406;
            D.25408 = (int) D.25407;
            __result = D.25405 - D.25408;
            if (__s2_len > 1) goto <D.25409>; else goto <D.25410>;
            <D.25409>:
            if (__result == 0) goto <D.25411>; else goto <D.25412>;
            <D.25411>:
            D.25413 = &MEM[(void *)"marksweep-fixed-par" + 2B];
            D.25414 = *D.25413;
            D.25415 = (int) D.25414;
            D.25416 = __s2 + 2;
            D.25417 = *D.25416;
            D.25418 = (int) D.25417;
            __result = D.25415 - D.25418;
            if (__s2_len > 2) goto <D.25419>; else goto <D.25420>;
            <D.25419>:
            if (__result == 0) goto <D.25421>; else goto <D.25422>;
            <D.25421>:
            D.25423 = &MEM[(void *)"marksweep-fixed-par" + 3B];
            D.25424 = *D.25423;
            D.25425 = (int) D.25424;
            D.25426 = __s2 + 3;
            D.25427 = *D.25426;
            D.25428 = (int) D.25427;
            __result = D.25425 - D.25428;
            <D.25422>:
            <D.25420>:
            <D.25412>:
            <D.25410>:
            <D.25402>:
            <D.25400>:
          }
          D.21280 = __result;
        }
        iftmp.446 = -D.21280;
        goto <D.25429>;
        <D.25393>:
        iftmp.446 = __builtin_strcmp (major_collector_opt, "marksweep-fixed-par");
        <D.25429>:
        D.21281 = iftmp.446;
      }
      if (D.21281 == 0) goto <D.25387>; else goto <D.25388>;
      <D.25387>:
      sgen_marksweep_fixed_par_init (&major_collector);
      goto <D.25389>;
      <D.25388>:
      if (major_collector_opt == 0B) goto <D.25430>; else goto <D.25433>;
      <D.25433>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25437 = "marksweep-conc";
          D.25438 = MEM[(const unsigned char *)D.25437];
          D.25439 = (int) D.25438;
          D.25440 = *__s2;
          D.25441 = (int) D.25440;
          __result = D.25439 - D.25441;
          {
            if (__s2_len != 0) goto <D.25442>; else goto <D.25443>;
            <D.25442>:
            if (__result == 0) goto <D.25444>; else goto <D.25445>;
            <D.25444>:
            D.25446 = &MEM[(void *)"marksweep-conc" + 1B];
            D.25447 = *D.25446;
            D.25448 = (int) D.25447;
            D.25449 = __s2 + 1;
            D.25450 = *D.25449;
            D.25451 = (int) D.25450;
            __result = D.25448 - D.25451;
            if (__s2_len > 1) goto <D.25452>; else goto <D.25453>;
            <D.25452>:
            if (__result == 0) goto <D.25454>; else goto <D.25455>;
            <D.25454>:
            D.25456 = &MEM[(void *)"marksweep-conc" + 2B];
            D.25457 = *D.25456;
            D.25458 = (int) D.25457;
            D.25459 = __s2 + 2;
            D.25460 = *D.25459;
            D.25461 = (int) D.25460;
            __result = D.25458 - D.25461;
            if (__s2_len > 2) goto <D.25462>; else goto <D.25463>;
            <D.25462>:
            if (__result == 0) goto <D.25464>; else goto <D.25465>;
            <D.25464>:
            D.25466 = &MEM[(void *)"marksweep-conc" + 3B];
            D.25467 = *D.25466;
            D.25468 = (int) D.25467;
            D.25469 = __s2 + 3;
            D.25470 = *D.25469;
            D.25471 = (int) D.25470;
            __result = D.25468 - D.25471;
            <D.25465>:
            <D.25463>:
            <D.25455>:
            <D.25453>:
            <D.25445>:
            <D.25443>:
          }
          D.21289 = __result;
        }
        iftmp.447 = -D.21289;
        goto <D.25472>;
        <D.25436>:
        iftmp.447 = __builtin_strcmp (major_collector_opt, "marksweep-conc");
        <D.25472>:
        D.21290 = iftmp.447;
      }
      if (D.21290 == 0) goto <D.25430>; else goto <D.25431>;
      <D.25430>:
      sgen_marksweep_conc_init (&major_collector);
      goto <D.25432>;
      <D.25431>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `marksweep` instead.", "Unknown major collector `%s\'.", major_collector_opt);
      goto use_marksweep_major;
      <D.25432>:
      <D.25389>:
      <D.25346>:
      <D.25303>:
      <D.25260>:
      if (have_split_nursery != 0) goto <D.25473>; else goto <D.25474>;
      <D.25473>:
      D.25475 = major_collector.is_parallel;
      if (D.25475 != 0) goto <D.25476>; else goto <D.25477>;
      <D.25476>:
      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.25477>:
      <D.25474>:
      num_workers = mono_cpu_count ();
      D.25478 = num_workers <= 0;
      D.25479 = (long int) D.25478;
      D.25480 = __builtin_expect (D.25479, 0);
      if (D.25480 != 0) goto <D.25481>; else goto <D.25482>;
      <D.25481>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4977, "num_workers > 0");
      <D.25482>:
      if (num_workers > 16) goto <D.25483>; else goto <D.25484>;
      <D.25483>:
      num_workers = 16;
      <D.25484>:
      conservative_stack_mark = 1;
      sgen_nursery_size.448 = sgen_nursery_size;
      sgen_nursery_size = sgen_nursery_size.448;
      if (opts != 0B) goto <D.25486>; else goto <D.25487>;
      <D.25486>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.25491 = "";
              D.25492 = MEM[(const unsigned char *)D.25491];
              D.25493 = (int) D.25492;
              D.25494 = *__s2;
              D.25495 = (int) D.25494;
              __result = D.25493 - D.25495;
              {
                if (__s2_len != 0) goto <D.25496>; else goto <D.25497>;
                <D.25496>:
                if (__result == 0) goto <D.25498>; else goto <D.25499>;
                <D.25498>:
                D.25500 = &MEM[(void *)"" + 1B];
                D.25501 = *D.25500;
                D.25502 = (int) D.25501;
                D.25503 = __s2 + 1;
                D.25504 = *D.25503;
                D.25505 = (int) D.25504;
                __result = D.25502 - D.25505;
                if (__s2_len > 1) goto <D.25506>; else goto <D.25507>;
                <D.25506>:
                if (__result == 0) goto <D.25508>; else goto <D.25509>;
                <D.25508>:
                D.25510 = &MEM[(void *)"" + 2B];
                D.25511 = *D.25510;
                D.25512 = (int) D.25511;
                D.25513 = __s2 + 2;
                D.25514 = *D.25513;
                D.25515 = (int) D.25514;
                __result = D.25512 - D.25515;
                if (__s2_len > 2) goto <D.25516>; else goto <D.25517>;
                <D.25516>:
                if (__result == 0) goto <D.25518>; else goto <D.25519>;
                <D.25518>:
                D.25520 = &MEM[(void *)"" + 3B];
                D.25521 = *D.25520;
                D.25522 = (int) D.25521;
                D.25523 = __s2 + 3;
                D.25524 = *D.25523;
                D.25525 = (int) D.25524;
                __result = D.25522 - D.25525;
                <D.25519>:
                <D.25517>:
                <D.25509>:
                <D.25507>:
                <D.25499>:
                <D.25497>:
              }
              D.21300 = __result;
            }
            iftmp.449 = -D.21300;
            goto <D.25526>;
            <D.25490>:
            D.25527 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.449 = (int) D.25527;
            <D.25526>:
            D.21301 = iftmp.449;
          }
          if (D.21301 == 0) goto <D.25528>; else goto <D.25529>;
          <D.25528>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25529>:
          D.25530 = monoeg_g_str_has_prefix (opt, "major=");
          if (D.25530 != 0) goto <D.25531>; else goto <D.25532>;
          <D.25531>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25532>:
          D.25533 = monoeg_g_str_has_prefix (opt, "minor=");
          if (D.25533 != 0) goto <D.25534>; else goto <D.25535>;
          <D.25534>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25535>:
          D.25536 = monoeg_g_str_has_prefix (opt, "max-heap-size=");
          if (D.25536 != 0) goto <D.25537>; else goto <D.25538>;
          <D.25537>:
          {
            glong max_heap_candidate;

            try
              {
                max_heap_candidate = 0;
                D.25539 = __builtin_strchr (opt, 61);
                opt = D.25539 + 1;
                D.25542 = *opt;
                if (D.25542 != 0) goto <D.25543>; else goto <D.25540>;
                <D.25543>:
                D.25544 = mono_gc_parse_environment_string_extract_number (opt, &max_heap_candidate);
                if (D.25544 != 0) goto <D.25545>; else goto <D.25540>;
                <D.25545>:
                D.25546 = mono_pagesize ();
                max_heap_candidate.450 = max_heap_candidate;
                D.25548 = D.25546 + max_heap_candidate.450;
                D.25549 = D.25548 + -1;
                D.25550 = mono_pagesize ();
                D.25551 = -D.25550;
                max_heap = D.25549 & D.25551;
                max_heap_candidate.450 = max_heap_candidate;
                if (max_heap != max_heap_candidate.450) goto <D.25552>; else goto <D.25553>;
                <D.25552>:
                D.25554 = mono_pagesize ();
                sgen_env_var_error ("MONO_GC_PARAMS", "Rounding up.", "`max-heap-size` size must be a multiple of %d.", D.25554);
                <D.25553>:
                goto <D.25541>;
                <D.25540>:
                sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`max-heap-size` must be an integer.");
                <D.25541>:
                // predicted unlikely by continue predictor.
                goto <D.21302>;
              }
            finally
              {
                max_heap_candidate = {CLOBBER};
              }
          }
          <D.25538>:
          D.25555 = monoeg_g_str_has_prefix (opt, "soft-heap-limit=");
          if (D.25555 != 0) goto <D.25556>; else goto <D.25557>;
          <D.25556>:
          D.25558 = __builtin_strchr (opt, 61);
          opt = D.25558 + 1;
          D.25542 = *opt;
          if (D.25542 != 0) goto <D.25561>; else goto <D.25559>;
          <D.25561>:
          D.25562 = mono_gc_parse_environment_string_extract_number (opt, &soft_limit);
          if (D.25562 != 0) goto <D.25563>; else goto <D.25559>;
          <D.25563>:
          soft_limit.451 = soft_limit;
          if (soft_limit.451 <= 0) goto <D.25565>; else goto <D.25566>;
          <D.25565>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be positive.");
          soft_limit = 0;
          <D.25566>:
          goto <D.25560>;
          <D.25559>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be an integer.");
          <D.25560>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25557>:
          D.25567 = monoeg_g_str_has_prefix (opt, "workers=");
          if (D.25567 != 0) goto <D.25568>; else goto <D.25569>;
          <D.25568>:
          {
            long int val;
            char * endptr;

            try
              {
                D.25475 = major_collector.is_parallel;
                if (D.25475 == 0) goto <D.25570>; else goto <D.25571>;
                <D.25570>:
                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.21302>;
                <D.25571>:
                D.25572 = __builtin_strchr (opt, 61);
                opt = D.25572 + 1;
                val = strtol (opt, &endptr, 10);
                D.25542 = *opt;
                if (D.25542 == 0) goto <D.25573>; else goto <D.25575>;
                <D.25575>:
                endptr.452 = endptr;
                D.25577 = *endptr.452;
                if (D.25577 != 0) goto <D.25573>; else goto <D.25574>;
                <D.25573>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Cannot parse the `workers` option value.");
                // predicted unlikely by continue predictor.
                goto <D.21302>;
                <D.25574>:
                val.453 = (unsigned int) val;
                D.25579 = val.453 + 4294967295;
                if (D.25579 > 15) goto <D.25580>; else goto <D.25581>;
                <D.25580>:
                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.21302>;
                <D.25581>:
                num_workers = val;
                // predicted unlikely by continue predictor.
                goto <D.21302>;
              }
            finally
              {
                endptr = {CLOBBER};
              }
          }
          <D.25569>:
          D.25582 = monoeg_g_str_has_prefix (opt, "stack-mark=");
          if (D.25582 != 0) goto <D.25583>; else goto <D.25584>;
          <D.25583>:
          D.25585 = __builtin_strchr (opt, 61);
          opt = D.25585 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25589 = "precise";
              D.25590 = MEM[(const unsigned char *)D.25589];
              D.25591 = (int) D.25590;
              D.25592 = *__s2;
              D.25593 = (int) D.25592;
              __result = D.25591 - D.25593;
              {
                if (__s2_len != 0) goto <D.25594>; else goto <D.25595>;
                <D.25594>:
                if (__result == 0) goto <D.25596>; else goto <D.25597>;
                <D.25596>:
                D.25598 = &MEM[(void *)"precise" + 1B];
                D.25599 = *D.25598;
                D.25600 = (int) D.25599;
                D.25601 = __s2 + 1;
                D.25602 = *D.25601;
                D.25603 = (int) D.25602;
                __result = D.25600 - D.25603;
                if (__s2_len > 1) goto <D.25604>; else goto <D.25605>;
                <D.25604>:
                if (__result == 0) goto <D.25606>; else goto <D.25607>;
                <D.25606>:
                D.25608 = &MEM[(void *)"precise" + 2B];
                D.25609 = *D.25608;
                D.25610 = (int) D.25609;
                D.25611 = __s2 + 2;
                D.25612 = *D.25611;
                D.25613 = (int) D.25612;
                __result = D.25610 - D.25613;
                if (__s2_len > 2) goto <D.25614>; else goto <D.25615>;
                <D.25614>:
                if (__result == 0) goto <D.25616>; else goto <D.25617>;
                <D.25616>:
                D.25618 = &MEM[(void *)"precise" + 3B];
                D.25619 = *D.25618;
                D.25620 = (int) D.25619;
                D.25621 = __s2 + 3;
                D.25622 = *D.25621;
                D.25623 = (int) D.25622;
                __result = D.25620 - D.25623;
                <D.25617>:
                <D.25615>:
                <D.25607>:
                <D.25605>:
                <D.25597>:
                <D.25595>:
              }
              D.21313 = __result;
            }
            iftmp.454 = -D.21313;
            goto <D.25624>;
            <D.25588>:
            iftmp.454 = __builtin_strcmp (opt, "precise");
            <D.25624>:
            D.21314 = iftmp.454;
          }
          if (D.21314 == 0) goto <D.25625>; else goto <D.25626>;
          <D.25625>:
          conservative_stack_mark = 0;
          goto <D.25627>;
          <D.25626>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25631 = "conservative";
              D.25632 = MEM[(const unsigned char *)D.25631];
              D.25633 = (int) D.25632;
              D.25634 = *__s2;
              D.25635 = (int) D.25634;
              __result = D.25633 - D.25635;
              {
                if (__s2_len != 0) goto <D.25636>; else goto <D.25637>;
                <D.25636>:
                if (__result == 0) goto <D.25638>; else goto <D.25639>;
                <D.25638>:
                D.25640 = &MEM[(void *)"conservative" + 1B];
                D.25641 = *D.25640;
                D.25642 = (int) D.25641;
                D.25643 = __s2 + 1;
                D.25644 = *D.25643;
                D.25645 = (int) D.25644;
                __result = D.25642 - D.25645;
                if (__s2_len > 1) goto <D.25646>; else goto <D.25647>;
                <D.25646>:
                if (__result == 0) goto <D.25648>; else goto <D.25649>;
                <D.25648>:
                D.25650 = &MEM[(void *)"conservative" + 2B];
                D.25651 = *D.25650;
                D.25652 = (int) D.25651;
                D.25653 = __s2 + 2;
                D.25654 = *D.25653;
                D.25655 = (int) D.25654;
                __result = D.25652 - D.25655;
                if (__s2_len > 2) goto <D.25656>; else goto <D.25657>;
                <D.25656>:
                if (__result == 0) goto <D.25658>; else goto <D.25659>;
                <D.25658>:
                D.25660 = &MEM[(void *)"conservative" + 3B];
                D.25661 = *D.25660;
                D.25662 = (int) D.25661;
                D.25663 = __s2 + 3;
                D.25664 = *D.25663;
                D.25665 = (int) D.25664;
                __result = D.25662 - D.25665;
                <D.25659>:
                <D.25657>:
                <D.25649>:
                <D.25647>:
                <D.25639>:
                <D.25637>:
              }
              D.21322 = __result;
            }
            iftmp.455 = -D.21322;
            goto <D.25666>;
            <D.25630>:
            iftmp.455 = __builtin_strcmp (opt, "conservative");
            <D.25666>:
            D.21323 = iftmp.455;
          }
          if (D.21323 == 0) goto <D.25667>; else goto <D.25668>;
          <D.25667>:
          conservative_stack_mark = 1;
          goto <D.25669>;
          <D.25668>:
          conservative_stack_mark.457 = conservative_stack_mark;
          if (conservative_stack_mark.457 != 0) goto <D.25672>; else goto <D.25673>;
          <D.25672>:
          iftmp.456 = "Using `conservative`.";
          goto <D.25674>;
          <D.25673>:
          iftmp.456 = "Using `precise`.";
          <D.25674>:
          sgen_env_var_error ("MONO_GC_PARAMS", iftmp.456, "Invalid value `%s` for `stack-mark` option, possible values are: `precise`, `conservative`.", opt);
          <D.25669>:
          <D.25627>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25584>:
          D.25675 = monoeg_g_str_has_prefix (opt, "bridge=");
          if (D.25675 != 0) goto <D.25676>; else goto <D.25677>;
          <D.25676>:
          D.25678 = __builtin_strchr (opt, 61);
          opt = D.25678 + 1;
          D.25679 = monoeg_strdup (opt);
          sgen_register_test_bridge_callbacks (D.25679);
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25677>:
          D.25680 = monoeg_g_str_has_prefix (opt, "nursery-size=");
          if (D.25680 != 0) goto <D.25681>; else goto <D.25682>;
          <D.25681>:
          {
            long int val;

            try
              {
                D.25683 = __builtin_strchr (opt, 61);
                opt = D.25683 + 1;
                D.25542 = *opt;
                if (D.25542 != 0) goto <D.25686>; else goto <D.25684>;
                <D.25686>:
                D.25687 = mono_gc_parse_environment_string_extract_number (opt, &val);
                if (D.25687 != 0) goto <D.25688>; else goto <D.25684>;
                <D.25688>:
                val.458 = val;
                D.25690 = val.458 + -1;
                val.458 = val;
                D.25691 = D.25690 & val.458;
                if (D.25691 != 0) goto <D.25692>; else goto <D.25693>;
                <D.25692>:
                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.21302>;
                <D.25693>:
                val.458 = val;
                if (val.458 <= 511) goto <D.25694>; else goto <D.25695>;
                <D.25694>:
                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.21302>;
                <D.25695>:
                val.458 = val;
                sgen_nursery_size = val.458;
                sgen_nursery_bits = 0;
                goto <D.21326>;
                <D.21325>:
                <D.21326>:
                sgen_nursery_bits.459 = sgen_nursery_bits;
                sgen_nursery_bits.460 = sgen_nursery_bits.459 + 1;
                sgen_nursery_bits = sgen_nursery_bits.460;
                sgen_nursery_bits.459 = sgen_nursery_bits;
                D.25698 = 1 << sgen_nursery_bits.459;
                sgen_nursery_size.448 = sgen_nursery_size;
                if (D.25698 != sgen_nursery_size.448) goto <D.21325>; else goto <D.21327>;
                <D.21327>:
                goto <D.25685>;
                <D.25684>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be an integer.");
                // predicted unlikely by continue predictor.
                goto <D.21302>;
                <D.25685>:
                // predicted unlikely by continue predictor.
                goto <D.21302>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.25682>:
          D.25699 = monoeg_g_str_has_prefix (opt, "save-target-ratio=");
          if (D.25699 != 0) goto <D.25700>; else goto <D.25701>;
          <D.25700>:
          {
            double val;

            try
              {
                D.25702 = __builtin_strchr (opt, 61);
                opt = D.25702 + 1;
                D.25703 = parse_double_in_interval ("MONO_GC_PARAMS", "save-target-ratio", opt, 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0, &val);
                if (D.25703 != 0) goto <D.25704>; else goto <D.25705>;
                <D.25704>:
                save_target = val;
                <D.25705>:
                // predicted unlikely by continue predictor.
                goto <D.21302>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.25701>:
          D.25706 = monoeg_g_str_has_prefix (opt, "default-allowance-ratio=");
          if (D.25706 != 0) goto <D.25707>; else goto <D.25708>;
          <D.25707>:
          {
            double val;

            try
              {
                D.25709 = __builtin_strchr (opt, 61);
                opt = D.25709 + 1;
                D.25710 = parse_double_in_interval ("MONO_GC_PARAMS", "default-allowance-ratio", opt, 1.0e+0, 1.0e+0, &val);
                if (D.25710 != 0) goto <D.25711>; else goto <D.25712>;
                <D.25711>:
                allowance_ratio = val;
                <D.25712>:
                // predicted unlikely by continue predictor.
                goto <D.21302>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.25708>:
          D.25713 = monoeg_g_str_has_prefix (opt, "allow-synchronous-major=");
          if (D.25713 != 0) goto <D.25714>; else goto <D.25715>;
          <D.25714>:
          D.25716 = major_collector.is_concurrent;
          if (D.25716 == 0) goto <D.25717>; else goto <D.25718>;
          <D.25717>:
          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.21302>;
          <D.25718>:
          D.25719 = __builtin_strchr (opt, 61);
          opt = D.25719 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25723 = "yes";
              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;
              {
                if (__s2_len != 0) goto <D.25728>; else goto <D.25729>;
                <D.25728>:
                if (__result == 0) goto <D.25730>; else goto <D.25731>;
                <D.25730>:
                D.25732 = &MEM[(void *)"yes" + 1B];
                D.25733 = *D.25732;
                D.25734 = (int) D.25733;
                D.25735 = __s2 + 1;
                D.25736 = *D.25735;
                D.25737 = (int) D.25736;
                __result = D.25734 - D.25737;
                if (__s2_len > 1) goto <D.25738>; else goto <D.25739>;
                <D.25738>:
                if (__result == 0) goto <D.25740>; else goto <D.25741>;
                <D.25740>:
                D.25742 = &MEM[(void *)"yes" + 2B];
                D.25743 = *D.25742;
                D.25744 = (int) D.25743;
                D.25745 = __s2 + 2;
                D.25746 = *D.25745;
                D.25747 = (int) D.25746;
                __result = D.25744 - D.25747;
                if (__s2_len > 2) goto <D.25748>; else goto <D.25749>;
                <D.25748>:
                if (__result == 0) goto <D.25750>; else goto <D.25751>;
                <D.25750>:
                D.25752 = &MEM[(void *)"yes" + 3B];
                D.25753 = *D.25752;
                D.25754 = (int) D.25753;
                D.25755 = __s2 + 3;
                D.25756 = *D.25755;
                D.25757 = (int) D.25756;
                __result = D.25754 - D.25757;
                <D.25751>:
                <D.25749>:
                <D.25741>:
                <D.25739>:
                <D.25731>:
                <D.25729>:
              }
              D.21337 = __result;
            }
            iftmp.461 = -D.21337;
            goto <D.25758>;
            <D.25722>:
            iftmp.461 = __builtin_strcmp (opt, "yes");
            <D.25758>:
            D.21338 = iftmp.461;
          }
          if (D.21338 == 0) goto <D.25759>; else goto <D.25760>;
          <D.25759>:
          allow_synchronous_major = 1;
          goto <D.25761>;
          <D.25760>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25765 = "no";
              D.25766 = MEM[(const unsigned char *)D.25765];
              D.25767 = (int) D.25766;
              D.25768 = *__s2;
              D.25769 = (int) D.25768;
              __result = D.25767 - D.25769;
              {
                if (__s2_len != 0) goto <D.25770>; else goto <D.25771>;
                <D.25770>:
                if (__result == 0) goto <D.25772>; else goto <D.25773>;
                <D.25772>:
                D.25774 = &MEM[(void *)"no" + 1B];
                D.25775 = *D.25774;
                D.25776 = (int) D.25775;
                D.25777 = __s2 + 1;
                D.25778 = *D.25777;
                D.25779 = (int) D.25778;
                __result = D.25776 - D.25779;
                if (__s2_len > 1) goto <D.25780>; else goto <D.25781>;
                <D.25780>:
                if (__result == 0) goto <D.25782>; else goto <D.25783>;
                <D.25782>:
                D.25784 = &MEM[(void *)"no" + 2B];
                D.25785 = *D.25784;
                D.25786 = (int) D.25785;
                D.25787 = __s2 + 2;
                D.25788 = *D.25787;
                D.25789 = (int) D.25788;
                __result = D.25786 - D.25789;
                if (__s2_len > 2) goto <D.25790>; else goto <D.25791>;
                <D.25790>:
                if (__result == 0) goto <D.25792>; else goto <D.25793>;
                <D.25792>:
                D.25794 = &MEM[(void *)"no" + 3B];
                D.25795 = *D.25794;
                D.25796 = (int) D.25795;
                D.25797 = __s2 + 3;
                D.25798 = *D.25797;
                D.25799 = (int) D.25798;
                __result = D.25796 - D.25799;
                <D.25793>:
                <D.25791>:
                <D.25783>:
                <D.25781>:
                <D.25773>:
                <D.25771>:
              }
              D.21346 = __result;
            }
            iftmp.462 = -D.21346;
            goto <D.25800>;
            <D.25764>:
            iftmp.462 = __builtin_strcmp (opt, "no");
            <D.25800>:
            D.21347 = iftmp.462;
          }
          if (D.21347 == 0) goto <D.25801>; else goto <D.25802>;
          <D.25801>:
          allow_synchronous_major = 0;
          goto <D.25803>;
          <D.25802>:
          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.21302>;
          <D.25803>:
          <D.25761>:
          <D.25715>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25807 = "cementing";
              D.25808 = MEM[(const unsigned char *)D.25807];
              D.25809 = (int) D.25808;
              D.25810 = *__s2;
              D.25811 = (int) D.25810;
              __result = D.25809 - D.25811;
              {
                if (__s2_len != 0) goto <D.25812>; else goto <D.25813>;
                <D.25812>:
                if (__result == 0) goto <D.25814>; else goto <D.25815>;
                <D.25814>:
                D.25816 = &MEM[(void *)"cementing" + 1B];
                D.25817 = *D.25816;
                D.25818 = (int) D.25817;
                D.25819 = __s2 + 1;
                D.25820 = *D.25819;
                D.25821 = (int) D.25820;
                __result = D.25818 - D.25821;
                if (__s2_len > 1) goto <D.25822>; else goto <D.25823>;
                <D.25822>:
                if (__result == 0) goto <D.25824>; else goto <D.25825>;
                <D.25824>:
                D.25826 = &MEM[(void *)"cementing" + 2B];
                D.25827 = *D.25826;
                D.25828 = (int) D.25827;
                D.25829 = __s2 + 2;
                D.25830 = *D.25829;
                D.25831 = (int) D.25830;
                __result = D.25828 - D.25831;
                if (__s2_len > 2) goto <D.25832>; else goto <D.25833>;
                <D.25832>:
                if (__result == 0) goto <D.25834>; else goto <D.25835>;
                <D.25834>:
                D.25836 = &MEM[(void *)"cementing" + 3B];
                D.25837 = *D.25836;
                D.25838 = (int) D.25837;
                D.25839 = __s2 + 3;
                D.25840 = *D.25839;
                D.25841 = (int) D.25840;
                __result = D.25838 - D.25841;
                <D.25835>:
                <D.25833>:
                <D.25825>:
                <D.25823>:
                <D.25815>:
                <D.25813>:
              }
              D.21355 = __result;
            }
            iftmp.463 = -D.21355;
            goto <D.25842>;
            <D.25806>:
            iftmp.463 = __builtin_strcmp (opt, "cementing");
            <D.25842>:
            D.21356 = iftmp.463;
          }
          if (D.21356 == 0) goto <D.25843>; else goto <D.25844>;
          <D.25843>:
          D.25475 = major_collector.is_parallel;
          if (D.25475 != 0) goto <D.25845>; else goto <D.25846>;
          <D.25845>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "`cementing` is not supported for the parallel major collector.");
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25846>:
          cement_enabled = 1;
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25844>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25850 = "no-cementing";
              D.25851 = MEM[(const unsigned char *)D.25850];
              D.25852 = (int) D.25851;
              D.25853 = *__s2;
              D.25854 = (int) D.25853;
              __result = D.25852 - D.25854;
              {
                if (__s2_len != 0) goto <D.25855>; else goto <D.25856>;
                <D.25855>:
                if (__result == 0) goto <D.25857>; else goto <D.25858>;
                <D.25857>:
                D.25859 = &MEM[(void *)"no-cementing" + 1B];
                D.25860 = *D.25859;
                D.25861 = (int) D.25860;
                D.25862 = __s2 + 1;
                D.25863 = *D.25862;
                D.25864 = (int) D.25863;
                __result = D.25861 - D.25864;
                if (__s2_len > 1) goto <D.25865>; else goto <D.25866>;
                <D.25865>:
                if (__result == 0) goto <D.25867>; else goto <D.25868>;
                <D.25867>:
                D.25869 = &MEM[(void *)"no-cementing" + 2B];
                D.25870 = *D.25869;
                D.25871 = (int) D.25870;
                D.25872 = __s2 + 2;
                D.25873 = *D.25872;
                D.25874 = (int) D.25873;
                __result = D.25871 - D.25874;
                if (__s2_len > 2) goto <D.25875>; else goto <D.25876>;
                <D.25875>:
                if (__result == 0) goto <D.25877>; else goto <D.25878>;
                <D.25877>:
                D.25879 = &MEM[(void *)"no-cementing" + 3B];
                D.25880 = *D.25879;
                D.25881 = (int) D.25880;
                D.25882 = __s2 + 3;
                D.25883 = *D.25882;
                D.25884 = (int) D.25883;
                __result = D.25881 - D.25884;
                <D.25878>:
                <D.25876>:
                <D.25868>:
                <D.25866>:
                <D.25858>:
                <D.25856>:
              }
              D.21364 = __result;
            }
            iftmp.464 = -D.21364;
            goto <D.25885>;
            <D.25849>:
            iftmp.464 = __builtin_strcmp (opt, "no-cementing");
            <D.25885>:
            D.21365 = iftmp.464;
          }
          if (D.21365 == 0) goto <D.25886>; else goto <D.25887>;
          <D.25886>:
          cement_enabled = 0;
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25887>:
          D.25888 = major_collector.handle_gc_param;
          if (D.25888 != 0B) goto <D.25889>; else goto <D.25890>;
          <D.25889>:
          D.25888 = major_collector.handle_gc_param;
          D.25891 = D.25888 (opt);
          if (D.25891 != 0) goto <D.25892>; else goto <D.25893>;
          <D.25892>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25893>:
          <D.25890>:
          D.25894 = sgen_minor_collector.handle_gc_param;
          if (D.25894 != 0B) goto <D.25895>; else goto <D.25896>;
          <D.25895>:
          D.25894 = sgen_minor_collector.handle_gc_param;
          D.25897 = D.25894 (opt);
          if (D.25897 != 0) goto <D.25898>; else goto <D.25899>;
          <D.25898>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25899>:
          <D.25896>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.25900>; else goto <D.25901>;
          <D.25900>:
          // predicted unlikely by continue predictor.
          goto <D.21302>;
          <D.25901>:
          stderr.440 = stderr;
          fprintf (stderr.440, "\n%s must be a comma-delimited list of one or more of the following:\n", "MONO_GC_PARAMS");
          stderr.440 = stderr;
          fprintf (stderr.440, "  max-heap-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  soft-heap-limit=n (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  nursery-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  major=COLLECTOR (where COLLECTOR is `marksweep\', `marksweep-conc\', `marksweep-par\', \'marksweep-fixed\' or \'marksweep-fixed-par\')\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  minor=COLLECTOR (where COLLECTOR is `simple\' or `split\')\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  wbarrier=WBARRIER (where WBARRIER is `remset\' or `cardtable\')\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  stack-mark=MARK-METHOD (where MARK-METHOD is \'precise\' or \'conservative\')\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  [no-]cementing\n");
          D.25716 = major_collector.is_concurrent;
          if (D.25716 != 0) goto <D.25902>; else goto <D.25903>;
          <D.25902>:
          stderr.440 = stderr;
          fprintf (stderr.440, "  allow-synchronous-major=FLAG (where FLAG is `yes\' or `no\')\n");
          <D.25903>:
          D.25904 = major_collector.print_gc_param_usage;
          if (D.25904 != 0B) goto <D.25905>; else goto <D.25906>;
          <D.25905>:
          D.25904 = major_collector.print_gc_param_usage;
          D.25904 ();
          <D.25906>:
          D.25907 = sgen_minor_collector.print_gc_param_usage;
          if (D.25907 != 0B) goto <D.25908>; else goto <D.25909>;
          <D.25908>:
          D.25907 = sgen_minor_collector.print_gc_param_usage;
          D.25907 ();
          <D.25909>:
          stderr.440 = stderr;
          fprintf (stderr.440, " Experimental options:\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  save-target-ratio=R (where R must be between %.2f - %.2f).\n", 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0);
          stderr.440 = stderr;
          fprintf (stderr.440, "  default-allowance-ratio=R (where R must be between %.2f - %.2f).\n", 1.0e+0, 1.0e+1);
          stderr.440 = stderr;
          fprintf (stderr.440, "\n");
          usage_printed = 1;
        }
        <D.21302>:
        ptr = ptr + 4;
        <D.21367>:
        D.25169 = *ptr;
        if (D.25169 != 0B) goto <D.21366>; else goto <D.21368>;
        <D.21368>:
        monoeg_g_strfreev (opts);
      }
      <D.25487>:
      D.25475 = major_collector.is_parallel;
      if (D.25475 != 0) goto <D.25910>; else goto <D.25911>;
      <D.25910>:
      cement_enabled = 0;
      sgen_workers_init (num_workers);
      goto <D.25912>;
      <D.25911>:
      D.25716 = major_collector.is_concurrent;
      if (D.25716 != 0) goto <D.25913>; else goto <D.25914>;
      <D.25913>:
      sgen_workers_init (1);
      <D.25914>:
      <D.25912>:
      if (major_collector_opt != 0B) goto <D.25915>; else goto <D.25916>;
      <D.25915>:
      monoeg_g_free (major_collector_opt);
      <D.25916>:
      if (minor_collector_opt != 0B) goto <D.25917>; else goto <D.25918>;
      <D.25917>:
      monoeg_g_free (minor_collector_opt);
      <D.25918>:
      alloc_nursery ();
      sgen_cement_init (cement_enabled);
      env = monoeg_g_getenv ("MONO_GC_DEBUG");
      if (env != 0B) goto <D.25919>; else goto <D.25920>;
      <D.25919>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.25491 = "";
              D.25492 = MEM[(const unsigned char *)D.25491];
              D.25493 = (int) D.25492;
              D.25924 = *__s2;
              D.25925 = (int) D.25924;
              __result = D.25493 - D.25925;
              {
                if (__s2_len != 0) goto <D.25926>; else goto <D.25927>;
                <D.25926>:
                if (__result == 0) goto <D.25928>; else goto <D.25929>;
                <D.25928>:
                D.25500 = &MEM[(void *)"" + 1B];
                D.25501 = *D.25500;
                D.25502 = (int) D.25501;
                D.25930 = __s2 + 1;
                D.25931 = *D.25930;
                D.25932 = (int) D.25931;
                __result = D.25502 - D.25932;
                if (__s2_len > 1) goto <D.25933>; else goto <D.25934>;
                <D.25933>:
                if (__result == 0) goto <D.25935>; else goto <D.25936>;
                <D.25935>:
                D.25510 = &MEM[(void *)"" + 2B];
                D.25511 = *D.25510;
                D.25512 = (int) D.25511;
                D.25937 = __s2 + 2;
                D.25938 = *D.25937;
                D.25939 = (int) D.25938;
                __result = D.25512 - D.25939;
                if (__s2_len > 2) goto <D.25940>; else goto <D.25941>;
                <D.25940>:
                if (__result == 0) goto <D.25942>; else goto <D.25943>;
                <D.25942>:
                D.25520 = &MEM[(void *)"" + 3B];
                D.25521 = *D.25520;
                D.25522 = (int) D.25521;
                D.25944 = __s2 + 3;
                D.25945 = *D.25944;
                D.25946 = (int) D.25945;
                __result = D.25522 - D.25946;
                <D.25943>:
                <D.25941>:
                <D.25936>:
                <D.25934>:
                <D.25929>:
                <D.25927>:
              }
              D.21378 = __result;
            }
            iftmp.465 = -D.21378;
            goto <D.25947>;
            <D.25923>:
            D.25948 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.465 = (int) D.25948;
            <D.25947>:
            D.21379 = iftmp.465;
          }
          if (D.21379 == 0) goto <D.25949>; else goto <D.25950>;
          <D.25949>:
          // predicted unlikely by continue predictor.
          goto <D.21380>;
          <D.25950>:
          D.25951 = *opt;
          D.25952 = (unsigned char) D.25951;
          D.25953 = D.25952 + 208;
          if (D.25953 <= 9) goto <D.25954>; else goto <D.25955>;
          <D.25954>:
          gc_debug_level.466 = atoi (opt);
          gc_debug_level = gc_debug_level.466;
          opt = opt + 1;
          D.25951 = *opt;
          if (D.25951 == 58) goto <D.25957>; else goto <D.25958>;
          <D.25957>:
          opt = opt + 1;
          <D.25958>:
          D.25951 = *opt;
          if (D.25951 != 0) goto <D.25959>; else goto <D.25960>;
          <D.25959>:
          {
            char * rf;

            D.25961 = getpid ();
            rf = monoeg_g_strdup_printf ("%s.%d", opt, D.25961);
            gc_debug_file.467 = fopen (rf, "wb");
            gc_debug_file = gc_debug_file.467;
            gc_debug_file.468 = gc_debug_file;
            if (gc_debug_file.468 == 0B) goto <D.25964>; else goto <D.25965>;
            <D.25964>:
            stderr.440 = stderr;
            gc_debug_file = stderr.440;
            <D.25965>:
            monoeg_g_free (rf);
          }
          <D.25960>:
          goto <D.25966>;
          <D.25955>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25970 = "print-allowance";
              D.25971 = MEM[(const unsigned char *)D.25970];
              D.25972 = (int) D.25971;
              D.25973 = *__s2;
              D.25974 = (int) D.25973;
              __result = D.25972 - D.25974;
              {
                if (__s2_len != 0) goto <D.25975>; else goto <D.25976>;
                <D.25975>:
                if (__result == 0) goto <D.25977>; else goto <D.25978>;
                <D.25977>:
                D.25979 = &MEM[(void *)"print-allowance" + 1B];
                D.25980 = *D.25979;
                D.25981 = (int) D.25980;
                D.25982 = __s2 + 1;
                D.25983 = *D.25982;
                D.25984 = (int) D.25983;
                __result = D.25981 - D.25984;
                if (__s2_len > 1) goto <D.25985>; else goto <D.25986>;
                <D.25985>:
                if (__result == 0) goto <D.25987>; else goto <D.25988>;
                <D.25987>:
                D.25989 = &MEM[(void *)"print-allowance" + 2B];
                D.25990 = *D.25989;
                D.25991 = (int) D.25990;
                D.25992 = __s2 + 2;
                D.25993 = *D.25992;
                D.25994 = (int) D.25993;
                __result = D.25991 - D.25994;
                if (__s2_len > 2) goto <D.25995>; else goto <D.25996>;
                <D.25995>:
                if (__result == 0) goto <D.25997>; else goto <D.25998>;
                <D.25997>:
                D.25999 = &MEM[(void *)"print-allowance" + 3B];
                D.26000 = *D.25999;
                D.26001 = (int) D.26000;
                D.26002 = __s2 + 3;
                D.26003 = *D.26002;
                D.26004 = (int) D.26003;
                __result = D.26001 - D.26004;
                <D.25998>:
                <D.25996>:
                <D.25988>:
                <D.25986>:
                <D.25978>:
                <D.25976>:
              }
              D.21389 = __result;
            }
            iftmp.469 = -D.21389;
            goto <D.26005>;
            <D.25969>:
            iftmp.469 = __builtin_strcmp (opt, "print-allowance");
            <D.26005>:
            D.21390 = iftmp.469;
          }
          if (D.21390 == 0) goto <D.26006>; else goto <D.26007>;
          <D.26006>:
          debug_print_allowance = 1;
          goto <D.26008>;
          <D.26007>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26012 = "print-pinning";
              D.26013 = MEM[(const unsigned char *)D.26012];
              D.26014 = (int) D.26013;
              D.26015 = *__s2;
              D.26016 = (int) D.26015;
              __result = D.26014 - D.26016;
              {
                if (__s2_len != 0) goto <D.26017>; else goto <D.26018>;
                <D.26017>:
                if (__result == 0) goto <D.26019>; else goto <D.26020>;
                <D.26019>:
                D.26021 = &MEM[(void *)"print-pinning" + 1B];
                D.26022 = *D.26021;
                D.26023 = (int) D.26022;
                D.26024 = __s2 + 1;
                D.26025 = *D.26024;
                D.26026 = (int) D.26025;
                __result = D.26023 - D.26026;
                if (__s2_len > 1) goto <D.26027>; else goto <D.26028>;
                <D.26027>:
                if (__result == 0) goto <D.26029>; else goto <D.26030>;
                <D.26029>:
                D.26031 = &MEM[(void *)"print-pinning" + 2B];
                D.26032 = *D.26031;
                D.26033 = (int) D.26032;
                D.26034 = __s2 + 2;
                D.26035 = *D.26034;
                D.26036 = (int) D.26035;
                __result = D.26033 - D.26036;
                if (__s2_len > 2) goto <D.26037>; else goto <D.26038>;
                <D.26037>:
                if (__result == 0) goto <D.26039>; else goto <D.26040>;
                <D.26039>:
                D.26041 = &MEM[(void *)"print-pinning" + 3B];
                D.26042 = *D.26041;
                D.26043 = (int) D.26042;
                D.26044 = __s2 + 3;
                D.26045 = *D.26044;
                D.26046 = (int) D.26045;
                __result = D.26043 - D.26046;
                <D.26040>:
                <D.26038>:
                <D.26030>:
                <D.26028>:
                <D.26020>:
                <D.26018>:
              }
              D.21398 = __result;
            }
            iftmp.470 = -D.21398;
            goto <D.26047>;
            <D.26011>:
            iftmp.470 = __builtin_strcmp (opt, "print-pinning");
            <D.26047>:
            D.21399 = iftmp.470;
          }
          if (D.21399 == 0) goto <D.26048>; else goto <D.26049>;
          <D.26048>:
          do_pin_stats = 1;
          goto <D.26050>;
          <D.26049>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

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

            D.26096 = __builtin_strchr (opt, 61);
            arg = D.26096 + 1;
            D.26097 = atoi (arg);
            verify_before_allocs.472 = (unsigned int) D.26097;
            verify_before_allocs = verify_before_allocs.472;
            has_per_allocation_action = 1;
          }
          goto <D.26099>;
          <D.26095>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26103 = "collect-before-allocs";
              D.26104 = MEM[(const unsigned char *)D.26103];
              D.26105 = (int) D.26104;
              D.26106 = *__s2;
              D.26107 = (int) D.26106;
              __result = D.26105 - D.26107;
              {
                if (__s2_len != 0) goto <D.26108>; else goto <D.26109>;
                <D.26108>:
                if (__result == 0) goto <D.26110>; else goto <D.26111>;
                <D.26110>:
                D.26112 = &MEM[(void *)"collect-before-allocs" + 1B];
                D.26113 = *D.26112;
                D.26114 = (int) D.26113;
                D.26115 = __s2 + 1;
                D.26116 = *D.26115;
                D.26117 = (int) D.26116;
                __result = D.26114 - D.26117;
                if (__s2_len > 1) goto <D.26118>; else goto <D.26119>;
                <D.26118>:
                if (__result == 0) goto <D.26120>; else goto <D.26121>;
                <D.26120>:
                D.26122 = &MEM[(void *)"collect-before-allocs" + 2B];
                D.26123 = *D.26122;
                D.26124 = (int) D.26123;
                D.26125 = __s2 + 2;
                D.26126 = *D.26125;
                D.26127 = (int) D.26126;
                __result = D.26124 - D.26127;
                if (__s2_len > 2) goto <D.26128>; else goto <D.26129>;
                <D.26128>:
                if (__result == 0) goto <D.26130>; else goto <D.26131>;
                <D.26130>:
                D.26132 = &MEM[(void *)"collect-before-allocs" + 3B];
                D.26133 = *D.26132;
                D.26134 = (int) D.26133;
                D.26135 = __s2 + 3;
                D.26136 = *D.26135;
                D.26137 = (int) D.26136;
                __result = D.26134 - D.26137;
                <D.26131>:
                <D.26129>:
                <D.26121>:
                <D.26119>:
                <D.26111>:
                <D.26109>:
              }
              D.21417 = __result;
            }
            iftmp.473 = -D.21417;
            goto <D.26138>;
            <D.26102>:
            iftmp.473 = __builtin_strcmp (opt, "collect-before-allocs");
            <D.26138>:
            D.21418 = iftmp.473;
          }
          if (D.21418 == 0) goto <D.26139>; else goto <D.26140>;
          <D.26139>:
          collect_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.26141>;
          <D.26140>:
          D.26142 = monoeg_g_str_has_prefix (opt, "collect-before-allocs=");
          if (D.26142 != 0) goto <D.26143>; else goto <D.26144>;
          <D.26143>:
          {
            char * arg;

            D.26145 = __builtin_strchr (opt, 61);
            arg = D.26145 + 1;
            has_per_allocation_action = 1;
            D.26146 = atoi (arg);
            collect_before_allocs.474 = (unsigned int) D.26146;
            collect_before_allocs = collect_before_allocs.474;
          }
          goto <D.26148>;
          <D.26144>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26152 = "verify-before-collections";
              D.26153 = MEM[(const unsigned char *)D.26152];
              D.26154 = (int) D.26153;
              D.26155 = *__s2;
              D.26156 = (int) D.26155;
              __result = D.26154 - D.26156;
              {
                if (__s2_len != 0) goto <D.26157>; else goto <D.26158>;
                <D.26157>:
                if (__result == 0) goto <D.26159>; else goto <D.26160>;
                <D.26159>:
                D.26161 = &MEM[(void *)"verify-before-collections" + 1B];
                D.26162 = *D.26161;
                D.26163 = (int) D.26162;
                D.26164 = __s2 + 1;
                D.26165 = *D.26164;
                D.26166 = (int) D.26165;
                __result = D.26163 - D.26166;
                if (__s2_len > 1) goto <D.26167>; else goto <D.26168>;
                <D.26167>:
                if (__result == 0) goto <D.26169>; else goto <D.26170>;
                <D.26169>:
                D.26171 = &MEM[(void *)"verify-before-collections" + 2B];
                D.26172 = *D.26171;
                D.26173 = (int) D.26172;
                D.26174 = __s2 + 2;
                D.26175 = *D.26174;
                D.26176 = (int) D.26175;
                __result = D.26173 - D.26176;
                if (__s2_len > 2) goto <D.26177>; else goto <D.26178>;
                <D.26177>:
                if (__result == 0) goto <D.26179>; else goto <D.26180>;
                <D.26179>:
                D.26181 = &MEM[(void *)"verify-before-collections" + 3B];
                D.26182 = *D.26181;
                D.26183 = (int) D.26182;
                D.26184 = __s2 + 3;
                D.26185 = *D.26184;
                D.26186 = (int) D.26185;
                __result = D.26183 - D.26186;
                <D.26180>:
                <D.26178>:
                <D.26170>:
                <D.26168>:
                <D.26160>:
                <D.26158>:
              }
              D.21427 = __result;
            }
            iftmp.475 = -D.21427;
            goto <D.26187>;
            <D.26151>:
            iftmp.475 = __builtin_strcmp (opt, "verify-before-collections");
            <D.26187>:
            D.21428 = iftmp.475;
          }
          if (D.21428 == 0) goto <D.26188>; else goto <D.26189>;
          <D.26188>:
          whole_heap_check_before_collection = 1;
          goto <D.26190>;
          <D.26189>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26194 = "check-at-minor-collections";
              D.26195 = MEM[(const unsigned char *)D.26194];
              D.26196 = (int) D.26195;
              D.26197 = *__s2;
              D.26198 = (int) D.26197;
              __result = D.26196 - D.26198;
              {
                if (__s2_len != 0) goto <D.26199>; else goto <D.26200>;
                <D.26199>:
                if (__result == 0) goto <D.26201>; else goto <D.26202>;
                <D.26201>:
                D.26203 = &MEM[(void *)"check-at-minor-collections" + 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;
                if (__s2_len > 1) goto <D.26209>; else goto <D.26210>;
                <D.26209>:
                if (__result == 0) goto <D.26211>; else goto <D.26212>;
                <D.26211>:
                D.26213 = &MEM[(void *)"check-at-minor-collections" + 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;
                if (__s2_len > 2) goto <D.26219>; else goto <D.26220>;
                <D.26219>:
                if (__result == 0) goto <D.26221>; else goto <D.26222>;
                <D.26221>:
                D.26223 = &MEM[(void *)"check-at-minor-collections" + 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.26220>:
                <D.26212>:
                <D.26210>:
                <D.26202>:
                <D.26200>:
              }
              D.21436 = __result;
            }
            iftmp.476 = -D.21436;
            goto <D.26229>;
            <D.26193>:
            iftmp.476 = __builtin_strcmp (opt, "check-at-minor-collections");
            <D.26229>:
            D.21437 = iftmp.476;
          }
          if (D.21437 == 0) goto <D.26230>; else goto <D.26231>;
          <D.26230>:
          consistency_check_at_minor_collection = 1;
          nursery_clear_policy = 0;
          goto <D.26232>;
          <D.26231>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26236 = "mod-union-consistency-check";
              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;
              {
                if (__s2_len != 0) goto <D.26241>; else goto <D.26242>;
                <D.26241>:
                if (__result == 0) goto <D.26243>; else goto <D.26244>;
                <D.26243>:
                D.26245 = &MEM[(void *)"mod-union-consistency-check" + 1B];
                D.26246 = *D.26245;
                D.26247 = (int) D.26246;
                D.26248 = __s2 + 1;
                D.26249 = *D.26248;
                D.26250 = (int) D.26249;
                __result = D.26247 - D.26250;
                if (__s2_len > 1) goto <D.26251>; else goto <D.26252>;
                <D.26251>:
                if (__result == 0) goto <D.26253>; else goto <D.26254>;
                <D.26253>:
                D.26255 = &MEM[(void *)"mod-union-consistency-check" + 2B];
                D.26256 = *D.26255;
                D.26257 = (int) D.26256;
                D.26258 = __s2 + 2;
                D.26259 = *D.26258;
                D.26260 = (int) D.26259;
                __result = D.26257 - D.26260;
                if (__s2_len > 2) goto <D.26261>; else goto <D.26262>;
                <D.26261>:
                if (__result == 0) goto <D.26263>; else goto <D.26264>;
                <D.26263>:
                D.26265 = &MEM[(void *)"mod-union-consistency-check" + 3B];
                D.26266 = *D.26265;
                D.26267 = (int) D.26266;
                D.26268 = __s2 + 3;
                D.26269 = *D.26268;
                D.26270 = (int) D.26269;
                __result = D.26267 - D.26270;
                <D.26264>:
                <D.26262>:
                <D.26254>:
                <D.26252>:
                <D.26244>:
                <D.26242>:
              }
              D.21445 = __result;
            }
            iftmp.477 = -D.21445;
            goto <D.26271>;
            <D.26235>:
            iftmp.477 = __builtin_strcmp (opt, "mod-union-consistency-check");
            <D.26271>:
            D.21446 = iftmp.477;
          }
          if (D.21446 == 0) goto <D.26272>; else goto <D.26273>;
          <D.26272>:
          D.25716 = major_collector.is_concurrent;
          if (D.25716 == 0) goto <D.26274>; else goto <D.26275>;
          <D.26274>:
          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.21380>;
          <D.26275>:
          mod_union_consistency_check = 1;
          goto <D.26276>;
          <D.26273>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26280 = "check-mark-bits";
              D.26281 = MEM[(const unsigned char *)D.26280];
              D.26282 = (int) D.26281;
              D.26283 = *__s2;
              D.26284 = (int) D.26283;
              __result = D.26282 - D.26284;
              {
                if (__s2_len != 0) goto <D.26285>; else goto <D.26286>;
                <D.26285>:
                if (__result == 0) goto <D.26287>; else goto <D.26288>;
                <D.26287>:
                D.26289 = &MEM[(void *)"check-mark-bits" + 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;
                if (__s2_len > 1) goto <D.26295>; else goto <D.26296>;
                <D.26295>:
                if (__result == 0) goto <D.26297>; else goto <D.26298>;
                <D.26297>:
                D.26299 = &MEM[(void *)"check-mark-bits" + 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;
                if (__s2_len > 2) goto <D.26305>; else goto <D.26306>;
                <D.26305>:
                if (__result == 0) goto <D.26307>; else goto <D.26308>;
                <D.26307>:
                D.26309 = &MEM[(void *)"check-mark-bits" + 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.26306>:
                <D.26298>:
                <D.26296>:
                <D.26288>:
                <D.26286>:
              }
              D.21454 = __result;
            }
            iftmp.478 = -D.21454;
            goto <D.26315>;
            <D.26279>:
            iftmp.478 = __builtin_strcmp (opt, "check-mark-bits");
            <D.26315>:
            D.21455 = iftmp.478;
          }
          if (D.21455 == 0) goto <D.26316>; else goto <D.26317>;
          <D.26316>:
          check_mark_bits_after_major_collection = 1;
          goto <D.26318>;
          <D.26317>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26322 = "check-nursery-pinned";
              D.26323 = MEM[(const unsigned char *)D.26322];
              D.26324 = (int) D.26323;
              D.26325 = *__s2;
              D.26326 = (int) D.26325;
              __result = D.26324 - D.26326;
              {
                if (__s2_len != 0) goto <D.26327>; else goto <D.26328>;
                <D.26327>:
                if (__result == 0) goto <D.26329>; else goto <D.26330>;
                <D.26329>:
                D.26331 = &MEM[(void *)"check-nursery-pinned" + 1B];
                D.26332 = *D.26331;
                D.26333 = (int) D.26332;
                D.26334 = __s2 + 1;
                D.26335 = *D.26334;
                D.26336 = (int) D.26335;
                __result = D.26333 - D.26336;
                if (__s2_len > 1) goto <D.26337>; else goto <D.26338>;
                <D.26337>:
                if (__result == 0) goto <D.26339>; else goto <D.26340>;
                <D.26339>:
                D.26341 = &MEM[(void *)"check-nursery-pinned" + 2B];
                D.26342 = *D.26341;
                D.26343 = (int) D.26342;
                D.26344 = __s2 + 2;
                D.26345 = *D.26344;
                D.26346 = (int) D.26345;
                __result = D.26343 - D.26346;
                if (__s2_len > 2) goto <D.26347>; else goto <D.26348>;
                <D.26347>:
                if (__result == 0) goto <D.26349>; else goto <D.26350>;
                <D.26349>:
                D.26351 = &MEM[(void *)"check-nursery-pinned" + 3B];
                D.26352 = *D.26351;
                D.26353 = (int) D.26352;
                D.26354 = __s2 + 3;
                D.26355 = *D.26354;
                D.26356 = (int) D.26355;
                __result = D.26353 - D.26356;
                <D.26350>:
                <D.26348>:
                <D.26340>:
                <D.26338>:
                <D.26330>:
                <D.26328>:
              }
              D.21463 = __result;
            }
            iftmp.479 = -D.21463;
            goto <D.26357>;
            <D.26321>:
            iftmp.479 = __builtin_strcmp (opt, "check-nursery-pinned");
            <D.26357>:
            D.21464 = iftmp.479;
          }
          if (D.21464 == 0) goto <D.26358>; else goto <D.26359>;
          <D.26358>:
          check_nursery_objects_pinned = 1;
          goto <D.26360>;
          <D.26359>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26364 = "xdomain-checks";
              D.26365 = MEM[(const unsigned char *)D.26364];
              D.26366 = (int) D.26365;
              D.26367 = *__s2;
              D.26368 = (int) D.26367;
              __result = D.26366 - D.26368;
              {
                if (__s2_len != 0) goto <D.26369>; else goto <D.26370>;
                <D.26369>:
                if (__result == 0) goto <D.26371>; else goto <D.26372>;
                <D.26371>:
                D.26373 = &MEM[(void *)"xdomain-checks" + 1B];
                D.26374 = *D.26373;
                D.26375 = (int) D.26374;
                D.26376 = __s2 + 1;
                D.26377 = *D.26376;
                D.26378 = (int) D.26377;
                __result = D.26375 - D.26378;
                if (__s2_len > 1) goto <D.26379>; else goto <D.26380>;
                <D.26379>:
                if (__result == 0) goto <D.26381>; else goto <D.26382>;
                <D.26381>:
                D.26383 = &MEM[(void *)"xdomain-checks" + 2B];
                D.26384 = *D.26383;
                D.26385 = (int) D.26384;
                D.26386 = __s2 + 2;
                D.26387 = *D.26386;
                D.26388 = (int) D.26387;
                __result = D.26385 - D.26388;
                if (__s2_len > 2) goto <D.26389>; else goto <D.26390>;
                <D.26389>:
                if (__result == 0) goto <D.26391>; else goto <D.26392>;
                <D.26391>:
                D.26393 = &MEM[(void *)"xdomain-checks" + 3B];
                D.26394 = *D.26393;
                D.26395 = (int) D.26394;
                D.26396 = __s2 + 3;
                D.26397 = *D.26396;
                D.26398 = (int) D.26397;
                __result = D.26395 - D.26398;
                <D.26392>:
                <D.26390>:
                <D.26382>:
                <D.26380>:
                <D.26372>:
                <D.26370>:
              }
              D.21472 = __result;
            }
            iftmp.480 = -D.21472;
            goto <D.26399>;
            <D.26363>:
            iftmp.480 = __builtin_strcmp (opt, "xdomain-checks");
            <D.26399>:
            D.21473 = iftmp.480;
          }
          if (D.21473 == 0) goto <D.26400>; else goto <D.26401>;
          <D.26400>:
          xdomain_checks = 1;
          goto <D.26402>;
          <D.26401>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26406 = "clear-at-gc";
              D.26407 = MEM[(const unsigned char *)D.26406];
              D.26408 = (int) D.26407;
              D.26409 = *__s2;
              D.26410 = (int) D.26409;
              __result = D.26408 - D.26410;
              {
                if (__s2_len != 0) goto <D.26411>; else goto <D.26412>;
                <D.26411>:
                if (__result == 0) goto <D.26413>; else goto <D.26414>;
                <D.26413>:
                D.26415 = &MEM[(void *)"clear-at-gc" + 1B];
                D.26416 = *D.26415;
                D.26417 = (int) D.26416;
                D.26418 = __s2 + 1;
                D.26419 = *D.26418;
                D.26420 = (int) D.26419;
                __result = D.26417 - D.26420;
                if (__s2_len > 1) goto <D.26421>; else goto <D.26422>;
                <D.26421>:
                if (__result == 0) goto <D.26423>; else goto <D.26424>;
                <D.26423>:
                D.26425 = &MEM[(void *)"clear-at-gc" + 2B];
                D.26426 = *D.26425;
                D.26427 = (int) D.26426;
                D.26428 = __s2 + 2;
                D.26429 = *D.26428;
                D.26430 = (int) D.26429;
                __result = D.26427 - D.26430;
                if (__s2_len > 2) goto <D.26431>; else goto <D.26432>;
                <D.26431>:
                if (__result == 0) goto <D.26433>; else goto <D.26434>;
                <D.26433>:
                D.26435 = &MEM[(void *)"clear-at-gc" + 3B];
                D.26436 = *D.26435;
                D.26437 = (int) D.26436;
                D.26438 = __s2 + 3;
                D.26439 = *D.26438;
                D.26440 = (int) D.26439;
                __result = D.26437 - D.26440;
                <D.26434>:
                <D.26432>:
                <D.26424>:
                <D.26422>:
                <D.26414>:
                <D.26412>:
              }
              D.21481 = __result;
            }
            iftmp.481 = -D.21481;
            goto <D.26441>;
            <D.26405>:
            iftmp.481 = __builtin_strcmp (opt, "clear-at-gc");
            <D.26441>:
            D.21482 = iftmp.481;
          }
          if (D.21482 == 0) goto <D.26442>; else goto <D.26443>;
          <D.26442>:
          nursery_clear_policy = 0;
          goto <D.26444>;
          <D.26443>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

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

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

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

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

              __s2 = opt;
              D.26532 = "verify-nursery-at-minor-gc";
              D.26533 = MEM[(const unsigned char *)D.26532];
              D.26534 = (int) D.26533;
              D.26535 = *__s2;
              D.26536 = (int) D.26535;
              __result = D.26534 - D.26536;
              {
                if (__s2_len != 0) goto <D.26537>; else goto <D.26538>;
                <D.26537>:
                if (__result == 0) goto <D.26539>; else goto <D.26540>;
                <D.26539>:
                D.26541 = &MEM[(void *)"verify-nursery-at-minor-gc" + 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;
                if (__s2_len > 1) goto <D.26547>; else goto <D.26548>;
                <D.26547>:
                if (__result == 0) goto <D.26549>; else goto <D.26550>;
                <D.26549>:
                D.26551 = &MEM[(void *)"verify-nursery-at-minor-gc" + 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;
                if (__s2_len > 2) goto <D.26557>; else goto <D.26558>;
                <D.26557>:
                if (__result == 0) goto <D.26559>; else goto <D.26560>;
                <D.26559>:
                D.26561 = &MEM[(void *)"verify-nursery-at-minor-gc" + 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.26558>:
                <D.26550>:
                <D.26548>:
                <D.26540>:
                <D.26538>:
              }
              D.21508 = __result;
            }
            iftmp.484 = -D.21508;
            goto <D.26567>;
            <D.26531>:
            iftmp.484 = __builtin_strcmp (opt, "verify-nursery-at-minor-gc");
            <D.26567>:
            D.21509 = iftmp.484;
          }
          if (D.21509 == 0) goto <D.26568>; else goto <D.26569>;
          <D.26568>:
          do_verify_nursery = 1;
          goto <D.26570>;
          <D.26569>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26574 = "check-concurrent";
              D.26575 = MEM[(const unsigned char *)D.26574];
              D.26576 = (int) D.26575;
              D.26577 = *__s2;
              D.26578 = (int) D.26577;
              __result = D.26576 - D.26578;
              {
                if (__s2_len != 0) goto <D.26579>; else goto <D.26580>;
                <D.26579>:
                if (__result == 0) goto <D.26581>; else goto <D.26582>;
                <D.26581>:
                D.26583 = &MEM[(void *)"check-concurrent" + 1B];
                D.26584 = *D.26583;
                D.26585 = (int) D.26584;
                D.26586 = __s2 + 1;
                D.26587 = *D.26586;
                D.26588 = (int) D.26587;
                __result = D.26585 - D.26588;
                if (__s2_len > 1) goto <D.26589>; else goto <D.26590>;
                <D.26589>:
                if (__result == 0) goto <D.26591>; else goto <D.26592>;
                <D.26591>:
                D.26593 = &MEM[(void *)"check-concurrent" + 2B];
                D.26594 = *D.26593;
                D.26595 = (int) D.26594;
                D.26596 = __s2 + 2;
                D.26597 = *D.26596;
                D.26598 = (int) D.26597;
                __result = D.26595 - D.26598;
                if (__s2_len > 2) goto <D.26599>; else goto <D.26600>;
                <D.26599>:
                if (__result == 0) goto <D.26601>; else goto <D.26602>;
                <D.26601>:
                D.26603 = &MEM[(void *)"check-concurrent" + 3B];
                D.26604 = *D.26603;
                D.26605 = (int) D.26604;
                D.26606 = __s2 + 3;
                D.26607 = *D.26606;
                D.26608 = (int) D.26607;
                __result = D.26605 - D.26608;
                <D.26602>:
                <D.26600>:
                <D.26592>:
                <D.26590>:
                <D.26582>:
                <D.26580>:
              }
              D.21517 = __result;
            }
            iftmp.485 = -D.21517;
            goto <D.26609>;
            <D.26573>:
            iftmp.485 = __builtin_strcmp (opt, "check-concurrent");
            <D.26609>:
            D.21518 = iftmp.485;
          }
          if (D.21518 == 0) goto <D.26610>; else goto <D.26611>;
          <D.26610>:
          D.25716 = major_collector.is_concurrent;
          if (D.25716 == 0) goto <D.26612>; else goto <D.26613>;
          <D.26612>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "`check-concurrent` only works with concurrent major collectors.");
          // predicted unlikely by continue predictor.
          goto <D.21380>;
          <D.26613>:
          do_concurrent_checks = 1;
          goto <D.26614>;
          <D.26611>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26618 = "dump-nursery-at-minor-gc";
              D.26619 = MEM[(const unsigned char *)D.26618];
              D.26620 = (int) D.26619;
              D.26621 = *__s2;
              D.26622 = (int) D.26621;
              __result = D.26620 - D.26622;
              {
                if (__s2_len != 0) goto <D.26623>; else goto <D.26624>;
                <D.26623>:
                if (__result == 0) goto <D.26625>; else goto <D.26626>;
                <D.26625>:
                D.26627 = &MEM[(void *)"dump-nursery-at-minor-gc" + 1B];
                D.26628 = *D.26627;
                D.26629 = (int) D.26628;
                D.26630 = __s2 + 1;
                D.26631 = *D.26630;
                D.26632 = (int) D.26631;
                __result = D.26629 - D.26632;
                if (__s2_len > 1) goto <D.26633>; else goto <D.26634>;
                <D.26633>:
                if (__result == 0) goto <D.26635>; else goto <D.26636>;
                <D.26635>:
                D.26637 = &MEM[(void *)"dump-nursery-at-minor-gc" + 2B];
                D.26638 = *D.26637;
                D.26639 = (int) D.26638;
                D.26640 = __s2 + 2;
                D.26641 = *D.26640;
                D.26642 = (int) D.26641;
                __result = D.26639 - D.26642;
                if (__s2_len > 2) goto <D.26643>; else goto <D.26644>;
                <D.26643>:
                if (__result == 0) goto <D.26645>; else goto <D.26646>;
                <D.26645>:
                D.26647 = &MEM[(void *)"dump-nursery-at-minor-gc" + 3B];
                D.26648 = *D.26647;
                D.26649 = (int) D.26648;
                D.26650 = __s2 + 3;
                D.26651 = *D.26650;
                D.26652 = (int) D.26651;
                __result = D.26649 - D.26652;
                <D.26646>:
                <D.26644>:
                <D.26636>:
                <D.26634>:
                <D.26626>:
                <D.26624>:
              }
              D.21526 = __result;
            }
            iftmp.486 = -D.21526;
            goto <D.26653>;
            <D.26617>:
            iftmp.486 = __builtin_strcmp (opt, "dump-nursery-at-minor-gc");
            <D.26653>:
            D.21527 = iftmp.486;
          }
          if (D.21527 == 0) goto <D.26654>; else goto <D.26655>;
          <D.26654>:
          do_dump_nursery_content = 1;
          goto <D.26656>;
          <D.26655>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26660 = "no-managed-allocator";
              D.26661 = MEM[(const unsigned char *)D.26660];
              D.26662 = (int) D.26661;
              D.26663 = *__s2;
              D.26664 = (int) D.26663;
              __result = D.26662 - D.26664;
              {
                if (__s2_len != 0) goto <D.26665>; else goto <D.26666>;
                <D.26665>:
                if (__result == 0) goto <D.26667>; else goto <D.26668>;
                <D.26667>:
                D.26669 = &MEM[(void *)"no-managed-allocator" + 1B];
                D.26670 = *D.26669;
                D.26671 = (int) D.26670;
                D.26672 = __s2 + 1;
                D.26673 = *D.26672;
                D.26674 = (int) D.26673;
                __result = D.26671 - D.26674;
                if (__s2_len > 1) goto <D.26675>; else goto <D.26676>;
                <D.26675>:
                if (__result == 0) goto <D.26677>; else goto <D.26678>;
                <D.26677>:
                D.26679 = &MEM[(void *)"no-managed-allocator" + 2B];
                D.26680 = *D.26679;
                D.26681 = (int) D.26680;
                D.26682 = __s2 + 2;
                D.26683 = *D.26682;
                D.26684 = (int) D.26683;
                __result = D.26681 - D.26684;
                if (__s2_len > 2) goto <D.26685>; else goto <D.26686>;
                <D.26685>:
                if (__result == 0) goto <D.26687>; else goto <D.26688>;
                <D.26687>:
                D.26689 = &MEM[(void *)"no-managed-allocator" + 3B];
                D.26690 = *D.26689;
                D.26691 = (int) D.26690;
                D.26692 = __s2 + 3;
                D.26693 = *D.26692;
                D.26694 = (int) D.26693;
                __result = D.26691 - D.26694;
                <D.26688>:
                <D.26686>:
                <D.26678>:
                <D.26676>:
                <D.26668>:
                <D.26666>:
              }
              D.21535 = __result;
            }
            iftmp.487 = -D.21535;
            goto <D.26695>;
            <D.26659>:
            iftmp.487 = __builtin_strcmp (opt, "no-managed-allocator");
            <D.26695>:
            D.21536 = iftmp.487;
          }
          if (D.21536 == 0) goto <D.26696>; else goto <D.26697>;
          <D.26696>:
          sgen_set_use_managed_allocator (0);
          goto <D.26698>;
          <D.26697>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26702 = "disable-minor";
              D.26703 = MEM[(const unsigned char *)D.26702];
              D.26704 = (int) D.26703;
              D.26705 = *__s2;
              D.26706 = (int) D.26705;
              __result = D.26704 - D.26706;
              {
                if (__s2_len != 0) goto <D.26707>; else goto <D.26708>;
                <D.26707>:
                if (__result == 0) goto <D.26709>; else goto <D.26710>;
                <D.26709>:
                D.26711 = &MEM[(void *)"disable-minor" + 1B];
                D.26712 = *D.26711;
                D.26713 = (int) D.26712;
                D.26714 = __s2 + 1;
                D.26715 = *D.26714;
                D.26716 = (int) D.26715;
                __result = D.26713 - D.26716;
                if (__s2_len > 1) goto <D.26717>; else goto <D.26718>;
                <D.26717>:
                if (__result == 0) goto <D.26719>; else goto <D.26720>;
                <D.26719>:
                D.26721 = &MEM[(void *)"disable-minor" + 2B];
                D.26722 = *D.26721;
                D.26723 = (int) D.26722;
                D.26724 = __s2 + 2;
                D.26725 = *D.26724;
                D.26726 = (int) D.26725;
                __result = D.26723 - D.26726;
                if (__s2_len > 2) goto <D.26727>; else goto <D.26728>;
                <D.26727>:
                if (__result == 0) goto <D.26729>; else goto <D.26730>;
                <D.26729>:
                D.26731 = &MEM[(void *)"disable-minor" + 3B];
                D.26732 = *D.26731;
                D.26733 = (int) D.26732;
                D.26734 = __s2 + 3;
                D.26735 = *D.26734;
                D.26736 = (int) D.26735;
                __result = D.26733 - D.26736;
                <D.26730>:
                <D.26728>:
                <D.26720>:
                <D.26718>:
                <D.26710>:
                <D.26708>:
              }
              D.21544 = __result;
            }
            iftmp.488 = -D.21544;
            goto <D.26737>;
            <D.26701>:
            iftmp.488 = __builtin_strcmp (opt, "disable-minor");
            <D.26737>:
            D.21545 = iftmp.488;
          }
          if (D.21545 == 0) goto <D.26738>; else goto <D.26739>;
          <D.26738>:
          disable_minor_collections = 1;
          goto <D.26740>;
          <D.26739>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26744 = "disable-major";
              D.26745 = MEM[(const unsigned char *)D.26744];
              D.26746 = (int) D.26745;
              D.26747 = *__s2;
              D.26748 = (int) D.26747;
              __result = D.26746 - D.26748;
              {
                if (__s2_len != 0) goto <D.26749>; else goto <D.26750>;
                <D.26749>:
                if (__result == 0) goto <D.26751>; else goto <D.26752>;
                <D.26751>:
                D.26753 = &MEM[(void *)"disable-major" + 1B];
                D.26754 = *D.26753;
                D.26755 = (int) D.26754;
                D.26756 = __s2 + 1;
                D.26757 = *D.26756;
                D.26758 = (int) D.26757;
                __result = D.26755 - D.26758;
                if (__s2_len > 1) goto <D.26759>; else goto <D.26760>;
                <D.26759>:
                if (__result == 0) goto <D.26761>; else goto <D.26762>;
                <D.26761>:
                D.26763 = &MEM[(void *)"disable-major" + 2B];
                D.26764 = *D.26763;
                D.26765 = (int) D.26764;
                D.26766 = __s2 + 2;
                D.26767 = *D.26766;
                D.26768 = (int) D.26767;
                __result = D.26765 - D.26768;
                if (__s2_len > 2) goto <D.26769>; else goto <D.26770>;
                <D.26769>:
                if (__result == 0) goto <D.26771>; else goto <D.26772>;
                <D.26771>:
                D.26773 = &MEM[(void *)"disable-major" + 3B];
                D.26774 = *D.26773;
                D.26775 = (int) D.26774;
                D.26776 = __s2 + 3;
                D.26777 = *D.26776;
                D.26778 = (int) D.26777;
                __result = D.26775 - D.26778;
                <D.26772>:
                <D.26770>:
                <D.26762>:
                <D.26760>:
                <D.26752>:
                <D.26750>:
              }
              D.21553 = __result;
            }
            iftmp.489 = -D.21553;
            goto <D.26779>;
            <D.26743>:
            iftmp.489 = __builtin_strcmp (opt, "disable-major");
            <D.26779>:
            D.21554 = iftmp.489;
          }
          if (D.21554 == 0) goto <D.26780>; else goto <D.26781>;
          <D.26780>:
          disable_major_collections = 1;
          goto <D.26782>;
          <D.26781>:
          D.26783 = monoeg_g_str_has_prefix (opt, "heap-dump=");
          if (D.26783 != 0) goto <D.26784>; else goto <D.26785>;
          <D.26784>:
          {
            char * filename;

            D.26786 = __builtin_strchr (opt, 61);
            filename = D.26786 + 1;
            nursery_clear_policy = 0;
            heap_dump_file.490 = fopen (filename, "w");
            heap_dump_file = heap_dump_file.490;
            heap_dump_file.491 = heap_dump_file;
            if (heap_dump_file.491 != 0B) goto <D.26789>; else goto <D.26790>;
            <D.26789>:
            heap_dump_file.491 = heap_dump_file;
            fprintf (heap_dump_file.491, "<sgen-dump>\n");
            do_pin_stats = 1;
            <D.26790>:
          }
          goto <D.26791>;
          <D.26785>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.26792>; else goto <D.26793>;
          <D.26792>:
          // predicted unlikely by continue predictor.
          goto <D.21380>;
          <D.26793>:
          stderr.440 = stderr;
          fprintf (stderr.440, "\n%s must be of the format [<l>[:<filename>]|<option>]+ where <l> is a debug level 0-9.\n", "MONO_GC_DEBUG");
          stderr.440 = stderr;
          fprintf (stderr.440, "Valid <option>s are:\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  collect-before-allocs[=<n>]\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  verify-before-allocs[=<n>]\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  check-at-minor-collections\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  check-mark-bits\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  check-nursery-pinned\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  verify-before-collections\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  verify-nursery-at-minor-gc\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  dump-nursery-at-minor-gc\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  disable-minor\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  disable-major\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  xdomain-checks\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  check-concurrent\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  clear-at-gc\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  clear-nursery-at-gc\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  check-scan-starts\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  no-managed-allocator\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  print-allowance\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  print-pinning\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "  heap-dump=<filename>\n");
          stderr.440 = stderr;
          fprintf (stderr.440, "\n");
          usage_printed = 1;
          <D.26791>:
          <D.26782>:
          <D.26740>:
          <D.26698>:
          <D.26656>:
          <D.26614>:
          <D.26570>:
          <D.26528>:
          <D.26486>:
          <D.26444>:
          <D.26402>:
          <D.26360>:
          <D.26318>:
          <D.26276>:
          <D.26232>:
          <D.26190>:
          <D.26148>:
          <D.26141>:
          <D.26099>:
          <D.26092>:
          <D.26050>:
          <D.26008>:
          <D.25966>:
        }
        <D.21380>:
        ptr = ptr + 4;
        <D.21557>:
        if (ptr != 0B) goto <D.26794>; else goto <D.21558>;
        <D.26794>:
        D.25169 = *ptr;
        if (D.25169 != 0B) goto <D.21556>; else goto <D.21558>;
        <D.21558>:
        monoeg_g_strfreev (opts);
      }
      <D.25920>:
      D.25475 = major_collector.is_parallel;
      if (D.25475 != 0) goto <D.26795>; else goto <D.26796>;
      <D.26795>:
      heap_dump_file.491 = heap_dump_file;
      if (heap_dump_file.491 != 0B) goto <D.26797>; else goto <D.26798>;
      <D.26797>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "Cannot do `heap-dump` with the parallel collector.");
      heap_dump_file.491 = heap_dump_file;
      fclose (heap_dump_file.491);
      heap_dump_file = 0B;
      <D.26798>:
      do_pin_stats.492 = do_pin_stats;
      if (do_pin_stats.492 != 0) goto <D.26800>; else goto <D.26801>;
      <D.26800>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "`print-pinning` is not supported with the parallel collector.");
      do_pin_stats = 0;
      <D.26801>:
      <D.26796>:
      D.26802 = major_collector.post_param_init;
      if (D.26802 != 0B) goto <D.26803>; else goto <D.26804>;
      <D.26803>:
      D.26802 = major_collector.post_param_init;
      D.26802 (&major_collector);
      <D.26804>:
      soft_limit.451 = soft_limit;
      sgen_memgov_init (max_heap, soft_limit.451, debug_print_allowance, allowance_ratio, save_target);
      memset (&remset, 0, 48);
      sgen_card_table_init (&remset);
      gc_initialized = 1;
    }
  finally
    {
      cb = {CLOBBER};
      soft_limit = {CLOBBER};
      dummy = {CLOBBER};
    }
}


is_critical_method (struct MonoMethod * method)
{
  gboolean D.26815;
  int iftmp.493;
  int D.26820;
  int D.26822;

  D.26820 = mono_runtime_is_critical_method (method);
  if (D.26820 != 0) goto <D.26817>; else goto <D.26821>;
  <D.26821>:
  D.26822 = sgen_is_critical_method (method);
  if (D.26822 != 0) goto <D.26817>; else goto <D.26818>;
  <D.26817>:
  iftmp.493 = 1;
  goto <D.26819>;
  <D.26818>:
  iftmp.493 = 0;
  <D.26819>:
  D.26815 = iftmp.493;
  return D.26815;
}


sgen_thread_attach (struct SgenThreadInfo * info)
{
  void * (*<T29fc>) (void) D.26824;
  void * D.26827;
  void * D.26830;

  pthread_mutex_lock (&gc_mutex);
  init_stats ();
  sgen_gc_unlock ();
  D.26824 = gc_callbacks.thread_attach_func;
  if (D.26824 != 0B) goto <D.26825>; else goto <D.26826>;
  <D.26825>:
  D.26827 = info->runtime_data;
  if (D.26827 == 0B) goto <D.26828>; else goto <D.26829>;
  <D.26828>:
  D.26824 = gc_callbacks.thread_attach_func;
  D.26830 = D.26824 ();
  info->runtime_data = D.26830;
  <D.26829>:
  <D.26826>:
}


sgen_thread_unregister (struct SgenThreadInfo * p)
{
  struct FILE * gc_debug_file.494;
  unsigned int D.26834;
  void * D.26835;
  void (*<T1113>) (void *) D.26836;
  void * D.26839;

  if (0 != 0) goto <D.26831>; else goto <D.26832>;
  <D.26831>:
  gc_debug_file.494 = gc_debug_file;
  D.26834 = MEM[(struct MonoThreadInfo *)p].node.key;
  D.26835 = (void *) D.26834;
  fprintf (gc_debug_file.494, "unregister thread %p (%p)\n", p, D.26835);
  gc_debug_file.494 = gc_debug_file;
  fflush (gc_debug_file.494);
  <D.26832>:
  D.26836 = gc_callbacks.thread_detach_func;
  if (D.26836 != 0B) goto <D.26837>; else goto <D.26838>;
  <D.26837>:
  D.26836 = gc_callbacks.thread_detach_func;
  D.26839 = p->runtime_data;
  D.26836 (D.26839);
  p->runtime_data = 0B;
  <D.26838>:
}


sgen_thread_detach (struct SgenThreadInfo * p)
{
  struct MonoDomain * D.26840;
  struct MonoThread * D.26843;

  D.26840 = mono_domain_get ();
  if (D.26840 != 0B) goto <D.26841>; else goto <D.26842>;
  <D.26841>:
  D.26843 = mono_thread_current ();
  mono_thread_detach (D.26843);
  <D.26842>:
}


sgen_thread_register (struct SgenThreadInfo * info, void * addr)
{
  struct MonoContext * D.26844;
  long unsigned int D.26845;
  void * sstart.495;
  unsigned int size.496;
  void * D.26848;
  void * stack_end.497;
  struct FILE * gc_debug_file.498;
  unsigned int D.26853;
  void * D.26854;
  void * (*<T29fc>) (void) D.26855;
  void * D.26858;
  void * D.26859;

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

    try
      {
        D.26845 = pthread_self ();
        pthread_getattr_np (D.26845, &attr);
        pthread_attr_getstack (&attr, &sstart, &size);
        sstart.495 = sstart;
        info->stack_start_limit = sstart.495;
        sstart.495 = sstart;
        size.496 = size;
        D.26848 = sstart.495 + size.496;
        info->stack_end = D.26848;
        pthread_attr_destroy (&attr);
      }
    finally
      {
        size = {CLOBBER};
        sstart = {CLOBBER};
        attr = {CLOBBER};
      }
  }
  stack_end.497 = info->stack_end;
  stack_end = stack_end.497;
  if (0 != 0) goto <D.26850>; else goto <D.26851>;
  <D.26850>:
  gc_debug_file.498 = gc_debug_file;
  D.26853 = MEM[(struct MonoThreadInfo *)info].node.key;
  D.26854 = (void *) D.26853;
  stack_end.497 = info->stack_end;
  fprintf (gc_debug_file.498, "registered thread %p (%p) stack end %p\n", info, D.26854, stack_end.497);
  gc_debug_file.498 = gc_debug_file;
  fflush (gc_debug_file.498);
  <D.26851>:
  D.26855 = gc_callbacks.thread_attach_func;
  if (D.26855 != 0B) goto <D.26856>; else goto <D.26857>;
  <D.26856>:
  D.26855 = gc_callbacks.thread_attach_func;
  D.26858 = D.26855 ();
  info->runtime_data = D.26858;
  <D.26857>:
  D.26859 = info;
  return D.26859;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.26861;
  unsigned int comp.499;
  unsigned int exch.500;
  unsigned int D.26864;

  comp.499 = (unsigned int) comp;
  exch.500 = (unsigned int) exch;
  D.26864 = __sync_val_compare_and_swap_4 (dest, comp.499, exch.500);
  D.26861 = (gint32) D.26864;
  return D.26861;
}


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.26866;
  void (*<Tc3>) (void *) destructor.501;
  int D.26868;
  _Bool D.26869;

  destructor.501 = (void (*<Tc3>) (void *)) destructor;
  D.26868 = pthread_key_create (key, destructor.501);
  D.26869 = D.26868 == 0;
  D.26866 = (int) D.26869;
  return D.26866;
}


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

  inited.502 = inited;
  if (inited.502 != 0) goto <D.26872>; else goto <D.26873>;
  <D.26872>:
  return;
  <D.26873>:
  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.26877;

  if (str != 0B) goto <D.26875>; else goto <D.26876>;
  <D.26875>:
  D.26877 = __strdup (str);
  return D.26877;
  <D.26876>:
  D.26877 = 0B;
  return D.26877;
}


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

  try
    {
      val = strtod (opt, &endptr);
      endptr.503 = endptr;
      if (endptr.503 == opt) goto <D.26880>; else goto <D.26881>;
      <D.26880>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be a number.", opt_name);
      D.26882 = 0;
      return D.26882;
      <D.26881>:
      if (val < min) goto <D.26883>; else goto <D.26885>;
      <D.26885>:
      if (val > max) goto <D.26883>; else goto <D.26884>;
      <D.26883>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be between %.2f - %.2f.", opt_name, min, max);
      D.26882 = 0;
      return D.26882;
      <D.26884>:
      *result = val;
      D.26882 = 1;
      return D.26882;
    }
  finally
    {
      endptr = {CLOBBER};
    }
}


alloc_nursery ()
{
  struct GCMemSection * nursery_section.504;
  int gc_debug_level.505;
  _Bool D.26892;
  long int D.26893;
  long int D.26894;
  struct FILE * gc_debug_file.506;
  int sgen_nursery_size.507;
  long unsigned int sgen_nursery_size.508;
  unsigned int alloc_size.509;
  int D.26901;
  _Bool D.26902;
  long int D.26903;
  long int D.26904;
  void * (*<T2c2b>) (mword, mword, int) D.26907;
  int sgen_nursery_bits.510;
  unsigned int data.511;
  sizetype sgen_nursery_size.512;
  char * D.26911;
  unsigned int D.26912;
  sizetype alloc_size.513;
  char * D.26916;
  long long int D.26917;
  long unsigned int D.26918;
  char * D.26919;
  int D.26920;
  unsigned int scan_starts.514;
  unsigned int D.26922;
  void * D.26923;
  struct GCMemSection * section;
  char * data;
  int scan_starts;
  int alloc_size;

  nursery_section.504 = nursery_section;
  if (nursery_section.504 != 0B) goto <D.26889>; else goto <D.26890>;
  <D.26889>:
  return;
  <D.26890>:
  gc_debug_level.505 = gc_debug_level;
  D.26892 = gc_debug_level.505 > 1;
  D.26893 = (long int) D.26892;
  D.26894 = __builtin_expect (D.26893, 0);
  if (D.26894 != 0) goto <D.26895>; else goto <D.26896>;
  <D.26895>:
  gc_debug_file.506 = gc_debug_file;
  sgen_nursery_size.507 = sgen_nursery_size;
  sgen_nursery_size.508 = (long unsigned int) sgen_nursery_size.507;
  fprintf (gc_debug_file.506, "Allocating nursery size: %lu\n", sgen_nursery_size.508);
  gc_debug_file.506 = gc_debug_file;
  fflush (gc_debug_file.506);
  <D.26896>:
  section = sgen_alloc_internal (2);
  alloc_size = sgen_nursery_size;
  alloc_size.509 = (unsigned int) alloc_size;
  D.26901 = sgen_memgov_try_alloc_space (alloc_size.509, 0);
  D.26902 = D.26901 == 0;
  D.26903 = (long int) D.26902;
  D.26904 = __builtin_expect (D.26903, 0);
  if (D.26904 != 0) goto <D.26905>; else goto <D.26906>;
  <D.26905>:
  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.26906>:
  D.26907 = major_collector.alloc_heap;
  alloc_size.509 = (unsigned int) alloc_size;
  alloc_size.509 = (unsigned int) alloc_size;
  sgen_nursery_bits.510 = sgen_nursery_bits;
  data = D.26907 (alloc_size.509, alloc_size.509, sgen_nursery_bits.510);
  data.511 = (unsigned int) data;
  sgen_nursery_size.507 = sgen_nursery_size;
  sgen_nursery_size.512 = (sizetype) sgen_nursery_size.507;
  D.26911 = data + sgen_nursery_size.512;
  D.26912 = (unsigned int) D.26911;
  sgen_update_heap_boundaries (data.511, D.26912);
  if (0 != 0) goto <D.26913>; else goto <D.26914>;
  <D.26913>:
  gc_debug_file.506 = gc_debug_file;
  alloc_size.513 = (sizetype) alloc_size;
  D.26916 = data + alloc_size.513;
  sgen_nursery_size.507 = sgen_nursery_size;
  sgen_nursery_size.508 = (long unsigned int) sgen_nursery_size.507;
  D.26917 = mono_gc_get_heap_size ();
  D.26918 = (long unsigned int) D.26917;
  fprintf (gc_debug_file.506, "Expanding nursery size (%p-%p): %lu, total: %lu\n", data, D.26916, sgen_nursery_size.508, D.26918);
  gc_debug_file.506 = gc_debug_file;
  fflush (gc_debug_file.506);
  <D.26914>:
  section->next_data = data;
  D.26919 = section->next_data;
  section->data = D.26919;
  alloc_size.509 = (unsigned int) alloc_size;
  section->size = alloc_size.509;
  sgen_nursery_size.507 = sgen_nursery_size;
  sgen_nursery_size.512 = (sizetype) sgen_nursery_size.507;
  D.26911 = data + sgen_nursery_size.512;
  section->end_data = D.26911;
  D.26920 = alloc_size + 8191;
  scan_starts = D.26920 / 8192;
  scan_starts.514 = (unsigned int) scan_starts;
  D.26922 = scan_starts.514 * 4;
  D.26923 = sgen_alloc_internal_dynamic (D.26922, 3, 1);
  section->scan_starts = D.26923;
  scan_starts.514 = (unsigned int) scan_starts;
  section->num_scan_start = scan_starts.514;
  nursery_section = section;
  sgen_nursery_size.507 = sgen_nursery_size;
  sgen_nursery_size.512 = (sizetype) sgen_nursery_size.507;
  D.26911 = data + sgen_nursery_size.512;
  sgen_nursery_allocator_set_nursery_bounds (data, D.26911);
}


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

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


mono_gc_get_gc_name ()
{
  const char * D.26927;

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


sgen_is_critical_method (struct MonoMethod * method)
{
  gboolean D.26929;
  int iftmp.515;
  struct MonoMethod * write_barrier_method.516;
  int D.26936;

  write_barrier_method.516 = write_barrier_method;
  if (method == write_barrier_method.516) goto <D.26931>; else goto <D.26935>;
  <D.26935>:
  D.26936 = sgen_is_managed_allocator (method);
  if (D.26936 != 0) goto <D.26931>; else goto <D.26932>;
  <D.26931>:
  iftmp.515 = 1;
  goto <D.26933>;
  <D.26932>:
  iftmp.515 = 0;
  <D.26933>:
  D.26929 = iftmp.515;
  return D.26929;
}


sgen_has_critical_method ()
{
  gboolean D.26938;
  int iftmp.517;
  struct MonoMethod * write_barrier_method.518;
  int D.26945;

  write_barrier_method.518 = write_barrier_method;
  if (write_barrier_method.518 != 0B) goto <D.26940>; else goto <D.26944>;
  <D.26944>:
  D.26945 = sgen_has_managed_allocator ();
  if (D.26945 != 0) goto <D.26940>; else goto <D.26941>;
  <D.26940>:
  iftmp.517 = 1;
  goto <D.26942>;
  <D.26941>:
  iftmp.517 = 0;
  <D.26942>:
  D.26938 = iftmp.517;
  return D.26938;
}


mono_gc_get_write_barrier ()
{
  _Bool D.26947;
  long int D.26948;
  long int D.26949;
  struct MonoMethod * write_barrier_method.519;
  struct MonoMethod * D.26955;
  struct MonoImage * D.26956;
  struct MonoClass * D.26957;
  struct MonoType * D.26958;
  struct MonoClass * D.26959;
  struct MonoType * D.26960;
  struct MonoClass * D.26961;
  guint8 * sgen_cardtable.520;
  int D.26963;
  unsigned int D.26966;
  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;
      stack_end_offset = -1;
      D.26947 = stack_end_offset == -1;
      D.26948 = (long int) D.26947;
      D.26949 = __builtin_expect (D.26948, 0);
      if (D.26949 != 0) goto <D.26950>; else goto <D.26951>;
      <D.26950>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5450, "stack_end_offset != -1");
      <D.26951>:
      write_barrier_method.519 = write_barrier_method;
      if (write_barrier_method.519 != 0B) goto <D.26953>; else goto <D.26954>;
      <D.26953>:
      D.26955 = write_barrier_method;
      return D.26955;
      <D.26954>:
      D.26956 = mono_defaults.corlib;
      sig = mono_metadata_signature_alloc (D.26956, 1);
      D.26957 = mono_defaults.void_class;
      D.26958 = &D.26957->byval_arg;
      sig->ret = D.26958;
      D.26959 = mono_defaults.int_class;
      D.26960 = &D.26959->byval_arg;
      sig->params[0] = D.26960;
      D.26961 = mono_defaults.object_class;
      mb = mono_mb_new (D.26961, "wbarrier", 24);
      emit_nursery_check (mb, &nursery_check_labels);
      sgen_cardtable.520 = sgen_cardtable;
      mono_mb_emit_ptr (mb, sgen_cardtable.520);
      mono_mb_emit_ldarg (mb, 0);
      mono_mb_emit_icon (mb, 9);
      mono_mb_emit_byte (mb, 100);
      mono_mb_emit_byte (mb, 88);
      mono_mb_emit_icon (mb, 1);
      mono_mb_emit_byte (mb, 82);
      i = 0;
      goto <D.21583>;
      <D.21582>:
      D.26963 = nursery_check_labels[i];
      if (D.26963 != 0) goto <D.26964>; else goto <D.26965>;
      <D.26964>:
      D.26963 = nursery_check_labels[i];
      D.26966 = (unsigned int) D.26963;
      mono_mb_patch_branch (mb, D.26966);
      <D.26965>:
      i = i + 1;
      <D.21583>:
      if (i <= 2) goto <D.21582>; else goto <D.21584>;
      <D.21584>:
      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.519 = write_barrier_method;
      if (write_barrier_method.519 != 0B) goto <D.26967>; else goto <D.26968>;
      <D.26967>:
      mono_free_method (res);
      goto <D.26969>;
      <D.26968>:
      mono_memory_barrier ();
      write_barrier_method = res;
      <D.26969>:
      sgen_gc_unlock ();
      D.26955 = write_barrier_method;
      return D.26955;
    }
  finally
    {
      nursery_check_labels = {CLOBBER};
    }
}


emit_nursery_check (struct MonoMethodBuilder * mb, int * nursery_check_return_labels)
{
  int sgen_nursery_bits.521;
  char * D.26973;
  unsigned int D.26974;
  unsigned int D.26975;
  int D.26976;
  unsigned int D.26977;
  int D.26978;
  int D.26979;
  char * D.26982;
  unsigned int D.26983;
  unsigned int D.26984;
  int D.26985;
  int * D.26986;
  unsigned int D.26987;
  int D.26988;

  memset (nursery_check_return_labels, 0, 12);
  mono_mb_emit_ldarg (mb, 0);
  sgen_nursery_bits.521 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.521);
  mono_mb_emit_byte (mb, 100);
  D.26973 = sgen_get_nursery_start ();
  D.26974 = (unsigned int) D.26973;
  sgen_nursery_bits.521 = sgen_nursery_bits;
  D.26975 = D.26974 >> sgen_nursery_bits.521;
  D.26976 = (int) D.26975;
  mono_mb_emit_icon (mb, D.26976);
  D.26977 = mono_mb_emit_branch (mb, 59);
  D.26978 = (int) D.26977;
  *nursery_check_return_labels = D.26978;
  D.26979 = major_collector.is_concurrent;
  if (D.26979 == 0) goto <D.26980>; else goto <D.26981>;
  <D.26980>:
  mono_mb_emit_ldarg (mb, 0);
  mono_mb_emit_byte (mb, 77);
  sgen_nursery_bits.521 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.521);
  mono_mb_emit_byte (mb, 100);
  D.26982 = sgen_get_nursery_start ();
  D.26983 = (unsigned int) D.26982;
  sgen_nursery_bits.521 = sgen_nursery_bits;
  D.26984 = D.26983 >> sgen_nursery_bits.521;
  D.26985 = (int) D.26984;
  mono_mb_emit_icon (mb, D.26985);
  D.26986 = nursery_check_return_labels + 4;
  D.26987 = mono_mb_emit_branch (mb, 64);
  D.26988 = (int) D.26987;
  *D.26986 = D.26988;
  <D.26981>:
}


mono_gc_get_description ()
{
  char * D.26989;

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


mono_gc_set_desktop_mode ()
{

}


mono_gc_is_moving ()
{
  gboolean D.26991;

  D.26991 = 1;
  return D.26991;
}


mono_gc_is_disabled ()
{
  gboolean D.26993;

  D.26993 = 0;
  return D.26993;
}


sgen_get_nursery_clear_policy ()
{
  NurseryClearPolicy D.26995;

  D.26995 = nursery_clear_policy;
  return D.26995;
}


sgen_get_array_fill_vtable ()
{
  struct MonoVTable * array_fill_vtable.522;
  _Bool D.27000;
  long int D.27001;
  long int D.27002;
  struct MonoClass * D.27005;
  void * D.27006;
  struct MonoVTable * D.27007;

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

    try
      {
        domain = mono_get_root_domain ();
        D.27000 = domain == 0B;
        D.27001 = (long int) D.27000;
        D.27002 = __builtin_expect (D.27001, 0);
        if (D.27002 != 0) goto <D.27003>; else goto <D.27004>;
        <D.27003>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5574, "domain");
        <D.27004>:
        D.27005 = mono_defaults.byte_class;
        klass.element_class = D.27005;
        klass.rank = 1;
        klass.instance_size = 16;
        klass.sizes.element_size = 1;
        klass.name = "array_filler_type";
        vtable.klass = &klass;
        bmap = 0;
        D.27006 = mono_gc_make_descr_for_array (1, &bmap, 0, 1);
        vtable.gc_descr = D.27006;
        vtable.rank = 1;
        array_fill_vtable = &vtable;
      }
    finally
      {
        bmap = {CLOBBER};
      }
  }
  <D.26999>:
  D.27007 = array_fill_vtable;
  return D.27007;
}


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


sgen_major_collector_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  void (*<T2c53>) (void (*sgen_cardtable_block_callback) (mword, mword)) D.27011;

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


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

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


sgen_get_major_collector ()
{
  struct SgenMajorCollector * D.27013;

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


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

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


mono_gc_get_vtable_bits (struct MonoClass * class)
{
  int D.27017;
  int D.27020;
  guint D.27023;

  D.27017 = sgen_need_bridge_processing ();
  if (D.27017 != 0) goto <D.27018>; else goto <D.27019>;
  <D.27018>:
  D.27020 = sgen_is_bridge_class (class);
  if (D.27020 != 0) goto <D.27021>; else goto <D.27022>;
  <D.27021>:
  D.27023 = 1;
  return D.27023;
  <D.27022>:
  <D.27019>:
  D.27023 = 0;
  return D.27023;
}


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

  moved_objects_idx.523 = moved_objects_idx;
  if (moved_objects_idx.523 != 0) goto <D.27026>; else goto <D.27027>;
  <D.27026>:
  moved_objects_idx.523 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.523);
  moved_objects_idx = 0;
  <D.27027>:
}


