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.18961;
  long unsigned int D.18962;
  long unsigned int D.18965;
  long unsigned int D.18966;
  long unsigned int D.18967;
  long unsigned int D.18968;
  long unsigned int D.18969;
  long unsigned int D.18970;
  void * D.18975;
  struct FILE * gc_debug_file.0;
  long unsigned int D.18985;
  long unsigned int D.18986;
  int D.18987;
  void * D.18992;
  long unsigned int D.18995;
  long unsigned int D.18996;
  int D.18997;
  long unsigned int D.19004;
  long unsigned int D.19007;
  int D.19008;
  int D.19009;
  unsigned int D.19012;
  unsigned int el_size.1;
  unsigned int D.19014;
  sizetype D.19015;
  void * D.19020;
  int D.19026;
  int D.19027;
  long unsigned int D.19028;
  long unsigned int D.19029;
  long unsigned int D.19030;
  long unsigned int D.19031;
  void * * D.19032;
  void * D.19037;
  sizetype D.19040;
  long unsigned int D.19044;
  void * D.19051;
  long unsigned int D.19054;
  void * D.19061;
  long unsigned int D.19064;
  unsigned int D.19065;
  unsigned int D.19066;
  struct MonoVTable * D.19069;
  struct MonoClass * D.19070;
  const char * D.19071;
  const char * D.19072;
  gsize * bitmap_data.2;
  long unsigned int D.19074;
  void * D.19081;
  int bwords.3;

  start = start + 18446744073709551600;
  D.18961 = desc & 7;
  switch (D.18961) <default: <D.18956>, case 1: <D.18882>, case 2: <D.18891>, case 3: <D.18941>, case 4: <D.18901>, case 5: <D.18934>, case 7: <D.18955>>
  <D.18882>:
  D.18962 = desc & 4294901760;
  if (D.18962 != 0) goto <D.18963>; else goto <D.18964>;
  <D.18963>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.18965 = desc >> 16;
    D.18966 = D.18965 & 255;
    D.18967 = D.18966 * 8;
    _objptr = _objptr + D.18967;
    D.18968 = desc >> 24;
    D.18969 = D.18968 & 255;
    D.18970 = D.18969 * 8;
    _objptr_end = _objptr + D.18970;
    {
      void * __old;

      __old = *_objptr;
      if (__old != 0B) goto <D.18971>; else goto <D.18972>;
      <D.18971>:
      simple_nursery_serial_copy_object_from_obj (_objptr, queue);
      if (0 != 0) goto <D.18973>; else goto <D.18974>;
      <D.18973>:
      D.18975 = *_objptr;
      if (D.18975 != __old) goto <D.18976>; else goto <D.18977>;
      <D.18976>:
      gc_debug_file.0 = gc_debug_file;
      D.18975 = *_objptr;
      fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18975, __old);
      gc_debug_file.0 = gc_debug_file;
      fflush (gc_debug_file.0);
      <D.18977>:
      <D.18974>:
      <D.18972>:
    }
    _objptr = _objptr + 8;
    goto <D.18888>;
    <D.18887>:
    {
      void * __old;

      __old = *_objptr;
      if (__old != 0B) goto <D.18979>; else goto <D.18980>;
      <D.18979>:
      simple_nursery_serial_copy_object_from_obj (_objptr, queue);
      if (0 != 0) goto <D.18981>; else goto <D.18982>;
      <D.18981>:
      D.18975 = *_objptr;
      if (D.18975 != __old) goto <D.18983>; else goto <D.18984>;
      <D.18983>:
      gc_debug_file.0 = gc_debug_file;
      D.18975 = *_objptr;
      fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18975, __old);
      gc_debug_file.0 = gc_debug_file;
      fflush (gc_debug_file.0);
      <D.18984>:
      <D.18982>:
      <D.18980>:
    }
    _objptr = _objptr + 8;
    <D.18888>:
    if (_objptr < _objptr_end) goto <D.18887>; else goto <D.18889>;
    <D.18889>:
  }
  <D.18964>:
  goto <D.18890>;
  <D.18891>:
  {
    void * * _objptr;
    gsize _bmap;

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

      _index = __builtin_ctzl (_bmap);
      D.18985 = (long unsigned int) _index;
      D.18986 = D.18985 * 8;
      _objptr = _objptr + D.18986;
      D.18987 = _index + 1;
      _bmap = _bmap >> D.18987;
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18988>; else goto <D.18989>;
        <D.18988>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.18990>; else goto <D.18991>;
        <D.18990>:
        D.18992 = *_objptr;
        if (D.18992 != __old) goto <D.18993>; else goto <D.18994>;
        <D.18993>:
        gc_debug_file.0 = gc_debug_file;
        D.18992 = *_objptr;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18992, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.18994>:
        <D.18991>:
        <D.18989>:
      }
      _objptr = _objptr + 8;
    }
    goto <D.18899>;
    <D.18898>:
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.18995 = (long unsigned int) _index;
      D.18996 = D.18995 * 8;
      _objptr = _objptr + D.18996;
      D.18997 = _index + 1;
      _bmap = _bmap >> D.18997;
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.18998>; else goto <D.18999>;
        <D.18998>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.19000>; else goto <D.19001>;
        <D.19000>:
        D.18992 = *_objptr;
        if (D.18992 != __old) goto <D.19002>; else goto <D.19003>;
        <D.19002>:
        gc_debug_file.0 = gc_debug_file;
        D.18992 = *_objptr;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.18992, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.19003>:
        <D.19001>:
        <D.18999>:
      }
      _objptr = _objptr + 8;
    }
    <D.18899>:
    if (_bmap != 0) goto <D.18898>; else goto <D.18900>;
    <D.18900>:
  }
  goto <D.18890>;
  <D.18901>:
  D.19004 = desc & 4294950912;
  if (D.19004 != 0) goto <D.19005>; else goto <D.19006>;
  <D.19005>:
  {
    int el_size;
    int etype;

    D.19007 = desc >> 3;
    D.19008 = (int) D.19007;
    el_size = D.19008 & 1023;
    D.19009 = (int) desc;
    etype = D.19009 & 49152;
    if (etype == 16384) goto <D.19010>; else goto <D.19011>;
    <D.19010>:
    {
      void * * p;
      void * * end_refs;

      p = start + 32;
      D.19012 = MEM[(struct MonoArray *)start].max_length;
      el_size.1 = (unsigned int) el_size;
      D.19014 = D.19012 * el_size.1;
      D.19015 = (sizetype) D.19014;
      end_refs = p + D.19015;
      goto <D.18908>;
      <D.18907>:
      {
        void * __old;

        __old = *p;
        if (__old != 0B) goto <D.19016>; else goto <D.19017>;
        <D.19016>:
        simple_nursery_serial_copy_object_from_obj (p, queue);
        if (0 != 0) goto <D.19018>; else goto <D.19019>;
        <D.19018>:
        D.19020 = *p;
        if (D.19020 != __old) goto <D.19021>; else goto <D.19022>;
        <D.19021>:
        gc_debug_file.0 = gc_debug_file;
        D.19020 = *p;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", p, D.19020, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.19022>:
        <D.19019>:
        <D.19017>:
      }
      p = p + 8;
      <D.18908>:
      if (p < end_refs) goto <D.18907>; else goto <D.18909>;
      <D.18909>:
    }
    goto <D.19023>;
    <D.19011>:
    if (etype == 32768) goto <D.19024>; else goto <D.19025>;
    <D.19024>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.18965 = desc >> 16;
      D.19026 = (int) D.18965;
      offset = D.19026 & 255;
      D.18968 = desc >> 24;
      D.19027 = (int) D.18968;
      num_refs = D.19027 & 255;
      e_start = start + 32;
      D.19012 = MEM[(struct MonoArray *)start].max_length;
      el_size.1 = (unsigned int) el_size;
      D.19014 = D.19012 * el_size.1;
      D.19015 = (sizetype) D.19014;
      e_end = e_start + D.19015;
      goto <D.18921>;
      <D.18920>:
      {
        void * * p;
        int i;

        p = e_start;
        D.19028 = (long unsigned int) offset;
        D.19029 = D.19028 * 8;
        p = p + D.19029;
        i = 0;
        goto <D.18918>;
        <D.18917>:
        {
          void * __old;

          D.19030 = (long unsigned int) i;
          D.19031 = D.19030 * 8;
          D.19032 = p + D.19031;
          __old = *D.19032;
          if (__old != 0B) goto <D.19033>; else goto <D.19034>;
          <D.19033>:
          D.19030 = (long unsigned int) i;
          D.19031 = D.19030 * 8;
          D.19032 = p + D.19031;
          simple_nursery_serial_copy_object_from_obj (D.19032, queue);
          if (0 != 0) goto <D.19035>; else goto <D.19036>;
          <D.19035>:
          D.19030 = (long unsigned int) i;
          D.19031 = D.19030 * 8;
          D.19032 = p + D.19031;
          D.19037 = *D.19032;
          if (D.19037 != __old) goto <D.19038>; else goto <D.19039>;
          <D.19038>:
          gc_debug_file.0 = gc_debug_file;
          D.19030 = (long unsigned int) i;
          D.19031 = D.19030 * 8;
          D.19032 = p + D.19031;
          D.19030 = (long unsigned int) i;
          D.19031 = D.19030 * 8;
          D.19032 = p + D.19031;
          D.19037 = *D.19032;
          fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", D.19032, D.19037, __old);
          gc_debug_file.0 = gc_debug_file;
          fflush (gc_debug_file.0);
          <D.19039>:
          <D.19036>:
          <D.19034>:
        }
        i = i + 1;
        <D.18918>:
        if (i < num_refs) goto <D.18917>; else goto <D.18919>;
        <D.18919>:
        D.19040 = (sizetype) el_size;
        e_start = e_start + D.19040;
      }
      <D.18921>:
      if (e_start < e_end) goto <D.18920>; else goto <D.18922>;
      <D.18922>:
    }
    goto <D.19041>;
    <D.19025>:
    if (etype == 49152) goto <D.19042>; else goto <D.19043>;
    <D.19042>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 32;
      D.19012 = MEM[(struct MonoArray *)start].max_length;
      el_size.1 = (unsigned int) el_size;
      D.19014 = D.19012 * el_size.1;
      D.19015 = (sizetype) D.19014;
      e_end = e_start + D.19015;
      goto <D.18932>;
      <D.18931>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.18929>;
        <D.18928>:
        D.19044 = _bmap & 1;
        if (D.19044 != 0) goto <D.19045>; else goto <D.19046>;
        <D.19045>:
        {
          void * __old;

          __old = *p;
          if (__old != 0B) goto <D.19047>; else goto <D.19048>;
          <D.19047>:
          simple_nursery_serial_copy_object_from_obj (p, queue);
          if (0 != 0) goto <D.19049>; else goto <D.19050>;
          <D.19049>:
          D.19051 = *p;
          if (D.19051 != __old) goto <D.19052>; else goto <D.19053>;
          <D.19052>:
          gc_debug_file.0 = gc_debug_file;
          D.19051 = *p;
          fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", p, D.19051, __old);
          gc_debug_file.0 = gc_debug_file;
          fflush (gc_debug_file.0);
          <D.19053>:
          <D.19050>:
          <D.19048>:
        }
        <D.19046>:
        _bmap = _bmap >> 1;
        p = p + 8;
        <D.18929>:
        if (_bmap != 0) goto <D.18928>; else goto <D.18930>;
        <D.18930>:
        D.19040 = (sizetype) el_size;
        e_start = e_start + D.19040;
      }
      <D.18932>:
      if (e_start < e_end) goto <D.18931>; else goto <D.18933>;
      <D.18933>:
    }
    <D.19043>:
    <D.19041>:
    <D.19023>:
  }
  <D.19006>:
  goto <D.18890>;
  <D.18934>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 16;
    goto <D.18939>;
    <D.18938>:
    D.19054 = _bmap & 1;
    if (D.19054 != 0) goto <D.19055>; else goto <D.19056>;
    <D.19055>:
    {
      void * __old;

      __old = *_objptr;
      if (__old != 0B) goto <D.19057>; else goto <D.19058>;
      <D.19057>:
      simple_nursery_serial_copy_object_from_obj (_objptr, queue);
      if (0 != 0) goto <D.19059>; else goto <D.19060>;
      <D.19059>:
      D.19061 = *_objptr;
      if (D.19061 != __old) goto <D.19062>; else goto <D.19063>;
      <D.19062>:
      gc_debug_file.0 = gc_debug_file;
      D.19061 = *_objptr;
      fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19061, __old);
      gc_debug_file.0 = gc_debug_file;
      fflush (gc_debug_file.0);
      <D.19063>:
      <D.19060>:
      <D.19058>:
    }
    <D.19056>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 8;
    <D.18939>:
    if (_bmap != 0) goto <D.18938>; else goto <D.18940>;
    <D.18940>:
  }
  goto <D.18890>;
  <D.18941>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.19064 = *bitmap_data;
    D.19065 = (unsigned int) D.19064;
    D.19066 = D.19065 + 4294967295;
    bwords = (int) D.19066;
    start_run = _objptr;
    bitmap_data = bitmap_data + 8;
    if (0 != 0) goto <D.19067>; else goto <D.19068>;
    <D.19067>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.19069 = myobj->vtable;
      D.19070 = D.19069->klass;
      D.19071 = D.19070->name_space;
      D.19069 = myobj->vtable;
      D.19070 = D.19069->klass;
      D.19072 = D.19070->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19071, D.19072);
    }
    <D.19068>:
    goto <D.18953>;
    <D.18952>:
    {
      gsize _bmap;

      bitmap_data.2 = bitmap_data;
      bitmap_data = bitmap_data.2 + 8;
      _bmap = *bitmap_data.2;
      _objptr = start_run;
      goto <D.18950>;
      <D.18949>:
      D.19074 = _bmap & 1;
      if (D.19074 != 0) goto <D.19075>; else goto <D.19076>;
      <D.19075>:
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.19077>; else goto <D.19078>;
        <D.19077>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.19079>; else goto <D.19080>;
        <D.19079>:
        D.19081 = *_objptr;
        if (D.19081 != __old) goto <D.19082>; else goto <D.19083>;
        <D.19082>:
        gc_debug_file.0 = gc_debug_file;
        D.19081 = *_objptr;
        fprintf (gc_debug_file.0, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19081, __old);
        gc_debug_file.0 = gc_debug_file;
        fflush (gc_debug_file.0);
        <D.19083>:
        <D.19080>:
        <D.19078>:
      }
      <D.19076>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18950>:
      if (_bmap != 0) goto <D.18949>; else goto <D.18951>;
      <D.18951>:
      start_run = start_run + 512;
    }
    <D.18953>:
    bwords.3 = bwords;
    bwords = bwords.3 + -1;
    if (bwords.3 > 0) goto <D.18952>; else goto <D.18954>;
    <D.18954>:
  }
  goto <D.18890>;
  <D.18955>:
  goto <D.18890>;
  <D.18956>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.18890>:
}


simple_nursery_serial_copy_object_from_obj (void * * obj_slot, struct SgenGrayQueue * queue)
{
  int current_collection_generation.4;
  int D.19089;
  struct FILE * gc_debug_file.5;
  char * iftmp.6;
  long unsigned int D.19096;
  long unsigned int D.19097;
  long unsigned int D.19100;
  long unsigned int D.19108;
  _Bool D.19109;
  long int D.19110;
  long int D.19111;
  int D.19118;
  _Bool D.19121;
  long int D.19122;
  long int D.19123;
  int iftmp.7;
  int D.19129;
  int D.19131;
  _Bool D.19133;
  long int D.19134;
  long int D.19135;
  char * forwarded;
  char * obj;
  void * copy;

  obj = *obj_slot;
  if (0 != 0) goto <D.19086>; else goto <D.19087>;
  <D.19086>:
  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.18559>:
  goto <D.18559>;
  <D.19087>:
  D.19089 = sgen_ptr_in_nursery (obj);
  if (D.19089 == 0) goto <D.19090>; else goto <D.19091>;
  <D.19090>:
  return;
  <D.19091>:
  if (0 != 0) goto <D.19092>; else goto <D.19093>;
  <D.19092>:
  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.19093>:
  D.19096 = MEM[(mword *)obj];
  D.19097 = D.19096 & 1;
  if (D.19097 != 0) goto <D.19098>; else goto <D.19099>;
  <D.19098>:
  D.19096 = MEM[(mword *)obj];
  D.19100 = D.19096 & 18446744073709551612;
  iftmp.6 = (char *) D.19100;
  goto <D.19101>;
  <D.19099>:
  iftmp.6 = 0B;
  <D.19101>:
  forwarded = iftmp.6;
  if (forwarded != 0B) goto <D.19102>; else goto <D.19103>;
  <D.19102>:
  if (0 != 0) goto <D.19104>; else goto <D.19105>;
  <D.19104>:
  monoeg_g_log (0B, 4, "forwarded object %p has no gc descriptor", forwarded);
  <D.18560>:
  goto <D.18560>;
  <D.19105>:
  if (0 != 0) goto <D.19106>; else goto <D.19107>;
  <D.19106>:
  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.19107>:
  *obj_slot = forwarded;
  return;
  <D.19103>:
  D.19096 = MEM[(mword *)obj];
  D.19108 = D.19096 & 2;
  D.19109 = D.19108 != 0;
  D.19110 = (long int) D.19109;
  D.19111 = __builtin_expect (D.19110, 0);
  if (D.19111 != 0) goto <D.19112>; else goto <D.19113>;
  <D.19112>:
  if (0 != 0) goto <D.19114>; else goto <D.19115>;
  <D.19114>:
  monoeg_g_log (0B, 4, "pinned object %p has no gc descriptor", obj);
  <D.18561>:
  goto <D.18561>;
  <D.19115>:
  if (0 != 0) goto <D.19116>; else goto <D.19117>;
  <D.19116>:
  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.19117>:
  D.19118 = sgen_ptr_in_nursery (obj_slot);
  if (D.19118 == 0) goto <D.19119>; else goto <D.19120>;
  <D.19119>:
  sgen_add_to_global_remset (obj_slot, obj);
  <D.19120>:
  return;
  <D.19113>:
  copy = copy_object_no_checks (obj, queue);
  *obj_slot = copy;
  D.19121 = obj == copy;
  D.19122 = (long int) D.19121;
  D.19123 = __builtin_expect (D.19122, 0);
  if (D.19123 != 0) goto <D.19124>; else goto <D.19125>;
  <D.19124>:
  D.19129 = sgen_ptr_in_nursery (copy);
  if (D.19129 != 0) goto <D.19130>; else goto <D.19127>;
  <D.19130>:
  D.19131 = sgen_ptr_in_nursery (obj_slot);
  if (D.19131 == 0) goto <D.19132>; else goto <D.19127>;
  <D.19132>:
  iftmp.7 = 1;
  goto <D.19128>;
  <D.19127>:
  iftmp.7 = 0;
  <D.19128>:
  D.19133 = iftmp.7 != 0;
  D.19134 = (long int) D.19133;
  D.19135 = __builtin_expect (D.19134, 0);
  if (D.19135 != 0) goto <D.19136>; else goto <D.19137>;
  <D.19136>:
  sgen_add_to_global_remset (obj_slot, copy);
  <D.19137>:
  <D.19125>:
}


copy_object_no_checks (void * obj, struct SgenGrayQueue * queue)
{
  void * D.19139;
  long unsigned int D.19140;
  unsigned int D.19141;
  unsigned int D.19142;
  long unsigned int D.19143;
  _Bool D.19144;
  long int D.19145;
  long int D.19146;
  void * D.19149;
  struct SgenGrayQueue * iftmp.8;
  long unsigned int destination.9;
  long unsigned int D.19155;
  struct MonoVTable * vt;
  gboolean has_references;
  mword objsize;
  char * destination;

  vt = MEM[(struct MonoObject *)obj].vtable;
  D.19139 = vt->gc_descr;
  D.19140 = (long unsigned int) D.19139;
  has_references = sgen_gc_descr_has_references (D.19140);
  D.19141 = sgen_par_object_get_size (vt, obj);
  D.19142 = D.19141 + 7;
  D.19143 = (long unsigned int) D.19142;
  objsize = D.19143 & 4294967288;
  destination = alloc_for_promotion (vt, obj, objsize, has_references);
  D.19144 = destination == 0B;
  D.19145 = (long int) D.19144;
  D.19146 = __builtin_expect (D.19145, 0);
  if (D.19146 != 0) goto <D.19147>; else goto <D.19148>;
  <D.19147>:
  sgen_pin_object (obj, queue);
  sgen_set_pinned_from_failed_allocation (objsize);
  D.19149 = obj;
  return D.19149;
  <D.19148>:
  if (has_references != 0) goto <D.19151>; else goto <D.19152>;
  <D.19151>:
  iftmp.8 = queue;
  goto <D.19153>;
  <D.19152>:
  iftmp.8 = 0B;
  <D.19153>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.8);
  destination.9 = (long unsigned int) destination;
  D.19155 = destination.9 | 1;
  MEM[(mword *)obj] = D.19155;
  D.19149 = destination;
  return D.19149;
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.19157;
  gboolean D.19160;
  long unsigned int D.19161;
  long unsigned int D.19164;

  D.19157 = desc & 4294901767;
  if (D.19157 == 1) goto <D.19158>; else goto <D.19159>;
  <D.19158>:
  D.19160 = 0;
  return D.19160;
  <D.19159>:
  D.19161 = desc & 49159;
  if (D.19161 == 4) goto <D.19162>; else goto <D.19163>;
  <D.19162>:
  D.19160 = 0;
  return D.19160;
  <D.19163>:
  D.19164 = desc & 7;
  if (D.19164 == 7) goto <D.19165>; else goto <D.19166>;
  <D.19165>:
  D.19160 = 0;
  return D.19160;
  <D.19166>:
  D.19160 = 1;
  return D.19160;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.19168;
  long unsigned int D.19169;
  guint D.19174;
  int D.19175;
  int D.19176;
  unsigned int D.19177;
  long unsigned int D.19180;
  int D.19181;
  unsigned int D.19182;
  unsigned int element_size.10;
  unsigned int D.19184;
  long unsigned int D.19185;
  long unsigned int D.19186;
  struct MonoClass * D.19189;
  unsigned char D.19190;
  long unsigned int D.19191;
  long unsigned int D.19192;
  mword descr;
  mword type;

  D.19168 = vtable->gc_descr;
  descr = (mword) D.19168;
  type = descr & 7;
  D.19169 = type + 18446744073709551615;
  if (D.19169 <= 1) goto <D.19170>; else goto <D.19171>;
  <D.19170>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.19172>; else goto <D.19173>;
    <D.19172>:
    D.19175 = MEM[(struct MonoString *)o].length;
    D.19176 = D.19175 * 2;
    D.19177 = (unsigned int) D.19176;
    D.19174 = D.19177 + 26;
    return D.19174;
    <D.19173>:
    D.19174 = (guint) size;
    return D.19174;
  }
  <D.19171>:
  if (type == 4) goto <D.19178>; else goto <D.19179>;
  <D.19178>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.19180 = descr >> 3;
    D.19181 = (int) D.19180;
    element_size = D.19181 & 1023;
    array = o;
    D.19182 = array->max_length;
    element_size.10 = (unsigned int) element_size;
    D.19184 = D.19182 * element_size.10;
    D.19185 = (long unsigned int) D.19184;
    size = D.19185 + 32;
    D.19186 = descr & 8192;
    if (D.19186 != 0) goto <D.19187>; else goto <D.19188>;
    <D.19187>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.19189 = vtable->klass;
    D.19190 = D.19189->rank;
    D.19191 = (long unsigned int) D.19190;
    D.19192 = D.19191 * 8;
    size = D.19192 + size;
    <D.19188>:
    D.19174 = (guint) size;
    return D.19174;
  }
  <D.19179>:
  D.19174 = slow_object_get_size (vtable, o);
  return D.19174;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.19194;
  guint D.19197;
  int D.19198;
  int D.19199;
  unsigned int D.19200;
  unsigned char D.19201;
  int D.19204;
  unsigned int D.19205;
  unsigned int D.19206;
  unsigned int D.19207;
  long unsigned int D.19208;
  struct MonoArrayBounds * D.19209;
  _Bool D.19210;
  long int D.19211;
  long int D.19212;
  long unsigned int D.19215;
  long unsigned int D.19216;
  int D.19217;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.19194 = mono_defaults.string_class;
  if (D.19194 == klass) goto <D.19195>; else goto <D.19196>;
  <D.19195>:
  D.19198 = MEM[(struct MonoString *)o].length;
  D.19199 = D.19198 * 2;
  D.19200 = (unsigned int) D.19199;
  D.19197 = D.19200 + 26;
  return D.19197;
  <D.19196>:
  D.19201 = klass->rank;
  if (D.19201 != 0) goto <D.19202>; else goto <D.19203>;
  <D.19202>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.19204 = klass->sizes.element_size;
    D.19205 = (unsigned int) D.19204;
    D.19206 = array->max_length;
    D.19207 = D.19205 * D.19206;
    D.19208 = (long unsigned int) D.19207;
    size = D.19208 + 32;
    D.19209 = array->bounds;
    D.19210 = D.19209 != 0B;
    D.19211 = (long int) D.19210;
    D.19212 = __builtin_expect (D.19211, 0);
    if (D.19212 != 0) goto <D.19213>; else goto <D.19214>;
    <D.19213>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.19201 = klass->rank;
    D.19215 = (long unsigned int) D.19201;
    D.19216 = D.19215 * 8;
    size = D.19216 + size;
    <D.19214>:
    D.19197 = (guint) size;
    return D.19197;
  }
  <D.19203>:
  D.19217 = klass->instance_size;
  D.19197 = (guint) D.19217;
  return D.19197;
}


par_copy_object_no_checks (char * destination, struct MonoVTable * vt, void * obj, mword objsize, struct SgenGrayQueue * queue)
{
  struct MonoClass * D.19221;
  const char * D.19222;
  const char * D.19223;
  struct FILE * gc_debug_file.11;
  struct MonoVTable * D.19227;
  struct MonoClass * D.19228;
  const char * D.19229;
  long unsigned int D.19232;
  const void * D.19233;
  mword * D.19234;
  long unsigned int D.19235;
  mword * D.19236;
  long unsigned int D.19237;
  mword * D.19238;
  long unsigned int D.19239;
  mword * D.19240;
  long unsigned int D.19241;
  mword * D.19242;
  long unsigned int D.19243;
  mword * D.19244;
  long unsigned int D.19245;
  mword * D.19246;
  long unsigned int D.19247;
  void * D.19249;
  const void * D.19250;
  long unsigned int D.19251;
  int iftmp.12;
  unsigned char D.19257;
  struct MonoArrayBounds * D.19259;
  _Bool D.19261;
  long int D.19262;
  long int D.19263;
  long int D.19266;
  long int obj.13;
  long int D.19268;
  sizetype D.19269;
  struct MonoArrayBounds * D.19270;
  int D.19273;
  long unsigned int D.19274;
  <unnamed type> mono_profiler_events.14;
  unsigned int D.19276;
  _Bool D.19277;
  long int D.19278;
  long int D.19279;
  const char * D.19286;
  int iftmp.15;
  struct GrayQueueSection * D.19291;
  int D.19293;
  _Bool D.19294;
  long int D.19295;
  long int D.19296;
  int D.19300;
  int D.19301;
  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.19219>; else goto <D.19220>;
  <D.19219>:
  D.19221 = vt->klass;
  D.19222 = D.19221->name_space;
  D.19221 = vt->klass;
  D.19223 = D.19221->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s was not initialized", vt, D.19222, D.19223);
  <D.18531>:
  goto <D.18531>;
  <D.19220>:
  if (0 != 0) goto <D.19224>; else goto <D.19225>;
  <D.19224>:
  gc_debug_file.11 = gc_debug_file;
  D.19227 = MEM[(struct MonoObject *)obj].vtable;
  D.19228 = D.19227->klass;
  D.19229 = D.19228->name;
  fprintf (gc_debug_file.11, " (to %p, %s size: %lu)\n", destination, D.19229, objsize);
  gc_debug_file.11 = gc_debug_file;
  fflush (gc_debug_file.11);
  <D.19225>:
  if (objsize <= 64) goto <D.19230>; else goto <D.19231>;
  <D.19230>:
  {
    mword * dest;

    dest = destination;
    D.19232 = objsize / 8;
    D.19233 = copy_labels[D.19232];
    goto D.19233;
    LAB_8:
    D.19234 = dest + 56;
    D.19235 = MEM[(mword *)obj + 56B];
    *D.19234 = D.19235;
    LAB_7:
    D.19236 = dest + 48;
    D.19237 = MEM[(mword *)obj + 48B];
    *D.19236 = D.19237;
    LAB_6:
    D.19238 = dest + 40;
    D.19239 = MEM[(mword *)obj + 40B];
    *D.19238 = D.19239;
    LAB_5:
    D.19240 = dest + 32;
    D.19241 = MEM[(mword *)obj + 32B];
    *D.19240 = D.19241;
    LAB_4:
    D.19242 = dest + 24;
    D.19243 = MEM[(mword *)obj + 24B];
    *D.19242 = D.19243;
    LAB_3:
    D.19244 = dest + 16;
    D.19245 = MEM[(mword *)obj + 16B];
    *D.19244 = D.19245;
    LAB_2:
    D.19246 = dest + 8;
    D.19247 = MEM[(mword *)obj + 8B];
    *D.19246 = D.19247;
    LAB_1:
    LAB_0:
  }
  goto <D.19248>;
  <D.19231>:
  D.19249 = destination + 8;
  D.19250 = obj + 8;
  D.19251 = objsize + 18446744073709551608;
  mono_gc_memmove_aligned (D.19249, D.19250, D.19251);
  <D.19248>:
  if (0 != 0) goto <D.19252>; else goto <D.19253>;
  <D.19252>:
  D.19221 = vt->klass;
  D.19222 = D.19221->name_space;
  D.19221 = vt->klass;
  D.19223 = D.19221->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s has no gc descriptor", vt, D.19222, D.19223);
  <D.18533>:
  goto <D.18533>;
  <D.19253>:
  D.19257 = vt->rank;
  if (D.19257 != 0) goto <D.19258>; else goto <D.19255>;
  <D.19258>:
  D.19259 = MEM[(struct MonoArray *)obj].bounds;
  if (D.19259 != 0B) goto <D.19260>; else goto <D.19255>;
  <D.19260>:
  iftmp.12 = 1;
  goto <D.19256>;
  <D.19255>:
  iftmp.12 = 0;
  <D.19256>:
  D.19261 = iftmp.12 != 0;
  D.19262 = (long int) D.19261;
  D.19263 = __builtin_expect (D.19262, 0);
  if (D.19263 != 0) goto <D.19264>; else goto <D.19265>;
  <D.19264>:
  {
    struct MonoArray * array;

    array = destination;
    D.19259 = MEM[(struct MonoArray *)obj].bounds;
    D.19266 = (long int) D.19259;
    obj.13 = (long int) obj;
    D.19268 = D.19266 - obj.13;
    D.19269 = (sizetype) D.19268;
    D.19270 = destination + D.19269;
    array->bounds = D.19270;
    if (0 != 0) goto <D.19271>; else goto <D.19272>;
    <D.19271>:
    gc_debug_file.11 = gc_debug_file;
    D.19257 = vt->rank;
    D.19273 = (int) D.19257;
    D.19274 = mono_array_length (array);
    fprintf (gc_debug_file.11, "Array instance %p: size: %lu, rank: %d, length: %lu\n", array, objsize, D.19273, D.19274);
    gc_debug_file.11 = gc_debug_file;
    fflush (gc_debug_file.11);
    <D.19272>:
  }
  <D.19265>:
  mono_profiler_events.14 = mono_profiler_events;
  D.19276 = mono_profiler_events.14 & 524288;
  D.19277 = D.19276 != 0;
  D.19278 = (long int) D.19277;
  D.19279 = __builtin_expect (D.19278, 0);
  if (D.19279 != 0) goto <D.19280>; else goto <D.19281>;
  <D.19280>:
  sgen_register_moved_object (obj, destination);
  <D.19281>:
  obj = destination;
  if (queue != 0B) goto <D.19282>; else goto <D.19283>;
  <D.19282>:
  if (0 != 0) goto <D.19284>; else goto <D.19285>;
  <D.19284>:
  gc_debug_file.11 = gc_debug_file;
  D.19286 = sgen_safe_name (obj);
  fprintf (gc_debug_file.11, "Enqueuing gray object %p (%s)\n", obj, D.19286);
  gc_debug_file.11 = gc_debug_file;
  fflush (gc_debug_file.11);
  <D.19285>:
  D.19291 = queue->first;
  if (D.19291 == 0B) goto <D.19288>; else goto <D.19292>;
  <D.19292>:
  D.19291 = queue->first;
  D.19293 = D.19291->end;
  if (D.19293 == 125) goto <D.19288>; else goto <D.19289>;
  <D.19288>:
  iftmp.15 = 1;
  goto <D.19290>;
  <D.19289>:
  iftmp.15 = 0;
  <D.19290>:
  D.19294 = iftmp.15 != 0;
  D.19295 = (long int) D.19294;
  D.19296 = __builtin_expect (D.19295, 0);
  if (D.19296 != 0) goto <D.19297>; else goto <D.19298>;
  <D.19297>:
  sgen_gray_object_enqueue (queue, obj);
  goto <D.19299>;
  <D.19298>:
  D.19291 = queue->first;
  D.19291 = queue->first;
  D.19293 = D.19291->end;
  D.19300 = D.19293;
  D.19301 = D.19300 + 1;
  D.19291->end = D.19301;
  D.19291->objects[D.19300] = obj;
  <D.19299>:
  __builtin_prefetch (obj);
  <D.19283>:
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.19304;
  int sgen_nursery_bits.17;
  int D.19306;
  int D.19307;
  long unsigned int D.19308;
  long unsigned int p.18;
  long unsigned int D.19310;
  char * sgen_nursery_start.19;
  long unsigned int sgen_nursery_start.20;
  _Bool D.19313;

  sgen_nursery_bits.17 = sgen_nursery_bits;
  D.19306 = 1 << sgen_nursery_bits.17;
  D.19307 = -D.19306;
  D.19308 = (long unsigned int) D.19307;
  p.18 = (long unsigned int) p;
  D.19310 = D.19308 & p.18;
  sgen_nursery_start.19 = sgen_nursery_start;
  sgen_nursery_start.20 = (long unsigned int) sgen_nursery_start.19;
  D.19313 = D.19310 == sgen_nursery_start.20;
  D.19304 = (gboolean) D.19313;
  return D.19304;
}


simple_nursery_serial_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;
  void * D.19331;
  struct FILE * gc_debug_file.21;
  long unsigned int D.19341;
  long unsigned int D.19342;
  int D.19343;
  void * D.19348;
  long unsigned int D.19351;
  long unsigned int D.19352;
  int D.19353;
  long unsigned int D.19360;
  long unsigned int D.19363;
  int D.19364;
  int D.19365;
  unsigned int D.19368;
  unsigned int el_size.22;
  unsigned int D.19370;
  sizetype D.19371;
  void * D.19376;
  int D.19382;
  int D.19383;
  long unsigned int D.19384;
  long unsigned int D.19385;
  long unsigned int D.19386;
  long unsigned int D.19387;
  void * * D.19388;
  void * D.19393;
  sizetype D.19396;
  long unsigned int D.19400;
  void * D.19407;
  long unsigned int D.19410;
  void * D.19417;
  long unsigned int D.19420;
  unsigned int D.19421;
  unsigned int D.19422;
  struct MonoVTable * D.19425;
  struct MonoClass * D.19426;
  const char * D.19427;
  const char * D.19428;
  gsize * bitmap_data.23;
  long unsigned int D.19430;
  void * D.19437;
  int bwords.24;
  long unsigned int D.19441;
  gsize * mbitmap_data.25;
  long unsigned int D.19443;
  unsigned int D.19444;
  unsigned int D.19445;
  struct MonoClass * D.19446;
  unsigned int el_size.26;
  unsigned int D.19448;
  sizetype D.19449;
  const char * D.19452;
  const char * D.19453;
  gsize * bitmap_data.27;
  long unsigned int D.19455;
  void * D.19462;
  unsigned int bwords.28;
  sizetype D.19466;

  {
    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.18876>, case 1: <D.18781>, case 2: <D.18790>, case 3: <D.18840>, case 4: <D.18800>, case 5: <D.18833>, case 6: <D.18854>, case 7: <D.18875>>
    <D.18781>:
    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;

        __old = *_objptr;
        if (__old != 0B) goto <D.19327>; else goto <D.19328>;
        <D.19327>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.19329>; else goto <D.19330>;
        <D.19329>:
        D.19331 = *_objptr;
        if (D.19331 != __old) goto <D.19332>; else goto <D.19333>;
        <D.19332>:
        gc_debug_file.21 = gc_debug_file;
        D.19331 = *_objptr;
        fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19331, __old);
        gc_debug_file.21 = gc_debug_file;
        fflush (gc_debug_file.21);
        <D.19333>:
        <D.19330>:
        <D.19328>:
      }
      _objptr = _objptr + 8;
      goto <D.18787>;
      <D.18786>:
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.19335>; else goto <D.19336>;
        <D.19335>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.19337>; else goto <D.19338>;
        <D.19337>:
        D.19331 = *_objptr;
        if (D.19331 != __old) goto <D.19339>; else goto <D.19340>;
        <D.19339>:
        gc_debug_file.21 = gc_debug_file;
        D.19331 = *_objptr;
        fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19331, __old);
        gc_debug_file.21 = gc_debug_file;
        fflush (gc_debug_file.21);
        <D.19340>:
        <D.19338>:
        <D.19336>:
      }
      _objptr = _objptr + 8;
      <D.18787>:
      if (_objptr < _objptr_end) goto <D.18786>; else goto <D.18788>;
      <D.18788>:
    }
    <D.19320>:
    goto <D.18789>;
    <D.18790>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.19341 = (long unsigned int) _index;
        D.19342 = D.19341 * 8;
        _objptr = _objptr + D.19342;
        D.19343 = _index + 1;
        _bmap = _bmap >> D.19343;
        {
          void * __old;

          __old = *_objptr;
          if (__old != 0B) goto <D.19344>; else goto <D.19345>;
          <D.19344>:
          simple_nursery_serial_copy_object_from_obj (_objptr, queue);
          if (0 != 0) goto <D.19346>; else goto <D.19347>;
          <D.19346>:
          D.19348 = *_objptr;
          if (D.19348 != __old) goto <D.19349>; else goto <D.19350>;
          <D.19349>:
          gc_debug_file.21 = gc_debug_file;
          D.19348 = *_objptr;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19348, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.19350>:
          <D.19347>:
          <D.19345>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.18798>;
      <D.18797>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.19351 = (long unsigned int) _index;
        D.19352 = D.19351 * 8;
        _objptr = _objptr + D.19352;
        D.19353 = _index + 1;
        _bmap = _bmap >> D.19353;
        {
          void * __old;

          __old = *_objptr;
          if (__old != 0B) goto <D.19354>; else goto <D.19355>;
          <D.19354>:
          simple_nursery_serial_copy_object_from_obj (_objptr, queue);
          if (0 != 0) goto <D.19356>; else goto <D.19357>;
          <D.19356>:
          D.19348 = *_objptr;
          if (D.19348 != __old) goto <D.19358>; else goto <D.19359>;
          <D.19358>:
          gc_debug_file.21 = gc_debug_file;
          D.19348 = *_objptr;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19348, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.19359>:
          <D.19357>:
          <D.19355>:
        }
        _objptr = _objptr + 8;
      }
      <D.18798>:
      if (_bmap != 0) goto <D.18797>; else goto <D.18799>;
      <D.18799>:
    }
    goto <D.18789>;
    <D.18800>:
    D.19360 = desc & 4294950912;
    if (D.19360 != 0) goto <D.19361>; else goto <D.19362>;
    <D.19361>:
    {
      int el_size;
      int etype;

      D.19363 = desc >> 3;
      D.19364 = (int) D.19363;
      el_size = D.19364 & 1023;
      D.19365 = (int) desc;
      etype = D.19365 & 49152;
      if (etype == 16384) goto <D.19366>; else goto <D.19367>;
      <D.19366>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.19368 = MEM[(struct MonoArray *)start].max_length;
        el_size.22 = (unsigned int) el_size;
        D.19370 = D.19368 * el_size.22;
        D.19371 = (sizetype) D.19370;
        end_refs = p + D.19371;
        goto <D.18807>;
        <D.18806>:
        {
          void * __old;

          __old = *p;
          if (__old != 0B) goto <D.19372>; else goto <D.19373>;
          <D.19372>:
          simple_nursery_serial_copy_object_from_obj (p, queue);
          if (0 != 0) goto <D.19374>; else goto <D.19375>;
          <D.19374>:
          D.19376 = *p;
          if (D.19376 != __old) goto <D.19377>; else goto <D.19378>;
          <D.19377>:
          gc_debug_file.21 = gc_debug_file;
          D.19376 = *p;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", p, D.19376, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.19378>:
          <D.19375>:
          <D.19373>:
        }
        p = p + 8;
        <D.18807>:
        if (p < end_refs) goto <D.18806>; else goto <D.18808>;
        <D.18808>:
      }
      goto <D.19379>;
      <D.19367>:
      if (etype == 32768) goto <D.19380>; else goto <D.19381>;
      <D.19380>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.19321 = desc >> 16;
        D.19382 = (int) D.19321;
        offset = D.19382 & 255;
        D.19324 = desc >> 24;
        D.19383 = (int) D.19324;
        num_refs = D.19383 & 255;
        e_start = start + 32;
        D.19368 = MEM[(struct MonoArray *)start].max_length;
        el_size.22 = (unsigned int) el_size;
        D.19370 = D.19368 * el_size.22;
        D.19371 = (sizetype) D.19370;
        e_end = e_start + D.19371;
        goto <D.18820>;
        <D.18819>:
        {
          void * * p;
          int i;

          p = e_start;
          D.19384 = (long unsigned int) offset;
          D.19385 = D.19384 * 8;
          p = p + D.19385;
          i = 0;
          goto <D.18817>;
          <D.18816>:
          {
            void * __old;

            D.19386 = (long unsigned int) i;
            D.19387 = D.19386 * 8;
            D.19388 = p + D.19387;
            __old = *D.19388;
            if (__old != 0B) goto <D.19389>; else goto <D.19390>;
            <D.19389>:
            D.19386 = (long unsigned int) i;
            D.19387 = D.19386 * 8;
            D.19388 = p + D.19387;
            simple_nursery_serial_copy_object_from_obj (D.19388, queue);
            if (0 != 0) goto <D.19391>; else goto <D.19392>;
            <D.19391>:
            D.19386 = (long unsigned int) i;
            D.19387 = D.19386 * 8;
            D.19388 = p + D.19387;
            D.19393 = *D.19388;
            if (D.19393 != __old) goto <D.19394>; else goto <D.19395>;
            <D.19394>:
            gc_debug_file.21 = gc_debug_file;
            D.19386 = (long unsigned int) i;
            D.19387 = D.19386 * 8;
            D.19388 = p + D.19387;
            D.19386 = (long unsigned int) i;
            D.19387 = D.19386 * 8;
            D.19388 = p + D.19387;
            D.19393 = *D.19388;
            fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", D.19388, D.19393, __old);
            gc_debug_file.21 = gc_debug_file;
            fflush (gc_debug_file.21);
            <D.19395>:
            <D.19392>:
            <D.19390>:
          }
          i = i + 1;
          <D.18817>:
          if (i < num_refs) goto <D.18816>; else goto <D.18818>;
          <D.18818>:
          D.19396 = (sizetype) el_size;
          e_start = e_start + D.19396;
        }
        <D.18820>:
        if (e_start < e_end) goto <D.18819>; else goto <D.18821>;
        <D.18821>:
      }
      goto <D.19397>;
      <D.19381>:
      if (etype == 49152) goto <D.19398>; else goto <D.19399>;
      <D.19398>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.19368 = MEM[(struct MonoArray *)start].max_length;
        el_size.22 = (unsigned int) el_size;
        D.19370 = D.19368 * el_size.22;
        D.19371 = (sizetype) D.19370;
        e_end = e_start + D.19371;
        goto <D.18831>;
        <D.18830>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.18828>;
          <D.18827>:
          D.19400 = _bmap & 1;
          if (D.19400 != 0) goto <D.19401>; else goto <D.19402>;
          <D.19401>:
          {
            void * __old;

            __old = *p;
            if (__old != 0B) goto <D.19403>; else goto <D.19404>;
            <D.19403>:
            simple_nursery_serial_copy_object_from_obj (p, queue);
            if (0 != 0) goto <D.19405>; else goto <D.19406>;
            <D.19405>:
            D.19407 = *p;
            if (D.19407 != __old) goto <D.19408>; else goto <D.19409>;
            <D.19408>:
            gc_debug_file.21 = gc_debug_file;
            D.19407 = *p;
            fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", p, D.19407, __old);
            gc_debug_file.21 = gc_debug_file;
            fflush (gc_debug_file.21);
            <D.19409>:
            <D.19406>:
            <D.19404>:
          }
          <D.19402>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.18828>:
          if (_bmap != 0) goto <D.18827>; else goto <D.18829>;
          <D.18829>:
          D.19396 = (sizetype) el_size;
          e_start = e_start + D.19396;
        }
        <D.18831>:
        if (e_start < e_end) goto <D.18830>; else goto <D.18832>;
        <D.18832>:
      }
      <D.19399>:
      <D.19397>:
      <D.19379>:
    }
    <D.19362>:
    goto <D.18789>;
    <D.18833>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.18838>;
      <D.18837>:
      D.19410 = _bmap & 1;
      if (D.19410 != 0) goto <D.19411>; else goto <D.19412>;
      <D.19411>:
      {
        void * __old;

        __old = *_objptr;
        if (__old != 0B) goto <D.19413>; else goto <D.19414>;
        <D.19413>:
        simple_nursery_serial_copy_object_from_obj (_objptr, queue);
        if (0 != 0) goto <D.19415>; else goto <D.19416>;
        <D.19415>:
        D.19417 = *_objptr;
        if (D.19417 != __old) goto <D.19418>; else goto <D.19419>;
        <D.19418>:
        gc_debug_file.21 = gc_debug_file;
        D.19417 = *_objptr;
        fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19417, __old);
        gc_debug_file.21 = gc_debug_file;
        fflush (gc_debug_file.21);
        <D.19419>:
        <D.19416>:
        <D.19414>:
      }
      <D.19412>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18838>:
      if (_bmap != 0) goto <D.18837>; else goto <D.18839>;
      <D.18839>:
    }
    goto <D.18789>;
    <D.18840>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.19420 = *bitmap_data;
      D.19421 = (unsigned int) D.19420;
      D.19422 = D.19421 + 4294967295;
      bwords = (int) D.19422;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.19423>; else goto <D.19424>;
      <D.19423>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.19425 = myobj->vtable;
        D.19426 = D.19425->klass;
        D.19427 = D.19426->name_space;
        D.19425 = myobj->vtable;
        D.19426 = D.19425->klass;
        D.19428 = D.19426->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19427, D.19428);
      }
      <D.19424>:
      goto <D.18852>;
      <D.18851>:
      {
        gsize _bmap;

        bitmap_data.23 = bitmap_data;
        bitmap_data = bitmap_data.23 + 8;
        _bmap = *bitmap_data.23;
        _objptr = start_run;
        goto <D.18849>;
        <D.18848>:
        D.19430 = _bmap & 1;
        if (D.19430 != 0) goto <D.19431>; else goto <D.19432>;
        <D.19431>:
        {
          void * __old;

          __old = *_objptr;
          if (__old != 0B) goto <D.19433>; else goto <D.19434>;
          <D.19433>:
          simple_nursery_serial_copy_object_from_obj (_objptr, queue);
          if (0 != 0) goto <D.19435>; else goto <D.19436>;
          <D.19435>:
          D.19437 = *_objptr;
          if (D.19437 != __old) goto <D.19438>; else goto <D.19439>;
          <D.19438>:
          gc_debug_file.21 = gc_debug_file;
          D.19437 = *_objptr;
          fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19437, __old);
          gc_debug_file.21 = gc_debug_file;
          fflush (gc_debug_file.21);
          <D.19439>:
          <D.19436>:
          <D.19434>:
        }
        <D.19432>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.18849>:
        if (_bmap != 0) goto <D.18848>; else goto <D.18850>;
        <D.18850>:
        start_run = start_run + 512;
      }
      <D.18852>:
      bwords.24 = bwords;
      bwords = bwords.24 + -1;
      if (bwords.24 > 0) goto <D.18851>; else goto <D.18853>;
      <D.18853>:
    }
    goto <D.18789>;
    <D.18854>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.19441 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.19441);
      mbitmap_data.25 = mbitmap_data;
      mbitmap_data = mbitmap_data.25 + 8;
      D.19443 = *mbitmap_data.25;
      D.19444 = (unsigned int) D.19443;
      D.19445 = D.19444 + 4294967295;
      mbwords = (int) D.19445;
      D.19446 = vt->klass;
      el_size = mono_array_element_size (D.19446);
      e_start = start + 32;
      D.19368 = MEM[(struct MonoArray *)start].max_length;
      el_size.26 = (unsigned int) el_size;
      D.19448 = D.19368 * el_size.26;
      D.19449 = (sizetype) D.19448;
      e_end = e_start + D.19449;
      if (0 != 0) goto <D.19450>; else goto <D.19451>;
      <D.19450>:
      D.19441 = vt->desc;
      D.19446 = vt->klass;
      D.19452 = D.19446->name_space;
      D.19446 = vt->klass;
      D.19453 = D.19446->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.19441, D.19452, D.19453);
      <D.19451>:
      goto <D.18873>;
      <D.18872>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.18870>;
        <D.18869>:
        {
          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.18867>;
          <D.18866>:
          D.19455 = _bmap & 1;
          if (D.19455 != 0) goto <D.19456>; else goto <D.19457>;
          <D.19456>:
          {
            void * __old;

            __old = *_objptr;
            if (__old != 0B) goto <D.19458>; else goto <D.19459>;
            <D.19458>:
            simple_nursery_serial_copy_object_from_obj (_objptr, queue);
            if (0 != 0) goto <D.19460>; else goto <D.19461>;
            <D.19460>:
            D.19462 = *_objptr;
            if (D.19462 != __old) goto <D.19463>; else goto <D.19464>;
            <D.19463>:
            gc_debug_file.21 = gc_debug_file;
            D.19462 = *_objptr;
            fprintf (gc_debug_file.21, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19462, __old);
            gc_debug_file.21 = gc_debug_file;
            fflush (gc_debug_file.21);
            <D.19464>:
            <D.19461>:
            <D.19459>:
          }
          <D.19457>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.18867>:
          if (_bmap != 0) goto <D.18866>; else goto <D.18868>;
          <D.18868>:
          _objptr = start_run + 512;
        }
        <D.18870>:
        bwords.28 = bwords;
        bwords = bwords.28 + 4294967295;
        if (bwords.28 != 0) goto <D.18869>; else goto <D.18871>;
        <D.18871>:
        D.19466 = (sizetype) el_size;
        e_start = e_start + D.19466;
      }
      <D.18873>:
      if (e_start < e_end) goto <D.18872>; else goto <D.18874>;
      <D.18874>:
    }
    goto <D.18789>;
    <D.18875>:
    goto <D.18789>;
    <D.18876>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.18789>:
  }
}


simple_nursery_parallel_scan_vtype (char * start, mword desc, struct SgenGrayQueue * queue)
{
  long unsigned int D.19468;
  long unsigned int D.19469;
  long unsigned int D.19472;
  long unsigned int D.19473;
  long unsigned int D.19474;
  long unsigned int D.19475;
  long unsigned int D.19476;
  long unsigned int D.19477;
  struct FILE * gc_debug_file.29;
  void * D.19485;
  int iftmp.30;
  int D.19489;
  int D.19491;
  _Bool D.19493;
  long int D.19494;
  long int D.19495;
  int iftmp.31;
  int D.19507;
  int D.19509;
  _Bool D.19511;
  long int D.19512;
  long int D.19513;
  long unsigned int D.19516;
  long unsigned int D.19517;
  int D.19518;
  void * D.19525;
  int iftmp.32;
  int D.19529;
  int D.19531;
  _Bool D.19533;
  long int D.19534;
  long int D.19535;
  long unsigned int D.19538;
  long unsigned int D.19539;
  int D.19540;
  int iftmp.33;
  int D.19550;
  int D.19552;
  _Bool D.19554;
  long int D.19555;
  long int D.19556;
  long unsigned int D.19559;
  long unsigned int D.19562;
  int D.19563;
  int D.19564;
  unsigned int D.19567;
  unsigned int el_size.34;
  unsigned int D.19569;
  sizetype D.19570;
  void * D.19577;
  int iftmp.35;
  int D.19581;
  int D.19583;
  _Bool D.19585;
  long int D.19586;
  long int D.19587;
  int D.19593;
  int D.19594;
  long unsigned int D.19595;
  long unsigned int D.19596;
  long unsigned int D.19597;
  long unsigned int D.19598;
  void * * D.19599;
  void * D.19606;
  int iftmp.36;
  int D.19610;
  void * D.19612;
  int D.19613;
  _Bool D.19615;
  long int D.19616;
  long int D.19617;
  void * D.19620;
  sizetype D.19621;
  long unsigned int D.19625;
  void * D.19634;
  int iftmp.37;
  int D.19638;
  int D.19640;
  _Bool D.19642;
  long int D.19643;
  long int D.19644;
  long unsigned int D.19647;
  void * D.19656;
  int iftmp.38;
  int D.19660;
  int D.19662;
  _Bool D.19664;
  long int D.19665;
  long int D.19666;
  long unsigned int D.19669;
  unsigned int D.19670;
  unsigned int D.19671;
  struct MonoVTable * D.19674;
  struct MonoClass * D.19675;
  const char * D.19676;
  const char * D.19677;
  gsize * bitmap_data.39;
  long unsigned int D.19679;
  void * D.19688;
  int iftmp.40;
  int D.19692;
  int D.19694;
  _Bool D.19696;
  long int D.19697;
  long int D.19698;
  int bwords.41;

  start = start + 18446744073709551600;
  D.19468 = desc & 7;
  switch (D.19468) <default: <D.18774>, case 1: <D.18691>, case 2: <D.18702>, case 3: <D.18758>, case 4: <D.18714>, case 5: <D.18750>, case 7: <D.18773>>
  <D.18691>:
  D.19469 = desc & 4294901760;
  if (D.19469 != 0) goto <D.19470>; else goto <D.19471>;
  <D.19470>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.19472 = desc >> 16;
    D.19473 = D.19472 & 255;
    D.19474 = D.19473 * 8;
    _objptr = _objptr + D.19474;
    D.19475 = desc >> 24;
    D.19476 = D.19475 & 255;
    D.19477 = D.19476 * 8;
    _objptr_end = _objptr + D.19477;
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19478>; else goto <D.19479>;
      <D.19478>:
      simple_nursery_parallel_copy_object (_objptr, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19480>; else goto <D.19481>;
      <D.19480>:
      if (__old != __copy) goto <D.19482>; else goto <D.19483>;
      <D.19482>:
      gc_debug_file.29 = gc_debug_file;
      D.19485 = *_objptr;
      fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19485, __old);
      gc_debug_file.29 = gc_debug_file;
      fflush (gc_debug_file.29);
      <D.19483>:
      <D.19481>:
      D.19489 = sgen_ptr_in_nursery (__copy);
      if (D.19489 != 0) goto <D.19490>; else goto <D.19487>;
      <D.19490>:
      D.19491 = sgen_ptr_in_nursery (_objptr);
      if (D.19491 == 0) goto <D.19492>; else goto <D.19487>;
      <D.19492>:
      iftmp.30 = 1;
      goto <D.19488>;
      <D.19487>:
      iftmp.30 = 0;
      <D.19488>:
      D.19493 = iftmp.30 != 0;
      D.19494 = (long int) D.19493;
      D.19495 = __builtin_expect (D.19494, 0);
      if (D.19495 != 0) goto <D.19496>; else goto <D.19497>;
      <D.19496>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19497>:
      <D.19479>:
    }
    _objptr = _objptr + 8;
    goto <D.18699>;
    <D.18698>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19498>; else goto <D.19499>;
      <D.19498>:
      simple_nursery_parallel_copy_object (_objptr, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19500>; else goto <D.19501>;
      <D.19500>:
      if (__old != __copy) goto <D.19502>; else goto <D.19503>;
      <D.19502>:
      gc_debug_file.29 = gc_debug_file;
      D.19485 = *_objptr;
      fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19485, __old);
      gc_debug_file.29 = gc_debug_file;
      fflush (gc_debug_file.29);
      <D.19503>:
      <D.19501>:
      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.31 = 1;
      goto <D.19506>;
      <D.19505>:
      iftmp.31 = 0;
      <D.19506>:
      D.19511 = iftmp.31 != 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.19499>:
    }
    _objptr = _objptr + 8;
    <D.18699>:
    if (_objptr < _objptr_end) goto <D.18698>; else goto <D.18700>;
    <D.18700>:
  }
  <D.19471>:
  goto <D.18701>;
  <D.18702>:
  {
    void * * _objptr;
    gsize _bmap;

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

      _index = __builtin_ctzl (_bmap);
      D.19516 = (long unsigned int) _index;
      D.19517 = D.19516 * 8;
      _objptr = _objptr + D.19517;
      D.19518 = _index + 1;
      _bmap = _bmap >> D.19518;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19519>; else goto <D.19520>;
        <D.19519>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19521>; else goto <D.19522>;
        <D.19521>:
        if (__old != __copy) goto <D.19523>; else goto <D.19524>;
        <D.19523>:
        gc_debug_file.29 = gc_debug_file;
        D.19525 = *_objptr;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19525, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19524>:
        <D.19522>:
        D.19529 = sgen_ptr_in_nursery (__copy);
        if (D.19529 != 0) goto <D.19530>; else goto <D.19527>;
        <D.19530>:
        D.19531 = sgen_ptr_in_nursery (_objptr);
        if (D.19531 == 0) goto <D.19532>; else goto <D.19527>;
        <D.19532>:
        iftmp.32 = 1;
        goto <D.19528>;
        <D.19527>:
        iftmp.32 = 0;
        <D.19528>:
        D.19533 = iftmp.32 != 0;
        D.19534 = (long int) D.19533;
        D.19535 = __builtin_expect (D.19534, 0);
        if (D.19535 != 0) goto <D.19536>; else goto <D.19537>;
        <D.19536>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19537>:
        <D.19520>:
      }
      _objptr = _objptr + 8;
    }
    goto <D.18712>;
    <D.18711>:
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.19538 = (long unsigned int) _index;
      D.19539 = D.19538 * 8;
      _objptr = _objptr + D.19539;
      D.19540 = _index + 1;
      _bmap = _bmap >> D.19540;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19541>; else goto <D.19542>;
        <D.19541>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19543>; else goto <D.19544>;
        <D.19543>:
        if (__old != __copy) goto <D.19545>; else goto <D.19546>;
        <D.19545>:
        gc_debug_file.29 = gc_debug_file;
        D.19525 = *_objptr;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19525, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19546>:
        <D.19544>:
        D.19550 = sgen_ptr_in_nursery (__copy);
        if (D.19550 != 0) goto <D.19551>; else goto <D.19548>;
        <D.19551>:
        D.19552 = sgen_ptr_in_nursery (_objptr);
        if (D.19552 == 0) goto <D.19553>; else goto <D.19548>;
        <D.19553>:
        iftmp.33 = 1;
        goto <D.19549>;
        <D.19548>:
        iftmp.33 = 0;
        <D.19549>:
        D.19554 = iftmp.33 != 0;
        D.19555 = (long int) D.19554;
        D.19556 = __builtin_expect (D.19555, 0);
        if (D.19556 != 0) goto <D.19557>; else goto <D.19558>;
        <D.19557>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19558>:
        <D.19542>:
      }
      _objptr = _objptr + 8;
    }
    <D.18712>:
    if (_bmap != 0) goto <D.18711>; else goto <D.18713>;
    <D.18713>:
  }
  goto <D.18701>;
  <D.18714>:
  D.19559 = desc & 4294950912;
  if (D.19559 != 0) goto <D.19560>; else goto <D.19561>;
  <D.19560>:
  {
    int el_size;
    int etype;

    D.19562 = desc >> 3;
    D.19563 = (int) D.19562;
    el_size = D.19563 & 1023;
    D.19564 = (int) desc;
    etype = D.19564 & 49152;
    if (etype == 16384) goto <D.19565>; else goto <D.19566>;
    <D.19565>:
    {
      void * * p;
      void * * end_refs;

      p = start + 32;
      D.19567 = MEM[(struct MonoArray *)start].max_length;
      el_size.34 = (unsigned int) el_size;
      D.19569 = D.19567 * el_size.34;
      D.19570 = (sizetype) D.19569;
      end_refs = p + D.19570;
      goto <D.18722>;
      <D.18721>:
      {
        void * __old;
        void * __copy;

        __old = *p;
        if (__old != 0B) goto <D.19571>; else goto <D.19572>;
        <D.19571>:
        simple_nursery_parallel_copy_object (p, queue);
        __copy = *p;
        if (0 != 0) goto <D.19573>; else goto <D.19574>;
        <D.19573>:
        if (__old != __copy) goto <D.19575>; else goto <D.19576>;
        <D.19575>:
        gc_debug_file.29 = gc_debug_file;
        D.19577 = *p;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", p, D.19577, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19576>:
        <D.19574>:
        D.19581 = sgen_ptr_in_nursery (__copy);
        if (D.19581 != 0) goto <D.19582>; else goto <D.19579>;
        <D.19582>:
        D.19583 = sgen_ptr_in_nursery (p);
        if (D.19583 == 0) goto <D.19584>; else goto <D.19579>;
        <D.19584>:
        iftmp.35 = 1;
        goto <D.19580>;
        <D.19579>:
        iftmp.35 = 0;
        <D.19580>:
        D.19585 = iftmp.35 != 0;
        D.19586 = (long int) D.19585;
        D.19587 = __builtin_expect (D.19586, 0);
        if (D.19587 != 0) goto <D.19588>; else goto <D.19589>;
        <D.19588>:
        sgen_add_to_global_remset (p, __copy);
        <D.19589>:
        <D.19572>:
      }
      p = p + 8;
      <D.18722>:
      if (p < end_refs) goto <D.18721>; else goto <D.18723>;
      <D.18723>:
    }
    goto <D.19590>;
    <D.19566>:
    if (etype == 32768) goto <D.19591>; else goto <D.19592>;
    <D.19591>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.19472 = desc >> 16;
      D.19593 = (int) D.19472;
      offset = D.19593 & 255;
      D.19475 = desc >> 24;
      D.19594 = (int) D.19475;
      num_refs = D.19594 & 255;
      e_start = start + 32;
      D.19567 = MEM[(struct MonoArray *)start].max_length;
      el_size.34 = (unsigned int) el_size;
      D.19569 = D.19567 * el_size.34;
      D.19570 = (sizetype) D.19569;
      e_end = e_start + D.19570;
      goto <D.18736>;
      <D.18735>:
      {
        void * * p;
        int i;

        p = e_start;
        D.19595 = (long unsigned int) offset;
        D.19596 = D.19595 * 8;
        p = p + D.19596;
        i = 0;
        goto <D.18733>;
        <D.18732>:
        {
          void * __old;
          void * __copy;

          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19599 = p + D.19598;
          __old = *D.19599;
          if (__old != 0B) goto <D.19600>; else goto <D.19601>;
          <D.19600>:
          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19599 = p + D.19598;
          simple_nursery_parallel_copy_object (D.19599, queue);
          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19599 = p + D.19598;
          __copy = *D.19599;
          if (0 != 0) goto <D.19602>; else goto <D.19603>;
          <D.19602>:
          if (__old != __copy) goto <D.19604>; else goto <D.19605>;
          <D.19604>:
          gc_debug_file.29 = gc_debug_file;
          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19599 = p + D.19598;
          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19599 = p + D.19598;
          D.19606 = *D.19599;
          fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", D.19599, D.19606, __old);
          gc_debug_file.29 = gc_debug_file;
          fflush (gc_debug_file.29);
          <D.19605>:
          <D.19603>:
          D.19610 = sgen_ptr_in_nursery (__copy);
          if (D.19610 != 0) goto <D.19611>; else goto <D.19608>;
          <D.19611>:
          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19612 = p + D.19598;
          D.19613 = sgen_ptr_in_nursery (D.19612);
          if (D.19613 == 0) goto <D.19614>; else goto <D.19608>;
          <D.19614>:
          iftmp.36 = 1;
          goto <D.19609>;
          <D.19608>:
          iftmp.36 = 0;
          <D.19609>:
          D.19615 = iftmp.36 != 0;
          D.19616 = (long int) D.19615;
          D.19617 = __builtin_expect (D.19616, 0);
          if (D.19617 != 0) goto <D.19618>; else goto <D.19619>;
          <D.19618>:
          D.19597 = (long unsigned int) i;
          D.19598 = D.19597 * 8;
          D.19620 = p + D.19598;
          sgen_add_to_global_remset (D.19620, __copy);
          <D.19619>:
          <D.19601>:
        }
        i = i + 1;
        <D.18733>:
        if (i < num_refs) goto <D.18732>; else goto <D.18734>;
        <D.18734>:
        D.19621 = (sizetype) el_size;
        e_start = e_start + D.19621;
      }
      <D.18736>:
      if (e_start < e_end) goto <D.18735>; else goto <D.18737>;
      <D.18737>:
    }
    goto <D.19622>;
    <D.19592>:
    if (etype == 49152) goto <D.19623>; else goto <D.19624>;
    <D.19623>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 32;
      D.19567 = MEM[(struct MonoArray *)start].max_length;
      el_size.34 = (unsigned int) el_size;
      D.19569 = D.19567 * el_size.34;
      D.19570 = (sizetype) D.19569;
      e_end = e_start + D.19570;
      goto <D.18748>;
      <D.18747>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.18745>;
        <D.18744>:
        D.19625 = _bmap & 1;
        if (D.19625 != 0) goto <D.19626>; else goto <D.19627>;
        <D.19626>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.19628>; else goto <D.19629>;
          <D.19628>:
          simple_nursery_parallel_copy_object (p, queue);
          __copy = *p;
          if (0 != 0) goto <D.19630>; else goto <D.19631>;
          <D.19630>:
          if (__old != __copy) goto <D.19632>; else goto <D.19633>;
          <D.19632>:
          gc_debug_file.29 = gc_debug_file;
          D.19634 = *p;
          fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", p, D.19634, __old);
          gc_debug_file.29 = gc_debug_file;
          fflush (gc_debug_file.29);
          <D.19633>:
          <D.19631>:
          D.19638 = sgen_ptr_in_nursery (__copy);
          if (D.19638 != 0) goto <D.19639>; else goto <D.19636>;
          <D.19639>:
          D.19640 = sgen_ptr_in_nursery (p);
          if (D.19640 == 0) goto <D.19641>; else goto <D.19636>;
          <D.19641>:
          iftmp.37 = 1;
          goto <D.19637>;
          <D.19636>:
          iftmp.37 = 0;
          <D.19637>:
          D.19642 = iftmp.37 != 0;
          D.19643 = (long int) D.19642;
          D.19644 = __builtin_expect (D.19643, 0);
          if (D.19644 != 0) goto <D.19645>; else goto <D.19646>;
          <D.19645>:
          sgen_add_to_global_remset (p, __copy);
          <D.19646>:
          <D.19629>:
        }
        <D.19627>:
        _bmap = _bmap >> 1;
        p = p + 8;
        <D.18745>:
        if (_bmap != 0) goto <D.18744>; else goto <D.18746>;
        <D.18746>:
        D.19621 = (sizetype) el_size;
        e_start = e_start + D.19621;
      }
      <D.18748>:
      if (e_start < e_end) goto <D.18747>; else goto <D.18749>;
      <D.18749>:
    }
    <D.19624>:
    <D.19622>:
    <D.19590>:
  }
  <D.19561>:
  goto <D.18701>;
  <D.18750>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 16;
    goto <D.18756>;
    <D.18755>:
    D.19647 = _bmap & 1;
    if (D.19647 != 0) goto <D.19648>; else goto <D.19649>;
    <D.19648>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19650>; else goto <D.19651>;
      <D.19650>:
      simple_nursery_parallel_copy_object (_objptr, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19652>; else goto <D.19653>;
      <D.19652>:
      if (__old != __copy) goto <D.19654>; else goto <D.19655>;
      <D.19654>:
      gc_debug_file.29 = gc_debug_file;
      D.19656 = *_objptr;
      fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19656, __old);
      gc_debug_file.29 = gc_debug_file;
      fflush (gc_debug_file.29);
      <D.19655>:
      <D.19653>:
      D.19660 = sgen_ptr_in_nursery (__copy);
      if (D.19660 != 0) goto <D.19661>; else goto <D.19658>;
      <D.19661>:
      D.19662 = sgen_ptr_in_nursery (_objptr);
      if (D.19662 == 0) goto <D.19663>; else goto <D.19658>;
      <D.19663>:
      iftmp.38 = 1;
      goto <D.19659>;
      <D.19658>:
      iftmp.38 = 0;
      <D.19659>:
      D.19664 = iftmp.38 != 0;
      D.19665 = (long int) D.19664;
      D.19666 = __builtin_expect (D.19665, 0);
      if (D.19666 != 0) goto <D.19667>; else goto <D.19668>;
      <D.19667>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19668>:
      <D.19651>:
    }
    <D.19649>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 8;
    <D.18756>:
    if (_bmap != 0) goto <D.18755>; else goto <D.18757>;
    <D.18757>:
  }
  goto <D.18701>;
  <D.18758>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.19669 = *bitmap_data;
    D.19670 = (unsigned int) D.19669;
    D.19671 = D.19670 + 4294967295;
    bwords = (int) D.19671;
    start_run = _objptr;
    bitmap_data = bitmap_data + 8;
    if (0 != 0) goto <D.19672>; else goto <D.19673>;
    <D.19672>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.19674 = myobj->vtable;
      D.19675 = D.19674->klass;
      D.19676 = D.19675->name_space;
      D.19674 = myobj->vtable;
      D.19675 = D.19674->klass;
      D.19677 = D.19675->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19676, D.19677);
    }
    <D.19673>:
    goto <D.18771>;
    <D.18770>:
    {
      gsize _bmap;

      bitmap_data.39 = bitmap_data;
      bitmap_data = bitmap_data.39 + 8;
      _bmap = *bitmap_data.39;
      _objptr = start_run;
      goto <D.18768>;
      <D.18767>:
      D.19679 = _bmap & 1;
      if (D.19679 != 0) goto <D.19680>; else goto <D.19681>;
      <D.19680>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19682>; else goto <D.19683>;
        <D.19682>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19684>; else goto <D.19685>;
        <D.19684>:
        if (__old != __copy) goto <D.19686>; else goto <D.19687>;
        <D.19686>:
        gc_debug_file.29 = gc_debug_file;
        D.19688 = *_objptr;
        fprintf (gc_debug_file.29, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19688, __old);
        gc_debug_file.29 = gc_debug_file;
        fflush (gc_debug_file.29);
        <D.19687>:
        <D.19685>:
        D.19692 = sgen_ptr_in_nursery (__copy);
        if (D.19692 != 0) goto <D.19693>; else goto <D.19690>;
        <D.19693>:
        D.19694 = sgen_ptr_in_nursery (_objptr);
        if (D.19694 == 0) goto <D.19695>; else goto <D.19690>;
        <D.19695>:
        iftmp.40 = 1;
        goto <D.19691>;
        <D.19690>:
        iftmp.40 = 0;
        <D.19691>:
        D.19696 = iftmp.40 != 0;
        D.19697 = (long int) D.19696;
        D.19698 = __builtin_expect (D.19697, 0);
        if (D.19698 != 0) goto <D.19699>; else goto <D.19700>;
        <D.19699>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19700>:
        <D.19683>:
      }
      <D.19681>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18768>:
      if (_bmap != 0) goto <D.18767>; else goto <D.18769>;
      <D.18769>:
      start_run = start_run + 512;
    }
    <D.18771>:
    bwords.41 = bwords;
    bwords = bwords.41 + -1;
    if (bwords.41 > 0) goto <D.18770>; else goto <D.18772>;
    <D.18772>:
  }
  goto <D.18701>;
  <D.18773>:
  goto <D.18701>;
  <D.18774>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.18701>:
}


simple_nursery_parallel_scan_object (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.19703;
  long unsigned int D.19704;
  long unsigned int D.19705;
  long unsigned int D.19706;
  long unsigned int D.19709;
  long unsigned int D.19710;
  long unsigned int D.19711;
  long unsigned int D.19712;
  long unsigned int D.19713;
  long unsigned int D.19714;
  struct FILE * gc_debug_file.42;
  void * D.19722;
  int iftmp.43;
  int D.19726;
  int D.19728;
  _Bool D.19730;
  long int D.19731;
  long int D.19732;
  int iftmp.44;
  int D.19744;
  int D.19746;
  _Bool D.19748;
  long int D.19749;
  long int D.19750;
  long unsigned int D.19753;
  long unsigned int D.19754;
  int D.19755;
  void * D.19762;
  int iftmp.45;
  int D.19766;
  int D.19768;
  _Bool D.19770;
  long int D.19771;
  long int D.19772;
  long unsigned int D.19775;
  long unsigned int D.19776;
  int D.19777;
  int iftmp.46;
  int D.19787;
  int D.19789;
  _Bool D.19791;
  long int D.19792;
  long int D.19793;
  long unsigned int D.19796;
  long unsigned int D.19799;
  int D.19800;
  int D.19801;
  unsigned int D.19804;
  unsigned int el_size.47;
  unsigned int D.19806;
  sizetype D.19807;
  void * D.19814;
  int iftmp.48;
  int D.19818;
  int D.19820;
  _Bool D.19822;
  long int D.19823;
  long int D.19824;
  int D.19830;
  int D.19831;
  long unsigned int D.19832;
  long unsigned int D.19833;
  long unsigned int D.19834;
  long unsigned int D.19835;
  void * * D.19836;
  void * D.19843;
  int iftmp.49;
  int D.19847;
  void * D.19849;
  int D.19850;
  _Bool D.19852;
  long int D.19853;
  long int D.19854;
  void * D.19857;
  sizetype D.19858;
  long unsigned int D.19862;
  void * D.19871;
  int iftmp.50;
  int D.19875;
  int D.19877;
  _Bool D.19879;
  long int D.19880;
  long int D.19881;
  long unsigned int D.19884;
  void * D.19893;
  int iftmp.51;
  int D.19897;
  int D.19899;
  _Bool D.19901;
  long int D.19902;
  long int D.19903;
  long unsigned int D.19906;
  unsigned int D.19907;
  unsigned int D.19908;
  struct MonoVTable * D.19911;
  struct MonoClass * D.19912;
  const char * D.19913;
  const char * D.19914;
  gsize * bitmap_data.52;
  long unsigned int D.19916;
  void * D.19925;
  int iftmp.53;
  int D.19929;
  int D.19931;
  _Bool D.19933;
  long int D.19934;
  long int D.19935;
  int bwords.54;
  long unsigned int D.19939;
  gsize * mbitmap_data.55;
  long unsigned int D.19941;
  unsigned int D.19942;
  unsigned int D.19943;
  struct MonoClass * D.19944;
  unsigned int el_size.56;
  unsigned int D.19946;
  sizetype D.19947;
  const char * D.19950;
  const char * D.19951;
  gsize * bitmap_data.57;
  long unsigned int D.19953;
  void * D.19962;
  int iftmp.58;
  int D.19966;
  int D.19968;
  _Bool D.19970;
  long int D.19971;
  long int D.19972;
  unsigned int bwords.59;
  sizetype D.19976;

  {
    struct GCVTable * vt;
    mword desc;

    D.19703 = MEM[(mword *)start];
    D.19704 = D.19703 & 18446744073709551612;
    vt = (struct GCVTable *) D.19704;
    desc = vt->desc;
    D.19705 = desc & 7;
    switch (D.19705) <default: <D.18685>, case 1: <D.18580>, case 2: <D.18591>, case 3: <D.18647>, case 4: <D.18603>, case 5: <D.18639>, case 6: <D.18662>, case 7: <D.18684>>
    <D.18580>:
    D.19706 = desc & 4294901760;
    if (D.19706 != 0) goto <D.19707>; else goto <D.19708>;
    <D.19707>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.19709 = desc >> 16;
      D.19710 = D.19709 & 255;
      D.19711 = D.19710 * 8;
      _objptr = _objptr + D.19711;
      D.19712 = desc >> 24;
      D.19713 = D.19712 & 255;
      D.19714 = D.19713 * 8;
      _objptr_end = _objptr + D.19714;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19715>; else goto <D.19716>;
        <D.19715>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19717>; else goto <D.19718>;
        <D.19717>:
        if (__old != __copy) goto <D.19719>; else goto <D.19720>;
        <D.19719>:
        gc_debug_file.42 = gc_debug_file;
        D.19722 = *_objptr;
        fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19722, __old);
        gc_debug_file.42 = gc_debug_file;
        fflush (gc_debug_file.42);
        <D.19720>:
        <D.19718>:
        D.19726 = sgen_ptr_in_nursery (__copy);
        if (D.19726 != 0) goto <D.19727>; else goto <D.19724>;
        <D.19727>:
        D.19728 = sgen_ptr_in_nursery (_objptr);
        if (D.19728 == 0) goto <D.19729>; else goto <D.19724>;
        <D.19729>:
        iftmp.43 = 1;
        goto <D.19725>;
        <D.19724>:
        iftmp.43 = 0;
        <D.19725>:
        D.19730 = iftmp.43 != 0;
        D.19731 = (long int) D.19730;
        D.19732 = __builtin_expect (D.19731, 0);
        if (D.19732 != 0) goto <D.19733>; else goto <D.19734>;
        <D.19733>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19734>:
        <D.19716>:
      }
      _objptr = _objptr + 8;
      goto <D.18588>;
      <D.18587>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19735>; else goto <D.19736>;
        <D.19735>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19737>; else goto <D.19738>;
        <D.19737>:
        if (__old != __copy) goto <D.19739>; else goto <D.19740>;
        <D.19739>:
        gc_debug_file.42 = gc_debug_file;
        D.19722 = *_objptr;
        fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19722, __old);
        gc_debug_file.42 = gc_debug_file;
        fflush (gc_debug_file.42);
        <D.19740>:
        <D.19738>:
        D.19744 = sgen_ptr_in_nursery (__copy);
        if (D.19744 != 0) goto <D.19745>; else goto <D.19742>;
        <D.19745>:
        D.19746 = sgen_ptr_in_nursery (_objptr);
        if (D.19746 == 0) goto <D.19747>; else goto <D.19742>;
        <D.19747>:
        iftmp.44 = 1;
        goto <D.19743>;
        <D.19742>:
        iftmp.44 = 0;
        <D.19743>:
        D.19748 = iftmp.44 != 0;
        D.19749 = (long int) D.19748;
        D.19750 = __builtin_expect (D.19749, 0);
        if (D.19750 != 0) goto <D.19751>; else goto <D.19752>;
        <D.19751>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19752>:
        <D.19736>:
      }
      _objptr = _objptr + 8;
      <D.18588>:
      if (_objptr < _objptr_end) goto <D.18587>; else goto <D.18589>;
      <D.18589>:
    }
    <D.19708>:
    goto <D.18590>;
    <D.18591>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.19753 = (long unsigned int) _index;
        D.19754 = D.19753 * 8;
        _objptr = _objptr + D.19754;
        D.19755 = _index + 1;
        _bmap = _bmap >> D.19755;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.19756>; else goto <D.19757>;
          <D.19756>:
          simple_nursery_parallel_copy_object (_objptr, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.19758>; else goto <D.19759>;
          <D.19758>:
          if (__old != __copy) goto <D.19760>; else goto <D.19761>;
          <D.19760>:
          gc_debug_file.42 = gc_debug_file;
          D.19762 = *_objptr;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19762, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19761>:
          <D.19759>:
          D.19766 = sgen_ptr_in_nursery (__copy);
          if (D.19766 != 0) goto <D.19767>; else goto <D.19764>;
          <D.19767>:
          D.19768 = sgen_ptr_in_nursery (_objptr);
          if (D.19768 == 0) goto <D.19769>; else goto <D.19764>;
          <D.19769>:
          iftmp.45 = 1;
          goto <D.19765>;
          <D.19764>:
          iftmp.45 = 0;
          <D.19765>:
          D.19770 = iftmp.45 != 0;
          D.19771 = (long int) D.19770;
          D.19772 = __builtin_expect (D.19771, 0);
          if (D.19772 != 0) goto <D.19773>; else goto <D.19774>;
          <D.19773>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.19774>:
          <D.19757>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.18601>;
      <D.18600>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.19775 = (long unsigned int) _index;
        D.19776 = D.19775 * 8;
        _objptr = _objptr + D.19776;
        D.19777 = _index + 1;
        _bmap = _bmap >> D.19777;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.19778>; else goto <D.19779>;
          <D.19778>:
          simple_nursery_parallel_copy_object (_objptr, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.19780>; else goto <D.19781>;
          <D.19780>:
          if (__old != __copy) goto <D.19782>; else goto <D.19783>;
          <D.19782>:
          gc_debug_file.42 = gc_debug_file;
          D.19762 = *_objptr;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19762, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19783>:
          <D.19781>:
          D.19787 = sgen_ptr_in_nursery (__copy);
          if (D.19787 != 0) goto <D.19788>; else goto <D.19785>;
          <D.19788>:
          D.19789 = sgen_ptr_in_nursery (_objptr);
          if (D.19789 == 0) goto <D.19790>; else goto <D.19785>;
          <D.19790>:
          iftmp.46 = 1;
          goto <D.19786>;
          <D.19785>:
          iftmp.46 = 0;
          <D.19786>:
          D.19791 = iftmp.46 != 0;
          D.19792 = (long int) D.19791;
          D.19793 = __builtin_expect (D.19792, 0);
          if (D.19793 != 0) goto <D.19794>; else goto <D.19795>;
          <D.19794>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.19795>:
          <D.19779>:
        }
        _objptr = _objptr + 8;
      }
      <D.18601>:
      if (_bmap != 0) goto <D.18600>; else goto <D.18602>;
      <D.18602>:
    }
    goto <D.18590>;
    <D.18603>:
    D.19796 = desc & 4294950912;
    if (D.19796 != 0) goto <D.19797>; else goto <D.19798>;
    <D.19797>:
    {
      int el_size;
      int etype;

      D.19799 = desc >> 3;
      D.19800 = (int) D.19799;
      el_size = D.19800 & 1023;
      D.19801 = (int) desc;
      etype = D.19801 & 49152;
      if (etype == 16384) goto <D.19802>; else goto <D.19803>;
      <D.19802>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.19804 = MEM[(struct MonoArray *)start].max_length;
        el_size.47 = (unsigned int) el_size;
        D.19806 = D.19804 * el_size.47;
        D.19807 = (sizetype) D.19806;
        end_refs = p + D.19807;
        goto <D.18611>;
        <D.18610>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.19808>; else goto <D.19809>;
          <D.19808>:
          simple_nursery_parallel_copy_object (p, queue);
          __copy = *p;
          if (0 != 0) goto <D.19810>; else goto <D.19811>;
          <D.19810>:
          if (__old != __copy) goto <D.19812>; else goto <D.19813>;
          <D.19812>:
          gc_debug_file.42 = gc_debug_file;
          D.19814 = *p;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", p, D.19814, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19813>:
          <D.19811>:
          D.19818 = sgen_ptr_in_nursery (__copy);
          if (D.19818 != 0) goto <D.19819>; else goto <D.19816>;
          <D.19819>:
          D.19820 = sgen_ptr_in_nursery (p);
          if (D.19820 == 0) goto <D.19821>; else goto <D.19816>;
          <D.19821>:
          iftmp.48 = 1;
          goto <D.19817>;
          <D.19816>:
          iftmp.48 = 0;
          <D.19817>:
          D.19822 = iftmp.48 != 0;
          D.19823 = (long int) D.19822;
          D.19824 = __builtin_expect (D.19823, 0);
          if (D.19824 != 0) goto <D.19825>; else goto <D.19826>;
          <D.19825>:
          sgen_add_to_global_remset (p, __copy);
          <D.19826>:
          <D.19809>:
        }
        p = p + 8;
        <D.18611>:
        if (p < end_refs) goto <D.18610>; else goto <D.18612>;
        <D.18612>:
      }
      goto <D.19827>;
      <D.19803>:
      if (etype == 32768) goto <D.19828>; else goto <D.19829>;
      <D.19828>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.19709 = desc >> 16;
        D.19830 = (int) D.19709;
        offset = D.19830 & 255;
        D.19712 = desc >> 24;
        D.19831 = (int) D.19712;
        num_refs = D.19831 & 255;
        e_start = start + 32;
        D.19804 = MEM[(struct MonoArray *)start].max_length;
        el_size.47 = (unsigned int) el_size;
        D.19806 = D.19804 * el_size.47;
        D.19807 = (sizetype) D.19806;
        e_end = e_start + D.19807;
        goto <D.18625>;
        <D.18624>:
        {
          void * * p;
          int i;

          p = e_start;
          D.19832 = (long unsigned int) offset;
          D.19833 = D.19832 * 8;
          p = p + D.19833;
          i = 0;
          goto <D.18622>;
          <D.18621>:
          {
            void * __old;
            void * __copy;

            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19836 = p + D.19835;
            __old = *D.19836;
            if (__old != 0B) goto <D.19837>; else goto <D.19838>;
            <D.19837>:
            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19836 = p + D.19835;
            simple_nursery_parallel_copy_object (D.19836, queue);
            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19836 = p + D.19835;
            __copy = *D.19836;
            if (0 != 0) goto <D.19839>; else goto <D.19840>;
            <D.19839>:
            if (__old != __copy) goto <D.19841>; else goto <D.19842>;
            <D.19841>:
            gc_debug_file.42 = gc_debug_file;
            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19836 = p + D.19835;
            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19836 = p + D.19835;
            D.19843 = *D.19836;
            fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", D.19836, D.19843, __old);
            gc_debug_file.42 = gc_debug_file;
            fflush (gc_debug_file.42);
            <D.19842>:
            <D.19840>:
            D.19847 = sgen_ptr_in_nursery (__copy);
            if (D.19847 != 0) goto <D.19848>; else goto <D.19845>;
            <D.19848>:
            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19849 = p + D.19835;
            D.19850 = sgen_ptr_in_nursery (D.19849);
            if (D.19850 == 0) goto <D.19851>; else goto <D.19845>;
            <D.19851>:
            iftmp.49 = 1;
            goto <D.19846>;
            <D.19845>:
            iftmp.49 = 0;
            <D.19846>:
            D.19852 = iftmp.49 != 0;
            D.19853 = (long int) D.19852;
            D.19854 = __builtin_expect (D.19853, 0);
            if (D.19854 != 0) goto <D.19855>; else goto <D.19856>;
            <D.19855>:
            D.19834 = (long unsigned int) i;
            D.19835 = D.19834 * 8;
            D.19857 = p + D.19835;
            sgen_add_to_global_remset (D.19857, __copy);
            <D.19856>:
            <D.19838>:
          }
          i = i + 1;
          <D.18622>:
          if (i < num_refs) goto <D.18621>; else goto <D.18623>;
          <D.18623>:
          D.19858 = (sizetype) el_size;
          e_start = e_start + D.19858;
        }
        <D.18625>:
        if (e_start < e_end) goto <D.18624>; else goto <D.18626>;
        <D.18626>:
      }
      goto <D.19859>;
      <D.19829>:
      if (etype == 49152) goto <D.19860>; else goto <D.19861>;
      <D.19860>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.19804 = MEM[(struct MonoArray *)start].max_length;
        el_size.47 = (unsigned int) el_size;
        D.19806 = D.19804 * el_size.47;
        D.19807 = (sizetype) D.19806;
        e_end = e_start + D.19807;
        goto <D.18637>;
        <D.18636>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.18634>;
          <D.18633>:
          D.19862 = _bmap & 1;
          if (D.19862 != 0) goto <D.19863>; else goto <D.19864>;
          <D.19863>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.19865>; else goto <D.19866>;
            <D.19865>:
            simple_nursery_parallel_copy_object (p, queue);
            __copy = *p;
            if (0 != 0) goto <D.19867>; else goto <D.19868>;
            <D.19867>:
            if (__old != __copy) goto <D.19869>; else goto <D.19870>;
            <D.19869>:
            gc_debug_file.42 = gc_debug_file;
            D.19871 = *p;
            fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", p, D.19871, __old);
            gc_debug_file.42 = gc_debug_file;
            fflush (gc_debug_file.42);
            <D.19870>:
            <D.19868>:
            D.19875 = sgen_ptr_in_nursery (__copy);
            if (D.19875 != 0) goto <D.19876>; else goto <D.19873>;
            <D.19876>:
            D.19877 = sgen_ptr_in_nursery (p);
            if (D.19877 == 0) goto <D.19878>; else goto <D.19873>;
            <D.19878>:
            iftmp.50 = 1;
            goto <D.19874>;
            <D.19873>:
            iftmp.50 = 0;
            <D.19874>:
            D.19879 = iftmp.50 != 0;
            D.19880 = (long int) D.19879;
            D.19881 = __builtin_expect (D.19880, 0);
            if (D.19881 != 0) goto <D.19882>; else goto <D.19883>;
            <D.19882>:
            sgen_add_to_global_remset (p, __copy);
            <D.19883>:
            <D.19866>:
          }
          <D.19864>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.18634>:
          if (_bmap != 0) goto <D.18633>; else goto <D.18635>;
          <D.18635>:
          D.19858 = (sizetype) el_size;
          e_start = e_start + D.19858;
        }
        <D.18637>:
        if (e_start < e_end) goto <D.18636>; else goto <D.18638>;
        <D.18638>:
      }
      <D.19861>:
      <D.19859>:
      <D.19827>:
    }
    <D.19798>:
    goto <D.18590>;
    <D.18639>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.18645>;
      <D.18644>:
      D.19884 = _bmap & 1;
      if (D.19884 != 0) goto <D.19885>; else goto <D.19886>;
      <D.19885>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.19887>; else goto <D.19888>;
        <D.19887>:
        simple_nursery_parallel_copy_object (_objptr, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.19889>; else goto <D.19890>;
        <D.19889>:
        if (__old != __copy) goto <D.19891>; else goto <D.19892>;
        <D.19891>:
        gc_debug_file.42 = gc_debug_file;
        D.19893 = *_objptr;
        fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19893, __old);
        gc_debug_file.42 = gc_debug_file;
        fflush (gc_debug_file.42);
        <D.19892>:
        <D.19890>:
        D.19897 = sgen_ptr_in_nursery (__copy);
        if (D.19897 != 0) goto <D.19898>; else goto <D.19895>;
        <D.19898>:
        D.19899 = sgen_ptr_in_nursery (_objptr);
        if (D.19899 == 0) goto <D.19900>; else goto <D.19895>;
        <D.19900>:
        iftmp.51 = 1;
        goto <D.19896>;
        <D.19895>:
        iftmp.51 = 0;
        <D.19896>:
        D.19901 = iftmp.51 != 0;
        D.19902 = (long int) D.19901;
        D.19903 = __builtin_expect (D.19902, 0);
        if (D.19903 != 0) goto <D.19904>; else goto <D.19905>;
        <D.19904>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.19905>:
        <D.19888>:
      }
      <D.19886>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.18645>:
      if (_bmap != 0) goto <D.18644>; else goto <D.18646>;
      <D.18646>:
    }
    goto <D.18590>;
    <D.18647>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.19906 = *bitmap_data;
      D.19907 = (unsigned int) D.19906;
      D.19908 = D.19907 + 4294967295;
      bwords = (int) D.19908;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.19909>; else goto <D.19910>;
      <D.19909>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.19911 = myobj->vtable;
        D.19912 = D.19911->klass;
        D.19913 = D.19912->name_space;
        D.19911 = myobj->vtable;
        D.19912 = D.19911->klass;
        D.19914 = D.19912->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.19913, D.19914);
      }
      <D.19910>:
      goto <D.18660>;
      <D.18659>:
      {
        gsize _bmap;

        bitmap_data.52 = bitmap_data;
        bitmap_data = bitmap_data.52 + 8;
        _bmap = *bitmap_data.52;
        _objptr = start_run;
        goto <D.18657>;
        <D.18656>:
        D.19916 = _bmap & 1;
        if (D.19916 != 0) goto <D.19917>; else goto <D.19918>;
        <D.19917>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.19919>; else goto <D.19920>;
          <D.19919>:
          simple_nursery_parallel_copy_object (_objptr, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.19921>; else goto <D.19922>;
          <D.19921>:
          if (__old != __copy) goto <D.19923>; else goto <D.19924>;
          <D.19923>:
          gc_debug_file.42 = gc_debug_file;
          D.19925 = *_objptr;
          fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19925, __old);
          gc_debug_file.42 = gc_debug_file;
          fflush (gc_debug_file.42);
          <D.19924>:
          <D.19922>:
          D.19929 = sgen_ptr_in_nursery (__copy);
          if (D.19929 != 0) goto <D.19930>; else goto <D.19927>;
          <D.19930>:
          D.19931 = sgen_ptr_in_nursery (_objptr);
          if (D.19931 == 0) goto <D.19932>; else goto <D.19927>;
          <D.19932>:
          iftmp.53 = 1;
          goto <D.19928>;
          <D.19927>:
          iftmp.53 = 0;
          <D.19928>:
          D.19933 = iftmp.53 != 0;
          D.19934 = (long int) D.19933;
          D.19935 = __builtin_expect (D.19934, 0);
          if (D.19935 != 0) goto <D.19936>; else goto <D.19937>;
          <D.19936>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.19937>:
          <D.19920>:
        }
        <D.19918>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.18657>:
        if (_bmap != 0) goto <D.18656>; else goto <D.18658>;
        <D.18658>:
        start_run = start_run + 512;
      }
      <D.18660>:
      bwords.54 = bwords;
      bwords = bwords.54 + -1;
      if (bwords.54 > 0) goto <D.18659>; else goto <D.18661>;
      <D.18661>:
    }
    goto <D.18590>;
    <D.18662>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.19939 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.19939);
      mbitmap_data.55 = mbitmap_data;
      mbitmap_data = mbitmap_data.55 + 8;
      D.19941 = *mbitmap_data.55;
      D.19942 = (unsigned int) D.19941;
      D.19943 = D.19942 + 4294967295;
      mbwords = (int) D.19943;
      D.19944 = vt->klass;
      el_size = mono_array_element_size (D.19944);
      e_start = start + 32;
      D.19804 = MEM[(struct MonoArray *)start].max_length;
      el_size.56 = (unsigned int) el_size;
      D.19946 = D.19804 * el_size.56;
      D.19947 = (sizetype) D.19946;
      e_end = e_start + D.19947;
      if (0 != 0) goto <D.19948>; else goto <D.19949>;
      <D.19948>:
      D.19939 = vt->desc;
      D.19944 = vt->klass;
      D.19950 = D.19944->name_space;
      D.19944 = vt->klass;
      D.19951 = D.19944->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.19939, D.19950, D.19951);
      <D.19949>:
      goto <D.18682>;
      <D.18681>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

        _objptr = e_start;
        bitmap_data = mbitmap_data;
        bwords = (unsigned int) mbwords;
        goto <D.18679>;
        <D.18678>:
        {
          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.18676>;
          <D.18675>:
          D.19953 = _bmap & 1;
          if (D.19953 != 0) goto <D.19954>; else goto <D.19955>;
          <D.19954>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.19956>; else goto <D.19957>;
            <D.19956>:
            simple_nursery_parallel_copy_object (_objptr, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.19958>; else goto <D.19959>;
            <D.19958>:
            if (__old != __copy) goto <D.19960>; else goto <D.19961>;
            <D.19960>:
            gc_debug_file.42 = gc_debug_file;
            D.19962 = *_objptr;
            fprintf (gc_debug_file.42, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19962, __old);
            gc_debug_file.42 = gc_debug_file;
            fflush (gc_debug_file.42);
            <D.19961>:
            <D.19959>:
            D.19966 = sgen_ptr_in_nursery (__copy);
            if (D.19966 != 0) goto <D.19967>; else goto <D.19964>;
            <D.19967>:
            D.19968 = sgen_ptr_in_nursery (_objptr);
            if (D.19968 == 0) goto <D.19969>; else goto <D.19964>;
            <D.19969>:
            iftmp.58 = 1;
            goto <D.19965>;
            <D.19964>:
            iftmp.58 = 0;
            <D.19965>:
            D.19970 = iftmp.58 != 0;
            D.19971 = (long int) D.19970;
            D.19972 = __builtin_expect (D.19971, 0);
            if (D.19972 != 0) goto <D.19973>; else goto <D.19974>;
            <D.19973>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.19974>:
            <D.19957>:
          }
          <D.19955>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.18676>:
          if (_bmap != 0) goto <D.18675>; else goto <D.18677>;
          <D.18677>:
          _objptr = start_run + 512;
        }
        <D.18679>:
        bwords.59 = bwords;
        bwords = bwords.59 + 4294967295;
        if (bwords.59 != 0) goto <D.18678>; else goto <D.18680>;
        <D.18680>:
        D.19976 = (sizetype) el_size;
        e_start = e_start + D.19976;
      }
      <D.18682>:
      if (e_start < e_end) goto <D.18681>; else goto <D.18683>;
      <D.18683>:
    }
    goto <D.18590>;
    <D.18684>:
    goto <D.18590>;
    <D.18685>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.18590>:
  }
}


simple_nursery_parallel_copy_object (void * * obj_slot, struct SgenGrayQueue * queue)
{
  int current_collection_generation.60;
  int D.19981;
  long unsigned int D.19984;
  long unsigned int D.19985;
  long unsigned int D.19988;
  int D.19991;
  unsigned int D.19994;
  unsigned int D.19995;
  long unsigned int D.19996;
  void * D.19997;
  long unsigned int D.19998;
  _Bool D.19999;
  long int D.20000;
  long int D.20001;
  long unsigned int destination.61;
  long unsigned int D.20005;
  void * D.20006;
  void * D.20007;
  struct SgenGrayQueue * iftmp.62;
  int D.20015;
  _Bool D.20019;
  long int D.20020;
  long int D.20021;
  char * obj;
  mword vtable_word;
  mword objsize;
  struct MonoVTable * vt;
  void * destination;
  gboolean has_references;

  obj = *obj_slot;
  if (0 != 0) goto <D.19978>; else goto <D.19979>;
  <D.19978>:
  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.18572>:
  goto <D.18572>;
  <D.19979>:
  D.19981 = sgen_ptr_in_nursery (obj);
  if (D.19981 == 0) goto <D.19982>; else goto <D.19983>;
  <D.19982>:
  return;
  <D.19983>:
  vtable_word = MEM[(mword *)obj];
  D.19984 = vtable_word & 18446744073709551612;
  vt = (struct MonoVTable *) D.19984;
  D.19985 = vtable_word & 1;
  if (D.19985 != 0) goto <D.19986>; else goto <D.19987>;
  <D.19986>:
  *obj_slot = vt;
  return;
  <D.19987>:
  D.19988 = vtable_word & 2;
  if (D.19988 != 0) goto <D.19989>; else goto <D.19990>;
  <D.19989>:
  return;
  <D.19990>:
  D.19991 = sgen_nursery_is_to_space (obj);
  if (D.19991 != 0) goto <D.19992>; else goto <D.19993>;
  <D.19992>:
  return;
  <D.19993>:
  D.19994 = sgen_par_object_get_size (vt, obj);
  D.19995 = D.19994 + 7;
  D.19996 = (long unsigned int) D.19995;
  objsize = D.19996 & 4294967288;
  D.19997 = vt->gc_descr;
  D.19998 = (long unsigned int) D.19997;
  has_references = sgen_gc_descr_has_references (D.19998);
  destination = par_alloc_for_promotion (vt, obj, objsize, has_references);
  D.19999 = destination == 0B;
  D.20000 = (long int) D.19999;
  D.20001 = __builtin_expect (D.20000, 0);
  if (D.20001 != 0) goto <D.20002>; else goto <D.20003>;
  <D.20002>:
  sgen_parallel_pin_or_update (obj_slot, obj, vt, queue);
  return;
  <D.20003>:
  MEM[(struct MonoVTable * *)destination] = vt;
  destination.61 = (long unsigned int) destination;
  D.20005 = destination.61 | 1;
  D.20006 = (void *) D.20005;
  D.20007 = InterlockedCompareExchangePointer (obj, D.20006, vt);
  if (D.20007 == vt) goto <D.20008>; else goto <D.20009>;
  <D.20008>:
  if (has_references != 0) goto <D.20011>; else goto <D.20012>;
  <D.20011>:
  iftmp.62 = queue;
  goto <D.20013>;
  <D.20012>:
  iftmp.62 = 0B;
  <D.20013>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.62);
  obj = destination;
  *obj_slot = obj;
  goto <D.20014>;
  <D.20009>:
  D.20015 = sgen_ptr_in_nursery (destination);
  if (D.20015 == 0) goto <D.20016>; else goto <D.20017>;
  <D.20016>:
  MEM[(void * *)destination] = 0B;
  goto <D.20018>;
  <D.20017>:
  memset (destination, 0, objsize);
  <D.20018>:
  vtable_word = MEM[(mword *)obj];
  D.19985 = vtable_word & 1;
  D.20019 = D.19985 == 0;
  D.20020 = (long int) D.20019;
  D.20021 = __builtin_expect (D.20020, 0);
  if (D.20021 != 0) goto <D.20022>; else goto <D.20023>;
  <D.20022>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-minor-copy-object.h", 291, "vtable_word & SGEN_FORWARDED_BIT");
  <D.20023>:
  D.19984 = vtable_word & 18446744073709551612;
  obj = (char *) D.19984;
  *obj_slot = obj;
  <D.20014>:
}


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.20028;
  long int D.20029;
  int D.20030;
  _Bool D.20031;
  long int D.20032;
  long int D.20033;
  char * D.20036;
  char * D.20037;
  int sgen_space_bitmap_size.66;
  _Bool D.20039;
  long int D.20040;
  long int D.20041;
  gboolean D.20044;
  char * sgen_space_bitmap.67;
  sizetype D.20046;
  char * D.20047;
  char D.20048;
  int D.20049;
  int D.20050;
  int D.20051;
  _Bool D.20052;
  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.20028 = object.63 - sgen_nursery_start.65;
  D.20029 = D.20028 >> 9;
  idx = (int) D.20029;
  byte = idx / 8;
  bit = idx & 7;
  D.20030 = sgen_ptr_in_nursery (object);
  D.20031 = D.20030 == 0;
  D.20032 = (long int) D.20031;
  D.20033 = __builtin_expect (D.20032, 0);
  if (D.20033 != 0) goto <D.20034>; else goto <D.20035>;
  <D.20034>:
  D.20036 = sgen_get_nursery_start ();
  D.20037 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.20036, D.20037);
  <D.17962>:
  goto <D.17962>;
  <D.20035>:
  sgen_space_bitmap_size.66 = sgen_space_bitmap_size;
  D.20039 = byte >= sgen_space_bitmap_size.66;
  D.20040 = (long int) D.20039;
  D.20041 = __builtin_expect (D.20040, 0);
  if (D.20041 != 0) goto <D.20042>; else goto <D.20043>;
  <D.20042>:
  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.17963>:
  goto <D.17963>;
  <D.20043>:
  sgen_space_bitmap.67 = sgen_space_bitmap;
  D.20046 = (sizetype) byte;
  D.20047 = sgen_space_bitmap.67 + D.20046;
  D.20048 = *D.20047;
  D.20049 = (int) D.20048;
  D.20050 = D.20049 >> bit;
  D.20051 = D.20050 & 1;
  D.20052 = D.20051 != 0;
  D.20044 = (gboolean) D.20052;
  return D.20044;
}


sgen_get_nursery_start ()
{
  char * D.20054;

  D.20054 = sgen_nursery_start;
  return D.20054;
}


sgen_get_nursery_end ()
{
  char * D.20056;

  D.20056 = sgen_nursery_end;
  return D.20056;
}


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

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


memset (void * __dest, int __ch, size_t __len)
{
  int D.20065;
  int D.20070;
  void * D.20072;
  long unsigned int D.20073;

  D.20065 = __builtin_constant_p (__len);
  if (D.20065 != 0) goto <D.20066>; else goto <D.20067>;
  <D.20066>:
  if (__len == 0) goto <D.20068>; else goto <D.20069>;
  <D.20068>:
  D.20070 = __builtin_constant_p (__ch);
  if (D.20070 == 0) goto <D.20063>; else goto <D.20071>;
  <D.20071>:
  if (__ch != 0) goto <D.20063>; else goto <D.20064>;
  <D.20063>:
  __warn_memset_zero_len ();
  D.20072 = __dest;
  return D.20072;
  <D.20064>:
  <D.20069>:
  <D.20067>:
  D.20073 = __builtin_object_size (__dest, 0);
  D.20072 = __builtin___memset_chk (__dest, __ch, __len, D.20073);
  return D.20072;
}


simple_nursery_serial_copy_object (void * * obj_slot, struct SgenGrayQueue * queue)
{
  int current_collection_generation.70;
  int D.20078;
  struct FILE * gc_debug_file.71;
  char * iftmp.72;
  long unsigned int D.20085;
  long unsigned int D.20086;
  long unsigned int D.20089;
  long unsigned int D.20097;
  _Bool D.20098;
  long int D.20099;
  long int D.20100;
  void * D.20107;
  char * forwarded;
  char * obj;

  obj = *obj_slot;
  if (0 != 0) goto <D.20075>; else goto <D.20076>;
  <D.20075>:
  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.18549>:
  goto <D.18549>;
  <D.20076>:
  D.20078 = sgen_ptr_in_nursery (obj);
  if (D.20078 == 0) goto <D.20079>; else goto <D.20080>;
  <D.20079>:
  return;
  <D.20080>:
  if (0 != 0) goto <D.20081>; else goto <D.20082>;
  <D.20081>:
  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.20082>:
  D.20085 = MEM[(mword *)obj];
  D.20086 = D.20085 & 1;
  if (D.20086 != 0) goto <D.20087>; else goto <D.20088>;
  <D.20087>:
  D.20085 = MEM[(mword *)obj];
  D.20089 = D.20085 & 18446744073709551612;
  iftmp.72 = (char *) D.20089;
  goto <D.20090>;
  <D.20088>:
  iftmp.72 = 0B;
  <D.20090>:
  forwarded = iftmp.72;
  if (forwarded != 0B) goto <D.20091>; else goto <D.20092>;
  <D.20091>:
  if (0 != 0) goto <D.20093>; else goto <D.20094>;
  <D.20093>:
  monoeg_g_log (0B, 4, "forwarded object %p has no gc descriptor", forwarded);
  <D.18550>:
  goto <D.18550>;
  <D.20094>:
  if (0 != 0) goto <D.20095>; else goto <D.20096>;
  <D.20095>:
  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.20096>:
  *obj_slot = forwarded;
  return;
  <D.20092>:
  D.20085 = MEM[(mword *)obj];
  D.20097 = D.20085 & 2;
  D.20098 = D.20097 != 0;
  D.20099 = (long int) D.20098;
  D.20100 = __builtin_expect (D.20099, 0);
  if (D.20100 != 0) goto <D.20101>; else goto <D.20102>;
  <D.20101>:
  if (0 != 0) goto <D.20103>; else goto <D.20104>;
  <D.20103>:
  monoeg_g_log (0B, 4, "pinned object %p has no gc descriptor", obj);
  <D.18551>:
  goto <D.18551>;
  <D.20104>:
  if (0 != 0) goto <D.20105>; else goto <D.20106>;
  <D.20105>:
  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.20106>:
  return;
  <D.20102>:
  D.20107 = copy_object_no_checks (obj, queue);
  *obj_slot = D.20107;
}


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

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


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.20111;
  void * (*<T2f12>) (struct MonoVTable *, int, gboolean) D.20112;
  int D.20113;

  D.20112 = major_collector.par_alloc_object;
  D.20113 = (int) objsize;
  D.20111 = D.20112 (vtable, D.20113, has_references);
  return D.20111;
}


alloc_for_promotion (struct MonoVTable * vtable, char * obj, size_t objsize, gboolean has_references)
{
  char * D.20115;
  void * (*<T2f12>) (struct MonoVTable *, int, gboolean) D.20116;
  int D.20117;

  D.20116 = major_collector.alloc_object;
  D.20117 = (int) objsize;
  D.20115 = D.20116 (vtable, D.20117, has_references);
  return D.20115;
}


