__attribute__((visibility ("hidden")))
sgen_simple_nursery_init (struct SgenMinorCollector * collector)
{
  collector->is_split = 0;
  collector->alloc_for_promotion = alloc_for_promotion;
  collector->par_alloc_for_promotion = par_alloc_for_promotion;
  collector->prepare_to_space = prepare_to_space;
  collector->clear_fragments = clear_fragments;
  collector->build_fragments_get_exclude_head = build_fragments_get_exclude_head;
  collector->build_fragments_release_exclude_head = build_fragments_release_exclude_head;
  collector->build_fragments_finish = build_fragments_finish;
  collector->init_nursery = init_nursery;
  collector->serial_ops.copy_or_mark_object = simple_nursery_serial_copy_object;
  collector->parallel_ops.copy_or_mark_object = simple_nursery_parallel_copy_object;
  collector->parallel_ops.scan_object = simple_nursery_parallel_scan_object;
  collector->parallel_ops.scan_vtype = simple_nursery_parallel_scan_vtype;
  collector->serial_ops.scan_object = simple_nursery_serial_scan_object;
  collector->serial_ops.scan_vtype = simple_nursery_serial_scan_vtype;
}


simple_nursery_serial_scan_vtype (char * start, mword desc, struct SgenGrayQueue * queue)
{
  long unsigned int D.18575;
  long unsigned int D.18576;
  long unsigned int D.18579;
  long unsigned int D.18580;
  long unsigned int D.18581;
  long unsigned int D.18582;
  long unsigned int D.18583;
  long unsigned int D.18584;
  void * D.18589;
  struct FILE * gc_debug_file.0;
  long unsigned int D.18599;
  long unsigned int D.18600;
  int D.18601;
  void * D.18606;
  long unsigned int D.18609;
  long unsigned int D.18610;
  int D.18611;
  long unsigned int D.18618;
  long unsigned int D.18621;
  int D.18622;
  int D.18623;
  unsigned int D.18626;
  unsigned int el_size.1;
  unsigned int D.18628;
  sizetype D.18629;
  void * D.18634;
  int D.18640;
  int D.18641;
  long unsigned int D.18642;
  long unsigned int D.18643;
  long unsigned int D.18644;
  long unsigned int D.18645;
  void * * D.18646;
  void * D.18651;
  sizetype D.18654;
  long unsigned int D.18658;
  void * D.18665;
  long unsigned int D.18668;
  void * D.18675;
  long unsigned int D.18678;
  unsigned int D.18679;
  unsigned int D.18680;
  struct MonoVTable * D.18683;
  struct MonoClass * D.18684;
  const char * D.18685;
  const char * D.18686;
  gsize * bitmap_data.2;
  long unsigned int D.18688;
  void * D.18695;
  int bwords.3;

  start = start + 18446744073709551600;
  D.18575 = desc & 7;
  switch (D.18575) <default: <D.18570>, case 1: <D.18496>, case 2: <D.18505>, case 3: <D.18555>, case 4: <D.18515>, case 5: <D.18548>, case 7: <D.18569>>
  <D.18496>:
  D.18576 = desc & 4294901760;
  if (D.18576 != 0) goto <D.18577>; else goto <D.18578>;
  <D.18577>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.18579 = desc >> 16;
    D.18580 = D.18579 & 255;
    D.18581 = D.18580 * 8;
    _objptr = _objptr + D.18581;
    D.18582 = desc >> 24;
    D.18583 = D.18582 & 255;
    D.18584 = D.18583 * 8;
    _objptr_end = _objptr + D.18584;
    {
      void * __old;

      __old = *_objptr;
      if (__old != 0B) goto <D.18585>; else goto <D.18586>;
      <D.18585>:
      simple_nursery_serial_copy_object_from_obj (_objptr, queue);
      if (0 != 0) goto <D.18587>; else goto <D.18588>;
      <D.18587>:
      D.18589 = *_objptr;
      if (D.18589 != __old) goto <D.18590>; else goto <D.18591>;
      <D.18590>:
      gc_debug_file.0 = gc_debug_file;
      D.18589 = *_objptr;
      fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18589, __old);
      gc_debug_file.0 = gc_debug_file;
      fflush (gc_debug_file.0);
      <D.18591>:
      <D.18588>:
      <D.18586>:
    }
    _objptr = _objptr + 8;
    goto <D.18502>;
    <D.18501>:
    {
      void * __old;

      __old = *_objptr;
      if (__old != 0B) goto <D.18593>; else goto <D.18594>;
      <D.18593>:
      simple_nursery_serial_copy_object_from_obj (_objptr, queue);
      if (0 != 0) goto <D.18595>; else goto <D.18596>;
      <D.18595>:
      D.18589 = *_objptr;
      if (D.18589 != __old) goto <D.18597>; else goto <D.18598>;
      <D.18597>:
      gc_debug_file.0 = gc_debug_file;
      D.18589 = *_objptr;
      fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18589, __old);
      gc_debug_file.0 = gc_debug_file;
      fflush (gc_debug_file.0);
      <D.18598>:
      <D.18596>:
      <D.18594>:
    }
    _objptr = _objptr + 8;
    <D.18502>:
    if (_objptr < _objptr_end) goto <D.18501>; else goto <D.18503>;
    <D.18503>:
  }
  <D.18578>:
  goto <D.18504>;
  <D.18505>:
  {
    void * * _objptr;
    gsize _bmap;

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

      _index = __builtin_ctzl (_bmap);
      D.18599 = (long unsigned int) _index;
      D.18600 = D.18599 * 8;
      _objptr = _objptr + D.18600;
      D.18601 = _index + 1;
      _bmap = _bmap >> D.18601;
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18602>; else goto <D.18603>;
        <D.18602>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.18604>; else goto <D.18605>;
        <D.18604>:
        D.18606 = *_objptr;
        if (D.18606 != __old) goto <D.18607>; else goto <D.18608>;
        <D.18607>:
        gc_debug_file.0 = gc_debug_file;
        D.18606 = *_objptr;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18606, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.18608>:
        <D.18605>:
        <D.18603>:
      }
      _objptr = _objptr + 8;
    }
    goto <D.18513>;
    <D.18512>:
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.18609 = (long unsigned int) _index;
      D.18610 = D.18609 * 8;
      _objptr = _objptr + D.18610;
      D.18611 = _index + 1;
      _bmap = _bmap >> D.18611;
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18612>; else goto <D.18613>;
        <D.18612>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.18614>; else goto <D.18615>;
        <D.18614>:
        D.18606 = *_objptr;
        if (D.18606 != __old) goto <D.18616>; else goto <D.18617>;
        <D.18616>:
        gc_debug_file.0 = gc_debug_file;
        D.18606 = *_objptr;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18606, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.18617>:
        <D.18615>:
        <D.18613>:
      }
      _objptr = _objptr + 8;
    }
    <D.18513>:
    if (_bmap != 0) goto <D.18512>; else goto <D.18514>;
    <D.18514>:
  }
  goto <D.18504>;
  <D.18515>:
  D.18618 = desc & 4294950912;
  if (D.18618 != 0) goto <D.18619>; else goto <D.18620>;
  <D.18619>:
  {
    int el_size;
    int etype;

    D.18621 = desc >> 3;
    D.18622 = (int) D.18621;
    el_size = D.18622 & 1023;
    D.18623 = (int) desc;
    etype = D.18623 & 49152;
    if (etype == 16384) goto <D.18624>; else goto <D.18625>;
    <D.18624>:
    {
      void * * p;
      void * * end_refs;

      p = start + 32;
      D.18626 = MEM[(struct MonoArray *)start].max_length;
      el_size.1 = (unsigned int) el_size;
      D.18628 = D.18626 * el_size.1;
      D.18629 = (sizetype) D.18628;
      end_refs = p + D.18629;
      goto <D.18522>;
      <D.18521>:
      {
        void * __old;

        __old = *p;
        if (__old != 0B) goto <D.18630>; else goto <D.18631>;
        <D.18630>:
        simple_nursery_serial_copy_object_from_obj (p, queue);
        if (0 != 0) goto <D.18632>; else goto <D.18633>;
        <D.18632>:
        D.18634 = *p;
        if (D.18634 != __old) goto <D.18635>; else goto <D.18636>;
        <D.18635>:
        gc_debug_file.0 = gc_debug_file;
        D.18634 = *p;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", p, D.18634, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.18636>:
        <D.18633>:
        <D.18631>:
      }
      p = p + 8;
      <D.18522>:
      if (p < end_refs) goto <D.18521>; else goto <D.18523>;
      <D.18523>:
    }
    goto <D.18637>;
    <D.18625>:
    if (etype == 32768) goto <D.18638>; else goto <D.18639>;
    <D.18638>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.18579 = desc >> 16;
      D.18640 = (int) D.18579;
      offset = D.18640 & 255;
      D.18582 = desc >> 24;
      D.18641 = (int) D.18582;
      num_refs = D.18641 & 255;
      e_start = start + 32;
      D.18626 = MEM[(struct MonoArray *)start].max_length;
      el_size.1 = (unsigned int) el_size;
      D.18628 = D.18626 * el_size.1;
      D.18629 = (sizetype) D.18628;
      e_end = e_start + D.18629;
      goto <D.18535>;
      <D.18534>:
      {
        void * * p;
        int i;

        p = e_start;
        D.18642 = (long unsigned int) offset;
        D.18643 = D.18642 * 8;
        p = p + D.18643;
        i = 0;
        goto <D.18532>;
        <D.18531>:
        {
          void * __old;

          D.18644 = (long unsigned int) i;
          D.18645 = D.18644 * 8;
          D.18646 = p + D.18645;
          __old = *D.18646;
          if (__old != 0B) goto <D.18647>; else goto <D.18648>;
          <D.18647>:
          D.18644 = (long unsigned int) i;
          D.18645 = D.18644 * 8;
          D.18646 = p + D.18645;
          simple_nursery_serial_copy_object_from_obj (D.18646, queue);
          if (0 != 0) goto <D.18649>; else goto <D.18650>;
          <D.18649>:
          D.18644 = (long unsigned int) i;
          D.18645 = D.18644 * 8;
          D.18646 = p + D.18645;
          D.18651 = *D.18646;
          if (D.18651 != __old) goto <D.18652>; else goto <D.18653>;
          <D.18652>:
          gc_debug_file.0 = gc_debug_file;
          D.18644 = (long unsigned int) i;
          D.18645 = D.18644 * 8;
          D.18646 = p + D.18645;
          D.18644 = (long unsigned int) i;
          D.18645 = D.18644 * 8;
          D.18646 = p + D.18645;
          D.18651 = *D.18646;
          fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", D.18646, D.18651, __old);
          gc_debug_file.0 = gc_debug_file;
          fflush (gc_debug_file.0);
          <D.18653>:
          <D.18650>:
          <D.18648>:
        }
        i = i + 1;
        <D.18532>:
        if (i < num_refs) goto <D.18531>; else goto <D.18533>;
        <D.18533>:
        D.18654 = (sizetype) el_size;
        e_start = e_start + D.18654;
      }
      <D.18535>:
      if (e_start < e_end) goto <D.18534>; else goto <D.18536>;
      <D.18536>:
    }
    goto <D.18655>;
    <D.18639>:
    if (etype == 49152) goto <D.18656>; else goto <D.18657>;
    <D.18656>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 32;
      D.18626 = MEM[(struct MonoArray *)start].max_length;
      el_size.1 = (unsigned int) el_size;
      D.18628 = D.18626 * el_size.1;
      D.18629 = (sizetype) D.18628;
      e_end = e_start + D.18629;
      goto <D.18546>;
      <D.18545>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.18543>;
        <D.18542>:
        D.18658 = _bmap & 1;
        if (D.18658 != 0) goto <D.18659>; else goto <D.18660>;
        <D.18659>:
        {
          void * __old;

          __old = *p;
          if (__old != 0B) goto <D.18661>; else goto <D.18662>;
          <D.18661>:
          simple_nursery_serial_copy_object_from_obj (p, queue);
          if (0 != 0) goto <D.18663>; else goto <D.18664>;
          <D.18663>:
          D.18665 = *p;
          if (D.18665 != __old) goto <D.18666>; else goto <D.18667>;
          <D.18666>:
          gc_debug_file.0 = gc_debug_file;
          D.18665 = *p;
          fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", p, D.18665, __old);
          gc_debug_file.0 = gc_debug_file;
          fflush (gc_debug_file.0);
          <D.18667>:
          <D.18664>:
          <D.18662>:
        }
        <D.18660>:
        _bmap = _bmap >> 1;
        p = p + 8;
        <D.18543>:
        if (_bmap != 0) goto <D.18542>; else goto <D.18544>;
        <D.18544>:
        D.18654 = (sizetype) el_size;
        e_start = e_start + D.18654;
      }
      <D.18546>:
      if (e_start < e_end) goto <D.18545>; else goto <D.18547>;
      <D.18547>:
    }
    <D.18657>:
    <D.18655>:
    <D.18637>:
  }
  <D.18620>:
  goto <D.18504>;
  <D.18548>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 16;
    goto <D.18553>;
    <D.18552>:
    D.18668 = _bmap & 1;
    if (D.18668 != 0) goto <D.18669>; else goto <D.18670>;
    <D.18669>:
    {
      void * __old;

      __old = *_objptr;
      if (__old != 0B) goto <D.18671>; else goto <D.18672>;
      <D.18671>:
      simple_nursery_serial_copy_object_from_obj (_objptr, queue);
      if (0 != 0) goto <D.18673>; else goto <D.18674>;
      <D.18673>:
      D.18675 = *_objptr;
      if (D.18675 != __old) goto <D.18676>; else goto <D.18677>;
      <D.18676>:
      gc_debug_file.0 = gc_debug_file;
      D.18675 = *_objptr;
      fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18675, __old);
      gc_debug_file.0 = gc_debug_file;
      fflush (gc_debug_file.0);
      <D.18677>:
      <D.18674>:
      <D.18672>:
    }
    <D.18670>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 8;
    <D.18553>:
    if (_bmap != 0) goto <D.18552>; else goto <D.18554>;
    <D.18554>:
  }
  goto <D.18504>;
  <D.18555>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.18678 = *bitmap_data;
    D.18679 = (unsigned int) D.18678;
    D.18680 = D.18679 + 4294967295;
    bwords = (int) D.18680;
    start_run = _objptr;
    bitmap_data = bitmap_data + 8;
    if (0 != 0) goto <D.18681>; else goto <D.18682>;
    <D.18681>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.18683 = myobj->vtable;
      D.18684 = D.18683->klass;
      D.18685 = D.18684->name_space;
      D.18683 = myobj->vtable;
      D.18684 = D.18683->klass;
      D.18686 = D.18684->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.18685, D.18686);
    }
    <D.18682>:
    goto <D.18567>;
    <D.18566>:
    {
      gsize _bmap;

      bitmap_data.2 = bitmap_data;
      bitmap_data = bitmap_data.2 + 8;
      _bmap = *bitmap_data.2;
      _objptr = start_run;
      goto <D.18564>;
      <D.18563>:
      D.18688 = _bmap & 1;
      if (D.18688 != 0) goto <D.18689>; else goto <D.18690>;
      <D.18689>:
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18691>; else goto <D.18692>;
        <D.18691>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.18693>; else goto <D.18694>;
        <D.18693>:
        D.18695 = *_objptr;
        if (D.18695 != __old) goto <D.18696>; else goto <D.18697>;
        <D.18696>:
        gc_debug_file.0 = gc_debug_file;
        D.18695 = *_objptr;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18695, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.18697>:
        <D.18694>:
        <D.18692>:
      }
      <D.18690>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18564>:
      if (_bmap != 0) goto <D.18563>; else goto <D.18565>;
      <D.18565>:
      start_run = start_run + 512;
    }
    <D.18567>:
    bwords.3 = bwords;
    bwords = bwords.3 + -1;
    if (bwords.3 > 0) goto <D.18566>; else goto <D.18568>;
    <D.18568>:
  }
  goto <D.18504>;
  <D.18569>:
  goto <D.18504>;
  <D.18570>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.18504>:
}


__attribute__((always_inline))
simple_nursery_serial_copy_object_from_obj (void * * obj_slot, struct SgenGrayQueue * queue)
{
  int current_collection_generation.4;
  int D.18703;
  struct FILE * gc_debug_file.5;
  char * iftmp.6;
  long unsigned int D.18710;
  long unsigned int D.18711;
  long unsigned int D.18714;
  long unsigned int D.18722;
  _Bool D.18723;
  long int D.18724;
  long int D.18725;
  int D.18732;
  _Bool D.18735;
  long int D.18736;
  long int D.18737;
  int iftmp.7;
  int D.18743;
  int D.18745;
  _Bool D.18747;
  long int D.18748;
  long int D.18749;
  char * forwarded;
  char * obj;
  void * copy;

  obj = *obj_slot;
  if (0 != 0) goto <D.18700>; else goto <D.18701>;
  <D.18700>:
  current_collection_generation.4 = current_collection_generation;
  monoeg_g_log (0B, 4, "calling minor-serial-copy-from-obj from a %d generation collection", current_collection_generation.4);
  <D.18173>:
  goto <D.18173>;
  <D.18701>:
  D.18703 = sgen_ptr_in_nursery (obj);
  if (D.18703 == 0) goto <D.18704>; else goto <D.18705>;
  <D.18704>:
  return;
  <D.18705>:
  if (0 != 0) goto <D.18706>; else goto <D.18707>;
  <D.18706>:
  gc_debug_file.5 = gc_debug_file;
  fprintf (gc_debug_file.5, "Precise copy of %p from %p\n", obj, obj_slot);
  gc_debug_file.5 = gc_debug_file;
  fflush (gc_debug_file.5);
  <D.18707>:
  D.18710 = MEM[(mword *)obj];
  D.18711 = D.18710 & 1;
  if (D.18711 != 0) goto <D.18712>; else goto <D.18713>;
  <D.18712>:
  D.18710 = MEM[(mword *)obj];
  D.18714 = D.18710 & 18446744073709551612;
  iftmp.6 = (char *) D.18714;
  goto <D.18715>;
  <D.18713>:
  iftmp.6 = 0B;
  <D.18715>:
  forwarded = iftmp.6;
  if (forwarded != 0B) goto <D.18716>; else goto <D.18717>;
  <D.18716>:
  if (0 != 0) goto <D.18718>; else goto <D.18719>;
  <D.18718>:
  monoeg_g_log (0B, 4, "forwarded object %p has no gc descriptor", forwarded);
  <D.18174>:
  goto <D.18174>;
  <D.18719>:
  if (0 != 0) goto <D.18720>; else goto <D.18721>;
  <D.18720>:
  gc_debug_file.5 = gc_debug_file;
  fprintf (gc_debug_file.5, " (already forwarded to %p)\n", forwarded);
  gc_debug_file.5 = gc_debug_file;
  fflush (gc_debug_file.5);
  <D.18721>:
  *obj_slot = forwarded;
  return;
  <D.18717>:
  D.18710 = MEM[(mword *)obj];
  D.18722 = D.18710 & 2;
  D.18723 = D.18722 != 0;
  D.18724 = (long int) D.18723;
  D.18725 = __builtin_expect (D.18724, 0);
  if (D.18725 != 0) goto <D.18726>; else goto <D.18727>;
  <D.18726>:
  if (0 != 0) goto <D.18728>; else goto <D.18729>;
  <D.18728>:
  monoeg_g_log (0B, 4, "pinned object %p has no gc descriptor", obj);
  <D.18175>:
  goto <D.18175>;
  <D.18729>:
  if (0 != 0) goto <D.18730>; else goto <D.18731>;
  <D.18730>:
  gc_debug_file.5 = gc_debug_file;
  fprintf (gc_debug_file.5, " (pinned, no change)\n");
  gc_debug_file.5 = gc_debug_file;
  fflush (gc_debug_file.5);
  <D.18731>:
  D.18732 = sgen_ptr_in_nursery (obj_slot);
  if (D.18732 == 0) goto <D.18733>; else goto <D.18734>;
  <D.18733>:
  sgen_add_to_global_remset (obj_slot, obj);
  <D.18734>:
  return;
  <D.18727>:
  copy = copy_object_no_checks (obj, queue);
  *obj_slot = copy;
  D.18735 = obj == copy;
  D.18736 = (long int) D.18735;
  D.18737 = __builtin_expect (D.18736, 0);
  if (D.18737 != 0) goto <D.18738>; else goto <D.18739>;
  <D.18738>:
  D.18743 = sgen_ptr_in_nursery (copy);
  if (D.18743 != 0) goto <D.18744>; else goto <D.18741>;
  <D.18744>:
  D.18745 = sgen_ptr_in_nursery (obj_slot);
  if (D.18745 == 0) goto <D.18746>; else goto <D.18741>;
  <D.18746>:
  iftmp.7 = 1;
  goto <D.18742>;
  <D.18741>:
  iftmp.7 = 0;
  <D.18742>:
  D.18747 = iftmp.7 != 0;
  D.18748 = (long int) D.18747;
  D.18749 = __builtin_expect (D.18748, 0);
  if (D.18749 != 0) goto <D.18750>; else goto <D.18751>;
  <D.18750>:
  sgen_add_to_global_remset (obj_slot, copy);
  <D.18751>:
  <D.18739>:
}


__attribute__((__unused__, noinline))
copy_object_no_checks (void * obj, struct SgenGrayQueue * queue)
{
  void * D.18753;
  long unsigned int D.18754;
  unsigned int D.18755;
  unsigned int D.18756;
  long unsigned int D.18757;
  _Bool D.18758;
  long int D.18759;
  long int D.18760;
  void * D.18763;
  struct SgenGrayQueue * iftmp.8;
  long unsigned int destination.9;
  long unsigned int D.18769;
  struct MonoVTable * vt;
  gboolean has_references;
  mword objsize;
  char * destination;

  vt = MEM[(struct MonoObject *)obj].vtable;
  D.18753 = vt->gc_descr;
  D.18754 = (long unsigned int) D.18753;
  has_references = sgen_gc_descr_has_references (D.18754);
  D.18755 = sgen_par_object_get_size (vt, obj);
  D.18756 = D.18755 + 7;
  D.18757 = (long unsigned int) D.18756;
  objsize = D.18757 & 4294967288;
  destination = alloc_for_promotion (vt, obj, objsize, has_references);
  D.18758 = destination == 0B;
  D.18759 = (long int) D.18758;
  D.18760 = __builtin_expect (D.18759, 0);
  if (D.18760 != 0) goto <D.18761>; else goto <D.18762>;
  <D.18761>:
  sgen_pin_object (obj, queue);
  sgen_set_pinned_from_failed_allocation (objsize);
  D.18763 = obj;
  return D.18763;
  <D.18762>:
  if (has_references != 0) goto <D.18765>; else goto <D.18766>;
  <D.18765>:
  iftmp.8 = queue;
  goto <D.18767>;
  <D.18766>:
  iftmp.8 = 0B;
  <D.18767>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.8);
  destination.9 = (long unsigned int) destination;
  D.18769 = destination.9 | 1;
  MEM[(mword *)obj] = D.18769;
  D.18763 = destination;
  return D.18763;
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.18771;
  gboolean D.18774;
  long unsigned int D.18775;
  long unsigned int D.18778;

  D.18771 = desc & 4294901767;
  if (D.18771 == 1) goto <D.18772>; else goto <D.18773>;
  <D.18772>:
  D.18774 = 0;
  return D.18774;
  <D.18773>:
  D.18775 = desc & 49159;
  if (D.18775 == 4) goto <D.18776>; else goto <D.18777>;
  <D.18776>:
  D.18774 = 0;
  return D.18774;
  <D.18777>:
  D.18778 = desc & 7;
  if (D.18778 == 7) goto <D.18779>; else goto <D.18780>;
  <D.18779>:
  D.18774 = 0;
  return D.18774;
  <D.18780>:
  D.18774 = 1;
  return D.18774;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.18782;
  long unsigned int D.18783;
  guint D.18788;
  int D.18789;
  int D.18790;
  unsigned int D.18791;
  long unsigned int D.18794;
  int D.18795;
  unsigned int D.18796;
  unsigned int element_size.10;
  unsigned int D.18798;
  long unsigned int D.18799;
  long unsigned int D.18800;
  struct MonoClass * D.18803;
  unsigned char D.18804;
  long unsigned int D.18805;
  long unsigned int D.18806;
  mword descr;
  mword type;

  D.18782 = vtable->gc_descr;
  descr = (mword) D.18782;
  type = descr & 7;
  D.18783 = type + 18446744073709551615;
  if (D.18783 <= 1) goto <D.18784>; else goto <D.18785>;
  <D.18784>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.18786>; else goto <D.18787>;
    <D.18786>:
    D.18789 = MEM[(struct MonoString *)o].length;
    D.18790 = D.18789 * 2;
    D.18791 = (unsigned int) D.18790;
    D.18788 = D.18791 + 26;
    return D.18788;
    <D.18787>:
    D.18788 = (guint) size;
    return D.18788;
  }
  <D.18785>:
  if (type == 4) goto <D.18792>; else goto <D.18793>;
  <D.18792>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.18794 = descr >> 3;
    D.18795 = (int) D.18794;
    element_size = D.18795 & 1023;
    array = o;
    D.18796 = array->max_length;
    element_size.10 = (unsigned int) element_size;
    D.18798 = D.18796 * element_size.10;
    D.18799 = (long unsigned int) D.18798;
    size = D.18799 + 32;
    D.18800 = descr & 8192;
    if (D.18800 != 0) goto <D.18801>; else goto <D.18802>;
    <D.18801>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.18803 = vtable->klass;
    D.18804 = D.18803->rank;
    D.18805 = (long unsigned int) D.18804;
    D.18806 = D.18805 * 8;
    size = D.18806 + size;
    <D.18802>:
    D.18788 = (guint) size;
    return D.18788;
  }
  <D.18793>:
  D.18788 = slow_object_get_size (vtable, o);
  return D.18788;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.18808;
  guint D.18811;
  int D.18812;
  int D.18813;
  unsigned int D.18814;
  unsigned char D.18815;
  int D.18818;
  unsigned int D.18819;
  unsigned int D.18820;
  unsigned int D.18821;
  long unsigned int D.18822;
  struct MonoArrayBounds * D.18823;
  _Bool D.18824;
  long int D.18825;
  long int D.18826;
  long unsigned int D.18829;
  long unsigned int D.18830;
  int D.18831;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.18808 = mono_defaults.string_class;
  if (D.18808 == klass) goto <D.18809>; else goto <D.18810>;
  <D.18809>:
  D.18812 = MEM[(struct MonoString *)o].length;
  D.18813 = D.18812 * 2;
  D.18814 = (unsigned int) D.18813;
  D.18811 = D.18814 + 26;
  return D.18811;
  <D.18810>:
  D.18815 = klass->rank;
  if (D.18815 != 0) goto <D.18816>; else goto <D.18817>;
  <D.18816>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.18818 = klass->sizes.element_size;
    D.18819 = (unsigned int) D.18818;
    D.18820 = array->max_length;
    D.18821 = D.18819 * D.18820;
    D.18822 = (long unsigned int) D.18821;
    size = D.18822 + 32;
    D.18823 = array->bounds;
    D.18824 = D.18823 != 0B;
    D.18825 = (long int) D.18824;
    D.18826 = __builtin_expect (D.18825, 0);
    if (D.18826 != 0) goto <D.18827>; else goto <D.18828>;
    <D.18827>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.18815 = klass->rank;
    D.18829 = (long unsigned int) D.18815;
    D.18830 = D.18829 * 8;
    size = D.18830 + size;
    <D.18828>:
    D.18811 = (guint) size;
    return D.18811;
  }
  <D.18817>:
  D.18831 = klass->instance_size;
  D.18811 = (guint) D.18831;
  return D.18811;
}


par_copy_object_no_checks (char * destination, struct MonoVTable * vt, void * obj, mword objsize, struct SgenGrayQueue * queue)
{
  struct MonoClass * D.18835;
  const char * D.18836;
  const char * D.18837;
  struct FILE * gc_debug_file.11;
  struct MonoVTable * D.18841;
  struct MonoClass * D.18842;
  const char * D.18843;
  long unsigned int D.18846;
  const void * D.18847;
  mword * D.18848;
  long unsigned int D.18849;
  mword * D.18850;
  long unsigned int D.18851;
  mword * D.18852;
  long unsigned int D.18853;
  mword * D.18854;
  long unsigned int D.18855;
  mword * D.18856;
  long unsigned int D.18857;
  mword * D.18858;
  long unsigned int D.18859;
  mword * D.18860;
  long unsigned int D.18861;
  char * D.18863;
  const void * D.18864;
  long unsigned int D.18865;
  int iftmp.12;
  unsigned char D.18871;
  struct MonoArrayBounds * D.18873;
  _Bool D.18875;
  long int D.18876;
  long int D.18877;
  long int D.18880;
  long int obj.13;
  long int D.18882;
  sizetype D.18883;
  char * D.18884;
  int D.18887;
  long unsigned int D.18888;
  <unnamed type> mono_profiler_events.14;
  unsigned int D.18890;
  _Bool D.18891;
  long int D.18892;
  long int D.18893;
  const char * D.18900;
  int iftmp.15;
  struct GrayQueueSection * D.18905;
  int D.18907;
  _Bool D.18908;
  long int D.18909;
  long int D.18910;
  int D.18914;
  int D.18915;
  static const void * copy_labels[9] = {(const void *) &LAB_0, (const void *) &LAB_1, (const void *) &LAB_2, (const void *) &LAB_3, (const void *) &LAB_4, (const void *) &LAB_5, (const void *) &LAB_6, (const void *) &LAB_7, (const void *) &LAB_8};
  void LAB_0 = <<< error >>>;
  void LAB_1 = <<< error >>>;
  void LAB_2 = <<< error >>>;
  void LAB_3 = <<< error >>>;
  void LAB_4 = <<< error >>>;
  void LAB_5 = <<< error >>>;
  void LAB_6 = <<< error >>>;
  void LAB_7 = <<< error >>>;
  void LAB_8 = <<< error >>>;

  if (0 != 0) goto <D.18833>; else goto <D.18834>;
  <D.18833>:
  D.18835 = vt->klass;
  D.18836 = D.18835->name_space;
  D.18835 = vt->klass;
  D.18837 = D.18835->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s was not initialized", vt, D.18836, D.18837);
  <D.18145>:
  goto <D.18145>;
  <D.18834>:
  if (0 != 0) goto <D.18838>; else goto <D.18839>;
  <D.18838>:
  gc_debug_file.11 = gc_debug_file;
  D.18841 = MEM[(struct MonoObject *)obj].vtable;
  D.18842 = D.18841->klass;
  D.18843 = D.18842->name;
  fprintf (gc_debug_file.11, " (to %p, %s size: %lu)\n", destination, D.18843, objsize);
  gc_debug_file.11 = gc_debug_file;
  fflush (gc_debug_file.11);
  <D.18839>:
  if (objsize <= 64) goto <D.18844>; else goto <D.18845>;
  <D.18844>:
  {
    mword * dest;

    dest = destination;
    D.18846 = objsize / 8;
    D.18847 = copy_labels[D.18846];
    goto D.18847;
    LAB_8:
    D.18848 = dest + 56;
    D.18849 = MEM[(mword *)obj + 56B];
    *D.18848 = D.18849;
    LAB_7:
    D.18850 = dest + 48;
    D.18851 = MEM[(mword *)obj + 48B];
    *D.18850 = D.18851;
    LAB_6:
    D.18852 = dest + 40;
    D.18853 = MEM[(mword *)obj + 40B];
    *D.18852 = D.18853;
    LAB_5:
    D.18854 = dest + 32;
    D.18855 = MEM[(mword *)obj + 32B];
    *D.18854 = D.18855;
    LAB_4:
    D.18856 = dest + 24;
    D.18857 = MEM[(mword *)obj + 24B];
    *D.18856 = D.18857;
    LAB_3:
    D.18858 = dest + 16;
    D.18859 = MEM[(mword *)obj + 16B];
    *D.18858 = D.18859;
    LAB_2:
    D.18860 = dest + 8;
    D.18861 = MEM[(mword *)obj + 8B];
    *D.18860 = D.18861;
    LAB_1:
    LAB_0:
  }
  goto <D.18862>;
  <D.18845>:
  D.18863 = destination + 8;
  D.18864 = obj + 8;
  D.18865 = objsize + 18446744073709551608;
  mono_gc_memmove_aligned (D.18863, D.18864, D.18865);
  <D.18862>:
  if (0 != 0) goto <D.18866>; else goto <D.18867>;
  <D.18866>:
  D.18835 = vt->klass;
  D.18836 = D.18835->name_space;
  D.18835 = vt->klass;
  D.18837 = D.18835->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s has no gc descriptor", vt, D.18836, D.18837);
  <D.18147>:
  goto <D.18147>;
  <D.18867>:
  D.18871 = vt->rank;
  if (D.18871 != 0) goto <D.18872>; else goto <D.18869>;
  <D.18872>:
  D.18873 = MEM[(struct MonoArray *)obj].bounds;
  if (D.18873 != 0B) goto <D.18874>; else goto <D.18869>;
  <D.18874>:
  iftmp.12 = 1;
  goto <D.18870>;
  <D.18869>:
  iftmp.12 = 0;
  <D.18870>:
  D.18875 = iftmp.12 != 0;
  D.18876 = (long int) D.18875;
  D.18877 = __builtin_expect (D.18876, 0);
  if (D.18877 != 0) goto <D.18878>; else goto <D.18879>;
  <D.18878>:
  {
    struct MonoArray * array;

    array = destination;
    D.18873 = MEM[(struct MonoArray *)obj].bounds;
    D.18880 = (long int) D.18873;
    obj.13 = (long int) obj;
    D.18882 = D.18880 - obj.13;
    D.18883 = (sizetype) D.18882;
    D.18884 = destination + D.18883;
    array->bounds = D.18884;
    if (0 != 0) goto <D.18885>; else goto <D.18886>;
    <D.18885>:
    gc_debug_file.11 = gc_debug_file;
    D.18871 = vt->rank;
    D.18887 = (int) D.18871;
    D.18888 = mono_array_length (array);
    fprintf (gc_debug_file.11, "Array instance %p: size: %lu, rank: %d, length: %lu\n", array, objsize, D.18887, D.18888);
    gc_debug_file.11 = gc_debug_file;
    fflush (gc_debug_file.11);
    <D.18886>:
  }
  <D.18879>:
  mono_profiler_events.14 = mono_profiler_events;
  D.18890 = mono_profiler_events.14 & 524288;
  D.18891 = D.18890 != 0;
  D.18892 = (long int) D.18891;
  D.18893 = __builtin_expect (D.18892, 0);
  if (D.18893 != 0) goto <D.18894>; else goto <D.18895>;
  <D.18894>:
  sgen_register_moved_object (obj, destination);
  <D.18895>:
  obj = destination;
  if (queue != 0B) goto <D.18896>; else goto <D.18897>;
  <D.18896>:
  if (0 != 0) goto <D.18898>; else goto <D.18899>;
  <D.18898>:
  gc_debug_file.11 = gc_debug_file;
  D.18900 = sgen_safe_name (obj);
  fprintf (gc_debug_file.11, "Enqueuing gray object %p (%s)\n", obj, D.18900);
  gc_debug_file.11 = gc_debug_file;
  fflush (gc_debug_file.11);
  <D.18899>:
  D.18905 = queue->first;
  if (D.18905 == 0B) goto <D.18902>; else goto <D.18906>;
  <D.18906>:
  D.18905 = queue->first;
  D.18907 = D.18905->end;
  if (D.18907 == 125) goto <D.18902>; else goto <D.18903>;
  <D.18902>:
  iftmp.15 = 1;
  goto <D.18904>;
  <D.18903>:
  iftmp.15 = 0;
  <D.18904>:
  D.18908 = iftmp.15 != 0;
  D.18909 = (long int) D.18908;
  D.18910 = __builtin_expect (D.18909, 0);
  if (D.18910 != 0) goto <D.18911>; else goto <D.18912>;
  <D.18911>:
  sgen_gray_object_enqueue (queue, obj);
  goto <D.18913>;
  <D.18912>:
  D.18905 = queue->first;
  D.18905 = queue->first;
  D.18907 = D.18905->end;
  D.18914 = D.18907;
  D.18915 = D.18914 + 1;
  D.18905->end = D.18915;
  D.18905->objects[D.18914] = obj;
  <D.18913>:
  __builtin_prefetch (obj);
  <D.18897>:
}


__attribute__((always_inline))
sgen_ptr_in_nursery (void * p)
{
  gboolean D.18918;
  int sgen_nursery_bits.17;
  int D.18920;
  int D.18921;
  long unsigned int D.18922;
  long unsigned int p.18;
  long unsigned int D.18924;
  char * sgen_nursery_start.19;
  long unsigned int sgen_nursery_start.20;
  _Bool D.18927;

  sgen_nursery_bits.17 = sgen_nursery_bits;
  D.18920 = 1 << sgen_nursery_bits.17;
  D.18921 = -D.18920;
  D.18922 = (long unsigned int) D.18921;
  p.18 = (long unsigned int) p;
  D.18924 = D.18922 & p.18;
  sgen_nursery_start.19 = sgen_nursery_start;
  sgen_nursery_start.20 = (long unsigned int) sgen_nursery_start.19;
  D.18927 = D.18924 == sgen_nursery_start.20;
  D.18918 = (gboolean) D.18927;
  return D.18918;
}


simple_nursery_serial_scan_object (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.18929;
  long unsigned int D.18930;
  long unsigned int D.18931;
  long unsigned int D.18932;
  long unsigned int D.18935;
  long unsigned int D.18936;
  long unsigned int D.18937;
  long unsigned int D.18938;
  long unsigned int D.18939;
  long unsigned int D.18940;
  void * D.18945;
  struct FILE * gc_debug_file.21;
  long unsigned int D.18955;
  long unsigned int D.18956;
  int D.18957;
  void * D.18962;
  long unsigned int D.18965;
  long unsigned int D.18966;
  int D.18967;
  long unsigned int D.18974;
  long unsigned int D.18977;
  int D.18978;
  int D.18979;
  unsigned int D.18982;
  unsigned int el_size.22;
  unsigned int D.18984;
  sizetype D.18985;
  void * D.18990;
  int D.18996;
  int D.18997;
  long unsigned int D.18998;
  long unsigned int D.18999;
  long unsigned int D.19000;
  long unsigned int D.19001;
  void * * D.19002;
  void * D.19007;
  sizetype D.19010;
  long unsigned int D.19014;
  void * D.19021;
  long unsigned int D.19024;
  void * D.19031;
  long unsigned int D.19034;
  unsigned int D.19035;
  unsigned int D.19036;
  struct MonoVTable * D.19039;
  struct MonoClass * D.19040;
  const char * D.19041;
  const char * D.19042;
  gsize * bitmap_data.23;
  long unsigned int D.19044;
  void * D.19051;
  int bwords.24;
  long unsigned int D.19055;
  gsize * mbitmap_data.25;
  long unsigned int D.19057;
  unsigned int D.19058;
  unsigned int D.19059;
  struct MonoClass * D.19060;
  unsigned int el_size.26;
  unsigned int D.19062;
  sizetype D.19063;
  const char * D.19066;
  const char * D.19067;
  gsize * bitmap_data.27;
  long unsigned int D.19069;
  void * D.19076;
  unsigned int bwords.28;
  sizetype D.19080;

  {
    struct GCVTable * vt;
    mword desc;

    D.18929 = MEM[(mword *)start];
    D.18930 = D.18929 & 18446744073709551612;
    vt = (struct GCVTable *) D.18930;
    desc = vt->desc;
    D.18931 = desc & 7;
    switch (D.18931) <default: <D.18490>, case 1: <D.18395>, case 2: <D.18404>, case 3: <D.18454>, case 4: <D.18414>, case 5: <D.18447>, case 6: <D.18468>, case 7: <D.18489>>
    <D.18395>:
    D.18932 = desc & 4294901760;
    if (D.18932 != 0) goto <D.18933>; else goto <D.18934>;
    <D.18933>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.18935 = desc >> 16;
      D.18936 = D.18935 & 255;
      D.18937 = D.18936 * 8;
      _objptr = _objptr + D.18937;
      D.18938 = desc >> 24;
      D.18939 = D.18938 & 255;
      D.18940 = D.18939 * 8;
      _objptr_end = _objptr + D.18940;
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18941>; else goto <D.18942>;
        <D.18941>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.18943>; else goto <D.18944>;
        <D.18943>:
        D.18945 = *_objptr;
        if (D.18945 != __old) goto <D.18946>; else goto <D.18947>;
        <D.18946>:
        gc_debug_file.21 = gc_debug_file;
        D.18945 = *_objptr;
        fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18945, __old);
        gc_debug_file.21 = gc_debug_file;
        fflush (gc_debug_file.21);
        <D.18947>:
        <D.18944>:
        <D.18942>:
      }
      _objptr = _objptr + 8;
      goto <D.18401>;
      <D.18400>:
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18949>; else goto <D.18950>;
        <D.18949>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.18951>; else goto <D.18952>;
        <D.18951>:
        D.18945 = *_objptr;
        if (D.18945 != __old) goto <D.18953>; else goto <D.18954>;
        <D.18953>:
        gc_debug_file.21 = gc_debug_file;
        D.18945 = *_objptr;
        fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18945, __old);
        gc_debug_file.21 = gc_debug_file;
        fflush (gc_debug_file.21);
        <D.18954>:
        <D.18952>:
        <D.18950>:
      }
      _objptr = _objptr + 8;
      <D.18401>:
      if (_objptr < _objptr_end) goto <D.18400>; else goto <D.18402>;
      <D.18402>:
    }
    <D.18934>:
    goto <D.18403>;
    <D.18404>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.18955 = (long unsigned int) _index;
        D.18956 = D.18955 * 8;
        _objptr = _objptr + D.18956;
        D.18957 = _index + 1;
        _bmap = _bmap >> D.18957;
        {
          void * __old;

          __old = *_objptr;
          if (__old != 0B) goto <D.18958>; else goto <D.18959>;
          <D.18958>:
          simple_nursery_serial_copy_object_from_obj (_objptr, queue);
          if (0 != 0) goto <D.18960>; else goto <D.18961>;
          <D.18960>:
          D.18962 = *_objptr;
          if (D.18962 != __old) goto <D.18963>; else goto <D.18964>;
          <D.18963>:
          gc_debug_file.21 = gc_debug_file;
          D.18962 = *_objptr;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18962, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.18964>:
          <D.18961>:
          <D.18959>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.18412>;
      <D.18411>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.18965 = (long unsigned int) _index;
        D.18966 = D.18965 * 8;
        _objptr = _objptr + D.18966;
        D.18967 = _index + 1;
        _bmap = _bmap >> D.18967;
        {
          void * __old;

          __old = *_objptr;
          if (__old != 0B) goto <D.18968>; else goto <D.18969>;
          <D.18968>:
          simple_nursery_serial_copy_object_from_obj (_objptr, queue);
          if (0 != 0) goto <D.18970>; else goto <D.18971>;
          <D.18970>:
          D.18962 = *_objptr;
          if (D.18962 != __old) goto <D.18972>; else goto <D.18973>;
          <D.18972>:
          gc_debug_file.21 = gc_debug_file;
          D.18962 = *_objptr;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18962, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.18973>:
          <D.18971>:
          <D.18969>:
        }
        _objptr = _objptr + 8;
      }
      <D.18412>:
      if (_bmap != 0) goto <D.18411>; else goto <D.18413>;
      <D.18413>:
    }
    goto <D.18403>;
    <D.18414>:
    D.18974 = desc & 4294950912;
    if (D.18974 != 0) goto <D.18975>; else goto <D.18976>;
    <D.18975>:
    {
      int el_size;
      int etype;

      D.18977 = desc >> 3;
      D.18978 = (int) D.18977;
      el_size = D.18978 & 1023;
      D.18979 = (int) desc;
      etype = D.18979 & 49152;
      if (etype == 16384) goto <D.18980>; else goto <D.18981>;
      <D.18980>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.18982 = MEM[(struct MonoArray *)start].max_length;
        el_size.22 = (unsigned int) el_size;
        D.18984 = D.18982 * el_size.22;
        D.18985 = (sizetype) D.18984;
        end_refs = p + D.18985;
        goto <D.18421>;
        <D.18420>:
        {
          void * __old;

          __old = *p;
          if (__old != 0B) goto <D.18986>; else goto <D.18987>;
          <D.18986>:
          simple_nursery_serial_copy_object_from_obj (p, queue);
          if (0 != 0) goto <D.18988>; else goto <D.18989>;
          <D.18988>:
          D.18990 = *p;
          if (D.18990 != __old) goto <D.18991>; else goto <D.18992>;
          <D.18991>:
          gc_debug_file.21 = gc_debug_file;
          D.18990 = *p;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", p, D.18990, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.18992>:
          <D.18989>:
          <D.18987>:
        }
        p = p + 8;
        <D.18421>:
        if (p < end_refs) goto <D.18420>; else goto <D.18422>;
        <D.18422>:
      }
      goto <D.18993>;
      <D.18981>:
      if (etype == 32768) goto <D.18994>; else goto <D.18995>;
      <D.18994>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.18935 = desc >> 16;
        D.18996 = (int) D.18935;
        offset = D.18996 & 255;
        D.18938 = desc >> 24;
        D.18997 = (int) D.18938;
        num_refs = D.18997 & 255;
        e_start = start + 32;
        D.18982 = MEM[(struct MonoArray *)start].max_length;
        el_size.22 = (unsigned int) el_size;
        D.18984 = D.18982 * el_size.22;
        D.18985 = (sizetype) D.18984;
        e_end = e_start + D.18985;
        goto <D.18434>;
        <D.18433>:
        {
          void * * p;
          int i;

          p = e_start;
          D.18998 = (long unsigned int) offset;
          D.18999 = D.18998 * 8;
          p = p + D.18999;
          i = 0;
          goto <D.18431>;
          <D.18430>:
          {
            void * __old;

            D.19000 = (long unsigned int) i;
            D.19001 = D.19000 * 8;
            D.19002 = p + D.19001;
            __old = *D.19002;
            if (__old != 0B) goto <D.19003>; else goto <D.19004>;
            <D.19003>:
            D.19000 = (long unsigned int) i;
            D.19001 = D.19000 * 8;
            D.19002 = p + D.19001;
            simple_nursery_serial_copy_object_from_obj (D.19002, queue);
            if (0 != 0) goto <D.19005>; else goto <D.19006>;
            <D.19005>:
            D.19000 = (long unsigned int) i;
            D.19001 = D.19000 * 8;
            D.19002 = p + D.19001;
            D.19007 = *D.19002;
            if (D.19007 != __old) goto <D.19008>; else goto <D.19009>;
            <D.19008>:
            gc_debug_file.21 = gc_debug_file;
            D.19000 = (long unsigned int) i;
            D.19001 = D.19000 * 8;
            D.19002 = p + D.19001;
            D.19000 = (long unsigned int) i;
            D.19001 = D.19000 * 8;
            D.19002 = p + D.19001;
            D.19007 = *D.19002;
            fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", D.19002, D.19007, __old);
            gc_debug_file.21 = gc_debug_file;
            fflush (gc_debug_file.21);
            <D.19009>:
            <D.19006>:
            <D.19004>:
          }
          i = i + 1;
          <D.18431>:
          if (i < num_refs) goto <D.18430>; else goto <D.18432>;
          <D.18432>:
          D.19010 = (sizetype) el_size;
          e_start = e_start + D.19010;
        }
        <D.18434>:
        if (e_start < e_end) goto <D.18433>; else goto <D.18435>;
        <D.18435>:
      }
      goto <D.19011>;
      <D.18995>:
      if (etype == 49152) goto <D.19012>; else goto <D.19013>;
      <D.19012>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.18982 = MEM[(struct MonoArray *)start].max_length;
        el_size.22 = (unsigned int) el_size;
        D.18984 = D.18982 * el_size.22;
        D.18985 = (sizetype) D.18984;
        e_end = e_start + D.18985;
        goto <D.18445>;
        <D.18444>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.18442>;
          <D.18441>:
          D.19014 = _bmap & 1;
          if (D.19014 != 0) goto <D.19015>; else goto <D.19016>;
          <D.19015>:
          {
            void * __old;

            __old = *p;
            if (__old != 0B) goto <D.19017>; else goto <D.19018>;
            <D.19017>:
            simple_nursery_serial_copy_object_from_obj (p, queue);
            if (0 != 0) goto <D.19019>; else goto <D.19020>;
            <D.19019>:
            D.19021 = *p;
            if (D.19021 != __old) goto <D.19022>; else goto <D.19023>;
            <D.19022>:
            gc_debug_file.21 = gc_debug_file;
            D.19021 = *p;
            fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", p, D.19021, __old);
            gc_debug_file.21 = gc_debug_file;
            fflush (gc_debug_file.21);
            <D.19023>:
            <D.19020>:
            <D.19018>:
          }
          <D.19016>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.18442>:
          if (_bmap != 0) goto <D.18441>; else goto <D.18443>;
          <D.18443>:
          D.19010 = (sizetype) el_size;
          e_start = e_start + D.19010;
        }
        <D.18445>:
        if (e_start < e_end) goto <D.18444>; else goto <D.18446>;
        <D.18446>:
      }
      <D.19013>:
      <D.19011>:
      <D.18993>:
    }
    <D.18976>:
    goto <D.18403>;
    <D.18447>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.18452>;
      <D.18451>:
      D.19024 = _bmap & 1;
      if (D.19024 != 0) goto <D.19025>; else goto <D.19026>;
      <D.19025>:
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.19027>; else goto <D.19028>;
        <D.19027>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.19029>; else goto <D.19030>;
        <D.19029>:
        D.19031 = *_objptr;
        if (D.19031 != __old) goto <D.19032>; else goto <D.19033>;
        <D.19032>:
        gc_debug_file.21 = gc_debug_file;
        D.19031 = *_objptr;
        fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19031, __old);
        gc_debug_file.21 = gc_debug_file;
        fflush (gc_debug_file.21);
        <D.19033>:
        <D.19030>:
        <D.19028>:
      }
      <D.19026>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18452>:
      if (_bmap != 0) goto <D.18451>; else goto <D.18453>;
      <D.18453>:
    }
    goto <D.18403>;
    <D.18454>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.19034 = *bitmap_data;
      D.19035 = (unsigned int) D.19034;
      D.19036 = D.19035 + 4294967295;
      bwords = (int) D.19036;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.19037>; else goto <D.19038>;
      <D.19037>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.19039 = myobj->vtable;
        D.19040 = D.19039->klass;
        D.19041 = D.19040->name_space;
        D.19039 = myobj->vtable;
        D.19040 = D.19039->klass;
        D.19042 = D.19040->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19041, D.19042);
      }
      <D.19038>:
      goto <D.18466>;
      <D.18465>:
      {
        gsize _bmap;

        bitmap_data.23 = bitmap_data;
        bitmap_data = bitmap_data.23 + 8;
        _bmap = *bitmap_data.23;
        _objptr = start_run;
        goto <D.18463>;
        <D.18462>:
        D.19044 = _bmap & 1;
        if (D.19044 != 0) goto <D.19045>; else goto <D.19046>;
        <D.19045>:
        {
          void * __old;

          __old = *_objptr;
          if (__old != 0B) goto <D.19047>; else goto <D.19048>;
          <D.19047>:
          simple_nursery_serial_copy_object_from_obj (_objptr, queue);
          if (0 != 0) goto <D.19049>; else goto <D.19050>;
          <D.19049>:
          D.19051 = *_objptr;
          if (D.19051 != __old) goto <D.19052>; else goto <D.19053>;
          <D.19052>:
          gc_debug_file.21 = gc_debug_file;
          D.19051 = *_objptr;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19051, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.19053>:
          <D.19050>:
          <D.19048>:
        }
        <D.19046>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.18463>:
        if (_bmap != 0) goto <D.18462>; else goto <D.18464>;
        <D.18464>:
        start_run = start_run + 512;
      }
      <D.18466>:
      bwords.24 = bwords;
      bwords = bwords.24 + -1;
      if (bwords.24 > 0) goto <D.18465>; else goto <D.18467>;
      <D.18467>:
    }
    goto <D.18403>;
    <D.18468>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.19055 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.19055);
      mbitmap_data.25 = mbitmap_data;
      mbitmap_data = mbitmap_data.25 + 8;
      D.19057 = *mbitmap_data.25;
      D.19058 = (unsigned int) D.19057;
      D.19059 = D.19058 + 4294967295;
      mbwords = (int) D.19059;
      D.19060 = vt->klass;
      el_size = mono_array_element_size (D.19060);
      e_start = start + 32;
      D.18982 = MEM[(struct MonoArray *)start].max_length;
      el_size.26 = (unsigned int) el_size;
      D.19062 = D.18982 * el_size.26;
      D.19063 = (sizetype) D.19062;
      e_end = e_start + D.19063;
      if (0 != 0) goto <D.19064>; else goto <D.19065>;
      <D.19064>:
      D.19055 = vt->desc;
      D.19060 = vt->klass;
      D.19066 = D.19060->name_space;
      D.19060 = vt->klass;
      D.19067 = D.19060->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.19055, D.19066, D.19067);
      <D.19065>:
      goto <D.18487>;
      <D.18486>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.27 = bitmap_data;
          bitmap_data = bitmap_data.27 + 8;
          _bmap = *bitmap_data.27;
          start_run = _objptr;
          goto <D.18481>;
          <D.18480>:
          D.19069 = _bmap & 1;
          if (D.19069 != 0) goto <D.19070>; else goto <D.19071>;
          <D.19070>:
          {
            void * __old;

            __old = *_objptr;
            if (__old != 0B) goto <D.19072>; else goto <D.19073>;
            <D.19072>:
            simple_nursery_serial_copy_object_from_obj (_objptr, queue);
            if (0 != 0) goto <D.19074>; else goto <D.19075>;
            <D.19074>:
            D.19076 = *_objptr;
            if (D.19076 != __old) goto <D.19077>; else goto <D.19078>;
            <D.19077>:
            gc_debug_file.21 = gc_debug_file;
            D.19076 = *_objptr;
            fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19076, __old);
            gc_debug_file.21 = gc_debug_file;
            fflush (gc_debug_file.21);
            <D.19078>:
            <D.19075>:
            <D.19073>:
          }
          <D.19071>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.18481>:
          if (_bmap != 0) goto <D.18480>; else goto <D.18482>;
          <D.18482>:
          _objptr = start_run + 512;
        }
        <D.18484>:
        bwords.28 = bwords;
        bwords = bwords.28 + 4294967295;
        if (bwords.28 != 0) goto <D.18483>; else goto <D.18485>;
        <D.18485>:
        D.19080 = (sizetype) el_size;
        e_start = e_start + D.19080;
      }
      <D.18487>:
      if (e_start < e_end) goto <D.18486>; else goto <D.18488>;
      <D.18488>:
    }
    goto <D.18403>;
    <D.18489>:
    goto <D.18403>;
    <D.18490>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.18403>:
  }
}


simple_nursery_parallel_scan_vtype (char * start, mword desc, struct SgenGrayQueue * queue)
{
  long unsigned int D.19082;
  long unsigned int D.19083;
  long unsigned int D.19086;
  long unsigned int D.19087;
  long unsigned int D.19088;
  long unsigned int D.19089;
  long unsigned int D.19090;
  long unsigned int D.19091;
  struct FILE * gc_debug_file.29;
  void * D.19099;
  int iftmp.30;
  int D.19103;
  int D.19105;
  _Bool D.19107;
  long int D.19108;
  long int D.19109;
  int iftmp.31;
  int D.19121;
  int D.19123;
  _Bool D.19125;
  long int D.19126;
  long int D.19127;
  long unsigned int D.19130;
  long unsigned int D.19131;
  int D.19132;
  void * D.19139;
  int iftmp.32;
  int D.19143;
  int D.19145;
  _Bool D.19147;
  long int D.19148;
  long int D.19149;
  long unsigned int D.19152;
  long unsigned int D.19153;
  int D.19154;
  int iftmp.33;
  int D.19164;
  int D.19166;
  _Bool D.19168;
  long int D.19169;
  long int D.19170;
  long unsigned int D.19173;
  long unsigned int D.19176;
  int D.19177;
  int D.19178;
  unsigned int D.19181;
  unsigned int el_size.34;
  unsigned int D.19183;
  sizetype D.19184;
  void * D.19191;
  int iftmp.35;
  int D.19195;
  int D.19197;
  _Bool D.19199;
  long int D.19200;
  long int D.19201;
  int D.19207;
  int D.19208;
  long unsigned int D.19209;
  long unsigned int D.19210;
  long unsigned int D.19211;
  long unsigned int D.19212;
  void * * D.19213;
  void * D.19220;
  int iftmp.36;
  int D.19224;
  int D.19226;
  _Bool D.19228;
  long int D.19229;
  long int D.19230;
  sizetype D.19233;
  long unsigned int D.19237;
  void * D.19246;
  int iftmp.37;
  int D.19250;
  int D.19252;
  _Bool D.19254;
  long int D.19255;
  long int D.19256;
  long unsigned int D.19259;
  void * D.19268;
  int iftmp.38;
  int D.19272;
  int D.19274;
  _Bool D.19276;
  long int D.19277;
  long int D.19278;
  long unsigned int D.19281;
  unsigned int D.19282;
  unsigned int D.19283;
  struct MonoVTable * D.19286;
  struct MonoClass * D.19287;
  const char * D.19288;
  const char * D.19289;
  gsize * bitmap_data.39;
  long unsigned int D.19291;
  void * D.19300;
  int iftmp.40;
  int D.19304;
  int D.19306;
  _Bool D.19308;
  long int D.19309;
  long int D.19310;
  int bwords.41;

  start = start + 18446744073709551600;
  D.19082 = desc & 7;
  switch (D.19082) <default: <D.18388>, case 1: <D.18305>, case 2: <D.18316>, case 3: <D.18372>, case 4: <D.18328>, case 5: <D.18364>, case 7: <D.18387>>
  <D.18305>:
  D.19083 = desc & 4294901760;
  if (D.19083 != 0) goto <D.19084>; else goto <D.19085>;
  <D.19084>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.19086 = desc >> 16;
    D.19087 = D.19086 & 255;
    D.19088 = D.19087 * 8;
    _objptr = _objptr + D.19088;
    D.19089 = desc >> 24;
    D.19090 = D.19089 & 255;
    D.19091 = D.19090 * 8;
    _objptr_end = _objptr + D.19091;
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19092>; else goto <D.19093>;
      <D.19092>:
      simple_nursery_parallel_copy_object (_objptr, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19094>; else goto <D.19095>;
      <D.19094>:
      if (__old != __copy) goto <D.19096>; else goto <D.19097>;
      <D.19096>:
      gc_debug_file.29 = gc_debug_file;
      D.19099 = *_objptr;
      fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19099, __old);
      gc_debug_file.29 = gc_debug_file;
      fflush (gc_debug_file.29);
      <D.19097>:
      <D.19095>:
      D.19103 = sgen_ptr_in_nursery (__copy);
      if (D.19103 != 0) goto <D.19104>; else goto <D.19101>;
      <D.19104>:
      D.19105 = sgen_ptr_in_nursery (_objptr);
      if (D.19105 == 0) goto <D.19106>; else goto <D.19101>;
      <D.19106>:
      iftmp.30 = 1;
      goto <D.19102>;
      <D.19101>:
      iftmp.30 = 0;
      <D.19102>:
      D.19107 = iftmp.30 != 0;
      D.19108 = (long int) D.19107;
      D.19109 = __builtin_expect (D.19108, 0);
      if (D.19109 != 0) goto <D.19110>; else goto <D.19111>;
      <D.19110>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19111>:
      <D.19093>:
    }
    _objptr = _objptr + 8;
    goto <D.18313>;
    <D.18312>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19112>; else goto <D.19113>;
      <D.19112>:
      simple_nursery_parallel_copy_object (_objptr, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19114>; else goto <D.19115>;
      <D.19114>:
      if (__old != __copy) goto <D.19116>; else goto <D.19117>;
      <D.19116>:
      gc_debug_file.29 = gc_debug_file;
      D.19099 = *_objptr;
      fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19099, __old);
      gc_debug_file.29 = gc_debug_file;
      fflush (gc_debug_file.29);
      <D.19117>:
      <D.19115>:
      D.19121 = sgen_ptr_in_nursery (__copy);
      if (D.19121 != 0) goto <D.19122>; else goto <D.19119>;
      <D.19122>:
      D.19123 = sgen_ptr_in_nursery (_objptr);
      if (D.19123 == 0) goto <D.19124>; else goto <D.19119>;
      <D.19124>:
      iftmp.31 = 1;
      goto <D.19120>;
      <D.19119>:
      iftmp.31 = 0;
      <D.19120>:
      D.19125 = iftmp.31 != 0;
      D.19126 = (long int) D.19125;
      D.19127 = __builtin_expect (D.19126, 0);
      if (D.19127 != 0) goto <D.19128>; else goto <D.19129>;
      <D.19128>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19129>:
      <D.19113>:
    }
    _objptr = _objptr + 8;
    <D.18313>:
    if (_objptr < _objptr_end) goto <D.18312>; else goto <D.18314>;
    <D.18314>:
  }
  <D.19085>:
  goto <D.18315>;
  <D.18316>:
  {
    void * * _objptr;
    gsize _bmap;

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

      _index = __builtin_ctzl (_bmap);
      D.19130 = (long unsigned int) _index;
      D.19131 = D.19130 * 8;
      _objptr = _objptr + D.19131;
      D.19132 = _index + 1;
      _bmap = _bmap >> D.19132;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19133>; else goto <D.19134>;
        <D.19133>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19135>; else goto <D.19136>;
        <D.19135>:
        if (__old != __copy) goto <D.19137>; else goto <D.19138>;
        <D.19137>:
        gc_debug_file.29 = gc_debug_file;
        D.19139 = *_objptr;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19139, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19138>:
        <D.19136>:
        D.19143 = sgen_ptr_in_nursery (__copy);
        if (D.19143 != 0) goto <D.19144>; else goto <D.19141>;
        <D.19144>:
        D.19145 = sgen_ptr_in_nursery (_objptr);
        if (D.19145 == 0) goto <D.19146>; else goto <D.19141>;
        <D.19146>:
        iftmp.32 = 1;
        goto <D.19142>;
        <D.19141>:
        iftmp.32 = 0;
        <D.19142>:
        D.19147 = iftmp.32 != 0;
        D.19148 = (long int) D.19147;
        D.19149 = __builtin_expect (D.19148, 0);
        if (D.19149 != 0) goto <D.19150>; else goto <D.19151>;
        <D.19150>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19151>:
        <D.19134>:
      }
      _objptr = _objptr + 8;
    }
    goto <D.18326>;
    <D.18325>:
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.19152 = (long unsigned int) _index;
      D.19153 = D.19152 * 8;
      _objptr = _objptr + D.19153;
      D.19154 = _index + 1;
      _bmap = _bmap >> D.19154;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19155>; else goto <D.19156>;
        <D.19155>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19157>; else goto <D.19158>;
        <D.19157>:
        if (__old != __copy) goto <D.19159>; else goto <D.19160>;
        <D.19159>:
        gc_debug_file.29 = gc_debug_file;
        D.19139 = *_objptr;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19139, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19160>:
        <D.19158>:
        D.19164 = sgen_ptr_in_nursery (__copy);
        if (D.19164 != 0) goto <D.19165>; else goto <D.19162>;
        <D.19165>:
        D.19166 = sgen_ptr_in_nursery (_objptr);
        if (D.19166 == 0) goto <D.19167>; else goto <D.19162>;
        <D.19167>:
        iftmp.33 = 1;
        goto <D.19163>;
        <D.19162>:
        iftmp.33 = 0;
        <D.19163>:
        D.19168 = iftmp.33 != 0;
        D.19169 = (long int) D.19168;
        D.19170 = __builtin_expect (D.19169, 0);
        if (D.19170 != 0) goto <D.19171>; else goto <D.19172>;
        <D.19171>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19172>:
        <D.19156>:
      }
      _objptr = _objptr + 8;
    }
    <D.18326>:
    if (_bmap != 0) goto <D.18325>; else goto <D.18327>;
    <D.18327>:
  }
  goto <D.18315>;
  <D.18328>:
  D.19173 = desc & 4294950912;
  if (D.19173 != 0) goto <D.19174>; else goto <D.19175>;
  <D.19174>:
  {
    int el_size;
    int etype;

    D.19176 = desc >> 3;
    D.19177 = (int) D.19176;
    el_size = D.19177 & 1023;
    D.19178 = (int) desc;
    etype = D.19178 & 49152;
    if (etype == 16384) goto <D.19179>; else goto <D.19180>;
    <D.19179>:
    {
      void * * p;
      void * * end_refs;

      p = start + 32;
      D.19181 = MEM[(struct MonoArray *)start].max_length;
      el_size.34 = (unsigned int) el_size;
      D.19183 = D.19181 * el_size.34;
      D.19184 = (sizetype) D.19183;
      end_refs = p + D.19184;
      goto <D.18336>;
      <D.18335>:
      {
        void * __old;
        void * __copy;

        __old = *p;
        if (__old != 0B) goto <D.19185>; else goto <D.19186>;
        <D.19185>:
        simple_nursery_parallel_copy_object (p, queue);
        __copy = *p;
        if (0 != 0) goto <D.19187>; else goto <D.19188>;
        <D.19187>:
        if (__old != __copy) goto <D.19189>; else goto <D.19190>;
        <D.19189>:
        gc_debug_file.29 = gc_debug_file;
        D.19191 = *p;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", p, D.19191, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19190>:
        <D.19188>:
        D.19195 = sgen_ptr_in_nursery (__copy);
        if (D.19195 != 0) goto <D.19196>; else goto <D.19193>;
        <D.19196>:
        D.19197 = sgen_ptr_in_nursery (p);
        if (D.19197 == 0) goto <D.19198>; else goto <D.19193>;
        <D.19198>:
        iftmp.35 = 1;
        goto <D.19194>;
        <D.19193>:
        iftmp.35 = 0;
        <D.19194>:
        D.19199 = iftmp.35 != 0;
        D.19200 = (long int) D.19199;
        D.19201 = __builtin_expect (D.19200, 0);
        if (D.19201 != 0) goto <D.19202>; else goto <D.19203>;
        <D.19202>:
        sgen_add_to_global_remset (p, __copy);
        <D.19203>:
        <D.19186>:
      }
      p = p + 8;
      <D.18336>:
      if (p < end_refs) goto <D.18335>; else goto <D.18337>;
      <D.18337>:
    }
    goto <D.19204>;
    <D.19180>:
    if (etype == 32768) goto <D.19205>; else goto <D.19206>;
    <D.19205>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.19086 = desc >> 16;
      D.19207 = (int) D.19086;
      offset = D.19207 & 255;
      D.19089 = desc >> 24;
      D.19208 = (int) D.19089;
      num_refs = D.19208 & 255;
      e_start = start + 32;
      D.19181 = MEM[(struct MonoArray *)start].max_length;
      el_size.34 = (unsigned int) el_size;
      D.19183 = D.19181 * el_size.34;
      D.19184 = (sizetype) D.19183;
      e_end = e_start + D.19184;
      goto <D.18350>;
      <D.18349>:
      {
        void * * p;
        int i;

        p = e_start;
        D.19209 = (long unsigned int) offset;
        D.19210 = D.19209 * 8;
        p = p + D.19210;
        i = 0;
        goto <D.18347>;
        <D.18346>:
        {
          void * __old;
          void * __copy;

          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          __old = *D.19213;
          if (__old != 0B) goto <D.19214>; else goto <D.19215>;
          <D.19214>:
          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          simple_nursery_parallel_copy_object (D.19213, queue);
          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          __copy = *D.19213;
          if (0 != 0) goto <D.19216>; else goto <D.19217>;
          <D.19216>:
          if (__old != __copy) goto <D.19218>; else goto <D.19219>;
          <D.19218>:
          gc_debug_file.29 = gc_debug_file;
          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          D.19220 = *D.19213;
          fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", D.19213, D.19220, __old);
          gc_debug_file.29 = gc_debug_file;
          fflush (gc_debug_file.29);
          <D.19219>:
          <D.19217>:
          D.19224 = sgen_ptr_in_nursery (__copy);
          if (D.19224 != 0) goto <D.19225>; else goto <D.19222>;
          <D.19225>:
          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          D.19226 = sgen_ptr_in_nursery (D.19213);
          if (D.19226 == 0) goto <D.19227>; else goto <D.19222>;
          <D.19227>:
          iftmp.36 = 1;
          goto <D.19223>;
          <D.19222>:
          iftmp.36 = 0;
          <D.19223>:
          D.19228 = iftmp.36 != 0;
          D.19229 = (long int) D.19228;
          D.19230 = __builtin_expect (D.19229, 0);
          if (D.19230 != 0) goto <D.19231>; else goto <D.19232>;
          <D.19231>:
          D.19211 = (long unsigned int) i;
          D.19212 = D.19211 * 8;
          D.19213 = p + D.19212;
          sgen_add_to_global_remset (D.19213, __copy);
          <D.19232>:
          <D.19215>:
        }
        i = i + 1;
        <D.18347>:
        if (i < num_refs) goto <D.18346>; else goto <D.18348>;
        <D.18348>:
        D.19233 = (sizetype) el_size;
        e_start = e_start + D.19233;
      }
      <D.18350>:
      if (e_start < e_end) goto <D.18349>; else goto <D.18351>;
      <D.18351>:
    }
    goto <D.19234>;
    <D.19206>:
    if (etype == 49152) goto <D.19235>; else goto <D.19236>;
    <D.19235>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 32;
      D.19181 = MEM[(struct MonoArray *)start].max_length;
      el_size.34 = (unsigned int) el_size;
      D.19183 = D.19181 * el_size.34;
      D.19184 = (sizetype) D.19183;
      e_end = e_start + D.19184;
      goto <D.18362>;
      <D.18361>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.18359>;
        <D.18358>:
        D.19237 = _bmap & 1;
        if (D.19237 != 0) goto <D.19238>; else goto <D.19239>;
        <D.19238>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.19240>; else goto <D.19241>;
          <D.19240>:
          simple_nursery_parallel_copy_object (p, queue);
          __copy = *p;
          if (0 != 0) goto <D.19242>; else goto <D.19243>;
          <D.19242>:
          if (__old != __copy) goto <D.19244>; else goto <D.19245>;
          <D.19244>:
          gc_debug_file.29 = gc_debug_file;
          D.19246 = *p;
          fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", p, D.19246, __old);
          gc_debug_file.29 = gc_debug_file;
          fflush (gc_debug_file.29);
          <D.19245>:
          <D.19243>:
          D.19250 = sgen_ptr_in_nursery (__copy);
          if (D.19250 != 0) goto <D.19251>; else goto <D.19248>;
          <D.19251>:
          D.19252 = sgen_ptr_in_nursery (p);
          if (D.19252 == 0) goto <D.19253>; else goto <D.19248>;
          <D.19253>:
          iftmp.37 = 1;
          goto <D.19249>;
          <D.19248>:
          iftmp.37 = 0;
          <D.19249>:
          D.19254 = iftmp.37 != 0;
          D.19255 = (long int) D.19254;
          D.19256 = __builtin_expect (D.19255, 0);
          if (D.19256 != 0) goto <D.19257>; else goto <D.19258>;
          <D.19257>:
          sgen_add_to_global_remset (p, __copy);
          <D.19258>:
          <D.19241>:
        }
        <D.19239>:
        _bmap = _bmap >> 1;
        p = p + 8;
        <D.18359>:
        if (_bmap != 0) goto <D.18358>; else goto <D.18360>;
        <D.18360>:
        D.19233 = (sizetype) el_size;
        e_start = e_start + D.19233;
      }
      <D.18362>:
      if (e_start < e_end) goto <D.18361>; else goto <D.18363>;
      <D.18363>:
    }
    <D.19236>:
    <D.19234>:
    <D.19204>:
  }
  <D.19175>:
  goto <D.18315>;
  <D.18364>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 16;
    goto <D.18370>;
    <D.18369>:
    D.19259 = _bmap & 1;
    if (D.19259 != 0) goto <D.19260>; else goto <D.19261>;
    <D.19260>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19262>; else goto <D.19263>;
      <D.19262>:
      simple_nursery_parallel_copy_object (_objptr, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19264>; else goto <D.19265>;
      <D.19264>:
      if (__old != __copy) goto <D.19266>; else goto <D.19267>;
      <D.19266>:
      gc_debug_file.29 = gc_debug_file;
      D.19268 = *_objptr;
      fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19268, __old);
      gc_debug_file.29 = gc_debug_file;
      fflush (gc_debug_file.29);
      <D.19267>:
      <D.19265>:
      D.19272 = sgen_ptr_in_nursery (__copy);
      if (D.19272 != 0) goto <D.19273>; else goto <D.19270>;
      <D.19273>:
      D.19274 = sgen_ptr_in_nursery (_objptr);
      if (D.19274 == 0) goto <D.19275>; else goto <D.19270>;
      <D.19275>:
      iftmp.38 = 1;
      goto <D.19271>;
      <D.19270>:
      iftmp.38 = 0;
      <D.19271>:
      D.19276 = iftmp.38 != 0;
      D.19277 = (long int) D.19276;
      D.19278 = __builtin_expect (D.19277, 0);
      if (D.19278 != 0) goto <D.19279>; else goto <D.19280>;
      <D.19279>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19280>:
      <D.19263>:
    }
    <D.19261>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 8;
    <D.18370>:
    if (_bmap != 0) goto <D.18369>; else goto <D.18371>;
    <D.18371>:
  }
  goto <D.18315>;
  <D.18372>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.19281 = *bitmap_data;
    D.19282 = (unsigned int) D.19281;
    D.19283 = D.19282 + 4294967295;
    bwords = (int) D.19283;
    start_run = _objptr;
    bitmap_data = bitmap_data + 8;
    if (0 != 0) goto <D.19284>; else goto <D.19285>;
    <D.19284>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.19286 = myobj->vtable;
      D.19287 = D.19286->klass;
      D.19288 = D.19287->name_space;
      D.19286 = myobj->vtable;
      D.19287 = D.19286->klass;
      D.19289 = D.19287->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19288, D.19289);
    }
    <D.19285>:
    goto <D.18385>;
    <D.18384>:
    {
      gsize _bmap;

      bitmap_data.39 = bitmap_data;
      bitmap_data = bitmap_data.39 + 8;
      _bmap = *bitmap_data.39;
      _objptr = start_run;
      goto <D.18382>;
      <D.18381>:
      D.19291 = _bmap & 1;
      if (D.19291 != 0) goto <D.19292>; else goto <D.19293>;
      <D.19292>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19294>; else goto <D.19295>;
        <D.19294>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19296>; else goto <D.19297>;
        <D.19296>:
        if (__old != __copy) goto <D.19298>; else goto <D.19299>;
        <D.19298>:
        gc_debug_file.29 = gc_debug_file;
        D.19300 = *_objptr;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19300, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19299>:
        <D.19297>:
        D.19304 = sgen_ptr_in_nursery (__copy);
        if (D.19304 != 0) goto <D.19305>; else goto <D.19302>;
        <D.19305>:
        D.19306 = sgen_ptr_in_nursery (_objptr);
        if (D.19306 == 0) goto <D.19307>; else goto <D.19302>;
        <D.19307>:
        iftmp.40 = 1;
        goto <D.19303>;
        <D.19302>:
        iftmp.40 = 0;
        <D.19303>:
        D.19308 = iftmp.40 != 0;
        D.19309 = (long int) D.19308;
        D.19310 = __builtin_expect (D.19309, 0);
        if (D.19310 != 0) goto <D.19311>; else goto <D.19312>;
        <D.19311>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19312>:
        <D.19295>:
      }
      <D.19293>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18382>:
      if (_bmap != 0) goto <D.18381>; else goto <D.18383>;
      <D.18383>:
      start_run = start_run + 512;
    }
    <D.18385>:
    bwords.41 = bwords;
    bwords = bwords.41 + -1;
    if (bwords.41 > 0) goto <D.18384>; else goto <D.18386>;
    <D.18386>:
  }
  goto <D.18315>;
  <D.18387>:
  goto <D.18315>;
  <D.18388>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.18315>:
}


simple_nursery_parallel_scan_object (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.19315;
  long unsigned int D.19316;
  long unsigned int D.19317;
  long unsigned int D.19318;
  long unsigned int D.19321;
  long unsigned int D.19322;
  long unsigned int D.19323;
  long unsigned int D.19324;
  long unsigned int D.19325;
  long unsigned int D.19326;
  struct FILE * gc_debug_file.42;
  void * D.19334;
  int iftmp.43;
  int D.19338;
  int D.19340;
  _Bool D.19342;
  long int D.19343;
  long int D.19344;
  int iftmp.44;
  int D.19356;
  int D.19358;
  _Bool D.19360;
  long int D.19361;
  long int D.19362;
  long unsigned int D.19365;
  long unsigned int D.19366;
  int D.19367;
  void * D.19374;
  int iftmp.45;
  int D.19378;
  int D.19380;
  _Bool D.19382;
  long int D.19383;
  long int D.19384;
  long unsigned int D.19387;
  long unsigned int D.19388;
  int D.19389;
  int iftmp.46;
  int D.19399;
  int D.19401;
  _Bool D.19403;
  long int D.19404;
  long int D.19405;
  long unsigned int D.19408;
  long unsigned int D.19411;
  int D.19412;
  int D.19413;
  unsigned int D.19416;
  unsigned int el_size.47;
  unsigned int D.19418;
  sizetype D.19419;
  void * D.19426;
  int iftmp.48;
  int D.19430;
  int D.19432;
  _Bool D.19434;
  long int D.19435;
  long int D.19436;
  int D.19442;
  int D.19443;
  long unsigned int D.19444;
  long unsigned int D.19445;
  long unsigned int D.19446;
  long unsigned int D.19447;
  void * * D.19448;
  void * D.19455;
  int iftmp.49;
  int D.19459;
  int D.19461;
  _Bool D.19463;
  long int D.19464;
  long int D.19465;
  sizetype D.19468;
  long unsigned int D.19472;
  void * D.19481;
  int iftmp.50;
  int D.19485;
  int D.19487;
  _Bool D.19489;
  long int D.19490;
  long int D.19491;
  long unsigned int D.19494;
  void * D.19503;
  int iftmp.51;
  int D.19507;
  int D.19509;
  _Bool D.19511;
  long int D.19512;
  long int D.19513;
  long unsigned int D.19516;
  unsigned int D.19517;
  unsigned int D.19518;
  struct MonoVTable * D.19521;
  struct MonoClass * D.19522;
  const char * D.19523;
  const char * D.19524;
  gsize * bitmap_data.52;
  long unsigned int D.19526;
  void * D.19535;
  int iftmp.53;
  int D.19539;
  int D.19541;
  _Bool D.19543;
  long int D.19544;
  long int D.19545;
  int bwords.54;
  long unsigned int D.19549;
  gsize * mbitmap_data.55;
  long unsigned int D.19551;
  unsigned int D.19552;
  unsigned int D.19553;
  struct MonoClass * D.19554;
  unsigned int el_size.56;
  unsigned int D.19556;
  sizetype D.19557;
  const char * D.19560;
  const char * D.19561;
  gsize * bitmap_data.57;
  long unsigned int D.19563;
  void * D.19572;
  int iftmp.58;
  int D.19576;
  int D.19578;
  _Bool D.19580;
  long int D.19581;
  long int D.19582;
  unsigned int bwords.59;
  sizetype D.19586;

  {
    struct GCVTable * vt;
    mword desc;

    D.19315 = MEM[(mword *)start];
    D.19316 = D.19315 & 18446744073709551612;
    vt = (struct GCVTable *) D.19316;
    desc = vt->desc;
    D.19317 = desc & 7;
    switch (D.19317) <default: <D.18299>, case 1: <D.18194>, case 2: <D.18205>, case 3: <D.18261>, case 4: <D.18217>, case 5: <D.18253>, case 6: <D.18276>, case 7: <D.18298>>
    <D.18194>:
    D.19318 = desc & 4294901760;
    if (D.19318 != 0) goto <D.19319>; else goto <D.19320>;
    <D.19319>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.19321 = desc >> 16;
      D.19322 = D.19321 & 255;
      D.19323 = D.19322 * 8;
      _objptr = _objptr + D.19323;
      D.19324 = desc >> 24;
      D.19325 = D.19324 & 255;
      D.19326 = D.19325 * 8;
      _objptr_end = _objptr + D.19326;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19327>; else goto <D.19328>;
        <D.19327>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19329>; else goto <D.19330>;
        <D.19329>:
        if (__old != __copy) goto <D.19331>; else goto <D.19332>;
        <D.19331>:
        gc_debug_file.42 = gc_debug_file;
        D.19334 = *_objptr;
        fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19334, __old);
        gc_debug_file.42 = gc_debug_file;
        fflush (gc_debug_file.42);
        <D.19332>:
        <D.19330>:
        D.19338 = sgen_ptr_in_nursery (__copy);
        if (D.19338 != 0) goto <D.19339>; else goto <D.19336>;
        <D.19339>:
        D.19340 = sgen_ptr_in_nursery (_objptr);
        if (D.19340 == 0) goto <D.19341>; else goto <D.19336>;
        <D.19341>:
        iftmp.43 = 1;
        goto <D.19337>;
        <D.19336>:
        iftmp.43 = 0;
        <D.19337>:
        D.19342 = iftmp.43 != 0;
        D.19343 = (long int) D.19342;
        D.19344 = __builtin_expect (D.19343, 0);
        if (D.19344 != 0) goto <D.19345>; else goto <D.19346>;
        <D.19345>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19346>:
        <D.19328>:
      }
      _objptr = _objptr + 8;
      goto <D.18202>;
      <D.18201>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19347>; else goto <D.19348>;
        <D.19347>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19349>; else goto <D.19350>;
        <D.19349>:
        if (__old != __copy) goto <D.19351>; else goto <D.19352>;
        <D.19351>:
        gc_debug_file.42 = gc_debug_file;
        D.19334 = *_objptr;
        fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19334, __old);
        gc_debug_file.42 = gc_debug_file;
        fflush (gc_debug_file.42);
        <D.19352>:
        <D.19350>:
        D.19356 = sgen_ptr_in_nursery (__copy);
        if (D.19356 != 0) goto <D.19357>; else goto <D.19354>;
        <D.19357>:
        D.19358 = sgen_ptr_in_nursery (_objptr);
        if (D.19358 == 0) goto <D.19359>; else goto <D.19354>;
        <D.19359>:
        iftmp.44 = 1;
        goto <D.19355>;
        <D.19354>:
        iftmp.44 = 0;
        <D.19355>:
        D.19360 = iftmp.44 != 0;
        D.19361 = (long int) D.19360;
        D.19362 = __builtin_expect (D.19361, 0);
        if (D.19362 != 0) goto <D.19363>; else goto <D.19364>;
        <D.19363>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19364>:
        <D.19348>:
      }
      _objptr = _objptr + 8;
      <D.18202>:
      if (_objptr < _objptr_end) goto <D.18201>; else goto <D.18203>;
      <D.18203>:
    }
    <D.19320>:
    goto <D.18204>;
    <D.18205>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.19365 = (long unsigned int) _index;
        D.19366 = D.19365 * 8;
        _objptr = _objptr + D.19366;
        D.19367 = _index + 1;
        _bmap = _bmap >> D.19367;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.19368>; else goto <D.19369>;
          <D.19368>:
          simple_nursery_parallel_copy_object (_objptr, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.19370>; else goto <D.19371>;
          <D.19370>:
          if (__old != __copy) goto <D.19372>; else goto <D.19373>;
          <D.19372>:
          gc_debug_file.42 = gc_debug_file;
          D.19374 = *_objptr;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19374, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19373>:
          <D.19371>:
          D.19378 = sgen_ptr_in_nursery (__copy);
          if (D.19378 != 0) goto <D.19379>; else goto <D.19376>;
          <D.19379>:
          D.19380 = sgen_ptr_in_nursery (_objptr);
          if (D.19380 == 0) goto <D.19381>; else goto <D.19376>;
          <D.19381>:
          iftmp.45 = 1;
          goto <D.19377>;
          <D.19376>:
          iftmp.45 = 0;
          <D.19377>:
          D.19382 = iftmp.45 != 0;
          D.19383 = (long int) D.19382;
          D.19384 = __builtin_expect (D.19383, 0);
          if (D.19384 != 0) goto <D.19385>; else goto <D.19386>;
          <D.19385>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.19386>:
          <D.19369>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.18215>;
      <D.18214>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.19387 = (long unsigned int) _index;
        D.19388 = D.19387 * 8;
        _objptr = _objptr + D.19388;
        D.19389 = _index + 1;
        _bmap = _bmap >> D.19389;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.19390>; else goto <D.19391>;
          <D.19390>:
          simple_nursery_parallel_copy_object (_objptr, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.19392>; else goto <D.19393>;
          <D.19392>:
          if (__old != __copy) goto <D.19394>; else goto <D.19395>;
          <D.19394>:
          gc_debug_file.42 = gc_debug_file;
          D.19374 = *_objptr;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19374, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19395>:
          <D.19393>:
          D.19399 = sgen_ptr_in_nursery (__copy);
          if (D.19399 != 0) goto <D.19400>; else goto <D.19397>;
          <D.19400>:
          D.19401 = sgen_ptr_in_nursery (_objptr);
          if (D.19401 == 0) goto <D.19402>; else goto <D.19397>;
          <D.19402>:
          iftmp.46 = 1;
          goto <D.19398>;
          <D.19397>:
          iftmp.46 = 0;
          <D.19398>:
          D.19403 = iftmp.46 != 0;
          D.19404 = (long int) D.19403;
          D.19405 = __builtin_expect (D.19404, 0);
          if (D.19405 != 0) goto <D.19406>; else goto <D.19407>;
          <D.19406>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.19407>:
          <D.19391>:
        }
        _objptr = _objptr + 8;
      }
      <D.18215>:
      if (_bmap != 0) goto <D.18214>; else goto <D.18216>;
      <D.18216>:
    }
    goto <D.18204>;
    <D.18217>:
    D.19408 = desc & 4294950912;
    if (D.19408 != 0) goto <D.19409>; else goto <D.19410>;
    <D.19409>:
    {
      int el_size;
      int etype;

      D.19411 = desc >> 3;
      D.19412 = (int) D.19411;
      el_size = D.19412 & 1023;
      D.19413 = (int) desc;
      etype = D.19413 & 49152;
      if (etype == 16384) goto <D.19414>; else goto <D.19415>;
      <D.19414>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.19416 = MEM[(struct MonoArray *)start].max_length;
        el_size.47 = (unsigned int) el_size;
        D.19418 = D.19416 * el_size.47;
        D.19419 = (sizetype) D.19418;
        end_refs = p + D.19419;
        goto <D.18225>;
        <D.18224>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.19420>; else goto <D.19421>;
          <D.19420>:
          simple_nursery_parallel_copy_object (p, queue);
          __copy = *p;
          if (0 != 0) goto <D.19422>; else goto <D.19423>;
          <D.19422>:
          if (__old != __copy) goto <D.19424>; else goto <D.19425>;
          <D.19424>:
          gc_debug_file.42 = gc_debug_file;
          D.19426 = *p;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", p, D.19426, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19425>:
          <D.19423>:
          D.19430 = sgen_ptr_in_nursery (__copy);
          if (D.19430 != 0) goto <D.19431>; else goto <D.19428>;
          <D.19431>:
          D.19432 = sgen_ptr_in_nursery (p);
          if (D.19432 == 0) goto <D.19433>; else goto <D.19428>;
          <D.19433>:
          iftmp.48 = 1;
          goto <D.19429>;
          <D.19428>:
          iftmp.48 = 0;
          <D.19429>:
          D.19434 = iftmp.48 != 0;
          D.19435 = (long int) D.19434;
          D.19436 = __builtin_expect (D.19435, 0);
          if (D.19436 != 0) goto <D.19437>; else goto <D.19438>;
          <D.19437>:
          sgen_add_to_global_remset (p, __copy);
          <D.19438>:
          <D.19421>:
        }
        p = p + 8;
        <D.18225>:
        if (p < end_refs) goto <D.18224>; else goto <D.18226>;
        <D.18226>:
      }
      goto <D.19439>;
      <D.19415>:
      if (etype == 32768) goto <D.19440>; else goto <D.19441>;
      <D.19440>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.19321 = desc >> 16;
        D.19442 = (int) D.19321;
        offset = D.19442 & 255;
        D.19324 = desc >> 24;
        D.19443 = (int) D.19324;
        num_refs = D.19443 & 255;
        e_start = start + 32;
        D.19416 = MEM[(struct MonoArray *)start].max_length;
        el_size.47 = (unsigned int) el_size;
        D.19418 = D.19416 * el_size.47;
        D.19419 = (sizetype) D.19418;
        e_end = e_start + D.19419;
        goto <D.18239>;
        <D.18238>:
        {
          void * * p;
          int i;

          p = e_start;
          D.19444 = (long unsigned int) offset;
          D.19445 = D.19444 * 8;
          p = p + D.19445;
          i = 0;
          goto <D.18236>;
          <D.18235>:
          {
            void * __old;
            void * __copy;

            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            __old = *D.19448;
            if (__old != 0B) goto <D.19449>; else goto <D.19450>;
            <D.19449>:
            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            simple_nursery_parallel_copy_object (D.19448, queue);
            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            __copy = *D.19448;
            if (0 != 0) goto <D.19451>; else goto <D.19452>;
            <D.19451>:
            if (__old != __copy) goto <D.19453>; else goto <D.19454>;
            <D.19453>:
            gc_debug_file.42 = gc_debug_file;
            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            D.19455 = *D.19448;
            fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", D.19448, D.19455, __old);
            gc_debug_file.42 = gc_debug_file;
            fflush (gc_debug_file.42);
            <D.19454>:
            <D.19452>:
            D.19459 = sgen_ptr_in_nursery (__copy);
            if (D.19459 != 0) goto <D.19460>; else goto <D.19457>;
            <D.19460>:
            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            D.19461 = sgen_ptr_in_nursery (D.19448);
            if (D.19461 == 0) goto <D.19462>; else goto <D.19457>;
            <D.19462>:
            iftmp.49 = 1;
            goto <D.19458>;
            <D.19457>:
            iftmp.49 = 0;
            <D.19458>:
            D.19463 = iftmp.49 != 0;
            D.19464 = (long int) D.19463;
            D.19465 = __builtin_expect (D.19464, 0);
            if (D.19465 != 0) goto <D.19466>; else goto <D.19467>;
            <D.19466>:
            D.19446 = (long unsigned int) i;
            D.19447 = D.19446 * 8;
            D.19448 = p + D.19447;
            sgen_add_to_global_remset (D.19448, __copy);
            <D.19467>:
            <D.19450>:
          }
          i = i + 1;
          <D.18236>:
          if (i < num_refs) goto <D.18235>; else goto <D.18237>;
          <D.18237>:
          D.19468 = (sizetype) el_size;
          e_start = e_start + D.19468;
        }
        <D.18239>:
        if (e_start < e_end) goto <D.18238>; else goto <D.18240>;
        <D.18240>:
      }
      goto <D.19469>;
      <D.19441>:
      if (etype == 49152) goto <D.19470>; else goto <D.19471>;
      <D.19470>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.19416 = MEM[(struct MonoArray *)start].max_length;
        el_size.47 = (unsigned int) el_size;
        D.19418 = D.19416 * el_size.47;
        D.19419 = (sizetype) D.19418;
        e_end = e_start + D.19419;
        goto <D.18251>;
        <D.18250>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.18248>;
          <D.18247>:
          D.19472 = _bmap & 1;
          if (D.19472 != 0) goto <D.19473>; else goto <D.19474>;
          <D.19473>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.19475>; else goto <D.19476>;
            <D.19475>:
            simple_nursery_parallel_copy_object (p, queue);
            __copy = *p;
            if (0 != 0) goto <D.19477>; else goto <D.19478>;
            <D.19477>:
            if (__old != __copy) goto <D.19479>; else goto <D.19480>;
            <D.19479>:
            gc_debug_file.42 = gc_debug_file;
            D.19481 = *p;
            fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", p, D.19481, __old);
            gc_debug_file.42 = gc_debug_file;
            fflush (gc_debug_file.42);
            <D.19480>:
            <D.19478>:
            D.19485 = sgen_ptr_in_nursery (__copy);
            if (D.19485 != 0) goto <D.19486>; else goto <D.19483>;
            <D.19486>:
            D.19487 = sgen_ptr_in_nursery (p);
            if (D.19487 == 0) goto <D.19488>; else goto <D.19483>;
            <D.19488>:
            iftmp.50 = 1;
            goto <D.19484>;
            <D.19483>:
            iftmp.50 = 0;
            <D.19484>:
            D.19489 = iftmp.50 != 0;
            D.19490 = (long int) D.19489;
            D.19491 = __builtin_expect (D.19490, 0);
            if (D.19491 != 0) goto <D.19492>; else goto <D.19493>;
            <D.19492>:
            sgen_add_to_global_remset (p, __copy);
            <D.19493>:
            <D.19476>:
          }
          <D.19474>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.18248>:
          if (_bmap != 0) goto <D.18247>; else goto <D.18249>;
          <D.18249>:
          D.19468 = (sizetype) el_size;
          e_start = e_start + D.19468;
        }
        <D.18251>:
        if (e_start < e_end) goto <D.18250>; else goto <D.18252>;
        <D.18252>:
      }
      <D.19471>:
      <D.19469>:
      <D.19439>:
    }
    <D.19410>:
    goto <D.18204>;
    <D.18253>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.18259>;
      <D.18258>:
      D.19494 = _bmap & 1;
      if (D.19494 != 0) goto <D.19495>; else goto <D.19496>;
      <D.19495>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19497>; else goto <D.19498>;
        <D.19497>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19499>; else goto <D.19500>;
        <D.19499>:
        if (__old != __copy) goto <D.19501>; else goto <D.19502>;
        <D.19501>:
        gc_debug_file.42 = gc_debug_file;
        D.19503 = *_objptr;
        fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19503, __old);
        gc_debug_file.42 = gc_debug_file;
        fflush (gc_debug_file.42);
        <D.19502>:
        <D.19500>:
        D.19507 = sgen_ptr_in_nursery (__copy);
        if (D.19507 != 0) goto <D.19508>; else goto <D.19505>;
        <D.19508>:
        D.19509 = sgen_ptr_in_nursery (_objptr);
        if (D.19509 == 0) goto <D.19510>; else goto <D.19505>;
        <D.19510>:
        iftmp.51 = 1;
        goto <D.19506>;
        <D.19505>:
        iftmp.51 = 0;
        <D.19506>:
        D.19511 = iftmp.51 != 0;
        D.19512 = (long int) D.19511;
        D.19513 = __builtin_expect (D.19512, 0);
        if (D.19513 != 0) goto <D.19514>; else goto <D.19515>;
        <D.19514>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19515>:
        <D.19498>:
      }
      <D.19496>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18259>:
      if (_bmap != 0) goto <D.18258>; else goto <D.18260>;
      <D.18260>:
    }
    goto <D.18204>;
    <D.18261>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.19516 = *bitmap_data;
      D.19517 = (unsigned int) D.19516;
      D.19518 = D.19517 + 4294967295;
      bwords = (int) D.19518;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.19519>; else goto <D.19520>;
      <D.19519>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.19521 = myobj->vtable;
        D.19522 = D.19521->klass;
        D.19523 = D.19522->name_space;
        D.19521 = myobj->vtable;
        D.19522 = D.19521->klass;
        D.19524 = D.19522->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19523, D.19524);
      }
      <D.19520>:
      goto <D.18274>;
      <D.18273>:
      {
        gsize _bmap;

        bitmap_data.52 = bitmap_data;
        bitmap_data = bitmap_data.52 + 8;
        _bmap = *bitmap_data.52;
        _objptr = start_run;
        goto <D.18271>;
        <D.18270>:
        D.19526 = _bmap & 1;
        if (D.19526 != 0) goto <D.19527>; else goto <D.19528>;
        <D.19527>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.19529>; else goto <D.19530>;
          <D.19529>:
          simple_nursery_parallel_copy_object (_objptr, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.19531>; else goto <D.19532>;
          <D.19531>:
          if (__old != __copy) goto <D.19533>; else goto <D.19534>;
          <D.19533>:
          gc_debug_file.42 = gc_debug_file;
          D.19535 = *_objptr;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19535, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19534>:
          <D.19532>:
          D.19539 = sgen_ptr_in_nursery (__copy);
          if (D.19539 != 0) goto <D.19540>; else goto <D.19537>;
          <D.19540>:
          D.19541 = sgen_ptr_in_nursery (_objptr);
          if (D.19541 == 0) goto <D.19542>; else goto <D.19537>;
          <D.19542>:
          iftmp.53 = 1;
          goto <D.19538>;
          <D.19537>:
          iftmp.53 = 0;
          <D.19538>:
          D.19543 = iftmp.53 != 0;
          D.19544 = (long int) D.19543;
          D.19545 = __builtin_expect (D.19544, 0);
          if (D.19545 != 0) goto <D.19546>; else goto <D.19547>;
          <D.19546>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.19547>:
          <D.19530>:
        }
        <D.19528>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.18271>:
        if (_bmap != 0) goto <D.18270>; else goto <D.18272>;
        <D.18272>:
        start_run = start_run + 512;
      }
      <D.18274>:
      bwords.54 = bwords;
      bwords = bwords.54 + -1;
      if (bwords.54 > 0) goto <D.18273>; else goto <D.18275>;
      <D.18275>:
    }
    goto <D.18204>;
    <D.18276>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.19549 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.19549);
      mbitmap_data.55 = mbitmap_data;
      mbitmap_data = mbitmap_data.55 + 8;
      D.19551 = *mbitmap_data.55;
      D.19552 = (unsigned int) D.19551;
      D.19553 = D.19552 + 4294967295;
      mbwords = (int) D.19553;
      D.19554 = vt->klass;
      el_size = mono_array_element_size (D.19554);
      e_start = start + 32;
      D.19416 = MEM[(struct MonoArray *)start].max_length;
      el_size.56 = (unsigned int) el_size;
      D.19556 = D.19416 * el_size.56;
      D.19557 = (sizetype) D.19556;
      e_end = e_start + D.19557;
      if (0 != 0) goto <D.19558>; else goto <D.19559>;
      <D.19558>:
      D.19549 = vt->desc;
      D.19554 = vt->klass;
      D.19560 = D.19554->name_space;
      D.19554 = vt->klass;
      D.19561 = D.19554->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.19549, D.19560, D.19561);
      <D.19559>:
      goto <D.18296>;
      <D.18295>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.57 = bitmap_data;
          bitmap_data = bitmap_data.57 + 8;
          _bmap = *bitmap_data.57;
          start_run = _objptr;
          goto <D.18290>;
          <D.18289>:
          D.19563 = _bmap & 1;
          if (D.19563 != 0) goto <D.19564>; else goto <D.19565>;
          <D.19564>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.19566>; else goto <D.19567>;
            <D.19566>:
            simple_nursery_parallel_copy_object (_objptr, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.19568>; else goto <D.19569>;
            <D.19568>:
            if (__old != __copy) goto <D.19570>; else goto <D.19571>;
            <D.19570>:
            gc_debug_file.42 = gc_debug_file;
            D.19572 = *_objptr;
            fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19572, __old);
            gc_debug_file.42 = gc_debug_file;
            fflush (gc_debug_file.42);
            <D.19571>:
            <D.19569>:
            D.19576 = sgen_ptr_in_nursery (__copy);
            if (D.19576 != 0) goto <D.19577>; else goto <D.19574>;
            <D.19577>:
            D.19578 = sgen_ptr_in_nursery (_objptr);
            if (D.19578 == 0) goto <D.19579>; else goto <D.19574>;
            <D.19579>:
            iftmp.58 = 1;
            goto <D.19575>;
            <D.19574>:
            iftmp.58 = 0;
            <D.19575>:
            D.19580 = iftmp.58 != 0;
            D.19581 = (long int) D.19580;
            D.19582 = __builtin_expect (D.19581, 0);
            if (D.19582 != 0) goto <D.19583>; else goto <D.19584>;
            <D.19583>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.19584>:
            <D.19567>:
          }
          <D.19565>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.18290>:
          if (_bmap != 0) goto <D.18289>; else goto <D.18291>;
          <D.18291>:
          _objptr = start_run + 512;
        }
        <D.18293>:
        bwords.59 = bwords;
        bwords = bwords.59 + 4294967295;
        if (bwords.59 != 0) goto <D.18292>; else goto <D.18294>;
        <D.18294>:
        D.19586 = (sizetype) el_size;
        e_start = e_start + D.19586;
      }
      <D.18296>:
      if (e_start < e_end) goto <D.18295>; else goto <D.18297>;
      <D.18297>:
    }
    goto <D.18204>;
    <D.18298>:
    goto <D.18204>;
    <D.18299>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.18204>:
  }
}


simple_nursery_parallel_copy_object (void * * obj_slot, struct SgenGrayQueue * queue)
{
  int current_collection_generation.60;
  int D.19591;
  long unsigned int D.19594;
  long unsigned int D.19595;
  long unsigned int D.19598;
  int D.19601;
  unsigned int D.19604;
  unsigned int D.19605;
  long unsigned int D.19606;
  void * D.19607;
  long unsigned int D.19608;
  _Bool D.19609;
  long int D.19610;
  long int D.19611;
  long unsigned int destination.61;
  long unsigned int D.19615;
  void * D.19616;
  void * D.19617;
  struct SgenGrayQueue * iftmp.62;
  int D.19625;
  _Bool D.19629;
  long int D.19630;
  long int D.19631;
  char * obj;
  mword vtable_word;
  mword objsize;
  struct MonoVTable * vt;
  void * destination;
  gboolean has_references;

  obj = *obj_slot;
  if (0 != 0) goto <D.19588>; else goto <D.19589>;
  <D.19588>:
  current_collection_generation.60 = current_collection_generation;
  monoeg_g_log (0B, 4, "calling minor-par-copy from a %d generation collection", current_collection_generation.60);
  <D.18186>:
  goto <D.18186>;
  <D.19589>:
  D.19591 = sgen_ptr_in_nursery (obj);
  if (D.19591 == 0) goto <D.19592>; else goto <D.19593>;
  <D.19592>:
  return;
  <D.19593>:
  vtable_word = MEM[(mword *)obj];
  D.19594 = vtable_word & 18446744073709551612;
  vt = (struct MonoVTable *) D.19594;
  D.19595 = vtable_word & 1;
  if (D.19595 != 0) goto <D.19596>; else goto <D.19597>;
  <D.19596>:
  *obj_slot = vt;
  return;
  <D.19597>:
  D.19598 = vtable_word & 2;
  if (D.19598 != 0) goto <D.19599>; else goto <D.19600>;
  <D.19599>:
  return;
  <D.19600>:
  D.19601 = sgen_nursery_is_to_space (obj);
  if (D.19601 != 0) goto <D.19602>; else goto <D.19603>;
  <D.19602>:
  return;
  <D.19603>:
  D.19604 = sgen_par_object_get_size (vt, obj);
  D.19605 = D.19604 + 7;
  D.19606 = (long unsigned int) D.19605;
  objsize = D.19606 & 4294967288;
  D.19607 = vt->gc_descr;
  D.19608 = (long unsigned int) D.19607;
  has_references = sgen_gc_descr_has_references (D.19608);
  destination = par_alloc_for_promotion (vt, obj, objsize, has_references);
  D.19609 = destination == 0B;
  D.19610 = (long int) D.19609;
  D.19611 = __builtin_expect (D.19610, 0);
  if (D.19611 != 0) goto <D.19612>; else goto <D.19613>;
  <D.19612>:
  sgen_parallel_pin_or_update (obj_slot, obj, vt, queue);
  return;
  <D.19613>:
  MEM[(struct MonoVTable * *)destination] = vt;
  destination.61 = (long unsigned int) destination;
  D.19615 = destination.61 | 1;
  D.19616 = (void *) D.19615;
  D.19617 = InterlockedCompareExchangePointer (obj, D.19616, vt);
  if (D.19617 == vt) goto <D.19618>; else goto <D.19619>;
  <D.19618>:
  if (has_references != 0) goto <D.19621>; else goto <D.19622>;
  <D.19621>:
  iftmp.62 = queue;
  goto <D.19623>;
  <D.19622>:
  iftmp.62 = 0B;
  <D.19623>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.62);
  obj = destination;
  *obj_slot = obj;
  goto <D.19624>;
  <D.19619>:
  D.19625 = sgen_ptr_in_nursery (destination);
  if (D.19625 == 0) goto <D.19626>; else goto <D.19627>;
  <D.19626>:
  MEM[(void * *)destination] = 0B;
  goto <D.19628>;
  <D.19627>:
  memset (destination, 0, objsize);
  <D.19628>:
  vtable_word = MEM[(mword *)obj];
  D.19595 = vtable_word & 1;
  D.19629 = D.19595 == 0;
  D.19630 = (long int) D.19629;
  D.19631 = __builtin_expect (D.19630, 0);
  if (D.19631 != 0) goto <D.19632>; else goto <D.19633>;
  <D.19632>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-minor-copy-object.h", 291, "vtable_word & SGEN_FORWARDED_BIT");
  <D.19633>:
  D.19594 = vtable_word & 18446744073709551612;
  obj = (char *) D.19594;
  *obj_slot = obj;
  <D.19624>:
}


sgen_nursery_is_to_space (char * object)
{
  long int object.63;
  char * sgen_nursery_start.64;
  long int sgen_nursery_start.65;
  long int D.19638;
  long int D.19639;
  int D.19640;
  _Bool D.19641;
  long int D.19642;
  long int D.19643;
  char * D.19646;
  char * D.19647;
  int sgen_space_bitmap_size.66;
  _Bool D.19649;
  long int D.19650;
  long int D.19651;
  gboolean D.19654;
  char * sgen_space_bitmap.67;
  sizetype D.19656;
  char * D.19657;
  char D.19658;
  int D.19659;
  int D.19660;
  int D.19661;
  _Bool D.19662;
  int idx;
  int byte;
  int bit;

  object.63 = (long int) object;
  sgen_nursery_start.64 = sgen_nursery_start;
  sgen_nursery_start.65 = (long int) sgen_nursery_start.64;
  D.19638 = object.63 - sgen_nursery_start.65;
  D.19639 = D.19638 >> 9;
  idx = (int) D.19639;
  byte = idx / 8;
  bit = idx & 7;
  D.19640 = sgen_ptr_in_nursery (object);
  D.19641 = D.19640 == 0;
  D.19642 = (long int) D.19641;
  D.19643 = __builtin_expect (D.19642, 0);
  if (D.19643 != 0) goto <D.19644>; else goto <D.19645>;
  <D.19644>:
  D.19646 = sgen_get_nursery_start ();
  D.19647 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.19646, D.19647);
  <D.17576>:
  goto <D.17576>;
  <D.19645>:
  sgen_space_bitmap_size.66 = sgen_space_bitmap_size;
  D.19649 = byte >= sgen_space_bitmap_size.66;
  D.19650 = (long int) D.19649;
  D.19651 = __builtin_expect (D.19650, 0);
  if (D.19651 != 0) goto <D.19652>; else goto <D.19653>;
  <D.19652>:
  sgen_space_bitmap_size.66 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.66);
  <D.17577>:
  goto <D.17577>;
  <D.19653>:
  sgen_space_bitmap.67 = sgen_space_bitmap;
  D.19656 = (sizetype) byte;
  D.19657 = sgen_space_bitmap.67 + D.19656;
  D.19658 = *D.19657;
  D.19659 = (int) D.19658;
  D.19660 = D.19659 >> bit;
  D.19661 = D.19660 & 1;
  D.19662 = D.19661 != 0;
  D.19654 = (gboolean) D.19662;
  return D.19654;
}


__attribute__((always_inline))
sgen_get_nursery_start ()
{
  char * D.19664;

  D.19664 = sgen_nursery_start;
  return D.19664;
}


__attribute__((always_inline))
sgen_get_nursery_end ()
{
  char * D.19666;

  D.19666 = sgen_nursery_end;
  return D.19666;
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.19668;
  long unsigned int comp.68;
  long unsigned int exch.69;
  long unsigned int D.19671;

  comp.68 = (long unsigned int) comp;
  exch.69 = (long unsigned int) exch;
  D.19671 = __sync_val_compare_and_swap_8 (dest, comp.68, exch.69);
  D.19668 = (void *) D.19671;
  return D.19668;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__, __nothrow__, __leaf__))
memset (void * __dest, int __ch, size_t __len)
{
  void * D.19673;
  long unsigned int D.19674;

  D.19674 = __builtin_object_size (__dest, 0);
  D.19673 = __builtin___memset_chk (__dest, __ch, __len, D.19674);
  return D.19673;
}


__attribute__((always_inline))
simple_nursery_serial_copy_object (void * * obj_slot, struct SgenGrayQueue * queue)
{
  int current_collection_generation.70;
  int D.19679;
  struct FILE * gc_debug_file.71;
  char * iftmp.72;
  long unsigned int D.19686;
  long unsigned int D.19687;
  long unsigned int D.19690;
  long unsigned int D.19698;
  _Bool D.19699;
  long int D.19700;
  long int D.19701;
  void * D.19708;
  char * forwarded;
  char * obj;

  obj = *obj_slot;
  if (0 != 0) goto <D.19676>; else goto <D.19677>;
  <D.19676>:
  current_collection_generation.70 = current_collection_generation;
  monoeg_g_log (0B, 4, "calling minor-serial-copy from a %d generation collection", current_collection_generation.70);
  <D.18163>:
  goto <D.18163>;
  <D.19677>:
  D.19679 = sgen_ptr_in_nursery (obj);
  if (D.19679 == 0) goto <D.19680>; else goto <D.19681>;
  <D.19680>:
  return;
  <D.19681>:
  if (0 != 0) goto <D.19682>; else goto <D.19683>;
  <D.19682>:
  gc_debug_file.71 = gc_debug_file;
  fprintf (gc_debug_file.71, "Precise copy of %p from %p\n", obj, obj_slot);
  gc_debug_file.71 = gc_debug_file;
  fflush (gc_debug_file.71);
  <D.19683>:
  D.19686 = MEM[(mword *)obj];
  D.19687 = D.19686 & 1;
  if (D.19687 != 0) goto <D.19688>; else goto <D.19689>;
  <D.19688>:
  D.19686 = MEM[(mword *)obj];
  D.19690 = D.19686 & 18446744073709551612;
  iftmp.72 = (char *) D.19690;
  goto <D.19691>;
  <D.19689>:
  iftmp.72 = 0B;
  <D.19691>:
  forwarded = iftmp.72;
  if (forwarded != 0B) goto <D.19692>; else goto <D.19693>;
  <D.19692>:
  if (0 != 0) goto <D.19694>; else goto <D.19695>;
  <D.19694>:
  monoeg_g_log (0B, 4, "forwarded object %p has no gc descriptor", forwarded);
  <D.18164>:
  goto <D.18164>;
  <D.19695>:
  if (0 != 0) goto <D.19696>; else goto <D.19697>;
  <D.19696>:
  gc_debug_file.71 = gc_debug_file;
  fprintf (gc_debug_file.71, " (already forwarded to %p)\n", forwarded);
  gc_debug_file.71 = gc_debug_file;
  fflush (gc_debug_file.71);
  <D.19697>:
  *obj_slot = forwarded;
  return;
  <D.19693>:
  D.19686 = MEM[(mword *)obj];
  D.19698 = D.19686 & 2;
  D.19699 = D.19698 != 0;
  D.19700 = (long int) D.19699;
  D.19701 = __builtin_expect (D.19700, 0);
  if (D.19701 != 0) goto <D.19702>; else goto <D.19703>;
  <D.19702>:
  if (0 != 0) goto <D.19704>; else goto <D.19705>;
  <D.19704>:
  monoeg_g_log (0B, 4, "pinned object %p has no gc descriptor", obj);
  <D.18165>:
  goto <D.18165>;
  <D.19705>:
  if (0 != 0) goto <D.19706>; else goto <D.19707>;
  <D.19706>:
  gc_debug_file.71 = gc_debug_file;
  fprintf (gc_debug_file.71, " (pinned, no change)\n");
  gc_debug_file.71 = gc_debug_file;
  fflush (gc_debug_file.71);
  <D.19707>:
  return;
  <D.19703>:
  D.19708 = copy_object_no_checks (obj, queue);
  *obj_slot = D.19708;
}


init_nursery (struct SgenFragmentAllocator * allocator, char * start, char * end)
{
  sgen_fragment_allocator_add (allocator, start, end);
}


build_fragments_finish (struct SgenFragmentAllocator * allocator)
{

}


build_fragments_release_exclude_head ()
{

}


build_fragments_get_exclude_head ()
{
  struct SgenFragment * D.19710;

  D.19710 = 0B;
  return D.19710;
}


clear_fragments ()
{

}


prepare_to_space (char * to_space_bitmap, int space_bitmap_size)
{

}


par_alloc_for_promotion (struct MonoVTable * vtable, char * obj, size_t objsize, gboolean has_references)
{
  char * D.19712;
  void * (*<T2fcb>) (struct MonoVTable *, int, gboolean) D.19713;
  int D.19714;

  D.19713 = major_collector.par_alloc_object;
  D.19714 = (int) objsize;
  D.19712 = D.19713 (vtable, D.19714, has_references);
  return D.19712;
}


alloc_for_promotion (struct MonoVTable * vtable, char * obj, size_t objsize, gboolean has_references)
{
  char * D.19716;
  void * (*<T2fcb>) (struct MonoVTable *, int, gboolean) D.19717;
  int D.19718;

  D.19717 = major_collector.alloc_object;
  D.19718 = (int) objsize;
  D.19716 = D.19717 (vtable, D.19718, has_references);
  return D.19716;
}


