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

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


safe_name (void * obj)
{
  long unsigned int D.22567;
  long unsigned int D.22568;
  const char * D.22569;
  struct MonoClass * D.22570;
  struct MonoVTable * vt;

  D.22567 = MEM[(mword *)obj];
  D.22568 = D.22567 & 18446744073709551612;
  vt = (struct MonoVTable *) D.22568;
  D.22570 = vt->klass;
  D.22569 = D.22570->name;
  return D.22569;
}


sgen_scan_area_with_callback (char * start, char * end, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data, gboolean allow_flags)
{
  void * D.22572;
  char * iftmp.0;
  long unsigned int D.22578;
  long unsigned int D.22579;
  long unsigned int D.22582;
  unsigned int D.22587;
  unsigned int D.22588;
  long unsigned int D.22589;
  long unsigned int D.22590;
  long unsigned int D.22591;
  struct MonoVTable * D.22592;
  struct MonoVTable * array_fill_vtable.1;

  goto <D.20830>;
  <D.20831>:
  {
    size_t size;
    char * obj;

    D.22572 = MEM[(void * *)start];
    if (D.22572 == 0B) goto <D.22573>; else goto <D.22574>;
    <D.22573>:
    start = start + 8;
    // predicted unlikely by continue predictor.
    goto <D.20830>;
    <D.22574>:
    if (allow_flags != 0) goto <D.22575>; else goto <D.22576>;
    <D.22575>:
    D.22578 = MEM[(mword *)start];
    D.22579 = D.22578 & 1;
    if (D.22579 != 0) goto <D.22580>; else goto <D.22581>;
    <D.22580>:
    D.22578 = MEM[(mword *)start];
    D.22582 = D.22578 & 18446744073709551612;
    iftmp.0 = (char *) D.22582;
    goto <D.22583>;
    <D.22581>:
    iftmp.0 = 0B;
    <D.22583>:
    obj = iftmp.0;
    if (obj == 0B) goto <D.22584>; else goto <D.22585>;
    <D.22584>:
    obj = start;
    <D.22585>:
    goto <D.22586>;
    <D.22576>:
    obj = start;
    <D.22586>:
    D.22587 = sgen_safe_object_get_size (obj);
    D.22588 = D.22587 + 7;
    D.22589 = (long unsigned int) D.22588;
    size = D.22589 & 4294967288;
    D.22590 = MEM[(mword *)obj];
    D.22591 = D.22590 & 18446744073709551612;
    D.22592 = (struct MonoVTable *) D.22591;
    array_fill_vtable.1 = array_fill_vtable;
    if (D.22592 != array_fill_vtable.1) goto <D.22594>; else goto <D.22595>;
    <D.22594>:
    callback (obj, size, data);
    <D.22595>:
    start = start + size;
  }
  <D.20830>:
  if (start < end) goto <D.20831>; else goto <D.20832>;
  <D.20832>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.2;
  long unsigned int D.22597;
  long unsigned int D.22598;
  long unsigned int D.22601;
  guint D.22605;
  struct MonoVTable * D.22606;
  char * forwarded;

  D.22597 = MEM[(mword *)obj];
  D.22598 = D.22597 & 1;
  if (D.22598 != 0) goto <D.22599>; else goto <D.22600>;
  <D.22599>:
  D.22597 = MEM[(mword *)obj];
  D.22601 = D.22597 & 18446744073709551612;
  iftmp.2 = (char *) D.22601;
  goto <D.22602>;
  <D.22600>:
  iftmp.2 = 0B;
  <D.22602>:
  forwarded = iftmp.2;
  if (forwarded != 0B) goto <D.22603>; else goto <D.22604>;
  <D.22603>:
  obj = forwarded;
  <D.22604>:
  D.22597 = MEM[(mword *)obj];
  D.22601 = D.22597 & 18446744073709551612;
  D.22606 = (struct MonoVTable *) D.22601;
  D.22605 = sgen_par_object_get_size (D.22606, obj);
  return D.22605;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.22608;
  long unsigned int D.22609;
  guint D.22614;
  int D.22615;
  int D.22616;
  unsigned int D.22617;
  long unsigned int D.22620;
  int D.22621;
  unsigned int D.22622;
  unsigned int element_size.3;
  unsigned int D.22624;
  long unsigned int D.22625;
  long unsigned int D.22626;
  struct MonoClass * D.22629;
  unsigned char D.22630;
  long unsigned int D.22631;
  long unsigned int D.22632;
  mword descr;
  mword type;

  D.22608 = vtable->gc_descr;
  descr = (mword) D.22608;
  type = descr & 7;
  D.22609 = type + 18446744073709551615;
  if (D.22609 <= 1) goto <D.22610>; else goto <D.22611>;
  <D.22610>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.22612>; else goto <D.22613>;
    <D.22612>:
    D.22615 = MEM[(struct MonoString *)o].length;
    D.22616 = D.22615 * 2;
    D.22617 = (unsigned int) D.22616;
    D.22614 = D.22617 + 26;
    return D.22614;
    <D.22613>:
    D.22614 = (guint) size;
    return D.22614;
  }
  <D.22611>:
  if (type == 4) goto <D.22618>; else goto <D.22619>;
  <D.22618>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.22620 = descr >> 3;
    D.22621 = (int) D.22620;
    element_size = D.22621 & 1023;
    array = o;
    D.22622 = array->max_length;
    element_size.3 = (unsigned int) element_size;
    D.22624 = D.22622 * element_size.3;
    D.22625 = (long unsigned int) D.22624;
    size = D.22625 + 32;
    D.22626 = descr & 8192;
    if (D.22626 != 0) goto <D.22627>; else goto <D.22628>;
    <D.22627>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.22629 = vtable->klass;
    D.22630 = D.22629->rank;
    D.22631 = (long unsigned int) D.22630;
    D.22632 = D.22631 * 8;
    size = D.22632 + size;
    <D.22628>:
    D.22614 = (guint) size;
    return D.22614;
  }
  <D.22619>:
  D.22614 = slow_object_get_size (vtable, o);
  return D.22614;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.22634;
  guint D.22637;
  int D.22638;
  int D.22639;
  unsigned int D.22640;
  unsigned char D.22641;
  int D.22644;
  unsigned int D.22645;
  unsigned int D.22646;
  unsigned int D.22647;
  long unsigned int D.22648;
  struct MonoArrayBounds * D.22649;
  _Bool D.22650;
  long int D.22651;
  long int D.22652;
  long unsigned int D.22655;
  long unsigned int D.22656;
  int D.22657;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.22634 = mono_defaults.string_class;
  if (D.22634 == klass) goto <D.22635>; else goto <D.22636>;
  <D.22635>:
  D.22638 = MEM[(struct MonoString *)o].length;
  D.22639 = D.22638 * 2;
  D.22640 = (unsigned int) D.22639;
  D.22637 = D.22640 + 26;
  return D.22637;
  <D.22636>:
  D.22641 = klass->rank;
  if (D.22641 != 0) goto <D.22642>; else goto <D.22643>;
  <D.22642>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.22644 = klass->sizes.element_size;
    D.22645 = (unsigned int) D.22644;
    D.22646 = array->max_length;
    D.22647 = D.22645 * D.22646;
    D.22648 = (long unsigned int) D.22647;
    size = D.22648 + 32;
    D.22649 = array->bounds;
    D.22650 = D.22649 != 0B;
    D.22651 = (long int) D.22650;
    D.22652 = __builtin_expect (D.22651, 0);
    if (D.22652 != 0) goto <D.22653>; else goto <D.22654>;
    <D.22653>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.22641 = klass->rank;
    D.22655 = (long unsigned int) D.22641;
    D.22656 = D.22655 * 8;
    size = D.22656 + size;
    <D.22654>:
    D.22637 = (guint) size;
    return D.22637;
  }
  <D.22643>:
  D.22657 = klass->instance_size;
  D.22637 = (guint) D.22657;
  return D.22637;
}


mono_gc_scan_for_specific_ref (struct MonoObject * key, gboolean precise)
{
  struct GCMemSection * nursery_section.4;
  char * D.22660;
  char * D.22661;
  void (*<T2d80>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22662;
  long unsigned int D.22663;
  long unsigned int D.22664;
  void * D.22665;
  char * D.22666;
  struct SgenHashTableEntry * D.22667;
  unsigned int D.22668;
  void * * ptr;
  struct RootRecord * root;

  scan_object_for_specific_ref_precise = precise;
  nursery_section.4 = nursery_section;
  D.22660 = nursery_section.4->data;
  nursery_section.4 = nursery_section;
  D.22661 = nursery_section.4->end_data;
  sgen_scan_area_with_callback (D.22660, D.22661, scan_object_for_specific_ref_callback, key, 1);
  D.22662 = major_collector.iterate_objects;
  D.22662 (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.20907>;
    <D.20906>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22663 = (long unsigned int) __i;
      D.22664 = D.22663 * 8;
      __iter = __table + D.22664;
      goto <D.20904>;
      <D.20903>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        ptr = __entry->key;
        root = &__entry->data;
        goto <D.20901>;
        <D.20900>:
        D.22665 = *ptr;
        check_root_obj_specific_ref (root, D.22665, key);
        ptr = ptr + 8;
        <D.20901>:
        D.22666 = root->end_root;
        if (D.22666 > ptr) goto <D.20900>; else goto <D.20902>;
        <D.20902>:
      }
      __iter = __next;
      <D.20904>:
      D.22667 = *__iter;
      if (D.22667 != 0B) goto <D.20903>; else goto <D.20905>;
      <D.20905>:
    }
    __i = __i + 1;
    <D.20907>:
    D.22668 = roots_hash[1].size;
    if (D.22668 > __i) goto <D.20906>; else goto <D.20908>;
    <D.20908>:
  }
}


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


scan_object_for_specific_ref (char * start, struct MonoObject * key)
{
  char * iftmp.5;
  long unsigned int D.22670;
  long unsigned int D.22671;
  long unsigned int D.22674;
  int scan_object_for_specific_ref_precise.6;
  long unsigned int D.22681;
  long unsigned int D.22682;
  long unsigned int D.22685;
  long unsigned int D.22686;
  long unsigned int D.22687;
  long unsigned int D.22688;
  long unsigned int D.22689;
  long unsigned int D.22690;
  void * D.22691;
  const char * D.22694;
  long int _objptr.7;
  long int start.8;
  long int D.22697;
  const char * D.22700;
  long unsigned int D.22701;
  long unsigned int D.22702;
  int D.22703;
  void * D.22704;
  const char * D.22707;
  long int _objptr.9;
  long int D.22709;
  long unsigned int D.22710;
  long unsigned int D.22711;
  int D.22712;
  const char * D.22715;
  long unsigned int D.22716;
  long unsigned int D.22719;
  int D.22720;
  int D.22721;
  unsigned int D.22724;
  unsigned int el_size.10;
  unsigned int D.22726;
  sizetype D.22727;
  void * D.22728;
  const char * D.22731;
  long int p.11;
  long int D.22733;
  int D.22737;
  int D.22738;
  long unsigned int D.22739;
  long unsigned int D.22740;
  long unsigned int D.22741;
  long unsigned int D.22742;
  void * * D.22743;
  void * D.22744;
  const char * D.22747;
  char * D.22748;
  long int D.22749;
  long int D.22750;
  sizetype D.22751;
  long unsigned int D.22755;
  void * D.22758;
  const char * D.22761;
  long int p.12;
  long int D.22763;
  long unsigned int D.22764;
  void * D.22767;
  const char * D.22770;
  long int _objptr.13;
  long int D.22772;
  long unsigned int D.22773;
  unsigned int D.22774;
  unsigned int D.22775;
  struct MonoVTable * D.22778;
  struct MonoClass * D.22779;
  const char * D.22780;
  const char * D.22781;
  gsize * bitmap_data.14;
  long unsigned int D.22783;
  void * D.22786;
  const char * D.22789;
  long int _objptr.15;
  long int D.22791;
  int bwords.16;
  long unsigned int D.22793;
  gsize * mbitmap_data.17;
  long unsigned int D.22795;
  unsigned int D.22796;
  unsigned int D.22797;
  struct MonoClass * D.22798;
  unsigned int el_size.18;
  unsigned int D.22800;
  sizetype D.22801;
  const char * D.22804;
  const char * D.22805;
  gsize * bitmap_data.19;
  long unsigned int D.22807;
  void * D.22810;
  const char * D.22813;
  long int _objptr.20;
  long int D.22815;
  unsigned int bwords.21;
  sizetype D.22817;
  unsigned int D.22819;
  long unsigned int D.22820;
  long unsigned int D.22821;
  mword * D.22822;
  long unsigned int D.22823;
  long unsigned int key.22;
  const char * D.22827;
  long unsigned int D.22828;
  char * forwarded;

  D.22670 = MEM[(mword *)start];
  D.22671 = D.22670 & 1;
  if (D.22671 != 0) goto <D.22672>; else goto <D.22673>;
  <D.22672>:
  D.22670 = MEM[(mword *)start];
  D.22674 = D.22670 & 18446744073709551612;
  iftmp.5 = (char *) D.22674;
  goto <D.22675>;
  <D.22673>:
  iftmp.5 = 0B;
  <D.22675>:
  forwarded = iftmp.5;
  if (forwarded != 0B) goto <D.22676>; else goto <D.22677>;
  <D.22676>:
  start = forwarded;
  <D.22677>:
  scan_object_for_specific_ref_precise.6 = scan_object_for_specific_ref_precise;
  if (scan_object_for_specific_ref_precise.6 != 0) goto <D.22679>; else goto <D.22680>;
  <D.22679>:
  {
    struct GCVTable * vt;
    mword desc;

    D.22670 = MEM[(mword *)start];
    D.22674 = D.22670 & 18446744073709551612;
    vt = (struct GCVTable *) D.22674;
    desc = vt->desc;
    D.22681 = desc & 7;
    switch (D.22681) <default: <D.20814>, case 1: <D.20729>, case 2: <D.20736>, case 3: <D.20780>, case 4: <D.20744>, case 5: <D.20774>, case 6: <D.20793>, case 7: <D.20813>>
    <D.20729>:
    D.22682 = desc & 4294901760;
    if (D.22682 != 0) goto <D.22683>; else goto <D.22684>;
    <D.22683>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.22685 = desc >> 16;
      D.22686 = D.22685 & 255;
      D.22687 = D.22686 * 8;
      _objptr = _objptr + D.22687;
      D.22688 = desc >> 24;
      D.22689 = D.22688 & 255;
      D.22690 = D.22689 * 8;
      _objptr_end = _objptr + D.22690;
      D.22691 = *_objptr;
      if (D.22691 == key) goto <D.22692>; else goto <D.22693>;
      <D.22692>:
      D.22694 = safe_name (start);
      _objptr.7 = (long int) _objptr;
      start.8 = (long int) start;
      D.22697 = _objptr.7 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22694, D.22697);
      <D.22693>:
      _objptr = _objptr + 8;
      goto <D.20733>;
      <D.20732>:
      D.22691 = *_objptr;
      if (D.22691 == key) goto <D.22698>; else goto <D.22699>;
      <D.22698>:
      D.22700 = safe_name (start);
      _objptr.7 = (long int) _objptr;
      start.8 = (long int) start;
      D.22697 = _objptr.7 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22700, D.22697);
      <D.22699>:
      _objptr = _objptr + 8;
      <D.20733>:
      if (_objptr < _objptr_end) goto <D.20732>; else goto <D.20734>;
      <D.20734>:
    }
    <D.22684>:
    goto <D.20735>;
    <D.20736>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.22701 = (long unsigned int) _index;
        D.22702 = D.22701 * 8;
        _objptr = _objptr + D.22702;
        D.22703 = _index + 1;
        _bmap = _bmap >> D.22703;
        D.22704 = *_objptr;
        if (D.22704 == key) goto <D.22705>; else goto <D.22706>;
        <D.22705>:
        D.22707 = safe_name (start);
        _objptr.9 = (long int) _objptr;
        start.8 = (long int) start;
        D.22709 = _objptr.9 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22707, D.22709);
        <D.22706>:
        _objptr = _objptr + 8;
      }
      goto <D.20742>;
      <D.20741>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.22710 = (long unsigned int) _index;
        D.22711 = D.22710 * 8;
        _objptr = _objptr + D.22711;
        D.22712 = _index + 1;
        _bmap = _bmap >> D.22712;
        D.22704 = *_objptr;
        if (D.22704 == key) goto <D.22713>; else goto <D.22714>;
        <D.22713>:
        D.22715 = safe_name (start);
        _objptr.9 = (long int) _objptr;
        start.8 = (long int) start;
        D.22709 = _objptr.9 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22715, D.22709);
        <D.22714>:
        _objptr = _objptr + 8;
      }
      <D.20742>:
      if (_bmap != 0) goto <D.20741>; else goto <D.20743>;
      <D.20743>:
    }
    goto <D.20735>;
    <D.20744>:
    D.22716 = desc & 4294950912;
    if (D.22716 != 0) goto <D.22717>; else goto <D.22718>;
    <D.22717>:
    {
      int el_size;
      int etype;

      D.22719 = desc >> 3;
      D.22720 = (int) D.22719;
      el_size = D.22720 & 1023;
      D.22721 = (int) desc;
      etype = D.22721 & 49152;
      if (etype == 16384) goto <D.22722>; else goto <D.22723>;
      <D.22722>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.22724 = MEM[(struct MonoArray *)start].max_length;
        el_size.10 = (unsigned int) el_size;
        D.22726 = D.22724 * el_size.10;
        D.22727 = (sizetype) D.22726;
        end_refs = p + D.22727;
        goto <D.20750>;
        <D.20749>:
        D.22728 = *p;
        if (D.22728 == key) goto <D.22729>; else goto <D.22730>;
        <D.22729>:
        D.22731 = safe_name (start);
        p.11 = (long int) p;
        start.8 = (long int) start;
        D.22733 = p.11 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22731, D.22733);
        <D.22730>:
        p = p + 8;
        <D.20750>:
        if (p < end_refs) goto <D.20749>; else goto <D.20751>;
        <D.20751>:
      }
      goto <D.22734>;
      <D.22723>:
      if (etype == 32768) goto <D.22735>; else goto <D.22736>;
      <D.22735>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.22685 = desc >> 16;
        D.22737 = (int) D.22685;
        offset = D.22737 & 255;
        D.22688 = desc >> 24;
        D.22738 = (int) D.22688;
        num_refs = D.22738 & 255;
        e_start = start + 32;
        D.22724 = MEM[(struct MonoArray *)start].max_length;
        el_size.10 = (unsigned int) el_size;
        D.22726 = D.22724 * el_size.10;
        D.22727 = (sizetype) D.22726;
        e_end = e_start + D.22727;
        goto <D.20762>;
        <D.20761>:
        {
          void * * p;
          int i;

          p = e_start;
          D.22739 = (long unsigned int) offset;
          D.22740 = D.22739 * 8;
          p = p + D.22740;
          i = 0;
          goto <D.20759>;
          <D.20758>:
          D.22741 = (long unsigned int) i;
          D.22742 = D.22741 * 8;
          D.22743 = p + D.22742;
          D.22744 = *D.22743;
          if (D.22744 == key) goto <D.22745>; else goto <D.22746>;
          <D.22745>:
          D.22747 = safe_name (start);
          D.22741 = (long unsigned int) i;
          D.22742 = D.22741 * 8;
          D.22748 = p + D.22742;
          D.22749 = (long int) D.22748;
          start.8 = (long int) start;
          D.22750 = D.22749 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22747, D.22750);
          <D.22746>:
          i = i + 1;
          <D.20759>:
          if (i < num_refs) goto <D.20758>; else goto <D.20760>;
          <D.20760>:
          D.22751 = (sizetype) el_size;
          e_start = e_start + D.22751;
        }
        <D.20762>:
        if (e_start < e_end) goto <D.20761>; else goto <D.20763>;
        <D.20763>:
      }
      goto <D.22752>;
      <D.22736>:
      if (etype == 49152) goto <D.22753>; else goto <D.22754>;
      <D.22753>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.22724 = MEM[(struct MonoArray *)start].max_length;
        el_size.10 = (unsigned int) el_size;
        D.22726 = D.22724 * el_size.10;
        D.22727 = (sizetype) D.22726;
        e_end = e_start + D.22727;
        goto <D.20772>;
        <D.20771>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20769>;
          <D.20768>:
          D.22755 = _bmap & 1;
          if (D.22755 != 0) goto <D.22756>; else goto <D.22757>;
          <D.22756>:
          D.22758 = *p;
          if (D.22758 == key) goto <D.22759>; else goto <D.22760>;
          <D.22759>:
          D.22761 = safe_name (start);
          p.12 = (long int) p;
          start.8 = (long int) start;
          D.22763 = p.12 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22761, D.22763);
          <D.22760>:
          <D.22757>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20769>:
          if (_bmap != 0) goto <D.20768>; else goto <D.20770>;
          <D.20770>:
          D.22751 = (sizetype) el_size;
          e_start = e_start + D.22751;
        }
        <D.20772>:
        if (e_start < e_end) goto <D.20771>; else goto <D.20773>;
        <D.20773>:
      }
      <D.22754>:
      <D.22752>:
      <D.22734>:
    }
    <D.22718>:
    goto <D.20735>;
    <D.20774>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20778>;
      <D.20777>:
      D.22764 = _bmap & 1;
      if (D.22764 != 0) goto <D.22765>; else goto <D.22766>;
      <D.22765>:
      D.22767 = *_objptr;
      if (D.22767 == key) goto <D.22768>; else goto <D.22769>;
      <D.22768>:
      D.22770 = safe_name (start);
      _objptr.13 = (long int) _objptr;
      start.8 = (long int) start;
      D.22772 = _objptr.13 - start.8;
      monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22770, D.22772);
      <D.22769>:
      <D.22766>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20778>:
      if (_bmap != 0) goto <D.20777>; else goto <D.20779>;
      <D.20779>:
    }
    goto <D.20735>;
    <D.20780>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.22773 = *bitmap_data;
      D.22774 = (unsigned int) D.22773;
      D.22775 = D.22774 + 4294967295;
      bwords = (int) D.22775;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.22776>; else goto <D.22777>;
      <D.22776>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.22778 = myobj->vtable;
        D.22779 = D.22778->klass;
        D.22780 = D.22779->name_space;
        D.22778 = myobj->vtable;
        D.22779 = D.22778->klass;
        D.22781 = D.22779->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.22780, D.22781);
      }
      <D.22777>:
      goto <D.20791>;
      <D.20790>:
      {
        gsize _bmap;

        bitmap_data.14 = bitmap_data;
        bitmap_data = bitmap_data.14 + 8;
        _bmap = *bitmap_data.14;
        _objptr = start_run;
        goto <D.20788>;
        <D.20787>:
        D.22783 = _bmap & 1;
        if (D.22783 != 0) goto <D.22784>; else goto <D.22785>;
        <D.22784>:
        D.22786 = *_objptr;
        if (D.22786 == key) goto <D.22787>; else goto <D.22788>;
        <D.22787>:
        D.22789 = safe_name (start);
        _objptr.15 = (long int) _objptr;
        start.8 = (long int) start;
        D.22791 = _objptr.15 - start.8;
        monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22789, D.22791);
        <D.22788>:
        <D.22785>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20788>:
        if (_bmap != 0) goto <D.20787>; else goto <D.20789>;
        <D.20789>:
        start_run = start_run + 512;
      }
      <D.20791>:
      bwords.16 = bwords;
      bwords = bwords.16 + -1;
      if (bwords.16 > 0) goto <D.20790>; else goto <D.20792>;
      <D.20792>:
    }
    goto <D.20735>;
    <D.20793>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.22793 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.22793);
      mbitmap_data.17 = mbitmap_data;
      mbitmap_data = mbitmap_data.17 + 8;
      D.22795 = *mbitmap_data.17;
      D.22796 = (unsigned int) D.22795;
      D.22797 = D.22796 + 4294967295;
      mbwords = (int) D.22797;
      D.22798 = vt->klass;
      el_size = mono_array_element_size (D.22798);
      e_start = start + 32;
      D.22724 = MEM[(struct MonoArray *)start].max_length;
      el_size.18 = (unsigned int) el_size;
      D.22800 = D.22724 * el_size.18;
      D.22801 = (sizetype) D.22800;
      e_end = e_start + D.22801;
      if (0 != 0) goto <D.22802>; else goto <D.22803>;
      <D.22802>:
      D.22793 = vt->desc;
      D.22798 = vt->klass;
      D.22804 = D.22798->name_space;
      D.22798 = vt->klass;
      D.22805 = D.22798->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.22793, D.22804, D.22805);
      <D.22803>:
      goto <D.20811>;
      <D.20810>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.19 = bitmap_data;
          bitmap_data = bitmap_data.19 + 8;
          _bmap = *bitmap_data.19;
          start_run = _objptr;
          goto <D.20805>;
          <D.20804>:
          D.22807 = _bmap & 1;
          if (D.22807 != 0) goto <D.22808>; else goto <D.22809>;
          <D.22808>:
          D.22810 = *_objptr;
          if (D.22810 == key) goto <D.22811>; else goto <D.22812>;
          <D.22811>:
          D.22813 = safe_name (start);
          _objptr.20 = (long int) _objptr;
          start.8 = (long int) start;
          D.22815 = _objptr.20 - start.8;
          monoeg_g_print ("found ref to %p in object %p (%s) at offset %td\n", key, start, D.22813, D.22815);
          <D.22812>:
          <D.22809>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20805>:
          if (_bmap != 0) goto <D.20804>; else goto <D.20806>;
          <D.20806>:
          _objptr = start_run + 512;
        }
        <D.20808>:
        bwords.21 = bwords;
        bwords = bwords.21 + 4294967295;
        if (bwords.21 != 0) goto <D.20807>; else goto <D.20809>;
        <D.20809>:
        D.22817 = (sizetype) el_size;
        e_start = e_start + D.22817;
      }
      <D.20811>:
      if (e_start < e_end) goto <D.20810>; else goto <D.20812>;
      <D.20812>:
    }
    goto <D.20735>;
    <D.20813>:
    goto <D.20735>;
    <D.20814>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20735>:
  }
  goto <D.22818>;
  <D.22680>:
  {
    mword * words;
    size_t size;
    int i;

    words = start;
    D.22819 = sgen_safe_object_get_size (start);
    size = (size_t) D.22819;
    i = 0;
    goto <D.20819>;
    <D.20818>:
    D.22820 = (long unsigned int) i;
    D.22821 = D.22820 * 8;
    D.22822 = words + D.22821;
    D.22823 = *D.22822;
    key.22 = (long unsigned int) key;
    if (D.22823 == key.22) goto <D.22825>; else goto <D.22826>;
    <D.22825>:
    D.22827 = safe_name (start);
    D.22820 = (long unsigned int) i;
    D.22821 = D.22820 * 8;
    monoeg_g_print ("found possible ref to %p in object %p (%s) at offset %td\n", key, start, D.22827, D.22821);
    <D.22826>:
    i = i + 1;
    <D.20819>:
    D.22820 = (long unsigned int) i;
    D.22828 = size / 8;
    if (D.22820 < D.22828) goto <D.20818>; else goto <D.20820>;
    <D.20820>:
  }
  <D.22818>:
}


scan_roots_for_specific_ref (struct MonoObject * key, int root_type)
{
  long unsigned int D.22831;
  long unsigned int D.22832;
  long unsigned int D.22833;
  long unsigned int D.22834;
  void * D.22837;
  long unsigned int D.22838;
  unsigned int D.22839;
  unsigned int D.22840;
  gsize * bitmap_data.23;
  long unsigned int D.22842;
  void * D.22845;
  int bwords.24;
  struct SgenHashTableEntry * D.22847;
  unsigned int D.22848;
  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.20886>;
    <D.20885>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22831 = (long unsigned int) __i;
      D.22832 = D.22831 * 8;
      __iter = __table + D.22832;
      goto <D.20883>;
      <D.20882>:
      {
        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.22833 = desc & 7;
          switch (D.22833) <default: <D.20881>, case 1: <D.20861>, case 2: <D.20880>, case 3: <D.20865>, case 4: <D.20878>>
          <D.20861>:
          desc = desc >> 3;
          goto <D.20863>;
          <D.20862>:
          D.22834 = desc & 1;
          if (D.22834 != 0) goto <D.22835>; else goto <D.22836>;
          <D.22835>:
          D.22837 = *start_root;
          check_root_obj_specific_ref (root, key, D.22837);
          <D.22836>:
          desc = desc >> 1;
          start_root = start_root + 8;
          <D.20863>:
          if (desc != 0) goto <D.20862>; else goto <D.20864>;
          <D.20864>:
          return;
          <D.20865>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.22838 = *bitmap_data;
            D.22839 = (unsigned int) D.22838;
            D.22840 = D.22839 + 4294967295;
            bwords = (int) D.22840;
            start_run = start_root;
            bitmap_data = bitmap_data + 8;
            goto <D.20875>;
            <D.20874>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.23 = bitmap_data;
              bitmap_data = bitmap_data.23 + 8;
              bmap = *bitmap_data.23;
              objptr = start_run;
              goto <D.20872>;
              <D.20871>:
              D.22842 = bmap & 1;
              if (D.22842 != 0) goto <D.22843>; else goto <D.22844>;
              <D.22843>:
              D.22845 = *objptr;
              check_root_obj_specific_ref (root, key, D.22845);
              <D.22844>:
              bmap = bmap >> 1;
              objptr = objptr + 8;
              <D.20872>:
              if (bmap != 0) goto <D.20871>; else goto <D.20873>;
              <D.20873>:
              start_run = start_run + 512;
            }
            <D.20875>:
            bwords.24 = bwords;
            bwords = bwords.24 + -1;
            if (bwords.24 > 0) goto <D.20874>; else goto <D.20876>;
            <D.20876>:
            goto <D.20877>;
          }
          <D.20878>:
          {
            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.20877>;
          }
          <D.20880>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 844);
          <D.20881>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 846);
          <D.20877>:
        }
      }
      __iter = __next;
      <D.20883>:
      D.22847 = *__iter;
      if (D.22847 != 0B) goto <D.20882>; else goto <D.20884>;
      <D.20884>:
    }
    __i = __i + 1;
    <D.20886>:
    D.22848 = roots_hash[root_type].size;
    if (D.22848 > __i) goto <D.20885>; else goto <D.20887>;
    <D.20887>:
  }
  check_key = 0B;
  check_root = 0B;
}


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

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


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


mono_gc_clear_domain (struct MonoDomain * domain)
{
  int concurrent_collection_in_progress.27;
  int concurrent_collection_in_progress.28;
  _Bool D.22860;
  long int D.22861;
  long int D.22862;
  int xdomain_checks.29;
  struct MonoDomain * D.22868;
  struct GCMemSection * nursery_section.30;
  char * D.22872;
  char * D.22873;
  void (*<T2d80>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22874;
  char[0:] * D.22875;
  int D.22876;
  struct LOSObject * los_object_list.31;
  struct FILE * gc_debug_file.32;
  struct MonoDomain * D.22886;
  int do_pin_stats.33;
  _Bool D.22890;
  long int D.22891;
  long int D.22892;
  struct LOSObject * bigobj;
  struct LOSObject * prev;
  int i;

  pthread_mutex_lock (&gc_mutex);
  sgen_stop_world (0);
  concurrent_collection_in_progress.27 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.27 != 0) goto <D.22857>; else goto <D.22858>;
  <D.22857>:
  sgen_perform_collection (0, 1, "clear domain", 1);
  <D.22858>:
  concurrent_collection_in_progress.28 = concurrent_collection_in_progress;
  D.22860 = concurrent_collection_in_progress.28 != 0;
  D.22861 = (long int) D.22860;
  D.22862 = __builtin_expect (D.22861, 0);
  if (D.22862 != 0) goto <D.22863>; else goto <D.22864>;
  <D.22863>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1059, "!concurrent_collection_in_progress");
  <D.22864>:
  sgen_process_fin_stage_entries ();
  sgen_process_dislink_stage_entries ();
  sgen_clear_nursery_fragments ();
  xdomain_checks.29 = xdomain_checks;
  if (xdomain_checks.29 != 0) goto <D.22866>; else goto <D.22867>;
  <D.22866>:
  D.22868 = mono_get_root_domain ();
  if (D.22868 != domain) goto <D.22869>; else goto <D.22870>;
  <D.22869>:
  scan_for_registered_roots_in_domain (domain, 0);
  scan_for_registered_roots_in_domain (domain, 2);
  check_for_xdomain_refs ();
  <D.22870>:
  <D.22867>:
  null_ephemerons_for_domain (domain);
  i = 0;
  goto <D.21004>;
  <D.21003>:
  sgen_null_links_for_domain (domain, i);
  i = i + 1;
  <D.21004>:
  if (i <= 1) goto <D.21003>; else goto <D.21005>;
  <D.21005>:
  i = 0;
  goto <D.21007>;
  <D.21006>:
  sgen_remove_finalizers_for_domain (domain, i);
  i = i + 1;
  <D.21007>:
  if (i <= 1) goto <D.21006>; else goto <D.21008>;
  <D.21008>:
  nursery_section.30 = nursery_section;
  D.22872 = nursery_section.30->data;
  nursery_section.30 = nursery_section;
  D.22873 = nursery_section.30->end_data;
  sgen_scan_area_with_callback (D.22872, D.22873, clear_domain_process_minor_object_callback, domain, 0);
  D.22874 = major_collector.iterate_objects;
  D.22874 (1, 1, clear_domain_process_major_object_callback, domain);
  bigobj = los_object_list;
  goto <D.21010>;
  <D.21009>:
  D.22875 = &bigobj->data;
  clear_domain_process_object (D.22875, domain);
  bigobj = bigobj->next;
  <D.21010>:
  if (bigobj != 0B) goto <D.21009>; else goto <D.21011>;
  <D.21011>:
  prev = 0B;
  bigobj = los_object_list;
  goto <D.21013>;
  <D.21014>:
  D.22875 = &bigobj->data;
  D.22876 = need_remove_object_for_domain (D.22875, domain);
  if (D.22876 != 0) goto <D.22877>; else goto <D.22878>;
  <D.22877>:
  {
    struct LOSObject * to_free;

    to_free = bigobj;
    if (prev != 0B) goto <D.22879>; else goto <D.22880>;
    <D.22879>:
    los_object_list.31 = bigobj->next;
    prev->next = los_object_list.31;
    goto <D.22882>;
    <D.22880>:
    los_object_list.31 = bigobj->next;
    los_object_list = los_object_list.31;
    <D.22882>:
    bigobj = bigobj->next;
    if (0 != 0) goto <D.22883>; else goto <D.22884>;
    <D.22883>:
    gc_debug_file.32 = gc_debug_file;
    D.22875 = &bigobj->data;
    fprintf (gc_debug_file.32, "Freeing large object %p\n", D.22875);
    gc_debug_file.32 = gc_debug_file;
    fflush (gc_debug_file.32);
    <D.22884>:
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.21013>;
  }
  <D.22878>:
  prev = bigobj;
  bigobj = bigobj->next;
  <D.21013>:
  if (bigobj != 0B) goto <D.21014>; else goto <D.21015>;
  <D.21015>:
  D.22874 = major_collector.iterate_objects;
  D.22874 (1, 0, clear_domain_free_major_non_pinned_object_callback, domain);
  D.22874 = major_collector.iterate_objects;
  D.22874 (0, 1, clear_domain_free_major_pinned_object_callback, domain);
  D.22886 = mono_get_root_domain ();
  if (D.22886 == domain) goto <D.22887>; else goto <D.22888>;
  <D.22887>:
  do_pin_stats.33 = do_pin_stats;
  D.22890 = do_pin_stats.33 != 0;
  D.22891 = (long int) D.22890;
  D.22892 = __builtin_expect (D.22891, 0);
  if (D.22892 != 0) goto <D.22893>; else goto <D.22894>;
  <D.22893>:
  sgen_pin_stats_print_class_stats ();
  <D.22894>:
  <D.22888>:
  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.22895;
  void (*<T2d7c>) (char *, size_t) D.22898;

  D.22895 = need_remove_object_for_domain (obj, domain);
  if (D.22895 != 0) goto <D.22896>; else goto <D.22897>;
  <D.22896>:
  D.22898 = major_collector.free_pinned_object;
  D.22898 (obj, size);
  <D.22897>:
}


clear_domain_free_major_non_pinned_object_callback (char * obj, size_t size, struct MonoDomain * domain)
{
  int D.22899;
  void (*<T2d7c>) (char *, size_t) D.22902;

  D.22899 = need_remove_object_for_domain (obj, domain);
  if (D.22899 != 0) goto <D.22900>; else goto <D.22901>;
  <D.22900>:
  D.22902 = major_collector.free_non_pinned_object;
  D.22902 (obj, size);
  <D.22901>:
}


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

  D.22903 = clear_domain_process_object (obj, domain);
  if (D.22903 != 0) goto <D.22904>; else goto <D.22905>;
  <D.22904>:
  memset (obj, 0, size);
  <D.22905>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22908;
  int D.22913;
  void * D.22915;
  long unsigned int D.22916;

  D.22908 = __builtin_constant_p (__len);
  if (D.22908 != 0) goto <D.22909>; else goto <D.22910>;
  <D.22909>:
  if (__len == 0) goto <D.22911>; else goto <D.22912>;
  <D.22911>:
  D.22913 = __builtin_constant_p (__ch);
  if (D.22913 == 0) goto <D.22906>; else goto <D.22914>;
  <D.22914>:
  if (__ch != 0) goto <D.22906>; else goto <D.22907>;
  <D.22906>:
  __warn_memset_zero_len ();
  D.22915 = __dest;
  return D.22915;
  <D.22907>:
  <D.22912>:
  <D.22910>:
  D.22916 = __builtin_object_size (__dest, 0);
  D.22915 = __builtin___memset_chk (__dest, __ch, __len, D.22916);
  return D.22915;
}


scan_for_registered_roots_in_domain (struct MonoDomain * domain, int root_type)
{
  long unsigned int D.22918;
  long unsigned int D.22919;
  long unsigned int D.22922;
  long unsigned int D.22923;
  void * D.22926;
  long unsigned int D.22929;
  unsigned int D.22930;
  unsigned int D.22931;
  gsize * bitmap_data.34;
  long unsigned int D.22933;
  void * D.22936;
  int bwords.35;
  struct SgenHashTableEntry * D.22940;
  unsigned int D.22941;
  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.20962>;
    <D.20961>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.22918 = (long unsigned int) __i;
      D.22919 = D.22918 * 8;
      __iter = __table + D.22919;
      goto <D.20959>;
      <D.20958>:
      {
        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.22920>; else goto <D.22921>;
          <D.22920>:
          // predicted unlikely by continue predictor.
          goto <D.20936>;
          <D.22921>:
          D.22922 = desc & 7;
          switch (D.22922) <default: <D.20957>, case 1: <D.20937>, case 2: <D.20956>, case 3: <D.20942>, case 4: <D.20954>>
          <D.20937>:
          desc = desc >> 3;
          goto <D.20939>;
          <D.20938>:
          D.22923 = desc & 1;
          if (D.22923 != 0) goto <D.22924>; else goto <D.22925>;
          <D.22924>:
          D.22926 = *start_root;
          if (D.22926 != 0B) goto <D.22927>; else goto <D.22928>;
          <D.22927>:
          D.22926 = *start_root;
          check_obj_not_in_domain (D.22926);
          <D.22928>:
          <D.22925>:
          desc = desc >> 1;
          start_root = start_root + 8;
          <D.20939>:
          if (desc != 0) goto <D.20938>; else goto <D.20940>;
          <D.20940>:
          goto <D.20941>;
          <D.20942>:
          {
            gsize * bitmap_data;
            int bwords;
            void * * start_run;

            bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
            D.22929 = *bitmap_data;
            D.22930 = (unsigned int) D.22929;
            D.22931 = D.22930 + 4294967295;
            bwords = (int) D.22931;
            start_run = start_root;
            bitmap_data = bitmap_data + 8;
            goto <D.20952>;
            <D.20951>:
            {
              gsize bmap;
              void * * objptr;

              bitmap_data.34 = bitmap_data;
              bitmap_data = bitmap_data.34 + 8;
              bmap = *bitmap_data.34;
              objptr = start_run;
              goto <D.20949>;
              <D.20948>:
              D.22933 = bmap & 1;
              if (D.22933 != 0) goto <D.22934>; else goto <D.22935>;
              <D.22934>:
              D.22936 = *objptr;
              if (D.22936 != 0B) goto <D.22937>; else goto <D.22938>;
              <D.22937>:
              D.22936 = *objptr;
              check_obj_not_in_domain (D.22936);
              <D.22938>:
              <D.22935>:
              bmap = bmap >> 1;
              objptr = objptr + 8;
              <D.20949>:
              if (bmap != 0) goto <D.20948>; else goto <D.20950>;
              <D.20950>:
              start_run = start_run + 512;
            }
            <D.20952>:
            bwords.35 = bwords;
            bwords = bwords.35 + -1;
            if (bwords.35 > 0) goto <D.20951>; else goto <D.20953>;
            <D.20953>:
            goto <D.20941>;
          }
          <D.20954>:
          {
            void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker;

            marker = sgen_get_user_descriptor_func (desc);
            marker (start_root, check_obj_not_in_domain);
            goto <D.20941>;
          }
          <D.20956>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 969);
          <D.20957>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 971);
          <D.20941>:
        }
      }
      <D.20936>:
      __iter = __next;
      <D.20959>:
      D.22940 = *__iter;
      if (D.22940 != 0B) goto <D.20958>; else goto <D.20960>;
      <D.20960>:
    }
    __i = __i + 1;
    <D.20962>:
    D.22941 = roots_hash[root_type].size;
    if (D.22941 > __i) goto <D.20961>; else goto <D.20963>;
    <D.20963>:
  }
  check_domain = 0B;
}


check_obj_not_in_domain (void * * o)
{
  void * D.22942;
  struct MonoVTable * D.22943;
  struct MonoDomain * D.22944;
  struct MonoDomain * check_domain.36;
  _Bool D.22946;
  long int D.22947;
  long int D.22948;

  D.22942 = *o;
  D.22943 = MEM[(struct MonoObject *)D.22942].vtable;
  D.22944 = D.22943->domain;
  check_domain.36 = check_domain;
  D.22946 = D.22944 == check_domain.36;
  D.22947 = (long int) D.22946;
  D.22948 = __builtin_expect (D.22947, 0);
  if (D.22948 != 0) goto <D.22949>; else goto <D.22950>;
  <D.22949>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 918, "((MonoObject*)(*o))->vtable->domain != check_domain");
  <D.22950>:
}


check_for_xdomain_refs ()
{
  struct GCMemSection * nursery_section.37;
  char * D.22952;
  char * D.22953;
  void (*<T2d80>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.22954;
  char[0:] * D.22955;
  long unsigned int D.22956;
  struct LOSObject * bigobj;

  nursery_section.37 = nursery_section;
  D.22952 = nursery_section.37->data;
  nursery_section.37 = nursery_section;
  D.22953 = nursery_section.37->end_data;
  sgen_scan_area_with_callback (D.22952, D.22953, scan_object_for_xdomain_refs, 0B, 0);
  D.22954 = major_collector.iterate_objects;
  D.22954 (1, 1, scan_object_for_xdomain_refs, 0B);
  bigobj = los_object_list;
  goto <D.20969>;
  <D.20968>:
  D.22955 = &bigobj->data;
  D.22956 = sgen_los_object_size (bigobj);
  scan_object_for_xdomain_refs (D.22955, D.22956, 0B);
  bigobj = bigobj->next;
  <D.20969>:
  if (bigobj != 0B) goto <D.20968>; else goto <D.20970>;
  <D.20970>:
}


scan_object_for_xdomain_refs (char * start, mword size, void * data)
{
  struct MonoVTable * D.22957;
  long unsigned int D.22958;
  long unsigned int D.22959;
  long unsigned int D.22960;
  long unsigned int D.22961;
  long unsigned int D.22964;
  long unsigned int D.22965;
  long unsigned int D.22966;
  long unsigned int D.22967;
  long unsigned int D.22968;
  long unsigned int D.22969;
  long unsigned int D.22970;
  long unsigned int D.22971;
  int D.22972;
  long unsigned int D.22973;
  long unsigned int D.22974;
  int D.22975;
  long unsigned int D.22976;
  long unsigned int D.22979;
  int D.22980;
  int D.22981;
  unsigned int D.22984;
  unsigned int el_size.38;
  unsigned int D.22986;
  sizetype D.22987;
  int D.22991;
  int D.22992;
  long unsigned int D.22993;
  long unsigned int D.22994;
  long unsigned int D.22995;
  long unsigned int D.22996;
  void * * D.22997;
  sizetype D.22998;
  long unsigned int D.23002;
  long unsigned int D.23005;
  long unsigned int D.23008;
  unsigned int D.23009;
  unsigned int D.23010;
  struct MonoVTable * D.23013;
  struct MonoClass * D.23014;
  const char * D.23015;
  const char * D.23016;
  gsize * bitmap_data.39;
  long unsigned int D.23018;
  int bwords.40;
  long unsigned int D.23022;
  gsize * mbitmap_data.41;
  long unsigned int D.23024;
  unsigned int D.23025;
  unsigned int D.23026;
  struct MonoClass * D.23027;
  unsigned int el_size.42;
  unsigned int D.23029;
  sizetype D.23030;
  const char * D.23033;
  const char * D.23034;
  gsize * bitmap_data.43;
  long unsigned int D.23036;
  unsigned int bwords.44;
  sizetype D.23040;
  struct MonoDomain * domain;

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

    D.22958 = MEM[(mword *)start];
    D.22959 = D.22958 & 18446744073709551612;
    vt = (struct GCVTable *) D.22959;
    desc = vt->desc;
    D.22960 = desc & 7;
    switch (D.22960) <default: <D.20720>, case 1: <D.20635>, case 2: <D.20642>, case 3: <D.20686>, case 4: <D.20650>, case 5: <D.20680>, case 6: <D.20699>, case 7: <D.20719>>
    <D.20635>:
    D.22961 = desc & 4294901760;
    if (D.22961 != 0) goto <D.22962>; else goto <D.22963>;
    <D.22962>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.22964 = desc >> 16;
      D.22965 = D.22964 & 255;
      D.22966 = D.22965 * 8;
      _objptr = _objptr + D.22966;
      D.22967 = desc >> 24;
      D.22968 = D.22967 & 255;
      D.22969 = D.22968 * 8;
      _objptr_end = _objptr + D.22969;
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 8;
      goto <D.20639>;
      <D.20638>:
      check_reference_for_xdomain (_objptr, start, domain);
      _objptr = _objptr + 8;
      <D.20639>:
      if (_objptr < _objptr_end) goto <D.20638>; else goto <D.20640>;
      <D.20640>:
    }
    <D.22963>:
    goto <D.20641>;
    <D.20642>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.22970 = (long unsigned int) _index;
        D.22971 = D.22970 * 8;
        _objptr = _objptr + D.22971;
        D.22972 = _index + 1;
        _bmap = _bmap >> D.22972;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 8;
      }
      goto <D.20648>;
      <D.20647>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.22973 = (long unsigned int) _index;
        D.22974 = D.22973 * 8;
        _objptr = _objptr + D.22974;
        D.22975 = _index + 1;
        _bmap = _bmap >> D.22975;
        check_reference_for_xdomain (_objptr, start, domain);
        _objptr = _objptr + 8;
      }
      <D.20648>:
      if (_bmap != 0) goto <D.20647>; else goto <D.20649>;
      <D.20649>:
    }
    goto <D.20641>;
    <D.20650>:
    D.22976 = desc & 4294950912;
    if (D.22976 != 0) goto <D.22977>; else goto <D.22978>;
    <D.22977>:
    {
      int el_size;
      int etype;

      D.22979 = desc >> 3;
      D.22980 = (int) D.22979;
      el_size = D.22980 & 1023;
      D.22981 = (int) desc;
      etype = D.22981 & 49152;
      if (etype == 16384) goto <D.22982>; else goto <D.22983>;
      <D.22982>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.22984 = MEM[(struct MonoArray *)start].max_length;
        el_size.38 = (unsigned int) el_size;
        D.22986 = D.22984 * el_size.38;
        D.22987 = (sizetype) D.22986;
        end_refs = p + D.22987;
        goto <D.20656>;
        <D.20655>:
        check_reference_for_xdomain (p, start, domain);
        p = p + 8;
        <D.20656>:
        if (p < end_refs) goto <D.20655>; else goto <D.20657>;
        <D.20657>:
      }
      goto <D.22988>;
      <D.22983>:
      if (etype == 32768) goto <D.22989>; else goto <D.22990>;
      <D.22989>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.22964 = desc >> 16;
        D.22991 = (int) D.22964;
        offset = D.22991 & 255;
        D.22967 = desc >> 24;
        D.22992 = (int) D.22967;
        num_refs = D.22992 & 255;
        e_start = start + 32;
        D.22984 = MEM[(struct MonoArray *)start].max_length;
        el_size.38 = (unsigned int) el_size;
        D.22986 = D.22984 * el_size.38;
        D.22987 = (sizetype) D.22986;
        e_end = e_start + D.22987;
        goto <D.20668>;
        <D.20667>:
        {
          void * * p;
          int i;

          p = e_start;
          D.22993 = (long unsigned int) offset;
          D.22994 = D.22993 * 8;
          p = p + D.22994;
          i = 0;
          goto <D.20665>;
          <D.20664>:
          D.22995 = (long unsigned int) i;
          D.22996 = D.22995 * 8;
          D.22997 = p + D.22996;
          check_reference_for_xdomain (D.22997, start, domain);
          i = i + 1;
          <D.20665>:
          if (i < num_refs) goto <D.20664>; else goto <D.20666>;
          <D.20666>:
          D.22998 = (sizetype) el_size;
          e_start = e_start + D.22998;
        }
        <D.20668>:
        if (e_start < e_end) goto <D.20667>; else goto <D.20669>;
        <D.20669>:
      }
      goto <D.22999>;
      <D.22990>:
      if (etype == 49152) goto <D.23000>; else goto <D.23001>;
      <D.23000>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.22984 = MEM[(struct MonoArray *)start].max_length;
        el_size.38 = (unsigned int) el_size;
        D.22986 = D.22984 * el_size.38;
        D.22987 = (sizetype) D.22986;
        e_end = e_start + D.22987;
        goto <D.20678>;
        <D.20677>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20675>;
          <D.20674>:
          D.23002 = _bmap & 1;
          if (D.23002 != 0) goto <D.23003>; else goto <D.23004>;
          <D.23003>:
          check_reference_for_xdomain (p, start, domain);
          <D.23004>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20675>:
          if (_bmap != 0) goto <D.20674>; else goto <D.20676>;
          <D.20676>:
          D.22998 = (sizetype) el_size;
          e_start = e_start + D.22998;
        }
        <D.20678>:
        if (e_start < e_end) goto <D.20677>; else goto <D.20679>;
        <D.20679>:
      }
      <D.23001>:
      <D.22999>:
      <D.22988>:
    }
    <D.22978>:
    goto <D.20641>;
    <D.20680>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20684>;
      <D.20683>:
      D.23005 = _bmap & 1;
      if (D.23005 != 0) goto <D.23006>; else goto <D.23007>;
      <D.23006>:
      check_reference_for_xdomain (_objptr, start, domain);
      <D.23007>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20684>:
      if (_bmap != 0) goto <D.20683>; else goto <D.20685>;
      <D.20685>:
    }
    goto <D.20641>;
    <D.20686>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.23008 = *bitmap_data;
      D.23009 = (unsigned int) D.23008;
      D.23010 = D.23009 + 4294967295;
      bwords = (int) D.23010;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.23011>; else goto <D.23012>;
      <D.23011>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.23013 = myobj->vtable;
        D.23014 = D.23013->klass;
        D.23015 = D.23014->name_space;
        D.23013 = myobj->vtable;
        D.23014 = D.23013->klass;
        D.23016 = D.23014->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.23015, D.23016);
      }
      <D.23012>:
      goto <D.20697>;
      <D.20696>:
      {
        gsize _bmap;

        bitmap_data.39 = bitmap_data;
        bitmap_data = bitmap_data.39 + 8;
        _bmap = *bitmap_data.39;
        _objptr = start_run;
        goto <D.20694>;
        <D.20693>:
        D.23018 = _bmap & 1;
        if (D.23018 != 0) goto <D.23019>; else goto <D.23020>;
        <D.23019>:
        check_reference_for_xdomain (_objptr, start, domain);
        <D.23020>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20694>:
        if (_bmap != 0) goto <D.20693>; else goto <D.20695>;
        <D.20695>:
        start_run = start_run + 512;
      }
      <D.20697>:
      bwords.40 = bwords;
      bwords = bwords.40 + -1;
      if (bwords.40 > 0) goto <D.20696>; else goto <D.20698>;
      <D.20698>:
    }
    goto <D.20641>;
    <D.20699>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.23022 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.23022);
      mbitmap_data.41 = mbitmap_data;
      mbitmap_data = mbitmap_data.41 + 8;
      D.23024 = *mbitmap_data.41;
      D.23025 = (unsigned int) D.23024;
      D.23026 = D.23025 + 4294967295;
      mbwords = (int) D.23026;
      D.23027 = vt->klass;
      el_size = mono_array_element_size (D.23027);
      e_start = start + 32;
      D.22984 = MEM[(struct MonoArray *)start].max_length;
      el_size.42 = (unsigned int) el_size;
      D.23029 = D.22984 * el_size.42;
      D.23030 = (sizetype) D.23029;
      e_end = e_start + D.23030;
      if (0 != 0) goto <D.23031>; else goto <D.23032>;
      <D.23031>:
      D.23022 = vt->desc;
      D.23027 = vt->klass;
      D.23033 = D.23027->name_space;
      D.23027 = vt->klass;
      D.23034 = D.23027->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.23022, D.23033, D.23034);
      <D.23032>:
      goto <D.20717>;
      <D.20716>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.43 = bitmap_data;
          bitmap_data = bitmap_data.43 + 8;
          _bmap = *bitmap_data.43;
          start_run = _objptr;
          goto <D.20711>;
          <D.20710>:
          D.23036 = _bmap & 1;
          if (D.23036 != 0) goto <D.23037>; else goto <D.23038>;
          <D.23037>:
          check_reference_for_xdomain (_objptr, start, domain);
          <D.23038>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20711>:
          if (_bmap != 0) goto <D.20710>; else goto <D.20712>;
          <D.20712>:
          _objptr = start_run + 512;
        }
        <D.20714>:
        bwords.44 = bwords;
        bwords = bwords.44 + 4294967295;
        if (bwords.44 != 0) goto <D.20713>; else goto <D.20715>;
        <D.20715>:
        D.23040 = (sizetype) el_size;
        e_start = e_start + D.23040;
      }
      <D.20717>:
      if (e_start < e_end) goto <D.20716>; else goto <D.20718>;
      <D.20718>:
    }
    goto <D.20641>;
    <D.20719>:
    goto <D.20641>;
    <D.20720>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20641>:
  }
}


check_reference_for_xdomain (void * * ptr, char * obj, struct MonoDomain * domain)
{
  long int ptr.45;
  long int o.46;
  long int D.23044;
  struct MonoVTable * D.23048;
  struct MonoDomain * D.23049;
  int D.23050;
  struct MonoVTable * D.23053;
  struct MonoClassField * D.23054;
  long unsigned int D.23055;
  long unsigned int D.23056;
  struct MonoClassField * D.23057;
  int D.23058;
  unsigned int i.47;
  unsigned int D.23062;
  struct MonoClass * D.23064;
  struct MonoClass * D.23065;
  struct MonoClass * D.23069;
  const char * D.23070;
  const char * D.23071;
  const char * iftmp.48;
  const char * D.23076;
  const char * D.23077;
  const char * iftmp.49;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;
  struct MonoClass * class;
  struct MonoClassField * field;
  char * str;

  o = obj;
  ref = *ptr;
  ptr.45 = (long int) ptr;
  o.46 = (long int) o;
  D.23044 = ptr.45 - o.46;
  offset = (int) D.23044;
  if (ref == 0B) goto <D.23045>; else goto <D.23047>;
  <D.23047>:
  D.23048 = ref->vtable;
  D.23049 = D.23048->domain;
  if (D.23049 == domain) goto <D.23045>; else goto <D.23046>;
  <D.23045>:
  return;
  <D.23046>:
  D.23050 = is_xdomain_ref_allowed (ptr, obj, domain);
  if (D.23050 != 0) goto <D.23051>; else goto <D.23052>;
  <D.23051>:
  return;
  <D.23052>:
  field = 0B;
  D.23053 = o->vtable;
  class = D.23053->klass;
  goto <D.20626>;
  <D.20625>:
  {
    int i;

    i = 0;
    goto <D.20623>;
    <D.20622>:
    D.23054 = class->fields;
    D.23055 = (long unsigned int) i;
    D.23056 = D.23055 * 32;
    D.23057 = D.23054 + D.23056;
    D.23058 = D.23057->offset;
    if (D.23058 == offset) goto <D.23059>; else goto <D.23060>;
    <D.23059>:
    D.23054 = class->fields;
    D.23055 = (long unsigned int) i;
    D.23056 = D.23055 * 32;
    field = D.23054 + D.23056;
    goto <D.20621>;
    <D.23060>:
    i = i + 1;
    <D.20623>:
    i.47 = (unsigned int) i;
    D.23062 = class->field.count;
    if (i.47 < D.23062) goto <D.20622>; else goto <D.20621>;
    <D.20621>:
    if (field != 0B) goto <D.20624>; else goto <D.23063>;
    <D.23063>:
  }
  class = class->parent;
  <D.20626>:
  if (class != 0B) goto <D.20625>; else goto <D.20624>;
  <D.20624>:
  D.23048 = ref->vtable;
  D.23064 = D.23048->klass;
  D.23065 = mono_defaults.string_class;
  if (D.23064 == D.23065) goto <D.23066>; else goto <D.23067>;
  <D.23066>:
  str = mono_string_to_utf8 (ref);
  goto <D.23068>;
  <D.23067>:
  str = 0B;
  <D.23068>:
  D.23053 = o->vtable;
  D.23069 = D.23053->klass;
  D.23070 = D.23069->name_space;
  D.23053 = o->vtable;
  D.23069 = D.23053->klass;
  D.23071 = D.23069->name;
  if (field != 0B) goto <D.23073>; else goto <D.23074>;
  <D.23073>:
  iftmp.48 = field->name;
  goto <D.23075>;
  <D.23074>:
  iftmp.48 = "";
  <D.23075>:
  D.23048 = ref->vtable;
  D.23064 = D.23048->klass;
  D.23076 = D.23064->name_space;
  D.23048 = ref->vtable;
  D.23064 = D.23048->klass;
  D.23077 = D.23064->name;
  if (str != 0B) goto <D.23079>; else goto <D.23080>;
  <D.23079>:
  iftmp.49 = str;
  goto <D.23081>;
  <D.23080>:
  iftmp.49 = "";
  <D.23081>:
  monoeg_g_print ("xdomain reference in %p (%s.%s) at offset %d (%s) to %p (%s.%s) (%s)  -  pointed to by:\n", o, D.23070, D.23071, offset, iftmp.48, ref, D.23076, D.23077, iftmp.49);
  mono_gc_scan_for_specific_ref (o, 1);
  if (str != 0B) goto <D.23082>; else goto <D.23083>;
  <D.23082>:
  monoeg_g_free (str);
  <D.23083>:
}


is_xdomain_ref_allowed (void * * ptr, char * obj, struct MonoDomain * domain)
{
  long int ptr.50;
  long int o.51;
  long int D.23087;
  struct MonoVTable * D.23088;
  struct MonoClass * D.23089;
  struct MonoClass * D.23090;
  gboolean D.23095;
  struct MonoClass * D.23096;
  struct MonoClass * D.23101;
  int D.23102;
  int D.20509;
  int iftmp.52;
  int D.20508;
  struct MonoVTable * D.23110;
  struct MonoClass * D.23111;
  const char[21] * D.23112;
  unsigned char D.23113;
  int D.23114;
  unsigned char D.23115;
  int D.23116;
  const unsigned char * D.23121;
  unsigned char D.23122;
  int D.23123;
  const unsigned char * D.23124;
  unsigned char D.23125;
  int D.23126;
  const unsigned char * D.23131;
  unsigned char D.23132;
  int D.23133;
  const unsigned char * D.23134;
  unsigned char D.23135;
  int D.23136;
  const unsigned char * D.23141;
  unsigned char D.23142;
  int D.23143;
  const unsigned char * D.23144;
  unsigned char D.23145;
  int D.23146;
  const char * D.23148;
  int D.20518;
  int iftmp.53;
  int D.20517;
  const char[12] * D.23154;
  unsigned char D.23155;
  int D.23156;
  unsigned char D.23157;
  int D.23158;
  const unsigned char * D.23163;
  unsigned char D.23164;
  int D.23165;
  const unsigned char * D.23166;
  unsigned char D.23167;
  int D.23168;
  const unsigned char * D.23173;
  unsigned char D.23174;
  int D.23175;
  const unsigned char * D.23176;
  unsigned char D.23177;
  int D.23178;
  const unsigned char * D.23183;
  unsigned char D.23184;
  int D.23185;
  const unsigned char * D.23186;
  unsigned char D.23187;
  int D.23188;
  const char * D.23190;
  int D.20527;
  int iftmp.54;
  int D.20526;
  const char[7] * D.23196;
  unsigned char D.23197;
  int D.23198;
  unsigned char D.23199;
  int D.23200;
  const unsigned char * D.23205;
  unsigned char D.23206;
  int D.23207;
  const unsigned char * D.23208;
  unsigned char D.23209;
  int D.23210;
  const unsigned char * D.23215;
  unsigned char D.23216;
  int D.23217;
  const unsigned char * D.23218;
  unsigned char D.23219;
  int D.23220;
  const unsigned char * D.23225;
  unsigned char D.23226;
  int D.23227;
  const unsigned char * D.23228;
  unsigned char D.23229;
  int D.23230;
  const char * D.23232;
  int D.20536;
  int iftmp.55;
  int D.20535;
  const char[9] * D.23238;
  unsigned char D.23239;
  int D.23240;
  unsigned char D.23241;
  int D.23242;
  const unsigned char * D.23247;
  unsigned char D.23248;
  int D.23249;
  const unsigned char * D.23250;
  unsigned char D.23251;
  int D.23252;
  const unsigned char * D.23257;
  unsigned char D.23258;
  int D.23259;
  const unsigned char * D.23260;
  unsigned char D.23261;
  int D.23262;
  const unsigned char * D.23267;
  unsigned char D.23268;
  int D.23269;
  const unsigned char * D.23270;
  unsigned char D.23271;
  int D.23272;
  const char * D.23274;
  int D.20545;
  int iftmp.56;
  int D.20544;
  unsigned char D.23280;
  int D.23281;
  const unsigned char * D.23286;
  unsigned char D.23287;
  int D.23288;
  const unsigned char * D.23293;
  unsigned char D.23294;
  int D.23295;
  const unsigned char * D.23300;
  unsigned char D.23301;
  int D.23302;
  int D.20554;
  int iftmp.57;
  int D.20553;
  const char[7] * D.23309;
  unsigned char D.23310;
  int D.23311;
  unsigned char D.23312;
  int D.23313;
  const unsigned char * D.23318;
  unsigned char D.23319;
  int D.23320;
  const unsigned char * D.23321;
  unsigned char D.23322;
  int D.23323;
  const unsigned char * D.23328;
  unsigned char D.23329;
  int D.23330;
  const unsigned char * D.23331;
  unsigned char D.23332;
  int D.23333;
  const unsigned char * D.23338;
  unsigned char D.23339;
  int D.23340;
  const unsigned char * D.23341;
  unsigned char D.23342;
  int D.23343;
  int D.20563;
  int iftmp.58;
  int D.20562;
  const char[10] * D.23350;
  unsigned char D.23351;
  int D.23352;
  unsigned char D.23353;
  int D.23354;
  const unsigned char * D.23359;
  unsigned char D.23360;
  int D.23361;
  const unsigned char * D.23362;
  unsigned char D.23363;
  int D.23364;
  const unsigned char * D.23369;
  unsigned char D.23370;
  int D.23371;
  const unsigned char * D.23372;
  unsigned char D.23373;
  int D.23374;
  const unsigned char * D.23379;
  unsigned char D.23380;
  int D.23381;
  const unsigned char * D.23382;
  unsigned char D.23383;
  int D.23384;
  int D.20572;
  int iftmp.59;
  int D.20571;
  const char[13] * D.23391;
  unsigned char D.23392;
  int D.23393;
  unsigned char D.23394;
  int D.23395;
  const unsigned char * D.23400;
  unsigned char D.23401;
  int D.23402;
  const unsigned char * D.23403;
  unsigned char D.23404;
  int D.23405;
  const unsigned char * D.23410;
  unsigned char D.23411;
  int D.23412;
  const unsigned char * D.23413;
  unsigned char D.23414;
  int D.23415;
  const unsigned char * D.23420;
  unsigned char D.23421;
  int D.23422;
  const unsigned char * D.23423;
  unsigned char D.23424;
  int D.23425;
  int D.20581;
  int iftmp.60;
  int D.20580;
  const char[34] * D.23432;
  unsigned char D.23433;
  int D.23434;
  unsigned char D.23435;
  int D.23436;
  const unsigned char * D.23441;
  unsigned char D.23442;
  int D.23443;
  const unsigned char * D.23444;
  unsigned char D.23445;
  int D.23446;
  const unsigned char * D.23451;
  unsigned char D.23452;
  int D.23453;
  const unsigned char * D.23454;
  unsigned char D.23455;
  int D.23456;
  const unsigned char * D.23461;
  unsigned char D.23462;
  int D.23463;
  const unsigned char * D.23464;
  unsigned char D.23465;
  int D.23466;
  int D.20590;
  int iftmp.61;
  int D.20589;
  const char[12] * D.23473;
  unsigned char D.23474;
  int D.23475;
  unsigned char D.23476;
  int D.23477;
  const unsigned char * D.23482;
  unsigned char D.23483;
  int D.23484;
  const unsigned char * D.23485;
  unsigned char D.23486;
  int D.23487;
  const unsigned char * D.23492;
  unsigned char D.23493;
  int D.23494;
  const unsigned char * D.23495;
  unsigned char D.23496;
  int D.23497;
  const unsigned char * D.23502;
  unsigned char D.23503;
  int D.23504;
  const unsigned char * D.23505;
  unsigned char D.23506;
  int D.23507;
  int D.20599;
  int iftmp.62;
  int D.20598;
  unsigned char D.23514;
  int D.23515;
  const unsigned char * D.23520;
  unsigned char D.23521;
  int D.23522;
  const unsigned char * D.23527;
  unsigned char D.23528;
  int D.23529;
  const unsigned char * D.23534;
  unsigned char D.23535;
  int D.23536;
  int D.20608;
  int iftmp.63;
  int D.20607;
  unsigned char D.23543;
  int D.23544;
  const unsigned char * D.23549;
  unsigned char D.23550;
  int D.23551;
  const unsigned char * D.23556;
  unsigned char D.23557;
  int D.23558;
  const unsigned char * D.23563;
  unsigned char D.23564;
  int D.23565;
  int D.23569;
  struct MonoObject * o;
  struct MonoObject * ref;
  int offset;

  o = obj;
  ref = *ptr;
  ptr.50 = (long int) ptr;
  o.51 = (long int) o;
  D.23087 = ptr.50 - o.51;
  offset = (int) D.23087;
  D.23088 = o->vtable;
  D.23089 = D.23088->klass;
  D.23090 = mono_defaults.thread_class;
  if (D.23089 == D.23090) goto <D.23091>; else goto <D.23092>;
  <D.23091>:
  if (offset == 16) goto <D.23093>; else goto <D.23094>;
  <D.23093>:
  D.23095 = 1;
  return D.23095;
  <D.23094>:
  <D.23092>:
  D.23088 = o->vtable;
  D.23089 = D.23088->klass;
  D.23096 = mono_defaults.internal_thread_class;
  if (D.23089 == D.23096) goto <D.23097>; else goto <D.23098>;
  <D.23097>:
  if (offset == 120) goto <D.23099>; else goto <D.23100>;
  <D.23099>:
  D.23095 = 1;
  return D.23095;
  <D.23100>:
  <D.23098>:
  D.23088 = o->vtable;
  D.23089 = D.23088->klass;
  D.23101 = mono_defaults.real_proxy_class;
  D.23102 = mono_class_has_parent_fast (D.23089, D.23101);
  if (D.23102 != 0) goto <D.23103>; else goto <D.23104>;
  <D.23103>:
  if (offset == 32) goto <D.23105>; else goto <D.23106>;
  <D.23105>:
  D.23095 = 1;
  return D.23095;
  <D.23106>:
  <D.23104>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23110 = ref->vtable;
      D.23111 = D.23110->klass;
      __s2 = D.23111->name_space;
      D.23112 = "System.Globalization";
      D.23113 = MEM[(const unsigned char *)D.23112];
      D.23114 = (int) D.23113;
      D.23115 = *__s2;
      D.23116 = (int) D.23115;
      __result = D.23114 - D.23116;
      {
        if (__s2_len != 0) goto <D.23117>; else goto <D.23118>;
        <D.23117>:
        if (__result == 0) goto <D.23119>; else goto <D.23120>;
        <D.23119>:
        D.23121 = &MEM[(void *)"System.Globalization" + 1B];
        D.23122 = *D.23121;
        D.23123 = (int) D.23122;
        D.23124 = __s2 + 1;
        D.23125 = *D.23124;
        D.23126 = (int) D.23125;
        __result = D.23123 - D.23126;
        if (__s2_len > 1) goto <D.23127>; else goto <D.23128>;
        <D.23127>:
        if (__result == 0) goto <D.23129>; else goto <D.23130>;
        <D.23129>:
        D.23131 = &MEM[(void *)"System.Globalization" + 2B];
        D.23132 = *D.23131;
        D.23133 = (int) D.23132;
        D.23134 = __s2 + 2;
        D.23135 = *D.23134;
        D.23136 = (int) D.23135;
        __result = D.23133 - D.23136;
        if (__s2_len > 2) goto <D.23137>; else goto <D.23138>;
        <D.23137>:
        if (__result == 0) goto <D.23139>; else goto <D.23140>;
        <D.23139>:
        D.23141 = &MEM[(void *)"System.Globalization" + 3B];
        D.23142 = *D.23141;
        D.23143 = (int) D.23142;
        D.23144 = __s2 + 3;
        D.23145 = *D.23144;
        D.23146 = (int) D.23145;
        __result = D.23143 - D.23146;
        <D.23140>:
        <D.23138>:
        <D.23130>:
        <D.23128>:
        <D.23120>:
        <D.23118>:
      }
      D.20508 = __result;
    }
    iftmp.52 = -D.20508;
    goto <D.23147>;
    <D.23109>:
    D.23110 = ref->vtable;
    D.23111 = D.23110->klass;
    D.23148 = D.23111->name_space;
    iftmp.52 = __builtin_strcmp (D.23148, "System.Globalization");
    <D.23147>:
    D.20509 = iftmp.52;
  }
  if (D.20509 == 0) goto <D.23149>; else goto <D.23150>;
  <D.23149>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23110 = ref->vtable;
      D.23111 = D.23110->klass;
      __s2 = D.23111->name;
      D.23154 = "CultureInfo";
      D.23155 = MEM[(const unsigned char *)D.23154];
      D.23156 = (int) D.23155;
      D.23157 = *__s2;
      D.23158 = (int) D.23157;
      __result = D.23156 - D.23158;
      {
        if (__s2_len != 0) goto <D.23159>; else goto <D.23160>;
        <D.23159>:
        if (__result == 0) goto <D.23161>; else goto <D.23162>;
        <D.23161>:
        D.23163 = &MEM[(void *)"CultureInfo" + 1B];
        D.23164 = *D.23163;
        D.23165 = (int) D.23164;
        D.23166 = __s2 + 1;
        D.23167 = *D.23166;
        D.23168 = (int) D.23167;
        __result = D.23165 - D.23168;
        if (__s2_len > 1) goto <D.23169>; else goto <D.23170>;
        <D.23169>:
        if (__result == 0) goto <D.23171>; else goto <D.23172>;
        <D.23171>:
        D.23173 = &MEM[(void *)"CultureInfo" + 2B];
        D.23174 = *D.23173;
        D.23175 = (int) D.23174;
        D.23176 = __s2 + 2;
        D.23177 = *D.23176;
        D.23178 = (int) D.23177;
        __result = D.23175 - D.23178;
        if (__s2_len > 2) goto <D.23179>; else goto <D.23180>;
        <D.23179>:
        if (__result == 0) goto <D.23181>; else goto <D.23182>;
        <D.23181>:
        D.23183 = &MEM[(void *)"CultureInfo" + 3B];
        D.23184 = *D.23183;
        D.23185 = (int) D.23184;
        D.23186 = __s2 + 3;
        D.23187 = *D.23186;
        D.23188 = (int) D.23187;
        __result = D.23185 - D.23188;
        <D.23182>:
        <D.23180>:
        <D.23172>:
        <D.23170>:
        <D.23162>:
        <D.23160>:
      }
      D.20517 = __result;
    }
    iftmp.53 = -D.20517;
    goto <D.23189>;
    <D.23153>:
    D.23110 = ref->vtable;
    D.23111 = D.23110->klass;
    D.23190 = D.23111->name;
    iftmp.53 = __builtin_strcmp (D.23190, "CultureInfo");
    <D.23189>:
    D.20518 = iftmp.53;
  }
  if (D.20518 == 0) goto <D.23191>; else goto <D.23192>;
  <D.23191>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23088 = o->vtable;
      D.23089 = D.23088->klass;
      __s2 = D.23089->name_space;
      D.23196 = "System";
      D.23197 = MEM[(const unsigned char *)D.23196];
      D.23198 = (int) D.23197;
      D.23199 = *__s2;
      D.23200 = (int) D.23199;
      __result = D.23198 - D.23200;
      {
        if (__s2_len != 0) goto <D.23201>; else goto <D.23202>;
        <D.23201>:
        if (__result == 0) goto <D.23203>; else goto <D.23204>;
        <D.23203>:
        D.23205 = &MEM[(void *)"System" + 1B];
        D.23206 = *D.23205;
        D.23207 = (int) D.23206;
        D.23208 = __s2 + 1;
        D.23209 = *D.23208;
        D.23210 = (int) D.23209;
        __result = D.23207 - D.23210;
        if (__s2_len > 1) goto <D.23211>; else goto <D.23212>;
        <D.23211>:
        if (__result == 0) goto <D.23213>; else goto <D.23214>;
        <D.23213>:
        D.23215 = &MEM[(void *)"System" + 2B];
        D.23216 = *D.23215;
        D.23217 = (int) D.23216;
        D.23218 = __s2 + 2;
        D.23219 = *D.23218;
        D.23220 = (int) D.23219;
        __result = D.23217 - D.23220;
        if (__s2_len > 2) goto <D.23221>; else goto <D.23222>;
        <D.23221>:
        if (__result == 0) goto <D.23223>; else goto <D.23224>;
        <D.23223>:
        D.23225 = &MEM[(void *)"System" + 3B];
        D.23226 = *D.23225;
        D.23227 = (int) D.23226;
        D.23228 = __s2 + 3;
        D.23229 = *D.23228;
        D.23230 = (int) D.23229;
        __result = D.23227 - D.23230;
        <D.23224>:
        <D.23222>:
        <D.23214>:
        <D.23212>:
        <D.23204>:
        <D.23202>:
      }
      D.20526 = __result;
    }
    iftmp.54 = -D.20526;
    goto <D.23231>;
    <D.23195>:
    D.23088 = o->vtable;
    D.23089 = D.23088->klass;
    D.23232 = D.23089->name_space;
    iftmp.54 = __builtin_strcmp (D.23232, "System");
    <D.23231>:
    D.20527 = iftmp.54;
  }
  if (D.20527 == 0) goto <D.23233>; else goto <D.23234>;
  <D.23233>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23088 = o->vtable;
      D.23089 = D.23088->klass;
      __s2 = D.23089->name;
      D.23238 = "Object[]";
      D.23239 = MEM[(const unsigned char *)D.23238];
      D.23240 = (int) D.23239;
      D.23241 = *__s2;
      D.23242 = (int) D.23241;
      __result = D.23240 - D.23242;
      {
        if (__s2_len != 0) goto <D.23243>; else goto <D.23244>;
        <D.23243>:
        if (__result == 0) goto <D.23245>; else goto <D.23246>;
        <D.23245>:
        D.23247 = &MEM[(void *)"Object[]" + 1B];
        D.23248 = *D.23247;
        D.23249 = (int) D.23248;
        D.23250 = __s2 + 1;
        D.23251 = *D.23250;
        D.23252 = (int) D.23251;
        __result = D.23249 - D.23252;
        if (__s2_len > 1) goto <D.23253>; else goto <D.23254>;
        <D.23253>:
        if (__result == 0) goto <D.23255>; else goto <D.23256>;
        <D.23255>:
        D.23257 = &MEM[(void *)"Object[]" + 2B];
        D.23258 = *D.23257;
        D.23259 = (int) D.23258;
        D.23260 = __s2 + 2;
        D.23261 = *D.23260;
        D.23262 = (int) D.23261;
        __result = D.23259 - D.23262;
        if (__s2_len > 2) goto <D.23263>; else goto <D.23264>;
        <D.23263>:
        if (__result == 0) goto <D.23265>; else goto <D.23266>;
        <D.23265>:
        D.23267 = &MEM[(void *)"Object[]" + 3B];
        D.23268 = *D.23267;
        D.23269 = (int) D.23268;
        D.23270 = __s2 + 3;
        D.23271 = *D.23270;
        D.23272 = (int) D.23271;
        __result = D.23269 - D.23272;
        <D.23266>:
        <D.23264>:
        <D.23256>:
        <D.23254>:
        <D.23246>:
        <D.23244>:
      }
      D.20535 = __result;
    }
    iftmp.55 = -D.20535;
    goto <D.23273>;
    <D.23237>:
    D.23088 = o->vtable;
    D.23089 = D.23088->klass;
    D.23274 = D.23089->name;
    iftmp.55 = __builtin_strcmp (D.23274, "Object[]");
    <D.23273>:
    D.20536 = iftmp.55;
  }
  if (D.20536 == 0) goto <D.23275>; else goto <D.23276>;
  <D.23275>:
  D.23095 = 1;
  return D.23095;
  <D.23276>:
  <D.23234>:
  <D.23192>:
  <D.23150>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23110 = ref->vtable;
      D.23111 = D.23110->klass;
      __s2 = D.23111->name_space;
      D.23196 = "System";
      D.23197 = MEM[(const unsigned char *)D.23196];
      D.23198 = (int) D.23197;
      D.23280 = *__s2;
      D.23281 = (int) D.23280;
      __result = D.23198 - D.23281;
      {
        if (__s2_len != 0) goto <D.23282>; else goto <D.23283>;
        <D.23282>:
        if (__result == 0) goto <D.23284>; else goto <D.23285>;
        <D.23284>:
        D.23205 = &MEM[(void *)"System" + 1B];
        D.23206 = *D.23205;
        D.23207 = (int) D.23206;
        D.23286 = __s2 + 1;
        D.23287 = *D.23286;
        D.23288 = (int) D.23287;
        __result = D.23207 - D.23288;
        if (__s2_len > 1) goto <D.23289>; else goto <D.23290>;
        <D.23289>:
        if (__result == 0) goto <D.23291>; else goto <D.23292>;
        <D.23291>:
        D.23215 = &MEM[(void *)"System" + 2B];
        D.23216 = *D.23215;
        D.23217 = (int) D.23216;
        D.23293 = __s2 + 2;
        D.23294 = *D.23293;
        D.23295 = (int) D.23294;
        __result = D.23217 - D.23295;
        if (__s2_len > 2) goto <D.23296>; else goto <D.23297>;
        <D.23296>:
        if (__result == 0) goto <D.23298>; else goto <D.23299>;
        <D.23298>:
        D.23225 = &MEM[(void *)"System" + 3B];
        D.23226 = *D.23225;
        D.23227 = (int) D.23226;
        D.23300 = __s2 + 3;
        D.23301 = *D.23300;
        D.23302 = (int) D.23301;
        __result = D.23227 - D.23302;
        <D.23299>:
        <D.23297>:
        <D.23292>:
        <D.23290>:
        <D.23285>:
        <D.23283>:
      }
      D.20544 = __result;
    }
    iftmp.56 = -D.20544;
    goto <D.23303>;
    <D.23279>:
    D.23110 = ref->vtable;
    D.23111 = D.23110->klass;
    D.23148 = D.23111->name_space;
    iftmp.56 = __builtin_strcmp (D.23148, "System");
    <D.23303>:
    D.20545 = iftmp.56;
  }
  if (D.20545 == 0) goto <D.23304>; else goto <D.23305>;
  <D.23304>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23110 = ref->vtable;
      D.23111 = D.23110->klass;
      __s2 = D.23111->name;
      D.23309 = "Byte[]";
      D.23310 = MEM[(const unsigned char *)D.23309];
      D.23311 = (int) D.23310;
      D.23312 = *__s2;
      D.23313 = (int) D.23312;
      __result = D.23311 - D.23313;
      {
        if (__s2_len != 0) goto <D.23314>; else goto <D.23315>;
        <D.23314>:
        if (__result == 0) goto <D.23316>; else goto <D.23317>;
        <D.23316>:
        D.23318 = &MEM[(void *)"Byte[]" + 1B];
        D.23319 = *D.23318;
        D.23320 = (int) D.23319;
        D.23321 = __s2 + 1;
        D.23322 = *D.23321;
        D.23323 = (int) D.23322;
        __result = D.23320 - D.23323;
        if (__s2_len > 1) goto <D.23324>; else goto <D.23325>;
        <D.23324>:
        if (__result == 0) goto <D.23326>; else goto <D.23327>;
        <D.23326>:
        D.23328 = &MEM[(void *)"Byte[]" + 2B];
        D.23329 = *D.23328;
        D.23330 = (int) D.23329;
        D.23331 = __s2 + 2;
        D.23332 = *D.23331;
        D.23333 = (int) D.23332;
        __result = D.23330 - D.23333;
        if (__s2_len > 2) goto <D.23334>; else goto <D.23335>;
        <D.23334>:
        if (__result == 0) goto <D.23336>; else goto <D.23337>;
        <D.23336>:
        D.23338 = &MEM[(void *)"Byte[]" + 3B];
        D.23339 = *D.23338;
        D.23340 = (int) D.23339;
        D.23341 = __s2 + 3;
        D.23342 = *D.23341;
        D.23343 = (int) D.23342;
        __result = D.23340 - D.23343;
        <D.23337>:
        <D.23335>:
        <D.23327>:
        <D.23325>:
        <D.23317>:
        <D.23315>:
      }
      D.20553 = __result;
    }
    iftmp.57 = -D.20553;
    goto <D.23344>;
    <D.23308>:
    D.23110 = ref->vtable;
    D.23111 = D.23110->klass;
    D.23190 = D.23111->name;
    iftmp.57 = __builtin_strcmp (D.23190, "Byte[]");
    <D.23344>:
    D.20554 = iftmp.57;
  }
  if (D.20554 == 0) goto <D.23345>; else goto <D.23346>;
  <D.23345>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23088 = o->vtable;
      D.23089 = D.23088->klass;
      __s2 = D.23089->name_space;
      D.23350 = "System.IO";
      D.23351 = MEM[(const unsigned char *)D.23350];
      D.23352 = (int) D.23351;
      D.23353 = *__s2;
      D.23354 = (int) D.23353;
      __result = D.23352 - D.23354;
      {
        if (__s2_len != 0) goto <D.23355>; else goto <D.23356>;
        <D.23355>:
        if (__result == 0) goto <D.23357>; else goto <D.23358>;
        <D.23357>:
        D.23359 = &MEM[(void *)"System.IO" + 1B];
        D.23360 = *D.23359;
        D.23361 = (int) D.23360;
        D.23362 = __s2 + 1;
        D.23363 = *D.23362;
        D.23364 = (int) D.23363;
        __result = D.23361 - D.23364;
        if (__s2_len > 1) goto <D.23365>; else goto <D.23366>;
        <D.23365>:
        if (__result == 0) goto <D.23367>; else goto <D.23368>;
        <D.23367>:
        D.23369 = &MEM[(void *)"System.IO" + 2B];
        D.23370 = *D.23369;
        D.23371 = (int) D.23370;
        D.23372 = __s2 + 2;
        D.23373 = *D.23372;
        D.23374 = (int) D.23373;
        __result = D.23371 - D.23374;
        if (__s2_len > 2) goto <D.23375>; else goto <D.23376>;
        <D.23375>:
        if (__result == 0) goto <D.23377>; else goto <D.23378>;
        <D.23377>:
        D.23379 = &MEM[(void *)"System.IO" + 3B];
        D.23380 = *D.23379;
        D.23381 = (int) D.23380;
        D.23382 = __s2 + 3;
        D.23383 = *D.23382;
        D.23384 = (int) D.23383;
        __result = D.23381 - D.23384;
        <D.23378>:
        <D.23376>:
        <D.23368>:
        <D.23366>:
        <D.23358>:
        <D.23356>:
      }
      D.20562 = __result;
    }
    iftmp.58 = -D.20562;
    goto <D.23385>;
    <D.23349>:
    D.23088 = o->vtable;
    D.23089 = D.23088->klass;
    D.23232 = D.23089->name_space;
    iftmp.58 = __builtin_strcmp (D.23232, "System.IO");
    <D.23385>:
    D.20563 = iftmp.58;
  }
  if (D.20563 == 0) goto <D.23386>; else goto <D.23387>;
  <D.23386>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23088 = o->vtable;
      D.23089 = D.23088->klass;
      __s2 = D.23089->name;
      D.23391 = "MemoryStream";
      D.23392 = MEM[(const unsigned char *)D.23391];
      D.23393 = (int) D.23392;
      D.23394 = *__s2;
      D.23395 = (int) D.23394;
      __result = D.23393 - D.23395;
      {
        if (__s2_len != 0) goto <D.23396>; else goto <D.23397>;
        <D.23396>:
        if (__result == 0) goto <D.23398>; else goto <D.23399>;
        <D.23398>:
        D.23400 = &MEM[(void *)"MemoryStream" + 1B];
        D.23401 = *D.23400;
        D.23402 = (int) D.23401;
        D.23403 = __s2 + 1;
        D.23404 = *D.23403;
        D.23405 = (int) D.23404;
        __result = D.23402 - D.23405;
        if (__s2_len > 1) goto <D.23406>; else goto <D.23407>;
        <D.23406>:
        if (__result == 0) goto <D.23408>; else goto <D.23409>;
        <D.23408>:
        D.23410 = &MEM[(void *)"MemoryStream" + 2B];
        D.23411 = *D.23410;
        D.23412 = (int) D.23411;
        D.23413 = __s2 + 2;
        D.23414 = *D.23413;
        D.23415 = (int) D.23414;
        __result = D.23412 - D.23415;
        if (__s2_len > 2) goto <D.23416>; else goto <D.23417>;
        <D.23416>:
        if (__result == 0) goto <D.23418>; else goto <D.23419>;
        <D.23418>:
        D.23420 = &MEM[(void *)"MemoryStream" + 3B];
        D.23421 = *D.23420;
        D.23422 = (int) D.23421;
        D.23423 = __s2 + 3;
        D.23424 = *D.23423;
        D.23425 = (int) D.23424;
        __result = D.23422 - D.23425;
        <D.23419>:
        <D.23417>:
        <D.23409>:
        <D.23407>:
        <D.23399>:
        <D.23397>:
      }
      D.20571 = __result;
    }
    iftmp.59 = -D.20571;
    goto <D.23426>;
    <D.23390>:
    D.23088 = o->vtable;
    D.23089 = D.23088->klass;
    D.23274 = D.23089->name;
    iftmp.59 = __builtin_strcmp (D.23274, "MemoryStream");
    <D.23426>:
    D.20572 = iftmp.59;
  }
  if (D.20572 == 0) goto <D.23427>; else goto <D.23428>;
  <D.23427>:
  D.23095 = 1;
  return D.23095;
  <D.23428>:
  <D.23387>:
  <D.23346>:
  <D.23305>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23110 = ref->vtable;
      D.23111 = D.23110->klass;
      __s2 = D.23111->name_space;
      D.23432 = "System.Runtime.Remoting.Messaging";
      D.23433 = MEM[(const unsigned char *)D.23432];
      D.23434 = (int) D.23433;
      D.23435 = *__s2;
      D.23436 = (int) D.23435;
      __result = D.23434 - D.23436;
      {
        if (__s2_len != 0) goto <D.23437>; else goto <D.23438>;
        <D.23437>:
        if (__result == 0) goto <D.23439>; else goto <D.23440>;
        <D.23439>:
        D.23441 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 1B];
        D.23442 = *D.23441;
        D.23443 = (int) D.23442;
        D.23444 = __s2 + 1;
        D.23445 = *D.23444;
        D.23446 = (int) D.23445;
        __result = D.23443 - D.23446;
        if (__s2_len > 1) goto <D.23447>; else goto <D.23448>;
        <D.23447>:
        if (__result == 0) goto <D.23449>; else goto <D.23450>;
        <D.23449>:
        D.23451 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 2B];
        D.23452 = *D.23451;
        D.23453 = (int) D.23452;
        D.23454 = __s2 + 2;
        D.23455 = *D.23454;
        D.23456 = (int) D.23455;
        __result = D.23453 - D.23456;
        if (__s2_len > 2) goto <D.23457>; else goto <D.23458>;
        <D.23457>:
        if (__result == 0) goto <D.23459>; else goto <D.23460>;
        <D.23459>:
        D.23461 = &MEM[(void *)"System.Runtime.Remoting.Messaging" + 3B];
        D.23462 = *D.23461;
        D.23463 = (int) D.23462;
        D.23464 = __s2 + 3;
        D.23465 = *D.23464;
        D.23466 = (int) D.23465;
        __result = D.23463 - D.23466;
        <D.23460>:
        <D.23458>:
        <D.23450>:
        <D.23448>:
        <D.23440>:
        <D.23438>:
      }
      D.20580 = __result;
    }
    iftmp.60 = -D.20580;
    goto <D.23467>;
    <D.23431>:
    D.23110 = ref->vtable;
    D.23111 = D.23110->klass;
    D.23148 = D.23111->name_space;
    iftmp.60 = __builtin_strcmp (D.23148, "System.Runtime.Remoting.Messaging");
    <D.23467>:
    D.20581 = iftmp.60;
  }
  if (D.20581 == 0) goto <D.23468>; else goto <D.23469>;
  <D.23468>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23110 = ref->vtable;
      D.23111 = D.23110->klass;
      __s2 = D.23111->name;
      D.23473 = "AsyncResult";
      D.23474 = MEM[(const unsigned char *)D.23473];
      D.23475 = (int) D.23474;
      D.23476 = *__s2;
      D.23477 = (int) D.23476;
      __result = D.23475 - D.23477;
      {
        if (__s2_len != 0) goto <D.23478>; else goto <D.23479>;
        <D.23478>:
        if (__result == 0) goto <D.23480>; else goto <D.23481>;
        <D.23480>:
        D.23482 = &MEM[(void *)"AsyncResult" + 1B];
        D.23483 = *D.23482;
        D.23484 = (int) D.23483;
        D.23485 = __s2 + 1;
        D.23486 = *D.23485;
        D.23487 = (int) D.23486;
        __result = D.23484 - D.23487;
        if (__s2_len > 1) goto <D.23488>; else goto <D.23489>;
        <D.23488>:
        if (__result == 0) goto <D.23490>; else goto <D.23491>;
        <D.23490>:
        D.23492 = &MEM[(void *)"AsyncResult" + 2B];
        D.23493 = *D.23492;
        D.23494 = (int) D.23493;
        D.23495 = __s2 + 2;
        D.23496 = *D.23495;
        D.23497 = (int) D.23496;
        __result = D.23494 - D.23497;
        if (__s2_len > 2) goto <D.23498>; else goto <D.23499>;
        <D.23498>:
        if (__result == 0) goto <D.23500>; else goto <D.23501>;
        <D.23500>:
        D.23502 = &MEM[(void *)"AsyncResult" + 3B];
        D.23503 = *D.23502;
        D.23504 = (int) D.23503;
        D.23505 = __s2 + 3;
        D.23506 = *D.23505;
        D.23507 = (int) D.23506;
        __result = D.23504 - D.23507;
        <D.23501>:
        <D.23499>:
        <D.23491>:
        <D.23489>:
        <D.23481>:
        <D.23479>:
      }
      D.20589 = __result;
    }
    iftmp.61 = -D.20589;
    goto <D.23508>;
    <D.23472>:
    D.23110 = ref->vtable;
    D.23111 = D.23110->klass;
    D.23190 = D.23111->name;
    iftmp.61 = __builtin_strcmp (D.23190, "AsyncResult");
    <D.23508>:
    D.20590 = iftmp.61;
  }
  if (D.20590 == 0) goto <D.23509>; else goto <D.23510>;
  <D.23509>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23088 = o->vtable;
      D.23089 = D.23088->klass;
      __s2 = D.23089->name_space;
      D.23196 = "System";
      D.23197 = MEM[(const unsigned char *)D.23196];
      D.23198 = (int) D.23197;
      D.23514 = *__s2;
      D.23515 = (int) D.23514;
      __result = D.23198 - D.23515;
      {
        if (__s2_len != 0) goto <D.23516>; else goto <D.23517>;
        <D.23516>:
        if (__result == 0) goto <D.23518>; else goto <D.23519>;
        <D.23518>:
        D.23205 = &MEM[(void *)"System" + 1B];
        D.23206 = *D.23205;
        D.23207 = (int) D.23206;
        D.23520 = __s2 + 1;
        D.23521 = *D.23520;
        D.23522 = (int) D.23521;
        __result = D.23207 - D.23522;
        if (__s2_len > 1) goto <D.23523>; else goto <D.23524>;
        <D.23523>:
        if (__result == 0) goto <D.23525>; else goto <D.23526>;
        <D.23525>:
        D.23215 = &MEM[(void *)"System" + 2B];
        D.23216 = *D.23215;
        D.23217 = (int) D.23216;
        D.23527 = __s2 + 2;
        D.23528 = *D.23527;
        D.23529 = (int) D.23528;
        __result = D.23217 - D.23529;
        if (__s2_len > 2) goto <D.23530>; else goto <D.23531>;
        <D.23530>:
        if (__result == 0) goto <D.23532>; else goto <D.23533>;
        <D.23532>:
        D.23225 = &MEM[(void *)"System" + 3B];
        D.23226 = *D.23225;
        D.23227 = (int) D.23226;
        D.23534 = __s2 + 3;
        D.23535 = *D.23534;
        D.23536 = (int) D.23535;
        __result = D.23227 - D.23536;
        <D.23533>:
        <D.23531>:
        <D.23526>:
        <D.23524>:
        <D.23519>:
        <D.23517>:
      }
      D.20598 = __result;
    }
    iftmp.62 = -D.20598;
    goto <D.23537>;
    <D.23513>:
    D.23088 = o->vtable;
    D.23089 = D.23088->klass;
    D.23232 = D.23089->name_space;
    iftmp.62 = __builtin_strcmp (D.23232, "System");
    <D.23537>:
    D.20599 = iftmp.62;
  }
  if (D.20599 == 0) goto <D.23538>; else goto <D.23539>;
  <D.23538>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      D.23088 = o->vtable;
      D.23089 = D.23088->klass;
      __s2 = D.23089->name;
      D.23238 = "Object[]";
      D.23239 = MEM[(const unsigned char *)D.23238];
      D.23240 = (int) D.23239;
      D.23543 = *__s2;
      D.23544 = (int) D.23543;
      __result = D.23240 - D.23544;
      {
        if (__s2_len != 0) goto <D.23545>; else goto <D.23546>;
        <D.23545>:
        if (__result == 0) goto <D.23547>; else goto <D.23548>;
        <D.23547>:
        D.23247 = &MEM[(void *)"Object[]" + 1B];
        D.23248 = *D.23247;
        D.23249 = (int) D.23248;
        D.23549 = __s2 + 1;
        D.23550 = *D.23549;
        D.23551 = (int) D.23550;
        __result = D.23249 - D.23551;
        if (__s2_len > 1) goto <D.23552>; else goto <D.23553>;
        <D.23552>:
        if (__result == 0) goto <D.23554>; else goto <D.23555>;
        <D.23554>:
        D.23257 = &MEM[(void *)"Object[]" + 2B];
        D.23258 = *D.23257;
        D.23259 = (int) D.23258;
        D.23556 = __s2 + 2;
        D.23557 = *D.23556;
        D.23558 = (int) D.23557;
        __result = D.23259 - D.23558;
        if (__s2_len > 2) goto <D.23559>; else goto <D.23560>;
        <D.23559>:
        if (__result == 0) goto <D.23561>; else goto <D.23562>;
        <D.23561>:
        D.23267 = &MEM[(void *)"Object[]" + 3B];
        D.23268 = *D.23267;
        D.23269 = (int) D.23268;
        D.23563 = __s2 + 3;
        D.23564 = *D.23563;
        D.23565 = (int) D.23564;
        __result = D.23269 - D.23565;
        <D.23562>:
        <D.23560>:
        <D.23555>:
        <D.23553>:
        <D.23548>:
        <D.23546>:
      }
      D.20607 = __result;
    }
    iftmp.63 = -D.20607;
    goto <D.23566>;
    <D.23542>:
    D.23088 = o->vtable;
    D.23089 = D.23088->klass;
    D.23274 = D.23089->name;
    iftmp.63 = __builtin_strcmp (D.23274, "Object[]");
    <D.23566>:
    D.20608 = iftmp.63;
  }
  if (D.20608 == 0) goto <D.23567>; else goto <D.23568>;
  <D.23567>:
  D.23569 = mono_thread_pool_is_queue_array (o);
  if (D.23569 != 0) goto <D.23570>; else goto <D.23571>;
  <D.23570>:
  D.23095 = 1;
  return D.23095;
  <D.23571>:
  <D.23568>:
  <D.23539>:
  <D.23510>:
  <D.23469>:
  D.23095 = 0;
  return D.23095;
}


mono_class_has_parent_fast (struct MonoClass * klass, struct MonoClass * parent)
{
  gboolean D.23573;
  int iftmp.64;
  short unsigned int D.23577;
  short unsigned int D.23578;
  struct MonoClass * * D.23580;
  long unsigned int D.23581;
  long unsigned int D.23582;
  sizetype D.23583;
  struct MonoClass * * D.23584;
  struct MonoClass * D.23585;

  D.23577 = klass->idepth;
  D.23578 = parent->idepth;
  if (D.23577 >= D.23578) goto <D.23579>; else goto <D.23575>;
  <D.23579>:
  D.23580 = klass->supertypes;
  D.23578 = parent->idepth;
  D.23581 = (long unsigned int) D.23578;
  D.23582 = D.23581 * 8;
  D.23583 = D.23582 + 18446744073709551608;
  D.23584 = D.23580 + D.23583;
  D.23585 = *D.23584;
  if (D.23585 == parent) goto <D.23586>; else goto <D.23575>;
  <D.23586>:
  iftmp.64 = 1;
  goto <D.23576>;
  <D.23575>:
  iftmp.64 = 0;
  <D.23576>:
  D.23573 = iftmp.64;
  return D.23573;
}


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

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

    object = current->array;
    if (object != 0B) goto <D.23590>; else goto <D.23588>;
    <D.23590>:
    D.23591 = object->vtable;
    if (D.23591 == 0B) goto <D.23592>; else goto <D.23588>;
    <D.23592>:
    {
      struct EphemeronLinkNode * tmp;

      tmp = current;
      if (prev != 0B) goto <D.23593>; else goto <D.23594>;
      <D.23593>:
      ephemeron_list.65 = current->next;
      prev->next = ephemeron_list.65;
      goto <D.23596>;
      <D.23594>:
      ephemeron_list.65 = current->next;
      ephemeron_list = ephemeron_list.65;
      <D.23596>:
      current = current->next;
      sgen_free_internal (tmp, 18);
    }
    goto <D.23589>;
    <D.23588>:
    prev = current;
    current = current->next;
    <D.23589>:
  }
  <D.21681>:
  if (current != 0B) goto <D.21680>; else goto <D.21682>;
  <D.21682>:
}


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

  process_object_for_domain_clearing (obj, domain);
  remove = need_remove_object_for_domain (obj, domain);
  if (remove != 0) goto <D.23597>; else goto <D.23598>;
  <D.23597>:
  D.23599 = MEM[(struct MonoObject *)obj].synchronisation;
  if (D.23599 != 0B) goto <D.23600>; else goto <D.23601>;
  <D.23600>:
  {
    void * * dislink;

    dislink = mono_monitor_get_object_monitor_weak_link (obj);
    if (dislink != 0B) goto <D.23602>; else goto <D.23603>;
    <D.23602>:
    sgen_register_disappearing_link (0B, dislink, 0, 1);
    <D.23603>:
  }
  <D.23601>:
  <D.23598>:
  D.23604 = remove;
  return D.23604;
}


process_object_for_domain_clearing (char * start, struct MonoDomain * domain)
{
  long unsigned int D.23606;
  long unsigned int D.23607;
  struct MonoClass * D.23608;
  struct MonoClass * D.23609;
  struct MonoVTable * D.23612;
  struct MonoDomain * D.23613;
  struct MonoDomain * D.23614;
  _Bool D.23615;
  long int D.23616;
  long int D.23617;
  struct MonoClass * D.23620;
  int D.23621;
  long unsigned int D.23628;
  long unsigned int D.23629;
  struct MonoVTable * D.23631;
  struct MonoDomain * D.23632;
  struct FILE * gc_debug_file.66;
  struct GCVTable * vt;

  D.23606 = MEM[(mword *)start];
  D.23607 = D.23606 & 18446744073709551612;
  vt = (struct GCVTable *) D.23607;
  D.23608 = vt->klass;
  D.23609 = mono_defaults.internal_thread_class;
  if (D.23608 == D.23609) goto <D.23610>; else goto <D.23611>;
  <D.23610>:
  D.23612 = MEM[(struct MonoObject *)start].vtable;
  D.23613 = D.23612->domain;
  D.23614 = mono_get_root_domain ();
  D.23615 = D.23613 != D.23614;
  D.23616 = (long int) D.23615;
  D.23617 = __builtin_expect (D.23616, 0);
  if (D.23617 != 0) goto <D.23618>; else goto <D.23619>;
  <D.23618>:
  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.23619>:
  <D.23611>:
  D.23608 = vt->klass;
  D.23620 = mono_defaults.real_proxy_class;
  D.23621 = mono_class_has_parent_fast (D.23608, D.23620);
  if (D.23621 != 0) goto <D.23622>; else goto <D.23623>;
  <D.23622>:
  {
    struct MonoObject * server;

    server = MEM[(struct MonoRealProxy *)start].unwrapped_server;
    if (server != 0B) goto <D.23626>; else goto <D.23627>;
    <D.23626>:
    D.23628 = MEM[(mword *)server];
    D.23629 = D.23628 & 18446744073709551612;
    if (D.23629 == 0) goto <D.23624>; else goto <D.23630>;
    <D.23630>:
    D.23631 = server->vtable;
    D.23632 = D.23631->domain;
    if (D.23632 == domain) goto <D.23624>; else goto <D.23625>;
    <D.23624>:
    if (0 != 0) goto <D.23633>; else goto <D.23634>;
    <D.23633>:
    gc_debug_file.66 = gc_debug_file;
    fprintf (gc_debug_file.66, "Cleaning up remote pointer in %p to object %p\n", start, server);
    gc_debug_file.66 = gc_debug_file;
    fflush (gc_debug_file.66);
    <D.23634>:
    MEM[(struct MonoRealProxy *)start].unwrapped_server = 0B;
    <D.23625>:
    <D.23627>:
  }
  <D.23623>:
}


need_remove_object_for_domain (char * start, struct MonoDomain * domain)
{
  struct MonoVTable * D.23636;
  struct MonoDomain * D.23637;
  struct FILE * gc_debug_file.67;
  gboolean D.23643;

  D.23636 = MEM[(struct MonoObject *)start].vtable;
  D.23637 = D.23636->domain;
  if (D.23637 == domain) goto <D.23638>; else goto <D.23639>;
  <D.23638>:
  if (0 != 0) goto <D.23640>; else goto <D.23641>;
  <D.23640>:
  gc_debug_file.67 = gc_debug_file;
  fprintf (gc_debug_file.67, "Need to cleanup object %p\n", start);
  gc_debug_file.67 = gc_debug_file;
  fflush (gc_debug_file.67);
  <D.23641>:
  D.23643 = 1;
  return D.23643;
  <D.23639>:
  D.23643 = 0;
  return D.23643;
}


sgen_add_to_global_remset (void * ptr, void * obj)
{
  int D.23645;
  _Bool D.23646;
  long int D.23647;
  long int D.23648;
  int D.23651;
  int current_collection_generation.68;
  _Bool D.23655;
  long int D.23656;
  long int D.23657;
  int D.23663;
  _Bool D.23664;
  long int D.23665;
  long int D.23666;
  long unsigned int D.23669;
  long unsigned int D.23670;
  int iftmp.69;
  int D.23676;
  int D.23678;
  _Bool D.23680;
  long int D.23681;
  long int D.23682;
  int D.23686;
  void (*<T124a>) (void *) D.23689;
  int do_pin_stats.70;
  _Bool D.23691;
  long int D.23692;
  long int D.23693;
  struct FILE * gc_debug_file.71;

  D.23645 = sgen_ptr_in_nursery (obj);
  D.23646 = D.23645 == 0;
  D.23647 = (long int) D.23646;
  D.23648 = __builtin_expect (D.23647, 0);
  if (D.23648 != 0) goto <D.23649>; else goto <D.23650>;
  <D.23649>:
  monoeg_g_log (0B, 4, "Target pointer of global remset must be in the nursery");
  <D.21020>:
  goto <D.21020>;
  <D.23650>:
  D.23651 = major_collector.is_concurrent;
  if (D.23651 == 0) goto <D.23652>; else goto <D.23653>;
  <D.23652>:
  current_collection_generation.68 = current_collection_generation;
  D.23655 = current_collection_generation.68 == -1;
  D.23656 = (long int) D.23655;
  D.23657 = __builtin_expect (D.23656, 0);
  if (D.23657 != 0) goto <D.23658>; else goto <D.23659>;
  <D.23658>:
  monoeg_g_log (0B, 4, "Global remsets can only be added during collections");
  <D.21021>:
  goto <D.21021>;
  <D.23659>:
  goto <D.23660>;
  <D.23653>:
  current_collection_generation.68 = current_collection_generation;
  if (current_collection_generation.68 == -1) goto <D.23661>; else goto <D.23662>;
  <D.23661>:
  D.23663 = sgen_concurrent_collection_in_progress ();
  D.23664 = D.23663 == 0;
  D.23665 = (long int) D.23664;
  D.23666 = __builtin_expect (D.23665, 0);
  if (D.23666 != 0) goto <D.23667>; else goto <D.23668>;
  <D.23667>:
  monoeg_g_log (0B, 4, "Global remsets outside of collection pauses can only be added by the concurrent collector");
  <D.21022>:
  goto <D.21022>;
  <D.23668>:
  <D.23662>:
  <D.23660>:
  D.23669 = MEM[(mword *)obj];
  D.23670 = D.23669 & 2;
  if (D.23670 == 0) goto <D.23671>; else goto <D.23672>;
  <D.23671>:
  D.23676 = sgen_minor_collector.is_split;
  if (D.23676 == 0) goto <D.23677>; else goto <D.23674>;
  <D.23677>:
  D.23678 = sgen_concurrent_collection_in_progress ();
  if (D.23678 == 0) goto <D.23679>; else goto <D.23674>;
  <D.23679>:
  iftmp.69 = 1;
  goto <D.23675>;
  <D.23674>:
  iftmp.69 = 0;
  <D.23675>:
  D.23680 = iftmp.69 != 0;
  D.23681 = (long int) D.23680;
  D.23682 = __builtin_expect (D.23681, 0);
  if (D.23682 != 0) goto <D.23683>; else goto <D.23684>;
  <D.23683>:
  monoeg_g_log (0B, 4, "Non-pinned objects can only remain in nursery if it is a split nursery");
  <D.21023>:
  goto <D.21023>;
  <D.23684>:
  goto <D.23685>;
  <D.23672>:
  D.23686 = sgen_cement_lookup_or_register (obj);
  if (D.23686 != 0) goto <D.23687>; else goto <D.23688>;
  <D.23687>:
  return;
  <D.23688>:
  <D.23685>:
  D.23689 = remset.record_pointer;
  D.23689 (ptr);
  do_pin_stats.70 = do_pin_stats;
  D.23691 = do_pin_stats.70 != 0;
  D.23692 = (long int) D.23691;
  D.23693 = __builtin_expect (D.23692, 0);
  if (D.23693 != 0) goto <D.23694>; else goto <D.23695>;
  <D.23694>:
  sgen_pin_stats_register_global_remset (obj);
  <D.23695>:
  if (0 != 0) goto <D.23696>; else goto <D.23697>;
  <D.23696>:
  gc_debug_file.71 = gc_debug_file;
  fprintf (gc_debug_file.71, "Adding global remset for %p\n", ptr);
  gc_debug_file.71 = gc_debug_file;
  fflush (gc_debug_file.71);
  <D.23697>:
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.23700;
  int sgen_nursery_bits.72;
  int D.23702;
  int D.23703;
  long unsigned int D.23704;
  long unsigned int p.73;
  long unsigned int D.23706;
  char * sgen_nursery_start.74;
  long unsigned int sgen_nursery_start.75;
  _Bool D.23709;

  sgen_nursery_bits.72 = sgen_nursery_bits;
  D.23702 = 1 << sgen_nursery_bits.72;
  D.23703 = -D.23702;
  D.23704 = (long unsigned int) D.23703;
  p.73 = (long unsigned int) p;
  D.23706 = D.23704 & p.73;
  sgen_nursery_start.74 = sgen_nursery_start;
  sgen_nursery_start.75 = (long unsigned int) sgen_nursery_start.74;
  D.23709 = D.23706 == sgen_nursery_start.75;
  D.23700 = (gboolean) D.23709;
  return D.23700;
}


sgen_drain_gray_stack (int max_objs, struct ScanCopyContext ctx)
{
  struct GrayQueueSection * D.23713;
  int D.23717;
  _Bool D.23718;
  long int D.23719;
  long int D.23720;
  int D.23724;
  gboolean D.23727;
  struct FILE * gc_debug_file.76;
  const char * D.23731;
  const char * D.23742;
  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.23711>; else goto <D.23712>;
  <D.23711>:
  <D.21031>:
  D.23713 = queue->first;
  if (D.23713 == 0B) goto <D.23714>; else goto <D.23715>;
  <D.23714>:
  obj = 0B;
  goto <D.23716>;
  <D.23715>:
  D.23713 = queue->first;
  D.23717 = D.23713->end;
  D.23718 = D.23717 == 1;
  D.23719 = (long int) D.23718;
  D.23720 = __builtin_expect (D.23719, 0);
  if (D.23720 != 0) goto <D.23721>; else goto <D.23722>;
  <D.23721>:
  obj = sgen_gray_object_dequeue (queue);
  goto <D.23723>;
  <D.23722>:
  D.23713 = queue->first;
  D.23713 = queue->first;
  D.23717 = D.23713->end;
  D.23724 = D.23717 + -1;
  D.23713->end = D.23724;
  D.23717 = D.23713->end;
  obj = D.23713->objects[D.23717];
  <D.23723>:
  <D.23716>:
  if (obj == 0B) goto <D.23725>; else goto <D.23726>;
  <D.23725>:
  D.23727 = 1;
  return D.23727;
  <D.23726>:
  if (0 != 0) goto <D.23728>; else goto <D.23729>;
  <D.23728>:
  gc_debug_file.76 = gc_debug_file;
  D.23731 = safe_name (obj);
  fprintf (gc_debug_file.76, "Precise gray object scan %p (%s)\n", obj, D.23731);
  gc_debug_file.76 = gc_debug_file;
  fflush (gc_debug_file.76);
  <D.23729>:
  scan_func (obj, queue);
  goto <D.21031>;
  <D.23712>:
  {
    int i;

    <D.21036>:
    i = 0;
    goto <D.21034>;
    <D.21033>:
    D.23713 = queue->first;
    if (D.23713 == 0B) goto <D.23732>; else goto <D.23733>;
    <D.23732>:
    obj = 0B;
    goto <D.23734>;
    <D.23733>:
    D.23713 = queue->first;
    D.23717 = D.23713->end;
    D.23718 = D.23717 == 1;
    D.23719 = (long int) D.23718;
    D.23720 = __builtin_expect (D.23719, 0);
    if (D.23720 != 0) goto <D.23735>; else goto <D.23736>;
    <D.23735>:
    obj = sgen_gray_object_dequeue (queue);
    goto <D.23737>;
    <D.23736>:
    D.23713 = queue->first;
    D.23713 = queue->first;
    D.23717 = D.23713->end;
    D.23724 = D.23717 + -1;
    D.23713->end = D.23724;
    D.23717 = D.23713->end;
    obj = D.23713->objects[D.23717];
    <D.23737>:
    <D.23734>:
    if (obj == 0B) goto <D.23738>; else goto <D.23739>;
    <D.23738>:
    D.23727 = 1;
    return D.23727;
    <D.23739>:
    if (0 != 0) goto <D.23740>; else goto <D.23741>;
    <D.23740>:
    gc_debug_file.76 = gc_debug_file;
    D.23742 = safe_name (obj);
    fprintf (gc_debug_file.76, "Precise gray object scan %p (%s)\n", obj, D.23742);
    gc_debug_file.76 = gc_debug_file;
    fflush (gc_debug_file.76);
    <D.23741>:
    scan_func (obj, queue);
    i = i + 1;
    <D.21034>:
    if (i != max_objs) goto <D.21033>; else goto <D.21035>;
    <D.21035>:
    if (max_objs < 0) goto <D.21036>; else goto <D.21037>;
    <D.21037>:
    D.23727 = 0;
    return D.23727;
  }
}


sgen_pin_objects_in_section (struct GCMemSection * section, struct ScanCopyContext ctx)
{
  long unsigned int D.23746;
  long unsigned int D.23747;
  void * * D.23748;
  char * D.23749;
  char * D.23750;
  int num_entries;

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

    start = section->pin_queue_start;
    D.23746 = (long unsigned int) num_entries;
    D.23747 = D.23746 * 8;
    D.23748 = start + D.23747;
    D.23749 = section->data;
    D.23750 = section->next_data;
    reduced_to = pin_objects_from_addresses (section, start, D.23748, D.23749, D.23750, ctx);
    section->pin_queue_num_entries = reduced_to;
    if (reduced_to == 0) goto <D.23751>; else goto <D.23752>;
    <D.23751>:
    section->pin_queue_start = 0B;
    <D.23752>:
  }
  <D.23745>:
}


pin_objects_from_addresses (struct GCMemSection * section, void * * start, void * * end, void * start_nursery, void * end_nursery, struct ScanCopyContext ctx)
{
  struct FILE * gc_debug_file.77;
  char * D.23764;
  long int addr.78;
  char * D.23768;
  long int D.23769;
  long int D.23770;
  long int D.23771;
  unsigned int idx.79;
  unsigned int D.23773;
  _Bool D.23774;
  long int D.23775;
  long int D.23776;
  char * * D.23779;
  long unsigned int D.23780;
  long unsigned int D.23781;
  char * * D.23782;
  void * D.23794;
  long unsigned int search_start.80;
  long unsigned int D.23798;
  long unsigned int D.23799;
  unsigned int D.23800;
  unsigned int D.23801;
  long unsigned int D.23802;
  struct MonoThreadsSync * D.23803;
  const char * D.23809;
  const char * D.23819;
  long unsigned int D.23820;
  long unsigned int D.23821;
  int iftmp.81;
  struct GrayQueueSection * D.23826;
  int D.23828;
  _Bool D.23829;
  long int D.23830;
  long int D.23831;
  int D.23835;
  int D.23836;
  int do_pin_stats.82;
  _Bool D.23838;
  long int D.23839;
  long int D.23840;
  long unsigned int D.23843;
  long unsigned int D.23844;
  void * * D.23845;
  <unnamed type> D.23846;
  unsigned int D.23847;
  void * * D.23850;
  void * D.23851;
  long long int D.23852;
  long long int stat_pinned_objects.83;
  long long int stat_pinned_objects.84;
  int D.23855;
  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.21056>;
  <D.21063>:
  addr = *start;
  if (addr != last) goto <D.23753>; else goto <D.23754>;
  <D.23753>:
  if (addr >= start_nursery) goto <D.23755>; else goto <D.23756>;
  <D.23755>:
  if (addr < end_nursery) goto <D.23757>; else goto <D.23758>;
  <D.23757>:
  if (0 != 0) goto <D.23759>; else goto <D.23760>;
  <D.23759>:
  gc_debug_file.77 = gc_debug_file;
  fprintf (gc_debug_file.77, "Considering pinning addr %p\n", addr);
  gc_debug_file.77 = gc_debug_file;
  fflush (gc_debug_file.77);
  <D.23760>:
  if (addr >= last_obj) goto <D.23762>; else goto <D.23763>;
  <D.23762>:
  D.23764 = last_obj + last_obj_size;
  if (D.23764 > addr) goto <D.23765>; else goto <D.23766>;
  <D.23765>:
  start = start + 8;
  // predicted unlikely by continue predictor.
  goto <D.21056>;
  <D.23766>:
  <D.23763>:
  addr.78 = (long int) addr;
  D.23768 = section->data;
  D.23769 = (long int) D.23768;
  D.23770 = addr.78 - D.23769;
  D.23771 = D.23770 / 8192;
  idx = (int) D.23771;
  idx.79 = (unsigned int) idx;
  D.23773 = section->num_scan_start;
  D.23774 = idx.79 >= D.23773;
  D.23775 = (long int) D.23774;
  D.23776 = __builtin_expect (D.23775, 0);
  if (D.23776 != 0) goto <D.23777>; else goto <D.23778>;
  <D.23777>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1246, "idx < section->num_scan_start");
  <D.23778>:
  D.23779 = section->scan_starts;
  D.23780 = (long unsigned int) idx;
  D.23781 = D.23780 * 8;
  D.23782 = D.23779 + D.23781;
  search_start = *D.23782;
  if (search_start == 0B) goto <D.23783>; else goto <D.23785>;
  <D.23785>:
  if (search_start > addr) goto <D.23783>; else goto <D.23784>;
  <D.23783>:
  goto <D.21059>;
  <D.21058>:
  idx = idx + -1;
  D.23779 = section->scan_starts;
  D.23780 = (long unsigned int) idx;
  D.23781 = D.23780 * 8;
  D.23782 = D.23779 + D.23781;
  search_start = *D.23782;
  if (search_start != 0B) goto <D.23786>; else goto <D.23787>;
  <D.23786>:
  if (search_start <= addr) goto <D.21057>; else goto <D.23788>;
  <D.23788>:
  <D.23787>:
  <D.21059>:
  if (idx != 0) goto <D.21058>; else goto <D.21057>;
  <D.21057>:
  if (search_start == 0B) goto <D.23789>; else goto <D.23791>;
  <D.23791>:
  if (search_start > addr) goto <D.23789>; else goto <D.23790>;
  <D.23789>:
  search_start = start_nursery;
  <D.23790>:
  <D.23784>:
  if (search_start < last_obj) goto <D.23792>; else goto <D.23793>;
  <D.23792>:
  search_start = last_obj + last_obj_size;
  <D.23793>:
  <D.21062>:
  D.23794 = MEM[(void * *)search_start];
  if (D.23794 == 0B) goto <D.23795>; else goto <D.23796>;
  <D.23795>:
  search_start.80 = (long unsigned int) search_start;
  D.23798 = search_start.80 + 15;
  D.23799 = D.23798 & 18446744073709551608;
  search_start = (void *) D.23799;
  // predicted unlikely by continue predictor.
  goto <D.21060>;
  <D.23796>:
  last_obj = search_start;
  D.23800 = sgen_safe_object_get_size (search_start);
  D.23801 = D.23800 + 7;
  D.23802 = (long unsigned int) D.23801;
  last_obj_size = D.23802 & 4294967288;
  D.23803 = MEM[(struct MonoObject *)last_obj].synchronisation;
  if (D.23803 == -1B) goto <D.23804>; else goto <D.23805>;
  <D.23804>:
  goto <D.23806>;
  <D.23805>:
  if (0 != 0) goto <D.23807>; else goto <D.23808>;
  <D.23807>:
  gc_debug_file.77 = gc_debug_file;
  D.23809 = safe_name (last_obj);
  fprintf (gc_debug_file.77, "Pinned try match %p (%s), size %zd\n", last_obj, D.23809, last_obj_size);
  gc_debug_file.77 = gc_debug_file;
  fflush (gc_debug_file.77);
  <D.23808>:
  if (addr >= search_start) goto <D.23810>; else goto <D.23811>;
  <D.23810>:
  D.23764 = last_obj + last_obj_size;
  if (D.23764 > addr) goto <D.23812>; else goto <D.23813>;
  <D.23812>:
  if (scan_func != 0B) goto <D.23814>; else goto <D.23815>;
  <D.23814>:
  scan_func (search_start, queue);
  goto <D.23816>;
  <D.23815>:
  if (0 != 0) goto <D.23817>; else goto <D.23818>;
  <D.23817>:
  gc_debug_file.77 = gc_debug_file;
  D.23794 = MEM[(void * *)search_start];
  D.23819 = safe_name (search_start);
  fprintf (gc_debug_file.77, "Pinned object %p, vtable %p (%s), count %d\n\n", search_start, D.23794, D.23819, count);
  gc_debug_file.77 = gc_debug_file;
  fflush (gc_debug_file.77);
  <D.23818>:
  D.23820 = MEM[(mword *)search_start];
  D.23821 = D.23820 | 2;
  MEM[(mword *)search_start] = D.23821;
  D.23826 = queue->first;
  if (D.23826 == 0B) goto <D.23823>; else goto <D.23827>;
  <D.23827>:
  D.23826 = queue->first;
  D.23828 = D.23826->end;
  if (D.23828 == 125) goto <D.23823>; else goto <D.23824>;
  <D.23823>:
  iftmp.81 = 1;
  goto <D.23825>;
  <D.23824>:
  iftmp.81 = 0;
  <D.23825>:
  D.23829 = iftmp.81 != 0;
  D.23830 = (long int) D.23829;
  D.23831 = __builtin_expect (D.23830, 0);
  if (D.23831 != 0) goto <D.23832>; else goto <D.23833>;
  <D.23832>:
  sgen_gray_object_enqueue (queue, search_start);
  goto <D.23834>;
  <D.23833>:
  D.23826 = queue->first;
  D.23826 = queue->first;
  D.23828 = D.23826->end;
  D.23835 = D.23828;
  D.23836 = D.23835 + 1;
  D.23826->end = D.23836;
  D.23826->objects[D.23835] = search_start;
  <D.23834>:
  __builtin_prefetch (search_start);
  do_pin_stats.82 = do_pin_stats;
  D.23838 = do_pin_stats.82 != 0;
  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>:
  sgen_pin_stats_register_object (search_start, last_obj_size);
  <D.23842>:
  D.23843 = (long unsigned int) count;
  D.23844 = D.23843 * 8;
  D.23845 = definitely_pinned + D.23844;
  *D.23845 = search_start;
  count = count + 1;
  <D.23816>:
  goto <D.21061>;
  <D.23813>:
  <D.23811>:
  <D.23806>:
  search_start = search_start + last_obj_size;
  <D.21060>:
  if (search_start <= addr) goto <D.21062>; else goto <D.21061>;
  <D.21061>:
  last = addr;
  <D.23758>:
  <D.23756>:
  <D.23754>:
  start = start + 8;
  <D.21056>:
  if (start < end) goto <D.21063>; else goto <D.21064>;
  <D.21064>:
  D.23846 = mono_profiler_get_events ();
  D.23847 = D.23846 & 1048576;
  if (D.23847 != 0) goto <D.23848>; else goto <D.23849>;
  <D.23848>:
  {
    struct GCRootReport report;

    try
      {
        report.count = 0;
        idx = 0;
        goto <D.21067>;
        <D.21066>:
        D.23780 = (long unsigned int) idx;
        D.23781 = D.23780 * 8;
        D.23850 = definitely_pinned + D.23781;
        D.23851 = *D.23850;
        add_profile_gc_root (&report, D.23851, 260, 0);
        idx = idx + 1;
        <D.21067>:
        if (idx < count) goto <D.21066>; else goto <D.21068>;
        <D.21068>:
        notify_gc_roots (&report);
      }
    finally
      {
        report = {CLOBBER};
      }
  }
  <D.23849>:
  D.23852 = (long long int) count;
  stat_pinned_objects.83 = stat_pinned_objects;
  stat_pinned_objects.84 = D.23852 + stat_pinned_objects.83;
  stat_pinned_objects = stat_pinned_objects.84;
  D.23855 = count;
  return D.23855;
}


add_profile_gc_root (struct GCRootReport * report, void * object, int rtype, uintptr_t extra_info)
{
  int D.23857;
  int D.23860;
  int D.23861;
  long unsigned int D.23862;
  long unsigned int D.23863;
  struct MonoVTable * D.23864;
  struct MonoClass * D.23865;
  long unsigned int D.23866;

  D.23857 = report->count;
  if (D.23857 == 32) goto <D.23858>; else goto <D.23859>;
  <D.23858>:
  notify_gc_roots (report);
  <D.23859>:
  D.23857 = report->count;
  report->objects[D.23857] = object;
  D.23857 = report->count;
  report->root_types[D.23857] = rtype;
  D.23857 = report->count;
  D.23860 = D.23857;
  D.23861 = D.23860 + 1;
  report->count = D.23861;
  D.23862 = MEM[(mword *)object];
  D.23863 = D.23862 & 18446744073709551612;
  D.23864 = (struct MonoVTable *) D.23863;
  D.23865 = D.23864->klass;
  D.23866 = (long unsigned int) D.23865;
  report->extra_info[D.23860] = D.23866;
}


notify_gc_roots (struct GCRootReport * report)
{
  int D.23867;
  void *[32] * D.23870;
  int[32] * D.23871;
  uintptr_t[32] * D.23872;

  D.23867 = report->count;
  if (D.23867 == 0) goto <D.23868>; else goto <D.23869>;
  <D.23868>:
  return;
  <D.23869>:
  D.23867 = report->count;
  D.23870 = &report->objects;
  D.23871 = &report->root_types;
  D.23872 = &report->extra_info;
  mono_profiler_gc_roots (D.23867, D.23870, D.23871, D.23872);
  report->count = 0;
}


sgen_pin_object (void * object, struct GrayQueue * queue)
{
  int concurrent_collection_in_progress.85;
  _Bool D.23875;
  long int D.23876;
  long int D.23877;
  int D.23880;
  long unsigned int objects_pinned.86;
  long unsigned int objects_pinned.87;
  long unsigned int D.23886;
  long unsigned int D.23887;
  int do_pin_stats.88;
  _Bool D.23889;
  long int D.23890;
  long int D.23891;
  unsigned int D.23894;
  long unsigned int D.23895;
  int iftmp.89;
  struct GrayQueueSection * D.23900;
  int D.23902;
  _Bool D.23903;
  long int D.23904;
  long int D.23905;
  int D.23909;
  int D.23910;

  concurrent_collection_in_progress.85 = concurrent_collection_in_progress;
  D.23875 = concurrent_collection_in_progress.85 != 0;
  D.23876 = (long int) D.23875;
  D.23877 = __builtin_expect (D.23876, 0);
  if (D.23877 != 0) goto <D.23878>; else goto <D.23879>;
  <D.23878>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1355, "!concurrent_collection_in_progress");
  <D.23879>:
  D.23880 = sgen_collection_is_parallel ();
  if (D.23880 != 0) goto <D.23881>; else goto <D.23882>;
  <D.23881>:
  pthread_mutex_lock (&pin_queue_mutex);
  sgen_pin_stage_ptr (object);
  objects_pinned.86 = objects_pinned;
  objects_pinned.87 = objects_pinned.86 + 1;
  objects_pinned = objects_pinned.87;
  pthread_mutex_unlock (&pin_queue_mutex);
  goto <D.23885>;
  <D.23882>:
  D.23886 = MEM[(mword *)object];
  D.23887 = D.23886 | 2;
  MEM[(mword *)object] = D.23887;
  sgen_pin_stage_ptr (object);
  objects_pinned.86 = objects_pinned;
  objects_pinned.87 = objects_pinned.86 + 1;
  objects_pinned = objects_pinned.87;
  do_pin_stats.88 = do_pin_stats;
  D.23889 = do_pin_stats.88 != 0;
  D.23890 = (long int) D.23889;
  D.23891 = __builtin_expect (D.23890, 0);
  if (D.23891 != 0) goto <D.23892>; else goto <D.23893>;
  <D.23892>:
  D.23894 = sgen_safe_object_get_size (object);
  D.23895 = (long unsigned int) D.23894;
  sgen_pin_stats_register_object (object, D.23895);
  <D.23893>:
  <D.23885>:
  D.23900 = queue->first;
  if (D.23900 == 0B) goto <D.23897>; else goto <D.23901>;
  <D.23901>:
  D.23900 = queue->first;
  D.23902 = D.23900->end;
  if (D.23902 == 125) goto <D.23897>; else goto <D.23898>;
  <D.23897>:
  iftmp.89 = 1;
  goto <D.23899>;
  <D.23898>:
  iftmp.89 = 0;
  <D.23899>:
  D.23903 = iftmp.89 != 0;
  D.23904 = (long int) D.23903;
  D.23905 = __builtin_expect (D.23904, 0);
  if (D.23905 != 0) goto <D.23906>; else goto <D.23907>;
  <D.23906>:
  sgen_gray_object_enqueue (queue, object);
  goto <D.23908>;
  <D.23907>:
  D.23900 = queue->first;
  D.23900 = queue->first;
  D.23902 = D.23900->end;
  D.23909 = D.23902;
  D.23910 = D.23909 + 1;
  D.23900->end = D.23910;
  D.23900->objects[D.23909] = object;
  <D.23908>:
  __builtin_prefetch (object);
}


sgen_parallel_pin_or_update (void * * ptr, void * obj, struct MonoVTable * vt, struct SgenGrayQueue * queue)
{
  int D.23911;
  long unsigned int vt.90;
  long unsigned int D.23915;
  void * D.23916;
  void * D.23917;
  void (*<T2c8f>) (char *, struct SgenGrayQueue *) D.23921;
  long unsigned int D.23922;
  long unsigned int D.23925;
  void * D.23926;
  long unsigned int D.23927;

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

    major_pinned = 0;
    D.23911 = sgen_ptr_in_nursery (obj);
    if (D.23911 != 0) goto <D.23912>; else goto <D.23913>;
    <D.23912>:
    vt.90 = (long unsigned int) vt;
    D.23915 = vt.90 | 2;
    D.23916 = (void *) D.23915;
    D.23917 = InterlockedCompareExchangePointer (obj, D.23916, vt);
    if (D.23917 == vt) goto <D.23918>; else goto <D.23919>;
    <D.23918>:
    sgen_pin_object (obj, queue);
    goto <D.21088>;
    <D.23919>:
    goto <D.23920>;
    <D.23913>:
    D.23921 = major_collector.pin_major_object;
    D.23921 (obj, queue);
    major_pinned = 1;
    <D.23920>:
    vtable_word = MEM[(mword *)obj];
    D.23922 = vtable_word & 1;
    if (D.23922 != 0) goto <D.23923>; else goto <D.23924>;
    <D.23923>:
    D.23925 = vtable_word & 18446744073709551612;
    D.23926 = (void *) D.23925;
    *ptr = D.23926;
    goto <D.21088>;
    <D.23924>:
    D.23927 = vtable_word & 2;
    if (D.23927 != 0) goto <D.21088>; else goto <D.23928>;
    <D.23928>:
    if (major_pinned != 0) goto <D.21088>; else goto <D.23929>;
    <D.23929>:
  }
  goto <D.21089>;
  <D.21088>:
}


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

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


sgen_sort_addresses (void * * array, int size)
{
  int D.23935;
  long unsigned int D.23936;
  long unsigned int D.23937;
  void * * D.23938;
  void * D.23939;
  long unsigned int D.23940;
  long unsigned int D.23941;
  void * * D.23942;
  void * D.23943;
  long unsigned int D.23945;
  long unsigned int D.23946;
  void * * D.23947;
  void * D.23948;
  int D.23949;
  long unsigned int D.23952;
  long unsigned int D.23953;
  void * * D.23954;
  void * D.23955;
  sizetype D.23956;
  sizetype D.23957;
  sizetype D.23958;
  void * * D.23959;
  void * D.23960;
  long unsigned int D.23963;
  long unsigned int D.23964;
  void * * D.23965;
  void * D.23966;
  int i;
  void * tmp;

  i = 1;
  goto <D.21102>;
  <D.21101>:
  {
    int child;

    child = i;
    goto <D.21100>;
    <D.21099>:
    {
      int parent;

      D.23935 = child + -1;
      parent = D.23935 / 2;
      D.23936 = (long unsigned int) parent;
      D.23937 = D.23936 * 8;
      D.23938 = array + D.23937;
      D.23939 = *D.23938;
      D.23940 = (long unsigned int) child;
      D.23941 = D.23940 * 8;
      D.23942 = array + D.23941;
      D.23943 = *D.23942;
      if (D.23939 >= D.23943) goto <D.21098>; else goto <D.23944>;
      <D.23944>:
      D.23936 = (long unsigned int) parent;
      D.23937 = D.23936 * 8;
      D.23938 = array + D.23937;
      tmp = *D.23938;
      D.23936 = (long unsigned int) parent;
      D.23937 = D.23936 * 8;
      D.23938 = array + D.23937;
      D.23940 = (long unsigned int) child;
      D.23941 = D.23940 * 8;
      D.23942 = array + D.23941;
      D.23943 = *D.23942;
      *D.23938 = D.23943;
      D.23940 = (long unsigned int) child;
      D.23941 = D.23940 * 8;
      D.23942 = array + D.23941;
      *D.23942 = tmp;
      child = parent;
    }
    <D.21100>:
    if (child > 0) goto <D.21099>; else goto <D.21098>;
    <D.21098>:
  }
  i = i + 1;
  <D.21102>:
  if (i < size) goto <D.21101>; else goto <D.21103>;
  <D.21103>:
  i = size + -1;
  goto <D.21111>;
  <D.21110>:
  {
    int end;
    int root;

    D.23945 = (long unsigned int) i;
    D.23946 = D.23945 * 8;
    D.23947 = array + D.23946;
    tmp = *D.23947;
    D.23945 = (long unsigned int) i;
    D.23946 = D.23945 * 8;
    D.23947 = array + D.23946;
    D.23948 = *array;
    *D.23947 = D.23948;
    *array = tmp;
    end = i + -1;
    root = 0;
    goto <D.21109>;
    <D.21108>:
    {
      int child;

      D.23949 = root * 2;
      child = D.23949 + 1;
      if (child < end) goto <D.23950>; else goto <D.23951>;
      <D.23950>:
      D.23952 = (long unsigned int) child;
      D.23953 = D.23952 * 8;
      D.23954 = array + D.23953;
      D.23955 = *D.23954;
      D.23956 = (sizetype) child;
      D.23957 = D.23956 + 1;
      D.23958 = D.23957 * 8;
      D.23959 = array + D.23958;
      D.23960 = *D.23959;
      if (D.23955 < D.23960) goto <D.23961>; else goto <D.23962>;
      <D.23961>:
      child = child + 1;
      <D.23962>:
      <D.23951>:
      D.23963 = (long unsigned int) root;
      D.23964 = D.23963 * 8;
      D.23965 = array + D.23964;
      D.23966 = *D.23965;
      D.23952 = (long unsigned int) child;
      D.23953 = D.23952 * 8;
      D.23954 = array + D.23953;
      D.23955 = *D.23954;
      if (D.23966 >= D.23955) goto <D.21107>; else goto <D.23967>;
      <D.23967>:
      D.23963 = (long unsigned int) root;
      D.23964 = D.23963 * 8;
      D.23965 = array + D.23964;
      tmp = *D.23965;
      D.23963 = (long unsigned int) root;
      D.23964 = D.23963 * 8;
      D.23965 = array + D.23964;
      D.23952 = (long unsigned int) child;
      D.23953 = D.23952 * 8;
      D.23954 = array + D.23953;
      D.23955 = *D.23954;
      *D.23965 = D.23955;
      D.23952 = (long unsigned int) child;
      D.23953 = D.23952 * 8;
      D.23954 = array + D.23953;
      *D.23954 = tmp;
      root = child;
    }
    <D.21109>:
    D.23949 = root * 2;
    if (D.23949 < end) goto <D.21108>; else goto <D.21107>;
    <D.21107>:
  }
  i = i + -1;
  <D.21111>:
  if (i > 0) goto <D.21110>; else goto <D.21112>;
  <D.21112>:
}


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

  <D.21210>:
  old = lowest_heap_address;
  if (low >= old) goto <D.21209>; else goto <D.23968>;
  <D.23968>:
  low.93 = (void *) low;
  old.94 = (void *) old;
  D.23971 = InterlockedCompareExchangePointer (&lowest_heap_address, low.93, old.94);
  old.94 = (void *) old;
  if (D.23971 != old.94) goto <D.21210>; else goto <D.21209>;
  <D.21209>:
  <D.21212>:
  old = highest_heap_address;
  if (high <= old) goto <D.21211>; else goto <D.23972>;
  <D.23972>:
  high.95 = (void *) high;
  old.94 = (void *) old;
  D.23974 = InterlockedCompareExchangePointer (&highest_heap_address, high.95, old.94);
  old.94 = (void *) old;
  if (D.23974 != old.94) goto <D.21212>; else goto <D.21211>;
  <D.21211>:
}


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

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


sgen_get_nursery_start ()
{
  char * D.23980;

  D.23980 = sgen_nursery_start;
  return D.23980;
}


mono_gc_set_current_thread_appdomain (struct MonoDomain * domain)
{
  _Bool D.23984;
  long int D.23985;
  long int D.23986;
  struct SgenThreadInfo * info;

  info = mono_thread_info_current ();
  if (domain != 0B) goto <D.23982>; else goto <D.23983>;
  <D.23982>:
  D.23984 = info == 0B;
  D.23985 = (long int) D.23984;
  D.23986 = __builtin_expect (D.23985, 0);
  if (D.23986 != 0) goto <D.23987>; else goto <D.23988>;
  <D.23987>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1733, "info");
  <D.23988>:
  info->stopped_domain = domain;
  <D.23983>:
}


mono_gc_precise_stack_mark_enabled ()
{
  gboolean D.23989;
  int conservative_stack_mark.98;
  _Bool D.23991;

  conservative_stack_mark.98 = conservative_stack_mark;
  D.23991 = conservative_stack_mark.98 == 0;
  D.23989 = (gboolean) D.23991;
  return D.23989;
}


mono_gc_get_logfile ()
{
  struct FILE * D.23993;

  D.23993 = gc_debug_file;
  return D.23993;
}


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

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


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

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


sgen_get_current_object_ops ()
{
  struct SgenObjectOperations * D.23999;

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


sgen_check_section_scan_starts (struct GCMemSection * section)
{
  char * * D.24001;
  long unsigned int D.24002;
  long unsigned int D.24003;
  char * * D.24004;
  char * D.24005;
  unsigned int D.24008;
  _Bool D.24009;
  long int D.24010;
  long int D.24011;
  unsigned int i.99;
  unsigned int D.24015;
  int i;

  i = 0;
  goto <D.21346>;
  <D.21345>:
  D.24001 = section->scan_starts;
  D.24002 = (long unsigned int) i;
  D.24003 = D.24002 * 8;
  D.24004 = D.24001 + D.24003;
  D.24005 = *D.24004;
  if (D.24005 != 0B) goto <D.24006>; else goto <D.24007>;
  <D.24006>:
  {
    guint size;

    D.24001 = section->scan_starts;
    D.24002 = (long unsigned int) i;
    D.24003 = D.24002 * 8;
    D.24004 = D.24001 + D.24003;
    D.24005 = *D.24004;
    size = sgen_safe_object_get_size (D.24005);
    D.24008 = size + 4294967280;
    D.24009 = D.24008 > 7984;
    D.24010 = (long int) D.24009;
    D.24011 = __builtin_expect (D.24010, 0);
    if (D.24011 != 0) goto <D.24012>; else goto <D.24013>;
    <D.24012>:
    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.24013>:
  }
  <D.24007>:
  i = i + 1;
  <D.21346>:
  i.99 = (unsigned int) i;
  D.24015 = section->num_scan_start;
  if (i.99 < D.24015) goto <D.21345>; else goto <D.21347>;
  <D.21347>:
}


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

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


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

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


sgen_dump_section (struct GCMemSection * section, const char * type)
{
  char * D.24024;
  long unsigned int D.24025;
  struct FILE * heap_dump_file.104;
  void * D.24027;
  char * D.24032;
  _Bool D.24033;
  long int D.24034;
  long int D.24035;
  long unsigned int D.24040;
  long unsigned int D.24041;
  unsigned int D.24042;
  unsigned int D.24043;
  sizetype D.24044;
  char * start;
  char * end;
  char * occ_start;
  struct GCVTable * vt;
  char * old_start;

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

    D.24027 = MEM[(void * *)start];
    if (D.24027 == 0B) goto <D.24028>; else goto <D.24029>;
    <D.24028>:
    if (occ_start != 0B) goto <D.24030>; else goto <D.24031>;
    <D.24030>:
    D.24024 = section->data;
    sgen_dump_occupied (occ_start, start, D.24024);
    occ_start = 0B;
    <D.24031>:
    start = start + 8;
    // predicted unlikely by continue predictor.
    goto <D.21387>;
    <D.24029>:
    D.24032 = section->next_data;
    D.24033 = D.24032 <= start;
    D.24034 = (long int) D.24033;
    D.24035 = __builtin_expect (D.24034, 0);
    if (D.24035 != 0) goto <D.24036>; else goto <D.24037>;
    <D.24036>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2088, "start < section->next_data");
    <D.24037>:
    if (occ_start == 0B) goto <D.24038>; else goto <D.24039>;
    <D.24038>:
    occ_start = start;
    <D.24039>:
    D.24040 = MEM[(mword *)start];
    D.24041 = D.24040 & 18446744073709551612;
    vt = (struct GCVTable *) D.24041;
    class = vt->klass;
    D.24042 = sgen_safe_object_get_size (start);
    D.24043 = D.24042 + 7;
    size = D.24043 & 4294967288;
    old_start = start;
    D.24044 = (sizetype) size;
    start = start + D.24044;
  }
  <D.21387>:
  if (start < end) goto <D.21388>; else goto <D.21389>;
  <D.21389>:
  if (occ_start != 0B) goto <D.24045>; else goto <D.24046>;
  <D.24045>:
  D.24024 = section->data;
  sgen_dump_occupied (occ_start, start, D.24024);
  <D.24046>:
  heap_dump_file.104 = heap_dump_file;
  fprintf (heap_dump_file.104, "</section>\n");
}


sgen_register_moved_object (void * obj, void * destination)
{
  <unnamed type> mono_profiler_events.105;
  unsigned int D.24048;
  _Bool D.24049;
  long int D.24050;
  long int D.24051;
  int D.24054;
  _Bool D.24055;
  long int D.24056;
  long int D.24057;
  int moved_objects_idx.106;
  int moved_objects_idx.107;
  int moved_objects_idx.108;
  int moved_objects_idx.109;
  int moved_objects_idx.110;

  mono_profiler_events.105 = mono_profiler_events;
  D.24048 = mono_profiler_events.105 & 524288;
  D.24049 = D.24048 == 0;
  D.24050 = (long int) D.24049;
  D.24051 = __builtin_expect (D.24050, 0);
  if (D.24051 != 0) goto <D.24052>; else goto <D.24053>;
  <D.24052>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2187, "mono_profiler_events & MONO_PROFILE_GC_MOVES");
  <D.24053>:
  D.24054 = sgen_collection_is_parallel ();
  D.24055 = D.24054 != 0;
  D.24056 = (long int) D.24055;
  D.24057 = __builtin_expect (D.24056, 0);
  if (D.24057 != 0) goto <D.24058>; else goto <D.24059>;
  <D.24058>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2190, "!sgen_collection_is_parallel ()");
  <D.24059>:
  moved_objects_idx.106 = moved_objects_idx;
  if (moved_objects_idx.106 == 64) goto <D.24061>; else goto <D.24062>;
  <D.24061>:
  moved_objects_idx.106 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.106);
  moved_objects_idx = 0;
  <D.24062>:
  moved_objects_idx.106 = moved_objects_idx;
  moved_objects_idx.107 = moved_objects_idx.106;
  moved_objects_idx.108 = moved_objects_idx.107 + 1;
  moved_objects_idx = moved_objects_idx.108;
  moved_objects[moved_objects_idx.107] = obj;
  moved_objects_idx.106 = moved_objects_idx;
  moved_objects_idx.109 = moved_objects_idx.106;
  moved_objects_idx.110 = moved_objects_idx.109 + 1;
  moved_objects_idx = moved_objects_idx.110;
  moved_objects[moved_objects_idx.109] = destination;
}


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

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


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

  current_collection_generation.113 = current_collection_generation;
  switch (current_collection_generation.113) <default: <D.21434>, case 0: <D.21432>, case 1: <D.21433>>
  <D.21432>:
  D.24070 = nursery_collection_is_parallel;
  return D.24070;
  <D.21433>:
  D.24070 = major_collector.is_parallel;
  return D.24070;
  <D.21434>:
  current_collection_generation.113 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.113);
  <D.21435>:
  goto <D.21435>;
}


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

  current_collection_generation.114 = current_collection_generation;
  switch (current_collection_generation.114) <default: <D.21441>, case 0: <D.21439>, case 1: <D.21440>>
  <D.21439>:
  D.24073 = 0;
  return D.24073;
  <D.21440>:
  D.24073 = concurrent_collection_in_progress;
  return D.24073;
  <D.21441>:
  current_collection_generation.114 = current_collection_generation;
  monoeg_g_log (0B, 4, "Invalid current generation %d", current_collection_generation.114);
  <D.21442>:
  goto <D.21442>;
}


sgen_concurrent_collection_in_progress ()
{
  gboolean D.24075;

  D.24075 = concurrent_collection_in_progress;
  return D.24075;
}


sgen_ensure_free_space (size_t size)
{
  int D.24079;
  int degraded_mode.115;
  int D.24086;
  int D.24090;
  int concurrent_collection_in_progress.116;
  int D.24099;
  int generation_to_collect;
  const char * reason;

  generation_to_collect = -1;
  reason = 0B;
  if (size > 8000) goto <D.24077>; else goto <D.24078>;
  <D.24077>:
  D.24079 = sgen_need_major_collection (size);
  if (D.24079 != 0) goto <D.24080>; else goto <D.24081>;
  <D.24080>:
  reason = "LOS overflow";
  generation_to_collect = 1;
  <D.24081>:
  goto <D.24082>;
  <D.24078>:
  degraded_mode.115 = degraded_mode;
  if (degraded_mode.115 != 0) goto <D.24084>; else goto <D.24085>;
  <D.24084>:
  D.24086 = sgen_need_major_collection (size);
  if (D.24086 != 0) goto <D.24087>; else goto <D.24088>;
  <D.24087>:
  reason = "Degraded mode overflow";
  generation_to_collect = 1;
  <D.24088>:
  goto <D.24089>;
  <D.24085>:
  D.24090 = sgen_need_major_collection (size);
  if (D.24090 != 0) goto <D.24091>; else goto <D.24092>;
  <D.24091>:
  reason = "Minor allowance";
  generation_to_collect = 1;
  goto <D.24093>;
  <D.24092>:
  generation_to_collect = 0;
  reason = "Nursery full";
  <D.24093>:
  <D.24089>:
  <D.24082>:
  if (generation_to_collect == -1) goto <D.24094>; else goto <D.24095>;
  <D.24094>:
  concurrent_collection_in_progress.116 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.116 != 0) goto <D.24097>; else goto <D.24098>;
  <D.24097>:
  D.24099 = sgen_workers_all_done ();
  if (D.24099 != 0) goto <D.24100>; else goto <D.24101>;
  <D.24100>:
  generation_to_collect = 1;
  reason = "Finish concurrent collection";
  <D.24101>:
  <D.24098>:
  <D.24095>:
  if (generation_to_collect == -1) goto <D.24102>; else goto <D.24103>;
  <D.24102>:
  return;
  <D.24103>:
  sgen_perform_collection (size, generation_to_collect, reason, 0);
}


sgen_perform_collection (size_t requested_size, int generation_to_collect, const char * reason, gboolean wait_to_finish)
{
  unsigned int generation_to_collect.117;
  _Bool D.24108;
  long int D.24109;
  long int D.24110;
  long int D.24113;
  int concurrent_collection_in_progress.118;
  int iftmp.119;
  int D.24122;
  int allow_synchronous_major.120;
  gboolean * D.24132;
  int D.24135;
  int D.24140;
  int D.24144;
  int concurrent_collection_in_progress.121;
  _Bool D.24148;
  long int D.24149;
  long int D.24150;
  int D.24158;
  long int D.24161;
  long int D.24162;
  long int D.24163;
  int D.24164;
  long int D.24165;
  long int D.24173;
  long int D.24174;
  long int D.24175;
  int D.24176;
  long int D.24177;
  int gc_debug_level.122;
  _Bool D.24179;
  long int D.24180;
  long int D.24181;
  struct FILE * gc_debug_file.123;
  long int D.24185;
  long unsigned int D.24186;
  long unsigned int los_memory_usage.124;
  int D.24190;
  _Bool D.24193;
  long int D.24194;
  long int D.24195;
  int D.24198;
  int D.24199;
  _Bool D.24200;
  long int D.24201;
  long int D.24202;
  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.24105>; else goto <D.24106>;
      <D.24105>:
      <D.24106>:
      generation_to_collect.117 = (unsigned int) generation_to_collect;
      D.24108 = generation_to_collect.117 > 1;
      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>:
      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.24112>:
      memset (&infos, 0, 96);
      mono_profiler_gc_event (0, generation_to_collect);
      infos[0].generation = generation_to_collect;
      infos[0].reason = reason;
      infos[0].is_overflow = 0;
      D.24113 = mono_100ns_ticks ();
      infos[0].total_time = D.24113;
      infos[1].generation = -1;
      sgen_stop_world (generation_to_collect);
      concurrent_collection_in_progress.118 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.118 != 0) goto <D.24115>; else goto <D.24116>;
      <D.24115>:
      if (wait_to_finish != 0) goto <D.24120>; else goto <D.24118>;
      <D.24120>:
      if (generation_to_collect == 1) goto <D.24121>; else goto <D.24118>;
      <D.24121>:
      iftmp.119 = 1;
      goto <D.24119>;
      <D.24118>:
      iftmp.119 = 0;
      <D.24119>:
      D.24122 = major_update_or_finish_concurrent_collection (iftmp.119);
      if (D.24122 != 0) goto <D.24123>; else goto <D.24124>;
      <D.24123>:
      oldest_generation_collected = 1;
      goto done;
      <D.24124>:
      if (generation_to_collect == 1) goto done; else goto <D.24125>;
      <D.24125>:
      goto <D.24126>;
      <D.24116>:
      if (generation_to_collect == 1) goto <D.24127>; else goto <D.24128>;
      <D.24127>:
      allow_synchronous_major.120 = allow_synchronous_major;
      if (allow_synchronous_major.120 != 0) goto <D.24130>; else goto <D.24131>;
      <D.24130>:
      D.24132 = major_collector.want_synchronous_collection;
      if (D.24132 != 0B) goto <D.24133>; else goto <D.24134>;
      <D.24133>:
      D.24132 = major_collector.want_synchronous_collection;
      D.24135 = *D.24132;
      if (D.24135 != 0) goto <D.24136>; else goto <D.24137>;
      <D.24136>:
      wait_to_finish = 1;
      <D.24137>:
      <D.24134>:
      <D.24131>:
      <D.24128>:
      <D.24126>:
      if (generation_to_collect == 0) goto <D.24138>; else goto <D.24139>;
      <D.24138>:
      D.24140 = collect_nursery (0B, 0);
      if (D.24140 != 0) goto <D.24141>; else goto <D.24142>;
      <D.24141>:
      overflow_generation_to_collect = 1;
      overflow_reason = "Minor overflow";
      <D.24142>:
      goto <D.24143>;
      <D.24139>:
      D.24144 = major_collector.is_concurrent;
      if (D.24144 != 0) goto <D.24145>; else goto <D.24146>;
      <D.24145>:
      concurrent_collection_in_progress.121 = concurrent_collection_in_progress;
      D.24148 = concurrent_collection_in_progress.121 != 0;
      D.24149 = (long int) D.24148;
      D.24150 = __builtin_expect (D.24149, 0);
      if (D.24150 != 0) goto <D.24151>; else goto <D.24152>;
      <D.24151>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3489, "!concurrent_collection_in_progress");
      <D.24152>:
      if (wait_to_finish == 0) goto <D.24153>; else goto <D.24154>;
      <D.24153>:
      collect_nursery (0B, 0);
      <D.24154>:
      <D.24146>:
      D.24144 = major_collector.is_concurrent;
      if (D.24144 != 0) goto <D.24156>; else goto <D.24155>;
      <D.24156>:
      if (wait_to_finish == 0) goto <D.24157>; else goto <D.24155>;
      <D.24157>:
      major_start_concurrent_collection (reason);
      goto done;
      <D.24155>:
      D.24158 = major_do_collection (reason);
      if (D.24158 != 0) goto <D.24159>; else goto <D.24160>;
      <D.24159>:
      overflow_generation_to_collect = 0;
      overflow_reason = "Excessive pinning";
      <D.24160>:
      <D.24143>:
      gc_end = mono_100ns_ticks ();
      D.24161 = infos[0].total_time;
      D.24162 = gc_end - D.24161;
      D.24163 = D.24162 / 10;
      D.24164 = (int) D.24163;
      D.24165 = (long int) D.24164;
      infos[0].total_time = D.24165;
      D.24144 = major_collector.is_concurrent;
      if (D.24144 == 0) goto <D.24166>; else goto <D.24167>;
      <D.24166>:
      if (overflow_generation_to_collect != -1) goto <D.24168>; else goto <D.24169>;
      <D.24168>:
      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.24170>; else goto <D.24171>;
      <D.24170>:
      collect_nursery (0B, 0);
      goto <D.24172>;
      <D.24171>:
      major_do_collection (overflow_reason);
      <D.24172>:
      gc_end = mono_100ns_ticks ();
      D.24173 = infos[1].total_time;
      D.24174 = gc_end - D.24173;
      D.24175 = D.24174 / 10;
      D.24176 = (int) D.24175;
      D.24177 = (long int) D.24176;
      infos[1].total_time = D.24177;
      mono_profiler_gc_event (5, overflow_generation_to_collect);
      oldest_generation_collected = MAX_EXPR <overflow_generation_to_collect, oldest_generation_collected>;
      <D.24169>:
      <D.24167>:
      gc_debug_level.122 = gc_debug_level;
      D.24179 = gc_debug_level.122 > 1;
      D.24180 = (long int) D.24179;
      D.24181 = __builtin_expect (D.24180, 0);
      if (D.24181 != 0) goto <D.24182>; else goto <D.24183>;
      <D.24182>:
      gc_debug_file.123 = gc_debug_file;
      D.24185 = mono_gc_get_heap_size ();
      D.24186 = (long unsigned int) D.24185;
      los_memory_usage.124 = los_memory_usage;
      fprintf (gc_debug_file.123, "Heap size: %lu, LOS size: %lu\n", D.24186, los_memory_usage.124);
      gc_debug_file.123 = gc_debug_file;
      fflush (gc_debug_file.123);
      <D.24183>:
      if (generation_to_collect == 0) goto <D.24188>; else goto <D.24189>;
      <D.24188>:
      D.24190 = sgen_can_alloc_size (requested_size);
      if (D.24190 == 0) goto <D.24191>; else goto <D.24192>;
      <D.24191>:
      gc_debug_level.122 = gc_debug_level;
      D.24193 = gc_debug_level.122 > 0;
      D.24194 = (long int) D.24193;
      D.24195 = __builtin_expect (D.24194, 0);
      if (D.24195 != 0) goto <D.24196>; else goto <D.24197>;
      <D.24196>:
      gc_debug_file.123 = gc_debug_file;
      D.24198 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.123, "nursery collection didn\'t find enough room for %zd alloc (%d pinned)\n", requested_size, D.24198);
      gc_debug_file.123 = gc_debug_file;
      fflush (gc_debug_file.123);
      <D.24197>:
      sgen_dump_pin_queue ();
      degraded_mode = 1;
      <D.24192>:
      <D.24189>:
      done:
      D.24199 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24200 = D.24199 == 0;
      D.24201 = (long int) D.24200;
      D.24202 = __builtin_expect (D.24201, 0);
      if (D.24202 != 0) goto <D.24203>; else goto <D.24204>;
      <D.24203>:
      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.24204>:
      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.24205;
  _Bool D.24206;
  long int D.24207;
  long int D.24208;
  int D.24213;
  void (*<T7e8>) (void) D.24216;
  gboolean D.24217;
  int mod_union_consistency_check.125;
  int whole_heap_check_before_collection.126;
  struct SgenGrayQueue unpin_queue;

  try
    {
      memset (&unpin_queue, 0, 32);
      D.24205 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.24206 = D.24205 == 0;
      D.24207 = (long int) D.24206;
      D.24208 = __builtin_expect (D.24207, 0);
      if (D.24208 != 0) goto <D.24209>; else goto <D.24210>;
      <D.24209>:
      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.24210>:
      if (force_finish == 0) goto <D.24211>; else goto <D.24212>;
      <D.24211>:
      D.24213 = sgen_workers_all_done ();
      if (D.24213 == 0) goto <D.24214>; else goto <D.24215>;
      <D.24214>:
      D.24216 = major_collector.update_cardtable_mod_union;
      D.24216 ();
      sgen_los_update_cardtable_mod_union ();
      D.24217 = 0;
      return D.24217;
      <D.24215>:
      <D.24212>:
      wait_for_workers_to_finish ();
      D.24216 = major_collector.update_cardtable_mod_union;
      D.24216 ();
      sgen_los_update_cardtable_mod_union ();
      collect_nursery (&unpin_queue, 1);
      mod_union_consistency_check.125 = mod_union_consistency_check;
      if (mod_union_consistency_check.125 != 0) goto <D.24219>; else goto <D.24220>;
      <D.24219>:
      sgen_check_mod_union_consistency ();
      <D.24220>:
      current_collection_generation = 1;
      major_finish_collection ("finishing", -1, 1);
      whole_heap_check_before_collection.126 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.126 != 0) goto <D.24222>; else goto <D.24223>;
      <D.24222>:
      sgen_check_whole_heap (0);
      <D.24223>:
      unpin_objects_from_queue (&unpin_queue);
      sgen_gray_object_queue_deinit (&unpin_queue);
      current_collection_generation = -1;
      D.24217 = 1;
      return D.24217;
    }
  finally
    {
      unpin_queue = {CLOBBER};
    }
}


wait_for_workers_to_finish ()
{
  int D.24226;

  goto <D.21592>;
  <D.21591>:
  monoeg_g_usleep (200);
  <D.21592>:
  D.24226 = sgen_workers_all_done ();
  if (D.24226 == 0) goto <D.21591>; else goto <D.21593>;
  <D.21593>:
}


major_finish_collection (const char * reason, int old_next_pin_slot, gboolean scan_mod_union)
{
  int concurrent_collection_in_progress.127;
  int D.24231;
  int concurrent_collection_in_progress.128;
  int D.24235;
  _Bool D.24236;
  long int D.24237;
  long int D.24238;
  int do_concurrent_checks.129;
  struct SgenSectionGrayQueue * D.24245;
  int D.24246;
  _Bool D.24247;
  long int D.24248;
  long int D.24249;
  long int D.24252;
  long int D.24253;
  int D.24254;
  long long int D.24255;
  long long int time_major_finish_gray_stack.130;
  long long int time_major_finish_gray_stack.131;
  long unsigned int objects_pinned.132;
  int concurrent_collection_in_progress.133;
  _Bool D.24262;
  long int D.24263;
  long int D.24264;
  struct GCMemSection * nursery_section.134;
  char * D.24268;
  long unsigned int D.24269;
  char * D.24270;
  long unsigned int D.24271;
  int check_mark_bits_after_major_collection.135;
  char[0:] * D.24275;
  long unsigned int D.24276;
  long unsigned int D.24277;
  _Bool D.24278;
  long int D.24279;
  long int D.24280;
  int D.24283;
  long unsigned int D.24286;
  long unsigned int D.24287;
  long unsigned int D.24288;
  struct LOSObject * los_object_list.136;
  long int D.24294;
  long int D.24295;
  int D.24296;
  long long int D.24297;
  long long int time_major_free_bigobjs.137;
  long long int time_major_free_bigobjs.138;
  long long int time_major_los_sweep.139;
  long long int time_major_los_sweep.140;
  void (*<T7e8>) (void) D.24302;
  long long int time_major_sweep.141;
  long long int time_major_sweep.142;
  int concurrent_collection_in_progress.143;
  void * * D.24308;
  int D.24309;
  long unsigned int D.24310;
  int concurrent_collection_in_progress.144;
  long long int time_major_fragment_creation.145;
  long long int time_major_fragment_creation.146;
  struct FILE * heap_dump_file.147;
  int stat_major_gcs.148;
  int D.24322;
  struct FinalizeReadyEntry * fin_ready_list.149;
  struct FinalizeReadyEntry * critical_fin_list.150;
  struct FILE * gc_debug_file.151;
  int num_ready_finalizers.152;
  int D.24332;
  _Bool D.24333;
  long int D.24334;
  long int D.24335;
  void (*<T7e8>) (void) D.24338;
  struct SgenSectionGrayQueue * D.24339;
  int D.24340;
  _Bool D.24341;
  long int D.24342;
  long int D.24343;
  int concurrent_collection_in_progress.153;
  struct LOSObject * bigobj;
  struct LOSObject * prevbo;
  gint64 atv;
  gint64 btv;

  btv = mono_100ns_ticks ();
  concurrent_collection_in_progress.127 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.127 != 0) goto <D.24227>; else goto <D.24230>;
  <D.24230>:
  D.24231 = major_collector.is_parallel;
  if (D.24231 != 0) goto <D.24227>; else goto <D.24228>;
  <D.24227>:
  join_workers ();
  <D.24228>:
  concurrent_collection_in_progress.128 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.128 != 0) goto <D.24233>; else goto <D.24234>;
  <D.24233>:
  current_object_ops = major_collector.major_concurrent_ops;
  major_copy_or_mark_from_roots (0B, 1, scan_mod_union);
  join_workers ();
  D.24235 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.24236 = D.24235 == 0;
  D.24237 = (long int) D.24236;
  D.24238 = __builtin_expect (D.24237, 0);
  if (D.24238 != 0) goto <D.24239>; else goto <D.24240>;
  <D.24239>:
  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.24240>:
  do_concurrent_checks.129 = do_concurrent_checks;
  if (do_concurrent_checks.129 != 0) goto <D.24242>; else goto <D.24243>;
  <D.24242>:
  check_nursery_is_clean ();
  <D.24243>:
  goto <D.24244>;
  <D.24234>:
  current_object_ops = major_collector.major_ops;
  <D.24244>:
  sgen_gray_object_queue_disable_alloc_prepare (&gray_queue);
  D.24245 = sgen_workers_get_distribute_section_gray_queue ();
  D.24246 = sgen_section_gray_queue_is_empty (D.24245);
  D.24247 = D.24246 == 0;
  D.24248 = (long int) D.24247;
  D.24249 = __builtin_expect (D.24248, 0);
  if (D.24249 != 0) goto <D.24250>; else goto <D.24251>;
  <D.24250>:
  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.24251>:
  finish_gray_stack (1, &gray_queue);
  atv = mono_100ns_ticks ();
  D.24252 = atv - btv;
  D.24253 = D.24252 / 10;
  D.24254 = (int) D.24253;
  D.24255 = (long long int) D.24254;
  time_major_finish_gray_stack.130 = time_major_finish_gray_stack;
  time_major_finish_gray_stack.131 = D.24255 + time_major_finish_gray_stack.130;
  time_major_finish_gray_stack = time_major_finish_gray_stack.131;
  sgen_workers_reset_data ();
  objects_pinned.132 = objects_pinned;
  if (objects_pinned.132 != 0) goto <D.24259>; else goto <D.24260>;
  <D.24259>:
  concurrent_collection_in_progress.133 = concurrent_collection_in_progress;
  D.24262 = concurrent_collection_in_progress.133 != 0;
  D.24263 = (long int) D.24262;
  D.24264 = __builtin_expect (D.24263, 0);
  if (D.24264 != 0) goto <D.24265>; else goto <D.24266>;
  <D.24265>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3177, "!concurrent_collection_in_progress");
  <D.24266>:
  nursery_section.134 = nursery_section;
  sgen_pin_queue_clear_discarded_entries (nursery_section.134, old_next_pin_slot);
  sgen_optimize_pin_queue (0);
  nursery_section.134 = nursery_section;
  sgen_find_section_pin_queue_start_end (nursery_section.134);
  objects_pinned = 0;
  <D.24260>:
  reset_heap_boundaries ();
  D.24268 = sgen_get_nursery_start ();
  D.24269 = (long unsigned int) D.24268;
  D.24270 = sgen_get_nursery_end ();
  D.24271 = (long unsigned int) D.24270;
  sgen_update_heap_boundaries (D.24269, D.24271);
  check_mark_bits_after_major_collection.135 = check_mark_bits_after_major_collection;
  if (check_mark_bits_after_major_collection.135 != 0) goto <D.24273>; else goto <D.24274>;
  <D.24273>:
  sgen_check_major_heap_marked ();
  <D.24274>:
  prevbo = 0B;
  bigobj = los_object_list;
  goto <D.21607>;
  <D.21608>:
  D.24275 = &bigobj->data;
  D.24276 = MEM[(mword *)D.24275];
  D.24277 = D.24276 & 2;
  D.24278 = D.24277 != 0;
  D.24279 = (long int) D.24278;
  D.24280 = __builtin_expect (D.24279, 0);
  if (D.24280 != 0) goto <D.24281>; else goto <D.24282>;
  <D.24281>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3197, "!object_is_pinned (bigobj->data)");
  <D.24282>:
  D.24275 = &bigobj->data;
  D.24283 = sgen_los_object_is_pinned (D.24275);
  if (D.24283 != 0) goto <D.24284>; else goto <D.24285>;
  <D.24284>:
  D.24275 = &bigobj->data;
  sgen_los_unpin_object (D.24275);
  D.24275 = &bigobj->data;
  D.24286 = (long unsigned int) D.24275;
  D.24275 = &bigobj->data;
  D.24286 = (long unsigned int) D.24275;
  D.24287 = sgen_los_object_size (bigobj);
  D.24288 = D.24286 + D.24287;
  sgen_update_heap_boundaries (D.24286, D.24288);
  goto <D.24289>;
  <D.24285>:
  {
    struct LOSObject * to_free;

    if (prevbo != 0B) goto <D.24290>; else goto <D.24291>;
    <D.24290>:
    los_object_list.136 = bigobj->next;
    prevbo->next = los_object_list.136;
    goto <D.24293>;
    <D.24291>:
    los_object_list.136 = bigobj->next;
    los_object_list = los_object_list.136;
    <D.24293>:
    to_free = bigobj;
    bigobj = bigobj->next;
    sgen_los_free_object (to_free);
    // predicted unlikely by continue predictor.
    goto <D.21607>;
  }
  <D.24289>:
  prevbo = bigobj;
  bigobj = bigobj->next;
  <D.21607>:
  if (bigobj != 0B) goto <D.21608>; else goto <D.21609>;
  <D.21609>:
  btv = mono_100ns_ticks ();
  D.24294 = btv - atv;
  D.24295 = D.24294 / 10;
  D.24296 = (int) D.24295;
  D.24297 = (long long int) D.24296;
  time_major_free_bigobjs.137 = time_major_free_bigobjs;
  time_major_free_bigobjs.138 = D.24297 + time_major_free_bigobjs.137;
  time_major_free_bigobjs = time_major_free_bigobjs.138;
  sgen_los_sweep ();
  atv = mono_100ns_ticks ();
  D.24252 = atv - btv;
  D.24253 = D.24252 / 10;
  D.24254 = (int) D.24253;
  D.24255 = (long long int) D.24254;
  time_major_los_sweep.139 = time_major_los_sweep;
  time_major_los_sweep.140 = D.24255 + time_major_los_sweep.139;
  time_major_los_sweep = time_major_los_sweep.140;
  D.24302 = major_collector.sweep;
  D.24302 ();
  btv = mono_100ns_ticks ();
  D.24294 = btv - atv;
  D.24295 = D.24294 / 10;
  D.24296 = (int) D.24295;
  D.24297 = (long long int) D.24296;
  time_major_sweep.141 = time_major_sweep;
  time_major_sweep.142 = D.24297 + time_major_sweep.141;
  time_major_sweep = time_major_sweep.142;
  concurrent_collection_in_progress.143 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.143 == 0) goto <D.24306>; else goto <D.24307>;
  <D.24306>:
  nursery_section.134 = nursery_section;
  nursery_section.134 = nursery_section;
  D.24308 = nursery_section.134->pin_queue_start;
  nursery_section.134 = nursery_section;
  D.24309 = nursery_section.134->pin_queue_num_entries;
  D.24310 = sgen_build_nursery_fragments (nursery_section.134, D.24308, D.24309, 0B);
  if (D.24310 == 0) goto <D.24311>; else goto <D.24312>;
  <D.24311>:
  degraded_mode = 1;
  <D.24312>:
  sgen_finish_pinning ();
  sgen_clear_tlabs ();
  sgen_pin_stats_reset ();
  <D.24307>:
  concurrent_collection_in_progress.144 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.144 != 0) goto <D.24314>; else goto <D.24315>;
  <D.24314>:
  sgen_cement_concurrent_finish ();
  <D.24315>:
  sgen_cement_clear_below_threshold ();
  atv = mono_100ns_ticks ();
  D.24252 = atv - btv;
  D.24253 = D.24252 / 10;
  D.24254 = (int) D.24253;
  D.24255 = (long long int) D.24254;
  time_major_fragment_creation.145 = time_major_fragment_creation;
  time_major_fragment_creation.146 = D.24255 + time_major_fragment_creation.145;
  time_major_fragment_creation = time_major_fragment_creation.146;
  heap_dump_file.147 = heap_dump_file;
  if (heap_dump_file.147 != 0B) goto <D.24319>; else goto <D.24320>;
  <D.24319>:
  stat_major_gcs.148 = stat_major_gcs;
  D.24322 = stat_major_gcs.148 + -1;
  dump_heap ("major", D.24322, reason);
  <D.24320>:
  fin_ready_list.149 = fin_ready_list;
  if (fin_ready_list.149 != 0B) goto <D.24323>; else goto <D.24326>;
  <D.24326>:
  critical_fin_list.150 = critical_fin_list;
  if (critical_fin_list.150 != 0B) goto <D.24323>; else goto <D.24324>;
  <D.24323>:
  if (0 != 0) goto <D.24328>; else goto <D.24329>;
  <D.24328>:
  gc_debug_file.151 = gc_debug_file;
  num_ready_finalizers.152 = num_ready_finalizers;
  fprintf (gc_debug_file.151, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.152);
  gc_debug_file.151 = gc_debug_file;
  fflush (gc_debug_file.151);
  <D.24329>:
  mono_gc_finalize_notify ();
  <D.24324>:
  D.24332 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.24333 = D.24332 == 0;
  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", 3264, "sgen_gray_object_queue_is_empty (&gray_queue)");
  <D.24337>:
  sgen_memgov_major_collection_end ();
  current_collection_generation = -1;
  D.24338 = major_collector.finish_major_collection;
  D.24338 ();
  D.24339 = sgen_workers_get_distribute_section_gray_queue ();
  D.24340 = sgen_section_gray_queue_is_empty (D.24339);
  D.24341 = D.24340 == 0;
  D.24342 = (long int) D.24341;
  D.24343 = __builtin_expect (D.24342, 0);
  if (D.24343 != 0) goto <D.24344>; else goto <D.24345>;
  <D.24344>:
  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.24345>:
  concurrent_collection_in_progress.153 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.153 != 0) goto <D.24347>; else goto <D.24348>;
  <D.24347>:
  concurrent_collection_in_progress = 0;
  <D.24348>:
  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.24349;
  int D.24350;
  int concurrent_collection_in_progress.154;
  int do_concurrent_checks.155;
  int whole_heap_check_before_collection.156;
  long int D.24361;
  long int D.24362;
  int D.24363;
  long long int D.24364;
  long long int time_major_pre_collection_fragment_clear.157;
  long long int time_major_pre_collection_fragment_clear.158;
  int D.24367;
  struct GCMemSection * nursery_section.159;
  char * D.24371;
  gboolean * D.24372;
  int xdomain_checks.160;
  int concurrent_collection_in_progress.161;
  void (*<T7e8>) (void) D.24379;
  struct FILE * gc_debug_file.162;
  long unsigned int lowest_heap_address.163;
  void * lowest_heap_address.164;
  long unsigned int highest_heap_address.165;
  void * highest_heap_address.166;
  int concurrent_collection_in_progress.167;
  int D.24391;
  int concurrent_collection_in_progress.168;
  int concurrent_collection_in_progress.169;
  void (*<T2bc9>) (struct SgenGrayQueue *) D.24402;
  char[0:] * D.24405;
  long unsigned int D.24406;
  char * D.24407;
  void * * D.24408;
  int D.24411;
  _Bool D.24414;
  long int D.24415;
  long int D.24416;
  long unsigned int D.24419;
  long unsigned int D.24420;
  struct MonoVTable * D.24421;
  void * D.24422;
  long unsigned int D.24423;
  int D.24424;
  int iftmp.170;
  struct GrayQueueSection * D.24431;
  int D.24433;
  _Bool D.24434;
  long int D.24435;
  long int D.24436;
  int D.24440;
  int D.24441;
  int do_pin_stats.171;
  _Bool D.24443;
  long int D.24444;
  long int D.24445;
  unsigned int D.24448;
  long unsigned int D.24449;
  const char * D.24452;
  long unsigned int D.24453;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) iftmp.172;
  int concurrent_collection_in_progress.173;
  int concurrent_collection_in_progress.174;
  int D.24467;
  int check_nursery_objects_pinned.175;
  int iftmp.176;
  int concurrent_collection_in_progress.177;
  void (*<T2bc9>) (struct SgenGrayQueue *) D.24480;
  int D.24483;
  long long int time_major_pinning.178;
  long long int time_major_pinning.179;
  int gc_debug_level.180;
  _Bool D.24487;
  long int D.24488;
  long int D.24489;
  int D.24492;
  int D.24495;
  void (*<T7e8>) (void) D.24496;
  int concurrent_collection_in_progress.181;
  int D.24500;
  <unnamed type> D.24503;
  unsigned int D.24504;
  long int D.24507;
  long int D.24508;
  int D.24509;
  long long int D.24510;
  long long int time_major_scan_pinned.182;
  long long int time_major_scan_pinned.183;
  void (*<T2c8a>) (void * *, struct SgenGrayQueue *) D.24513;
  void (*<T2c8f>) (char *, struct SgenGrayQueue *) D.24514;
  long long int time_major_scan_registered_roots.184;
  long long int time_major_scan_registered_roots.185;
  long long int time_major_scan_thread_data.186;
  long long int time_major_scan_thread_data.187;
  long long int time_major_scan_alloc_pinned.188;
  long long int time_major_scan_alloc_pinned.189;
  <unnamed type> D.24521;
  unsigned int D.24522;
  struct FinalizeReadyEntry * fin_ready_list.190;
  struct FinalizeReadyEntry * critical_fin_list.191;
  long long int time_major_scan_finalized.192;
  long long int time_major_scan_finalized.193;
  long long int time_major_scan_big_objects.194;
  long long int time_major_scan_big_objects.195;
  int concurrent_collection_in_progress.196;
  struct LOSObject * bigobj;
  gint64 atv;
  gint64 btv;
  char * heap_start;
  char * heap_end;
  gboolean profile_roots;
  struct GCRootReport root_report;
  struct ScanFromRegisteredRootsJobData * scrrjd_normal;
  struct ScanFromRegisteredRootsJobData * scrrjd_wbarrier;
  struct ScanThreadDataJobData * stdjd;
  struct ScanFinalizerEntriesJobData * sfejd_fin_ready;
  struct ScanFinalizerEntriesJobData * sfejd_critical_fin;
  struct ScanCopyContext ctx;

  try
    {
      heap_start = 0B;
      heap_end = -1B;
      D.24349 = mono_profiler_get_events ();
      D.24350 = (int) D.24349;
      profile_roots = D.24350 & 1048576;
      root_report = {};
      concurrent_collection_in_progress.154 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.154 != 0) goto <D.24352>; else goto <D.24353>;
      <D.24352>:
      sgen_nursery_allocator_prepare_for_pinning ();
      do_concurrent_checks.155 = do_concurrent_checks;
      if (do_concurrent_checks.155 != 0) goto <D.24355>; else goto <D.24356>;
      <D.24355>:
      check_nursery_is_clean ();
      <D.24356>:
      goto <D.24357>;
      <D.24353>:
      sgen_nursery_alloc_prepare_for_major ();
      <D.24357>:
      init_gray_queue ();
      atv = mono_100ns_ticks ();
      sgen_clear_nursery_fragments ();
      whole_heap_check_before_collection.156 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.156 != 0) goto <D.24359>; else goto <D.24360>;
      <D.24359>:
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.24360>:
      btv = mono_100ns_ticks ();
      D.24361 = btv - atv;
      D.24362 = D.24361 / 10;
      D.24363 = (int) D.24362;
      D.24364 = (long long int) D.24363;
      time_major_pre_collection_fragment_clear.157 = time_major_pre_collection_fragment_clear;
      time_major_pre_collection_fragment_clear.158 = D.24364 + time_major_pre_collection_fragment_clear.157;
      time_major_pre_collection_fragment_clear = time_major_pre_collection_fragment_clear.158;
      D.24367 = sgen_collection_is_concurrent ();
      if (D.24367 == 0) goto <D.24368>; else goto <D.24369>;
      <D.24368>:
      nursery_section.159 = nursery_section;
      D.24371 = sgen_get_nursery_end ();
      nursery_section.159->next_data = D.24371;
      <D.24369>:
      objects_pinned = 0;
      D.24372 = major_collector.have_swept;
      *D.24372 = 0;
      xdomain_checks.160 = xdomain_checks;
      if (xdomain_checks.160 != 0) goto <D.24374>; else goto <D.24375>;
      <D.24374>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.24375>:
      concurrent_collection_in_progress.161 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.161 == 0) goto <D.24377>; else goto <D.24378>;
      <D.24377>:
      D.24379 = remset.prepare_for_major_collection;
      D.24379 ();
      <D.24378>:
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      atv = mono_100ns_ticks ();
      sgen_init_pinning ();
      if (0 != 0) goto <D.24380>; else goto <D.24381>;
      <D.24380>:
      gc_debug_file.162 = gc_debug_file;
      fprintf (gc_debug_file.162, "Collecting pinned addresses\n");
      gc_debug_file.162 = gc_debug_file;
      fflush (gc_debug_file.162);
      <D.24381>:
      lowest_heap_address.163 = lowest_heap_address;
      lowest_heap_address.164 = (void *) lowest_heap_address.163;
      highest_heap_address.165 = highest_heap_address;
      highest_heap_address.166 = (void *) highest_heap_address.165;
      pin_from_roots (lowest_heap_address.164, highest_heap_address.166, &gray_queue);
      concurrent_collection_in_progress.167 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.167 == 0) goto <D.24387>; else goto <D.24390>;
      <D.24390>:
      if (finish_up_concurrent_mark != 0) goto <D.24387>; else goto <D.24388>;
      <D.24387>:
      D.24391 = major_collector.is_concurrent;
      if (D.24391 != 0) goto <D.24392>; else goto <D.24393>;
      <D.24392>:
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      <D.24393>:
      concurrent_collection_in_progress.168 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.168 == 0) goto <D.24395>; else goto <D.24396>;
      <D.24395>:
      sgen_cement_reset ();
      <D.24396>:
      <D.24388>:
      sgen_optimize_pin_queue (0);
      concurrent_collection_in_progress.169 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.169 != 0) goto <D.24398>; else goto <D.24399>;
      <D.24398>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.24399>:
      if (0 != 0) goto <D.24400>; else goto <D.24401>;
      <D.24400>:
      gc_debug_file.162 = gc_debug_file;
      fprintf (gc_debug_file.162, "Pinning from sections\n");
      gc_debug_file.162 = gc_debug_file;
      fflush (gc_debug_file.162);
      <D.24401>:
      nursery_section.159 = nursery_section;
      sgen_find_section_pin_queue_start_end (nursery_section.159);
      D.24402 = major_collector.find_pin_queue_start_ends;
      D.24402 (&gray_queue);
      if (0 != 0) goto <D.24403>; else goto <D.24404>;
      <D.24403>:
      gc_debug_file.162 = gc_debug_file;
      fprintf (gc_debug_file.162, "Pinning from large objects\n");
      gc_debug_file.162 = gc_debug_file;
      fflush (gc_debug_file.162);
      <D.24404>:
      bigobj = los_object_list;
      goto <D.21582>;
      <D.21581>:
      {
        int dummy;

        try
          {
            D.24405 = &bigobj->data;
            D.24406 = sgen_los_object_size (bigobj);
            D.24407 = &bigobj->data[D.24406];
            D.24408 = sgen_find_optimized_pin_queue_area (D.24405, D.24407, &dummy);
            if (D.24408 != 0B) goto <D.24409>; else goto <D.24410>;
            <D.24409>:
            D.24405 = &bigobj->data;
            D.24411 = sgen_los_object_is_pinned (D.24405);
            if (D.24411 != 0) goto <D.24412>; else goto <D.24413>;
            <D.24412>:
            D.24414 = finish_up_concurrent_mark == 0;
            D.24415 = (long int) D.24414;
            D.24416 = __builtin_expect (D.24415, 0);
            if (D.24416 != 0) goto <D.24417>; else goto <D.24418>;
            <D.24417>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2919, "finish_up_concurrent_mark");
            <D.24418>:
            // predicted unlikely by continue predictor.
            goto <D.21580>;
            <D.24413>:
            D.24405 = &bigobj->data;
            sgen_los_pin_object (D.24405);
            D.24405 = &bigobj->data;
            D.24419 = MEM[(mword *)D.24405];
            D.24420 = D.24419 & 18446744073709551612;
            D.24421 = (struct MonoVTable *) D.24420;
            D.24422 = D.24421->gc_descr;
            D.24423 = (long unsigned int) D.24422;
            D.24424 = sgen_gc_descr_has_references (D.24423);
            if (D.24424 != 0) goto <D.24425>; else goto <D.24426>;
            <D.24425>:
            D.24431 = gray_queue.first;
            if (D.24431 == 0B) goto <D.24428>; else goto <D.24432>;
            <D.24432>:
            D.24431 = gray_queue.first;
            D.24433 = D.24431->end;
            if (D.24433 == 125) goto <D.24428>; else goto <D.24429>;
            <D.24428>:
            iftmp.170 = 1;
            goto <D.24430>;
            <D.24429>:
            iftmp.170 = 0;
            <D.24430>:
            D.24434 = iftmp.170 != 0;
            D.24435 = (long int) D.24434;
            D.24436 = __builtin_expect (D.24435, 0);
            if (D.24436 != 0) goto <D.24437>; else goto <D.24438>;
            <D.24437>:
            D.24405 = &bigobj->data;
            sgen_gray_object_enqueue (&gray_queue, D.24405);
            goto <D.24439>;
            <D.24438>:
            D.24431 = gray_queue.first;
            D.24431 = gray_queue.first;
            D.24433 = D.24431->end;
            D.24440 = D.24433;
            D.24441 = D.24440 + 1;
            D.24431->end = D.24441;
            D.24405 = &bigobj->data;
            D.24431->objects[D.24440] = D.24405;
            <D.24439>:
            D.24405 = &bigobj->data;
            __builtin_prefetch (D.24405);
            <D.24426>:
            do_pin_stats.171 = do_pin_stats;
            D.24443 = do_pin_stats.171 != 0;
            D.24444 = (long int) D.24443;
            D.24445 = __builtin_expect (D.24444, 0);
            if (D.24445 != 0) goto <D.24446>; else goto <D.24447>;
            <D.24446>:
            D.24405 = &bigobj->data;
            D.24405 = &bigobj->data;
            D.24448 = sgen_safe_object_get_size (D.24405);
            D.24449 = (long unsigned int) D.24448;
            sgen_pin_stats_register_object (D.24405, D.24449);
            <D.24447>:
            if (0 != 0) goto <D.24450>; else goto <D.24451>;
            <D.24450>:
            gc_debug_file.162 = gc_debug_file;
            D.24405 = &bigobj->data;
            D.24405 = &bigobj->data;
            D.24452 = safe_name (D.24405);
            D.24453 = sgen_los_object_size (bigobj);
            fprintf (gc_debug_file.162, "Marked large object %p (%s) size: %lu from roots\n", D.24405, D.24452, D.24453);
            gc_debug_file.162 = gc_debug_file;
            fflush (gc_debug_file.162);
            <D.24451>:
            if (profile_roots != 0) goto <D.24454>; else goto <D.24455>;
            <D.24454>:
            D.24405 = &bigobj->data;
            add_profile_gc_root (&root_report, D.24405, 260, 0);
            <D.24455>:
            <D.24410>:
          }
        finally
          {
            dummy = {CLOBBER};
          }
      }
      <D.21580>:
      bigobj = bigobj->next;
      <D.21582>:
      if (bigobj != 0B) goto <D.21581>; else goto <D.21583>;
      <D.21583>:
      if (profile_roots != 0) goto <D.24456>; else goto <D.24457>;
      <D.24456>:
      notify_gc_roots (&root_report);
      <D.24457>:
      concurrent_collection_in_progress.173 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.173 != 0) goto <D.24460>; else goto <D.24461>;
      <D.24460>:
      iftmp.172 = current_object_ops.scan_object;
      goto <D.24462>;
      <D.24461>:
      iftmp.172 = 0B;
      <D.24462>:
      ctx.scan_func = iftmp.172;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      concurrent_collection_in_progress.174 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.174 != 0) goto <D.24466>; else goto <D.24463>;
      <D.24466>:
      D.24467 = sgen_minor_collector.is_split;
      if (D.24467 != 0) goto <D.24468>; else goto <D.24463>;
      <D.24468>:
      scan_nursery_objects (ctx);
      goto <D.24464>;
      <D.24463>:
      nursery_section.159 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.159, ctx);
      check_nursery_objects_pinned.175 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.175 != 0) goto <D.24470>; else goto <D.24471>;
      <D.24470>:
      D.24467 = sgen_minor_collector.is_split;
      if (D.24467 == 0) goto <D.24472>; else goto <D.24473>;
      <D.24472>:
      concurrent_collection_in_progress.177 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.177 == 0) goto <D.24475>; else goto <D.24479>;
      <D.24479>:
      if (finish_up_concurrent_mark != 0) goto <D.24475>; else goto <D.24476>;
      <D.24475>:
      iftmp.176 = 1;
      goto <D.24477>;
      <D.24476>:
      iftmp.176 = 0;
      <D.24477>:
      sgen_check_nursery_objects_pinned (iftmp.176);
      <D.24473>:
      <D.24471>:
      <D.24464>:
      D.24480 = major_collector.pin_objects;
      D.24480 (&gray_queue);
      if (old_next_pin_slot != 0B) goto <D.24481>; else goto <D.24482>;
      <D.24481>:
      D.24483 = sgen_get_pinned_count ();
      *old_next_pin_slot = D.24483;
      <D.24482>:
      btv = mono_100ns_ticks ();
      D.24361 = btv - atv;
      D.24362 = D.24361 / 10;
      D.24363 = (int) D.24362;
      D.24364 = (long long int) D.24363;
      time_major_pinning.178 = time_major_pinning;
      time_major_pinning.179 = D.24364 + time_major_pinning.178;
      time_major_pinning = time_major_pinning.179;
      gc_debug_level.180 = gc_debug_level;
      D.24487 = gc_debug_level.180 > 1;
      D.24488 = (long int) D.24487;
      D.24489 = __builtin_expect (D.24488, 0);
      if (D.24489 != 0) goto <D.24490>; else goto <D.24491>;
      <D.24490>:
      gc_debug_file.162 = gc_debug_file;
      D.24492 = sgen_get_pinned_count ();
      D.24361 = btv - atv;
      D.24362 = D.24361 / 10;
      D.24363 = (int) D.24362;
      fprintf (gc_debug_file.162, "Finding pinned pointers: %d in %d usecs\n", D.24492, D.24363);
      gc_debug_file.162 = gc_debug_file;
      fflush (gc_debug_file.162);
      <D.24491>:
      if (0 != 0) goto <D.24493>; else goto <D.24494>;
      <D.24493>:
      gc_debug_file.162 = gc_debug_file;
      D.24495 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.162, "Start scan with %d pinned objects\n", D.24495);
      gc_debug_file.162 = gc_debug_file;
      fflush (gc_debug_file.162);
      <D.24494>:
      D.24496 = major_collector.init_to_space;
      D.24496 ();
      concurrent_collection_in_progress.181 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.181 == 0) goto <D.24498>; else goto <D.24499>;
      <D.24498>:
      D.24500 = major_collector.is_parallel;
      if (D.24500 != 0) goto <D.24501>; else goto <D.24502>;
      <D.24501>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      <D.24502>:
      <D.24499>:
      D.24503 = mono_profiler_get_events ();
      D.24504 = D.24503 & 1048576;
      if (D.24504 != 0) goto <D.24505>; else goto <D.24506>;
      <D.24505>:
      report_registered_roots ();
      <D.24506>:
      atv = mono_100ns_ticks ();
      D.24507 = atv - btv;
      D.24508 = D.24507 / 10;
      D.24509 = (int) D.24508;
      D.24510 = (long long int) D.24509;
      time_major_scan_pinned.182 = time_major_scan_pinned;
      time_major_scan_pinned.183 = D.24510 + time_major_scan_pinned.182;
      time_major_scan_pinned = time_major_scan_pinned.183;
      scrrjd_normal = sgen_alloc_internal_dynamic (40, 20, 1);
      D.24513 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.24513;
      D.24514 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.24514;
      scrrjd_normal->heap_start = heap_start;
      scrrjd_normal->heap_end = heap_end;
      scrrjd_normal->root_type = 0;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_normal);
      scrrjd_wbarrier = sgen_alloc_internal_dynamic (40, 20, 1);
      D.24513 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.24513;
      D.24514 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.24514;
      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.24361 = btv - atv;
      D.24362 = D.24361 / 10;
      D.24363 = (int) D.24362;
      D.24364 = (long long int) D.24363;
      time_major_scan_registered_roots.184 = time_major_scan_registered_roots;
      time_major_scan_registered_roots.185 = D.24364 + time_major_scan_registered_roots.184;
      time_major_scan_registered_roots = time_major_scan_registered_roots.185;
      stdjd = sgen_alloc_internal_dynamic (16, 20, 1);
      stdjd->heap_start = heap_start;
      stdjd->heap_end = heap_end;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.24507 = atv - btv;
      D.24508 = D.24507 / 10;
      D.24509 = (int) D.24508;
      D.24510 = (long long int) D.24509;
      time_major_scan_thread_data.186 = time_major_scan_thread_data;
      time_major_scan_thread_data.187 = D.24510 + time_major_scan_thread_data.186;
      time_major_scan_thread_data = time_major_scan_thread_data.187;
      btv = mono_100ns_ticks ();
      D.24361 = btv - atv;
      D.24362 = D.24361 / 10;
      D.24363 = (int) D.24362;
      D.24364 = (long long int) D.24363;
      time_major_scan_alloc_pinned.188 = time_major_scan_alloc_pinned;
      time_major_scan_alloc_pinned.189 = D.24364 + time_major_scan_alloc_pinned.188;
      time_major_scan_alloc_pinned = time_major_scan_alloc_pinned.189;
      D.24521 = mono_profiler_get_events ();
      D.24522 = D.24521 & 1048576;
      if (D.24522 != 0) goto <D.24523>; else goto <D.24524>;
      <D.24523>:
      report_finalizer_roots ();
      <D.24524>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (8, 20, 1);
      fin_ready_list.190 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.190;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (8, 20, 1);
      critical_fin_list.191 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.191;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      if (scan_mod_union != 0) goto <D.24527>; else goto <D.24528>;
      <D.24527>:
      D.24414 = finish_up_concurrent_mark == 0;
      D.24415 = (long int) D.24414;
      D.24416 = __builtin_expect (D.24415, 0);
      if (D.24416 != 0) goto <D.24529>; else goto <D.24530>;
      <D.24529>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3038, "finish_up_concurrent_mark");
      <D.24530>:
      sgen_workers_enqueue_job (job_scan_major_mod_union_cardtable, 0B);
      sgen_workers_enqueue_job (job_scan_los_mod_union_cardtable, 0B);
      <D.24528>:
      atv = mono_100ns_ticks ();
      D.24507 = atv - btv;
      D.24508 = D.24507 / 10;
      D.24509 = (int) D.24508;
      D.24510 = (long long int) D.24509;
      time_major_scan_finalized.192 = time_major_scan_finalized;
      time_major_scan_finalized.193 = D.24510 + time_major_scan_finalized.192;
      time_major_scan_finalized = time_major_scan_finalized.193;
      gc_debug_level.180 = gc_debug_level;
      D.24487 = gc_debug_level.180 > 1;
      D.24488 = (long int) D.24487;
      D.24489 = __builtin_expect (D.24488, 0);
      if (D.24489 != 0) goto <D.24533>; else goto <D.24534>;
      <D.24533>:
      gc_debug_file.162 = gc_debug_file;
      D.24507 = atv - btv;
      D.24508 = D.24507 / 10;
      D.24509 = (int) D.24508;
      fprintf (gc_debug_file.162, "Root scan: %d usecs\n", D.24509);
      gc_debug_file.162 = gc_debug_file;
      fflush (gc_debug_file.162);
      <D.24534>:
      btv = mono_100ns_ticks ();
      D.24361 = btv - atv;
      D.24362 = D.24361 / 10;
      D.24363 = (int) D.24362;
      D.24364 = (long long int) D.24363;
      time_major_scan_big_objects.194 = time_major_scan_big_objects;
      time_major_scan_big_objects.195 = D.24364 + time_major_scan_big_objects.194;
      time_major_scan_big_objects = time_major_scan_big_objects.195;
      concurrent_collection_in_progress.196 = concurrent_collection_in_progress;
      if (concurrent_collection_in_progress.196 != 0) goto <D.24538>; else goto <D.24539>;
      <D.24538>:
      sgen_finish_pinning ();
      sgen_pin_stats_reset ();
      do_concurrent_checks.155 = do_concurrent_checks;
      if (do_concurrent_checks.155 != 0) goto <D.24540>; else goto <D.24541>;
      <D.24540>:
      check_nursery_is_clean ();
      <D.24541>:
      <D.24539>:
    }
  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.197;
  _Bool D.24545;
  long int D.24546;
  long int D.24547;
  struct SgenGrayQueue * D.24550;

  concurrent_collection_in_progress.197 = concurrent_collection_in_progress;
  D.24545 = concurrent_collection_in_progress.197 == 0;
  D.24546 = (long int) D.24545;
  D.24547 = __builtin_expect (D.24546, 0);
  if (D.24547 != 0) goto <D.24548>; else goto <D.24549>;
  <D.24548>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2390, "concurrent_collection_in_progress");
  <D.24549>:
  D.24550 = sgen_workers_get_job_gray_queue (worker_data);
  sgen_los_scan_card_table (1, D.24550);
}


sgen_workers_get_job_gray_queue (struct WorkerData * worker_data)
{
  struct SgenGrayQueue * D.24551;
  struct SgenGrayQueue * iftmp.198;

  if (worker_data != 0B) goto <D.24553>; else goto <D.24554>;
  <D.24553>:
  iftmp.198 = &worker_data->private_gray_queue;
  goto <D.24555>;
  <D.24554>:
  iftmp.198 = &gray_queue;
  <D.24555>:
  D.24551 = iftmp.198;
  return D.24551;
}


job_scan_major_mod_union_cardtable (struct WorkerData * worker_data, void * job_data_untyped)
{
  int concurrent_collection_in_progress.199;
  _Bool D.24558;
  long int D.24559;
  long int D.24560;
  void (*<T2d8c>) (gboolean, struct SgenGrayQueue *) D.24563;
  struct SgenGrayQueue * D.24564;

  concurrent_collection_in_progress.199 = concurrent_collection_in_progress;
  D.24558 = concurrent_collection_in_progress.199 == 0;
  D.24559 = (long int) D.24558;
  D.24560 = __builtin_expect (D.24559, 0);
  if (D.24560 != 0) goto <D.24561>; else goto <D.24562>;
  <D.24561>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2383, "concurrent_collection_in_progress");
  <D.24562>:
  D.24563 = major_collector.scan_card_table;
  D.24564 = sgen_workers_get_job_gray_queue (worker_data);
  D.24563 (1, D.24564);
}


job_scan_finalizer_entries (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2c8a>) (void * *, struct SgenGrayQueue *) D.24565;
  struct SgenGrayQueue * D.24566;
  struct FinalizeReadyEntry * D.24567;
  struct ScanFinalizerEntriesJobData * job_data;
  struct ScanCopyContext ctx;

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


scan_finalizer_entries (struct FinalizeReadyEntry * list, struct ScanCopyContext ctx)
{
  void * D.24568;
  struct FILE * gc_debug_file.200;
  const char * D.24574;
  void * * D.24575;
  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.21307>;
  <D.21306>:
  D.24568 = fin->object;
  if (D.24568 == 0B) goto <D.24569>; else goto <D.24570>;
  <D.24569>:
  // predicted unlikely by continue predictor.
  goto <D.21305>;
  <D.24570>:
  if (0 != 0) goto <D.24571>; else goto <D.24572>;
  <D.24571>:
  gc_debug_file.200 = gc_debug_file;
  D.24568 = fin->object;
  D.24568 = fin->object;
  D.24574 = safe_name (D.24568);
  fprintf (gc_debug_file.200, "Scan of fin ready object: %p (%s)\n\n", D.24568, D.24574);
  gc_debug_file.200 = gc_debug_file;
  fflush (gc_debug_file.200);
  <D.24572>:
  D.24575 = &fin->object;
  copy_func (D.24575, queue);
  <D.21305>:
  fin = fin->next;
  <D.21307>:
  if (fin != 0B) goto <D.21306>; else goto <D.21308>;
  <D.21308>:
}


job_scan_thread_data (struct WorkerData * worker_data, void * job_data_untyped)
{
  char * D.24576;
  char * D.24577;
  struct SgenGrayQueue * D.24578;
  struct ScanThreadDataJobData * job_data;

  job_data = job_data_untyped;
  D.24576 = job_data->heap_start;
  D.24577 = job_data->heap_end;
  D.24578 = sgen_workers_get_job_gray_queue (worker_data);
  scan_thread_data (D.24576, D.24577, 1, D.24578);
  sgen_free_internal_dynamic (job_data, 16, 20);
}


scan_thread_data (void * start_nursery, void * end_nursery, gboolean precise, struct GrayQueue * queue)
{
  struct MonoLinkedListSet * D.24579;
  struct MonoLinkedListSetNode * D.24580;
  long unsigned int D.24581;
  int D.24584;
  struct FILE * gc_debug_file.201;
  void * D.24590;
  void * D.24591;
  long int D.24592;
  long int D.24593;
  long int D.24594;
  int D.24595;
  int D.24600;
  int D.24601;
  int D.24608;
  void (*<T2b40>) (void *, guint8 *, guint8 *, gboolean) D.24611;
  int conservative_stack_mark.202;
  void * D.24615;
  struct _IO_FILE * stderr.203;
  void *[32] * D.24623;
  void * * D.24624;
  struct SgenThreadInfo * info;

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

    D.24579 = mono_thread_info_list_head ();
    __cur = D.24579->head;
    goto <D.21811>;
    <D.21810>:
    D.24580 = __cur->next;
    D.24581 = mono_lls_pointer_get_mark (D.24580);
    if (D.24581 == 0) goto <D.24582>; else goto <D.24583>;
    <D.24582>:
    info = __cur;
    D.24584 = info->skip;
    if (D.24584 != 0) goto <D.24585>; else goto <D.24586>;
    <D.24585>:
    if (0 != 0) goto <D.24587>; else goto <D.24588>;
    <D.24587>:
    gc_debug_file.201 = gc_debug_file;
    D.24590 = info->stack_start;
    D.24591 = info->stack_end;
    D.24591 = info->stack_end;
    D.24592 = (long int) D.24591;
    D.24590 = info->stack_start;
    D.24593 = (long int) D.24590;
    D.24594 = D.24592 - D.24593;
    fprintf (gc_debug_file.201, "Skipping dead thread %p, range: %p-%p, size: %td\n", info, D.24590, D.24591, D.24594);
    gc_debug_file.201 = gc_debug_file;
    fflush (gc_debug_file.201);
    <D.24588>:
    // predicted unlikely by continue predictor.
    goto <D.21808>;
    <D.24586>:
    D.24595 = info->gc_disabled;
    if (D.24595 != 0) goto <D.24596>; else goto <D.24597>;
    <D.24596>:
    if (0 != 0) goto <D.24598>; else goto <D.24599>;
    <D.24598>:
    gc_debug_file.201 = gc_debug_file;
    D.24590 = info->stack_start;
    D.24591 = info->stack_end;
    D.24591 = info->stack_end;
    D.24592 = (long int) D.24591;
    D.24590 = info->stack_start;
    D.24593 = (long int) D.24590;
    D.24594 = D.24592 - D.24593;
    fprintf (gc_debug_file.201, "GC disabled for thread %p, range: %p-%p, size: %td\n", info, D.24590, D.24591, D.24594);
    gc_debug_file.201 = gc_debug_file;
    fflush (gc_debug_file.201);
    <D.24599>:
    // predicted unlikely by continue predictor.
    goto <D.21808>;
    <D.24597>:
    D.24600 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.24601 = D.24600 & 15;
    if (D.24601 != 1) goto <D.24602>; else goto <D.24603>;
    <D.24602>:
    if (0 != 0) goto <D.24604>; else goto <D.24605>;
    <D.24604>:
    gc_debug_file.201 = gc_debug_file;
    D.24590 = info->stack_start;
    D.24591 = info->stack_end;
    D.24591 = info->stack_end;
    D.24592 = (long int) D.24591;
    D.24590 = info->stack_start;
    D.24593 = (long int) D.24590;
    D.24594 = D.24592 - D.24593;
    D.24600 = MEM[(struct MonoThreadInfo *)info].thread_state;
    D.24601 = D.24600 & 15;
    fprintf (gc_debug_file.201, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)\n", info, D.24590, D.24591, D.24594, D.24601);
    gc_debug_file.201 = gc_debug_file;
    fflush (gc_debug_file.201);
    <D.24605>:
    // predicted unlikely by continue predictor.
    goto <D.21808>;
    <D.24603>:
    if (0 != 0) goto <D.24606>; else goto <D.24607>;
    <D.24606>:
    gc_debug_file.201 = gc_debug_file;
    D.24590 = info->stack_start;
    D.24591 = info->stack_end;
    D.24591 = info->stack_end;
    D.24592 = (long int) D.24591;
    D.24590 = info->stack_start;
    D.24593 = (long int) D.24590;
    D.24594 = D.24592 - D.24593;
    D.24608 = sgen_get_pinned_count ();
    fprintf (gc_debug_file.201, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d\n", info, D.24590, D.24591, D.24594, D.24608);
    gc_debug_file.201 = gc_debug_file;
    fflush (gc_debug_file.201);
    <D.24607>:
    D.24611 = gc_callbacks.thread_mark_func;
    if (D.24611 != 0B) goto <D.24612>; else goto <D.24609>;
    <D.24612>:
    conservative_stack_mark.202 = conservative_stack_mark;
    if (conservative_stack_mark.202 == 0) goto <D.24614>; else goto <D.24609>;
    <D.24614>:
    {
      struct UserCopyOrMarkData data;

      try
        {
          data.func = 0B;
          data.queue = queue;
          set_user_copy_or_mark_data (&data);
          D.24611 = gc_callbacks.thread_mark_func;
          D.24615 = info->runtime_data;
          D.24590 = info->stack_start;
          D.24591 = info->stack_end;
          D.24611 (D.24615, D.24590, D.24591, precise);
          set_user_copy_or_mark_data (0B);
        }
      finally
        {
          data = {CLOBBER};
        }
    }
    goto <D.24610>;
    <D.24609>:
    if (precise == 0) goto <D.24616>; else goto <D.24617>;
    <D.24616>:
    conservative_stack_mark.202 = conservative_stack_mark;
    if (conservative_stack_mark.202 == 0) goto <D.24618>; else goto <D.24619>;
    <D.24618>:
    stderr.203 = stderr;
    fprintf (stderr.203, "Precise stack mark not supported - disabling.\n");
    conservative_stack_mark = 1;
    <D.24619>:
    D.24590 = info->stack_start;
    D.24591 = info->stack_end;
    conservatively_pin_objects_from (D.24590, D.24591, start_nursery, end_nursery, 0);
    <D.24617>:
    <D.24610>:
    if (precise == 0) goto <D.24621>; else goto <D.24622>;
    <D.24621>:
    D.24623 = &info->regs;
    D.24624 = &info->regs[32];
    conservatively_pin_objects_from (D.24623, D.24624, start_nursery, end_nursery, 0);
    <D.24622>:
    <D.24583>:
    <D.21808>:
    D.24580 = __cur->next;
    __cur = mono_lls_pointer_unmask (D.24580);
    <D.21811>:
    if (__cur != 0B) goto <D.21810>; else goto <D.21812>;
    <D.21812>:
  }
}


mono_lls_pointer_get_mark (void * n)
{
  uintptr_t D.24625;
  long unsigned int n.204;

  n.204 = (long unsigned int) n;
  D.24625 = n.204 & 1;
  return D.24625;
}


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

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


mono_native_tls_set_value (pthread_key_t key, void * value)
{
  int D.24629;
  int D.24630;
  _Bool D.24631;

  D.24630 = pthread_setspecific (key, value);
  D.24631 = D.24630 == 0;
  D.24629 = (int) D.24631;
  return D.24629;
}


conservatively_pin_objects_from (void * * start, void * * end, void * start_nursery, void * end_nursery, int pin_type)
{
  long long unsigned int D.21124;
  long long unsigned int start.206;
  long int end.207;
  long int start.208;
  long int D.24636;
  long long unsigned int D.24637;
  void * D.24638;
  long unsigned int start_nursery.209;
  long unsigned int end_nursery.210;
  struct FILE * gc_debug_file.211;
  void * addr.212;
  int do_pin_stats.213;
  _Bool D.24654;
  long int D.24655;
  long int D.24656;
  int D.24659;
  char * addr.214;
  int count;

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

    try
      {
        _zzq_args[0] = 1296236555;
        start.206 = (long long unsigned int) start;
        _zzq_args[1] = start.206;
        end.207 = (long int) end;
        start.208 = (long int) start;
        D.24636 = end.207 - start.208;
        D.24637 = (long long unsigned int) D.24636;
        _zzq_args[2] = D.24637;
        _zzq_args[3] = 0;
        _zzq_args[4] = 0;
        _zzq_args[5] = 0;
        _zzq_ptr = &_zzq_args;
        __asm__ __volatile__("mr 3,%1
	mr 4,%2
	rotldi 0,0,3  ; rotldi 0,0,13
	rotldi 0,0,61 ; rotldi 0,0,51
	or 1,1,1
	mr %0,3" : "=b" _zzq_result : "b" 0, "b" _zzq_ptr : "r4", "r3", "memory", "cc");
        D.21124 = _zzq_result;
      }
    finally
      {
        _zzq_args = {CLOBBER};
      }
  }
  goto <D.21127>;
  <D.21126>:
  D.24638 = *start;
  if (D.24638 >= start_nursery) goto <D.24639>; else goto <D.24640>;
  <D.24639>:
  D.24638 = *start;
  if (D.24638 < end_nursery) goto <D.24641>; else goto <D.24642>;
  <D.24641>:
  {
    mword addr;

    D.24638 = *start;
    addr = (mword) D.24638;
    addr = addr & 18446744073709551608;
    start_nursery.209 = (long unsigned int) start_nursery;
    if (start_nursery.209 <= addr) goto <D.24644>; else goto <D.24645>;
    <D.24644>:
    end_nursery.210 = (long unsigned int) end_nursery;
    if (end_nursery.210 > addr) goto <D.24647>; else goto <D.24648>;
    <D.24647>:
    if (0 != 0) goto <D.24649>; else goto <D.24650>;
    <D.24649>:
    gc_debug_file.211 = gc_debug_file;
    addr.212 = (void *) addr;
    fprintf (gc_debug_file.211, "Pinning address %p from %p\n", addr.212, start);
    gc_debug_file.211 = gc_debug_file;
    fflush (gc_debug_file.211);
    <D.24650>:
    addr.212 = (void *) addr;
    sgen_pin_stage_ptr (addr.212);
    count = count + 1;
    <D.24648>:
    <D.24645>:
    do_pin_stats.213 = do_pin_stats;
    D.24654 = do_pin_stats.213 != 0;
    D.24655 = (long int) D.24654;
    D.24656 = __builtin_expect (D.24655, 0);
    if (D.24656 != 0) goto <D.24657>; else goto <D.24658>;
    <D.24657>:
    addr.212 = (void *) addr;
    D.24659 = sgen_ptr_in_nursery (addr.212);
    if (D.24659 != 0) goto <D.24660>; else goto <D.24661>;
    <D.24660>:
    addr.214 = (char *) addr;
    sgen_pin_stats_register_address (addr.214, pin_type);
    <D.24661>:
    <D.24658>:
  }
  <D.24642>:
  <D.24640>:
  start = start + 8;
  <D.21127>:
  if (start < end) goto <D.21126>; else goto <D.21128>;
  <D.21128>:
  if (count != 0) goto <D.24663>; else goto <D.24664>;
  <D.24663>:
  if (0 != 0) goto <D.24665>; else goto <D.24666>;
  <D.24665>:
  gc_debug_file.211 = gc_debug_file;
  fprintf (gc_debug_file.211, "found %d potential pinned heap pointers\n", count);
  gc_debug_file.211 = gc_debug_file;
  fflush (gc_debug_file.211);
  <D.24666>:
  <D.24664>:
}


mono_lls_pointer_unmask (void * p)
{
  void * D.24667;
  long unsigned int p.215;
  long unsigned int D.24669;

  p.215 = (long unsigned int) p;
  D.24669 = p.215 & 18446744073709551612;
  D.24667 = (void *) D.24669;
  return D.24667;
}


job_scan_from_registered_roots (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2c8f>) (char *, struct SgenGrayQueue *) D.24671;
  void (*<T2c8a>) (void * *, struct SgenGrayQueue *) D.24672;
  struct SgenGrayQueue * D.24673;
  char * D.24674;
  char * D.24675;
  int D.24676;
  struct ScanFromRegisteredRootsJobData * job_data;
  struct ScanCopyContext ctx;

  try
    {
      job_data = job_data_untyped;
      D.24671 = job_data->scan_func;
      ctx.scan_func = D.24671;
      D.24672 = job_data->copy_or_mark_func;
      ctx.copy_func = D.24672;
      D.24673 = sgen_workers_get_job_gray_queue (worker_data);
      ctx.queue = D.24673;
      D.24674 = job_data->heap_start;
      D.24675 = job_data->heap_end;
      D.24676 = job_data->root_type;
      scan_from_registered_roots (D.24674, D.24675, D.24676, ctx);
      sgen_free_internal_dynamic (job_data, 40, 20);
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


scan_from_registered_roots (char * addr_start, char * addr_end, int root_type, struct ScanCopyContext ctx)
{
  long unsigned int D.24677;
  long unsigned int D.24678;
  struct FILE * gc_debug_file.216;
  char * D.24682;
  long unsigned int D.24683;
  void * D.24684;
  struct SgenHashTableEntry * D.24685;
  unsigned int D.24686;
  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.21369>;
    <D.21368>:
    {
      struct SgenHashTableEntry * * __iter;
      struct SgenHashTableEntry * * __next;

      D.24677 = (long unsigned int) __i;
      D.24678 = D.24677 * 8;
      __iter = __table + D.24678;
      goto <D.21366>;
      <D.21365>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.24679>; else goto <D.24680>;
        <D.24679>:
        gc_debug_file.216 = gc_debug_file;
        D.24682 = root->end_root;
        D.24683 = root->root_desc;
        D.24684 = (void *) D.24683;
        fprintf (gc_debug_file.216, "Precise root scan %p-%p (desc: %p)\n", start_root, D.24682, D.24684);
        gc_debug_file.216 = gc_debug_file;
        fflush (gc_debug_file.216);
        <D.24680>:
        D.24682 = root->end_root;
        D.24683 = root->root_desc;
        precisely_scan_objects_from (start_root, D.24682, addr_start, addr_end, D.24683, ctx);
      }
      __iter = __next;
      <D.21366>:
      D.24685 = *__iter;
      if (D.24685 != 0B) goto <D.21365>; else goto <D.21367>;
      <D.21367>:
    }
    __i = __i + 1;
    <D.21369>:
    D.24686 = roots_hash[root_type].size;
    if (D.24686 > __i) goto <D.21368>; else goto <D.21370>;
    <D.21370>:
  }
}


precisely_scan_objects_from (void * * start_root, void * * end_root, char * n_start, char * n_end, mword desc, struct ScanCopyContext ctx)
{
  long unsigned int D.24687;
  long unsigned int D.24688;
  void * D.24691;
  struct FILE * gc_debug_file.217;
  long unsigned int D.24697;
  unsigned int D.24698;
  unsigned int D.24699;
  gsize * bitmap_data.218;
  long unsigned int D.24701;
  void * D.24704;
  int bwords.219;
  void (*CopyOrMarkObjectFunc) (void * *, struct SgenGrayQueue *) copy_func;
  struct SgenGrayQueue * queue;

  copy_func = ctx.copy_func;
  queue = ctx.queue;
  D.24687 = desc & 7;
  switch (D.24687) <default: <D.21200>, case 1: <D.21179>, case 2: <D.21199>, case 3: <D.21183>, case 4: <D.21196>>
  <D.21179>:
  desc = desc >> 3;
  goto <D.21181>;
  <D.21180>:
  D.24688 = desc & 1;
  if (D.24688 != 0) goto <D.24689>; else goto <D.24690>;
  <D.24689>:
  D.24691 = *start_root;
  if (D.24691 != 0B) goto <D.24692>; else goto <D.24693>;
  <D.24692>:
  copy_func (start_root, queue);
  if (0 != 0) goto <D.24694>; else goto <D.24695>;
  <D.24694>:
  gc_debug_file.217 = gc_debug_file;
  D.24691 = *start_root;
  fprintf (gc_debug_file.217, "Overwrote root at %p with %p\n", start_root, D.24691);
  gc_debug_file.217 = gc_debug_file;
  fflush (gc_debug_file.217);
  <D.24695>:
  sgen_drain_gray_stack (-1, ctx);
  <D.24693>:
  <D.24690>:
  desc = desc >> 1;
  start_root = start_root + 8;
  <D.21181>:
  if (desc != 0) goto <D.21180>; else goto <D.21182>;
  <D.21182>:
  return;
  <D.21183>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.24697 = *bitmap_data;
    D.24698 = (unsigned int) D.24697;
    D.24699 = D.24698 + 4294967295;
    bwords = (int) D.24699;
    start_run = start_root;
    bitmap_data = bitmap_data + 8;
    goto <D.21193>;
    <D.21192>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.218 = bitmap_data;
      bitmap_data = bitmap_data.218 + 8;
      bmap = *bitmap_data.218;
      objptr = start_run;
      goto <D.21190>;
      <D.21189>:
      D.24701 = bmap & 1;
      if (D.24701 != 0) goto <D.24702>; else goto <D.24703>;
      <D.24702>:
      D.24704 = *objptr;
      if (D.24704 != 0B) goto <D.24705>; else goto <D.24706>;
      <D.24705>:
      copy_func (objptr, queue);
      if (0 != 0) goto <D.24707>; else goto <D.24708>;
      <D.24707>:
      gc_debug_file.217 = gc_debug_file;
      D.24704 = *objptr;
      fprintf (gc_debug_file.217, "Overwrote root at %p with %p\n", objptr, D.24704);
      gc_debug_file.217 = gc_debug_file;
      fflush (gc_debug_file.217);
      <D.24708>:
      sgen_drain_gray_stack (-1, ctx);
      <D.24706>:
      <D.24703>:
      bmap = bmap >> 1;
      objptr = objptr + 8;
      <D.21190>:
      if (bmap != 0) goto <D.21189>; else goto <D.21191>;
      <D.21191>:
      start_run = start_run + 512;
    }
    <D.21193>:
    bwords.219 = bwords;
    bwords = bwords.219 + -1;
    if (bwords.219 > 0) goto <D.21192>; else goto <D.21194>;
    <D.21194>:
    goto <D.21195>;
  }
  <D.21196>:
  {
    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.21195>;
      }
    finally
      {
        data = {CLOBBER};
      }
  }
  <D.21199>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1637);
  <D.21200>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1639);
  <D.21195>:
}


single_arg_user_copy_or_mark (void * * obj)
{
  unsigned int user_copy_or_mark_key.220;
  void (*<T2c8a>) (void * *, struct SgenGrayQueue *) D.24713;
  struct GrayQueue * D.24714;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.220 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.220);
  D.24713 = data->func;
  D.24714 = data->queue;
  D.24713 (obj, D.24714);
}


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


init_gray_queue ()
{
  int D.24718;
  int D.24720;
  struct SgenSectionGrayQueue * D.24721;

  D.24718 = sgen_collection_is_parallel ();
  if (D.24718 != 0) goto <D.24715>; else goto <D.24719>;
  <D.24719>:
  D.24720 = sgen_collection_is_concurrent ();
  if (D.24720 != 0) goto <D.24715>; else goto <D.24716>;
  <D.24715>:
  sgen_workers_init_distribute_gray_queue ();
  D.24721 = sgen_workers_get_distribute_section_gray_queue ();
  sgen_gray_object_queue_init_with_alloc_prepare (&gray_queue, 0B, gray_queue_redirect, D.24721);
  goto <D.24717>;
  <D.24716>:
  sgen_gray_object_queue_init (&gray_queue, 0B);
  <D.24717>:
}


gray_queue_redirect (struct SgenGrayQueue * queue)
{
  void * D.24723;
  int iftmp.221;
  int concurrent_collection_in_progress.222;
  int current_collection_generation.223;
  int D.24734;
  _Bool D.24735;
  long int D.24736;
  long int D.24737;
  int D.24740;
  int concurrent_collection_in_progress.224;
  _Bool D.24747;
  long int D.24748;
  long int D.24749;
  gboolean wake;

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

    section = sgen_gray_object_dequeue_section (queue);
    if (section == 0B) goto <D.20491>; else goto <D.24722>;
    <D.24722>:
    D.24723 = queue->alloc_prepare_data;
    sgen_section_gray_queue_enqueue (D.24723, section);
    wake = 1;
  }
  goto <D.20492>;
  <D.20491>:
  if (wake != 0) goto <D.24724>; else goto <D.24725>;
  <D.24724>:
  concurrent_collection_in_progress.222 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.222 == 0) goto <D.24731>; else goto <D.24727>;
  <D.24731>:
  current_collection_generation.223 = current_collection_generation;
  if (current_collection_generation.223 != 1) goto <D.24728>; else goto <D.24733>;
  <D.24733>:
  D.24734 = major_collector.is_parallel;
  if (D.24734 == 0) goto <D.24728>; else goto <D.24727>;
  <D.24728>:
  iftmp.221 = 1;
  goto <D.24729>;
  <D.24727>:
  iftmp.221 = 0;
  <D.24729>:
  D.24735 = iftmp.221 != 0;
  D.24736 = (long int) D.24735;
  D.24737 = __builtin_expect (D.24736, 0);
  if (D.24737 != 0) goto <D.24738>; else goto <D.24739>;
  <D.24738>:
  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.24739>:
  D.24740 = sgen_workers_have_started ();
  if (D.24740 != 0) goto <D.24741>; else goto <D.24742>;
  <D.24741>:
  sgen_workers_wake_up_all ();
  goto <D.24743>;
  <D.24742>:
  concurrent_collection_in_progress.224 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.224 != 0) goto <D.24745>; else goto <D.24746>;
  <D.24745>:
  current_collection_generation.223 = current_collection_generation;
  D.24747 = current_collection_generation.223 != -1;
  D.24748 = (long int) D.24747;
  D.24749 = __builtin_expect (D.24748, 0);
  if (D.24749 != 0) goto <D.24750>; else goto <D.24751>;
  <D.24750>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 607, "current_collection_generation == -1");
  <D.24751>:
  <D.24746>:
  <D.24743>:
  <D.24725>:
}


pin_from_roots (void * start_nursery, void * end_nursery, struct GrayQueue * queue)
{
  int gc_debug_level.225;
  _Bool D.24753;
  long int D.24754;
  long int D.24755;
  struct FILE * gc_debug_file.226;
  long unsigned int roots_size.227;
  int D.24760;
  unsigned int D.24761;
  unsigned int D.24762;
  long unsigned int D.24763;
  long unsigned int D.24764;
  char * D.24767;
  struct SgenHashTableEntry * D.24768;
  unsigned int D.24769;
  void * * start_root;
  struct RootRecord * root;

  gc_debug_level.225 = gc_debug_level;
  D.24753 = gc_debug_level.225 > 1;
  D.24754 = (long int) D.24753;
  D.24755 = __builtin_expect (D.24754, 0);
  if (D.24755 != 0) goto <D.24756>; else goto <D.24757>;
  <D.24756>:
  gc_debug_file.226 = gc_debug_file;
  roots_size.227 = roots_size;
  D.24760 = (int) roots_size.227;
  D.24761 = roots_hash[0].num_entries;
  D.24762 = roots_hash[1].num_entries;
  fprintf (gc_debug_file.226, "Scanning pinned roots (%d bytes, %d/%d entries)\n", D.24760, D.24761, D.24762);
  gc_debug_file.226 = gc_debug_file;
  fflush (gc_debug_file.226);
  <D.24757>:
  {
    struct SgenHashTable * __hash_table;
    struct SgenHashTableEntry * * __table;
    guint __i;

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

      D.24763 = (long unsigned int) __i;
      D.24764 = D.24763 * 8;
      __iter = __table + D.24764;
      goto <D.21143>;
      <D.21142>:
      {
        struct SgenHashTableEntry * __entry;

        __entry = *__iter;
        __next = &__entry->next;
        start_root = __entry->key;
        root = &__entry->data;
        if (0 != 0) goto <D.24765>; else goto <D.24766>;
        <D.24765>:
        gc_debug_file.226 = gc_debug_file;
        D.24767 = root->end_root;
        fprintf (gc_debug_file.226, "Pinned roots %p-%p\n", start_root, D.24767);
        gc_debug_file.226 = gc_debug_file;
        fflush (gc_debug_file.226);
        <D.24766>:
        D.24767 = root->end_root;
        conservatively_pin_objects_from (start_root, D.24767, start_nursery, end_nursery, 2);
      }
      __iter = __next;
      <D.21143>:
      D.24768 = *__iter;
      if (D.24768 != 0B) goto <D.21142>; else goto <D.21144>;
      <D.21144>:
    }
    __i = __i + 1;
    <D.21146>:
    D.24769 = roots_hash[1].size;
    if (D.24769 > __i) goto <D.21145>; else goto <D.21147>;
    <D.21147>:
  }
  scan_thread_data (start_nursery, end_nursery, 0, queue);
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.24770;
  gboolean D.24773;
  long unsigned int D.24774;
  long unsigned int D.24777;

  D.24770 = desc & 4294901767;
  if (D.24770 == 1) goto <D.24771>; else goto <D.24772>;
  <D.24771>:
  D.24773 = 0;
  return D.24773;
  <D.24772>:
  D.24774 = desc & 49159;
  if (D.24774 == 4) goto <D.24775>; else goto <D.24776>;
  <D.24775>:
  D.24773 = 0;
  return D.24773;
  <D.24776>:
  D.24777 = desc & 7;
  if (D.24777 == 7) goto <D.24778>; else goto <D.24779>;
  <D.24778>:
  D.24773 = 0;
  return D.24773;
  <D.24779>:
  D.24773 = 1;
  return D.24773;
}


scan_nursery_objects (struct ScanCopyContext ctx)
{
  struct GCMemSection * nursery_section.228;
  char * D.24782;
  char * D.24783;

  nursery_section.228 = nursery_section;
  D.24782 = nursery_section.228->data;
  nursery_section.228 = nursery_section;
  D.24783 = nursery_section.228->end_data;
  sgen_scan_area_with_callback (D.24782, D.24783, scan_nursery_objects_callback, &ctx, 0);
}


scan_nursery_objects_callback (char * obj, size_t size, struct ScanCopyContext * ctx)
{
  void (*<T2c8f>) (char *, struct SgenGrayQueue *) D.24784;
  struct SgenGrayQueue * D.24785;

  D.24784 = ctx->scan_func;
  D.24785 = ctx->queue;
  D.24784 (obj, D.24785);
}


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


report_registered_roots_by_type (int root_type)
{
  long unsigned int D.24786;
  long unsigned int D.24787;
  struct FILE * gc_debug_file.229;
  char * D.24791;
  long unsigned int D.24792;
  void * D.24793;
  struct SgenHashTableEntry * D.24794;
  unsigned int D.24795;
  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.21293>;
        <D.21292>:
        {
          struct SgenHashTableEntry * * __iter;
          struct SgenHashTableEntry * * __next;

          D.24786 = (long unsigned int) __i;
          D.24787 = D.24786 * 8;
          __iter = __table + D.24787;
          goto <D.21290>;
          <D.21289>:
          {
            struct SgenHashTableEntry * __entry;

            __entry = *__iter;
            __next = &__entry->next;
            start_root = __entry->key;
            root = &__entry->data;
            if (0 != 0) goto <D.24788>; else goto <D.24789>;
            <D.24788>:
            gc_debug_file.229 = gc_debug_file;
            D.24791 = root->end_root;
            D.24792 = root->root_desc;
            D.24793 = (void *) D.24792;
            fprintf (gc_debug_file.229, "Precise root scan %p-%p (desc: %p)\n", start_root, D.24791, D.24793);
            gc_debug_file.229 = gc_debug_file;
            fflush (gc_debug_file.229);
            <D.24789>:
            D.24791 = root->end_root;
            D.24792 = root->root_desc;
            precisely_report_roots_from (&report, start_root, D.24791, D.24792);
          }
          __iter = __next;
          <D.21290>:
          D.24794 = *__iter;
          if (D.24794 != 0B) goto <D.21289>; else goto <D.21291>;
          <D.21291>:
        }
        __i = __i + 1;
        <D.21293>:
        D.24795 = roots_hash[root_type].size;
        if (D.24795 > __i) goto <D.21292>; else goto <D.21294>;
        <D.21294>:
      }
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


precisely_report_roots_from (struct GCRootReport * report, void * * start_root, void * * end_root, mword desc)
{
  long unsigned int D.24796;
  long unsigned int D.24797;
  void * D.24800;
  long unsigned int D.24803;
  unsigned int D.24804;
  unsigned int D.24805;
  gsize * bitmap_data.230;
  long unsigned int D.24807;
  void * D.24810;
  int bwords.231;

  D.24796 = desc & 7;
  switch (D.24796) <default: <D.21276>, case 1: <D.21256>, case 2: <D.21275>, case 3: <D.21260>, case 4: <D.21273>>
  <D.21256>:
  desc = desc >> 3;
  goto <D.21258>;
  <D.21257>:
  D.24797 = desc & 1;
  if (D.24797 != 0) goto <D.24798>; else goto <D.24799>;
  <D.24798>:
  D.24800 = *start_root;
  if (D.24800 != 0B) goto <D.24801>; else goto <D.24802>;
  <D.24801>:
  D.24800 = *start_root;
  add_profile_gc_root (report, D.24800, 3, 0);
  <D.24802>:
  <D.24799>:
  desc = desc >> 1;
  start_root = start_root + 8;
  <D.21258>:
  if (desc != 0) goto <D.21257>; else goto <D.21259>;
  <D.21259>:
  return;
  <D.21260>:
  {
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    bitmap_data = sgen_get_complex_descriptor_bitmap (desc);
    D.24803 = *bitmap_data;
    D.24804 = (unsigned int) D.24803;
    D.24805 = D.24804 + 4294967295;
    bwords = (int) D.24805;
    start_run = start_root;
    bitmap_data = bitmap_data + 8;
    goto <D.21270>;
    <D.21269>:
    {
      gsize bmap;
      void * * objptr;

      bitmap_data.230 = bitmap_data;
      bitmap_data = bitmap_data.230 + 8;
      bmap = *bitmap_data.230;
      objptr = start_run;
      goto <D.21267>;
      <D.21266>:
      D.24807 = bmap & 1;
      if (D.24807 != 0) goto <D.24808>; else goto <D.24809>;
      <D.24808>:
      D.24810 = *objptr;
      if (D.24810 != 0B) goto <D.24811>; else goto <D.24812>;
      <D.24811>:
      D.24810 = *objptr;
      add_profile_gc_root (report, D.24810, 3, 0);
      <D.24812>:
      <D.24809>:
      bmap = bmap >> 1;
      objptr = objptr + 8;
      <D.21267>:
      if (bmap != 0) goto <D.21266>; else goto <D.21268>;
      <D.21268>:
      start_run = start_run + 512;
    }
    <D.21270>:
    bwords.231 = bwords;
    bwords = bwords.231 + -1;
    if (bwords.231 > 0) goto <D.21269>; else goto <D.21271>;
    <D.21271>:
    goto <D.21272>;
  }
  <D.21273>:
  {
    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.21272>;
  }
  <D.21275>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1821);
  <D.21276>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 1823);
  <D.21272>:
}


single_arg_report_root (void * * obj)
{
  void * D.24815;
  struct GCRootReport * root_report.232;

  D.24815 = *obj;
  if (D.24815 != 0B) goto <D.24816>; else goto <D.24817>;
  <D.24816>:
  root_report.232 = root_report;
  D.24815 = *obj;
  add_profile_gc_root (root_report.232, D.24815, 3, 0);
  <D.24817>:
}


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

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


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

  try
    {
      report.count = 0;
      fin = list;
      goto <D.21241>;
      <D.21240>:
      D.24821 = fin->object;
      if (D.24821 == 0B) goto <D.24822>; else goto <D.24823>;
      <D.24822>:
      // predicted unlikely by continue predictor.
      goto <D.21239>;
      <D.24823>:
      D.24821 = fin->object;
      add_profile_gc_root (&report, D.24821, 1, 0);
      <D.21239>:
      fin = fin->next;
      <D.21241>:
      if (fin != 0B) goto <D.21240>; else goto <D.21242>;
      <D.21242>:
      notify_gc_roots (&report);
    }
  finally
    {
      report = {CLOBBER};
    }
}


join_workers ()
{
  int concurrent_collection_in_progress.235;
  int D.24828;
  int D.24829;
  _Bool D.24830;
  long int D.24831;
  long int D.24832;

  concurrent_collection_in_progress.235 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.235 != 0) goto <D.24824>; else goto <D.24827>;
  <D.24827>:
  D.24828 = major_collector.is_parallel;
  if (D.24828 != 0) goto <D.24824>; else goto <D.24825>;
  <D.24824>:
  gray_queue_redirect (&gray_queue);
  sgen_workers_join ();
  <D.24825>:
  D.24829 = sgen_gray_object_queue_is_empty (&gray_queue);
  D.24830 = D.24829 == 0;
  D.24831 = (long int) D.24830;
  D.24832 = __builtin_expect (D.24831, 0);
  if (D.24832 != 0) goto <D.24833>; else goto <D.24834>;
  <D.24833>:
  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.24834>:
}


check_nursery_is_clean ()
{
  void * D.24835;
  int iftmp.236;
  long unsigned int D.24841;
  long unsigned int D.24842;
  long unsigned int D.24844;
  _Bool D.24846;
  long int D.24847;
  long int D.24848;
  long unsigned int D.24851;
  _Bool D.24852;
  long int D.24853;
  long int D.24854;
  unsigned int D.24857;
  unsigned int D.24858;
  unsigned int D.24859;
  long unsigned int D.24860;
  char * D.24861;
  char * start;
  char * end;
  char * cur;

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

    D.24835 = MEM[(void * *)cur];
    if (D.24835 == 0B) goto <D.24836>; else goto <D.24837>;
    <D.24836>:
    cur = cur + 8;
    // predicted unlikely by continue predictor.
    goto <D.21523>;
    <D.24837>:
    D.24841 = MEM[(mword *)cur];
    D.24842 = D.24841 & 1;
    if (D.24842 != 0) goto <D.24843>; else goto <D.24839>;
    <D.24843>:
    D.24841 = MEM[(mword *)cur];
    D.24844 = D.24841 & 18446744073709551612;
    if (D.24844 != 0) goto <D.24845>; else goto <D.24839>;
    <D.24845>:
    iftmp.236 = 1;
    goto <D.24840>;
    <D.24839>:
    iftmp.236 = 0;
    <D.24840>:
    D.24846 = iftmp.236 != 0;
    D.24847 = (long int) D.24846;
    D.24848 = __builtin_expect (D.24847, 0);
    if (D.24848 != 0) goto <D.24849>; else goto <D.24850>;
    <D.24849>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2468, "!object_is_forwarded (cur)");
    <D.24850>:
    D.24841 = MEM[(mword *)cur];
    D.24851 = D.24841 & 2;
    D.24852 = D.24851 != 0;
    D.24853 = (long int) D.24852;
    D.24854 = __builtin_expect (D.24853, 0);
    if (D.24854 != 0) goto <D.24855>; else goto <D.24856>;
    <D.24855>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2469, "!object_is_pinned (cur)");
    <D.24856>:
    D.24857 = sgen_safe_object_get_size (cur);
    ss = (size_t) D.24857;
    D.24858 = sgen_safe_object_get_size (cur);
    D.24859 = D.24858 + 7;
    D.24860 = (long unsigned int) D.24859;
    size = D.24860 & 4294967288;
    D.24861 = cur + size;
    verify_scan_starts (cur, D.24861);
    cur = cur + size;
  }
  <D.21523>:
  if (cur < end) goto <D.21524>; else goto <D.21525>;
  <D.21525>:
}


verify_scan_starts (char * start, char * end)
{
  struct GCMemSection * nursery_section.237;
  char * * D.24863;
  long unsigned int D.24864;
  long unsigned int D.24865;
  char * * D.24866;
  int gc_debug_level.238;
  _Bool D.24872;
  long int D.24873;
  long int D.24874;
  struct FILE * gc_debug_file.239;
  unsigned int i.240;
  unsigned int D.24879;
  int i;

  i = 0;
  goto <D.21501>;
  <D.21500>:
  {
    char * addr;

    nursery_section.237 = nursery_section;
    D.24863 = nursery_section.237->scan_starts;
    D.24864 = (long unsigned int) i;
    D.24865 = D.24864 * 8;
    D.24866 = D.24863 + D.24865;
    addr = *D.24866;
    if (addr > start) goto <D.24867>; else goto <D.24868>;
    <D.24867>:
    if (addr < end) goto <D.24869>; else goto <D.24870>;
    <D.24869>:
    gc_debug_level.238 = gc_debug_level;
    D.24872 = gc_debug_level.238 > 0;
    D.24873 = (long int) D.24872;
    D.24874 = __builtin_expect (D.24873, 0);
    if (D.24874 != 0) goto <D.24875>; else goto <D.24876>;
    <D.24875>:
    gc_debug_file.239 = gc_debug_file;
    fprintf (gc_debug_file.239, "NFC-BAD SCAN START [%d] %p for obj [%p %p]\n", i, addr, start, end);
    gc_debug_file.239 = gc_debug_file;
    fflush (gc_debug_file.239);
    <D.24876>:
    <D.24870>:
    <D.24868>:
  }
  i = i + 1;
  <D.21501>:
  i.240 = (unsigned int) i;
  nursery_section.237 = nursery_section;
  D.24879 = nursery_section.237->num_scan_start;
  if (i.240 < D.24879) goto <D.21500>; else goto <D.21502>;
  <D.21502>:
}


finish_gray_stack (int generation, struct GrayQueue * queue)
{
  char * iftmp.241;
  char * iftmp.242;
  int gc_debug_level.243;
  _Bool D.24889;
  long int D.24890;
  long int D.24891;
  struct FILE * gc_debug_file.244;
  const char * D.24895;
  int D.24896;
  int D.24899;
  const char * D.24912;
  long int D.24913;
  long int D.24914;
  int D.24915;
  int D.24916;
  _Bool D.24917;
  long int D.24918;
  long int D.24919;
  int D.24924;
  int D.24926;
  _Bool D.24927;
  long int D.24928;
  long int D.24929;
  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.24881>; else goto <D.24882>;
      <D.24881>:
      iftmp.241 = sgen_get_nursery_start ();
      goto <D.24883>;
      <D.24882>:
      iftmp.241 = 0B;
      <D.24883>:
      start_addr = iftmp.241;
      if (generation == 0) goto <D.24885>; else goto <D.24886>;
      <D.24885>:
      iftmp.242 = sgen_get_nursery_end ();
      goto <D.24887>;
      <D.24886>:
      iftmp.242 = -1B;
      <D.24887>:
      end_addr = iftmp.242;
      sgen_drain_gray_stack (-1, ctx);
      atv = mono_100ns_ticks ();
      gc_debug_level.243 = gc_debug_level;
      D.24889 = gc_debug_level.243 > 1;
      D.24890 = (long int) D.24889;
      D.24891 = __builtin_expect (D.24890, 0);
      if (D.24891 != 0) goto <D.24892>; else goto <D.24893>;
      <D.24892>:
      gc_debug_file.244 = gc_debug_file;
      D.24895 = generation_name (generation);
      fprintf (gc_debug_file.244, "%s generation done\n", D.24895);
      gc_debug_file.244 = gc_debug_file;
      fflush (gc_debug_file.244);
      <D.24893>:
      D.24896 = sgen_need_bridge_processing ();
      if (D.24896 != 0) goto <D.24897>; else goto <D.24898>;
      <D.24897>:
      sgen_bridge_reset_data ();
      <D.24898>:
      done_with_ephemerons = 0;
      <D.21334>:
      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.21334>; else goto <D.21335>;
      <D.21335>:
      sgen_scan_togglerefs (start_addr, end_addr, ctx);
      D.24899 = sgen_need_bridge_processing ();
      if (D.24899 != 0) goto <D.24900>; else goto <D.24901>;
      <D.24900>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_collect_bridge_objects (generation, ctx);
      if (generation == 1) goto <D.24902>; else goto <D.24903>;
      <D.24902>:
      sgen_collect_bridge_objects (0, ctx);
      <D.24903>:
      sgen_bridge_processing_stw_step ();
      <D.24901>:
      sgen_drain_gray_stack (-1, ctx);
      sgen_null_link_in_range (generation, 1, ctx);
      if (generation == 1) goto <D.24904>; else goto <D.24905>;
      <D.24904>:
      sgen_null_link_in_range (0, 1, ctx);
      <D.24905>:
      sgen_finalize_in_range (generation, ctx);
      if (generation == 1) goto <D.24906>; else goto <D.24907>;
      <D.24906>:
      sgen_finalize_in_range (0, ctx);
      <D.24907>:
      if (0 != 0) goto <D.24908>; else goto <D.24909>;
      <D.24908>:
      gc_debug_file.244 = gc_debug_file;
      fprintf (gc_debug_file.244, "Precise scan of gray area post fin\n");
      gc_debug_file.244 = gc_debug_file;
      fflush (gc_debug_file.244);
      <D.24909>:
      sgen_drain_gray_stack (-1, ctx);
      done_with_ephemerons = 0;
      <D.21336>:
      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.21336>; else goto <D.21337>;
      <D.21337>:
      clear_unreachable_ephemerons (ctx);
      btv = mono_100ns_ticks ();
      gc_debug_level.243 = gc_debug_level;
      D.24889 = gc_debug_level.243 > 1;
      D.24890 = (long int) D.24889;
      D.24891 = __builtin_expect (D.24890, 0);
      if (D.24891 != 0) goto <D.24910>; else goto <D.24911>;
      <D.24910>:
      gc_debug_file.244 = gc_debug_file;
      D.24912 = generation_name (generation);
      D.24913 = btv - atv;
      D.24914 = D.24913 / 10;
      D.24915 = (int) D.24914;
      fprintf (gc_debug_file.244, "Finalize queue handling scan for %s generation: %d usecs %d ephemeron rounds\n", D.24912, D.24915, ephemeron_rounds);
      gc_debug_file.244 = gc_debug_file;
      fflush (gc_debug_file.244);
      <D.24911>:
      D.24916 = sgen_gray_object_queue_is_empty (queue);
      D.24917 = D.24916 == 0;
      D.24918 = (long int) D.24917;
      D.24919 = __builtin_expect (D.24918, 0);
      if (D.24919 != 0) goto <D.24920>; else goto <D.24921>;
      <D.24920>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2014, "sgen_gray_object_queue_is_empty (queue)");
      <D.24921>:
      <D.21339>:
      sgen_null_link_in_range (generation, 0, ctx);
      if (generation == 1) goto <D.24922>; else goto <D.24923>;
      <D.24922>:
      sgen_null_link_in_range (0, 0, ctx);
      <D.24923>:
      D.24924 = sgen_gray_object_queue_is_empty (queue);
      if (D.24924 != 0) goto <D.21338>; else goto <D.24925>;
      <D.24925>:
      sgen_drain_gray_stack (-1, ctx);
      goto <D.21339>;
      <D.21338>:
      D.24926 = sgen_gray_object_queue_is_empty (queue);
      D.24927 = D.24926 == 0;
      D.24928 = (long int) D.24927;
      D.24929 = __builtin_expect (D.24928, 0);
      if (D.24929 != 0) goto <D.24930>; else goto <D.24931>;
      <D.24930>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2024, "sgen_gray_object_queue_is_empty (queue)");
      <D.24931>:
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


mark_ephemerons_in_range (struct ScanCopyContext ctx)
{
  char * object.245;
  struct FILE * gc_debug_file.246;
  char * object.247;
  int D.24937;
  unsigned int D.24942;
  long unsigned int D.24943;
  long unsigned int D.24944;
  long unsigned int D.24945;
  long unsigned int D.24946;
  struct MonoVTable * D.24947;
  struct MonoDomain * D.24948;
  long int cur.248;
  char * D.24955;
  long int D.24956;
  long int D.24957;
  long int D.24958;
  const char * iftmp.249;
  int D.24960;
  void * D.24964;
  const char * iftmp.250;
  int D.24969;
  int D.24971;
  void * * D.24974;
  int D.24977;
  void * * D.24980;
  int D.24983;
  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.21724>;
  <D.21723>:
  {
    char * object;

    try
      {
        object.245 = current->array;
        object = object.245;
        if (0 != 0) goto <D.24933>; else goto <D.24934>;
        <D.24933>:
        gc_debug_file.246 = gc_debug_file;
        object.247 = object;
        fprintf (gc_debug_file.246, "Ephemeron array at %p\n", object.247);
        gc_debug_file.246 = gc_debug_file;
        fflush (gc_debug_file.246);
        <D.24934>:
        object.247 = object;
        D.24937 = sgen_is_object_alive_for_current_gen (object.247);
        if (D.24937 == 0) goto <D.24938>; else goto <D.24939>;
        <D.24938>:
        if (0 != 0) goto <D.24940>; else goto <D.24941>;
        <D.24940>:
        gc_debug_file.246 = gc_debug_file;
        fprintf (gc_debug_file.246, "\tnot reachable\n");
        gc_debug_file.246 = gc_debug_file;
        fflush (gc_debug_file.246);
        <D.24941>:
        // predicted unlikely by continue predictor.
        goto <D.21716>;
        <D.24939>:
        copy_func (&object, queue);
        array = object;
        cur = mono_array_addr_with_size (array, 16, 0);
        D.24942 = array->max_length;
        D.24943 = (long unsigned int) D.24942;
        D.24944 = D.24943 * 16;
        array_end = cur + D.24944;
        object.247 = object;
        D.24945 = MEM[(mword *)object.247];
        D.24946 = D.24945 & 18446744073709551612;
        D.24947 = (struct MonoVTable *) D.24946;
        D.24948 = D.24947->domain;
        tombstone = D.24948->ephemeron_tombstone;
        goto <D.21721>;
        <D.21720>:
        {
          char * key;

          key = cur->key;
          if (key == 0B) goto <D.24949>; else goto <D.24951>;
          <D.24951>:
          if (key == tombstone) goto <D.24949>; else goto <D.24950>;
          <D.24949>:
          // predicted unlikely by continue predictor.
          goto <D.21718>;
          <D.24950>:
          if (0 != 0) goto <D.24952>; else goto <D.24953>;
          <D.24952>:
          gc_debug_file.246 = gc_debug_file;
          cur.248 = (long int) cur;
          D.24955 = mono_array_addr_with_size (array, 16, 0);
          D.24956 = (long int) D.24955;
          D.24957 = cur.248 - D.24956;
          D.24958 = D.24957 /[ex] 16;
          D.24960 = sgen_is_object_alive_for_current_gen (key);
          if (D.24960 != 0) goto <D.24961>; else goto <D.24962>;
          <D.24961>:
          iftmp.249 = "reachable";
          goto <D.24963>;
          <D.24962>:
          iftmp.249 = "unreachable";
          <D.24963>:
          D.24964 = cur->value;
          D.24964 = cur->value;
          if (D.24964 != 0B) goto <D.24968>; else goto <D.24966>;
          <D.24968>:
          D.24964 = cur->value;
          D.24969 = sgen_is_object_alive_for_current_gen (D.24964);
          if (D.24969 != 0) goto <D.24970>; else goto <D.24966>;
          <D.24970>:
          iftmp.250 = "reachable";
          goto <D.24967>;
          <D.24966>:
          iftmp.250 = "unreachable";
          <D.24967>:
          fprintf (gc_debug_file.246, "[%td] key %p (%s) value %p (%s)\n", D.24958, key, iftmp.249, D.24964, iftmp.250);
          gc_debug_file.246 = gc_debug_file;
          fflush (gc_debug_file.246);
          <D.24953>:
          D.24971 = sgen_is_object_alive_for_current_gen (key);
          if (D.24971 != 0) goto <D.24972>; else goto <D.24973>;
          <D.24972>:
          {
            char * value;

            value = cur->value;
            D.24974 = &cur->key;
            copy_func (D.24974, queue);
            if (value != 0B) goto <D.24975>; else goto <D.24976>;
            <D.24975>:
            D.24977 = sgen_is_object_alive_for_current_gen (value);
            if (D.24977 == 0) goto <D.24978>; else goto <D.24979>;
            <D.24978>:
            nothing_marked = 0;
            <D.24979>:
            D.24980 = &cur->value;
            copy_func (D.24980, queue);
            <D.24976>:
          }
          <D.24973>:
        }
        <D.21718>:
        cur = cur + 16;
        <D.21721>:
        if (cur < array_end) goto <D.21720>; else goto <D.21722>;
        <D.21722>:
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.21716>:
  current = current->next;
  <D.21724>:
  if (current != 0B) goto <D.21723>; else goto <D.21725>;
  <D.21725>:
  if (0 != 0) goto <D.24981>; else goto <D.24982>;
  <D.24981>:
  gc_debug_file.246 = gc_debug_file;
  fprintf (gc_debug_file.246, "Ephemeron run finished. Is it done %d\n", nothing_marked);
  gc_debug_file.246 = gc_debug_file;
  fflush (gc_debug_file.246);
  <D.24982>:
  D.24983 = nothing_marked;
  return D.24983;
}


sgen_is_object_alive_for_current_gen (char * object)
{
  int D.24987;
  int D.24990;
  int current_collection_generation.251;

  D.24987 = sgen_ptr_in_nursery (object);
  if (D.24987 != 0) goto <D.24988>; else goto <D.24989>;
  <D.24988>:
  D.24990 = sgen_nursery_is_object_alive (object);
  return D.24990;
  <D.24989>:
  current_collection_generation.251 = current_collection_generation;
  if (current_collection_generation.251 == 0) goto <D.24992>; else goto <D.24993>;
  <D.24992>:
  D.24990 = 1;
  return D.24990;
  <D.24993>:
  D.24990 = sgen_major_is_object_alive (object);
  return D.24990;
}


sgen_nursery_is_object_alive (char * obj)
{
  int D.24995;
  _Bool D.24996;
  long int D.24997;
  long int D.24998;
  int D.25001;
  gboolean D.25004;
  long unsigned int D.25007;
  long unsigned int D.25008;
  long unsigned int D.25010;
  long unsigned int D.25012;

  D.24995 = sgen_ptr_in_nursery (obj);
  D.24996 = D.24995 == 0;
  D.24997 = (long int) D.24996;
  D.24998 = __builtin_expect (D.24997, 0);
  if (D.24998 != 0) goto <D.24999>; else goto <D.25000>;
  <D.24999>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "../../mono/metadata/sgen-gc.h", 576, "sgen_ptr_in_nursery (obj)");
  <D.25000>:
  D.25001 = sgen_nursery_is_to_space (obj);
  if (D.25001 != 0) goto <D.25002>; else goto <D.25003>;
  <D.25002>:
  D.25004 = 1;
  return D.25004;
  <D.25003>:
  D.25007 = MEM[(mword *)obj];
  D.25008 = D.25007 & 2;
  if (D.25008 != 0) goto <D.25005>; else goto <D.25009>;
  <D.25009>:
  D.25007 = MEM[(mword *)obj];
  D.25010 = D.25007 & 1;
  if (D.25010 != 0) goto <D.25011>; else goto <D.25006>;
  <D.25011>:
  D.25007 = MEM[(mword *)obj];
  D.25012 = D.25007 & 18446744073709551612;
  if (D.25012 != 0) goto <D.25005>; else goto <D.25006>;
  <D.25005>:
  D.25004 = 1;
  return D.25004;
  <D.25006>:
  D.25004 = 0;
  return D.25004;
}


sgen_nursery_is_to_space (char * object)
{
  long int object.252;
  char * sgen_nursery_start.253;
  long int sgen_nursery_start.254;
  long int D.25017;
  long int D.25018;
  int D.25019;
  _Bool D.25020;
  long int D.25021;
  long int D.25022;
  char * D.25025;
  char * D.25026;
  int sgen_space_bitmap_size.255;
  _Bool D.25028;
  long int D.25029;
  long int D.25030;
  gboolean D.25033;
  char * sgen_space_bitmap.256;
  sizetype D.25035;
  char * D.25036;
  char D.25037;
  int D.25038;
  int D.25039;
  int D.25040;
  _Bool D.25041;
  int idx;
  int byte;
  int bit;

  object.252 = (long int) object;
  sgen_nursery_start.253 = sgen_nursery_start;
  sgen_nursery_start.254 = (long int) sgen_nursery_start.253;
  D.25017 = object.252 - sgen_nursery_start.254;
  D.25018 = D.25017 >> 9;
  idx = (int) D.25018;
  byte = idx / 8;
  bit = idx & 7;
  D.25019 = sgen_ptr_in_nursery (object);
  D.25020 = D.25019 == 0;
  D.25021 = (long int) D.25020;
  D.25022 = __builtin_expect (D.25021, 0);
  if (D.25022 != 0) goto <D.25023>; else goto <D.25024>;
  <D.25023>:
  D.25025 = sgen_get_nursery_start ();
  D.25026 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.25025, D.25026);
  <D.17557>:
  goto <D.17557>;
  <D.25024>:
  sgen_space_bitmap_size.255 = sgen_space_bitmap_size;
  D.25028 = byte >= sgen_space_bitmap_size.255;
  D.25029 = (long int) D.25028;
  D.25030 = __builtin_expect (D.25029, 0);
  if (D.25030 != 0) goto <D.25031>; else goto <D.25032>;
  <D.25031>:
  sgen_space_bitmap_size.255 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.255);
  <D.17558>:
  goto <D.17558>;
  <D.25032>:
  sgen_space_bitmap.256 = sgen_space_bitmap;
  D.25035 = (sizetype) byte;
  D.25036 = sgen_space_bitmap.256 + D.25035;
  D.25037 = *D.25036;
  D.25038 = (int) D.25037;
  D.25039 = D.25038 >> bit;
  D.25040 = D.25039 & 1;
  D.25041 = D.25040 != 0;
  D.25033 = (gboolean) D.25041;
  return D.25033;
}


sgen_major_is_object_alive (void * object)
{
  long unsigned int D.25045;
  long unsigned int D.25046;
  long unsigned int D.25048;
  long unsigned int D.25050;
  gboolean D.25051;
  unsigned int D.25052;
  unsigned int D.25053;
  long unsigned int D.25054;
  gboolean (*<T2d26>) (char *) D.25057;
  mword objsize;

  D.25045 = MEM[(mword *)object];
  D.25046 = D.25045 & 2;
  if (D.25046 != 0) goto <D.25043>; else goto <D.25047>;
  <D.25047>:
  D.25045 = MEM[(mword *)object];
  D.25048 = D.25045 & 1;
  if (D.25048 != 0) goto <D.25049>; else goto <D.25044>;
  <D.25049>:
  D.25045 = MEM[(mword *)object];
  D.25050 = D.25045 & 18446744073709551612;
  if (D.25050 != 0) goto <D.25043>; else goto <D.25044>;
  <D.25043>:
  D.25051 = 1;
  return D.25051;
  <D.25044>:
  D.25052 = sgen_safe_object_get_size (object);
  D.25053 = D.25052 + 7;
  D.25054 = (long unsigned int) D.25053;
  objsize = D.25054 & 4294967288;
  if (objsize > 8000) goto <D.25055>; else goto <D.25056>;
  <D.25055>:
  D.25051 = sgen_los_object_is_pinned (object);
  return D.25051;
  <D.25056>:
  D.25057 = major_collector.is_object_live;
  D.25051 = D.25057 (object);
  return D.25051;
}


clear_unreachable_ephemerons (struct ScanCopyContext ctx)
{
  char * object.257;
  char * object.258;
  int D.25061;
  struct FILE * gc_debug_file.259;
  struct EphemeronLinkNode * ephemeron_list.260;
  unsigned int D.25073;
  long unsigned int D.25074;
  long unsigned int D.25075;
  long unsigned int D.25076;
  long unsigned int D.25077;
  struct MonoVTable * D.25078;
  struct MonoDomain * D.25079;
  long int cur.261;
  char * D.25086;
  long int D.25087;
  long int D.25088;
  long int D.25089;
  const char * iftmp.262;
  int D.25091;
  void * D.25095;
  const char * iftmp.263;
  int D.25100;
  int D.25102;
  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.21696>;
  <D.21702>:
  {
    char * object;

    try
      {
        object.257 = current->array;
        object = object.257;
        object.258 = object;
        D.25061 = sgen_is_object_alive_for_current_gen (object.258);
        if (D.25061 == 0) goto <D.25062>; else goto <D.25063>;
        <D.25062>:
        {
          struct EphemeronLinkNode * tmp;

          tmp = current;
          if (0 != 0) goto <D.25064>; else goto <D.25065>;
          <D.25064>:
          gc_debug_file.259 = gc_debug_file;
          object.258 = object;
          fprintf (gc_debug_file.259, "Dead Ephemeron array at %p\n", object.258);
          gc_debug_file.259 = gc_debug_file;
          fflush (gc_debug_file.259);
          <D.25065>:
          if (prev != 0B) goto <D.25067>; else goto <D.25068>;
          <D.25067>:
          ephemeron_list.260 = current->next;
          prev->next = ephemeron_list.260;
          goto <D.25070>;
          <D.25068>:
          ephemeron_list.260 = current->next;
          ephemeron_list = ephemeron_list.260;
          <D.25070>:
          current = current->next;
          sgen_free_internal (tmp, 18);
          // predicted unlikely by continue predictor.
          goto <D.21696>;
        }
        <D.25063>:
        copy_func (&object, queue);
        object.258 = object;
        current->array = object.258;
        if (0 != 0) goto <D.25071>; else goto <D.25072>;
        <D.25071>:
        gc_debug_file.259 = gc_debug_file;
        object.258 = object;
        fprintf (gc_debug_file.259, "Clearing unreachable entries for ephemeron array at %p\n", object.258);
        gc_debug_file.259 = gc_debug_file;
        fflush (gc_debug_file.259);
        <D.25072>:
        array = object;
        cur = mono_array_addr_with_size (array, 16, 0);
        D.25073 = array->max_length;
        D.25074 = (long unsigned int) D.25073;
        D.25075 = D.25074 * 16;
        array_end = cur + D.25075;
        object.258 = object;
        D.25076 = MEM[(mword *)object.258];
        D.25077 = D.25076 & 18446744073709551612;
        D.25078 = (struct MonoVTable *) D.25077;
        D.25079 = D.25078->domain;
        tombstone = D.25079->ephemeron_tombstone;
        goto <D.21700>;
        <D.21699>:
        {
          char * key;

          key = cur->key;
          if (key == 0B) goto <D.25080>; else goto <D.25082>;
          <D.25082>:
          if (key == tombstone) goto <D.25080>; else goto <D.25081>;
          <D.25080>:
          // predicted unlikely by continue predictor.
          goto <D.21698>;
          <D.25081>:
          if (0 != 0) goto <D.25083>; else goto <D.25084>;
          <D.25083>:
          gc_debug_file.259 = gc_debug_file;
          cur.261 = (long int) cur;
          D.25086 = mono_array_addr_with_size (array, 16, 0);
          D.25087 = (long int) D.25086;
          D.25088 = cur.261 - D.25087;
          D.25089 = D.25088 /[ex] 16;
          D.25091 = sgen_is_object_alive_for_current_gen (key);
          if (D.25091 != 0) goto <D.25092>; else goto <D.25093>;
          <D.25092>:
          iftmp.262 = "reachable";
          goto <D.25094>;
          <D.25093>:
          iftmp.262 = "unreachable";
          <D.25094>:
          D.25095 = cur->value;
          D.25095 = cur->value;
          if (D.25095 != 0B) goto <D.25099>; else goto <D.25097>;
          <D.25099>:
          D.25095 = cur->value;
          D.25100 = sgen_is_object_alive_for_current_gen (D.25095);
          if (D.25100 != 0) goto <D.25101>; else goto <D.25097>;
          <D.25101>:
          iftmp.263 = "reachable";
          goto <D.25098>;
          <D.25097>:
          iftmp.263 = "unreachable";
          <D.25098>:
          fprintf (gc_debug_file.259, "[%td] key %p (%s) value %p (%s)\n", D.25089, key, iftmp.262, D.25095, iftmp.263);
          gc_debug_file.259 = gc_debug_file;
          fflush (gc_debug_file.259);
          <D.25084>:
          D.25102 = sgen_is_object_alive_for_current_gen (key);
          if (D.25102 == 0) goto <D.25103>; else goto <D.25104>;
          <D.25103>:
          cur->key = tombstone;
          cur->value = 0B;
          // predicted unlikely by continue predictor.
          goto <D.21698>;
          <D.25104>:
        }
        <D.21698>:
        cur = cur + 16;
        <D.21700>:
        if (cur < array_end) goto <D.21699>; else goto <D.21701>;
        <D.21701>:
        prev = current;
        current = current->next;
      }
    finally
      {
        object = {CLOBBER};
      }
  }
  <D.21696>:
  if (current != 0B) goto <D.21702>; else goto <D.21703>;
  <D.21703>:
}


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


sgen_get_nursery_end ()
{
  char * D.25107;

  D.25107 = sgen_nursery_end;
  return D.25107;
}


dump_heap (const char * type, int num, const char * reason)
{
  struct FILE * heap_dump_file.264;
  long int D.25112;
  long unsigned int D.25113;
  long unsigned int D.25114;
  struct MonoObject * D.25115;
  struct GCMemSection * nursery_section.265;
  void (*<T2d98>) (struct FILE *) D.25117;
  char[0:] * D.25118;
  struct ObjectList * list;
  struct LOSObject * bigobj;

  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, "<collection type=\"%s\" num=\"%d\"", type, num);
  if (reason != 0B) goto <D.25110>; else goto <D.25111>;
  <D.25110>:
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, " reason=\"%s\"", reason);
  <D.25111>:
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, ">\n");
  heap_dump_file.264 = heap_dump_file;
  D.25112 = mono_mempool_get_bytes_allocated ();
  fprintf (heap_dump_file.264, "<other-mem-usage type=\"mempools\" size=\"%ld\"/>\n", D.25112);
  heap_dump_file.264 = heap_dump_file;
  sgen_dump_internal_mem_usage (heap_dump_file.264);
  heap_dump_file.264 = heap_dump_file;
  D.25113 = sgen_pin_stats_get_pinned_byte_count (0);
  fprintf (heap_dump_file.264, "<pinned type=\"stack\" bytes=\"%zu\"/>\n", D.25113);
  heap_dump_file.264 = heap_dump_file;
  D.25114 = sgen_pin_stats_get_pinned_byte_count (2);
  fprintf (heap_dump_file.264, "<pinned type=\"other\" bytes=\"%zu\"/>\n", D.25114);
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, "<pinned-objects>\n");
  list = sgen_pin_stats_get_object_list ();
  goto <D.21410>;
  <D.21409>:
  D.25115 = list->obj;
  dump_object (D.25115, 1);
  list = list->next;
  <D.21410>:
  if (list != 0B) goto <D.21409>; else goto <D.21411>;
  <D.21411>:
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, "</pinned-objects>\n");
  nursery_section.265 = nursery_section;
  sgen_dump_section (nursery_section.265, "nursery");
  D.25117 = major_collector.dump_heap;
  heap_dump_file.264 = heap_dump_file;
  D.25117 (heap_dump_file.264);
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, "<los>\n");
  bigobj = los_object_list;
  goto <D.21413>;
  <D.21412>:
  D.25118 = &bigobj->data;
  dump_object (D.25118, 0);
  bigobj = bigobj->next;
  <D.21413>:
  if (bigobj != 0B) goto <D.21412>; else goto <D.21414>;
  <D.21414>:
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, "</los>\n");
  heap_dump_file.264 = heap_dump_file;
  fprintf (heap_dump_file.264, "</collection>\n");
}


dump_object (struct MonoObject * obj, gboolean dump_location)
{
  struct MonoVTable * D.25119;
  const char * D.25120;
  sizetype D.25121;
  const char * D.25122;
  char D.25123;
  int D.25124;
  char * D.25125;
  int j.266;
  unsigned int j.267;
  _Bool D.25131;
  long int D.25132;
  long int D.25133;
  struct FILE * heap_dump_file.268;
  const char * D.25137;
  unsigned int D.25138;
  int D.25141;
  unsigned int D.25145;
  static char class_name[1024];
  struct MonoClass * class;
  int i;
  int j;

  D.25119 = obj->vtable;
  class = D.25119->klass;
  j = 0;
  i = j;
  goto <D.21399>;
  <D.21398>:
  D.25120 = class->name;
  D.25121 = (sizetype) i;
  D.25122 = D.25120 + D.25121;
  D.25123 = *D.25122;
  D.25124 = (int) D.25123;
  D.25125 = __builtin_strchr ("<>\"", D.25124);
  if (D.25125 == 0B) goto <D.25126>; else goto <D.25127>;
  <D.25126>:
  j.266 = j;
  j = j.266 + 1;
  D.25120 = class->name;
  D.25121 = (sizetype) i;
  D.25122 = D.25120 + D.25121;
  D.25123 = *D.25122;
  class_name[j.266] = D.25123;
  <D.25127>:
  i = i + 1;
  <D.21399>:
  D.25120 = class->name;
  D.25121 = (sizetype) i;
  D.25122 = D.25120 + D.25121;
  D.25123 = *D.25122;
  if (D.25123 != 0) goto <D.25129>; else goto <D.21400>;
  <D.25129>:
  j.267 = (unsigned int) j;
  if (j.267 <= 1022) goto <D.21398>; else goto <D.21400>;
  <D.21400>:
  j.267 = (unsigned int) j;
  D.25131 = j.267 > 1023;
  D.25132 = (long int) D.25131;
  D.25133 = __builtin_expect (D.25132, 0);
  if (D.25133 != 0) goto <D.25134>; else goto <D.25135>;
  <D.25134>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2132, "j < sizeof (class_name)");
  <D.25135>:
  class_name[j] = 0;
  heap_dump_file.268 = heap_dump_file;
  D.25137 = class->name_space;
  D.25138 = sgen_safe_object_get_size (obj);
  fprintf (heap_dump_file.268, "<object class=\"%s.%s\" size=\"%d\"", D.25137, &class_name, D.25138);
  if (dump_location != 0) goto <D.25139>; else goto <D.25140>;
  <D.25139>:
  {
    const char * location;

    D.25141 = sgen_ptr_in_nursery (obj);
    if (D.25141 != 0) goto <D.25142>; else goto <D.25143>;
    <D.25142>:
    location = "nursery";
    goto <D.25144>;
    <D.25143>:
    D.25145 = sgen_safe_object_get_size (obj);
    if (D.25145 <= 8000) goto <D.25146>; else goto <D.25147>;
    <D.25146>:
    location = "major";
    goto <D.25148>;
    <D.25147>:
    location = "LOS";
    <D.25148>:
    <D.25144>:
    heap_dump_file.268 = heap_dump_file;
    fprintf (heap_dump_file.268, " location=\"%s\"", location);
  }
  <D.25140>:
  heap_dump_file.268 = heap_dump_file;
  fprintf (heap_dump_file.268, "/>\n");
}


check_scan_starts ()
{
  int do_scan_starts_check.269;
  struct GCMemSection * nursery_section.270;
  void (*<T7e8>) (void) D.25153;

  do_scan_starts_check.269 = do_scan_starts_check;
  if (do_scan_starts_check.269 == 0) goto <D.25150>; else goto <D.25151>;
  <D.25150>:
  return;
  <D.25151>:
  nursery_section.270 = nursery_section;
  sgen_check_section_scan_starts (nursery_section.270);
  D.25153 = major_collector.check_scan_starts;
  D.25153 ();
}


unpin_objects_from_queue (struct SgenGrayQueue * queue)
{
  struct GrayQueueSection * D.25155;
  int D.25159;
  _Bool D.25160;
  long int D.25161;
  long int D.25162;
  int D.25166;
  long unsigned int D.25168;
  long unsigned int D.25169;
  _Bool D.25170;
  long int D.25171;
  long int D.25172;
  long unsigned int D.25175;

  <D.21153>:
  {
    char * addr;

    D.25155 = queue->first;
    if (D.25155 == 0B) goto <D.25156>; else goto <D.25157>;
    <D.25156>:
    addr = 0B;
    goto <D.25158>;
    <D.25157>:
    D.25155 = queue->first;
    D.25159 = D.25155->end;
    D.25160 = D.25159 == 1;
    D.25161 = (long int) D.25160;
    D.25162 = __builtin_expect (D.25161, 0);
    if (D.25162 != 0) goto <D.25163>; else goto <D.25164>;
    <D.25163>:
    addr = sgen_gray_object_dequeue (queue);
    goto <D.25165>;
    <D.25164>:
    D.25155 = queue->first;
    D.25155 = queue->first;
    D.25159 = D.25155->end;
    D.25166 = D.25159 + -1;
    D.25155->end = D.25166;
    D.25159 = D.25155->end;
    addr = D.25155->objects[D.25159];
    <D.25165>:
    <D.25158>:
    if (addr == 0B) goto <D.21152>; else goto <D.25167>;
    <D.25167>:
    D.25168 = MEM[(mword *)addr];
    D.25169 = D.25168 & 2;
    D.25170 = D.25169 == 0;
    D.25171 = (long int) D.25170;
    D.25172 = __builtin_expect (D.25171, 0);
    if (D.25172 != 0) goto <D.25173>; else goto <D.25174>;
    <D.25173>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 1548, "SGEN_OBJECT_IS_PINNED (addr)");
    <D.25174>:
    D.25168 = MEM[(mword *)addr];
    D.25175 = D.25168 & 18446744073709551613;
    MEM[(mword *)addr] = D.25175;
  }
  goto <D.21153>;
  <D.21152>:
}


major_start_concurrent_collection (const char * reason)
{
  int disable_major_collections.271;
  long long int (*<T2dc6>) (void) D.25179;
  _Bool D.25180;
  long int D.25181;
  long int D.25182;
  long long int num_objects_marked;

  disable_major_collections.271 = disable_major_collections;
  if (disable_major_collections.271 != 0) goto <D.25177>; else goto <D.25178>;
  <D.25177>:
  return;
  <D.25178>:
  D.25179 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.25179 ();
  D.25180 = num_objects_marked != 0;
  D.25181 = (long int) D.25180;
  D.25182 = __builtin_expect (D.25181, 0);
  if (D.25182 != 0) goto <D.25183>; else goto <D.25184>;
  <D.25183>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3326, "num_objects_marked == 0");
  <D.25184>:
  major_start_collection (1, 0B);
  gray_queue_redirect (&gray_queue);
  sgen_workers_wait_for_jobs ();
  D.25179 = major_collector.get_and_reset_num_major_objects_marked;
  num_objects_marked = D.25179 ();
  current_collection_generation = -1;
}


major_start_collection (gboolean concurrent, int * old_next_pin_slot)
{
  struct MonoPerfCounters * mono_perfcounters.272;
  unsigned int D.25187;
  unsigned int D.25188;
  struct SgenSectionGrayQueue * D.25189;
  int D.25190;
  _Bool D.25191;
  long int D.25192;
  long int D.25193;
  int D.25198;
  _Bool D.25199;
  long int D.25200;
  long int D.25201;
  int gc_debug_level.273;
  _Bool D.25206;
  long int D.25207;
  long int D.25208;
  struct FILE * gc_debug_file.274;
  int stat_major_gcs.275;
  int stat_major_gcs.276;
  int D.25214;
  int D.25215;
  void (*<T7e8>) (void) D.25216;

  current_collection_generation = 1;
  mono_perfcounters.272 = mono_perfcounters;
  D.25187 = mono_perfcounters.272->gc_collections1;
  D.25188 = D.25187 + 1;
  mono_perfcounters.272->gc_collections1 = D.25188;
  D.25189 = sgen_workers_get_distribute_section_gray_queue ();
  D.25190 = sgen_section_gray_queue_is_empty (D.25189);
  D.25191 = D.25190 == 0;
  D.25192 = (long int) D.25191;
  D.25193 = __builtin_expect (D.25192, 0);
  if (D.25193 != 0) goto <D.25194>; else goto <D.25195>;
  <D.25194>:
  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.25195>:
  if (concurrent != 0) goto <D.25196>; else goto <D.25197>;
  <D.25196>:
  D.25198 = major_collector.is_concurrent;
  D.25199 = D.25198 == 0;
  D.25200 = (long int) D.25199;
  D.25201 = __builtin_expect (D.25200, 0);
  if (D.25201 != 0) goto <D.25202>; else goto <D.25203>;
  <D.25202>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3077, "major_collector.is_concurrent");
  <D.25203>:
  concurrent_collection_in_progress = 1;
  sgen_cement_concurrent_start ();
  current_object_ops = major_collector.major_concurrent_ops;
  goto <D.25204>;
  <D.25197>:
  current_object_ops = major_collector.major_ops;
  <D.25204>:
  reset_pinned_from_failed_allocation ();
  sgen_memgov_major_collection_start ();
  check_scan_starts ();
  degraded_mode = 0;
  gc_debug_level.273 = gc_debug_level;
  D.25206 = gc_debug_level.273 > 0;
  D.25207 = (long int) D.25206;
  D.25208 = __builtin_expect (D.25207, 0);
  if (D.25208 != 0) goto <D.25209>; else goto <D.25210>;
  <D.25209>:
  gc_debug_file.274 = gc_debug_file;
  stat_major_gcs.275 = stat_major_gcs;
  fprintf (gc_debug_file.274, "Start major collection %d\n", stat_major_gcs.275);
  gc_debug_file.274 = gc_debug_file;
  fflush (gc_debug_file.274);
  <D.25210>:
  stat_major_gcs.275 = stat_major_gcs;
  stat_major_gcs.276 = stat_major_gcs.275 + 1;
  stat_major_gcs = stat_major_gcs.276;
  D.25214 = gc_stats.major_gc_count;
  D.25215 = D.25214 + 1;
  gc_stats.major_gc_count = D.25215;
  D.25216 = major_collector.start_major_collection;
  if (D.25216 != 0B) goto <D.25217>; else goto <D.25218>;
  <D.25217>:
  D.25216 = major_collector.start_major_collection;
  D.25216 ();
  <D.25218>:
  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.277;
  gboolean D.25222;
  struct MonoPerfCounters * mono_perfcounters.278;
  unsigned int D.25224;
  unsigned int D.25225;
  int D.25226;
  char * iftmp.279;
  char * D.25231;
  int gc_debug_level.280;
  _Bool D.25236;
  long int D.25237;
  long int D.25238;
  struct FILE * gc_debug_file.281;
  int stat_minor_gcs.282;
  char * D.25243;
  long int nursery_next.283;
  char * D.25245;
  long int D.25246;
  long int D.25247;
  int D.25248;
  char * D.25249;
  long int D.25250;
  long int D.25251;
  struct GCMemSection * nursery_section.284;
  long unsigned int D.25253;
  _Bool D.25254;
  long int D.25255;
  long int D.25256;
  long int D.25259;
  long int D.25260;
  int D.25261;
  long long int D.25262;
  long long int time_minor_pre_collection_fragment_clear.285;
  long long int time_minor_pre_collection_fragment_clear.286;
  int xdomain_checks.287;
  void (*<T7e8>) (void) D.25268;
  int stat_minor_gcs.288;
  int D.25270;
  int D.25271;
  char * D.25272;
  long int D.25273;
  long int D.25274;
  int D.25275;
  long long int D.25276;
  long long int time_minor_pinning.289;
  long long int time_minor_pinning.290;
  _Bool D.25279;
  long int D.25280;
  long int D.25281;
  int D.25284;
  int D.25287;
  int whole_heap_check_before_collection.291;
  int consistency_check_at_minor_collection.292;
  char * D.25294;
  long long int time_minor_scan_remsets.293;
  long long int time_minor_scan_remsets.294;
  int D.25299;
  void (*<T2c8f>) (char *, struct SgenGrayQueue *) D.25302;
  <unnamed type> D.25303;
  unsigned int D.25304;
  <unnamed type> D.25307;
  unsigned int D.25308;
  long long int time_minor_scan_pinned.295;
  long long int time_minor_scan_pinned.296;
  void (*<T2c8a>) (void * *, struct SgenGrayQueue *) D.25313;
  char * D.25314;
  char * D.25315;
  long long int time_minor_scan_registered_roots.297;
  long long int time_minor_scan_registered_roots.298;
  char * D.25318;
  long long int time_minor_scan_thread_data.299;
  long long int time_minor_scan_thread_data.300;
  int iftmp.301;
  int D.25325;
  int D.25327;
  _Bool D.25328;
  long int D.25329;
  long int D.25330;
  int D.25335;
  int D.25337;
  int D.25338;
  _Bool D.25339;
  long int D.25340;
  long int D.25341;
  struct FinalizeReadyEntry * fin_ready_list.302;
  struct FinalizeReadyEntry * critical_fin_list.303;
  long long int time_minor_finish_gray_stack.304;
  long long int time_minor_finish_gray_stack.305;
  long unsigned int objects_pinned.306;
  void * * D.25351;
  int D.25352;
  long long int time_minor_fragment_creation.307;
  long long int time_minor_fragment_creation.308;
  void (*<T7e8>) (void) D.25361;
  long long int D.25362;
  long int D.25363;
  long int D.25364;
  int D.25365;
  long long int D.25366;
  long long int D.25367;
  struct FILE * heap_dump_file.309;
  int D.25371;
  int num_ready_finalizers.310;
  int D.25378;
  _Bool D.25379;
  long int D.25380;
  long int D.25381;
  void (*<T7e8>) (void) D.25384;
  _Bool D.25385;
  int check_nursery_objects_pinned.311;
  int D.25389;
  _Bool D.25392;
  int D.25393;
  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.277 = disable_minor_collections;
      if (disable_minor_collections.277 != 0) goto <D.25220>; else goto <D.25221>;
      <D.25220>:
      D.25222 = 1;
      return D.25222;
      <D.25221>:
      verify_nursery ();
      mono_perfcounters.278 = mono_perfcounters;
      D.25224 = mono_perfcounters.278->gc_collections0;
      D.25225 = D.25224 + 1;
      mono_perfcounters.278->gc_collections0 = D.25225;
      current_collection_generation = 0;
      D.25226 = sgen_collection_is_parallel ();
      if (D.25226 != 0) goto <D.25227>; else goto <D.25228>;
      <D.25227>:
      current_object_ops = sgen_minor_collector.parallel_ops;
      goto <D.25229>;
      <D.25228>:
      current_object_ops = sgen_minor_collector.serial_ops;
      <D.25229>:
      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.25231 = sgen_get_nursery_end ();
      if (D.25231 >= nursery_next) goto <D.25232>; else goto <D.25233>;
      <D.25232>:
      iftmp.279 = sgen_get_nursery_end ();
      goto <D.25234>;
      <D.25233>:
      iftmp.279 = nursery_next;
      <D.25234>:
      nursery_next = iftmp.279;
      gc_debug_level.280 = gc_debug_level;
      D.25236 = gc_debug_level.280 > 0;
      D.25237 = (long int) D.25236;
      D.25238 = __builtin_expect (D.25237, 0);
      if (D.25238 != 0) goto <D.25239>; else goto <D.25240>;
      <D.25239>:
      gc_debug_file.281 = gc_debug_file;
      stat_minor_gcs.282 = stat_minor_gcs;
      D.25243 = sgen_get_nursery_start ();
      nursery_next.283 = (long int) nursery_next;
      D.25245 = sgen_get_nursery_start ();
      D.25246 = (long int) D.25245;
      D.25247 = nursery_next.283 - D.25246;
      D.25248 = (int) D.25247;
      fprintf (gc_debug_file.281, "Start nursery collection %d %p-%p, size: %d\n", stat_minor_gcs.282, D.25243, nursery_next, D.25248);
      gc_debug_file.281 = gc_debug_file;
      fflush (gc_debug_file.281);
      <D.25240>:
      nursery_next.283 = (long int) nursery_next;
      D.25249 = sgen_get_nursery_start ();
      D.25250 = (long int) D.25249;
      D.25251 = nursery_next.283 - D.25250;
      max_garbage_amount = (size_t) D.25251;
      nursery_section.284 = nursery_section;
      D.25253 = nursery_section.284->size;
      D.25254 = D.25253 < max_garbage_amount;
      D.25255 = (long int) D.25254;
      D.25256 = __builtin_expect (D.25255, 0);
      if (D.25256 != 0) goto <D.25257>; else goto <D.25258>;
      <D.25257>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 2551, "nursery_section->size >= max_garbage_amount");
      <D.25258>:
      all_atv = mono_100ns_ticks ();
      atv = all_atv;
      btv = mono_100ns_ticks ();
      D.25259 = btv - atv;
      D.25260 = D.25259 / 10;
      D.25261 = (int) D.25260;
      D.25262 = (long long int) D.25261;
      time_minor_pre_collection_fragment_clear.285 = time_minor_pre_collection_fragment_clear;
      time_minor_pre_collection_fragment_clear.286 = D.25262 + time_minor_pre_collection_fragment_clear.285;
      time_minor_pre_collection_fragment_clear = time_minor_pre_collection_fragment_clear.286;
      xdomain_checks.287 = xdomain_checks;
      if (xdomain_checks.287 != 0) goto <D.25266>; else goto <D.25267>;
      <D.25266>:
      sgen_clear_nursery_fragments ();
      check_for_xdomain_refs ();
      <D.25267>:
      nursery_section.284 = nursery_section;
      nursery_section.284->next_data = nursery_next;
      D.25268 = major_collector.start_nursery_collection;
      D.25268 ();
      sgen_memgov_minor_collection_start ();
      init_gray_queue ();
      stat_minor_gcs.282 = stat_minor_gcs;
      stat_minor_gcs.288 = stat_minor_gcs.282 + 1;
      stat_minor_gcs = stat_minor_gcs.288;
      D.25270 = gc_stats.minor_gc_count;
      D.25271 = D.25270 + 1;
      gc_stats.minor_gc_count = D.25271;
      sgen_process_fin_stage_entries ();
      sgen_process_dislink_stage_entries ();
      sgen_init_pinning ();
      mono_profiler_gc_event (1, 0);
      D.25272 = sgen_get_nursery_start ();
      pin_from_roots (D.25272, nursery_next, &gray_queue);
      sgen_cement_iterate (pin_stage_object_callback, 0B);
      sgen_optimize_pin_queue (0);
      nursery_section.284 = nursery_section;
      sgen_pinning_setup_section (nursery_section.284);
      ctx.scan_func = 0B;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      nursery_section.284 = nursery_section;
      sgen_pin_objects_in_section (nursery_section.284, ctx);
      nursery_section.284 = nursery_section;
      sgen_pinning_trim_queue_to_section (nursery_section.284);
      atv = mono_100ns_ticks ();
      D.25273 = atv - btv;
      D.25274 = D.25273 / 10;
      D.25275 = (int) D.25274;
      D.25276 = (long long int) D.25275;
      time_minor_pinning.289 = time_minor_pinning;
      time_minor_pinning.290 = D.25276 + time_minor_pinning.289;
      time_minor_pinning = time_minor_pinning.290;
      gc_debug_level.280 = gc_debug_level;
      D.25279 = gc_debug_level.280 > 1;
      D.25280 = (long int) D.25279;
      D.25281 = __builtin_expect (D.25280, 0);
      if (D.25281 != 0) goto <D.25282>; else goto <D.25283>;
      <D.25282>:
      gc_debug_file.281 = gc_debug_file;
      D.25284 = sgen_get_pinned_count ();
      D.25273 = atv - btv;
      D.25274 = D.25273 / 10;
      D.25275 = (int) D.25274;
      fprintf (gc_debug_file.281, "Finding pinned pointers: %d in %d usecs\n", D.25284, D.25275);
      gc_debug_file.281 = gc_debug_file;
      fflush (gc_debug_file.281);
      <D.25283>:
      if (0 != 0) goto <D.25285>; else goto <D.25286>;
      <D.25285>:
      gc_debug_file.281 = gc_debug_file;
      D.25287 = sgen_get_pinned_count ();
      fprintf (gc_debug_file.281, "Start scan with %d pinned objects\n", D.25287);
      gc_debug_file.281 = gc_debug_file;
      fflush (gc_debug_file.281);
      <D.25286>:
      whole_heap_check_before_collection.291 = whole_heap_check_before_collection;
      if (whole_heap_check_before_collection.291 != 0) goto <D.25289>; else goto <D.25290>;
      <D.25289>:
      sgen_clear_nursery_fragments ();
      sgen_check_whole_heap (finish_up_concurrent_mark);
      <D.25290>:
      consistency_check_at_minor_collection.292 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.292 != 0) goto <D.25292>; else goto <D.25293>;
      <D.25292>:
      sgen_check_consistency ();
      <D.25293>:
      sgen_workers_start_all_workers ();
      sgen_workers_start_marking ();
      frssjd = sgen_alloc_internal_dynamic (16, 20, 1);
      D.25294 = sgen_get_nursery_start ();
      frssjd->heap_start = D.25294;
      frssjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_finish_remembered_set_scan, frssjd);
      btv = mono_100ns_ticks ();
      D.25259 = btv - atv;
      D.25260 = D.25259 / 10;
      D.25261 = (int) D.25260;
      D.25262 = (long long int) D.25261;
      time_minor_scan_remsets.293 = time_minor_scan_remsets;
      time_minor_scan_remsets.294 = D.25262 + time_minor_scan_remsets.293;
      time_minor_scan_remsets = time_minor_scan_remsets.294;
      gc_debug_level.280 = gc_debug_level;
      D.25279 = gc_debug_level.280 > 1;
      D.25280 = (long int) D.25279;
      D.25281 = __builtin_expect (D.25280, 0);
      if (D.25281 != 0) goto <D.25297>; else goto <D.25298>;
      <D.25297>:
      gc_debug_file.281 = gc_debug_file;
      D.25259 = btv - atv;
      D.25260 = D.25259 / 10;
      D.25261 = (int) D.25260;
      fprintf (gc_debug_file.281, "Old generation scan: %d usecs\n", D.25261);
      gc_debug_file.281 = gc_debug_file;
      fflush (gc_debug_file.281);
      <D.25298>:
      D.25299 = sgen_collection_is_parallel ();
      if (D.25299 == 0) goto <D.25300>; else goto <D.25301>;
      <D.25300>:
      D.25302 = current_object_ops.scan_object;
      ctx.scan_func = D.25302;
      ctx.copy_func = 0B;
      ctx.queue = &gray_queue;
      sgen_drain_gray_stack (-1, ctx);
      <D.25301>:
      D.25303 = mono_profiler_get_events ();
      D.25304 = D.25303 & 1048576;
      if (D.25304 != 0) goto <D.25305>; else goto <D.25306>;
      <D.25305>:
      report_registered_roots ();
      <D.25306>:
      D.25307 = mono_profiler_get_events ();
      D.25308 = D.25307 & 1048576;
      if (D.25308 != 0) goto <D.25309>; else goto <D.25310>;
      <D.25309>:
      report_finalizer_roots ();
      <D.25310>:
      atv = mono_100ns_ticks ();
      D.25273 = atv - btv;
      D.25274 = D.25273 / 10;
      D.25275 = (int) D.25274;
      D.25276 = (long long int) D.25275;
      time_minor_scan_pinned.295 = time_minor_scan_pinned;
      time_minor_scan_pinned.296 = D.25276 + time_minor_scan_pinned.295;
      time_minor_scan_pinned = time_minor_scan_pinned.296;
      scrrjd_normal = sgen_alloc_internal_dynamic (40, 20, 1);
      D.25313 = current_object_ops.copy_or_mark_object;
      scrrjd_normal->copy_or_mark_func = D.25313;
      D.25302 = current_object_ops.scan_object;
      scrrjd_normal->scan_func = D.25302;
      D.25314 = sgen_get_nursery_start ();
      scrrjd_normal->heap_start = D.25314;
      scrrjd_normal->heap_end = nursery_next;
      scrrjd_normal->root_type = 0;
      sgen_workers_enqueue_job (job_scan_from_registered_roots, scrrjd_normal);
      scrrjd_wbarrier = sgen_alloc_internal_dynamic (40, 20, 1);
      D.25313 = current_object_ops.copy_or_mark_object;
      scrrjd_wbarrier->copy_or_mark_func = D.25313;
      D.25302 = current_object_ops.scan_object;
      scrrjd_wbarrier->scan_func = D.25302;
      D.25315 = sgen_get_nursery_start ();
      scrrjd_wbarrier->heap_start = D.25315;
      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.25259 = btv - atv;
      D.25260 = D.25259 / 10;
      D.25261 = (int) D.25260;
      D.25262 = (long long int) D.25261;
      time_minor_scan_registered_roots.297 = time_minor_scan_registered_roots;
      time_minor_scan_registered_roots.298 = D.25262 + time_minor_scan_registered_roots.297;
      time_minor_scan_registered_roots = time_minor_scan_registered_roots.298;
      stdjd = sgen_alloc_internal_dynamic (16, 20, 1);
      D.25318 = sgen_get_nursery_start ();
      stdjd->heap_start = D.25318;
      stdjd->heap_end = nursery_next;
      sgen_workers_enqueue_job (job_scan_thread_data, stdjd);
      atv = mono_100ns_ticks ();
      D.25273 = atv - btv;
      D.25274 = D.25273 / 10;
      D.25275 = (int) D.25274;
      D.25276 = (long long int) D.25275;
      time_minor_scan_thread_data.299 = time_minor_scan_thread_data;
      time_minor_scan_thread_data.300 = D.25276 + time_minor_scan_thread_data.299;
      time_minor_scan_thread_data = time_minor_scan_thread_data.300;
      btv = atv;
      D.25325 = sgen_collection_is_parallel ();
      if (D.25325 != 0) goto <D.25322>; else goto <D.25326>;
      <D.25326>:
      D.25327 = sgen_collection_is_concurrent ();
      if (D.25327 != 0) goto <D.25322>; else goto <D.25323>;
      <D.25322>:
      iftmp.301 = 1;
      goto <D.25324>;
      <D.25323>:
      iftmp.301 = 0;
      <D.25324>:
      D.25328 = iftmp.301 != 0;
      D.25329 = (long int) D.25328;
      D.25330 = __builtin_expect (D.25329, 0);
      if (D.25330 != 0) goto <D.25331>; else goto <D.25332>;
      <D.25331>:
      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.25332>:
      D.25335 = sgen_collection_is_parallel ();
      if (D.25335 != 0) goto <D.25333>; else goto <D.25336>;
      <D.25336>:
      D.25337 = sgen_collection_is_concurrent ();
      if (D.25337 != 0) goto <D.25333>; else goto <D.25334>;
      <D.25333>:
      D.25338 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.25339 = D.25338 == 0;
      D.25340 = (long int) D.25339;
      D.25341 = __builtin_expect (D.25340, 0);
      if (D.25341 != 0) goto <D.25342>; else goto <D.25343>;
      <D.25342>:
      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.25343>:
      <D.25334>:
      sfejd_fin_ready = sgen_alloc_internal_dynamic (8, 20, 1);
      fin_ready_list.302 = fin_ready_list;
      sfejd_fin_ready->list = fin_ready_list.302;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_fin_ready);
      sfejd_critical_fin = sgen_alloc_internal_dynamic (8, 20, 1);
      critical_fin_list.303 = critical_fin_list;
      sfejd_critical_fin->list = critical_fin_list.303;
      sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin);
      finish_gray_stack (0, &gray_queue);
      atv = mono_100ns_ticks ();
      D.25273 = atv - btv;
      D.25274 = D.25273 / 10;
      D.25275 = (int) D.25274;
      D.25276 = (long long int) D.25275;
      time_minor_finish_gray_stack.304 = time_minor_finish_gray_stack;
      time_minor_finish_gray_stack.305 = D.25276 + time_minor_finish_gray_stack.304;
      time_minor_finish_gray_stack = time_minor_finish_gray_stack.305;
      mono_profiler_gc_event (2, 0);
      sgen_workers_reset_data ();
      objects_pinned.306 = objects_pinned;
      if (objects_pinned.306 != 0) goto <D.25349>; else goto <D.25350>;
      <D.25349>:
      sgen_optimize_pin_queue (0);
      nursery_section.284 = nursery_section;
      sgen_pinning_setup_section (nursery_section.284);
      <D.25350>:
      mono_profiler_gc_event (3, 0);
      nursery_section.284 = nursery_section;
      nursery_section.284 = nursery_section;
      D.25351 = nursery_section.284->pin_queue_start;
      nursery_section.284 = nursery_section;
      D.25352 = nursery_section.284->pin_queue_num_entries;
      fragment_total = sgen_build_nursery_fragments (nursery_section.284, D.25351, D.25352, unpin_queue);
      if (fragment_total == 0) goto <D.25353>; else goto <D.25354>;
      <D.25353>:
      degraded_mode = 1;
      <D.25354>:
      sgen_clear_tlabs ();
      mono_profiler_gc_event (4, 0);
      btv = mono_100ns_ticks ();
      D.25259 = btv - atv;
      D.25260 = D.25259 / 10;
      D.25261 = (int) D.25260;
      D.25262 = (long long int) D.25261;
      time_minor_fragment_creation.307 = time_minor_fragment_creation;
      time_minor_fragment_creation.308 = D.25262 + time_minor_fragment_creation.307;
      time_minor_fragment_creation = time_minor_fragment_creation.308;
      gc_debug_level.280 = gc_debug_level;
      D.25279 = gc_debug_level.280 > 1;
      D.25280 = (long int) D.25279;
      D.25281 = __builtin_expect (D.25280, 0);
      if (D.25281 != 0) goto <D.25357>; else goto <D.25358>;
      <D.25357>:
      gc_debug_file.281 = gc_debug_file;
      D.25259 = btv - atv;
      D.25260 = D.25259 / 10;
      D.25261 = (int) D.25260;
      fprintf (gc_debug_file.281, "Fragment creation: %d usecs, %lu bytes available\n", D.25261, fragment_total);
      gc_debug_file.281 = gc_debug_file;
      fflush (gc_debug_file.281);
      <D.25358>:
      consistency_check_at_minor_collection.292 = consistency_check_at_minor_collection;
      if (consistency_check_at_minor_collection.292 != 0) goto <D.25359>; else goto <D.25360>;
      <D.25359>:
      sgen_check_major_refs ();
      <D.25360>:
      D.25361 = major_collector.finish_nursery_collection;
      D.25361 ();
      all_btv = mono_100ns_ticks ();
      D.25362 = gc_stats.minor_gc_time_usecs;
      D.25363 = all_btv - all_atv;
      D.25364 = D.25363 / 10;
      D.25365 = (int) D.25364;
      D.25366 = (long long int) D.25365;
      D.25367 = D.25362 + D.25366;
      gc_stats.minor_gc_time_usecs = D.25367;
      heap_dump_file.309 = heap_dump_file;
      if (heap_dump_file.309 != 0B) goto <D.25369>; else goto <D.25370>;
      <D.25369>:
      stat_minor_gcs.282 = stat_minor_gcs;
      D.25371 = stat_minor_gcs.282 + -1;
      dump_heap ("minor", D.25371, 0B);
      <D.25370>:
      sgen_finish_pinning ();
      fin_ready_list.302 = fin_ready_list;
      if (fin_ready_list.302 != 0B) goto <D.25372>; else goto <D.25374>;
      <D.25374>:
      critical_fin_list.303 = critical_fin_list;
      if (critical_fin_list.303 != 0B) goto <D.25372>; else goto <D.25373>;
      <D.25372>:
      if (0 != 0) goto <D.25375>; else goto <D.25376>;
      <D.25375>:
      gc_debug_file.281 = gc_debug_file;
      num_ready_finalizers.310 = num_ready_finalizers;
      fprintf (gc_debug_file.281, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers.310);
      gc_debug_file.281 = gc_debug_file;
      fflush (gc_debug_file.281);
      <D.25376>:
      mono_gc_finalize_notify ();
      <D.25373>:
      sgen_pin_stats_reset ();
      sgen_cement_clear_below_threshold ();
      D.25378 = sgen_gray_object_queue_is_empty (&gray_queue);
      D.25379 = D.25378 == 0;
      D.25380 = (long int) D.25379;
      D.25381 = __builtin_expect (D.25380, 0);
      if (D.25381 != 0) goto <D.25382>; else goto <D.25383>;
      <D.25382>:
      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.25383>:
      D.25384 = remset.finish_minor_collection;
      D.25384 ();
      check_scan_starts ();
      sgen_memgov_minor_collection_end ();
      objects_pinned.306 = objects_pinned;
      D.25385 = objects_pinned.306 != 0;
      needs_major = (gboolean) D.25385;
      current_collection_generation = -1;
      objects_pinned = 0;
      check_nursery_objects_pinned.311 = check_nursery_objects_pinned;
      if (check_nursery_objects_pinned.311 != 0) goto <D.25387>; else goto <D.25388>;
      <D.25387>:
      D.25389 = sgen_minor_collector.is_split;
      if (D.25389 == 0) goto <D.25390>; else goto <D.25391>;
      <D.25390>:
      D.25392 = unpin_queue != 0B;
      D.25393 = (int) D.25392;
      sgen_check_nursery_objects_pinned (D.25393);
      <D.25391>:
      <D.25388>:
      D.25222 = needs_major;
      return D.25222;
    }
  finally
    {
      ctx = {CLOBBER};
    }
}


job_finish_remembered_set_scan (struct WorkerData * worker_data, void * job_data_untyped)
{
  void (*<T2dfa>) (void *, void *, struct SgenGrayQueue *) D.25396;
  char * D.25397;
  char * D.25398;
  struct SgenGrayQueue * D.25399;
  struct FinishRememberedSetScanJobData * job_data;

  job_data = job_data_untyped;
  D.25396 = remset.finish_scan_remsets;
  D.25397 = job_data->heap_start;
  D.25398 = job_data->heap_end;
  D.25399 = sgen_workers_get_job_gray_queue (worker_data);
  D.25396 (D.25397, D.25398, D.25399);
  sgen_free_internal_dynamic (job_data, 16, 20);
}


verify_nursery ()
{
  int do_verify_nursery.312;
  void * D.25403;
  long unsigned int D.25408;
  long unsigned int D.25409;
  long unsigned int D.25411;
  int gc_debug_level.313;
  _Bool D.25414;
  long int D.25415;
  long int D.25416;
  struct FILE * gc_debug_file.314;
  long unsigned int D.25420;
  unsigned int D.25425;
  unsigned int D.25426;
  unsigned int D.25427;
  long unsigned int D.25428;
  char * D.25429;
  int do_dump_nursery_content.315;
  long int cur.316;
  long int hole_start.317;
  long int D.25439;
  int D.25440;
  int D.25443;
  int D.25444;
  const char * D.25445;
  void * D.25446;
  struct MonoVTable * D.25447;
  _Bool D.25448;
  int D.25449;
  char * start;
  char * end;
  char * cur;
  char * hole_start;

  do_verify_nursery.312 = do_verify_nursery;
  if (do_verify_nursery.312 == 0) goto <D.25401>; else goto <D.25402>;
  <D.25401>:
  return;
  <D.25402>:
  sgen_nursery_allocator_prepare_for_pinning ();
  cur = sgen_get_nursery_start ();
  start = cur;
  hole_start = start;
  end = sgen_get_nursery_end ();
  goto <D.21512>;
  <D.21513>:
  {
    size_t ss;
    size_t size;

    D.25403 = MEM[(void * *)cur];
    if (D.25403 == 0B) goto <D.25404>; else goto <D.25405>;
    <D.25404>:
    cur = cur + 8;
    // predicted unlikely by continue predictor.
    goto <D.21512>;
    <D.25405>:
    D.25408 = MEM[(mword *)cur];
    D.25409 = D.25408 & 1;
    if (D.25409 != 0) goto <D.25410>; else goto <D.25406>;
    <D.25410>:
    D.25408 = MEM[(mword *)cur];
    D.25411 = D.25408 & 18446744073709551612;
    if (D.25411 != 0) goto <D.25412>; else goto <D.25406>;
    <D.25412>:
    gc_debug_level.313 = gc_debug_level;
    D.25414 = gc_debug_level.313 > 0;
    D.25415 = (long int) D.25414;
    D.25416 = __builtin_expect (D.25415, 0);
    if (D.25416 != 0) goto <D.25417>; else goto <D.25418>;
    <D.25417>:
    gc_debug_file.314 = gc_debug_file;
    fprintf (gc_debug_file.314, "FORWARDED OBJ %p\n", cur);
    gc_debug_file.314 = gc_debug_file;
    fflush (gc_debug_file.314);
    <D.25418>:
    goto <D.25407>;
    <D.25406>:
    D.25408 = MEM[(mword *)cur];
    D.25420 = D.25408 & 2;
    if (D.25420 != 0) goto <D.25421>; else goto <D.25422>;
    <D.25421>:
    gc_debug_level.313 = gc_debug_level;
    D.25414 = gc_debug_level.313 > 0;
    D.25415 = (long int) D.25414;
    D.25416 = __builtin_expect (D.25415, 0);
    if (D.25416 != 0) goto <D.25423>; else goto <D.25424>;
    <D.25423>:
    gc_debug_file.314 = gc_debug_file;
    fprintf (gc_debug_file.314, "PINNED OBJ %p\n", cur);
    gc_debug_file.314 = gc_debug_file;
    fflush (gc_debug_file.314);
    <D.25424>:
    <D.25422>:
    <D.25407>:
    D.25425 = sgen_safe_object_get_size (cur);
    ss = (size_t) D.25425;
    D.25426 = sgen_safe_object_get_size (cur);
    D.25427 = D.25426 + 7;
    D.25428 = (long unsigned int) D.25427;
    size = D.25428 & 4294967288;
    D.25429 = cur + size;
    verify_scan_starts (cur, D.25429);
    do_dump_nursery_content.315 = do_dump_nursery_content;
    if (do_dump_nursery_content.315 != 0) goto <D.25431>; else goto <D.25432>;
    <D.25431>:
    if (cur > hole_start) goto <D.25433>; else goto <D.25434>;
    <D.25433>:
    gc_debug_level.313 = gc_debug_level;
    D.25414 = gc_debug_level.313 > 0;
    D.25415 = (long int) D.25414;
    D.25416 = __builtin_expect (D.25415, 0);
    if (D.25416 != 0) goto <D.25435>; else goto <D.25436>;
    <D.25435>:
    gc_debug_file.314 = gc_debug_file;
    cur.316 = (long int) cur;
    hole_start.317 = (long int) hole_start;
    D.25439 = cur.316 - hole_start.317;
    D.25440 = (int) D.25439;
    fprintf (gc_debug_file.314, "HOLE [%p %p %d]\n", hole_start, cur, D.25440);
    gc_debug_file.314 = gc_debug_file;
    fflush (gc_debug_file.314);
    <D.25436>:
    <D.25434>:
    gc_debug_level.313 = gc_debug_level;
    D.25414 = gc_debug_level.313 > 0;
    D.25415 = (long int) D.25414;
    D.25416 = __builtin_expect (D.25415, 0);
    if (D.25416 != 0) goto <D.25441>; else goto <D.25442>;
    <D.25441>:
    gc_debug_file.314 = gc_debug_file;
    D.25429 = cur + size;
    D.25443 = (int) size;
    D.25444 = (int) ss;
    D.25445 = sgen_safe_name (cur);
    D.25408 = MEM[(mword *)cur];
    D.25411 = D.25408 & 18446744073709551612;
    D.25446 = (void *) D.25411;
    D.25447 = sgen_get_array_fill_vtable ();
    D.25448 = D.25446 == D.25447;
    D.25449 = (int) D.25448;
    fprintf (gc_debug_file.314, "OBJ  [%p %p %d %d %s %d]\n", cur, D.25429, D.25443, D.25444, D.25445, D.25449);
    gc_debug_file.314 = gc_debug_file;
    fflush (gc_debug_file.314);
    <D.25442>:
    <D.25432>:
    cur = cur + size;
    hole_start = cur;
  }
  <D.21512>:
  if (cur < end) goto <D.21513>; else goto <D.21514>;
  <D.21514>:
}


major_do_collection (const char * reason)
{
  int disable_major_collections.318;
  gboolean D.25454;
  long long int (*<T2dc6>) (void) D.25455;
  _Bool D.25458;
  long int D.25459;
  long int D.25460;
  int old_next_pin_slot.319;
  long long int D.25464;
  long int D.25465;
  long int D.25466;
  int D.25467;
  long long int D.25468;
  long long int D.25469;
  long unsigned int bytes_pinned_from_failed_allocation.320;
  _Bool D.25473;
  gint64 all_atv;
  gint64 all_btv;
  int old_next_pin_slot;

  try
    {
      disable_major_collections.318 = disable_major_collections;
      if (disable_major_collections.318 != 0) goto <D.25452>; else goto <D.25453>;
      <D.25452>:
      D.25454 = 0;
      return D.25454;
      <D.25453>:
      D.25455 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.25455 != 0B) goto <D.25456>; else goto <D.25457>;
      <D.25456>:
      {
        long long int num_marked;

        D.25455 = major_collector.get_and_reset_num_major_objects_marked;
        num_marked = D.25455 ();
        D.25458 = num_marked != 0;
        D.25459 = (long int) D.25458;
        D.25460 = __builtin_expect (D.25459, 0);
        if (D.25460 != 0) goto <D.25461>; else goto <D.25462>;
        <D.25461>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3298, "!num_marked");
        <D.25462>:
      }
      <D.25457>:
      all_atv = mono_100ns_ticks ();
      major_start_collection (0, &old_next_pin_slot);
      old_next_pin_slot.319 = old_next_pin_slot;
      major_finish_collection (reason, old_next_pin_slot.319, 0);
      all_btv = mono_100ns_ticks ();
      D.25464 = gc_stats.major_gc_time_usecs;
      D.25465 = all_btv - all_atv;
      D.25466 = D.25465 / 10;
      D.25467 = (int) D.25466;
      D.25468 = (long long int) D.25467;
      D.25469 = D.25464 + D.25468;
      gc_stats.major_gc_time_usecs = D.25469;
      D.25455 = major_collector.get_and_reset_num_major_objects_marked;
      if (D.25455 != 0B) goto <D.25470>; else goto <D.25471>;
      <D.25470>:
      D.25455 = major_collector.get_and_reset_num_major_objects_marked;
      D.25455 ();
      <D.25471>:
      bytes_pinned_from_failed_allocation.320 = bytes_pinned_from_failed_allocation;
      D.25473 = bytes_pinned_from_failed_allocation.320 != 0;
      D.25454 = (gboolean) D.25473;
      return D.25454;
    }
  finally
    {
      old_next_pin_slot = {CLOBBER};
    }
}


sgen_gray_object_queue_is_empty (struct SgenGrayQueue * queue)
{
  gboolean D.25476;
  struct GrayQueueSection * D.25477;
  _Bool D.25478;

  D.25477 = queue->first;
  D.25478 = D.25477 == 0B;
  D.25476 = (gboolean) D.25478;
  return D.25476;
}


sgen_gc_is_object_ready_for_finalization (void * object)
{
  gboolean D.25480;
  int D.25481;
  _Bool D.25482;

  D.25481 = sgen_is_object_alive (object);
  D.25482 = D.25481 == 0;
  D.25480 = (gboolean) D.25482;
  return D.25480;
}


sgen_is_object_alive (void * object)
{
  int D.25484;
  gboolean D.25487;

  D.25484 = sgen_ptr_in_nursery (object);
  if (D.25484 != 0) goto <D.25485>; else goto <D.25486>;
  <D.25485>:
  D.25487 = sgen_nursery_is_object_alive (object);
  return D.25487;
  <D.25486>:
  D.25487 = sgen_major_is_object_alive (object);
  return D.25487;
}


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

  entry = sgen_alloc_internal (6);
  critical = has_critical_finalizer (obj);
  entry->object = obj;
  if (critical != 0) goto <D.25489>; else goto <D.25490>;
  <D.25489>:
  critical_fin_list.321 = critical_fin_list;
  entry->next = critical_fin_list.321;
  critical_fin_list = entry;
  goto <D.25492>;
  <D.25490>:
  fin_ready_list.322 = fin_ready_list;
  entry->next = fin_ready_list.322;
  fin_ready_list = entry;
  <D.25492>:
}


has_critical_finalizer (struct MonoObject * obj)
{
  struct MonoClass * D.25494;
  gboolean D.25497;
  long unsigned int D.25498;
  long unsigned int D.25499;
  struct MonoVTable * D.25500;
  struct MonoClass * class;

  D.25494 = mono_defaults.critical_finalizer_object;
  if (D.25494 == 0B) goto <D.25495>; else goto <D.25496>;
  <D.25495>:
  D.25497 = 0;
  return D.25497;
  <D.25496>:
  D.25498 = MEM[(mword *)obj];
  D.25499 = D.25498 & 18446744073709551612;
  D.25500 = (struct MonoVTable *) D.25499;
  class = D.25500->klass;
  D.25494 = mono_defaults.critical_finalizer_object;
  D.25497 = mono_class_has_parent_fast (class, D.25494);
  return D.25497;
}


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

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


sgen_is_object_alive_and_on_current_collection (char * object)
{
  int D.25504;
  int D.25507;
  int current_collection_generation.323;

  D.25504 = sgen_ptr_in_nursery (object);
  if (D.25504 != 0) goto <D.25505>; else goto <D.25506>;
  <D.25505>:
  D.25507 = sgen_nursery_is_object_alive (object);
  return D.25507;
  <D.25506>:
  current_collection_generation.323 = current_collection_generation;
  if (current_collection_generation.323 == 0) goto <D.25509>; else goto <D.25510>;
  <D.25509>:
  D.25507 = 0;
  return D.25507;
  <D.25510>:
  D.25507 = sgen_major_is_object_alive (object);
  return D.25507;
}


mono_gc_invoke_finalizers ()
{
  struct FinalizeReadyEntry * * iftmp.324;
  struct FinalizeReadyEntry * D.25518;
  struct FinalizeReadyEntry * D.25521;
  struct FinalizeReadyEntry * D.25523;
  void * D.25525;
  _Bool D.25532;
  long int D.25533;
  long int D.25534;
  int num_ready_finalizers.325;
  int num_ready_finalizers.326;
  struct FILE * gc_debug_file.327;
  const char * D.25542;
  _Bool D.25544;
  long int D.25545;
  long int D.25546;
  struct FinalizeReadyEntry * fin_ready_list.328;
  struct FinalizeReadyEntry * critical_fin_list.329;
  _Bool D.25552;
  long int D.25553;
  long int D.25554;
  int D.25557;
  struct FinalizeReadyEntry * entry;
  gboolean entry_is_critical;
  int count;
  void * obj;

  entry = 0B;
  entry_is_critical = 0;
  count = 0;
  goto <D.21746>;
  <D.21745>:
  pthread_mutex_lock (&gc_mutex);
  if (entry != 0B) goto <D.25512>; else goto <D.25513>;
  <D.25512>:
  {
    struct FinalizeReadyEntry * * list;

    if (entry_is_critical != 0) goto <D.25515>; else goto <D.25516>;
    <D.25515>:
    iftmp.324 = &critical_fin_list;
    goto <D.25517>;
    <D.25516>:
    iftmp.324 = &fin_ready_list;
    <D.25517>:
    list = iftmp.324;
    D.25518 = *list;
    if (D.25518 == entry) goto <D.25519>; else goto <D.25520>;
    <D.25519>:
    D.25521 = entry->next;
    *list = D.25521;
    goto <D.25522>;
    <D.25520>:
    {
      struct FinalizeReadyEntry * e;

      e = *list;
      goto <D.21736>;
      <D.21735>:
      e = e->next;
      <D.21736>:
      D.25523 = e->next;
      if (D.25523 != entry) goto <D.21735>; else goto <D.21737>;
      <D.21737>:
      D.25521 = entry->next;
      e->next = D.25521;
    }
    <D.25522>:
    sgen_free_internal (entry, 6);
    entry = 0B;
  }
  <D.25513>:
  entry = fin_ready_list;
  goto <D.21739>;
  <D.21738>:
  entry = entry->next;
  <D.21739>:
  if (entry != 0B) goto <D.25524>; else goto <D.21740>;
  <D.25524>:
  D.25525 = entry->object;
  if (D.25525 == 0B) goto <D.21738>; else goto <D.21740>;
  <D.21740>:
  if (entry != 0B) goto <D.25526>; else goto <D.25527>;
  <D.25526>:
  entry_is_critical = 0;
  goto <D.25528>;
  <D.25527>:
  entry_is_critical = 1;
  entry = critical_fin_list;
  goto <D.21742>;
  <D.21741>:
  entry = entry->next;
  <D.21742>:
  if (entry != 0B) goto <D.25529>; else goto <D.21743>;
  <D.25529>:
  D.25525 = entry->object;
  if (D.25525 == 0B) goto <D.21741>; else goto <D.21743>;
  <D.21743>:
  <D.25528>:
  if (entry != 0B) goto <D.25530>; else goto <D.25531>;
  <D.25530>:
  D.25525 = entry->object;
  D.25532 = D.25525 == 0B;
  D.25533 = (long int) D.25532;
  D.25534 = __builtin_expect (D.25533, 0);
  if (D.25534 != 0) goto <D.25535>; else goto <D.25536>;
  <D.25535>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3882, "entry->object");
  <D.25536>:
  num_ready_finalizers.325 = num_ready_finalizers;
  num_ready_finalizers.326 = num_ready_finalizers.325 + -1;
  num_ready_finalizers = num_ready_finalizers.326;
  obj = entry->object;
  entry->object = 0B;
  if (0 != 0) goto <D.25539>; else goto <D.25540>;
  <D.25539>:
  gc_debug_file.327 = gc_debug_file;
  D.25542 = safe_name (obj);
  fprintf (gc_debug_file.327, "Finalizing object %p (%s)\n", obj, D.25542);
  gc_debug_file.327 = gc_debug_file;
  fflush (gc_debug_file.327);
  <D.25540>:
  <D.25531>:
  sgen_gc_unlock ();
  if (entry == 0B) goto <D.21744>; else goto <D.25543>;
  <D.25543>:
  D.25525 = entry->object;
  D.25544 = D.25525 != 0B;
  D.25545 = (long int) D.25544;
  D.25546 = __builtin_expect (D.25545, 0);
  if (D.25546 != 0) goto <D.25547>; else goto <D.25548>;
  <D.25547>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3894, "entry->object == NULL");
  <D.25548>:
  count = count + 1;
  mono_gc_run_finalize (obj, 0B);
  <D.21746>:
  fin_ready_list.328 = fin_ready_list;
  if (fin_ready_list.328 != 0B) goto <D.21745>; else goto <D.25550>;
  <D.25550>:
  critical_fin_list.329 = critical_fin_list;
  if (critical_fin_list.329 != 0B) goto <D.21745>; else goto <D.21744>;
  <D.21744>:
  D.25552 = entry != 0B;
  D.25553 = (long int) D.25552;
  D.25554 = __builtin_expect (D.25553, 0);
  if (D.25554 != 0) goto <D.25555>; else goto <D.25556>;
  <D.25555>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 3900, "!entry");
  <D.25556>:
  D.25557 = count;
  return D.25557;
}


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

  fin_ready_list.331 = fin_ready_list;
  if (fin_ready_list.331 != 0B) goto <D.25561>; else goto <D.25565>;
  <D.25565>:
  critical_fin_list.332 = critical_fin_list;
  if (critical_fin_list.332 != 0B) goto <D.25561>; else goto <D.25562>;
  <D.25561>:
  iftmp.330 = 1;
  goto <D.25563>;
  <D.25562>:
  iftmp.330 = 0;
  <D.25563>:
  D.25559 = iftmp.330;
  return D.25559;
}


mono_gc_register_root (char * start, size_t size, void * descr)
{
  int D.25568;
  _Bool D.25569;
  int D.25570;

  D.25569 = descr == 0B;
  D.25570 = (int) D.25569;
  D.25568 = mono_gc_register_root_inner (start, size, descr, D.25570);
  return D.25568;
}


mono_gc_register_root_inner (char * start, size_t size, void * descr, int root_type)
{
  struct SgenHashTable * D.25572;
  char * D.25575;
  long int D.25576;
  long int start.333;
  long int D.25578;
  char * D.25579;
  int iftmp.334;
  long unsigned int D.25585;
  _Bool D.25588;
  long int D.25589;
  long int D.25590;
  long unsigned int descr.335;
  long unsigned int roots_size.336;
  long unsigned int roots_size.337;
  long unsigned int roots_size.338;
  int D.25597;
  struct SgenHashTable * D.25598;
  struct FILE * gc_debug_file.339;
  char * D.25602;
  int D.25603;
  int D.25604;
  struct RootRecord new_root;
  int i;

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

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

          D.25575 = root->end_root;
          D.25576 = (long int) D.25575;
          start.333 = (long int) start;
          D.25578 = D.25576 - start.333;
          old_size = (size_t) D.25578;
          D.25579 = start + size;
          root->end_root = D.25579;
          D.25585 = root->root_desc;
          if (D.25585 == 0) goto <D.25581>; else goto <D.25586>;
          <D.25586>:
          if (descr == 0B) goto <D.25581>; else goto <D.25582>;
          <D.25581>:
          D.25585 = root->root_desc;
          if (D.25585 != 0) goto <D.25583>; else goto <D.25587>;
          <D.25587>:
          if (descr != 0B) goto <D.25583>; else goto <D.25582>;
          <D.25583>:
          iftmp.334 = 1;
          goto <D.25584>;
          <D.25582>:
          iftmp.334 = 0;
          <D.25584>:
          D.25588 = iftmp.334 != 0;
          D.25589 = (long int) D.25588;
          D.25590 = __builtin_expect (D.25589, 0);
          if (D.25590 != 0) goto <D.25591>; else goto <D.25592>;
          <D.25591>:
          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.25592>:
          descr.335 = (long unsigned int) descr;
          root->root_desc = descr.335;
          roots_size.336 = roots_size;
          roots_size.337 = roots_size.336 + size;
          roots_size = roots_size.337;
          roots_size.336 = roots_size;
          roots_size.338 = roots_size.336 - old_size;
          roots_size = roots_size.338;
          sgen_gc_unlock ();
          D.25597 = 1;
          return D.25597;
        }
        <D.25574>:
      }
      i = i + 1;
      <D.21761>:
      if (i <= 2) goto <D.21760>; else goto <D.21762>;
      <D.21762>:
      D.25579 = start + size;
      new_root.end_root = D.25579;
      descr.335 = (long unsigned int) descr;
      new_root.root_desc = descr.335;
      D.25598 = &roots_hash[root_type];
      sgen_hash_table_replace (D.25598, start, &new_root, 0B);
      roots_size.336 = roots_size;
      roots_size.337 = roots_size.336 + size;
      roots_size = roots_size.337;
      if (0 != 0) goto <D.25599>; else goto <D.25600>;
      <D.25599>:
      gc_debug_file.339 = gc_debug_file;
      D.25602 = new_root.end_root;
      D.25603 = (int) size;
      roots_size.336 = roots_size;
      D.25604 = (int) roots_size.336;
      fprintf (gc_debug_file.339, "Added root for range: %p-%p, descr: %p  (%d/%d bytes)\n", start, D.25602, descr, D.25603, D.25604);
      gc_debug_file.339 = gc_debug_file;
      fflush (gc_debug_file.339);
      <D.25600>:
      sgen_gc_unlock ();
      D.25597 = 1;
      return D.25597;
    }
  finally
    {
      new_root = {CLOBBER};
    }
}


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

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


mono_gc_deregister_root (char * addr)
{
  struct SgenHashTable * D.25609;
  int D.25610;
  long int addr.340;
  char * D.25614;
  long int D.25615;
  long int D.25616;
  long unsigned int D.25617;
  long unsigned int roots_size.341;
  long unsigned int roots_size.342;
  int root_type;
  struct RootRecord root;

  try
    {
      pthread_mutex_lock (&gc_mutex);
      root_type = 0;
      goto <D.21779>;
      <D.21778>:
      D.25609 = &roots_hash[root_type];
      D.25610 = sgen_hash_table_remove (D.25609, addr, &root);
      if (D.25610 != 0) goto <D.25611>; else goto <D.25612>;
      <D.25611>:
      addr.340 = (long int) addr;
      D.25614 = root.end_root;
      D.25615 = (long int) D.25614;
      D.25616 = addr.340 - D.25615;
      D.25617 = (long unsigned int) D.25616;
      roots_size.341 = roots_size;
      roots_size.342 = D.25617 + roots_size.341;
      roots_size = roots_size.342;
      <D.25612>:
      root_type = root_type + 1;
      <D.21779>:
      if (root_type <= 2) goto <D.21778>; else goto <D.21780>;
      <D.21780>:
      sgen_gc_unlock ();
    }
  finally
    {
      root = {CLOBBER};
    }
}


sgen_get_current_collection_generation ()
{
  int D.25620;

  D.25620 = current_collection_generation;
  return D.25620;
}


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


mono_gc_get_gc_callbacks ()
{
  struct MonoGCCallbacks * D.25622;

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


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

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


mono_gc_scan_object (void * obj)
{
  unsigned int user_copy_or_mark_key.345;
  void (*<T2c8a>) (void * *, struct SgenGrayQueue *) D.25627;
  struct GrayQueue * D.25628;
  void * D.25629;
  struct UserCopyOrMarkData * data;

  user_copy_or_mark_key.345 = user_copy_or_mark_key;
  data = pthread_getspecific (user_copy_or_mark_key.345);
  D.25627 = current_object_ops.copy_or_mark_object;
  D.25628 = data->queue;
  D.25627 (&obj, D.25628);
  D.25629 = obj;
  return D.25629;
}


mono_gc_register_thread (void * baseptr)
{
  gboolean D.25631;
  struct SgenThreadInfo * D.25632;
  _Bool D.25633;

  D.25632 = mono_thread_info_attach (baseptr);
  D.25633 = D.25632 != 0B;
  D.25631 = (gboolean) D.25633;
  return D.25631;
}


mono_gc_set_stack_end (void * stack_end)
{
  void * D.25637;
  _Bool D.25638;
  long int D.25639;
  long int D.25640;
  struct SgenThreadInfo * info;

  pthread_mutex_lock (&gc_mutex);
  info = mono_thread_info_current ();
  if (info != 0B) goto <D.25635>; else goto <D.25636>;
  <D.25635>:
  D.25637 = info->stack_end;
  D.25638 = D.25637 <= stack_end;
  D.25639 = (long int) D.25638;
  D.25640 = __builtin_expect (D.25639, 0);
  if (D.25640 != 0) goto <D.25641>; else goto <D.25642>;
  <D.25641>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4224, "stack_end < info->stack_end");
  <D.25642>:
  info->stack_end = stack_end;
  <D.25636>:
  sgen_gc_unlock ();
}


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

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


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

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


mono_gc_pthread_detach (pthread_t thread)
{
  int D.25647;

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


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.25649;
  struct FILE * gc_debug_file.346;
  void (*<T2de2>) (struct MonoObject *, void *, struct MonoObject *) D.25657;

  D.25649 = sgen_ptr_in_nursery (field_ptr);
  if (D.25649 != 0) goto <D.25650>; else goto <D.25651>;
  <D.25650>:
  MEM[(void * *)field_ptr] = value;
  return;
  <D.25651>:
  if (0 != 0) goto <D.25652>; else goto <D.25653>;
  <D.25652>:
  gc_debug_file.346 = gc_debug_file;
  fprintf (gc_debug_file.346, "Adding remset at %p\n", field_ptr);
  gc_debug_file.346 = gc_debug_file;
  fflush (gc_debug_file.346);
  <D.25653>:
  if (value != 0B) goto <D.25655>; else goto <D.25656>;
  <D.25655>:
  <D.25656>:
  D.25657 = remset.wbarrier_set_field;
  D.25657 (obj, field_ptr, value);
}


mono_gc_wbarrier_set_arrayref (struct MonoArray * arr, void * slot_ptr, struct MonoObject * value)
{
  int D.25659;
  struct FILE * gc_debug_file.347;
  void (*<T2de6>) (struct MonoArray *, void *, struct MonoObject *) D.25667;

  D.25659 = sgen_ptr_in_nursery (slot_ptr);
  if (D.25659 != 0) goto <D.25660>; else goto <D.25661>;
  <D.25660>:
  MEM[(void * *)slot_ptr] = value;
  return;
  <D.25661>:
  if (0 != 0) goto <D.25662>; else goto <D.25663>;
  <D.25662>:
  gc_debug_file.347 = gc_debug_file;
  fprintf (gc_debug_file.347, "Adding remset at %p\n", slot_ptr);
  gc_debug_file.347 = gc_debug_file;
  fflush (gc_debug_file.347);
  <D.25663>:
  if (value != 0B) goto <D.25665>; else goto <D.25666>;
  <D.25665>:
  <D.25666>:
  D.25667 = remset.wbarrier_set_arrayref;
  D.25667 (arr, slot_ptr, value);
}


mono_gc_wbarrier_arrayref_copy (void * dest_ptr, void * src_ptr, int count)
{
  int D.25671;
  long unsigned int D.25673;
  long unsigned int D.25674;
  void (*<T2dea>) (void *, void *, int) D.25675;

  D.25671 = sgen_ptr_in_nursery (dest_ptr);
  if (D.25671 != 0) goto <D.25669>; else goto <D.25672>;
  <D.25672>:
  if (count <= 0) goto <D.25669>; else goto <D.25670>;
  <D.25669>:
  D.25673 = (long unsigned int) count;
  D.25674 = D.25673 * 8;
  mono_gc_memmove_aligned (dest_ptr, src_ptr, D.25674);
  return;
  <D.25670>:
  D.25675 = remset.wbarrier_arrayref_copy;
  D.25675 (dest_ptr, src_ptr, count);
}


find_object_for_ptr (char * ptr)
{
  struct GCMemSection * nursery_section.348;
  char * D.25678;
  char * D.25681;
  char * found_obj.349;
  char * D.25687;
  void (*<T2d80>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.25690;

  nursery_section.348 = nursery_section;
  D.25678 = nursery_section.348->data;
  if (D.25678 <= ptr) goto <D.25679>; else goto <D.25680>;
  <D.25679>:
  nursery_section.348 = nursery_section;
  D.25681 = nursery_section.348->end_data;
  if (D.25681 > ptr) goto <D.25682>; else goto <D.25683>;
  <D.25682>:
  found_obj = 0B;
  nursery_section.348 = nursery_section;
  D.25678 = nursery_section.348->data;
  nursery_section.348 = nursery_section;
  D.25681 = nursery_section.348->end_data;
  sgen_scan_area_with_callback (D.25678, D.25681, find_object_for_ptr_callback, ptr, 1);
  found_obj.349 = found_obj;
  if (found_obj.349 != 0B) goto <D.25685>; else goto <D.25686>;
  <D.25685>:
  D.25687 = found_obj;
  return D.25687;
  <D.25686>:
  <D.25683>:
  <D.25680>:
  found_obj = 0B;
  sgen_los_iterate_objects (find_object_for_ptr_callback, ptr);
  found_obj.349 = found_obj;
  if (found_obj.349 != 0B) goto <D.25688>; else goto <D.25689>;
  <D.25688>:
  D.25687 = found_obj;
  return D.25687;
  <D.25689>:
  found_obj = 0B;
  D.25690 = major_collector.iterate_objects;
  D.25690 (1, 1, find_object_for_ptr_callback, ptr);
  D.25687 = found_obj;
  return D.25687;
}


find_object_for_ptr_callback (char * obj, size_t size, void * user_data)
{
  char * D.25694;
  char * found_obj.350;
  _Bool D.25698;
  long int D.25699;
  long int D.25700;
  char * ptr;

  ptr = user_data;
  if (ptr >= obj) goto <D.25692>; else goto <D.25693>;
  <D.25692>:
  D.25694 = obj + size;
  if (D.25694 > ptr) goto <D.25695>; else goto <D.25696>;
  <D.25695>:
  found_obj.350 = found_obj;
  D.25698 = found_obj.350 != 0B;
  D.25699 = (long int) D.25698;
  D.25700 = __builtin_expect (D.25699, 0);
  if (D.25700 != 0) goto <D.25701>; else goto <D.25702>;
  <D.25701>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4335, "!found_obj");
  <D.25702>:
  found_obj = obj;
  <D.25696>:
  <D.25693>:
}


mono_gc_wbarrier_generic_nostore (void * ptr)
{
  int D.25707;
  int D.25709;
  struct FILE * gc_debug_file.351;
  int D.25713;
  int concurrent_collection_in_progress.352;
  void (*<T124a>) (void *) D.25723;
  void * obj;

  obj = MEM[(void * *)ptr];
  if (obj != 0B) goto <D.25703>; else goto <D.25704>;
  <D.25703>:
  <D.25704>:
  D.25707 = sgen_ptr_in_nursery (ptr);
  if (D.25707 != 0) goto <D.25705>; else goto <D.25708>;
  <D.25708>:
  D.25709 = ptr_on_stack (ptr);
  if (D.25709 != 0) goto <D.25705>; else goto <D.25706>;
  <D.25705>:
  if (0 != 0) goto <D.25710>; else goto <D.25711>;
  <D.25710>:
  gc_debug_file.351 = gc_debug_file;
  fprintf (gc_debug_file.351, "Skipping remset at %p\n", ptr);
  gc_debug_file.351 = gc_debug_file;
  fflush (gc_debug_file.351);
  <D.25711>:
  return;
  <D.25706>:
  D.25713 = sgen_ptr_in_nursery (obj);
  if (D.25713 == 0) goto <D.25714>; else goto <D.25715>;
  <D.25714>:
  concurrent_collection_in_progress.352 = concurrent_collection_in_progress;
  if (concurrent_collection_in_progress.352 == 0) goto <D.25717>; else goto <D.25718>;
  <D.25717>:
  if (0 != 0) goto <D.25719>; else goto <D.25720>;
  <D.25719>:
  gc_debug_file.351 = gc_debug_file;
  fprintf (gc_debug_file.351, "Skipping remset at %p\n", ptr);
  gc_debug_file.351 = gc_debug_file;
  fflush (gc_debug_file.351);
  <D.25720>:
  return;
  <D.25718>:
  <D.25715>:
  if (0 != 0) goto <D.25721>; else goto <D.25722>;
  <D.25721>:
  gc_debug_file.351 = gc_debug_file;
  fprintf (gc_debug_file.351, "Adding remset at %p\n", ptr);
  gc_debug_file.351 = gc_debug_file;
  fflush (gc_debug_file.351);
  <D.25722>:
  D.25723 = remset.wbarrier_generic_nostore;
  D.25723 (ptr);
}


ptr_on_stack (void * ptr)
{
  void * stack_start.353;
  void * D.25728;
  gboolean D.25731;
  void * stack_start;
  struct SgenThreadInfo * info;

  try
    {
      stack_start = &stack_start;
      info = mono_thread_info_current ();
      stack_start.353 = stack_start;
      if (ptr >= stack_start.353) goto <D.25726>; else goto <D.25727>;
      <D.25726>:
      D.25728 = info->stack_end;
      if (D.25728 > ptr) goto <D.25729>; else goto <D.25730>;
      <D.25729>:
      D.25731 = 1;
      return D.25731;
      <D.25730>:
      <D.25727>:
      D.25731 = 0;
      return D.25731;
    }
  finally
    {
      stack_start = {CLOBBER};
    }
}


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

  if (0 != 0) goto <D.25734>; else goto <D.25735>;
  <D.25734>:
  gc_debug_file.354 = gc_debug_file;
  if (value != 0B) goto <D.25738>; else goto <D.25739>;
  <D.25738>:
  iftmp.355 = safe_name (value);
  goto <D.25740>;
  <D.25739>:
  iftmp.355 = "null";
  <D.25740>:
  fprintf (gc_debug_file.354, "Wbarrier store at %p to %p (%s)\n", ptr, value, iftmp.355);
  gc_debug_file.354 = gc_debug_file;
  fflush (gc_debug_file.354);
  <D.25735>:
  MEM[(void * *)ptr] = value;
  D.25741 = sgen_ptr_in_nursery (value);
  if (D.25741 != 0) goto <D.25742>; else goto <D.25743>;
  <D.25742>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.25743>:
  sgen_dummy_use (value);
}


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


mono_gc_wbarrier_generic_store_atomic (void * ptr, struct MonoObject * value)
{
  struct FILE * gc_debug_file.356;
  const char * iftmp.357;
  int D.25751;

  if (0 != 0) goto <D.25744>; else goto <D.25745>;
  <D.25744>:
  gc_debug_file.356 = gc_debug_file;
  if (value != 0B) goto <D.25748>; else goto <D.25749>;
  <D.25748>:
  iftmp.357 = safe_name (value);
  goto <D.25750>;
  <D.25749>:
  iftmp.357 = "null";
  <D.25750>:
  fprintf (gc_debug_file.356, "Wbarrier atomic store at %p to %p (%s)\n", ptr, value, iftmp.357);
  gc_debug_file.356 = gc_debug_file;
  fflush (gc_debug_file.356);
  <D.25745>:
  InterlockedWritePointer (ptr, value);
  D.25751 = sgen_ptr_in_nursery (value);
  if (D.25751 != 0) goto <D.25752>; else goto <D.25753>;
  <D.25752>:
  mono_gc_wbarrier_generic_nostore (ptr);
  <D.25753>:
  sgen_dummy_use (value);
}


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


InterlockedExchangePointer (void * volatile * val, void * new_val)
{
  long unsigned int old_val.358;
  long unsigned int new_val.359;
  long unsigned int D.25756;
  void * D.25757;
  void * D.25758;
  void * old_val;

  <D.12734>:
  old_val = *val;
  old_val.358 = (long unsigned int) old_val;
  new_val.359 = (long unsigned int) new_val;
  D.25756 = __sync_val_compare_and_swap_8 (val, old_val.358, new_val.359);
  D.25757 = (void *) D.25756;
  if (D.25757 != old_val) goto <D.12734>; else goto <D.12735>;
  <D.12735>:
  D.25758 = old_val;
  return D.25758;
}


mono_gc_wbarrier_value_copy_bitmap (void * _dest, void * _src, int size, unsigned int bitmap)
{
  unsigned int D.25760;
  long unsigned int D.25763;
  struct MonoObject * D.25764;
  mword * dest;
  mword * src;

  dest = _dest;
  src = _src;
  goto <D.21906>;
  <D.21905>:
  D.25760 = bitmap & 1;
  if (D.25760 != 0) goto <D.25761>; else goto <D.25762>;
  <D.25761>:
  D.25763 = *src;
  D.25764 = (struct MonoObject *) D.25763;
  mono_gc_wbarrier_generic_store (dest, D.25764);
  goto <D.25765>;
  <D.25762>:
  D.25763 = *src;
  *dest = D.25763;
  <D.25765>:
  src = src + 8;
  dest = dest + 8;
  size = size + -8;
  bitmap = bitmap >> 1;
  <D.21906>:
  if (size != 0) goto <D.21905>; else goto <D.21907>;
  <D.21907>:
}


mono_gc_wbarrier_value_copy (void * dest, void * src, int count, struct MonoClass * klass)
{
  long unsigned int D.25766;
  long unsigned int D.25767;
  _Bool D.25768;
  long int D.25769;
  long int D.25770;
  struct FILE * gc_debug_file.360;
  void * D.25776;
  const char * D.25777;
  int D.25780;
  int D.25782;
  long unsigned int D.25784;
  int D.25785;
  int D.25786;
  long unsigned int D.25787;
  void (*<T2dee>) (void *, void *, int, struct MonoClass *) D.25788;

  D.25766 = BIT_FIELD_REF <*klass, 64, 256>;
  D.25767 = D.25766 & 8;
  D.25768 = D.25767 == 0;
  D.25769 = (long int) D.25768;
  D.25770 = __builtin_expect (D.25769, 0);
  if (D.25770 != 0) goto <D.25771>; else goto <D.25772>;
  <D.25771>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4480, "klass->valuetype");
  <D.25772>:
  if (0 != 0) goto <D.25773>; else goto <D.25774>;
  <D.25773>:
  gc_debug_file.360 = gc_debug_file;
  D.25776 = klass->gc_descr;
  D.25777 = klass->name;
  fprintf (gc_debug_file.360, "Adding value remset at %p, count %d, descr %p for class %s (%p)\n", dest, count, D.25776, D.25777, klass);
  gc_debug_file.360 = gc_debug_file;
  fflush (gc_debug_file.360);
  <D.25774>:
  D.25780 = sgen_ptr_in_nursery (dest);
  if (D.25780 != 0) goto <D.25778>; else goto <D.25781>;
  <D.25781>:
  D.25782 = ptr_on_stack (dest);
  if (D.25782 != 0) goto <D.25778>; else goto <D.25783>;
  <D.25783>:
  D.25776 = klass->gc_descr;
  D.25784 = (long unsigned int) D.25776;
  D.25785 = sgen_gc_descr_has_references (D.25784);
  if (D.25785 == 0) goto <D.25778>; else goto <D.25779>;
  <D.25778>:
  {
    size_t element_size;
    size_t size;

    D.25786 = mono_class_value_size (klass, 0B);
    element_size = (size_t) D.25786;
    D.25787 = (long unsigned int) count;
    size = D.25787 * element_size;
    mono_gc_memmove_atomic (dest, src, size);
    return;
  }
  <D.25779>:
  D.25788 = remset.wbarrier_value_copy;
  D.25788 (dest, src, count, klass);
}


mono_gc_wbarrier_object_copy (struct MonoObject * obj, struct MonoObject * src)
{
  int D.25792;
  int D.25794;
  struct MonoVTable * D.25795;
  struct MonoClass * D.25796;
  void * D.25797;
  const void * D.25798;
  long unsigned int D.25799;
  long unsigned int D.25800;
  void (*<T2df2>) (struct MonoObject *, struct MonoObject *) D.25801;
  int size;

  D.25792 = sgen_ptr_in_nursery (obj);
  if (D.25792 != 0) goto <D.25790>; else goto <D.25793>;
  <D.25793>:
  D.25794 = ptr_on_stack (obj);
  if (D.25794 != 0) goto <D.25790>; else goto <D.25791>;
  <D.25790>:
  D.25795 = obj->vtable;
  D.25796 = D.25795->klass;
  size = D.25796->instance_size;
  D.25797 = obj + 16;
  D.25798 = src + 16;
  D.25799 = (long unsigned int) size;
  D.25800 = D.25799 + 18446744073709551600;
  mono_gc_memmove_aligned (D.25797, D.25798, D.25800);
  return;
  <D.25791>:
  D.25801 = remset.wbarrier_object_copy;
  D.25801 (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.361;
  char * D.25804;
  char * D.25805;
  void (*<T2d80>) (gboolean, gboolean, void (*IterateObjectCallbackFunc) (char *, size_t, void *), void *) D.25806;
  int D.25807;
  struct HeapWalkInfo hwi;

  try
    {
      hwi.flags = flags;
      hwi.callback = callback;
      hwi.data = data;
      sgen_clear_nursery_fragments ();
      nursery_section.361 = nursery_section;
      D.25804 = nursery_section.361->data;
      nursery_section.361 = nursery_section;
      D.25805 = nursery_section.361->end_data;
      sgen_scan_area_with_callback (D.25804, D.25805, walk_references, &hwi, 0);
      D.25806 = major_collector.iterate_objects;
      D.25806 (1, 1, walk_references, &hwi);
      sgen_los_iterate_objects (walk_references, &hwi);
      D.25807 = 0;
      return D.25807;
    }
  finally
    {
      hwi = {CLOBBER};
    }
}


walk_references (char * start, size_t size, void * data)
{
  int D.25812;
  int D.25814;
  int (*<T2fed>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.25815;
  struct MonoVTable * D.25816;
  struct MonoClass * D.25817;
  size_t iftmp.362;
  long unsigned int D.25822;
  struct MonoObject *[128] * D.25823;
  uintptr_t[128] * D.25824;
  void * D.25825;
  struct HeapWalkInfo * hwi;

  hwi = data;
  hwi->called = 0;
  hwi->count = 0;
  collect_references (hwi, start, size);
  D.25812 = hwi->count;
  if (D.25812 != 0) goto <D.25810>; else goto <D.25813>;
  <D.25813>:
  D.25814 = hwi->called;
  if (D.25814 == 0) goto <D.25810>; else goto <D.25811>;
  <D.25810>:
  D.25815 = hwi->callback;
  D.25816 = MEM[(struct MonoObject *)start].vtable;
  D.25817 = D.25816->klass;
  D.25814 = hwi->called;
  if (D.25814 == 0) goto <D.25819>; else goto <D.25820>;
  <D.25819>:
  iftmp.362 = size;
  goto <D.25821>;
  <D.25820>:
  iftmp.362 = 0;
  <D.25821>:
  D.25812 = hwi->count;
  D.25822 = (long unsigned int) D.25812;
  D.25823 = &hwi->refs;
  D.25824 = &hwi->offsets;
  D.25825 = hwi->data;
  D.25815 (start, D.25817, iftmp.362, D.25822, D.25823, D.25824, D.25825);
  <D.25811>:
}


collect_references (struct HeapWalkInfo * hwi, char * start, size_t size)
{
  long unsigned int D.25826;
  long unsigned int D.25827;
  long unsigned int D.25828;
  long unsigned int D.25829;
  long unsigned int D.25832;
  long unsigned int D.25833;
  long unsigned int D.25834;
  long unsigned int D.25835;
  long unsigned int D.25836;
  long unsigned int D.25837;
  void * D.25838;
  int D.25841;
  int (*<T2fed>) (struct MonoObject *, struct MonoClass *, uintptr_t, uintptr_t, struct MonoObject * *, uintptr_t *, void *) D.25844;
  struct MonoVTable * D.25845;
  struct MonoClass * D.25846;
  size_t iftmp.363;
  int D.25848;
  long unsigned int D.25852;
  struct MonoObject *[128] * D.25853;
  uintptr_t[128] * D.25854;
  void * D.25855;
  long int _objptr.364;
  long int start.365;
  long int D.25858;
  long unsigned int D.25859;
  int D.25860;
  int D.25861;
  size_t iftmp.366;
  int D.25870;
  int D.25871;
  long unsigned int D.25872;
  long unsigned int D.25873;
  int D.25874;
  void * D.25875;
  size_t iftmp.367;
  long int _objptr.368;
  long int D.25885;
  long unsigned int D.25886;
  int D.25887;
  int D.25888;
  long unsigned int D.25889;
  long unsigned int D.25890;
  int D.25891;
  size_t iftmp.369;
  int D.25900;
  int D.25901;
  long unsigned int D.25902;
  long unsigned int D.25905;
  int D.25906;
  int D.25907;
  unsigned int D.25910;
  unsigned int el_size.370;
  unsigned int D.25912;
  sizetype D.25913;
  void * D.25914;
  size_t iftmp.371;
  long int p.372;
  long int D.25924;
  long unsigned int D.25925;
  int D.25926;
  int D.25927;
  int D.25931;
  int D.25932;
  long unsigned int D.25933;
  long unsigned int D.25934;
  long unsigned int D.25935;
  long unsigned int D.25936;
  void * * D.25937;
  void * D.25938;
  size_t iftmp.373;
  char * D.25947;
  long int D.25948;
  long int D.25949;
  long unsigned int D.25950;
  int D.25951;
  int D.25952;
  sizetype D.25953;
  long unsigned int D.25957;
  void * D.25960;
  size_t iftmp.374;
  long int p.375;
  long int D.25970;
  long unsigned int D.25971;
  int D.25972;
  int D.25973;
  long unsigned int D.25974;
  void * D.25977;
  size_t iftmp.376;
  long int _objptr.377;
  long int D.25987;
  long unsigned int D.25988;
  int D.25989;
  int D.25990;
  long unsigned int D.25991;
  unsigned int D.25992;
  unsigned int D.25993;
  struct MonoVTable * D.25996;
  struct MonoClass * D.25997;
  const char * D.25998;
  const char * D.25999;
  gsize * bitmap_data.378;
  long unsigned int D.26001;
  void * D.26004;
  size_t iftmp.379;
  long int _objptr.380;
  long int D.26014;
  long unsigned int D.26015;
  int D.26016;
  int D.26017;
  int bwords.381;
  long unsigned int D.26019;
  gsize * mbitmap_data.382;
  long unsigned int D.26021;
  unsigned int D.26022;
  unsigned int D.26023;
  struct MonoClass * D.26024;
  unsigned int el_size.383;
  unsigned int D.26026;
  sizetype D.26027;
  const char * D.26030;
  const char * D.26031;
  gsize * bitmap_data.384;
  long unsigned int D.26033;
  void * D.26036;
  size_t iftmp.385;
  long int _objptr.386;
  long int D.26046;
  long unsigned int D.26047;
  int D.26048;
  int D.26049;
  unsigned int bwords.387;
  sizetype D.26051;

  {
    struct GCVTable * vt;
    mword desc;

    D.25826 = MEM[(mword *)start];
    D.25827 = D.25826 & 18446744073709551612;
    vt = (struct GCVTable *) D.25827;
    desc = vt->desc;
    D.25828 = desc & 7;
    switch (D.25828) <default: <D.22022>, case 1: <D.21937>, case 2: <D.21944>, case 3: <D.21988>, case 4: <D.21952>, case 5: <D.21982>, case 6: <D.22001>, case 7: <D.22021>>
    <D.21937>:
    D.25829 = desc & 4294901760;
    if (D.25829 != 0) goto <D.25830>; else goto <D.25831>;
    <D.25830>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.25832 = desc >> 16;
      D.25833 = D.25832 & 255;
      D.25834 = D.25833 * 8;
      _objptr = _objptr + D.25834;
      D.25835 = desc >> 24;
      D.25836 = D.25835 & 255;
      D.25837 = D.25836 * 8;
      _objptr_end = _objptr + D.25837;
      D.25838 = *_objptr;
      if (D.25838 != 0B) goto <D.25839>; else goto <D.25840>;
      <D.25839>:
      D.25841 = hwi->count;
      if (D.25841 == 128) goto <D.25842>; else goto <D.25843>;
      <D.25842>:
      D.25844 = hwi->callback;
      D.25845 = MEM[(struct MonoObject *)start].vtable;
      D.25846 = D.25845->klass;
      D.25848 = hwi->called;
      if (D.25848 == 0) goto <D.25849>; else goto <D.25850>;
      <D.25849>:
      iftmp.363 = size;
      goto <D.25851>;
      <D.25850>:
      iftmp.363 = 0;
      <D.25851>:
      D.25841 = hwi->count;
      D.25852 = (long unsigned int) D.25841;
      D.25853 = &hwi->refs;
      D.25854 = &hwi->offsets;
      D.25855 = hwi->data;
      D.25844 (start, D.25846, iftmp.363, D.25852, D.25853, D.25854, D.25855);
      hwi->count = 0;
      hwi->called = 1;
      <D.25843>:
      D.25841 = hwi->count;
      _objptr.364 = (long int) _objptr;
      start.365 = (long int) start;
      D.25858 = _objptr.364 - start.365;
      D.25859 = (long unsigned int) D.25858;
      hwi->offsets[D.25841] = D.25859;
      D.25841 = hwi->count;
      D.25860 = D.25841;
      D.25861 = D.25860 + 1;
      hwi->count = D.25861;
      D.25838 = *_objptr;
      hwi->refs[D.25860] = D.25838;
      <D.25840>:
      _objptr = _objptr + 8;
      goto <D.21941>;
      <D.21940>:
      D.25838 = *_objptr;
      if (D.25838 != 0B) goto <D.25862>; else goto <D.25863>;
      <D.25862>:
      D.25841 = hwi->count;
      if (D.25841 == 128) goto <D.25864>; else goto <D.25865>;
      <D.25864>:
      D.25844 = hwi->callback;
      D.25845 = MEM[(struct MonoObject *)start].vtable;
      D.25846 = D.25845->klass;
      D.25848 = hwi->called;
      if (D.25848 == 0) goto <D.25867>; else goto <D.25868>;
      <D.25867>:
      iftmp.366 = size;
      goto <D.25869>;
      <D.25868>:
      iftmp.366 = 0;
      <D.25869>:
      D.25841 = hwi->count;
      D.25852 = (long unsigned int) D.25841;
      D.25853 = &hwi->refs;
      D.25854 = &hwi->offsets;
      D.25855 = hwi->data;
      D.25844 (start, D.25846, iftmp.366, D.25852, D.25853, D.25854, D.25855);
      hwi->count = 0;
      hwi->called = 1;
      <D.25865>:
      D.25841 = hwi->count;
      _objptr.364 = (long int) _objptr;
      start.365 = (long int) start;
      D.25858 = _objptr.364 - start.365;
      D.25859 = (long unsigned int) D.25858;
      hwi->offsets[D.25841] = D.25859;
      D.25841 = hwi->count;
      D.25870 = D.25841;
      D.25871 = D.25870 + 1;
      hwi->count = D.25871;
      D.25838 = *_objptr;
      hwi->refs[D.25870] = D.25838;
      <D.25863>:
      _objptr = _objptr + 8;
      <D.21941>:
      if (_objptr < _objptr_end) goto <D.21940>; else goto <D.21942>;
      <D.21942>:
    }
    <D.25831>:
    goto <D.21943>;
    <D.21944>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.25872 = (long unsigned int) _index;
        D.25873 = D.25872 * 8;
        _objptr = _objptr + D.25873;
        D.25874 = _index + 1;
        _bmap = _bmap >> D.25874;
        D.25875 = *_objptr;
        if (D.25875 != 0B) goto <D.25876>; else goto <D.25877>;
        <D.25876>:
        D.25841 = hwi->count;
        if (D.25841 == 128) goto <D.25878>; else goto <D.25879>;
        <D.25878>:
        D.25844 = hwi->callback;
        D.25845 = MEM[(struct MonoObject *)start].vtable;
        D.25846 = D.25845->klass;
        D.25848 = hwi->called;
        if (D.25848 == 0) goto <D.25881>; else goto <D.25882>;
        <D.25881>:
        iftmp.367 = size;
        goto <D.25883>;
        <D.25882>:
        iftmp.367 = 0;
        <D.25883>:
        D.25841 = hwi->count;
        D.25852 = (long unsigned int) D.25841;
        D.25853 = &hwi->refs;
        D.25854 = &hwi->offsets;
        D.25855 = hwi->data;
        D.25844 (start, D.25846, iftmp.367, D.25852, D.25853, D.25854, D.25855);
        hwi->count = 0;
        hwi->called = 1;
        <D.25879>:
        D.25841 = hwi->count;
        _objptr.368 = (long int) _objptr;
        start.365 = (long int) start;
        D.25885 = _objptr.368 - start.365;
        D.25886 = (long unsigned int) D.25885;
        hwi->offsets[D.25841] = D.25886;
        D.25841 = hwi->count;
        D.25887 = D.25841;
        D.25888 = D.25887 + 1;
        hwi->count = D.25888;
        D.25875 = *_objptr;
        hwi->refs[D.25887] = D.25875;
        <D.25877>:
        _objptr = _objptr + 8;
      }
      goto <D.21950>;
      <D.21949>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.25889 = (long unsigned int) _index;
        D.25890 = D.25889 * 8;
        _objptr = _objptr + D.25890;
        D.25891 = _index + 1;
        _bmap = _bmap >> D.25891;
        D.25875 = *_objptr;
        if (D.25875 != 0B) goto <D.25892>; else goto <D.25893>;
        <D.25892>:
        D.25841 = hwi->count;
        if (D.25841 == 128) goto <D.25894>; else goto <D.25895>;
        <D.25894>:
        D.25844 = hwi->callback;
        D.25845 = MEM[(struct MonoObject *)start].vtable;
        D.25846 = D.25845->klass;
        D.25848 = hwi->called;
        if (D.25848 == 0) goto <D.25897>; else goto <D.25898>;
        <D.25897>:
        iftmp.369 = size;
        goto <D.25899>;
        <D.25898>:
        iftmp.369 = 0;
        <D.25899>:
        D.25841 = hwi->count;
        D.25852 = (long unsigned int) D.25841;
        D.25853 = &hwi->refs;
        D.25854 = &hwi->offsets;
        D.25855 = hwi->data;
        D.25844 (start, D.25846, iftmp.369, D.25852, D.25853, D.25854, D.25855);
        hwi->count = 0;
        hwi->called = 1;
        <D.25895>:
        D.25841 = hwi->count;
        _objptr.368 = (long int) _objptr;
        start.365 = (long int) start;
        D.25885 = _objptr.368 - start.365;
        D.25886 = (long unsigned int) D.25885;
        hwi->offsets[D.25841] = D.25886;
        D.25841 = hwi->count;
        D.25900 = D.25841;
        D.25901 = D.25900 + 1;
        hwi->count = D.25901;
        D.25875 = *_objptr;
        hwi->refs[D.25900] = D.25875;
        <D.25893>:
        _objptr = _objptr + 8;
      }
      <D.21950>:
      if (_bmap != 0) goto <D.21949>; else goto <D.21951>;
      <D.21951>:
    }
    goto <D.21943>;
    <D.21952>:
    D.25902 = desc & 4294950912;
    if (D.25902 != 0) goto <D.25903>; else goto <D.25904>;
    <D.25903>:
    {
      int el_size;
      int etype;

      D.25905 = desc >> 3;
      D.25906 = (int) D.25905;
      el_size = D.25906 & 1023;
      D.25907 = (int) desc;
      etype = D.25907 & 49152;
      if (etype == 16384) goto <D.25908>; else goto <D.25909>;
      <D.25908>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.25910 = MEM[(struct MonoArray *)start].max_length;
        el_size.370 = (unsigned int) el_size;
        D.25912 = D.25910 * el_size.370;
        D.25913 = (sizetype) D.25912;
        end_refs = p + D.25913;
        goto <D.21958>;
        <D.21957>:
        D.25914 = *p;
        if (D.25914 != 0B) goto <D.25915>; else goto <D.25916>;
        <D.25915>:
        D.25841 = hwi->count;
        if (D.25841 == 128) goto <D.25917>; else goto <D.25918>;
        <D.25917>:
        D.25844 = hwi->callback;
        D.25845 = MEM[(struct MonoObject *)start].vtable;
        D.25846 = D.25845->klass;
        D.25848 = hwi->called;
        if (D.25848 == 0) goto <D.25920>; else goto <D.25921>;
        <D.25920>:
        iftmp.371 = size;
        goto <D.25922>;
        <D.25921>:
        iftmp.371 = 0;
        <D.25922>:
        D.25841 = hwi->count;
        D.25852 = (long unsigned int) D.25841;
        D.25853 = &hwi->refs;
        D.25854 = &hwi->offsets;
        D.25855 = hwi->data;
        D.25844 (start, D.25846, iftmp.371, D.25852, D.25853, D.25854, D.25855);
        hwi->count = 0;
        hwi->called = 1;
        <D.25918>:
        D.25841 = hwi->count;
        p.372 = (long int) p;
        start.365 = (long int) start;
        D.25924 = p.372 - start.365;
        D.25925 = (long unsigned int) D.25924;
        hwi->offsets[D.25841] = D.25925;
        D.25841 = hwi->count;
        D.25926 = D.25841;
        D.25927 = D.25926 + 1;
        hwi->count = D.25927;
        D.25914 = *p;
        hwi->refs[D.25926] = D.25914;
        <D.25916>:
        p = p + 8;
        <D.21958>:
        if (p < end_refs) goto <D.21957>; else goto <D.21959>;
        <D.21959>:
      }
      goto <D.25928>;
      <D.25909>:
      if (etype == 32768) goto <D.25929>; else goto <D.25930>;
      <D.25929>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.25832 = desc >> 16;
        D.25931 = (int) D.25832;
        offset = D.25931 & 255;
        D.25835 = desc >> 24;
        D.25932 = (int) D.25835;
        num_refs = D.25932 & 255;
        e_start = start + 32;
        D.25910 = MEM[(struct MonoArray *)start].max_length;
        el_size.370 = (unsigned int) el_size;
        D.25912 = D.25910 * el_size.370;
        D.25913 = (sizetype) D.25912;
        e_end = e_start + D.25913;
        goto <D.21970>;
        <D.21969>:
        {
          void * * p;
          int i;

          p = e_start;
          D.25933 = (long unsigned int) offset;
          D.25934 = D.25933 * 8;
          p = p + D.25934;
          i = 0;
          goto <D.21967>;
          <D.21966>:
          D.25935 = (long unsigned int) i;
          D.25936 = D.25935 * 8;
          D.25937 = p + D.25936;
          D.25938 = *D.25937;
          if (D.25938 != 0B) goto <D.25939>; else goto <D.25940>;
          <D.25939>:
          D.25841 = hwi->count;
          if (D.25841 == 128) goto <D.25941>; else goto <D.25942>;
          <D.25941>:
          D.25844 = hwi->callback;
          D.25845 = MEM[(struct MonoObject *)start].vtable;
          D.25846 = D.25845->klass;
          D.25848 = hwi->called;
          if (D.25848 == 0) goto <D.25944>; else goto <D.25945>;
          <D.25944>:
          iftmp.373 = size;
          goto <D.25946>;
          <D.25945>:
          iftmp.373 = 0;
          <D.25946>:
          D.25841 = hwi->count;
          D.25852 = (long unsigned int) D.25841;
          D.25853 = &hwi->refs;
          D.25854 = &hwi->offsets;
          D.25855 = hwi->data;
          D.25844 (start, D.25846, iftmp.373, D.25852, D.25853, D.25854, D.25855);
          hwi->count = 0;
          hwi->called = 1;
          <D.25942>:
          D.25841 = hwi->count;
          D.25935 = (long unsigned int) i;
          D.25936 = D.25935 * 8;
          D.25947 = p + D.25936;
          D.25948 = (long int) D.25947;
          start.365 = (long int) start;
          D.25949 = D.25948 - start.365;
          D.25950 = (long unsigned int) D.25949;
          hwi->offsets[D.25841] = D.25950;
          D.25841 = hwi->count;
          D.25951 = D.25841;
          D.25952 = D.25951 + 1;
          hwi->count = D.25952;
          D.25935 = (long unsigned int) i;
          D.25936 = D.25935 * 8;
          D.25937 = p + D.25936;
          D.25938 = *D.25937;
          hwi->refs[D.25951] = D.25938;
          <D.25940>:
          i = i + 1;
          <D.21967>:
          if (i < num_refs) goto <D.21966>; else goto <D.21968>;
          <D.21968>:
          D.25953 = (sizetype) el_size;
          e_start = e_start + D.25953;
        }
        <D.21970>:
        if (e_start < e_end) goto <D.21969>; else goto <D.21971>;
        <D.21971>:
      }
      goto <D.25954>;
      <D.25930>:
      if (etype == 49152) goto <D.25955>; else goto <D.25956>;
      <D.25955>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.25910 = MEM[(struct MonoArray *)start].max_length;
        el_size.370 = (unsigned int) el_size;
        D.25912 = D.25910 * el_size.370;
        D.25913 = (sizetype) D.25912;
        e_end = e_start + D.25913;
        goto <D.21980>;
        <D.21979>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.21977>;
          <D.21976>:
          D.25957 = _bmap & 1;
          if (D.25957 != 0) goto <D.25958>; else goto <D.25959>;
          <D.25958>:
          D.25960 = *p;
          if (D.25960 != 0B) goto <D.25961>; else goto <D.25962>;
          <D.25961>:
          D.25841 = hwi->count;
          if (D.25841 == 128) goto <D.25963>; else goto <D.25964>;
          <D.25963>:
          D.25844 = hwi->callback;
          D.25845 = MEM[(struct MonoObject *)start].vtable;
          D.25846 = D.25845->klass;
          D.25848 = hwi->called;
          if (D.25848 == 0) goto <D.25966>; else goto <D.25967>;
          <D.25966>:
          iftmp.374 = size;
          goto <D.25968>;
          <D.25967>:
          iftmp.374 = 0;
          <D.25968>:
          D.25841 = hwi->count;
          D.25852 = (long unsigned int) D.25841;
          D.25853 = &hwi->refs;
          D.25854 = &hwi->offsets;
          D.25855 = hwi->data;
          D.25844 (start, D.25846, iftmp.374, D.25852, D.25853, D.25854, D.25855);
          hwi->count = 0;
          hwi->called = 1;
          <D.25964>:
          D.25841 = hwi->count;
          p.375 = (long int) p;
          start.365 = (long int) start;
          D.25970 = p.375 - start.365;
          D.25971 = (long unsigned int) D.25970;
          hwi->offsets[D.25841] = D.25971;
          D.25841 = hwi->count;
          D.25972 = D.25841;
          D.25973 = D.25972 + 1;
          hwi->count = D.25973;
          D.25960 = *p;
          hwi->refs[D.25972] = D.25960;
          <D.25962>:
          <D.25959>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.21977>:
          if (_bmap != 0) goto <D.21976>; else goto <D.21978>;
          <D.21978>:
          D.25953 = (sizetype) el_size;
          e_start = e_start + D.25953;
        }
        <D.21980>:
        if (e_start < e_end) goto <D.21979>; else goto <D.21981>;
        <D.21981>:
      }
      <D.25956>:
      <D.25954>:
      <D.25928>:
    }
    <D.25904>:
    goto <D.21943>;
    <D.21982>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.21986>;
      <D.21985>:
      D.25974 = _bmap & 1;
      if (D.25974 != 0) goto <D.25975>; else goto <D.25976>;
      <D.25975>:
      D.25977 = *_objptr;
      if (D.25977 != 0B) goto <D.25978>; else goto <D.25979>;
      <D.25978>:
      D.25841 = hwi->count;
      if (D.25841 == 128) goto <D.25980>; else goto <D.25981>;
      <D.25980>:
      D.25844 = hwi->callback;
      D.25845 = MEM[(struct MonoObject *)start].vtable;
      D.25846 = D.25845->klass;
      D.25848 = hwi->called;
      if (D.25848 == 0) goto <D.25983>; else goto <D.25984>;
      <D.25983>:
      iftmp.376 = size;
      goto <D.25985>;
      <D.25984>:
      iftmp.376 = 0;
      <D.25985>:
      D.25841 = hwi->count;
      D.25852 = (long unsigned int) D.25841;
      D.25853 = &hwi->refs;
      D.25854 = &hwi->offsets;
      D.25855 = hwi->data;
      D.25844 (start, D.25846, iftmp.376, D.25852, D.25853, D.25854, D.25855);
      hwi->count = 0;
      hwi->called = 1;
      <D.25981>:
      D.25841 = hwi->count;
      _objptr.377 = (long int) _objptr;
      start.365 = (long int) start;
      D.25987 = _objptr.377 - start.365;
      D.25988 = (long unsigned int) D.25987;
      hwi->offsets[D.25841] = D.25988;
      D.25841 = hwi->count;
      D.25989 = D.25841;
      D.25990 = D.25989 + 1;
      hwi->count = D.25990;
      D.25977 = *_objptr;
      hwi->refs[D.25989] = D.25977;
      <D.25979>:
      <D.25976>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.21986>:
      if (_bmap != 0) goto <D.21985>; else goto <D.21987>;
      <D.21987>:
    }
    goto <D.21943>;
    <D.21988>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.25991 = *bitmap_data;
      D.25992 = (unsigned int) D.25991;
      D.25993 = D.25992 + 4294967295;
      bwords = (int) D.25993;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.25994>; else goto <D.25995>;
      <D.25994>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.25996 = myobj->vtable;
        D.25997 = D.25996->klass;
        D.25998 = D.25997->name_space;
        D.25996 = myobj->vtable;
        D.25997 = D.25996->klass;
        D.25999 = D.25997->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.25998, D.25999);
      }
      <D.25995>:
      goto <D.21999>;
      <D.21998>:
      {
        gsize _bmap;

        bitmap_data.378 = bitmap_data;
        bitmap_data = bitmap_data.378 + 8;
        _bmap = *bitmap_data.378;
        _objptr = start_run;
        goto <D.21996>;
        <D.21995>:
        D.26001 = _bmap & 1;
        if (D.26001 != 0) goto <D.26002>; else goto <D.26003>;
        <D.26002>:
        D.26004 = *_objptr;
        if (D.26004 != 0B) goto <D.26005>; else goto <D.26006>;
        <D.26005>:
        D.25841 = hwi->count;
        if (D.25841 == 128) goto <D.26007>; else goto <D.26008>;
        <D.26007>:
        D.25844 = hwi->callback;
        D.25845 = MEM[(struct MonoObject *)start].vtable;
        D.25846 = D.25845->klass;
        D.25848 = hwi->called;
        if (D.25848 == 0) goto <D.26010>; else goto <D.26011>;
        <D.26010>:
        iftmp.379 = size;
        goto <D.26012>;
        <D.26011>:
        iftmp.379 = 0;
        <D.26012>:
        D.25841 = hwi->count;
        D.25852 = (long unsigned int) D.25841;
        D.25853 = &hwi->refs;
        D.25854 = &hwi->offsets;
        D.25855 = hwi->data;
        D.25844 (start, D.25846, iftmp.379, D.25852, D.25853, D.25854, D.25855);
        hwi->count = 0;
        hwi->called = 1;
        <D.26008>:
        D.25841 = hwi->count;
        _objptr.380 = (long int) _objptr;
        start.365 = (long int) start;
        D.26014 = _objptr.380 - start.365;
        D.26015 = (long unsigned int) D.26014;
        hwi->offsets[D.25841] = D.26015;
        D.25841 = hwi->count;
        D.26016 = D.25841;
        D.26017 = D.26016 + 1;
        hwi->count = D.26017;
        D.26004 = *_objptr;
        hwi->refs[D.26016] = D.26004;
        <D.26006>:
        <D.26003>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.21996>:
        if (_bmap != 0) goto <D.21995>; else goto <D.21997>;
        <D.21997>:
        start_run = start_run + 512;
      }
      <D.21999>:
      bwords.381 = bwords;
      bwords = bwords.381 + -1;
      if (bwords.381 > 0) goto <D.21998>; else goto <D.22000>;
      <D.22000>:
    }
    goto <D.21943>;
    <D.22001>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.26019 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.26019);
      mbitmap_data.382 = mbitmap_data;
      mbitmap_data = mbitmap_data.382 + 8;
      D.26021 = *mbitmap_data.382;
      D.26022 = (unsigned int) D.26021;
      D.26023 = D.26022 + 4294967295;
      mbwords = (int) D.26023;
      D.26024 = vt->klass;
      el_size = mono_array_element_size (D.26024);
      e_start = start + 32;
      D.25910 = MEM[(struct MonoArray *)start].max_length;
      el_size.383 = (unsigned int) el_size;
      D.26026 = D.25910 * el_size.383;
      D.26027 = (sizetype) D.26026;
      e_end = e_start + D.26027;
      if (0 != 0) goto <D.26028>; else goto <D.26029>;
      <D.26028>:
      D.26019 = vt->desc;
      D.26024 = vt->klass;
      D.26030 = D.26024->name_space;
      D.26024 = vt->klass;
      D.26031 = D.26024->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.26019, D.26030, D.26031);
      <D.26029>:
      goto <D.22019>;
      <D.22018>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.384 = bitmap_data;
          bitmap_data = bitmap_data.384 + 8;
          _bmap = *bitmap_data.384;
          start_run = _objptr;
          goto <D.22013>;
          <D.22012>:
          D.26033 = _bmap & 1;
          if (D.26033 != 0) goto <D.26034>; else goto <D.26035>;
          <D.26034>:
          D.26036 = *_objptr;
          if (D.26036 != 0B) goto <D.26037>; else goto <D.26038>;
          <D.26037>:
          D.25841 = hwi->count;
          if (D.25841 == 128) goto <D.26039>; else goto <D.26040>;
          <D.26039>:
          D.25844 = hwi->callback;
          D.25845 = MEM[(struct MonoObject *)start].vtable;
          D.25846 = D.25845->klass;
          D.25848 = hwi->called;
          if (D.25848 == 0) goto <D.26042>; else goto <D.26043>;
          <D.26042>:
          iftmp.385 = size;
          goto <D.26044>;
          <D.26043>:
          iftmp.385 = 0;
          <D.26044>:
          D.25841 = hwi->count;
          D.25852 = (long unsigned int) D.25841;
          D.25853 = &hwi->refs;
          D.25854 = &hwi->offsets;
          D.25855 = hwi->data;
          D.25844 (start, D.25846, iftmp.385, D.25852, D.25853, D.25854, D.25855);
          hwi->count = 0;
          hwi->called = 1;
          <D.26040>:
          D.25841 = hwi->count;
          _objptr.386 = (long int) _objptr;
          start.365 = (long int) start;
          D.26046 = _objptr.386 - start.365;
          D.26047 = (long unsigned int) D.26046;
          hwi->offsets[D.25841] = D.26047;
          D.25841 = hwi->count;
          D.26048 = D.25841;
          D.26049 = D.26048 + 1;
          hwi->count = D.26049;
          D.26036 = *_objptr;
          hwi->refs[D.26048] = D.26036;
          <D.26038>:
          <D.26035>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.22013>:
          if (_bmap != 0) goto <D.22012>; else goto <D.22014>;
          <D.22014>:
          _objptr = start_run + 512;
        }
        <D.22016>:
        bwords.387 = bwords;
        bwords = bwords.387 + 4294967295;
        if (bwords.387 != 0) goto <D.22015>; else goto <D.22017>;
        <D.22017>:
        D.26051 = (sizetype) el_size;
        e_start = e_start + D.26051;
      }
      <D.22019>:
      if (e_start < e_end) goto <D.22018>; else goto <D.22020>;
      <D.22020>:
    }
    goto <D.21943>;
    <D.22021>:
    goto <D.21943>;
    <D.22022>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.21943>:
  }
}


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


mono_gc_max_generation ()
{
  int D.26055;

  D.26055 = 1;
  return D.26055;
}


mono_gc_collection_count (int generation)
{
  int D.26059;

  if (generation == 0) goto <D.26057>; else goto <D.26058>;
  <D.26057>:
  D.26059 = stat_minor_gcs;
  return D.26059;
  <D.26058>:
  D.26059 = stat_major_gcs;
  return D.26059;
}


mono_gc_get_used_size ()
{
  long unsigned int los_memory_usage.388;
  struct GCMemSection * nursery_section.389;
  char * D.26063;
  long int D.26064;
  char * D.26065;
  long int D.26066;
  long int D.26067;
  gint64 (*<T2d9c>) (void) D.26068;
  long int D.26069;
  int64_t D.26070;
  gint64 tot;

  tot = 0;
  pthread_mutex_lock (&gc_mutex);
  los_memory_usage.388 = los_memory_usage;
  tot = (gint64) los_memory_usage.388;
  nursery_section.389 = nursery_section;
  D.26063 = nursery_section.389->next_data;
  D.26064 = (long int) D.26063;
  nursery_section.389 = nursery_section;
  D.26065 = nursery_section.389->data;
  D.26066 = (long int) D.26065;
  D.26067 = D.26064 - D.26066;
  tot = D.26067 + tot;
  D.26068 = major_collector.get_used_size;
  D.26069 = D.26068 ();
  tot = D.26069 + tot;
  sgen_gc_unlock ();
  D.26070 = tot;
  return D.26070;
}


mono_gc_get_los_limit ()
{
  int D.26072;

  D.26072 = 8000;
  return D.26072;
}


mono_gc_user_markers_supported ()
{
  gboolean D.26074;

  D.26074 = 1;
  return D.26074;
}


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

  D.26076 = 1;
  return D.26076;
}


mono_gc_get_generation (struct MonoObject * obj)
{
  int D.26078;
  int D.26081;

  D.26078 = sgen_ptr_in_nursery (obj);
  if (D.26078 != 0) goto <D.26079>; else goto <D.26080>;
  <D.26079>:
  D.26081 = 0;
  return D.26081;
  <D.26080>:
  D.26081 = 1;
  return D.26081;
}


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.390;
  long unsigned int D.26086;
  long unsigned int D.26087;
  struct MonoObject * D.26089;
  int bridge_processing_in_progress.391;
  _Bool D.26091;
  long int D.26092;
  long int D.26093;
  void * D.26096;
  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.26083>; else goto <D.26084>;
  <D.26083>:
  ptr.390 = (long unsigned int) ptr;
  D.26086 = ~ptr.390;
  D.26087 = D.26086 & 18446744073709551612;
  obj = (struct MonoObject *) D.26087;
  goto <D.26088>;
  <D.26084>:
  D.26089 = 0B;
  return D.26089;
  <D.26088>:
  mono_memory_barrier ();
  bridge_processing_in_progress.391 = bridge_processing_in_progress;
  D.26091 = bridge_processing_in_progress.391 != 0;
  D.26092 = (long int) D.26091;
  D.26093 = __builtin_expect (D.26092, 0);
  if (D.26093 != 0) goto <D.26094>; else goto <D.26095>;
  <D.26094>:
  mono_gc_wait_for_bridge_processing ();
  <D.26095>:
  D.26096 = *link_addr_volatile;
  if (D.26096 != ptr) goto retry; else goto <D.26097>;
  <D.26097>:
  D.26089 = obj;
  return D.26089;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


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

  pthread_mutex_lock (&gc_mutex);
  node = sgen_alloc_internal (18);
  if (node == 0B) goto <D.26099>; else goto <D.26100>;
  <D.26099>:
  sgen_gc_unlock ();
  D.26101 = 0;
  return D.26101;
  <D.26100>:
  node->array = obj;
  ephemeron_list.392 = ephemeron_list;
  node->next = ephemeron_list.392;
  ephemeron_list = node;
  if (0 != 0) goto <D.26103>; else goto <D.26104>;
  <D.26103>:
  gc_debug_file.393 = gc_debug_file;
  fprintf (gc_debug_file.393, "Registered ephemeron array %p\n", obj);
  gc_debug_file.393 = gc_debug_file;
  fflush (gc_debug_file.393);
  <D.26104>:
  sgen_gc_unlock ();
  D.26101 = 1;
  return D.26101;
}


mono_gc_set_allow_synchronous_major (gboolean flag)
{
  int D.26107;
  gboolean D.26110;

  D.26107 = major_collector.is_concurrent;
  if (D.26107 == 0) goto <D.26108>; else goto <D.26109>;
  <D.26108>:
  D.26110 = flag;
  return D.26110;
  <D.26109>:
  allow_synchronous_major = flag;
  D.26110 = 1;
  return D.26110;
}


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

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


mono_gc_is_gc_thread ()
{
  struct SgenThreadInfo * D.26114;
  _Bool D.26115;
  gboolean D.26116;
  gboolean result;

  pthread_mutex_lock (&gc_mutex);
  D.26114 = mono_thread_info_current ();
  D.26115 = D.26114 != 0B;
  result = (gboolean) D.26115;
  sgen_gc_unlock ();
  D.26116 = result;
  return D.26116;
}


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

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


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

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


mono_gc_base_init ()
{
  int D.26124;
  long unsigned int pagesize.396;
  struct _IO_FILE * stderr.397;
  int D.26129;
  char * D.26132;
  int D.26134;
  char * D.26137;
  char * D.26138;
  int D.22153;
  int iftmp.398;
  int D.22152;
  const char[7] * D.26146;
  unsigned char D.26147;
  int D.26148;
  unsigned char D.26149;
  int D.26150;
  const unsigned char * D.26155;
  unsigned char D.26156;
  int D.26157;
  const unsigned char * D.26158;
  unsigned char D.26159;
  int D.26160;
  const unsigned char * D.26165;
  unsigned char D.26166;
  int D.26167;
  const unsigned char * D.26168;
  unsigned char D.26169;
  int D.26170;
  const unsigned char * D.26175;
  unsigned char D.26176;
  int D.26177;
  const unsigned char * D.26178;
  unsigned char D.26179;
  int D.26180;
  int D.22163;
  int iftmp.399;
  int D.22162;
  const char[6] * D.26188;
  unsigned char D.26189;
  int D.26190;
  unsigned char D.26191;
  int D.26192;
  const unsigned char * D.26197;
  unsigned char D.26198;
  int D.26199;
  const unsigned char * D.26200;
  unsigned char D.26201;
  int D.26202;
  const unsigned char * D.26207;
  unsigned char D.26208;
  int D.26209;
  const unsigned char * D.26210;
  unsigned char D.26211;
  int D.26212;
  const unsigned char * D.26217;
  unsigned char D.26218;
  int D.26219;
  const unsigned char * D.26220;
  unsigned char D.26221;
  int D.26222;
  int D.22172;
  int iftmp.400;
  int D.22171;
  const char[10] * D.26234;
  unsigned char D.26235;
  int D.26236;
  unsigned char D.26237;
  int D.26238;
  const unsigned char * D.26243;
  unsigned char D.26244;
  int D.26245;
  const unsigned char * D.26246;
  unsigned char D.26247;
  int D.26248;
  const unsigned char * D.26253;
  unsigned char D.26254;
  int D.26255;
  const unsigned char * D.26256;
  unsigned char D.26257;
  int D.26258;
  const unsigned char * D.26263;
  unsigned char D.26264;
  int D.26265;
  const unsigned char * D.26266;
  unsigned char D.26267;
  int D.26268;
  int D.22182;
  int iftmp.401;
  int D.22181;
  const char[16] * D.26277;
  unsigned char D.26278;
  int D.26279;
  unsigned char D.26280;
  int D.26281;
  const unsigned char * D.26286;
  unsigned char D.26287;
  int D.26288;
  const unsigned char * D.26289;
  unsigned char D.26290;
  int D.26291;
  const unsigned char * D.26296;
  unsigned char D.26297;
  int D.26298;
  const unsigned char * D.26299;
  unsigned char D.26300;
  int D.26301;
  const unsigned char * D.26306;
  unsigned char D.26307;
  int D.26308;
  const unsigned char * D.26309;
  unsigned char D.26310;
  int D.26311;
  int D.22191;
  int iftmp.402;
  int D.22190;
  const char[14] * D.26320;
  unsigned char D.26321;
  int D.26322;
  unsigned char D.26323;
  int D.26324;
  const unsigned char * D.26329;
  unsigned char D.26330;
  int D.26331;
  const unsigned char * D.26332;
  unsigned char D.26333;
  int D.26334;
  const unsigned char * D.26339;
  unsigned char D.26340;
  int D.26341;
  const unsigned char * D.26342;
  unsigned char D.26343;
  int D.26344;
  const unsigned char * D.26349;
  unsigned char D.26350;
  int D.26351;
  const unsigned char * D.26352;
  unsigned char D.26353;
  int D.26354;
  int D.22200;
  int iftmp.403;
  int D.22199;
  const char[20] * D.26363;
  unsigned char D.26364;
  int D.26365;
  unsigned char D.26366;
  int D.26367;
  const unsigned char * D.26372;
  unsigned char D.26373;
  int D.26374;
  const unsigned char * D.26375;
  unsigned char D.26376;
  int D.26377;
  const unsigned char * D.26382;
  unsigned char D.26383;
  int D.26384;
  const unsigned char * D.26385;
  unsigned char D.26386;
  int D.26387;
  const unsigned char * D.26392;
  unsigned char D.26393;
  int D.26394;
  const unsigned char * D.26395;
  unsigned char D.26396;
  int D.26397;
  int D.22209;
  int iftmp.404;
  int D.22208;
  const char[15] * D.26406;
  unsigned char D.26407;
  int D.26408;
  unsigned char D.26409;
  int D.26410;
  const unsigned char * D.26415;
  unsigned char D.26416;
  int D.26417;
  const unsigned char * D.26418;
  unsigned char D.26419;
  int D.26420;
  const unsigned char * D.26425;
  unsigned char D.26426;
  int D.26427;
  const unsigned char * D.26428;
  unsigned char D.26429;
  int D.26430;
  const unsigned char * D.26435;
  unsigned char D.26436;
  int D.26437;
  const unsigned char * D.26438;
  unsigned char D.26439;
  int D.26440;
  int D.26444;
  _Bool D.26447;
  long int D.26448;
  long int D.26449;
  int sgen_nursery_size.405;
  int D.22220;
  int iftmp.406;
  int D.22219;
  const char[1] * D.26460;
  unsigned char D.26461;
  int D.26462;
  unsigned char D.26463;
  int D.26464;
  const unsigned char * D.26469;
  unsigned char D.26470;
  int D.26471;
  const unsigned char * D.26472;
  unsigned char D.26473;
  int D.26474;
  const unsigned char * D.26479;
  unsigned char D.26480;
  int D.26481;
  const unsigned char * D.26482;
  unsigned char D.26483;
  int D.26484;
  const unsigned char * D.26489;
  unsigned char D.26490;
  int D.26491;
  const unsigned char * D.26492;
  unsigned char D.26493;
  int D.26494;
  unsigned char D.26496;
  int D.26499;
  int D.26502;
  int D.26505;
  char * D.26508;
  char D.26511;
  int D.26513;
  int D.26515;
  long int D.26516;
  long int max_heap_candidate.407;
  long int D.26518;
  long int D.26519;
  int D.26520;
  int D.26521;
  long int D.26522;
  long int D.26523;
  int D.26526;
  int D.26527;
  char * D.26530;
  int D.26534;
  long int soft_limit.408;
  int D.26539;
  char * D.26544;
  char * endptr.409;
  char D.26549;
  unsigned long val.410;
  unsigned long D.26551;
  int D.26554;
  char * D.26557;
  int D.22233;
  int iftmp.411;
  int D.22232;
  const char[8] * D.26561;
  unsigned char D.26562;
  int D.26563;
  unsigned char D.26564;
  int D.26565;
  const unsigned char * D.26570;
  unsigned char D.26571;
  int D.26572;
  const unsigned char * D.26573;
  unsigned char D.26574;
  int D.26575;
  const unsigned char * D.26580;
  unsigned char D.26581;
  int D.26582;
  const unsigned char * D.26583;
  unsigned char D.26584;
  int D.26585;
  const unsigned char * D.26590;
  unsigned char D.26591;
  int D.26592;
  const unsigned char * D.26593;
  unsigned char D.26594;
  int D.26595;
  int D.22242;
  int iftmp.412;
  int D.22241;
  const char[13] * D.26603;
  unsigned char D.26604;
  int D.26605;
  unsigned char D.26606;
  int D.26607;
  const unsigned char * D.26612;
  unsigned char D.26613;
  int D.26614;
  const unsigned char * D.26615;
  unsigned char D.26616;
  int D.26617;
  const unsigned char * D.26622;
  unsigned char D.26623;
  int D.26624;
  const unsigned char * D.26625;
  unsigned char D.26626;
  int D.26627;
  const unsigned char * D.26632;
  unsigned char D.26633;
  int D.26634;
  const unsigned char * D.26635;
  unsigned char D.26636;
  int D.26637;
  const char * iftmp.413;
  int conservative_stack_mark.414;
  int D.26647;
  char * D.26650;
  gchar * D.26651;
  int D.26652;
  char * D.26655;
  int D.26659;
  long int val.415;
  long int D.26662;
  long int D.26663;
  int sgen_nursery_size.416;
  int sgen_nursery_bits.417;
  int sgen_nursery_bits.418;
  int D.26671;
  int D.26672;
  char * D.26675;
  int D.26676;
  int D.26679;
  char * D.26682;
  int D.26683;
  int D.26686;
  int D.26689;
  char * D.26692;
  int D.22257;
  int iftmp.419;
  int D.22256;
  const char[4] * D.26696;
  unsigned char D.26697;
  int D.26698;
  unsigned char D.26699;
  int D.26700;
  const unsigned char * D.26705;
  unsigned char D.26706;
  int D.26707;
  const unsigned char * D.26708;
  unsigned char D.26709;
  int D.26710;
  const unsigned char * D.26715;
  unsigned char D.26716;
  int D.26717;
  const unsigned char * D.26718;
  unsigned char D.26719;
  int D.26720;
  const unsigned char * D.26725;
  unsigned char D.26726;
  int D.26727;
  const unsigned char * D.26728;
  unsigned char D.26729;
  int D.26730;
  int D.22266;
  int iftmp.420;
  int D.22265;
  const char[3] * D.26738;
  unsigned char D.26739;
  int D.26740;
  unsigned char D.26741;
  int D.26742;
  const unsigned char * D.26747;
  unsigned char D.26748;
  int D.26749;
  const unsigned char * D.26750;
  unsigned char D.26751;
  int D.26752;
  const unsigned char * D.26757;
  unsigned char D.26758;
  int D.26759;
  const unsigned char * D.26760;
  unsigned char D.26761;
  int D.26762;
  const unsigned char * D.26767;
  unsigned char D.26768;
  int D.26769;
  const unsigned char * D.26770;
  unsigned char D.26771;
  int D.26772;
  int D.22275;
  int iftmp.421;
  int D.22274;
  const char[10] * D.26780;
  unsigned char D.26781;
  int D.26782;
  unsigned char D.26783;
  int D.26784;
  const unsigned char * D.26789;
  unsigned char D.26790;
  int D.26791;
  const unsigned char * D.26792;
  unsigned char D.26793;
  int D.26794;
  const unsigned char * D.26799;
  unsigned char D.26800;
  int D.26801;
  const unsigned char * D.26802;
  unsigned char D.26803;
  int D.26804;
  const unsigned char * D.26809;
  unsigned char D.26810;
  int D.26811;
  const unsigned char * D.26812;
  unsigned char D.26813;
  int D.26814;
  int D.22284;
  int iftmp.422;
  int D.22283;
  const char[13] * D.26823;
  unsigned char D.26824;
  int D.26825;
  unsigned char D.26826;
  int D.26827;
  const unsigned char * D.26832;
  unsigned char D.26833;
  int D.26834;
  const unsigned char * D.26835;
  unsigned char D.26836;
  int D.26837;
  const unsigned char * D.26842;
  unsigned char D.26843;
  int D.26844;
  const unsigned char * D.26845;
  unsigned char D.26846;
  int D.26847;
  const unsigned char * D.26852;
  unsigned char D.26853;
  int D.26854;
  const unsigned char * D.26855;
  unsigned char D.26856;
  int D.26857;
  gboolean (*<T2d4e>) (const char *) D.26861;
  int D.26864;
  gboolean (*<T2d4e>) (const char *) D.26867;
  int D.26870;
  void (*<T7e8>) (void) D.26877;
  void (*<T7e8>) (void) D.26880;
  int D.22298;
  int iftmp.423;
  int D.22297;
  unsigned char D.26897;
  int D.26898;
  const unsigned char * D.26903;
  unsigned char D.26904;
  int D.26905;
  const unsigned char * D.26910;
  unsigned char D.26911;
  int D.26912;
  const unsigned char * D.26917;
  unsigned char D.26918;
  int D.26919;
  unsigned char D.26921;
  char D.26924;
  char D.26925;
  int gc_debug_level.424;
  int D.26933;
  struct FILE * gc_debug_file.425;
  struct FILE * gc_debug_file.426;
  int D.22309;
  int iftmp.427;
  int D.22308;
  const char[16] * D.26942;
  unsigned char D.26943;
  int D.26944;
  unsigned char D.26945;
  int D.26946;
  const unsigned char * D.26951;
  unsigned char D.26952;
  int D.26953;
  const unsigned char * D.26954;
  unsigned char D.26955;
  int D.26956;
  const unsigned char * D.26961;
  unsigned char D.26962;
  int D.26963;
  const unsigned char * D.26964;
  unsigned char D.26965;
  int D.26966;
  const unsigned char * D.26971;
  unsigned char D.26972;
  int D.26973;
  const unsigned char * D.26974;
  unsigned char D.26975;
  int D.26976;
  int D.22318;
  int iftmp.428;
  int D.22317;
  const char[14] * D.26984;
  unsigned char D.26985;
  int D.26986;
  unsigned char D.26987;
  int D.26988;
  const unsigned char * D.26993;
  unsigned char D.26994;
  int D.26995;
  const unsigned char * D.26996;
  unsigned char D.26997;
  int D.26998;
  const unsigned char * D.27003;
  unsigned char D.27004;
  int D.27005;
  const unsigned char * D.27006;
  unsigned char D.27007;
  int D.27008;
  const unsigned char * D.27013;
  unsigned char D.27014;
  int D.27015;
  const unsigned char * D.27016;
  unsigned char D.27017;
  int D.27018;
  int D.22327;
  int iftmp.429;
  int D.22326;
  const char[21] * D.27026;
  unsigned char D.27027;
  int D.27028;
  unsigned char D.27029;
  int D.27030;
  const unsigned char * D.27035;
  unsigned char D.27036;
  int D.27037;
  const unsigned char * D.27038;
  unsigned char D.27039;
  int D.27040;
  const unsigned char * D.27045;
  unsigned char D.27046;
  int D.27047;
  const unsigned char * D.27048;
  unsigned char D.27049;
  int D.27050;
  const unsigned char * D.27055;
  unsigned char D.27056;
  int D.27057;
  const unsigned char * D.27058;
  unsigned char D.27059;
  int D.27060;
  int D.27065;
  char * D.27068;
  int D.27069;
  unsigned int verify_before_allocs.430;
  int D.22337;
  int iftmp.431;
  int D.22336;
  const char[22] * D.27075;
  unsigned char D.27076;
  int D.27077;
  unsigned char D.27078;
  int D.27079;
  const unsigned char * D.27084;
  unsigned char D.27085;
  int D.27086;
  const unsigned char * D.27087;
  unsigned char D.27088;
  int D.27089;
  const unsigned char * D.27094;
  unsigned char D.27095;
  int D.27096;
  const unsigned char * D.27097;
  unsigned char D.27098;
  int D.27099;
  const unsigned char * D.27104;
  unsigned char D.27105;
  int D.27106;
  const unsigned char * D.27107;
  unsigned char D.27108;
  int D.27109;
  int D.27114;
  char * D.27117;
  int D.27118;
  unsigned int collect_before_allocs.432;
  int D.22347;
  int iftmp.433;
  int D.22346;
  const char[26] * D.27124;
  unsigned char D.27125;
  int D.27126;
  unsigned char D.27127;
  int D.27128;
  const unsigned char * D.27133;
  unsigned char D.27134;
  int D.27135;
  const unsigned char * D.27136;
  unsigned char D.27137;
  int D.27138;
  const unsigned char * D.27143;
  unsigned char D.27144;
  int D.27145;
  const unsigned char * D.27146;
  unsigned char D.27147;
  int D.27148;
  const unsigned char * D.27153;
  unsigned char D.27154;
  int D.27155;
  const unsigned char * D.27156;
  unsigned char D.27157;
  int D.27158;
  int D.22356;
  int iftmp.434;
  int D.22355;
  const char[27] * D.27166;
  unsigned char D.27167;
  int D.27168;
  unsigned char D.27169;
  int D.27170;
  const unsigned char * D.27175;
  unsigned char D.27176;
  int D.27177;
  const unsigned char * D.27178;
  unsigned char D.27179;
  int D.27180;
  const unsigned char * D.27185;
  unsigned char D.27186;
  int D.27187;
  const unsigned char * D.27188;
  unsigned char D.27189;
  int D.27190;
  const unsigned char * D.27195;
  unsigned char D.27196;
  int D.27197;
  const unsigned char * D.27198;
  unsigned char D.27199;
  int D.27200;
  int D.22365;
  int iftmp.435;
  int D.22364;
  const char[28] * D.27208;
  unsigned char D.27209;
  int D.27210;
  unsigned char D.27211;
  int D.27212;
  const unsigned char * D.27217;
  unsigned char D.27218;
  int D.27219;
  const unsigned char * D.27220;
  unsigned char D.27221;
  int D.27222;
  const unsigned char * D.27227;
  unsigned char D.27228;
  int D.27229;
  const unsigned char * D.27230;
  unsigned char D.27231;
  int D.27232;
  const unsigned char * D.27237;
  unsigned char D.27238;
  int D.27239;
  const unsigned char * D.27240;
  unsigned char D.27241;
  int D.27242;
  int D.22374;
  int iftmp.436;
  int D.22373;
  const char[16] * D.27252;
  unsigned char D.27253;
  int D.27254;
  unsigned char D.27255;
  int D.27256;
  const unsigned char * D.27261;
  unsigned char D.27262;
  int D.27263;
  const unsigned char * D.27264;
  unsigned char D.27265;
  int D.27266;
  const unsigned char * D.27271;
  unsigned char D.27272;
  int D.27273;
  const unsigned char * D.27274;
  unsigned char D.27275;
  int D.27276;
  const unsigned char * D.27281;
  unsigned char D.27282;
  int D.27283;
  const unsigned char * D.27284;
  unsigned char D.27285;
  int D.27286;
  int D.22383;
  int iftmp.437;
  int D.22382;
  const char[21] * D.27294;
  unsigned char D.27295;
  int D.27296;
  unsigned char D.27297;
  int D.27298;
  const unsigned char * D.27303;
  unsigned char D.27304;
  int D.27305;
  const unsigned char * D.27306;
  unsigned char D.27307;
  int D.27308;
  const unsigned char * D.27313;
  unsigned char D.27314;
  int D.27315;
  const unsigned char * D.27316;
  unsigned char D.27317;
  int D.27318;
  const unsigned char * D.27323;
  unsigned char D.27324;
  int D.27325;
  const unsigned char * D.27326;
  unsigned char D.27327;
  int D.27328;
  int D.22392;
  int iftmp.438;
  int D.22391;
  const char[15] * D.27336;
  unsigned char D.27337;
  int D.27338;
  unsigned char D.27339;
  int D.27340;
  const unsigned char * D.27345;
  unsigned char D.27346;
  int D.27347;
  const unsigned char * D.27348;
  unsigned char D.27349;
  int D.27350;
  const unsigned char * D.27355;
  unsigned char D.27356;
  int D.27357;
  const unsigned char * D.27358;
  unsigned char D.27359;
  int D.27360;
  const unsigned char * D.27365;
  unsigned char D.27366;
  int D.27367;
  const unsigned char * D.27368;
  unsigned char D.27369;
  int D.27370;
  int D.22401;
  int iftmp.439;
  int D.22400;
  const char[12] * D.27378;
  unsigned char D.27379;
  int D.27380;
  unsigned char D.27381;
  int D.27382;
  const unsigned char * D.27387;
  unsigned char D.27388;
  int D.27389;
  const unsigned char * D.27390;
  unsigned char D.27391;
  int D.27392;
  const unsigned char * D.27397;
  unsigned char D.27398;
  int D.27399;
  const unsigned char * D.27400;
  unsigned char D.27401;
  int D.27402;
  const unsigned char * D.27407;
  unsigned char D.27408;
  int D.27409;
  const unsigned char * D.27410;
  unsigned char D.27411;
  int D.27412;
  int D.22410;
  int iftmp.440;
  int D.22409;
  const char[20] * D.27420;
  unsigned char D.27421;
  int D.27422;
  unsigned char D.27423;
  int D.27424;
  const unsigned char * D.27429;
  unsigned char D.27430;
  int D.27431;
  const unsigned char * D.27432;
  unsigned char D.27433;
  int D.27434;
  const unsigned char * D.27439;
  unsigned char D.27440;
  int D.27441;
  const unsigned char * D.27442;
  unsigned char D.27443;
  int D.27444;
  const unsigned char * D.27449;
  unsigned char D.27450;
  int D.27451;
  const unsigned char * D.27452;
  unsigned char D.27453;
  int D.27454;
  int D.22419;
  int iftmp.441;
  int D.22418;
  const char[18] * D.27462;
  unsigned char D.27463;
  int D.27464;
  unsigned char D.27465;
  int D.27466;
  const unsigned char * D.27471;
  unsigned char D.27472;
  int D.27473;
  const unsigned char * D.27474;
  unsigned char D.27475;
  int D.27476;
  const unsigned char * D.27481;
  unsigned char D.27482;
  int D.27483;
  const unsigned char * D.27484;
  unsigned char D.27485;
  int D.27486;
  const unsigned char * D.27491;
  unsigned char D.27492;
  int D.27493;
  const unsigned char * D.27494;
  unsigned char D.27495;
  int D.27496;
  int D.22428;
  int iftmp.442;
  int D.22427;
  const char[27] * D.27504;
  unsigned char D.27505;
  int D.27506;
  unsigned char D.27507;
  int D.27508;
  const unsigned char * D.27513;
  unsigned char D.27514;
  int D.27515;
  const unsigned char * D.27516;
  unsigned char D.27517;
  int D.27518;
  const unsigned char * D.27523;
  unsigned char D.27524;
  int D.27525;
  const unsigned char * D.27526;
  unsigned char D.27527;
  int D.27528;
  const unsigned char * D.27533;
  unsigned char D.27534;
  int D.27535;
  const unsigned char * D.27536;
  unsigned char D.27537;
  int D.27538;
  int D.22437;
  int iftmp.443;
  int D.22436;
  const char[17] * D.27546;
  unsigned char D.27547;
  int D.27548;
  unsigned char D.27549;
  int D.27550;
  const unsigned char * D.27555;
  unsigned char D.27556;
  int D.27557;
  const unsigned char * D.27558;
  unsigned char D.27559;
  int D.27560;
  const unsigned char * D.27565;
  unsigned char D.27566;
  int D.27567;
  const unsigned char * D.27568;
  unsigned char D.27569;
  int D.27570;
  const unsigned char * D.27575;
  unsigned char D.27576;
  int D.27577;
  const unsigned char * D.27578;
  unsigned char D.27579;
  int D.27580;
  int D.22446;
  int iftmp.444;
  int D.22445;
  const char[25] * D.27590;
  unsigned char D.27591;
  int D.27592;
  unsigned char D.27593;
  int D.27594;
  const unsigned char * D.27599;
  unsigned char D.27600;
  int D.27601;
  const unsigned char * D.27602;
  unsigned char D.27603;
  int D.27604;
  const unsigned char * D.27609;
  unsigned char D.27610;
  int D.27611;
  const unsigned char * D.27612;
  unsigned char D.27613;
  int D.27614;
  const unsigned char * D.27619;
  unsigned char D.27620;
  int D.27621;
  const unsigned char * D.27622;
  unsigned char D.27623;
  int D.27624;
  int D.22455;
  int iftmp.445;
  int D.22454;
  const char[21] * D.27632;
  unsigned char D.27633;
  int D.27634;
  unsigned char D.27635;
  int D.27636;
  const unsigned char * D.27641;
  unsigned char D.27642;
  int D.27643;
  const unsigned char * D.27644;
  unsigned char D.27645;
  int D.27646;
  const unsigned char * D.27651;
  unsigned char D.27652;
  int D.27653;
  const unsigned char * D.27654;
  unsigned char D.27655;
  int D.27656;
  const unsigned char * D.27661;
  unsigned char D.27662;
  int D.27663;
  const unsigned char * D.27664;
  unsigned char D.27665;
  int D.27666;
  int D.22464;
  int iftmp.446;
  int D.22463;
  const char[14] * D.27674;
  unsigned char D.27675;
  int D.27676;
  unsigned char D.27677;
  int D.27678;
  const unsigned char * D.27683;
  unsigned char D.27684;
  int D.27685;
  const unsigned char * D.27686;
  unsigned char D.27687;
  int D.27688;
  const unsigned char * D.27693;
  unsigned char D.27694;
  int D.27695;
  const unsigned char * D.27696;
  unsigned char D.27697;
  int D.27698;
  const unsigned char * D.27703;
  unsigned char D.27704;
  int D.27705;
  const unsigned char * D.27706;
  unsigned char D.27707;
  int D.27708;
  int D.22473;
  int iftmp.447;
  int D.22472;
  const char[14] * D.27716;
  unsigned char D.27717;
  int D.27718;
  unsigned char D.27719;
  int D.27720;
  const unsigned char * D.27725;
  unsigned char D.27726;
  int D.27727;
  const unsigned char * D.27728;
  unsigned char D.27729;
  int D.27730;
  const unsigned char * D.27735;
  unsigned char D.27736;
  int D.27737;
  const unsigned char * D.27738;
  unsigned char D.27739;
  int D.27740;
  const unsigned char * D.27745;
  unsigned char D.27746;
  int D.27747;
  const unsigned char * D.27748;
  unsigned char D.27749;
  int D.27750;
  int D.27755;
  char * D.27758;
  struct FILE * heap_dump_file.448;
  struct FILE * heap_dump_file.449;
  int do_pin_stats.450;
  void (*<T2db6>) (struct SgenMajorCollector *) D.27774;
  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.22138>:
      result = InterlockedCompareExchange (&gc_initialized, -1, 0);
      switch (result) <default: <D.22137>, case -1: <D.22134>, case 0: <D.22136>, case 1: <D.22133>>
      <D.22133>:
      return;
      <D.22134>:
      monoeg_g_usleep (1000);
      goto <D.22135>;
      <D.22136>:
      goto <D.22135>;
      <D.22137>:
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-gc.c", 4863);
      <D.22135>:
      if (result != 0) goto <D.22138>; else goto <D.22139>;
      <D.22139>:
      pthread_mutex_init (&gc_mutex, 0B);
      D.26124 = mono_pagesize ();
      pagesize.396 = (long unsigned int) D.26124;
      pagesize = pagesize.396;
      stderr.397 = stderr;
      gc_debug_file = stderr.397;
      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, 904);
      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.26127>; else goto <D.26128>;
      <D.26127>:
      opts = monoeg_g_strsplit (env, ",", -1);
      ptr = opts;
      goto <D.22142>;
      <D.22141>:
      {
        char * opt;

        opt = *ptr;
        D.26129 = monoeg_g_str_has_prefix (opt, "major=");
        if (D.26129 != 0) goto <D.26130>; else goto <D.26131>;
        <D.26130>:
        D.26132 = __builtin_strchr (opt, 61);
        opt = D.26132 + 1;
        major_collector_opt = monoeg_strdup (opt);
        goto <D.26133>;
        <D.26131>:
        D.26134 = monoeg_g_str_has_prefix (opt, "minor=");
        if (D.26134 != 0) goto <D.26135>; else goto <D.26136>;
        <D.26135>:
        D.26137 = __builtin_strchr (opt, 61);
        opt = D.26137 + 1;
        minor_collector_opt = monoeg_strdup (opt);
        <D.26136>:
        <D.26133>:
      }
      ptr = ptr + 8;
      <D.22142>:
      D.26138 = *ptr;
      if (D.26138 != 0B) goto <D.22141>; else goto <D.22143>;
      <D.22143>:
      goto <D.26139>;
      <D.26128>:
      opts = 0B;
      <D.26139>:
      init_stats ();
      sgen_init_internal_allocator ();
      sgen_init_nursery_allocator ();
      sgen_init_fin_weak_hash ();
      sgen_register_fixed_internal_mem_type (2, 56);
      sgen_register_fixed_internal_mem_type (6, 16);
      sgen_register_fixed_internal_mem_type (14, 1016);
      sgen_register_fixed_internal_mem_type (18, 16);
      {
        int tls_offset;

        tls_offset = -1;
        __asm__("lis	%0,sgen_thread_info@tprel@ha
addi	%0,%0, sgen_thread_info@tprel@l
" : "=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.26140>; else goto <D.26141>;
      <D.26140>:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.26142>;
      <D.26141>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.26146 = "simple";
          D.26147 = MEM[(const unsigned char *)D.26146];
          D.26148 = (int) D.26147;
          D.26149 = *__s2;
          D.26150 = (int) D.26149;
          __result = D.26148 - D.26150;
          {
            if (__s2_len != 0) goto <D.26151>; else goto <D.26152>;
            <D.26151>:
            if (__result == 0) goto <D.26153>; else goto <D.26154>;
            <D.26153>:
            D.26155 = &MEM[(void *)"simple" + 1B];
            D.26156 = *D.26155;
            D.26157 = (int) D.26156;
            D.26158 = __s2 + 1;
            D.26159 = *D.26158;
            D.26160 = (int) D.26159;
            __result = D.26157 - D.26160;
            if (__s2_len > 1) goto <D.26161>; else goto <D.26162>;
            <D.26161>:
            if (__result == 0) goto <D.26163>; else goto <D.26164>;
            <D.26163>:
            D.26165 = &MEM[(void *)"simple" + 2B];
            D.26166 = *D.26165;
            D.26167 = (int) D.26166;
            D.26168 = __s2 + 2;
            D.26169 = *D.26168;
            D.26170 = (int) D.26169;
            __result = D.26167 - D.26170;
            if (__s2_len > 2) goto <D.26171>; else goto <D.26172>;
            <D.26171>:
            if (__result == 0) goto <D.26173>; else goto <D.26174>;
            <D.26173>:
            D.26175 = &MEM[(void *)"simple" + 3B];
            D.26176 = *D.26175;
            D.26177 = (int) D.26176;
            D.26178 = __s2 + 3;
            D.26179 = *D.26178;
            D.26180 = (int) D.26179;
            __result = D.26177 - D.26180;
            <D.26174>:
            <D.26172>:
            <D.26164>:
            <D.26162>:
            <D.26154>:
            <D.26152>:
          }
          D.22152 = __result;
        }
        iftmp.398 = -D.22152;
        goto <D.26181>;
        <D.26145>:
        iftmp.398 = __builtin_strcmp (minor_collector_opt, "simple");
        <D.26181>:
        D.22153 = iftmp.398;
      }
      if (D.22153 == 0) goto <D.26182>; else goto <D.26183>;
      <D.26182>:
      use_simple_nursery:
      sgen_simple_nursery_init (&sgen_minor_collector);
      goto <D.26184>;
      <D.26183>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = minor_collector_opt;
          D.26188 = "split";
          D.26189 = MEM[(const unsigned char *)D.26188];
          D.26190 = (int) D.26189;
          D.26191 = *__s2;
          D.26192 = (int) D.26191;
          __result = D.26190 - D.26192;
          {
            if (__s2_len != 0) goto <D.26193>; else goto <D.26194>;
            <D.26193>:
            if (__result == 0) goto <D.26195>; else goto <D.26196>;
            <D.26195>:
            D.26197 = &MEM[(void *)"split" + 1B];
            D.26198 = *D.26197;
            D.26199 = (int) D.26198;
            D.26200 = __s2 + 1;
            D.26201 = *D.26200;
            D.26202 = (int) D.26201;
            __result = D.26199 - D.26202;
            if (__s2_len > 1) goto <D.26203>; else goto <D.26204>;
            <D.26203>:
            if (__result == 0) goto <D.26205>; else goto <D.26206>;
            <D.26205>:
            D.26207 = &MEM[(void *)"split" + 2B];
            D.26208 = *D.26207;
            D.26209 = (int) D.26208;
            D.26210 = __s2 + 2;
            D.26211 = *D.26210;
            D.26212 = (int) D.26211;
            __result = D.26209 - D.26212;
            if (__s2_len > 2) goto <D.26213>; else goto <D.26214>;
            <D.26213>:
            if (__result == 0) goto <D.26215>; else goto <D.26216>;
            <D.26215>:
            D.26217 = &MEM[(void *)"split" + 3B];
            D.26218 = *D.26217;
            D.26219 = (int) D.26218;
            D.26220 = __s2 + 3;
            D.26221 = *D.26220;
            D.26222 = (int) D.26221;
            __result = D.26219 - D.26222;
            <D.26216>:
            <D.26214>:
            <D.26206>:
            <D.26204>:
            <D.26196>:
            <D.26194>:
          }
          D.22162 = __result;
        }
        iftmp.399 = -D.22162;
        goto <D.26223>;
        <D.26187>:
        iftmp.399 = __builtin_strcmp (minor_collector_opt, "split");
        <D.26223>:
        D.22163 = iftmp.399;
      }
      if (D.22163 == 0) goto <D.26224>; else goto <D.26225>;
      <D.26224>:
      sgen_split_nursery_init (&sgen_minor_collector);
      have_split_nursery = 1;
      goto <D.26226>;
      <D.26225>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `simple` instead.", "Unknown minor collector `%s\'.", minor_collector_opt);
      goto use_simple_nursery;
      <D.26226>:
      <D.26184>:
      <D.26142>:
      if (major_collector_opt == 0B) goto <D.26227>; else goto <D.26230>;
      <D.26230>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.26234 = "marksweep";
          D.26235 = MEM[(const unsigned char *)D.26234];
          D.26236 = (int) D.26235;
          D.26237 = *__s2;
          D.26238 = (int) D.26237;
          __result = D.26236 - D.26238;
          {
            if (__s2_len != 0) goto <D.26239>; else goto <D.26240>;
            <D.26239>:
            if (__result == 0) goto <D.26241>; else goto <D.26242>;
            <D.26241>:
            D.26243 = &MEM[(void *)"marksweep" + 1B];
            D.26244 = *D.26243;
            D.26245 = (int) D.26244;
            D.26246 = __s2 + 1;
            D.26247 = *D.26246;
            D.26248 = (int) D.26247;
            __result = D.26245 - D.26248;
            if (__s2_len > 1) goto <D.26249>; else goto <D.26250>;
            <D.26249>:
            if (__result == 0) goto <D.26251>; else goto <D.26252>;
            <D.26251>:
            D.26253 = &MEM[(void *)"marksweep" + 2B];
            D.26254 = *D.26253;
            D.26255 = (int) D.26254;
            D.26256 = __s2 + 2;
            D.26257 = *D.26256;
            D.26258 = (int) D.26257;
            __result = D.26255 - D.26258;
            if (__s2_len > 2) goto <D.26259>; else goto <D.26260>;
            <D.26259>:
            if (__result == 0) goto <D.26261>; else goto <D.26262>;
            <D.26261>:
            D.26263 = &MEM[(void *)"marksweep" + 3B];
            D.26264 = *D.26263;
            D.26265 = (int) D.26264;
            D.26266 = __s2 + 3;
            D.26267 = *D.26266;
            D.26268 = (int) D.26267;
            __result = D.26265 - D.26268;
            <D.26262>:
            <D.26260>:
            <D.26252>:
            <D.26250>:
            <D.26242>:
            <D.26240>:
          }
          D.22171 = __result;
        }
        iftmp.400 = -D.22171;
        goto <D.26269>;
        <D.26233>:
        iftmp.400 = __builtin_strcmp (major_collector_opt, "marksweep");
        <D.26269>:
        D.22172 = iftmp.400;
      }
      if (D.22172 == 0) goto <D.26227>; else goto <D.26228>;
      <D.26227>:
      use_marksweep_major:
      sgen_marksweep_init (&major_collector);
      goto <D.26229>;
      <D.26228>:
      if (major_collector_opt == 0B) goto <D.26270>; else goto <D.26273>;
      <D.26273>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.26277 = "marksweep-fixed";
          D.26278 = MEM[(const unsigned char *)D.26277];
          D.26279 = (int) D.26278;
          D.26280 = *__s2;
          D.26281 = (int) D.26280;
          __result = D.26279 - D.26281;
          {
            if (__s2_len != 0) goto <D.26282>; else goto <D.26283>;
            <D.26282>:
            if (__result == 0) goto <D.26284>; else goto <D.26285>;
            <D.26284>:
            D.26286 = &MEM[(void *)"marksweep-fixed" + 1B];
            D.26287 = *D.26286;
            D.26288 = (int) D.26287;
            D.26289 = __s2 + 1;
            D.26290 = *D.26289;
            D.26291 = (int) D.26290;
            __result = D.26288 - D.26291;
            if (__s2_len > 1) goto <D.26292>; else goto <D.26293>;
            <D.26292>:
            if (__result == 0) goto <D.26294>; else goto <D.26295>;
            <D.26294>:
            D.26296 = &MEM[(void *)"marksweep-fixed" + 2B];
            D.26297 = *D.26296;
            D.26298 = (int) D.26297;
            D.26299 = __s2 + 2;
            D.26300 = *D.26299;
            D.26301 = (int) D.26300;
            __result = D.26298 - D.26301;
            if (__s2_len > 2) goto <D.26302>; else goto <D.26303>;
            <D.26302>:
            if (__result == 0) goto <D.26304>; else goto <D.26305>;
            <D.26304>:
            D.26306 = &MEM[(void *)"marksweep-fixed" + 3B];
            D.26307 = *D.26306;
            D.26308 = (int) D.26307;
            D.26309 = __s2 + 3;
            D.26310 = *D.26309;
            D.26311 = (int) D.26310;
            __result = D.26308 - D.26311;
            <D.26305>:
            <D.26303>:
            <D.26295>:
            <D.26293>:
            <D.26285>:
            <D.26283>:
          }
          D.22181 = __result;
        }
        iftmp.401 = -D.22181;
        goto <D.26312>;
        <D.26276>:
        iftmp.401 = __builtin_strcmp (major_collector_opt, "marksweep-fixed");
        <D.26312>:
        D.22182 = iftmp.401;
      }
      if (D.22182 == 0) goto <D.26270>; else goto <D.26271>;
      <D.26270>:
      sgen_marksweep_fixed_init (&major_collector);
      goto <D.26272>;
      <D.26271>:
      if (major_collector_opt == 0B) goto <D.26313>; else goto <D.26316>;
      <D.26316>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.26320 = "marksweep-par";
          D.26321 = MEM[(const unsigned char *)D.26320];
          D.26322 = (int) D.26321;
          D.26323 = *__s2;
          D.26324 = (int) D.26323;
          __result = D.26322 - D.26324;
          {
            if (__s2_len != 0) goto <D.26325>; else goto <D.26326>;
            <D.26325>:
            if (__result == 0) goto <D.26327>; else goto <D.26328>;
            <D.26327>:
            D.26329 = &MEM[(void *)"marksweep-par" + 1B];
            D.26330 = *D.26329;
            D.26331 = (int) D.26330;
            D.26332 = __s2 + 1;
            D.26333 = *D.26332;
            D.26334 = (int) D.26333;
            __result = D.26331 - D.26334;
            if (__s2_len > 1) goto <D.26335>; else goto <D.26336>;
            <D.26335>:
            if (__result == 0) goto <D.26337>; else goto <D.26338>;
            <D.26337>:
            D.26339 = &MEM[(void *)"marksweep-par" + 2B];
            D.26340 = *D.26339;
            D.26341 = (int) D.26340;
            D.26342 = __s2 + 2;
            D.26343 = *D.26342;
            D.26344 = (int) D.26343;
            __result = D.26341 - D.26344;
            if (__s2_len > 2) goto <D.26345>; else goto <D.26346>;
            <D.26345>:
            if (__result == 0) goto <D.26347>; else goto <D.26348>;
            <D.26347>:
            D.26349 = &MEM[(void *)"marksweep-par" + 3B];
            D.26350 = *D.26349;
            D.26351 = (int) D.26350;
            D.26352 = __s2 + 3;
            D.26353 = *D.26352;
            D.26354 = (int) D.26353;
            __result = D.26351 - D.26354;
            <D.26348>:
            <D.26346>:
            <D.26338>:
            <D.26336>:
            <D.26328>:
            <D.26326>:
          }
          D.22190 = __result;
        }
        iftmp.402 = -D.22190;
        goto <D.26355>;
        <D.26319>:
        iftmp.402 = __builtin_strcmp (major_collector_opt, "marksweep-par");
        <D.26355>:
        D.22191 = iftmp.402;
      }
      if (D.22191 == 0) goto <D.26313>; else goto <D.26314>;
      <D.26313>:
      sgen_marksweep_par_init (&major_collector);
      goto <D.26315>;
      <D.26314>:
      if (major_collector_opt == 0B) goto <D.26356>; else goto <D.26359>;
      <D.26359>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.26363 = "marksweep-fixed-par";
          D.26364 = MEM[(const unsigned char *)D.26363];
          D.26365 = (int) D.26364;
          D.26366 = *__s2;
          D.26367 = (int) D.26366;
          __result = D.26365 - D.26367;
          {
            if (__s2_len != 0) goto <D.26368>; else goto <D.26369>;
            <D.26368>:
            if (__result == 0) goto <D.26370>; else goto <D.26371>;
            <D.26370>:
            D.26372 = &MEM[(void *)"marksweep-fixed-par" + 1B];
            D.26373 = *D.26372;
            D.26374 = (int) D.26373;
            D.26375 = __s2 + 1;
            D.26376 = *D.26375;
            D.26377 = (int) D.26376;
            __result = D.26374 - D.26377;
            if (__s2_len > 1) goto <D.26378>; else goto <D.26379>;
            <D.26378>:
            if (__result == 0) goto <D.26380>; else goto <D.26381>;
            <D.26380>:
            D.26382 = &MEM[(void *)"marksweep-fixed-par" + 2B];
            D.26383 = *D.26382;
            D.26384 = (int) D.26383;
            D.26385 = __s2 + 2;
            D.26386 = *D.26385;
            D.26387 = (int) D.26386;
            __result = D.26384 - D.26387;
            if (__s2_len > 2) goto <D.26388>; else goto <D.26389>;
            <D.26388>:
            if (__result == 0) goto <D.26390>; else goto <D.26391>;
            <D.26390>:
            D.26392 = &MEM[(void *)"marksweep-fixed-par" + 3B];
            D.26393 = *D.26392;
            D.26394 = (int) D.26393;
            D.26395 = __s2 + 3;
            D.26396 = *D.26395;
            D.26397 = (int) D.26396;
            __result = D.26394 - D.26397;
            <D.26391>:
            <D.26389>:
            <D.26381>:
            <D.26379>:
            <D.26371>:
            <D.26369>:
          }
          D.22199 = __result;
        }
        iftmp.403 = -D.22199;
        goto <D.26398>;
        <D.26362>:
        iftmp.403 = __builtin_strcmp (major_collector_opt, "marksweep-fixed-par");
        <D.26398>:
        D.22200 = iftmp.403;
      }
      if (D.22200 == 0) goto <D.26356>; else goto <D.26357>;
      <D.26356>:
      sgen_marksweep_fixed_par_init (&major_collector);
      goto <D.26358>;
      <D.26357>:
      if (major_collector_opt == 0B) goto <D.26399>; else goto <D.26402>;
      <D.26402>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = major_collector_opt;
          D.26406 = "marksweep-conc";
          D.26407 = MEM[(const unsigned char *)D.26406];
          D.26408 = (int) D.26407;
          D.26409 = *__s2;
          D.26410 = (int) D.26409;
          __result = D.26408 - D.26410;
          {
            if (__s2_len != 0) goto <D.26411>; else goto <D.26412>;
            <D.26411>:
            if (__result == 0) goto <D.26413>; else goto <D.26414>;
            <D.26413>:
            D.26415 = &MEM[(void *)"marksweep-conc" + 1B];
            D.26416 = *D.26415;
            D.26417 = (int) D.26416;
            D.26418 = __s2 + 1;
            D.26419 = *D.26418;
            D.26420 = (int) D.26419;
            __result = D.26417 - D.26420;
            if (__s2_len > 1) goto <D.26421>; else goto <D.26422>;
            <D.26421>:
            if (__result == 0) goto <D.26423>; else goto <D.26424>;
            <D.26423>:
            D.26425 = &MEM[(void *)"marksweep-conc" + 2B];
            D.26426 = *D.26425;
            D.26427 = (int) D.26426;
            D.26428 = __s2 + 2;
            D.26429 = *D.26428;
            D.26430 = (int) D.26429;
            __result = D.26427 - D.26430;
            if (__s2_len > 2) goto <D.26431>; else goto <D.26432>;
            <D.26431>:
            if (__result == 0) goto <D.26433>; else goto <D.26434>;
            <D.26433>:
            D.26435 = &MEM[(void *)"marksweep-conc" + 3B];
            D.26436 = *D.26435;
            D.26437 = (int) D.26436;
            D.26438 = __s2 + 3;
            D.26439 = *D.26438;
            D.26440 = (int) D.26439;
            __result = D.26437 - D.26440;
            <D.26434>:
            <D.26432>:
            <D.26424>:
            <D.26422>:
            <D.26414>:
            <D.26412>:
          }
          D.22208 = __result;
        }
        iftmp.404 = -D.22208;
        goto <D.26441>;
        <D.26405>:
        iftmp.404 = __builtin_strcmp (major_collector_opt, "marksweep-conc");
        <D.26441>:
        D.22209 = iftmp.404;
      }
      if (D.22209 == 0) goto <D.26399>; else goto <D.26400>;
      <D.26399>:
      sgen_marksweep_conc_init (&major_collector);
      goto <D.26401>;
      <D.26400>:
      sgen_env_var_error ("MONO_GC_PARAMS", "Using `marksweep` instead.", "Unknown major collector `%s\'.", major_collector_opt);
      goto use_marksweep_major;
      <D.26401>:
      <D.26358>:
      <D.26315>:
      <D.26272>:
      <D.26229>:
      if (have_split_nursery != 0) goto <D.26442>; else goto <D.26443>;
      <D.26442>:
      D.26444 = major_collector.is_parallel;
      if (D.26444 != 0) goto <D.26445>; else goto <D.26446>;
      <D.26445>:
      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.26446>:
      <D.26443>:
      num_workers = mono_cpu_count ();
      D.26447 = num_workers <= 0;
      D.26448 = (long int) D.26447;
      D.26449 = __builtin_expect (D.26448, 0);
      if (D.26449 != 0) goto <D.26450>; else goto <D.26451>;
      <D.26450>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 4977, "num_workers > 0");
      <D.26451>:
      if (num_workers > 16) goto <D.26452>; else goto <D.26453>;
      <D.26452>:
      num_workers = 16;
      <D.26453>:
      conservative_stack_mark = 1;
      sgen_nursery_size.405 = sgen_nursery_size;
      sgen_nursery_size = sgen_nursery_size.405;
      if (opts != 0B) goto <D.26455>; else goto <D.26456>;
      <D.26455>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.26460 = "";
              D.26461 = MEM[(const unsigned char *)D.26460];
              D.26462 = (int) D.26461;
              D.26463 = *__s2;
              D.26464 = (int) D.26463;
              __result = D.26462 - D.26464;
              {
                if (__s2_len != 0) goto <D.26465>; else goto <D.26466>;
                <D.26465>:
                if (__result == 0) goto <D.26467>; else goto <D.26468>;
                <D.26467>:
                D.26469 = &MEM[(void *)"" + 1B];
                D.26470 = *D.26469;
                D.26471 = (int) D.26470;
                D.26472 = __s2 + 1;
                D.26473 = *D.26472;
                D.26474 = (int) D.26473;
                __result = D.26471 - D.26474;
                if (__s2_len > 1) goto <D.26475>; else goto <D.26476>;
                <D.26475>:
                if (__result == 0) goto <D.26477>; else goto <D.26478>;
                <D.26477>:
                D.26479 = &MEM[(void *)"" + 2B];
                D.26480 = *D.26479;
                D.26481 = (int) D.26480;
                D.26482 = __s2 + 2;
                D.26483 = *D.26482;
                D.26484 = (int) D.26483;
                __result = D.26481 - D.26484;
                if (__s2_len > 2) goto <D.26485>; else goto <D.26486>;
                <D.26485>:
                if (__result == 0) goto <D.26487>; else goto <D.26488>;
                <D.26487>:
                D.26489 = &MEM[(void *)"" + 3B];
                D.26490 = *D.26489;
                D.26491 = (int) D.26490;
                D.26492 = __s2 + 3;
                D.26493 = *D.26492;
                D.26494 = (int) D.26493;
                __result = D.26491 - D.26494;
                <D.26488>:
                <D.26486>:
                <D.26478>:
                <D.26476>:
                <D.26468>:
                <D.26466>:
              }
              D.22219 = __result;
            }
            iftmp.406 = -D.22219;
            goto <D.26495>;
            <D.26459>:
            D.26496 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.406 = (int) D.26496;
            <D.26495>:
            D.22220 = iftmp.406;
          }
          if (D.22220 == 0) goto <D.26497>; else goto <D.26498>;
          <D.26497>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26498>:
          D.26499 = monoeg_g_str_has_prefix (opt, "major=");
          if (D.26499 != 0) goto <D.26500>; else goto <D.26501>;
          <D.26500>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26501>:
          D.26502 = monoeg_g_str_has_prefix (opt, "minor=");
          if (D.26502 != 0) goto <D.26503>; else goto <D.26504>;
          <D.26503>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26504>:
          D.26505 = monoeg_g_str_has_prefix (opt, "max-heap-size=");
          if (D.26505 != 0) goto <D.26506>; else goto <D.26507>;
          <D.26506>:
          {
            glong max_heap_candidate;

            try
              {
                max_heap_candidate = 0;
                D.26508 = __builtin_strchr (opt, 61);
                opt = D.26508 + 1;
                D.26511 = *opt;
                if (D.26511 != 0) goto <D.26512>; else goto <D.26509>;
                <D.26512>:
                D.26513 = mono_gc_parse_environment_string_extract_number (opt, &max_heap_candidate);
                if (D.26513 != 0) goto <D.26514>; else goto <D.26509>;
                <D.26514>:
                D.26515 = mono_pagesize ();
                D.26516 = (long int) D.26515;
                max_heap_candidate.407 = max_heap_candidate;
                D.26518 = D.26516 + max_heap_candidate.407;
                D.26519 = D.26518 + -1;
                D.26520 = mono_pagesize ();
                D.26521 = D.26520 + -1;
                D.26522 = (long int) D.26521;
                D.26523 = ~D.26522;
                max_heap = D.26519 & D.26523;
                max_heap_candidate.407 = max_heap_candidate;
                if (max_heap != max_heap_candidate.407) goto <D.26524>; else goto <D.26525>;
                <D.26524>:
                D.26526 = mono_pagesize ();
                sgen_env_var_error ("MONO_GC_PARAMS", "Rounding up.", "`max-heap-size` size must be a multiple of %d.", D.26526);
                <D.26525>:
                goto <D.26510>;
                <D.26509>:
                sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`max-heap-size` must be an integer.");
                <D.26510>:
                // predicted unlikely by continue predictor.
                goto <D.22221>;
              }
            finally
              {
                max_heap_candidate = {CLOBBER};
              }
          }
          <D.26507>:
          D.26527 = monoeg_g_str_has_prefix (opt, "soft-heap-limit=");
          if (D.26527 != 0) goto <D.26528>; else goto <D.26529>;
          <D.26528>:
          D.26530 = __builtin_strchr (opt, 61);
          opt = D.26530 + 1;
          D.26511 = *opt;
          if (D.26511 != 0) goto <D.26533>; else goto <D.26531>;
          <D.26533>:
          D.26534 = mono_gc_parse_environment_string_extract_number (opt, &soft_limit);
          if (D.26534 != 0) goto <D.26535>; else goto <D.26531>;
          <D.26535>:
          soft_limit.408 = soft_limit;
          if (soft_limit.408 <= 0) goto <D.26537>; else goto <D.26538>;
          <D.26537>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be positive.");
          soft_limit = 0;
          <D.26538>:
          goto <D.26532>;
          <D.26531>:
          sgen_env_var_error ("MONO_GC_PARAMS", 0B, "`soft-heap-limit` must be an integer.");
          <D.26532>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26529>:
          D.26539 = monoeg_g_str_has_prefix (opt, "workers=");
          if (D.26539 != 0) goto <D.26540>; else goto <D.26541>;
          <D.26540>:
          {
            long int val;
            char * endptr;

            try
              {
                D.26444 = major_collector.is_parallel;
                if (D.26444 == 0) goto <D.26542>; else goto <D.26543>;
                <D.26542>:
                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.22221>;
                <D.26543>:
                D.26544 = __builtin_strchr (opt, 61);
                opt = D.26544 + 1;
                val = strtol (opt, &endptr, 10);
                D.26511 = *opt;
                if (D.26511 == 0) goto <D.26545>; else goto <D.26547>;
                <D.26547>:
                endptr.409 = endptr;
                D.26549 = *endptr.409;
                if (D.26549 != 0) goto <D.26545>; else goto <D.26546>;
                <D.26545>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Cannot parse the `workers` option value.");
                // predicted unlikely by continue predictor.
                goto <D.22221>;
                <D.26546>:
                val.410 = (unsigned long) val;
                D.26551 = val.410 + 18446744073709551615;
                if (D.26551 > 15) goto <D.26552>; else goto <D.26553>;
                <D.26552>:
                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.22221>;
                <D.26553>:
                num_workers = (int) val;
                // predicted unlikely by continue predictor.
                goto <D.22221>;
              }
            finally
              {
                endptr = {CLOBBER};
              }
          }
          <D.26541>:
          D.26554 = monoeg_g_str_has_prefix (opt, "stack-mark=");
          if (D.26554 != 0) goto <D.26555>; else goto <D.26556>;
          <D.26555>:
          D.26557 = __builtin_strchr (opt, 61);
          opt = D.26557 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

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

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

              __s2 = opt;
              D.26603 = "conservative";
              D.26604 = MEM[(const unsigned char *)D.26603];
              D.26605 = (int) D.26604;
              D.26606 = *__s2;
              D.26607 = (int) D.26606;
              __result = D.26605 - D.26607;
              {
                if (__s2_len != 0) goto <D.26608>; else goto <D.26609>;
                <D.26608>:
                if (__result == 0) goto <D.26610>; else goto <D.26611>;
                <D.26610>:
                D.26612 = &MEM[(void *)"conservative" + 1B];
                D.26613 = *D.26612;
                D.26614 = (int) D.26613;
                D.26615 = __s2 + 1;
                D.26616 = *D.26615;
                D.26617 = (int) D.26616;
                __result = D.26614 - D.26617;
                if (__s2_len > 1) goto <D.26618>; else goto <D.26619>;
                <D.26618>:
                if (__result == 0) goto <D.26620>; else goto <D.26621>;
                <D.26620>:
                D.26622 = &MEM[(void *)"conservative" + 2B];
                D.26623 = *D.26622;
                D.26624 = (int) D.26623;
                D.26625 = __s2 + 2;
                D.26626 = *D.26625;
                D.26627 = (int) D.26626;
                __result = D.26624 - D.26627;
                if (__s2_len > 2) goto <D.26628>; else goto <D.26629>;
                <D.26628>:
                if (__result == 0) goto <D.26630>; else goto <D.26631>;
                <D.26630>:
                D.26632 = &MEM[(void *)"conservative" + 3B];
                D.26633 = *D.26632;
                D.26634 = (int) D.26633;
                D.26635 = __s2 + 3;
                D.26636 = *D.26635;
                D.26637 = (int) D.26636;
                __result = D.26634 - D.26637;
                <D.26631>:
                <D.26629>:
                <D.26621>:
                <D.26619>:
                <D.26611>:
                <D.26609>:
              }
              D.22241 = __result;
            }
            iftmp.412 = -D.22241;
            goto <D.26638>;
            <D.26602>:
            iftmp.412 = __builtin_strcmp (opt, "conservative");
            <D.26638>:
            D.22242 = iftmp.412;
          }
          if (D.22242 == 0) goto <D.26639>; else goto <D.26640>;
          <D.26639>:
          conservative_stack_mark = 1;
          goto <D.26641>;
          <D.26640>:
          conservative_stack_mark.414 = conservative_stack_mark;
          if (conservative_stack_mark.414 != 0) goto <D.26644>; else goto <D.26645>;
          <D.26644>:
          iftmp.413 = "Using `conservative`.";
          goto <D.26646>;
          <D.26645>:
          iftmp.413 = "Using `precise`.";
          <D.26646>:
          sgen_env_var_error ("MONO_GC_PARAMS", iftmp.413, "Invalid value `%s` for `stack-mark` option, possible values are: `precise`, `conservative`.", opt);
          <D.26641>:
          <D.26599>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26556>:
          D.26647 = monoeg_g_str_has_prefix (opt, "bridge=");
          if (D.26647 != 0) goto <D.26648>; else goto <D.26649>;
          <D.26648>:
          D.26650 = __builtin_strchr (opt, 61);
          opt = D.26650 + 1;
          D.26651 = monoeg_strdup (opt);
          sgen_register_test_bridge_callbacks (D.26651);
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26649>:
          D.26652 = monoeg_g_str_has_prefix (opt, "nursery-size=");
          if (D.26652 != 0) goto <D.26653>; else goto <D.26654>;
          <D.26653>:
          {
            long int val;

            try
              {
                D.26655 = __builtin_strchr (opt, 61);
                opt = D.26655 + 1;
                D.26511 = *opt;
                if (D.26511 != 0) goto <D.26658>; else goto <D.26656>;
                <D.26658>:
                D.26659 = mono_gc_parse_environment_string_extract_number (opt, &val);
                if (D.26659 != 0) goto <D.26660>; else goto <D.26656>;
                <D.26660>:
                val.415 = val;
                D.26662 = val.415 + -1;
                val.415 = val;
                D.26663 = D.26662 & val.415;
                if (D.26663 != 0) goto <D.26664>; else goto <D.26665>;
                <D.26664>:
                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.22221>;
                <D.26665>:
                val.415 = val;
                if (val.415 <= 511) goto <D.26666>; else goto <D.26667>;
                <D.26666>:
                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.22221>;
                <D.26667>:
                val.415 = val;
                sgen_nursery_size.416 = (int) val.415;
                sgen_nursery_size = sgen_nursery_size.416;
                sgen_nursery_bits = 0;
                goto <D.22245>;
                <D.22244>:
                <D.22245>:
                sgen_nursery_bits.417 = sgen_nursery_bits;
                sgen_nursery_bits.418 = sgen_nursery_bits.417 + 1;
                sgen_nursery_bits = sgen_nursery_bits.418;
                sgen_nursery_bits.417 = sgen_nursery_bits;
                D.26671 = 1 << sgen_nursery_bits.417;
                sgen_nursery_size.405 = sgen_nursery_size;
                if (D.26671 != sgen_nursery_size.405) goto <D.22244>; else goto <D.22246>;
                <D.22246>:
                goto <D.26657>;
                <D.26656>:
                sgen_env_var_error ("MONO_GC_PARAMS", "Using default value.", "`nursery-size` must be an integer.");
                // predicted unlikely by continue predictor.
                goto <D.22221>;
                <D.26657>:
                // predicted unlikely by continue predictor.
                goto <D.22221>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.26654>:
          D.26672 = monoeg_g_str_has_prefix (opt, "save-target-ratio=");
          if (D.26672 != 0) goto <D.26673>; else goto <D.26674>;
          <D.26673>:
          {
            double val;

            try
              {
                D.26675 = __builtin_strchr (opt, 61);
                opt = D.26675 + 1;
                D.26676 = parse_double_in_interval ("MONO_GC_PARAMS", "save-target-ratio", opt, 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0, &val);
                if (D.26676 != 0) goto <D.26677>; else goto <D.26678>;
                <D.26677>:
                save_target = val;
                <D.26678>:
                // predicted unlikely by continue predictor.
                goto <D.22221>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.26674>:
          D.26679 = monoeg_g_str_has_prefix (opt, "default-allowance-ratio=");
          if (D.26679 != 0) goto <D.26680>; else goto <D.26681>;
          <D.26680>:
          {
            double val;

            try
              {
                D.26682 = __builtin_strchr (opt, 61);
                opt = D.26682 + 1;
                D.26683 = parse_double_in_interval ("MONO_GC_PARAMS", "default-allowance-ratio", opt, 1.0e+0, 1.0e+0, &val);
                if (D.26683 != 0) goto <D.26684>; else goto <D.26685>;
                <D.26684>:
                allowance_ratio = val;
                <D.26685>:
                // predicted unlikely by continue predictor.
                goto <D.22221>;
              }
            finally
              {
                val = {CLOBBER};
              }
          }
          <D.26681>:
          D.26686 = monoeg_g_str_has_prefix (opt, "allow-synchronous-major=");
          if (D.26686 != 0) goto <D.26687>; else goto <D.26688>;
          <D.26687>:
          D.26689 = major_collector.is_concurrent;
          if (D.26689 == 0) goto <D.26690>; else goto <D.26691>;
          <D.26690>:
          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.22221>;
          <D.26691>:
          D.26692 = __builtin_strchr (opt, 61);
          opt = D.26692 + 1;
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26696 = "yes";
              D.26697 = MEM[(const unsigned char *)D.26696];
              D.26698 = (int) D.26697;
              D.26699 = *__s2;
              D.26700 = (int) D.26699;
              __result = D.26698 - D.26700;
              {
                if (__s2_len != 0) goto <D.26701>; else goto <D.26702>;
                <D.26701>:
                if (__result == 0) goto <D.26703>; else goto <D.26704>;
                <D.26703>:
                D.26705 = &MEM[(void *)"yes" + 1B];
                D.26706 = *D.26705;
                D.26707 = (int) D.26706;
                D.26708 = __s2 + 1;
                D.26709 = *D.26708;
                D.26710 = (int) D.26709;
                __result = D.26707 - D.26710;
                if (__s2_len > 1) goto <D.26711>; else goto <D.26712>;
                <D.26711>:
                if (__result == 0) goto <D.26713>; else goto <D.26714>;
                <D.26713>:
                D.26715 = &MEM[(void *)"yes" + 2B];
                D.26716 = *D.26715;
                D.26717 = (int) D.26716;
                D.26718 = __s2 + 2;
                D.26719 = *D.26718;
                D.26720 = (int) D.26719;
                __result = D.26717 - D.26720;
                if (__s2_len > 2) goto <D.26721>; else goto <D.26722>;
                <D.26721>:
                if (__result == 0) goto <D.26723>; else goto <D.26724>;
                <D.26723>:
                D.26725 = &MEM[(void *)"yes" + 3B];
                D.26726 = *D.26725;
                D.26727 = (int) D.26726;
                D.26728 = __s2 + 3;
                D.26729 = *D.26728;
                D.26730 = (int) D.26729;
                __result = D.26727 - D.26730;
                <D.26724>:
                <D.26722>:
                <D.26714>:
                <D.26712>:
                <D.26704>:
                <D.26702>:
              }
              D.22256 = __result;
            }
            iftmp.419 = -D.22256;
            goto <D.26731>;
            <D.26695>:
            iftmp.419 = __builtin_strcmp (opt, "yes");
            <D.26731>:
            D.22257 = iftmp.419;
          }
          if (D.22257 == 0) goto <D.26732>; else goto <D.26733>;
          <D.26732>:
          allow_synchronous_major = 1;
          goto <D.26734>;
          <D.26733>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26738 = "no";
              D.26739 = MEM[(const unsigned char *)D.26738];
              D.26740 = (int) D.26739;
              D.26741 = *__s2;
              D.26742 = (int) D.26741;
              __result = D.26740 - D.26742;
              {
                if (__s2_len != 0) goto <D.26743>; else goto <D.26744>;
                <D.26743>:
                if (__result == 0) goto <D.26745>; else goto <D.26746>;
                <D.26745>:
                D.26747 = &MEM[(void *)"no" + 1B];
                D.26748 = *D.26747;
                D.26749 = (int) D.26748;
                D.26750 = __s2 + 1;
                D.26751 = *D.26750;
                D.26752 = (int) D.26751;
                __result = D.26749 - D.26752;
                if (__s2_len > 1) goto <D.26753>; else goto <D.26754>;
                <D.26753>:
                if (__result == 0) goto <D.26755>; else goto <D.26756>;
                <D.26755>:
                D.26757 = &MEM[(void *)"no" + 2B];
                D.26758 = *D.26757;
                D.26759 = (int) D.26758;
                D.26760 = __s2 + 2;
                D.26761 = *D.26760;
                D.26762 = (int) D.26761;
                __result = D.26759 - D.26762;
                if (__s2_len > 2) goto <D.26763>; else goto <D.26764>;
                <D.26763>:
                if (__result == 0) goto <D.26765>; else goto <D.26766>;
                <D.26765>:
                D.26767 = &MEM[(void *)"no" + 3B];
                D.26768 = *D.26767;
                D.26769 = (int) D.26768;
                D.26770 = __s2 + 3;
                D.26771 = *D.26770;
                D.26772 = (int) D.26771;
                __result = D.26769 - D.26772;
                <D.26766>:
                <D.26764>:
                <D.26756>:
                <D.26754>:
                <D.26746>:
                <D.26744>:
              }
              D.22265 = __result;
            }
            iftmp.420 = -D.22265;
            goto <D.26773>;
            <D.26737>:
            iftmp.420 = __builtin_strcmp (opt, "no");
            <D.26773>:
            D.22266 = iftmp.420;
          }
          if (D.22266 == 0) goto <D.26774>; else goto <D.26775>;
          <D.26774>:
          allow_synchronous_major = 0;
          goto <D.26776>;
          <D.26775>:
          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.22221>;
          <D.26776>:
          <D.26734>:
          <D.26688>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26780 = "cementing";
              D.26781 = MEM[(const unsigned char *)D.26780];
              D.26782 = (int) D.26781;
              D.26783 = *__s2;
              D.26784 = (int) D.26783;
              __result = D.26782 - D.26784;
              {
                if (__s2_len != 0) goto <D.26785>; else goto <D.26786>;
                <D.26785>:
                if (__result == 0) goto <D.26787>; else goto <D.26788>;
                <D.26787>:
                D.26789 = &MEM[(void *)"cementing" + 1B];
                D.26790 = *D.26789;
                D.26791 = (int) D.26790;
                D.26792 = __s2 + 1;
                D.26793 = *D.26792;
                D.26794 = (int) D.26793;
                __result = D.26791 - D.26794;
                if (__s2_len > 1) goto <D.26795>; else goto <D.26796>;
                <D.26795>:
                if (__result == 0) goto <D.26797>; else goto <D.26798>;
                <D.26797>:
                D.26799 = &MEM[(void *)"cementing" + 2B];
                D.26800 = *D.26799;
                D.26801 = (int) D.26800;
                D.26802 = __s2 + 2;
                D.26803 = *D.26802;
                D.26804 = (int) D.26803;
                __result = D.26801 - D.26804;
                if (__s2_len > 2) goto <D.26805>; else goto <D.26806>;
                <D.26805>:
                if (__result == 0) goto <D.26807>; else goto <D.26808>;
                <D.26807>:
                D.26809 = &MEM[(void *)"cementing" + 3B];
                D.26810 = *D.26809;
                D.26811 = (int) D.26810;
                D.26812 = __s2 + 3;
                D.26813 = *D.26812;
                D.26814 = (int) D.26813;
                __result = D.26811 - D.26814;
                <D.26808>:
                <D.26806>:
                <D.26798>:
                <D.26796>:
                <D.26788>:
                <D.26786>:
              }
              D.22274 = __result;
            }
            iftmp.421 = -D.22274;
            goto <D.26815>;
            <D.26779>:
            iftmp.421 = __builtin_strcmp (opt, "cementing");
            <D.26815>:
            D.22275 = iftmp.421;
          }
          if (D.22275 == 0) goto <D.26816>; else goto <D.26817>;
          <D.26816>:
          D.26444 = major_collector.is_parallel;
          if (D.26444 != 0) goto <D.26818>; else goto <D.26819>;
          <D.26818>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "`cementing` is not supported for the parallel major collector.");
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26819>:
          cement_enabled = 1;
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26817>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26823 = "no-cementing";
              D.26824 = MEM[(const unsigned char *)D.26823];
              D.26825 = (int) D.26824;
              D.26826 = *__s2;
              D.26827 = (int) D.26826;
              __result = D.26825 - D.26827;
              {
                if (__s2_len != 0) goto <D.26828>; else goto <D.26829>;
                <D.26828>:
                if (__result == 0) goto <D.26830>; else goto <D.26831>;
                <D.26830>:
                D.26832 = &MEM[(void *)"no-cementing" + 1B];
                D.26833 = *D.26832;
                D.26834 = (int) D.26833;
                D.26835 = __s2 + 1;
                D.26836 = *D.26835;
                D.26837 = (int) D.26836;
                __result = D.26834 - D.26837;
                if (__s2_len > 1) goto <D.26838>; else goto <D.26839>;
                <D.26838>:
                if (__result == 0) goto <D.26840>; else goto <D.26841>;
                <D.26840>:
                D.26842 = &MEM[(void *)"no-cementing" + 2B];
                D.26843 = *D.26842;
                D.26844 = (int) D.26843;
                D.26845 = __s2 + 2;
                D.26846 = *D.26845;
                D.26847 = (int) D.26846;
                __result = D.26844 - D.26847;
                if (__s2_len > 2) goto <D.26848>; else goto <D.26849>;
                <D.26848>:
                if (__result == 0) goto <D.26850>; else goto <D.26851>;
                <D.26850>:
                D.26852 = &MEM[(void *)"no-cementing" + 3B];
                D.26853 = *D.26852;
                D.26854 = (int) D.26853;
                D.26855 = __s2 + 3;
                D.26856 = *D.26855;
                D.26857 = (int) D.26856;
                __result = D.26854 - D.26857;
                <D.26851>:
                <D.26849>:
                <D.26841>:
                <D.26839>:
                <D.26831>:
                <D.26829>:
              }
              D.22283 = __result;
            }
            iftmp.422 = -D.22283;
            goto <D.26858>;
            <D.26822>:
            iftmp.422 = __builtin_strcmp (opt, "no-cementing");
            <D.26858>:
            D.22284 = iftmp.422;
          }
          if (D.22284 == 0) goto <D.26859>; else goto <D.26860>;
          <D.26859>:
          cement_enabled = 0;
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26860>:
          D.26861 = major_collector.handle_gc_param;
          if (D.26861 != 0B) goto <D.26862>; else goto <D.26863>;
          <D.26862>:
          D.26861 = major_collector.handle_gc_param;
          D.26864 = D.26861 (opt);
          if (D.26864 != 0) goto <D.26865>; else goto <D.26866>;
          <D.26865>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26866>:
          <D.26863>:
          D.26867 = sgen_minor_collector.handle_gc_param;
          if (D.26867 != 0B) goto <D.26868>; else goto <D.26869>;
          <D.26868>:
          D.26867 = sgen_minor_collector.handle_gc_param;
          D.26870 = D.26867 (opt);
          if (D.26870 != 0) goto <D.26871>; else goto <D.26872>;
          <D.26871>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26872>:
          <D.26869>:
          sgen_env_var_error ("MONO_GC_PARAMS", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.26873>; else goto <D.26874>;
          <D.26873>:
          // predicted unlikely by continue predictor.
          goto <D.22221>;
          <D.26874>:
          stderr.397 = stderr;
          fprintf (stderr.397, "\n%s must be a comma-delimited list of one or more of the following:\n", "MONO_GC_PARAMS");
          stderr.397 = stderr;
          fprintf (stderr.397, "  max-heap-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  soft-heap-limit=n (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  nursery-size=N (where N is an integer, possibly with a k, m or a g suffix)\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  major=COLLECTOR (where COLLECTOR is `marksweep\', `marksweep-conc\', `marksweep-par\', \'marksweep-fixed\' or \'marksweep-fixed-par\')\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  minor=COLLECTOR (where COLLECTOR is `simple\' or `split\')\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  wbarrier=WBARRIER (where WBARRIER is `remset\' or `cardtable\')\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  stack-mark=MARK-METHOD (where MARK-METHOD is \'precise\' or \'conservative\')\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  [no-]cementing\n");
          D.26689 = major_collector.is_concurrent;
          if (D.26689 != 0) goto <D.26875>; else goto <D.26876>;
          <D.26875>:
          stderr.397 = stderr;
          fprintf (stderr.397, "  allow-synchronous-major=FLAG (where FLAG is `yes\' or `no\')\n");
          <D.26876>:
          D.26877 = major_collector.print_gc_param_usage;
          if (D.26877 != 0B) goto <D.26878>; else goto <D.26879>;
          <D.26878>:
          D.26877 = major_collector.print_gc_param_usage;
          D.26877 ();
          <D.26879>:
          D.26880 = sgen_minor_collector.print_gc_param_usage;
          if (D.26880 != 0B) goto <D.26881>; else goto <D.26882>;
          <D.26881>:
          D.26880 = sgen_minor_collector.print_gc_param_usage;
          D.26880 ();
          <D.26882>:
          stderr.397 = stderr;
          fprintf (stderr.397, " Experimental options:\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  save-target-ratio=R (where R must be between %.2f - %.2f).\n", 1.000000000000000055511151231257827021181583404541015625e-1, 2.0e+0);
          stderr.397 = stderr;
          fprintf (stderr.397, "  default-allowance-ratio=R (where R must be between %.2f - %.2f).\n", 1.0e+0, 1.0e+1);
          stderr.397 = stderr;
          fprintf (stderr.397, "\n");
          usage_printed = 1;
        }
        <D.22221>:
        ptr = ptr + 8;
        <D.22286>:
        D.26138 = *ptr;
        if (D.26138 != 0B) goto <D.22285>; else goto <D.22287>;
        <D.22287>:
        monoeg_g_strfreev (opts);
      }
      <D.26456>:
      D.26444 = major_collector.is_parallel;
      if (D.26444 != 0) goto <D.26883>; else goto <D.26884>;
      <D.26883>:
      cement_enabled = 0;
      sgen_workers_init (num_workers);
      goto <D.26885>;
      <D.26884>:
      D.26689 = major_collector.is_concurrent;
      if (D.26689 != 0) goto <D.26886>; else goto <D.26887>;
      <D.26886>:
      sgen_workers_init (1);
      <D.26887>:
      <D.26885>:
      if (major_collector_opt != 0B) goto <D.26888>; else goto <D.26889>;
      <D.26888>:
      monoeg_g_free (major_collector_opt);
      <D.26889>:
      if (minor_collector_opt != 0B) goto <D.26890>; else goto <D.26891>;
      <D.26890>:
      monoeg_g_free (minor_collector_opt);
      <D.26891>:
      alloc_nursery ();
      sgen_cement_init (cement_enabled);
      env = monoeg_g_getenv ("MONO_GC_DEBUG");
      if (env != 0B) goto <D.26892>; else goto <D.26893>;
      <D.26892>:
      {
        gboolean usage_printed;

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

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

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

              __s2 = opt;
              D.26460 = "";
              D.26461 = MEM[(const unsigned char *)D.26460];
              D.26462 = (int) D.26461;
              D.26897 = *__s2;
              D.26898 = (int) D.26897;
              __result = D.26462 - D.26898;
              {
                if (__s2_len != 0) goto <D.26899>; else goto <D.26900>;
                <D.26899>:
                if (__result == 0) goto <D.26901>; else goto <D.26902>;
                <D.26901>:
                D.26469 = &MEM[(void *)"" + 1B];
                D.26470 = *D.26469;
                D.26471 = (int) D.26470;
                D.26903 = __s2 + 1;
                D.26904 = *D.26903;
                D.26905 = (int) D.26904;
                __result = D.26471 - D.26905;
                if (__s2_len > 1) goto <D.26906>; else goto <D.26907>;
                <D.26906>:
                if (__result == 0) goto <D.26908>; else goto <D.26909>;
                <D.26908>:
                D.26479 = &MEM[(void *)"" + 2B];
                D.26480 = *D.26479;
                D.26481 = (int) D.26480;
                D.26910 = __s2 + 2;
                D.26911 = *D.26910;
                D.26912 = (int) D.26911;
                __result = D.26481 - D.26912;
                if (__s2_len > 2) goto <D.26913>; else goto <D.26914>;
                <D.26913>:
                if (__result == 0) goto <D.26915>; else goto <D.26916>;
                <D.26915>:
                D.26489 = &MEM[(void *)"" + 3B];
                D.26490 = *D.26489;
                D.26491 = (int) D.26490;
                D.26917 = __s2 + 3;
                D.26918 = *D.26917;
                D.26919 = (int) D.26918;
                __result = D.26491 - D.26919;
                <D.26916>:
                <D.26914>:
                <D.26909>:
                <D.26907>:
                <D.26902>:
                <D.26900>:
              }
              D.22297 = __result;
            }
            iftmp.423 = -D.22297;
            goto <D.26920>;
            <D.26896>:
            D.26921 = MEM[(const unsigned char * {ref-all})opt];
            iftmp.423 = (int) D.26921;
            <D.26920>:
            D.22298 = iftmp.423;
          }
          if (D.22298 == 0) goto <D.26922>; else goto <D.26923>;
          <D.26922>:
          // predicted unlikely by continue predictor.
          goto <D.22299>;
          <D.26923>:
          D.26924 = *opt;
          D.26925 = D.26924 + 208;
          if (D.26925 <= 9) goto <D.26926>; else goto <D.26927>;
          <D.26926>:
          gc_debug_level.424 = atoi (opt);
          gc_debug_level = gc_debug_level.424;
          opt = opt + 1;
          D.26924 = *opt;
          if (D.26924 == 58) goto <D.26929>; else goto <D.26930>;
          <D.26929>:
          opt = opt + 1;
          <D.26930>:
          D.26924 = *opt;
          if (D.26924 != 0) goto <D.26931>; else goto <D.26932>;
          <D.26931>:
          {
            char * rf;

            D.26933 = getpid ();
            rf = monoeg_g_strdup_printf ("%s.%d", opt, D.26933);
            gc_debug_file.425 = fopen (rf, "wb");
            gc_debug_file = gc_debug_file.425;
            gc_debug_file.426 = gc_debug_file;
            if (gc_debug_file.426 == 0B) goto <D.26936>; else goto <D.26937>;
            <D.26936>:
            stderr.397 = stderr;
            gc_debug_file = stderr.397;
            <D.26937>:
            monoeg_g_free (rf);
          }
          <D.26932>:
          goto <D.26938>;
          <D.26927>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26942 = "print-allowance";
              D.26943 = MEM[(const unsigned char *)D.26942];
              D.26944 = (int) D.26943;
              D.26945 = *__s2;
              D.26946 = (int) D.26945;
              __result = D.26944 - D.26946;
              {
                if (__s2_len != 0) goto <D.26947>; else goto <D.26948>;
                <D.26947>:
                if (__result == 0) goto <D.26949>; else goto <D.26950>;
                <D.26949>:
                D.26951 = &MEM[(void *)"print-allowance" + 1B];
                D.26952 = *D.26951;
                D.26953 = (int) D.26952;
                D.26954 = __s2 + 1;
                D.26955 = *D.26954;
                D.26956 = (int) D.26955;
                __result = D.26953 - D.26956;
                if (__s2_len > 1) goto <D.26957>; else goto <D.26958>;
                <D.26957>:
                if (__result == 0) goto <D.26959>; else goto <D.26960>;
                <D.26959>:
                D.26961 = &MEM[(void *)"print-allowance" + 2B];
                D.26962 = *D.26961;
                D.26963 = (int) D.26962;
                D.26964 = __s2 + 2;
                D.26965 = *D.26964;
                D.26966 = (int) D.26965;
                __result = D.26963 - D.26966;
                if (__s2_len > 2) goto <D.26967>; else goto <D.26968>;
                <D.26967>:
                if (__result == 0) goto <D.26969>; else goto <D.26970>;
                <D.26969>:
                D.26971 = &MEM[(void *)"print-allowance" + 3B];
                D.26972 = *D.26971;
                D.26973 = (int) D.26972;
                D.26974 = __s2 + 3;
                D.26975 = *D.26974;
                D.26976 = (int) D.26975;
                __result = D.26973 - D.26976;
                <D.26970>:
                <D.26968>:
                <D.26960>:
                <D.26958>:
                <D.26950>:
                <D.26948>:
              }
              D.22308 = __result;
            }
            iftmp.427 = -D.22308;
            goto <D.26977>;
            <D.26941>:
            iftmp.427 = __builtin_strcmp (opt, "print-allowance");
            <D.26977>:
            D.22309 = iftmp.427;
          }
          if (D.22309 == 0) goto <D.26978>; else goto <D.26979>;
          <D.26978>:
          debug_print_allowance = 1;
          goto <D.26980>;
          <D.26979>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.26984 = "print-pinning";
              D.26985 = MEM[(const unsigned char *)D.26984];
              D.26986 = (int) D.26985;
              D.26987 = *__s2;
              D.26988 = (int) D.26987;
              __result = D.26986 - D.26988;
              {
                if (__s2_len != 0) goto <D.26989>; else goto <D.26990>;
                <D.26989>:
                if (__result == 0) goto <D.26991>; else goto <D.26992>;
                <D.26991>:
                D.26993 = &MEM[(void *)"print-pinning" + 1B];
                D.26994 = *D.26993;
                D.26995 = (int) D.26994;
                D.26996 = __s2 + 1;
                D.26997 = *D.26996;
                D.26998 = (int) D.26997;
                __result = D.26995 - D.26998;
                if (__s2_len > 1) goto <D.26999>; else goto <D.27000>;
                <D.26999>:
                if (__result == 0) goto <D.27001>; else goto <D.27002>;
                <D.27001>:
                D.27003 = &MEM[(void *)"print-pinning" + 2B];
                D.27004 = *D.27003;
                D.27005 = (int) D.27004;
                D.27006 = __s2 + 2;
                D.27007 = *D.27006;
                D.27008 = (int) D.27007;
                __result = D.27005 - D.27008;
                if (__s2_len > 2) goto <D.27009>; else goto <D.27010>;
                <D.27009>:
                if (__result == 0) goto <D.27011>; else goto <D.27012>;
                <D.27011>:
                D.27013 = &MEM[(void *)"print-pinning" + 3B];
                D.27014 = *D.27013;
                D.27015 = (int) D.27014;
                D.27016 = __s2 + 3;
                D.27017 = *D.27016;
                D.27018 = (int) D.27017;
                __result = D.27015 - D.27018;
                <D.27012>:
                <D.27010>:
                <D.27002>:
                <D.27000>:
                <D.26992>:
                <D.26990>:
              }
              D.22317 = __result;
            }
            iftmp.428 = -D.22317;
            goto <D.27019>;
            <D.26983>:
            iftmp.428 = __builtin_strcmp (opt, "print-pinning");
            <D.27019>:
            D.22318 = iftmp.428;
          }
          if (D.22318 == 0) goto <D.27020>; else goto <D.27021>;
          <D.27020>:
          do_pin_stats = 1;
          goto <D.27022>;
          <D.27021>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27026 = "verify-before-allocs";
              D.27027 = MEM[(const unsigned char *)D.27026];
              D.27028 = (int) D.27027;
              D.27029 = *__s2;
              D.27030 = (int) D.27029;
              __result = D.27028 - D.27030;
              {
                if (__s2_len != 0) goto <D.27031>; else goto <D.27032>;
                <D.27031>:
                if (__result == 0) goto <D.27033>; else goto <D.27034>;
                <D.27033>:
                D.27035 = &MEM[(void *)"verify-before-allocs" + 1B];
                D.27036 = *D.27035;
                D.27037 = (int) D.27036;
                D.27038 = __s2 + 1;
                D.27039 = *D.27038;
                D.27040 = (int) D.27039;
                __result = D.27037 - D.27040;
                if (__s2_len > 1) goto <D.27041>; else goto <D.27042>;
                <D.27041>:
                if (__result == 0) goto <D.27043>; else goto <D.27044>;
                <D.27043>:
                D.27045 = &MEM[(void *)"verify-before-allocs" + 2B];
                D.27046 = *D.27045;
                D.27047 = (int) D.27046;
                D.27048 = __s2 + 2;
                D.27049 = *D.27048;
                D.27050 = (int) D.27049;
                __result = D.27047 - D.27050;
                if (__s2_len > 2) goto <D.27051>; else goto <D.27052>;
                <D.27051>:
                if (__result == 0) goto <D.27053>; else goto <D.27054>;
                <D.27053>:
                D.27055 = &MEM[(void *)"verify-before-allocs" + 3B];
                D.27056 = *D.27055;
                D.27057 = (int) D.27056;
                D.27058 = __s2 + 3;
                D.27059 = *D.27058;
                D.27060 = (int) D.27059;
                __result = D.27057 - D.27060;
                <D.27054>:
                <D.27052>:
                <D.27044>:
                <D.27042>:
                <D.27034>:
                <D.27032>:
              }
              D.22326 = __result;
            }
            iftmp.429 = -D.22326;
            goto <D.27061>;
            <D.27025>:
            iftmp.429 = __builtin_strcmp (opt, "verify-before-allocs");
            <D.27061>:
            D.22327 = iftmp.429;
          }
          if (D.22327 == 0) goto <D.27062>; else goto <D.27063>;
          <D.27062>:
          verify_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.27064>;
          <D.27063>:
          D.27065 = monoeg_g_str_has_prefix (opt, "verify-before-allocs=");
          if (D.27065 != 0) goto <D.27066>; else goto <D.27067>;
          <D.27066>:
          {
            char * arg;

            D.27068 = __builtin_strchr (opt, 61);
            arg = D.27068 + 1;
            D.27069 = atoi (arg);
            verify_before_allocs.430 = (unsigned int) D.27069;
            verify_before_allocs = verify_before_allocs.430;
            has_per_allocation_action = 1;
          }
          goto <D.27071>;
          <D.27067>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27075 = "collect-before-allocs";
              D.27076 = MEM[(const unsigned char *)D.27075];
              D.27077 = (int) D.27076;
              D.27078 = *__s2;
              D.27079 = (int) D.27078;
              __result = D.27077 - D.27079;
              {
                if (__s2_len != 0) goto <D.27080>; else goto <D.27081>;
                <D.27080>:
                if (__result == 0) goto <D.27082>; else goto <D.27083>;
                <D.27082>:
                D.27084 = &MEM[(void *)"collect-before-allocs" + 1B];
                D.27085 = *D.27084;
                D.27086 = (int) D.27085;
                D.27087 = __s2 + 1;
                D.27088 = *D.27087;
                D.27089 = (int) D.27088;
                __result = D.27086 - D.27089;
                if (__s2_len > 1) goto <D.27090>; else goto <D.27091>;
                <D.27090>:
                if (__result == 0) goto <D.27092>; else goto <D.27093>;
                <D.27092>:
                D.27094 = &MEM[(void *)"collect-before-allocs" + 2B];
                D.27095 = *D.27094;
                D.27096 = (int) D.27095;
                D.27097 = __s2 + 2;
                D.27098 = *D.27097;
                D.27099 = (int) D.27098;
                __result = D.27096 - D.27099;
                if (__s2_len > 2) goto <D.27100>; else goto <D.27101>;
                <D.27100>:
                if (__result == 0) goto <D.27102>; else goto <D.27103>;
                <D.27102>:
                D.27104 = &MEM[(void *)"collect-before-allocs" + 3B];
                D.27105 = *D.27104;
                D.27106 = (int) D.27105;
                D.27107 = __s2 + 3;
                D.27108 = *D.27107;
                D.27109 = (int) D.27108;
                __result = D.27106 - D.27109;
                <D.27103>:
                <D.27101>:
                <D.27093>:
                <D.27091>:
                <D.27083>:
                <D.27081>:
              }
              D.22336 = __result;
            }
            iftmp.431 = -D.22336;
            goto <D.27110>;
            <D.27074>:
            iftmp.431 = __builtin_strcmp (opt, "collect-before-allocs");
            <D.27110>:
            D.22337 = iftmp.431;
          }
          if (D.22337 == 0) goto <D.27111>; else goto <D.27112>;
          <D.27111>:
          collect_before_allocs = 1;
          has_per_allocation_action = 1;
          goto <D.27113>;
          <D.27112>:
          D.27114 = monoeg_g_str_has_prefix (opt, "collect-before-allocs=");
          if (D.27114 != 0) goto <D.27115>; else goto <D.27116>;
          <D.27115>:
          {
            char * arg;

            D.27117 = __builtin_strchr (opt, 61);
            arg = D.27117 + 1;
            has_per_allocation_action = 1;
            D.27118 = atoi (arg);
            collect_before_allocs.432 = (unsigned int) D.27118;
            collect_before_allocs = collect_before_allocs.432;
          }
          goto <D.27120>;
          <D.27116>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27124 = "verify-before-collections";
              D.27125 = MEM[(const unsigned char *)D.27124];
              D.27126 = (int) D.27125;
              D.27127 = *__s2;
              D.27128 = (int) D.27127;
              __result = D.27126 - D.27128;
              {
                if (__s2_len != 0) goto <D.27129>; else goto <D.27130>;
                <D.27129>:
                if (__result == 0) goto <D.27131>; else goto <D.27132>;
                <D.27131>:
                D.27133 = &MEM[(void *)"verify-before-collections" + 1B];
                D.27134 = *D.27133;
                D.27135 = (int) D.27134;
                D.27136 = __s2 + 1;
                D.27137 = *D.27136;
                D.27138 = (int) D.27137;
                __result = D.27135 - D.27138;
                if (__s2_len > 1) goto <D.27139>; else goto <D.27140>;
                <D.27139>:
                if (__result == 0) goto <D.27141>; else goto <D.27142>;
                <D.27141>:
                D.27143 = &MEM[(void *)"verify-before-collections" + 2B];
                D.27144 = *D.27143;
                D.27145 = (int) D.27144;
                D.27146 = __s2 + 2;
                D.27147 = *D.27146;
                D.27148 = (int) D.27147;
                __result = D.27145 - D.27148;
                if (__s2_len > 2) goto <D.27149>; else goto <D.27150>;
                <D.27149>:
                if (__result == 0) goto <D.27151>; else goto <D.27152>;
                <D.27151>:
                D.27153 = &MEM[(void *)"verify-before-collections" + 3B];
                D.27154 = *D.27153;
                D.27155 = (int) D.27154;
                D.27156 = __s2 + 3;
                D.27157 = *D.27156;
                D.27158 = (int) D.27157;
                __result = D.27155 - D.27158;
                <D.27152>:
                <D.27150>:
                <D.27142>:
                <D.27140>:
                <D.27132>:
                <D.27130>:
              }
              D.22346 = __result;
            }
            iftmp.433 = -D.22346;
            goto <D.27159>;
            <D.27123>:
            iftmp.433 = __builtin_strcmp (opt, "verify-before-collections");
            <D.27159>:
            D.22347 = iftmp.433;
          }
          if (D.22347 == 0) goto <D.27160>; else goto <D.27161>;
          <D.27160>:
          whole_heap_check_before_collection = 1;
          goto <D.27162>;
          <D.27161>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27166 = "check-at-minor-collections";
              D.27167 = MEM[(const unsigned char *)D.27166];
              D.27168 = (int) D.27167;
              D.27169 = *__s2;
              D.27170 = (int) D.27169;
              __result = D.27168 - D.27170;
              {
                if (__s2_len != 0) goto <D.27171>; else goto <D.27172>;
                <D.27171>:
                if (__result == 0) goto <D.27173>; else goto <D.27174>;
                <D.27173>:
                D.27175 = &MEM[(void *)"check-at-minor-collections" + 1B];
                D.27176 = *D.27175;
                D.27177 = (int) D.27176;
                D.27178 = __s2 + 1;
                D.27179 = *D.27178;
                D.27180 = (int) D.27179;
                __result = D.27177 - D.27180;
                if (__s2_len > 1) goto <D.27181>; else goto <D.27182>;
                <D.27181>:
                if (__result == 0) goto <D.27183>; else goto <D.27184>;
                <D.27183>:
                D.27185 = &MEM[(void *)"check-at-minor-collections" + 2B];
                D.27186 = *D.27185;
                D.27187 = (int) D.27186;
                D.27188 = __s2 + 2;
                D.27189 = *D.27188;
                D.27190 = (int) D.27189;
                __result = D.27187 - D.27190;
                if (__s2_len > 2) goto <D.27191>; else goto <D.27192>;
                <D.27191>:
                if (__result == 0) goto <D.27193>; else goto <D.27194>;
                <D.27193>:
                D.27195 = &MEM[(void *)"check-at-minor-collections" + 3B];
                D.27196 = *D.27195;
                D.27197 = (int) D.27196;
                D.27198 = __s2 + 3;
                D.27199 = *D.27198;
                D.27200 = (int) D.27199;
                __result = D.27197 - D.27200;
                <D.27194>:
                <D.27192>:
                <D.27184>:
                <D.27182>:
                <D.27174>:
                <D.27172>:
              }
              D.22355 = __result;
            }
            iftmp.434 = -D.22355;
            goto <D.27201>;
            <D.27165>:
            iftmp.434 = __builtin_strcmp (opt, "check-at-minor-collections");
            <D.27201>:
            D.22356 = iftmp.434;
          }
          if (D.22356 == 0) goto <D.27202>; else goto <D.27203>;
          <D.27202>:
          consistency_check_at_minor_collection = 1;
          nursery_clear_policy = 0;
          goto <D.27204>;
          <D.27203>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27208 = "mod-union-consistency-check";
              D.27209 = MEM[(const unsigned char *)D.27208];
              D.27210 = (int) D.27209;
              D.27211 = *__s2;
              D.27212 = (int) D.27211;
              __result = D.27210 - D.27212;
              {
                if (__s2_len != 0) goto <D.27213>; else goto <D.27214>;
                <D.27213>:
                if (__result == 0) goto <D.27215>; else goto <D.27216>;
                <D.27215>:
                D.27217 = &MEM[(void *)"mod-union-consistency-check" + 1B];
                D.27218 = *D.27217;
                D.27219 = (int) D.27218;
                D.27220 = __s2 + 1;
                D.27221 = *D.27220;
                D.27222 = (int) D.27221;
                __result = D.27219 - D.27222;
                if (__s2_len > 1) goto <D.27223>; else goto <D.27224>;
                <D.27223>:
                if (__result == 0) goto <D.27225>; else goto <D.27226>;
                <D.27225>:
                D.27227 = &MEM[(void *)"mod-union-consistency-check" + 2B];
                D.27228 = *D.27227;
                D.27229 = (int) D.27228;
                D.27230 = __s2 + 2;
                D.27231 = *D.27230;
                D.27232 = (int) D.27231;
                __result = D.27229 - D.27232;
                if (__s2_len > 2) goto <D.27233>; else goto <D.27234>;
                <D.27233>:
                if (__result == 0) goto <D.27235>; else goto <D.27236>;
                <D.27235>:
                D.27237 = &MEM[(void *)"mod-union-consistency-check" + 3B];
                D.27238 = *D.27237;
                D.27239 = (int) D.27238;
                D.27240 = __s2 + 3;
                D.27241 = *D.27240;
                D.27242 = (int) D.27241;
                __result = D.27239 - D.27242;
                <D.27236>:
                <D.27234>:
                <D.27226>:
                <D.27224>:
                <D.27216>:
                <D.27214>:
              }
              D.22364 = __result;
            }
            iftmp.435 = -D.22364;
            goto <D.27243>;
            <D.27207>:
            iftmp.435 = __builtin_strcmp (opt, "mod-union-consistency-check");
            <D.27243>:
            D.22365 = iftmp.435;
          }
          if (D.22365 == 0) goto <D.27244>; else goto <D.27245>;
          <D.27244>:
          D.26689 = major_collector.is_concurrent;
          if (D.26689 == 0) goto <D.27246>; else goto <D.27247>;
          <D.27246>:
          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.22299>;
          <D.27247>:
          mod_union_consistency_check = 1;
          goto <D.27248>;
          <D.27245>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27252 = "check-mark-bits";
              D.27253 = MEM[(const unsigned char *)D.27252];
              D.27254 = (int) D.27253;
              D.27255 = *__s2;
              D.27256 = (int) D.27255;
              __result = D.27254 - D.27256;
              {
                if (__s2_len != 0) goto <D.27257>; else goto <D.27258>;
                <D.27257>:
                if (__result == 0) goto <D.27259>; else goto <D.27260>;
                <D.27259>:
                D.27261 = &MEM[(void *)"check-mark-bits" + 1B];
                D.27262 = *D.27261;
                D.27263 = (int) D.27262;
                D.27264 = __s2 + 1;
                D.27265 = *D.27264;
                D.27266 = (int) D.27265;
                __result = D.27263 - D.27266;
                if (__s2_len > 1) goto <D.27267>; else goto <D.27268>;
                <D.27267>:
                if (__result == 0) goto <D.27269>; else goto <D.27270>;
                <D.27269>:
                D.27271 = &MEM[(void *)"check-mark-bits" + 2B];
                D.27272 = *D.27271;
                D.27273 = (int) D.27272;
                D.27274 = __s2 + 2;
                D.27275 = *D.27274;
                D.27276 = (int) D.27275;
                __result = D.27273 - D.27276;
                if (__s2_len > 2) goto <D.27277>; else goto <D.27278>;
                <D.27277>:
                if (__result == 0) goto <D.27279>; else goto <D.27280>;
                <D.27279>:
                D.27281 = &MEM[(void *)"check-mark-bits" + 3B];
                D.27282 = *D.27281;
                D.27283 = (int) D.27282;
                D.27284 = __s2 + 3;
                D.27285 = *D.27284;
                D.27286 = (int) D.27285;
                __result = D.27283 - D.27286;
                <D.27280>:
                <D.27278>:
                <D.27270>:
                <D.27268>:
                <D.27260>:
                <D.27258>:
              }
              D.22373 = __result;
            }
            iftmp.436 = -D.22373;
            goto <D.27287>;
            <D.27251>:
            iftmp.436 = __builtin_strcmp (opt, "check-mark-bits");
            <D.27287>:
            D.22374 = iftmp.436;
          }
          if (D.22374 == 0) goto <D.27288>; else goto <D.27289>;
          <D.27288>:
          check_mark_bits_after_major_collection = 1;
          goto <D.27290>;
          <D.27289>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27294 = "check-nursery-pinned";
              D.27295 = MEM[(const unsigned char *)D.27294];
              D.27296 = (int) D.27295;
              D.27297 = *__s2;
              D.27298 = (int) D.27297;
              __result = D.27296 - D.27298;
              {
                if (__s2_len != 0) goto <D.27299>; else goto <D.27300>;
                <D.27299>:
                if (__result == 0) goto <D.27301>; else goto <D.27302>;
                <D.27301>:
                D.27303 = &MEM[(void *)"check-nursery-pinned" + 1B];
                D.27304 = *D.27303;
                D.27305 = (int) D.27304;
                D.27306 = __s2 + 1;
                D.27307 = *D.27306;
                D.27308 = (int) D.27307;
                __result = D.27305 - D.27308;
                if (__s2_len > 1) goto <D.27309>; else goto <D.27310>;
                <D.27309>:
                if (__result == 0) goto <D.27311>; else goto <D.27312>;
                <D.27311>:
                D.27313 = &MEM[(void *)"check-nursery-pinned" + 2B];
                D.27314 = *D.27313;
                D.27315 = (int) D.27314;
                D.27316 = __s2 + 2;
                D.27317 = *D.27316;
                D.27318 = (int) D.27317;
                __result = D.27315 - D.27318;
                if (__s2_len > 2) goto <D.27319>; else goto <D.27320>;
                <D.27319>:
                if (__result == 0) goto <D.27321>; else goto <D.27322>;
                <D.27321>:
                D.27323 = &MEM[(void *)"check-nursery-pinned" + 3B];
                D.27324 = *D.27323;
                D.27325 = (int) D.27324;
                D.27326 = __s2 + 3;
                D.27327 = *D.27326;
                D.27328 = (int) D.27327;
                __result = D.27325 - D.27328;
                <D.27322>:
                <D.27320>:
                <D.27312>:
                <D.27310>:
                <D.27302>:
                <D.27300>:
              }
              D.22382 = __result;
            }
            iftmp.437 = -D.22382;
            goto <D.27329>;
            <D.27293>:
            iftmp.437 = __builtin_strcmp (opt, "check-nursery-pinned");
            <D.27329>:
            D.22383 = iftmp.437;
          }
          if (D.22383 == 0) goto <D.27330>; else goto <D.27331>;
          <D.27330>:
          check_nursery_objects_pinned = 1;
          goto <D.27332>;
          <D.27331>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27336 = "xdomain-checks";
              D.27337 = MEM[(const unsigned char *)D.27336];
              D.27338 = (int) D.27337;
              D.27339 = *__s2;
              D.27340 = (int) D.27339;
              __result = D.27338 - D.27340;
              {
                if (__s2_len != 0) goto <D.27341>; else goto <D.27342>;
                <D.27341>:
                if (__result == 0) goto <D.27343>; else goto <D.27344>;
                <D.27343>:
                D.27345 = &MEM[(void *)"xdomain-checks" + 1B];
                D.27346 = *D.27345;
                D.27347 = (int) D.27346;
                D.27348 = __s2 + 1;
                D.27349 = *D.27348;
                D.27350 = (int) D.27349;
                __result = D.27347 - D.27350;
                if (__s2_len > 1) goto <D.27351>; else goto <D.27352>;
                <D.27351>:
                if (__result == 0) goto <D.27353>; else goto <D.27354>;
                <D.27353>:
                D.27355 = &MEM[(void *)"xdomain-checks" + 2B];
                D.27356 = *D.27355;
                D.27357 = (int) D.27356;
                D.27358 = __s2 + 2;
                D.27359 = *D.27358;
                D.27360 = (int) D.27359;
                __result = D.27357 - D.27360;
                if (__s2_len > 2) goto <D.27361>; else goto <D.27362>;
                <D.27361>:
                if (__result == 0) goto <D.27363>; else goto <D.27364>;
                <D.27363>:
                D.27365 = &MEM[(void *)"xdomain-checks" + 3B];
                D.27366 = *D.27365;
                D.27367 = (int) D.27366;
                D.27368 = __s2 + 3;
                D.27369 = *D.27368;
                D.27370 = (int) D.27369;
                __result = D.27367 - D.27370;
                <D.27364>:
                <D.27362>:
                <D.27354>:
                <D.27352>:
                <D.27344>:
                <D.27342>:
              }
              D.22391 = __result;
            }
            iftmp.438 = -D.22391;
            goto <D.27371>;
            <D.27335>:
            iftmp.438 = __builtin_strcmp (opt, "xdomain-checks");
            <D.27371>:
            D.22392 = iftmp.438;
          }
          if (D.22392 == 0) goto <D.27372>; else goto <D.27373>;
          <D.27372>:
          xdomain_checks = 1;
          goto <D.27374>;
          <D.27373>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27378 = "clear-at-gc";
              D.27379 = MEM[(const unsigned char *)D.27378];
              D.27380 = (int) D.27379;
              D.27381 = *__s2;
              D.27382 = (int) D.27381;
              __result = D.27380 - D.27382;
              {
                if (__s2_len != 0) goto <D.27383>; else goto <D.27384>;
                <D.27383>:
                if (__result == 0) goto <D.27385>; else goto <D.27386>;
                <D.27385>:
                D.27387 = &MEM[(void *)"clear-at-gc" + 1B];
                D.27388 = *D.27387;
                D.27389 = (int) D.27388;
                D.27390 = __s2 + 1;
                D.27391 = *D.27390;
                D.27392 = (int) D.27391;
                __result = D.27389 - D.27392;
                if (__s2_len > 1) goto <D.27393>; else goto <D.27394>;
                <D.27393>:
                if (__result == 0) goto <D.27395>; else goto <D.27396>;
                <D.27395>:
                D.27397 = &MEM[(void *)"clear-at-gc" + 2B];
                D.27398 = *D.27397;
                D.27399 = (int) D.27398;
                D.27400 = __s2 + 2;
                D.27401 = *D.27400;
                D.27402 = (int) D.27401;
                __result = D.27399 - D.27402;
                if (__s2_len > 2) goto <D.27403>; else goto <D.27404>;
                <D.27403>:
                if (__result == 0) goto <D.27405>; else goto <D.27406>;
                <D.27405>:
                D.27407 = &MEM[(void *)"clear-at-gc" + 3B];
                D.27408 = *D.27407;
                D.27409 = (int) D.27408;
                D.27410 = __s2 + 3;
                D.27411 = *D.27410;
                D.27412 = (int) D.27411;
                __result = D.27409 - D.27412;
                <D.27406>:
                <D.27404>:
                <D.27396>:
                <D.27394>:
                <D.27386>:
                <D.27384>:
              }
              D.22400 = __result;
            }
            iftmp.439 = -D.22400;
            goto <D.27413>;
            <D.27377>:
            iftmp.439 = __builtin_strcmp (opt, "clear-at-gc");
            <D.27413>:
            D.22401 = iftmp.439;
          }
          if (D.22401 == 0) goto <D.27414>; else goto <D.27415>;
          <D.27414>:
          nursery_clear_policy = 0;
          goto <D.27416>;
          <D.27415>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27420 = "clear-nursery-at-gc";
              D.27421 = MEM[(const unsigned char *)D.27420];
              D.27422 = (int) D.27421;
              D.27423 = *__s2;
              D.27424 = (int) D.27423;
              __result = D.27422 - D.27424;
              {
                if (__s2_len != 0) goto <D.27425>; else goto <D.27426>;
                <D.27425>:
                if (__result == 0) goto <D.27427>; else goto <D.27428>;
                <D.27427>:
                D.27429 = &MEM[(void *)"clear-nursery-at-gc" + 1B];
                D.27430 = *D.27429;
                D.27431 = (int) D.27430;
                D.27432 = __s2 + 1;
                D.27433 = *D.27432;
                D.27434 = (int) D.27433;
                __result = D.27431 - D.27434;
                if (__s2_len > 1) goto <D.27435>; else goto <D.27436>;
                <D.27435>:
                if (__result == 0) goto <D.27437>; else goto <D.27438>;
                <D.27437>:
                D.27439 = &MEM[(void *)"clear-nursery-at-gc" + 2B];
                D.27440 = *D.27439;
                D.27441 = (int) D.27440;
                D.27442 = __s2 + 2;
                D.27443 = *D.27442;
                D.27444 = (int) D.27443;
                __result = D.27441 - D.27444;
                if (__s2_len > 2) goto <D.27445>; else goto <D.27446>;
                <D.27445>:
                if (__result == 0) goto <D.27447>; else goto <D.27448>;
                <D.27447>:
                D.27449 = &MEM[(void *)"clear-nursery-at-gc" + 3B];
                D.27450 = *D.27449;
                D.27451 = (int) D.27450;
                D.27452 = __s2 + 3;
                D.27453 = *D.27452;
                D.27454 = (int) D.27453;
                __result = D.27451 - D.27454;
                <D.27448>:
                <D.27446>:
                <D.27438>:
                <D.27436>:
                <D.27428>:
                <D.27426>:
              }
              D.22409 = __result;
            }
            iftmp.440 = -D.22409;
            goto <D.27455>;
            <D.27419>:
            iftmp.440 = __builtin_strcmp (opt, "clear-nursery-at-gc");
            <D.27455>:
            D.22410 = iftmp.440;
          }
          if (D.22410 == 0) goto <D.27456>; else goto <D.27457>;
          <D.27456>:
          nursery_clear_policy = 0;
          goto <D.27458>;
          <D.27457>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27462 = "check-scan-starts";
              D.27463 = MEM[(const unsigned char *)D.27462];
              D.27464 = (int) D.27463;
              D.27465 = *__s2;
              D.27466 = (int) D.27465;
              __result = D.27464 - D.27466;
              {
                if (__s2_len != 0) goto <D.27467>; else goto <D.27468>;
                <D.27467>:
                if (__result == 0) goto <D.27469>; else goto <D.27470>;
                <D.27469>:
                D.27471 = &MEM[(void *)"check-scan-starts" + 1B];
                D.27472 = *D.27471;
                D.27473 = (int) D.27472;
                D.27474 = __s2 + 1;
                D.27475 = *D.27474;
                D.27476 = (int) D.27475;
                __result = D.27473 - D.27476;
                if (__s2_len > 1) goto <D.27477>; else goto <D.27478>;
                <D.27477>:
                if (__result == 0) goto <D.27479>; else goto <D.27480>;
                <D.27479>:
                D.27481 = &MEM[(void *)"check-scan-starts" + 2B];
                D.27482 = *D.27481;
                D.27483 = (int) D.27482;
                D.27484 = __s2 + 2;
                D.27485 = *D.27484;
                D.27486 = (int) D.27485;
                __result = D.27483 - D.27486;
                if (__s2_len > 2) goto <D.27487>; else goto <D.27488>;
                <D.27487>:
                if (__result == 0) goto <D.27489>; else goto <D.27490>;
                <D.27489>:
                D.27491 = &MEM[(void *)"check-scan-starts" + 3B];
                D.27492 = *D.27491;
                D.27493 = (int) D.27492;
                D.27494 = __s2 + 3;
                D.27495 = *D.27494;
                D.27496 = (int) D.27495;
                __result = D.27493 - D.27496;
                <D.27490>:
                <D.27488>:
                <D.27480>:
                <D.27478>:
                <D.27470>:
                <D.27468>:
              }
              D.22418 = __result;
            }
            iftmp.441 = -D.22418;
            goto <D.27497>;
            <D.27461>:
            iftmp.441 = __builtin_strcmp (opt, "check-scan-starts");
            <D.27497>:
            D.22419 = iftmp.441;
          }
          if (D.22419 == 0) goto <D.27498>; else goto <D.27499>;
          <D.27498>:
          do_scan_starts_check = 1;
          goto <D.27500>;
          <D.27499>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27504 = "verify-nursery-at-minor-gc";
              D.27505 = MEM[(const unsigned char *)D.27504];
              D.27506 = (int) D.27505;
              D.27507 = *__s2;
              D.27508 = (int) D.27507;
              __result = D.27506 - D.27508;
              {
                if (__s2_len != 0) goto <D.27509>; else goto <D.27510>;
                <D.27509>:
                if (__result == 0) goto <D.27511>; else goto <D.27512>;
                <D.27511>:
                D.27513 = &MEM[(void *)"verify-nursery-at-minor-gc" + 1B];
                D.27514 = *D.27513;
                D.27515 = (int) D.27514;
                D.27516 = __s2 + 1;
                D.27517 = *D.27516;
                D.27518 = (int) D.27517;
                __result = D.27515 - D.27518;
                if (__s2_len > 1) goto <D.27519>; else goto <D.27520>;
                <D.27519>:
                if (__result == 0) goto <D.27521>; else goto <D.27522>;
                <D.27521>:
                D.27523 = &MEM[(void *)"verify-nursery-at-minor-gc" + 2B];
                D.27524 = *D.27523;
                D.27525 = (int) D.27524;
                D.27526 = __s2 + 2;
                D.27527 = *D.27526;
                D.27528 = (int) D.27527;
                __result = D.27525 - D.27528;
                if (__s2_len > 2) goto <D.27529>; else goto <D.27530>;
                <D.27529>:
                if (__result == 0) goto <D.27531>; else goto <D.27532>;
                <D.27531>:
                D.27533 = &MEM[(void *)"verify-nursery-at-minor-gc" + 3B];
                D.27534 = *D.27533;
                D.27535 = (int) D.27534;
                D.27536 = __s2 + 3;
                D.27537 = *D.27536;
                D.27538 = (int) D.27537;
                __result = D.27535 - D.27538;
                <D.27532>:
                <D.27530>:
                <D.27522>:
                <D.27520>:
                <D.27512>:
                <D.27510>:
              }
              D.22427 = __result;
            }
            iftmp.442 = -D.22427;
            goto <D.27539>;
            <D.27503>:
            iftmp.442 = __builtin_strcmp (opt, "verify-nursery-at-minor-gc");
            <D.27539>:
            D.22428 = iftmp.442;
          }
          if (D.22428 == 0) goto <D.27540>; else goto <D.27541>;
          <D.27540>:
          do_verify_nursery = 1;
          goto <D.27542>;
          <D.27541>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27546 = "check-concurrent";
              D.27547 = MEM[(const unsigned char *)D.27546];
              D.27548 = (int) D.27547;
              D.27549 = *__s2;
              D.27550 = (int) D.27549;
              __result = D.27548 - D.27550;
              {
                if (__s2_len != 0) goto <D.27551>; else goto <D.27552>;
                <D.27551>:
                if (__result == 0) goto <D.27553>; else goto <D.27554>;
                <D.27553>:
                D.27555 = &MEM[(void *)"check-concurrent" + 1B];
                D.27556 = *D.27555;
                D.27557 = (int) D.27556;
                D.27558 = __s2 + 1;
                D.27559 = *D.27558;
                D.27560 = (int) D.27559;
                __result = D.27557 - D.27560;
                if (__s2_len > 1) goto <D.27561>; else goto <D.27562>;
                <D.27561>:
                if (__result == 0) goto <D.27563>; else goto <D.27564>;
                <D.27563>:
                D.27565 = &MEM[(void *)"check-concurrent" + 2B];
                D.27566 = *D.27565;
                D.27567 = (int) D.27566;
                D.27568 = __s2 + 2;
                D.27569 = *D.27568;
                D.27570 = (int) D.27569;
                __result = D.27567 - D.27570;
                if (__s2_len > 2) goto <D.27571>; else goto <D.27572>;
                <D.27571>:
                if (__result == 0) goto <D.27573>; else goto <D.27574>;
                <D.27573>:
                D.27575 = &MEM[(void *)"check-concurrent" + 3B];
                D.27576 = *D.27575;
                D.27577 = (int) D.27576;
                D.27578 = __s2 + 3;
                D.27579 = *D.27578;
                D.27580 = (int) D.27579;
                __result = D.27577 - D.27580;
                <D.27574>:
                <D.27572>:
                <D.27564>:
                <D.27562>:
                <D.27554>:
                <D.27552>:
              }
              D.22436 = __result;
            }
            iftmp.443 = -D.22436;
            goto <D.27581>;
            <D.27545>:
            iftmp.443 = __builtin_strcmp (opt, "check-concurrent");
            <D.27581>:
            D.22437 = iftmp.443;
          }
          if (D.22437 == 0) goto <D.27582>; else goto <D.27583>;
          <D.27582>:
          D.26689 = major_collector.is_concurrent;
          if (D.26689 == 0) goto <D.27584>; else goto <D.27585>;
          <D.27584>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "`check-concurrent` only works with concurrent major collectors.");
          // predicted unlikely by continue predictor.
          goto <D.22299>;
          <D.27585>:
          do_concurrent_checks = 1;
          goto <D.27586>;
          <D.27583>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27590 = "dump-nursery-at-minor-gc";
              D.27591 = MEM[(const unsigned char *)D.27590];
              D.27592 = (int) D.27591;
              D.27593 = *__s2;
              D.27594 = (int) D.27593;
              __result = D.27592 - D.27594;
              {
                if (__s2_len != 0) goto <D.27595>; else goto <D.27596>;
                <D.27595>:
                if (__result == 0) goto <D.27597>; else goto <D.27598>;
                <D.27597>:
                D.27599 = &MEM[(void *)"dump-nursery-at-minor-gc" + 1B];
                D.27600 = *D.27599;
                D.27601 = (int) D.27600;
                D.27602 = __s2 + 1;
                D.27603 = *D.27602;
                D.27604 = (int) D.27603;
                __result = D.27601 - D.27604;
                if (__s2_len > 1) goto <D.27605>; else goto <D.27606>;
                <D.27605>:
                if (__result == 0) goto <D.27607>; else goto <D.27608>;
                <D.27607>:
                D.27609 = &MEM[(void *)"dump-nursery-at-minor-gc" + 2B];
                D.27610 = *D.27609;
                D.27611 = (int) D.27610;
                D.27612 = __s2 + 2;
                D.27613 = *D.27612;
                D.27614 = (int) D.27613;
                __result = D.27611 - D.27614;
                if (__s2_len > 2) goto <D.27615>; else goto <D.27616>;
                <D.27615>:
                if (__result == 0) goto <D.27617>; else goto <D.27618>;
                <D.27617>:
                D.27619 = &MEM[(void *)"dump-nursery-at-minor-gc" + 3B];
                D.27620 = *D.27619;
                D.27621 = (int) D.27620;
                D.27622 = __s2 + 3;
                D.27623 = *D.27622;
                D.27624 = (int) D.27623;
                __result = D.27621 - D.27624;
                <D.27618>:
                <D.27616>:
                <D.27608>:
                <D.27606>:
                <D.27598>:
                <D.27596>:
              }
              D.22445 = __result;
            }
            iftmp.444 = -D.22445;
            goto <D.27625>;
            <D.27589>:
            iftmp.444 = __builtin_strcmp (opt, "dump-nursery-at-minor-gc");
            <D.27625>:
            D.22446 = iftmp.444;
          }
          if (D.22446 == 0) goto <D.27626>; else goto <D.27627>;
          <D.27626>:
          do_dump_nursery_content = 1;
          goto <D.27628>;
          <D.27627>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27632 = "no-managed-allocator";
              D.27633 = MEM[(const unsigned char *)D.27632];
              D.27634 = (int) D.27633;
              D.27635 = *__s2;
              D.27636 = (int) D.27635;
              __result = D.27634 - D.27636;
              {
                if (__s2_len != 0) goto <D.27637>; else goto <D.27638>;
                <D.27637>:
                if (__result == 0) goto <D.27639>; else goto <D.27640>;
                <D.27639>:
                D.27641 = &MEM[(void *)"no-managed-allocator" + 1B];
                D.27642 = *D.27641;
                D.27643 = (int) D.27642;
                D.27644 = __s2 + 1;
                D.27645 = *D.27644;
                D.27646 = (int) D.27645;
                __result = D.27643 - D.27646;
                if (__s2_len > 1) goto <D.27647>; else goto <D.27648>;
                <D.27647>:
                if (__result == 0) goto <D.27649>; else goto <D.27650>;
                <D.27649>:
                D.27651 = &MEM[(void *)"no-managed-allocator" + 2B];
                D.27652 = *D.27651;
                D.27653 = (int) D.27652;
                D.27654 = __s2 + 2;
                D.27655 = *D.27654;
                D.27656 = (int) D.27655;
                __result = D.27653 - D.27656;
                if (__s2_len > 2) goto <D.27657>; else goto <D.27658>;
                <D.27657>:
                if (__result == 0) goto <D.27659>; else goto <D.27660>;
                <D.27659>:
                D.27661 = &MEM[(void *)"no-managed-allocator" + 3B];
                D.27662 = *D.27661;
                D.27663 = (int) D.27662;
                D.27664 = __s2 + 3;
                D.27665 = *D.27664;
                D.27666 = (int) D.27665;
                __result = D.27663 - D.27666;
                <D.27660>:
                <D.27658>:
                <D.27650>:
                <D.27648>:
                <D.27640>:
                <D.27638>:
              }
              D.22454 = __result;
            }
            iftmp.445 = -D.22454;
            goto <D.27667>;
            <D.27631>:
            iftmp.445 = __builtin_strcmp (opt, "no-managed-allocator");
            <D.27667>:
            D.22455 = iftmp.445;
          }
          if (D.22455 == 0) goto <D.27668>; else goto <D.27669>;
          <D.27668>:
          sgen_set_use_managed_allocator (0);
          goto <D.27670>;
          <D.27669>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27674 = "disable-minor";
              D.27675 = MEM[(const unsigned char *)D.27674];
              D.27676 = (int) D.27675;
              D.27677 = *__s2;
              D.27678 = (int) D.27677;
              __result = D.27676 - D.27678;
              {
                if (__s2_len != 0) goto <D.27679>; else goto <D.27680>;
                <D.27679>:
                if (__result == 0) goto <D.27681>; else goto <D.27682>;
                <D.27681>:
                D.27683 = &MEM[(void *)"disable-minor" + 1B];
                D.27684 = *D.27683;
                D.27685 = (int) D.27684;
                D.27686 = __s2 + 1;
                D.27687 = *D.27686;
                D.27688 = (int) D.27687;
                __result = D.27685 - D.27688;
                if (__s2_len > 1) goto <D.27689>; else goto <D.27690>;
                <D.27689>:
                if (__result == 0) goto <D.27691>; else goto <D.27692>;
                <D.27691>:
                D.27693 = &MEM[(void *)"disable-minor" + 2B];
                D.27694 = *D.27693;
                D.27695 = (int) D.27694;
                D.27696 = __s2 + 2;
                D.27697 = *D.27696;
                D.27698 = (int) D.27697;
                __result = D.27695 - D.27698;
                if (__s2_len > 2) goto <D.27699>; else goto <D.27700>;
                <D.27699>:
                if (__result == 0) goto <D.27701>; else goto <D.27702>;
                <D.27701>:
                D.27703 = &MEM[(void *)"disable-minor" + 3B];
                D.27704 = *D.27703;
                D.27705 = (int) D.27704;
                D.27706 = __s2 + 3;
                D.27707 = *D.27706;
                D.27708 = (int) D.27707;
                __result = D.27705 - D.27708;
                <D.27702>:
                <D.27700>:
                <D.27692>:
                <D.27690>:
                <D.27682>:
                <D.27680>:
              }
              D.22463 = __result;
            }
            iftmp.446 = -D.22463;
            goto <D.27709>;
            <D.27673>:
            iftmp.446 = __builtin_strcmp (opt, "disable-minor");
            <D.27709>:
            D.22464 = iftmp.446;
          }
          if (D.22464 == 0) goto <D.27710>; else goto <D.27711>;
          <D.27710>:
          disable_minor_collections = 1;
          goto <D.27712>;
          <D.27711>:
          {
            size_t __s1_len;
            size_t __s2_len;

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

              __s2 = opt;
              D.27716 = "disable-major";
              D.27717 = MEM[(const unsigned char *)D.27716];
              D.27718 = (int) D.27717;
              D.27719 = *__s2;
              D.27720 = (int) D.27719;
              __result = D.27718 - D.27720;
              {
                if (__s2_len != 0) goto <D.27721>; else goto <D.27722>;
                <D.27721>:
                if (__result == 0) goto <D.27723>; else goto <D.27724>;
                <D.27723>:
                D.27725 = &MEM[(void *)"disable-major" + 1B];
                D.27726 = *D.27725;
                D.27727 = (int) D.27726;
                D.27728 = __s2 + 1;
                D.27729 = *D.27728;
                D.27730 = (int) D.27729;
                __result = D.27727 - D.27730;
                if (__s2_len > 1) goto <D.27731>; else goto <D.27732>;
                <D.27731>:
                if (__result == 0) goto <D.27733>; else goto <D.27734>;
                <D.27733>:
                D.27735 = &MEM[(void *)"disable-major" + 2B];
                D.27736 = *D.27735;
                D.27737 = (int) D.27736;
                D.27738 = __s2 + 2;
                D.27739 = *D.27738;
                D.27740 = (int) D.27739;
                __result = D.27737 - D.27740;
                if (__s2_len > 2) goto <D.27741>; else goto <D.27742>;
                <D.27741>:
                if (__result == 0) goto <D.27743>; else goto <D.27744>;
                <D.27743>:
                D.27745 = &MEM[(void *)"disable-major" + 3B];
                D.27746 = *D.27745;
                D.27747 = (int) D.27746;
                D.27748 = __s2 + 3;
                D.27749 = *D.27748;
                D.27750 = (int) D.27749;
                __result = D.27747 - D.27750;
                <D.27744>:
                <D.27742>:
                <D.27734>:
                <D.27732>:
                <D.27724>:
                <D.27722>:
              }
              D.22472 = __result;
            }
            iftmp.447 = -D.22472;
            goto <D.27751>;
            <D.27715>:
            iftmp.447 = __builtin_strcmp (opt, "disable-major");
            <D.27751>:
            D.22473 = iftmp.447;
          }
          if (D.22473 == 0) goto <D.27752>; else goto <D.27753>;
          <D.27752>:
          disable_major_collections = 1;
          goto <D.27754>;
          <D.27753>:
          D.27755 = monoeg_g_str_has_prefix (opt, "heap-dump=");
          if (D.27755 != 0) goto <D.27756>; else goto <D.27757>;
          <D.27756>:
          {
            char * filename;

            D.27758 = __builtin_strchr (opt, 61);
            filename = D.27758 + 1;
            nursery_clear_policy = 0;
            heap_dump_file.448 = fopen (filename, "w");
            heap_dump_file = heap_dump_file.448;
            heap_dump_file.449 = heap_dump_file;
            if (heap_dump_file.449 != 0B) goto <D.27761>; else goto <D.27762>;
            <D.27761>:
            heap_dump_file.449 = heap_dump_file;
            fprintf (heap_dump_file.449, "<sgen-dump>\n");
            do_pin_stats = 1;
            <D.27762>:
          }
          goto <D.27763>;
          <D.27757>:
          sgen_env_var_error ("MONO_GC_DEBUG", "Ignoring.", "Unknown option `%s`.", opt);
          if (usage_printed != 0) goto <D.27764>; else goto <D.27765>;
          <D.27764>:
          // predicted unlikely by continue predictor.
          goto <D.22299>;
          <D.27765>:
          stderr.397 = stderr;
          fprintf (stderr.397, "\n%s must be of the format [<l>[:<filename>]|<option>]+ where <l> is a debug level 0-9.\n", "MONO_GC_DEBUG");
          stderr.397 = stderr;
          fprintf (stderr.397, "Valid <option>s are:\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  collect-before-allocs[=<n>]\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  verify-before-allocs[=<n>]\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  check-at-minor-collections\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  check-mark-bits\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  check-nursery-pinned\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  verify-before-collections\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  verify-nursery-at-minor-gc\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  dump-nursery-at-minor-gc\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  disable-minor\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  disable-major\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  xdomain-checks\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  check-concurrent\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  clear-at-gc\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  clear-nursery-at-gc\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  check-scan-starts\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  no-managed-allocator\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  print-allowance\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  print-pinning\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "  heap-dump=<filename>\n");
          stderr.397 = stderr;
          fprintf (stderr.397, "\n");
          usage_printed = 1;
          <D.27763>:
          <D.27754>:
          <D.27712>:
          <D.27670>:
          <D.27628>:
          <D.27586>:
          <D.27542>:
          <D.27500>:
          <D.27458>:
          <D.27416>:
          <D.27374>:
          <D.27332>:
          <D.27290>:
          <D.27248>:
          <D.27204>:
          <D.27162>:
          <D.27120>:
          <D.27113>:
          <D.27071>:
          <D.27064>:
          <D.27022>:
          <D.26980>:
          <D.26938>:
        }
        <D.22299>:
        ptr = ptr + 8;
        <D.22476>:
        if (ptr != 0B) goto <D.27766>; else goto <D.22477>;
        <D.27766>:
        D.26138 = *ptr;
        if (D.26138 != 0B) goto <D.22475>; else goto <D.22477>;
        <D.22477>:
        monoeg_g_strfreev (opts);
      }
      <D.26893>:
      D.26444 = major_collector.is_parallel;
      if (D.26444 != 0) goto <D.27767>; else goto <D.27768>;
      <D.27767>:
      heap_dump_file.449 = heap_dump_file;
      if (heap_dump_file.449 != 0B) goto <D.27769>; else goto <D.27770>;
      <D.27769>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "Cannot do `heap-dump` with the parallel collector.");
      heap_dump_file.449 = heap_dump_file;
      fclose (heap_dump_file.449);
      heap_dump_file = 0B;
      <D.27770>:
      do_pin_stats.450 = do_pin_stats;
      if (do_pin_stats.450 != 0) goto <D.27772>; else goto <D.27773>;
      <D.27772>:
      sgen_env_var_error ("MONO_GC_DEBUG", "Disabling.", "`print-pinning` is not supported with the parallel collector.");
      do_pin_stats = 0;
      <D.27773>:
      <D.27768>:
      D.27774 = major_collector.post_param_init;
      if (D.27774 != 0B) goto <D.27775>; else goto <D.27776>;
      <D.27775>:
      D.27774 = major_collector.post_param_init;
      D.27774 (&major_collector);
      <D.27776>:
      soft_limit.408 = soft_limit;
      sgen_memgov_init (max_heap, soft_limit.408, debug_print_allowance, allowance_ratio, save_target);
      memset (&remset, 0, 96);
      sgen_card_table_init (&remset);
      gc_initialized = 1;
    }
  finally
    {
      cb = {CLOBBER};
      soft_limit = {CLOBBER};
      dummy = {CLOBBER};
    }
}


is_critical_method (struct MonoMethod * method)
{
  gboolean D.27787;
  int iftmp.451;
  int D.27792;
  int D.27794;

  D.27792 = mono_runtime_is_critical_method (method);
  if (D.27792 != 0) goto <D.27789>; else goto <D.27793>;
  <D.27793>:
  D.27794 = sgen_is_critical_method (method);
  if (D.27794 != 0) goto <D.27789>; else goto <D.27790>;
  <D.27789>:
  iftmp.451 = 1;
  goto <D.27791>;
  <D.27790>:
  iftmp.451 = 0;
  <D.27791>:
  D.27787 = iftmp.451;
  return D.27787;
}


sgen_thread_attach (struct SgenThreadInfo * info)
{
  void * (*<T2b36>) (void) D.27796;
  void * D.27799;
  void * D.27802;

  pthread_mutex_lock (&gc_mutex);
  init_stats ();
  sgen_gc_unlock ();
  D.27796 = gc_callbacks.thread_attach_func;
  if (D.27796 != 0B) goto <D.27797>; else goto <D.27798>;
  <D.27797>:
  D.27799 = info->runtime_data;
  if (D.27799 == 0B) goto <D.27800>; else goto <D.27801>;
  <D.27800>:
  D.27796 = gc_callbacks.thread_attach_func;
  D.27802 = D.27796 ();
  info->runtime_data = D.27802;
  <D.27801>:
  <D.27798>:
}


sgen_thread_unregister (struct SgenThreadInfo * p)
{
  struct FILE * gc_debug_file.452;
  long unsigned int D.27806;
  void * D.27807;
  void (*<T124a>) (void *) D.27808;
  void * D.27811;

  if (0 != 0) goto <D.27803>; else goto <D.27804>;
  <D.27803>:
  gc_debug_file.452 = gc_debug_file;
  D.27806 = MEM[(struct MonoThreadInfo *)p].node.key;
  D.27807 = (void *) D.27806;
  fprintf (gc_debug_file.452, "unregister thread %p (%p)\n", p, D.27807);
  gc_debug_file.452 = gc_debug_file;
  fflush (gc_debug_file.452);
  <D.27804>:
  D.27808 = gc_callbacks.thread_detach_func;
  if (D.27808 != 0B) goto <D.27809>; else goto <D.27810>;
  <D.27809>:
  D.27808 = gc_callbacks.thread_detach_func;
  D.27811 = p->runtime_data;
  D.27808 (D.27811);
  p->runtime_data = 0B;
  <D.27810>:
}


sgen_thread_detach (struct SgenThreadInfo * p)
{
  struct MonoDomain * D.27812;
  struct MonoThread * D.27815;

  D.27812 = mono_domain_get ();
  if (D.27812 != 0B) goto <D.27813>; else goto <D.27814>;
  <D.27813>:
  D.27815 = mono_thread_current ();
  mono_thread_detach (D.27815);
  <D.27814>:
}


sgen_thread_register (struct SgenThreadInfo * info, void * addr)
{
  void *[32] * D.27816;
  long unsigned int D.27817;
  void * sstart.453;
  long unsigned int size.454;
  void * D.27820;
  void * stack_end.455;
  struct FILE * gc_debug_file.456;
  long unsigned int D.27825;
  void * D.27826;
  void * (*<T2b36>) (void) D.27827;
  void * D.27830;
  void * D.27831;

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

    try
      {
        D.27817 = pthread_self ();
        pthread_getattr_np (D.27817, &attr);
        pthread_attr_getstack (&attr, &sstart, &size);
        sstart.453 = sstart;
        info->stack_start_limit = sstart.453;
        sstart.453 = sstart;
        size.454 = size;
        D.27820 = sstart.453 + size.454;
        info->stack_end = D.27820;
        pthread_attr_destroy (&attr);
      }
    finally
      {
        size = {CLOBBER};
        sstart = {CLOBBER};
        attr = {CLOBBER};
      }
  }
  stack_end.455 = info->stack_end;
  stack_end = stack_end.455;
  if (0 != 0) goto <D.27822>; else goto <D.27823>;
  <D.27822>:
  gc_debug_file.456 = gc_debug_file;
  D.27825 = MEM[(struct MonoThreadInfo *)info].node.key;
  D.27826 = (void *) D.27825;
  stack_end.455 = info->stack_end;
  fprintf (gc_debug_file.456, "registered thread %p (%p) stack end %p\n", info, D.27826, stack_end.455);
  gc_debug_file.456 = gc_debug_file;
  fflush (gc_debug_file.456);
  <D.27823>:
  D.27827 = gc_callbacks.thread_attach_func;
  if (D.27827 != 0B) goto <D.27828>; else goto <D.27829>;
  <D.27828>:
  D.27827 = gc_callbacks.thread_attach_func;
  D.27830 = D.27827 ();
  info->runtime_data = D.27830;
  <D.27829>:
  D.27831 = info;
  return D.27831;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.27833;
  unsigned int comp.457;
  unsigned int exch.458;
  unsigned int D.27836;

  comp.457 = (unsigned int) comp;
  exch.458 = (unsigned int) exch;
  D.27836 = __sync_val_compare_and_swap_4 (dest, comp.457, exch.458);
  D.27833 = (gint32) D.27836;
  return D.27833;
}


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.27838;
  void (*<Tbf>) (void *) destructor.459;
  int D.27840;
  _Bool D.27841;

  destructor.459 = (void (*<Tbf>) (void *)) destructor;
  D.27840 = pthread_key_create (key, destructor.459);
  D.27841 = D.27840 == 0;
  D.27838 = (int) D.27841;
  return D.27838;
}


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

  inited.460 = inited;
  if (inited.460 != 0) goto <D.27844>; else goto <D.27845>;
  <D.27844>:
  return;
  <D.27845>:
  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.27849;

  if (str != 0B) goto <D.27847>; else goto <D.27848>;
  <D.27847>:
  D.27849 = __strdup (str);
  return D.27849;
  <D.27848>:
  D.27849 = 0B;
  return D.27849;
}


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

  try
    {
      val = strtod (opt, &endptr);
      endptr.461 = endptr;
      if (endptr.461 == opt) goto <D.27852>; else goto <D.27853>;
      <D.27852>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be a number.", opt_name);
      D.27854 = 0;
      return D.27854;
      <D.27853>:
      if (val < min) goto <D.27855>; else goto <D.27857>;
      <D.27857>:
      if (val > max) goto <D.27855>; else goto <D.27856>;
      <D.27855>:
      sgen_env_var_error (env_var, "Using default value.", "`%s` must be between %.2f - %.2f.", opt_name, min, max);
      D.27854 = 0;
      return D.27854;
      <D.27856>:
      *result = val;
      D.27854 = 1;
      return D.27854;
    }
  finally
    {
      endptr = {CLOBBER};
    }
}


alloc_nursery ()
{
  struct GCMemSection * nursery_section.462;
  int gc_debug_level.463;
  _Bool D.27864;
  long int D.27865;
  long int D.27866;
  struct FILE * gc_debug_file.464;
  int sgen_nursery_size.465;
  long unsigned int D.27871;
  long unsigned int D.27872;
  int D.27873;
  _Bool D.27874;
  long int D.27875;
  long int D.27876;
  void * (*<T2d68>) (mword, mword, int) D.27879;
  int sgen_nursery_bits.466;
  long unsigned int data.467;
  sizetype D.27882;
  char * D.27883;
  long unsigned int D.27884;
  sizetype D.27887;
  char * D.27888;
  long int D.27889;
  long unsigned int D.27890;
  char * D.27891;
  int D.27892;
  long unsigned int D.27893;
  long unsigned int D.27894;
  void * D.27895;
  unsigned int scan_starts.468;
  struct GCMemSection * section;
  char * data;
  int scan_starts;
  int alloc_size;

  nursery_section.462 = nursery_section;
  if (nursery_section.462 != 0B) goto <D.27861>; else goto <D.27862>;
  <D.27861>:
  return;
  <D.27862>:
  gc_debug_level.463 = gc_debug_level;
  D.27864 = gc_debug_level.463 > 1;
  D.27865 = (long int) D.27864;
  D.27866 = __builtin_expect (D.27865, 0);
  if (D.27866 != 0) goto <D.27867>; else goto <D.27868>;
  <D.27867>:
  gc_debug_file.464 = gc_debug_file;
  sgen_nursery_size.465 = sgen_nursery_size;
  D.27871 = (long unsigned int) sgen_nursery_size.465;
  fprintf (gc_debug_file.464, "Allocating nursery size: %lu\n", D.27871);
  gc_debug_file.464 = gc_debug_file;
  fflush (gc_debug_file.464);
  <D.27868>:
  section = sgen_alloc_internal (2);
  alloc_size = sgen_nursery_size;
  D.27872 = (long unsigned int) alloc_size;
  D.27873 = sgen_memgov_try_alloc_space (D.27872, 0);
  D.27874 = D.27873 == 0;
  D.27875 = (long int) D.27874;
  D.27876 = __builtin_expect (D.27875, 0);
  if (D.27876 != 0) goto <D.27877>; else goto <D.27878>;
  <D.27877>:
  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.27878>:
  D.27879 = major_collector.alloc_heap;
  D.27872 = (long unsigned int) alloc_size;
  D.27872 = (long unsigned int) alloc_size;
  sgen_nursery_bits.466 = sgen_nursery_bits;
  data = D.27879 (D.27872, D.27872, sgen_nursery_bits.466);
  data.467 = (long unsigned int) data;
  sgen_nursery_size.465 = sgen_nursery_size;
  D.27882 = (sizetype) sgen_nursery_size.465;
  D.27883 = data + D.27882;
  D.27884 = (long unsigned int) D.27883;
  sgen_update_heap_boundaries (data.467, D.27884);
  if (0 != 0) goto <D.27885>; else goto <D.27886>;
  <D.27885>:
  gc_debug_file.464 = gc_debug_file;
  D.27887 = (sizetype) alloc_size;
  D.27888 = data + D.27887;
  sgen_nursery_size.465 = sgen_nursery_size;
  D.27871 = (long unsigned int) sgen_nursery_size.465;
  D.27889 = mono_gc_get_heap_size ();
  D.27890 = (long unsigned int) D.27889;
  fprintf (gc_debug_file.464, "Expanding nursery size (%p-%p): %lu, total: %lu\n", data, D.27888, D.27871, D.27890);
  gc_debug_file.464 = gc_debug_file;
  fflush (gc_debug_file.464);
  <D.27886>:
  section->next_data = data;
  D.27891 = section->next_data;
  section->data = D.27891;
  D.27872 = (long unsigned int) alloc_size;
  section->size = D.27872;
  sgen_nursery_size.465 = sgen_nursery_size;
  D.27882 = (sizetype) sgen_nursery_size.465;
  D.27883 = data + D.27882;
  section->end_data = D.27883;
  D.27892 = alloc_size + 8191;
  scan_starts = D.27892 / 8192;
  D.27893 = (long unsigned int) scan_starts;
  D.27894 = D.27893 * 8;
  D.27895 = sgen_alloc_internal_dynamic (D.27894, 3, 1);
  section->scan_starts = D.27895;
  scan_starts.468 = (unsigned int) scan_starts;
  section->num_scan_start = scan_starts.468;
  nursery_section = section;
  sgen_nursery_size.465 = sgen_nursery_size;
  D.27882 = (sizetype) sgen_nursery_size.465;
  D.27883 = data + D.27882;
  sgen_nursery_allocator_set_nursery_bounds (data, D.27883);
}


atoi (const char * __nptr)
{
  int D.27898;
  long int D.27899;

  D.27899 = strtol (__nptr, 0B, 10);
  D.27898 = (int) D.27899;
  return D.27898;
}


mono_gc_get_gc_name ()
{
  const char * D.27901;

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


sgen_is_critical_method (struct MonoMethod * method)
{
  gboolean D.27903;
  int iftmp.469;
  struct MonoMethod * write_barrier_method.470;
  int D.27910;

  write_barrier_method.470 = write_barrier_method;
  if (method == write_barrier_method.470) goto <D.27905>; else goto <D.27909>;
  <D.27909>:
  D.27910 = sgen_is_managed_allocator (method);
  if (D.27910 != 0) goto <D.27905>; else goto <D.27906>;
  <D.27905>:
  iftmp.469 = 1;
  goto <D.27907>;
  <D.27906>:
  iftmp.469 = 0;
  <D.27907>:
  D.27903 = iftmp.469;
  return D.27903;
}


sgen_has_critical_method ()
{
  gboolean D.27912;
  int iftmp.471;
  struct MonoMethod * write_barrier_method.472;
  int D.27919;

  write_barrier_method.472 = write_barrier_method;
  if (write_barrier_method.472 != 0B) goto <D.27914>; else goto <D.27918>;
  <D.27918>:
  D.27919 = sgen_has_managed_allocator ();
  if (D.27919 != 0) goto <D.27914>; else goto <D.27915>;
  <D.27914>:
  iftmp.471 = 1;
  goto <D.27916>;
  <D.27915>:
  iftmp.471 = 0;
  <D.27916>:
  D.27912 = iftmp.471;
  return D.27912;
}


mono_gc_get_write_barrier ()
{
  _Bool D.27921;
  long int D.27922;
  long int D.27923;
  struct MonoMethod * write_barrier_method.473;
  struct MonoMethod * D.27929;
  struct MonoImage * D.27930;
  struct MonoClass * D.27931;
  struct MonoType * D.27932;
  struct MonoClass * D.27933;
  struct MonoType * D.27934;
  struct MonoClass * D.27935;
  guint8 * sgen_cardtable.474;
  int D.27937;
  unsigned int D.27940;
  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__("lis	%0,stack_end@tprel@ha
addi	%0,%0, stack_end@tprel@l
" : "=r" stack_end_offset);
      D.27921 = stack_end_offset == -1;
      D.27922 = (long int) D.27921;
      D.27923 = __builtin_expect (D.27922, 0);
      if (D.27923 != 0) goto <D.27924>; else goto <D.27925>;
      <D.27924>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5450, "stack_end_offset != -1");
      <D.27925>:
      write_barrier_method.473 = write_barrier_method;
      if (write_barrier_method.473 != 0B) goto <D.27927>; else goto <D.27928>;
      <D.27927>:
      D.27929 = write_barrier_method;
      return D.27929;
      <D.27928>:
      D.27930 = mono_defaults.corlib;
      sig = mono_metadata_signature_alloc (D.27930, 1);
      D.27931 = mono_defaults.void_class;
      D.27932 = &D.27931->byval_arg;
      sig->ret = D.27932;
      D.27933 = mono_defaults.int_class;
      D.27934 = &D.27933->byval_arg;
      sig->params[0] = D.27934;
      D.27935 = mono_defaults.object_class;
      mb = mono_mb_new (D.27935, "wbarrier", 24);
      emit_nursery_check (mb, &nursery_check_labels);
      sgen_cardtable.474 = sgen_cardtable;
      mono_mb_emit_ptr (mb, sgen_cardtable.474);
      mono_mb_emit_ldarg (mb, 0);
      mono_mb_emit_icon (mb, 9);
      mono_mb_emit_byte (mb, 100);
      mono_mb_emit_ptr (mb, 8388607B);
      mono_mb_emit_byte (mb, 95);
      mono_mb_emit_byte (mb, 88);
      mono_mb_emit_icon (mb, 1);
      mono_mb_emit_byte (mb, 82);
      i = 0;
      goto <D.22502>;
      <D.22501>:
      D.27937 = nursery_check_labels[i];
      if (D.27937 != 0) goto <D.27938>; else goto <D.27939>;
      <D.27938>:
      D.27937 = nursery_check_labels[i];
      D.27940 = (unsigned int) D.27937;
      mono_mb_patch_branch (mb, D.27940);
      <D.27939>:
      i = i + 1;
      <D.22502>:
      if (i <= 2) goto <D.22501>; else goto <D.22503>;
      <D.22503>:
      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.473 = write_barrier_method;
      if (write_barrier_method.473 != 0B) goto <D.27941>; else goto <D.27942>;
      <D.27941>:
      mono_free_method (res);
      goto <D.27943>;
      <D.27942>:
      mono_memory_barrier ();
      write_barrier_method = res;
      <D.27943>:
      sgen_gc_unlock ();
      D.27929 = write_barrier_method;
      return D.27929;
    }
  finally
    {
      nursery_check_labels = {CLOBBER};
    }
}


emit_nursery_check (struct MonoMethodBuilder * mb, int * nursery_check_return_labels)
{
  int sgen_nursery_bits.475;
  char * D.27947;
  long unsigned int D.27948;
  long unsigned int D.27949;
  int D.27950;
  unsigned int D.27951;
  int D.27952;
  int D.27953;
  char * D.27956;
  long unsigned int D.27957;
  long unsigned int D.27958;
  int D.27959;
  int * D.27960;
  unsigned int D.27961;
  int D.27962;

  memset (nursery_check_return_labels, 0, 12);
  mono_mb_emit_ldarg (mb, 0);
  sgen_nursery_bits.475 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.475);
  mono_mb_emit_byte (mb, 100);
  D.27947 = sgen_get_nursery_start ();
  D.27948 = (long unsigned int) D.27947;
  sgen_nursery_bits.475 = sgen_nursery_bits;
  D.27949 = D.27948 >> sgen_nursery_bits.475;
  D.27950 = (int) D.27949;
  mono_mb_emit_icon (mb, D.27950);
  D.27951 = mono_mb_emit_branch (mb, 59);
  D.27952 = (int) D.27951;
  *nursery_check_return_labels = D.27952;
  D.27953 = major_collector.is_concurrent;
  if (D.27953 == 0) goto <D.27954>; else goto <D.27955>;
  <D.27954>:
  mono_mb_emit_ldarg (mb, 0);
  mono_mb_emit_byte (mb, 77);
  sgen_nursery_bits.475 = sgen_nursery_bits;
  mono_mb_emit_icon (mb, sgen_nursery_bits.475);
  mono_mb_emit_byte (mb, 100);
  D.27956 = sgen_get_nursery_start ();
  D.27957 = (long unsigned int) D.27956;
  sgen_nursery_bits.475 = sgen_nursery_bits;
  D.27958 = D.27957 >> sgen_nursery_bits.475;
  D.27959 = (int) D.27958;
  mono_mb_emit_icon (mb, D.27959);
  D.27960 = nursery_check_return_labels + 4;
  D.27961 = mono_mb_emit_branch (mb, 64);
  D.27962 = (int) D.27961;
  *D.27960 = D.27962;
  <D.27955>:
}


mono_gc_get_description ()
{
  char * D.27963;

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


mono_gc_set_desktop_mode ()
{

}


mono_gc_is_moving ()
{
  gboolean D.27965;

  D.27965 = 1;
  return D.27965;
}


mono_gc_is_disabled ()
{
  gboolean D.27967;

  D.27967 = 0;
  return D.27967;
}


sgen_get_nursery_clear_policy ()
{
  NurseryClearPolicy D.27969;

  D.27969 = nursery_clear_policy;
  return D.27969;
}


sgen_get_array_fill_vtable ()
{
  struct MonoVTable * array_fill_vtable.476;
  _Bool D.27974;
  long int D.27975;
  long int D.27976;
  struct MonoClass * D.27979;
  void * D.27980;
  struct MonoVTable * D.27981;

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

    try
      {
        domain = mono_get_root_domain ();
        D.27974 = domain == 0B;
        D.27975 = (long int) D.27974;
        D.27976 = __builtin_expect (D.27975, 0);
        if (D.27976 != 0) goto <D.27977>; else goto <D.27978>;
        <D.27977>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-gc.c", 5574, "domain");
        <D.27978>:
        D.27979 = mono_defaults.byte_class;
        klass.element_class = D.27979;
        klass.rank = 1;
        klass.instance_size = 32;
        klass.sizes.element_size = 1;
        klass.name = "array_filler_type";
        vtable.klass = &klass;
        bmap = 0;
        D.27980 = mono_gc_make_descr_for_array (1, &bmap, 0, 1);
        vtable.gc_descr = D.27980;
        vtable.rank = 1;
        array_fill_vtable = &vtable;
      }
    finally
      {
        bmap = {CLOBBER};
      }
  }
  <D.27973>:
  D.27981 = array_fill_vtable;
  return D.27981;
}


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


sgen_major_collector_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  void (*<T2d90>) (void (*sgen_cardtable_block_callback) (mword, mword)) D.27985;

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


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

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


sgen_get_major_collector ()
{
  struct SgenMajorCollector * D.27987;

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


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

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


mono_gc_get_vtable_bits (struct MonoClass * class)
{
  int D.27991;
  int D.27994;
  guint D.27997;

  D.27991 = sgen_need_bridge_processing ();
  if (D.27991 != 0) goto <D.27992>; else goto <D.27993>;
  <D.27992>:
  D.27994 = sgen_is_bridge_class (class);
  if (D.27994 != 0) goto <D.27995>; else goto <D.27996>;
  <D.27995>:
  D.27997 = 1;
  return D.27997;
  <D.27996>:
  <D.27993>:
  D.27997 = 0;
  return D.27997;
}


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

  moved_objects_idx.477 = moved_objects_idx;
  if (moved_objects_idx.477 != 0) goto <D.28000>; else goto <D.28001>;
  <D.28000>:
  moved_objects_idx.477 = moved_objects_idx;
  mono_profiler_gc_moves (&moved_objects, moved_objects_idx.477);
  moved_objects_idx = 0;
  <D.28001>:
}


