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

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


safe_name (void * obj)
{
  unsigned int D.21668;
  unsigned int D.21669;
  const char * D.21670;
  struct MonoClass * D.21671;
  struct MonoVTable * vt;

  D.21668 = MEM[(mword *)obj];
  D.21669 = D.21668 & 4294967292;
  vt = (struct MonoVTable *) D.21669;
  D.21671 = vt->klass;
  D.21670 = D.21671->name;
  return D.21670;
}


sgen_scan_area_with_callback (char * start, char * end, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data, gboolean allow_flags)
{
  void * D.21673;
  char * iftmp.0;
  unsigned int D.21679;
  unsigned int D.21680;
  unsigned int D.21683;
  unsigned int D.21688;
  unsigned int D.21689;
  unsigned int D.21690;
  unsigned int D.21691;
  struct MonoVTable * D.21692;
  struct MonoVTable * array_fill_vtable.1;

  goto <D.19932>;
  <D.19933>:
  {
    size_t size;
    char * obj;

    D.21673 = MEM[(void * *)start];
    if (D.21673 == 0B) goto <D.21674>; else goto <D.21675>;
    <D.21674>:
    start = start + 4;
    // predicted unlikely by continue predictor.
    goto <D.19932>;
    <D.21675>:
    if (allow_flags != 0) goto <D.21676>; else goto <D.21677>;
    <D.21676>:
    D.21679 = MEM[(mword *)start];
    D.21680 = D.21679 & 1;
    if (D.21680 != 0) goto <D.21681>; else goto <D.21682>;
    <D.21681>:
    D.21679 = MEM[(mword *)start];
    D.21683 = D.21679 & 4294967292;
    iftmp.0 = (char *) D.21683;
    goto <D.21684>;
    <D.21682>:
    iftmp.0 = 0B;
    <D.21684>:
    obj = iftmp.0;
    if (obj == 0B) goto <D.21685>; else goto <D.21686>;
    <D.21685>:
    obj = start;
    <D.21686>:
    goto <D.21687>;
    <D.21677>:
    obj = start;
    <D.21687>:
    D.21688 = sgen_safe_object_get_size (obj);
    D.21689 = D.21688 + 7;
    size = D.21689 & 4294967288;
    D.21690 = MEM[(mword *)obj];
    D.21691 = D.21690 & 4294967292;
    D.21692 = (struct MonoVTable *) D.21691;
    array_fill_vtable.1 = array_fill_vtable;
    if (D.21692 != array_fill_vtable.1) goto <D.21694>; else goto <D.21695>;
    <D.21694>:
    callback (obj, size, data);
    <D.21695>:
    start = start + size;
  }
  <D.19932>:
  if (start < end) goto <D.19933>; else goto <D.19934>;
  <D.19934>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.2;
  unsigned int D.21697;
  unsigned int D.21698;
  unsigned int D.21701;
  guint D.21705;
  struct MonoVTable * D.21706;
  char * forwarded;

  D.21697 = MEM[(mword *)obj];
  D.21698 = D.21697 & 1;
  if (D.21698 != 0) goto <D.21699>; else goto <D.21700>;
  <D.21699>:
  D.21697 = MEM[(mword *)obj];
  D.21701 = D.21697 & 4294967292;
  iftmp.2 = (char *) D.21701;
  goto <D.21702>;
  <D.21700>:
  iftmp.2 = 0B;
  <D.21702>:
  forwarded = iftmp.2;
  if (forwarded != 0B) goto <D.21703>; else goto <D.21704>;
  <D.21703>:
  obj = forwarded;
  <D.21704>:
  D.21697 = MEM[(mword *)obj];
  D.21701 = D.21697 & 4294967292;
  D.21706 = (struct MonoVTable *) D.21701;
  D.21705 = sgen_par_object_get_size (D.21706, obj);
  return D.21705;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.21708;
  unsigned int D.21709;
  guint D.21714;
  int D.21715;
  int D.21716;
  unsigned int D.21717;
  unsigned int D.21720;
  int D.21721;
  unsigned int D.21722;
  unsigned int element_size.3;
  unsigned int D.21724;
  unsigned int D.21725;
  struct MonoClass * D.21728;
  unsigned char D.21729;
  unsigned int D.21730;
  unsigned int D.21731;
  mword descr;
  mword type;

  D.21708 = vtable->gc_descr;
  descr = (mword) D.21708;
  type = descr & 7;
  D.21709 = type + 4294967295;
  if (D.21709 <= 1) goto <D.21710>; else goto <D.21711>;
  <D.21710>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.21712>; else goto <D.21713>;
    <D.21712>:
    D.21715 = MEM[(struct MonoString *)o].length;
    D.21716 = D.21715 * 2;
    D.21717 = (unsigned int) D.21716;
    D.21714 = D.21717 + 14;
    return D.21714;
    <D.21713>:
    D.21714 = size;
    return D.21714;
  }
  <D.21711>:
  if (type == 4) goto <D.21718>; else goto <D.21719>;
  <D.21718>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.21720 = descr >> 3;
    D.21721 = (int) D.21720;
    element_size = D.21721 & 1023;
    array = o;
    D.21722 = array->max_length;
    element_size.3 = (unsigned int) element_size;
    D.21724 = D.21722 * element_size.3;
    size = D.21724 + 16;
    D.21725 = descr & 8192;
    if (D.21725 != 0) goto <D.21726>; else goto <D.21727>;
    <D.21726>:
    size = size + 3;
    size = size & 4294967292;
    D.21728 = vtable->klass;
    D.21729 = D.21728->rank;
    D.21730 = (unsigned int) D.21729;
    D.21731 = D.21730 * 8;
    size = D.21731 + size;
    <D.21727>:
    D.21714 = size;
    return D.21714;
  }
  <D.21719>:
  D.21714 = slow_object_get_size (vtable, o);
  return D.21714;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.21733;
  guint D.21736;
  int D.21737;
  int D.21738;
  unsigned int D.21739;
  unsigned char D.21740;
  int D.21743;
  unsigned int D.21744;
  unsigned int D.21745;
  unsigned int D.21746;
  struct MonoArrayBounds * D.21747;
  _Bool D.21748;
  long int D.21749;
  long int D.21750;
  unsigned int D.21753;
  unsigned int D.21754;
  int D.21755;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.21733 = mono_defaults.string_class;
  if (D.21733 == klass) goto <D.21734>; else goto <D.21735>;
  <D.21734>:
  D.21737 = MEM[(struct MonoString *)o].length;
  D.21738 = D.21737 * 2;
  D.21739 = (unsigned int) D.21738;
  D.21736 = D.21739 + 14;
  return D.21736;
  <D.21735>:
  D.21740 = klass->rank;
  if (D.21740 != 0) goto <D.21741>; else goto <D.21742>;
  <D.21741>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.21743 = klass->sizes.element_size;
    D.21744 = (unsigned int) D.21743;
    D.21745 = array->max_length;
    D.21746 = D.21744 * D.21745;
    size = D.21746 + 16;
    D.21747 = array->bounds;
    D.21748 = D.21747 != 0B;
    D.21749 = (long int) D.21748;
    D.21750 = __builtin_expect (D.21749, 0);
    if (D.21750 != 0) goto <D.21751>; else goto <D.21752>;
    <D.21751>:
    size = size + 3;
    size = size & 4294967292;
    D.21740 = klass->rank;
    D.21753 = (unsigned int) D.21740;
    D.21754 = D.21753 * 8;
    size = D.21754 + size;
    <D.21752>:
    D.21736 = size;
    return D.21736;
  }
  <D.21742>:
  D.21755 = klass->instance_size;
  D.21736 = (guint) D.21755;
  return D.21736;
}


mono_gc_scan_for_specific_ref (struct MonoObject * key, gboolean precise)
{
  struct GCMemSection * nursery_section.4;
  char * D.21758;
  char * D.21759;
  void (*<T2c49>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.21760;
  unsigned int D.21761;
  void * D.21762;
  char * D.21763;
  struct SgenHashTableEntry * D.21764;
  unsigned int D.21765;
  void * * ptr;
  struct RootRecord * root;

  scan_object_for_specific_ref_precise = precise;
  nursery_section.4 = nursery_section;
  D.21758 = nursery_section.4->end_data;
  nursery_section.4 = nursery_section;
  D.21759 = nursery_section.4->data;
  sgen_scan_area_with_callback (D.21759, D.21758, scan_object_for_specific_ref_callback, key, 1);
  D.21760 = major_collector.iterate_objects;
  D.21760 (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.20009>;
    <D.20008>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.21761 = __i * 4;
      __iter = __table + D.21761;
      goto <D.20006>;
      <D.20005>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        ptr = __entry->key;
        root = &__entry->data;
        goto <D.20003>;
        <D.20002>:
        D.21762 = *ptr;
        check_root_obj_specific_ref (root, D.21762, key);
        ptr = ptr + 4;
        <D.20003>:
        D.21763 = root->end_root;
        if (D.21763 > ptr) goto <D.20002>; else goto <D.20004>;
        <D.20004>:
      }
      __iter = __next;
      <D.20006>:
      D.21764 = *__iter;
      if (D.21764 != 0B) goto <D.20005>; else goto <D.20007>;
      <D.20007>:
    }
    __i = __i + 1;
    <D.20009>:
    D.21765 = roots_hash[1].size;
    if (D.21765 > __i) goto <D.20008>; else goto <D.20010>;
    <D.20010>:
  }
}


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.21767;
  unsigned int D.21768;
  unsigned int D.21771;
  int scan_object_for_specific_ref_precise.6;
  unsigned int D.21778;
  unsigned int D.21779;
  unsigned int D.21782;
  unsigned int D.21783;
  unsigned int D.21784;
  unsigned int D.21785;
  unsigned int D.21786;
  void * D.21787;
  int _objptr.7;
  int start.8;
  int D.21792;
  const char * D.21793;
  const char * D.21796;
  unsigned int _index.9;
  unsigned int D.21798;
  int D.21799;
  void * D.21800;
  int _objptr.10;
  int D.21804;
  const char * D.21805;
  unsigned int _index.11;
  unsigned int D.21807;
  int D.21808;
  const char * D.21811;
  unsigned int D.21812;
  unsigned int D.21815;
  int D.21816;
  int desc.12;
  unsigned int D.21820;
  unsigned int el_size.13;
  unsigned int D.21822;
  void * D.21823;
  int p.14;
  int D.21827;
  const char * D.21828;
  int D.21832;
  unsigned int offset.15;
  unsigned int D.21834;
  unsigned int i.16;
  unsigned int D.21836;
  void * * D.21837;
  void * D.21838;
  char * D.21841;
  int D.21842;
  int D.21843;
  const char * D.21844;
  sizetype el_size.17;
  unsigned int D.21849;
  void * D.21852;
  int p.18;
  int D.21856;
  const char * D.21857;
  unsigned int D.21858;
  void * D.21861;
  int _objptr.19;
  int D.21865;
  const char * D.21866;
  unsigned int D.21867;
  unsigned int D.21868;
  struct MonoVTable * D.21871;
  struct MonoClass * D.21872;
  const char * D.21873;
  const char * D.21874;
  gsize * bitmap_data.20;
  unsigned int D.21876;
  void * D.21879;
  int _objptr.21;
  int D.21883;
  const char * D.21884;
  int bwords.22;
  unsigned int D.21886;
  gsize * mbitmap_data.23;
  unsigned int D.21888;
  unsigned int D.21889;
  struct MonoClass * D.21890;
  unsigned int el_size.24;
  unsigned int D.21892;
  const char * D.21895;
  const char * D.21896;
  gsize * bitmap_data.25;
  unsigned int D.21898;
  void * D.21901;
  int _objptr.26;
  int D.21905;
  const char * D.21906;
  unsigned int bwords.27;
  sizetype el_size.28;
  unsigned int i.29;
  unsigned int D.21911;
  mword * D.21912;
  unsigned int D.21913;
  unsigned int key.30;
  const char * D.21917;
  unsigned int i.31;
  unsigned int D.21919;
  char * forwarded;

  D.21767 = MEM[(mword *)start];
  D.21768 = D.21767 & 1;
  if (D.21768 != 0) goto <D.21769>; else goto <D.21770>;
  <D.21769>:
  D.21767 = MEM[(mword *)start];
  D.21771 = D.21767 & 4294967292;
  iftmp.5 = (char *) D.21771;
  goto <D.21772>;
  <D.21770>:
  iftmp.5 = 0B;
  <D.21772>:
  forwarded = iftmp.5;
  if (forwarded != 0B) goto <D.21773>; else goto <D.21774>;
  <D.21773>:
  start = forwarded;
  <D.21774>:
  scan_object_for_specific_ref_precise.6 = scan_object_for_specific_ref_precise;
  if (scan_object_for_specific_ref_precise.6 != 0) goto <D.21776>; else goto <D.21777>;
  <D.21776>:
  {
    struct GCVTable * vt;
    mword desc;

    D.21767 = MEM[(mword *)start];
    D.21771 = D.21767 & 4294967292;
    vt = (struct GCVTable *) D.21771;
    desc = vt->desc;
    D.21778 = desc & 7;
    switch (D.21778) <default: <D.19916>, case 1: <D.19831>, case 2: <D.19838>, case 3: <D.19882>, case 4: <D.19846>, case 5: <D.19876>, case 6: <D.19895>, case 7: <D.19915>>
    <D.19831>:
    D.21779 = desc & 4294901760;
    if (D.21779 != 0) goto <D.21780>; else goto <D.21781>;
    <D.21780>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.21782 = desc >> 16;
      D.21783 = D.21782 & 255;
      D.21784 = D.21783 * 4;
      _objptr = _objptr + D.21784;
      D.21785 = desc >> 24;
      D.21786 = D.21785 * 4;
      _objptr_end = _objptr + D.21786;
      D.21787 = *_objptr;
      if (D.21787 == key) goto <D.21788>; else goto <D.21789>;
      <D.21788>:
      _objptr.7 = (int) _objptr;
      start.8 = (int) start;
      D.21792 = _objptr.7 - start.8;
      D.21793 = safe_name (start);
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21793, D.21792);
      <D.21789>:
      _objptr = _objptr + 4;
      goto <D.19835>;
      <D.19834>:
      D.21787 = *_objptr;
      if (D.21787 == key) goto <D.21794>; else goto <D.21795>;
      <D.21794>:
      _objptr.7 = (int) _objptr;
      start.8 = (int) start;
      D.21792 = _objptr.7 - start.8;
      D.21796 = safe_name (start);
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21796, D.21792);
      <D.21795>:
      _objptr = _objptr + 4;
      <D.19835>:
      if (_objptr < _objptr_end) goto <D.19834>; else goto <D.19836>;
      <D.19836>:
    }
    <D.21781>:
    goto <D.19837>;
    <D.19838>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.9 = (unsigned int) _index;
        D.21798 = _index.9 * 4;
        _objptr = _objptr + D.21798;
        D.21799 = _index + 1;
        _bmap = _bmap >> D.21799;
        D.21800 = *_objptr;
        if (D.21800 == key) goto <D.21801>; else goto <D.21802>;
        <D.21801>:
        _objptr.10 = (int) _objptr;
        start.8 = (int) start;
        D.21804 = _objptr.10 - start.8;
        D.21805 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21805, D.21804);
        <D.21802>:
        _objptr = _objptr + 4;
      }
      goto <D.19844>;
      <D.19843>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.11 = (unsigned int) _index;
        D.21807 = _index.11 * 4;
        _objptr = _objptr + D.21807;
        D.21808 = _index + 1;
        _bmap = _bmap >> D.21808;
        D.21800 = *_objptr;
        if (D.21800 == key) goto <D.21809>; else goto <D.21810>;
        <D.21809>:
        _objptr.10 = (int) _objptr;
        start.8 = (int) start;
        D.21804 = _objptr.10 - start.8;
        D.21811 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21811, D.21804);
        <D.21810>:
        _objptr = _objptr + 4;
      }
      <D.19844>:
      if (_bmap != 0) goto <D.19843>; else goto <D.19845>;
      <D.19845>:
    }
    goto <D.19837>;
    <D.19846>:
    D.21812 = desc & 4294950912;
    if (D.21812 != 0) goto <D.21813>; else goto <D.21814>;
    <D.21813>:
    {
      int el_size;
      int etype;

      D.21815 = desc >> 3;
      D.21816 = (int) D.21815;
      el_size = D.21816 & 1023;
      desc.12 = (int) desc;
      etype = desc.12 & 49152;
      if (etype == 16384) goto <D.21818>; else goto <D.21819>;
      <D.21818>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.21820 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.21822 = D.21820 * el_size.13;
        end_refs = p + D.21822;
        goto <D.19852>;
        <D.19851>:
        D.21823 = *p;
        if (D.21823 == key) goto <D.21824>; else goto <D.21825>;
        <D.21824>:
        p.14 = (int) p;
        start.8 = (int) start;
        D.21827 = p.14 - start.8;
        D.21828 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21828, D.21827);
        <D.21825>:
        p = p + 4;
        <D.19852>:
        if (p < end_refs) goto <D.19851>; else goto <D.19853>;
        <D.19853>:
      }
      goto <D.21829>;
      <D.21819>:
      if (etype == 32768) goto <D.21830>; else goto <D.21831>;
      <D.21830>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.21782 = desc >> 16;
        D.21832 = (int) D.21782;
        offset = D.21832 & 255;
        D.21785 = desc >> 24;
        num_refs = (int) D.21785;
        e_start = start + 16;
        D.21820 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.21822 = D.21820 * el_size.13;
        e_end = e_start + D.21822;
        goto <D.19864>;
        <D.19863>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.15 = (unsigned int) offset;
          D.21834 = offset.15 * 4;
          p = p + D.21834;
          i = 0;
          goto <D.19861>;
          <D.19860>:
          i.16 = (unsigned int) i;
          D.21836 = i.16 * 4;
          D.21837 = p + D.21836;
          D.21838 = *D.21837;
          if (D.21838 == key) goto <D.21839>; else goto <D.21840>;
          <D.21839>:
          i.16 = (unsigned int) i;
          D.21836 = i.16 * 4;
          D.21841 = p + D.21836;
          D.21842 = (int) D.21841;
          start.8 = (int) start;
          D.21843 = D.21842 - start.8;
          D.21844 = safe_name (start);
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21844, D.21843);
          <D.21840>:
          i = i + 1;
          <D.19861>:
          if (i < num_refs) goto <D.19860>; else goto <D.19862>;
          <D.19862>:
          el_size.17 = (sizetype) el_size;
          e_start = e_start + el_size.17;
        }
        <D.19864>:
        if (e_start < e_end) goto <D.19863>; else goto <D.19865>;
        <D.19865>:
      }
      goto <D.21846>;
      <D.21831>:
      if (etype == 49152) goto <D.21847>; else goto <D.21848>;
      <D.21847>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.21820 = MEM[(struct MonoArray *)start].max_length;
        el_size.13 = (unsigned int) el_size;
        D.21822 = D.21820 * el_size.13;
        e_end = e_start + D.21822;
        goto <D.19874>;
        <D.19873>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.19871>;
          <D.19870>:
          D.21849 = _bmap & 1;
          if (D.21849 != 0) goto <D.21850>; else goto <D.21851>;
          <D.21850>:
          D.21852 = *p;
          if (D.21852 == key) goto <D.21853>; else goto <D.21854>;
          <D.21853>:
          p.18 = (int) p;
          start.8 = (int) start;
          D.21856 = p.18 - start.8;
          D.21857 = safe_name (start);
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21857, D.21856);
          <D.21854>:
          <D.21851>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.19871>:
          if (_bmap != 0) goto <D.19870>; else goto <D.19872>;
          <D.19872>:
          el_size.17 = (sizetype) el_size;
          e_start = e_start + el_size.17;
        }
        <D.19874>:
        if (e_start < e_end) goto <D.19873>; else goto <D.19875>;
        <D.19875>:
      }
      <D.21848>:
      <D.21846>:
      <D.21829>:
    }
    <D.21814>:
    goto <D.19837>;
    <D.19876>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.19880>;
      <D.19879>:
      D.21858 = _bmap & 1;
      if (D.21858 != 0) goto <D.21859>; else goto <D.21860>;
      <D.21859>:
      D.21861 = *_objptr;
      if (D.21861 == key) goto <D.21862>; else goto <D.21863>;
      <D.21862>:
      _objptr.19 = (int) _objptr;
      start.8 = (int) start;
      D.21865 = _objptr.19 - start.8;
      D.21866 = safe_name (start);
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21866, D.21865);
      <D.21863>:
      <D.21860>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19880>:
      if (_bmap != 0) goto <D.19879>; else goto <D.19881>;
      <D.19881>:
    }
    goto <D.19837>;
    <D.19882>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.21867 = *bitmap_data;
      D.21868 = D.21867 + 4294967295;
      bwords = (int) D.21868;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.21869>; else goto <D.21870>;
      <D.21869>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.21871 = myobj->vtable;
        D.21872 = D.21871->klass;
        D.21873 = D.21872->name;
        D.21871 = myobj->vtable;
        D.21872 = D.21871->klass;
        D.21874 = D.21872->name_space;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21874, D.21873);
      }
      <D.21870>:
      goto <D.19893>;
      <D.19892>:
      {
        gsize _bmap;

        bitmap_data.20 = bitmap_data;
        bitmap_data = bitmap_data.20 + 4;
        _bmap = *bitmap_data.20;
        _objptr = start_run;
        goto <D.19890>;
        <D.19889>:
        D.21876 = _bmap & 1;
        if (D.21876 != 0) goto <D.21877>; else goto <D.21878>;
        <D.21877>:
        D.21879 = *_objptr;
        if (D.21879 == key) goto <D.21880>; else goto <D.21881>;
        <D.21880>:
        _objptr.21 = (int) _objptr;
        start.8 = (int) start;
        D.21883 = _objptr.21 - start.8;
        D.21884 = safe_name (start);
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21884, D.21883);
        <D.21881>:
        <D.21878>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.19890>:
        if (_bmap != 0) goto <D.19889>; else goto <D.19891>;
        <D.19891>:
        start_run = start_run + 128;
      }
      <D.19893>:
      bwords.22 = bwords;
      bwords = bwords.22 + -1;
      if (bwords.22 > 0) goto <D.19892>; else goto <D.19894>;
      <D.19894>:
    }
    goto <D.19837>;
    <D.19895>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.21886 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.21886);
      mbitmap_data.23 = mbitmap_data;
      mbitmap_data = mbitmap_data.23 + 4;
      D.21888 = *mbitmap_data.23;
      D.21889 = D.21888 + 4294967295;
      mbwords = (int) D.21889;
      D.21890 = vt->klass;
      el_size = mono_array_element_size (D.21890);
      e_start = start + 16;
      D.21820 = MEM[(struct MonoArray *)start].max_length;
      el_size.24 = (unsigned int) el_size;
      D.21892 = D.21820 * el_size.24;
      e_end = e_start + D.21892;
      if (0 != 0) goto <D.21893>; else goto <D.21894>;
      <D.21893>:
      D.21890 = vt->klass;
      D.21895 = D.21890->name;
      D.21890 = vt->klass;
      D.21896 = D.21890->name_space;
      D.21886 = vt->desc;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.21886, D.21896, D.21895);
      <D.21894>:
      goto <D.19913>;
      <D.19912>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.19910>;
        <D.19909>:
        {
          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.19907>;
          <D.19906>:
          D.21898 = _bmap & 1;
          if (D.21898 != 0) goto <D.21899>; else goto <D.21900>;
          <D.21899>:
          D.21901 = *_objptr;
          if (D.21901 == key) goto <D.21902>; else goto <D.21903>;
          <D.21902>:
          _objptr.26 = (int) _objptr;
          start.8 = (int) start;
          D.21905 = _objptr.26 - start.8;
          D.21906 = safe_name (start);
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.21906, D.21905);
          <D.21903>:
          <D.21900>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.19907>:
          if (_bmap != 0) goto <D.19906>; else goto <D.19908>;
          <D.19908>:
          _objptr = start_run + 128;
        }
        <D.19910>:
        bwords.27 = bwords;
        bwords = bwords.27 + 4294967295;
        if (bwords.27 != 0) goto <D.19909>; else goto <D.19911>;
        <D.19911>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.19913>:
      if (e_start < e_end) goto <D.19912>; else goto <D.19914>;
      <D.19914>:
    }
    goto <D.19837>;
    <D.19915>:
    goto <D.19837>;
    <D.19916>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.19837>:
  }
  goto <D.21909>;
  <D.21777>:
  {
    mword * words;
    size_t size;
    int i;

    words = start;
    size = sgen_safe_object_get_size (start);
    i = 0;
    goto <D.19921>;
    <D.19920>:
    i.29 = (unsigned int) i;
    D.21911 = i.29 * 4;
    D.21912 = words + D.21911;
    D.21913 = *D.21912;
    key.30 = (unsigned int) key;
    if (D.21913 == key.30) goto <D.21915>; else goto <D.21916>;
    <D.21915>:
    i.29 = (unsigned int) i;
    D.21911 = i.29 * 4;
    D.21917 = safe_name (start);
    monoeg_g_print ("found possible ref to %p in object %p (%s) at offset %td\n", key, start, D.21917, D.21911);
    <D.21916>:
    i = i + 1;
    <D.19921>:
    i.31 = (unsigned int) i;
    D.21919 = size / 4;
    if (i.31 < D.21919) goto <D.19920>; else goto <D.19922>;
    <D.19922>:
  }
  <D.21909>:
}


scan_roots_for_specific_ref (struct MonoObject * key, int root_type)
{
  unsigned int D.21922;
  unsigned int D.21923;
  unsigned int D.21924;
  void * D.21927;
  unsigned int D.21928;
  unsigned int D.21929;
  gsize * bitmap_data.32;
  unsigned int D.21931;
  void * D.21934;
  int bwords.33;
  struct SgenHashTableEntry * D.21936;
  unsigned int D.21937;
  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.19988>;
    <D.19987>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.21922 = __i * 4;
      __iter = __table + D.21922;
      goto <D.19985>;
      <D.19984>:
      {
        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.21923 = desc & 7;
          switch (D.21923) <default: <D.19983>, case 1: <D.19963>, case 2: <D.19982>, case 3: <D.19967>, case 4: <D.19980>>
          <D.19963>:
          desc = desc >> 3;
          goto <D.19965>;
          <D.19964>:
          D.21924 = desc & 1;
          if (D.21924 != 0) goto <D.21925>; else goto <D.21926>;
          <D.21925>:
          D.21927 = *start_root;
          check_root_obj_specific_ref (root, key, D.21927);
          <D.21926>:
          desc = desc >> 1;
          start_root = start_root + 4;
          <D.19965>:
          if (desc != 0) goto <D.19964>; else goto <D.19966>;
          <D.19966>:
          return;
          <D.19967>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.21928 = *bitmap_data;
            D.21929 = D.21928 + 4294967295;
            bwords = (int) D.21929;
            start_run = start_root;
            bitmap_data = bitmap_data + 4;
            goto <D.19977>;
            <D.19976>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.32 = bitmap_data;
              bitmap_data = bitmap_data.32 + 4;
              bmap = *bitmap_data.32;
              objptr = start_run;
              goto <D.19974>;
              <D.19973>:
              D.21931 = bmap & 1;
              if (D.21931 != 0) goto <D.21932>; else goto <D.21933>;
              <D.21932>:
              D.21934 = *objptr;
              check_root_obj_specific_ref (root, key, D.21934);
              <D.21933>:
              bmap = bmap >> 1;
              objptr = objptr + 4;
              <D.19974>:
              if (bmap != 0) goto <D.19973>; else goto <D.19975>;
              <D.19975>:
              start_run = start_run + 128;
            }
            <D.19977>:
            bwords.33 = bwords;
            bwords = bwords.33 + -1;
            if (bwords.33 > 0) goto <D.19976>; else goto <D.19978>;
            <D.19978>:
            goto <D.19979>;
          }
          <D.19980>:
          {
            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.19979>;
          }
          <D.19982>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 844);
          <D.19983>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 846);
          <D.19979>:
        }
      }
      __iter = __next;
      <D.19985>:
      D.21936 = *__iter;
      if (D.21936 != 0B) goto <D.19984>; else goto <D.19986>;
      <D.19986>:
    }
    __i = __i + 1;
    <D.19988>:
    D.21937 = roots_hash[root_type].size;
    if (D.21937 > __i) goto <D.19987>; else goto <D.19989>;
    <D.19989>:
  }
  check_key = 0B;
  check_root = 0B;
}


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

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


check_root_obj_specific_ref (struct RootRecord * root, struct MonoObject * key, struct MonoObject * obj)
{
  if (key != obj) goto <D.21942>; else goto <D.21943>;
  <D.21942>:
  return;
  <D.21943>:
  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.21949;
  long int D.21950;
  long int D.21951;
  int xdomain_checks.38;
  struct MonoDomain * D.21957;
  struct GCMemSection * nursery_section.39;
  char * D.21961;
  char * D.21962;
  void (*<T2c49>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.21963;
  char[0:] * D.21964;
  int D.21965;
  struct LOSObject * los_object_list.40;
  struct FILE * gc_debug_file.41;
  struct MonoDomain * D.21975;
  int do_pin_stats.42;
  _Bool D.21979;
  long int D.21980;
  long int D.21981;
  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.21946>; else goto <D.21947>;
  <D.21946>:
  sgen_perform_collection (0, 1, "clear domain", 1);
  <D.21947>:
  concurrent_collection_in_progress.37 = concurrent_collection_in_progress;
  D.21949 = concurrent_collection_in_progress.37 != 0;
  D.21950 = (long int) D.21949;
  D.21951 = __builtin_expect (D.21950, 0);
  if (D.21951 != 0) goto <D.21952>; else goto <D.21953>;
  <D.21952>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1059, "!concurrent_collection_in_progress");
  <D.21953>:
  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.21955>; else goto <D.21956>;
  <D.21955>:
  D.21957 = mono_get_root_domain ();
  if (D.21957 != domain) goto <D.21958>; else goto <D.21959>;
  <D.21958>:
  scan_for_registered_roots_in_domain (domain, 0);
  scan_for_registered_roots_in_domain (domain, 2);
  check_for_xdomain_refs ();
  <D.21959>:
  <D.21956>:
  null_ephemerons_for_domain (domain);
  i = 0;
  goto <D.20106>;
  <D.20105>:
  sgen_null_links_for_domain (domain, i);
  i = i + 1;
  <D.20106>:
  if (i <= 1) goto <D.20105>; else goto <D.20107>;
  <D.20107>:
  i = 0;
  goto <D.20109>;
  <D.20108>:
  sgen_remove_finalizers_for_domain (domain, i);
  i = i + 1;
  <D.20109>:
  if (i <= 1) goto <D.20108>; else goto <D.20110>;
  <D.20110>:
  nursery_section.39 = nursery_section;
  D.21961 = nursery_section.39->end_data;
  nursery_section.39 = nursery_section;
  D.21962 = nursery_section.39->data;
  sgen_scan_area_with_callback (D.21962, D.21961, clear_domain_process_minor_object_callback, domain, 0);
  D.21963 = major_collector.iterate_objects;
  D.21963 (1, 1, clear_domain_process_major_object_callback, domain);
  bigobj = los_object_list;
  goto <D.20112>;
  <D.20111>:
  D.21964 = &bigobj->data;
  clear_domain_process_object (D.21964, domain);
  bigobj = bigobj->next;
  <D.20112>:
  if (bigobj != 0B) goto <D.20111>; else goto <D.20113>;
  <D.20113>:
  prev = 0B;
  bigobj = los_object_list;
  goto <D.20115>;
  <D.20116>:
  D.21964 = &bigobj->data;
  D.21965 = need_remove_object_for_domain (D.21964, domain);
  if (D.21965 != 0) goto <D.21966>; else goto <D.21967>;
  <D.21966>:
  {
    struct LOSObject * to_free;

    to_free = bigobj;
    if (prev != 0B) goto <D.21968>; else goto <D.21969>;
    <D.21968>:
    los_object_list.40 = bigobj->next;
    prev->next = los_object_list.40;
    goto <D.21971>;
    <D.21969>:
    los_object_list.40 = bigobj->next;
    los_object_list = los_object_list.40;
    <D.21971>:
    bigobj = bigobj->next;
    if (0 != 0) goto <D.21972>; else goto <D.21973>;
    <D.21972>:
    D.21964 = &bigobj->data;
    gc_debug_file.41 = gc_debug_file;
    fprintf (gc_debug_file.41, "Freeing large object %p\n", D.21964);
    gc_debug_file.41 = gc_debug_file;
    fflush (gc_debug_file.41);
    <D.21973>:
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.20115>;
  }
  <D.21967>:
  prev = bigobj;
  bigobj = bigobj->next;
  <D.20115>:
  if (bigobj != 0B) goto <D.20116>; else goto <D.20117>;
  <D.20117>:
  D.21963 = major_collector.iterate_objects;
  D.21963 (1, 0, clear_domain_free_major_non_pinned_object_callback, domain);
  D.21963 = major_collector.iterate_objects;
  D.21963 (0, 1, clear_domain_free_major_pinned_object_callback, domain);
  D.21975 = mono_get_root_domain ();
  if (D.21975 == domain) goto <D.21976>; else goto <D.21977>;
  <D.21976>:
  do_pin_stats.42 = do_pin_stats;
  D.21979 = do_pin_stats.42 != 0;
  D.21980 = (long int) D.21979;
  D.21981 = __builtin_expect (D.21980, 0);
  if (D.21981 != 0) goto <D.21982>; else goto <D.21983>;
  <D.21982>:
  sgen_pin_stats_print_class_stats ();
  <D.21983>:
  <D.21977>:
  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.21984;
  void (*<T2c45>) (char *, size_t) D.21987;

  D.21984 = need_remove_object_for_domain (obj, domain);
  if (D.21984 != 0) goto <D.21985>; else goto <D.21986>;
  <D.21985>:
  D.21987 = major_collector.free_pinned_object;
  D.21987 (obj, size);
  <D.21986>:
}


clear_domain_free_major_non_pinned_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.21988;
  void (*<T2c45>) (char *, size_t) D.21991;

  D.21988 = need_remove_object_for_domain (obj, domain);
  if (D.21988 != 0) goto <D.21989>; else goto <D.21990>;
  <D.21989>:
  D.21991 = major_collector.free_non_pinned_object;
  D.21991 (obj, size);
  <D.21990>:
}


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

  D.21992 = clear_domain_process_object (obj, domain);
  if (D.21992 != 0) goto <D.21993>; else goto <D.21994>;
  <D.21993>:
  memset (obj, 0, size);
  <D.21994>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.21997;
  int D.22002;
  void * D.22004;
  unsigned int D.22005;

  D.21997 = __builtin_constant_p (__len);
  if (D.21997 != 0) goto <D.21998>; else goto <D.21999>;
  <D.21998>:
  if (__len == 0) goto <D.22000>; else goto <D.22001>;
  <D.22000>:
  D.22002 = __builtin_constant_p (__ch);
  if (D.22002 == 0) goto <D.21995>; else goto <D.22003>;
  <D.22003>:
  if (__ch != 0) goto <D.21995>; else goto <D.21996>;
  <D.21995>:
  __warn_memset_zero_len ();
  D.22004 = __dest;
  return D.22004;
  <D.21996>:
  <D.22001>:
  <D.21999>:
  D.22005 = __builtin_object_size (__dest, 0);
  D.22004 = __builtin___memset_chk (__dest, __ch, __len, D.22005);
  return D.22004;
}


scan_for_registered_roots_in_domain (struct MonoDomain * domain, int root_type)
{
  unsigned int D.22007;
  unsigned int D.22010;
  unsigned int D.22011;
  void * D.22014;
  unsigned int D.22017;
  unsigned int D.22018;
  gsize * bitmap_data.43;
  unsigned int D.22020;
  void * D.22023;
  int bwords.44;
  struct SgenHashTableEntry * D.22027;
  unsigned int D.22028;
  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.20064>;
    <D.20063>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22007 = __i * 4;
      __iter = __table + D.22007;
      goto <D.20061>;
      <D.20060>:
      {
        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.22008>; else goto <D.22009>;
          <D.22008>:
          // predicted unlikely by continue predictor.
          goto <D.20038>;
          <D.22009>:
          D.22010 = desc & 7;
          switch (D.22010) <default: <D.20059>, case 1: <D.20039>, case 2: <D.20058>, case 3: <D.20044>, case 4: <D.20056>>
          <D.20039>:
          desc = desc >> 3;
          goto <D.20041>;
          <D.20040>:
          D.22011 = desc & 1;
          if (D.22011 != 0) goto <D.22012>; else goto <D.22013>;
          <D.22012>:
          D.22014 = *start_root;
          if (D.22014 != 0B) goto <D.22015>; else goto <D.22016>;
          <D.22015>:
          D.22014 = *start_root;
          check_obj_not_in_domain (D.22014);
          <D.22016>:
          <D.22013>:
          desc = desc >> 1;
          start_root = start_root + 4;
          <D.20041>:
          if (desc != 0) goto <D.20040>; else goto <D.20042>;
          <D.20042>:
          goto <D.20043>;
          <D.20044>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.22017 = *bitmap_data;
            D.22018 = D.22017 + 4294967295;
            bwords = (int) D.22018;
            start_run = start_root;
            bitmap_data = bitmap_data + 4;
            goto <D.20054>;
            <D.20053>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.43 = bitmap_data;
              bitmap_data = bitmap_data.43 + 4;
              bmap = *bitmap_data.43;
              objptr = start_run;
              goto <D.20051>;
              <D.20050>:
              D.22020 = bmap & 1;
              if (D.22020 != 0) goto <D.22021>; else goto <D.22022>;
              <D.22021>:
              D.22023 = *objptr;
              if (D.22023 != 0B) goto <D.22024>; else goto <D.22025>;
              <D.22024>:
              D.22023 = *objptr;
              check_obj_not_in_domain (D.22023);
              <D.22025>:
              <D.22022>:
              bmap = bmap >> 1;
              objptr = objptr + 4;
              <D.20051>:
              if (bmap != 0) goto <D.20050>; else goto <D.20052>;
              <D.20052>:
              start_run = start_run + 128;
            }
            <D.20054>:
            bwords.44 = bwords;
            bwords = bwords.44 + -1;
            if (bwords.44 > 0) goto <D.20053>; else goto <D.20055>;
            <D.20055>:
            goto <D.20043>;
          }
          <D.20056>:
          {
            void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

            marker = sgen_get_user_descriptor_func (desc);
            marker (start_root, check_obj_not_in_domain);
            goto <D.20043>;
          }
          <D.20058>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 969);
          <D.20059>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 971);
          <D.20043>:
        }
      }
      <D.20038>:
      __iter = __next;
      <D.20061>:
      D.22027 = *__iter;
      if (D.22027 != 0B) goto <D.20060>; else goto <D.20062>;
      <D.20062>:
    }
    __i = __i + 1;
    <D.20064>:
    D.22028 = roots_hash[root_type].size;
    if (D.22028 > __i) goto <D.20063>; else goto <D.20065>;
    <D.20065>:
  }
  check_domain = 0B;
}


check_obj_not_in_domain (void * * o)
{
  void * D.22029;
  struct MonoVTable * D.22030;
  struct MonoDomain * D.22031;
  struct MonoDomain * check_domain.45;
  _Bool D.22033;
  long int D.22034;
  long int D.22035;

  D.22029 = *o;
  D.22030 = MEM[(struct MonoObject *)D.22029].vtable;
  D.22031 = D.22030->domain;
  check_domain.45 = check_domain;
  D.22033 = D.22031 == check_domain.45;
  D.22034 = (long int) D.22033;
  D.22035 = __builtin_expect (D.22034, 0);
  if (D.22035 != 0) goto <D.22036>; else goto <D.22037>;
  <D.22036>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 918, "((MonoObject*)(*o))->vtable->domain != check_domain");
  <D.22037>:
}


check_for_xdomain_refs ()
{
  struct GCMemSection * nursery_section.46;
  char * D.22039;
  char * D.22040;
  void (*<T2c49>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22041;
  unsigned int D.22042;
  char[0:] * D.22043;
  struct LOSObject * bigobj;

  nursery_section.46 = nursery_section;
  D.22039 = nursery_section.46->end_data;
  nursery_section.46 = nursery_section;
  D.22040 = nursery_section.46->data;
  sgen_scan_area_with_callback (D.22040, D.22039, scan_object_for_xdomain_refs, 0B, 0);
  D.22041 = major_collector.iterate_objects;
  D.22041 (1, 1, scan_object_for_xdomain_refs, 0B);
  bigobj = los_object_list;
  goto <D.20071>;
  <D.20070>:
  D.22042 = sgen_los_object_size (bigobj);
  D.22043 = &bigobj->data;
  scan_object_for_xdomain_refs (D.22043, D.22042, 0B);
  bigobj = bigobj->next;
  <D.20071>:
  if (bigobj != 0B) goto <D.20070>; else goto <D.20072>;
  <D.20072>:
}


scan_object_for_xdomain_refs (char * start, mword size, void * data)
{
  struct MonoVTable * D.22044;
  unsigned int D.22045;
  unsigned int D.22046;
  unsigned int D.22047;
  unsigned int D.22048;
  unsigned int D.22051;
  unsigned int D.22052;
  unsigned int D.22053;
  unsigned int D.22054;
  unsigned int D.22055;
  unsigned int _index.47;
  unsigned int D.22057;
  int D.22058;
  unsigned int _index.48;
  unsigned int D.22060;
  int D.22061;
  unsigned int D.22062;
  unsigned int D.22065;
  int D.22066;
  int desc.49;
  unsigned int D.22070;
  unsigned int el_size.50;
  unsigned int D.22072;
  int D.22076;
  unsigned int offset.51;
  unsigned int D.22078;
  unsigned int i.52;
  unsigned int D.22080;
  void * * D.22081;
  sizetype el_size.53;
  unsigned int D.22086;
  unsigned int D.22089;
  unsigned int D.22092;
  unsigned int D.22093;
  struct MonoVTable * D.22096;
  struct MonoClass * D.22097;
  const char * D.22098;
  const char * D.22099;
  gsize * bitmap_data.54;
  unsigned int D.22101;
  int bwords.55;
  unsigned int D.22105;
  gsize * mbitmap_data.56;
  unsigned int D.22107;
  unsigned int D.22108;
  struct MonoClass * D.22109;
  unsigned int el_size.57;
  unsigned int D.22111;
  const char * D.22114;
  const char * D.22115;
  gsize * bitmap_data.58;
  unsigned int D.22117;
  unsigned int bwords.59;
  sizetype el_size.60;
  struct MonoDomain * domain;

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

    D.22045 = MEM[(mword *)start];
    D.22046 = D.22045 & 4294967292;
    vt = (struct GCVTable *) D.22046;
    desc = vt->desc;
    D.22047 = desc & 7;
    switch (D.22047) <default: <D.19822>, case 1: <D.19737>, case 2: <D.19744>, case 3: <D.19788>, case 4: <D.19752>, case 5: <D.19782>, case 6: <D.19801>, case 7: <D.19821>>
    <D.19737>:
    D.22048 = desc & 4294901760;
    if (D.22048 != 0) goto <D.22049>; else goto <D.22050>;
    <D.22049>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.22051 = desc >> 16;
      D.22052 = D.22051 & 255;
      D.22053 = D.22052 * 4;
      _objptr = _objptr + D.22053;
      D.22054 = desc >> 24;
      D.22055 = D.22054 * 4;
      _objptr_end = _objptr + D.22055;
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 4;
      goto <D.19741>;
      <D.19740>:
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 4;
      <D.19741>:
      if (_objptr < _objptr_end) goto <D.19740>; else goto <D.19742>;
      <D.19742>:
    }
    <D.22050>:
    goto <D.19743>;
    <D.19744>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.47 = (unsigned int) _index;
        D.22057 = _index.47 * 4;
        _objptr = _objptr + D.22057;
        D.22058 = _index + 1;
        _bmap = _bmap >> D.22058;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 4;
      }
      goto <D.19750>;
      <D.19749>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.48 = (unsigned int) _index;
        D.22060 = _index.48 * 4;
        _objptr = _objptr + D.22060;
        D.22061 = _index + 1;
        _bmap = _bmap >> D.22061;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 4;
      }
      <D.19750>:
      if (_bmap != 0) goto <D.19749>; else goto <D.19751>;
      <D.19751>:
    }
    goto <D.19743>;
    <D.19752>:
    D.22062 = desc & 4294950912;
    if (D.22062 != 0) goto <D.22063>; else goto <D.22064>;
    <D.22063>:
    {
      int el_size;
      int etype;

      D.22065 = desc >> 3;
      D.22066 = (int) D.22065;
      el_size = D.22066 & 1023;
      desc.49 = (int) desc;
      etype = desc.49 & 49152;
      if (etype == 16384) goto <D.22068>; else goto <D.22069>;
      <D.22068>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.22070 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.22072 = D.22070 * el_size.50;
        end_refs = p + D.22072;
        goto <D.19758>;
        <D.19757>:
        check_reference_for_xdomain (p, start, domain);
        p = p + 4;
        <D.19758>:
        if (p < end_refs) goto <D.19757>; else goto <D.19759>;
        <D.19759>:
      }
      goto <D.22073>;
      <D.22069>:
      if (etype == 32768) goto <D.22074>; else goto <D.22075>;
      <D.22074>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.22051 = desc >> 16;
        D.22076 = (int) D.22051;
        offset = D.22076 & 255;
        D.22054 = desc >> 24;
        num_refs = (int) D.22054;
        e_start = start + 16;
        D.22070 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.22072 = D.22070 * el_size.50;
        e_end = e_start + D.22072;
        goto <D.19770>;
        <D.19769>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.51 = (unsigned int) offset;
          D.22078 = offset.51 * 4;
          p = p + D.22078;
          i = 0;
          goto <D.19767>;
          <D.19766>:
          i.52 = (unsigned int) i;
          D.22080 = i.52 * 4;
          D.22081 = p + D.22080;
          check_reference_for_xdomain (D.22081, start, domain);
          i = i + 1;
          <D.19767>:
          if (i < num_refs) goto <D.19766>; else goto <D.19768>;
          <D.19768>:
          el_size.53 = (sizetype) el_size;
          e_start = e_start + el_size.53;
        }
        <D.19770>:
        if (e_start < e_end) goto <D.19769>; else goto <D.19771>;
        <D.19771>:
      }
      goto <D.22083>;
      <D.22075>:
      if (etype == 49152) goto <D.22084>; else goto <D.22085>;
      <D.22084>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.22070 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.22072 = D.22070 * el_size.50;
        e_end = e_start + D.22072;
        goto <D.19780>;
        <D.19779>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.19777>;
          <D.19776>:
          D.22086 = _bmap & 1;
          if (D.22086 != 0) goto <D.22087>; else goto <D.22088>;
          <D.22087>:
          check_reference_for_xdomain (p, start, domain);
          <D.22088>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.19777>:
          if (_bmap != 0) goto <D.19776>; else goto <D.19778>;
          <D.19778>:
          el_size.53 = (sizetype) el_size;
          e_start = e_start + el_size.53;
        }
        <D.19780>:
        if (e_start < e_end) goto <D.19779>; else goto <D.19781>;
        <D.19781>:
      }
      <D.22085>:
      <D.22083>:
      <D.22073>:
    }
    <D.22064>:
    goto <D.19743>;
    <D.19782>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.19786>;
      <D.19785>:
      D.22089 = _bmap & 1;
      if (D.22089 != 0) goto <D.22090>; else goto <D.22091>;
      <D.22090>:
      check_reference_for_xdomain (_objptr, start, domain);
      <D.22091>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19786>:
      if (_bmap != 0) goto <D.19785>; else goto <D.19787>;
      <D.19787>:
    }
    goto <D.19743>;
    <D.19788>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.22092 = *bitmap_data;
      D.22093 = D.22092 + 4294967295;
      bwords = (int) D.22093;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.22094>; else goto <D.22095>;
      <D.22094>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.22096 = myobj->vtable;
        D.22097 = D.22096->klass;
        D.22098 = D.22097->name;
        D.22096 = myobj->vtable;
        D.22097 = D.22096->klass;
        D.22099 = D.22097->name_space;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.22099, D.22098);
      }
      <D.22095>:
      goto <D.19799>;
      <D.19798>:
      {
        gsize _bmap;

        bitmap_data.54 = bitmap_data;
        bitmap_data = bitmap_data.54 + 4;
        _bmap = *bitmap_data.54;
        _objptr = start_run;
        goto <D.19796>;
        <D.19795>:
        D.22101 = _bmap & 1;
        if (D.22101 != 0) goto <D.22102>; else goto <D.22103>;
        <D.22102>:
        check_reference_for_xdomain (_objptr, start, domain);
        <D.22103>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.19796>:
        if (_bmap != 0) goto <D.19795>; else goto <D.19797>;
        <D.19797>:
        start_run = start_run + 128;
      }
      <D.19799>:
      bwords.55 = bwords;
      bwords = bwords.55 + -1;
      if (bwords.55 > 0) goto <D.19798>; else goto <D.19800>;
      <D.19800>:
    }
    goto <D.19743>;
    <D.19801>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.22105 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.22105);
      mbitmap_data.56 = mbitmap_data;
      mbitmap_data = mbitmap_data.56 + 4;
      D.22107 = *mbitmap_data.56;
      D.22108 = D.22107 + 4294967295;
      mbwords = (int) D.22108;
      D.22109 = vt->klass;
      el_size = mono_array_element_size (D.22109);
      e_start = start + 16;
      D.22070 = MEM[(struct MonoArray *)start].max_length;
      el_size.57 = (unsigned int) el_size;
      D.22111 = D.22070 * el_size.57;
      e_end = e_start + D.22111;
      if (0 != 0) goto <D.22112>; else goto <D.22113>;
      <D.22112>:
      D.22109 = vt->klass;
      D.22114 = D.22109->name;
      D.22109 = vt->klass;
      D.22115 = D.22109->name_space;
      D.22105 = vt->desc;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.22105, D.22115, D.22114);
      <D.22113>:
      goto <D.19819>;
      <D.19818>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.19816>;
        <D.19815>:
        {
          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.19813>;
          <D.19812>:
          D.22117 = _bmap & 1;
          if (D.22117 != 0) goto <D.22118>; else goto <D.22119>;
          <D.22118>:
          check_reference_for_xdomain (_objptr, start, domain);
          <D.22119>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.19813>:
          if (_bmap != 0) goto <D.19812>; else goto <D.19814>;
          <D.19814>:
          _objptr = start_run + 128;
        }
        <D.19816>:
        bwords.59 = bwords;
        bwords = bwords.59 + 4294967295;
        if (bwords.59 != 0) goto <D.19815>; else goto <D.19817>;
        <D.19817>:
        el_size.60 = (sizetype) el_size;
        e_start = e_start + el_size.60;
      }
      <D.19819>:
      if (e_start < e_end) goto <D.19818>; else goto <D.19820>;
      <D.19820>:
    }
    goto <D.19743>;
    <D.19821>:
    goto <D.19743>;
    <D.19822>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.19743>:
  }
}


check_reference_for_xdomain (void * * ptr, char * obj, struct MonoDomain * domain)
{
  int ptr.61;
  int o.62;
  struct MonoVTable * D.22128;
  struct MonoDomain * D.22129;
  int D.22130;
  struct MonoVTable * D.22133;
  struct MonoClassField * D.22134;
  unsigned int i.63;
  unsigned int D.22136;
  struct MonoClassField * D.22137;
  int D.22138;
  unsigned int i.64;
  unsigned int D.22142;
  struct MonoClass * D.22144;
  struct MonoClass * D.22145;
  const char * iftmp.65;
  const char * D.22153;
  const char * D.22154;
  const char * iftmp.66;
  struct MonoClass * D.22159;
  const char * D.22160;
  const char * D.22161;
  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.22125>; else goto <D.22127>;
  <D.22127>:
  D.22128 = ref->vtable;
  D.22129 = D.22128->domain;
  if (D.22129 == domain) goto <D.22125>; else goto <D.22126>;
  <D.22125>:
  return;
  <D.22126>:
  D.22130 = is_xdomain_ref_allowed (ptr, obj, domain);
  if (D.22130 != 0) goto <D.22131>; else goto <D.22132>;
  <D.22131>:
  return;
  <D.22132>:
  field = 0B;
  D.22133 = o->vtable;
  class = D.22133->klass;
  goto <D.19728>;
  <D.19727>:
  {
    int i;

    i = 0;
    goto <D.19725>;
    <D.19724>:
    D.22134 = class->fields;
    i.63 = (unsigned int) i;
    D.22136 = i.63 * 16;
    D.22137 = D.22134 + D.22136;
    D.22138 = D.22137->offset;
    if (D.22138 == offset) goto <D.22139>; else goto <D.22140>;
    <D.22139>:
    D.22134 = class->fields;
    i.63 = (unsigned int) i;
    D.22136 = i.63 * 16;
    field = D.22134 + D.22136;
    goto <D.19723>;
    <D.22140>:
    i = i + 1;
    <D.19725>:
    i.64 = (unsigned int) i;
    D.22142 = class->field.count;
    if (i.64 < D.22142) goto <D.19724>; else goto <D.19723>;
    <D.19723>:
    if (field != 0B) goto <D.19726>; else goto <D.22143>;
    <D.22143>:
  }
  class = class->parent;
  <D.19728>:
  if (class != 0B) goto <D.19727>; else goto <D.19726>;
  <D.19726>:
  D.22128 = ref->vtable;
  D.22144 = D.22128->klass;
  D.22145 = mono_defaults.string_class;
  if (D.22144 == D.22145) goto <D.22146>; else goto <D.22147>;
  <D.22146>:
  str = mono_string_to_utf8 (ref);
  goto <D.22148>;
  <D.22147>:
  str = 0B;
  <D.22148>:
  if (str != 0B) goto <D.22150>; else goto <D.22151>;
  <D.22150>:
  iftmp.65 = str;
  goto <D.22152>;
  <D.22151>:
  iftmp.65 = "";
  <D.22152>:
  D.22128 = ref->vtable;
  D.22144 = D.22128->klass;
  D.22153 = D.22144->name;
  D.22128 = ref->vtable;
  D.22144 = D.22128->klass;
  D.22154 = D.22144->name_space;
  if (field != 0B) goto <D.22156>; else goto <D.22157>;
  <D.22156>:
  iftmp.66 = field->name;
  goto <D.22158>;
  <D.22157>:
  iftmp.66 = "";
  <D.22158>:
  D.22133 = o->vtable;
  D.22159 = D.22133->klass;
  D.22160 = D.22159->name;
  D.22133 = o->vtable;
  D.22159 = D.22133->klass;
  D.22161 = D.22159->name_space;
  monoeg_g_print ("xdomain reference in %p (%s.%s) at offset %d (%s) to %p (%s.%s) (%s)  -  pointed to by:\n", o, D.22161, D.22160, offset, iftmp.66, ref, D.22154, D.22153, iftmp.65);
  mono_gc_scan_for_specific_ref (o, 1);
  if (str != 0B) goto <D.22162>; else goto <D.22163>;
  <D.22162>:
  monoeg_g_free (str);
  <D.22163>:
}


is_xdomain_ref_allowed (void * * ptr, char * obj, struct MonoDomain * domain)
{
  int ptr.67;
  int o.68;
  struct MonoVTable * D.22167;
  struct MonoClass * D.22168;
  struct MonoClass * D.22169;
  gboolean D.22174;
  struct MonoClass * D.22175;
  struct MonoClass * D.22180;
  int D.22181;
  int D.19611;
  int iftmp.69;
  int D.19610;
  struct MonoVTable * D.22189;
  struct MonoClass * D.22190;
  const char[21] * D.22191;
  unsigned char D.22192;
  int D.22193;
  unsigned char D.22194;
  int D.22195;
  _Bool D.22196;
  _Bool D.22197;
  _Bool D.22198;
  const unsigned char * D.22201;
  unsigned char D.22202;
  int D.22203;
  const unsigned char * D.22204;
  unsigned char D.22205;
  int D.22206;
  _Bool D.22207;
  _Bool D.22208;
  const unsigned char * D.22211;
  unsigned char D.22212;
  int D.22213;
  const unsigned char * D.22214;
  unsigned char D.22215;
  int D.22216;
  _Bool D.22217;
  _Bool D.22218;
  const unsigned char * D.22221;
  unsigned char D.22222;
  int D.22223;
  const unsigned char * D.22224;
  unsigned char D.22225;
  int D.22226;
  const char * D.22228;
  int D.19620;
  int iftmp.70;
  int D.19619;
  const char[12] * D.22234;
  unsigned char D.22235;
  int D.22236;
  unsigned char D.22237;
  int D.22238;
  _Bool D.22239;
  _Bool D.22240;
  _Bool D.22241;
  const unsigned char * D.22244;
  unsigned char D.22245;
  int D.22246;
  const unsigned char * D.22247;
  unsigned char D.22248;
  int D.22249;
  _Bool D.22250;
  _Bool D.22251;
  const unsigned char * D.22254;
  unsigned char D.22255;
  int D.22256;
  const unsigned char * D.22257;
  unsigned char D.22258;
  int D.22259;
  _Bool D.22260;
  _Bool D.22261;
  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 char * D.22271;
  int D.19629;
  int iftmp.71;
  int D.19628;
  const char[7] * D.22277;
  unsigned char D.22278;
  int D.22279;
  unsigned char D.22280;
  int D.22281;
  _Bool D.22282;
  _Bool D.22283;
  _Bool D.22284;
  const unsigned char * D.22287;
  unsigned char D.22288;
  int D.22289;
  const unsigned char * D.22290;
  unsigned char D.22291;
  int D.22292;
  _Bool D.22293;
  _Bool D.22294;
  const unsigned char * D.22297;
  unsigned char D.22298;
  int D.22299;
  const unsigned char * D.22300;
  unsigned char D.22301;
  int D.22302;
  _Bool D.22303;
  _Bool D.22304;
  const unsigned char * D.22307;
  unsigned char D.22308;
  int D.22309;
  const unsigned char * D.22310;
  unsigned char D.22311;
  int D.22312;
  const char * D.22314;
  int D.19638;
  int iftmp.72;
  int D.19637;
  const char[9] * D.22320;
  unsigned char D.22321;
  int D.22322;
  unsigned char D.22323;
  int D.22324;
  _Bool D.22325;
  _Bool D.22326;
  _Bool D.22327;
  const unsigned char * D.22330;
  unsigned char D.22331;
  int D.22332;
  const unsigned char * D.22333;
  unsigned char D.22334;
  int D.22335;
  _Bool D.22336;
  _Bool D.22337;
  const unsigned char * D.22340;
  unsigned char D.22341;
  int D.22342;
  const unsigned char * D.22343;
  unsigned char D.22344;
  int D.22345;
  _Bool D.22346;
  _Bool D.22347;
  const unsigned char * D.22350;
  unsigned char D.22351;
  int D.22352;
  const unsigned char * D.22353;
  unsigned char D.22354;
  int D.22355;
  const char * D.22357;
  int D.19647;
  int iftmp.73;
  int D.19646;
  unsigned char D.22363;
  int D.22364;
  _Bool D.22365;
  _Bool D.22366;
  _Bool D.22367;
  const unsigned char * D.22370;
  unsigned char D.22371;
  int D.22372;
  _Bool D.22373;
  _Bool D.22374;
  const unsigned char * D.22377;
  unsigned char D.22378;
  int D.22379;
  _Bool D.22380;
  _Bool D.22381;
  const unsigned char * D.22384;
  unsigned char D.22385;
  int D.22386;
  int D.19656;
  int iftmp.74;
  int D.19655;
  const char[7] * D.22393;
  unsigned char D.22394;
  int D.22395;
  unsigned char D.22396;
  int D.22397;
  _Bool D.22398;
  _Bool D.22399;
  _Bool D.22400;
  const unsigned char * D.22403;
  unsigned char D.22404;
  int D.22405;
  const unsigned char * D.22406;
  unsigned char D.22407;
  int D.22408;
  _Bool D.22409;
  _Bool D.22410;
  const unsigned char * D.22413;
  unsigned char D.22414;
  int D.22415;
  const unsigned char * D.22416;
  unsigned char D.22417;
  int D.22418;
  _Bool D.22419;
  _Bool D.22420;
  const unsigned char * D.22423;
  unsigned char D.22424;
  int D.22425;
  const unsigned char * D.22426;
  unsigned char D.22427;
  int D.22428;
  int D.19665;
  int iftmp.75;
  int D.19664;
  const char[10] * D.22435;
  unsigned char D.22436;
  int D.22437;
  unsigned char D.22438;
  int D.22439;
  _Bool D.22440;
  _Bool D.22441;
  _Bool D.22442;
  const unsigned char * D.22445;
  unsigned char D.22446;
  int D.22447;
  const unsigned char * D.22448;
  unsigned char D.22449;
  int D.22450;
  _Bool D.22451;
  _Bool D.22452;
  const unsigned char * D.22455;
  unsigned char D.22456;
  int D.22457;
  const unsigned char * D.22458;
  unsigned char D.22459;
  int D.22460;
  _Bool D.22461;
  _Bool D.22462;
  const unsigned char * D.22465;
  unsigned char D.22466;
  int D.22467;
  const unsigned char * D.22468;
  unsigned char D.22469;
  int D.22470;
  int D.19674;
  int iftmp.76;
  int D.19673;
  const char[13] * D.22477;
  unsigned char D.22478;
  int D.22479;
  unsigned char D.22480;
  int D.22481;
  _Bool D.22482;
  _Bool D.22483;
  _Bool D.22484;
  const unsigned char * D.22487;
  unsigned char D.22488;
  int D.22489;
  const unsigned char * D.22490;
  unsigned char D.22491;
  int D.22492;
  _Bool D.22493;
  _Bool D.22494;
  const unsigned char * D.22497;
  unsigned char D.22498;
  int D.22499;
  const unsigned char * D.22500;
  unsigned char D.22501;
  int D.22502;
  _Bool D.22503;
  _Bool D.22504;
  const unsigned char * D.22507;
  unsigned char D.22508;
  int D.22509;
  const unsigned char * D.22510;
  unsigned char D.22511;
  int D.22512;
  int D.19683;
  int iftmp.77;
  int D.19682;
  const char[34] * D.22519;
  unsigned char D.22520;
  int D.22521;
  unsigned char D.22522;
  int D.22523;
  _Bool D.22524;
  _Bool D.22525;
  _Bool D.22526;
  const unsigned char * D.22529;
  unsigned char D.22530;
  int D.22531;
  const unsigned char * D.22532;
  unsigned char D.22533;
  int D.22534;
  _Bool D.22535;
  _Bool D.22536;
  const unsigned char * D.22539;
  unsigned char D.22540;
  int D.22541;
  const unsigned char * D.22542;
  unsigned char D.22543;
  int D.22544;
  _Bool D.22545;
  _Bool D.22546;
  const unsigned char * D.22549;
  unsigned char D.22550;
  int D.22551;
  const unsigned char * D.22552;
  unsigned char D.22553;
  int D.22554;
  int D.19692;
  int iftmp.78;
  int D.19691;
  const char[12] * D.22561;
  unsigned char D.22562;
  int D.22563;
  unsigned char D.22564;
  int D.22565;
  _Bool D.22566;
  _Bool D.22567;
  _Bool D.22568;
  const unsigned char * D.22571;
  unsigned char D.22572;
  int D.22573;
  const unsigned char * D.22574;
  unsigned char D.22575;
  int D.22576;
  _Bool D.22577;
  _Bool D.22578;
  const unsigned char * D.22581;
  unsigned char D.22582;
  int D.22583;
  const unsigned char * D.22584;
  unsigned char D.22585;
  int D.22586;
  _Bool D.22587;
  _Bool D.22588;
  const unsigned char * D.22591;
  unsigned char D.22592;
  int D.22593;
  const unsigned char * D.22594;
  unsigned char D.22595;
  int D.22596;
  int D.19701;
  int iftmp.79;
  int D.19700;
  unsigned char D.22603;
  int D.22604;
  _Bool D.22605;
  _Bool D.22606;
  _Bool D.22607;
  const unsigned char * D.22610;
  unsigned char D.22611;
  int D.22612;
  _Bool D.22613;
  _Bool D.22614;
  const unsigned char * D.22617;
  unsigned char D.22618;
  int D.22619;
  _Bool D.22620;
  _Bool D.22621;
  const unsigned char * D.22624;
  unsigned char D.22625;
  int D.22626;
  int D.19710;
  int iftmp.80;
  int D.19709;
  unsigned char D.22633;
  int D.22634;
  _Bool D.22635;
  _Bool D.22636;
  _Bool D.22637;
  const unsigned char * D.22640;
  unsigned char D.22641;
  int D.22642;
  _Bool D.22643;
  _Bool D.22644;
  const unsigned char * D.22647;
  unsigned char D.22648;
  int D.22649;
  _Bool D.22650;
  _Bool D.22651;
  const unsigned char * D.22654;
  unsigned char D.22655;
  int D.22656;
  int D.22660;
  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.22167 = o->vtable;
  D.22168 = D.22167->klass;
  D.22169 = mono_defaults.thread_class;
  if (D.22168 == D.22169) goto <D.22170>; else goto <D.22171>;
  <D.22170>:
  if (offset == 8) goto <D.22172>; else goto <D.22173>;
  <D.22172>:
  D.22174 = 1;
  return D.22174;
  <D.22173>:
  <D.22171>:
  D.22167 = o->vtable;
  D.22168 = D.22167->klass;
  D.22175 = mono_defaults.internal_thread_class;
  if (D.22168 == D.22175) goto <D.22176>; else goto <D.22177>;
  <D.22176>:
  if (offset == 68) goto <D.22178>; else goto <D.22179>;
  <D.22178>:
  D.22174 = 1;
  return D.22174;
  <D.22179>:
  <D.22177>:
  D.22180 = mono_defaults.real_proxy_class;
  D.22167 = o->vtable;
  D.22168 = D.22167->klass;
  D.22181 = mono_class_has_parent_fast (D.22168, D.22180);
  if (D.22181 != 0) goto <D.22182>; else goto <D.22183>;
  <D.22182>:
  if (offset == 16) goto <D.22184>; else goto <D.22185>;
  <D.22184>:
  D.22174 = 1;
  return D.22174;
  <D.22185>:
  <D.22183>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22189 = ref->vtable;
      D.22190 = D.22189->klass;
      __s2 = D.22190->name_space;
      D.22191 = "System.Globalization";
      D.22192 = MEM[(const unsigned char *)D.22191];
      D.22193 = (int) D.22192;
      D.22194 = *__s2;
      D.22195 = (int) D.22194;
      __result = D.22193 - D.22195;
      {
        D.22196 = __s2_len != 0;
        D.22197 = __result == 0;
        D.22198 = D.22196 & D.22197;
        if (D.22198 != 0) goto <D.22199>; else goto <D.22200>;
        <D.22199>:
        D.22201 = &MEM[(void *)"System.Globalization" + 1B];
        D.22202 = *D.22201;
        D.22203 = (int) D.22202;
        D.22204 = __s2 + 1;
        D.22205 = *D.22204;
        D.22206 = (int) D.22205;
        __result = D.22203 - D.22206;
        D.22207 = __s2_len > 1;
        D.22197 = __result == 0;
        D.22208 = D.22207 & D.22197;
        if (D.22208 != 0) goto <D.22209>; else goto <D.22210>;
        <D.22209>:
        D.22211 = &MEM[(void *)"System.Globalization" + 2B];
        D.22212 = *D.22211;
        D.22213 = (int) D.22212;
        D.22214 = __s2 + 2;
        D.22215 = *D.22214;
        D.22216 = (int) D.22215;
        __result = D.22213 - D.22216;
        D.22217 = __s2_len > 2;
        D.22197 = __result == 0;
        D.22218 = D.22217 & D.22197;
        if (D.22218 != 0) goto <D.22219>; else goto <D.22220>;
        <D.22219>:
        D.22221 = &MEM[(void *)"System.Globalization" + 3B];
        D.22222 = *D.22221;
        D.22223 = (int) D.22222;
        D.22224 = __s2 + 3;
        D.22225 = *D.22224;
        D.22226 = (int) D.22225;
        __result = D.22223 - D.22226;
        <D.22220>:
        <D.22210>:
        <D.22200>:
      }
      D.19610 = __result;
    }
    iftmp.69 = -D.19610;
    goto <D.22227>;
    <D.22188>:
    D.22189 = ref->vtable;
    D.22190 = D.22189->klass;
    D.22228 = D.22190->name_space;
    iftmp.69 = __builtin_strcmp (D.22228, "System.Globalization");
    <D.22227>:
    D.19611 = iftmp.69;
  }
  if (D.19611 == 0) goto <D.22229>; else goto <D.22230>;
  <D.22229>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22189 = ref->vtable;
      D.22190 = D.22189->klass;
      __s2 = D.22190->name;
      D.22234 = "CultureInfo";
      D.22235 = MEM[(const unsigned char *)D.22234];
      D.22236 = (int) D.22235;
      D.22237 = *__s2;
      D.22238 = (int) D.22237;
      __result = D.22236 - D.22238;
      {
        D.22239 = __s2_len != 0;
        D.22240 = __result == 0;
        D.22241 = D.22239 & D.22240;
        if (D.22241 != 0) goto <D.22242>; else goto <D.22243>;
        <D.22242>:
        D.22244 = &MEM[(void *)"CultureInfo" + 1B];
        D.22245 = *D.22244;
        D.22246 = (int) D.22245;
        D.22247 = __s2 + 1;
        D.22248 = *D.22247;
        D.22249 = (int) D.22248;
        __result = D.22246 - D.22249;
        D.22250 = __s2_len > 1;
        D.22240 = __result == 0;
        D.22251 = D.22250 & D.22240;
        if (D.22251 != 0) goto <D.22252>; else goto <D.22253>;
        <D.22252>:
        D.22254 = &MEM[(void *)"CultureInfo" + 2B];
        D.22255 = *D.22254;
        D.22256 = (int) D.22255;
        D.22257 = __s2 + 2;
        D.22258 = *D.22257;
        D.22259 = (int) D.22258;
        __result = D.22256 - D.22259;
        D.22260 = __s2_len > 2;
        D.22240 = __result == 0;
        D.22261 = D.22260 & D.22240;
        if (D.22261 != 0) goto <D.22262>; else goto <D.22263>;
        <D.22262>:
        D.22264 = &MEM[(void *)"CultureInfo" + 3B];
        D.22265 = *D.22264;
        D.22266 = (int) D.22265;
        D.22267 = __s2 + 3;
        D.22268 = *D.22267;
        D.22269 = (int) D.22268;
        __result = D.22266 - D.22269;
        <D.22263>:
        <D.22253>:
        <D.22243>:
      }
      D.19619 = __result;
    }
    iftmp.70 = -D.19619;
    goto <D.22270>;
    <D.22233>:
    D.22189 = ref->vtable;
    D.22190 = D.22189->klass;
    D.22271 = D.22190->name;
    iftmp.70 = __builtin_strcmp (D.22271, "CultureInfo");
    <D.22270>:
    D.19620 = iftmp.70;
  }
  if (D.19620 == 0) goto <D.22272>; else goto <D.22273>;
  <D.22272>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22167 = o->vtable;
      D.22168 = D.22167->klass;
      __s2 = D.22168->name_space;
      D.22277 = "System";
      D.22278 = MEM[(const unsigned char *)D.22277];
      D.22279 = (int) D.22278;
      D.22280 = *__s2;
      D.22281 = (int) D.22280;
      __result = D.22279 - D.22281;
      {
        D.22282 = __s2_len != 0;
        D.22283 = __result == 0;
        D.22284 = D.22282 & D.22283;
        if (D.22284 != 0) goto <D.22285>; else goto <D.22286>;
        <D.22285>:
        D.22287 = &MEM[(void *)"System" + 1B];
        D.22288 = *D.22287;
        D.22289 = (int) D.22288;
        D.22290 = __s2 + 1;
        D.22291 = *D.22290;
        D.22292 = (int) D.22291;
        __result = D.22289 - D.22292;
        D.22293 = __s2_len > 1;
        D.22283 = __result == 0;
        D.22294 = D.22293 & D.22283;
        if (D.22294 != 0) goto <D.22295>; else goto <D.22296>;
        <D.22295>:
        D.22297 = &MEM[(void *)"System" + 2B];
        D.22298 = *D.22297;
        D.22299 = (int) D.22298;
        D.22300 = __s2 + 2;
        D.22301 = *D.22300;
        D.22302 = (int) D.22301;
        __result = D.22299 - D.22302;
        D.22303 = __s2_len > 2;
        D.22283 = __result == 0;
        D.22304 = D.22303 & D.22283;
        if (D.22304 != 0) goto <D.22305>; else goto <D.22306>;
        <D.22305>:
        D.22307 = &MEM[(void *)"System" + 3B];
        D.22308 = *D.22307;
        D.22309 = (int) D.22308;
        D.22310 = __s2 + 3;
        D.22311 = *D.22310;
        D.22312 = (int) D.22311;
        __result = D.22309 - D.22312;
        <D.22306>:
        <D.22296>:
        <D.22286>:
      }
      D.19628 = __result;
    }
    iftmp.71 = -D.19628;
    goto <D.22313>;
    <D.22276>:
    D.22167 = o->vtable;
    D.22168 = D.22167->klass;
    D.22314 = D.22168->name_space;
    iftmp.71 = __builtin_strcmp (D.22314, "System");
    <D.22313>:
    D.19629 = iftmp.71;
  }
  if (D.19629 == 0) goto <D.22315>; else goto <D.22316>;
  <D.22315>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22167 = o->vtable;
      D.22168 = D.22167->klass;
      __s2 = D.22168->name;
      D.22320 = "Object[]";
      D.22321 = MEM[(const unsigned char *)D.22320];
      D.22322 = (int) D.22321;
      D.22323 = *__s2;
      D.22324 = (int) D.22323;
      __result = D.22322 - D.22324;
      {
        D.22325 = __s2_len != 0;
        D.22326 = __result == 0;
        D.22327 = D.22325 & D.22326;
        if (D.22327 != 0) goto <D.22328>; else goto <D.22329>;
        <D.22328>:
        D.22330 = &MEM[(void *)"Object[]" + 1B];
        D.22331 = *D.22330;
        D.22332 = (int) D.22331;
        D.22333 = __s2 + 1;
        D.22334 = *D.22333;
        D.22335 = (int) D.22334;
        __result = D.22332 - D.22335;
        D.22336 = __s2_len > 1;
        D.22326 = __result == 0;
        D.22337 = D.22336 & D.22326;
        if (D.22337 != 0) goto <D.22338>; else goto <D.22339>;
        <D.22338>:
        D.22340 = &MEM[(void *)"Object[]" + 2B];
        D.22341 = *D.22340;
        D.22342 = (int) D.22341;
        D.22343 = __s2 + 2;
        D.22344 = *D.22343;
        D.22345 = (int) D.22344;
        __result = D.22342 - D.22345;
        D.22346 = __s2_len > 2;
        D.22326 = __result == 0;
        D.22347 = D.22346 & D.22326;
        if (D.22347 != 0) goto <D.22348>; else goto <D.22349>;
        <D.22348>:
        D.22350 = &MEM[(void *)"Object[]" + 3B];
        D.22351 = *D.22350;
        D.22352 = (int) D.22351;
        D.22353 = __s2 + 3;
        D.22354 = *D.22353;
        D.22355 = (int) D.22354;
        __result = D.22352 - D.22355;
        <D.22349>:
        <D.22339>:
        <D.22329>:
      }
      D.19637 = __result;
    }
    iftmp.72 = -D.19637;
    goto <D.22356>;
    <D.22319>:
    D.22167 = o->vtable;
    D.22168 = D.22167->klass;
    D.22357 = D.22168->name;
    iftmp.72 = __builtin_strcmp (D.22357, "Object[]");
    <D.22356>:
    D.19638 = iftmp.72;
  }
  if (D.19638 == 0) goto <D.22358>; else goto <D.22359>;
  <D.22358>:
  D.22174 = 1;
  return D.22174;
  <D.22359>:
  <D.22316>:
  <D.22273>:
  <D.22230>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22189 = ref->vtable;
      D.22190 = D.22189->klass;
      __s2 = D.22190->name_space;
      D.22277 = "System";
      D.22278 = MEM[(const unsigned char *)D.22277];
      D.22279 = (int) D.22278;
      D.22363 = *__s2;
      D.22364 = (int) D.22363;
      __result = D.22279 - D.22364;
      {
        D.22365 = __s2_len != 0;
        D.22366 = __result == 0;
        D.22367 = D.22365 & D.22366;
        if (D.22367 != 0) goto <D.22368>; else goto <D.22369>;
        <D.22368>:
        D.22287 = &MEM[(void *)"System" + 1B];
        D.22288 = *D.22287;
        D.22289 = (int) D.22288;
        D.22370 = __s2 + 1;
        D.22371 = *D.22370;
        D.22372 = (int) D.22371;
        __result = D.22289 - D.22372;
        D.22373 = __s2_len > 1;
        D.22366 = __result == 0;
        D.22374 = D.22373 & D.22366;
        if (D.22374 != 0) goto <D.22375>; else goto <D.22376>;
        <D.22375>:
        D.22297 = &MEM[(void *)"System" + 2B];
        D.22298 = *D.22297;
        D.22299 = (int) D.22298;
        D.22377 = __s2 + 2;
        D.22378 = *D.22377;
        D.22379 = (int) D.22378;
        __result = D.22299 - D.22379;
        D.22380 = __s2_len > 2;
        D.22366 = __result == 0;
        D.22381 = D.22380 & D.22366;
        if (D.22381 != 0) goto <D.22382>; else goto <D.22383>;
        <D.22382>:
        D.22307 = &MEM[(void *)"System" + 3B];
        D.22308 = *D.22307;
        D.22309 = (int) D.22308;
        D.22384 = __s2 + 3;
        D.22385 = *D.22384;
        D.22386 = (int) D.22385;
        __result = D.22309 - D.22386;
        <D.22383>:
        <D.22376>:
        <D.22369>:
      }
      D.19646 = __result;
    }
    iftmp.73 = -D.19646;
    goto <D.22387>;
    <D.22362>:
    D.22189 = ref->vtable;
    D.22190 = D.22189->klass;
    D.22228 = D.22190->name_space;
    iftmp.73 = __builtin_strcmp (D.22228, "System");
    <D.22387>:
    D.19647 = iftmp.73;
  }
  if (D.19647 == 0) goto <D.22388>; else goto <D.22389>;
  <D.22388>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22189 = ref->vtable;
      D.22190 = D.22189->klass;
      __s2 = D.22190->name;
      D.22393 = "Byte[]";
      D.22394 = MEM[(const unsigned char *)D.22393];
      D.22395 = (int) D.22394;
      D.22396 = *__s2;
      D.22397 = (int) D.22396;
      __result = D.22395 - D.22397;
      {
        D.22398 = __s2_len != 0;
        D.22399 = __result == 0;
        D.22400 = D.22398 & D.22399;
        if (D.22400 != 0) goto <D.22401>; else goto <D.22402>;
        <D.22401>:
        D.22403 = &MEM[(void *)"Byte[]" + 1B];
        D.22404 = *D.22403;
        D.22405 = (int) D.22404;
        D.22406 = __s2 + 1;
        D.22407 = *D.22406;
        D.22408 = (int) D.22407;
        __result = D.22405 - D.22408;
        D.22409 = __s2_len > 1;
        D.22399 = __result == 0;
        D.22410 = D.22409 & D.22399;
        if (D.22410 != 0) goto <D.22411>; else goto <D.22412>;
        <D.22411>:
        D.22413 = &MEM[(void *)"Byte[]" + 2B];
        D.22414 = *D.22413;
        D.22415 = (int) D.22414;
        D.22416 = __s2 + 2;
        D.22417 = *D.22416;
        D.22418 = (int) D.22417;
        __result = D.22415 - D.22418;
        D.22419 = __s2_len > 2;
        D.22399 = __result == 0;
        D.22420 = D.22419 & D.22399;
        if (D.22420 != 0) goto <D.22421>; else goto <D.22422>;
        <D.22421>:
        D.22423 = &MEM[(void *)"Byte[]" + 3B];
        D.22424 = *D.22423;
        D.22425 = (int) D.22424;
        D.22426 = __s2 + 3;
        D.22427 = *D.22426;
        D.22428 = (int) D.22427;
        __result = D.22425 - D.22428;
        <D.22422>:
        <D.22412>:
        <D.22402>:
      }
      D.19655 = __result;
    }
    iftmp.74 = -D.19655;
    goto <D.22429>;
    <D.22392>:
    D.22189 = ref->vtable;
    D.22190 = D.22189->klass;
    D.22271 = D.22190->name;
    iftmp.74 = __builtin_strcmp (D.22271, "Byte[]");
    <D.22429>:
    D.19656 = iftmp.74;
  }
  if (D.19656 == 0) goto <D.22430>; else goto <D.22431>;
  <D.22430>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22167 = o->vtable;
      D.22168 = D.22167->klass;
      __s2 = D.22168->name_space;
      D.22435 = "System.IO";
      D.22436 = MEM[(const unsigned char *)D.22435];
      D.22437 = (int) D.22436;
      D.22438 = *__s2;
      D.22439 = (int) D.22438;
      __result = D.22437 - D.22439;
      {
        D.22440 = __s2_len != 0;
        D.22441 = __result == 0;
        D.22442 = D.22440 & D.22441;
        if (D.22442 != 0) goto <D.22443>; else goto <D.22444>;
        <D.22443>:
        D.22445 = &MEM[(void *)"System.IO" + 1B];
        D.22446 = *D.22445;
        D.22447 = (int) D.22446;
        D.22448 = __s2 + 1;
        D.22449 = *D.22448;
        D.22450 = (int) D.22449;
        __result = D.22447 - D.22450;
        D.22451 = __s2_len > 1;
        D.22441 = __result == 0;
        D.22452 = D.22451 & D.22441;
        if (D.22452 != 0) goto <D.22453>; else goto <D.22454>;
        <D.22453>:
        D.22455 = &MEM[(void *)"System.IO" + 2B];
        D.22456 = *D.22455;
        D.22457 = (int) D.22456;
        D.22458 = __s2 + 2;
        D.22459 = *D.22458;
        D.22460 = (int) D.22459;
        __result = D.22457 - D.22460;
        D.22461 = __s2_len > 2;
        D.22441 = __result == 0;
        D.22462 = D.22461 & D.22441;
        if (D.22462 != 0) goto <D.22463>; else goto <D.22464>;
        <D.22463>:
        D.22465 = &MEM[(void *)"System.IO" + 3B];
        D.22466 = *D.22465;
        D.22467 = (int) D.22466;
        D.22468 = __s2 + 3;
        D.22469 = *D.22468;
        D.22470 = (int) D.22469;
        __result = D.22467 - D.22470;
        <D.22464>:
        <D.22454>:
        <D.22444>:
      }
      D.19664 = __result;
    }
    iftmp.75 = -D.19664;
    goto <D.22471>;
    <D.22434>:
    D.22167 = o->vtable;
    D.22168 = D.22167->klass;
    D.22314 = D.22168->name_space;
    iftmp.75 = __builtin_strcmp (D.22314, "System.IO");
    <D.22471>:
    D.19665 = iftmp.75;
  }
  if (D.19665 == 0) goto <D.22472>; else goto <D.22473>;
  <D.22472>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22167 = o->vtable;
      D.22168 = D.22167->klass;
      __s2 = D.22168->name;
      D.22477 = "MemoryStream";
      D.22478 = MEM[(const unsigned char *)D.22477];
      D.22479 = (int) D.22478;
      D.22480 = *__s2;
      D.22481 = (int) D.22480;
      __result = D.22479 - D.22481;
      {
        D.22482 = __s2_len != 0;
        D.22483 = __result == 0;
        D.22484 = D.22482 & D.22483;
        if (D.22484 != 0) goto <D.22485>; else goto <D.22486>;
        <D.22485>:
        D.22487 = &MEM[(void *)"MemoryStream" + 1B];
        D.22488 = *D.22487;
        D.22489 = (int) D.22488;
        D.22490 = __s2 + 1;
        D.22491 = *D.22490;
        D.22492 = (int) D.22491;
        __result = D.22489 - D.22492;
        D.22493 = __s2_len > 1;
        D.22483 = __result == 0;
        D.22494 = D.22493 & D.22483;
        if (D.22494 != 0) goto <D.22495>; else goto <D.22496>;
        <D.22495>:
        D.22497 = &MEM[(void *)"MemoryStream" + 2B];
        D.22498 = *D.22497;
        D.22499 = (int) D.22498;
        D.22500 = __s2 + 2;
        D.22501 = *D.22500;
        D.22502 = (int) D.22501;
        __result = D.22499 - D.22502;
        D.22503 = __s2_len > 2;
        D.22483 = __result == 0;
        D.22504 = D.22503 & D.22483;
        if (D.22504 != 0) goto <D.22505>; else goto <D.22506>;
        <D.22505>:
        D.22507 = &MEM[(void *)"MemoryStream" + 3B];
        D.22508 = *D.22507;
        D.22509 = (int) D.22508;
        D.22510 = __s2 + 3;
        D.22511 = *D.22510;
        D.22512 = (int) D.22511;
        __result = D.22509 - D.22512;
        <D.22506>:
        <D.22496>:
        <D.22486>:
      }
      D.19673 = __result;
    }
    iftmp.76 = -D.19673;
    goto <D.22513>;
    <D.22476>:
    D.22167 = o->vtable;
    D.22168 = D.22167->klass;
    D.22357 = D.22168->name;
    iftmp.76 = __builtin_strcmp (D.22357, "MemoryStream");
    <D.22513>:
    D.19674 = iftmp.76;
  }
  if (D.19674 == 0) goto <D.22514>; else goto <D.22515>;
  <D.22514>:
  D.22174 = 1;
  return D.22174;
  <D.22515>:
  <D.22473>:
  <D.22431>:
  <D.22389>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22189 = ref->vtable;
      D.22190 = D.22189->klass;
      __s2 = D.22190->name_space;
      D.22519 = "System.Runtime.Remoting.Messaging";
      D.22520 = MEM[(const unsigned char *)D.22519];
      D.22521 = (int) D.22520;
      D.22522 = *__s2;
      D.22523 = (int) D.22522;
      __result = D.22521 - D.22523;
      {
        D.22524 = __s2_len != 0;
        D.22525 = __result == 0;
        D.22526 = D.22524 & D.22525;
        if (D.22526 != 0) goto <D.22527>; else goto <D.22528>;
        <D.22527>:
        D.22529 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 1B];
        D.22530 = *D.22529;
        D.22531 = (int) D.22530;
        D.22532 = __s2 + 1;
        D.22533 = *D.22532;
        D.22534 = (int) D.22533;
        __result = D.22531 - D.22534;
        D.22535 = __s2_len > 1;
        D.22525 = __result == 0;
        D.22536 = D.22535 & D.22525;
        if (D.22536 != 0) goto <D.22537>; else goto <D.22538>;
        <D.22537>:
        D.22539 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 2B];
        D.22540 = *D.22539;
        D.22541 = (int) D.22540;
        D.22542 = __s2 + 2;
        D.22543 = *D.22542;
        D.22544 = (int) D.22543;
        __result = D.22541 - D.22544;
        D.22545 = __s2_len > 2;
        D.22525 = __result == 0;
        D.22546 = D.22545 & D.22525;
        if (D.22546 != 0) goto <D.22547>; else goto <D.22548>;
        <D.22547>:
        D.22549 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 3B];
        D.22550 = *D.22549;
        D.22551 = (int) D.22550;
        D.22552 = __s2 + 3;
        D.22553 = *D.22552;
        D.22554 = (int) D.22553;
        __result = D.22551 - D.22554;
        <D.22548>:
        <D.22538>:
        <D.22528>:
      }
      D.19682 = __result;
    }
    iftmp.77 = -D.19682;
    goto <D.22555>;
    <D.22518>:
    D.22189 = ref->vtable;
    D.22190 = D.22189->klass;
    D.22228 = D.22190->name_space;
    iftmp.77 = __builtin_strcmp (D.22228, "System.Runtime.Remoting.Messaging");
    <D.22555>:
    D.19683 = iftmp.77;
  }
  if (D.19683 == 0) goto <D.22556>; else goto <D.22557>;
  <D.22556>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22189 = ref->vtable;
      D.22190 = D.22189->klass;
      __s2 = D.22190->name;
      D.22561 = "AsyncResult";
      D.22562 = MEM[(const unsigned char *)D.22561];
      D.22563 = (int) D.22562;
      D.22564 = *__s2;
      D.22565 = (int) D.22564;
      __result = D.22563 - D.22565;
      {
        D.22566 = __s2_len != 0;
        D.22567 = __result == 0;
        D.22568 = D.22566 & D.22567;
        if (D.22568 != 0) goto <D.22569>; else goto <D.22570>;
        <D.22569>:
        D.22571 = &MEM[(void *)"AsyncResult" + 1B];
        D.22572 = *D.22571;
        D.22573 = (int) D.22572;
        D.22574 = __s2 + 1;
        D.22575 = *D.22574;
        D.22576 = (int) D.22575;
        __result = D.22573 - D.22576;
        D.22577 = __s2_len > 1;
        D.22567 = __result == 0;
        D.22578 = D.22577 & D.22567;
        if (D.22578 != 0) goto <D.22579>; else goto <D.22580>;
        <D.22579>:
        D.22581 = &MEM[(void *)"AsyncResult" + 2B];
        D.22582 = *D.22581;
        D.22583 = (int) D.22582;
        D.22584 = __s2 + 2;
        D.22585 = *D.22584;
        D.22586 = (int) D.22585;
        __result = D.22583 - D.22586;
        D.22587 = __s2_len > 2;
        D.22567 = __result == 0;
        D.22588 = D.22587 & D.22567;
        if (D.22588 != 0) goto <D.22589>; else goto <D.22590>;
        <D.22589>:
        D.22591 = &MEM[(void *)"AsyncResult" + 3B];
        D.22592 = *D.22591;
        D.22593 = (int) D.22592;
        D.22594 = __s2 + 3;
        D.22595 = *D.22594;
        D.22596 = (int) D.22595;
        __result = D.22593 - D.22596;
        <D.22590>:
        <D.22580>:
        <D.22570>:
      }
      D.19691 = __result;
    }
    iftmp.78 = -D.19691;
    goto <D.22597>;
    <D.22560>:
    D.22189 = ref->vtable;
    D.22190 = D.22189->klass;
    D.22271 = D.22190->name;
    iftmp.78 = __builtin_strcmp (D.22271, "AsyncResult");
    <D.22597>:
    D.19692 = iftmp.78;
  }
  if (D.19692 == 0) goto <D.22598>; else goto <D.22599>;
  <D.22598>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22167 = o->vtable;
      D.22168 = D.22167->klass;
      __s2 = D.22168->name_space;
      D.22277 = "System";
      D.22278 = MEM[(const unsigned char *)D.22277];
      D.22279 = (int) D.22278;
      D.22603 = *__s2;
      D.22604 = (int) D.22603;
      __result = D.22279 - D.22604;
      {
        D.22605 = __s2_len != 0;
        D.22606 = __result == 0;
        D.22607 = D.22605 & D.22606;
        if (D.22607 != 0) goto <D.22608>; else goto <D.22609>;
        <D.22608>:
        D.22287 = &MEM[(void *)"System" + 1B];
        D.22288 = *D.22287;
        D.22289 = (int) D.22288;
        D.22610 = __s2 + 1;
        D.22611 = *D.22610;
        D.22612 = (int) D.22611;
        __result = D.22289 - D.22612;
        D.22613 = __s2_len > 1;
        D.22606 = __result == 0;
        D.22614 = D.22613 & D.22606;
        if (D.22614 != 0) goto <D.22615>; else goto <D.22616>;
        <D.22615>:
        D.22297 = &MEM[(void *)"System" + 2B];
        D.22298 = *D.22297;
        D.22299 = (int) D.22298;
        D.22617 = __s2 + 2;
        D.22618 = *D.22617;
        D.22619 = (int) D.22618;
        __result = D.22299 - D.22619;
        D.22620 = __s2_len > 2;
        D.22606 = __result == 0;
        D.22621 = D.22620 & D.22606;
        if (D.22621 != 0) goto <D.22622>; else goto <D.22623>;
        <D.22622>:
        D.22307 = &MEM[(void *)"System" + 3B];
        D.22308 = *D.22307;
        D.22309 = (int) D.22308;
        D.22624 = __s2 + 3;
        D.22625 = *D.22624;
        D.22626 = (int) D.22625;
        __result = D.22309 - D.22626;
        <D.22623>:
        <D.22616>:
        <D.22609>:
      }
      D.19700 = __result;
    }
    iftmp.79 = -D.19700;
    goto <D.22627>;
    <D.22602>:
    D.22167 = o->vtable;
    D.22168 = D.22167->klass;
    D.22314 = D.22168->name_space;
    iftmp.79 = __builtin_strcmp (D.22314, "System");
    <D.22627>:
    D.19701 = iftmp.79;
  }
  if (D.19701 == 0) goto <D.22628>; else goto <D.22629>;
  <D.22628>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.22167 = o->vtable;
      D.22168 = D.22167->klass;
      __s2 = D.22168->name;
      D.22320 = "Object[]";
      D.22321 = MEM[(const unsigned char *)D.22320];
      D.22322 = (int) D.22321;
      D.22633 = *__s2;
      D.22634 = (int) D.22633;
      __result = D.22322 - D.22634;
      {
        D.22635 = __s2_len != 0;
        D.22636 = __result == 0;
        D.22637 = D.22635 & D.22636;
        if (D.22637 != 0) goto <D.22638>; else goto <D.22639>;
        <D.22638>:
        D.22330 = &MEM[(void *)"Object[]" + 1B];
        D.22331 = *D.22330;
        D.22332 = (int) D.22331;
        D.22640 = __s2 + 1;
        D.22641 = *D.22640;
        D.22642 = (int) D.22641;
        __result = D.22332 - D.22642;
        D.22643 = __s2_len > 1;
        D.22636 = __result == 0;
        D.22644 = D.22643 & D.22636;
        if (D.22644 != 0) goto <D.22645>; else goto <D.22646>;
        <D.22645>:
        D.22340 = &MEM[(void *)"Object[]" + 2B];
        D.22341 = *D.22340;
        D.22342 = (int) D.22341;
        D.22647 = __s2 + 2;
        D.22648 = *D.22647;
        D.22649 = (int) D.22648;
        __result = D.22342 - D.22649;
        D.22650 = __s2_len > 2;
        D.22636 = __result == 0;
        D.22651 = D.22650 & D.22636;
        if (D.22651 != 0) goto <D.22652>; else goto <D.22653>;
        <D.22652>:
        D.22350 = &MEM[(void *)"Object[]" + 3B];
        D.22351 = *D.22350;
        D.22352 = (int) D.22351;
        D.22654 = __s2 + 3;
        D.22655 = *D.22654;
        D.22656 = (int) D.22655;
        __result = D.22352 - D.22656;
        <D.22653>:
        <D.22646>:
        <D.22639>:
      }
      D.19709 = __result;
    }
    iftmp.80 = -D.19709;
    goto <D.22657>;
    <D.22632>:
    D.22167 = o->vtable;
    D.22168 = D.22167->klass;
    D.22357 = D.22168->name;
    iftmp.80 = __builtin_strcmp (D.22357, "Object[]");
    <D.22657>:
    D.19710 = iftmp.80;
  }
  if (D.19710 == 0) goto <D.22658>; else goto <D.22659>;
  <D.22658>:
  D.22660 = mono_thread_pool_is_queue_array (o);
  if (D.22660 != 0) goto <D.22661>; else goto <D.22662>;
  <D.22661>:
  D.22174 = 1;
  return D.22174;
  <D.22662>:
  <D.22659>:
  <D.22629>:
  <D.22599>:
  <D.22557>:
  D.22174 = 0;
  return D.22174;
}


mono_class_has_parent_fast (struct MonoClass * klass, struct MonoClass * parent)
{
  gboolean D.22664;
  int iftmp.81;
  short unsigned int D.22668;
  short unsigned int D.22669;
  struct MonoClass * * D.22671;
  sizetype D.22672;
  sizetype D.22673;
  sizetype D.22674;
  struct MonoClass * * D.22675;
  struct MonoClass * D.22676;

  D.22668 = klass->idepth;
  D.22669 = parent->idepth;
  if (D.22668 >= D.22669) goto <D.22670>; else goto <D.22666>;
  <D.22670>:
  D.22671 = klass->supertypes;
  D.22669 = parent->idepth;
  D.22672 = (sizetype) D.22669;
  D.22673 = D.22672 + 1073741823;
  D.22674 = D.22673 * 4;
  D.22675 = D.22671 + D.22674;
  D.22676 = *D.22675;
  if (D.22676 == parent) goto <D.22677>; else goto <D.22666>;
  <D.22677>:
  iftmp.81 = 1;
  goto <D.22667>;
  <D.22666>:
  iftmp.81 = 0;
  <D.22667>:
  D.22664 = iftmp.81;
  return D.22664;
}


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

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

    object = current->array;
    if (object != 0B) goto <D.22681>; else goto <D.22679>;
    <D.22681>:
    D.22682 = object->vtable;
    if (D.22682 == 0B) goto <D.22683>; else goto <D.22679>;
    <D.22683>:
    {
      struct EphemeronLinkNode * tmp;

      tmp = current;
      if (prev != 0B) goto <D.22684>; else goto <D.22685>;
      <D.22684>:
      ephemeron_list.82 = current->next;
      prev->next = ephemeron_list.82;
      goto <D.22687>;
      <D.22685>:
      ephemeron_list.82 = current->next;
      ephemeron_list = ephemeron_list.82;
      <D.22687>:
      current = current->next;
      sgen_free_internal (tmp, 18);
    }
    goto <D.22680>;
    <D.22679>:
    prev = current;
    current = current->next;
    <D.22680>:
  }
  <D.20782>:
  if (current != 0B) goto <D.20781>; else goto <D.20783>;
  <D.20783>:
}


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

  process_object_for_domain_clearing (obj, domain);
  remove = need_remove_object_for_domain (obj, domain);
  if (remove != 0) goto <D.22688>; else goto <D.22689>;
  <D.22688>:
  D.22690 = MEM[(struct MonoObject *)obj].synchronisation;
  if (D.22690 != 0B) goto <D.22691>; else goto <D.22692>;
  <D.22691>:
  {
    void * * dislink;

    dislink = mono_monitor_get_object_monitor_weak_link (obj);
    if (dislink != 0B) goto <D.22693>; else goto <D.22694>;
    <D.22693>:
    sgen_register_disappearing_link (0B, dislink, 0, 1);
    <D.22694>:
  }
  <D.22692>:
  <D.22689>:
  D.22695 = remove;
  return D.22695;
}


process_object_for_domain_clearing (char * start, struct MonoDomain * domain)
{
  unsigned int D.22697;
  unsigned int D.22698;
  struct MonoClass * D.22699;
  struct MonoClass * D.22700;
  struct MonoVTable * D.22703;
  struct MonoDomain * D.22704;
  struct MonoDomain * D.22705;
  _Bool D.22706;
  long int D.22707;
  long int D.22708;
  struct MonoClass * D.22711;
  int D.22712;
  unsigned int D.22719;
  unsigned int D.22720;
  struct MonoVTable * D.22722;
  struct MonoDomain * D.22723;
  struct FILE * gc_debug_file.83;
  struct GCVTable * vt;

  D.22697 = MEM[(mword *)start];
  D.22698 = D.22697 & 4294967292;
  vt = (struct GCVTable *) D.22698;
  D.22699 = vt->klass;
  D.22700 = mono_defaults.internal_thread_class;
  if (D.22699 == D.22700) goto <D.22701>; else goto <D.22702>;
  <D.22701>:
  D.22703 = MEM[(struct MonoObject *)start].vtable;
  D.22704 = D.22703->domain;
  D.22705 = mono_get_root_domain ();
  D.22706 = D.22704 != D.22705;
  D.22707 = (long int) D.22706;
  D.22708 = __builtin_expect (D.22707, 0);
  if (D.22708 != 0) goto <D.22709>; else goto <D.22710>;
  <D.22709>:
  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.22710>:
  <D.22702>:
  D.22711 = mono_defaults.real_proxy_class;
  D.22699 = vt->klass;
  D.22712 = mono_class_has_parent_fast (D.22699, D.22711);
  if (D.22712 != 0) goto <D.22713>; else goto <D.22714>;
  <D.22713>:
  {
    struct MonoObject * server;

    server = MEM[(struct MonoRealProxy *)start].unwrapped_server;
    if (server != 0B) goto <D.22717>; else goto <D.22718>;
    <D.22717>:
    D.22719 = MEM[(mword *)server];
    D.22720 = D.22719 & 4294967292;
    if (D.22720 == 0) goto <D.22715>; else goto <D.22721>;
    <D.22721>:
    D.22722 = server->vtable;
    D.22723 = D.22722->domain;
    if (D.22723 == domain) goto <D.22715>; else goto <D.22716>;
    <D.22715>:
    if (0 != 0) goto <D.22724>; else goto <D.22725>;
    <D.22724>:
    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.22725>:
    MEM[(struct MonoRealProxy *)start].unwrapped_server = 0B;
    <D.22716>:
    <D.22718>:
  }
  <D.22714>:
}


need_remove_object_for_domain (char * start, struct MonoDomain * domain)
{
  struct MonoVTable * D.22727;
  struct MonoDomain * D.22728;
  struct FILE * gc_debug_file.84;
  gboolean D.22734;

  D.22727 = MEM[(struct MonoObject *)start].vtable;
  D.22728 = D.22727->domain;
  if (D.22728 == domain) goto <D.22729>; else goto <D.22730>;
  <D.22729>:
  if (0 != 0) goto <D.22731>; else goto <D.22732>;
  <D.22731>:
  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.22732>:
  D.22734 = 1;
  return D.22734;
  <D.22730>:
  D.22734 = 0;
  return D.22734;
}


sgen_add_to_global_remset (void * ptr, void * obj)
{
  int D.22736;
  _Bool D.22737;
  long int D.22738;
  long int D.22739;
  int D.22742;
  int current_collection_generation.85;
  _Bool D.22746;
  long int D.22747;
  long int D.22748;
  int D.22754;
  _Bool D.22755;
  long int D.22756;
  long int D.22757;
  unsigned int D.22760;
  unsigned int D.22761;
  int iftmp.86;
  int D.22767;
  int D.22769;
  _Bool D.22771;
  long int D.22772;
  long int D.22773;
  int D.22777;
  void (*<T112f>) (void *) D.22780;
  int do_pin_stats.87;
  _Bool D.22782;
  long int D.22783;
  long int D.22784;
  struct FILE * gc_debug_file.88;

  D.22736 = sgen_ptr_in_nursery (obj);
  D.22737 = D.22736 == 0;
  D.22738 = (long int) D.22737;
  D.22739 = __builtin_expect (D.22738, 0);
  if (D.22739 != 0) goto <D.22740>; else goto <D.22741>;
  <D.22740>:
  monoeg_g_log (0B, 4, "Target pointer of global remset must be in the nursery");
  <D.20122>:
  goto <D.20122>;
  <D.22741>:
  D.22742 = major_collector.is_concurrent;
  if (D.22742 == 0) goto <D.22743>; else goto <D.22744>;
  <D.22743>:
  current_collection_generation.85 = current_collection_generation;
  D.22746 = current_collection_generation.85 == -1;
  D.22747 = (long int) D.22746;
  D.22748 = __builtin_expect (D.22747, 0);
  if (D.22748 != 0) goto <D.22749>; else goto <D.22750>;
  <D.22749>:
  monoeg_g_log (0B, 4, "Global remsets can only be added during collections");
  <D.20123>:
  goto <D.20123>;
  <D.22750>:
  goto <D.22751>;
  <D.22744>:
  current_collection_generation.85 = current_collection_generation;
  if (current_collection_generation.85 == -1) goto <D.22752>; else goto <D.22753>;
  <D.22752>:
  D.22754 = sgen_concurrent_collection_in_progress ();
  D.22755 = D.22754 == 0;
  D.22756 = (long int) D.22755;
  D.22757 = __builtin_expect (D.22756, 0);
  if (D.22757 != 0) goto <D.22758>; else goto <D.22759>;
  <D.22758>:
  monoeg_g_log (0B, 4, "Global remsets outside of collection pauses can only be added by the concurrent collector");
  <D.20124>:
  goto <D.20124>;
  <D.22759>:
  <D.22753>:
  <D.22751>:
  D.22760 = MEM[(mword *)obj];
  D.22761 = D.22760 & 2;
  if (D.22761 == 0) goto <D.22762>; else goto <D.22763>;
  <D.22762>:
  D.22767 = sgen_minor_collector.is_split;
  if (D.22767 == 0) goto <D.22768>; else goto <D.22765>;
  <D.22768>:
  D.22769 = sgen_concurrent_collection_in_progress ();
  if (D.22769 == 0) goto <D.22770>; else goto <D.22765>;
  <D.22770>:
  iftmp.86 = 1;
  goto <D.22766>;
  <D.22765>:
  iftmp.86 = 0;
  <D.22766>:
  D.22771 = iftmp.86 != 0;
  D.22772 = (long int) D.22771;
  D.22773 = __builtin_expect (D.22772, 0);
  if (D.22773 != 0) goto <D.22774>; else goto <D.22775>;
  <D.22774>:
  monoeg_g_log (0B, 4, "Non-pinned objects can only remain in nursery if it is a split nursery");
  <D.20125>:
  goto <D.20125>;
  <D.22775>:
  goto <D.22776>;
  <D.22763>:
  D.22777 = sgen_cement_lookup_or_register (obj);
  if (D.22777 != 0) goto <D.22778>; else goto <D.22779>;
  <D.22778>:
  return;
  <D.22779>:
  <D.22776>:
  D.22780 = remset.record_pointer;
  D.22780 (ptr);
  do_pin_stats.87 = do_pin_stats;
  D.22782 = do_pin_stats.87 != 0;
  D.22783 = (long int) D.22782;
  D.22784 = __builtin_expect (D.22783, 0);
  if (D.22784 != 0) goto <D.22785>; else goto <D.22786>;
  <D.22785>:
  sgen_pin_stats_register_global_remset (obj);
  <D.22786>:
  if (0 != 0) goto <D.22787>; else goto <D.22788>;
  <D.22787>:
  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.22788>:
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.22791;
  int sgen_nursery_bits.89;
  int D.22793;
  int D.22794;
  unsigned int D.22795;
  unsigned int p.90;
  unsigned int D.22797;
  char * sgen_nursery_start.91;
  unsigned int sgen_nursery_start.92;
  _Bool D.22800;

  sgen_nursery_bits.89 = sgen_nursery_bits;
  D.22793 = 1 << sgen_nursery_bits.89;
  D.22794 = -D.22793;
  D.22795 = (unsigned int) D.22794;
  p.90 = (unsigned int) p;
  D.22797 = D.22795 & p.90;
  sgen_nursery_start.91 = sgen_nursery_start;
  sgen_nursery_start.92 = (unsigned int) sgen_nursery_start.91;
  D.22800 = D.22797 == sgen_nursery_start.92;
  D.22791 = (gboolean) D.22800;
  return D.22791;
}


sgen_drain_gray_stack (int max_objs, struct ScanCopyContext ctx)
{
  struct GrayQueueSection * D.22804;
  int D.22808;
  _Bool D.22809;
  long int D.22810;
  long int D.22811;
  int D.22815;
  gboolean D.22818;
  const char * D.22821;
  struct FILE * gc_debug_file.93;
  const char * D.22833;
  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.22802>; else goto <D.22803>;
  <D.22802>:
  <D.20133>:
  D.22804 = queue->first;
  if (D.22804 == 0B) goto <D.22805>; else goto <D.22806>;
  <D.22805>:
  obj = 0B;
  goto <D.22807>;
  <D.22806>:
  D.22804 = queue->first;
  D.22808 = D.22804->end;
  D.22809 = D.22808 == 1;
  D.22810 = (long int) D.22809;
  D.22811 = __builtin_expect (D.22810, 0);
  if (D.22811 != 0) goto <D.22812>; else goto <D.22813>;
  <D.22812>:
  obj = sgen_gray_object_dequeue (queue);
  goto <D.22814>;
  <D.22813>:
  D.22804 = queue->first;
  D.22804 = queue->first;
  D.22808 = D.22804->end;
  D.22815 = D.22808 + -1;
  D.22804->end = D.22815;
  D.22808 = D.22804->end;
  obj = D.22804->objects[D.22808];
  <D.22814>:
  <D.22807>:
  if (obj == 0B) goto <D.22816>; else goto <D.22817>;
  <D.22816>:
  D.22818 = 1;
  return D.22818;
  <D.22817>:
  if (0 != 0) goto <D.22819>; else goto <D.22820>;
  <D.22819>:
  D.22821 = safe_name (obj);
  gc_debug_file.93 = gc_debug_file;
  fprintf (gc_debug_file.93, "Precise gray object scan %p (%s)\n", obj, D.22821);
  gc_debug_file.93 = gc_debug_file;
  fflush (gc_debug_file.93);
  <D.22820>:
  scan_func (obj, queue);
  goto <D.20133>;
  <D.22803>:
  {
    int i;

    <D.20138>:
    i = 0;
    goto <D.20136>;
    <D.20135>:
    D.22804 = queue->first;
    if (D.22804 == 0B) goto <D.22823>; else goto <D.22824>;
    <D.22823>:
    obj = 0B;
    goto <D.22825>;
    <D.22824>:
    D.22804 = queue->first;
    D.22808 = D.22804->end;
    D.22809 = D.22808 == 1;
    D.22810 = (long int) D.22809;
    D.22811 = __builtin_expect (D.22810, 0);
    if (D.22811 != 0) goto <D.22826>; else goto <D.22827>;
    <D.22826>:
    obj = sgen_gray_object_dequeue (queue);
    goto <D.22828>;
    <D.22827>:
    D.22804 = queue->first;
    D.22804 = queue->first;
    D.22808 = D.22804->end;
    D.22815 = D.22808 + -1;
    D.22804->end = D.22815;
    D.22808 = D.22804->end;
    obj = D.22804->objects[D.22808];
    <D.22828>:
    <D.22825>:
    if (obj == 0B) goto <D.22829>; else goto <D.22830>;
    <D.22829>:
    D.22818 = 1;
    return D.22818;
    <D.22830>:
    if (0 != 0) goto <D.22831>; else goto <D.22832>;
    <D.22831>:
    D.22833 = safe_name (obj);
    gc_debug_file.93 = gc_debug_file;
    fprintf (gc_debug_file.93, "Precise gray object scan %p (%s)\n", obj, D.22833);
    gc_debug_file.93 = gc_debug_file;
    fflush (gc_debug_file.93);
    <D.22832>:
    scan_func (obj, queue);
    i = i + 1;
    <D.20136>:
    if (i != max_objs) goto <D.20135>; else goto <D.20137>;
    <D.20137>:
    if (max_objs < 0) goto <D.20138>; else goto <D.20139>;
    <D.20139>:
    D.22818 = 0;
    return D.22818;
  }
}


sgen_pin_objects_in_section (struct GCMemSection * section, struct ScanCopyContext ctx)
{
  char * D.22837;
  char * D.22838;
  unsigned int num_entries.94;
  unsigned int D.22840;
  void * * D.22841;
  int num_entries;

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

    start = section->pin_queue_start;
    D.22837 = section->next_data;
    D.22838 = section->data;
    num_entries.94 = (unsigned int) num_entries;
    D.22840 = num_entries.94 * 4;
    D.22841 = start + D.22840;
    reduced_to = pin_objects_from_addresses (section, start, D.22841, D.22838, D.22837, ctx);
    section->pin_queue_num_entries = reduced_to;
    if (reduced_to == 0) goto <D.22842>; else goto <D.22843>;
    <D.22842>:
    section->pin_queue_start = 0B;
    <D.22843>:
  }
  <D.22836>:
}


pin_objects_from_addresses (struct GCMemSection * section, void * * start, void * * end, void * start_nursery, void * end_nursery, struct ScanCopyContext ctx)
{
  _Bool D.22844;
  _Bool D.22845;
  _Bool D.22846;
  struct FILE * gc_debug_file.95;
  char * D.22856;
  int addr.96;
  char * D.22860;
  int D.22861;
  int D.22862;
  unsigned int idx.97;
  unsigned int D.22864;
  _Bool D.22865;
  long int D.22866;
  long int D.22867;
  char * * D.22870;
  unsigned int D.22871;
  char * * D.22872;
  _Bool D.22873;
  _Bool D.22874;
  _Bool D.22875;
  _Bool D.22878;
  _Bool D.22879;
  _Bool D.22880;
  void * D.22886;
  unsigned int search_start.98;
  unsigned int D.22890;
  unsigned int D.22891;
  unsigned int D.22892;
  unsigned int D.22893;
  struct MonoThreadsSync * D.22894;
  const char * D.22900;
  const char * D.22910;
  unsigned int D.22911;
  unsigned int D.22912;
  int iftmp.99;
  struct GrayQueueSection * D.22917;
  int D.22919;
  _Bool D.22920;
  long int D.22921;
  long int D.22922;
  int D.22926;
  int D.22927;
  int do_pin_stats.100;
  _Bool D.22929;
  long int D.22930;
  long int D.22931;
  unsigned int count.101;
  unsigned int D.22935;
  void * * D.22936;
  <unnamed type> D.22937;
  unsigned int D.22938;
  void * * D.22941;
  void * D.22942;
  long long int D.22943;
  long long int stat_pinned_objects.102;
  long long int stat_pinned_objects.103;
  int D.22946;
  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.20158>;
  <D.20165>:
  addr = *start;
  D.22844 = addr != last;
  D.22845 = addr >= start_nursery;
  D.22846 = D.22844 & D.22845;
  if (D.22846 != 0) goto <D.22847>; else goto <D.22848>;
  <D.22847>:
  if (addr < end_nursery) goto <D.22849>; else goto <D.22850>;
  <D.22849>:
  if (0 != 0) goto <D.22851>; else goto <D.22852>;
  <D.22851>:
  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.22852>:
  if (addr >= last_obj) goto <D.22854>; else goto <D.22855>;
  <D.22854>:
  D.22856 = last_obj + last_obj_size;
  if (D.22856 > addr) goto <D.22857>; else goto <D.22858>;
  <D.22857>:
  start = start + 4;
  // predicted unlikely by continue predictor.
  goto <D.20158>;
  <D.22858>:
  <D.22855>:
  addr.96 = (int) addr;
  D.22860 = section->data;
  D.22861 = (int) D.22860;
  D.22862 = addr.96 - D.22861;
  idx = D.22862 / 8192;
  idx.97 = (unsigned int) idx;
  D.22864 = section->num_scan_start;
  D.22865 = idx.97 >= D.22864;
  D.22866 = (long int) D.22865;
  D.22867 = __builtin_expect (D.22866, 0);
  if (D.22867 != 0) goto <D.22868>; else goto <D.22869>;
  <D.22868>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1246, "idx < section->num_scan_start");
  <D.22869>:
  D.22870 = section->scan_starts;
  idx.97 = (unsigned int) idx;
  D.22871 = idx.97 * 4;
  D.22872 = D.22870 + D.22871;
  search_start = *D.22872;
  D.22873 = search_start == 0B;
  D.22874 = search_start > addr;
  D.22875 = D.22873 | D.22874;
  if (D.22875 != 0) goto <D.22876>; else goto <D.22877>;
  <D.22876>:
  goto <D.20161>;
  <D.20160>:
  idx = idx + -1;
  D.22870 = section->scan_starts;
  idx.97 = (unsigned int) idx;
  D.22871 = idx.97 * 4;
  D.22872 = D.22870 + D.22871;
  search_start = *D.22872;
  D.22878 = search_start != 0B;
  D.22879 = search_start <= addr;
  D.22880 = D.22878 & D.22879;
  if (D.22880 != 0) goto <D.20159>; else goto <D.22881>;
  <D.22881>:
  <D.20161>:
  if (idx != 0) goto <D.20160>; else goto <D.20159>;
  <D.20159>:
  D.22873 = search_start == 0B;
  D.22874 = search_start > addr;
  D.22875 = D.22873 | D.22874;
  if (D.22875 != 0) goto <D.22882>; else goto <D.22883>;
  <D.22882>:
  search_start = start_nursery;
  <D.22883>:
  <D.22877>:
  if (search_start < last_obj) goto <D.22884>; else goto <D.22885>;
  <D.22884>:
  search_start = last_obj + last_obj_size;
  <D.22885>:
  <D.20164>:
  D.22886 = MEM[(void * *)search_start];
  if (D.22886 == 0B) goto <D.22887>; else goto <D.22888>;
  <D.22887>:
  search_start.98 = (unsigned int) search_start;
  D.22890 = search_start.98 + 11;
  D.22891 = D.22890 & 4294967288;
  search_start = (void *) D.22891;
  // predicted unlikely by continue predictor.
  goto <D.20162>;
  <D.22888>:
  last_obj = search_start;
  D.22892 = sgen_safe_object_get_size (search_start);
  D.22893 = D.22892 + 7;
  last_obj_size = D.22893 & 4294967288;
  D.22894 = MEM[(struct MonoObject *)last_obj].synchronisation;
  if (D.22894 == 4294967295B) goto <D.22895>; else goto <D.22896>;
  <D.22895>:
  goto <D.22897>;
  <D.22896>:
  if (0 != 0) goto <D.22898>; else goto <D.22899>;
  <D.22898>:
  D.22900 = safe_name (last_obj);
  gc_debug_file.95 = gc_debug_file;
  fprintf (gc_debug_file.95, "Pinned try match %p (%s), size %zd\n", last_obj, D.22900, last_obj_size);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.22899>:
  if (addr >= search_start) goto <D.22901>; else goto <D.22902>;
  <D.22901>:
  D.22856 = last_obj + last_obj_size;
  if (D.22856 > addr) goto <D.22903>; else goto <D.22904>;
  <D.22903>:
  if (scan_func != 0B) goto <D.22905>; else goto <D.22906>;
  <D.22905>:
  scan_func (search_start, queue);
  goto <D.22907>;
  <D.22906>:
  if (0 != 0) goto <D.22908>; else goto <D.22909>;
  <D.22908>:
  D.22910 = safe_name (search_start);
  D.22886 = MEM[(void * *)search_start];
  gc_debug_file.95 = gc_debug_file;
  fprintf (gc_debug_file.95, "Pinned object %p, vtable %p (%s), count %d\n\n", search_start, D.22886, D.22910, count);
  gc_debug_file.95 = gc_debug_file;
  fflush (gc_debug_file.95);
  <D.22909>:
  D.22911 = MEM[(mword *)search_start];
  D.22912 = D.22911 | 2;
  MEM[(mword *)search_start] = D.22912;
  D.22917 = queue->first;
  if (D.22917 == 0B) goto <D.22914>; else goto <D.22918>;
  <D.22918>:
  D.22917 = queue->first;
  D.22919 = D.22917->end;
  if (D.22919 == 125) goto <D.22914>; else goto <D.22915>;
  <D.22914>:
  iftmp.99 = 1;
  goto <D.22916>;
  <D.22915>:
  iftmp.99 = 0;
  <D.22916>:
  D.22920 = iftmp.99 != 0;
  D.22921 = (long int) D.22920;
  D.22922 = __builtin_expect (D.22921, 0);
  if (D.22922 != 0) goto <D.22923>; else goto <D.22924>;
  <D.22923>:
  sgen_gray_object_enqueue (queue, search_start);
  goto <D.22925>;
  <D.22924>:
  D.22917 = queue->first;
  D.22917 = queue->first;
  D.22919 = D.22917->end;
  D.22926 = D.22919;
  D.22927 = D.22926 + 1;
  D.22917->end = D.22927;
  D.22917->objects[D.22926] = search_start;
  <D.22925>:
  __builtin_prefetch (search_start);
  do_pin_stats.100 = do_pin_stats;
  D.22929 = do_pin_stats.100 != 0;
  D.22930 = (long int) D.22929;
  D.22931 = __builtin_expect (D.22930, 0);
  if (D.22931 != 0) goto <D.22932>; else goto <D.22933>;
  <D.22932>:
  sgen_pin_stats_register_object (search_start, last_obj_size);
  <D.22933>:
  count.101 = (unsigned int) count;
  D.22935 = count.101 * 4;
  D.22936 = definitely_pinned + D.22935;
  *D.22936 = search_start;
  count = count + 1;
  <D.22907>:
  goto <D.20163>;
  <D.22904>:
  <D.22902>:
  <D.22897>:
  search_start = search_start + last_obj_size;
  <D.20162>:
  if (search_start <= addr) goto <D.20164>; else goto <D.20163>;
  <D.20163>:
  last = addr;
  <D.22850>:
  <D.22848>:
  start = start + 4;
  <D.20158>:
  if (start < end) goto <D.20165>; else goto <D.20166>;
  <D.20166>:
  D.22937 = mono_profiler_get_events ();
  D.22938 = D.22937 & 1048576;
  if (D.22938 != 0) goto <D.22939>; else goto <D.22940>;
  <D.22939>:
  {
    struct GCRootReport report;

    try
      {
        report.count = 0;
        idx = 0;
        goto <D.20169>;
        <D.20168>:
        idx.97 = (unsigned int) idx;
        D.22871 = idx.97 * 4;
        D.22941 = definitely_pinned + D.22871;
        D.22942 = *D.22941;
        add_profile_gc_root (&report, D.22942, 260, 0);
        idx = idx + 1;
        <D.20169>:
        if (idx < count) goto <D.20168>; else goto <D.20170>;
        <D.20170>:
        notify_gc_roots (&report);
      }
    finally
      {
        report = {CLOBBER};
      }
  }
  <D.22940>:
  D.22943 = (long long int) count;
  stat_pinned_objects.102 = stat_pinned_objects;
  stat_pinned_objects.103 = D.22943 + stat_pinned_objects.102;
  stat_pinned_objects = stat_pinned_objects.103;
  D.22946 = count;
  return D.22946;
}


add_profile_gc_root (struct GCRootReport * report, void * object, int rtype, uintptr_t extra_info)
{
  int D.22948;
  int D.22951;
  int D.22952;
  unsigned int D.22953;
  unsigned int D.22954;
  struct MonoVTable * D.22955;
  struct MonoClass * D.22956;
  unsigned int D.22957;

  D.22948 = report->count;
  if (D.22948 == 32) goto <D.22949>; else goto <D.22950>;
  <D.22949>:
  notify_gc_roots (report);
  <D.22950>:
  D.22948 = report->count;
  report->objects[D.22948] = object;
  D.22948 = report->count;
  report->root_types[D.22948] = rtype;
  D.22948 = report->count;
  D.22951 = D.22948;
  D.22952 = D.22951 + 1;
  report->count = D.22952;
  D.22953 = MEM[(mword *)object];
  D.22954 = D.22953 & 4294967292;
  D.22955 = (struct MonoVTable *) D.22954;
  D.22956 = D.22955->klass;
  D.22957 = (unsigned int) D.22956;
  report->extra_info[D.22951] = D.22957;
}


notify_gc_roots (struct GCRootReport * report)
{
  int D.22958;
  uintptr_t[32] * D.22961;
  int[32] * D.22962;
  void *[32] * D.22963;

  D.22958 = report->count;
  if (D.22958 == 0) goto <D.22959>; else goto <D.22960>;
  <D.22959>:
  return;
  <D.22960>:
  D.22961 = &report->extra_info;
  D.22962 = &report->root_types;
  D.22963 = &report->objects;
  D.22958 = report->count;
  mono_profiler_gc_roots (D.22958, D.22963, D.22962, D.22961);
  report->count = 0;
}


sgen_pin_object (void * object, struct GrayQueue * queue)
{
  int concurrent_collection_in_progress.104;
  _Bool D.22966;
  long int D.22967;
  long int D.22968;
  int D.22971;
  unsigned int objects_pinned.105;
  unsigned int objects_pinned.106;
  unsigned int D.22977;
  unsigned int D.22978;
  int do_pin_stats.107;
  _Bool D.22980;
  long int D.22981;
  long int D.22982;
  unsigned int D.22985;
  int iftmp.108;
  struct GrayQueueSection * D.22990;
  int D.22992;
  _Bool D.22993;
  long int D.22994;
  long int D.22995;
  int D.22999;
  int D.23000;

  concurrent_collection_in_progress.104 = concurrent_collection_in_progress;
  D.22966 = concurrent_collection_in_progress.104 != 0;
  D.22967 = (long int) D.22966;
  D.22968 = __builtin_expect (D.22967, 0);
  if (D.22968 != 0) goto <D.22969>; else goto <D.22970>;
  <D.22969>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1355, "!concurrent_collection_in_progress");
  <D.22970>:
  D.22971 = sgen_collection_is_parallel ();
  if (D.22971 != 0) goto <D.22972>; else goto <D.22973>;
  <D.22972>:
  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.22976>;
  <D.22973>:
  D.22977 = MEM[(mword *)object];
  D.22978 = D.22977 | 2;
  MEM[(mword *)object] = D.22978;
  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.22980 = do_pin_stats.107 != 0;
  D.22981 = (long int) D.22980;
  D.22982 = __builtin_expect (D.22981, 0);
  if (D.22982 != 0) goto <D.22983>; else goto <D.22984>;
  <D.22983>:
  D.22985 = sgen_safe_object_get_size (object);
  sgen_pin_stats_register_object (object, D.22985);
  <D.22984>:
  <D.22976>:
  D.22990 = queue->first;
  if (D.22990 == 0B) goto <D.22987>; else goto <D.22991>;
  <D.22991>:
  D.22990 = queue->first;
  D.22992 = D.22990->end;
  if (D.22992 == 125) goto <D.22987>; else goto <D.22988>;
  <D.22987>:
  iftmp.108 = 1;
  goto <D.22989>;
  <D.22988>:
  iftmp.108 = 0;
  <D.22989>:
  D.22993 = iftmp.108 != 0;
  D.22994 = (long int) D.22993;
  D.22995 = __builtin_expect (D.22994, 0);
  if (D.22995 != 0) goto <D.22996>; else goto <D.22997>;
  <D.22996>:
  sgen_gray_object_enqueue (queue, object);
  goto <D.22998>;
  <D.22997>:
  D.22990 = queue->first;
  D.22990 = queue->first;
  D.22992 = D.22990->end;
  D.22999 = D.22992;
  D.23000 = D.22999 + 1;
  D.22990->end = D.23000;
  D.22990->objects[D.22999] = object;
  <D.22998>:
  __builtin_prefetch (object);
}


sgen_parallel_pin_or_update (void * * ptr, void * obj, struct MonoVTable * vt, struct SgenGrayQueue * queue)
{
  int D.23001;
  unsigned int vt.109;
  unsigned int D.23005;
  void * D.23006;
  void * D.23007;
  void (*<T2b58>) (char *, struct SgenGrayQueue *) D.23011;
  unsigned int D.23012;
  unsigned int D.23015;
  void * D.23016;
  unsigned int D.23017;

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

    major_pinned = 0;
    D.23001 = sgen_ptr_in_nursery (obj);
    if (D.23001 != 0) goto <D.23002>; else goto <D.23003>;
    <D.23002>:
    vt.109 = (unsigned int) vt;
    D.23005 = vt.109 | 2;
    D.23006 = (void *) D.23005;
    D.23007 = InterlockedCompareExchangePointer (obj, D.23006, vt);
    if (D.23007 == vt) goto <D.23008>; else goto <D.23009>;
    <D.23008>:
    sgen_pin_object (obj, queue);
    goto <D.20190>;
    <D.23009>:
    goto <D.23010>;
    <D.23003>:
    D.23011 = major_collector.pin_major_object;
    D.23011 (obj, queue);
    major_pinned = 1;
    <D.23010>:
    vtable_word = MEM[(mword *)obj];
    D.23012 = vtable_word & 1;
    if (D.23012 != 0) goto <D.23013>; else goto <D.23014>;
    <D.23013>:
    D.23015 = vtable_word & 4294967292;
    D.23016 = (void *) D.23015;
    *ptr = D.23016;
    goto <D.20190>;
    <D.23014>:
    D.23017 = vtable_word & 2;
    if (D.23017 != 0) goto <D.20190>; else goto <D.23018>;
    <D.23018>:
    if (major_pinned != 0) goto <D.20190>; else goto <D.23019>;
    <D.23019>:
  }
  goto <D.20191>;
  <D.20190>:
}


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

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


sgen_sort_addresses (void * * array, int size)
{
  int D.23025;
  unsigned int parent.112;
  unsigned int D.23027;
  void * * D.23028;
  void * D.23029;
  unsigned int child.113;
  unsigned int D.23031;
  void * * D.23032;
  void * D.23033;
  unsigned int i.114;
  unsigned int D.23036;
  void * * D.23037;
  void * D.23038;
  int D.23039;
  unsigned int child.115;
  unsigned int D.23043;
  void * * D.23044;
  void * D.23045;
  sizetype child.116;
  sizetype D.23047;
  sizetype D.23048;
  void * * D.23049;
  void * D.23050;
  unsigned int root.117;
  unsigned int D.23054;
  void * * D.23055;
  void * D.23056;
  int i;
  void * tmp;

  i = 1;
  goto <D.20204>;
  <D.20203>:
  {
    int child;

    child = i;
    goto <D.20202>;
    <D.20201>:
    {
      int parent;

      D.23025 = child + -1;
      parent = D.23025 / 2;
      parent.112 = (unsigned int) parent;
      D.23027 = parent.112 * 4;
      D.23028 = array + D.23027;
      D.23029 = *D.23028;
      child.113 = (unsigned int) child;
      D.23031 = child.113 * 4;
      D.23032 = array + D.23031;
      D.23033 = *D.23032;
      if (D.23029 >= D.23033) goto <D.20200>; else goto <D.23034>;
      <D.23034>:
      parent.112 = (unsigned int) parent;
      D.23027 = parent.112 * 4;
      D.23028 = array + D.23027;
      tmp = *D.23028;
      parent.112 = (unsigned int) parent;
      D.23027 = parent.112 * 4;
      D.23028 = array + D.23027;
      child.113 = (unsigned int) child;
      D.23031 = child.113 * 4;
      D.23032 = array + D.23031;
      D.23033 = *D.23032;
      *D.23028 = D.23033;
      child.113 = (unsigned int) child;
      D.23031 = child.113 * 4;
      D.23032 = array + D.23031;
      *D.23032 = tmp;
      child = parent;
    }
    <D.20202>:
    if (child > 0) goto <D.20201>; else goto <D.20200>;
    <D.20200>:
  }
  i = i + 1;
  <D.20204>:
  if (i < size) goto <D.20203>; else goto <D.20205>;
  <D.20205>:
  i = size + -1;
  goto <D.20213>;
  <D.20212>:
  {
    int end;
    int root;

    i.114 = (unsigned int) i;
    D.23036 = i.114 * 4;
    D.23037 = array + D.23036;
    tmp = *D.23037;
    i.114 = (unsigned int) i;
    D.23036 = i.114 * 4;
    D.23037 = array + D.23036;
    D.23038 = *array;
    *D.23037 = D.23038;
    *array = tmp;
    end = i + -1;
    root = 0;
    goto <D.20211>;
    <D.20210>:
    {
      int child;

      D.23039 = root * 2;
      child = D.23039 + 1;
      if (child < end) goto <D.23040>; else goto <D.23041>;
      <D.23040>:
      child.115 = (unsigned int) child;
      D.23043 = child.115 * 4;
      D.23044 = array + D.23043;
      D.23045 = *D.23044;
      child.116 = (sizetype) child;
      D.23047 = child.116 + 1;
      D.23048 = D.23047 * 4;
      D.23049 = array + D.23048;
      D.23050 = *D.23049;
      if (D.23045 < D.23050) goto <D.23051>; else goto <D.23052>;
      <D.23051>:
      child = child + 1;
      <D.23052>:
      <D.23041>:
      root.117 = (unsigned int) root;
      D.23054 = root.117 * 4;
      D.23055 = array + D.23054;
      D.23056 = *D.23055;
      child.115 = (unsigned int) child;
      D.23043 = child.115 * 4;
      D.23044 = array + D.23043;
      D.23045 = *D.23044;
      if (D.23056 >= D.23045) goto <D.20209>; else goto <D.23057>;
      <D.23057>:
      root.117 = (unsigned int) root;
      D.23054 = root.117 * 4;
      D.23055 = array + D.23054;
      tmp = *D.23055;
      root.117 = (unsigned int) root;
      D.23054 = root.117 * 4;
      D.23055 = array + D.23054;
      child.115 = (unsigned int) child;
      D.23043 = child.115 * 4;
      D.23044 = array + D.23043;
      D.23045 = *D.23044;
      *D.23055 = D.23045;
      child.115 = (unsigned int) child;
      D.23043 = child.115 * 4;
      D.23044 = array + D.23043;
      *D.23044 = tmp;
      root = child;
    }
    <D.20211>:
    D.23039 = root * 2;
    if (D.23039 < end) goto <D.20210>; else goto <D.20209>;
    <D.20209>:
  }
  i = i + -1;
  <D.20213>:
  if (i > 0) goto <D.20212>; else goto <D.20214>;
  <D.20214>:
}


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

  <D.20311>:
  old = lowest_heap_address;
  if (low >= old) goto <D.20310>; else goto <D.23058>;
  <D.23058>:
  old.118 = (void *) old;
  low.119 = (void *) low;
  D.23061 = InterlockedCompareExchangePointer (&lowest_heap_address, low.119, old.118);
  old.118 = (void *) old;
  if (D.23061 != old.118) goto <D.20311>; else goto <D.20310>;
  <D.20310>:
  <D.20313>:
  old = highest_heap_address;
  if (high <= old) goto <D.20312>; else goto <D.23062>;
  <D.23062>:
  old.118 = (void *) old;
  high.120 = (void *) high;
  D.23064 = InterlockedCompareExchangePointer (&highest_heap_address, high.120, old.118);
  old.118 = (void *) old;
  if (D.23064 != old.118) goto <D.20313>; else goto <D.20312>;
  <D.20312>:
}


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

  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.23068 = sgen_get_nursery_start ();
  return D.23068;
}


sgen_get_nursery_start ()
{
  char * D.23070;

  D.23070 = sgen_nursery_start;
  return D.23070;
}


mono_gc_set_current_thread_appdomain (struct MonoDomain * domain)
{
  _Bool D.23074;
  long int D.23075;
  long int D.23076;
  struct SgenThreadInfo * info;

  info = mono_thread_info_current ();
  if (domain != 0B) goto <D.23072>; else goto <D.23073>;
  <D.23072>:
  D.23074 = info == 0B;
  D.23075 = (long int) D.23074;
  D.23076 = __builtin_expect (D.23075, 0);
  if (D.23076 != 0) goto <D.23077>; else goto <D.23078>;
  <D.23077>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1733, "info");
  <D.23078>:
  info->stopped_domain = domain;
  <D.23073>:
}


mono_gc_precise_stack_mark_enabled ()
{
  gboolean D.23079;
  int conservative_stack_mark.124;
  _Bool D.23081;

  conservative_stack_mark.124 = conservative_stack_mark;
  D.23081 = conservative_stack_mark.124 == 0;
  D.23079 = (gboolean) D.23081;
  return D.23079;
}


mono_gc_get_logfile ()
{
  struct FILE * D.23083;

  D.23083 = gc_debug_file;
  return D.23083;
}


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

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


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

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


sgen_get_current_object_ops ()
{
  struct SgenObjectOperations * D.23089;

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


sgen_check_section_scan_starts (struct GCMemSection * section)
{
  char * * D.23091;
  unsigned int i.125;
  unsigned int D.23093;
  char * * D.23094;
  char * D.23095;
  unsigned int D.23098;
  _Bool D.23099;
  long int D.23100;
  long int D.23101;
  unsigned int D.23104;
  int i;

  i = 0;
  goto <D.20447>;
  <D.20446>:
  D.23091 = section->scan_starts;
  i.125 = (unsigned int) i;
  D.23093 = i.125 * 4;
  D.23094 = D.23091 + D.23093;
  D.23095 = *D.23094;
  if (D.23095 != 0B) goto <D.23096>; else goto <D.23097>;
  <D.23096>:
  {
    guint size;

    D.23091 = section->scan_starts;
    i.125 = (unsigned int) i;
    D.23093 = i.125 * 4;
    D.23094 = D.23091 + D.23093;
    D.23095 = *D.23094;
    size = sgen_safe_object_get_size (D.23095);
    D.23098 = size + 4294967288;
    D.23099 = D.23098 > 7992;
    D.23100 = (long int) D.23099;
    D.23101 = __builtin_expect (D.23100, 0);
    if (D.23101 != 0) goto <D.23102>; else goto <D.23103>;
    <D.23102>:
    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.23103>:
  }
  <D.23097>:
  i = i + 1;
  <D.20447>:
  i.125 = (unsigned int) i;
  D.23104 = section->num_scan_start;
  if (i.125 < D.23104) goto <D.20446>; else goto <D.20448>;
  <D.20448>:
}


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

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


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

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


sgen_dump_section (struct GCMemSection * section, const char * type)
{
  char * D.23113;
  unsigned int D.23114;
  struct FILE * heap_dump_file.130;
  void * D.23116;
  char * D.23121;
  _Bool D.23122;
  long int D.23123;
  long int D.23124;
  unsigned int D.23129;
  unsigned int D.23130;
  unsigned int D.23131;
  unsigned int D.23132;
  char * start;
  char * end;
  char * occ_start;
  struct GCVTable * vt;
  char * old_start;

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

    D.23116 = MEM[(void * *)start];
    if (D.23116 == 0B) goto <D.23117>; else goto <D.23118>;
    <D.23117>:
    if (occ_start != 0B) goto <D.23119>; else goto <D.23120>;
    <D.23119>:
    D.23113 = section->data;
    sgen_dump_occupied (occ_start, start, D.23113);
    occ_start = 0B;
    <D.23120>:
    start = start + 4;
    // predicted unlikely by continue predictor.
    goto <D.20488>;
    <D.23118>:
    D.23121 = section->next_data;
    D.23122 = D.23121 <= start;
    D.23123 = (long int) D.23122;
    D.23124 = __builtin_expect (D.23123, 0);
    if (D.23124 != 0) goto <D.23125>; else goto <D.23126>;
    <D.23125>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2088, "start < section->next_data");
    <D.23126>:
    if (occ_start == 0B) goto <D.23127>; else goto <D.23128>;
    <D.23127>:
    occ_start = start;
    <D.23128>:
    D.23129 = MEM[(mword *)start];
    D.23130 = D.23129 & 4294967292;
    vt = (struct GCVTable *) D.23130;
    class = vt->klass;
    D.23131 = sgen_safe_object_get_size (start);
    D.23132 = D.23131 + 7;
    size = D.23132 & 4294967288;
    old_start = start;
    start = start + size;
  }
  <D.20488>:
  if (start < end) goto <D.20489>; else goto <D.20490>;
  <D.20490>:
  if (occ_start != 0B) goto <D.23133>; else goto <D.23134>;
  <D.23133>:
  D.23113 = section->data;
  sgen_dump_occupied (occ_start, start, D.23113);
  <D.23134>:
  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.23136;
  _Bool D.23137;
  long int D.23138;
  long int D.23139;
  int D.23142;
  _Bool D.23143;
  long int D.23144;
  long int D.23145;
  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.23136 = mono_profiler_events.131 & 524288;
  D.23137 = D.23136 == 0;
  D.23138 = (long int) D.23137;
  D.23139 = __builtin_expect (D.23138, 0);
  if (D.23139 != 0) goto <D.23140>; else goto <D.23141>;
  <D.23140>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2187, "mono_profiler_events & MONO_PROFILE_GC_MOVES");
  <D.23141>:
  D.23142 = sgen_collection_is_parallel ();
  D.23143 = D.23142 != 0;
  D.23144 = (long int) D.23143;
  D.23145 = __builtin_expect (D.23144, 0);
  if (D.23145 != 0) goto <D.23146>; else goto <D.23147>;
  <D.23146>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2190, "!sgen_collection_is_parallel ()");
  <D.23147>:
  moved_objects_idx.132 = moved_objects_idx;
  if (moved_objects_idx.132 == 64) goto <D.23149>; else goto <D.23150>;
  <D.23149>:
  moved_objects_idx.132 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.132);
  moved_objects_idx = 0;
  <D.23150>:
  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.23158;

  current_collection_generation.139 = current_collection_generation;
  switch (current_collection_generation.139) <default: <D.20535>, case 0: <D.20533>, case 1: <D.20534>>
  <D.20533>:
  D.23158 = nursery_collection_is_parallel;
  return D.23158;
  <D.20534>:
  D.23158 = major_collector.is_parallel;
  return D.23158;
  <D.20535>:
  current_collection_generation.139 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.139);
  <D.20536>:
  goto <D.20536>;
}


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

  current_collection_generation.140 = current_collection_generation;
  switch (current_collection_generation.140) <default: <D.20542>, case 0: <D.20540>, case 1: <D.20541>>
  <D.20540>:
  D.23161 = 0;
  return D.23161;
  <D.20541>:
  D.23161 = concurrent_collection_in_progress;
  return D.23161;
  <D.20542>:
  current_collection_generation.140 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.140);
  <D.20543>:
  goto <D.20543>;
}


sgen_concurrent_collection_in_progress ()
{
  gboolean D.23163;

  D.23163 = concurrent_collection_in_progress;
  return D.23163;
}


sgen_ensure_free_space (size_t size)
{
  int D.23167;
  int degraded_mode.141;
  int D.23174;
  int D.23178;
  int concurrent_collection_in_progress.142;
  int D.23187;
  int generation_to_collect;
  const char * reason;

  generation_to_collect = -1;
  reason = 0B;
  if (size > 8000) goto <D.23165>; else goto <D.23166>;
  <D.23165>:
  D.23167 = sgen_need_major_collection (size);
  if (D.23167 != 0) goto <D.23168>; else goto <D.23169>;
  <D.23168>:
  reason = "LOS overflow";
  generation_to_collect = 1;
  <D.23169>:
  goto <D.23170>;
  <D.23166>:
  degraded_mode.141 = degraded_mode;
  if (degraded_mode.141 != 0) goto <D.23172>; else goto <D.23173>;
  <D.23172>:
  D.23174 = sgen_need_major_collection (size);
  if (D.23174 != 0) goto <D.23175>; else goto <D.23176>;
  <D.23175>:
  reason = "Degraded mode overflow";
  generation_to_collect = 1;
  <D.23176>:
  goto <D.23177>;
  <D.23173>:
  D.23178 = sgen_need_major_collection (size);
  if (D.23178 != 0) goto <D.23179>; else goto <D.23180>;
  <D.23179>:
  reason = "Minor allowance";
  generation_to_collect = 1;
  goto <D.23181>;
  <D.23180>:
  generation_to_collect = 0;
  reason = "Nursery full";
  <D.23181>:
  <D.23177>:
  <D.23170>:
  if (generation_to_collect == -1) goto <D.23182>; else goto <D.23183>;
  <D.23182>:
  concurrent_collection_in_progress.142 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.142 != 0) goto <D.23185>; else goto <D.23186>;
  <D.23185>:
  D.23187 = sgen_workers_all_done ();
  if (D.23187 != 0) goto <D.23188>; else goto <D.23189>;
  <D.23188>:
  generation_to_collect = 1;
  reason = "Finish concurrent collection";
  <D.23189>:
  <D.23186>:
  <D.23183>:
  if (generation_to_collect == -1) goto <D.23190>; else goto <D.23191>;
  <D.23190>:
  return;
  <D.23191>:
  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.23196;
  long int D.23197;
  long int D.23198;
  long long int D.23201;
  int concurrent_collection_in_progress.144;
  _Bool D.23205;
  _Bool D.23206;
  _Bool D.23207;
  int D.23208;
  int D.23209;
  int allow_synchronous_major.145;
  gboolean * D.23219;
  int D.23222;
  int D.23227;
  int D.23231;
  int concurrent_collection_in_progress.146;
  _Bool D.23235;
  long int D.23236;
  long int D.23237;
  int D.23245;
  long long int D.23248;
  long long int D.23249;
  long long int D.23250;
  int D.23251;
  long long int D.23252;
  long long int D.23260;
  long long int D.23261;
  long long int D.23262;
  int D.23263;
  long long int D.23264;
  int gc_debug_level.147;
  _Bool D.23266;
  long int D.23267;
  long int D.23268;
  unsigned int los_memory_usage.148;
  long long int D.23272;
  long unsigned int D.23273;
  struct FILE * gc_debug_file.149;
  int D.23277;
  _Bool D.23280;
  long int D.23281;
  long int D.23282;
  int D.23285;
  int D.23286;
  _Bool D.23287;
  long int D.23288;
  long int D.23289;
  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.23193>; else goto <D.23194>;
      <D.23193>:
      <D.23194>:
      generation_to_collect.143 = (unsigned int) generation_to_collect;
      D.23196 = generation_to_collect.143 > 1;
      D.23197 = (long int) D.23196;
      D.23198 = __builtin_expect (D.23197, 0);
      if (D.23198 != 0) goto <D.23199>; else goto <D.23200>;
      <D.23199>:
      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.23200>:
      memset (&infos, 0, 72);
      mono_profiler_gc_event (0, generation_to_collect);
      infos[0].generation = generation_to_collect;
      infos[0].reason = reason;
      infos[0].is_overflow = 0;
      D.23201 = mono_100ns_ticks ();
      infos[0].total_time = D.23201;
      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.23203>; else goto <D.23204>;
      <D.23203>:
      D.23205 = wait_to_finish != 0;
      D.23206 = generation_to_collect == 1;
      D.23207 = D.23205 & D.23206;
      D.23208 = (int) D.23207;
      D.23209 = major_update_or_finish_concurrent_collection (D.23208);
      if (D.23209 != 0) goto <D.23210>; else goto <D.23211>;
      <D.23210>:
      oldest_generation_collected = 1;
      goto done;
      <D.23211>:
      if (generation_to_collect == 1) goto done; else goto <D.23212>;
      <D.23212>:
      goto <D.23213>;
      <D.23204>:
      if (generation_to_collect == 1) goto <D.23214>; else goto <D.23215>;
      <D.23214>:
      allow_synchronous_major.145 = allow_synchronous_major;
      if (allow_synchronous_major.145 != 0) goto <D.23217>; else goto <D.23218>;
      <D.23217>:
      D.23219 = major_collector.want_synchronous_collection;
      if (D.23219 != 0B) goto <D.23220>; else goto <D.23221>;
      <D.23220>:
      D.23219 = major_collector.want_synchronous_collection;
      D.23222 = *D.23219;
      if (D.23222 != 0) goto <D.23223>; else goto <D.23224>;
      <D.23223>:
      wait_to_finish = 1;
      <D.23224>:
      <D.23221>:
      <D.23218>:
      <D.23215>:
      <D.23213>:
      if (generation_to_collect == 0) goto <D.23225>; else goto <D.23226>;
      <D.23225>:
      D.23227 = collect_nursery (0B, 0);
      if (D.23227 != 0) goto <D.23228>; else goto <D.23229>;
      <D.23228>:
      overflow_generation_to_collect = 1;
      overflow_reason = "Minor overflow";
      <D.23229>:
      goto <D.23230>;
      <D.23226>:
      D.23231 = major_collector.is_concurrent;
      if (D.23231 != 0) goto <D.23232>; else goto <D.23233>;
      <D.23232>:
      concurrent_collection_in_progress.146 = concurrent_collection_in_progress;
      D.23235 = concurrent_collection_in_progress.146 != 0;
      D.23236 = (long int) D.23235;
      D.23237 = __builtin_expect (D.23236, 0);
      if (D.23237 != 0) goto <D.23238>; else goto <D.23239>;
      <D.23238>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3489, "!concurrent_collection_in_progress");
      <D.23239>:
      if (wait_to_finish == 0) goto <D.23240>; else goto <D.23241>;
      <D.23240>:
      collect_nursery (0B, 0);
      <D.23241>:
      <D.23233>:
      D.23231 = major_collector.is_concurrent;
      if (D.23231 != 0) goto <D.23243>; else goto <D.23242>;
      <D.23243>:
      if (wait_to_finish == 0) goto <D.23244>; else goto <D.23242>;
      <D.23244>:
      major_start_concurrent_collection (reason);
      goto done;
      <D.23242>:
      D.23245 = major_do_collection (reason);
      if (D.23245 != 0) goto <D.23246>; else goto <D.23247>;
      <D.23246>:
      overflow_generation_to_collect = 0;
      overflow_reason = "Excessive pinning";
      <D.23247>:
      <D.23230>:
      gc_end = mono_100ns_ticks ();
      D.23248 = infos[0].total_time;
      D.23249 = gc_end - D.23248;
      D.23250 = D.23249 / 10;
      D.23251 = (int) D.23250;
      D.23252 = (long long int) D.23251;
      infos[0].total_time = D.23252;
      D.23231 = major_collector.is_concurrent;
      if (D.23231 == 0) goto <D.23253>; else goto <D.23254>;
      <D.23253>:
      if (overflow_generation_to_collect != -1) goto <D.23255>; else goto <D.23256>;
      <D.23255>:
      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.23257>; else goto <D.23258>;
      <D.23257>:
      collect_nursery (0B, 0);
      goto <D.23259>;
      <D.23258>:
      major_do_collection (overflow_reason);
      <D.23259>:
      gc_end = mono_100ns_ticks ();
      D.23260 = infos[1].total_time;
      D.23261 = gc_end - D.23260;
      D.23262 = D.23261 / 10;
      D.23263 = (int) D.23262;
      D.23264 = (long long int) D.23263;
      infos[1].total_time = D.23264;
      mono_profiler_gc_event (5, overflow_generation_to_collect);
      oldest_generation_collected = MAX_EXPR <overflow_generation_to_collect, oldest_generation_collected>;
      <D.23256>:
      <D.23254>:
      gc_debug_level.147 = gc_debug_level;
      D.23266 = gc_debug_level.147 > 1;
      D.23267 = (long int) D.23266;
      D.23268 = __builtin_expect (D.23267, 0);
      if (D.23268 != 0) goto <D.23269>; else goto <D.23270>;
      <D.23269>:
      los_memory_usage.148 = los_memory_usage;
      D.23272 = mono_gc_get_heap_size ();
      D.23273 = (long unsigned int) D.23272;
      gc_debug_file.149 = gc_debug_file;
      fprintf (gc_debug_file.149, "Heap size: %lu, LOS size: %lu\n", D.23273, los_memory_usage.148);
      gc_debug_file.149 = gc_debug_file;
      fflush (gc_debug_file.149);
      <D.23270>:
      if (generation_to_collect == 0) goto <D.23275>; else goto <D.23276>;
      <D.23275>:
      D.23277 = sgen_can_alloc_size (requested_size);
      if (D.23277 == 0) goto <D.23278>; else goto <D.23279>;
      <D.23278>:
      gc_debug_level.147 = gc_debug_level;
      D.23280 = gc_debug_level.147 > 0;
      D.23281 = (long int) D.23280;
      D.23282 = __builtin_expect (D.23281, 0);
      if (D.23282 != 0) goto <D.23283>; else goto <D.23284>;
      <D.23283>:
      D.23285 = sgen_get_pinned_count ();
      gc_debug_file.149 = gc_debug_file;
      fprintf (gc_debug_file.149, "nursery collection didn\'t find enough room for %zd alloc (%d pinned)\n", requested_size, D.23285);
      gc_debug_file.149 = gc_debug_file;
      fflush (gc_debug_file.149);
      <D.23284>:
      sgen_dump_pin_queue ();
      degraded_mode = 1;
      <D.23279>:
      <D.23276>:
      done:
      D.23286 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.23287 = D.23286 == 0;
      D.23288 = (long int) D.23287;
      D.23289 = __builtin_expect (D.23288, 0);
      if (D.23289 != 0) goto <D.23290>; else goto <D.23291>;
      <D.23290>:
      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.23291>:
      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.23292;
  _Bool D.23293;
  long int D.23294;
  long int D.23295;
  int D.23300;
  void (*<T719>) (void) D.23303;
  gboolean D.23304;
  int mod_union_consistency_check.150;
  int whole_heap_check_before_collection.151;
  struct SgenGrayQueue unpin_queue;

  try
    {
      memset (&unpin_queue, 0, 16);
      D.23292 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.23293 = D.23292 == 0;
      D.23294 = (long int) D.23293;
      D.23295 = __builtin_expect (D.23294, 0);
      if (D.23295 != 0) goto <D.23296>; else goto <D.23297>;
      <D.23296>:
      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.23297>:
      if (force_finish == 0) goto <D.23298>; else goto <D.23299>;
      <D.23298>:
      D.23300 = sgen_workers_all_done ();
      if (D.23300 == 0) goto <D.23301>; else goto <D.23302>;
      <D.23301>:
      D.23303 = major_collector.update_cardtable_mod_union;
      D.23303 ();
      sgen_los_update_cardtable_mod_union ();
      D.23304 = 0;
      return D.23304;
      <D.23302>:
      <D.23299>:
      wait_for_workers_to_finish ();
      D.23303 = major_collector.update_cardtable_mod_union;
      D.23303 ();
      sgen_los_update_cardtable_mod_union ();
      collect_nursery (&unpin_queue, 1);
      mod_union_consistency_check.150 = mod_union_consistency_check;
      if (mod_union_consistency_check.150 != 0) goto <D.23306>; else goto <D.23307>;
      <D.23306>:
      sgen_check_mod_union_consistency ();
      <D.23307>:
      current_collection_generation = 1;
      major_finish_collection ("finishing", -1, 1);
      whole_heap_check_before_collection.151 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.151 != 0) goto <D.23309>; else goto <D.23310>;
      <D.23309>:
      sgen_check_whole_heap (0);
      <D.23310>:
      unpin_objects_from_queue (&unpin_queue);
      sgen_gray_object_queue_deinit (&unpin_queue);
      current_collection_generation = -1;
      D.23304 = 1;
      return D.23304;
    }
  finally
    {
      unpin_queue = {CLOBBER};
    }
}


wait_for_workers_to_finish ()
{
  int D.23313;

  goto <D.20693>;
  <D.20692>:
  monoeg_g_usleep (200);
  <D.20693>:
  D.23313 = sgen_workers_all_done ();
  if (D.23313 == 0) goto <D.20692>; else goto <D.20694>;
  <D.20694>:
}


major_finish_collection (const char * reason, int old_next_pin_slot, gboolean scan_mod_union)
{
  int concurrent_collection_in_progress.152;
  int D.23318;
  int concurrent_collection_in_progress.153;
  int D.23322;
  _Bool D.23323;
  long int D.23324;
  long int D.23325;
  int do_concurrent_checks.154;
  struct SgenSectionGrayQueue * D.23332;
  int D.23333;
  _Bool D.23334;
  long int D.23335;
  long int D.23336;
  long long int D.23339;
  long long int D.23340;
  int D.23341;
  long long int D.23342;
  long long int time_major_finish_gray_stack.155;
  long long int time_major_finish_gray_stack.156;
  unsigned int objects_pinned.157;
  int concurrent_collection_in_progress.158;
  _Bool D.23349;
  long int D.23350;
  long int D.23351;
  struct GCMemSection * nursery_section.159;
  char * D.23355;
  unsigned int D.23356;
  char * D.23357;
  unsigned int D.23358;
  int check_mark_bits_after_major_collection.160;
  char[0:] * D.23362;
  unsigned int D.23363;
  unsigned int D.23364;
  _Bool D.23365;
  long int D.23366;
  long int D.23367;
  int D.23370;
  unsigned int D.23373;
  unsigned int D.23374;
  unsigned int D.23375;
  struct LOSObject * los_object_list.161;
  long long int D.23381;
  long long int D.23382;
  int D.23383;
  long long int D.23384;
  long long int time_major_free_bigobjs.162;
  long long int time_major_free_bigobjs.163;
  long long int time_major_los_sweep.164;
  long long int time_major_los_sweep.165;
  void (*<T719>) (void) D.23389;
  long long int time_major_sweep.166;
  long long int time_major_sweep.167;
  int concurrent_collection_in_progress.168;
  int D.23395;
  void * * D.23396;
  unsigned int D.23397;
  int concurrent_collection_in_progress.169;
  long long int time_major_fragment_creation.170;
  long long int time_major_fragment_creation.171;
  struct FILE * heap_dump_file.172;
  int stat_major_gcs.173;
  int D.23409;
  struct FinalizeReadyEntry * fin_ready_list.174;
  struct FinalizeReadyEntry * critical_fin_list.175;
  int num_ready_finalizers.176;
  struct FILE * gc_debug_file.177;
  int D.23419;
  _Bool D.23420;
  long int D.23421;
  long int D.23422;
  void (*<T719>) (void) D.23425;
  struct SgenSectionGrayQueue * D.23426;
  int D.23427;
  _Bool D.23428;
  long int D.23429;
  long int D.23430;
  int concurrent_collection_in_progress.178;
  struct LOSObject * bigobj;
  struct LOSObject * prevbo;
  gint64 atv;
  gint64 btv;

  btv = mono_100ns_ticks ();
  concurrent_collection_in_progress.152 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.152 != 0) goto <D.23314>; else goto <D.23317>;
  <D.23317>:
  D.23318 = major_collector.is_parallel;
  if (D.23318 != 0) goto <D.23314>; else goto <D.23315>;
  <D.23314>:
  join_workers ();
  <D.23315>:
  concurrent_collection_in_progress.153 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.153 != 0) goto <D.23320>; else goto <D.23321>;
  <D.23320>:
  current_object_ops = major_collector.major_concurrent_ops;
  major_copy_or_mark_from_roots (0B, 1, scan_mod_union);
  join_workers ();
  D.23322 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23323 = D.23322 == 0;
  D.23324 = (long int) D.23323;
  D.23325 = __builtin_expect (D.23324, 0);
  if (D.23325 != 0) goto <D.23326>; else goto <D.23327>;
  <D.23326>:
  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.23327>:
  do_concurrent_checks.154 = do_concurrent_checks;
  if (do_concurrent_checks.154 != 0) goto <D.23329>; else goto <D.23330>;
  <D.23329>:
  check_nursery_is_clean ();
  <D.23330>:
  goto <D.23331>;
  <D.23321>:
  current_object_ops = major_collector.major_ops;
  <D.23331>:
  sgen_gray_object_queue_disable_alloc_prepare (&gray_queue);
  D.23332 = sgen_workers_get_distribute_section_gray_queue ();
  D.23333 = sgen_section_gray_queue_is_empty (D.23332);
  D.23334 = D.23333 == 0;
  D.23335 = (long int) D.23334;
  D.23336 = __builtin_expect (D.23335, 0);
  if (D.23336 != 0) goto <D.23337>; else goto <D.23338>;
  <D.23337>:
  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.23338>:
  finish_gray_stack (1, &gray_queue);
  atv = mono_100ns_ticks ();
  D.23339 = atv - btv;
  D.23340 = D.23339 / 10;
  D.23341 = (int) D.23340;
  D.23342 = (long long int) D.23341;
  time_major_finish_gray_stack.155 = time_major_finish_gray_stack;
  time_major_finish_gray_stack.156 = D.23342 + time_major_finish_gray_stack.155;
  time_major_finish_gray_stack = time_major_finish_gray_stack.156;
  sgen_workers_reset_data ();
  objects_pinned.157 = objects_pinned;
  if (objects_pinned.157 != 0) goto <D.23346>; else goto <D.23347>;
  <D.23346>:
  concurrent_collection_in_progress.158 = concurrent_collection_in_progress;
  D.23349 = concurrent_collection_in_progress.158 != 0;
  D.23350 = (long int) D.23349;
  D.23351 = __builtin_expect (D.23350, 0);
  if (D.23351 != 0) goto <D.23352>; else goto <D.23353>;
  <D.23352>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3177, "!concurrent_collection_in_progress");
  <D.23353>:
  nursery_section.159 = nursery_section;
  sgen_pin_queue_clear_discarded_entries (nursery_section.159, old_next_pin_slot);
  sgen_optimize_pin_queue (0);
  nursery_section.159 = nursery_section;
  sgen_find_section_pin_queue_start_end (nursery_section.159);
  objects_pinned = 0;
  <D.23347>:
  reset_heap_boundaries ();
  D.23355 = sgen_get_nursery_end ();
  D.23356 = (unsigned int) D.23355;
  D.23357 = sgen_get_nursery_start ();
  D.23358 = (unsigned int) D.23357;
  sgen_update_heap_boundaries (D.23358, D.23356);
  check_mark_bits_after_major_collection.160 = check_mark_bits_after_major_collection;
  if (check_mark_bits_after_major_collection.160 != 0) goto <D.23360>; else goto <D.23361>;
  <D.23360>:
  sgen_check_major_heap_marked ();
  <D.23361>:
  prevbo = 0B;
  bigobj = los_object_list;
  goto <D.20708>;
  <D.20709>:
  D.23362 = &bigobj->data;
  D.23363 = MEM[(mword *)D.23362];
  D.23364 = D.23363 & 2;
  D.23365 = D.23364 != 0;
  D.23366 = (long int) D.23365;
  D.23367 = __builtin_expect (D.23366, 0);
  if (D.23367 != 0) goto <D.23368>; else goto <D.23369>;
  <D.23368>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3197, "!object_is_pinned (bigobj->data)");
  <D.23369>:
  D.23362 = &bigobj->data;
  D.23370 = sgen_los_object_is_pinned (D.23362);
  if (D.23370 != 0) goto <D.23371>; else goto <D.23372>;
  <D.23371>:
  D.23362 = &bigobj->data;
  sgen_los_unpin_object (D.23362);
  D.23362 = &bigobj->data;
  D.23373 = (unsigned int) D.23362;
  D.23374 = sgen_los_object_size (bigobj);
  D.23375 = D.23373 + D.23374;
  D.23362 = &bigobj->data;
  D.23373 = (unsigned int) D.23362;
  sgen_update_heap_boundaries (D.23373, D.23375);
  goto <D.23376>;
  <D.23372>:
  {
    struct LOSObject * to_free;

    if (prevbo != 0B) goto <D.23377>; else goto <D.23378>;
    <D.23377>:
    los_object_list.161 = bigobj->next;
    prevbo->next = los_object_list.161;
    goto <D.23380>;
    <D.23378>:
    los_object_list.161 = bigobj->next;
    los_object_list = los_object_list.161;
    <D.23380>:
    to_free = bigobj;
    bigobj = bigobj->next;
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.20708>;
  }
  <D.23376>:
  prevbo = bigobj;
  bigobj = bigobj->next;
  <D.20708>:
  if (bigobj != 0B) goto <D.20709>; else goto <D.20710>;
  <D.20710>:
  btv = mono_100ns_ticks ();
  D.23381 = btv - atv;
  D.23382 = D.23381 / 10;
  D.23383 = (int) D.23382;
  D.23384 = (long long int) D.23383;
  time_major_free_bigobjs.162 = time_major_free_bigobjs;
  time_major_free_bigobjs.163 = D.23384 + time_major_free_bigobjs.162;
  time_major_free_bigobjs = time_major_free_bigobjs.163;
  sgen_los_sweep ();
  atv = mono_100ns_ticks ();
  D.23339 = atv - btv;
  D.23340 = D.23339 / 10;
  D.23341 = (int) D.23340;
  D.23342 = (long long int) D.23341;
  time_major_los_sweep.164 = time_major_los_sweep;
  time_major_los_sweep.165 = D.23342 + time_major_los_sweep.164;
  time_major_los_sweep = time_major_los_sweep.165;
  D.23389 = major_collector.sweep;
  D.23389 ();
  btv = mono_100ns_ticks ();
  D.23381 = btv - atv;
  D.23382 = D.23381 / 10;
  D.23383 = (int) D.23382;
  D.23384 = (long long int) D.23383;
  time_major_sweep.166 = time_major_sweep;
  time_major_sweep.167 = D.23384 + time_major_sweep.166;
  time_major_sweep = time_major_sweep.167;
  concurrent_collection_in_progress.168 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.168 == 0) goto <D.23393>; else goto <D.23394>;
  <D.23393>:
  nursery_section.159 = nursery_section;
  D.23395 = nursery_section.159->pin_queue_num_entries;
  nursery_section.159 = nursery_section;
  D.23396 = nursery_section.159->pin_queue_start;
  nursery_section.159 = nursery_section;
  D.23397 = sgen_build_nursery_fragments (nursery_section.159, D.23396, D.23395, 0B);
  if (D.23397 == 0) goto <D.23398>; else goto <D.23399>;
  <D.23398>:
  degraded_mode = 1;
  <D.23399>:
  sgen_finish_pinning ();
  sgen_clear_tlabs ();
  sgen_pin_stats_reset ();
  <D.23394>:
  concurrent_collection_in_progress.169 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.169 != 0) goto <D.23401>; else goto <D.23402>;
  <D.23401>:
  sgen_cement_concurrent_finish ();
  <D.23402>:
  sgen_cement_clear_below_threshold ();
  atv = mono_100ns_ticks ();
  D.23339 = atv - btv;
  D.23340 = D.23339 / 10;
  D.23341 = (int) D.23340;
  D.23342 = (long long int) D.23341;
  time_major_fragment_creation.170 = time_major_fragment_creation;
  time_major_fragment_creation.171 = D.23342 + time_major_fragment_creation.170;
  time_major_fragment_creation = time_major_fragment_creation.171;
  heap_dump_file.172 = heap_dump_file;
  if (heap_dump_file.172 != 0B) goto <D.23406>; else goto <D.23407>;
  <D.23406>:
  stat_major_gcs.173 = stat_major_gcs;
  D.23409 = stat_major_gcs.173 + -1;
  dump_heap ("major", D.23409, reason);
  <D.23407>:
  fin_ready_list.174 = fin_ready_list;
  if (fin_ready_list.174 != 0B) goto <D.23410>; else goto <D.23413>;
  <D.23413>:
  critical_fin_list.175 = critical_fin_list;
  if (critical_fin_list.175 != 0B) goto <D.23410>; else goto <D.23411>;
  <D.23410>:
  if (0 != 0) goto <D.23415>; else goto <D.23416>;
  <D.23415>:
  num_ready_finalizers.176 = num_ready_finalizers;
  gc_debug_file.177 = gc_debug_file;
  fprintf (gc_debug_file.177, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.176);
  gc_debug_file.177 = gc_debug_file;
  fflush (gc_debug_file.177);
  <D.23416>:
  mono_gc_finalize_notify ();
  <D.23411>:
  D.23419 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23420 = D.23419 == 0;
  D.23421 = (long int) D.23420;
  D.23422 = __builtin_expect (D.23421, 0);
  if (D.23422 != 0) goto <D.23423>; else goto <D.23424>;
  <D.23423>:
  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.23424>:
  sgen_memgov_major_collection_end ();
  current_collection_generation = -1;
  D.23425 = major_collector.finish_major_collection;
  D.23425 ();
  D.23426 = sgen_workers_get_distribute_section_gray_queue ();
  D.23427 = sgen_section_gray_queue_is_empty (D.23426);
  D.23428 = D.23427 == 0;
  D.23429 = (long int) D.23428;
  D.23430 = __builtin_expect (D.23429, 0);
  if (D.23430 != 0) goto <D.23431>; else goto <D.23432>;
  <D.23431>:
  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.23432>:
  concurrent_collection_in_progress.178 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.178 != 0) goto <D.23434>; else goto <D.23435>;
  <D.23434>:
  concurrent_collection_in_progress = 0;
  <D.23435>:
  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.23436;
  int D.23437;
  int concurrent_collection_in_progress.179;
  int do_concurrent_checks.180;
  int whole_heap_check_before_collection.181;
  long long int D.23448;
  long long int D.23449;
  int D.23450;
  long long int D.23451;
  long long int time_major_pre_collection_fragment_clear.182;
  long long int time_major_pre_collection_fragment_clear.183;
  int D.23454;
  struct GCMemSection * nursery_section.184;
  char * D.23458;
  gboolean * D.23459;
  int xdomain_checks.185;
  int concurrent_collection_in_progress.186;
  void (*<T719>) (void) D.23466;
  struct FILE * gc_debug_file.187;
  unsigned int highest_heap_address.188;
  void * highest_heap_address.189;
  unsigned int lowest_heap_address.190;
  void * lowest_heap_address.191;
  int concurrent_collection_in_progress.192;
  int D.23478;
  int concurrent_collection_in_progress.193;
  int concurrent_collection_in_progress.194;
  void (*<T2a95>) (struct SgenGrayQueue *) D.23489;
  unsigned int D.23492;
  char * D.23493;
  char[0:] * D.23494;
  void * * D.23495;
  int D.23498;
  _Bool D.23501;
  long int D.23502;
  long int D.23503;
  unsigned int D.23506;
  unsigned int D.23507;
  struct MonoVTable * D.23508;
  void * D.23509;
  unsigned int D.23510;
  int D.23511;
  int iftmp.195;
  struct GrayQueueSection * D.23518;
  int D.23520;
  _Bool D.23521;
  long int D.23522;
  long int D.23523;
  int D.23527;
  int D.23528;
  int do_pin_stats.196;
  _Bool D.23530;
  long int D.23531;
  long int D.23532;
  unsigned int D.23535;
  unsigned int D.23538;
  const char * D.23539;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) iftmp.197;
  int concurrent_collection_in_progress.198;
  int concurrent_collection_in_progress.199;
  int D.23553;
  int check_nursery_objects_pinned.200;
  int iftmp.201;
  int concurrent_collection_in_progress.202;
  void (*<T2a95>) (struct SgenGrayQueue *) D.23566;
  int D.23569;
  long long int time_major_pinning.203;
  long long int time_major_pinning.204;
  int gc_debug_level.205;
  _Bool D.23573;
  long int D.23574;
  long int D.23575;
  int D.23578;
  int D.23581;
  void (*<T719>) (void) D.23582;
  int concurrent_collection_in_progress.206;
  int D.23586;
  <unnamed type> D.23589;
  unsigned int D.23590;
  long long int D.23593;
  long long int D.23594;
  int D.23595;
  long long int D.23596;
  long long int time_major_scan_pinned.207;
  long long int time_major_scan_pinned.208;
  void (*<T2b53>) (void * *, struct SgenGrayQueue *) D.23599;
  void (*<T2b58>) (char *, struct SgenGrayQueue *) D.23600;
  long long int time_major_scan_registered_roots.209;
  long long int time_major_scan_registered_roots.210;
  long long int time_major_scan_thread_data.211;
  long long int time_major_scan_thread_data.212;
  long long int time_major_scan_alloc_pinned.213;
  long long int time_major_scan_alloc_pinned.214;
  <unnamed type> D.23607;
  unsigned int D.23608;
  struct FinalizeReadyEntry * fin_ready_list.215;
  struct FinalizeReadyEntry * critical_fin_list.216;
  long long int time_major_scan_finalized.217;
  long long int time_major_scan_finalized.218;
  long long int time_major_scan_big_objects.219;
  long long int time_major_scan_big_objects.220;
  int concurrent_collection_in_progress.221;
  struct LOSObject * bigobj;
  gint64 atv;
  gint64 btv;
  char * heap_start;
  char * heap_end;
  gboolean profile_roots;
  struct GCRootReport root_report;
  struct ScanFromRegisteredRootsJobData * scrrjd_normal;
  struct ScanFromRegisteredRootsJobData * scrrjd_wbarrier;
  struct ScanThreadDataJobData * stdjd;
  struct ScanFinalizerEntriesJobData * sfejd_fin_ready;
  struct ScanFinalizerEntriesJobData * sfejd_critical_fin;
  struct ScanCopyContext ctx;

  try
    {
      heap_start = 0B;
      heap_end = 4294967295B;
      D.23436 = mono_profiler_get_events ();
      D.23437 = (int) D.23436;
      profile_roots = D.23437 & 1048576;
      root_report = {};
      concurrent_collection_in_progress.179 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.179 != 0) goto <D.23439>; else goto <D.23440>;
      <D.23439>:
      sgen_nursery_allocator_prepare_for_pinning ();
      do_concurrent_checks.180 = do_concurrent_checks;
      if (do_concurrent_checks.180 != 0) goto <D.23442>; else goto <D.23443>;
      <D.23442>:
      check_nursery_is_clean ();
      <D.23443>:
      goto <D.23444>;
      <D.23440>:
      sgen_nursery_alloc_prepare_for_major ();
      <D.23444>:
      init_gray_queue ();
      atv = mono_100ns_ticks ();
      sgen_clear_nursery_fragments ();
      whole_heap_check_before_collection.181 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.181 != 0) goto <D.23446>; else goto <D.23447>;
      <D.23446>:
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.23447>:
      btv = mono_100ns_ticks ();
      D.23448 = btv - atv;
      D.23449 = D.23448 / 10;
      D.23450 = (int) D.23449;
      D.23451 = (long long int) D.23450;
      time_major_pre_collection_fragment_clear.182 = time_major_pre_collection_fragment_clear;
      time_major_pre_collection_fragment_clear.183 = D.23451 + time_major_pre_collection_fragment_clear.182;
      time_major_pre_collection_fragment_clear = time_major_pre_collection_fragment_clear.183;
      D.23454 = sgen_collection_is_concurrent ();
      if (D.23454 == 0) goto <D.23455>; else goto <D.23456>;
      <D.23455>:
      nursery_section.184 = nursery_section;
      D.23458 = sgen_get_nursery_end ();
      nursery_section.184->next_data = D.23458;
      <D.23456>:
      objects_pinned = 0;
      D.23459 = major_collector.have_swept;
      *D.23459 = 0;
      xdomain_checks.185 = xdomain_checks;
      if (xdomain_checks.185 != 0) goto <D.23461>; else goto <D.23462>;
      <D.23461>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.23462>:
      concurrent_collection_in_progress.186 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.186 == 0) goto <D.23464>; else goto <D.23465>;
      <D.23464>:
      D.23466 = remset.prepare_for_major_collection;
      D.23466 ();
      <D.23465>:
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      atv = mono_100ns_ticks ();
      sgen_init_pinning ();
      if (0 != 0) goto <D.23467>; else goto <D.23468>;
      <D.23467>:
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Collecting pinned addresses\n");
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.23468>:
      highest_heap_address.188 = highest_heap_address;
      highest_heap_address.189 = (void *) highest_heap_address.188;
      lowest_heap_address.190 = lowest_heap_address;
      lowest_heap_address.191 = (void *) lowest_heap_address.190;
      pin_from_roots (lowest_heap_address.191, highest_heap_address.189, &gray_queue);
      concurrent_collection_in_progress.192 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.192 == 0) goto <D.23474>; else goto <D.23477>;
      <D.23477>:
      if (finish_up_concurrent_mark != 0) goto <D.23474>; else goto <D.23475>;
      <D.23474>:
      D.23478 = major_collector.is_concurrent;
      if (D.23478 != 0) goto <D.23479>; else goto <D.23480>;
      <D.23479>:
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      <D.23480>:
      concurrent_collection_in_progress.193 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.193 == 0) goto <D.23482>; else goto <D.23483>;
      <D.23482>:
      sgen_cement_reset ();
      <D.23483>:
      <D.23475>:
      sgen_optimize_pin_queue (0);
      concurrent_collection_in_progress.194 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.194 != 0) goto <D.23485>; else goto <D.23486>;
      <D.23485>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.23486>:
      if (0 != 0) goto <D.23487>; else goto <D.23488>;
      <D.23487>:
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Pinning from sections\n");
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.23488>:
      nursery_section.184 = nursery_section;
      sgen_find_section_pin_queue_start_end (nursery_section.184);
      D.23489 = major_collector.find_pin_queue_start_ends;
      D.23489 (&gray_queue);
      if (0 != 0) goto <D.23490>; else goto <D.23491>;
      <D.23490>:
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Pinning from large objects\n");
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.23491>:
      bigobj = los_object_list;
      goto <D.20683>;
      <D.20682>:
      {
        int dummy;

        try
          {
            D.23492 = sgen_los_object_size (bigobj);
            D.23493 = &bigobj->data[D.23492];
            D.23494 = &bigobj->data;
            D.23495 = sgen_find_optimized_pin_queue_area (D.23494, D.23493, &dummy);
            if (D.23495 != 0B) goto <D.23496>; else goto <D.23497>;
            <D.23496>:
            D.23494 = &bigobj->data;
            D.23498 = sgen_los_object_is_pinned (D.23494);
            if (D.23498 != 0) goto <D.23499>; else goto <D.23500>;
            <D.23499>:
            D.23501 = finish_up_concurrent_mark == 0;
            D.23502 = (long int) D.23501;
            D.23503 = __builtin_expect (D.23502, 0);
            if (D.23503 != 0) goto <D.23504>; else goto <D.23505>;
            <D.23504>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2919, "finish_up_concurrent_mark");
            <D.23505>:
            // predicted unlikely by continue predictor.
            goto <D.20681>;
            <D.23500>:
            D.23494 = &bigobj->data;
            sgen_los_pin_object (D.23494);
            D.23494 = &bigobj->data;
            D.23506 = MEM[(mword *)D.23494];
            D.23507 = D.23506 & 4294967292;
            D.23508 = (struct MonoVTable *) D.23507;
            D.23509 = D.23508->gc_descr;
            D.23510 = (unsigned int) D.23509;
            D.23511 = sgen_gc_descr_has_references (D.23510);
            if (D.23511 != 0) goto <D.23512>; else goto <D.23513>;
            <D.23512>:
            D.23518 = gray_queue.first;
            if (D.23518 == 0B) goto <D.23515>; else goto <D.23519>;
            <D.23519>:
            D.23518 = gray_queue.first;
            D.23520 = D.23518->end;
            if (D.23520 == 125) goto <D.23515>; else goto <D.23516>;
            <D.23515>:
            iftmp.195 = 1;
            goto <D.23517>;
            <D.23516>:
            iftmp.195 = 0;
            <D.23517>:
            D.23521 = iftmp.195 != 0;
            D.23522 = (long int) D.23521;
            D.23523 = __builtin_expect (D.23522, 0);
            if (D.23523 != 0) goto <D.23524>; else goto <D.23525>;
            <D.23524>:
            D.23494 = &bigobj->data;
            sgen_gray_object_enqueue (&gray_queue, D.23494);
            goto <D.23526>;
            <D.23525>:
            D.23518 = gray_queue.first;
            D.23518 = gray_queue.first;
            D.23520 = D.23518->end;
            D.23527 = D.23520;
            D.23528 = D.23527 + 1;
            D.23518->end = D.23528;
            D.23494 = &bigobj->data;
            D.23518->objects[D.23527] = D.23494;
            <D.23526>:
            D.23494 = &bigobj->data;
            __builtin_prefetch (D.23494);
            <D.23513>:
            do_pin_stats.196 = do_pin_stats;
            D.23530 = do_pin_stats.196 != 0;
            D.23531 = (long int) D.23530;
            D.23532 = __builtin_expect (D.23531, 0);
            if (D.23532 != 0) goto <D.23533>; else goto <D.23534>;
            <D.23533>:
            D.23494 = &bigobj->data;
            D.23535 = sgen_safe_object_get_size (D.23494);
            D.23494 = &bigobj->data;
            sgen_pin_stats_register_object (D.23494, D.23535);
            <D.23534>:
            if (0 != 0) goto <D.23536>; else goto <D.23537>;
            <D.23536>:
            D.23538 = sgen_los_object_size (bigobj);
            D.23494 = &bigobj->data;
            D.23539 = safe_name (D.23494);
            D.23494 = &bigobj->data;
            gc_debug_file.187 = gc_debug_file;
            fprintf (gc_debug_file.187, "Marked large object %p (%s) size: %lu from roots\n", D.23494, D.23539, D.23538);
            gc_debug_file.187 = gc_debug_file;
            fflush (gc_debug_file.187);
            <D.23537>:
            if (profile_roots != 0) goto <D.23540>; else goto <D.23541>;
            <D.23540>:
            D.23494 = &bigobj->data;
            add_profile_gc_root (&root_report, D.23494, 260, 0);
            <D.23541>:
            <D.23497>:
          }
        finally
          {
            dummy = {CLOBBER};
          }
      }
      <D.20681>:
      bigobj = bigobj->next;
      <D.20683>:
      if (bigobj != 0B) goto <D.20682>; else goto <D.20684>;
      <D.20684>:
      if (profile_roots != 0) goto <D.23542>; else goto <D.23543>;
      <D.23542>:
      notify_gc_roots (&root_report);
      <D.23543>:
      concurrent_collection_in_progress.198 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.198 != 0) goto <D.23546>; else goto <D.23547>;
      <D.23546>:
      iftmp.197 = current_object_ops.scan_object;
      goto <D.23548>;
      <D.23547>:
      iftmp.197 = 0B;
      <D.23548>:
      ctx.scan_func = iftmp.197;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      concurrent_collection_in_progress.199 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.199 != 0) goto <D.23552>; else goto <D.23549>;
      <D.23552>:
      D.23553 = sgen_minor_collector.is_split;
      if (D.23553 != 0) goto <D.23554>; else goto <D.23549>;
      <D.23554>:
      scan_nursery_objects (ctx);
      goto <D.23550>;
      <D.23549>:
      nursery_section.184 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.184, ctx);
      check_nursery_objects_pinned.200 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.200 != 0) goto <D.23556>; else goto <D.23557>;
      <D.23556>:
      D.23553 = sgen_minor_collector.is_split;
      if (D.23553 == 0) goto <D.23558>; else goto <D.23559>;
      <D.23558>:
      concurrent_collection_in_progress.202 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.202 == 0) goto <D.23561>; else goto <D.23565>;
      <D.23565>:
      if (finish_up_concurrent_mark != 0) goto <D.23561>; else goto <D.23562>;
      <D.23561>:
      iftmp.201 = 1;
      goto <D.23563>;
      <D.23562>:
      iftmp.201 = 0;
      <D.23563>:
      sgen_check_nursery_objects_pinned (iftmp.201);
      <D.23559>:
      <D.23557>:
      <D.23550>:
      D.23566 = major_collector.pin_objects;
      D.23566 (&gray_queue);
      if (old_next_pin_slot != 0B) goto <D.23567>; else goto <D.23568>;
      <D.23567>:
      D.23569 = sgen_get_pinned_count ();
      *old_next_pin_slot = D.23569;
      <D.23568>:
      btv = mono_100ns_ticks ();
      D.23448 = btv - atv;
      D.23449 = D.23448 / 10;
      D.23450 = (int) D.23449;
      D.23451 = (long long int) D.23450;
      time_major_pinning.203 = time_major_pinning;
      time_major_pinning.204 = D.23451 + time_major_pinning.203;
      time_major_pinning = time_major_pinning.204;
      gc_debug_level.205 = gc_debug_level;
      D.23573 = gc_debug_level.205 > 1;
      D.23574 = (long int) D.23573;
      D.23575 = __builtin_expect (D.23574, 0);
      if (D.23575 != 0) goto <D.23576>; else goto <D.23577>;
      <D.23576>:
      D.23448 = btv - atv;
      D.23449 = D.23448 / 10;
      D.23450 = (int) D.23449;
      D.23578 = sgen_get_pinned_count ();
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Finding pinned pointers: %d in %d usecs\n", D.23578, D.23450);
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.23577>:
      if (0 != 0) goto <D.23579>; else goto <D.23580>;
      <D.23579>:
      D.23581 = sgen_get_pinned_count ();
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Start scan with %d pinned objects\n", D.23581);
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.23580>:
      D.23582 = major_collector.init_to_space;
      D.23582 ();
      concurrent_collection_in_progress.206 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.206 == 0) goto <D.23584>; else goto <D.23585>;
      <D.23584>:
      D.23586 = major_collector.is_parallel;
      if (D.23586 != 0) goto <D.23587>; else goto <D.23588>;
      <D.23587>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.23588>:
      <D.23585>:
      D.23589 = mono_profiler_get_events ();
      D.23590 = D.23589 & 1048576;
      if (D.23590 != 0) goto <D.23591>; else goto <D.23592>;
      <D.23591>:
      report_registered_roots ();
      <D.23592>:
      atv = mono_100ns_ticks ();
      D.23593 = atv - btv;
      D.23594 = D.23593 / 10;
      D.23595 = (int) D.23594;
      D.23596 = (long long int) D.23595;
      time_major_scan_pinned.207 = time_major_scan_pinned;
      time_major_scan_pinned.208 = D.23596 + time_major_scan_pinned.207;
      time_major_scan_pinned = time_major_scan_pinned.208;
      scrrjd_normal = sgen_alloc_internal_dynamic (20, 20, 1);
      D.23599 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.23599;
      D.23600 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.23600;
      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.23599 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.23599;
      D.23600 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.23600;
      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.23448 = btv - atv;
      D.23449 = D.23448 / 10;
      D.23450 = (int) D.23449;
      D.23451 = (long long int) D.23450;
      time_major_scan_registered_roots.209 = time_major_scan_registered_roots;
      time_major_scan_registered_roots.210 = D.23451 + time_major_scan_registered_roots.209;
      time_major_scan_registered_roots = time_major_scan_registered_roots.210;
      stdjd = sgen_alloc_internal_dynamic (8, 20, 1);
      stdjd->heap_start = heap_start;
      stdjd->heap_end = heap_end;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.23593 = atv - btv;
      D.23594 = D.23593 / 10;
      D.23595 = (int) D.23594;
      D.23596 = (long long int) D.23595;
      time_major_scan_thread_data.211 = time_major_scan_thread_data;
      time_major_scan_thread_data.212 = D.23596 + time_major_scan_thread_data.211;
      time_major_scan_thread_data = time_major_scan_thread_data.212;
      btv = mono_100ns_ticks ();
      D.23448 = btv - atv;
      D.23449 = D.23448 / 10;
      D.23450 = (int) D.23449;
      D.23451 = (long long int) D.23450;
      time_major_scan_alloc_pinned.213 = time_major_scan_alloc_pinned;
      time_major_scan_alloc_pinned.214 = D.23451 + time_major_scan_alloc_pinned.213;
      time_major_scan_alloc_pinned = time_major_scan_alloc_pinned.214;
      D.23607 = mono_profiler_get_events ();
      D.23608 = D.23607 & 1048576;
      if (D.23608 != 0) goto <D.23609>; else goto <D.23610>;
      <D.23609>:
      report_finalizer_roots ();
      <D.23610>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (4, 20, 1);
      fin_ready_list.215 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.215;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (4, 20, 1);
      critical_fin_list.216 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.216;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      if (scan_mod_union != 0) goto <D.23613>; else goto <D.23614>;
      <D.23613>:
      D.23501 = finish_up_concurrent_mark == 0;
      D.23502 = (long int) D.23501;
      D.23503 = __builtin_expect (D.23502, 0);
      if (D.23503 != 0) goto <D.23615>; else goto <D.23616>;
      <D.23615>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3038, "finish_up_concurrent_mark");
      <D.23616>:
      sgen_workers_enqueue_job (job_scan_major_mod_union_cardtable, 0B);
      sgen_workers_enqueue_job (job_scan_los_mod_union_cardtable, 0B);
      <D.23614>:
      atv = mono_100ns_ticks ();
      D.23593 = atv - btv;
      D.23594 = D.23593 / 10;
      D.23595 = (int) D.23594;
      D.23596 = (long long int) D.23595;
      time_major_scan_finalized.217 = time_major_scan_finalized;
      time_major_scan_finalized.218 = D.23596 + time_major_scan_finalized.217;
      time_major_scan_finalized = time_major_scan_finalized.218;
      gc_debug_level.205 = gc_debug_level;
      D.23573 = gc_debug_level.205 > 1;
      D.23574 = (long int) D.23573;
      D.23575 = __builtin_expect (D.23574, 0);
      if (D.23575 != 0) goto <D.23619>; else goto <D.23620>;
      <D.23619>:
      D.23593 = atv - btv;
      D.23594 = D.23593 / 10;
      D.23595 = (int) D.23594;
      gc_debug_file.187 = gc_debug_file;
      fprintf (gc_debug_file.187, "Root scan: %d usecs\n", D.23595);
      gc_debug_file.187 = gc_debug_file;
      fflush (gc_debug_file.187);
      <D.23620>:
      btv = mono_100ns_ticks ();
      D.23448 = btv - atv;
      D.23449 = D.23448 / 10;
      D.23450 = (int) D.23449;
      D.23451 = (long long int) D.23450;
      time_major_scan_big_objects.219 = time_major_scan_big_objects;
      time_major_scan_big_objects.220 = D.23451 + time_major_scan_big_objects.219;
      time_major_scan_big_objects = time_major_scan_big_objects.220;
      concurrent_collection_in_progress.221 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.221 != 0) goto <D.23624>; else goto <D.23625>;
      <D.23624>:
      sgen_finish_pinning ();
      sgen_pin_stats_reset ();
      do_concurrent_checks.180 = do_concurrent_checks;
      if (do_concurrent_checks.180 != 0) goto <D.23626>; else goto <D.23627>;
      <D.23626>:
      check_nursery_is_clean ();
      <D.23627>:
      <D.23625>:
    }
  finally
    {
      root_report = {CLOBBER};
      ctx = {CLOBBER};
    }
}


job_scan_los_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.222;
  _Bool D.23631;
  long int D.23632;
  long int D.23633;
  struct SgenGrayQueue * D.23636;

  concurrent_collection_in_progress.222 = concurrent_collection_in_progress;
  D.23631 = concurrent_collection_in_progress.222 == 0;
  D.23632 = (long int) D.23631;
  D.23633 = __builtin_expect (D.23632, 0);
  if (D.23633 != 0) goto <D.23634>; else goto <D.23635>;
  <D.23634>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2390, "concurrent_collection_in_progress");
  <D.23635>:
  D.23636 = sgen_workers_get_job_gray_queue (worker_data);
  sgen_los_scan_card_table (1, D.23636);
}


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

  if (worker_data != 0B) goto <D.23639>; else goto <D.23640>;
  <D.23639>:
  iftmp.223 = &worker_data->private_gray_queue;
  goto <D.23641>;
  <D.23640>:
  iftmp.223 = &gray_queue;
  <D.23641>:
  D.23637 = iftmp.223;
  return D.23637;
}


job_scan_major_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.224;
  _Bool D.23644;
  long int D.23645;
  long int D.23646;
  void (*<T2c55>) (gboolean, struct SgenGrayQueue *) D.23649;
  struct SgenGrayQueue * D.23650;

  concurrent_collection_in_progress.224 = concurrent_collection_in_progress;
  D.23644 = concurrent_collection_in_progress.224 == 0;
  D.23645 = (long int) D.23644;
  D.23646 = __builtin_expect (D.23645, 0);
  if (D.23646 != 0) goto <D.23647>; else goto <D.23648>;
  <D.23647>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2383, "concurrent_collection_in_progress");
  <D.23648>:
  D.23649 = major_collector.scan_card_table;
  D.23650 = sgen_workers_get_job_gray_queue (worker_data);
  D.23649 (1, D.23650);
}


job_scan_finalizer_entries (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2b53>) (void * *, struct SgenGrayQueue *) D.23651;
  struct SgenGrayQueue * D.23652;
  struct FinalizeReadyEntry * D.23653;
  struct ScanFinalizerEntriesJobData * job_data;
  struct ScanCopyContext ctx;

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


scan_finalizer_entries (struct FinalizeReadyEntry * list, struct ScanCopyContext ctx)
{
  void * D.23654;
  const char * D.23659;
  struct FILE * gc_debug_file.225;
  void * * D.23661;
  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.20408>;
  <D.20407>:
  D.23654 = fin->object;
  if (D.23654 == 0B) goto <D.23655>; else goto <D.23656>;
  <D.23655>:
  // predicted unlikely by continue predictor.
  goto <D.20406>;
  <D.23656>:
  if (0 != 0) goto <D.23657>; else goto <D.23658>;
  <D.23657>:
  D.23654 = fin->object;
  D.23659 = safe_name (D.23654);
  D.23654 = fin->object;
  gc_debug_file.225 = gc_debug_file;
  fprintf (gc_debug_file.225, "Scan of fin ready object: %p (%s)\n\n", D.23654, D.23659);
  gc_debug_file.225 = gc_debug_file;
  fflush (gc_debug_file.225);
  <D.23658>:
  D.23661 = &fin->object;
  copy_func (D.23661, queue);
  <D.20406>:
  fin = fin->next;
  <D.20408>:
  if (fin != 0B) goto <D.20407>; else goto <D.20409>;
  <D.20409>:
}


job_scan_thread_data (struct WorkerData * worker_data, void * job_data_untyped)
{
  struct SgenGrayQueue * D.23662;
  char * D.23663;
  char * D.23664;
  struct ScanThreadDataJobData * job_data;

  job_data = job_data_untyped;
  D.23662 = sgen_workers_get_job_gray_queue (worker_data);
  D.23663 = job_data->heap_end;
  D.23664 = job_data->heap_start;
  scan_thread_data (D.23664, D.23663, 1, D.23662);
  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.23665;
  struct MonoLinkedListSetNode * D.23666;
  unsigned int D.23667;
  int D.23670;
  void * D.23675;
  int D.23676;
  void * D.23677;
  int D.23678;
  int D.23679;
  struct FILE * gc_debug_file.226;
  int D.23681;
  int D.23686;
  int D.23687;
  int D.23694;
  void (*<T2a0c>) (void *, guint8 *, guint8 *, gboolean) D.23697;
  int conservative_stack_mark.227;
  void * D.23701;
  struct _IO_FILE * stderr.228;
  struct MonoContext * D.23709;
  void * * D.23710;
  struct SgenThreadInfo * info;

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

    D.23665 = mono_thread_info_list_head ();
    __cur = D.23665->head;
    goto <D.20912>;
    <D.20911>:
    D.23666 = __cur->next;
    D.23667 = mono_lls_pointer_get_mark (D.23666);
    if (D.23667 == 0) goto <D.23668>; else goto <D.23669>;
    <D.23668>:
    info = __cur;
    D.23670 = info->skip;
    if (D.23670 != 0) goto <D.23671>; else goto <D.23672>;
    <D.23671>:
    if (0 != 0) goto <D.23673>; else goto <D.23674>;
    <D.23673>:
    D.23675 = info->stack_end;
    D.23676 = (int) D.23675;
    D.23677 = info->stack_start;
    D.23678 = (int) D.23677;
    D.23679 = D.23676 - D.23678;
    D.23675 = info->stack_end;
    D.23677 = info->stack_start;
    gc_debug_file.226 = gc_debug_file;
    fprintf (gc_debug_file.226, "Skipping dead thread %p, range: %p-%p, size: %td\n", info, D.23677, D.23675, D.23679);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.23674>:
    // predicted unlikely by continue predictor.
    goto <D.20909>;
    <D.23672>:
    D.23681 = info->gc_disabled;
    if (D.23681 != 0) goto <D.23682>; else goto <D.23683>;
    <D.23682>:
    if (0 != 0) goto <D.23684>; else goto <D.23685>;
    <D.23684>:
    D.23675 = info->stack_end;
    D.23676 = (int) D.23675;
    D.23677 = info->stack_start;
    D.23678 = (int) D.23677;
    D.23679 = D.23676 - D.23678;
    D.23675 = info->stack_end;
    D.23677 = info->stack_start;
    gc_debug_file.226 = gc_debug_file;
    fprintf (gc_debug_file.226, "GC disabled for thread %p, range: %p-%p, size: %td\n", info, D.23677, D.23675, D.23679);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.23685>:
    // predicted unlikely by continue predictor.
    goto <D.20909>;
    <D.23683>:
    D.23686 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.23687 = D.23686 & 15;
    if (D.23687 != 1) goto <D.23688>; else goto <D.23689>;
    <D.23688>:
    if (0 != 0) goto <D.23690>; else goto <D.23691>;
    <D.23690>:
    D.23686 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.23687 = D.23686 & 15;
    D.23675 = info->stack_end;
    D.23676 = (int) D.23675;
    D.23677 = info->stack_start;
    D.23678 = (int) D.23677;
    D.23679 = D.23676 - D.23678;
    D.23675 = info->stack_end;
    D.23677 = info->stack_start;
    gc_debug_file.226 = gc_debug_file;
    fprintf (gc_debug_file.226, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)\n", info, D.23677, D.23675, D.23679, D.23687);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.23691>:
    // predicted unlikely by continue predictor.
    goto <D.20909>;
    <D.23689>:
    if (0 != 0) goto <D.23692>; else goto <D.23693>;
    <D.23692>:
    D.23694 = sgen_get_pinned_count ();
    D.23675 = info->stack_end;
    D.23676 = (int) D.23675;
    D.23677 = info->stack_start;
    D.23678 = (int) D.23677;
    D.23679 = D.23676 - D.23678;
    D.23675 = info->stack_end;
    D.23677 = info->stack_start;
    gc_debug_file.226 = gc_debug_file;
    fprintf (gc_debug_file.226, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d\n", info, D.23677, D.23675, D.23679, D.23694);
    gc_debug_file.226 = gc_debug_file;
    fflush (gc_debug_file.226);
    <D.23693>:
    D.23697 = gc_callbacks.thread_mark_func;
    if (D.23697 != 0B) goto <D.23698>; else goto <D.23695>;
    <D.23698>:
    conservative_stack_mark.227 = conservative_stack_mark;
    if (conservative_stack_mark.227 == 0) goto <D.23700>; else goto <D.23695>;
    <D.23700>:
    {
      struct UserCopyOrMarkData data;

      try
        {
          data.func = 0B;
          data.queue = queue;
          set_user_copy_or_mark_data (&data);
          D.23697 = gc_callbacks.thread_mark_func;
          D.23675 = info->stack_end;
          D.23677 = info->stack_start;
          D.23701 = info->runtime_data;
          D.23697 (D.23701, D.23677, D.23675, precise);
          set_user_copy_or_mark_data (0B);
        }
      finally
        {
          data = {CLOBBER};
        }
    }
    goto <D.23696>;
    <D.23695>:
    if (precise == 0) goto <D.23702>; else goto <D.23703>;
    <D.23702>:
    conservative_stack_mark.227 = conservative_stack_mark;
    if (conservative_stack_mark.227 == 0) goto <D.23704>; else goto <D.23705>;
    <D.23704>:
    stderr.228 = stderr;
    fprintf (stderr.228, "Precise stack mark not supported - disabling.\n");
    conservative_stack_mark = 1;
    <D.23705>:
    D.23675 = info->stack_end;
    D.23677 = info->stack_start;
    conservatively_pin_objects_from (D.23677, D.23675, start_nursery, end_nursery, 0);
    <D.23703>:
    <D.23696>:
    if (precise == 0) goto <D.23707>; else goto <D.23708>;
    <D.23707>:
    D.23709 = &info->ctx;
    D.23710 = D.23709 + 32;
    D.23709 = &info->ctx;
    conservatively_pin_objects_from (D.23709, D.23710, start_nursery, end_nursery, 0);
    <D.23708>:
    <D.23669>:
    <D.20909>:
    D.23666 = __cur->next;
    __cur = mono_lls_pointer_unmask (D.23666);
    <D.20912>:
    if (__cur != 0B) goto <D.20911>; else goto <D.20913>;
    <D.20913>:
  }
}


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

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


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

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


mono_native_tls_set_value (pthread_key_t key, void * value)
{
  int D.23715;
  int D.23716;
  _Bool D.23717;

  D.23716 = pthread_setspecific (key, value);
  D.23717 = D.23716 == 0;
  D.23715 = (int) D.23717;
  return D.23715;
}


conservatively_pin_objects_from (void * * start, void * * end, void * start_nursery, void * end_nursery, int pin_type)
{
  volatile unsigned int D.20225;
  unsigned int start.231;
  int end.232;
  int start.233;
  int D.23722;
  unsigned int D.23723;
  void * D.23724;
  unsigned int start_nursery.234;
  _Bool D.23730;
  unsigned int end_nursery.235;
  _Bool D.23732;
  _Bool D.23733;
  void * addr.236;
  struct FILE * gc_debug_file.237;
  int do_pin_stats.238;
  _Bool D.23741;
  long int D.23742;
  long int D.23743;
  int D.23746;
  char * addr.239;
  int count;

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

    _zzq_args[0] = 1296236555;
    start.231 = (unsigned int) start;
    _zzq_args[1] = start.231;
    end.232 = (int) end;
    start.233 = (int) start;
    D.23722 = end.232 - start.233;
    D.23723 = (unsigned int) D.23722;
    _zzq_args[2] = D.23723;
    _zzq_args[3] = 0;
    _zzq_args[4] = 0;
    _zzq_args[5] = 0;
    __asm__ __volatile__("roll $3,  %%edi ; roll $13, %%edi
	roll $29, %%edi ; roll $19, %%edi
	xchgl %%ebx,%%ebx" : "=d" _zzq_result : "a" &_zzq_args[0], "0" 0 : "memory", "cc");
    D.20225 = _zzq_result;
  }
  goto <D.20228>;
  <D.20227>:
  D.23724 = *start;
  if (D.23724 >= start_nursery) goto <D.23725>; else goto <D.23726>;
  <D.23725>:
  D.23724 = *start;
  if (D.23724 < end_nursery) goto <D.23727>; else goto <D.23728>;
  <D.23727>:
  {
    mword addr;

    D.23724 = *start;
    addr = (mword) D.23724;
    addr = addr & 4294967288;
    start_nursery.234 = (unsigned int) start_nursery;
    D.23730 = start_nursery.234 <= addr;
    end_nursery.235 = (unsigned int) end_nursery;
    D.23732 = end_nursery.235 > addr;
    D.23733 = D.23730 & D.23732;
    if (D.23733 != 0) goto <D.23734>; else goto <D.23735>;
    <D.23734>:
    if (0 != 0) goto <D.23736>; else goto <D.23737>;
    <D.23736>:
    addr.236 = (void *) addr;
    gc_debug_file.237 = gc_debug_file;
    fprintf (gc_debug_file.237, "Pinning address %p from %p\n", addr.236, start);
    gc_debug_file.237 = gc_debug_file;
    fflush (gc_debug_file.237);
    <D.23737>:
    addr.236 = (void *) addr;
    sgen_pin_stage_ptr (addr.236);
    count = count + 1;
    <D.23735>:
    do_pin_stats.238 = do_pin_stats;
    D.23741 = do_pin_stats.238 != 0;
    D.23742 = (long int) D.23741;
    D.23743 = __builtin_expect (D.23742, 0);
    if (D.23743 != 0) goto <D.23744>; else goto <D.23745>;
    <D.23744>:
    addr.236 = (void *) addr;
    D.23746 = sgen_ptr_in_nursery (addr.236);
    if (D.23746 != 0) goto <D.23747>; else goto <D.23748>;
    <D.23747>:
    addr.239 = (char *) addr;
    sgen_pin_stats_register_address (addr.239, pin_type);
    <D.23748>:
    <D.23745>:
  }
  <D.23728>:
  <D.23726>:
  start = start + 4;
  <D.20228>:
  if (start < end) goto <D.20227>; else goto <D.20229>;
  <D.20229>:
  if (count != 0) goto <D.23750>; else goto <D.23751>;
  <D.23750>:
  if (0 != 0) goto <D.23752>; else goto <D.23753>;
  <D.23752>:
  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.23753>:
  <D.23751>:
}


mono_lls_pointer_unmask (void * p)
{
  void * D.23754;
  unsigned int p.240;
  unsigned int D.23756;

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


job_scan_from_registered_roots (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2b58>) (char *, struct SgenGrayQueue *) D.23758;
  void (*<T2b53>) (void * *, struct SgenGrayQueue *) D.23759;
  struct SgenGrayQueue * D.23760;
  int D.23761;
  char * D.23762;
  char * D.23763;
  struct ScanFromRegisteredRootsJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      D.23758 = job_data->scan_func;
      ctx.scan_func = D.23758;
      D.23759 = job_data->copy_or_mark_func;
      ctx.copy_func = D.23759;
      D.23760 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.23760;
      D.23761 = job_data->root_type;
      D.23762 = job_data->heap_end;
      D.23763 = job_data->heap_start;
      scan_from_registered_roots (D.23763, D.23762, D.23761, 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.23764;
  unsigned int D.23767;
  void * D.23768;
  char * D.23769;
  struct FILE * gc_debug_file.241;
  struct SgenHashTableEntry * D.23771;
  unsigned int D.23772;
  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.20470>;
    <D.20469>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.23764 = __i * 4;
      __iter = __table + D.23764;
      goto <D.20467>;
      <D.20466>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.23765>; else goto <D.23766>;
        <D.23765>:
        D.23767 = root->root_desc;
        D.23768 = (void *) D.23767;
        D.23769 = root->end_root;
        gc_debug_file.241 = gc_debug_file;
        fprintf (gc_debug_file.241, "Precise root scan %p-%p (desc: %p)\n", start_root, D.23769, D.23768);
        gc_debug_file.241 = gc_debug_file;
        fflush (gc_debug_file.241);
        <D.23766>:
        D.23767 = root->root_desc;
        D.23769 = root->end_root;
        precisely_scan_objects_from (start_root, D.23769, addr_start, addr_end, D.23767, ctx);
      }
      __iter = __next;
      <D.20467>:
      D.23771 = *__iter;
      if (D.23771 != 0B) goto <D.20466>; else goto <D.20468>;
      <D.20468>:
    }
    __i = __i + 1;
    <D.20470>:
    D.23772 = roots_hash[root_type].size;
    if (D.23772 > __i) goto <D.20469>; else goto <D.20471>;
    <D.20471>:
  }
}


precisely_scan_objects_from (void * * start_root, void * * end_root, char * n_start, char * n_end, mword desc, struct ScanCopyContext ctx)
{
  unsigned int D.23773;
  unsigned int D.23774;
  void * D.23777;
  struct FILE * gc_debug_file.242;
  unsigned int D.23783;
  unsigned int D.23784;
  gsize * bitmap_data.243;
  unsigned int D.23786;
  void * D.23789;
  int bwords.244;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct SgenGrayQueue * queue;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  D.23773 = desc & 7;
  switch (D.23773) <default: <D.20301>, case 1: <D.20280>, case 2: <D.20300>, case 3: <D.20284>, case 4: <D.20297>>
  <D.20280>:
  desc = desc >> 3;
  goto <D.20282>;
  <D.20281>:
  D.23774 = desc & 1;
  if (D.23774 != 0) goto <D.23775>; else goto <D.23776>;
  <D.23775>:
  D.23777 = *start_root;
  if (D.23777 != 0B) goto <D.23778>; else goto <D.23779>;
  <D.23778>:
  copy_func (start_root, queue);
  if (0 != 0) goto <D.23780>; else goto <D.23781>;
  <D.23780>:
  D.23777 = *start_root;
  gc_debug_file.242 = gc_debug_file;
  fprintf (gc_debug_file.242, "Overwrote root at %p with %p\n", start_root, D.23777);
  gc_debug_file.242 = gc_debug_file;
  fflush (gc_debug_file.242);
  <D.23781>:
  sgen_drain_gray_stack (-1, ctx);
  <D.23779>:
  <D.23776>:
  desc = desc >> 1;
  start_root = start_root + 4;
  <D.20282>:
  if (desc != 0) goto <D.20281>; else goto <D.20283>;
  <D.20283>:
  return;
  <D.20284>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.23783 = *bitmap_data;
    D.23784 = D.23783 + 4294967295;
    bwords = (int) D.23784;
    start_run = start_root;
    bitmap_data = bitmap_data + 4;
    goto <D.20294>;
    <D.20293>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.243 = bitmap_data;
      bitmap_data = bitmap_data.243 + 4;
      bmap = *bitmap_data.243;
      objptr = start_run;
      goto <D.20291>;
      <D.20290>:
      D.23786 = bmap & 1;
      if (D.23786 != 0) goto <D.23787>; else goto <D.23788>;
      <D.23787>:
      D.23789 = *objptr;
      if (D.23789 != 0B) goto <D.23790>; else goto <D.23791>;
      <D.23790>:
      copy_func (objptr, queue);
      if (0 != 0) goto <D.23792>; else goto <D.23793>;
      <D.23792>:
      D.23789 = *objptr;
      gc_debug_file.242 = gc_debug_file;
      fprintf (gc_debug_file.242, "Overwrote root at %p with %p\n", objptr, D.23789);
      gc_debug_file.242 = gc_debug_file;
      fflush (gc_debug_file.242);
      <D.23793>:
      sgen_drain_gray_stack (-1, ctx);
      <D.23791>:
      <D.23788>:
      bmap = bmap >> 1;
      objptr = objptr + 4;
      <D.20291>:
      if (bmap != 0) goto <D.20290>; else goto <D.20292>;
      <D.20292>:
      start_run = start_run + 128;
    }
    <D.20294>:
    bwords.244 = bwords;
    bwords = bwords.244 + -1;
    if (bwords.244 > 0) goto <D.20293>; else goto <D.20295>;
    <D.20295>:
    goto <D.20296>;
  }
  <D.20297>:
  {
    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.20296>;
      }
    finally
      {
        data = {CLOBBER};
      }
  }
  <D.20300>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1637);
  <D.20301>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1639);
  <D.20296>:
}


single_arg_user_copy_or_mark (void * * obj)
{
  unsigned int user_copy_or_mark_key.245;
  void (*<T2b53>) (void * *, struct SgenGrayQueue *) D.23798;
  struct GrayQueue * D.23799;
  struct UserCopyOrMarkData * data;

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


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


init_gray_queue ()
{
  int D.23803;
  int D.23805;
  struct SgenSectionGrayQueue * D.23806;

  D.23803 = sgen_collection_is_parallel ();
  if (D.23803 != 0) goto <D.23800>; else goto <D.23804>;
  <D.23804>:
  D.23805 = sgen_collection_is_concurrent ();
  if (D.23805 != 0) goto <D.23800>; else goto <D.23801>;
  <D.23800>:
  sgen_workers_init_distribute_gray_queue ();
  D.23806 = sgen_workers_get_distribute_section_gray_queue ();
  sgen_gray_object_queue_init_with_alloc_prepare (&gray_queue, 0B, gray_queue_redirect, D.23806);
  goto <D.23802>;
  <D.23801>:
  sgen_gray_object_queue_init (&gray_queue, 0B);
  <D.23802>:
}


gray_queue_redirect (struct SgenGrayQueue * queue)
{
  void * D.23808;
  int iftmp.246;
  int concurrent_collection_in_progress.247;
  int current_collection_generation.248;
  int D.23819;
  _Bool D.23820;
  long int D.23821;
  long int D.23822;
  int D.23825;
  int concurrent_collection_in_progress.249;
  _Bool D.23832;
  long int D.23833;
  long int D.23834;
  gboolean wake;

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

    section = sgen_gray_object_dequeue_section (queue);
    if (section == 0B) goto <D.19593>; else goto <D.23807>;
    <D.23807>:
    D.23808 = queue->alloc_prepare_data;
    sgen_section_gray_queue_enqueue (D.23808, section);
    wake = 1;
  }
  goto <D.19594>;
  <D.19593>:
  if (wake != 0) goto <D.23809>; else goto <D.23810>;
  <D.23809>:
  concurrent_collection_in_progress.247 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.247 == 0) goto <D.23816>; else goto <D.23812>;
  <D.23816>:
  current_collection_generation.248 = current_collection_generation;
  if (current_collection_generation.248 != 1) goto <D.23813>; else goto <D.23818>;
  <D.23818>:
  D.23819 = major_collector.is_parallel;
  if (D.23819 == 0) goto <D.23813>; else goto <D.23812>;
  <D.23813>:
  iftmp.246 = 1;
  goto <D.23814>;
  <D.23812>:
  iftmp.246 = 0;
  <D.23814>:
  D.23820 = iftmp.246 != 0;
  D.23821 = (long int) D.23820;
  D.23822 = __builtin_expect (D.23821, 0);
  if (D.23822 != 0) goto <D.23823>; else goto <D.23824>;
  <D.23823>:
  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.23824>:
  D.23825 = sgen_workers_have_started ();
  if (D.23825 != 0) goto <D.23826>; else goto <D.23827>;
  <D.23826>:
  sgen_workers_wake_up_all ();
  goto <D.23828>;
  <D.23827>:
  concurrent_collection_in_progress.249 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.249 != 0) goto <D.23830>; else goto <D.23831>;
  <D.23830>:
  current_collection_generation.248 = current_collection_generation;
  D.23832 = current_collection_generation.248 != -1;
  D.23833 = (long int) D.23832;
  D.23834 = __builtin_expect (D.23833, 0);
  if (D.23834 != 0) goto <D.23835>; else goto <D.23836>;
  <D.23835>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 607, "current_collection_generation == -1");
  <D.23836>:
  <D.23831>:
  <D.23828>:
  <D.23810>:
}


pin_from_roots (void * start_nursery, void * end_nursery, struct GrayQueue * queue)
{
  int gc_debug_level.250;
  _Bool D.23838;
  long int D.23839;
  long int D.23840;
  unsigned int D.23843;
  unsigned int D.23844;
  unsigned int roots_size.251;
  int roots_size.252;
  struct FILE * gc_debug_file.253;
  unsigned int D.23848;
  char * D.23851;
  struct SgenHashTableEntry * D.23852;
  unsigned int D.23853;
  void * * start_root;
  struct RootRecord * root;

  gc_debug_level.250 = gc_debug_level;
  D.23838 = gc_debug_level.250 > 1;
  D.23839 = (long int) D.23838;
  D.23840 = __builtin_expect (D.23839, 0);
  if (D.23840 != 0) goto <D.23841>; else goto <D.23842>;
  <D.23841>:
  D.23843 = roots_hash[1].num_entries;
  D.23844 = roots_hash[0].num_entries;
  roots_size.251 = roots_size;
  roots_size.252 = (int) roots_size.251;
  gc_debug_file.253 = gc_debug_file;
  fprintf (gc_debug_file.253, "Scanning pinned roots (%d bytes, %d/%d entries)\n", roots_size.252, D.23844, D.23843);
  gc_debug_file.253 = gc_debug_file;
  fflush (gc_debug_file.253);
  <D.23842>:
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

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

      D.23848 = __i * 4;
      __iter = __table + D.23848;
      goto <D.20244>;
      <D.20243>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.23849>; else goto <D.23850>;
        <D.23849>:
        D.23851 = root->end_root;
        gc_debug_file.253 = gc_debug_file;
        fprintf (gc_debug_file.253, "Pinned roots %p-%p\n", start_root, D.23851);
        gc_debug_file.253 = gc_debug_file;
        fflush (gc_debug_file.253);
        <D.23850>:
        D.23851 = root->end_root;
        conservatively_pin_objects_from (start_root, D.23851, start_nursery, end_nursery, 2);
      }
      __iter = __next;
      <D.20244>:
      D.23852 = *__iter;
      if (D.23852 != 0B) goto <D.20243>; else goto <D.20245>;
      <D.20245>:
    }
    __i = __i + 1;
    <D.20247>:
    D.23853 = roots_hash[1].size;
    if (D.23853 > __i) goto <D.20246>; else goto <D.20248>;
    <D.20248>:
  }
  scan_thread_data (start_nursery, end_nursery, 0, queue);
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.23854;
  gboolean D.23857;
  unsigned int D.23858;
  unsigned int D.23861;

  D.23854 = desc & 4294901767;
  if (D.23854 == 1) goto <D.23855>; else goto <D.23856>;
  <D.23855>:
  D.23857 = 0;
  return D.23857;
  <D.23856>:
  D.23858 = desc & 49159;
  if (D.23858 == 4) goto <D.23859>; else goto <D.23860>;
  <D.23859>:
  D.23857 = 0;
  return D.23857;
  <D.23860>:
  D.23861 = desc & 7;
  if (D.23861 == 7) goto <D.23862>; else goto <D.23863>;
  <D.23862>:
  D.23857 = 0;
  return D.23857;
  <D.23863>:
  D.23857 = 1;
  return D.23857;
}


scan_nursery_objects (struct ScanCopyContext ctx)
{
  struct GCMemSection * nursery_section.254;
  char * D.23866;
  char * D.23867;

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


scan_nursery_objects_callback (char * obj, size_t size, struct ScanCopyContext * ctx)
{
  void (*<T2b58>) (char *, struct SgenGrayQueue *) D.23868;
  struct SgenGrayQueue * D.23869;

  D.23868 = ctx->scan_func;
  D.23869 = ctx->queue;
  D.23868 (obj, D.23869);
}


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.23870;
  unsigned int D.23873;
  void * D.23874;
  char * D.23875;
  struct FILE * gc_debug_file.255;
  struct SgenHashTableEntry * D.23877;
  unsigned int D.23878;
  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.20394>;
        <D.20393>:
        {
          struct SgenHashTableEntry * * __iter;
          struct SgenHashTableEntry * * __next;

          D.23870 = __i * 4;
          __iter = __table + D.23870;
          goto <D.20391>;
          <D.20390>:
          {
            struct SgenHashTableEntry * __entry;

            __entry = *__iter;
            __next = &__entry->next;
            start_root = __entry->key;
            root = &__entry->data;
            if (0 != 0) goto <D.23871>; else goto <D.23872>;
            <D.23871>:
            D.23873 = root->root_desc;
            D.23874 = (void *) D.23873;
            D.23875 = root->end_root;
            gc_debug_file.255 = gc_debug_file;
            fprintf (gc_debug_file.255, "Precise root scan %p-%p (desc: %p)\n", start_root, D.23875, D.23874);
            gc_debug_file.255 = gc_debug_file;
            fflush (gc_debug_file.255);
            <D.23872>:
            D.23873 = root->root_desc;
            D.23875 = root->end_root;
            precisely_report_roots_from (&report, start_root, D.23875, D.23873);
          }
          __iter = __next;
          <D.20391>:
          D.23877 = *__iter;
          if (D.23877 != 0B) goto <D.20390>; else goto <D.20392>;
          <D.20392>:
        }
        __i = __i + 1;
        <D.20394>:
        D.23878 = roots_hash[root_type].size;
        if (D.23878 > __i) goto <D.20393>; else goto <D.20395>;
        <D.20395>:
      }
      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.23879;
  unsigned int D.23880;
  void * D.23883;
  unsigned int D.23886;
  unsigned int D.23887;
  gsize * bitmap_data.256;
  unsigned int D.23889;
  void * D.23892;
  int bwords.257;

  D.23879 = desc & 7;
  switch (D.23879) <default: <D.20377>, case 1: <D.20357>, case 2: <D.20376>, case 3: <D.20361>, case 4: <D.20374>>
  <D.20357>:
  desc = desc >> 3;
  goto <D.20359>;
  <D.20358>:
  D.23880 = desc & 1;
  if (D.23880 != 0) goto <D.23881>; else goto <D.23882>;
  <D.23881>:
  D.23883 = *start_root;
  if (D.23883 != 0B) goto <D.23884>; else goto <D.23885>;
  <D.23884>:
  D.23883 = *start_root;
  add_profile_gc_root (report, D.23883, 3, 0);
  <D.23885>:
  <D.23882>:
  desc = desc >> 1;
  start_root = start_root + 4;
  <D.20359>:
  if (desc != 0) goto <D.20358>; else goto <D.20360>;
  <D.20360>:
  return;
  <D.20361>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.23886 = *bitmap_data;
    D.23887 = D.23886 + 4294967295;
    bwords = (int) D.23887;
    start_run = start_root;
    bitmap_data = bitmap_data + 4;
    goto <D.20371>;
    <D.20370>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.256 = bitmap_data;
      bitmap_data = bitmap_data.256 + 4;
      bmap = *bitmap_data.256;
      objptr = start_run;
      goto <D.20368>;
      <D.20367>:
      D.23889 = bmap & 1;
      if (D.23889 != 0) goto <D.23890>; else goto <D.23891>;
      <D.23890>:
      D.23892 = *objptr;
      if (D.23892 != 0B) goto <D.23893>; else goto <D.23894>;
      <D.23893>:
      D.23892 = *objptr;
      add_profile_gc_root (report, D.23892, 3, 0);
      <D.23894>:
      <D.23891>:
      bmap = bmap >> 1;
      objptr = objptr + 4;
      <D.20368>:
      if (bmap != 0) goto <D.20367>; else goto <D.20369>;
      <D.20369>:
      start_run = start_run + 128;
    }
    <D.20371>:
    bwords.257 = bwords;
    bwords = bwords.257 + -1;
    if (bwords.257 > 0) goto <D.20370>; else goto <D.20372>;
    <D.20372>:
    goto <D.20373>;
  }
  <D.20374>:
  {
    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.20373>;
  }
  <D.20376>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1821);
  <D.20377>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1823);
  <D.20373>:
}


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

  D.23897 = *obj;
  if (D.23897 != 0B) goto <D.23898>; else goto <D.23899>;
  <D.23898>:
  D.23897 = *obj;
  root_report.258 = root_report;
  add_profile_gc_root (root_report.258, D.23897, 3, 0);
  <D.23899>:
}


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

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


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

  try
    {
      report.count = 0;
      fin = list;
      goto <D.20342>;
      <D.20341>:
      D.23903 = fin->object;
      if (D.23903 == 0B) goto <D.23904>; else goto <D.23905>;
      <D.23904>:
      // predicted unlikely by continue predictor.
      goto <D.20340>;
      <D.23905>:
      D.23903 = fin->object;
      add_profile_gc_root (&report, D.23903, 1, 0);
      <D.20340>:
      fin = fin->next;
      <D.20342>:
      if (fin != 0B) goto <D.20341>; else goto <D.20343>;
      <D.20343>:
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


join_workers ()
{
  int concurrent_collection_in_progress.261;
  int D.23910;
  int D.23911;
  _Bool D.23912;
  long int D.23913;
  long int D.23914;

  concurrent_collection_in_progress.261 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.261 != 0) goto <D.23906>; else goto <D.23909>;
  <D.23909>:
  D.23910 = major_collector.is_parallel;
  if (D.23910 != 0) goto <D.23906>; else goto <D.23907>;
  <D.23906>:
  gray_queue_redirect (&gray_queue);
  sgen_workers_join ();
  <D.23907>:
  D.23911 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.23912 = D.23911 == 0;
  D.23913 = (long int) D.23912;
  D.23914 = __builtin_expect (D.23913, 0);
  if (D.23914 != 0) goto <D.23915>; else goto <D.23916>;
  <D.23915>:
  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.23916>:
}


check_nursery_is_clean ()
{
  void * D.23917;
  int iftmp.262;
  unsigned int D.23923;
  unsigned int D.23924;
  unsigned int D.23926;
  _Bool D.23928;
  long int D.23929;
  long int D.23930;
  unsigned int D.23933;
  _Bool D.23934;
  long int D.23935;
  long int D.23936;
  unsigned int D.23939;
  unsigned int D.23940;
  char * D.23941;
  char * start;
  char * end;
  char * cur;

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

    D.23917 = MEM[(void * *)cur];
    if (D.23917 == 0B) goto <D.23918>; else goto <D.23919>;
    <D.23918>:
    cur = cur + 4;
    // predicted unlikely by continue predictor.
    goto <D.20624>;
    <D.23919>:
    D.23923 = MEM[(mword *)cur];
    D.23924 = D.23923 & 1;
    if (D.23924 != 0) goto <D.23925>; else goto <D.23921>;
    <D.23925>:
    D.23923 = MEM[(mword *)cur];
    D.23926 = D.23923 & 4294967292;
    if (D.23926 != 0) goto <D.23927>; else goto <D.23921>;
    <D.23927>:
    iftmp.262 = 1;
    goto <D.23922>;
    <D.23921>:
    iftmp.262 = 0;
    <D.23922>:
    D.23928 = iftmp.262 != 0;
    D.23929 = (long int) D.23928;
    D.23930 = __builtin_expect (D.23929, 0);
    if (D.23930 != 0) goto <D.23931>; else goto <D.23932>;
    <D.23931>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2468, "!object_is_forwarded (cur)");
    <D.23932>:
    D.23923 = MEM[(mword *)cur];
    D.23933 = D.23923 & 2;
    D.23934 = D.23933 != 0;
    D.23935 = (long int) D.23934;
    D.23936 = __builtin_expect (D.23935, 0);
    if (D.23936 != 0) goto <D.23937>; else goto <D.23938>;
    <D.23937>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2469, "!object_is_pinned (cur)");
    <D.23938>:
    ss = sgen_safe_object_get_size (cur);
    D.23939 = sgen_safe_object_get_size (cur);
    D.23940 = D.23939 + 7;
    size = D.23940 & 4294967288;
    D.23941 = cur + size;
    verify_scan_starts (cur, D.23941);
    cur = cur + size;
  }
  <D.20624>:
  if (cur < end) goto <D.20625>; else goto <D.20626>;
  <D.20626>:
}


verify_scan_starts (char * start, char * end)
{
  struct GCMemSection * nursery_section.263;
  char * * D.23943;
  unsigned int i.264;
  unsigned int D.23945;
  char * * D.23946;
  _Bool D.23947;
  _Bool D.23948;
  _Bool D.23949;
  int gc_debug_level.265;
  _Bool D.23953;
  long int D.23954;
  long int D.23955;
  struct FILE * gc_debug_file.266;
  unsigned int D.23959;
  int i;

  i = 0;
  goto <D.20602>;
  <D.20601>:
  {
    char * addr;

    nursery_section.263 = nursery_section;
    D.23943 = nursery_section.263->scan_starts;
    i.264 = (unsigned int) i;
    D.23945 = i.264 * 4;
    D.23946 = D.23943 + D.23945;
    addr = *D.23946;
    D.23947 = addr > start;
    D.23948 = addr < end;
    D.23949 = D.23947 & D.23948;
    if (D.23949 != 0) goto <D.23950>; else goto <D.23951>;
    <D.23950>:
    gc_debug_level.265 = gc_debug_level;
    D.23953 = gc_debug_level.265 > 0;
    D.23954 = (long int) D.23953;
    D.23955 = __builtin_expect (D.23954, 0);
    if (D.23955 != 0) goto <D.23956>; else goto <D.23957>;
    <D.23956>:
    gc_debug_file.266 = gc_debug_file;
    fprintf (gc_debug_file.266, "NFC-BAD SCAN START [%d] %p for obj [%p %p]\n", i, addr, start, end);
    gc_debug_file.266 = gc_debug_file;
    fflush (gc_debug_file.266);
    <D.23957>:
    <D.23951>:
  }
  i = i + 1;
  <D.20602>:
  i.264 = (unsigned int) i;
  nursery_section.263 = nursery_section;
  D.23959 = nursery_section.263->num_scan_start;
  if (i.264 < D.23959) goto <D.20601>; else goto <D.20603>;
  <D.20603>:
}


finish_gray_stack (int generation, struct GrayQueue * queue)
{
  char * iftmp.267;
  char * iftmp.268;
  int gc_debug_level.269;
  _Bool D.23969;
  long int D.23970;
  long int D.23971;
  const char * D.23974;
  struct FILE * gc_debug_file.270;
  int D.23976;
  int D.23979;
  long long int D.23992;
  long long int D.23993;
  int D.23994;
  const char * D.23995;
  int D.23996;
  _Bool D.23997;
  long int D.23998;
  long int D.23999;
  int D.24004;
  int D.24006;
  _Bool D.24007;
  long int D.24008;
  long int D.24009;
  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.23961>; else goto <D.23962>;
      <D.23961>:
      iftmp.267 = sgen_get_nursery_start ();
      goto <D.23963>;
      <D.23962>:
      iftmp.267 = 0B;
      <D.23963>:
      start_addr = iftmp.267;
      if (generation == 0) goto <D.23965>; else goto <D.23966>;
      <D.23965>:
      iftmp.268 = sgen_get_nursery_end ();
      goto <D.23967>;
      <D.23966>:
      iftmp.268 = 4294967295B;
      <D.23967>:
      end_addr = iftmp.268;
      sgen_drain_gray_stack (-1, ctx);
      atv = mono_100ns_ticks ();
      gc_debug_level.269 = gc_debug_level;
      D.23969 = gc_debug_level.269 > 1;
      D.23970 = (long int) D.23969;
      D.23971 = __builtin_expect (D.23970, 0);
      if (D.23971 != 0) goto <D.23972>; else goto <D.23973>;
      <D.23972>:
      D.23974 = generation_name (generation);
      gc_debug_file.270 = gc_debug_file;
      fprintf (gc_debug_file.270, "%s generation done\n", D.23974);
      gc_debug_file.270 = gc_debug_file;
      fflush (gc_debug_file.270);
      <D.23973>:
      D.23976 = sgen_need_bridge_processing ();
      if (D.23976 != 0) goto <D.23977>; else goto <D.23978>;
      <D.23977>:
      sgen_bridge_reset_data ();
      <D.23978>:
      done_with_ephemerons = 0;
      <D.20435>:
      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.20435>; else goto <D.20436>;
      <D.20436>:
      sgen_scan_togglerefs (start_addr, end_addr, ctx);
      D.23979 = sgen_need_bridge_processing ();
      if (D.23979 != 0) goto <D.23980>; else goto <D.23981>;
      <D.23980>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_collect_bridge_objects (generation, ctx);
      if (generation == 1) goto <D.23982>; else goto <D.23983>;
      <D.23982>:
      sgen_collect_bridge_objects (0, ctx);
      <D.23983>:
      sgen_bridge_processing_stw_step ();
      <D.23981>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_null_link_in_range (generation, 1, ctx);
      if (generation == 1) goto <D.23984>; else goto <D.23985>;
      <D.23984>:
      sgen_null_link_in_range (0, 1, ctx);
      <D.23985>:
      sgen_finalize_in_range (generation, ctx);
      if (generation == 1) goto <D.23986>; else goto <D.23987>;
      <D.23986>:
      sgen_finalize_in_range (0, ctx);
      <D.23987>:
      if (0 != 0) goto <D.23988>; else goto <D.23989>;
      <D.23988>:
      gc_debug_file.270 = gc_debug_file;
      fprintf (gc_debug_file.270, "Precise scan of gray area post fin\n");
      gc_debug_file.270 = gc_debug_file;
      fflush (gc_debug_file.270);
      <D.23989>:
      sgen_drain_gray_stack (-1, ctx);
      done_with_ephemerons = 0;
      <D.20437>:
      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.20437>; else goto <D.20438>;
      <D.20438>:
      clear_unreachable_ephemerons (ctx);
      btv = mono_100ns_ticks ();
      gc_debug_level.269 = gc_debug_level;
      D.23969 = gc_debug_level.269 > 1;
      D.23970 = (long int) D.23969;
      D.23971 = __builtin_expect (D.23970, 0);
      if (D.23971 != 0) goto <D.23990>; else goto <D.23991>;
      <D.23990>:
      D.23992 = btv - atv;
      D.23993 = D.23992 / 10;
      D.23994 = (int) D.23993;
      D.23995 = generation_name (generation);
      gc_debug_file.270 = gc_debug_file;
      fprintf (gc_debug_file.270, "Finalize queue handling scan for %s generation: %d usecs %d ephemeron rounds\n", D.23995, D.23994, ephemeron_rounds);
      gc_debug_file.270 = gc_debug_file;
      fflush (gc_debug_file.270);
      <D.23991>:
      D.23996 = sgen_gray_object_queue_is_empty (queue);
      D.23997 = D.23996 == 0;
      D.23998 = (long int) D.23997;
      D.23999 = __builtin_expect (D.23998, 0);
      if (D.23999 != 0) goto <D.24000>; else goto <D.24001>;
      <D.24000>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2014, "sgen_gray_object_queue_is_empty (queue)");
      <D.24001>:
      <D.20440>:
      sgen_null_link_in_range (generation, 0, ctx);
      if (generation == 1) goto <D.24002>; else goto <D.24003>;
      <D.24002>:
      sgen_null_link_in_range (0, 0, ctx);
      <D.24003>:
      D.24004 = sgen_gray_object_queue_is_empty (queue);
      if (D.24004 != 0) goto <D.20439>; else goto <D.24005>;
      <D.24005>:
      sgen_drain_gray_stack (-1, ctx);
      goto <D.20440>;
      <D.20439>:
      D.24006 = sgen_gray_object_queue_is_empty (queue);
      D.24007 = D.24006 == 0;
      D.24008 = (long int) D.24007;
      D.24009 = __builtin_expect (D.24008, 0);
      if (D.24009 != 0) goto <D.24010>; else goto <D.24011>;
      <D.24010>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2024, "sgen_gray_object_queue_is_empty (queue)");
      <D.24011>:
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mark_ephemerons_in_range (struct ScanCopyContext ctx)
{
  char * object.271;
  char * object.272;
  struct FILE * gc_debug_file.273;
  int D.24017;
  unsigned int D.24022;
  unsigned int D.24023;
  unsigned int D.24024;
  unsigned int D.24025;
  struct MonoVTable * D.24026;
  struct MonoDomain * D.24027;
  _Bool D.24028;
  _Bool D.24029;
  _Bool D.24030;
  const char * iftmp.274;
  void * D.24038;
  int D.24040;
  const char * iftmp.275;
  int D.24043;
  int cur.276;
  char * D.24048;
  int D.24049;
  int D.24050;
  int D.24051;
  int D.24052;
  void * * D.24055;
  int D.24058;
  void * * D.24061;
  int D.24064;
  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.20825>;
  <D.20824>:
  {
    char * object;

    try
      {
        object.271 = current->array;
        object = object.271;
        if (0 != 0) goto <D.24013>; else goto <D.24014>;
        <D.24013>:
        object.272 = object;
        gc_debug_file.273 = gc_debug_file;
        fprintf (gc_debug_file.273, "Ephemeron array at %p\n", object.272);
        gc_debug_file.273 = gc_debug_file;
        fflush (gc_debug_file.273);
        <D.24014>:
        object.272 = object;
        D.24017 = sgen_is_object_alive_for_current_gen (object.272);
        if (D.24017 == 0) goto <D.24018>; else goto <D.24019>;
        <D.24018>:
        if (0 != 0) goto <D.24020>; else goto <D.24021>;
        <D.24020>:
        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.24021>:
        // predicted unlikely by continue predictor.
        goto <D.20817>;
        <D.24019>:
        copy_func (&object, queue);
        array = object;
        cur = mono_array_addr_with_size (array, 8, 0);
        D.24022 = array->max_length;
        D.24023 = D.24022 * 8;
        array_end = cur + D.24023;
        object.272 = object;
        D.24024 = MEM[(mword *)object.272];
        D.24025 = D.24024 & 4294967292;
        D.24026 = (struct MonoVTable *) D.24025;
        D.24027 = D.24026->domain;
        tombstone = D.24027->ephemeron_tombstone;
        goto <D.20822>;
        <D.20821>:
        {
          char * key;

          key = cur->key;
          D.24028 = key == 0B;
          D.24029 = key == tombstone;
          D.24030 = D.24028 | D.24029;
          if (D.24030 != 0) goto <D.24031>; else goto <D.24032>;
          <D.24031>:
          // predicted unlikely by continue predictor.
          goto <D.20819>;
          <D.24032>:
          if (0 != 0) goto <D.24033>; else goto <D.24034>;
          <D.24033>:
          D.24038 = cur->value;
          if (D.24038 != 0B) goto <D.24039>; else goto <D.24036>;
          <D.24039>:
          D.24038 = cur->value;
          D.24040 = sgen_is_object_alive_for_current_gen (D.24038);
          if (D.24040 != 0) goto <D.24041>; else goto <D.24036>;
          <D.24041>:
          iftmp.274 = "reachable";
          goto <D.24037>;
          <D.24036>:
          iftmp.274 = "unreachable";
          <D.24037>:
          D.24038 = cur->value;
          D.24043 = sgen_is_object_alive_for_current_gen (key);
          if (D.24043 != 0) goto <D.24044>; else goto <D.24045>;
          <D.24044>:
          iftmp.275 = "reachable";
          goto <D.24046>;
          <D.24045>:
          iftmp.275 = "unreachable";
          <D.24046>:
          cur.276 = (int) cur;
          D.24048 = mono_array_addr_with_size (array, 8, 0);
          D.24049 = (int) D.24048;
          D.24050 = cur.276 - D.24049;
          D.24051 = D.24050 /[ex] 8;
          gc_debug_file.273 = gc_debug_file;
          fprintf (gc_debug_file.273, "[%td] key %p (%s) value %p (%s)\n", D.24051, key, iftmp.275, D.24038, iftmp.274);
          gc_debug_file.273 = gc_debug_file;
          fflush (gc_debug_file.273);
          <D.24034>:
          D.24052 = sgen_is_object_alive_for_current_gen (key);
          if (D.24052 != 0) goto <D.24053>; else goto <D.24054>;
          <D.24053>:
          {
            char * value;

            value = cur->value;
            D.24055 = &cur->key;
            copy_func (D.24055, queue);
            if (value != 0B) goto <D.24056>; else goto <D.24057>;
            <D.24056>:
            D.24058 = sgen_is_object_alive_for_current_gen (value);
            if (D.24058 == 0) goto <D.24059>; else goto <D.24060>;
            <D.24059>:
            nothing_marked = 0;
            <D.24060>:
            D.24061 = &cur->value;
            copy_func (D.24061, queue);
            <D.24057>:
          }
          <D.24054>:
        }
        <D.20819>:
        cur = cur + 8;
        <D.20822>:
        if (cur < array_end) goto <D.20821>; else goto <D.20823>;
        <D.20823>:
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.20817>:
  current = current->next;
  <D.20825>:
  if (current != 0B) goto <D.20824>; else goto <D.20826>;
  <D.20826>:
  if (0 != 0) goto <D.24062>; else goto <D.24063>;
  <D.24062>:
  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.24063>:
  D.24064 = nothing_marked;
  return D.24064;
}


sgen_is_object_alive_for_current_gen (char * object)
{
  int D.24068;
  int D.24071;
  int current_collection_generation.277;

  D.24068 = sgen_ptr_in_nursery (object);
  if (D.24068 != 0) goto <D.24069>; else goto <D.24070>;
  <D.24069>:
  D.24071 = sgen_nursery_is_object_alive (object);
  return D.24071;
  <D.24070>:
  current_collection_generation.277 = current_collection_generation;
  if (current_collection_generation.277 == 0) goto <D.24073>; else goto <D.24074>;
  <D.24073>:
  D.24071 = 1;
  return D.24071;
  <D.24074>:
  D.24071 = sgen_major_is_object_alive (object);
  return D.24071;
}


sgen_nursery_is_object_alive (char * obj)
{
  int D.24076;
  _Bool D.24077;
  long int D.24078;
  long int D.24079;
  int D.24082;
  gboolean D.24085;
  unsigned int D.24088;
  unsigned int D.24089;
  unsigned int D.24091;
  unsigned int D.24093;

  D.24076 = sgen_ptr_in_nursery (obj);
  D.24077 = D.24076 == 0;
  D.24078 = (long int) D.24077;
  D.24079 = __builtin_expect (D.24078, 0);
  if (D.24079 != 0) goto <D.24080>; else goto <D.24081>;
  <D.24080>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "../../mono/metadata/sgen-gc.h", 576, "sgen_ptr_in_nursery (obj)");
  <D.24081>:
  D.24082 = sgen_nursery_is_to_space (obj);
  if (D.24082 != 0) goto <D.24083>; else goto <D.24084>;
  <D.24083>:
  D.24085 = 1;
  return D.24085;
  <D.24084>:
  D.24088 = MEM[(mword *)obj];
  D.24089 = D.24088 & 2;
  if (D.24089 != 0) goto <D.24086>; else goto <D.24090>;
  <D.24090>:
  D.24088 = MEM[(mword *)obj];
  D.24091 = D.24088 & 1;
  if (D.24091 != 0) goto <D.24092>; else goto <D.24087>;
  <D.24092>:
  D.24088 = MEM[(mword *)obj];
  D.24093 = D.24088 & 4294967292;
  if (D.24093 != 0) goto <D.24086>; else goto <D.24087>;
  <D.24086>:
  D.24085 = 1;
  return D.24085;
  <D.24087>:
  D.24085 = 0;
  return D.24085;
}


sgen_nursery_is_to_space (char * object)
{
  int object.278;
  char * sgen_nursery_start.279;
  int sgen_nursery_start.280;
  int D.24098;
  int D.24099;
  _Bool D.24100;
  long int D.24101;
  long int D.24102;
  char * D.24105;
  char * D.24106;
  int sgen_space_bitmap_size.281;
  _Bool D.24108;
  long int D.24109;
  long int D.24110;
  gboolean D.24113;
  char * sgen_space_bitmap.282;
  sizetype byte.283;
  char * D.24116;
  char D.24117;
  int D.24118;
  int D.24119;
  int D.24120;
  _Bool D.24121;
  int idx;
  int byte;
  int bit;

  object.278 = (int) object;
  sgen_nursery_start.279 = sgen_nursery_start;
  sgen_nursery_start.280 = (int) sgen_nursery_start.279;
  D.24098 = object.278 - sgen_nursery_start.280;
  idx = D.24098 >> 9;
  byte = idx / 8;
  bit = idx & 7;
  D.24099 = sgen_ptr_in_nursery (object);
  D.24100 = D.24099 == 0;
  D.24101 = (long int) D.24100;
  D.24102 = __builtin_expect (D.24101, 0);
  if (D.24102 != 0) goto <D.24103>; else goto <D.24104>;
  <D.24103>:
  D.24105 = sgen_get_nursery_end ();
  D.24106 = sgen_get_nursery_start ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.24106, D.24105);
  <D.16663>:
  goto <D.16663>;
  <D.24104>:
  sgen_space_bitmap_size.281 = sgen_space_bitmap_size;
  D.24108 = byte >= sgen_space_bitmap_size.281;
  D.24109 = (long int) D.24108;
  D.24110 = __builtin_expect (D.24109, 0);
  if (D.24110 != 0) goto <D.24111>; else goto <D.24112>;
  <D.24111>:
  sgen_space_bitmap_size.281 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.281);
  <D.16664>:
  goto <D.16664>;
  <D.24112>:
  sgen_space_bitmap.282 = sgen_space_bitmap;
  byte.283 = (sizetype) byte;
  D.24116 = sgen_space_bitmap.282 + byte.283;
  D.24117 = *D.24116;
  D.24118 = (int) D.24117;
  D.24119 = D.24118 >> bit;
  D.24120 = D.24119 & 1;
  D.24121 = D.24120 != 0;
  D.24113 = (gboolean) D.24121;
  return D.24113;
}


sgen_major_is_object_alive (void * object)
{
  unsigned int D.24125;
  unsigned int D.24126;
  unsigned int D.24128;
  unsigned int D.24130;
  gboolean D.24131;
  unsigned int D.24132;
  unsigned int D.24133;
  gboolean (*<T2bef>) (char *) D.24136;
  mword objsize;

  D.24125 = MEM[(mword *)object];
  D.24126 = D.24125 & 2;
  if (D.24126 != 0) goto <D.24123>; else goto <D.24127>;
  <D.24127>:
  D.24125 = MEM[(mword *)object];
  D.24128 = D.24125 & 1;
  if (D.24128 != 0) goto <D.24129>; else goto <D.24124>;
  <D.24129>:
  D.24125 = MEM[(mword *)object];
  D.24130 = D.24125 & 4294967292;
  if (D.24130 != 0) goto <D.24123>; else goto <D.24124>;
  <D.24123>:
  D.24131 = 1;
  return D.24131;
  <D.24124>:
  D.24132 = sgen_safe_object_get_size (object);
  D.24133 = D.24132 + 7;
  objsize = D.24133 & 4294967288;
  if (objsize > 8000) goto <D.24134>; else goto <D.24135>;
  <D.24134>:
  D.24131 = sgen_los_object_is_pinned (object);
  return D.24131;
  <D.24135>:
  D.24136 = major_collector.is_object_live;
  D.24131 = D.24136 (object);
  return D.24131;
}


clear_unreachable_ephemerons (struct ScanCopyContext ctx)
{
  char * object.284;
  char * object.285;
  int D.24140;
  struct FILE * gc_debug_file.286;
  struct EphemeronLinkNode * ephemeron_list.287;
  unsigned int D.24152;
  unsigned int D.24153;
  unsigned int D.24154;
  unsigned int D.24155;
  struct MonoVTable * D.24156;
  struct MonoDomain * D.24157;
  _Bool D.24158;
  _Bool D.24159;
  _Bool D.24160;
  const char * iftmp.288;
  void * D.24168;
  int D.24170;
  const char * iftmp.289;
  int D.24173;
  int cur.290;
  char * D.24178;
  int D.24179;
  int D.24180;
  int D.24181;
  int D.24182;
  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.20797>;
  <D.20803>:
  {
    char * object;

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

          tmp = current;
          if (0 != 0) goto <D.24143>; else goto <D.24144>;
          <D.24143>:
          object.285 = object;
          gc_debug_file.286 = gc_debug_file;
          fprintf (gc_debug_file.286, "Dead Ephemeron array at %p\n", object.285);
          gc_debug_file.286 = gc_debug_file;
          fflush (gc_debug_file.286);
          <D.24144>:
          if (prev != 0B) goto <D.24146>; else goto <D.24147>;
          <D.24146>:
          ephemeron_list.287 = current->next;
          prev->next = ephemeron_list.287;
          goto <D.24149>;
          <D.24147>:
          ephemeron_list.287 = current->next;
          ephemeron_list = ephemeron_list.287;
          <D.24149>:
          current = current->next;
          sgen_free_internal (tmp, 18);
          // predicted unlikely by continue predictor.
          goto <D.20797>;
        }
        <D.24142>:
        copy_func (&object, queue);
        object.285 = object;
        current->array = object.285;
        if (0 != 0) goto <D.24150>; else goto <D.24151>;
        <D.24150>:
        object.285 = object;
        gc_debug_file.286 = gc_debug_file;
        fprintf (gc_debug_file.286, "Clearing unreachable entries for ephemeron array at %p\n", object.285);
        gc_debug_file.286 = gc_debug_file;
        fflush (gc_debug_file.286);
        <D.24151>:
        array = object;
        cur = mono_array_addr_with_size (array, 8, 0);
        D.24152 = array->max_length;
        D.24153 = D.24152 * 8;
        array_end = cur + D.24153;
        object.285 = object;
        D.24154 = MEM[(mword *)object.285];
        D.24155 = D.24154 & 4294967292;
        D.24156 = (struct MonoVTable *) D.24155;
        D.24157 = D.24156->domain;
        tombstone = D.24157->ephemeron_tombstone;
        goto <D.20801>;
        <D.20800>:
        {
          char * key;

          key = cur->key;
          D.24158 = key == 0B;
          D.24159 = key == tombstone;
          D.24160 = D.24158 | D.24159;
          if (D.24160 != 0) goto <D.24161>; else goto <D.24162>;
          <D.24161>:
          // predicted unlikely by continue predictor.
          goto <D.20799>;
          <D.24162>:
          if (0 != 0) goto <D.24163>; else goto <D.24164>;
          <D.24163>:
          D.24168 = cur->value;
          if (D.24168 != 0B) goto <D.24169>; else goto <D.24166>;
          <D.24169>:
          D.24168 = cur->value;
          D.24170 = sgen_is_object_alive_for_current_gen (D.24168);
          if (D.24170 != 0) goto <D.24171>; else goto <D.24166>;
          <D.24171>:
          iftmp.288 = "reachable";
          goto <D.24167>;
          <D.24166>:
          iftmp.288 = "unreachable";
          <D.24167>:
          D.24168 = cur->value;
          D.24173 = sgen_is_object_alive_for_current_gen (key);
          if (D.24173 != 0) goto <D.24174>; else goto <D.24175>;
          <D.24174>:
          iftmp.289 = "reachable";
          goto <D.24176>;
          <D.24175>:
          iftmp.289 = "unreachable";
          <D.24176>:
          cur.290 = (int) cur;
          D.24178 = mono_array_addr_with_size (array, 8, 0);
          D.24179 = (int) D.24178;
          D.24180 = cur.290 - D.24179;
          D.24181 = D.24180 /[ex] 8;
          gc_debug_file.286 = gc_debug_file;
          fprintf (gc_debug_file.286, "[%td] key %p (%s) value %p (%s)\n", D.24181, key, iftmp.289, D.24168, iftmp.288);
          gc_debug_file.286 = gc_debug_file;
          fflush (gc_debug_file.286);
          <D.24164>:
          D.24182 = sgen_is_object_alive_for_current_gen (key);
          if (D.24182 == 0) goto <D.24183>; else goto <D.24184>;
          <D.24183>:
          cur->key = tombstone;
          cur->value = 0B;
          // predicted unlikely by continue predictor.
          goto <D.20799>;
          <D.24184>:
        }
        <D.20799>:
        cur = cur + 8;
        <D.20801>:
        if (cur < array_end) goto <D.20800>; else goto <D.20802>;
        <D.20802>:
        prev = current;
        current = current->next;
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.20797>:
  if (current != 0B) goto <D.20803>; else goto <D.20804>;
  <D.20804>:
}


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


sgen_get_nursery_end ()
{
  char * D.24187;

  D.24187 = sgen_nursery_end;
  return D.24187;
}


dump_heap (const char * type, int num, const char * reason)
{
  struct FILE * heap_dump_file.291;
  long int D.24192;
  unsigned int D.24193;
  unsigned int D.24194;
  struct MonoObject * D.24195;
  struct GCMemSection * nursery_section.292;
  void (*<T2c61>) (struct FILE *) D.24197;
  char[0:] * D.24198;
  struct ObjectList * list;
  struct LOSObject * bigobj;

  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<collection type=\"%s\" num=\"%d\"", type, num);
  if (reason != 0B) goto <D.24190>; else goto <D.24191>;
  <D.24190>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, " reason=\"%s\"", reason);
  <D.24191>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, ">\n");
  D.24192 = mono_mempool_get_bytes_allocated ();
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<other-mem-usage type=\"mempools\" size=\"%ld\"/>\n", D.24192);
  heap_dump_file.291 = heap_dump_file;
  sgen_dump_internal_mem_usage (heap_dump_file.291);
  D.24193 = sgen_pin_stats_get_pinned_byte_count (0);
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<pinned type=\"stack\" bytes=\"%zu\"/>\n", D.24193);
  D.24194 = sgen_pin_stats_get_pinned_byte_count (2);
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<pinned type=\"other\" bytes=\"%zu\"/>\n", D.24194);
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<pinned-objects>\n");
  list = sgen_pin_stats_get_object_list ();
  goto <D.20511>;
  <D.20510>:
  D.24195 = list->obj;
  dump_object (D.24195, 1);
  list = list->next;
  <D.20511>:
  if (list != 0B) goto <D.20510>; else goto <D.20512>;
  <D.20512>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "</pinned-objects>\n");
  nursery_section.292 = nursery_section;
  sgen_dump_section (nursery_section.292, "nursery");
  D.24197 = major_collector.dump_heap;
  heap_dump_file.291 = heap_dump_file;
  D.24197 (heap_dump_file.291);
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "<los>\n");
  bigobj = los_object_list;
  goto <D.20514>;
  <D.20513>:
  D.24198 = &bigobj->data;
  dump_object (D.24198, 0);
  bigobj = bigobj->next;
  <D.20514>:
  if (bigobj != 0B) goto <D.20513>; else goto <D.20515>;
  <D.20515>:
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "</los>\n");
  heap_dump_file.291 = heap_dump_file;
  fprintf (heap_dump_file.291, "</collection>\n");
}


dump_object (struct MonoObject * obj, gboolean dump_location)
{
  struct MonoVTable * D.24199;
  const char * D.24200;
  sizetype i.293;
  const char * D.24202;
  char D.24203;
  int D.24204;
  char * D.24205;
  int j.294;
  unsigned int j.295;
  _Bool D.24211;
  long int D.24212;
  long int D.24213;
  unsigned int D.24216;
  const char * D.24217;
  struct FILE * heap_dump_file.296;
  int D.24221;
  unsigned int D.24225;
  static char class_name[1024];
  struct MonoClass * class;
  int i;
  int j;

  D.24199 = obj->vtable;
  class = D.24199->klass;
  j = 0;
  i = j;
  goto <D.20500>;
  <D.20499>:
  D.24200 = class->name;
  i.293 = (sizetype) i;
  D.24202 = D.24200 + i.293;
  D.24203 = *D.24202;
  D.24204 = (int) D.24203;
  D.24205 = __builtin_strchr ("<>\"", D.24204);
  if (D.24205 == 0B) goto <D.24206>; else goto <D.24207>;
  <D.24206>:
  j.294 = j;
  j = j.294 + 1;
  D.24200 = class->name;
  i.293 = (sizetype) i;
  D.24202 = D.24200 + i.293;
  D.24203 = *D.24202;
  class_name[j.294] = D.24203;
  <D.24207>:
  i = i + 1;
  <D.20500>:
  D.24200 = class->name;
  i.293 = (sizetype) i;
  D.24202 = D.24200 + i.293;
  D.24203 = *D.24202;
  if (D.24203 != 0) goto <D.24209>; else goto <D.20501>;
  <D.24209>:
  j.295 = (unsigned int) j;
  if (j.295 <= 1022) goto <D.20499>; else goto <D.20501>;
  <D.20501>:
  j.295 = (unsigned int) j;
  D.24211 = j.295 > 1023;
  D.24212 = (long int) D.24211;
  D.24213 = __builtin_expect (D.24212, 0);
  if (D.24213 != 0) goto <D.24214>; else goto <D.24215>;
  <D.24214>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2132, "j < sizeof (class_name)");
  <D.24215>:
  class_name[j] = 0;
  D.24216 = sgen_safe_object_get_size (obj);
  D.24217 = class->name_space;
  heap_dump_file.296 = heap_dump_file;
  fprintf (heap_dump_file.296, "<object class=\"%s.%s\" size=\"%d\"", D.24217, &class_name, D.24216);
  if (dump_location != 0) goto <D.24219>; else goto <D.24220>;
  <D.24219>:
  {
    const char * location;

    D.24221 = sgen_ptr_in_nursery (obj);
    if (D.24221 != 0) goto <D.24222>; else goto <D.24223>;
    <D.24222>:
    location = "nursery";
    goto <D.24224>;
    <D.24223>:
    D.24225 = sgen_safe_object_get_size (obj);
    if (D.24225 <= 8000) goto <D.24226>; else goto <D.24227>;
    <D.24226>:
    location = "major";
    goto <D.24228>;
    <D.24227>:
    location = "LOS";
    <D.24228>:
    <D.24224>:
    heap_dump_file.296 = heap_dump_file;
    fprintf (heap_dump_file.296, " location=\"%s\"", location);
  }
  <D.24220>:
  heap_dump_file.296 = heap_dump_file;
  fprintf (heap_dump_file.296, "/>\n");
}


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

  do_scan_starts_check.297 = do_scan_starts_check;
  if (do_scan_starts_check.297 == 0) goto <D.24230>; else goto <D.24231>;
  <D.24230>:
  return;
  <D.24231>:
  nursery_section.298 = nursery_section;
  sgen_check_section_scan_starts (nursery_section.298);
  D.24233 = major_collector.check_scan_starts;
  D.24233 ();
}


unpin_objects_from_queue (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.24235;
  int D.24239;
  _Bool D.24240;
  long int D.24241;
  long int D.24242;
  int D.24246;
  unsigned int D.24248;
  unsigned int D.24249;
  _Bool D.24250;
  long int D.24251;
  long int D.24252;
  unsigned int D.24255;

  <D.20254>:
  {
    char * addr;

    D.24235 = queue->first;
    if (D.24235 == 0B) goto <D.24236>; else goto <D.24237>;
    <D.24236>:
    addr = 0B;
    goto <D.24238>;
    <D.24237>:
    D.24235 = queue->first;
    D.24239 = D.24235->end;
    D.24240 = D.24239 == 1;
    D.24241 = (long int) D.24240;
    D.24242 = __builtin_expect (D.24241, 0);
    if (D.24242 != 0) goto <D.24243>; else goto <D.24244>;
    <D.24243>:
    addr = sgen_gray_object_dequeue (queue);
    goto <D.24245>;
    <D.24244>:
    D.24235 = queue->first;
    D.24235 = queue->first;
    D.24239 = D.24235->end;
    D.24246 = D.24239 + -1;
    D.24235->end = D.24246;
    D.24239 = D.24235->end;
    addr = D.24235->objects[D.24239];
    <D.24245>:
    <D.24238>:
    if (addr == 0B) goto <D.20253>; else goto <D.24247>;
    <D.24247>:
    D.24248 = MEM[(mword *)addr];
    D.24249 = D.24248 & 2;
    D.24250 = D.24249 == 0;
    D.24251 = (long int) D.24250;
    D.24252 = __builtin_expect (D.24251, 0);
    if (D.24252 != 0) goto <D.24253>; else goto <D.24254>;
    <D.24253>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1548, "SGEN_OBJECT_IS_PINNED (addr)");
    <D.24254>:
    D.24248 = MEM[(mword *)addr];
    D.24255 = D.24248 & 4294967293;
    MEM[(mword *)addr] = D.24255;
  }
  goto <D.20254>;
  <D.20253>:
}


major_start_concurrent_collection (const char * reason)
{
  int disable_major_collections.299;
  long long int (*<T2c66>) (void) D.24259;
  _Bool D.24260;
  long int D.24261;
  long int D.24262;
  long long int num_objects_marked;

  disable_major_collections.299 = disable_major_collections;
  if (disable_major_collections.299 != 0) goto <D.24257>; else goto <D.24258>;
  <D.24257>:
  return;
  <D.24258>:
  D.24259 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.24259 ();
  D.24260 = num_objects_marked != 0;
  D.24261 = (long int) D.24260;
  D.24262 = __builtin_expect (D.24261, 0);
  if (D.24262 != 0) goto <D.24263>; else goto <D.24264>;
  <D.24263>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3326, "num_objects_marked == 0");
  <D.24264>:
  major_start_collection (1, 0B);
  gray_queue_redirect (&gray_queue);
  sgen_workers_wait_for_jobs ();
  D.24259 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.24259 ();
  current_collection_generation = -1;
}


major_start_collection (gboolean concurrent, int * old_next_pin_slot)
{
  struct MonoPerfCounters * mono_perfcounters.300;
  unsigned int D.24267;
  unsigned int D.24268;
  struct SgenSectionGrayQueue * D.24269;
  int D.24270;
  _Bool D.24271;
  long int D.24272;
  long int D.24273;
  int D.24278;
  _Bool D.24279;
  long int D.24280;
  long int D.24281;
  int gc_debug_level.301;
  _Bool D.24286;
  long int D.24287;
  long int D.24288;
  int stat_major_gcs.302;
  struct FILE * gc_debug_file.303;
  int stat_major_gcs.304;
  int D.24294;
  int D.24295;
  void (*<T719>) (void) D.24296;

  current_collection_generation = 1;
  mono_perfcounters.300 = mono_perfcounters;
  D.24267 = mono_perfcounters.300->gc_collections1;
  D.24268 = D.24267 + 1;
  mono_perfcounters.300->gc_collections1 = D.24268;
  D.24269 = sgen_workers_get_distribute_section_gray_queue ();
  D.24270 = sgen_section_gray_queue_is_empty (D.24269);
  D.24271 = D.24270 == 0;
  D.24272 = (long int) D.24271;
  D.24273 = __builtin_expect (D.24272, 0);
  if (D.24273 != 0) goto <D.24274>; else goto <D.24275>;
  <D.24274>:
  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.24275>:
  if (concurrent != 0) goto <D.24276>; else goto <D.24277>;
  <D.24276>:
  D.24278 = major_collector.is_concurrent;
  D.24279 = D.24278 == 0;
  D.24280 = (long int) D.24279;
  D.24281 = __builtin_expect (D.24280, 0);
  if (D.24281 != 0) goto <D.24282>; else goto <D.24283>;
  <D.24282>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3077, "major_collector.is_concurrent");
  <D.24283>:
  concurrent_collection_in_progress = 1;
  sgen_cement_concurrent_start ();
  current_object_ops = major_collector.major_concurrent_ops;
  goto <D.24284>;
  <D.24277>:
  current_object_ops = major_collector.major_ops;
  <D.24284>:
  reset_pinned_from_failed_allocation ();
  sgen_memgov_major_collection_start ();
  check_scan_starts ();
  degraded_mode = 0;
  gc_debug_level.301 = gc_debug_level;
  D.24286 = gc_debug_level.301 > 0;
  D.24287 = (long int) D.24286;
  D.24288 = __builtin_expect (D.24287, 0);
  if (D.24288 != 0) goto <D.24289>; else goto <D.24290>;
  <D.24289>:
  stat_major_gcs.302 = stat_major_gcs;
  gc_debug_file.303 = gc_debug_file;
  fprintf (gc_debug_file.303, "Start major collection %d\n", stat_major_gcs.302);
  gc_debug_file.303 = gc_debug_file;
  fflush (gc_debug_file.303);
  <D.24290>:
  stat_major_gcs.302 = stat_major_gcs;
  stat_major_gcs.304 = stat_major_gcs.302 + 1;
  stat_major_gcs = stat_major_gcs.304;
  D.24294 = gc_stats.major_gc_count;
  D.24295 = D.24294 + 1;
  gc_stats.major_gc_count = D.24295;
  D.24296 = major_collector.start_major_collection;
  if (D.24296 != 0B) goto <D.24297>; else goto <D.24298>;
  <D.24297>:
  D.24296 = major_collector.start_major_collection;
  D.24296 ();
  <D.24298>:
  major_copy_or_mark_from_roots (old_next_pin_slot, 0, 0);
}


reset_pinned_from_failed_allocation ()
{
  bytes_pinned_from_failed_allocation = 0;
}


collect_nursery (struct SgenGrayQueue * unpin_queue, gboolean finish_up_concurrent_mark)
{
  int disable_minor_collections.305;
  gboolean D.24302;
  struct MonoPerfCounters * mono_perfcounters.306;
  unsigned int D.24304;
  unsigned int D.24305;
  int D.24306;
  char * iftmp.307;
  char * D.24311;
  int gc_debug_level.308;
  _Bool D.24316;
  long int D.24317;
  long int D.24318;
  int nursery_next.309;
  char * D.24322;
  int D.24323;
  int D.24324;
  char * D.24325;
  int stat_minor_gcs.310;
  struct FILE * gc_debug_file.311;
  char * D.24328;
  int D.24329;
  int D.24330;
  struct GCMemSection * nursery_section.312;
  unsigned int D.24332;
  _Bool D.24333;
  long int D.24334;
  long int D.24335;
  long long int D.24338;
  long long int D.24339;
  int D.24340;
  long long int D.24341;
  long long int time_minor_pre_collection_fragment_clear.313;
  long long int time_minor_pre_collection_fragment_clear.314;
  int xdomain_checks.315;
  void (*<T719>) (void) D.24347;
  int stat_minor_gcs.316;
  int D.24349;
  int D.24350;
  char * D.24351;
  long long int D.24352;
  long long int D.24353;
  int D.24354;
  long long int D.24355;
  long long int time_minor_pinning.317;
  long long int time_minor_pinning.318;
  _Bool D.24358;
  long int D.24359;
  long int D.24360;
  int D.24363;
  int D.24366;
  int whole_heap_check_before_collection.319;
  int consistency_check_at_minor_collection.320;
  char * D.24373;
  long long int time_minor_scan_remsets.321;
  long long int time_minor_scan_remsets.322;
  int D.24378;
  void (*<T2b58>) (char *, struct SgenGrayQueue *) D.24381;
  <unnamed type> D.24382;
  unsigned int D.24383;
  <unnamed type> D.24386;
  unsigned int D.24387;
  long long int time_minor_scan_pinned.323;
  long long int time_minor_scan_pinned.324;
  void (*<T2b53>) (void * *, struct SgenGrayQueue *) D.24392;
  char * D.24393;
  char * D.24394;
  long long int time_minor_scan_registered_roots.325;
  long long int time_minor_scan_registered_roots.326;
  char * D.24397;
  long long int time_minor_scan_thread_data.327;
  long long int time_minor_scan_thread_data.328;
  int iftmp.329;
  int D.24404;
  int D.24406;
  _Bool D.24407;
  long int D.24408;
  long int D.24409;
  int D.24414;
  int D.24416;
  int D.24417;
  _Bool D.24418;
  long int D.24419;
  long int D.24420;
  struct FinalizeReadyEntry * fin_ready_list.330;
  struct FinalizeReadyEntry * critical_fin_list.331;
  long long int time_minor_finish_gray_stack.332;
  long long int time_minor_finish_gray_stack.333;
  unsigned int objects_pinned.334;
  int D.24430;
  void * * D.24431;
  long long int time_minor_fragment_creation.335;
  long long int time_minor_fragment_creation.336;
  void (*<T719>) (void) D.24440;
  long long int D.24441;
  long long int D.24442;
  long long int D.24443;
  int D.24444;
  long long int D.24445;
  long long int D.24446;
  struct FILE * heap_dump_file.337;
  int D.24450;
  int num_ready_finalizers.338;
  int D.24457;
  _Bool D.24458;
  long int D.24459;
  long int D.24460;
  void (*<T719>) (void) D.24463;
  _Bool D.24464;
  int check_nursery_objects_pinned.339;
  int D.24468;
  _Bool D.24471;
  int D.24472;
  gboolean needs_major;
  size_t max_garbage_amount;
  char * nursery_next;
  struct FinishRememberedSetScanJobData * frssjd;
  struct ScanFromRegisteredRootsJobData * scrrjd_normal;
  struct ScanFromRegisteredRootsJobData * scrrjd_wbarrier;
  struct ScanFinalizerEntriesJobData * sfejd_fin_ready;
  struct ScanFinalizerEntriesJobData * sfejd_critical_fin;
  struct ScanThreadDataJobData * stdjd;
  mword fragment_total;
  struct ScanCopyContext ctx;
  gint64 all_atv;
  gint64 all_btv;
  gint64 atv;
  gint64 btv;

  try
    {
      disable_minor_collections.305 = disable_minor_collections;
      if (disable_minor_collections.305 != 0) goto <D.24300>; else goto <D.24301>;
      <D.24300>:
      D.24302 = 1;
      return D.24302;
      <D.24301>:
      verify_nursery ();
      mono_perfcounters.306 = mono_perfcounters;
      D.24304 = mono_perfcounters.306->gc_collections0;
      D.24305 = D.24304 + 1;
      mono_perfcounters.306->gc_collections0 = D.24305;
      current_collection_generation = 0;
      D.24306 = sgen_collection_is_parallel ();
      if (D.24306 != 0) goto <D.24307>; else goto <D.24308>;
      <D.24307>:
      current_object_ops = sgen_minor_collector.parallel_ops;
      goto <D.24309>;
      <D.24308>:
      current_object_ops = sgen_minor_collector.serial_ops;
      <D.24309>:
      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.24311 = sgen_get_nursery_end ();
      if (D.24311 >= nursery_next) goto <D.24312>; else goto <D.24313>;
      <D.24312>:
      iftmp.307 = sgen_get_nursery_end ();
      goto <D.24314>;
      <D.24313>:
      iftmp.307 = nursery_next;
      <D.24314>:
      nursery_next = iftmp.307;
      gc_debug_level.308 = gc_debug_level;
      D.24316 = gc_debug_level.308 > 0;
      D.24317 = (long int) D.24316;
      D.24318 = __builtin_expect (D.24317, 0);
      if (D.24318 != 0) goto <D.24319>; else goto <D.24320>;
      <D.24319>:
      nursery_next.309 = (int) nursery_next;
      D.24322 = sgen_get_nursery_start ();
      D.24323 = (int) D.24322;
      D.24324 = nursery_next.309 - D.24323;
      D.24325 = sgen_get_nursery_start ();
      stat_minor_gcs.310 = stat_minor_gcs;
      gc_debug_file.311 = gc_debug_file;
      fprintf (gc_debug_file.311, "Start nursery collection %d %p-%p, size: %d\n", stat_minor_gcs.310, D.24325, nursery_next, D.24324);
      gc_debug_file.311 = gc_debug_file;
      fflush (gc_debug_file.311);
      <D.24320>:
      nursery_next.309 = (int) nursery_next;
      D.24328 = sgen_get_nursery_start ();
      D.24329 = (int) D.24328;
      D.24330 = nursery_next.309 - D.24329;
      max_garbage_amount = (size_t) D.24330;
      nursery_section.312 = nursery_section;
      D.24332 = nursery_section.312->size;
      D.24333 = D.24332 < max_garbage_amount;
      D.24334 = (long int) D.24333;
      D.24335 = __builtin_expect (D.24334, 0);
      if (D.24335 != 0) goto <D.24336>; else goto <D.24337>;
      <D.24336>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2551, "nursery_section->size >= max_garbage_amount");
      <D.24337>:
      all_atv = mono_100ns_ticks ();
      atv = all_atv;
      btv = mono_100ns_ticks ();
      D.24338 = btv - atv;
      D.24339 = D.24338 / 10;
      D.24340 = (int) D.24339;
      D.24341 = (long long int) D.24340;
      time_minor_pre_collection_fragment_clear.313 = time_minor_pre_collection_fragment_clear;
      time_minor_pre_collection_fragment_clear.314 = D.24341 + time_minor_pre_collection_fragment_clear.313;
      time_minor_pre_collection_fragment_clear = time_minor_pre_collection_fragment_clear.314;
      xdomain_checks.315 = xdomain_checks;
      if (xdomain_checks.315 != 0) goto <D.24345>; else goto <D.24346>;
      <D.24345>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.24346>:
      nursery_section.312 = nursery_section;
      nursery_section.312->next_data = nursery_next;
      D.24347 = major_collector.start_nursery_collection;
      D.24347 ();
      sgen_memgov_minor_collection_start ();
      init_gray_queue ();
      stat_minor_gcs.310 = stat_minor_gcs;
      stat_minor_gcs.316 = stat_minor_gcs.310 + 1;
      stat_minor_gcs = stat_minor_gcs.316;
      D.24349 = gc_stats.minor_gc_count;
      D.24350 = D.24349 + 1;
      gc_stats.minor_gc_count = D.24350;
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      sgen_init_pinning ();
      mono_profiler_gc_event (1, 0);
      D.24351 = sgen_get_nursery_start ();
      pin_from_roots (D.24351, nursery_next, &gray_queue);
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      sgen_optimize_pin_queue (0);
      nursery_section.312 = nursery_section;
      sgen_pinning_setup_section (nursery_section.312);
      ctx.scan_func = 0B;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      nursery_section.312 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.312, ctx);
      nursery_section.312 = nursery_section;
      sgen_pinning_trim_queue_to_section (nursery_section.312);
      atv = mono_100ns_ticks ();
      D.24352 = atv - btv;
      D.24353 = D.24352 / 10;
      D.24354 = (int) D.24353;
      D.24355 = (long long int) D.24354;
      time_minor_pinning.317 = time_minor_pinning;
      time_minor_pinning.318 = D.24355 + time_minor_pinning.317;
      time_minor_pinning = time_minor_pinning.318;
      gc_debug_level.308 = gc_debug_level;
      D.24358 = gc_debug_level.308 > 1;
      D.24359 = (long int) D.24358;
      D.24360 = __builtin_expect (D.24359, 0);
      if (D.24360 != 0) goto <D.24361>; else goto <D.24362>;
      <D.24361>:
      D.24352 = atv - btv;
      D.24353 = D.24352 / 10;
      D.24354 = (int) D.24353;
      D.24363 = sgen_get_pinned_count ();
      gc_debug_file.311 = gc_debug_file;
      fprintf (gc_debug_file.311, "Finding pinned pointers: %d in %d usecs\n", D.24363, D.24354);
      gc_debug_file.311 = gc_debug_file;
      fflush (gc_debug_file.311);
      <D.24362>:
      if (0 != 0) goto <D.24364>; else goto <D.24365>;
      <D.24364>:
      D.24366 = sgen_get_pinned_count ();
      gc_debug_file.311 = gc_debug_file;
      fprintf (gc_debug_file.311, "Start scan with %d pinned objects\n", D.24366);
      gc_debug_file.311 = gc_debug_file;
      fflush (gc_debug_file.311);
      <D.24365>:
      whole_heap_check_before_collection.319 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.319 != 0) goto <D.24368>; else goto <D.24369>;
      <D.24368>:
      sgen_clear_nursery_fragments ();
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.24369>:
      consistency_check_at_minor_collection.320 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.320 != 0) goto <D.24371>; else goto <D.24372>;
      <D.24371>:
      sgen_check_consistency ();
      <D.24372>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      frssjd = sgen_alloc_internal_dynamic (8, 20, 1);
      D.24373 = sgen_get_nursery_start ();
      frssjd->heap_start = D.24373;
      frssjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_finish_remembered_set_scan, frssjd);
      btv = mono_100ns_ticks ();
      D.24338 = btv - atv;
      D.24339 = D.24338 / 10;
      D.24340 = (int) D.24339;
      D.24341 = (long long int) D.24340;
      time_minor_scan_remsets.321 = time_minor_scan_remsets;
      time_minor_scan_remsets.322 = D.24341 + time_minor_scan_remsets.321;
      time_minor_scan_remsets = time_minor_scan_remsets.322;
      gc_debug_level.308 = gc_debug_level;
      D.24358 = gc_debug_level.308 > 1;
      D.24359 = (long int) D.24358;
      D.24360 = __builtin_expect (D.24359, 0);
      if (D.24360 != 0) goto <D.24376>; else goto <D.24377>;
      <D.24376>:
      D.24338 = btv - atv;
      D.24339 = D.24338 / 10;
      D.24340 = (int) D.24339;
      gc_debug_file.311 = gc_debug_file;
      fprintf (gc_debug_file.311, "Old generation scan: %d usecs\n", D.24340);
      gc_debug_file.311 = gc_debug_file;
      fflush (gc_debug_file.311);
      <D.24377>:
      D.24378 = sgen_collection_is_parallel ();
      if (D.24378 == 0) goto <D.24379>; else goto <D.24380>;
      <D.24379>:
      D.24381 = current_object_ops.scan_object;
      ctx.scan_func = D.24381;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      sgen_drain_gray_stack (-1, ctx);
      <D.24380>:
      D.24382 = mono_profiler_get_events ();
      D.24383 = D.24382 & 1048576;
      if (D.24383 != 0) goto <D.24384>; else goto <D.24385>;
      <D.24384>:
      report_registered_roots ();
      <D.24385>:
      D.24386 = mono_profiler_get_events ();
      D.24387 = D.24386 & 1048576;
      if (D.24387 != 0) goto <D.24388>; else goto <D.24389>;
      <D.24388>:
      report_finalizer_roots ();
      <D.24389>:
      atv = mono_100ns_ticks ();
      D.24352 = atv - btv;
      D.24353 = D.24352 / 10;
      D.24354 = (int) D.24353;
      D.24355 = (long long int) D.24354;
      time_minor_scan_pinned.323 = time_minor_scan_pinned;
      time_minor_scan_pinned.324 = D.24355 + time_minor_scan_pinned.323;
      time_minor_scan_pinned = time_minor_scan_pinned.324;
      scrrjd_normal = sgen_alloc_internal_dynamic (20, 20, 1);
      D.24392 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.24392;
      D.24381 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.24381;
      D.24393 = sgen_get_nursery_start ();
      scrrjd_normal->heap_start = D.24393;
      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.24392 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.24392;
      D.24381 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.24381;
      D.24394 = sgen_get_nursery_start ();
      scrrjd_wbarrier->heap_start = D.24394;
      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.24338 = btv - atv;
      D.24339 = D.24338 / 10;
      D.24340 = (int) D.24339;
      D.24341 = (long long int) D.24340;
      time_minor_scan_registered_roots.325 = time_minor_scan_registered_roots;
      time_minor_scan_registered_roots.326 = D.24341 + time_minor_scan_registered_roots.325;
      time_minor_scan_registered_roots = time_minor_scan_registered_roots.326;
      stdjd = sgen_alloc_internal_dynamic (8, 20, 1);
      D.24397 = sgen_get_nursery_start ();
      stdjd->heap_start = D.24397;
      stdjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.24352 = atv - btv;
      D.24353 = D.24352 / 10;
      D.24354 = (int) D.24353;
      D.24355 = (long long int) D.24354;
      time_minor_scan_thread_data.327 = time_minor_scan_thread_data;
      time_minor_scan_thread_data.328 = D.24355 + time_minor_scan_thread_data.327;
      time_minor_scan_thread_data = time_minor_scan_thread_data.328;
      btv = atv;
      D.24404 = sgen_collection_is_parallel ();
      if (D.24404 != 0) goto <D.24401>; else goto <D.24405>;
      <D.24405>:
      D.24406 = sgen_collection_is_concurrent ();
      if (D.24406 != 0) goto <D.24401>; else goto <D.24402>;
      <D.24401>:
      iftmp.329 = 1;
      goto <D.24403>;
      <D.24402>:
      iftmp.329 = 0;
      <D.24403>:
      D.24407 = iftmp.329 != 0;
      D.24408 = (long int) D.24407;
      D.24409 = __builtin_expect (D.24408, 0);
      if (D.24409 != 0) goto <D.24410>; else goto <D.24411>;
      <D.24410>:
      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.24411>:
      D.24414 = sgen_collection_is_parallel ();
      if (D.24414 != 0) goto <D.24412>; else goto <D.24415>;
      <D.24415>:
      D.24416 = sgen_collection_is_concurrent ();
      if (D.24416 != 0) goto <D.24412>; else goto <D.24413>;
      <D.24412>:
      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", 2680, "sgen_gray_object_queue_is_empty (&gray_queue)");
      <D.24422>:
      <D.24413>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (4, 20, 1);
      fin_ready_list.330 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.330;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (4, 20, 1);
      critical_fin_list.331 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.331;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      finish_gray_stack (0, &gray_queue);
      atv = mono_100ns_ticks ();
      D.24352 = atv - btv;
      D.24353 = D.24352 / 10;
      D.24354 = (int) D.24353;
      D.24355 = (long long int) D.24354;
      time_minor_finish_gray_stack.332 = time_minor_finish_gray_stack;
      time_minor_finish_gray_stack.333 = D.24355 + time_minor_finish_gray_stack.332;
      time_minor_finish_gray_stack = time_minor_finish_gray_stack.333;
      mono_profiler_gc_event (2, 0);
      sgen_workers_reset_data ();
      objects_pinned.334 = objects_pinned;
      if (objects_pinned.334 != 0) goto <D.24428>; else goto <D.24429>;
      <D.24428>:
      sgen_optimize_pin_queue (0);
      nursery_section.312 = nursery_section;
      sgen_pinning_setup_section (nursery_section.312);
      <D.24429>:
      mono_profiler_gc_event (3, 0);
      nursery_section.312 = nursery_section;
      D.24430 = nursery_section.312->pin_queue_num_entries;
      nursery_section.312 = nursery_section;
      D.24431 = nursery_section.312->pin_queue_start;
      nursery_section.312 = nursery_section;
      fragment_total = sgen_build_nursery_fragments (nursery_section.312, D.24431, D.24430, unpin_queue);
      if (fragment_total == 0) goto <D.24432>; else goto <D.24433>;
      <D.24432>:
      degraded_mode = 1;
      <D.24433>:
      sgen_clear_tlabs ();
      mono_profiler_gc_event (4, 0);
      btv = mono_100ns_ticks ();
      D.24338 = btv - atv;
      D.24339 = D.24338 / 10;
      D.24340 = (int) D.24339;
      D.24341 = (long long int) D.24340;
      time_minor_fragment_creation.335 = time_minor_fragment_creation;
      time_minor_fragment_creation.336 = D.24341 + time_minor_fragment_creation.335;
      time_minor_fragment_creation = time_minor_fragment_creation.336;
      gc_debug_level.308 = gc_debug_level;
      D.24358 = gc_debug_level.308 > 1;
      D.24359 = (long int) D.24358;
      D.24360 = __builtin_expect (D.24359, 0);
      if (D.24360 != 0) goto <D.24436>; else goto <D.24437>;
      <D.24436>:
      D.24338 = btv - atv;
      D.24339 = D.24338 / 10;
      D.24340 = (int) D.24339;
      gc_debug_file.311 = gc_debug_file;
      fprintf (gc_debug_file.311, "Fragment creation: %d usecs, %lu bytes available\n", D.24340, fragment_total);
      gc_debug_file.311 = gc_debug_file;
      fflush (gc_debug_file.311);
      <D.24437>:
      consistency_check_at_minor_collection.320 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.320 != 0) goto <D.24438>; else goto <D.24439>;
      <D.24438>:
      sgen_check_major_refs ();
      <D.24439>:
      D.24440 = major_collector.finish_nursery_collection;
      D.24440 ();
      all_btv = mono_100ns_ticks ();
      D.24441 = gc_stats.minor_gc_time_usecs;
      D.24442 = all_btv - all_atv;
      D.24443 = D.24442 / 10;
      D.24444 = (int) D.24443;
      D.24445 = (long long int) D.24444;
      D.24446 = D.24441 + D.24445;
      gc_stats.minor_gc_time_usecs = D.24446;
      heap_dump_file.337 = heap_dump_file;
      if (heap_dump_file.337 != 0B) goto <D.24448>; else goto <D.24449>;
      <D.24448>:
      stat_minor_gcs.310 = stat_minor_gcs;
      D.24450 = stat_minor_gcs.310 + -1;
      dump_heap ("minor", D.24450, 0B);
      <D.24449>:
      sgen_finish_pinning ();
      fin_ready_list.330 = fin_ready_list;
      if (fin_ready_list.330 != 0B) goto <D.24451>; else goto <D.24453>;
      <D.24453>:
      critical_fin_list.331 = critical_fin_list;
      if (critical_fin_list.331 != 0B) goto <D.24451>; else goto <D.24452>;
      <D.24451>:
      if (0 != 0) goto <D.24454>; else goto <D.24455>;
      <D.24454>:
      num_ready_finalizers.338 = num_ready_finalizers;
      gc_debug_file.311 = gc_debug_file;
      fprintf (gc_debug_file.311, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.338);
      gc_debug_file.311 = gc_debug_file;
      fflush (gc_debug_file.311);
      <D.24455>:
      mono_gc_finalize_notify ();
      <D.24452>:
      sgen_pin_stats_reset ();
      sgen_cement_clear_below_threshold ();
      D.24457 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24458 = D.24457 == 0;
      D.24459 = (long int) D.24458;
      D.24460 = __builtin_expect (D.24459, 0);
      if (D.24460 != 0) goto <D.24461>; else goto <D.24462>;
      <D.24461>:
      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.24462>:
      D.24463 = remset.finish_minor_collection;
      D.24463 ();
      check_scan_starts ();
      sgen_memgov_minor_collection_end ();
      objects_pinned.334 = objects_pinned;
      D.24464 = objects_pinned.334 != 0;
      needs_major = (gboolean) D.24464;
      current_collection_generation = -1;
      objects_pinned = 0;
      check_nursery_objects_pinned.339 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.339 != 0) goto <D.24466>; else goto <D.24467>;
      <D.24466>:
      D.24468 = sgen_minor_collector.is_split;
      if (D.24468 == 0) goto <D.24469>; else goto <D.24470>;
      <D.24469>:
      D.24471 = unpin_queue != 0B;
      D.24472 = (int) D.24471;
      sgen_check_nursery_objects_pinned (D.24472);
      <D.24470>:
      <D.24467>:
      D.24302 = needs_major;
      return D.24302;
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


job_finish_remembered_set_scan (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2cc2>) (void *, void *, struct SgenGrayQueue *) D.24475;
  struct SgenGrayQueue * D.24476;
  char * D.24477;
  char * D.24478;
  struct FinishRememberedSetScanJobData * job_data;

  job_data = job_data_untyped;
  D.24475 = remset.finish_scan_remsets;
  D.24476 = sgen_workers_get_job_gray_queue (worker_data);
  D.24477 = job_data->heap_end;
  D.24478 = job_data->heap_start;
  D.24475 (D.24478, D.24477, D.24476);
  sgen_free_internal_dynamic (job_data, 8, 20);
}


verify_nursery ()
{
  int do_verify_nursery.340;
  void * D.24482;
  unsigned int D.24487;
  unsigned int D.24488;
  unsigned int D.24490;
  int gc_debug_level.341;
  _Bool D.24493;
  long int D.24494;
  long int D.24495;
  struct FILE * gc_debug_file.342;
  unsigned int D.24499;
  unsigned int D.24504;
  unsigned int D.24505;
  char * D.24506;
  int do_dump_nursery_content.343;
  int cur.344;
  int hole_start.345;
  int D.24516;
  void * D.24519;
  struct MonoVTable * D.24520;
  _Bool D.24521;
  int D.24522;
  const char * D.24523;
  int ss.346;
  int size.347;
  char * start;
  char * end;
  char * cur;
  char * hole_start;

  do_verify_nursery.340 = do_verify_nursery;
  if (do_verify_nursery.340 == 0) goto <D.24480>; else goto <D.24481>;
  <D.24480>:
  return;
  <D.24481>:
  sgen_nursery_allocator_prepare_for_pinning ();
  cur = sgen_get_nursery_start ();
  start = cur;
  hole_start = start;
  end = sgen_get_nursery_end ();
  goto <D.20613>;
  <D.20614>:
  {
    size_t ss;
    size_t size;

    D.24482 = MEM[(void * *)cur];
    if (D.24482 == 0B) goto <D.24483>; else goto <D.24484>;
    <D.24483>:
    cur = cur + 4;
    // predicted unlikely by continue predictor.
    goto <D.20613>;
    <D.24484>:
    D.24487 = MEM[(mword *)cur];
    D.24488 = D.24487 & 1;
    if (D.24488 != 0) goto <D.24489>; else goto <D.24485>;
    <D.24489>:
    D.24487 = MEM[(mword *)cur];
    D.24490 = D.24487 & 4294967292;
    if (D.24490 != 0) goto <D.24491>; else goto <D.24485>;
    <D.24491>:
    gc_debug_level.341 = gc_debug_level;
    D.24493 = gc_debug_level.341 > 0;
    D.24494 = (long int) D.24493;
    D.24495 = __builtin_expect (D.24494, 0);
    if (D.24495 != 0) goto <D.24496>; else goto <D.24497>;
    <D.24496>:
    gc_debug_file.342 = gc_debug_file;
    fprintf (gc_debug_file.342, "FORWARDED OBJ %p\n", cur);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.24497>:
    goto <D.24486>;
    <D.24485>:
    D.24487 = MEM[(mword *)cur];
    D.24499 = D.24487 & 2;
    if (D.24499 != 0) goto <D.24500>; else goto <D.24501>;
    <D.24500>:
    gc_debug_level.341 = gc_debug_level;
    D.24493 = gc_debug_level.341 > 0;
    D.24494 = (long int) D.24493;
    D.24495 = __builtin_expect (D.24494, 0);
    if (D.24495 != 0) goto <D.24502>; else goto <D.24503>;
    <D.24502>:
    gc_debug_file.342 = gc_debug_file;
    fprintf (gc_debug_file.342, "PINNED OBJ %p\n", cur);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.24503>:
    <D.24501>:
    <D.24486>:
    ss = sgen_safe_object_get_size (cur);
    D.24504 = sgen_safe_object_get_size (cur);
    D.24505 = D.24504 + 7;
    size = D.24505 & 4294967288;
    D.24506 = cur + size;
    verify_scan_starts (cur, D.24506);
    do_dump_nursery_content.343 = do_dump_nursery_content;
    if (do_dump_nursery_content.343 != 0) goto <D.24508>; else goto <D.24509>;
    <D.24508>:
    if (cur > hole_start) goto <D.24510>; else goto <D.24511>;
    <D.24510>:
    gc_debug_level.341 = gc_debug_level;
    D.24493 = gc_debug_level.341 > 0;
    D.24494 = (long int) D.24493;
    D.24495 = __builtin_expect (D.24494, 0);
    if (D.24495 != 0) goto <D.24512>; else goto <D.24513>;
    <D.24512>:
    cur.344 = (int) cur;
    hole_start.345 = (int) hole_start;
    D.24516 = cur.344 - hole_start.345;
    gc_debug_file.342 = gc_debug_file;
    fprintf (gc_debug_file.342, "HOLE [%p %p %d]\n", hole_start, cur, D.24516);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.24513>:
    <D.24511>:
    gc_debug_level.341 = gc_debug_level;
    D.24493 = gc_debug_level.341 > 0;
    D.24494 = (long int) D.24493;
    D.24495 = __builtin_expect (D.24494, 0);
    if (D.24495 != 0) goto <D.24517>; else goto <D.24518>;
    <D.24517>:
    D.24487 = MEM[(mword *)cur];
    D.24490 = D.24487 & 4294967292;
    D.24519 = (void *) D.24490;
    D.24520 = sgen_get_array_fill_vtable ();
    D.24521 = D.24519 == D.24520;
    D.24522 = (int) D.24521;
    D.24523 = sgen_safe_name (cur);
    ss.346 = (int) ss;
    size.347 = (int) size;
    D.24506 = cur + size;
    gc_debug_file.342 = gc_debug_file;
    fprintf (gc_debug_file.342, "OBJ  [%p %p %d %d %s %d]\n", cur, D.24506, size.347, ss.346, D.24523, D.24522);
    gc_debug_file.342 = gc_debug_file;
    fflush (gc_debug_file.342);
    <D.24518>:
    <D.24509>:
    cur = cur + size;
    hole_start = cur;
  }
  <D.20613>:
  if (cur < end) goto <D.20614>; else goto <D.20615>;
  <D.20615>:
}


major_do_collection (const char * reason)
{
  int disable_major_collections.348;
  gboolean D.24530;
  long long int (*<T2c66>) (void) D.24531;
  _Bool D.24534;
  long int D.24535;
  long int D.24536;
  int old_next_pin_slot.349;
  long long int D.24540;
  long long int D.24541;
  long long int D.24542;
  int D.24543;
  long long int D.24544;
  long long int D.24545;
  unsigned int bytes_pinned_from_failed_allocation.350;
  _Bool D.24549;
  gint64 all_atv;
  gint64 all_btv;
  int old_next_pin_slot;

  try
    {
      disable_major_collections.348 = disable_major_collections;
      if (disable_major_collections.348 != 0) goto <D.24528>; else goto <D.24529>;
      <D.24528>:
      D.24530 = 0;
      return D.24530;
      <D.24529>:
      D.24531 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.24531 != 0B) goto <D.24532>; else goto <D.24533>;
      <D.24532>:
      {
        long long int num_marked;

        D.24531 = major_collector.get_and_reset_num_major_objects_marked;
        num_marked = D.24531 ();
        D.24534 = num_marked != 0;
        D.24535 = (long int) D.24534;
        D.24536 = __builtin_expect (D.24535, 0);
        if (D.24536 != 0) goto <D.24537>; else goto <D.24538>;
        <D.24537>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3298, "!num_marked");
        <D.24538>:
      }
      <D.24533>:
      all_atv = mono_100ns_ticks ();
      major_start_collection (0, &old_next_pin_slot);
      old_next_pin_slot.349 = old_next_pin_slot;
      major_finish_collection (reason, old_next_pin_slot.349, 0);
      all_btv = mono_100ns_ticks ();
      D.24540 = gc_stats.major_gc_time_usecs;
      D.24541 = all_btv - all_atv;
      D.24542 = D.24541 / 10;
      D.24543 = (int) D.24542;
      D.24544 = (long long int) D.24543;
      D.24545 = D.24540 + D.24544;
      gc_stats.major_gc_time_usecs = D.24545;
      D.24531 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.24531 != 0B) goto <D.24546>; else goto <D.24547>;
      <D.24546>:
      D.24531 = major_collector.get_and_reset_num_major_objects_marked;
      D.24531 ();
      <D.24547>:
      bytes_pinned_from_failed_allocation.350 = bytes_pinned_from_failed_allocation;
      D.24549 = bytes_pinned_from_failed_allocation.350 != 0;
      D.24530 = (gboolean) D.24549;
      return D.24530;
    }
  finally
    {
      old_next_pin_slot = {CLOBBER};
    }
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.24552;
  struct GrayQueueSection * D.24553;
  _Bool D.24554;

  D.24553 = queue->first;
  D.24554 = D.24553 == 0B;
  D.24552 = (gboolean) D.24554;
  return D.24552;
}


sgen_gc_is_object_ready_for_finalization (void * object)
{
  gboolean D.24556;
  int D.24557;
  _Bool D.24558;

  D.24557 = sgen_is_object_alive (object);
  D.24558 = D.24557 == 0;
  D.24556 = (gboolean) D.24558;
  return D.24556;
}


sgen_is_object_alive (void * object)
{
  int D.24560;
  gboolean D.24563;

  D.24560 = sgen_ptr_in_nursery (object);
  if (D.24560 != 0) goto <D.24561>; else goto <D.24562>;
  <D.24561>:
  D.24563 = sgen_nursery_is_object_alive (object);
  return D.24563;
  <D.24562>:
  D.24563 = sgen_major_is_object_alive (object);
  return D.24563;
}


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

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


has_critical_finalizer (struct MonoObject * obj)
{
  struct MonoClass * D.24570;
  gboolean D.24573;
  unsigned int D.24574;
  unsigned int D.24575;
  struct MonoVTable * D.24576;
  struct MonoClass * class;

  D.24570 = mono_defaults.critical_finalizer_object;
  if (D.24570 == 0B) goto <D.24571>; else goto <D.24572>;
  <D.24571>:
  D.24573 = 0;
  return D.24573;
  <D.24572>:
  D.24574 = MEM[(mword *)obj];
  D.24575 = D.24574 & 4294967292;
  D.24576 = (struct MonoVTable *) D.24575;
  class = D.24576->klass;
  D.24570 = mono_defaults.critical_finalizer_object;
  D.24573 = mono_class_has_parent_fast (class, D.24570);
  return D.24573;
}


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

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


sgen_is_object_alive_and_on_current_collection (char * object)
{
  int D.24580;
  int D.24583;
  int current_collection_generation.353;

  D.24580 = sgen_ptr_in_nursery (object);
  if (D.24580 != 0) goto <D.24581>; else goto <D.24582>;
  <D.24581>:
  D.24583 = sgen_nursery_is_object_alive (object);
  return D.24583;
  <D.24582>:
  current_collection_generation.353 = current_collection_generation;
  if (current_collection_generation.353 == 0) goto <D.24585>; else goto <D.24586>;
  <D.24585>:
  D.24583 = 0;
  return D.24583;
  <D.24586>:
  D.24583 = sgen_major_is_object_alive (object);
  return D.24583;
}


mono_gc_invoke_finalizers ()
{
  struct FinalizeReadyEntry * * iftmp.354;
  struct FinalizeReadyEntry * D.24594;
  struct FinalizeReadyEntry * D.24597;
  struct FinalizeReadyEntry * D.24599;
  void * D.24601;
  _Bool D.24608;
  long int D.24609;
  long int D.24610;
  int num_ready_finalizers.355;
  int num_ready_finalizers.356;
  const char * D.24617;
  struct FILE * gc_debug_file.357;
  _Bool D.24620;
  long int D.24621;
  long int D.24622;
  struct FinalizeReadyEntry * fin_ready_list.358;
  struct FinalizeReadyEntry * critical_fin_list.359;
  _Bool D.24628;
  long int D.24629;
  long int D.24630;
  int D.24633;
  struct FinalizeReadyEntry * entry;
  gboolean entry_is_critical;
  int count;
  void * obj;

  entry = 0B;
  entry_is_critical = 0;
  count = 0;
  goto <D.20847>;
  <D.20846>:
  pthread_mutex_lock (&gc_mutex);
  if (entry != 0B) goto <D.24588>; else goto <D.24589>;
  <D.24588>:
  {
    struct FinalizeReadyEntry * * list;

    if (entry_is_critical != 0) goto <D.24591>; else goto <D.24592>;
    <D.24591>:
    iftmp.354 = &critical_fin_list;
    goto <D.24593>;
    <D.24592>:
    iftmp.354 = &fin_ready_list;
    <D.24593>:
    list = iftmp.354;
    D.24594 = *list;
    if (D.24594 == entry) goto <D.24595>; else goto <D.24596>;
    <D.24595>:
    D.24597 = entry->next;
    *list = D.24597;
    goto <D.24598>;
    <D.24596>:
    {
      struct FinalizeReadyEntry * e;

      e = *list;
      goto <D.20837>;
      <D.20836>:
      e = e->next;
      <D.20837>:
      D.24599 = e->next;
      if (D.24599 != entry) goto <D.20836>; else goto <D.20838>;
      <D.20838>:
      D.24597 = entry->next;
      e->next = D.24597;
    }
    <D.24598>:
    sgen_free_internal (entry, 6);
    entry = 0B;
  }
  <D.24589>:
  entry = fin_ready_list;
  goto <D.20840>;
  <D.20839>:
  entry = entry->next;
  <D.20840>:
  if (entry != 0B) goto <D.24600>; else goto <D.20841>;
  <D.24600>:
  D.24601 = entry->object;
  if (D.24601 == 0B) goto <D.20839>; else goto <D.20841>;
  <D.20841>:
  if (entry != 0B) goto <D.24602>; else goto <D.24603>;
  <D.24602>:
  entry_is_critical = 0;
  goto <D.24604>;
  <D.24603>:
  entry_is_critical = 1;
  entry = critical_fin_list;
  goto <D.20843>;
  <D.20842>:
  entry = entry->next;
  <D.20843>:
  if (entry != 0B) goto <D.24605>; else goto <D.20844>;
  <D.24605>:
  D.24601 = entry->object;
  if (D.24601 == 0B) goto <D.20842>; else goto <D.20844>;
  <D.20844>:
  <D.24604>:
  if (entry != 0B) goto <D.24606>; else goto <D.24607>;
  <D.24606>:
  D.24601 = entry->object;
  D.24608 = D.24601 == 0B;
  D.24609 = (long int) D.24608;
  D.24610 = __builtin_expect (D.24609, 0);
  if (D.24610 != 0) goto <D.24611>; else goto <D.24612>;
  <D.24611>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3882, "entry->object");
  <D.24612>:
  num_ready_finalizers.355 = num_ready_finalizers;
  num_ready_finalizers.356 = num_ready_finalizers.355 + -1;
  num_ready_finalizers = num_ready_finalizers.356;
  obj = entry->object;
  entry->object = 0B;
  if (0 != 0) goto <D.24615>; else goto <D.24616>;
  <D.24615>:
  D.24617 = safe_name (obj);
  gc_debug_file.357 = gc_debug_file;
  fprintf (gc_debug_file.357, "Finalizing object %p (%s)\n", obj, D.24617);
  gc_debug_file.357 = gc_debug_file;
  fflush (gc_debug_file.357);
  <D.24616>:
  <D.24607>:
  sgen_gc_unlock ();
  if (entry == 0B) goto <D.20845>; else goto <D.24619>;
  <D.24619>:
  D.24601 = entry->object;
  D.24620 = D.24601 != 0B;
  D.24621 = (long int) D.24620;
  D.24622 = __builtin_expect (D.24621, 0);
  if (D.24622 != 0) goto <D.24623>; else goto <D.24624>;
  <D.24623>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3894, "entry->object == NULL");
  <D.24624>:
  count = count + 1;
  mono_gc_run_finalize (obj, 0B);
  <D.20847>:
  fin_ready_list.358 = fin_ready_list;
  if (fin_ready_list.358 != 0B) goto <D.20846>; else goto <D.24626>;
  <D.24626>:
  critical_fin_list.359 = critical_fin_list;
  if (critical_fin_list.359 != 0B) goto <D.20846>; else goto <D.20845>;
  <D.20845>:
  D.24628 = entry != 0B;
  D.24629 = (long int) D.24628;
  D.24630 = __builtin_expect (D.24629, 0);
  if (D.24630 != 0) goto <D.24631>; else goto <D.24632>;
  <D.24631>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3900, "!entry");
  <D.24632>:
  D.24633 = count;
  return D.24633;
}


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

  fin_ready_list.361 = fin_ready_list;
  if (fin_ready_list.361 != 0B) goto <D.24637>; else goto <D.24641>;
  <D.24641>:
  critical_fin_list.362 = critical_fin_list;
  if (critical_fin_list.362 != 0B) goto <D.24637>; else goto <D.24638>;
  <D.24637>:
  iftmp.360 = 1;
  goto <D.24639>;
  <D.24638>:
  iftmp.360 = 0;
  <D.24639>:
  D.24635 = iftmp.360;
  return D.24635;
}


mono_gc_register_root (char * start, size_t size, void * descr)
{
  int D.24644;
  _Bool D.24645;
  int D.24646;

  D.24645 = descr == 0B;
  D.24646 = (int) D.24645;
  D.24644 = mono_gc_register_root_inner (start, size, descr, D.24646);
  return D.24644;
}


mono_gc_register_root_inner (char * start, size_t size, void * descr, int root_type)
{
  struct SgenHashTable * D.24648;
  char * D.24651;
  int D.24652;
  int start.363;
  int D.24654;
  char * D.24655;
  int iftmp.364;
  unsigned int D.24661;
  _Bool D.24664;
  long int D.24665;
  long int D.24666;
  unsigned int descr.365;
  unsigned int roots_size.366;
  unsigned int roots_size.367;
  unsigned int roots_size.368;
  int D.24673;
  struct SgenHashTable * D.24674;
  int roots_size.369;
  int size.370;
  char * D.24679;
  struct FILE * gc_debug_file.371;
  struct RootRecord new_root;
  int i;

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

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

          D.24651 = root->end_root;
          D.24652 = (int) D.24651;
          start.363 = (int) start;
          D.24654 = D.24652 - start.363;
          old_size = (size_t) D.24654;
          D.24655 = start + size;
          root->end_root = D.24655;
          D.24661 = root->root_desc;
          if (D.24661 == 0) goto <D.24657>; else goto <D.24662>;
          <D.24662>:
          if (descr == 0B) goto <D.24657>; else goto <D.24658>;
          <D.24657>:
          D.24661 = root->root_desc;
          if (D.24661 != 0) goto <D.24659>; else goto <D.24663>;
          <D.24663>:
          if (descr != 0B) goto <D.24659>; else goto <D.24658>;
          <D.24659>:
          iftmp.364 = 1;
          goto <D.24660>;
          <D.24658>:
          iftmp.364 = 0;
          <D.24660>:
          D.24664 = iftmp.364 != 0;
          D.24665 = (long int) D.24664;
          D.24666 = __builtin_expect (D.24665, 0);
          if (D.24666 != 0) goto <D.24667>; else goto <D.24668>;
          <D.24667>:
          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.24668>:
          descr.365 = (unsigned int) descr;
          root->root_desc = descr.365;
          roots_size.366 = roots_size;
          roots_size.367 = roots_size.366 + size;
          roots_size = roots_size.367;
          roots_size.366 = roots_size;
          roots_size.368 = roots_size.366 - old_size;
          roots_size = roots_size.368;
          sgen_gc_unlock ();
          D.24673 = 1;
          return D.24673;
        }
        <D.24650>:
      }
      i = i + 1;
      <D.20862>:
      if (i <= 2) goto <D.20861>; else goto <D.20863>;
      <D.20863>:
      D.24655 = start + size;
      new_root.end_root = D.24655;
      descr.365 = (unsigned int) descr;
      new_root.root_desc = descr.365;
      D.24674 = &roots_hash[root_type];
      sgen_hash_table_replace (D.24674, start, &new_root, 0B);
      roots_size.366 = roots_size;
      roots_size.367 = roots_size.366 + size;
      roots_size = roots_size.367;
      if (0 != 0) goto <D.24675>; else goto <D.24676>;
      <D.24675>:
      roots_size.366 = roots_size;
      roots_size.369 = (int) roots_size.366;
      size.370 = (int) size;
      D.24679 = new_root.end_root;
      gc_debug_file.371 = gc_debug_file;
      fprintf (gc_debug_file.371, "Added root for range: %p-%p, descr: %p  (%d/%d bytes)\n", start, D.24679, descr, size.370, roots_size.369);
      gc_debug_file.371 = gc_debug_file;
      fflush (gc_debug_file.371);
      <D.24676>:
      sgen_gc_unlock ();
      D.24673 = 1;
      return D.24673;
    }
  finally
    {
      new_root = {CLOBBER};
    }
}


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

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


mono_gc_deregister_root (char * addr)
{
  struct SgenHashTable * D.24685;
  int D.24686;
  int addr.372;
  char * D.24690;
  int D.24691;
  int D.24692;
  unsigned int D.24693;
  unsigned int roots_size.373;
  unsigned int roots_size.374;
  int root_type;
  struct RootRecord root;

  try
    {
      pthread_mutex_lock (&gc_mutex);
      root_type = 0;
      goto <D.20880>;
      <D.20879>:
      D.24685 = &roots_hash[root_type];
      D.24686 = sgen_hash_table_remove (D.24685, addr, &root);
      if (D.24686 != 0) goto <D.24687>; else goto <D.24688>;
      <D.24687>:
      addr.372 = (int) addr;
      D.24690 = root.end_root;
      D.24691 = (int) D.24690;
      D.24692 = addr.372 - D.24691;
      D.24693 = (unsigned int) D.24692;
      roots_size.373 = roots_size;
      roots_size.374 = D.24693 + roots_size.373;
      roots_size = roots_size.374;
      <D.24688>:
      root_type = root_type + 1;
      <D.20880>:
      if (root_type <= 2) goto <D.20879>; else goto <D.20881>;
      <D.20881>:
      sgen_gc_unlock ();
    }
  finally
    {
      root = {CLOBBER};
    }
}


sgen_get_current_collection_generation ()
{
  int D.24696;

  D.24696 = current_collection_generation;
  return D.24696;
}


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


mono_gc_get_gc_callbacks ()
{
  struct MonoGCCallbacks * D.24698;

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


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

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


mono_gc_scan_object (void * obj)
{
  unsigned int user_copy_or_mark_key.377;
  void (*<T2b53>) (void * *, struct SgenGrayQueue *) D.24703;
  struct GrayQueue * D.24704;
  void * D.24705;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.377 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.377);
  D.24703 = current_object_ops.copy_or_mark_object;
  D.24704 = data->queue;
  D.24703 (&obj, D.24704);
  D.24705 = obj;
  return D.24705;
}


mono_gc_register_thread (void * baseptr)
{
  gboolean D.24707;
  struct SgenThreadInfo * D.24708;
  _Bool D.24709;

  D.24708 = mono_thread_info_attach (baseptr);
  D.24709 = D.24708 != 0B;
  D.24707 = (gboolean) D.24709;
  return D.24707;
}


mono_gc_set_stack_end (void * stack_end)
{
  void * D.24713;
  _Bool D.24714;
  long int D.24715;
  long int D.24716;
  struct SgenThreadInfo * info;

  pthread_mutex_lock (&gc_mutex);
  info = mono_thread_info_current ();
  if (info != 0B) goto <D.24711>; else goto <D.24712>;
  <D.24711>:
  D.24713 = info->stack_end;
  D.24714 = D.24713 <= stack_end;
  D.24715 = (long int) D.24714;
  D.24716 = __builtin_expect (D.24715, 0);
  if (D.24716 != 0) goto <D.24717>; else goto <D.24718>;
  <D.24717>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4224, "stack_end < info->stack_end");
  <D.24718>:
  info->stack_end = stack_end;
  <D.24712>:
  sgen_gc_unlock ();
}


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

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


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

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


mono_gc_pthread_detach (pthread_t thread)
{
  int D.24723;

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


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.24725;
  struct FILE * gc_debug_file.378;
  void (*<T2caa>) (struct MonoObject *, void *, struct MonoObject *) D.24733;

  D.24725 = sgen_ptr_in_nursery (field_ptr);
  if (D.24725 != 0) goto <D.24726>; else goto <D.24727>;
  <D.24726>:
  MEM[(void * *)field_ptr] = value;
  return;
  <D.24727>:
  if (0 != 0) goto <D.24728>; else goto <D.24729>;
  <D.24728>:
  gc_debug_file.378 = gc_debug_file;
  fprintf (gc_debug_file.378, "Adding remset at %p\n", field_ptr);
  gc_debug_file.378 = gc_debug_file;
  fflush (gc_debug_file.378);
  <D.24729>:
  if (value != 0B) goto <D.24731>; else goto <D.24732>;
  <D.24731>:
  <D.24732>:
  D.24733 = remset.wbarrier_set_field;
  D.24733 (obj, field_ptr, value);
}


mono_gc_wbarrier_set_arrayref (struct MonoArray * arr, void * slot_ptr, struct MonoObject * value)
{
  int D.24735;
  struct FILE * gc_debug_file.379;
  void (*<T2cae>) (struct MonoArray *, void *, struct MonoObject *) D.24743;

  D.24735 = sgen_ptr_in_nursery (slot_ptr);
  if (D.24735 != 0) goto <D.24736>; else goto <D.24737>;
  <D.24736>:
  MEM[(void * *)slot_ptr] = value;
  return;
  <D.24737>:
  if (0 != 0) goto <D.24738>; else goto <D.24739>;
  <D.24738>:
  gc_debug_file.379 = gc_debug_file;
  fprintf (gc_debug_file.379, "Adding remset at %p\n", slot_ptr);
  gc_debug_file.379 = gc_debug_file;
  fflush (gc_debug_file.379);
  <D.24739>:
  if (value != 0B) goto <D.24741>; else goto <D.24742>;
  <D.24741>:
  <D.24742>:
  D.24743 = remset.wbarrier_set_arrayref;
  D.24743 (arr, slot_ptr, value);
}


mono_gc_wbarrier_arrayref_copy (void * dest_ptr, void * src_ptr, int count)
{
  int D.24747;
  unsigned int count.380;
  unsigned int D.24750;
  void (*<T2cb2>) (void *, void *, int) D.24751;

  D.24747 = sgen_ptr_in_nursery (dest_ptr);
  if (D.24747 != 0) goto <D.24745>; else goto <D.24748>;
  <D.24748>:
  if (count <= 0) goto <D.24745>; else goto <D.24746>;
  <D.24745>:
  count.380 = (unsigned int) count;
  D.24750 = count.380 * 4;
  mono_gc_memmove_aligned (dest_ptr, src_ptr, D.24750);
  return;
  <D.24746>:
  D.24751 = remset.wbarrier_arrayref_copy;
  D.24751 (dest_ptr, src_ptr, count);
}


find_object_for_ptr (char * ptr)
{
  struct GCMemSection * nursery_section.381;
  char * D.24754;
  char * D.24757;
  char * found_obj.382;
  char * D.24763;
  void (*<T2c49>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24766;

  nursery_section.381 = nursery_section;
  D.24754 = nursery_section.381->data;
  if (D.24754 <= ptr) goto <D.24755>; else goto <D.24756>;
  <D.24755>:
  nursery_section.381 = nursery_section;
  D.24757 = nursery_section.381->end_data;
  if (D.24757 > ptr) goto <D.24758>; else goto <D.24759>;
  <D.24758>:
  found_obj = 0B;
  nursery_section.381 = nursery_section;
  D.24757 = nursery_section.381->end_data;
  nursery_section.381 = nursery_section;
  D.24754 = nursery_section.381->data;
  sgen_scan_area_with_callback (D.24754, D.24757, find_object_for_ptr_callback, ptr, 1);
  found_obj.382 = found_obj;
  if (found_obj.382 != 0B) goto <D.24761>; else goto <D.24762>;
  <D.24761>:
  D.24763 = found_obj;
  return D.24763;
  <D.24762>:
  <D.24759>:
  <D.24756>:
  found_obj = 0B;
  sgen_los_iterate_objects (find_object_for_ptr_callback, ptr);
  found_obj.382 = found_obj;
  if (found_obj.382 != 0B) goto <D.24764>; else goto <D.24765>;
  <D.24764>:
  D.24763 = found_obj;
  return D.24763;
  <D.24765>:
  found_obj = 0B;
  D.24766 = major_collector.iterate_objects;
  D.24766 (1, 1, find_object_for_ptr_callback, ptr);
  D.24763 = found_obj;
  return D.24763;
}


find_object_for_ptr_callback (char * obj, size_t size, void * user_data)
{
  char * D.24770;
  char * found_obj.383;
  _Bool D.24774;
  long int D.24775;
  long int D.24776;
  char * ptr;

  ptr = user_data;
  if (ptr >= obj) goto <D.24768>; else goto <D.24769>;
  <D.24768>:
  D.24770 = obj + size;
  if (D.24770 > ptr) goto <D.24771>; else goto <D.24772>;
  <D.24771>:
  found_obj.383 = found_obj;
  D.24774 = found_obj.383 != 0B;
  D.24775 = (long int) D.24774;
  D.24776 = __builtin_expect (D.24775, 0);
  if (D.24776 != 0) goto <D.24777>; else goto <D.24778>;
  <D.24777>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4335, "!found_obj");
  <D.24778>:
  found_obj = obj;
  <D.24772>:
  <D.24769>:
}


mono_gc_wbarrier_generic_nostore (void * ptr)
{
  int D.24783;
  int D.24785;
  struct FILE * gc_debug_file.384;
  int D.24789;
  int concurrent_collection_in_progress.385;
  void (*<T112f>) (void *) D.24799;
  void * obj;

  obj = MEM[(void * *)ptr];
  if (obj != 0B) goto <D.24779>; else goto <D.24780>;
  <D.24779>:
  <D.24780>:
  D.24783 = sgen_ptr_in_nursery (ptr);
  if (D.24783 != 0) goto <D.24781>; else goto <D.24784>;
  <D.24784>:
  D.24785 = ptr_on_stack (ptr);
  if (D.24785 != 0) goto <D.24781>; else goto <D.24782>;
  <D.24781>:
  if (0 != 0) goto <D.24786>; else goto <D.24787>;
  <D.24786>:
  gc_debug_file.384 = gc_debug_file;
  fprintf (gc_debug_file.384, "Skipping remset at %p\n", ptr);
  gc_debug_file.384 = gc_debug_file;
  fflush (gc_debug_file.384);
  <D.24787>:
  return;
  <D.24782>:
  D.24789 = sgen_ptr_in_nursery (obj);
  if (D.24789 == 0) goto <D.24790>; else goto <D.24791>;
  <D.24790>:
  concurrent_collection_in_progress.385 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.385 == 0) goto <D.24793>; else goto <D.24794>;
  <D.24793>:
  if (0 != 0) goto <D.24795>; else goto <D.24796>;
  <D.24795>:
  gc_debug_file.384 = gc_debug_file;
  fprintf (gc_debug_file.384, "Skipping remset at %p\n", ptr);
  gc_debug_file.384 = gc_debug_file;
  fflush (gc_debug_file.384);
  <D.24796>:
  return;
  <D.24794>:
  <D.24791>:
  if (0 != 0) goto <D.24797>; else goto <D.24798>;
  <D.24797>:
  gc_debug_file.384 = gc_debug_file;
  fprintf (gc_debug_file.384, "Adding remset at %p\n", ptr);
  gc_debug_file.384 = gc_debug_file;
  fflush (gc_debug_file.384);
  <D.24798>:
  D.24799 = remset.wbarrier_generic_nostore;
  D.24799 (ptr);
}


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

  try
    {
      stack_start = &stack_start;
      info = mono_thread_info_current ();
      stack_start.386 = stack_start;
      if (ptr >= stack_start.386) goto <D.24802>; else goto <D.24803>;
      <D.24802>:
      D.24804 = info->stack_end;
      if (D.24804 > ptr) goto <D.24805>; else goto <D.24806>;
      <D.24805>:
      D.24807 = 1;
      return D.24807;
      <D.24806>:
      <D.24803>:
      D.24807 = 0;
      return D.24807;
    }
  finally
    {
      stack_start = {CLOBBER};
    }
}


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

  if (0 != 0) goto <D.24810>; else goto <D.24811>;
  <D.24810>:
  if (value != 0B) goto <D.24813>; else goto <D.24814>;
  <D.24813>:
  iftmp.387 = safe_name (value);
  goto <D.24815>;
  <D.24814>:
  iftmp.387 = "null";
  <D.24815>:
  gc_debug_file.388 = gc_debug_file;
  fprintf (gc_debug_file.388, "Wbarrier store at %p to %p (%s)\n", ptr, value, iftmp.387);
  gc_debug_file.388 = gc_debug_file;
  fflush (gc_debug_file.388);
  <D.24811>:
  MEM[(void * *)ptr] = value;
  D.24817 = sgen_ptr_in_nursery (value);
  if (D.24817 != 0) goto <D.24818>; else goto <D.24819>;
  <D.24818>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.24819>:
  sgen_dummy_use (value);
}


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


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

  if (0 != 0) goto <D.24820>; else goto <D.24821>;
  <D.24820>:
  if (value != 0B) goto <D.24823>; else goto <D.24824>;
  <D.24823>:
  iftmp.389 = safe_name (value);
  goto <D.24825>;
  <D.24824>:
  iftmp.389 = "null";
  <D.24825>:
  gc_debug_file.390 = gc_debug_file;
  fprintf (gc_debug_file.390, "Wbarrier atomic store at %p to %p (%s)\n", ptr, value, iftmp.389);
  gc_debug_file.390 = gc_debug_file;
  fflush (gc_debug_file.390);
  <D.24821>:
  InterlockedWritePointer (ptr, value);
  D.24827 = sgen_ptr_in_nursery (value);
  if (D.24827 != 0) goto <D.24828>; else goto <D.24829>;
  <D.24828>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.24829>:
  sgen_dummy_use (value);
}


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


InterlockedExchangePointer (void * volatile * val, void * new_val)
{
  unsigned int new_val.391;
  unsigned int old_val.392;
  unsigned int D.24832;
  void * D.24833;
  void * D.24834;
  void * old_val;

  <D.11840>:
  old_val = *val;
  new_val.391 = (unsigned int) new_val;
  old_val.392 = (unsigned int) old_val;
  D.24832 = __sync_val_compare_and_swap_4 (val, old_val.392, new_val.391);
  D.24833 = (void *) D.24832;
  if (D.24833 != old_val) goto <D.11840>; else goto <D.11841>;
  <D.11841>:
  D.24834 = old_val;
  return D.24834;
}


mono_gc_wbarrier_value_copy_bitmap (void * _dest, void * _src, int size, unsigned int bitmap)
{
  unsigned int D.24836;
  unsigned int D.24839;
  struct MonoObject * D.24840;
  mword * dest;
  mword * src;

  dest = _dest;
  src = _src;
  goto <D.21007>;
  <D.21006>:
  D.24836 = bitmap & 1;
  if (D.24836 != 0) goto <D.24837>; else goto <D.24838>;
  <D.24837>:
  D.24839 = *src;
  D.24840 = (struct MonoObject *) D.24839;
  mono_gc_wbarrier_generic_store (dest, D.24840);
  goto <D.24841>;
  <D.24838>:
  D.24839 = *src;
  *dest = D.24839;
  <D.24841>:
  src = src + 4;
  dest = dest + 4;
  size = size + -4;
  bitmap = bitmap >> 1;
  <D.21007>:
  if (size != 0) goto <D.21006>; else goto <D.21008>;
  <D.21008>:
}


mono_gc_wbarrier_value_copy (void * dest, void * src, int count, struct MonoClass * klass)
{
  unsigned char D.24842;
  unsigned char D.24843;
  _Bool D.24844;
  long int D.24845;
  long int D.24846;
  const char * D.24851;
  void * D.24852;
  struct FILE * gc_debug_file.393;
  int D.24856;
  int D.24858;
  unsigned int D.24860;
  int D.24861;
  int D.24862;
  unsigned int count.394;
  void (*<T2cb6>) (void *, void *, int, struct MonoClass *) D.24864;

  D.24842 = BIT_FIELD_REF <*klass, 8, 160>;
  D.24843 = D.24842 & 8;
  D.24844 = D.24843 == 0;
  D.24845 = (long int) D.24844;
  D.24846 = __builtin_expect (D.24845, 0);
  if (D.24846 != 0) goto <D.24847>; else goto <D.24848>;
  <D.24847>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4480, "klass->valuetype");
  <D.24848>:
  if (0 != 0) goto <D.24849>; else goto <D.24850>;
  <D.24849>:
  D.24851 = klass->name;
  D.24852 = klass->gc_descr;
  gc_debug_file.393 = gc_debug_file;
  fprintf (gc_debug_file.393, "Adding value remset at %p, count %d, descr %p for class %s (%p)\n", dest, count, D.24852, D.24851, klass);
  gc_debug_file.393 = gc_debug_file;
  fflush (gc_debug_file.393);
  <D.24850>:
  D.24856 = sgen_ptr_in_nursery (dest);
  if (D.24856 != 0) goto <D.24854>; else goto <D.24857>;
  <D.24857>:
  D.24858 = ptr_on_stack (dest);
  if (D.24858 != 0) goto <D.24854>; else goto <D.24859>;
  <D.24859>:
  D.24852 = klass->gc_descr;
  D.24860 = (unsigned int) D.24852;
  D.24861 = sgen_gc_descr_has_references (D.24860);
  if (D.24861 == 0) goto <D.24854>; else goto <D.24855>;
  <D.24854>:
  {
    size_t element_size;
    size_t size;

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


mono_gc_wbarrier_object_copy (struct MonoObject * obj, struct MonoObject * src)
{
  int D.24868;
  int D.24870;
  struct MonoVTable * D.24871;
  struct MonoClass * D.24872;
  unsigned int size.395;
  unsigned int D.24874;
  const void * D.24875;
  void * D.24876;
  void (*<T2cba>) (struct MonoObject *, struct MonoObject *) D.24877;
  int size;

  D.24868 = sgen_ptr_in_nursery (obj);
  if (D.24868 != 0) goto <D.24866>; else goto <D.24869>;
  <D.24869>:
  D.24870 = ptr_on_stack (obj);
  if (D.24870 != 0) goto <D.24866>; else goto <D.24867>;
  <D.24866>:
  D.24871 = obj->vtable;
  D.24872 = D.24871->klass;
  size = D.24872->instance_size;
  size.395 = (unsigned int) size;
  D.24874 = size.395 + 4294967288;
  D.24875 = src + 8;
  D.24876 = obj + 8;
  mono_gc_memmove_aligned (D.24876, D.24875, D.24874);
  return;
  <D.24867>:
  D.24877 = remset.wbarrier_object_copy;
  D.24877 (obj, src);
}


mono_gc_walk_heap (int flags, int (*MonoGCReferences) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) callback, void * data)
{
  struct GCMemSection * nursery_section.396;
  char * D.24880;
  char * D.24881;
  void (*<T2c49>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.24882;
  int D.24883;
  struct HeapWalkInfo hwi;

  try
    {
      hwi.flags = flags;
      hwi.callback = callback;
      hwi.data = data;
      sgen_clear_nursery_fragments ();
      nursery_section.396 = nursery_section;
      D.24880 = nursery_section.396->end_data;
      nursery_section.396 = nursery_section;
      D.24881 = nursery_section.396->data;
      sgen_scan_area_with_callback (D.24881, D.24880, walk_references, &hwi, 0);
      D.24882 = major_collector.iterate_objects;
      D.24882 (1, 1, walk_references, &hwi);
      sgen_los_iterate_objects (walk_references, &hwi);
      D.24883 = 0;
      return D.24883;
    }
  finally
    {
      hwi = {CLOBBER};
    }
}


walk_references (char * start, size_t size, void * data)
{
  int D.24888;
  int D.24890;
  int (*<T2eb1>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.24891;
  void * D.24892;
  uintptr_t[128] * D.24893;
  struct MonoObject *[128] * D.24894;
  unsigned int D.24895;
  size_t iftmp.397;
  struct MonoVTable * D.24900;
  struct MonoClass * D.24901;
  struct HeapWalkInfo * hwi;

  hwi = data;
  hwi->called = 0;
  hwi->count = 0;
  collect_references (hwi, start, size);
  D.24888 = hwi->count;
  if (D.24888 != 0) goto <D.24886>; else goto <D.24889>;
  <D.24889>:
  D.24890 = hwi->called;
  if (D.24890 == 0) goto <D.24886>; else goto <D.24887>;
  <D.24886>:
  D.24891 = hwi->callback;
  D.24892 = hwi->data;
  D.24893 = &hwi->offsets;
  D.24894 = &hwi->refs;
  D.24888 = hwi->count;
  D.24895 = (unsigned int) D.24888;
  D.24890 = hwi->called;
  if (D.24890 == 0) goto <D.24897>; else goto <D.24898>;
  <D.24897>:
  iftmp.397 = size;
  goto <D.24899>;
  <D.24898>:
  iftmp.397 = 0;
  <D.24899>:
  D.24900 = MEM[(struct MonoObject *)start].vtable;
  D.24901 = D.24900->klass;
  D.24891 (start, D.24901, iftmp.397, D.24895, D.24894, D.24893, D.24892);
  <D.24887>:
}


collect_references (struct HeapWalkInfo * hwi, char * start, size_t size)
{
  unsigned int D.24902;
  unsigned int D.24903;
  unsigned int D.24904;
  unsigned int D.24905;
  unsigned int D.24908;
  unsigned int D.24909;
  unsigned int D.24910;
  unsigned int D.24911;
  unsigned int D.24912;
  void * D.24913;
  int D.24916;
  int (*<T2eb1>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.24919;
  void * D.24920;
  uintptr_t[128] * D.24921;
  struct MonoObject *[128] * D.24922;
  unsigned int D.24923;
  size_t iftmp.398;
  int D.24925;
  struct MonoVTable * D.24929;
  struct MonoClass * D.24930;
  int _objptr.399;
  int start.400;
  int D.24933;
  unsigned int D.24934;
  int D.24935;
  int D.24936;
  size_t iftmp.401;
  int D.24945;
  int D.24946;
  unsigned int _index.402;
  unsigned int D.24948;
  int D.24949;
  void * D.24950;
  size_t iftmp.403;
  int _objptr.404;
  int D.24960;
  unsigned int D.24961;
  int D.24962;
  int D.24963;
  unsigned int _index.405;
  unsigned int D.24965;
  int D.24966;
  size_t iftmp.406;
  int D.24975;
  int D.24976;
  unsigned int D.24977;
  unsigned int D.24980;
  int D.24981;
  int desc.407;
  unsigned int D.24985;
  unsigned int el_size.408;
  unsigned int D.24987;
  void * D.24988;
  size_t iftmp.409;
  int p.410;
  int D.24998;
  unsigned int D.24999;
  int D.25000;
  int D.25001;
  int D.25005;
  unsigned int offset.411;
  unsigned int D.25007;
  unsigned int i.412;
  unsigned int D.25009;
  void * * D.25010;
  void * D.25011;
  size_t iftmp.413;
  char * D.25020;
  int D.25021;
  int D.25022;
  unsigned int D.25023;
  int D.25024;
  int D.25025;
  sizetype el_size.414;
  unsigned int D.25030;
  void * D.25033;
  size_t iftmp.415;
  int p.416;
  int D.25043;
  unsigned int D.25044;
  int D.25045;
  int D.25046;
  unsigned int D.25047;
  void * D.25050;
  size_t iftmp.417;
  int _objptr.418;
  int D.25060;
  unsigned int D.25061;
  int D.25062;
  int D.25063;
  unsigned int D.25064;
  unsigned int D.25065;
  struct MonoVTable * D.25068;
  struct MonoClass * D.25069;
  const char * D.25070;
  const char * D.25071;
  gsize * bitmap_data.419;
  unsigned int D.25073;
  void * D.25076;
  size_t iftmp.420;
  int _objptr.421;
  int D.25086;
  unsigned int D.25087;
  int D.25088;
  int D.25089;
  int bwords.422;
  unsigned int D.25091;
  gsize * mbitmap_data.423;
  unsigned int D.25093;
  unsigned int D.25094;
  struct MonoClass * D.25095;
  unsigned int el_size.424;
  unsigned int D.25097;
  const char * D.25100;
  const char * D.25101;
  gsize * bitmap_data.425;
  unsigned int D.25103;
  void * D.25106;
  size_t iftmp.426;
  int _objptr.427;
  int D.25116;
  unsigned int D.25117;
  int D.25118;
  int D.25119;
  unsigned int bwords.428;
  sizetype el_size.429;

  {
    struct GCVTable * vt;
    mword desc;

    D.24902 = MEM[(mword *)start];
    D.24903 = D.24902 & 4294967292;
    vt = (struct GCVTable *) D.24903;
    desc = vt->desc;
    D.24904 = desc & 7;
    switch (D.24904) <default: <D.21123>, case 1: <D.21038>, case 2: <D.21045>, case 3: <D.21089>, case 4: <D.21053>, case 5: <D.21083>, case 6: <D.21102>, case 7: <D.21122>>
    <D.21038>:
    D.24905 = desc & 4294901760;
    if (D.24905 != 0) goto <D.24906>; else goto <D.24907>;
    <D.24906>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.24908 = desc >> 16;
      D.24909 = D.24908 & 255;
      D.24910 = D.24909 * 4;
      _objptr = _objptr + D.24910;
      D.24911 = desc >> 24;
      D.24912 = D.24911 * 4;
      _objptr_end = _objptr + D.24912;
      D.24913 = *_objptr;
      if (D.24913 != 0B) goto <D.24914>; else goto <D.24915>;
      <D.24914>:
      D.24916 = hwi->count;
      if (D.24916 == 128) goto <D.24917>; else goto <D.24918>;
      <D.24917>:
      D.24919 = hwi->callback;
      D.24920 = hwi->data;
      D.24921 = &hwi->offsets;
      D.24922 = &hwi->refs;
      D.24916 = hwi->count;
      D.24923 = (unsigned int) D.24916;
      D.24925 = hwi->called;
      if (D.24925 == 0) goto <D.24926>; else goto <D.24927>;
      <D.24926>:
      iftmp.398 = size;
      goto <D.24928>;
      <D.24927>:
      iftmp.398 = 0;
      <D.24928>:
      D.24929 = MEM[(struct MonoObject *)start].vtable;
      D.24930 = D.24929->klass;
      D.24919 (start, D.24930, iftmp.398, D.24923, D.24922, D.24921, D.24920);
      hwi->count = 0;
      hwi->called = 1;
      <D.24918>:
      D.24916 = hwi->count;
      _objptr.399 = (int) _objptr;
      start.400 = (int) start;
      D.24933 = _objptr.399 - start.400;
      D.24934 = (unsigned int) D.24933;
      hwi->offsets[D.24916] = D.24934;
      D.24916 = hwi->count;
      D.24935 = D.24916;
      D.24936 = D.24935 + 1;
      hwi->count = D.24936;
      D.24913 = *_objptr;
      hwi->refs[D.24935] = D.24913;
      <D.24915>:
      _objptr = _objptr + 4;
      goto <D.21042>;
      <D.21041>:
      D.24913 = *_objptr;
      if (D.24913 != 0B) goto <D.24937>; else goto <D.24938>;
      <D.24937>:
      D.24916 = hwi->count;
      if (D.24916 == 128) goto <D.24939>; else goto <D.24940>;
      <D.24939>:
      D.24919 = hwi->callback;
      D.24920 = hwi->data;
      D.24921 = &hwi->offsets;
      D.24922 = &hwi->refs;
      D.24916 = hwi->count;
      D.24923 = (unsigned int) D.24916;
      D.24925 = hwi->called;
      if (D.24925 == 0) goto <D.24942>; else goto <D.24943>;
      <D.24942>:
      iftmp.401 = size;
      goto <D.24944>;
      <D.24943>:
      iftmp.401 = 0;
      <D.24944>:
      D.24929 = MEM[(struct MonoObject *)start].vtable;
      D.24930 = D.24929->klass;
      D.24919 (start, D.24930, iftmp.401, D.24923, D.24922, D.24921, D.24920);
      hwi->count = 0;
      hwi->called = 1;
      <D.24940>:
      D.24916 = hwi->count;
      _objptr.399 = (int) _objptr;
      start.400 = (int) start;
      D.24933 = _objptr.399 - start.400;
      D.24934 = (unsigned int) D.24933;
      hwi->offsets[D.24916] = D.24934;
      D.24916 = hwi->count;
      D.24945 = D.24916;
      D.24946 = D.24945 + 1;
      hwi->count = D.24946;
      D.24913 = *_objptr;
      hwi->refs[D.24945] = D.24913;
      <D.24938>:
      _objptr = _objptr + 4;
      <D.21042>:
      if (_objptr < _objptr_end) goto <D.21041>; else goto <D.21043>;
      <D.21043>:
    }
    <D.24907>:
    goto <D.21044>;
    <D.21045>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.402 = (unsigned int) _index;
        D.24948 = _index.402 * 4;
        _objptr = _objptr + D.24948;
        D.24949 = _index + 1;
        _bmap = _bmap >> D.24949;
        D.24950 = *_objptr;
        if (D.24950 != 0B) goto <D.24951>; else goto <D.24952>;
        <D.24951>:
        D.24916 = hwi->count;
        if (D.24916 == 128) goto <D.24953>; else goto <D.24954>;
        <D.24953>:
        D.24919 = hwi->callback;
        D.24920 = hwi->data;
        D.24921 = &hwi->offsets;
        D.24922 = &hwi->refs;
        D.24916 = hwi->count;
        D.24923 = (unsigned int) D.24916;
        D.24925 = hwi->called;
        if (D.24925 == 0) goto <D.24956>; else goto <D.24957>;
        <D.24956>:
        iftmp.403 = size;
        goto <D.24958>;
        <D.24957>:
        iftmp.403 = 0;
        <D.24958>:
        D.24929 = MEM[(struct MonoObject *)start].vtable;
        D.24930 = D.24929->klass;
        D.24919 (start, D.24930, iftmp.403, D.24923, D.24922, D.24921, D.24920);
        hwi->count = 0;
        hwi->called = 1;
        <D.24954>:
        D.24916 = hwi->count;
        _objptr.404 = (int) _objptr;
        start.400 = (int) start;
        D.24960 = _objptr.404 - start.400;
        D.24961 = (unsigned int) D.24960;
        hwi->offsets[D.24916] = D.24961;
        D.24916 = hwi->count;
        D.24962 = D.24916;
        D.24963 = D.24962 + 1;
        hwi->count = D.24963;
        D.24950 = *_objptr;
        hwi->refs[D.24962] = D.24950;
        <D.24952>:
        _objptr = _objptr + 4;
      }
      goto <D.21051>;
      <D.21050>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.405 = (unsigned int) _index;
        D.24965 = _index.405 * 4;
        _objptr = _objptr + D.24965;
        D.24966 = _index + 1;
        _bmap = _bmap >> D.24966;
        D.24950 = *_objptr;
        if (D.24950 != 0B) goto <D.24967>; else goto <D.24968>;
        <D.24967>:
        D.24916 = hwi->count;
        if (D.24916 == 128) goto <D.24969>; else goto <D.24970>;
        <D.24969>:
        D.24919 = hwi->callback;
        D.24920 = hwi->data;
        D.24921 = &hwi->offsets;
        D.24922 = &hwi->refs;
        D.24916 = hwi->count;
        D.24923 = (unsigned int) D.24916;
        D.24925 = hwi->called;
        if (D.24925 == 0) goto <D.24972>; else goto <D.24973>;
        <D.24972>:
        iftmp.406 = size;
        goto <D.24974>;
        <D.24973>:
        iftmp.406 = 0;
        <D.24974>:
        D.24929 = MEM[(struct MonoObject *)start].vtable;
        D.24930 = D.24929->klass;
        D.24919 (start, D.24930, iftmp.406, D.24923, D.24922, D.24921, D.24920);
        hwi->count = 0;
        hwi->called = 1;
        <D.24970>:
        D.24916 = hwi->count;
        _objptr.404 = (int) _objptr;
        start.400 = (int) start;
        D.24960 = _objptr.404 - start.400;
        D.24961 = (unsigned int) D.24960;
        hwi->offsets[D.24916] = D.24961;
        D.24916 = hwi->count;
        D.24975 = D.24916;
        D.24976 = D.24975 + 1;
        hwi->count = D.24976;
        D.24950 = *_objptr;
        hwi->refs[D.24975] = D.24950;
        <D.24968>:
        _objptr = _objptr + 4;
      }
      <D.21051>:
      if (_bmap != 0) goto <D.21050>; else goto <D.21052>;
      <D.21052>:
    }
    goto <D.21044>;
    <D.21053>:
    D.24977 = desc & 4294950912;
    if (D.24977 != 0) goto <D.24978>; else goto <D.24979>;
    <D.24978>:
    {
      int el_size;
      int etype;

      D.24980 = desc >> 3;
      D.24981 = (int) D.24980;
      el_size = D.24981 & 1023;
      desc.407 = (int) desc;
      etype = desc.407 & 49152;
      if (etype == 16384) goto <D.24983>; else goto <D.24984>;
      <D.24983>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.24985 = MEM[(struct MonoArray *)start].max_length;
        el_size.408 = (unsigned int) el_size;
        D.24987 = D.24985 * el_size.408;
        end_refs = p + D.24987;
        goto <D.21059>;
        <D.21058>:
        D.24988 = *p;
        if (D.24988 != 0B) goto <D.24989>; else goto <D.24990>;
        <D.24989>:
        D.24916 = hwi->count;
        if (D.24916 == 128) goto <D.24991>; else goto <D.24992>;
        <D.24991>:
        D.24919 = hwi->callback;
        D.24920 = hwi->data;
        D.24921 = &hwi->offsets;
        D.24922 = &hwi->refs;
        D.24916 = hwi->count;
        D.24923 = (unsigned int) D.24916;
        D.24925 = hwi->called;
        if (D.24925 == 0) goto <D.24994>; else goto <D.24995>;
        <D.24994>:
        iftmp.409 = size;
        goto <D.24996>;
        <D.24995>:
        iftmp.409 = 0;
        <D.24996>:
        D.24929 = MEM[(struct MonoObject *)start].vtable;
        D.24930 = D.24929->klass;
        D.24919 (start, D.24930, iftmp.409, D.24923, D.24922, D.24921, D.24920);
        hwi->count = 0;
        hwi->called = 1;
        <D.24992>:
        D.24916 = hwi->count;
        p.410 = (int) p;
        start.400 = (int) start;
        D.24998 = p.410 - start.400;
        D.24999 = (unsigned int) D.24998;
        hwi->offsets[D.24916] = D.24999;
        D.24916 = hwi->count;
        D.25000 = D.24916;
        D.25001 = D.25000 + 1;
        hwi->count = D.25001;
        D.24988 = *p;
        hwi->refs[D.25000] = D.24988;
        <D.24990>:
        p = p + 4;
        <D.21059>:
        if (p < end_refs) goto <D.21058>; else goto <D.21060>;
        <D.21060>:
      }
      goto <D.25002>;
      <D.24984>:
      if (etype == 32768) goto <D.25003>; else goto <D.25004>;
      <D.25003>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.24908 = desc >> 16;
        D.25005 = (int) D.24908;
        offset = D.25005 & 255;
        D.24911 = desc >> 24;
        num_refs = (int) D.24911;
        e_start = start + 16;
        D.24985 = MEM[(struct MonoArray *)start].max_length;
        el_size.408 = (unsigned int) el_size;
        D.24987 = D.24985 * el_size.408;
        e_end = e_start + D.24987;
        goto <D.21071>;
        <D.21070>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.411 = (unsigned int) offset;
          D.25007 = offset.411 * 4;
          p = p + D.25007;
          i = 0;
          goto <D.21068>;
          <D.21067>:
          i.412 = (unsigned int) i;
          D.25009 = i.412 * 4;
          D.25010 = p + D.25009;
          D.25011 = *D.25010;
          if (D.25011 != 0B) goto <D.25012>; else goto <D.25013>;
          <D.25012>:
          D.24916 = hwi->count;
          if (D.24916 == 128) goto <D.25014>; else goto <D.25015>;
          <D.25014>:
          D.24919 = hwi->callback;
          D.24920 = hwi->data;
          D.24921 = &hwi->offsets;
          D.24922 = &hwi->refs;
          D.24916 = hwi->count;
          D.24923 = (unsigned int) D.24916;
          D.24925 = hwi->called;
          if (D.24925 == 0) goto <D.25017>; else goto <D.25018>;
          <D.25017>:
          iftmp.413 = size;
          goto <D.25019>;
          <D.25018>:
          iftmp.413 = 0;
          <D.25019>:
          D.24929 = MEM[(struct MonoObject *)start].vtable;
          D.24930 = D.24929->klass;
          D.24919 (start, D.24930, iftmp.413, D.24923, D.24922, D.24921, D.24920);
          hwi->count = 0;
          hwi->called = 1;
          <D.25015>:
          D.24916 = hwi->count;
          i.412 = (unsigned int) i;
          D.25009 = i.412 * 4;
          D.25020 = p + D.25009;
          D.25021 = (int) D.25020;
          start.400 = (int) start;
          D.25022 = D.25021 - start.400;
          D.25023 = (unsigned int) D.25022;
          hwi->offsets[D.24916] = D.25023;
          D.24916 = hwi->count;
          D.25024 = D.24916;
          D.25025 = D.25024 + 1;
          hwi->count = D.25025;
          i.412 = (unsigned int) i;
          D.25009 = i.412 * 4;
          D.25010 = p + D.25009;
          D.25011 = *D.25010;
          hwi->refs[D.25024] = D.25011;
          <D.25013>:
          i = i + 1;
          <D.21068>:
          if (i < num_refs) goto <D.21067>; else goto <D.21069>;
          <D.21069>:
          el_size.414 = (sizetype) el_size;
          e_start = e_start + el_size.414;
        }
        <D.21071>:
        if (e_start < e_end) goto <D.21070>; else goto <D.21072>;
        <D.21072>:
      }
      goto <D.25027>;
      <D.25004>:
      if (etype == 49152) goto <D.25028>; else goto <D.25029>;
      <D.25028>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.24985 = MEM[(struct MonoArray *)start].max_length;
        el_size.408 = (unsigned int) el_size;
        D.24987 = D.24985 * el_size.408;
        e_end = e_start + D.24987;
        goto <D.21081>;
        <D.21080>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.21078>;
          <D.21077>:
          D.25030 = _bmap & 1;
          if (D.25030 != 0) goto <D.25031>; else goto <D.25032>;
          <D.25031>:
          D.25033 = *p;
          if (D.25033 != 0B) goto <D.25034>; else goto <D.25035>;
          <D.25034>:
          D.24916 = hwi->count;
          if (D.24916 == 128) goto <D.25036>; else goto <D.25037>;
          <D.25036>:
          D.24919 = hwi->callback;
          D.24920 = hwi->data;
          D.24921 = &hwi->offsets;
          D.24922 = &hwi->refs;
          D.24916 = hwi->count;
          D.24923 = (unsigned int) D.24916;
          D.24925 = hwi->called;
          if (D.24925 == 0) goto <D.25039>; else goto <D.25040>;
          <D.25039>:
          iftmp.415 = size;
          goto <D.25041>;
          <D.25040>:
          iftmp.415 = 0;
          <D.25041>:
          D.24929 = MEM[(struct MonoObject *)start].vtable;
          D.24930 = D.24929->klass;
          D.24919 (start, D.24930, iftmp.415, D.24923, D.24922, D.24921, D.24920);
          hwi->count = 0;
          hwi->called = 1;
          <D.25037>:
          D.24916 = hwi->count;
          p.416 = (int) p;
          start.400 = (int) start;
          D.25043 = p.416 - start.400;
          D.25044 = (unsigned int) D.25043;
          hwi->offsets[D.24916] = D.25044;
          D.24916 = hwi->count;
          D.25045 = D.24916;
          D.25046 = D.25045 + 1;
          hwi->count = D.25046;
          D.25033 = *p;
          hwi->refs[D.25045] = D.25033;
          <D.25035>:
          <D.25032>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.21078>:
          if (_bmap != 0) goto <D.21077>; else goto <D.21079>;
          <D.21079>:
          el_size.414 = (sizetype) el_size;
          e_start = e_start + el_size.414;
        }
        <D.21081>:
        if (e_start < e_end) goto <D.21080>; else goto <D.21082>;
        <D.21082>:
      }
      <D.25029>:
      <D.25027>:
      <D.25002>:
    }
    <D.24979>:
    goto <D.21044>;
    <D.21083>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.21087>;
      <D.21086>:
      D.25047 = _bmap & 1;
      if (D.25047 != 0) goto <D.25048>; else goto <D.25049>;
      <D.25048>:
      D.25050 = *_objptr;
      if (D.25050 != 0B) goto <D.25051>; else goto <D.25052>;
      <D.25051>:
      D.24916 = hwi->count;
      if (D.24916 == 128) goto <D.25053>; else goto <D.25054>;
      <D.25053>:
      D.24919 = hwi->callback;
      D.24920 = hwi->data;
      D.24921 = &hwi->offsets;
      D.24922 = &hwi->refs;
      D.24916 = hwi->count;
      D.24923 = (unsigned int) D.24916;
      D.24925 = hwi->called;
      if (D.24925 == 0) goto <D.25056>; else goto <D.25057>;
      <D.25056>:
      iftmp.417 = size;
      goto <D.25058>;
      <D.25057>:
      iftmp.417 = 0;
      <D.25058>:
      D.24929 = MEM[(struct MonoObject *)start].vtable;
      D.24930 = D.24929->klass;
      D.24919 (start, D.24930, iftmp.417, D.24923, D.24922, D.24921, D.24920);
      hwi->count = 0;
      hwi->called = 1;
      <D.25054>:
      D.24916 = hwi->count;
      _objptr.418 = (int) _objptr;
      start.400 = (int) start;
      D.25060 = _objptr.418 - start.400;
      D.25061 = (unsigned int) D.25060;
      hwi->offsets[D.24916] = D.25061;
      D.24916 = hwi->count;
      D.25062 = D.24916;
      D.25063 = D.25062 + 1;
      hwi->count = D.25063;
      D.25050 = *_objptr;
      hwi->refs[D.25062] = D.25050;
      <D.25052>:
      <D.25049>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.21087>:
      if (_bmap != 0) goto <D.21086>; else goto <D.21088>;
      <D.21088>:
    }
    goto <D.21044>;
    <D.21089>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.25064 = *bitmap_data;
      D.25065 = D.25064 + 4294967295;
      bwords = (int) D.25065;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.25066>; else goto <D.25067>;
      <D.25066>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.25068 = myobj->vtable;
        D.25069 = D.25068->klass;
        D.25070 = D.25069->name;
        D.25068 = myobj->vtable;
        D.25069 = D.25068->klass;
        D.25071 = D.25069->name_space;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.25071, D.25070);
      }
      <D.25067>:
      goto <D.21100>;
      <D.21099>:
      {
        gsize _bmap;

        bitmap_data.419 = bitmap_data;
        bitmap_data = bitmap_data.419 + 4;
        _bmap = *bitmap_data.419;
        _objptr = start_run;
        goto <D.21097>;
        <D.21096>:
        D.25073 = _bmap & 1;
        if (D.25073 != 0) goto <D.25074>; else goto <D.25075>;
        <D.25074>:
        D.25076 = *_objptr;
        if (D.25076 != 0B) goto <D.25077>; else goto <D.25078>;
        <D.25077>:
        D.24916 = hwi->count;
        if (D.24916 == 128) goto <D.25079>; else goto <D.25080>;
        <D.25079>:
        D.24919 = hwi->callback;
        D.24920 = hwi->data;
        D.24921 = &hwi->offsets;
        D.24922 = &hwi->refs;
        D.24916 = hwi->count;
        D.24923 = (unsigned int) D.24916;
        D.24925 = hwi->called;
        if (D.24925 == 0) goto <D.25082>; else goto <D.25083>;
        <D.25082>:
        iftmp.420 = size;
        goto <D.25084>;
        <D.25083>:
        iftmp.420 = 0;
        <D.25084>:
        D.24929 = MEM[(struct MonoObject *)start].vtable;
        D.24930 = D.24929->klass;
        D.24919 (start, D.24930, iftmp.420, D.24923, D.24922, D.24921, D.24920);
        hwi->count = 0;
        hwi->called = 1;
        <D.25080>:
        D.24916 = hwi->count;
        _objptr.421 = (int) _objptr;
        start.400 = (int) start;
        D.25086 = _objptr.421 - start.400;
        D.25087 = (unsigned int) D.25086;
        hwi->offsets[D.24916] = D.25087;
        D.24916 = hwi->count;
        D.25088 = D.24916;
        D.25089 = D.25088 + 1;
        hwi->count = D.25089;
        D.25076 = *_objptr;
        hwi->refs[D.25088] = D.25076;
        <D.25078>:
        <D.25075>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.21097>:
        if (_bmap != 0) goto <D.21096>; else goto <D.21098>;
        <D.21098>:
        start_run = start_run + 128;
      }
      <D.21100>:
      bwords.422 = bwords;
      bwords = bwords.422 + -1;
      if (bwords.422 > 0) goto <D.21099>; else goto <D.21101>;
      <D.21101>:
    }
    goto <D.21044>;
    <D.21102>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.25091 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.25091);
      mbitmap_data.423 = mbitmap_data;
      mbitmap_data = mbitmap_data.423 + 4;
      D.25093 = *mbitmap_data.423;
      D.25094 = D.25093 + 4294967295;
      mbwords = (int) D.25094;
      D.25095 = vt->klass;
      el_size = mono_array_element_size (D.25095);
      e_start = start + 16;
      D.24985 = MEM[(struct MonoArray *)start].max_length;
      el_size.424 = (unsigned int) el_size;
      D.25097 = D.24985 * el_size.424;
      e_end = e_start + D.25097;
      if (0 != 0) goto <D.25098>; else goto <D.25099>;
      <D.25098>:
      D.25095 = vt->klass;
      D.25100 = D.25095->name;
      D.25095 = vt->klass;
      D.25101 = D.25095->name_space;
      D.25091 = vt->desc;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.25091, D.25101, D.25100);
      <D.25099>:
      goto <D.21120>;
      <D.21119>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.425 = bitmap_data;
          bitmap_data = bitmap_data.425 + 4;
          _bmap = *bitmap_data.425;
          start_run = _objptr;
          goto <D.21114>;
          <D.21113>:
          D.25103 = _bmap & 1;
          if (D.25103 != 0) goto <D.25104>; else goto <D.25105>;
          <D.25104>:
          D.25106 = *_objptr;
          if (D.25106 != 0B) goto <D.25107>; else goto <D.25108>;
          <D.25107>:
          D.24916 = hwi->count;
          if (D.24916 == 128) goto <D.25109>; else goto <D.25110>;
          <D.25109>:
          D.24919 = hwi->callback;
          D.24920 = hwi->data;
          D.24921 = &hwi->offsets;
          D.24922 = &hwi->refs;
          D.24916 = hwi->count;
          D.24923 = (unsigned int) D.24916;
          D.24925 = hwi->called;
          if (D.24925 == 0) goto <D.25112>; else goto <D.25113>;
          <D.25112>:
          iftmp.426 = size;
          goto <D.25114>;
          <D.25113>:
          iftmp.426 = 0;
          <D.25114>:
          D.24929 = MEM[(struct MonoObject *)start].vtable;
          D.24930 = D.24929->klass;
          D.24919 (start, D.24930, iftmp.426, D.24923, D.24922, D.24921, D.24920);
          hwi->count = 0;
          hwi->called = 1;
          <D.25110>:
          D.24916 = hwi->count;
          _objptr.427 = (int) _objptr;
          start.400 = (int) start;
          D.25116 = _objptr.427 - start.400;
          D.25117 = (unsigned int) D.25116;
          hwi->offsets[D.24916] = D.25117;
          D.24916 = hwi->count;
          D.25118 = D.24916;
          D.25119 = D.25118 + 1;
          hwi->count = D.25119;
          D.25106 = *_objptr;
          hwi->refs[D.25118] = D.25106;
          <D.25108>:
          <D.25105>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.21114>:
          if (_bmap != 0) goto <D.21113>; else goto <D.21115>;
          <D.21115>:
          _objptr = start_run + 128;
        }
        <D.21117>:
        bwords.428 = bwords;
        bwords = bwords.428 + 4294967295;
        if (bwords.428 != 0) goto <D.21116>; else goto <D.21118>;
        <D.21118>:
        el_size.429 = (sizetype) el_size;
        e_start = e_start + el_size.429;
      }
      <D.21120>:
      if (e_start < e_end) goto <D.21119>; else goto <D.21121>;
      <D.21121>:
    }
    goto <D.21044>;
    <D.21122>:
    goto <D.21044>;
    <D.21123>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.21044>:
  }
}


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


mono_gc_max_generation ()
{
  int D.25125;

  D.25125 = 1;
  return D.25125;
}


mono_gc_collection_count (int generation)
{
  int D.25129;

  if (generation == 0) goto <D.25127>; else goto <D.25128>;
  <D.25127>:
  D.25129 = stat_minor_gcs;
  return D.25129;
  <D.25128>:
  D.25129 = stat_major_gcs;
  return D.25129;
}


mono_gc_get_used_size ()
{
  unsigned int los_memory_usage.430;
  struct GCMemSection * nursery_section.431;
  char * D.25133;
  int D.25134;
  char * D.25135;
  int D.25136;
  int D.25137;
  long long int D.25138;
  gint64 (*<T2c65>) (void) D.25139;
  long long int D.25140;
  int64_t D.25141;
  gint64 tot;

  tot = 0;
  pthread_mutex_lock (&gc_mutex);
  los_memory_usage.430 = los_memory_usage;
  tot = (gint64) los_memory_usage.430;
  nursery_section.431 = nursery_section;
  D.25133 = nursery_section.431->next_data;
  D.25134 = (int) D.25133;
  nursery_section.431 = nursery_section;
  D.25135 = nursery_section.431->data;
  D.25136 = (int) D.25135;
  D.25137 = D.25134 - D.25136;
  D.25138 = (long long int) D.25137;
  tot = D.25138 + tot;
  D.25139 = major_collector.get_used_size;
  D.25140 = D.25139 ();
  tot = D.25140 + tot;
  sgen_gc_unlock ();
  D.25141 = tot;
  return D.25141;
}


mono_gc_get_los_limit ()
{
  int D.25143;

  D.25143 = 8000;
  return D.25143;
}


mono_gc_user_markers_supported ()
{
  gboolean D.25145;

  D.25145 = 1;
  return D.25145;
}


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

  D.25147 = 1;
  return D.25147;
}


mono_gc_get_generation (struct MonoObject * obj)
{
  int D.25149;
  int D.25152;

  D.25149 = sgen_ptr_in_nursery (obj);
  if (D.25149 != 0) goto <D.25150>; else goto <D.25151>;
  <D.25150>:
  D.25152 = 0;
  return D.25152;
  <D.25151>:
  D.25152 = 1;
  return D.25152;
}


mono_gc_enable_events ()
{

}


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


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


mono_gc_weak_link_get (void * * link_addr)
{
  long unsigned int ptr.432;
  long unsigned int D.25157;
  long unsigned int D.25158;
  struct MonoObject * D.25160;
  int bridge_processing_in_progress.433;
  _Bool D.25162;
  long int D.25163;
  long int D.25164;
  void * D.25167;
  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.25154>; else goto <D.25155>;
  <D.25154>:
  ptr.432 = (long unsigned int) ptr;
  D.25157 = ~ptr.432;
  D.25158 = D.25157 & 4294967292;
  obj = (struct MonoObject *) D.25158;
  goto <D.25159>;
  <D.25155>:
  D.25160 = 0B;
  return D.25160;
  <D.25159>:
  mono_memory_barrier ();
  bridge_processing_in_progress.433 = bridge_processing_in_progress;
  D.25162 = bridge_processing_in_progress.433 != 0;
  D.25163 = (long int) D.25162;
  D.25164 = __builtin_expect (D.25163, 0);
  if (D.25164 != 0) goto <D.25165>; else goto <D.25166>;
  <D.25165>:
  mono_gc_wait_for_bridge_processing ();
  <D.25166>:
  D.25167 = *link_addr_volatile;
  if (D.25167 != ptr) goto retry; else goto <D.25168>;
  <D.25168>:
  D.25160 = obj;
  return D.25160;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


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

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


mono_gc_set_allow_synchronous_major (gboolean flag)
{
  int D.25178;
  gboolean D.25181;

  D.25178 = major_collector.is_concurrent;
  if (D.25178 == 0) goto <D.25179>; else goto <D.25180>;
  <D.25179>:
  D.25181 = flag;
  return D.25181;
  <D.25180>:
  allow_synchronous_major = flag;
  D.25181 = 1;
  return D.25181;
}


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

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


mono_gc_is_gc_thread ()
{
  struct SgenThreadInfo * D.25185;
  _Bool D.25186;
  gboolean D.25187;
  gboolean result;

  pthread_mutex_lock (&gc_mutex);
  D.25185 = mono_thread_info_current ();
  D.25186 = D.25185 != 0B;
  result = (gboolean) D.25186;
  sgen_gc_unlock ();
  D.25187 = result;
  return D.25187;
}


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

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


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

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


mono_gc_base_init ()
{
  int D.25195;
  unsigned int pagesize.438;
  struct _IO_FILE * stderr.439;
  int D.25200;
  char * D.25203;
  int D.25205;
  char * D.25208;
  char * D.25209;
  int D.21254;
  int iftmp.440;
  int D.21253;
  const char[7] * D.25217;
  unsigned char D.25218;
  int D.25219;
  unsigned char D.25220;
  int D.25221;
  _Bool D.25222;
  _Bool D.25223;
  _Bool D.25224;
  const unsigned char * D.25227;
  unsigned char D.25228;
  int D.25229;
  const unsigned char * D.25230;
  unsigned char D.25231;
  int D.25232;
  _Bool D.25233;
  _Bool D.25234;
  const unsigned char * D.25237;
  unsigned char D.25238;
  int D.25239;
  const unsigned char * D.25240;
  unsigned char D.25241;
  int D.25242;
  _Bool D.25243;
  _Bool D.25244;
  const unsigned char * D.25247;
  unsigned char D.25248;
  int D.25249;
  const unsigned char * D.25250;
  unsigned char D.25251;
  int D.25252;
  int D.21264;
  int iftmp.441;
  int D.21263;
  const char[6] * D.25260;
  unsigned char D.25261;
  int D.25262;
  unsigned char D.25263;
  int D.25264;
  _Bool D.25265;
  _Bool D.25266;
  _Bool D.25267;
  const unsigned char * D.25270;
  unsigned char D.25271;
  int D.25272;
  const unsigned char * D.25273;
  unsigned char D.25274;
  int D.25275;
  _Bool D.25276;
  _Bool D.25277;
  const unsigned char * D.25280;
  unsigned char D.25281;
  int D.25282;
  const unsigned char * D.25283;
  unsigned char D.25284;
  int D.25285;
  _Bool D.25286;
  _Bool D.25287;
  const unsigned char * D.25290;
  unsigned char D.25291;
  int D.25292;
  const unsigned char * D.25293;
  unsigned char D.25294;
  int D.25295;
  int D.21273;
  int iftmp.442;
  int D.21272;
  const char[10] * D.25307;
  unsigned char D.25308;
  int D.25309;
  unsigned char D.25310;
  int D.25311;
  _Bool D.25312;
  _Bool D.25313;
  _Bool D.25314;
  const unsigned char * D.25317;
  unsigned char D.25318;
  int D.25319;
  const unsigned char * D.25320;
  unsigned char D.25321;
  int D.25322;
  _Bool D.25323;
  _Bool D.25324;
  const unsigned char * D.25327;
  unsigned char D.25328;
  int D.25329;
  const unsigned char * D.25330;
  unsigned char D.25331;
  int D.25332;
  _Bool D.25333;
  _Bool D.25334;
  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.21283;
  int iftmp.443;
  int D.21282;
  const char[16] * D.25351;
  unsigned char D.25352;
  int D.25353;
  unsigned char D.25354;
  int D.25355;
  _Bool D.25356;
  _Bool D.25357;
  _Bool D.25358;
  const unsigned char * D.25361;
  unsigned char D.25362;
  int D.25363;
  const unsigned char * D.25364;
  unsigned char D.25365;
  int D.25366;
  _Bool D.25367;
  _Bool D.25368;
  const unsigned char * D.25371;
  unsigned char D.25372;
  int D.25373;
  const unsigned char * D.25374;
  unsigned char D.25375;
  int D.25376;
  _Bool D.25377;
  _Bool D.25378;
  const unsigned char * D.25381;
  unsigned char D.25382;
  int D.25383;
  const unsigned char * D.25384;
  unsigned char D.25385;
  int D.25386;
  int D.21292;
  int iftmp.444;
  int D.21291;
  const char[14] * D.25395;
  unsigned char D.25396;
  int D.25397;
  unsigned char D.25398;
  int D.25399;
  _Bool D.25400;
  _Bool D.25401;
  _Bool D.25402;
  const unsigned char * D.25405;
  unsigned char D.25406;
  int D.25407;
  const unsigned char * D.25408;
  unsigned char D.25409;
  int D.25410;
  _Bool D.25411;
  _Bool D.25412;
  const unsigned char * D.25415;
  unsigned char D.25416;
  int D.25417;
  const unsigned char * D.25418;
  unsigned char D.25419;
  int D.25420;
  _Bool D.25421;
  _Bool D.25422;
  const unsigned char * D.25425;
  unsigned char D.25426;
  int D.25427;
  const unsigned char * D.25428;
  unsigned char D.25429;
  int D.25430;
  int D.21301;
  int iftmp.445;
  int D.21300;
  const char[20] * D.25439;
  unsigned char D.25440;
  int D.25441;
  unsigned char D.25442;
  int D.25443;
  _Bool D.25444;
  _Bool D.25445;
  _Bool D.25446;
  const unsigned char * D.25449;
  unsigned char D.25450;
  int D.25451;
  const unsigned char * D.25452;
  unsigned char D.25453;
  int D.25454;
  _Bool D.25455;
  _Bool D.25456;
  const unsigned char * D.25459;
  unsigned char D.25460;
  int D.25461;
  const unsigned char * D.25462;
  unsigned char D.25463;
  int D.25464;
  _Bool D.25465;
  _Bool D.25466;
  const unsigned char * D.25469;
  unsigned char D.25470;
  int D.25471;
  const unsigned char * D.25472;
  unsigned char D.25473;
  int D.25474;
  int D.21310;
  int iftmp.446;
  int D.21309;
  const char[15] * D.25483;
  unsigned char D.25484;
  int D.25485;
  unsigned char D.25486;
  int D.25487;
  _Bool D.25488;
  _Bool D.25489;
  _Bool D.25490;
  const unsigned char * D.25493;
  unsigned char D.25494;
  int D.25495;
  const unsigned char * D.25496;
  unsigned char D.25497;
  int D.25498;
  _Bool D.25499;
  _Bool D.25500;
  const unsigned char * D.25503;
  unsigned char D.25504;
  int D.25505;
  const unsigned char * D.25506;
  unsigned char D.25507;
  int D.25508;
  _Bool D.25509;
  _Bool D.25510;
  const unsigned char * D.25513;
  unsigned char D.25514;
  int D.25515;
  const unsigned char * D.25516;
  unsigned char D.25517;
  int D.25518;
  int D.25522;
  _Bool D.25525;
  long int D.25526;
  long int D.25527;
  int sgen_nursery_size.447;
  int D.21321;
  int iftmp.448;
  int D.21320;
  const char[1] * D.25538;
  unsigned char D.25539;
  int D.25540;
  unsigned char D.25541;
  int D.25542;
  _Bool D.25543;
  _Bool D.25544;
  _Bool D.25545;
  const unsigned char * D.25548;
  unsigned char D.25549;
  int D.25550;
  const unsigned char * D.25551;
  unsigned char D.25552;
  int D.25553;
  _Bool D.25554;
  _Bool D.25555;
  const unsigned char * D.25558;
  unsigned char D.25559;
  int D.25560;
  const unsigned char * D.25561;
  unsigned char D.25562;
  int D.25563;
  _Bool D.25564;
  _Bool D.25565;
  const unsigned char * D.25568;
  unsigned char D.25569;
  int D.25570;
  const unsigned char * D.25571;
  unsigned char D.25572;
  int D.25573;
  unsigned char D.25575;
  int D.25578;
  int D.25581;
  int D.25584;
  char * D.25587;
  char D.25590;
  int D.25592;
  int D.25594;
  long int max_heap_candidate.449;
  long int D.25596;
  long int D.25597;
  int D.25598;
  long int D.25599;
  int D.25602;
  int D.25603;
  char * D.25606;
  int D.25610;
  long int soft_limit.450;
  int D.25615;
  char * D.25620;
  char * endptr.451;
  char D.25625;
  unsigned int val.452;
  unsigned int D.25627;
  int D.25630;
  char * D.25633;
  int D.21334;
  int iftmp.453;
  int D.21333;
  const char[8] * D.25637;
  unsigned char D.25638;
  int D.25639;
  unsigned char D.25640;
  int D.25641;
  _Bool D.25642;
  _Bool D.25643;
  _Bool D.25644;
  const unsigned char * D.25647;
  unsigned char D.25648;
  int D.25649;
  const unsigned char * D.25650;
  unsigned char D.25651;
  int D.25652;
  _Bool D.25653;
  _Bool D.25654;
  const unsigned char * D.25657;
  unsigned char D.25658;
  int D.25659;
  const unsigned char * D.25660;
  unsigned char D.25661;
  int D.25662;
  _Bool D.25663;
  _Bool D.25664;
  const unsigned char * D.25667;
  unsigned char D.25668;
  int D.25669;
  const unsigned char * D.25670;
  unsigned char D.25671;
  int D.25672;
  int D.21343;
  int iftmp.454;
  int D.21342;
  const char[13] * D.25680;
  unsigned char D.25681;
  int D.25682;
  unsigned char D.25683;
  int D.25684;
  _Bool D.25685;
  _Bool D.25686;
  _Bool D.25687;
  const unsigned char * D.25690;
  unsigned char D.25691;
  int D.25692;
  const unsigned char * D.25693;
  unsigned char D.25694;
  int D.25695;
  _Bool D.25696;
  _Bool D.25697;
  const unsigned char * D.25700;
  unsigned char D.25701;
  int D.25702;
  const unsigned char * D.25703;
  unsigned char D.25704;
  int D.25705;
  _Bool D.25706;
  _Bool D.25707;
  const unsigned char * D.25710;
  unsigned char D.25711;
  int D.25712;
  const unsigned char * D.25713;
  unsigned char D.25714;
  int D.25715;
  const char * iftmp.455;
  int conservative_stack_mark.456;
  int D.25725;
  char * D.25728;
  gchar * D.25729;
  int D.25730;
  char * D.25733;
  int D.25737;
  long int val.457;
  long int D.25740;
  long int D.25741;
  int sgen_nursery_bits.458;
  int sgen_nursery_bits.459;
  int D.25748;
  int D.25749;
  char * D.25752;
  int D.25753;
  int D.25756;
  char * D.25759;
  int D.25760;
  int D.25763;
  int D.25766;
  char * D.25769;
  int D.21358;
  int iftmp.460;
  int D.21357;
  const char[4] * D.25773;
  unsigned char D.25774;
  int D.25775;
  unsigned char D.25776;
  int D.25777;
  _Bool D.25778;
  _Bool D.25779;
  _Bool D.25780;
  const unsigned char * D.25783;
  unsigned char D.25784;
  int D.25785;
  const unsigned char * D.25786;
  unsigned char D.25787;
  int D.25788;
  _Bool D.25789;
  _Bool D.25790;
  const unsigned char * D.25793;
  unsigned char D.25794;
  int D.25795;
  const unsigned char * D.25796;
  unsigned char D.25797;
  int D.25798;
  _Bool D.25799;
  _Bool D.25800;
  const unsigned char * D.25803;
  unsigned char D.25804;
  int D.25805;
  const unsigned char * D.25806;
  unsigned char D.25807;
  int D.25808;
  int D.21367;
  int iftmp.461;
  int D.21366;
  const char[3] * D.25816;
  unsigned char D.25817;
  int D.25818;
  unsigned char D.25819;
  int D.25820;
  _Bool D.25821;
  _Bool D.25822;
  _Bool D.25823;
  const unsigned char * D.25826;
  unsigned char D.25827;
  int D.25828;
  const unsigned char * D.25829;
  unsigned char D.25830;
  int D.25831;
  _Bool D.25832;
  _Bool D.25833;
  const unsigned char * D.25836;
  unsigned char D.25837;
  int D.25838;
  const unsigned char * D.25839;
  unsigned char D.25840;
  int D.25841;
  _Bool D.25842;
  _Bool D.25843;
  const unsigned char * D.25846;
  unsigned char D.25847;
  int D.25848;
  const unsigned char * D.25849;
  unsigned char D.25850;
  int D.25851;
  int D.21376;
  int iftmp.462;
  int D.21375;
  const char[10] * D.25859;
  unsigned char D.25860;
  int D.25861;
  unsigned char D.25862;
  int D.25863;
  _Bool D.25864;
  _Bool D.25865;
  _Bool D.25866;
  const unsigned char * D.25869;
  unsigned char D.25870;
  int D.25871;
  const unsigned char * D.25872;
  unsigned char D.25873;
  int D.25874;
  _Bool D.25875;
  _Bool D.25876;
  const unsigned char * D.25879;
  unsigned char D.25880;
  int D.25881;
  const unsigned char * D.25882;
  unsigned char D.25883;
  int D.25884;
  _Bool D.25885;
  _Bool D.25886;
  const unsigned char * D.25889;
  unsigned char D.25890;
  int D.25891;
  const unsigned char * D.25892;
  unsigned char D.25893;
  int D.25894;
  int D.21385;
  int iftmp.463;
  int D.21384;
  const char[13] * D.25903;
  unsigned char D.25904;
  int D.25905;
  unsigned char D.25906;
  int D.25907;
  _Bool D.25908;
  _Bool D.25909;
  _Bool D.25910;
  const unsigned char * D.25913;
  unsigned char D.25914;
  int D.25915;
  const unsigned char * D.25916;
  unsigned char D.25917;
  int D.25918;
  _Bool D.25919;
  _Bool D.25920;
  const unsigned char * D.25923;
  unsigned char D.25924;
  int D.25925;
  const unsigned char * D.25926;
  unsigned char D.25927;
  int D.25928;
  _Bool D.25929;
  _Bool D.25930;
  const unsigned char * D.25933;
  unsigned char D.25934;
  int D.25935;
  const unsigned char * D.25936;
  unsigned char D.25937;
  int D.25938;
  gboolean (*<T2c17>) (const char *) D.25942;
  int D.25945;
  gboolean (*<T2c17>) (const char *) D.25948;
  int D.25951;
  void (*<T719>) (void) D.25958;
  void (*<T719>) (void) D.25961;
  int D.21399;
  int iftmp.464;
  int D.21398;
  unsigned char D.25978;
  int D.25979;
  _Bool D.25980;
  _Bool D.25981;
  _Bool D.25982;
  const unsigned char * D.25985;
  unsigned char D.25986;
  int D.25987;
  _Bool D.25988;
  _Bool D.25989;
  const unsigned char * D.25992;
  unsigned char D.25993;
  int D.25994;
  _Bool D.25995;
  _Bool D.25996;
  const unsigned char * D.25999;
  unsigned char D.26000;
  int D.26001;
  unsigned char D.26003;
  char D.26006;
  unsigned char D.26007;
  unsigned char D.26008;
  int gc_debug_level.465;
  int D.26016;
  struct FILE * gc_debug_file.466;
  struct FILE * gc_debug_file.467;
  int D.21410;
  int iftmp.468;
  int D.21409;
  const char[16] * D.26025;
  unsigned char D.26026;
  int D.26027;
  unsigned char D.26028;
  int D.26029;
  _Bool D.26030;
  _Bool D.26031;
  _Bool D.26032;
  const unsigned char * D.26035;
  unsigned char D.26036;
  int D.26037;
  const unsigned char * D.26038;
  unsigned char D.26039;
  int D.26040;
  _Bool D.26041;
  _Bool D.26042;
  const unsigned char * D.26045;
  unsigned char D.26046;
  int D.26047;
  const unsigned char * D.26048;
  unsigned char D.26049;
  int D.26050;
  _Bool D.26051;
  _Bool D.26052;
  const unsigned char * D.26055;
  unsigned char D.26056;
  int D.26057;
  const unsigned char * D.26058;
  unsigned char D.26059;
  int D.26060;
  int D.21419;
  int iftmp.469;
  int D.21418;
  const char[14] * D.26068;
  unsigned char D.26069;
  int D.26070;
  unsigned char D.26071;
  int D.26072;
  _Bool D.26073;
  _Bool D.26074;
  _Bool D.26075;
  const unsigned char * D.26078;
  unsigned char D.26079;
  int D.26080;
  const unsigned char * D.26081;
  unsigned char D.26082;
  int D.26083;
  _Bool D.26084;
  _Bool D.26085;
  const unsigned char * D.26088;
  unsigned char D.26089;
  int D.26090;
  const unsigned char * D.26091;
  unsigned char D.26092;
  int D.26093;
  _Bool D.26094;
  _Bool D.26095;
  const unsigned char * D.26098;
  unsigned char D.26099;
  int D.26100;
  const unsigned char * D.26101;
  unsigned char D.26102;
  int D.26103;
  int D.21428;
  int iftmp.470;
  int D.21427;
  const char[21] * D.26111;
  unsigned char D.26112;
  int D.26113;
  unsigned char D.26114;
  int D.26115;
  _Bool D.26116;
  _Bool D.26117;
  _Bool D.26118;
  const unsigned char * D.26121;
  unsigned char D.26122;
  int D.26123;
  const unsigned char * D.26124;
  unsigned char D.26125;
  int D.26126;
  _Bool D.26127;
  _Bool D.26128;
  const unsigned char * D.26131;
  unsigned char D.26132;
  int D.26133;
  const unsigned char * D.26134;
  unsigned char D.26135;
  int D.26136;
  _Bool D.26137;
  _Bool D.26138;
  const unsigned char * D.26141;
  unsigned char D.26142;
  int D.26143;
  const unsigned char * D.26144;
  unsigned char D.26145;
  int D.26146;
  int D.26151;
  char * D.26154;
  int D.26155;
  unsigned int verify_before_allocs.471;
  int D.21438;
  int iftmp.472;
  int D.21437;
  const char[22] * D.26161;
  unsigned char D.26162;
  int D.26163;
  unsigned char D.26164;
  int D.26165;
  _Bool D.26166;
  _Bool D.26167;
  _Bool D.26168;
  const unsigned char * D.26171;
  unsigned char D.26172;
  int D.26173;
  const unsigned char * D.26174;
  unsigned char D.26175;
  int D.26176;
  _Bool D.26177;
  _Bool D.26178;
  const unsigned char * D.26181;
  unsigned char D.26182;
  int D.26183;
  const unsigned char * D.26184;
  unsigned char D.26185;
  int D.26186;
  _Bool D.26187;
  _Bool D.26188;
  const unsigned char * D.26191;
  unsigned char D.26192;
  int D.26193;
  const unsigned char * D.26194;
  unsigned char D.26195;
  int D.26196;
  int D.26201;
  char * D.26204;
  int D.26205;
  unsigned int collect_before_allocs.473;
  int D.21448;
  int iftmp.474;
  int D.21447;
  const char[26] * D.26211;
  unsigned char D.26212;
  int D.26213;
  unsigned char D.26214;
  int D.26215;
  _Bool D.26216;
  _Bool D.26217;
  _Bool D.26218;
  const unsigned char * D.26221;
  unsigned char D.26222;
  int D.26223;
  const unsigned char * D.26224;
  unsigned char D.26225;
  int D.26226;
  _Bool D.26227;
  _Bool D.26228;
  const unsigned char * D.26231;
  unsigned char D.26232;
  int D.26233;
  const unsigned char * D.26234;
  unsigned char D.26235;
  int D.26236;
  _Bool D.26237;
  _Bool D.26238;
  const unsigned char * D.26241;
  unsigned char D.26242;
  int D.26243;
  const unsigned char * D.26244;
  unsigned char D.26245;
  int D.26246;
  int D.21457;
  int iftmp.475;
  int D.21456;
  const char[27] * D.26254;
  unsigned char D.26255;
  int D.26256;
  unsigned char D.26257;
  int D.26258;
  _Bool D.26259;
  _Bool D.26260;
  _Bool D.26261;
  const unsigned char * D.26264;
  unsigned char D.26265;
  int D.26266;
  const unsigned char * D.26267;
  unsigned char D.26268;
  int D.26269;
  _Bool D.26270;
  _Bool D.26271;
  const unsigned char * D.26274;
  unsigned char D.26275;
  int D.26276;
  const unsigned char * D.26277;
  unsigned char D.26278;
  int D.26279;
  _Bool D.26280;
  _Bool D.26281;
  const unsigned char * D.26284;
  unsigned char D.26285;
  int D.26286;
  const unsigned char * D.26287;
  unsigned char D.26288;
  int D.26289;
  int D.21466;
  int iftmp.476;
  int D.21465;
  const char[28] * D.26297;
  unsigned char D.26298;
  int D.26299;
  unsigned char D.26300;
  int D.26301;
  _Bool D.26302;
  _Bool D.26303;
  _Bool D.26304;
  const unsigned char * D.26307;
  unsigned char D.26308;
  int D.26309;
  const unsigned char * D.26310;
  unsigned char D.26311;
  int D.26312;
  _Bool D.26313;
  _Bool D.26314;
  const unsigned char * D.26317;
  unsigned char D.26318;
  int D.26319;
  const unsigned char * D.26320;
  unsigned char D.26321;
  int D.26322;
  _Bool D.26323;
  _Bool D.26324;
  const unsigned char * D.26327;
  unsigned char D.26328;
  int D.26329;
  const unsigned char * D.26330;
  unsigned char D.26331;
  int D.26332;
  int D.21475;
  int iftmp.477;
  int D.21474;
  const char[16] * D.26342;
  unsigned char D.26343;
  int D.26344;
  unsigned char D.26345;
  int D.26346;
  _Bool D.26347;
  _Bool D.26348;
  _Bool D.26349;
  const unsigned char * D.26352;
  unsigned char D.26353;
  int D.26354;
  const unsigned char * D.26355;
  unsigned char D.26356;
  int D.26357;
  _Bool D.26358;
  _Bool D.26359;
  const unsigned char * D.26362;
  unsigned char D.26363;
  int D.26364;
  const unsigned char * D.26365;
  unsigned char D.26366;
  int D.26367;
  _Bool D.26368;
  _Bool D.26369;
  const unsigned char * D.26372;
  unsigned char D.26373;
  int D.26374;
  const unsigned char * D.26375;
  unsigned char D.26376;
  int D.26377;
  int D.21484;
  int iftmp.478;
  int D.21483;
  const char[21] * D.26385;
  unsigned char D.26386;
  int D.26387;
  unsigned char D.26388;
  int D.26389;
  _Bool D.26390;
  _Bool D.26391;
  _Bool D.26392;
  const unsigned char * D.26395;
  unsigned char D.26396;
  int D.26397;
  const unsigned char * D.26398;
  unsigned char D.26399;
  int D.26400;
  _Bool D.26401;
  _Bool D.26402;
  const unsigned char * D.26405;
  unsigned char D.26406;
  int D.26407;
  const unsigned char * D.26408;
  unsigned char D.26409;
  int D.26410;
  _Bool D.26411;
  _Bool D.26412;
  const unsigned char * D.26415;
  unsigned char D.26416;
  int D.26417;
  const unsigned char * D.26418;
  unsigned char D.26419;
  int D.26420;
  int D.21493;
  int iftmp.479;
  int D.21492;
  const char[15] * D.26428;
  unsigned char D.26429;
  int D.26430;
  unsigned char D.26431;
  int D.26432;
  _Bool D.26433;
  _Bool D.26434;
  _Bool D.26435;
  const unsigned char * D.26438;
  unsigned char D.26439;
  int D.26440;
  const unsigned char * D.26441;
  unsigned char D.26442;
  int D.26443;
  _Bool D.26444;
  _Bool D.26445;
  const unsigned char * D.26448;
  unsigned char D.26449;
  int D.26450;
  const unsigned char * D.26451;
  unsigned char D.26452;
  int D.26453;
  _Bool D.26454;
  _Bool D.26455;
  const unsigned char * D.26458;
  unsigned char D.26459;
  int D.26460;
  const unsigned char * D.26461;
  unsigned char D.26462;
  int D.26463;
  int D.21502;
  int iftmp.480;
  int D.21501;
  const char[12] * D.26471;
  unsigned char D.26472;
  int D.26473;
  unsigned char D.26474;
  int D.26475;
  _Bool D.26476;
  _Bool D.26477;
  _Bool D.26478;
  const unsigned char * D.26481;
  unsigned char D.26482;
  int D.26483;
  const unsigned char * D.26484;
  unsigned char D.26485;
  int D.26486;
  _Bool D.26487;
  _Bool D.26488;
  const unsigned char * D.26491;
  unsigned char D.26492;
  int D.26493;
  const unsigned char * D.26494;
  unsigned char D.26495;
  int D.26496;
  _Bool D.26497;
  _Bool D.26498;
  const unsigned char * D.26501;
  unsigned char D.26502;
  int D.26503;
  const unsigned char * D.26504;
  unsigned char D.26505;
  int D.26506;
  int D.21511;
  int iftmp.481;
  int D.21510;
  const char[20] * D.26514;
  unsigned char D.26515;
  int D.26516;
  unsigned char D.26517;
  int D.26518;
  _Bool D.26519;
  _Bool D.26520;
  _Bool D.26521;
  const unsigned char * D.26524;
  unsigned char D.26525;
  int D.26526;
  const unsigned char * D.26527;
  unsigned char D.26528;
  int D.26529;
  _Bool D.26530;
  _Bool D.26531;
  const unsigned char * D.26534;
  unsigned char D.26535;
  int D.26536;
  const unsigned char * D.26537;
  unsigned char D.26538;
  int D.26539;
  _Bool D.26540;
  _Bool D.26541;
  const unsigned char * D.26544;
  unsigned char D.26545;
  int D.26546;
  const unsigned char * D.26547;
  unsigned char D.26548;
  int D.26549;
  int D.21520;
  int iftmp.482;
  int D.21519;
  const char[18] * D.26557;
  unsigned char D.26558;
  int D.26559;
  unsigned char D.26560;
  int D.26561;
  _Bool D.26562;
  _Bool D.26563;
  _Bool D.26564;
  const unsigned char * D.26567;
  unsigned char D.26568;
  int D.26569;
  const unsigned char * D.26570;
  unsigned char D.26571;
  int D.26572;
  _Bool D.26573;
  _Bool D.26574;
  const unsigned char * D.26577;
  unsigned char D.26578;
  int D.26579;
  const unsigned char * D.26580;
  unsigned char D.26581;
  int D.26582;
  _Bool D.26583;
  _Bool D.26584;
  const unsigned char * D.26587;
  unsigned char D.26588;
  int D.26589;
  const unsigned char * D.26590;
  unsigned char D.26591;
  int D.26592;
  int D.21529;
  int iftmp.483;
  int D.21528;
  const char[27] * D.26600;
  unsigned char D.26601;
  int D.26602;
  unsigned char D.26603;
  int D.26604;
  _Bool D.26605;
  _Bool D.26606;
  _Bool D.26607;
  const unsigned char * D.26610;
  unsigned char D.26611;
  int D.26612;
  const unsigned char * D.26613;
  unsigned char D.26614;
  int D.26615;
  _Bool D.26616;
  _Bool D.26617;
  const unsigned char * D.26620;
  unsigned char D.26621;
  int D.26622;
  const unsigned char * D.26623;
  unsigned char D.26624;
  int D.26625;
  _Bool D.26626;
  _Bool D.26627;
  const unsigned char * D.26630;
  unsigned char D.26631;
  int D.26632;
  const unsigned char * D.26633;
  unsigned char D.26634;
  int D.26635;
  int D.21538;
  int iftmp.484;
  int D.21537;
  const char[17] * D.26643;
  unsigned char D.26644;
  int D.26645;
  unsigned char D.26646;
  int D.26647;
  _Bool D.26648;
  _Bool D.26649;
  _Bool D.26650;
  const unsigned char * D.26653;
  unsigned char D.26654;
  int D.26655;
  const unsigned char * D.26656;
  unsigned char D.26657;
  int D.26658;
  _Bool D.26659;
  _Bool D.26660;
  const unsigned char * D.26663;
  unsigned char D.26664;
  int D.26665;
  const unsigned char * D.26666;
  unsigned char D.26667;
  int D.26668;
  _Bool D.26669;
  _Bool D.26670;
  const unsigned char * D.26673;
  unsigned char D.26674;
  int D.26675;
  const unsigned char * D.26676;
  unsigned char D.26677;
  int D.26678;
  int D.21547;
  int iftmp.485;
  int D.21546;
  const char[25] * D.26688;
  unsigned char D.26689;
  int D.26690;
  unsigned char D.26691;
  int D.26692;
  _Bool D.26693;
  _Bool D.26694;
  _Bool D.26695;
  const unsigned char * D.26698;
  unsigned char D.26699;
  int D.26700;
  const unsigned char * D.26701;
  unsigned char D.26702;
  int D.26703;
  _Bool D.26704;
  _Bool D.26705;
  const unsigned char * D.26708;
  unsigned char D.26709;
  int D.26710;
  const unsigned char * D.26711;
  unsigned char D.26712;
  int D.26713;
  _Bool D.26714;
  _Bool D.26715;
  const unsigned char * D.26718;
  unsigned char D.26719;
  int D.26720;
  const unsigned char * D.26721;
  unsigned char D.26722;
  int D.26723;
  int D.21556;
  int iftmp.486;
  int D.21555;
  const char[21] * D.26731;
  unsigned char D.26732;
  int D.26733;
  unsigned char D.26734;
  int D.26735;
  _Bool D.26736;
  _Bool D.26737;
  _Bool D.26738;
  const unsigned char * D.26741;
  unsigned char D.26742;
  int D.26743;
  const unsigned char * D.26744;
  unsigned char D.26745;
  int D.26746;
  _Bool D.26747;
  _Bool D.26748;
  const unsigned char * D.26751;
  unsigned char D.26752;
  int D.26753;
  const unsigned char * D.26754;
  unsigned char D.26755;
  int D.26756;
  _Bool D.26757;
  _Bool D.26758;
  const unsigned char * D.26761;
  unsigned char D.26762;
  int D.26763;
  const unsigned char * D.26764;
  unsigned char D.26765;
  int D.26766;
  int D.21565;
  int iftmp.487;
  int D.21564;
  const char[14] * D.26774;
  unsigned char D.26775;
  int D.26776;
  unsigned char D.26777;
  int D.26778;
  _Bool D.26779;
  _Bool D.26780;
  _Bool D.26781;
  const unsigned char * D.26784;
  unsigned char D.26785;
  int D.26786;
  const unsigned char * D.26787;
  unsigned char D.26788;
  int D.26789;
  _Bool D.26790;
  _Bool D.26791;
  const unsigned char * D.26794;
  unsigned char D.26795;
  int D.26796;
  const unsigned char * D.26797;
  unsigned char D.26798;
  int D.26799;
  _Bool D.26800;
  _Bool D.26801;
  const unsigned char * D.26804;
  unsigned char D.26805;
  int D.26806;
  const unsigned char * D.26807;
  unsigned char D.26808;
  int D.26809;
  int D.21574;
  int iftmp.488;
  int D.21573;
  const char[14] * D.26817;
  unsigned char D.26818;
  int D.26819;
  unsigned char D.26820;
  int D.26821;
  _Bool D.26822;
  _Bool D.26823;
  _Bool D.26824;
  const unsigned char * D.26827;
  unsigned char D.26828;
  int D.26829;
  const unsigned char * D.26830;
  unsigned char D.26831;
  int D.26832;
  _Bool D.26833;
  _Bool D.26834;
  const unsigned char * D.26837;
  unsigned char D.26838;
  int D.26839;
  const unsigned char * D.26840;
  unsigned char D.26841;
  int D.26842;
  _Bool D.26843;
  _Bool D.26844;
  const unsigned char * D.26847;
  unsigned char D.26848;
  int D.26849;
  const unsigned char * D.26850;
  unsigned char D.26851;
  int D.26852;
  int D.26857;
  char * D.26860;
  struct FILE * heap_dump_file.489;
  struct FILE * heap_dump_file.490;
  int do_pin_stats.491;
  void (*<T2c7f>) (struct SgenMajorCollector *) D.26876;
  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.21239>:
      result = InterlockedCompareExchange (&gc_initialized, -1, 0);
      switch (result) <default: <D.21238>, case -1: <D.21235>, case 0: <D.21237>, case 1: <D.21234>>
      <D.21234>:
      return;
      <D.21235>:
      monoeg_g_usleep (1000);
      goto <D.21236>;
      <D.21237>:
      goto <D.21236>;
      <D.21238>:
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 4863);
      <D.21236>:
      if (result != 0) goto <D.21239>; else goto <D.21240>;
      <D.21240>:
      pthread_mutex_init (&gc_mutex, 0B);
      D.25195 = mono_pagesize ();
      pagesize.438 = (unsigned int) D.25195;
      pagesize = pagesize.438;
      stderr.439 = stderr;
      gc_debug_file = stderr.439;
      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, 264);
      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.25198>; else goto <D.25199>;
      <D.25198>:
      opts = monoeg_g_strsplit (env, ",", -1);
      ptr = opts;
      goto <D.21243>;
      <D.21242>:
      {
        char * opt;

        opt = *ptr;
        D.25200 = monoeg_g_str_has_prefix (opt, "major=");
        if (D.25200 != 0) goto <D.25201>; else goto <D.25202>;
        <D.25201>:
        D.25203 = __builtin_strchr (opt, 61);
        opt = D.25203 + 1;
        major_collector_opt = monoeg_strdup (opt);
        goto <D.25204>;
        <D.25202>:
        D.25205 = monoeg_g_str_has_prefix (opt, "minor=");
        if (D.25205 != 0) goto <D.25206>; else goto <D.25207>;
        <D.25206>:
        D.25208 = __builtin_strchr (opt, 61);
        opt = D.25208 + 1;
        minor_collector_opt = monoeg_strdup (opt);
        <D.25207>:
        <D.25204>:
      }
      ptr = ptr + 4;
      <D.21243>:
      D.25209 = *ptr;
      if (D.25209 != 0B) goto <D.21242>; else goto <D.21244>;
      <D.21244>:
      goto <D.25210>;
      <D.25199>:
      opts = 0B;
      <D.25210>:
      init_stats ();
      sgen_init_internal_allocator ();
      sgen_init_nursery_allocator ();
      sgen_init_fin_weak_hash ();
      sgen_register_fixed_internal_mem_type (2, 32);
      sgen_register_fixed_internal_mem_type (6, 8);
      sgen_register_fixed_internal_mem_type (14, 508);
      sgen_register_fixed_internal_mem_type (18, 8);
      {
        int tls_offset;

        tls_offset = -1;
        __asm__("movl $sgen_thread_info@ntpoff, %0" : "=r" tls_offset);
        mono_tls_key_set_offset (4, tls_offset);
      }
      sgen_os_init ();
      mono_thread_info_attach (&dummy);
      if (minor_collector_opt == 0B) goto <D.25211>; else goto <D.25212>;
      <D.25211>:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.25213>;
      <D.25212>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.25217 = "simple";
          D.25218 = MEM[(const unsigned char *)D.25217];
          D.25219 = (int) D.25218;
          D.25220 = *__s2;
          D.25221 = (int) D.25220;
          __result = D.25219 - D.25221;
          {
            D.25222 = __s2_len != 0;
            D.25223 = __result == 0;
            D.25224 = D.25222 & D.25223;
            if (D.25224 != 0) goto <D.25225>; else goto <D.25226>;
            <D.25225>:
            D.25227 = &MEM[(void *)"simple" + 1B];
            D.25228 = *D.25227;
            D.25229 = (int) D.25228;
            D.25230 = __s2 + 1;
            D.25231 = *D.25230;
            D.25232 = (int) D.25231;
            __result = D.25229 - D.25232;
            D.25233 = __s2_len > 1;
            D.25223 = __result == 0;
            D.25234 = D.25233 & D.25223;
            if (D.25234 != 0) goto <D.25235>; else goto <D.25236>;
            <D.25235>:
            D.25237 = &MEM[(void *)"simple" + 2B];
            D.25238 = *D.25237;
            D.25239 = (int) D.25238;
            D.25240 = __s2 + 2;
            D.25241 = *D.25240;
            D.25242 = (int) D.25241;
            __result = D.25239 - D.25242;
            D.25243 = __s2_len > 2;
            D.25223 = __result == 0;
            D.25244 = D.25243 & D.25223;
            if (D.25244 != 0) goto <D.25245>; else goto <D.25246>;
            <D.25245>:
            D.25247 = &MEM[(void *)"simple" + 3B];
            D.25248 = *D.25247;
            D.25249 = (int) D.25248;
            D.25250 = __s2 + 3;
            D.25251 = *D.25250;
            D.25252 = (int) D.25251;
            __result = D.25249 - D.25252;
            <D.25246>:
            <D.25236>:
            <D.25226>:
          }
          D.21253 = __result;
        }
        iftmp.440 = -D.21253;
        goto <D.25253>;
        <D.25216>:
        iftmp.440 = __builtin_strcmp (minor_collector_opt, "simple");
        <D.25253>:
        D.21254 = iftmp.440;
      }
      if (D.21254 == 0) goto <D.25254>; else goto <D.25255>;
      <D.25254>:
      use_simple_nursery:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.25256>;
      <D.25255>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.25260 = "split";
          D.25261 = MEM[(const unsigned char *)D.25260];
          D.25262 = (int) D.25261;
          D.25263 = *__s2;
          D.25264 = (int) D.25263;
          __result = D.25262 - D.25264;
          {
            D.25265 = __s2_len != 0;
            D.25266 = __result == 0;
            D.25267 = D.25265 & D.25266;
            if (D.25267 != 0) goto <D.25268>; else goto <D.25269>;
            <D.25268>:
            D.25270 = &MEM[(void *)"split" + 1B];
            D.25271 = *D.25270;
            D.25272 = (int) D.25271;
            D.25273 = __s2 + 1;
            D.25274 = *D.25273;
            D.25275 = (int) D.25274;
            __result = D.25272 - D.25275;
            D.25276 = __s2_len > 1;
            D.25266 = __result == 0;
            D.25277 = D.25276 & D.25266;
            if (D.25277 != 0) goto <D.25278>; else goto <D.25279>;
            <D.25278>:
            D.25280 = &MEM[(void *)"split" + 2B];
            D.25281 = *D.25280;
            D.25282 = (int) D.25281;
            D.25283 = __s2 + 2;
            D.25284 = *D.25283;
            D.25285 = (int) D.25284;
            __result = D.25282 - D.25285;
            D.25286 = __s2_len > 2;
            D.25266 = __result == 0;
            D.25287 = D.25286 & D.25266;
            if (D.25287 != 0) goto <D.25288>; else goto <D.25289>;
            <D.25288>:
            D.25290 = &MEM[(void *)"split" + 3B];
            D.25291 = *D.25290;
            D.25292 = (int) D.25291;
            D.25293 = __s2 + 3;
            D.25294 = *D.25293;
            D.25295 = (int) D.25294;
            __result = D.25292 - D.25295;
            <D.25289>:
            <D.25279>:
            <D.25269>:
          }
          D.21263 = __result;
        }
        iftmp.441 = -D.21263;
        goto <D.25296>;
        <D.25259>:
        iftmp.441 = __builtin_strcmp (minor_collector_opt, "split");
        <D.25296>:
        D.21264 = iftmp.441;
      }
      if (D.21264 == 0) goto <D.25297>; else goto <D.25298>;
      <D.25297>:
      sgen_split_nursery_init (&sgen_minor_collector);
      have_split_nursery = 1;
      goto <D.25299>;
      <D.25298>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `simple` instead.", "Unknown minor collector `%s\'.", minor_collector_opt);
      goto use_simple_nursery;
      <D.25299>:
      <D.25256>:
      <D.25213>:
      if (major_collector_opt == 0B) goto <D.25300>; else goto <D.25303>;
      <D.25303>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25307 = "marksweep";
          D.25308 = MEM[(const unsigned char *)D.25307];
          D.25309 = (int) D.25308;
          D.25310 = *__s2;
          D.25311 = (int) D.25310;
          __result = D.25309 - D.25311;
          {
            D.25312 = __s2_len != 0;
            D.25313 = __result == 0;
            D.25314 = D.25312 & D.25313;
            if (D.25314 != 0) goto <D.25315>; else goto <D.25316>;
            <D.25315>:
            D.25317 = &MEM[(void *)"marksweep" + 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;
            D.25323 = __s2_len > 1;
            D.25313 = __result == 0;
            D.25324 = D.25323 & D.25313;
            if (D.25324 != 0) goto <D.25325>; else goto <D.25326>;
            <D.25325>:
            D.25327 = &MEM[(void *)"marksweep" + 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;
            D.25333 = __s2_len > 2;
            D.25313 = __result == 0;
            D.25334 = D.25333 & D.25313;
            if (D.25334 != 0) goto <D.25335>; else goto <D.25336>;
            <D.25335>:
            D.25337 = &MEM[(void *)"marksweep" + 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.25326>:
            <D.25316>:
          }
          D.21272 = __result;
        }
        iftmp.442 = -D.21272;
        goto <D.25343>;
        <D.25306>:
        iftmp.442 = __builtin_strcmp (major_collector_opt, "marksweep");
        <D.25343>:
        D.21273 = iftmp.442;
      }
      if (D.21273 == 0) goto <D.25300>; else goto <D.25301>;
      <D.25300>:
      use_marksweep_major:
      sgen_marksweep_init (&major_collector);
      goto <D.25302>;
      <D.25301>:
      if (major_collector_opt == 0B) goto <D.25344>; else goto <D.25347>;
      <D.25347>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 15;
        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-fixed";
          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;
          {
            D.25356 = __s2_len != 0;
            D.25357 = __result == 0;
            D.25358 = D.25356 & D.25357;
            if (D.25358 != 0) goto <D.25359>; else goto <D.25360>;
            <D.25359>:
            D.25361 = &MEM[(void *)"marksweep-fixed" + 1B];
            D.25362 = *D.25361;
            D.25363 = (int) D.25362;
            D.25364 = __s2 + 1;
            D.25365 = *D.25364;
            D.25366 = (int) D.25365;
            __result = D.25363 - D.25366;
            D.25367 = __s2_len > 1;
            D.25357 = __result == 0;
            D.25368 = D.25367 & D.25357;
            if (D.25368 != 0) goto <D.25369>; else goto <D.25370>;
            <D.25369>:
            D.25371 = &MEM[(void *)"marksweep-fixed" + 2B];
            D.25372 = *D.25371;
            D.25373 = (int) D.25372;
            D.25374 = __s2 + 2;
            D.25375 = *D.25374;
            D.25376 = (int) D.25375;
            __result = D.25373 - D.25376;
            D.25377 = __s2_len > 2;
            D.25357 = __result == 0;
            D.25378 = D.25377 & D.25357;
            if (D.25378 != 0) goto <D.25379>; else goto <D.25380>;
            <D.25379>:
            D.25381 = &MEM[(void *)"marksweep-fixed" + 3B];
            D.25382 = *D.25381;
            D.25383 = (int) D.25382;
            D.25384 = __s2 + 3;
            D.25385 = *D.25384;
            D.25386 = (int) D.25385;
            __result = D.25383 - D.25386;
            <D.25380>:
            <D.25370>:
            <D.25360>:
          }
          D.21282 = __result;
        }
        iftmp.443 = -D.21282;
        goto <D.25387>;
        <D.25350>:
        iftmp.443 = __builtin_strcmp (major_collector_opt, "marksweep-fixed");
        <D.25387>:
        D.21283 = iftmp.443;
      }
      if (D.21283 == 0) goto <D.25344>; else goto <D.25345>;
      <D.25344>:
      sgen_marksweep_fixed_init (&major_collector);
      goto <D.25346>;
      <D.25345>:
      if (major_collector_opt == 0B) goto <D.25388>; else goto <D.25391>;
      <D.25391>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

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

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

          __s2 = major_collector_opt;
          D.25439 = "marksweep-fixed-par";
          D.25440 = MEM[(const unsigned char *)D.25439];
          D.25441 = (int) D.25440;
          D.25442 = *__s2;
          D.25443 = (int) D.25442;
          __result = D.25441 - D.25443;
          {
            D.25444 = __s2_len != 0;
            D.25445 = __result == 0;
            D.25446 = D.25444 & D.25445;
            if (D.25446 != 0) goto <D.25447>; else goto <D.25448>;
            <D.25447>:
            D.25449 = &MEM[(void *)"marksweep-fixed-par" + 1B];
            D.25450 = *D.25449;
            D.25451 = (int) D.25450;
            D.25452 = __s2 + 1;
            D.25453 = *D.25452;
            D.25454 = (int) D.25453;
            __result = D.25451 - D.25454;
            D.25455 = __s2_len > 1;
            D.25445 = __result == 0;
            D.25456 = D.25455 & D.25445;
            if (D.25456 != 0) goto <D.25457>; else goto <D.25458>;
            <D.25457>:
            D.25459 = &MEM[(void *)"marksweep-fixed-par" + 2B];
            D.25460 = *D.25459;
            D.25461 = (int) D.25460;
            D.25462 = __s2 + 2;
            D.25463 = *D.25462;
            D.25464 = (int) D.25463;
            __result = D.25461 - D.25464;
            D.25465 = __s2_len > 2;
            D.25445 = __result == 0;
            D.25466 = D.25465 & D.25445;
            if (D.25466 != 0) goto <D.25467>; else goto <D.25468>;
            <D.25467>:
            D.25469 = &MEM[(void *)"marksweep-fixed-par" + 3B];
            D.25470 = *D.25469;
            D.25471 = (int) D.25470;
            D.25472 = __s2 + 3;
            D.25473 = *D.25472;
            D.25474 = (int) D.25473;
            __result = D.25471 - D.25474;
            <D.25468>:
            <D.25458>:
            <D.25448>:
          }
          D.21300 = __result;
        }
        iftmp.445 = -D.21300;
        goto <D.25475>;
        <D.25438>:
        iftmp.445 = __builtin_strcmp (major_collector_opt, "marksweep-fixed-par");
        <D.25475>:
        D.21301 = iftmp.445;
      }
      if (D.21301 == 0) goto <D.25432>; else goto <D.25433>;
      <D.25432>:
      sgen_marksweep_fixed_par_init (&major_collector);
      goto <D.25434>;
      <D.25433>:
      if (major_collector_opt == 0B) goto <D.25476>; else goto <D.25479>;
      <D.25479>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.25483 = "marksweep-conc";
          D.25484 = MEM[(const unsigned char *)D.25483];
          D.25485 = (int) D.25484;
          D.25486 = *__s2;
          D.25487 = (int) D.25486;
          __result = D.25485 - D.25487;
          {
            D.25488 = __s2_len != 0;
            D.25489 = __result == 0;
            D.25490 = D.25488 & D.25489;
            if (D.25490 != 0) goto <D.25491>; else goto <D.25492>;
            <D.25491>:
            D.25493 = &MEM[(void *)"marksweep-conc" + 1B];
            D.25494 = *D.25493;
            D.25495 = (int) D.25494;
            D.25496 = __s2 + 1;
            D.25497 = *D.25496;
            D.25498 = (int) D.25497;
            __result = D.25495 - D.25498;
            D.25499 = __s2_len > 1;
            D.25489 = __result == 0;
            D.25500 = D.25499 & D.25489;
            if (D.25500 != 0) goto <D.25501>; else goto <D.25502>;
            <D.25501>:
            D.25503 = &MEM[(void *)"marksweep-conc" + 2B];
            D.25504 = *D.25503;
            D.25505 = (int) D.25504;
            D.25506 = __s2 + 2;
            D.25507 = *D.25506;
            D.25508 = (int) D.25507;
            __result = D.25505 - D.25508;
            D.25509 = __s2_len > 2;
            D.25489 = __result == 0;
            D.25510 = D.25509 & D.25489;
            if (D.25510 != 0) goto <D.25511>; else goto <D.25512>;
            <D.25511>:
            D.25513 = &MEM[(void *)"marksweep-conc" + 3B];
            D.25514 = *D.25513;
            D.25515 = (int) D.25514;
            D.25516 = __s2 + 3;
            D.25517 = *D.25516;
            D.25518 = (int) D.25517;
            __result = D.25515 - D.25518;
            <D.25512>:
            <D.25502>:
            <D.25492>:
          }
          D.21309 = __result;
        }
        iftmp.446 = -D.21309;
        goto <D.25519>;
        <D.25482>:
        iftmp.446 = __builtin_strcmp (major_collector_opt, "marksweep-conc");
        <D.25519>:
        D.21310 = iftmp.446;
      }
      if (D.21310 == 0) goto <D.25476>; else goto <D.25477>;
      <D.25476>:
      sgen_marksweep_conc_init (&major_collector);
      goto <D.25478>;
      <D.25477>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `marksweep` instead.", "Unknown major collector `%s\'.", major_collector_opt);
      goto use_marksweep_major;
      <D.25478>:
      <D.25434>:
      <D.25390>:
      <D.25346>:
      <D.25302>:
      if (have_split_nursery != 0) goto <D.25520>; else goto <D.25521>;
      <D.25520>:
      D.25522 = major_collector.is_parallel;
      if (D.25522 != 0) goto <D.25523>; else goto <D.25524>;
      <D.25523>:
      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.25524>:
      <D.25521>:
      num_workers = mono_cpu_count ();
      D.25525 = num_workers <= 0;
      D.25526 = (long int) D.25525;
      D.25527 = __builtin_expect (D.25526, 0);
      if (D.25527 != 0) goto <D.25528>; else goto <D.25529>;
      <D.25528>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4977, "num_workers > 0");
      <D.25529>:
      if (num_workers > 16) goto <D.25530>; else goto <D.25531>;
      <D.25530>:
      num_workers = 16;
      <D.25531>:
      conservative_stack_mark = 1;
      sgen_nursery_size.447 = sgen_nursery_size;
      sgen_nursery_size = sgen_nursery_size.447;
      if (opts != 0B) goto <D.25533>; else goto <D.25534>;
      <D.25533>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.25538 = "";
              D.25539 = MEM[(const unsigned char *)D.25538];
              D.25540 = (int) D.25539;
              D.25541 = *__s2;
              D.25542 = (int) D.25541;
              __result = D.25540 - D.25542;
              {
                D.25543 = __s2_len != 0;
                D.25544 = __result == 0;
                D.25545 = D.25543 & D.25544;
                if (D.25545 != 0) goto <D.25546>; else goto <D.25547>;
                <D.25546>:
                D.25548 = &MEM[(void *)"" + 1B];
                D.25549 = *D.25548;
                D.25550 = (int) D.25549;
                D.25551 = __s2 + 1;
                D.25552 = *D.25551;
                D.25553 = (int) D.25552;
                __result = D.25550 - D.25553;
                D.25554 = __s2_len > 1;
                D.25544 = __result == 0;
                D.25555 = D.25554 & D.25544;
                if (D.25555 != 0) goto <D.25556>; else goto <D.25557>;
                <D.25556>:
                D.25558 = &MEM[(void *)"" + 2B];
                D.25559 = *D.25558;
                D.25560 = (int) D.25559;
                D.25561 = __s2 + 2;
                D.25562 = *D.25561;
                D.25563 = (int) D.25562;
                __result = D.25560 - D.25563;
                D.25564 = __s2_len > 2;
                D.25544 = __result == 0;
                D.25565 = D.25564 & D.25544;
                if (D.25565 != 0) goto <D.25566>; else goto <D.25567>;
                <D.25566>:
                D.25568 = &MEM[(void *)"" + 3B];
                D.25569 = *D.25568;
                D.25570 = (int) D.25569;
                D.25571 = __s2 + 3;
                D.25572 = *D.25571;
                D.25573 = (int) D.25572;
                __result = D.25570 - D.25573;
                <D.25567>:
                <D.25557>:
                <D.25547>:
              }
              D.21320 = __result;
            }
            iftmp.448 = -D.21320;
            goto <D.25574>;
            <D.25537>:
            D.25575 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.448 = (int) D.25575;
            <D.25574>:
            D.21321 = iftmp.448;
          }
          if (D.21321 == 0) goto <D.25576>; else goto <D.25577>;
          <D.25576>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25577>:
          D.25578 = monoeg_g_str_has_prefix (opt, "major=");
          if (D.25578 != 0) goto <D.25579>; else goto <D.25580>;
          <D.25579>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25580>:
          D.25581 = monoeg_g_str_has_prefix (opt, "minor=");
          if (D.25581 != 0) goto <D.25582>; else goto <D.25583>;
          <D.25582>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25583>:
          D.25584 = monoeg_g_str_has_prefix (opt, "max-heap-size=");
          if (D.25584 != 0) goto <D.25585>; else goto <D.25586>;
          <D.25585>:
          {
            glong max_heap_candidate;

            try
              {
                max_heap_candidate = 0;
                D.25587 = __builtin_strchr (opt, 61);
                opt = D.25587 + 1;
                D.25590 = *opt;
                if (D.25590 != 0) goto <D.25591>; else goto <D.25588>;
                <D.25591>:
                D.25592 = mono_gc_parse_environment_string_extract_number (opt, &max_heap_candidate);
                if (D.25592 != 0) goto <D.25593>; else goto <D.25588>;
                <D.25593>:
                D.25594 = mono_pagesize ();
                max_heap_candidate.449 = max_heap_candidate;
                D.25596 = D.25594 + max_heap_candidate.449;
                D.25597 = D.25596 + -1;
                D.25598 = mono_pagesize ();
                D.25599 = -D.25598;
                max_heap = D.25597 & D.25599;
                max_heap_candidate.449 = max_heap_candidate;
                if (max_heap != max_heap_candidate.449) goto <D.25600>; else goto <D.25601>;
                <D.25600>:
                D.25602 = mono_pagesize ();
                sgen_env_var_error ("MONO_GC_PARAMS", "Rounding up.", "`max-heap-size` size must be a multiple of %d.", D.25602);
                <D.25601>:
                goto <D.25589>;
                <D.25588>:
                sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`max-heap-size` must be an integer.");
                <D.25589>:
                // predicted unlikely by continue predictor.
                goto <D.21322>;
              }
            finally
              {
                max_heap_candidate = {CLOBBER};
              }
          }
          <D.25586>:
          D.25603 = monoeg_g_str_has_prefix (opt, "soft-heap-limit=");
          if (D.25603 != 0) goto <D.25604>; else goto <D.25605>;
          <D.25604>:
          D.25606 = __builtin_strchr (opt, 61);
          opt = D.25606 + 1;
          D.25590 = *opt;
          if (D.25590 != 0) goto <D.25609>; else goto <D.25607>;
          <D.25609>:
          D.25610 = mono_gc_parse_environment_string_extract_number (opt, &soft_limit);
          if (D.25610 != 0) goto <D.25611>; else goto <D.25607>;
          <D.25611>:
          soft_limit.450 = soft_limit;
          if (soft_limit.450 <= 0) goto <D.25613>; else goto <D.25614>;
          <D.25613>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be positive.");
          soft_limit = 0;
          <D.25614>:
          goto <D.25608>;
          <D.25607>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be an integer.");
          <D.25608>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25605>:
          D.25615 = monoeg_g_str_has_prefix (opt, "workers=");
          if (D.25615 != 0) goto <D.25616>; else goto <D.25617>;
          <D.25616>:
          {
            long int val;
            char * endptr;

            try
              {
                D.25522 = major_collector.is_parallel;
                if (D.25522 == 0) goto <D.25618>; else goto <D.25619>;
                <D.25618>:
                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.21322>;
                <D.25619>:
                D.25620 = __builtin_strchr (opt, 61);
                opt = D.25620 + 1;
                val = strtol (opt, &endptr, 10);
                D.25590 = *opt;
                if (D.25590 == 0) goto <D.25621>; else goto <D.25623>;
                <D.25623>:
                endptr.451 = endptr;
                D.25625 = *endptr.451;
                if (D.25625 != 0) goto <D.25621>; else goto <D.25622>;
                <D.25621>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Cannot parse the `workers` option value.");
                // predicted unlikely by continue predictor.
                goto <D.21322>;
                <D.25622>:
                val.452 = (unsigned int) val;
                D.25627 = val.452 + 4294967295;
                if (D.25627 > 15) goto <D.25628>; else goto <D.25629>;
                <D.25628>:
                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.21322>;
                <D.25629>:
                num_workers = val;
                // predicted unlikely by continue predictor.
                goto <D.21322>;
              }
            finally
              {
                endptr = {CLOBBER};
              }
          }
          <D.25617>:
          D.25630 = monoeg_g_str_has_prefix (opt, "stack-mark=");
          if (D.25630 != 0) goto <D.25631>; else goto <D.25632>;
          <D.25631>:
          D.25633 = __builtin_strchr (opt, 61);
          opt = D.25633 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25637 = "precise";
              D.25638 = MEM[(const unsigned char *)D.25637];
              D.25639 = (int) D.25638;
              D.25640 = *__s2;
              D.25641 = (int) D.25640;
              __result = D.25639 - D.25641;
              {
                D.25642 = __s2_len != 0;
                D.25643 = __result == 0;
                D.25644 = D.25642 & D.25643;
                if (D.25644 != 0) goto <D.25645>; else goto <D.25646>;
                <D.25645>:
                D.25647 = &MEM[(void *)"precise" + 1B];
                D.25648 = *D.25647;
                D.25649 = (int) D.25648;
                D.25650 = __s2 + 1;
                D.25651 = *D.25650;
                D.25652 = (int) D.25651;
                __result = D.25649 - D.25652;
                D.25653 = __s2_len > 1;
                D.25643 = __result == 0;
                D.25654 = D.25653 & D.25643;
                if (D.25654 != 0) goto <D.25655>; else goto <D.25656>;
                <D.25655>:
                D.25657 = &MEM[(void *)"precise" + 2B];
                D.25658 = *D.25657;
                D.25659 = (int) D.25658;
                D.25660 = __s2 + 2;
                D.25661 = *D.25660;
                D.25662 = (int) D.25661;
                __result = D.25659 - D.25662;
                D.25663 = __s2_len > 2;
                D.25643 = __result == 0;
                D.25664 = D.25663 & D.25643;
                if (D.25664 != 0) goto <D.25665>; else goto <D.25666>;
                <D.25665>:
                D.25667 = &MEM[(void *)"precise" + 3B];
                D.25668 = *D.25667;
                D.25669 = (int) D.25668;
                D.25670 = __s2 + 3;
                D.25671 = *D.25670;
                D.25672 = (int) D.25671;
                __result = D.25669 - D.25672;
                <D.25666>:
                <D.25656>:
                <D.25646>:
              }
              D.21333 = __result;
            }
            iftmp.453 = -D.21333;
            goto <D.25673>;
            <D.25636>:
            iftmp.453 = __builtin_strcmp (opt, "precise");
            <D.25673>:
            D.21334 = iftmp.453;
          }
          if (D.21334 == 0) goto <D.25674>; else goto <D.25675>;
          <D.25674>:
          conservative_stack_mark = 0;
          goto <D.25676>;
          <D.25675>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25680 = "conservative";
              D.25681 = MEM[(const unsigned char *)D.25680];
              D.25682 = (int) D.25681;
              D.25683 = *__s2;
              D.25684 = (int) D.25683;
              __result = D.25682 - D.25684;
              {
                D.25685 = __s2_len != 0;
                D.25686 = __result == 0;
                D.25687 = D.25685 & D.25686;
                if (D.25687 != 0) goto <D.25688>; else goto <D.25689>;
                <D.25688>:
                D.25690 = &MEM[(void *)"conservative" + 1B];
                D.25691 = *D.25690;
                D.25692 = (int) D.25691;
                D.25693 = __s2 + 1;
                D.25694 = *D.25693;
                D.25695 = (int) D.25694;
                __result = D.25692 - D.25695;
                D.25696 = __s2_len > 1;
                D.25686 = __result == 0;
                D.25697 = D.25696 & D.25686;
                if (D.25697 != 0) goto <D.25698>; else goto <D.25699>;
                <D.25698>:
                D.25700 = &MEM[(void *)"conservative" + 2B];
                D.25701 = *D.25700;
                D.25702 = (int) D.25701;
                D.25703 = __s2 + 2;
                D.25704 = *D.25703;
                D.25705 = (int) D.25704;
                __result = D.25702 - D.25705;
                D.25706 = __s2_len > 2;
                D.25686 = __result == 0;
                D.25707 = D.25706 & D.25686;
                if (D.25707 != 0) goto <D.25708>; else goto <D.25709>;
                <D.25708>:
                D.25710 = &MEM[(void *)"conservative" + 3B];
                D.25711 = *D.25710;
                D.25712 = (int) D.25711;
                D.25713 = __s2 + 3;
                D.25714 = *D.25713;
                D.25715 = (int) D.25714;
                __result = D.25712 - D.25715;
                <D.25709>:
                <D.25699>:
                <D.25689>:
              }
              D.21342 = __result;
            }
            iftmp.454 = -D.21342;
            goto <D.25716>;
            <D.25679>:
            iftmp.454 = __builtin_strcmp (opt, "conservative");
            <D.25716>:
            D.21343 = iftmp.454;
          }
          if (D.21343 == 0) goto <D.25717>; else goto <D.25718>;
          <D.25717>:
          conservative_stack_mark = 1;
          goto <D.25719>;
          <D.25718>:
          conservative_stack_mark.456 = conservative_stack_mark;
          if (conservative_stack_mark.456 != 0) goto <D.25722>; else goto <D.25723>;
          <D.25722>:
          iftmp.455 = "Using `conservative`.";
          goto <D.25724>;
          <D.25723>:
          iftmp.455 = "Using `precise`.";
          <D.25724>:
          sgen_env_var_error ("MONO_GC_PARAMS", iftmp.455, "Invalid value `%s` for `stack-mark` option, possible values are: `precise`, `conservative`.", opt);
          <D.25719>:
          <D.25676>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25632>:
          D.25725 = monoeg_g_str_has_prefix (opt, "bridge=");
          if (D.25725 != 0) goto <D.25726>; else goto <D.25727>;
          <D.25726>:
          D.25728 = __builtin_strchr (opt, 61);
          opt = D.25728 + 1;
          D.25729 = monoeg_strdup (opt);
          sgen_register_test_bridge_callbacks (D.25729);
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25727>:
          D.25730 = monoeg_g_str_has_prefix (opt, "nursery-size=");
          if (D.25730 != 0) goto <D.25731>; else goto <D.25732>;
          <D.25731>:
          {
            long int val;

            try
              {
                D.25733 = __builtin_strchr (opt, 61);
                opt = D.25733 + 1;
                D.25590 = *opt;
                if (D.25590 != 0) goto <D.25736>; else goto <D.25734>;
                <D.25736>:
                D.25737 = mono_gc_parse_environment_string_extract_number (opt, &val);
                if (D.25737 != 0) goto <D.25738>; else goto <D.25734>;
                <D.25738>:
                val.457 = val;
                D.25740 = val.457 + -1;
                val.457 = val;
                D.25741 = D.25740 & val.457;
                if (D.25741 != 0) goto <D.25742>; else goto <D.25743>;
                <D.25742>:
                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.21322>;
                <D.25743>:
                val.457 = val;
                if (val.457 <= 511) goto <D.25744>; else goto <D.25745>;
                <D.25744>:
                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.21322>;
                <D.25745>:
                val.457 = val;
                sgen_nursery_size = val.457;
                sgen_nursery_bits = 0;
                goto <D.21346>;
                <D.21345>:
                <D.21346>:
                sgen_nursery_bits.458 = sgen_nursery_bits;
                sgen_nursery_bits.459 = sgen_nursery_bits.458 + 1;
                sgen_nursery_bits = sgen_nursery_bits.459;
                sgen_nursery_bits.458 = sgen_nursery_bits;
                D.25748 = 1 << sgen_nursery_bits.458;
                sgen_nursery_size.447 = sgen_nursery_size;
                if (D.25748 != sgen_nursery_size.447) goto <D.21345>; else goto <D.21347>;
                <D.21347>:
                goto <D.25735>;
                <D.25734>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be an integer.");
                // predicted unlikely by continue predictor.
                goto <D.21322>;
                <D.25735>:
                // predicted unlikely by continue predictor.
                goto <D.21322>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.25732>:
          D.25749 = monoeg_g_str_has_prefix (opt, "save-target-ratio=");
          if (D.25749 != 0) goto <D.25750>; else goto <D.25751>;
          <D.25750>:
          {
            double val;

            try
              {
                D.25752 = __builtin_strchr (opt, 61);
                opt = D.25752 + 1;
                D.25753 = parse_double_in_interval ("MONO_GC_PARAMS", "save-target-ratio", opt, 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0, &val);
                if (D.25753 != 0) goto <D.25754>; else goto <D.25755>;
                <D.25754>:
                save_target = val;
                <D.25755>:
                // predicted unlikely by continue predictor.
                goto <D.21322>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.25751>:
          D.25756 = monoeg_g_str_has_prefix (opt, "default-allowance-ratio=");
          if (D.25756 != 0) goto <D.25757>; else goto <D.25758>;
          <D.25757>:
          {
            double val;

            try
              {
                D.25759 = __builtin_strchr (opt, 61);
                opt = D.25759 + 1;
                D.25760 = parse_double_in_interval ("MONO_GC_PARAMS", "default-allowance-ratio", opt, 1.0e+0, 1.0e+0, &val);
                if (D.25760 != 0) goto <D.25761>; else goto <D.25762>;
                <D.25761>:
                allowance_ratio = val;
                <D.25762>:
                // predicted unlikely by continue predictor.
                goto <D.21322>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.25758>:
          D.25763 = monoeg_g_str_has_prefix (opt, "allow-synchronous-major=");
          if (D.25763 != 0) goto <D.25764>; else goto <D.25765>;
          <D.25764>:
          D.25766 = major_collector.is_concurrent;
          if (D.25766 == 0) goto <D.25767>; else goto <D.25768>;
          <D.25767>:
          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.21322>;
          <D.25768>:
          D.25769 = __builtin_strchr (opt, 61);
          opt = D.25769 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25773 = "yes";
              D.25774 = MEM[(const unsigned char *)D.25773];
              D.25775 = (int) D.25774;
              D.25776 = *__s2;
              D.25777 = (int) D.25776;
              __result = D.25775 - D.25777;
              {
                D.25778 = __s2_len != 0;
                D.25779 = __result == 0;
                D.25780 = D.25778 & D.25779;
                if (D.25780 != 0) goto <D.25781>; else goto <D.25782>;
                <D.25781>:
                D.25783 = &MEM[(void *)"yes" + 1B];
                D.25784 = *D.25783;
                D.25785 = (int) D.25784;
                D.25786 = __s2 + 1;
                D.25787 = *D.25786;
                D.25788 = (int) D.25787;
                __result = D.25785 - D.25788;
                D.25789 = __s2_len > 1;
                D.25779 = __result == 0;
                D.25790 = D.25789 & D.25779;
                if (D.25790 != 0) goto <D.25791>; else goto <D.25792>;
                <D.25791>:
                D.25793 = &MEM[(void *)"yes" + 2B];
                D.25794 = *D.25793;
                D.25795 = (int) D.25794;
                D.25796 = __s2 + 2;
                D.25797 = *D.25796;
                D.25798 = (int) D.25797;
                __result = D.25795 - D.25798;
                D.25799 = __s2_len > 2;
                D.25779 = __result == 0;
                D.25800 = D.25799 & D.25779;
                if (D.25800 != 0) goto <D.25801>; else goto <D.25802>;
                <D.25801>:
                D.25803 = &MEM[(void *)"yes" + 3B];
                D.25804 = *D.25803;
                D.25805 = (int) D.25804;
                D.25806 = __s2 + 3;
                D.25807 = *D.25806;
                D.25808 = (int) D.25807;
                __result = D.25805 - D.25808;
                <D.25802>:
                <D.25792>:
                <D.25782>:
              }
              D.21357 = __result;
            }
            iftmp.460 = -D.21357;
            goto <D.25809>;
            <D.25772>:
            iftmp.460 = __builtin_strcmp (opt, "yes");
            <D.25809>:
            D.21358 = iftmp.460;
          }
          if (D.21358 == 0) goto <D.25810>; else goto <D.25811>;
          <D.25810>:
          allow_synchronous_major = 1;
          goto <D.25812>;
          <D.25811>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25816 = "no";
              D.25817 = MEM[(const unsigned char *)D.25816];
              D.25818 = (int) D.25817;
              D.25819 = *__s2;
              D.25820 = (int) D.25819;
              __result = D.25818 - D.25820;
              {
                D.25821 = __s2_len != 0;
                D.25822 = __result == 0;
                D.25823 = D.25821 & D.25822;
                if (D.25823 != 0) goto <D.25824>; else goto <D.25825>;
                <D.25824>:
                D.25826 = &MEM[(void *)"no" + 1B];
                D.25827 = *D.25826;
                D.25828 = (int) D.25827;
                D.25829 = __s2 + 1;
                D.25830 = *D.25829;
                D.25831 = (int) D.25830;
                __result = D.25828 - D.25831;
                D.25832 = __s2_len > 1;
                D.25822 = __result == 0;
                D.25833 = D.25832 & D.25822;
                if (D.25833 != 0) goto <D.25834>; else goto <D.25835>;
                <D.25834>:
                D.25836 = &MEM[(void *)"no" + 2B];
                D.25837 = *D.25836;
                D.25838 = (int) D.25837;
                D.25839 = __s2 + 2;
                D.25840 = *D.25839;
                D.25841 = (int) D.25840;
                __result = D.25838 - D.25841;
                D.25842 = __s2_len > 2;
                D.25822 = __result == 0;
                D.25843 = D.25842 & D.25822;
                if (D.25843 != 0) goto <D.25844>; else goto <D.25845>;
                <D.25844>:
                D.25846 = &MEM[(void *)"no" + 3B];
                D.25847 = *D.25846;
                D.25848 = (int) D.25847;
                D.25849 = __s2 + 3;
                D.25850 = *D.25849;
                D.25851 = (int) D.25850;
                __result = D.25848 - D.25851;
                <D.25845>:
                <D.25835>:
                <D.25825>:
              }
              D.21366 = __result;
            }
            iftmp.461 = -D.21366;
            goto <D.25852>;
            <D.25815>:
            iftmp.461 = __builtin_strcmp (opt, "no");
            <D.25852>:
            D.21367 = iftmp.461;
          }
          if (D.21367 == 0) goto <D.25853>; else goto <D.25854>;
          <D.25853>:
          allow_synchronous_major = 0;
          goto <D.25855>;
          <D.25854>:
          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.21322>;
          <D.25855>:
          <D.25812>:
          <D.25765>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25859 = "cementing";
              D.25860 = MEM[(const unsigned char *)D.25859];
              D.25861 = (int) D.25860;
              D.25862 = *__s2;
              D.25863 = (int) D.25862;
              __result = D.25861 - D.25863;
              {
                D.25864 = __s2_len != 0;
                D.25865 = __result == 0;
                D.25866 = D.25864 & D.25865;
                if (D.25866 != 0) goto <D.25867>; else goto <D.25868>;
                <D.25867>:
                D.25869 = &MEM[(void *)"cementing" + 1B];
                D.25870 = *D.25869;
                D.25871 = (int) D.25870;
                D.25872 = __s2 + 1;
                D.25873 = *D.25872;
                D.25874 = (int) D.25873;
                __result = D.25871 - D.25874;
                D.25875 = __s2_len > 1;
                D.25865 = __result == 0;
                D.25876 = D.25875 & D.25865;
                if (D.25876 != 0) goto <D.25877>; else goto <D.25878>;
                <D.25877>:
                D.25879 = &MEM[(void *)"cementing" + 2B];
                D.25880 = *D.25879;
                D.25881 = (int) D.25880;
                D.25882 = __s2 + 2;
                D.25883 = *D.25882;
                D.25884 = (int) D.25883;
                __result = D.25881 - D.25884;
                D.25885 = __s2_len > 2;
                D.25865 = __result == 0;
                D.25886 = D.25885 & D.25865;
                if (D.25886 != 0) goto <D.25887>; else goto <D.25888>;
                <D.25887>:
                D.25889 = &MEM[(void *)"cementing" + 3B];
                D.25890 = *D.25889;
                D.25891 = (int) D.25890;
                D.25892 = __s2 + 3;
                D.25893 = *D.25892;
                D.25894 = (int) D.25893;
                __result = D.25891 - D.25894;
                <D.25888>:
                <D.25878>:
                <D.25868>:
              }
              D.21375 = __result;
            }
            iftmp.462 = -D.21375;
            goto <D.25895>;
            <D.25858>:
            iftmp.462 = __builtin_strcmp (opt, "cementing");
            <D.25895>:
            D.21376 = iftmp.462;
          }
          if (D.21376 == 0) goto <D.25896>; else goto <D.25897>;
          <D.25896>:
          D.25522 = major_collector.is_parallel;
          if (D.25522 != 0) goto <D.25898>; else goto <D.25899>;
          <D.25898>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "`cementing` is not supported for the parallel major collector.");
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25899>:
          cement_enabled = 1;
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25897>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.25903 = "no-cementing";
              D.25904 = MEM[(const unsigned char *)D.25903];
              D.25905 = (int) D.25904;
              D.25906 = *__s2;
              D.25907 = (int) D.25906;
              __result = D.25905 - D.25907;
              {
                D.25908 = __s2_len != 0;
                D.25909 = __result == 0;
                D.25910 = D.25908 & D.25909;
                if (D.25910 != 0) goto <D.25911>; else goto <D.25912>;
                <D.25911>:
                D.25913 = &MEM[(void *)"no-cementing" + 1B];
                D.25914 = *D.25913;
                D.25915 = (int) D.25914;
                D.25916 = __s2 + 1;
                D.25917 = *D.25916;
                D.25918 = (int) D.25917;
                __result = D.25915 - D.25918;
                D.25919 = __s2_len > 1;
                D.25909 = __result == 0;
                D.25920 = D.25919 & D.25909;
                if (D.25920 != 0) goto <D.25921>; else goto <D.25922>;
                <D.25921>:
                D.25923 = &MEM[(void *)"no-cementing" + 2B];
                D.25924 = *D.25923;
                D.25925 = (int) D.25924;
                D.25926 = __s2 + 2;
                D.25927 = *D.25926;
                D.25928 = (int) D.25927;
                __result = D.25925 - D.25928;
                D.25929 = __s2_len > 2;
                D.25909 = __result == 0;
                D.25930 = D.25929 & D.25909;
                if (D.25930 != 0) goto <D.25931>; else goto <D.25932>;
                <D.25931>:
                D.25933 = &MEM[(void *)"no-cementing" + 3B];
                D.25934 = *D.25933;
                D.25935 = (int) D.25934;
                D.25936 = __s2 + 3;
                D.25937 = *D.25936;
                D.25938 = (int) D.25937;
                __result = D.25935 - D.25938;
                <D.25932>:
                <D.25922>:
                <D.25912>:
              }
              D.21384 = __result;
            }
            iftmp.463 = -D.21384;
            goto <D.25939>;
            <D.25902>:
            iftmp.463 = __builtin_strcmp (opt, "no-cementing");
            <D.25939>:
            D.21385 = iftmp.463;
          }
          if (D.21385 == 0) goto <D.25940>; else goto <D.25941>;
          <D.25940>:
          cement_enabled = 0;
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25941>:
          D.25942 = major_collector.handle_gc_param;
          if (D.25942 != 0B) goto <D.25943>; else goto <D.25944>;
          <D.25943>:
          D.25942 = major_collector.handle_gc_param;
          D.25945 = D.25942 (opt);
          if (D.25945 != 0) goto <D.25946>; else goto <D.25947>;
          <D.25946>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25947>:
          <D.25944>:
          D.25948 = sgen_minor_collector.handle_gc_param;
          if (D.25948 != 0B) goto <D.25949>; else goto <D.25950>;
          <D.25949>:
          D.25948 = sgen_minor_collector.handle_gc_param;
          D.25951 = D.25948 (opt);
          if (D.25951 != 0) goto <D.25952>; else goto <D.25953>;
          <D.25952>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25953>:
          <D.25950>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.25954>; else goto <D.25955>;
          <D.25954>:
          // predicted unlikely by continue predictor.
          goto <D.21322>;
          <D.25955>:
          stderr.439 = stderr;
          fprintf (stderr.439, "\n%s must be a comma-delimited list of one or more of the following:\n", "MONO_GC_PARAMS");
          stderr.439 = stderr;
          fprintf (stderr.439, "  max-heap-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  soft-heap-limit=n (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  nursery-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  major=COLLECTOR (where COLLECTOR is `marksweep\', `marksweep-conc\', `marksweep-par\', \'marksweep-fixed\' or \'marksweep-fixed-par\')\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  minor=COLLECTOR (where COLLECTOR is `simple\' or `split\')\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  wbarrier=WBARRIER (where WBARRIER is `remset\' or `cardtable\')\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  stack-mark=MARK-METHOD (where MARK-METHOD is \'precise\' or \'conservative\')\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  [no-]cementing\n");
          D.25766 = major_collector.is_concurrent;
          if (D.25766 != 0) goto <D.25956>; else goto <D.25957>;
          <D.25956>:
          stderr.439 = stderr;
          fprintf (stderr.439, "  allow-synchronous-major=FLAG (where FLAG is `yes\' or `no\')\n");
          <D.25957>:
          D.25958 = major_collector.print_gc_param_usage;
          if (D.25958 != 0B) goto <D.25959>; else goto <D.25960>;
          <D.25959>:
          D.25958 = major_collector.print_gc_param_usage;
          D.25958 ();
          <D.25960>:
          D.25961 = sgen_minor_collector.print_gc_param_usage;
          if (D.25961 != 0B) goto <D.25962>; else goto <D.25963>;
          <D.25962>:
          D.25961 = sgen_minor_collector.print_gc_param_usage;
          D.25961 ();
          <D.25963>:
          stderr.439 = stderr;
          fprintf (stderr.439, " Experimental options:\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  save-target-ratio=R (where R must be between %.2f - %.2f).\n", 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0);
          stderr.439 = stderr;
          fprintf (stderr.439, "  default-allowance-ratio=R (where R must be between %.2f - %.2f).\n", 1.0e+0, 1.0e+1);
          stderr.439 = stderr;
          fprintf (stderr.439, "\n");
          usage_printed = 1;
        }
        <D.21322>:
        ptr = ptr + 4;
        <D.21387>:
        D.25209 = *ptr;
        if (D.25209 != 0B) goto <D.21386>; else goto <D.21388>;
        <D.21388>:
        monoeg_g_strfreev (opts);
      }
      <D.25534>:
      D.25522 = major_collector.is_parallel;
      if (D.25522 != 0) goto <D.25964>; else goto <D.25965>;
      <D.25964>:
      cement_enabled = 0;
      sgen_workers_init (num_workers);
      goto <D.25966>;
      <D.25965>:
      D.25766 = major_collector.is_concurrent;
      if (D.25766 != 0) goto <D.25967>; else goto <D.25968>;
      <D.25967>:
      sgen_workers_init (1);
      <D.25968>:
      <D.25966>:
      if (major_collector_opt != 0B) goto <D.25969>; else goto <D.25970>;
      <D.25969>:
      monoeg_g_free (major_collector_opt);
      <D.25970>:
      if (minor_collector_opt != 0B) goto <D.25971>; else goto <D.25972>;
      <D.25971>:
      monoeg_g_free (minor_collector_opt);
      <D.25972>:
      alloc_nursery ();
      sgen_cement_init (cement_enabled);
      env = monoeg_g_getenv ("MONO_GC_DEBUG");
      if (env != 0B) goto <D.25973>; else goto <D.25974>;
      <D.25973>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.25538 = "";
              D.25539 = MEM[(const unsigned char *)D.25538];
              D.25540 = (int) D.25539;
              D.25978 = *__s2;
              D.25979 = (int) D.25978;
              __result = D.25540 - D.25979;
              {
                D.25980 = __s2_len != 0;
                D.25981 = __result == 0;
                D.25982 = D.25980 & D.25981;
                if (D.25982 != 0) goto <D.25983>; else goto <D.25984>;
                <D.25983>:
                D.25548 = &MEM[(void *)"" + 1B];
                D.25549 = *D.25548;
                D.25550 = (int) D.25549;
                D.25985 = __s2 + 1;
                D.25986 = *D.25985;
                D.25987 = (int) D.25986;
                __result = D.25550 - D.25987;
                D.25988 = __s2_len > 1;
                D.25981 = __result == 0;
                D.25989 = D.25988 & D.25981;
                if (D.25989 != 0) goto <D.25990>; else goto <D.25991>;
                <D.25990>:
                D.25558 = &MEM[(void *)"" + 2B];
                D.25559 = *D.25558;
                D.25560 = (int) D.25559;
                D.25992 = __s2 + 2;
                D.25993 = *D.25992;
                D.25994 = (int) D.25993;
                __result = D.25560 - D.25994;
                D.25995 = __s2_len > 2;
                D.25981 = __result == 0;
                D.25996 = D.25995 & D.25981;
                if (D.25996 != 0) goto <D.25997>; else goto <D.25998>;
                <D.25997>:
                D.25568 = &MEM[(void *)"" + 3B];
                D.25569 = *D.25568;
                D.25570 = (int) D.25569;
                D.25999 = __s2 + 3;
                D.26000 = *D.25999;
                D.26001 = (int) D.26000;
                __result = D.25570 - D.26001;
                <D.25998>:
                <D.25991>:
                <D.25984>:
              }
              D.21398 = __result;
            }
            iftmp.464 = -D.21398;
            goto <D.26002>;
            <D.25977>:
            D.26003 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.464 = (int) D.26003;
            <D.26002>:
            D.21399 = iftmp.464;
          }
          if (D.21399 == 0) goto <D.26004>; else goto <D.26005>;
          <D.26004>:
          // predicted unlikely by continue predictor.
          goto <D.21400>;
          <D.26005>:
          D.26006 = *opt;
          D.26007 = (unsigned char) D.26006;
          D.26008 = D.26007 + 208;
          if (D.26008 <= 9) goto <D.26009>; else goto <D.26010>;
          <D.26009>:
          gc_debug_level.465 = atoi (opt);
          gc_debug_level = gc_debug_level.465;
          opt = opt + 1;
          D.26006 = *opt;
          if (D.26006 == 58) goto <D.26012>; else goto <D.26013>;
          <D.26012>:
          opt = opt + 1;
          <D.26013>:
          D.26006 = *opt;
          if (D.26006 != 0) goto <D.26014>; else goto <D.26015>;
          <D.26014>:
          {
            char * rf;

            D.26016 = getpid ();
            rf = monoeg_g_strdup_printf ("%s.%d", opt, D.26016);
            gc_debug_file.466 = fopen (rf, "wb");
            gc_debug_file = gc_debug_file.466;
            gc_debug_file.467 = gc_debug_file;
            if (gc_debug_file.467 == 0B) goto <D.26019>; else goto <D.26020>;
            <D.26019>:
            stderr.439 = stderr;
            gc_debug_file = stderr.439;
            <D.26020>:
            monoeg_g_free (rf);
          }
          <D.26015>:
          goto <D.26021>;
          <D.26010>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26025 = "print-allowance";
              D.26026 = MEM[(const unsigned char *)D.26025];
              D.26027 = (int) D.26026;
              D.26028 = *__s2;
              D.26029 = (int) D.26028;
              __result = D.26027 - D.26029;
              {
                D.26030 = __s2_len != 0;
                D.26031 = __result == 0;
                D.26032 = D.26030 & D.26031;
                if (D.26032 != 0) goto <D.26033>; else goto <D.26034>;
                <D.26033>:
                D.26035 = &MEM[(void *)"print-allowance" + 1B];
                D.26036 = *D.26035;
                D.26037 = (int) D.26036;
                D.26038 = __s2 + 1;
                D.26039 = *D.26038;
                D.26040 = (int) D.26039;
                __result = D.26037 - D.26040;
                D.26041 = __s2_len > 1;
                D.26031 = __result == 0;
                D.26042 = D.26041 & D.26031;
                if (D.26042 != 0) goto <D.26043>; else goto <D.26044>;
                <D.26043>:
                D.26045 = &MEM[(void *)"print-allowance" + 2B];
                D.26046 = *D.26045;
                D.26047 = (int) D.26046;
                D.26048 = __s2 + 2;
                D.26049 = *D.26048;
                D.26050 = (int) D.26049;
                __result = D.26047 - D.26050;
                D.26051 = __s2_len > 2;
                D.26031 = __result == 0;
                D.26052 = D.26051 & D.26031;
                if (D.26052 != 0) goto <D.26053>; else goto <D.26054>;
                <D.26053>:
                D.26055 = &MEM[(void *)"print-allowance" + 3B];
                D.26056 = *D.26055;
                D.26057 = (int) D.26056;
                D.26058 = __s2 + 3;
                D.26059 = *D.26058;
                D.26060 = (int) D.26059;
                __result = D.26057 - D.26060;
                <D.26054>:
                <D.26044>:
                <D.26034>:
              }
              D.21409 = __result;
            }
            iftmp.468 = -D.21409;
            goto <D.26061>;
            <D.26024>:
            iftmp.468 = __builtin_strcmp (opt, "print-allowance");
            <D.26061>:
            D.21410 = iftmp.468;
          }
          if (D.21410 == 0) goto <D.26062>; else goto <D.26063>;
          <D.26062>:
          debug_print_allowance = 1;
          goto <D.26064>;
          <D.26063>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26068 = "print-pinning";
              D.26069 = MEM[(const unsigned char *)D.26068];
              D.26070 = (int) D.26069;
              D.26071 = *__s2;
              D.26072 = (int) D.26071;
              __result = D.26070 - D.26072;
              {
                D.26073 = __s2_len != 0;
                D.26074 = __result == 0;
                D.26075 = D.26073 & D.26074;
                if (D.26075 != 0) goto <D.26076>; else goto <D.26077>;
                <D.26076>:
                D.26078 = &MEM[(void *)"print-pinning" + 1B];
                D.26079 = *D.26078;
                D.26080 = (int) D.26079;
                D.26081 = __s2 + 1;
                D.26082 = *D.26081;
                D.26083 = (int) D.26082;
                __result = D.26080 - D.26083;
                D.26084 = __s2_len > 1;
                D.26074 = __result == 0;
                D.26085 = D.26084 & D.26074;
                if (D.26085 != 0) goto <D.26086>; else goto <D.26087>;
                <D.26086>:
                D.26088 = &MEM[(void *)"print-pinning" + 2B];
                D.26089 = *D.26088;
                D.26090 = (int) D.26089;
                D.26091 = __s2 + 2;
                D.26092 = *D.26091;
                D.26093 = (int) D.26092;
                __result = D.26090 - D.26093;
                D.26094 = __s2_len > 2;
                D.26074 = __result == 0;
                D.26095 = D.26094 & D.26074;
                if (D.26095 != 0) goto <D.26096>; else goto <D.26097>;
                <D.26096>:
                D.26098 = &MEM[(void *)"print-pinning" + 3B];
                D.26099 = *D.26098;
                D.26100 = (int) D.26099;
                D.26101 = __s2 + 3;
                D.26102 = *D.26101;
                D.26103 = (int) D.26102;
                __result = D.26100 - D.26103;
                <D.26097>:
                <D.26087>:
                <D.26077>:
              }
              D.21418 = __result;
            }
            iftmp.469 = -D.21418;
            goto <D.26104>;
            <D.26067>:
            iftmp.469 = __builtin_strcmp (opt, "print-pinning");
            <D.26104>:
            D.21419 = iftmp.469;
          }
          if (D.21419 == 0) goto <D.26105>; else goto <D.26106>;
          <D.26105>:
          do_pin_stats = 1;
          goto <D.26107>;
          <D.26106>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26111 = "verify-before-allocs";
              D.26112 = MEM[(const unsigned char *)D.26111];
              D.26113 = (int) D.26112;
              D.26114 = *__s2;
              D.26115 = (int) D.26114;
              __result = D.26113 - D.26115;
              {
                D.26116 = __s2_len != 0;
                D.26117 = __result == 0;
                D.26118 = D.26116 & D.26117;
                if (D.26118 != 0) goto <D.26119>; else goto <D.26120>;
                <D.26119>:
                D.26121 = &MEM[(void *)"verify-before-allocs" + 1B];
                D.26122 = *D.26121;
                D.26123 = (int) D.26122;
                D.26124 = __s2 + 1;
                D.26125 = *D.26124;
                D.26126 = (int) D.26125;
                __result = D.26123 - D.26126;
                D.26127 = __s2_len > 1;
                D.26117 = __result == 0;
                D.26128 = D.26127 & D.26117;
                if (D.26128 != 0) goto <D.26129>; else goto <D.26130>;
                <D.26129>:
                D.26131 = &MEM[(void *)"verify-before-allocs" + 2B];
                D.26132 = *D.26131;
                D.26133 = (int) D.26132;
                D.26134 = __s2 + 2;
                D.26135 = *D.26134;
                D.26136 = (int) D.26135;
                __result = D.26133 - D.26136;
                D.26137 = __s2_len > 2;
                D.26117 = __result == 0;
                D.26138 = D.26137 & D.26117;
                if (D.26138 != 0) goto <D.26139>; else goto <D.26140>;
                <D.26139>:
                D.26141 = &MEM[(void *)"verify-before-allocs" + 3B];
                D.26142 = *D.26141;
                D.26143 = (int) D.26142;
                D.26144 = __s2 + 3;
                D.26145 = *D.26144;
                D.26146 = (int) D.26145;
                __result = D.26143 - D.26146;
                <D.26140>:
                <D.26130>:
                <D.26120>:
              }
              D.21427 = __result;
            }
            iftmp.470 = -D.21427;
            goto <D.26147>;
            <D.26110>:
            iftmp.470 = __builtin_strcmp (opt, "verify-before-allocs");
            <D.26147>:
            D.21428 = iftmp.470;
          }
          if (D.21428 == 0) goto <D.26148>; else goto <D.26149>;
          <D.26148>:
          verify_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.26150>;
          <D.26149>:
          D.26151 = monoeg_g_str_has_prefix (opt, "verify-before-allocs=");
          if (D.26151 != 0) goto <D.26152>; else goto <D.26153>;
          <D.26152>:
          {
            char * arg;

            D.26154 = __builtin_strchr (opt, 61);
            arg = D.26154 + 1;
            D.26155 = atoi (arg);
            verify_before_allocs.471 = (unsigned int) D.26155;
            verify_before_allocs = verify_before_allocs.471;
            has_per_allocation_action = 1;
          }
          goto <D.26157>;
          <D.26153>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26161 = "collect-before-allocs";
              D.26162 = MEM[(const unsigned char *)D.26161];
              D.26163 = (int) D.26162;
              D.26164 = *__s2;
              D.26165 = (int) D.26164;
              __result = D.26163 - D.26165;
              {
                D.26166 = __s2_len != 0;
                D.26167 = __result == 0;
                D.26168 = D.26166 & D.26167;
                if (D.26168 != 0) goto <D.26169>; else goto <D.26170>;
                <D.26169>:
                D.26171 = &MEM[(void *)"collect-before-allocs" + 1B];
                D.26172 = *D.26171;
                D.26173 = (int) D.26172;
                D.26174 = __s2 + 1;
                D.26175 = *D.26174;
                D.26176 = (int) D.26175;
                __result = D.26173 - D.26176;
                D.26177 = __s2_len > 1;
                D.26167 = __result == 0;
                D.26178 = D.26177 & D.26167;
                if (D.26178 != 0) goto <D.26179>; else goto <D.26180>;
                <D.26179>:
                D.26181 = &MEM[(void *)"collect-before-allocs" + 2B];
                D.26182 = *D.26181;
                D.26183 = (int) D.26182;
                D.26184 = __s2 + 2;
                D.26185 = *D.26184;
                D.26186 = (int) D.26185;
                __result = D.26183 - D.26186;
                D.26187 = __s2_len > 2;
                D.26167 = __result == 0;
                D.26188 = D.26187 & D.26167;
                if (D.26188 != 0) goto <D.26189>; else goto <D.26190>;
                <D.26189>:
                D.26191 = &MEM[(void *)"collect-before-allocs" + 3B];
                D.26192 = *D.26191;
                D.26193 = (int) D.26192;
                D.26194 = __s2 + 3;
                D.26195 = *D.26194;
                D.26196 = (int) D.26195;
                __result = D.26193 - D.26196;
                <D.26190>:
                <D.26180>:
                <D.26170>:
              }
              D.21437 = __result;
            }
            iftmp.472 = -D.21437;
            goto <D.26197>;
            <D.26160>:
            iftmp.472 = __builtin_strcmp (opt, "collect-before-allocs");
            <D.26197>:
            D.21438 = iftmp.472;
          }
          if (D.21438 == 0) goto <D.26198>; else goto <D.26199>;
          <D.26198>:
          collect_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.26200>;
          <D.26199>:
          D.26201 = monoeg_g_str_has_prefix (opt, "collect-before-allocs=");
          if (D.26201 != 0) goto <D.26202>; else goto <D.26203>;
          <D.26202>:
          {
            char * arg;

            D.26204 = __builtin_strchr (opt, 61);
            arg = D.26204 + 1;
            has_per_allocation_action = 1;
            D.26205 = atoi (arg);
            collect_before_allocs.473 = (unsigned int) D.26205;
            collect_before_allocs = collect_before_allocs.473;
          }
          goto <D.26207>;
          <D.26203>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26211 = "verify-before-collections";
              D.26212 = MEM[(const unsigned char *)D.26211];
              D.26213 = (int) D.26212;
              D.26214 = *__s2;
              D.26215 = (int) D.26214;
              __result = D.26213 - D.26215;
              {
                D.26216 = __s2_len != 0;
                D.26217 = __result == 0;
                D.26218 = D.26216 & D.26217;
                if (D.26218 != 0) goto <D.26219>; else goto <D.26220>;
                <D.26219>:
                D.26221 = &MEM[(void *)"verify-before-collections" + 1B];
                D.26222 = *D.26221;
                D.26223 = (int) D.26222;
                D.26224 = __s2 + 1;
                D.26225 = *D.26224;
                D.26226 = (int) D.26225;
                __result = D.26223 - D.26226;
                D.26227 = __s2_len > 1;
                D.26217 = __result == 0;
                D.26228 = D.26227 & D.26217;
                if (D.26228 != 0) goto <D.26229>; else goto <D.26230>;
                <D.26229>:
                D.26231 = &MEM[(void *)"verify-before-collections" + 2B];
                D.26232 = *D.26231;
                D.26233 = (int) D.26232;
                D.26234 = __s2 + 2;
                D.26235 = *D.26234;
                D.26236 = (int) D.26235;
                __result = D.26233 - D.26236;
                D.26237 = __s2_len > 2;
                D.26217 = __result == 0;
                D.26238 = D.26237 & D.26217;
                if (D.26238 != 0) goto <D.26239>; else goto <D.26240>;
                <D.26239>:
                D.26241 = &MEM[(void *)"verify-before-collections" + 3B];
                D.26242 = *D.26241;
                D.26243 = (int) D.26242;
                D.26244 = __s2 + 3;
                D.26245 = *D.26244;
                D.26246 = (int) D.26245;
                __result = D.26243 - D.26246;
                <D.26240>:
                <D.26230>:
                <D.26220>:
              }
              D.21447 = __result;
            }
            iftmp.474 = -D.21447;
            goto <D.26247>;
            <D.26210>:
            iftmp.474 = __builtin_strcmp (opt, "verify-before-collections");
            <D.26247>:
            D.21448 = iftmp.474;
          }
          if (D.21448 == 0) goto <D.26248>; else goto <D.26249>;
          <D.26248>:
          whole_heap_check_before_collection = 1;
          goto <D.26250>;
          <D.26249>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26254 = "check-at-minor-collections";
              D.26255 = MEM[(const unsigned char *)D.26254];
              D.26256 = (int) D.26255;
              D.26257 = *__s2;
              D.26258 = (int) D.26257;
              __result = D.26256 - D.26258;
              {
                D.26259 = __s2_len != 0;
                D.26260 = __result == 0;
                D.26261 = D.26259 & D.26260;
                if (D.26261 != 0) goto <D.26262>; else goto <D.26263>;
                <D.26262>:
                D.26264 = &MEM[(void *)"check-at-minor-collections" + 1B];
                D.26265 = *D.26264;
                D.26266 = (int) D.26265;
                D.26267 = __s2 + 1;
                D.26268 = *D.26267;
                D.26269 = (int) D.26268;
                __result = D.26266 - D.26269;
                D.26270 = __s2_len > 1;
                D.26260 = __result == 0;
                D.26271 = D.26270 & D.26260;
                if (D.26271 != 0) goto <D.26272>; else goto <D.26273>;
                <D.26272>:
                D.26274 = &MEM[(void *)"check-at-minor-collections" + 2B];
                D.26275 = *D.26274;
                D.26276 = (int) D.26275;
                D.26277 = __s2 + 2;
                D.26278 = *D.26277;
                D.26279 = (int) D.26278;
                __result = D.26276 - D.26279;
                D.26280 = __s2_len > 2;
                D.26260 = __result == 0;
                D.26281 = D.26280 & D.26260;
                if (D.26281 != 0) goto <D.26282>; else goto <D.26283>;
                <D.26282>:
                D.26284 = &MEM[(void *)"check-at-minor-collections" + 3B];
                D.26285 = *D.26284;
                D.26286 = (int) D.26285;
                D.26287 = __s2 + 3;
                D.26288 = *D.26287;
                D.26289 = (int) D.26288;
                __result = D.26286 - D.26289;
                <D.26283>:
                <D.26273>:
                <D.26263>:
              }
              D.21456 = __result;
            }
            iftmp.475 = -D.21456;
            goto <D.26290>;
            <D.26253>:
            iftmp.475 = __builtin_strcmp (opt, "check-at-minor-collections");
            <D.26290>:
            D.21457 = iftmp.475;
          }
          if (D.21457 == 0) goto <D.26291>; else goto <D.26292>;
          <D.26291>:
          consistency_check_at_minor_collection = 1;
          nursery_clear_policy = 0;
          goto <D.26293>;
          <D.26292>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26297 = "mod-union-consistency-check";
              D.26298 = MEM[(const unsigned char *)D.26297];
              D.26299 = (int) D.26298;
              D.26300 = *__s2;
              D.26301 = (int) D.26300;
              __result = D.26299 - D.26301;
              {
                D.26302 = __s2_len != 0;
                D.26303 = __result == 0;
                D.26304 = D.26302 & D.26303;
                if (D.26304 != 0) goto <D.26305>; else goto <D.26306>;
                <D.26305>:
                D.26307 = &MEM[(void *)"mod-union-consistency-check" + 1B];
                D.26308 = *D.26307;
                D.26309 = (int) D.26308;
                D.26310 = __s2 + 1;
                D.26311 = *D.26310;
                D.26312 = (int) D.26311;
                __result = D.26309 - D.26312;
                D.26313 = __s2_len > 1;
                D.26303 = __result == 0;
                D.26314 = D.26313 & D.26303;
                if (D.26314 != 0) goto <D.26315>; else goto <D.26316>;
                <D.26315>:
                D.26317 = &MEM[(void *)"mod-union-consistency-check" + 2B];
                D.26318 = *D.26317;
                D.26319 = (int) D.26318;
                D.26320 = __s2 + 2;
                D.26321 = *D.26320;
                D.26322 = (int) D.26321;
                __result = D.26319 - D.26322;
                D.26323 = __s2_len > 2;
                D.26303 = __result == 0;
                D.26324 = D.26323 & D.26303;
                if (D.26324 != 0) goto <D.26325>; else goto <D.26326>;
                <D.26325>:
                D.26327 = &MEM[(void *)"mod-union-consistency-check" + 3B];
                D.26328 = *D.26327;
                D.26329 = (int) D.26328;
                D.26330 = __s2 + 3;
                D.26331 = *D.26330;
                D.26332 = (int) D.26331;
                __result = D.26329 - D.26332;
                <D.26326>:
                <D.26316>:
                <D.26306>:
              }
              D.21465 = __result;
            }
            iftmp.476 = -D.21465;
            goto <D.26333>;
            <D.26296>:
            iftmp.476 = __builtin_strcmp (opt, "mod-union-consistency-check");
            <D.26333>:
            D.21466 = iftmp.476;
          }
          if (D.21466 == 0) goto <D.26334>; else goto <D.26335>;
          <D.26334>:
          D.25766 = major_collector.is_concurrent;
          if (D.25766 == 0) goto <D.26336>; else goto <D.26337>;
          <D.26336>:
          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.21400>;
          <D.26337>:
          mod_union_consistency_check = 1;
          goto <D.26338>;
          <D.26335>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26342 = "check-mark-bits";
              D.26343 = MEM[(const unsigned char *)D.26342];
              D.26344 = (int) D.26343;
              D.26345 = *__s2;
              D.26346 = (int) D.26345;
              __result = D.26344 - D.26346;
              {
                D.26347 = __s2_len != 0;
                D.26348 = __result == 0;
                D.26349 = D.26347 & D.26348;
                if (D.26349 != 0) goto <D.26350>; else goto <D.26351>;
                <D.26350>:
                D.26352 = &MEM[(void *)"check-mark-bits" + 1B];
                D.26353 = *D.26352;
                D.26354 = (int) D.26353;
                D.26355 = __s2 + 1;
                D.26356 = *D.26355;
                D.26357 = (int) D.26356;
                __result = D.26354 - D.26357;
                D.26358 = __s2_len > 1;
                D.26348 = __result == 0;
                D.26359 = D.26358 & D.26348;
                if (D.26359 != 0) goto <D.26360>; else goto <D.26361>;
                <D.26360>:
                D.26362 = &MEM[(void *)"check-mark-bits" + 2B];
                D.26363 = *D.26362;
                D.26364 = (int) D.26363;
                D.26365 = __s2 + 2;
                D.26366 = *D.26365;
                D.26367 = (int) D.26366;
                __result = D.26364 - D.26367;
                D.26368 = __s2_len > 2;
                D.26348 = __result == 0;
                D.26369 = D.26368 & D.26348;
                if (D.26369 != 0) goto <D.26370>; else goto <D.26371>;
                <D.26370>:
                D.26372 = &MEM[(void *)"check-mark-bits" + 3B];
                D.26373 = *D.26372;
                D.26374 = (int) D.26373;
                D.26375 = __s2 + 3;
                D.26376 = *D.26375;
                D.26377 = (int) D.26376;
                __result = D.26374 - D.26377;
                <D.26371>:
                <D.26361>:
                <D.26351>:
              }
              D.21474 = __result;
            }
            iftmp.477 = -D.21474;
            goto <D.26378>;
            <D.26341>:
            iftmp.477 = __builtin_strcmp (opt, "check-mark-bits");
            <D.26378>:
            D.21475 = iftmp.477;
          }
          if (D.21475 == 0) goto <D.26379>; else goto <D.26380>;
          <D.26379>:
          check_mark_bits_after_major_collection = 1;
          goto <D.26381>;
          <D.26380>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26385 = "check-nursery-pinned";
              D.26386 = MEM[(const unsigned char *)D.26385];
              D.26387 = (int) D.26386;
              D.26388 = *__s2;
              D.26389 = (int) D.26388;
              __result = D.26387 - D.26389;
              {
                D.26390 = __s2_len != 0;
                D.26391 = __result == 0;
                D.26392 = D.26390 & D.26391;
                if (D.26392 != 0) goto <D.26393>; else goto <D.26394>;
                <D.26393>:
                D.26395 = &MEM[(void *)"check-nursery-pinned" + 1B];
                D.26396 = *D.26395;
                D.26397 = (int) D.26396;
                D.26398 = __s2 + 1;
                D.26399 = *D.26398;
                D.26400 = (int) D.26399;
                __result = D.26397 - D.26400;
                D.26401 = __s2_len > 1;
                D.26391 = __result == 0;
                D.26402 = D.26401 & D.26391;
                if (D.26402 != 0) goto <D.26403>; else goto <D.26404>;
                <D.26403>:
                D.26405 = &MEM[(void *)"check-nursery-pinned" + 2B];
                D.26406 = *D.26405;
                D.26407 = (int) D.26406;
                D.26408 = __s2 + 2;
                D.26409 = *D.26408;
                D.26410 = (int) D.26409;
                __result = D.26407 - D.26410;
                D.26411 = __s2_len > 2;
                D.26391 = __result == 0;
                D.26412 = D.26411 & D.26391;
                if (D.26412 != 0) goto <D.26413>; else goto <D.26414>;
                <D.26413>:
                D.26415 = &MEM[(void *)"check-nursery-pinned" + 3B];
                D.26416 = *D.26415;
                D.26417 = (int) D.26416;
                D.26418 = __s2 + 3;
                D.26419 = *D.26418;
                D.26420 = (int) D.26419;
                __result = D.26417 - D.26420;
                <D.26414>:
                <D.26404>:
                <D.26394>:
              }
              D.21483 = __result;
            }
            iftmp.478 = -D.21483;
            goto <D.26421>;
            <D.26384>:
            iftmp.478 = __builtin_strcmp (opt, "check-nursery-pinned");
            <D.26421>:
            D.21484 = iftmp.478;
          }
          if (D.21484 == 0) goto <D.26422>; else goto <D.26423>;
          <D.26422>:
          check_nursery_objects_pinned = 1;
          goto <D.26424>;
          <D.26423>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26428 = "xdomain-checks";
              D.26429 = MEM[(const unsigned char *)D.26428];
              D.26430 = (int) D.26429;
              D.26431 = *__s2;
              D.26432 = (int) D.26431;
              __result = D.26430 - D.26432;
              {
                D.26433 = __s2_len != 0;
                D.26434 = __result == 0;
                D.26435 = D.26433 & D.26434;
                if (D.26435 != 0) goto <D.26436>; else goto <D.26437>;
                <D.26436>:
                D.26438 = &MEM[(void *)"xdomain-checks" + 1B];
                D.26439 = *D.26438;
                D.26440 = (int) D.26439;
                D.26441 = __s2 + 1;
                D.26442 = *D.26441;
                D.26443 = (int) D.26442;
                __result = D.26440 - D.26443;
                D.26444 = __s2_len > 1;
                D.26434 = __result == 0;
                D.26445 = D.26444 & D.26434;
                if (D.26445 != 0) goto <D.26446>; else goto <D.26447>;
                <D.26446>:
                D.26448 = &MEM[(void *)"xdomain-checks" + 2B];
                D.26449 = *D.26448;
                D.26450 = (int) D.26449;
                D.26451 = __s2 + 2;
                D.26452 = *D.26451;
                D.26453 = (int) D.26452;
                __result = D.26450 - D.26453;
                D.26454 = __s2_len > 2;
                D.26434 = __result == 0;
                D.26455 = D.26454 & D.26434;
                if (D.26455 != 0) goto <D.26456>; else goto <D.26457>;
                <D.26456>:
                D.26458 = &MEM[(void *)"xdomain-checks" + 3B];
                D.26459 = *D.26458;
                D.26460 = (int) D.26459;
                D.26461 = __s2 + 3;
                D.26462 = *D.26461;
                D.26463 = (int) D.26462;
                __result = D.26460 - D.26463;
                <D.26457>:
                <D.26447>:
                <D.26437>:
              }
              D.21492 = __result;
            }
            iftmp.479 = -D.21492;
            goto <D.26464>;
            <D.26427>:
            iftmp.479 = __builtin_strcmp (opt, "xdomain-checks");
            <D.26464>:
            D.21493 = iftmp.479;
          }
          if (D.21493 == 0) goto <D.26465>; else goto <D.26466>;
          <D.26465>:
          xdomain_checks = 1;
          goto <D.26467>;
          <D.26466>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26471 = "clear-at-gc";
              D.26472 = MEM[(const unsigned char *)D.26471];
              D.26473 = (int) D.26472;
              D.26474 = *__s2;
              D.26475 = (int) D.26474;
              __result = D.26473 - D.26475;
              {
                D.26476 = __s2_len != 0;
                D.26477 = __result == 0;
                D.26478 = D.26476 & D.26477;
                if (D.26478 != 0) goto <D.26479>; else goto <D.26480>;
                <D.26479>:
                D.26481 = &MEM[(void *)"clear-at-gc" + 1B];
                D.26482 = *D.26481;
                D.26483 = (int) D.26482;
                D.26484 = __s2 + 1;
                D.26485 = *D.26484;
                D.26486 = (int) D.26485;
                __result = D.26483 - D.26486;
                D.26487 = __s2_len > 1;
                D.26477 = __result == 0;
                D.26488 = D.26487 & D.26477;
                if (D.26488 != 0) goto <D.26489>; else goto <D.26490>;
                <D.26489>:
                D.26491 = &MEM[(void *)"clear-at-gc" + 2B];
                D.26492 = *D.26491;
                D.26493 = (int) D.26492;
                D.26494 = __s2 + 2;
                D.26495 = *D.26494;
                D.26496 = (int) D.26495;
                __result = D.26493 - D.26496;
                D.26497 = __s2_len > 2;
                D.26477 = __result == 0;
                D.26498 = D.26497 & D.26477;
                if (D.26498 != 0) goto <D.26499>; else goto <D.26500>;
                <D.26499>:
                D.26501 = &MEM[(void *)"clear-at-gc" + 3B];
                D.26502 = *D.26501;
                D.26503 = (int) D.26502;
                D.26504 = __s2 + 3;
                D.26505 = *D.26504;
                D.26506 = (int) D.26505;
                __result = D.26503 - D.26506;
                <D.26500>:
                <D.26490>:
                <D.26480>:
              }
              D.21501 = __result;
            }
            iftmp.480 = -D.21501;
            goto <D.26507>;
            <D.26470>:
            iftmp.480 = __builtin_strcmp (opt, "clear-at-gc");
            <D.26507>:
            D.21502 = iftmp.480;
          }
          if (D.21502 == 0) goto <D.26508>; else goto <D.26509>;
          <D.26508>:
          nursery_clear_policy = 0;
          goto <D.26510>;
          <D.26509>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26514 = "clear-nursery-at-gc";
              D.26515 = MEM[(const unsigned char *)D.26514];
              D.26516 = (int) D.26515;
              D.26517 = *__s2;
              D.26518 = (int) D.26517;
              __result = D.26516 - D.26518;
              {
                D.26519 = __s2_len != 0;
                D.26520 = __result == 0;
                D.26521 = D.26519 & D.26520;
                if (D.26521 != 0) goto <D.26522>; else goto <D.26523>;
                <D.26522>:
                D.26524 = &MEM[(void *)"clear-nursery-at-gc" + 1B];
                D.26525 = *D.26524;
                D.26526 = (int) D.26525;
                D.26527 = __s2 + 1;
                D.26528 = *D.26527;
                D.26529 = (int) D.26528;
                __result = D.26526 - D.26529;
                D.26530 = __s2_len > 1;
                D.26520 = __result == 0;
                D.26531 = D.26530 & D.26520;
                if (D.26531 != 0) goto <D.26532>; else goto <D.26533>;
                <D.26532>:
                D.26534 = &MEM[(void *)"clear-nursery-at-gc" + 2B];
                D.26535 = *D.26534;
                D.26536 = (int) D.26535;
                D.26537 = __s2 + 2;
                D.26538 = *D.26537;
                D.26539 = (int) D.26538;
                __result = D.26536 - D.26539;
                D.26540 = __s2_len > 2;
                D.26520 = __result == 0;
                D.26541 = D.26540 & D.26520;
                if (D.26541 != 0) goto <D.26542>; else goto <D.26543>;
                <D.26542>:
                D.26544 = &MEM[(void *)"clear-nursery-at-gc" + 3B];
                D.26545 = *D.26544;
                D.26546 = (int) D.26545;
                D.26547 = __s2 + 3;
                D.26548 = *D.26547;
                D.26549 = (int) D.26548;
                __result = D.26546 - D.26549;
                <D.26543>:
                <D.26533>:
                <D.26523>:
              }
              D.21510 = __result;
            }
            iftmp.481 = -D.21510;
            goto <D.26550>;
            <D.26513>:
            iftmp.481 = __builtin_strcmp (opt, "clear-nursery-at-gc");
            <D.26550>:
            D.21511 = iftmp.481;
          }
          if (D.21511 == 0) goto <D.26551>; else goto <D.26552>;
          <D.26551>:
          nursery_clear_policy = 0;
          goto <D.26553>;
          <D.26552>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26557 = "check-scan-starts";
              D.26558 = MEM[(const unsigned char *)D.26557];
              D.26559 = (int) D.26558;
              D.26560 = *__s2;
              D.26561 = (int) D.26560;
              __result = D.26559 - D.26561;
              {
                D.26562 = __s2_len != 0;
                D.26563 = __result == 0;
                D.26564 = D.26562 & D.26563;
                if (D.26564 != 0) goto <D.26565>; else goto <D.26566>;
                <D.26565>:
                D.26567 = &MEM[(void *)"check-scan-starts" + 1B];
                D.26568 = *D.26567;
                D.26569 = (int) D.26568;
                D.26570 = __s2 + 1;
                D.26571 = *D.26570;
                D.26572 = (int) D.26571;
                __result = D.26569 - D.26572;
                D.26573 = __s2_len > 1;
                D.26563 = __result == 0;
                D.26574 = D.26573 & D.26563;
                if (D.26574 != 0) goto <D.26575>; else goto <D.26576>;
                <D.26575>:
                D.26577 = &MEM[(void *)"check-scan-starts" + 2B];
                D.26578 = *D.26577;
                D.26579 = (int) D.26578;
                D.26580 = __s2 + 2;
                D.26581 = *D.26580;
                D.26582 = (int) D.26581;
                __result = D.26579 - D.26582;
                D.26583 = __s2_len > 2;
                D.26563 = __result == 0;
                D.26584 = D.26583 & D.26563;
                if (D.26584 != 0) goto <D.26585>; else goto <D.26586>;
                <D.26585>:
                D.26587 = &MEM[(void *)"check-scan-starts" + 3B];
                D.26588 = *D.26587;
                D.26589 = (int) D.26588;
                D.26590 = __s2 + 3;
                D.26591 = *D.26590;
                D.26592 = (int) D.26591;
                __result = D.26589 - D.26592;
                <D.26586>:
                <D.26576>:
                <D.26566>:
              }
              D.21519 = __result;
            }
            iftmp.482 = -D.21519;
            goto <D.26593>;
            <D.26556>:
            iftmp.482 = __builtin_strcmp (opt, "check-scan-starts");
            <D.26593>:
            D.21520 = iftmp.482;
          }
          if (D.21520 == 0) goto <D.26594>; else goto <D.26595>;
          <D.26594>:
          do_scan_starts_check = 1;
          goto <D.26596>;
          <D.26595>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26600 = "verify-nursery-at-minor-gc";
              D.26601 = MEM[(const unsigned char *)D.26600];
              D.26602 = (int) D.26601;
              D.26603 = *__s2;
              D.26604 = (int) D.26603;
              __result = D.26602 - D.26604;
              {
                D.26605 = __s2_len != 0;
                D.26606 = __result == 0;
                D.26607 = D.26605 & D.26606;
                if (D.26607 != 0) goto <D.26608>; else goto <D.26609>;
                <D.26608>:
                D.26610 = &MEM[(void *)"verify-nursery-at-minor-gc" + 1B];
                D.26611 = *D.26610;
                D.26612 = (int) D.26611;
                D.26613 = __s2 + 1;
                D.26614 = *D.26613;
                D.26615 = (int) D.26614;
                __result = D.26612 - D.26615;
                D.26616 = __s2_len > 1;
                D.26606 = __result == 0;
                D.26617 = D.26616 & D.26606;
                if (D.26617 != 0) goto <D.26618>; else goto <D.26619>;
                <D.26618>:
                D.26620 = &MEM[(void *)"verify-nursery-at-minor-gc" + 2B];
                D.26621 = *D.26620;
                D.26622 = (int) D.26621;
                D.26623 = __s2 + 2;
                D.26624 = *D.26623;
                D.26625 = (int) D.26624;
                __result = D.26622 - D.26625;
                D.26626 = __s2_len > 2;
                D.26606 = __result == 0;
                D.26627 = D.26626 & D.26606;
                if (D.26627 != 0) goto <D.26628>; else goto <D.26629>;
                <D.26628>:
                D.26630 = &MEM[(void *)"verify-nursery-at-minor-gc" + 3B];
                D.26631 = *D.26630;
                D.26632 = (int) D.26631;
                D.26633 = __s2 + 3;
                D.26634 = *D.26633;
                D.26635 = (int) D.26634;
                __result = D.26632 - D.26635;
                <D.26629>:
                <D.26619>:
                <D.26609>:
              }
              D.21528 = __result;
            }
            iftmp.483 = -D.21528;
            goto <D.26636>;
            <D.26599>:
            iftmp.483 = __builtin_strcmp (opt, "verify-nursery-at-minor-gc");
            <D.26636>:
            D.21529 = iftmp.483;
          }
          if (D.21529 == 0) goto <D.26637>; else goto <D.26638>;
          <D.26637>:
          do_verify_nursery = 1;
          goto <D.26639>;
          <D.26638>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26643 = "check-concurrent";
              D.26644 = MEM[(const unsigned char *)D.26643];
              D.26645 = (int) D.26644;
              D.26646 = *__s2;
              D.26647 = (int) D.26646;
              __result = D.26645 - D.26647;
              {
                D.26648 = __s2_len != 0;
                D.26649 = __result == 0;
                D.26650 = D.26648 & D.26649;
                if (D.26650 != 0) goto <D.26651>; else goto <D.26652>;
                <D.26651>:
                D.26653 = &MEM[(void *)"check-concurrent" + 1B];
                D.26654 = *D.26653;
                D.26655 = (int) D.26654;
                D.26656 = __s2 + 1;
                D.26657 = *D.26656;
                D.26658 = (int) D.26657;
                __result = D.26655 - D.26658;
                D.26659 = __s2_len > 1;
                D.26649 = __result == 0;
                D.26660 = D.26659 & D.26649;
                if (D.26660 != 0) goto <D.26661>; else goto <D.26662>;
                <D.26661>:
                D.26663 = &MEM[(void *)"check-concurrent" + 2B];
                D.26664 = *D.26663;
                D.26665 = (int) D.26664;
                D.26666 = __s2 + 2;
                D.26667 = *D.26666;
                D.26668 = (int) D.26667;
                __result = D.26665 - D.26668;
                D.26669 = __s2_len > 2;
                D.26649 = __result == 0;
                D.26670 = D.26669 & D.26649;
                if (D.26670 != 0) goto <D.26671>; else goto <D.26672>;
                <D.26671>:
                D.26673 = &MEM[(void *)"check-concurrent" + 3B];
                D.26674 = *D.26673;
                D.26675 = (int) D.26674;
                D.26676 = __s2 + 3;
                D.26677 = *D.26676;
                D.26678 = (int) D.26677;
                __result = D.26675 - D.26678;
                <D.26672>:
                <D.26662>:
                <D.26652>:
              }
              D.21537 = __result;
            }
            iftmp.484 = -D.21537;
            goto <D.26679>;
            <D.26642>:
            iftmp.484 = __builtin_strcmp (opt, "check-concurrent");
            <D.26679>:
            D.21538 = iftmp.484;
          }
          if (D.21538 == 0) goto <D.26680>; else goto <D.26681>;
          <D.26680>:
          D.25766 = major_collector.is_concurrent;
          if (D.25766 == 0) goto <D.26682>; else goto <D.26683>;
          <D.26682>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "`check-concurrent` only works with concurrent major collectors.");
          // predicted unlikely by continue predictor.
          goto <D.21400>;
          <D.26683>:
          do_concurrent_checks = 1;
          goto <D.26684>;
          <D.26681>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26688 = "dump-nursery-at-minor-gc";
              D.26689 = MEM[(const unsigned char *)D.26688];
              D.26690 = (int) D.26689;
              D.26691 = *__s2;
              D.26692 = (int) D.26691;
              __result = D.26690 - D.26692;
              {
                D.26693 = __s2_len != 0;
                D.26694 = __result == 0;
                D.26695 = D.26693 & D.26694;
                if (D.26695 != 0) goto <D.26696>; else goto <D.26697>;
                <D.26696>:
                D.26698 = &MEM[(void *)"dump-nursery-at-minor-gc" + 1B];
                D.26699 = *D.26698;
                D.26700 = (int) D.26699;
                D.26701 = __s2 + 1;
                D.26702 = *D.26701;
                D.26703 = (int) D.26702;
                __result = D.26700 - D.26703;
                D.26704 = __s2_len > 1;
                D.26694 = __result == 0;
                D.26705 = D.26704 & D.26694;
                if (D.26705 != 0) goto <D.26706>; else goto <D.26707>;
                <D.26706>:
                D.26708 = &MEM[(void *)"dump-nursery-at-minor-gc" + 2B];
                D.26709 = *D.26708;
                D.26710 = (int) D.26709;
                D.26711 = __s2 + 2;
                D.26712 = *D.26711;
                D.26713 = (int) D.26712;
                __result = D.26710 - D.26713;
                D.26714 = __s2_len > 2;
                D.26694 = __result == 0;
                D.26715 = D.26714 & D.26694;
                if (D.26715 != 0) goto <D.26716>; else goto <D.26717>;
                <D.26716>:
                D.26718 = &MEM[(void *)"dump-nursery-at-minor-gc" + 3B];
                D.26719 = *D.26718;
                D.26720 = (int) D.26719;
                D.26721 = __s2 + 3;
                D.26722 = *D.26721;
                D.26723 = (int) D.26722;
                __result = D.26720 - D.26723;
                <D.26717>:
                <D.26707>:
                <D.26697>:
              }
              D.21546 = __result;
            }
            iftmp.485 = -D.21546;
            goto <D.26724>;
            <D.26687>:
            iftmp.485 = __builtin_strcmp (opt, "dump-nursery-at-minor-gc");
            <D.26724>:
            D.21547 = iftmp.485;
          }
          if (D.21547 == 0) goto <D.26725>; else goto <D.26726>;
          <D.26725>:
          do_dump_nursery_content = 1;
          goto <D.26727>;
          <D.26726>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26731 = "no-managed-allocator";
              D.26732 = MEM[(const unsigned char *)D.26731];
              D.26733 = (int) D.26732;
              D.26734 = *__s2;
              D.26735 = (int) D.26734;
              __result = D.26733 - D.26735;
              {
                D.26736 = __s2_len != 0;
                D.26737 = __result == 0;
                D.26738 = D.26736 & D.26737;
                if (D.26738 != 0) goto <D.26739>; else goto <D.26740>;
                <D.26739>:
                D.26741 = &MEM[(void *)"no-managed-allocator" + 1B];
                D.26742 = *D.26741;
                D.26743 = (int) D.26742;
                D.26744 = __s2 + 1;
                D.26745 = *D.26744;
                D.26746 = (int) D.26745;
                __result = D.26743 - D.26746;
                D.26747 = __s2_len > 1;
                D.26737 = __result == 0;
                D.26748 = D.26747 & D.26737;
                if (D.26748 != 0) goto <D.26749>; else goto <D.26750>;
                <D.26749>:
                D.26751 = &MEM[(void *)"no-managed-allocator" + 2B];
                D.26752 = *D.26751;
                D.26753 = (int) D.26752;
                D.26754 = __s2 + 2;
                D.26755 = *D.26754;
                D.26756 = (int) D.26755;
                __result = D.26753 - D.26756;
                D.26757 = __s2_len > 2;
                D.26737 = __result == 0;
                D.26758 = D.26757 & D.26737;
                if (D.26758 != 0) goto <D.26759>; else goto <D.26760>;
                <D.26759>:
                D.26761 = &MEM[(void *)"no-managed-allocator" + 3B];
                D.26762 = *D.26761;
                D.26763 = (int) D.26762;
                D.26764 = __s2 + 3;
                D.26765 = *D.26764;
                D.26766 = (int) D.26765;
                __result = D.26763 - D.26766;
                <D.26760>:
                <D.26750>:
                <D.26740>:
              }
              D.21555 = __result;
            }
            iftmp.486 = -D.21555;
            goto <D.26767>;
            <D.26730>:
            iftmp.486 = __builtin_strcmp (opt, "no-managed-allocator");
            <D.26767>:
            D.21556 = iftmp.486;
          }
          if (D.21556 == 0) goto <D.26768>; else goto <D.26769>;
          <D.26768>:
          sgen_set_use_managed_allocator (0);
          goto <D.26770>;
          <D.26769>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26774 = "disable-minor";
              D.26775 = MEM[(const unsigned char *)D.26774];
              D.26776 = (int) D.26775;
              D.26777 = *__s2;
              D.26778 = (int) D.26777;
              __result = D.26776 - D.26778;
              {
                D.26779 = __s2_len != 0;
                D.26780 = __result == 0;
                D.26781 = D.26779 & D.26780;
                if (D.26781 != 0) goto <D.26782>; else goto <D.26783>;
                <D.26782>:
                D.26784 = &MEM[(void *)"disable-minor" + 1B];
                D.26785 = *D.26784;
                D.26786 = (int) D.26785;
                D.26787 = __s2 + 1;
                D.26788 = *D.26787;
                D.26789 = (int) D.26788;
                __result = D.26786 - D.26789;
                D.26790 = __s2_len > 1;
                D.26780 = __result == 0;
                D.26791 = D.26790 & D.26780;
                if (D.26791 != 0) goto <D.26792>; else goto <D.26793>;
                <D.26792>:
                D.26794 = &MEM[(void *)"disable-minor" + 2B];
                D.26795 = *D.26794;
                D.26796 = (int) D.26795;
                D.26797 = __s2 + 2;
                D.26798 = *D.26797;
                D.26799 = (int) D.26798;
                __result = D.26796 - D.26799;
                D.26800 = __s2_len > 2;
                D.26780 = __result == 0;
                D.26801 = D.26800 & D.26780;
                if (D.26801 != 0) goto <D.26802>; else goto <D.26803>;
                <D.26802>:
                D.26804 = &MEM[(void *)"disable-minor" + 3B];
                D.26805 = *D.26804;
                D.26806 = (int) D.26805;
                D.26807 = __s2 + 3;
                D.26808 = *D.26807;
                D.26809 = (int) D.26808;
                __result = D.26806 - D.26809;
                <D.26803>:
                <D.26793>:
                <D.26783>:
              }
              D.21564 = __result;
            }
            iftmp.487 = -D.21564;
            goto <D.26810>;
            <D.26773>:
            iftmp.487 = __builtin_strcmp (opt, "disable-minor");
            <D.26810>:
            D.21565 = iftmp.487;
          }
          if (D.21565 == 0) goto <D.26811>; else goto <D.26812>;
          <D.26811>:
          disable_minor_collections = 1;
          goto <D.26813>;
          <D.26812>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26817 = "disable-major";
              D.26818 = MEM[(const unsigned char *)D.26817];
              D.26819 = (int) D.26818;
              D.26820 = *__s2;
              D.26821 = (int) D.26820;
              __result = D.26819 - D.26821;
              {
                D.26822 = __s2_len != 0;
                D.26823 = __result == 0;
                D.26824 = D.26822 & D.26823;
                if (D.26824 != 0) goto <D.26825>; else goto <D.26826>;
                <D.26825>:
                D.26827 = &MEM[(void *)"disable-major" + 1B];
                D.26828 = *D.26827;
                D.26829 = (int) D.26828;
                D.26830 = __s2 + 1;
                D.26831 = *D.26830;
                D.26832 = (int) D.26831;
                __result = D.26829 - D.26832;
                D.26833 = __s2_len > 1;
                D.26823 = __result == 0;
                D.26834 = D.26833 & D.26823;
                if (D.26834 != 0) goto <D.26835>; else goto <D.26836>;
                <D.26835>:
                D.26837 = &MEM[(void *)"disable-major" + 2B];
                D.26838 = *D.26837;
                D.26839 = (int) D.26838;
                D.26840 = __s2 + 2;
                D.26841 = *D.26840;
                D.26842 = (int) D.26841;
                __result = D.26839 - D.26842;
                D.26843 = __s2_len > 2;
                D.26823 = __result == 0;
                D.26844 = D.26843 & D.26823;
                if (D.26844 != 0) goto <D.26845>; else goto <D.26846>;
                <D.26845>:
                D.26847 = &MEM[(void *)"disable-major" + 3B];
                D.26848 = *D.26847;
                D.26849 = (int) D.26848;
                D.26850 = __s2 + 3;
                D.26851 = *D.26850;
                D.26852 = (int) D.26851;
                __result = D.26849 - D.26852;
                <D.26846>:
                <D.26836>:
                <D.26826>:
              }
              D.21573 = __result;
            }
            iftmp.488 = -D.21573;
            goto <D.26853>;
            <D.26816>:
            iftmp.488 = __builtin_strcmp (opt, "disable-major");
            <D.26853>:
            D.21574 = iftmp.488;
          }
          if (D.21574 == 0) goto <D.26854>; else goto <D.26855>;
          <D.26854>:
          disable_major_collections = 1;
          goto <D.26856>;
          <D.26855>:
          D.26857 = monoeg_g_str_has_prefix (opt, "heap-dump=");
          if (D.26857 != 0) goto <D.26858>; else goto <D.26859>;
          <D.26858>:
          {
            char * filename;

            D.26860 = __builtin_strchr (opt, 61);
            filename = D.26860 + 1;
            nursery_clear_policy = 0;
            heap_dump_file.489 = fopen (filename, "w");
            heap_dump_file = heap_dump_file.489;
            heap_dump_file.490 = heap_dump_file;
            if (heap_dump_file.490 != 0B) goto <D.26863>; else goto <D.26864>;
            <D.26863>:
            heap_dump_file.490 = heap_dump_file;
            fprintf (heap_dump_file.490, "<sgen-dump>\n");
            do_pin_stats = 1;
            <D.26864>:
          }
          goto <D.26865>;
          <D.26859>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.26866>; else goto <D.26867>;
          <D.26866>:
          // predicted unlikely by continue predictor.
          goto <D.21400>;
          <D.26867>:
          stderr.439 = stderr;
          fprintf (stderr.439, "\n%s must be of the format [<l>[:<filename>]|<option>]+ where <l> is a debug level 0-9.\n", "MONO_GC_DEBUG");
          stderr.439 = stderr;
          fprintf (stderr.439, "Valid <option>s are:\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  collect-before-allocs[=<n>]\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  verify-before-allocs[=<n>]\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  check-at-minor-collections\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  check-mark-bits\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  check-nursery-pinned\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  verify-before-collections\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  verify-nursery-at-minor-gc\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  dump-nursery-at-minor-gc\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  disable-minor\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  disable-major\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  xdomain-checks\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  check-concurrent\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  clear-at-gc\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  clear-nursery-at-gc\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  check-scan-starts\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  no-managed-allocator\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  print-allowance\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  print-pinning\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "  heap-dump=<filename>\n");
          stderr.439 = stderr;
          fprintf (stderr.439, "\n");
          usage_printed = 1;
          <D.26865>:
          <D.26856>:
          <D.26813>:
          <D.26770>:
          <D.26727>:
          <D.26684>:
          <D.26639>:
          <D.26596>:
          <D.26553>:
          <D.26510>:
          <D.26467>:
          <D.26424>:
          <D.26381>:
          <D.26338>:
          <D.26293>:
          <D.26250>:
          <D.26207>:
          <D.26200>:
          <D.26157>:
          <D.26150>:
          <D.26107>:
          <D.26064>:
          <D.26021>:
        }
        <D.21400>:
        ptr = ptr + 4;
        <D.21577>:
        if (ptr != 0B) goto <D.26868>; else goto <D.21578>;
        <D.26868>:
        D.25209 = *ptr;
        if (D.25209 != 0B) goto <D.21576>; else goto <D.21578>;
        <D.21578>:
        monoeg_g_strfreev (opts);
      }
      <D.25974>:
      D.25522 = major_collector.is_parallel;
      if (D.25522 != 0) goto <D.26869>; else goto <D.26870>;
      <D.26869>:
      heap_dump_file.490 = heap_dump_file;
      if (heap_dump_file.490 != 0B) goto <D.26871>; else goto <D.26872>;
      <D.26871>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "Cannot do `heap-dump` with the parallel collector.");
      heap_dump_file.490 = heap_dump_file;
      fclose (heap_dump_file.490);
      heap_dump_file = 0B;
      <D.26872>:
      do_pin_stats.491 = do_pin_stats;
      if (do_pin_stats.491 != 0) goto <D.26874>; else goto <D.26875>;
      <D.26874>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "`print-pinning` is not supported with the parallel collector.");
      do_pin_stats = 0;
      <D.26875>:
      <D.26870>:
      D.26876 = major_collector.post_param_init;
      if (D.26876 != 0B) goto <D.26877>; else goto <D.26878>;
      <D.26877>:
      D.26876 = major_collector.post_param_init;
      D.26876 (&major_collector);
      <D.26878>:
      soft_limit.450 = soft_limit;
      sgen_memgov_init (max_heap, soft_limit.450, 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.26889;
  int iftmp.492;
  int D.26894;
  int D.26896;

  D.26894 = mono_runtime_is_critical_method (method);
  if (D.26894 != 0) goto <D.26891>; else goto <D.26895>;
  <D.26895>:
  D.26896 = sgen_is_critical_method (method);
  if (D.26896 != 0) goto <D.26891>; else goto <D.26892>;
  <D.26891>:
  iftmp.492 = 1;
  goto <D.26893>;
  <D.26892>:
  iftmp.492 = 0;
  <D.26893>:
  D.26889 = iftmp.492;
  return D.26889;
}


sgen_thread_attach (struct SgenThreadInfo * info)
{
  void * (*<T2a02>) (void) D.26898;
  void * D.26901;
  void * D.26904;

  pthread_mutex_lock (&gc_mutex);
  init_stats ();
  sgen_gc_unlock ();
  D.26898 = gc_callbacks.thread_attach_func;
  if (D.26898 != 0B) goto <D.26899>; else goto <D.26900>;
  <D.26899>:
  D.26901 = info->runtime_data;
  if (D.26901 == 0B) goto <D.26902>; else goto <D.26903>;
  <D.26902>:
  D.26898 = gc_callbacks.thread_attach_func;
  D.26904 = D.26898 ();
  info->runtime_data = D.26904;
  <D.26903>:
  <D.26900>:
}


sgen_thread_unregister (struct SgenThreadInfo * p)
{
  unsigned int D.26907;
  void * D.26908;
  struct FILE * gc_debug_file.493;
  void (*<T112f>) (void *) D.26910;
  void * D.26913;

  if (0 != 0) goto <D.26905>; else goto <D.26906>;
  <D.26905>:
  D.26907 = MEM[(struct MonoThreadInfo *)p].node.key;
  D.26908 = (void *) D.26907;
  gc_debug_file.493 = gc_debug_file;
  fprintf (gc_debug_file.493, "unregister thread %p (%p)\n", p, D.26908);
  gc_debug_file.493 = gc_debug_file;
  fflush (gc_debug_file.493);
  <D.26906>:
  D.26910 = gc_callbacks.thread_detach_func;
  if (D.26910 != 0B) goto <D.26911>; else goto <D.26912>;
  <D.26911>:
  D.26910 = gc_callbacks.thread_detach_func;
  D.26913 = p->runtime_data;
  D.26910 (D.26913);
  p->runtime_data = 0B;
  <D.26912>:
}


sgen_thread_detach (struct SgenThreadInfo * p)
{
  struct MonoDomain * D.26914;
  struct MonoThread * D.26917;

  D.26914 = mono_domain_get ();
  if (D.26914 != 0B) goto <D.26915>; else goto <D.26916>;
  <D.26915>:
  D.26917 = mono_thread_current ();
  mono_thread_detach (D.26917);
  <D.26916>:
}


sgen_thread_register (struct SgenThreadInfo * info, void * addr)
{
  struct MonoContext * D.26918;
  long unsigned int D.26919;
  void * sstart.494;
  unsigned int size.495;
  void * D.26922;
  void * stack_end.496;
  unsigned int D.26926;
  void * D.26927;
  struct FILE * gc_debug_file.497;
  void * (*<T2a02>) (void) D.26929;
  void * D.26932;
  void * D.26933;

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

    try
      {
        D.26919 = pthread_self ();
        pthread_getattr_np (D.26919, &attr);
        pthread_attr_getstack (&attr, &sstart, &size);
        sstart.494 = sstart;
        info->stack_start_limit = sstart.494;
        sstart.494 = sstart;
        size.495 = size;
        D.26922 = sstart.494 + size.495;
        info->stack_end = D.26922;
        pthread_attr_destroy (&attr);
      }
    finally
      {
        size = {CLOBBER};
        sstart = {CLOBBER};
        attr = {CLOBBER};
      }
  }
  stack_end.496 = info->stack_end;
  stack_end = stack_end.496;
  if (0 != 0) goto <D.26924>; else goto <D.26925>;
  <D.26924>:
  stack_end.496 = info->stack_end;
  D.26926 = MEM[(struct MonoThreadInfo *)info].node.key;
  D.26927 = (void *) D.26926;
  gc_debug_file.497 = gc_debug_file;
  fprintf (gc_debug_file.497, "registered thread %p (%p) stack end %p\n", info, D.26927, stack_end.496);
  gc_debug_file.497 = gc_debug_file;
  fflush (gc_debug_file.497);
  <D.26925>:
  D.26929 = gc_callbacks.thread_attach_func;
  if (D.26929 != 0B) goto <D.26930>; else goto <D.26931>;
  <D.26930>:
  D.26929 = gc_callbacks.thread_attach_func;
  D.26932 = D.26929 ();
  info->runtime_data = D.26932;
  <D.26931>:
  D.26933 = info;
  return D.26933;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.26935;
  unsigned int exch.498;
  unsigned int comp.499;
  unsigned int D.26938;

  exch.498 = (unsigned int) exch;
  comp.499 = (unsigned int) comp;
  D.26938 = __sync_val_compare_and_swap_4 (dest, comp.499, exch.498);
  D.26935 = (gint32) D.26938;
  return D.26935;
}


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.26940;
  void (*<Tbf>) (void *) destructor.500;
  int D.26942;
  _Bool D.26943;

  destructor.500 = (void (*<Tbf>) (void *)) destructor;
  D.26942 = pthread_key_create (key, destructor.500);
  D.26943 = D.26942 == 0;
  D.26940 = (int) D.26943;
  return D.26940;
}


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

  inited.501 = inited;
  if (inited.501 != 0) goto <D.26946>; else goto <D.26947>;
  <D.26946>:
  return;
  <D.26947>:
  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.26951;

  if (str != 0B) goto <D.26949>; else goto <D.26950>;
  <D.26949>:
  D.26951 = __strdup (str);
  return D.26951;
  <D.26950>:
  D.26951 = 0B;
  return D.26951;
}


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

  try
    {
      val = strtod (opt, &endptr);
      endptr.502 = endptr;
      if (endptr.502 == opt) goto <D.26954>; else goto <D.26955>;
      <D.26954>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be a number.", opt_name);
      D.26956 = 0;
      return D.26956;
      <D.26955>:
      if (val < min) goto <D.26957>; else goto <D.26959>;
      <D.26959>:
      if (val > max) goto <D.26957>; else goto <D.26958>;
      <D.26957>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be between %.2f - %.2f.", opt_name, min, max);
      D.26956 = 0;
      return D.26956;
      <D.26958>:
      *result = val;
      D.26956 = 1;
      return D.26956;
    }
  finally
    {
      endptr = {CLOBBER};
    }
}


alloc_nursery ()
{
  struct GCMemSection * nursery_section.503;
  int gc_debug_level.504;
  _Bool D.26966;
  long int D.26967;
  long int D.26968;
  int sgen_nursery_size.505;
  long unsigned int sgen_nursery_size.506;
  struct FILE * gc_debug_file.507;
  unsigned int alloc_size.508;
  int D.26975;
  _Bool D.26976;
  long int D.26977;
  long int D.26978;
  void * (*<T2c31>) (mword, mword, int) D.26981;
  int sgen_nursery_bits.509;
  sizetype sgen_nursery_size.510;
  char * D.26984;
  unsigned int D.26985;
  unsigned int data.511;
  long long int D.26989;
  long unsigned int D.26990;
  sizetype alloc_size.512;
  char * D.26992;
  char * D.26993;
  int D.26994;
  unsigned int scan_starts.513;
  unsigned int D.26996;
  void * D.26997;
  struct GCMemSection * section;
  char * data;
  int scan_starts;
  int alloc_size;

  nursery_section.503 = nursery_section;
  if (nursery_section.503 != 0B) goto <D.26963>; else goto <D.26964>;
  <D.26963>:
  return;
  <D.26964>:
  gc_debug_level.504 = gc_debug_level;
  D.26966 = gc_debug_level.504 > 1;
  D.26967 = (long int) D.26966;
  D.26968 = __builtin_expect (D.26967, 0);
  if (D.26968 != 0) goto <D.26969>; else goto <D.26970>;
  <D.26969>:
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.506 = (long unsigned int) sgen_nursery_size.505;
  gc_debug_file.507 = gc_debug_file;
  fprintf (gc_debug_file.507, "Allocating nursery size: %lu\n", sgen_nursery_size.506);
  gc_debug_file.507 = gc_debug_file;
  fflush (gc_debug_file.507);
  <D.26970>:
  section = sgen_alloc_internal (2);
  alloc_size = sgen_nursery_size;
  alloc_size.508 = (unsigned int) alloc_size;
  D.26975 = sgen_memgov_try_alloc_space (alloc_size.508, 0);
  D.26976 = D.26975 == 0;
  D.26977 = (long int) D.26976;
  D.26978 = __builtin_expect (D.26977, 0);
  if (D.26978 != 0) goto <D.26979>; else goto <D.26980>;
  <D.26979>:
  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.26980>:
  D.26981 = major_collector.alloc_heap;
  sgen_nursery_bits.509 = sgen_nursery_bits;
  alloc_size.508 = (unsigned int) alloc_size;
  alloc_size.508 = (unsigned int) alloc_size;
  data = D.26981 (alloc_size.508, alloc_size.508, sgen_nursery_bits.509);
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.510 = (sizetype) sgen_nursery_size.505;
  D.26984 = data + sgen_nursery_size.510;
  D.26985 = (unsigned int) D.26984;
  data.511 = (unsigned int) data;
  sgen_update_heap_boundaries (data.511, D.26985);
  if (0 != 0) goto <D.26987>; else goto <D.26988>;
  <D.26987>:
  D.26989 = mono_gc_get_heap_size ();
  D.26990 = (long unsigned int) D.26989;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.506 = (long unsigned int) sgen_nursery_size.505;
  alloc_size.512 = (sizetype) alloc_size;
  D.26992 = data + alloc_size.512;
  gc_debug_file.507 = gc_debug_file;
  fprintf (gc_debug_file.507, "Expanding nursery size (%p-%p): %lu, total: %lu\n", data, D.26992, sgen_nursery_size.506, D.26990);
  gc_debug_file.507 = gc_debug_file;
  fflush (gc_debug_file.507);
  <D.26988>:
  section->next_data = data;
  D.26993 = section->next_data;
  section->data = D.26993;
  alloc_size.508 = (unsigned int) alloc_size;
  section->size = alloc_size.508;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.510 = (sizetype) sgen_nursery_size.505;
  D.26984 = data + sgen_nursery_size.510;
  section->end_data = D.26984;
  D.26994 = alloc_size + 8191;
  scan_starts = D.26994 / 8192;
  scan_starts.513 = (unsigned int) scan_starts;
  D.26996 = scan_starts.513 * 4;
  D.26997 = sgen_alloc_internal_dynamic (D.26996, 3, 1);
  section->scan_starts = D.26997;
  scan_starts.513 = (unsigned int) scan_starts;
  section->num_scan_start = scan_starts.513;
  nursery_section = section;
  sgen_nursery_size.505 = sgen_nursery_size;
  sgen_nursery_size.510 = (sizetype) sgen_nursery_size.505;
  D.26984 = data + sgen_nursery_size.510;
  sgen_nursery_allocator_set_nursery_bounds (data, D.26984);
}


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

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


mono_gc_get_gc_name ()
{
  const char * D.27001;

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


sgen_is_critical_method (struct MonoMethod * method)
{
  gboolean D.27003;
  int iftmp.514;
  struct MonoMethod * write_barrier_method.515;
  int D.27010;

  write_barrier_method.515 = write_barrier_method;
  if (method == write_barrier_method.515) goto <D.27005>; else goto <D.27009>;
  <D.27009>:
  D.27010 = sgen_is_managed_allocator (method);
  if (D.27010 != 0) goto <D.27005>; else goto <D.27006>;
  <D.27005>:
  iftmp.514 = 1;
  goto <D.27007>;
  <D.27006>:
  iftmp.514 = 0;
  <D.27007>:
  D.27003 = iftmp.514;
  return D.27003;
}


sgen_has_critical_method ()
{
  gboolean D.27012;
  int iftmp.516;
  struct MonoMethod * write_barrier_method.517;
  int D.27019;

  write_barrier_method.517 = write_barrier_method;
  if (write_barrier_method.517 != 0B) goto <D.27014>; else goto <D.27018>;
  <D.27018>:
  D.27019 = sgen_has_managed_allocator ();
  if (D.27019 != 0) goto <D.27014>; else goto <D.27015>;
  <D.27014>:
  iftmp.516 = 1;
  goto <D.27016>;
  <D.27015>:
  iftmp.516 = 0;
  <D.27016>:
  D.27012 = iftmp.516;
  return D.27012;
}


mono_gc_get_write_barrier ()
{
  _Bool D.27021;
  long int D.27022;
  long int D.27023;
  struct MonoMethod * write_barrier_method.518;
  struct MonoMethod * D.27029;
  struct MonoImage * D.27030;
  struct MonoClass * D.27031;
  struct MonoType * D.27032;
  struct MonoClass * D.27033;
  struct MonoType * D.27034;
  struct MonoClass * D.27035;
  guint8 * sgen_cardtable.519;
  int D.27037;
  unsigned int D.27040;
  struct MonoMethod * res;
  struct MonoMethodBuilder * mb;
  struct MonoMethodSignature * sig;
  int i;
  int nursery_check_labels[3];
  int stack_end_offset;

  try
    {
      stack_end_offset = -1;
      __asm__("movl $stack_end@ntpoff, %0" : "=r" stack_end_offset);
      D.27021 = stack_end_offset == -1;
      D.27022 = (long int) D.27021;
      D.27023 = __builtin_expect (D.27022, 0);
      if (D.27023 != 0) goto <D.27024>; else goto <D.27025>;
      <D.27024>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5450, "stack_end_offset != -1");
      <D.27025>:
      write_barrier_method.518 = write_barrier_method;
      if (write_barrier_method.518 != 0B) goto <D.27027>; else goto <D.27028>;
      <D.27027>:
      D.27029 = write_barrier_method;
      return D.27029;
      <D.27028>:
      D.27030 = mono_defaults.corlib;
      sig = mono_metadata_signature_alloc (D.27030, 1);
      D.27031 = mono_defaults.void_class;
      D.27032 = &D.27031->byval_arg;
      sig->ret = D.27032;
      D.27033 = mono_defaults.int_class;
      D.27034 = &D.27033->byval_arg;
      sig->params[0] = D.27034;
      D.27035 = mono_defaults.object_class;
      mb = mono_mb_new (D.27035, "wbarrier", 24);
      emit_nursery_check (mb, &nursery_check_labels);
      sgen_cardtable.519 = sgen_cardtable;
      mono_mb_emit_ptr (mb, sgen_cardtable.519);
      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.21603>;
      <D.21602>:
      D.27037 = nursery_check_labels[i];
      if (D.27037 != 0) goto <D.27038>; else goto <D.27039>;
      <D.27038>:
      D.27037 = nursery_check_labels[i];
      D.27040 = (unsigned int) D.27037;
      mono_mb_patch_branch (mb, D.27040);
      <D.27039>:
      i = i + 1;
      <D.21603>:
      if (i <= 2) goto <D.21602>; else goto <D.21604>;
      <D.21604>:
      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.518 = write_barrier_method;
      if (write_barrier_method.518 != 0B) goto <D.27041>; else goto <D.27042>;
      <D.27041>:
      mono_free_method (res);
      goto <D.27043>;
      <D.27042>:
      mono_memory_barrier ();
      write_barrier_method = res;
      <D.27043>:
      sgen_gc_unlock ();
      D.27029 = write_barrier_method;
      return D.27029;
    }
  finally
    {
      nursery_check_labels = {CLOBBER};
    }
}


emit_nursery_check (struct MonoMethodBuilder * mb, int * nursery_check_return_labels)
{
  int sgen_nursery_bits.520;
  char * D.27047;
  unsigned int D.27048;
  unsigned int D.27049;
  int D.27050;
  unsigned int D.27051;
  int D.27052;
  int D.27053;
  char * D.27056;
  unsigned int D.27057;
  unsigned int D.27058;
  int D.27059;
  int * D.27060;
  unsigned int D.27061;
  int D.27062;

  memset (nursery_check_return_labels, 0, 12);
  mono_mb_emit_ldarg (mb, 0);
  sgen_nursery_bits.520 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.520);
  mono_mb_emit_byte (mb, 100);
  D.27047 = sgen_get_nursery_start ();
  D.27048 = (unsigned int) D.27047;
  sgen_nursery_bits.520 = sgen_nursery_bits;
  D.27049 = D.27048 >> sgen_nursery_bits.520;
  D.27050 = (int) D.27049;
  mono_mb_emit_icon (mb, D.27050);
  D.27051 = mono_mb_emit_branch (mb, 59);
  D.27052 = (int) D.27051;
  *nursery_check_return_labels = D.27052;
  D.27053 = major_collector.is_concurrent;
  if (D.27053 == 0) goto <D.27054>; else goto <D.27055>;
  <D.27054>:
  mono_mb_emit_ldarg (mb, 0);
  mono_mb_emit_byte (mb, 77);
  sgen_nursery_bits.520 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.520);
  mono_mb_emit_byte (mb, 100);
  D.27056 = sgen_get_nursery_start ();
  D.27057 = (unsigned int) D.27056;
  sgen_nursery_bits.520 = sgen_nursery_bits;
  D.27058 = D.27057 >> sgen_nursery_bits.520;
  D.27059 = (int) D.27058;
  mono_mb_emit_icon (mb, D.27059);
  D.27060 = nursery_check_return_labels + 4;
  D.27061 = mono_mb_emit_branch (mb, 64);
  D.27062 = (int) D.27061;
  *D.27060 = D.27062;
  <D.27055>:
}


mono_gc_get_description ()
{
  char * D.27063;

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


mono_gc_set_desktop_mode ()
{

}


mono_gc_is_moving ()
{
  gboolean D.27065;

  D.27065 = 1;
  return D.27065;
}


mono_gc_is_disabled ()
{
  gboolean D.27067;

  D.27067 = 0;
  return D.27067;
}


sgen_get_nursery_clear_policy ()
{
  NurseryClearPolicy D.27069;

  D.27069 = nursery_clear_policy;
  return D.27069;
}


sgen_get_array_fill_vtable ()
{
  struct MonoVTable * array_fill_vtable.521;
  _Bool D.27074;
  long int D.27075;
  long int D.27076;
  struct MonoClass * D.27079;
  void * D.27080;
  struct MonoVTable * D.27081;

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

    try
      {
        domain = mono_get_root_domain ();
        D.27074 = domain == 0B;
        D.27075 = (long int) D.27074;
        D.27076 = __builtin_expect (D.27075, 0);
        if (D.27076 != 0) goto <D.27077>; else goto <D.27078>;
        <D.27077>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5574, "domain");
        <D.27078>:
        D.27079 = mono_defaults.byte_class;
        klass.element_class = D.27079;
        klass.rank = 1;
        klass.instance_size = 16;
        klass.sizes.element_size = 1;
        klass.name = "array_filler_type";
        vtable.klass = &klass;
        bmap = 0;
        D.27080 = mono_gc_make_descr_for_array (1, &bmap, 0, 1);
        vtable.gc_descr = D.27080;
        vtable.rank = 1;
        array_fill_vtable = &vtable;
      }
    finally
      {
        bmap = {CLOBBER};
      }
  }
  <D.27073>:
  D.27081 = array_fill_vtable;
  return D.27081;
}


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


sgen_major_collector_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  void (*<T2c59>) (void (*sgen_cardtable_block_callback) (mword, mword)) D.27085;

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


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

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


sgen_get_major_collector ()
{
  struct SgenMajorCollector * D.27087;

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


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

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


mono_gc_get_vtable_bits (struct MonoClass * class)
{
  int D.27091;
  int D.27094;
  guint D.27097;

  D.27091 = sgen_need_bridge_processing ();
  if (D.27091 != 0) goto <D.27092>; else goto <D.27093>;
  <D.27092>:
  D.27094 = sgen_is_bridge_class (class);
  if (D.27094 != 0) goto <D.27095>; else goto <D.27096>;
  <D.27095>:
  D.27097 = 1;
  return D.27097;
  <D.27096>:
  <D.27093>:
  D.27097 = 0;
  return D.27097;
}


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

  moved_objects_idx.522 = moved_objects_idx;
  if (moved_objects_idx.522 != 0) goto <D.27100>; else goto <D.27101>;
  <D.27100>:
  moved_objects_idx.522 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.522);
  moved_objects_idx = 0;
  <D.27101>:
}


