sgen_marksweep_init (struct SgenMajorCollector * collector)
{
  sgen_marksweep_init_internal (collector, 0);
}


sgen_marksweep_init_internal (struct SgenMajorCollector * collector, gboolean is_concurrent)
{
  int num_block_obj_sizes.0;
  int num_block_obj_sizes.1;
  unsigned int num_block_obj_sizes.2;
  unsigned int D.22726;
  void * block_obj_sizes.3;
  int * block_obj_sizes.4;
  void * evacuate_block_obj_sizes.5;
  gboolean * evacuate_block_obj_sizes.6;
  unsigned int i.7;
  unsigned int D.22732;
  gboolean * D.22733;
  int D.22734;
  int D.22735;
  int iftmp.8;
  int D.22737;
  int D.22738;
  int D.22742;
  _Bool D.22743;
  long int D.22744;
  long int D.22745;
  int i;

  sgen_register_fixed_internal_mem_type (16, 296);
  num_block_obj_sizes.0 = ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, 0B);
  num_block_obj_sizes = num_block_obj_sizes.0;
  num_block_obj_sizes.1 = num_block_obj_sizes;
  num_block_obj_sizes.2 = (unsigned int) num_block_obj_sizes.1;
  D.22726 = num_block_obj_sizes.2 * 4;
  block_obj_sizes.3 = sgen_alloc_internal_dynamic (D.22726, 15, 1);
  block_obj_sizes = block_obj_sizes.3;
  block_obj_sizes.4 = block_obj_sizes;
  ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, block_obj_sizes.4);
  num_block_obj_sizes.1 = num_block_obj_sizes;
  num_block_obj_sizes.2 = (unsigned int) num_block_obj_sizes.1;
  D.22726 = num_block_obj_sizes.2 * 4;
  evacuate_block_obj_sizes.5 = sgen_alloc_internal_dynamic (D.22726, 15, 1);
  evacuate_block_obj_sizes = evacuate_block_obj_sizes.5;
  i = 0;
  goto <D.22706>;
  <D.22705>:
  evacuate_block_obj_sizes.6 = evacuate_block_obj_sizes;
  i.7 = (unsigned int) i;
  D.22732 = i.7 * 4;
  D.22733 = evacuate_block_obj_sizes.6 + D.22732;
  *D.22733 = 0;
  i = i + 1;
  <D.22706>:
  num_block_obj_sizes.1 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.1) goto <D.22705>; else goto <D.22707>;
  <D.22707>:
  alloc_free_block_lists (&free_block_lists);
  i = 0;
  goto <D.22709>;
  <D.22708>:
  D.22734 = i * 8;
  D.22735 = ms_find_block_obj_size_index (D.22734);
  fast_block_obj_size_indexes[i] = D.22735;
  i = i + 1;
  <D.22709>:
  if (i <= 31) goto <D.22708>; else goto <D.22710>;
  <D.22710>:
  i = 0;
  goto <D.22712>;
  <D.22711>:
  D.22737 = i + 7;
  D.22738 = D.22737 >> 3;
  if (D.22738 <= 31) goto <D.22739>; else goto <D.22740>;
  <D.22739>:
  D.22737 = i + 7;
  D.22738 = D.22737 >> 3;
  iftmp.8 = fast_block_obj_size_indexes[D.22738];
  goto <D.22741>;
  <D.22740>:
  iftmp.8 = ms_find_block_obj_size_index (i);
  <D.22741>:
  D.22742 = ms_find_block_obj_size_index (i);
  D.22743 = iftmp.8 != D.22742;
  D.22744 = (long int) D.22743;
  D.22745 = __builtin_expect (D.22744, 0);
  if (D.22745 != 0) goto <D.22746>; else goto <D.22747>;
  <D.22746>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2510, "MS_BLOCK_OBJ_SIZE_INDEX (i) == ms_find_block_obj_size_index (i)");
  <D.22747>:
  i = i + 1;
  <D.22712>:
  if (i <= 255) goto <D.22711>; else goto <D.22713>;
  <D.22713>:
  mono_counters_register ("# major blocks allocated", 515, &stat_major_blocks_alloced);
  mono_counters_register ("# major blocks freed", 515, &stat_major_blocks_freed);
  mono_counters_register ("# major blocks lazy swept", 515, &stat_major_blocks_lazy_swept);
  mono_counters_register ("# major objects evacuated", 515, &stat_major_objects_evacuated);
  mono_counters_register ("# major blocks freed ideally", 515, &stat_major_blocks_freed_ideal);
  mono_counters_register ("# major blocks freed less ideally", 515, &stat_major_blocks_freed_less_ideal);
  mono_counters_register ("# major blocks freed individually", 515, &stat_major_blocks_freed_individual);
  mono_counters_register ("# major blocks allocated less ideally", 515, &stat_major_blocks_alloced_less_ideal);
  collector->section_size = 16384;
  collector->is_parallel = 0;
  concurrent_mark = is_concurrent;
  if (is_concurrent != 0) goto <D.22748>; else goto <D.22749>;
  <D.22748>:
  collector->is_concurrent = 1;
  collector->want_synchronous_collection = &want_evacuation;
  collector->get_and_reset_num_major_objects_marked = major_get_and_reset_num_major_objects_marked;
  goto <D.22750>;
  <D.22749>:
  collector->is_concurrent = 0;
  collector->want_synchronous_collection = 0B;
  <D.22750>:
  collector->supports_cardtable = 1;
  collector->have_swept = &have_swept;
  collector->alloc_heap = major_alloc_heap;
  collector->is_object_live = major_is_object_live;
  collector->alloc_small_pinned_obj = major_alloc_small_pinned_obj;
  collector->alloc_degraded = major_alloc_degraded;
  collector->alloc_object = major_alloc_object;
  collector->free_pinned_object = free_pinned_object;
  collector->iterate_objects = major_iterate_objects;
  collector->free_non_pinned_object = major_free_non_pinned_object;
  collector->find_pin_queue_start_ends = major_find_pin_queue_start_ends;
  collector->pin_objects = major_pin_objects;
  collector->pin_major_object = pin_major_object;
  collector->scan_card_table = major_scan_card_table;
  collector->iterate_live_block_ranges = major_iterate_live_block_ranges;
  if (is_concurrent != 0) goto <D.22751>; else goto <D.22752>;
  <D.22751>:
  collector->update_cardtable_mod_union = update_cardtable_mod_union;
  collector->get_cardtable_mod_union_for_object = major_get_cardtable_mod_union_for_object;
  <D.22752>:
  collector->init_to_space = major_init_to_space;
  collector->sweep = major_sweep;
  collector->check_scan_starts = major_check_scan_starts;
  collector->dump_heap = major_dump_heap;
  collector->get_used_size = major_get_used_size;
  collector->start_nursery_collection = major_start_nursery_collection;
  collector->finish_nursery_collection = major_finish_nursery_collection;
  collector->start_major_collection = major_start_major_collection;
  collector->finish_major_collection = major_finish_major_collection;
  collector->have_computed_minor_collection_allowance = major_have_computer_minor_collection_allowance;
  collector->ptr_is_in_non_pinned_space = major_ptr_is_in_non_pinned_space;
  collector->obj_is_from_pinned_alloc = obj_is_from_pinned_alloc;
  collector->report_pinned_memory_usage = major_report_pinned_memory_usage;
  collector->get_num_major_sections = get_num_major_sections;
  collector->handle_gc_param = major_handle_gc_param;
  collector->print_gc_param_usage = major_print_gc_param_usage;
  collector->post_param_init = post_param_init;
  collector->is_valid_object = major_is_valid_object;
  collector->describe_pointer = major_describe_pointer;
  collector->major_ops.copy_or_mark_object = major_copy_or_mark_object_canonical;
  collector->major_ops.scan_object = major_scan_object;
  if (is_concurrent != 0) goto <D.22753>; else goto <D.22754>;
  <D.22753>:
  collector->major_concurrent_ops.copy_or_mark_object = major_copy_or_mark_object_concurrent_canonical;
  collector->major_concurrent_ops.scan_object = major_scan_object_concurrent;
  collector->major_concurrent_ops.scan_vtype = major_scan_vtype_concurrent;
  <D.22754>:
  if (0 != 0) goto <D.22755>; else goto <D.22756>;
  <D.22755>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2612, "(MS_BLOCK_SIZE % (8 * CARD_SIZE_IN_BYTES)) == 0");
  <D.22756>:
}


major_scan_vtype_concurrent (char * start, mword desc, struct SgenGrayQueue * queue)
{
  unsigned int D.22757;
  unsigned int D.22758;
  unsigned int D.22761;
  unsigned int D.22762;
  unsigned int D.22763;
  unsigned int D.22764;
  unsigned int D.22765;
  int D.22769;
  struct FILE * gc_debug_file.9;
  void * D.22776;
  int iftmp.10;
  int D.22780;
  int D.22782;
  _Bool D.22784;
  long int D.22785;
  long int D.22786;
  int iftmp.11;
  int D.22792;
  int D.22794;
  _Bool D.22796;
  long int D.22797;
  long int D.22798;
  int D.22804;
  int iftmp.12;
  int D.22813;
  int D.22815;
  _Bool D.22817;
  long int D.22818;
  long int D.22819;
  int iftmp.13;
  int D.22825;
  int D.22827;
  _Bool D.22829;
  long int D.22830;
  long int D.22831;
  unsigned int _index.14;
  unsigned int D.22835;
  int D.22836;
  int D.22840;
  void * D.22846;
  int iftmp.15;
  int D.22850;
  int D.22852;
  _Bool D.22854;
  long int D.22855;
  long int D.22856;
  int iftmp.16;
  int D.22862;
  int D.22864;
  _Bool D.22866;
  long int D.22867;
  long int D.22868;
  unsigned int _index.17;
  unsigned int D.22872;
  int D.22873;
  int D.22877;
  int iftmp.18;
  int D.22886;
  int D.22888;
  _Bool D.22890;
  long int D.22891;
  long int D.22892;
  int iftmp.19;
  int D.22898;
  int D.22900;
  _Bool D.22902;
  long int D.22903;
  long int D.22904;
  unsigned int D.22907;
  unsigned int D.22910;
  int D.22911;
  int desc.20;
  unsigned int D.22915;
  unsigned int el_size.21;
  unsigned int D.22917;
  int D.22921;
  void * D.22927;
  int iftmp.22;
  int D.22931;
  int D.22933;
  _Bool D.22935;
  long int D.22936;
  long int D.22937;
  int iftmp.23;
  int D.22943;
  int D.22945;
  _Bool D.22947;
  long int D.22948;
  long int D.22949;
  int D.22955;
  unsigned int offset.24;
  unsigned int D.22957;
  unsigned int i.25;
  unsigned int D.22959;
  void * * D.22960;
  int D.22964;
  void * D.22970;
  int iftmp.26;
  int D.22974;
  void * D.22976;
  int D.22977;
  _Bool D.22979;
  long int D.22980;
  long int D.22981;
  void * D.22984;
  int iftmp.27;
  int D.22988;
  int D.22990;
  _Bool D.22992;
  long int D.22993;
  long int D.22994;
  sizetype el_size.28;
  unsigned int D.23001;
  int D.23007;
  void * D.23013;
  int iftmp.29;
  int D.23017;
  int D.23019;
  _Bool D.23021;
  long int D.23022;
  long int D.23023;
  int iftmp.30;
  int D.23029;
  int D.23031;
  _Bool D.23033;
  long int D.23034;
  long int D.23035;
  unsigned int D.23038;
  int D.23044;
  void * D.23050;
  int iftmp.31;
  int D.23054;
  int D.23056;
  _Bool D.23058;
  long int D.23059;
  long int D.23060;
  int iftmp.32;
  int D.23066;
  int D.23068;
  _Bool D.23070;
  long int D.23071;
  long int D.23072;
  unsigned int D.23075;
  unsigned int D.23076;
  struct MonoVTable * D.23079;
  struct MonoClass * D.23080;
  const char * D.23081;
  const char * D.23082;
  gsize * bitmap_data.33;
  unsigned int D.23084;
  int D.23090;
  void * D.23096;
  int iftmp.34;
  int D.23100;
  int D.23102;
  _Bool D.23104;
  long int D.23105;
  long int D.23106;
  int iftmp.35;
  int D.23112;
  int D.23114;
  _Bool D.23116;
  long int D.23117;
  long int D.23118;
  int bwords.36;

  start = start + 4294967288;
  D.22757 = desc & 7;
  switch (D.22757) <default: <D.22347>, case 1: <D.22264>, case 2: <D.22275>, case 3: <D.22331>, case 4: <D.22287>, case 5: <D.22323>, case 7: <D.22346>>
  <D.22264>:
  D.22758 = desc & 4294901760;
  if (D.22758 != 0) goto <D.22759>; else goto <D.22760>;
  <D.22759>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.22761 = desc >> 16;
    D.22762 = D.22761 & 255;
    D.22763 = D.22762 * 4;
    _objptr = _objptr + D.22763;
    D.22764 = desc >> 24;
    D.22765 = D.22764 * 4;
    _objptr_end = _objptr + D.22765;
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.22768>; else goto <D.22766>;
      <D.22768>:
      D.22769 = sgen_ptr_in_nursery (__old);
      if (D.22769 == 0) goto <D.22770>; else goto <D.22766>;
      <D.22770>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.22771>; else goto <D.22772>;
      <D.22771>:
      if (__old != __copy) goto <D.22773>; else goto <D.22774>;
      <D.22773>:
      gc_debug_file.9 = gc_debug_file;
      D.22776 = *_objptr;
      fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.22776, __old);
      gc_debug_file.9 = gc_debug_file;
      fflush (gc_debug_file.9);
      <D.22774>:
      <D.22772>:
      D.22780 = sgen_ptr_in_nursery (__copy);
      if (D.22780 != 0) goto <D.22781>; else goto <D.22778>;
      <D.22781>:
      D.22782 = sgen_ptr_in_nursery (_objptr);
      if (D.22782 == 0) goto <D.22783>; else goto <D.22778>;
      <D.22783>:
      iftmp.10 = 1;
      goto <D.22779>;
      <D.22778>:
      iftmp.10 = 0;
      <D.22779>:
      D.22784 = iftmp.10 != 0;
      D.22785 = (long int) D.22784;
      D.22786 = __builtin_expect (D.22785, 0);
      if (D.22786 != 0) goto <D.22787>; else goto <D.22788>;
      <D.22787>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.22788>:
      goto <D.22767>;
      <D.22766>:
      D.22792 = sgen_ptr_in_nursery (__old);
      if (D.22792 != 0) goto <D.22793>; else goto <D.22790>;
      <D.22793>:
      D.22794 = sgen_ptr_in_nursery (_objptr);
      if (D.22794 == 0) goto <D.22795>; else goto <D.22790>;
      <D.22795>:
      iftmp.11 = 1;
      goto <D.22791>;
      <D.22790>:
      iftmp.11 = 0;
      <D.22791>:
      D.22796 = iftmp.11 != 0;
      D.22797 = (long int) D.22796;
      D.22798 = __builtin_expect (D.22797, 0);
      if (D.22798 != 0) goto <D.22799>; else goto <D.22800>;
      <D.22799>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.22800>:
      <D.22767>:
    }
    _objptr = _objptr + 4;
    goto <D.22272>;
    <D.22271>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.22803>; else goto <D.22801>;
      <D.22803>:
      D.22804 = sgen_ptr_in_nursery (__old);
      if (D.22804 == 0) goto <D.22805>; else goto <D.22801>;
      <D.22805>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.22806>; else goto <D.22807>;
      <D.22806>:
      if (__old != __copy) goto <D.22808>; else goto <D.22809>;
      <D.22808>:
      gc_debug_file.9 = gc_debug_file;
      D.22776 = *_objptr;
      fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.22776, __old);
      gc_debug_file.9 = gc_debug_file;
      fflush (gc_debug_file.9);
      <D.22809>:
      <D.22807>:
      D.22813 = sgen_ptr_in_nursery (__copy);
      if (D.22813 != 0) goto <D.22814>; else goto <D.22811>;
      <D.22814>:
      D.22815 = sgen_ptr_in_nursery (_objptr);
      if (D.22815 == 0) goto <D.22816>; else goto <D.22811>;
      <D.22816>:
      iftmp.12 = 1;
      goto <D.22812>;
      <D.22811>:
      iftmp.12 = 0;
      <D.22812>:
      D.22817 = iftmp.12 != 0;
      D.22818 = (long int) D.22817;
      D.22819 = __builtin_expect (D.22818, 0);
      if (D.22819 != 0) goto <D.22820>; else goto <D.22821>;
      <D.22820>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.22821>:
      goto <D.22802>;
      <D.22801>:
      D.22825 = sgen_ptr_in_nursery (__old);
      if (D.22825 != 0) goto <D.22826>; else goto <D.22823>;
      <D.22826>:
      D.22827 = sgen_ptr_in_nursery (_objptr);
      if (D.22827 == 0) goto <D.22828>; else goto <D.22823>;
      <D.22828>:
      iftmp.13 = 1;
      goto <D.22824>;
      <D.22823>:
      iftmp.13 = 0;
      <D.22824>:
      D.22829 = iftmp.13 != 0;
      D.22830 = (long int) D.22829;
      D.22831 = __builtin_expect (D.22830, 0);
      if (D.22831 != 0) goto <D.22832>; else goto <D.22833>;
      <D.22832>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.22833>:
      <D.22802>:
    }
    _objptr = _objptr + 4;
    <D.22272>:
    if (_objptr < _objptr_end) goto <D.22271>; else goto <D.22273>;
    <D.22273>:
  }
  <D.22760>:
  goto <D.22274>;
  <D.22275>:
  {
    void * * _objptr;
    gsize _bmap;

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

      _index = __builtin_ctz (_bmap);
      _index.14 = (unsigned int) _index;
      D.22835 = _index.14 * 4;
      _objptr = _objptr + D.22835;
      D.22836 = _index + 1;
      _bmap = _bmap >> D.22836;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.22839>; else goto <D.22837>;
        <D.22839>:
        D.22840 = sgen_ptr_in_nursery (__old);
        if (D.22840 == 0) goto <D.22841>; else goto <D.22837>;
        <D.22841>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.22842>; else goto <D.22843>;
        <D.22842>:
        if (__old != __copy) goto <D.22844>; else goto <D.22845>;
        <D.22844>:
        gc_debug_file.9 = gc_debug_file;
        D.22846 = *_objptr;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.22846, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.22845>:
        <D.22843>:
        D.22850 = sgen_ptr_in_nursery (__copy);
        if (D.22850 != 0) goto <D.22851>; else goto <D.22848>;
        <D.22851>:
        D.22852 = sgen_ptr_in_nursery (_objptr);
        if (D.22852 == 0) goto <D.22853>; else goto <D.22848>;
        <D.22853>:
        iftmp.15 = 1;
        goto <D.22849>;
        <D.22848>:
        iftmp.15 = 0;
        <D.22849>:
        D.22854 = iftmp.15 != 0;
        D.22855 = (long int) D.22854;
        D.22856 = __builtin_expect (D.22855, 0);
        if (D.22856 != 0) goto <D.22857>; else goto <D.22858>;
        <D.22857>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.22858>:
        goto <D.22838>;
        <D.22837>:
        D.22862 = sgen_ptr_in_nursery (__old);
        if (D.22862 != 0) goto <D.22863>; else goto <D.22860>;
        <D.22863>:
        D.22864 = sgen_ptr_in_nursery (_objptr);
        if (D.22864 == 0) goto <D.22865>; else goto <D.22860>;
        <D.22865>:
        iftmp.16 = 1;
        goto <D.22861>;
        <D.22860>:
        iftmp.16 = 0;
        <D.22861>:
        D.22866 = iftmp.16 != 0;
        D.22867 = (long int) D.22866;
        D.22868 = __builtin_expect (D.22867, 0);
        if (D.22868 != 0) goto <D.22869>; else goto <D.22870>;
        <D.22869>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.22870>:
        <D.22838>:
      }
      _objptr = _objptr + 4;
    }
    goto <D.22285>;
    <D.22284>:
    {
      int _index;

      _index = __builtin_ctz (_bmap);
      _index.17 = (unsigned int) _index;
      D.22872 = _index.17 * 4;
      _objptr = _objptr + D.22872;
      D.22873 = _index + 1;
      _bmap = _bmap >> D.22873;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.22876>; else goto <D.22874>;
        <D.22876>:
        D.22877 = sgen_ptr_in_nursery (__old);
        if (D.22877 == 0) goto <D.22878>; else goto <D.22874>;
        <D.22878>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.22879>; else goto <D.22880>;
        <D.22879>:
        if (__old != __copy) goto <D.22881>; else goto <D.22882>;
        <D.22881>:
        gc_debug_file.9 = gc_debug_file;
        D.22846 = *_objptr;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.22846, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.22882>:
        <D.22880>:
        D.22886 = sgen_ptr_in_nursery (__copy);
        if (D.22886 != 0) goto <D.22887>; else goto <D.22884>;
        <D.22887>:
        D.22888 = sgen_ptr_in_nursery (_objptr);
        if (D.22888 == 0) goto <D.22889>; else goto <D.22884>;
        <D.22889>:
        iftmp.18 = 1;
        goto <D.22885>;
        <D.22884>:
        iftmp.18 = 0;
        <D.22885>:
        D.22890 = iftmp.18 != 0;
        D.22891 = (long int) D.22890;
        D.22892 = __builtin_expect (D.22891, 0);
        if (D.22892 != 0) goto <D.22893>; else goto <D.22894>;
        <D.22893>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.22894>:
        goto <D.22875>;
        <D.22874>:
        D.22898 = sgen_ptr_in_nursery (__old);
        if (D.22898 != 0) goto <D.22899>; else goto <D.22896>;
        <D.22899>:
        D.22900 = sgen_ptr_in_nursery (_objptr);
        if (D.22900 == 0) goto <D.22901>; else goto <D.22896>;
        <D.22901>:
        iftmp.19 = 1;
        goto <D.22897>;
        <D.22896>:
        iftmp.19 = 0;
        <D.22897>:
        D.22902 = iftmp.19 != 0;
        D.22903 = (long int) D.22902;
        D.22904 = __builtin_expect (D.22903, 0);
        if (D.22904 != 0) goto <D.22905>; else goto <D.22906>;
        <D.22905>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.22906>:
        <D.22875>:
      }
      _objptr = _objptr + 4;
    }
    <D.22285>:
    if (_bmap != 0) goto <D.22284>; else goto <D.22286>;
    <D.22286>:
  }
  goto <D.22274>;
  <D.22287>:
  D.22907 = desc & 4294950912;
  if (D.22907 != 0) goto <D.22908>; else goto <D.22909>;
  <D.22908>:
  {
    int el_size;
    int etype;

    D.22910 = desc >> 3;
    D.22911 = (int) D.22910;
    el_size = D.22911 & 1023;
    desc.20 = (int) desc;
    etype = desc.20 & 49152;
    if (etype == 16384) goto <D.22913>; else goto <D.22914>;
    <D.22913>:
    {
      void * * p;
      void * * end_refs;

      p = start + 16;
      D.22915 = MEM[(struct MonoArray *)start].max_length;
      el_size.21 = (unsigned int) el_size;
      D.22917 = D.22915 * el_size.21;
      end_refs = p + D.22917;
      goto <D.22295>;
      <D.22294>:
      {
        void * __old;
        void * __copy;

        __old = *p;
        if (__old != 0B) goto <D.22920>; else goto <D.22918>;
        <D.22920>:
        D.22921 = sgen_ptr_in_nursery (__old);
        if (D.22921 == 0) goto <D.22922>; else goto <D.22918>;
        <D.22922>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (p, __old, queue);
        __copy = *p;
        if (0 != 0) goto <D.22923>; else goto <D.22924>;
        <D.22923>:
        if (__old != __copy) goto <D.22925>; else goto <D.22926>;
        <D.22925>:
        gc_debug_file.9 = gc_debug_file;
        D.22927 = *p;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", p, D.22927, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.22926>:
        <D.22924>:
        D.22931 = sgen_ptr_in_nursery (__copy);
        if (D.22931 != 0) goto <D.22932>; else goto <D.22929>;
        <D.22932>:
        D.22933 = sgen_ptr_in_nursery (p);
        if (D.22933 == 0) goto <D.22934>; else goto <D.22929>;
        <D.22934>:
        iftmp.22 = 1;
        goto <D.22930>;
        <D.22929>:
        iftmp.22 = 0;
        <D.22930>:
        D.22935 = iftmp.22 != 0;
        D.22936 = (long int) D.22935;
        D.22937 = __builtin_expect (D.22936, 0);
        if (D.22937 != 0) goto <D.22938>; else goto <D.22939>;
        <D.22938>:
        sgen_add_to_global_remset (p, __copy);
        <D.22939>:
        goto <D.22919>;
        <D.22918>:
        D.22943 = sgen_ptr_in_nursery (__old);
        if (D.22943 != 0) goto <D.22944>; else goto <D.22941>;
        <D.22944>:
        D.22945 = sgen_ptr_in_nursery (p);
        if (D.22945 == 0) goto <D.22946>; else goto <D.22941>;
        <D.22946>:
        iftmp.23 = 1;
        goto <D.22942>;
        <D.22941>:
        iftmp.23 = 0;
        <D.22942>:
        D.22947 = iftmp.23 != 0;
        D.22948 = (long int) D.22947;
        D.22949 = __builtin_expect (D.22948, 0);
        if (D.22949 != 0) goto <D.22950>; else goto <D.22951>;
        <D.22950>:
        sgen_add_to_global_remset (p, __old);
        <D.22951>:
        <D.22919>:
      }
      p = p + 4;
      <D.22295>:
      if (p < end_refs) goto <D.22294>; else goto <D.22296>;
      <D.22296>:
    }
    goto <D.22952>;
    <D.22914>:
    if (etype == 32768) goto <D.22953>; else goto <D.22954>;
    <D.22953>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.22761 = desc >> 16;
      D.22955 = (int) D.22761;
      offset = D.22955 & 255;
      D.22764 = desc >> 24;
      num_refs = (int) D.22764;
      e_start = start + 16;
      D.22915 = MEM[(struct MonoArray *)start].max_length;
      el_size.21 = (unsigned int) el_size;
      D.22917 = D.22915 * el_size.21;
      e_end = e_start + D.22917;
      goto <D.22309>;
      <D.22308>:
      {
        void * * p;
        int i;

        p = e_start;
        offset.24 = (unsigned int) offset;
        D.22957 = offset.24 * 4;
        p = p + D.22957;
        i = 0;
        goto <D.22306>;
        <D.22305>:
        {
          void * __old;
          void * __copy;

          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22960 = p + D.22959;
          __old = *D.22960;
          if (__old != 0B) goto <D.22963>; else goto <D.22961>;
          <D.22963>:
          D.22964 = sgen_ptr_in_nursery (__old);
          if (D.22964 == 0) goto <D.22965>; else goto <D.22961>;
          <D.22965>:
          __builtin_prefetch (__old);
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22960 = p + D.22959;
          major_copy_or_mark_object_concurrent (D.22960, __old, queue);
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22960 = p + D.22959;
          __copy = *D.22960;
          if (0 != 0) goto <D.22966>; else goto <D.22967>;
          <D.22966>:
          if (__old != __copy) goto <D.22968>; else goto <D.22969>;
          <D.22968>:
          gc_debug_file.9 = gc_debug_file;
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22960 = p + D.22959;
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22960 = p + D.22959;
          D.22970 = *D.22960;
          fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", D.22960, D.22970, __old);
          gc_debug_file.9 = gc_debug_file;
          fflush (gc_debug_file.9);
          <D.22969>:
          <D.22967>:
          D.22974 = sgen_ptr_in_nursery (__copy);
          if (D.22974 != 0) goto <D.22975>; else goto <D.22972>;
          <D.22975>:
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22976 = p + D.22959;
          D.22977 = sgen_ptr_in_nursery (D.22976);
          if (D.22977 == 0) goto <D.22978>; else goto <D.22972>;
          <D.22978>:
          iftmp.26 = 1;
          goto <D.22973>;
          <D.22972>:
          iftmp.26 = 0;
          <D.22973>:
          D.22979 = iftmp.26 != 0;
          D.22980 = (long int) D.22979;
          D.22981 = __builtin_expect (D.22980, 0);
          if (D.22981 != 0) goto <D.22982>; else goto <D.22983>;
          <D.22982>:
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22984 = p + D.22959;
          sgen_add_to_global_remset (D.22984, __copy);
          <D.22983>:
          goto <D.22962>;
          <D.22961>:
          D.22988 = sgen_ptr_in_nursery (__old);
          if (D.22988 != 0) goto <D.22989>; else goto <D.22986>;
          <D.22989>:
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22976 = p + D.22959;
          D.22990 = sgen_ptr_in_nursery (D.22976);
          if (D.22990 == 0) goto <D.22991>; else goto <D.22986>;
          <D.22991>:
          iftmp.27 = 1;
          goto <D.22987>;
          <D.22986>:
          iftmp.27 = 0;
          <D.22987>:
          D.22992 = iftmp.27 != 0;
          D.22993 = (long int) D.22992;
          D.22994 = __builtin_expect (D.22993, 0);
          if (D.22994 != 0) goto <D.22995>; else goto <D.22996>;
          <D.22995>:
          i.25 = (unsigned int) i;
          D.22959 = i.25 * 4;
          D.22984 = p + D.22959;
          sgen_add_to_global_remset (D.22984, __old);
          <D.22996>:
          <D.22962>:
        }
        i = i + 1;
        <D.22306>:
        if (i < num_refs) goto <D.22305>; else goto <D.22307>;
        <D.22307>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.22309>:
      if (e_start < e_end) goto <D.22308>; else goto <D.22310>;
      <D.22310>:
    }
    goto <D.22998>;
    <D.22954>:
    if (etype == 49152) goto <D.22999>; else goto <D.23000>;
    <D.22999>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 16;
      D.22915 = MEM[(struct MonoArray *)start].max_length;
      el_size.21 = (unsigned int) el_size;
      D.22917 = D.22915 * el_size.21;
      e_end = e_start + D.22917;
      goto <D.22321>;
      <D.22320>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.22318>;
        <D.22317>:
        D.23001 = _bmap & 1;
        if (D.23001 != 0) goto <D.23002>; else goto <D.23003>;
        <D.23002>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.23006>; else goto <D.23004>;
          <D.23006>:
          D.23007 = sgen_ptr_in_nursery (__old);
          if (D.23007 == 0) goto <D.23008>; else goto <D.23004>;
          <D.23008>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.23009>; else goto <D.23010>;
          <D.23009>:
          if (__old != __copy) goto <D.23011>; else goto <D.23012>;
          <D.23011>:
          gc_debug_file.9 = gc_debug_file;
          D.23013 = *p;
          fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", p, D.23013, __old);
          gc_debug_file.9 = gc_debug_file;
          fflush (gc_debug_file.9);
          <D.23012>:
          <D.23010>:
          D.23017 = sgen_ptr_in_nursery (__copy);
          if (D.23017 != 0) goto <D.23018>; else goto <D.23015>;
          <D.23018>:
          D.23019 = sgen_ptr_in_nursery (p);
          if (D.23019 == 0) goto <D.23020>; else goto <D.23015>;
          <D.23020>:
          iftmp.29 = 1;
          goto <D.23016>;
          <D.23015>:
          iftmp.29 = 0;
          <D.23016>:
          D.23021 = iftmp.29 != 0;
          D.23022 = (long int) D.23021;
          D.23023 = __builtin_expect (D.23022, 0);
          if (D.23023 != 0) goto <D.23024>; else goto <D.23025>;
          <D.23024>:
          sgen_add_to_global_remset (p, __copy);
          <D.23025>:
          goto <D.23005>;
          <D.23004>:
          D.23029 = sgen_ptr_in_nursery (__old);
          if (D.23029 != 0) goto <D.23030>; else goto <D.23027>;
          <D.23030>:
          D.23031 = sgen_ptr_in_nursery (p);
          if (D.23031 == 0) goto <D.23032>; else goto <D.23027>;
          <D.23032>:
          iftmp.30 = 1;
          goto <D.23028>;
          <D.23027>:
          iftmp.30 = 0;
          <D.23028>:
          D.23033 = iftmp.30 != 0;
          D.23034 = (long int) D.23033;
          D.23035 = __builtin_expect (D.23034, 0);
          if (D.23035 != 0) goto <D.23036>; else goto <D.23037>;
          <D.23036>:
          sgen_add_to_global_remset (p, __old);
          <D.23037>:
          <D.23005>:
        }
        <D.23003>:
        _bmap = _bmap >> 1;
        p = p + 4;
        <D.22318>:
        if (_bmap != 0) goto <D.22317>; else goto <D.22319>;
        <D.22319>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.22321>:
      if (e_start < e_end) goto <D.22320>; else goto <D.22322>;
      <D.22322>:
    }
    <D.23000>:
    <D.22998>:
    <D.22952>:
  }
  <D.22909>:
  goto <D.22274>;
  <D.22323>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 8;
    goto <D.22329>;
    <D.22328>:
    D.23038 = _bmap & 1;
    if (D.23038 != 0) goto <D.23039>; else goto <D.23040>;
    <D.23039>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.23043>; else goto <D.23041>;
      <D.23043>:
      D.23044 = sgen_ptr_in_nursery (__old);
      if (D.23044 == 0) goto <D.23045>; else goto <D.23041>;
      <D.23045>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.23046>; else goto <D.23047>;
      <D.23046>:
      if (__old != __copy) goto <D.23048>; else goto <D.23049>;
      <D.23048>:
      gc_debug_file.9 = gc_debug_file;
      D.23050 = *_objptr;
      fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23050, __old);
      gc_debug_file.9 = gc_debug_file;
      fflush (gc_debug_file.9);
      <D.23049>:
      <D.23047>:
      D.23054 = sgen_ptr_in_nursery (__copy);
      if (D.23054 != 0) goto <D.23055>; else goto <D.23052>;
      <D.23055>:
      D.23056 = sgen_ptr_in_nursery (_objptr);
      if (D.23056 == 0) goto <D.23057>; else goto <D.23052>;
      <D.23057>:
      iftmp.31 = 1;
      goto <D.23053>;
      <D.23052>:
      iftmp.31 = 0;
      <D.23053>:
      D.23058 = iftmp.31 != 0;
      D.23059 = (long int) D.23058;
      D.23060 = __builtin_expect (D.23059, 0);
      if (D.23060 != 0) goto <D.23061>; else goto <D.23062>;
      <D.23061>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.23062>:
      goto <D.23042>;
      <D.23041>:
      D.23066 = sgen_ptr_in_nursery (__old);
      if (D.23066 != 0) goto <D.23067>; else goto <D.23064>;
      <D.23067>:
      D.23068 = sgen_ptr_in_nursery (_objptr);
      if (D.23068 == 0) goto <D.23069>; else goto <D.23064>;
      <D.23069>:
      iftmp.32 = 1;
      goto <D.23065>;
      <D.23064>:
      iftmp.32 = 0;
      <D.23065>:
      D.23070 = iftmp.32 != 0;
      D.23071 = (long int) D.23070;
      D.23072 = __builtin_expect (D.23071, 0);
      if (D.23072 != 0) goto <D.23073>; else goto <D.23074>;
      <D.23073>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.23074>:
      <D.23042>:
    }
    <D.23040>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 4;
    <D.22329>:
    if (_bmap != 0) goto <D.22328>; else goto <D.22330>;
    <D.22330>:
  }
  goto <D.22274>;
  <D.22331>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.23075 = *bitmap_data;
    D.23076 = D.23075 + 4294967295;
    bwords = (int) D.23076;
    start_run = _objptr;
    bitmap_data = bitmap_data + 4;
    if (0 != 0) goto <D.23077>; else goto <D.23078>;
    <D.23077>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.23079 = myobj->vtable;
      D.23080 = D.23079->klass;
      D.23081 = D.23080->name_space;
      D.23079 = myobj->vtable;
      D.23080 = D.23079->klass;
      D.23082 = D.23080->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.23081, D.23082);
    }
    <D.23078>:
    goto <D.22344>;
    <D.22343>:
    {
      gsize _bmap;

      bitmap_data.33 = bitmap_data;
      bitmap_data = bitmap_data.33 + 4;
      _bmap = *bitmap_data.33;
      _objptr = start_run;
      goto <D.22341>;
      <D.22340>:
      D.23084 = _bmap & 1;
      if (D.23084 != 0) goto <D.23085>; else goto <D.23086>;
      <D.23085>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23089>; else goto <D.23087>;
        <D.23089>:
        D.23090 = sgen_ptr_in_nursery (__old);
        if (D.23090 == 0) goto <D.23091>; else goto <D.23087>;
        <D.23091>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23092>; else goto <D.23093>;
        <D.23092>:
        if (__old != __copy) goto <D.23094>; else goto <D.23095>;
        <D.23094>:
        gc_debug_file.9 = gc_debug_file;
        D.23096 = *_objptr;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23096, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.23095>:
        <D.23093>:
        D.23100 = sgen_ptr_in_nursery (__copy);
        if (D.23100 != 0) goto <D.23101>; else goto <D.23098>;
        <D.23101>:
        D.23102 = sgen_ptr_in_nursery (_objptr);
        if (D.23102 == 0) goto <D.23103>; else goto <D.23098>;
        <D.23103>:
        iftmp.34 = 1;
        goto <D.23099>;
        <D.23098>:
        iftmp.34 = 0;
        <D.23099>:
        D.23104 = iftmp.34 != 0;
        D.23105 = (long int) D.23104;
        D.23106 = __builtin_expect (D.23105, 0);
        if (D.23106 != 0) goto <D.23107>; else goto <D.23108>;
        <D.23107>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23108>:
        goto <D.23088>;
        <D.23087>:
        D.23112 = sgen_ptr_in_nursery (__old);
        if (D.23112 != 0) goto <D.23113>; else goto <D.23110>;
        <D.23113>:
        D.23114 = sgen_ptr_in_nursery (_objptr);
        if (D.23114 == 0) goto <D.23115>; else goto <D.23110>;
        <D.23115>:
        iftmp.35 = 1;
        goto <D.23111>;
        <D.23110>:
        iftmp.35 = 0;
        <D.23111>:
        D.23116 = iftmp.35 != 0;
        D.23117 = (long int) D.23116;
        D.23118 = __builtin_expect (D.23117, 0);
        if (D.23118 != 0) goto <D.23119>; else goto <D.23120>;
        <D.23119>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23120>:
        <D.23088>:
      }
      <D.23086>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.22341>:
      if (_bmap != 0) goto <D.22340>; else goto <D.22342>;
      <D.22342>:
      start_run = start_run + 128;
    }
    <D.22344>:
    bwords.36 = bwords;
    bwords = bwords.36 + -1;
    if (bwords.36 > 0) goto <D.22343>; else goto <D.22345>;
    <D.22345>:
  }
  goto <D.22274>;
  <D.22346>:
  goto <D.22274>;
  <D.22347>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.22274>:
}


major_copy_or_mark_object_concurrent (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int iftmp.37;
  unsigned int D.23126;
  unsigned int D.23127;
  unsigned int D.23129;
  _Bool D.23131;
  long int D.23132;
  long int D.23133;
  int D.23136;
  unsigned int D.23139;
  unsigned int D.23140;
  unsigned int obj.38;
  unsigned int D.23144;
  struct MSBlockHeader * D.23145;
  int obj.39;
  int obj.40;
  int D.23148;
  int D.23149;
  unsigned int D.23155;
  long int D.23156;
  long unsigned int D.23157;
  long unsigned int D.23158;
  long unsigned int D.23161;
  unsigned char D.23162;
  unsigned char D.23163;
  int iftmp.41;
  struct GrayQueueSection * D.23170;
  int D.23172;
  _Bool D.23173;
  long int D.23174;
  long int D.23175;
  int D.23179;
  int D.23180;
  int D.23182;
  struct MonoVTable * D.23185;
  void * D.23186;
  unsigned int D.23187;
  int D.23188;
  int iftmp.42;
  _Bool D.23196;
  long int D.23197;
  long int D.23198;
  int D.23202;
  int D.23203;

  D.23126 = MEM[(mword *)obj];
  D.23127 = D.23126 & 1;
  if (D.23127 != 0) goto <D.23128>; else goto <D.23124>;
  <D.23128>:
  D.23126 = MEM[(mword *)obj];
  D.23129 = D.23126 & 4294967292;
  if (D.23129 != 0) goto <D.23130>; else goto <D.23124>;
  <D.23130>:
  iftmp.37 = 1;
  goto <D.23125>;
  <D.23124>:
  iftmp.37 = 0;
  <D.23125>:
  D.23131 = iftmp.37 != 0;
  D.23132 = (long int) D.23131;
  D.23133 = __builtin_expect (D.23132, 0);
  if (D.23133 != 0) goto <D.23134>; else goto <D.23135>;
  <D.23134>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1280, "!SGEN_OBJECT_IS_FORWARDED (obj)");
  <D.23135>:
  D.23136 = sgen_ptr_in_nursery (obj);
  if (D.23136 == 0) goto <D.23137>; else goto <D.23138>;
  <D.23137>:
  {
    mword objsize;

    D.23139 = sgen_safe_object_get_size (obj);
    D.23140 = D.23139 + 7;
    objsize = D.23140 & 4294967288;
    if (objsize <= 8000) goto <D.23141>; else goto <D.23142>;
    <D.23141>:
    {
      struct MSBlockInfo * block;

      obj.38 = (unsigned int) obj;
      D.23144 = obj.38 & 4294950912;
      D.23145 = (struct MSBlockHeader *) D.23144;
      block = D.23145->info;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.39 = (int) obj;
          obj.40 = (int) obj;
          D.23148 = obj.40 & -16384;
          D.23149 = obj.39 - D.23148;
          i = D.23149 >> 3;
          if (1 != 0) goto <D.23150>; else goto <D.23151>;
          <D.23150>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.23152>;
          <D.23151>:
          __word = i >> 6;
          __bit = i & 63;
          <D.23152>:
        }
        if (0 != 0) goto <D.23153>; else goto <D.23154>;
        <D.23153>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.21993>:
        goto <D.21993>;
        <D.23154>:
        D.23155 = block->mark_words[__word];
        D.23156 = 1 << __bit;
        D.23157 = (long unsigned int) D.23156;
        D.23158 = D.23155 & D.23157;
        if (D.23158 == 0) goto <D.23159>; else goto <D.23160>;
        <D.23159>:
        D.23155 = block->mark_words[__word];
        D.23156 = 1 << __bit;
        D.23157 = (long unsigned int) D.23156;
        D.23161 = D.23155 | D.23157;
        block->mark_words[__word] = D.23161;
        D.23162 = BIT_FIELD_REF <*block, 8, 96>;
        D.23163 = D.23162 & 2;
        if (D.23163 != 0) goto <D.23164>; else goto <D.23165>;
        <D.23164>:
        D.23170 = queue->first;
        if (D.23170 == 0B) goto <D.23167>; else goto <D.23171>;
        <D.23171>:
        D.23170 = queue->first;
        D.23172 = D.23170->end;
        if (D.23172 == 125) goto <D.23167>; else goto <D.23168>;
        <D.23167>:
        iftmp.41 = 1;
        goto <D.23169>;
        <D.23168>:
        iftmp.41 = 0;
        <D.23169>:
        D.23173 = iftmp.41 != 0;
        D.23174 = (long int) D.23173;
        D.23175 = __builtin_expect (D.23174, 0);
        if (D.23175 != 0) goto <D.23176>; else goto <D.23177>;
        <D.23176>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.23178>;
        <D.23177>:
        D.23170 = queue->first;
        D.23170 = queue->first;
        D.23172 = D.23170->end;
        D.23179 = D.23172;
        D.23180 = D.23179 + 1;
        D.23170->end = D.23180;
        D.23170->objects[D.23179] = obj;
        <D.23178>:
        __builtin_prefetch (obj);
        <D.23165>:
        <D.23160>:
      }
    }
    goto <D.23181>;
    <D.23142>:
    D.23182 = sgen_los_object_is_pinned (obj);
    if (D.23182 != 0) goto <D.23183>; else goto <D.23184>;
    <D.23183>:
    return;
    <D.23184>:
    sgen_los_pin_object (obj);
    D.23126 = MEM[(mword *)obj];
    D.23129 = D.23126 & 4294967292;
    D.23185 = (struct MonoVTable *) D.23129;
    D.23186 = D.23185->gc_descr;
    D.23187 = (unsigned int) D.23186;
    D.23188 = sgen_gc_descr_has_references (D.23187);
    if (D.23188 != 0) goto <D.23189>; else goto <D.23190>;
    <D.23189>:
    D.23170 = queue->first;
    if (D.23170 == 0B) goto <D.23192>; else goto <D.23195>;
    <D.23195>:
    D.23170 = queue->first;
    D.23172 = D.23170->end;
    if (D.23172 == 125) goto <D.23192>; else goto <D.23193>;
    <D.23192>:
    iftmp.42 = 1;
    goto <D.23194>;
    <D.23193>:
    iftmp.42 = 0;
    <D.23194>:
    D.23196 = iftmp.42 != 0;
    D.23197 = (long int) D.23196;
    D.23198 = __builtin_expect (D.23197, 0);
    if (D.23198 != 0) goto <D.23199>; else goto <D.23200>;
    <D.23199>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.23201>;
    <D.23200>:
    D.23170 = queue->first;
    D.23170 = queue->first;
    D.23172 = D.23170->end;
    D.23202 = D.23172;
    D.23203 = D.23202 + 1;
    D.23170->end = D.23203;
    D.23170->objects[D.23202] = obj;
    <D.23201>:
    __builtin_prefetch (obj);
    <D.23190>:
    <D.23181>:
  }
  <D.23138>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.43;
  unsigned int D.23206;
  unsigned int D.23207;
  unsigned int D.23210;
  guint D.23214;
  struct MonoVTable * D.23215;
  char * forwarded;

  D.23206 = MEM[(mword *)obj];
  D.23207 = D.23206 & 1;
  if (D.23207 != 0) goto <D.23208>; else goto <D.23209>;
  <D.23208>:
  D.23206 = MEM[(mword *)obj];
  D.23210 = D.23206 & 4294967292;
  iftmp.43 = (char *) D.23210;
  goto <D.23211>;
  <D.23209>:
  iftmp.43 = 0B;
  <D.23211>:
  forwarded = iftmp.43;
  if (forwarded != 0B) goto <D.23212>; else goto <D.23213>;
  <D.23212>:
  obj = forwarded;
  <D.23213>:
  D.23206 = MEM[(mword *)obj];
  D.23210 = D.23206 & 4294967292;
  D.23215 = (struct MonoVTable *) D.23210;
  D.23214 = sgen_par_object_get_size (D.23215, obj);
  return D.23214;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.23217;
  unsigned int D.23218;
  guint D.23223;
  int D.23224;
  int D.23225;
  unsigned int D.23226;
  unsigned int D.23229;
  int D.23230;
  unsigned int D.23231;
  unsigned int element_size.44;
  unsigned int D.23233;
  unsigned int D.23234;
  struct MonoClass * D.23237;
  unsigned char D.23238;
  unsigned int D.23239;
  unsigned int D.23240;
  mword descr;
  mword type;

  D.23217 = vtable->gc_descr;
  descr = (mword) D.23217;
  type = descr & 7;
  D.23218 = type + 4294967295;
  if (D.23218 <= 1) goto <D.23219>; else goto <D.23220>;
  <D.23219>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.23221>; else goto <D.23222>;
    <D.23221>:
    D.23224 = MEM[(struct MonoString *)o].length;
    D.23225 = D.23224 * 2;
    D.23226 = (unsigned int) D.23225;
    D.23223 = D.23226 + 14;
    return D.23223;
    <D.23222>:
    D.23223 = size;
    return D.23223;
  }
  <D.23220>:
  if (type == 4) goto <D.23227>; else goto <D.23228>;
  <D.23227>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.23229 = descr >> 3;
    D.23230 = (int) D.23229;
    element_size = D.23230 & 1023;
    array = o;
    D.23231 = array->max_length;
    element_size.44 = (unsigned int) element_size;
    D.23233 = D.23231 * element_size.44;
    size = D.23233 + 16;
    D.23234 = descr & 8192;
    if (D.23234 != 0) goto <D.23235>; else goto <D.23236>;
    <D.23235>:
    size = size + 3;
    size = size & 4294967292;
    D.23237 = vtable->klass;
    D.23238 = D.23237->rank;
    D.23239 = (unsigned int) D.23238;
    D.23240 = D.23239 * 8;
    size = D.23240 + size;
    <D.23236>:
    D.23223 = size;
    return D.23223;
  }
  <D.23228>:
  D.23223 = slow_object_get_size (vtable, o);
  return D.23223;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.23242;
  guint D.23245;
  int D.23246;
  int D.23247;
  unsigned int D.23248;
  unsigned char D.23249;
  int D.23252;
  unsigned int D.23253;
  unsigned int D.23254;
  unsigned int D.23255;
  struct MonoArrayBounds * D.23256;
  _Bool D.23257;
  long int D.23258;
  long int D.23259;
  unsigned int D.23262;
  unsigned int D.23263;
  int D.23264;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.23242 = mono_defaults.string_class;
  if (D.23242 == klass) goto <D.23243>; else goto <D.23244>;
  <D.23243>:
  D.23246 = MEM[(struct MonoString *)o].length;
  D.23247 = D.23246 * 2;
  D.23248 = (unsigned int) D.23247;
  D.23245 = D.23248 + 14;
  return D.23245;
  <D.23244>:
  D.23249 = klass->rank;
  if (D.23249 != 0) goto <D.23250>; else goto <D.23251>;
  <D.23250>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.23252 = klass->sizes.element_size;
    D.23253 = (unsigned int) D.23252;
    D.23254 = array->max_length;
    D.23255 = D.23253 * D.23254;
    size = D.23255 + 16;
    D.23256 = array->bounds;
    D.23257 = D.23256 != 0B;
    D.23258 = (long int) D.23257;
    D.23259 = __builtin_expect (D.23258, 0);
    if (D.23259 != 0) goto <D.23260>; else goto <D.23261>;
    <D.23260>:
    size = size + 3;
    size = size & 4294967292;
    D.23249 = klass->rank;
    D.23262 = (unsigned int) D.23249;
    D.23263 = D.23262 * 8;
    size = D.23263 + size;
    <D.23261>:
    D.23245 = size;
    return D.23245;
  }
  <D.23251>:
  D.23264 = klass->instance_size;
  D.23245 = (guint) D.23264;
  return D.23245;
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.23266;
  gboolean D.23269;
  unsigned int D.23270;
  unsigned int D.23273;

  D.23266 = desc & 4294901767;
  if (D.23266 == 1) goto <D.23267>; else goto <D.23268>;
  <D.23267>:
  D.23269 = 0;
  return D.23269;
  <D.23268>:
  D.23270 = desc & 49159;
  if (D.23270 == 4) goto <D.23271>; else goto <D.23272>;
  <D.23271>:
  D.23269 = 0;
  return D.23269;
  <D.23272>:
  D.23273 = desc & 7;
  if (D.23273 == 7) goto <D.23274>; else goto <D.23275>;
  <D.23274>:
  D.23269 = 0;
  return D.23269;
  <D.23275>:
  D.23269 = 1;
  return D.23269;
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.23277;
  int sgen_nursery_bits.45;
  int D.23279;
  int D.23280;
  unsigned int D.23281;
  unsigned int p.46;
  unsigned int D.23283;
  char * sgen_nursery_start.47;
  unsigned int sgen_nursery_start.48;
  _Bool D.23286;

  sgen_nursery_bits.45 = sgen_nursery_bits;
  D.23279 = 1 << sgen_nursery_bits.45;
  D.23280 = -D.23279;
  D.23281 = (unsigned int) D.23280;
  p.46 = (unsigned int) p;
  D.23283 = D.23281 & p.46;
  sgen_nursery_start.47 = sgen_nursery_start;
  sgen_nursery_start.48 = (unsigned int) sgen_nursery_start.47;
  D.23286 = D.23283 == sgen_nursery_start.48;
  D.23277 = (gboolean) D.23286;
  return D.23277;
}


major_scan_object_concurrent (char * start, struct SgenGrayQueue * queue)
{
  unsigned int D.23288;
  unsigned int D.23289;
  unsigned int D.23290;
  unsigned int D.23291;
  unsigned int D.23294;
  unsigned int D.23295;
  unsigned int D.23296;
  unsigned int D.23297;
  unsigned int D.23298;
  int D.23302;
  struct FILE * gc_debug_file.49;
  void * D.23309;
  int iftmp.50;
  int D.23313;
  int D.23315;
  _Bool D.23317;
  long int D.23318;
  long int D.23319;
  int iftmp.51;
  int D.23325;
  int D.23327;
  _Bool D.23329;
  long int D.23330;
  long int D.23331;
  int D.23337;
  int iftmp.52;
  int D.23346;
  int D.23348;
  _Bool D.23350;
  long int D.23351;
  long int D.23352;
  int iftmp.53;
  int D.23358;
  int D.23360;
  _Bool D.23362;
  long int D.23363;
  long int D.23364;
  unsigned int _index.54;
  unsigned int D.23368;
  int D.23369;
  int D.23373;
  void * D.23379;
  int iftmp.55;
  int D.23383;
  int D.23385;
  _Bool D.23387;
  long int D.23388;
  long int D.23389;
  int iftmp.56;
  int D.23395;
  int D.23397;
  _Bool D.23399;
  long int D.23400;
  long int D.23401;
  unsigned int _index.57;
  unsigned int D.23405;
  int D.23406;
  int D.23410;
  int iftmp.58;
  int D.23419;
  int D.23421;
  _Bool D.23423;
  long int D.23424;
  long int D.23425;
  int iftmp.59;
  int D.23431;
  int D.23433;
  _Bool D.23435;
  long int D.23436;
  long int D.23437;
  unsigned int D.23440;
  unsigned int D.23443;
  int D.23444;
  int desc.60;
  unsigned int D.23448;
  unsigned int el_size.61;
  unsigned int D.23450;
  int D.23454;
  void * D.23460;
  int iftmp.62;
  int D.23464;
  int D.23466;
  _Bool D.23468;
  long int D.23469;
  long int D.23470;
  int iftmp.63;
  int D.23476;
  int D.23478;
  _Bool D.23480;
  long int D.23481;
  long int D.23482;
  int D.23488;
  unsigned int offset.64;
  unsigned int D.23490;
  unsigned int i.65;
  unsigned int D.23492;
  void * * D.23493;
  int D.23497;
  void * D.23503;
  int iftmp.66;
  int D.23507;
  void * D.23509;
  int D.23510;
  _Bool D.23512;
  long int D.23513;
  long int D.23514;
  void * D.23517;
  int iftmp.67;
  int D.23521;
  int D.23523;
  _Bool D.23525;
  long int D.23526;
  long int D.23527;
  sizetype el_size.68;
  unsigned int D.23534;
  int D.23540;
  void * D.23546;
  int iftmp.69;
  int D.23550;
  int D.23552;
  _Bool D.23554;
  long int D.23555;
  long int D.23556;
  int iftmp.70;
  int D.23562;
  int D.23564;
  _Bool D.23566;
  long int D.23567;
  long int D.23568;
  unsigned int D.23571;
  int D.23577;
  void * D.23583;
  int iftmp.71;
  int D.23587;
  int D.23589;
  _Bool D.23591;
  long int D.23592;
  long int D.23593;
  int iftmp.72;
  int D.23599;
  int D.23601;
  _Bool D.23603;
  long int D.23604;
  long int D.23605;
  unsigned int D.23608;
  unsigned int D.23609;
  struct MonoVTable * D.23612;
  struct MonoClass * D.23613;
  const char * D.23614;
  const char * D.23615;
  gsize * bitmap_data.73;
  unsigned int D.23617;
  int D.23623;
  void * D.23629;
  int iftmp.74;
  int D.23633;
  int D.23635;
  _Bool D.23637;
  long int D.23638;
  long int D.23639;
  int iftmp.75;
  int D.23645;
  int D.23647;
  _Bool D.23649;
  long int D.23650;
  long int D.23651;
  int bwords.76;
  unsigned int D.23655;
  gsize * mbitmap_data.77;
  unsigned int D.23657;
  unsigned int D.23658;
  struct MonoClass * D.23659;
  unsigned int el_size.78;
  unsigned int D.23661;
  const char * D.23664;
  const char * D.23665;
  gsize * bitmap_data.79;
  unsigned int D.23667;
  int D.23673;
  void * D.23679;
  int iftmp.80;
  int D.23683;
  int D.23685;
  _Bool D.23687;
  long int D.23688;
  long int D.23689;
  int iftmp.81;
  int D.23695;
  int D.23697;
  _Bool D.23699;
  long int D.23700;
  long int D.23701;
  unsigned int bwords.82;
  sizetype el_size.83;

  {
    struct GCVTable * vt;
    mword desc;

    D.23288 = MEM[(mword *)start];
    D.23289 = D.23288 & 4294967292;
    vt = (struct GCVTable *) D.23289;
    desc = vt->desc;
    D.23290 = desc & 7;
    switch (D.23290) <default: <D.22258>, case 1: <D.22153>, case 2: <D.22164>, case 3: <D.22220>, case 4: <D.22176>, case 5: <D.22212>, case 6: <D.22235>, case 7: <D.22257>>
    <D.22153>:
    D.23291 = desc & 4294901760;
    if (D.23291 != 0) goto <D.23292>; else goto <D.23293>;
    <D.23292>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.23294 = desc >> 16;
      D.23295 = D.23294 & 255;
      D.23296 = D.23295 * 4;
      _objptr = _objptr + D.23296;
      D.23297 = desc >> 24;
      D.23298 = D.23297 * 4;
      _objptr_end = _objptr + D.23298;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23301>; else goto <D.23299>;
        <D.23301>:
        D.23302 = sgen_ptr_in_nursery (__old);
        if (D.23302 == 0) goto <D.23303>; else goto <D.23299>;
        <D.23303>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23304>; else goto <D.23305>;
        <D.23304>:
        if (__old != __copy) goto <D.23306>; else goto <D.23307>;
        <D.23306>:
        gc_debug_file.49 = gc_debug_file;
        D.23309 = *_objptr;
        fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23309, __old);
        gc_debug_file.49 = gc_debug_file;
        fflush (gc_debug_file.49);
        <D.23307>:
        <D.23305>:
        D.23313 = sgen_ptr_in_nursery (__copy);
        if (D.23313 != 0) goto <D.23314>; else goto <D.23311>;
        <D.23314>:
        D.23315 = sgen_ptr_in_nursery (_objptr);
        if (D.23315 == 0) goto <D.23316>; else goto <D.23311>;
        <D.23316>:
        iftmp.50 = 1;
        goto <D.23312>;
        <D.23311>:
        iftmp.50 = 0;
        <D.23312>:
        D.23317 = iftmp.50 != 0;
        D.23318 = (long int) D.23317;
        D.23319 = __builtin_expect (D.23318, 0);
        if (D.23319 != 0) goto <D.23320>; else goto <D.23321>;
        <D.23320>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23321>:
        goto <D.23300>;
        <D.23299>:
        D.23325 = sgen_ptr_in_nursery (__old);
        if (D.23325 != 0) goto <D.23326>; else goto <D.23323>;
        <D.23326>:
        D.23327 = sgen_ptr_in_nursery (_objptr);
        if (D.23327 == 0) goto <D.23328>; else goto <D.23323>;
        <D.23328>:
        iftmp.51 = 1;
        goto <D.23324>;
        <D.23323>:
        iftmp.51 = 0;
        <D.23324>:
        D.23329 = iftmp.51 != 0;
        D.23330 = (long int) D.23329;
        D.23331 = __builtin_expect (D.23330, 0);
        if (D.23331 != 0) goto <D.23332>; else goto <D.23333>;
        <D.23332>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23333>:
        <D.23300>:
      }
      _objptr = _objptr + 4;
      goto <D.22161>;
      <D.22160>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23336>; else goto <D.23334>;
        <D.23336>:
        D.23337 = sgen_ptr_in_nursery (__old);
        if (D.23337 == 0) goto <D.23338>; else goto <D.23334>;
        <D.23338>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23339>; else goto <D.23340>;
        <D.23339>:
        if (__old != __copy) goto <D.23341>; else goto <D.23342>;
        <D.23341>:
        gc_debug_file.49 = gc_debug_file;
        D.23309 = *_objptr;
        fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23309, __old);
        gc_debug_file.49 = gc_debug_file;
        fflush (gc_debug_file.49);
        <D.23342>:
        <D.23340>:
        D.23346 = sgen_ptr_in_nursery (__copy);
        if (D.23346 != 0) goto <D.23347>; else goto <D.23344>;
        <D.23347>:
        D.23348 = sgen_ptr_in_nursery (_objptr);
        if (D.23348 == 0) goto <D.23349>; else goto <D.23344>;
        <D.23349>:
        iftmp.52 = 1;
        goto <D.23345>;
        <D.23344>:
        iftmp.52 = 0;
        <D.23345>:
        D.23350 = iftmp.52 != 0;
        D.23351 = (long int) D.23350;
        D.23352 = __builtin_expect (D.23351, 0);
        if (D.23352 != 0) goto <D.23353>; else goto <D.23354>;
        <D.23353>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23354>:
        goto <D.23335>;
        <D.23334>:
        D.23358 = sgen_ptr_in_nursery (__old);
        if (D.23358 != 0) goto <D.23359>; else goto <D.23356>;
        <D.23359>:
        D.23360 = sgen_ptr_in_nursery (_objptr);
        if (D.23360 == 0) goto <D.23361>; else goto <D.23356>;
        <D.23361>:
        iftmp.53 = 1;
        goto <D.23357>;
        <D.23356>:
        iftmp.53 = 0;
        <D.23357>:
        D.23362 = iftmp.53 != 0;
        D.23363 = (long int) D.23362;
        D.23364 = __builtin_expect (D.23363, 0);
        if (D.23364 != 0) goto <D.23365>; else goto <D.23366>;
        <D.23365>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23366>:
        <D.23335>:
      }
      _objptr = _objptr + 4;
      <D.22161>:
      if (_objptr < _objptr_end) goto <D.22160>; else goto <D.22162>;
      <D.22162>:
    }
    <D.23293>:
    goto <D.22163>;
    <D.22164>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.54 = (unsigned int) _index;
        D.23368 = _index.54 * 4;
        _objptr = _objptr + D.23368;
        D.23369 = _index + 1;
        _bmap = _bmap >> D.23369;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.23372>; else goto <D.23370>;
          <D.23372>:
          D.23373 = sgen_ptr_in_nursery (__old);
          if (D.23373 == 0) goto <D.23374>; else goto <D.23370>;
          <D.23374>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.23375>; else goto <D.23376>;
          <D.23375>:
          if (__old != __copy) goto <D.23377>; else goto <D.23378>;
          <D.23377>:
          gc_debug_file.49 = gc_debug_file;
          D.23379 = *_objptr;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23379, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.23378>:
          <D.23376>:
          D.23383 = sgen_ptr_in_nursery (__copy);
          if (D.23383 != 0) goto <D.23384>; else goto <D.23381>;
          <D.23384>:
          D.23385 = sgen_ptr_in_nursery (_objptr);
          if (D.23385 == 0) goto <D.23386>; else goto <D.23381>;
          <D.23386>:
          iftmp.55 = 1;
          goto <D.23382>;
          <D.23381>:
          iftmp.55 = 0;
          <D.23382>:
          D.23387 = iftmp.55 != 0;
          D.23388 = (long int) D.23387;
          D.23389 = __builtin_expect (D.23388, 0);
          if (D.23389 != 0) goto <D.23390>; else goto <D.23391>;
          <D.23390>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.23391>:
          goto <D.23371>;
          <D.23370>:
          D.23395 = sgen_ptr_in_nursery (__old);
          if (D.23395 != 0) goto <D.23396>; else goto <D.23393>;
          <D.23396>:
          D.23397 = sgen_ptr_in_nursery (_objptr);
          if (D.23397 == 0) goto <D.23398>; else goto <D.23393>;
          <D.23398>:
          iftmp.56 = 1;
          goto <D.23394>;
          <D.23393>:
          iftmp.56 = 0;
          <D.23394>:
          D.23399 = iftmp.56 != 0;
          D.23400 = (long int) D.23399;
          D.23401 = __builtin_expect (D.23400, 0);
          if (D.23401 != 0) goto <D.23402>; else goto <D.23403>;
          <D.23402>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.23403>:
          <D.23371>:
        }
        _objptr = _objptr + 4;
      }
      goto <D.22174>;
      <D.22173>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.57 = (unsigned int) _index;
        D.23405 = _index.57 * 4;
        _objptr = _objptr + D.23405;
        D.23406 = _index + 1;
        _bmap = _bmap >> D.23406;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.23409>; else goto <D.23407>;
          <D.23409>:
          D.23410 = sgen_ptr_in_nursery (__old);
          if (D.23410 == 0) goto <D.23411>; else goto <D.23407>;
          <D.23411>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.23412>; else goto <D.23413>;
          <D.23412>:
          if (__old != __copy) goto <D.23414>; else goto <D.23415>;
          <D.23414>:
          gc_debug_file.49 = gc_debug_file;
          D.23379 = *_objptr;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23379, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.23415>:
          <D.23413>:
          D.23419 = sgen_ptr_in_nursery (__copy);
          if (D.23419 != 0) goto <D.23420>; else goto <D.23417>;
          <D.23420>:
          D.23421 = sgen_ptr_in_nursery (_objptr);
          if (D.23421 == 0) goto <D.23422>; else goto <D.23417>;
          <D.23422>:
          iftmp.58 = 1;
          goto <D.23418>;
          <D.23417>:
          iftmp.58 = 0;
          <D.23418>:
          D.23423 = iftmp.58 != 0;
          D.23424 = (long int) D.23423;
          D.23425 = __builtin_expect (D.23424, 0);
          if (D.23425 != 0) goto <D.23426>; else goto <D.23427>;
          <D.23426>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.23427>:
          goto <D.23408>;
          <D.23407>:
          D.23431 = sgen_ptr_in_nursery (__old);
          if (D.23431 != 0) goto <D.23432>; else goto <D.23429>;
          <D.23432>:
          D.23433 = sgen_ptr_in_nursery (_objptr);
          if (D.23433 == 0) goto <D.23434>; else goto <D.23429>;
          <D.23434>:
          iftmp.59 = 1;
          goto <D.23430>;
          <D.23429>:
          iftmp.59 = 0;
          <D.23430>:
          D.23435 = iftmp.59 != 0;
          D.23436 = (long int) D.23435;
          D.23437 = __builtin_expect (D.23436, 0);
          if (D.23437 != 0) goto <D.23438>; else goto <D.23439>;
          <D.23438>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.23439>:
          <D.23408>:
        }
        _objptr = _objptr + 4;
      }
      <D.22174>:
      if (_bmap != 0) goto <D.22173>; else goto <D.22175>;
      <D.22175>:
    }
    goto <D.22163>;
    <D.22176>:
    D.23440 = desc & 4294950912;
    if (D.23440 != 0) goto <D.23441>; else goto <D.23442>;
    <D.23441>:
    {
      int el_size;
      int etype;

      D.23443 = desc >> 3;
      D.23444 = (int) D.23443;
      el_size = D.23444 & 1023;
      desc.60 = (int) desc;
      etype = desc.60 & 49152;
      if (etype == 16384) goto <D.23446>; else goto <D.23447>;
      <D.23446>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.23448 = MEM[(struct MonoArray *)start].max_length;
        el_size.61 = (unsigned int) el_size;
        D.23450 = D.23448 * el_size.61;
        end_refs = p + D.23450;
        goto <D.22184>;
        <D.22183>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.23453>; else goto <D.23451>;
          <D.23453>:
          D.23454 = sgen_ptr_in_nursery (__old);
          if (D.23454 == 0) goto <D.23455>; else goto <D.23451>;
          <D.23455>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.23456>; else goto <D.23457>;
          <D.23456>:
          if (__old != __copy) goto <D.23458>; else goto <D.23459>;
          <D.23458>:
          gc_debug_file.49 = gc_debug_file;
          D.23460 = *p;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", p, D.23460, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.23459>:
          <D.23457>:
          D.23464 = sgen_ptr_in_nursery (__copy);
          if (D.23464 != 0) goto <D.23465>; else goto <D.23462>;
          <D.23465>:
          D.23466 = sgen_ptr_in_nursery (p);
          if (D.23466 == 0) goto <D.23467>; else goto <D.23462>;
          <D.23467>:
          iftmp.62 = 1;
          goto <D.23463>;
          <D.23462>:
          iftmp.62 = 0;
          <D.23463>:
          D.23468 = iftmp.62 != 0;
          D.23469 = (long int) D.23468;
          D.23470 = __builtin_expect (D.23469, 0);
          if (D.23470 != 0) goto <D.23471>; else goto <D.23472>;
          <D.23471>:
          sgen_add_to_global_remset (p, __copy);
          <D.23472>:
          goto <D.23452>;
          <D.23451>:
          D.23476 = sgen_ptr_in_nursery (__old);
          if (D.23476 != 0) goto <D.23477>; else goto <D.23474>;
          <D.23477>:
          D.23478 = sgen_ptr_in_nursery (p);
          if (D.23478 == 0) goto <D.23479>; else goto <D.23474>;
          <D.23479>:
          iftmp.63 = 1;
          goto <D.23475>;
          <D.23474>:
          iftmp.63 = 0;
          <D.23475>:
          D.23480 = iftmp.63 != 0;
          D.23481 = (long int) D.23480;
          D.23482 = __builtin_expect (D.23481, 0);
          if (D.23482 != 0) goto <D.23483>; else goto <D.23484>;
          <D.23483>:
          sgen_add_to_global_remset (p, __old);
          <D.23484>:
          <D.23452>:
        }
        p = p + 4;
        <D.22184>:
        if (p < end_refs) goto <D.22183>; else goto <D.22185>;
        <D.22185>:
      }
      goto <D.23485>;
      <D.23447>:
      if (etype == 32768) goto <D.23486>; else goto <D.23487>;
      <D.23486>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.23294 = desc >> 16;
        D.23488 = (int) D.23294;
        offset = D.23488 & 255;
        D.23297 = desc >> 24;
        num_refs = (int) D.23297;
        e_start = start + 16;
        D.23448 = MEM[(struct MonoArray *)start].max_length;
        el_size.61 = (unsigned int) el_size;
        D.23450 = D.23448 * el_size.61;
        e_end = e_start + D.23450;
        goto <D.22198>;
        <D.22197>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.64 = (unsigned int) offset;
          D.23490 = offset.64 * 4;
          p = p + D.23490;
          i = 0;
          goto <D.22195>;
          <D.22194>:
          {
            void * __old;
            void * __copy;

            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23493 = p + D.23492;
            __old = *D.23493;
            if (__old != 0B) goto <D.23496>; else goto <D.23494>;
            <D.23496>:
            D.23497 = sgen_ptr_in_nursery (__old);
            if (D.23497 == 0) goto <D.23498>; else goto <D.23494>;
            <D.23498>:
            __builtin_prefetch (__old);
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23493 = p + D.23492;
            major_copy_or_mark_object_concurrent (D.23493, __old, queue);
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23493 = p + D.23492;
            __copy = *D.23493;
            if (0 != 0) goto <D.23499>; else goto <D.23500>;
            <D.23499>:
            if (__old != __copy) goto <D.23501>; else goto <D.23502>;
            <D.23501>:
            gc_debug_file.49 = gc_debug_file;
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23493 = p + D.23492;
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23493 = p + D.23492;
            D.23503 = *D.23493;
            fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", D.23493, D.23503, __old);
            gc_debug_file.49 = gc_debug_file;
            fflush (gc_debug_file.49);
            <D.23502>:
            <D.23500>:
            D.23507 = sgen_ptr_in_nursery (__copy);
            if (D.23507 != 0) goto <D.23508>; else goto <D.23505>;
            <D.23508>:
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23509 = p + D.23492;
            D.23510 = sgen_ptr_in_nursery (D.23509);
            if (D.23510 == 0) goto <D.23511>; else goto <D.23505>;
            <D.23511>:
            iftmp.66 = 1;
            goto <D.23506>;
            <D.23505>:
            iftmp.66 = 0;
            <D.23506>:
            D.23512 = iftmp.66 != 0;
            D.23513 = (long int) D.23512;
            D.23514 = __builtin_expect (D.23513, 0);
            if (D.23514 != 0) goto <D.23515>; else goto <D.23516>;
            <D.23515>:
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23517 = p + D.23492;
            sgen_add_to_global_remset (D.23517, __copy);
            <D.23516>:
            goto <D.23495>;
            <D.23494>:
            D.23521 = sgen_ptr_in_nursery (__old);
            if (D.23521 != 0) goto <D.23522>; else goto <D.23519>;
            <D.23522>:
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23509 = p + D.23492;
            D.23523 = sgen_ptr_in_nursery (D.23509);
            if (D.23523 == 0) goto <D.23524>; else goto <D.23519>;
            <D.23524>:
            iftmp.67 = 1;
            goto <D.23520>;
            <D.23519>:
            iftmp.67 = 0;
            <D.23520>:
            D.23525 = iftmp.67 != 0;
            D.23526 = (long int) D.23525;
            D.23527 = __builtin_expect (D.23526, 0);
            if (D.23527 != 0) goto <D.23528>; else goto <D.23529>;
            <D.23528>:
            i.65 = (unsigned int) i;
            D.23492 = i.65 * 4;
            D.23517 = p + D.23492;
            sgen_add_to_global_remset (D.23517, __old);
            <D.23529>:
            <D.23495>:
          }
          i = i + 1;
          <D.22195>:
          if (i < num_refs) goto <D.22194>; else goto <D.22196>;
          <D.22196>:
          el_size.68 = (sizetype) el_size;
          e_start = e_start + el_size.68;
        }
        <D.22198>:
        if (e_start < e_end) goto <D.22197>; else goto <D.22199>;
        <D.22199>:
      }
      goto <D.23531>;
      <D.23487>:
      if (etype == 49152) goto <D.23532>; else goto <D.23533>;
      <D.23532>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.23448 = MEM[(struct MonoArray *)start].max_length;
        el_size.61 = (unsigned int) el_size;
        D.23450 = D.23448 * el_size.61;
        e_end = e_start + D.23450;
        goto <D.22210>;
        <D.22209>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.22207>;
          <D.22206>:
          D.23534 = _bmap & 1;
          if (D.23534 != 0) goto <D.23535>; else goto <D.23536>;
          <D.23535>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.23539>; else goto <D.23537>;
            <D.23539>:
            D.23540 = sgen_ptr_in_nursery (__old);
            if (D.23540 == 0) goto <D.23541>; else goto <D.23537>;
            <D.23541>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.23542>; else goto <D.23543>;
            <D.23542>:
            if (__old != __copy) goto <D.23544>; else goto <D.23545>;
            <D.23544>:
            gc_debug_file.49 = gc_debug_file;
            D.23546 = *p;
            fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", p, D.23546, __old);
            gc_debug_file.49 = gc_debug_file;
            fflush (gc_debug_file.49);
            <D.23545>:
            <D.23543>:
            D.23550 = sgen_ptr_in_nursery (__copy);
            if (D.23550 != 0) goto <D.23551>; else goto <D.23548>;
            <D.23551>:
            D.23552 = sgen_ptr_in_nursery (p);
            if (D.23552 == 0) goto <D.23553>; else goto <D.23548>;
            <D.23553>:
            iftmp.69 = 1;
            goto <D.23549>;
            <D.23548>:
            iftmp.69 = 0;
            <D.23549>:
            D.23554 = iftmp.69 != 0;
            D.23555 = (long int) D.23554;
            D.23556 = __builtin_expect (D.23555, 0);
            if (D.23556 != 0) goto <D.23557>; else goto <D.23558>;
            <D.23557>:
            sgen_add_to_global_remset (p, __copy);
            <D.23558>:
            goto <D.23538>;
            <D.23537>:
            D.23562 = sgen_ptr_in_nursery (__old);
            if (D.23562 != 0) goto <D.23563>; else goto <D.23560>;
            <D.23563>:
            D.23564 = sgen_ptr_in_nursery (p);
            if (D.23564 == 0) goto <D.23565>; else goto <D.23560>;
            <D.23565>:
            iftmp.70 = 1;
            goto <D.23561>;
            <D.23560>:
            iftmp.70 = 0;
            <D.23561>:
            D.23566 = iftmp.70 != 0;
            D.23567 = (long int) D.23566;
            D.23568 = __builtin_expect (D.23567, 0);
            if (D.23568 != 0) goto <D.23569>; else goto <D.23570>;
            <D.23569>:
            sgen_add_to_global_remset (p, __old);
            <D.23570>:
            <D.23538>:
          }
          <D.23536>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.22207>:
          if (_bmap != 0) goto <D.22206>; else goto <D.22208>;
          <D.22208>:
          el_size.68 = (sizetype) el_size;
          e_start = e_start + el_size.68;
        }
        <D.22210>:
        if (e_start < e_end) goto <D.22209>; else goto <D.22211>;
        <D.22211>:
      }
      <D.23533>:
      <D.23531>:
      <D.23485>:
    }
    <D.23442>:
    goto <D.22163>;
    <D.22212>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.22218>;
      <D.22217>:
      D.23571 = _bmap & 1;
      if (D.23571 != 0) goto <D.23572>; else goto <D.23573>;
      <D.23572>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23576>; else goto <D.23574>;
        <D.23576>:
        D.23577 = sgen_ptr_in_nursery (__old);
        if (D.23577 == 0) goto <D.23578>; else goto <D.23574>;
        <D.23578>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23579>; else goto <D.23580>;
        <D.23579>:
        if (__old != __copy) goto <D.23581>; else goto <D.23582>;
        <D.23581>:
        gc_debug_file.49 = gc_debug_file;
        D.23583 = *_objptr;
        fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23583, __old);
        gc_debug_file.49 = gc_debug_file;
        fflush (gc_debug_file.49);
        <D.23582>:
        <D.23580>:
        D.23587 = sgen_ptr_in_nursery (__copy);
        if (D.23587 != 0) goto <D.23588>; else goto <D.23585>;
        <D.23588>:
        D.23589 = sgen_ptr_in_nursery (_objptr);
        if (D.23589 == 0) goto <D.23590>; else goto <D.23585>;
        <D.23590>:
        iftmp.71 = 1;
        goto <D.23586>;
        <D.23585>:
        iftmp.71 = 0;
        <D.23586>:
        D.23591 = iftmp.71 != 0;
        D.23592 = (long int) D.23591;
        D.23593 = __builtin_expect (D.23592, 0);
        if (D.23593 != 0) goto <D.23594>; else goto <D.23595>;
        <D.23594>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23595>:
        goto <D.23575>;
        <D.23574>:
        D.23599 = sgen_ptr_in_nursery (__old);
        if (D.23599 != 0) goto <D.23600>; else goto <D.23597>;
        <D.23600>:
        D.23601 = sgen_ptr_in_nursery (_objptr);
        if (D.23601 == 0) goto <D.23602>; else goto <D.23597>;
        <D.23602>:
        iftmp.72 = 1;
        goto <D.23598>;
        <D.23597>:
        iftmp.72 = 0;
        <D.23598>:
        D.23603 = iftmp.72 != 0;
        D.23604 = (long int) D.23603;
        D.23605 = __builtin_expect (D.23604, 0);
        if (D.23605 != 0) goto <D.23606>; else goto <D.23607>;
        <D.23606>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23607>:
        <D.23575>:
      }
      <D.23573>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.22218>:
      if (_bmap != 0) goto <D.22217>; else goto <D.22219>;
      <D.22219>:
    }
    goto <D.22163>;
    <D.22220>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.23608 = *bitmap_data;
      D.23609 = D.23608 + 4294967295;
      bwords = (int) D.23609;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.23610>; else goto <D.23611>;
      <D.23610>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.23612 = myobj->vtable;
        D.23613 = D.23612->klass;
        D.23614 = D.23613->name_space;
        D.23612 = myobj->vtable;
        D.23613 = D.23612->klass;
        D.23615 = D.23613->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.23614, D.23615);
      }
      <D.23611>:
      goto <D.22233>;
      <D.22232>:
      {
        gsize _bmap;

        bitmap_data.73 = bitmap_data;
        bitmap_data = bitmap_data.73 + 4;
        _bmap = *bitmap_data.73;
        _objptr = start_run;
        goto <D.22230>;
        <D.22229>:
        D.23617 = _bmap & 1;
        if (D.23617 != 0) goto <D.23618>; else goto <D.23619>;
        <D.23618>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.23622>; else goto <D.23620>;
          <D.23622>:
          D.23623 = sgen_ptr_in_nursery (__old);
          if (D.23623 == 0) goto <D.23624>; else goto <D.23620>;
          <D.23624>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.23625>; else goto <D.23626>;
          <D.23625>:
          if (__old != __copy) goto <D.23627>; else goto <D.23628>;
          <D.23627>:
          gc_debug_file.49 = gc_debug_file;
          D.23629 = *_objptr;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23629, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.23628>:
          <D.23626>:
          D.23633 = sgen_ptr_in_nursery (__copy);
          if (D.23633 != 0) goto <D.23634>; else goto <D.23631>;
          <D.23634>:
          D.23635 = sgen_ptr_in_nursery (_objptr);
          if (D.23635 == 0) goto <D.23636>; else goto <D.23631>;
          <D.23636>:
          iftmp.74 = 1;
          goto <D.23632>;
          <D.23631>:
          iftmp.74 = 0;
          <D.23632>:
          D.23637 = iftmp.74 != 0;
          D.23638 = (long int) D.23637;
          D.23639 = __builtin_expect (D.23638, 0);
          if (D.23639 != 0) goto <D.23640>; else goto <D.23641>;
          <D.23640>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.23641>:
          goto <D.23621>;
          <D.23620>:
          D.23645 = sgen_ptr_in_nursery (__old);
          if (D.23645 != 0) goto <D.23646>; else goto <D.23643>;
          <D.23646>:
          D.23647 = sgen_ptr_in_nursery (_objptr);
          if (D.23647 == 0) goto <D.23648>; else goto <D.23643>;
          <D.23648>:
          iftmp.75 = 1;
          goto <D.23644>;
          <D.23643>:
          iftmp.75 = 0;
          <D.23644>:
          D.23649 = iftmp.75 != 0;
          D.23650 = (long int) D.23649;
          D.23651 = __builtin_expect (D.23650, 0);
          if (D.23651 != 0) goto <D.23652>; else goto <D.23653>;
          <D.23652>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.23653>:
          <D.23621>:
        }
        <D.23619>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.22230>:
        if (_bmap != 0) goto <D.22229>; else goto <D.22231>;
        <D.22231>:
        start_run = start_run + 128;
      }
      <D.22233>:
      bwords.76 = bwords;
      bwords = bwords.76 + -1;
      if (bwords.76 > 0) goto <D.22232>; else goto <D.22234>;
      <D.22234>:
    }
    goto <D.22163>;
    <D.22235>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.23655 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.23655);
      mbitmap_data.77 = mbitmap_data;
      mbitmap_data = mbitmap_data.77 + 4;
      D.23657 = *mbitmap_data.77;
      D.23658 = D.23657 + 4294967295;
      mbwords = (int) D.23658;
      D.23659 = vt->klass;
      el_size = mono_array_element_size (D.23659);
      e_start = start + 16;
      D.23448 = MEM[(struct MonoArray *)start].max_length;
      el_size.78 = (unsigned int) el_size;
      D.23661 = D.23448 * el_size.78;
      e_end = e_start + D.23661;
      if (0 != 0) goto <D.23662>; else goto <D.23663>;
      <D.23662>:
      D.23655 = vt->desc;
      D.23659 = vt->klass;
      D.23664 = D.23659->name_space;
      D.23659 = vt->klass;
      D.23665 = D.23659->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.23655, D.23664, D.23665);
      <D.23663>:
      goto <D.22255>;
      <D.22254>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.79 = bitmap_data;
          bitmap_data = bitmap_data.79 + 4;
          _bmap = *bitmap_data.79;
          start_run = _objptr;
          goto <D.22249>;
          <D.22248>:
          D.23667 = _bmap & 1;
          if (D.23667 != 0) goto <D.23668>; else goto <D.23669>;
          <D.23668>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.23672>; else goto <D.23670>;
            <D.23672>:
            D.23673 = sgen_ptr_in_nursery (__old);
            if (D.23673 == 0) goto <D.23674>; else goto <D.23670>;
            <D.23674>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.23675>; else goto <D.23676>;
            <D.23675>:
            if (__old != __copy) goto <D.23677>; else goto <D.23678>;
            <D.23677>:
            gc_debug_file.49 = gc_debug_file;
            D.23679 = *_objptr;
            fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23679, __old);
            gc_debug_file.49 = gc_debug_file;
            fflush (gc_debug_file.49);
            <D.23678>:
            <D.23676>:
            D.23683 = sgen_ptr_in_nursery (__copy);
            if (D.23683 != 0) goto <D.23684>; else goto <D.23681>;
            <D.23684>:
            D.23685 = sgen_ptr_in_nursery (_objptr);
            if (D.23685 == 0) goto <D.23686>; else goto <D.23681>;
            <D.23686>:
            iftmp.80 = 1;
            goto <D.23682>;
            <D.23681>:
            iftmp.80 = 0;
            <D.23682>:
            D.23687 = iftmp.80 != 0;
            D.23688 = (long int) D.23687;
            D.23689 = __builtin_expect (D.23688, 0);
            if (D.23689 != 0) goto <D.23690>; else goto <D.23691>;
            <D.23690>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.23691>:
            goto <D.23671>;
            <D.23670>:
            D.23695 = sgen_ptr_in_nursery (__old);
            if (D.23695 != 0) goto <D.23696>; else goto <D.23693>;
            <D.23696>:
            D.23697 = sgen_ptr_in_nursery (_objptr);
            if (D.23697 == 0) goto <D.23698>; else goto <D.23693>;
            <D.23698>:
            iftmp.81 = 1;
            goto <D.23694>;
            <D.23693>:
            iftmp.81 = 0;
            <D.23694>:
            D.23699 = iftmp.81 != 0;
            D.23700 = (long int) D.23699;
            D.23701 = __builtin_expect (D.23700, 0);
            if (D.23701 != 0) goto <D.23702>; else goto <D.23703>;
            <D.23702>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.23703>:
            <D.23671>:
          }
          <D.23669>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.22249>:
          if (_bmap != 0) goto <D.22248>; else goto <D.22250>;
          <D.22250>:
          _objptr = start_run + 128;
        }
        <D.22252>:
        bwords.82 = bwords;
        bwords = bwords.82 + 4294967295;
        if (bwords.82 != 0) goto <D.22251>; else goto <D.22253>;
        <D.22253>:
        el_size.83 = (sizetype) el_size;
        e_start = e_start + el_size.83;
      }
      <D.22255>:
      if (e_start < e_end) goto <D.22254>; else goto <D.22256>;
      <D.22256>:
    }
    goto <D.22163>;
    <D.22257>:
    goto <D.22163>;
    <D.22258>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.22163>:
  }
}


major_copy_or_mark_object_concurrent_canonical (void * * ptr, struct SgenGrayQueue * queue)
{
  void * D.23707;

  D.23707 = *ptr;
  major_copy_or_mark_object_concurrent (ptr, D.23707, queue);
}


major_scan_object (char * start, struct SgenGrayQueue * queue)
{
  unsigned int D.23708;
  unsigned int D.23709;
  unsigned int D.23710;
  unsigned int D.23711;
  unsigned int D.23714;
  unsigned int D.23715;
  unsigned int D.23716;
  unsigned int D.23717;
  unsigned int D.23718;
  struct FILE * gc_debug_file.84;
  void * D.23726;
  int iftmp.85;
  int D.23730;
  int D.23732;
  _Bool D.23734;
  long int D.23735;
  long int D.23736;
  int iftmp.86;
  int D.23751;
  int D.23753;
  _Bool D.23755;
  long int D.23756;
  long int D.23757;
  unsigned int _index.87;
  unsigned int D.23764;
  int D.23765;
  void * D.23772;
  int iftmp.88;
  int D.23776;
  int D.23778;
  _Bool D.23780;
  long int D.23781;
  long int D.23782;
  unsigned int _index.89;
  unsigned int D.23789;
  int D.23790;
  int iftmp.90;
  int D.23800;
  int D.23802;
  _Bool D.23804;
  long int D.23805;
  long int D.23806;
  unsigned int D.23812;
  unsigned int D.23815;
  int D.23816;
  int desc.91;
  unsigned int D.23820;
  unsigned int el_size.92;
  unsigned int D.23822;
  void * D.23829;
  int iftmp.93;
  int D.23833;
  int D.23835;
  _Bool D.23837;
  long int D.23838;
  long int D.23839;
  int D.23848;
  unsigned int offset.94;
  unsigned int D.23850;
  unsigned int i.95;
  unsigned int D.23852;
  void * * D.23853;
  void * D.23860;
  int iftmp.96;
  int D.23864;
  void * D.23866;
  int D.23867;
  _Bool D.23869;
  long int D.23870;
  long int D.23871;
  void * D.23874;
  sizetype el_size.97;
  unsigned int D.23882;
  void * D.23891;
  int iftmp.98;
  int D.23895;
  int D.23897;
  _Bool D.23899;
  long int D.23900;
  long int D.23901;
  unsigned int D.23907;
  void * D.23916;
  int iftmp.99;
  int D.23920;
  int D.23922;
  _Bool D.23924;
  long int D.23925;
  long int D.23926;
  unsigned int D.23932;
  unsigned int D.23933;
  struct MonoVTable * D.23936;
  struct MonoClass * D.23937;
  const char * D.23938;
  const char * D.23939;
  gsize * bitmap_data.100;
  unsigned int D.23941;
  void * D.23950;
  int iftmp.101;
  int D.23954;
  int D.23956;
  _Bool D.23958;
  long int D.23959;
  long int D.23960;
  int bwords.102;
  unsigned int D.23967;
  gsize * mbitmap_data.103;
  unsigned int D.23969;
  unsigned int D.23970;
  struct MonoClass * D.23971;
  unsigned int el_size.104;
  unsigned int D.23973;
  const char * D.23976;
  const char * D.23977;
  gsize * bitmap_data.105;
  unsigned int D.23979;
  void * D.23988;
  int iftmp.106;
  int D.23992;
  int D.23994;
  _Bool D.23996;
  long int D.23997;
  long int D.23998;
  unsigned int bwords.107;
  sizetype el_size.108;

  {
    struct GCVTable * vt;
    mword desc;

    D.23708 = MEM[(mword *)start];
    D.23709 = D.23708 & 4294967292;
    vt = (struct GCVTable *) D.23709;
    desc = vt->desc;
    D.23710 = desc & 7;
    switch (D.23710) <default: <D.22145>, case 1: <D.22040>, case 2: <D.22051>, case 3: <D.22107>, case 4: <D.22063>, case 5: <D.22099>, case 6: <D.22122>, case 7: <D.22144>>
    <D.22040>:
    D.23711 = desc & 4294901760;
    if (D.23711 != 0) goto <D.23712>; else goto <D.23713>;
    <D.23712>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.23714 = desc >> 16;
      D.23715 = D.23714 & 255;
      D.23716 = D.23715 * 4;
      _objptr = _objptr + D.23716;
      D.23717 = desc >> 24;
      D.23718 = D.23717 * 4;
      _objptr_end = _objptr + D.23718;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23719>; else goto <D.23720>;
        <D.23719>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23721>; else goto <D.23722>;
        <D.23721>:
        if (__old != __copy) goto <D.23723>; else goto <D.23724>;
        <D.23723>:
        gc_debug_file.84 = gc_debug_file;
        D.23726 = *_objptr;
        fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23726, __old);
        gc_debug_file.84 = gc_debug_file;
        fflush (gc_debug_file.84);
        <D.23724>:
        <D.23722>:
        D.23730 = sgen_ptr_in_nursery (__copy);
        if (D.23730 != 0) goto <D.23731>; else goto <D.23728>;
        <D.23731>:
        D.23732 = sgen_ptr_in_nursery (_objptr);
        if (D.23732 == 0) goto <D.23733>; else goto <D.23728>;
        <D.23733>:
        iftmp.85 = 1;
        goto <D.23729>;
        <D.23728>:
        iftmp.85 = 0;
        <D.23729>:
        D.23734 = iftmp.85 != 0;
        D.23735 = (long int) D.23734;
        D.23736 = __builtin_expect (D.23735, 0);
        if (D.23736 != 0) goto <D.23737>; else goto <D.23738>;
        <D.23737>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23738>:
        goto <D.23739>;
        <D.23720>:
        if (0 != 0) goto <D.23740>; else goto <D.23741>;
        <D.23740>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23741>:
        <D.23739>:
      }
      _objptr = _objptr + 4;
      goto <D.22048>;
      <D.22047>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23742>; else goto <D.23743>;
        <D.23742>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23744>; else goto <D.23745>;
        <D.23744>:
        if (__old != __copy) goto <D.23746>; else goto <D.23747>;
        <D.23746>:
        gc_debug_file.84 = gc_debug_file;
        D.23726 = *_objptr;
        fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23726, __old);
        gc_debug_file.84 = gc_debug_file;
        fflush (gc_debug_file.84);
        <D.23747>:
        <D.23745>:
        D.23751 = sgen_ptr_in_nursery (__copy);
        if (D.23751 != 0) goto <D.23752>; else goto <D.23749>;
        <D.23752>:
        D.23753 = sgen_ptr_in_nursery (_objptr);
        if (D.23753 == 0) goto <D.23754>; else goto <D.23749>;
        <D.23754>:
        iftmp.86 = 1;
        goto <D.23750>;
        <D.23749>:
        iftmp.86 = 0;
        <D.23750>:
        D.23755 = iftmp.86 != 0;
        D.23756 = (long int) D.23755;
        D.23757 = __builtin_expect (D.23756, 0);
        if (D.23757 != 0) goto <D.23758>; else goto <D.23759>;
        <D.23758>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23759>:
        goto <D.23760>;
        <D.23743>:
        if (0 != 0) goto <D.23761>; else goto <D.23762>;
        <D.23761>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23762>:
        <D.23760>:
      }
      _objptr = _objptr + 4;
      <D.22048>:
      if (_objptr < _objptr_end) goto <D.22047>; else goto <D.22049>;
      <D.22049>:
    }
    <D.23713>:
    goto <D.22050>;
    <D.22051>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctz (_bmap);
        _index.87 = (unsigned int) _index;
        D.23764 = _index.87 * 4;
        _objptr = _objptr + D.23764;
        D.23765 = _index + 1;
        _bmap = _bmap >> D.23765;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.23766>; else goto <D.23767>;
          <D.23766>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.23768>; else goto <D.23769>;
          <D.23768>:
          if (__old != __copy) goto <D.23770>; else goto <D.23771>;
          <D.23770>:
          gc_debug_file.84 = gc_debug_file;
          D.23772 = *_objptr;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23772, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.23771>:
          <D.23769>:
          D.23776 = sgen_ptr_in_nursery (__copy);
          if (D.23776 != 0) goto <D.23777>; else goto <D.23774>;
          <D.23777>:
          D.23778 = sgen_ptr_in_nursery (_objptr);
          if (D.23778 == 0) goto <D.23779>; else goto <D.23774>;
          <D.23779>:
          iftmp.88 = 1;
          goto <D.23775>;
          <D.23774>:
          iftmp.88 = 0;
          <D.23775>:
          D.23780 = iftmp.88 != 0;
          D.23781 = (long int) D.23780;
          D.23782 = __builtin_expect (D.23781, 0);
          if (D.23782 != 0) goto <D.23783>; else goto <D.23784>;
          <D.23783>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.23784>:
          goto <D.23785>;
          <D.23767>:
          if (0 != 0) goto <D.23786>; else goto <D.23787>;
          <D.23786>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.23787>:
          <D.23785>:
        }
        _objptr = _objptr + 4;
      }
      goto <D.22061>;
      <D.22060>:
      {
        int _index;

        _index = __builtin_ctz (_bmap);
        _index.89 = (unsigned int) _index;
        D.23789 = _index.89 * 4;
        _objptr = _objptr + D.23789;
        D.23790 = _index + 1;
        _bmap = _bmap >> D.23790;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.23791>; else goto <D.23792>;
          <D.23791>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.23793>; else goto <D.23794>;
          <D.23793>:
          if (__old != __copy) goto <D.23795>; else goto <D.23796>;
          <D.23795>:
          gc_debug_file.84 = gc_debug_file;
          D.23772 = *_objptr;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23772, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.23796>:
          <D.23794>:
          D.23800 = sgen_ptr_in_nursery (__copy);
          if (D.23800 != 0) goto <D.23801>; else goto <D.23798>;
          <D.23801>:
          D.23802 = sgen_ptr_in_nursery (_objptr);
          if (D.23802 == 0) goto <D.23803>; else goto <D.23798>;
          <D.23803>:
          iftmp.90 = 1;
          goto <D.23799>;
          <D.23798>:
          iftmp.90 = 0;
          <D.23799>:
          D.23804 = iftmp.90 != 0;
          D.23805 = (long int) D.23804;
          D.23806 = __builtin_expect (D.23805, 0);
          if (D.23806 != 0) goto <D.23807>; else goto <D.23808>;
          <D.23807>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.23808>:
          goto <D.23809>;
          <D.23792>:
          if (0 != 0) goto <D.23810>; else goto <D.23811>;
          <D.23810>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.23811>:
          <D.23809>:
        }
        _objptr = _objptr + 4;
      }
      <D.22061>:
      if (_bmap != 0) goto <D.22060>; else goto <D.22062>;
      <D.22062>:
    }
    goto <D.22050>;
    <D.22063>:
    D.23812 = desc & 4294950912;
    if (D.23812 != 0) goto <D.23813>; else goto <D.23814>;
    <D.23813>:
    {
      int el_size;
      int etype;

      D.23815 = desc >> 3;
      D.23816 = (int) D.23815;
      el_size = D.23816 & 1023;
      desc.91 = (int) desc;
      etype = desc.91 & 49152;
      if (etype == 16384) goto <D.23818>; else goto <D.23819>;
      <D.23818>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.23820 = MEM[(struct MonoArray *)start].max_length;
        el_size.92 = (unsigned int) el_size;
        D.23822 = D.23820 * el_size.92;
        end_refs = p + D.23822;
        goto <D.22071>;
        <D.22070>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.23823>; else goto <D.23824>;
          <D.23823>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.23825>; else goto <D.23826>;
          <D.23825>:
          if (__old != __copy) goto <D.23827>; else goto <D.23828>;
          <D.23827>:
          gc_debug_file.84 = gc_debug_file;
          D.23829 = *p;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", p, D.23829, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.23828>:
          <D.23826>:
          D.23833 = sgen_ptr_in_nursery (__copy);
          if (D.23833 != 0) goto <D.23834>; else goto <D.23831>;
          <D.23834>:
          D.23835 = sgen_ptr_in_nursery (p);
          if (D.23835 == 0) goto <D.23836>; else goto <D.23831>;
          <D.23836>:
          iftmp.93 = 1;
          goto <D.23832>;
          <D.23831>:
          iftmp.93 = 0;
          <D.23832>:
          D.23837 = iftmp.93 != 0;
          D.23838 = (long int) D.23837;
          D.23839 = __builtin_expect (D.23838, 0);
          if (D.23839 != 0) goto <D.23840>; else goto <D.23841>;
          <D.23840>:
          sgen_add_to_global_remset (p, __copy);
          <D.23841>:
          goto <D.23842>;
          <D.23824>:
          if (0 != 0) goto <D.23843>; else goto <D.23844>;
          <D.23843>:
          sgen_add_to_global_remset (p, __old);
          <D.23844>:
          <D.23842>:
        }
        p = p + 4;
        <D.22071>:
        if (p < end_refs) goto <D.22070>; else goto <D.22072>;
        <D.22072>:
      }
      goto <D.23845>;
      <D.23819>:
      if (etype == 32768) goto <D.23846>; else goto <D.23847>;
      <D.23846>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.23714 = desc >> 16;
        D.23848 = (int) D.23714;
        offset = D.23848 & 255;
        D.23717 = desc >> 24;
        num_refs = (int) D.23717;
        e_start = start + 16;
        D.23820 = MEM[(struct MonoArray *)start].max_length;
        el_size.92 = (unsigned int) el_size;
        D.23822 = D.23820 * el_size.92;
        e_end = e_start + D.23822;
        goto <D.22085>;
        <D.22084>:
        {
          void * * p;
          int i;

          p = e_start;
          offset.94 = (unsigned int) offset;
          D.23850 = offset.94 * 4;
          p = p + D.23850;
          i = 0;
          goto <D.22082>;
          <D.22081>:
          {
            void * __old;
            void * __copy;

            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23853 = p + D.23852;
            __old = *D.23853;
            if (__old != 0B) goto <D.23854>; else goto <D.23855>;
            <D.23854>:
            __builtin_prefetch (__old);
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23853 = p + D.23852;
            major_copy_or_mark_object (D.23853, __old, queue);
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23853 = p + D.23852;
            __copy = *D.23853;
            if (0 != 0) goto <D.23856>; else goto <D.23857>;
            <D.23856>:
            if (__old != __copy) goto <D.23858>; else goto <D.23859>;
            <D.23858>:
            gc_debug_file.84 = gc_debug_file;
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23853 = p + D.23852;
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23853 = p + D.23852;
            D.23860 = *D.23853;
            fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", D.23853, D.23860, __old);
            gc_debug_file.84 = gc_debug_file;
            fflush (gc_debug_file.84);
            <D.23859>:
            <D.23857>:
            D.23864 = sgen_ptr_in_nursery (__copy);
            if (D.23864 != 0) goto <D.23865>; else goto <D.23862>;
            <D.23865>:
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23866 = p + D.23852;
            D.23867 = sgen_ptr_in_nursery (D.23866);
            if (D.23867 == 0) goto <D.23868>; else goto <D.23862>;
            <D.23868>:
            iftmp.96 = 1;
            goto <D.23863>;
            <D.23862>:
            iftmp.96 = 0;
            <D.23863>:
            D.23869 = iftmp.96 != 0;
            D.23870 = (long int) D.23869;
            D.23871 = __builtin_expect (D.23870, 0);
            if (D.23871 != 0) goto <D.23872>; else goto <D.23873>;
            <D.23872>:
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23874 = p + D.23852;
            sgen_add_to_global_remset (D.23874, __copy);
            <D.23873>:
            goto <D.23875>;
            <D.23855>:
            if (0 != 0) goto <D.23876>; else goto <D.23877>;
            <D.23876>:
            i.95 = (unsigned int) i;
            D.23852 = i.95 * 4;
            D.23874 = p + D.23852;
            sgen_add_to_global_remset (D.23874, __old);
            <D.23877>:
            <D.23875>:
          }
          i = i + 1;
          <D.22082>:
          if (i < num_refs) goto <D.22081>; else goto <D.22083>;
          <D.22083>:
          el_size.97 = (sizetype) el_size;
          e_start = e_start + el_size.97;
        }
        <D.22085>:
        if (e_start < e_end) goto <D.22084>; else goto <D.22086>;
        <D.22086>:
      }
      goto <D.23879>;
      <D.23847>:
      if (etype == 49152) goto <D.23880>; else goto <D.23881>;
      <D.23880>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.23820 = MEM[(struct MonoArray *)start].max_length;
        el_size.92 = (unsigned int) el_size;
        D.23822 = D.23820 * el_size.92;
        e_end = e_start + D.23822;
        goto <D.22097>;
        <D.22096>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.22094>;
          <D.22093>:
          D.23882 = _bmap & 1;
          if (D.23882 != 0) goto <D.23883>; else goto <D.23884>;
          <D.23883>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.23885>; else goto <D.23886>;
            <D.23885>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.23887>; else goto <D.23888>;
            <D.23887>:
            if (__old != __copy) goto <D.23889>; else goto <D.23890>;
            <D.23889>:
            gc_debug_file.84 = gc_debug_file;
            D.23891 = *p;
            fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", p, D.23891, __old);
            gc_debug_file.84 = gc_debug_file;
            fflush (gc_debug_file.84);
            <D.23890>:
            <D.23888>:
            D.23895 = sgen_ptr_in_nursery (__copy);
            if (D.23895 != 0) goto <D.23896>; else goto <D.23893>;
            <D.23896>:
            D.23897 = sgen_ptr_in_nursery (p);
            if (D.23897 == 0) goto <D.23898>; else goto <D.23893>;
            <D.23898>:
            iftmp.98 = 1;
            goto <D.23894>;
            <D.23893>:
            iftmp.98 = 0;
            <D.23894>:
            D.23899 = iftmp.98 != 0;
            D.23900 = (long int) D.23899;
            D.23901 = __builtin_expect (D.23900, 0);
            if (D.23901 != 0) goto <D.23902>; else goto <D.23903>;
            <D.23902>:
            sgen_add_to_global_remset (p, __copy);
            <D.23903>:
            goto <D.23904>;
            <D.23886>:
            if (0 != 0) goto <D.23905>; else goto <D.23906>;
            <D.23905>:
            sgen_add_to_global_remset (p, __old);
            <D.23906>:
            <D.23904>:
          }
          <D.23884>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.22094>:
          if (_bmap != 0) goto <D.22093>; else goto <D.22095>;
          <D.22095>:
          el_size.97 = (sizetype) el_size;
          e_start = e_start + el_size.97;
        }
        <D.22097>:
        if (e_start < e_end) goto <D.22096>; else goto <D.22098>;
        <D.22098>:
      }
      <D.23881>:
      <D.23879>:
      <D.23845>:
    }
    <D.23814>:
    goto <D.22050>;
    <D.22099>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.22105>;
      <D.22104>:
      D.23907 = _bmap & 1;
      if (D.23907 != 0) goto <D.23908>; else goto <D.23909>;
      <D.23908>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.23910>; else goto <D.23911>;
        <D.23910>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.23912>; else goto <D.23913>;
        <D.23912>:
        if (__old != __copy) goto <D.23914>; else goto <D.23915>;
        <D.23914>:
        gc_debug_file.84 = gc_debug_file;
        D.23916 = *_objptr;
        fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23916, __old);
        gc_debug_file.84 = gc_debug_file;
        fflush (gc_debug_file.84);
        <D.23915>:
        <D.23913>:
        D.23920 = sgen_ptr_in_nursery (__copy);
        if (D.23920 != 0) goto <D.23921>; else goto <D.23918>;
        <D.23921>:
        D.23922 = sgen_ptr_in_nursery (_objptr);
        if (D.23922 == 0) goto <D.23923>; else goto <D.23918>;
        <D.23923>:
        iftmp.99 = 1;
        goto <D.23919>;
        <D.23918>:
        iftmp.99 = 0;
        <D.23919>:
        D.23924 = iftmp.99 != 0;
        D.23925 = (long int) D.23924;
        D.23926 = __builtin_expect (D.23925, 0);
        if (D.23926 != 0) goto <D.23927>; else goto <D.23928>;
        <D.23927>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.23928>:
        goto <D.23929>;
        <D.23911>:
        if (0 != 0) goto <D.23930>; else goto <D.23931>;
        <D.23930>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.23931>:
        <D.23929>:
      }
      <D.23909>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.22105>:
      if (_bmap != 0) goto <D.22104>; else goto <D.22106>;
      <D.22106>:
    }
    goto <D.22050>;
    <D.22107>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.23932 = *bitmap_data;
      D.23933 = D.23932 + 4294967295;
      bwords = (int) D.23933;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.23934>; else goto <D.23935>;
      <D.23934>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.23936 = myobj->vtable;
        D.23937 = D.23936->klass;
        D.23938 = D.23937->name_space;
        D.23936 = myobj->vtable;
        D.23937 = D.23936->klass;
        D.23939 = D.23937->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.23938, D.23939);
      }
      <D.23935>:
      goto <D.22120>;
      <D.22119>:
      {
        gsize _bmap;

        bitmap_data.100 = bitmap_data;
        bitmap_data = bitmap_data.100 + 4;
        _bmap = *bitmap_data.100;
        _objptr = start_run;
        goto <D.22117>;
        <D.22116>:
        D.23941 = _bmap & 1;
        if (D.23941 != 0) goto <D.23942>; else goto <D.23943>;
        <D.23942>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.23944>; else goto <D.23945>;
          <D.23944>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.23946>; else goto <D.23947>;
          <D.23946>:
          if (__old != __copy) goto <D.23948>; else goto <D.23949>;
          <D.23948>:
          gc_debug_file.84 = gc_debug_file;
          D.23950 = *_objptr;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23950, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.23949>:
          <D.23947>:
          D.23954 = sgen_ptr_in_nursery (__copy);
          if (D.23954 != 0) goto <D.23955>; else goto <D.23952>;
          <D.23955>:
          D.23956 = sgen_ptr_in_nursery (_objptr);
          if (D.23956 == 0) goto <D.23957>; else goto <D.23952>;
          <D.23957>:
          iftmp.101 = 1;
          goto <D.23953>;
          <D.23952>:
          iftmp.101 = 0;
          <D.23953>:
          D.23958 = iftmp.101 != 0;
          D.23959 = (long int) D.23958;
          D.23960 = __builtin_expect (D.23959, 0);
          if (D.23960 != 0) goto <D.23961>; else goto <D.23962>;
          <D.23961>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.23962>:
          goto <D.23963>;
          <D.23945>:
          if (0 != 0) goto <D.23964>; else goto <D.23965>;
          <D.23964>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.23965>:
          <D.23963>:
        }
        <D.23943>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.22117>:
        if (_bmap != 0) goto <D.22116>; else goto <D.22118>;
        <D.22118>:
        start_run = start_run + 128;
      }
      <D.22120>:
      bwords.102 = bwords;
      bwords = bwords.102 + -1;
      if (bwords.102 > 0) goto <D.22119>; else goto <D.22121>;
      <D.22121>:
    }
    goto <D.22050>;
    <D.22122>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.23967 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.23967);
      mbitmap_data.103 = mbitmap_data;
      mbitmap_data = mbitmap_data.103 + 4;
      D.23969 = *mbitmap_data.103;
      D.23970 = D.23969 + 4294967295;
      mbwords = (int) D.23970;
      D.23971 = vt->klass;
      el_size = mono_array_element_size (D.23971);
      e_start = start + 16;
      D.23820 = MEM[(struct MonoArray *)start].max_length;
      el_size.104 = (unsigned int) el_size;
      D.23973 = D.23820 * el_size.104;
      e_end = e_start + D.23973;
      if (0 != 0) goto <D.23974>; else goto <D.23975>;
      <D.23974>:
      D.23967 = vt->desc;
      D.23971 = vt->klass;
      D.23976 = D.23971->name_space;
      D.23971 = vt->klass;
      D.23977 = D.23971->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.23967, D.23976, D.23977);
      <D.23975>:
      goto <D.22142>;
      <D.22141>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.105 = bitmap_data;
          bitmap_data = bitmap_data.105 + 4;
          _bmap = *bitmap_data.105;
          start_run = _objptr;
          goto <D.22136>;
          <D.22135>:
          D.23979 = _bmap & 1;
          if (D.23979 != 0) goto <D.23980>; else goto <D.23981>;
          <D.23980>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.23982>; else goto <D.23983>;
            <D.23982>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.23984>; else goto <D.23985>;
            <D.23984>:
            if (__old != __copy) goto <D.23986>; else goto <D.23987>;
            <D.23986>:
            gc_debug_file.84 = gc_debug_file;
            D.23988 = *_objptr;
            fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.23988, __old);
            gc_debug_file.84 = gc_debug_file;
            fflush (gc_debug_file.84);
            <D.23987>:
            <D.23985>:
            D.23992 = sgen_ptr_in_nursery (__copy);
            if (D.23992 != 0) goto <D.23993>; else goto <D.23990>;
            <D.23993>:
            D.23994 = sgen_ptr_in_nursery (_objptr);
            if (D.23994 == 0) goto <D.23995>; else goto <D.23990>;
            <D.23995>:
            iftmp.106 = 1;
            goto <D.23991>;
            <D.23990>:
            iftmp.106 = 0;
            <D.23991>:
            D.23996 = iftmp.106 != 0;
            D.23997 = (long int) D.23996;
            D.23998 = __builtin_expect (D.23997, 0);
            if (D.23998 != 0) goto <D.23999>; else goto <D.24000>;
            <D.23999>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.24000>:
            goto <D.24001>;
            <D.23983>:
            if (0 != 0) goto <D.24002>; else goto <D.24003>;
            <D.24002>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.24003>:
            <D.24001>:
          }
          <D.23981>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.22136>:
          if (_bmap != 0) goto <D.22135>; else goto <D.22137>;
          <D.22137>:
          _objptr = start_run + 128;
        }
        <D.22139>:
        bwords.107 = bwords;
        bwords = bwords.107 + 4294967295;
        if (bwords.107 != 0) goto <D.22138>; else goto <D.22140>;
        <D.22140>:
        el_size.108 = (sizetype) el_size;
        e_start = e_start + el_size.108;
      }
      <D.22142>:
      if (e_start < e_end) goto <D.22141>; else goto <D.22143>;
      <D.22143>:
    }
    goto <D.22050>;
    <D.22144>:
    goto <D.22050>;
    <D.22145>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.22050>:
  }
}


major_copy_or_mark_object (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int current_collection_generation.109;
  int D.24012;
  char * iftmp.110;
  unsigned int D.24016;
  unsigned int D.24017;
  unsigned int D.24020;
  unsigned int D.24024;
  int D.24027;
  _Bool D.24030;
  long int D.24031;
  long int D.24032;
  int D.24035;
  unsigned int obj.111;
  unsigned int D.24039;
  struct MSBlockHeader * D.24040;
  gboolean * evacuate_block_obj_sizes.112;
  unsigned int size_index.113;
  unsigned int D.24043;
  gboolean * D.24044;
  int obj.114;
  int obj.115;
  int D.24047;
  int D.24048;
  unsigned int D.24054;
  long int D.24055;
  long unsigned int D.24056;
  long unsigned int D.24057;
  long unsigned int D.24060;
  unsigned char D.24061;
  unsigned char D.24062;
  int iftmp.116;
  struct GrayQueueSection * D.24069;
  int D.24071;
  _Bool D.24072;
  long int D.24073;
  long int D.24074;
  int D.24078;
  int D.24079;
  int D.24080;
  unsigned int D.24088;
  long int D.24089;
  long unsigned int D.24090;
  long unsigned int D.24091;
  char * iftmp.117;
  unsigned int D.24099;
  unsigned int D.24100;
  unsigned int size_index.118;
  unsigned int D.24104;
  gboolean * D.24105;
  unsigned char D.24108;
  _Bool D.24110;
  long int D.24111;
  long int D.24112;
  unsigned char D.24115;
  unsigned int D.24123;
  long int D.24124;
  long unsigned int D.24125;
  long unsigned int D.24126;
  long unsigned int D.24129;
  int iftmp.119;
  _Bool D.24137;
  long int D.24138;
  long int D.24139;
  int D.24143;
  int D.24144;
  int D.24146;
  struct MonoVTable * D.24149;
  void * D.24150;
  unsigned int D.24151;
  int D.24152;
  int iftmp.120;
  _Bool D.24160;
  long int D.24161;
  long int D.24162;
  int D.24166;
  int D.24167;
  struct MSBlockInfo * block;
  void do_copy_object = <<< error >>>;

  if (0 != 0) goto <D.24007>; else goto <D.24008>;
  <D.24007>:
  monoeg_g_log (0B, 4, "null object from pointer %p", ptr);
  <D.22000>:
  goto <D.22000>;
  <D.24008>:
  if (0 != 0) goto <D.24009>; else goto <D.24010>;
  <D.24009>:
  current_collection_generation.109 = current_collection_generation;
  monoeg_g_log (0B, 4, "old gen parallel allocator called from a %d collection", current_collection_generation.109);
  <D.22001>:
  goto <D.22001>;
  <D.24010>:
  D.24012 = sgen_ptr_in_nursery (obj);
  if (D.24012 != 0) goto <D.24013>; else goto <D.24014>;
  <D.24013>:
  {
    int word;
    int bit;
    char * forwarded;
    char * old_obj;

    D.24016 = MEM[(mword *)obj];
    D.24017 = D.24016 & 1;
    if (D.24017 != 0) goto <D.24018>; else goto <D.24019>;
    <D.24018>:
    D.24016 = MEM[(mword *)obj];
    D.24020 = D.24016 & 4294967292;
    iftmp.110 = (char *) D.24020;
    goto <D.24021>;
    <D.24019>:
    iftmp.110 = 0B;
    <D.24021>:
    forwarded = iftmp.110;
    if (forwarded != 0B) goto <D.24022>; else goto <D.24023>;
    <D.24022>:
    *ptr = forwarded;
    return;
    <D.24023>:
    D.24016 = MEM[(mword *)obj];
    D.24024 = D.24016 & 2;
    if (D.24024 != 0) goto <D.24025>; else goto <D.24026>;
    <D.24025>:
    return;
    <D.24026>:
    D.24027 = sgen_nursery_is_to_space (obj);
    if (D.24027 != 0) goto <D.24028>; else goto <D.24029>;
    <D.24028>:
    return;
    <D.24029>:
    do_copy_object:
    old_obj = obj;
    obj = copy_object_no_checks (obj, queue);
    D.24030 = old_obj == obj;
    D.24031 = (long int) D.24030;
    D.24032 = __builtin_expect (D.24031, 0);
    if (D.24032 != 0) goto <D.24033>; else goto <D.24034>;
    <D.24033>:
    D.24035 = sgen_ptr_in_nursery (obj);
    if (D.24035 == 0) goto <D.24036>; else goto <D.24037>;
    <D.24036>:
    {
      int size_index;

      obj.111 = (unsigned int) obj;
      D.24039 = obj.111 & 4294950912;
      D.24040 = (struct MSBlockHeader *) D.24039;
      block = D.24040->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.112 = evacuate_block_obj_sizes;
      size_index.113 = (unsigned int) size_index;
      D.24043 = size_index.113 * 4;
      D.24044 = evacuate_block_obj_sizes.112 + D.24043;
      *D.24044 = 0;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.114 = (int) obj;
          obj.115 = (int) obj;
          D.24047 = obj.115 & -16384;
          D.24048 = obj.114 - D.24047;
          i = D.24048 >> 3;
          if (1 != 0) goto <D.24049>; else goto <D.24050>;
          <D.24049>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.24051>;
          <D.24050>:
          __word = i >> 6;
          __bit = i & 63;
          <D.24051>:
        }
        if (0 != 0) goto <D.24052>; else goto <D.24053>;
        <D.24052>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.22011>:
        goto <D.22011>;
        <D.24053>:
        D.24054 = block->mark_words[__word];
        D.24055 = 1 << __bit;
        D.24056 = (long unsigned int) D.24055;
        D.24057 = D.24054 & D.24056;
        if (D.24057 == 0) goto <D.24058>; else goto <D.24059>;
        <D.24058>:
        D.24054 = block->mark_words[__word];
        D.24055 = 1 << __bit;
        D.24056 = (long unsigned int) D.24055;
        D.24060 = D.24054 | D.24056;
        block->mark_words[__word] = D.24060;
        D.24061 = BIT_FIELD_REF <*block, 8, 96>;
        D.24062 = D.24061 & 2;
        if (D.24062 != 0) goto <D.24063>; else goto <D.24064>;
        <D.24063>:
        D.24069 = queue->first;
        if (D.24069 == 0B) goto <D.24066>; else goto <D.24070>;
        <D.24070>:
        D.24069 = queue->first;
        D.24071 = D.24069->end;
        if (D.24071 == 125) goto <D.24066>; else goto <D.24067>;
        <D.24066>:
        iftmp.116 = 1;
        goto <D.24068>;
        <D.24067>:
        iftmp.116 = 0;
        <D.24068>:
        D.24072 = iftmp.116 != 0;
        D.24073 = (long int) D.24072;
        D.24074 = __builtin_expect (D.24073, 0);
        if (D.24074 != 0) goto <D.24075>; else goto <D.24076>;
        <D.24075>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.24077>;
        <D.24076>:
        D.24069 = queue->first;
        D.24069 = queue->first;
        D.24071 = D.24069->end;
        D.24078 = D.24071;
        D.24079 = D.24078 + 1;
        D.24069->end = D.24079;
        D.24069->objects[D.24078] = obj;
        <D.24077>:
        __builtin_prefetch (obj);
        <D.24064>:
        <D.24059>:
      }
    }
    <D.24037>:
    return;
    <D.24034>:
    *ptr = obj;
    D.24080 = sgen_ptr_in_nursery (obj);
    if (D.24080 == 0) goto <D.24081>; else goto <D.24082>;
    <D.24081>:
    obj.111 = (unsigned int) obj;
    D.24039 = obj.111 & 4294950912;
    D.24040 = (struct MSBlockHeader *) D.24039;
    block = D.24040->info;
    {
      int i;

      obj.114 = (int) obj;
      obj.115 = (int) obj;
      D.24047 = obj.115 & -16384;
      D.24048 = obj.114 - D.24047;
      i = D.24048 >> 3;
      if (1 != 0) goto <D.24083>; else goto <D.24084>;
      <D.24083>:
      word = i >> 5;
      bit = i & 31;
      goto <D.24085>;
      <D.24084>:
      word = i >> 6;
      bit = i & 63;
      <D.24085>:
    }
    if (0 != 0) goto <D.24086>; else goto <D.24087>;
    <D.24086>:
    monoeg_g_log (0B, 4, "object %p already marked", obj);
    <D.22013>:
    goto <D.22013>;
    <D.24087>:
    D.24088 = block->mark_words[word];
    D.24089 = 1 << bit;
    D.24090 = (long unsigned int) D.24089;
    D.24091 = D.24088 | D.24090;
    block->mark_words[word] = D.24091;
    <D.24082>:
  }
  goto <D.24092>;
  <D.24014>:
  {
    char * forwarded;
    mword objsize;

    D.24016 = MEM[(mword *)obj];
    D.24017 = D.24016 & 1;
    if (D.24017 != 0) goto <D.24094>; else goto <D.24095>;
    <D.24094>:
    D.24016 = MEM[(mword *)obj];
    D.24020 = D.24016 & 4294967292;
    iftmp.117 = (char *) D.24020;
    goto <D.24096>;
    <D.24095>:
    iftmp.117 = 0B;
    <D.24096>:
    forwarded = iftmp.117;
    if (forwarded != 0B) goto <D.24097>; else goto <D.24098>;
    <D.24097>:
    *ptr = forwarded;
    return;
    <D.24098>:
    D.24099 = sgen_safe_object_get_size (obj);
    D.24100 = D.24099 + 7;
    objsize = D.24100 & 4294967288;
    if (objsize <= 8000) goto <D.24101>; else goto <D.24102>;
    <D.24101>:
    {
      int size_index;
      gboolean evacuate;

      obj.111 = (unsigned int) obj;
      D.24039 = obj.111 & 4294950912;
      D.24040 = (struct MSBlockHeader *) D.24039;
      block = D.24040->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.112 = evacuate_block_obj_sizes;
      size_index.118 = (unsigned int) size_index;
      D.24104 = size_index.118 * 4;
      D.24105 = evacuate_block_obj_sizes.112 + D.24104;
      evacuate = *D.24105;
      if (evacuate != 0) goto <D.24107>; else goto <D.24106>;
      <D.24107>:
      D.24061 = BIT_FIELD_REF <*block, 8, 96>;
      D.24108 = D.24061 & 4;
      if (D.24108 == 0) goto <D.24109>; else goto <D.24106>;
      <D.24109>:
      D.24016 = MEM[(mword *)obj];
      D.24024 = D.24016 & 2;
      D.24110 = D.24024 != 0;
      D.24111 = (long int) D.24110;
      D.24112 = __builtin_expect (D.24111, 0);
      if (D.24112 != 0) goto <D.24113>; else goto <D.24114>;
      <D.24113>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1425, "!SGEN_OBJECT_IS_PINNED (obj)");
      <D.24114>:
      D.24061 = BIT_FIELD_REF <*block, 8, 96>;
      D.24115 = D.24061 & 8;
      if (D.24115 != 0) goto <D.24116>; else goto <D.24117>;
      <D.24116>:
      return;
      <D.24117>:
      goto do_copy_object;
      <D.24106>:
      {
        int __word;
        int __bit;

        {
          int i;

          obj.114 = (int) obj;
          obj.115 = (int) obj;
          D.24047 = obj.115 & -16384;
          D.24048 = obj.114 - D.24047;
          i = D.24048 >> 3;
          if (1 != 0) goto <D.24118>; else goto <D.24119>;
          <D.24118>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.24120>;
          <D.24119>:
          __word = i >> 6;
          __bit = i & 63;
          <D.24120>:
        }
        if (0 != 0) goto <D.24121>; else goto <D.24122>;
        <D.24121>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.22021>:
        goto <D.22021>;
        <D.24122>:
        D.24123 = block->mark_words[__word];
        D.24124 = 1 << __bit;
        D.24125 = (long unsigned int) D.24124;
        D.24126 = D.24123 & D.24125;
        if (D.24126 == 0) goto <D.24127>; else goto <D.24128>;
        <D.24127>:
        D.24123 = block->mark_words[__word];
        D.24124 = 1 << __bit;
        D.24125 = (long unsigned int) D.24124;
        D.24129 = D.24123 | D.24125;
        block->mark_words[__word] = D.24129;
        D.24061 = BIT_FIELD_REF <*block, 8, 96>;
        D.24062 = D.24061 & 2;
        if (D.24062 != 0) goto <D.24130>; else goto <D.24131>;
        <D.24130>:
        D.24069 = queue->first;
        if (D.24069 == 0B) goto <D.24133>; else goto <D.24136>;
        <D.24136>:
        D.24069 = queue->first;
        D.24071 = D.24069->end;
        if (D.24071 == 125) goto <D.24133>; else goto <D.24134>;
        <D.24133>:
        iftmp.119 = 1;
        goto <D.24135>;
        <D.24134>:
        iftmp.119 = 0;
        <D.24135>:
        D.24137 = iftmp.119 != 0;
        D.24138 = (long int) D.24137;
        D.24139 = __builtin_expect (D.24138, 0);
        if (D.24139 != 0) goto <D.24140>; else goto <D.24141>;
        <D.24140>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.24142>;
        <D.24141>:
        D.24069 = queue->first;
        D.24069 = queue->first;
        D.24071 = D.24069->end;
        D.24143 = D.24071;
        D.24144 = D.24143 + 1;
        D.24069->end = D.24144;
        D.24069->objects[D.24143] = obj;
        <D.24142>:
        __builtin_prefetch (obj);
        <D.24131>:
        <D.24128>:
      }
    }
    goto <D.24145>;
    <D.24102>:
    D.24146 = sgen_los_object_is_pinned (obj);
    if (D.24146 != 0) goto <D.24147>; else goto <D.24148>;
    <D.24147>:
    return;
    <D.24148>:
    sgen_los_pin_object (obj);
    D.24016 = MEM[(mword *)obj];
    D.24020 = D.24016 & 4294967292;
    D.24149 = (struct MonoVTable *) D.24020;
    D.24150 = D.24149->gc_descr;
    D.24151 = (unsigned int) D.24150;
    D.24152 = sgen_gc_descr_has_references (D.24151);
    if (D.24152 != 0) goto <D.24153>; else goto <D.24154>;
    <D.24153>:
    D.24069 = queue->first;
    if (D.24069 == 0B) goto <D.24156>; else goto <D.24159>;
    <D.24159>:
    D.24069 = queue->first;
    D.24071 = D.24069->end;
    if (D.24071 == 125) goto <D.24156>; else goto <D.24157>;
    <D.24156>:
    iftmp.120 = 1;
    goto <D.24158>;
    <D.24157>:
    iftmp.120 = 0;
    <D.24158>:
    D.24160 = iftmp.120 != 0;
    D.24161 = (long int) D.24160;
    D.24162 = __builtin_expect (D.24161, 0);
    if (D.24162 != 0) goto <D.24163>; else goto <D.24164>;
    <D.24163>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.24165>;
    <D.24164>:
    D.24069 = queue->first;
    D.24069 = queue->first;
    D.24071 = D.24069->end;
    D.24166 = D.24071;
    D.24167 = D.24166 + 1;
    D.24069->end = D.24167;
    D.24069->objects[D.24166] = obj;
    <D.24165>:
    __builtin_prefetch (obj);
    <D.24154>:
    <D.24145>:
  }
  <D.24092>:
}


sgen_nursery_is_to_space (char * object)
{
  int object.121;
  char * sgen_nursery_start.122;
  int sgen_nursery_start.123;
  int D.24172;
  int D.24173;
  _Bool D.24174;
  long int D.24175;
  long int D.24176;
  char * D.24179;
  char * D.24180;
  int sgen_space_bitmap_size.124;
  _Bool D.24182;
  long int D.24183;
  long int D.24184;
  gboolean D.24187;
  char * sgen_space_bitmap.125;
  sizetype byte.126;
  char * D.24190;
  char D.24191;
  int D.24192;
  int D.24193;
  int D.24194;
  _Bool D.24195;
  int idx;
  int byte;
  int bit;

  object.121 = (int) object;
  sgen_nursery_start.122 = sgen_nursery_start;
  sgen_nursery_start.123 = (int) sgen_nursery_start.122;
  D.24172 = object.121 - sgen_nursery_start.123;
  idx = D.24172 >> 9;
  byte = idx / 8;
  bit = idx & 7;
  D.24173 = sgen_ptr_in_nursery (object);
  D.24174 = D.24173 == 0;
  D.24175 = (long int) D.24174;
  D.24176 = __builtin_expect (D.24175, 0);
  if (D.24176 != 0) goto <D.24177>; else goto <D.24178>;
  <D.24177>:
  D.24179 = sgen_get_nursery_start ();
  D.24180 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.24179, D.24180);
  <D.21051>:
  goto <D.21051>;
  <D.24178>:
  sgen_space_bitmap_size.124 = sgen_space_bitmap_size;
  D.24182 = byte >= sgen_space_bitmap_size.124;
  D.24183 = (long int) D.24182;
  D.24184 = __builtin_expect (D.24183, 0);
  if (D.24184 != 0) goto <D.24185>; else goto <D.24186>;
  <D.24185>:
  sgen_space_bitmap_size.124 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.124);
  <D.21052>:
  goto <D.21052>;
  <D.24186>:
  sgen_space_bitmap.125 = sgen_space_bitmap;
  byte.126 = (sizetype) byte;
  D.24190 = sgen_space_bitmap.125 + byte.126;
  D.24191 = *D.24190;
  D.24192 = (int) D.24191;
  D.24193 = D.24192 >> bit;
  D.24194 = D.24193 & 1;
  D.24195 = D.24194 != 0;
  D.24187 = (gboolean) D.24195;
  return D.24187;
}


sgen_get_nursery_start ()
{
  char * D.24197;

  D.24197 = sgen_nursery_start;
  return D.24197;
}


sgen_get_nursery_end ()
{
  char * D.24199;

  D.24199 = sgen_nursery_end;
  return D.24199;
}


copy_object_no_checks (void * obj, struct SgenGrayQueue * queue)
{
  void * D.24201;
  unsigned int D.24202;
  unsigned int D.24203;
  unsigned int D.24204;
  char * (*<T3a87>) (struct MonoVTable *, char *, size_t, gboolean) D.24205;
  _Bool D.24206;
  long int D.24207;
  long int D.24208;
  int D.24211;
  _Bool D.24215;
  long int D.24216;
  long int D.24217;
  void * D.24220;
  struct SgenGrayQueue * iftmp.127;
  unsigned int destination.128;
  unsigned int D.24226;
  struct MonoVTable * vt;
  gboolean has_references;
  mword objsize;
  char * destination;

  vt = MEM[(struct MonoObject *)obj].vtable;
  D.24201 = vt->gc_descr;
  D.24202 = (unsigned int) D.24201;
  has_references = sgen_gc_descr_has_references (D.24202);
  D.24203 = sgen_par_object_get_size (vt, obj);
  D.24204 = D.24203 + 7;
  objsize = D.24204 & 4294967288;
  D.24205 = sgen_minor_collector.alloc_for_promotion;
  destination = D.24205 (vt, obj, objsize, has_references);
  D.24206 = destination == 0B;
  D.24207 = (long int) D.24206;
  D.24208 = __builtin_expect (D.24207, 0);
  if (D.24208 != 0) goto <D.24209>; else goto <D.24210>;
  <D.24209>:
  D.24211 = sgen_ptr_in_nursery (obj);
  if (D.24211 != 0) goto <D.24212>; else goto <D.24213>;
  <D.24212>:
  sgen_pin_object (obj, queue);
  goto <D.24214>;
  <D.24213>:
  D.24215 = objsize > 8000;
  D.24216 = (long int) D.24215;
  D.24217 = __builtin_expect (D.24216, 0);
  if (D.24217 != 0) goto <D.24218>; else goto <D.24219>;
  <D.24218>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-copy-object.h", 115, "objsize <= SGEN_MAX_SMALL_OBJ_SIZE");
  <D.24219>:
  pin_major_object (obj, queue);
  <D.24214>:
  sgen_set_pinned_from_failed_allocation (objsize);
  D.24220 = obj;
  return D.24220;
  <D.24210>:
  if (has_references != 0) goto <D.24222>; else goto <D.24223>;
  <D.24222>:
  iftmp.127 = queue;
  goto <D.24224>;
  <D.24223>:
  iftmp.127 = 0B;
  <D.24224>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.127);
  destination.128 = (unsigned int) destination;
  D.24226 = destination.128 | 1;
  MEM[(mword *)obj] = D.24226;
  D.24220 = destination;
  return D.24220;
}


par_copy_object_no_checks (char * destination, struct MonoVTable * vt, void * obj, mword objsize, struct SgenGrayQueue * queue)
{
  struct MonoClass * D.24230;
  const char * D.24231;
  const char * D.24232;
  struct FILE * gc_debug_file.129;
  struct MonoVTable * D.24236;
  struct MonoClass * D.24237;
  const char * D.24238;
  unsigned int D.24241;
  const void * D.24242;
  mword * D.24243;
  unsigned int D.24244;
  mword * D.24245;
  unsigned int D.24246;
  mword * D.24247;
  unsigned int D.24248;
  mword * D.24249;
  unsigned int D.24250;
  mword * D.24251;
  unsigned int D.24252;
  mword * D.24253;
  unsigned int D.24254;
  mword * D.24255;
  unsigned int D.24256;
  void * D.24258;
  const void * D.24259;
  unsigned int D.24260;
  int iftmp.130;
  unsigned char D.24266;
  struct MonoArrayBounds * D.24268;
  _Bool D.24270;
  long int D.24271;
  long int D.24272;
  int D.24275;
  int obj.131;
  int D.24277;
  sizetype D.24278;
  struct MonoArrayBounds * D.24279;
  int D.24282;
  unsigned int D.24283;
  <unnamed type> mono_profiler_events.132;
  unsigned int D.24285;
  _Bool D.24286;
  long int D.24287;
  long int D.24288;
  const char * D.24295;
  int iftmp.133;
  struct GrayQueueSection * D.24300;
  int D.24302;
  _Bool D.24303;
  long int D.24304;
  long int D.24305;
  int D.24309;
  int D.24310;
  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.24228>; else goto <D.24229>;
  <D.24228>:
  D.24230 = vt->klass;
  D.24231 = D.24230->name_space;
  D.24230 = vt->klass;
  D.24232 = D.24230->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s was not initialized", vt, D.24231, D.24232);
  <D.21971>:
  goto <D.21971>;
  <D.24229>:
  if (0 != 0) goto <D.24233>; else goto <D.24234>;
  <D.24233>:
  gc_debug_file.129 = gc_debug_file;
  D.24236 = MEM[(struct MonoObject *)obj].vtable;
  D.24237 = D.24236->klass;
  D.24238 = D.24237->name;
  fprintf (gc_debug_file.129, " (to %p, %s size: %lu)\n", destination, D.24238, objsize);
  gc_debug_file.129 = gc_debug_file;
  fflush (gc_debug_file.129);
  <D.24234>:
  if (objsize <= 32) goto <D.24239>; else goto <D.24240>;
  <D.24239>:
  {
    mword * dest;

    dest = destination;
    D.24241 = objsize / 4;
    D.24242 = copy_labels[D.24241];
    goto D.24242;
    LAB_8:
    D.24243 = dest + 28;
    D.24244 = MEM[(mword *)obj + 28B];
    *D.24243 = D.24244;
    LAB_7:
    D.24245 = dest + 24;
    D.24246 = MEM[(mword *)obj + 24B];
    *D.24245 = D.24246;
    LAB_6:
    D.24247 = dest + 20;
    D.24248 = MEM[(mword *)obj + 20B];
    *D.24247 = D.24248;
    LAB_5:
    D.24249 = dest + 16;
    D.24250 = MEM[(mword *)obj + 16B];
    *D.24249 = D.24250;
    LAB_4:
    D.24251 = dest + 12;
    D.24252 = MEM[(mword *)obj + 12B];
    *D.24251 = D.24252;
    LAB_3:
    D.24253 = dest + 8;
    D.24254 = MEM[(mword *)obj + 8B];
    *D.24253 = D.24254;
    LAB_2:
    D.24255 = dest + 4;
    D.24256 = MEM[(mword *)obj + 4B];
    *D.24255 = D.24256;
    LAB_1:
    LAB_0:
  }
  goto <D.24257>;
  <D.24240>:
  D.24258 = destination + 4;
  D.24259 = obj + 4;
  D.24260 = objsize + 4294967292;
  mono_gc_memmove_aligned (D.24258, D.24259, D.24260);
  <D.24257>:
  if (0 != 0) goto <D.24261>; else goto <D.24262>;
  <D.24261>:
  D.24230 = vt->klass;
  D.24231 = D.24230->name_space;
  D.24230 = vt->klass;
  D.24232 = D.24230->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s has no gc descriptor", vt, D.24231, D.24232);
  <D.21973>:
  goto <D.21973>;
  <D.24262>:
  D.24266 = vt->rank;
  if (D.24266 != 0) goto <D.24267>; else goto <D.24264>;
  <D.24267>:
  D.24268 = MEM[(struct MonoArray *)obj].bounds;
  if (D.24268 != 0B) goto <D.24269>; else goto <D.24264>;
  <D.24269>:
  iftmp.130 = 1;
  goto <D.24265>;
  <D.24264>:
  iftmp.130 = 0;
  <D.24265>:
  D.24270 = iftmp.130 != 0;
  D.24271 = (long int) D.24270;
  D.24272 = __builtin_expect (D.24271, 0);
  if (D.24272 != 0) goto <D.24273>; else goto <D.24274>;
  <D.24273>:
  {
    struct MonoArray * array;

    array = destination;
    D.24268 = MEM[(struct MonoArray *)obj].bounds;
    D.24275 = (int) D.24268;
    obj.131 = (int) obj;
    D.24277 = D.24275 - obj.131;
    D.24278 = (sizetype) D.24277;
    D.24279 = destination + D.24278;
    array->bounds = D.24279;
    if (0 != 0) goto <D.24280>; else goto <D.24281>;
    <D.24280>:
    gc_debug_file.129 = gc_debug_file;
    D.24266 = vt->rank;
    D.24282 = (int) D.24266;
    D.24283 = mono_array_length (array);
    fprintf (gc_debug_file.129, "Array instance %p: size: %lu, rank: %d, length: %lu\n", array, objsize, D.24282, D.24283);
    gc_debug_file.129 = gc_debug_file;
    fflush (gc_debug_file.129);
    <D.24281>:
  }
  <D.24274>:
  mono_profiler_events.132 = mono_profiler_events;
  D.24285 = mono_profiler_events.132 & 524288;
  D.24286 = D.24285 != 0;
  D.24287 = (long int) D.24286;
  D.24288 = __builtin_expect (D.24287, 0);
  if (D.24288 != 0) goto <D.24289>; else goto <D.24290>;
  <D.24289>:
  sgen_register_moved_object (obj, destination);
  <D.24290>:
  obj = destination;
  if (queue != 0B) goto <D.24291>; else goto <D.24292>;
  <D.24291>:
  if (0 != 0) goto <D.24293>; else goto <D.24294>;
  <D.24293>:
  gc_debug_file.129 = gc_debug_file;
  D.24295 = sgen_safe_name (obj);
  fprintf (gc_debug_file.129, "Enqueuing gray object %p (%s)\n", obj, D.24295);
  gc_debug_file.129 = gc_debug_file;
  fflush (gc_debug_file.129);
  <D.24294>:
  D.24300 = queue->first;
  if (D.24300 == 0B) goto <D.24297>; else goto <D.24301>;
  <D.24301>:
  D.24300 = queue->first;
  D.24302 = D.24300->end;
  if (D.24302 == 125) goto <D.24297>; else goto <D.24298>;
  <D.24297>:
  iftmp.133 = 1;
  goto <D.24299>;
  <D.24298>:
  iftmp.133 = 0;
  <D.24299>:
  D.24303 = iftmp.133 != 0;
  D.24304 = (long int) D.24303;
  D.24305 = __builtin_expect (D.24304, 0);
  if (D.24305 != 0) goto <D.24306>; else goto <D.24307>;
  <D.24306>:
  sgen_gray_object_enqueue (queue, obj);
  goto <D.24308>;
  <D.24307>:
  D.24300 = queue->first;
  D.24300 = queue->first;
  D.24302 = D.24300->end;
  D.24309 = D.24302;
  D.24310 = D.24309 + 1;
  D.24300->end = D.24310;
  D.24300->objects[D.24309] = obj;
  <D.24308>:
  __builtin_prefetch (obj);
  <D.24292>:
}


major_copy_or_mark_object_canonical (void * * ptr, struct SgenGrayQueue * queue)
{
  void * D.24313;

  D.24313 = *ptr;
  major_copy_or_mark_object (ptr, D.24313, queue);
}


major_describe_pointer (char * ptr)
{
  char * D.24316;
  char * D.24318;
  int gc_debug_level.135;
  _Bool D.24320;
  long int D.24321;
  long int D.24322;
  struct FILE * gc_debug_file.136;
  int D.24326;
  <unnamed-unsigned:1> D.24327;
  int D.24328;
  <unnamed-unsigned:1> D.24329;
  int D.24330;
  int ptr.137;
  char * D.24332;
  int D.24333;
  int D.24334;
  int D.24335;
  sizetype D.24336;
  sizetype D.24337;
  int iftmp.138;
  void * D.24342;
  char * D.24344;
  struct MonoVTable * iftmp.139;
  unsigned int D.24349;
  unsigned int D.24350;
  int obj.140;
  int obj.141;
  int D.24354;
  int D.24355;
  unsigned int D.24359;
  long int D.24360;
  long unsigned int D.24361;
  long unsigned int D.24362;
  int D.24379;
  _Bool D.24385;
  int D.24386;
  struct MonoVTable * D.24387;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.21904>;
  <D.21903>:
  {
    int idx;
    char * obj;
    gboolean live;
    struct MonoVTable * vtable;
    int w;
    int b;
    gboolean marked;

    D.24316 = block->block;
    if (D.24316 > ptr) goto <D.24314>; else goto <D.24317>;
    <D.24317>:
    D.24316 = block->block;
    D.24318 = D.24316 + 16384;
    if (D.24318 <= ptr) goto <D.24314>; else goto <D.24315>;
    <D.24314>:
    // predicted unlikely by continue predictor.
    goto <D.21901>;
    <D.24315>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24323>; else goto <D.24324>;
    <D.24323>:
    gc_debug_file.136 = gc_debug_file;
    D.24316 = block->block;
    D.24326 = block->obj_size;
    D.24327 = block->pinned;
    D.24328 = (int) D.24327;
    D.24329 = block->has_references;
    D.24330 = (int) D.24329;
    fprintf (gc_debug_file.136, "major-ptr (block %p sz %d pin %d ref %d)\n\n", D.24316, D.24326, D.24328, D.24330);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24324>:
    ptr.137 = (int) ptr;
    D.24316 = block->block;
    D.24332 = D.24316 + 16;
    D.24333 = (int) D.24332;
    D.24334 = ptr.137 - D.24333;
    D.24326 = block->obj_size;
    idx = D.24334 / D.24326;
    D.24316 = block->block;
    D.24326 = block->obj_size;
    D.24335 = D.24326 * idx;
    D.24336 = (sizetype) D.24335;
    D.24337 = D.24336 + 16;
    obj = D.24316 + D.24337;
    D.24342 = MEM[(void * *)obj];
    if (D.24342 != 0B) goto <D.24343>; else goto <D.24339>;
    <D.24343>:
    D.24344 = MEM[(char * *)obj];
    D.24316 = block->block;
    if (D.24344 < D.24316) goto <D.24340>; else goto <D.24345>;
    <D.24345>:
    D.24344 = MEM[(char * *)obj];
    D.24316 = block->block;
    D.24318 = D.24316 + 16384;
    if (D.24344 >= D.24318) goto <D.24340>; else goto <D.24339>;
    <D.24340>:
    iftmp.138 = 1;
    goto <D.24341>;
    <D.24339>:
    iftmp.138 = 0;
    <D.24341>:
    live = iftmp.138;
    if (live != 0) goto <D.24347>; else goto <D.24348>;
    <D.24347>:
    D.24349 = MEM[(mword *)obj];
    D.24350 = D.24349 & 4294967292;
    iftmp.139 = (struct MonoVTable *) D.24350;
    goto <D.24351>;
    <D.24348>:
    iftmp.139 = 0B;
    <D.24351>:
    vtable = iftmp.139;
    {
      int i;

      obj.140 = (int) obj;
      obj.141 = (int) obj;
      D.24354 = obj.141 & -16384;
      D.24355 = obj.140 - D.24354;
      i = D.24355 >> 3;
      if (1 != 0) goto <D.24356>; else goto <D.24357>;
      <D.24356>:
      w = i >> 5;
      b = i & 31;
      goto <D.24358>;
      <D.24357>:
      w = i >> 6;
      b = i & 63;
      <D.24358>:
    }
    D.24359 = block->mark_words[w];
    D.24360 = 1 << b;
    D.24361 = (long unsigned int) D.24360;
    D.24362 = D.24359 & D.24361;
    marked = (gboolean) D.24362;
    if (obj == ptr) goto <D.24363>; else goto <D.24364>;
    <D.24363>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24365>; else goto <D.24366>;
    <D.24365>:
    gc_debug_file.136 = gc_debug_file;
    fprintf (gc_debug_file.136, "\t(\n");
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24366>:
    if (live != 0) goto <D.24367>; else goto <D.24368>;
    <D.24367>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24369>; else goto <D.24370>;
    <D.24369>:
    gc_debug_file.136 = gc_debug_file;
    fprintf (gc_debug_file.136, "object\n");
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24370>:
    goto <D.24371>;
    <D.24368>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24372>; else goto <D.24373>;
    <D.24372>:
    gc_debug_file.136 = gc_debug_file;
    fprintf (gc_debug_file.136, "dead-object\n");
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24373>:
    <D.24371>:
    goto <D.24374>;
    <D.24364>:
    if (live != 0) goto <D.24375>; else goto <D.24376>;
    <D.24375>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24377>; else goto <D.24378>;
    <D.24377>:
    gc_debug_file.136 = gc_debug_file;
    ptr.137 = (int) ptr;
    obj.140 = (int) obj;
    D.24379 = ptr.137 - obj.140;
    fprintf (gc_debug_file.136, "interior-ptr offset %td\n", D.24379);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24378>:
    goto <D.24380>;
    <D.24376>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24381>; else goto <D.24382>;
    <D.24381>:
    gc_debug_file.136 = gc_debug_file;
    ptr.137 = (int) ptr;
    obj.140 = (int) obj;
    D.24379 = ptr.137 - obj.140;
    fprintf (gc_debug_file.136, "dead-interior-ptr offset %td\n", D.24379);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24382>:
    <D.24380>:
    <D.24374>:
    gc_debug_level.135 = gc_debug_level;
    D.24320 = gc_debug_level.135 >= 0;
    D.24321 = (long int) D.24320;
    D.24322 = __builtin_expect (D.24321, 0);
    if (D.24322 != 0) goto <D.24383>; else goto <D.24384>;
    <D.24383>:
    gc_debug_file.136 = gc_debug_file;
    D.24385 = marked != 0;
    D.24386 = (int) D.24385;
    fprintf (gc_debug_file.136, " marked %d)\n\n", D.24386);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.24384>:
    D.24387 = vtable;
    return D.24387;
  }
  <D.21901>:
  block = block->next;
  <D.21904>:
  if (block != 0B) goto <D.21903>; else goto <D.21905>;
  <D.21905>:
  D.24387 = 0B;
  return D.24387;
}


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

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


major_is_valid_object (char * object)
{
  char * D.24393;
  char * D.24395;
  int object.142;
  char * D.24397;
  int D.24398;
  int D.24399;
  int D.24400;
  int D.24401;
  sizetype D.24402;
  sizetype D.24403;
  gboolean D.24406;
  int iftmp.143;
  void * D.24411;
  char * D.24413;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.21888>;
  <D.21887>:
  {
    int idx;
    char * obj;

    D.24393 = block->block;
    if (D.24393 > object) goto <D.24391>; else goto <D.24394>;
    <D.24394>:
    D.24393 = block->block;
    D.24395 = D.24393 + 16384;
    if (D.24395 <= object) goto <D.24391>; else goto <D.24392>;
    <D.24391>:
    // predicted unlikely by continue predictor.
    goto <D.21886>;
    <D.24392>:
    object.142 = (int) object;
    D.24393 = block->block;
    D.24397 = D.24393 + 16;
    D.24398 = (int) D.24397;
    D.24399 = object.142 - D.24398;
    D.24400 = block->obj_size;
    idx = D.24399 / D.24400;
    D.24393 = block->block;
    D.24400 = block->obj_size;
    D.24401 = D.24400 * idx;
    D.24402 = (sizetype) D.24401;
    D.24403 = D.24402 + 16;
    obj = D.24393 + D.24403;
    if (obj != object) goto <D.24404>; else goto <D.24405>;
    <D.24404>:
    D.24406 = 0;
    return D.24406;
    <D.24405>:
    D.24411 = MEM[(void * *)obj];
    if (D.24411 != 0B) goto <D.24412>; else goto <D.24408>;
    <D.24412>:
    D.24413 = MEM[(char * *)obj];
    D.24393 = block->block;
    if (D.24413 < D.24393) goto <D.24409>; else goto <D.24414>;
    <D.24414>:
    D.24413 = MEM[(char * *)obj];
    D.24393 = block->block;
    D.24395 = D.24393 + 16384;
    if (D.24413 >= D.24395) goto <D.24409>; else goto <D.24408>;
    <D.24409>:
    iftmp.143 = 1;
    goto <D.24410>;
    <D.24408>:
    iftmp.143 = 0;
    <D.24410>:
    D.24406 = iftmp.143;
    return D.24406;
  }
  <D.21886>:
  block = block->next;
  <D.21888>:
  if (block != 0B) goto <D.21887>; else goto <D.21889>;
  <D.21889>:
  D.24406 = 0;
  return D.24406;
}


post_param_init (struct SgenMajorCollector * collector)
{
  int lazy_sweep.144;

  lazy_sweep.144 = lazy_sweep;
  collector->sweeps_lazily = lazy_sweep.144;
}


major_print_gc_param_usage ()
{
  struct _IO_FILE * stderr.145;

  stderr.145 = stderr;
  fprintf (stderr.145, "  evacuation-threshold=P (where P is a percentage, an integer in 0-100)\n  (no-)lazy-sweep\n");
}


major_handle_gc_param (const char * opt)
{
  int D.24418;
  char * D.24421;
  unsigned int percentage.146;
  struct _IO_FILE * stderr.147;
  float D.24426;
  float evacuation_threshold.148;
  gboolean D.24428;
  int D.22593;
  int iftmp.149;
  int D.22592;
  const char[11] * D.24432;
  unsigned char D.24433;
  int D.24434;
  unsigned char D.24435;
  int D.24436;
  _Bool D.24437;
  _Bool D.24438;
  _Bool D.24439;
  const unsigned char * D.24442;
  unsigned char D.24443;
  int D.24444;
  const unsigned char * D.24445;
  unsigned char D.24446;
  int D.24447;
  _Bool D.24448;
  _Bool D.24449;
  const unsigned char * D.24452;
  unsigned char D.24453;
  int D.24454;
  const unsigned char * D.24455;
  unsigned char D.24456;
  int D.24457;
  _Bool D.24458;
  _Bool D.24459;
  const unsigned char * D.24462;
  unsigned char D.24463;
  int D.24464;
  const unsigned char * D.24465;
  unsigned char D.24466;
  int D.24467;
  int D.22602;
  int iftmp.150;
  int D.22601;
  const char[14] * D.24474;
  unsigned char D.24475;
  int D.24476;
  unsigned char D.24477;
  int D.24478;
  _Bool D.24479;
  _Bool D.24480;
  _Bool D.24481;
  const unsigned char * D.24484;
  unsigned char D.24485;
  int D.24486;
  const unsigned char * D.24487;
  unsigned char D.24488;
  int D.24489;
  _Bool D.24490;
  _Bool D.24491;
  const unsigned char * D.24494;
  unsigned char D.24495;
  int D.24496;
  const unsigned char * D.24497;
  unsigned char D.24498;
  int D.24499;
  _Bool D.24500;
  _Bool D.24501;
  const unsigned char * D.24504;
  unsigned char D.24505;
  int D.24506;
  const unsigned char * D.24507;
  unsigned char D.24508;
  int D.24509;

  D.24418 = monoeg_g_str_has_prefix (opt, "evacuation-threshold=");
  if (D.24418 != 0) goto <D.24419>; else goto <D.24420>;
  <D.24419>:
  {
    const char * arg;
    int percentage;

    D.24421 = __builtin_strchr (opt, 61);
    arg = D.24421 + 1;
    percentage = atoi (arg);
    percentage.146 = (unsigned int) percentage;
    if (percentage.146 > 100) goto <D.24423>; else goto <D.24424>;
    <D.24423>:
    stderr.147 = stderr;
    fprintf (stderr.147, "evacuation-threshold must be an integer in the range 0-100.\n");
    exit (1);
    <D.24424>:
    D.24426 = (float) percentage;
    evacuation_threshold.148 = D.24426 / 1.0e+2;
    evacuation_threshold = evacuation_threshold.148;
    D.24428 = 1;
    return D.24428;
  }
  <D.24420>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = opt;
      D.24432 = "lazy-sweep";
      D.24433 = MEM[(const unsigned char *)D.24432];
      D.24434 = (int) D.24433;
      D.24435 = *__s2;
      D.24436 = (int) D.24435;
      __result = D.24434 - D.24436;
      {
        D.24437 = __s2_len != 0;
        D.24438 = __result == 0;
        D.24439 = D.24437 & D.24438;
        if (D.24439 != 0) goto <D.24440>; else goto <D.24441>;
        <D.24440>:
        D.24442 = &MEM[(void *)"lazy-sweep" + 1B];
        D.24443 = *D.24442;
        D.24444 = (int) D.24443;
        D.24445 = __s2 + 1;
        D.24446 = *D.24445;
        D.24447 = (int) D.24446;
        __result = D.24444 - D.24447;
        D.24448 = __s2_len > 1;
        D.24438 = __result == 0;
        D.24449 = D.24448 & D.24438;
        if (D.24449 != 0) goto <D.24450>; else goto <D.24451>;
        <D.24450>:
        D.24452 = &MEM[(void *)"lazy-sweep" + 2B];
        D.24453 = *D.24452;
        D.24454 = (int) D.24453;
        D.24455 = __s2 + 2;
        D.24456 = *D.24455;
        D.24457 = (int) D.24456;
        __result = D.24454 - D.24457;
        D.24458 = __s2_len > 2;
        D.24438 = __result == 0;
        D.24459 = D.24458 & D.24438;
        if (D.24459 != 0) goto <D.24460>; else goto <D.24461>;
        <D.24460>:
        D.24462 = &MEM[(void *)"lazy-sweep" + 3B];
        D.24463 = *D.24462;
        D.24464 = (int) D.24463;
        D.24465 = __s2 + 3;
        D.24466 = *D.24465;
        D.24467 = (int) D.24466;
        __result = D.24464 - D.24467;
        <D.24461>:
        <D.24451>:
        <D.24441>:
      }
      D.22592 = __result;
    }
    iftmp.149 = -D.22592;
    goto <D.24468>;
    <D.24431>:
    iftmp.149 = __builtin_strcmp (opt, "lazy-sweep");
    <D.24468>:
    D.22593 = iftmp.149;
  }
  if (D.22593 == 0) goto <D.24469>; else goto <D.24470>;
  <D.24469>:
  lazy_sweep = 1;
  D.24428 = 1;
  return D.24428;
  <D.24470>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = opt;
      D.24474 = "no-lazy-sweep";
      D.24475 = MEM[(const unsigned char *)D.24474];
      D.24476 = (int) D.24475;
      D.24477 = *__s2;
      D.24478 = (int) D.24477;
      __result = D.24476 - D.24478;
      {
        D.24479 = __s2_len != 0;
        D.24480 = __result == 0;
        D.24481 = D.24479 & D.24480;
        if (D.24481 != 0) goto <D.24482>; else goto <D.24483>;
        <D.24482>:
        D.24484 = &MEM[(void *)"no-lazy-sweep" + 1B];
        D.24485 = *D.24484;
        D.24486 = (int) D.24485;
        D.24487 = __s2 + 1;
        D.24488 = *D.24487;
        D.24489 = (int) D.24488;
        __result = D.24486 - D.24489;
        D.24490 = __s2_len > 1;
        D.24480 = __result == 0;
        D.24491 = D.24490 & D.24480;
        if (D.24491 != 0) goto <D.24492>; else goto <D.24493>;
        <D.24492>:
        D.24494 = &MEM[(void *)"no-lazy-sweep" + 2B];
        D.24495 = *D.24494;
        D.24496 = (int) D.24495;
        D.24497 = __s2 + 2;
        D.24498 = *D.24497;
        D.24499 = (int) D.24498;
        __result = D.24496 - D.24499;
        D.24500 = __s2_len > 2;
        D.24480 = __result == 0;
        D.24501 = D.24500 & D.24480;
        if (D.24501 != 0) goto <D.24502>; else goto <D.24503>;
        <D.24502>:
        D.24504 = &MEM[(void *)"no-lazy-sweep" + 3B];
        D.24505 = *D.24504;
        D.24506 = (int) D.24505;
        D.24507 = __s2 + 3;
        D.24508 = *D.24507;
        D.24509 = (int) D.24508;
        __result = D.24506 - D.24509;
        <D.24503>:
        <D.24493>:
        <D.24483>:
      }
      D.22601 = __result;
    }
    iftmp.150 = -D.22601;
    goto <D.24510>;
    <D.24473>:
    iftmp.150 = __builtin_strcmp (opt, "no-lazy-sweep");
    <D.24510>:
    D.22602 = iftmp.150;
  }
  if (D.22602 == 0) goto <D.24511>; else goto <D.24512>;
  <D.24511>:
  lazy_sweep = 0;
  D.24428 = 1;
  return D.24428;
  <D.24512>:
  D.24428 = 0;
  return D.24428;
}


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

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


get_num_major_sections ()
{
  int D.24516;

  D.24516 = num_major_sections;
  return D.24516;
}


major_report_pinned_memory_usage ()
{
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-marksweep.c", 2077);
}


obj_is_from_pinned_alloc (char * ptr)
{
  char * D.24518;
  char * D.24521;
  gboolean D.24524;
  <unnamed-unsigned:1> D.24525;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.21782>;
  <D.21781>:
  D.24518 = block->block;
  if (D.24518 <= ptr) goto <D.24519>; else goto <D.24520>;
  <D.24519>:
  D.24518 = block->block;
  D.24521 = D.24518 + 16384;
  if (D.24521 >= ptr) goto <D.24522>; else goto <D.24523>;
  <D.24522>:
  D.24525 = block->pinned;
  D.24524 = (gboolean) D.24525;
  return D.24524;
  <D.24523>:
  <D.24520>:
  block = block->next;
  <D.21782>:
  if (block != 0B) goto <D.21781>; else goto <D.21783>;
  <D.21783>:
  D.24524 = 0;
  return D.24524;
}


major_ptr_is_in_non_pinned_space (char * ptr, char * * start)
{
  char * D.24527;
  char * D.24530;
  int D.24533;
  int D.24534;
  sizetype D.24535;
  sizetype D.24536;
  char * D.24537;
  int D.24540;
  int D.24541;
  sizetype D.24542;
  sizetype D.24543;
  char * D.24544;
  gboolean D.24547;
  unsigned char D.24548;
  unsigned char D.24549;
  _Bool D.24550;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.21861>;
  <D.21860>:
  D.24527 = block->block;
  if (D.24527 <= ptr) goto <D.24528>; else goto <D.24529>;
  <D.24528>:
  D.24527 = block->block;
  D.24530 = D.24527 + 16384;
  if (D.24530 >= ptr) goto <D.24531>; else goto <D.24532>;
  <D.24531>:
  {
    int count;
    int i;

    D.24533 = block->obj_size;
    count = 16368 / D.24533;
    *start = 0B;
    i = 0;
    goto <D.21859>;
    <D.21858>:
    D.24527 = block->block;
    D.24533 = block->obj_size;
    D.24534 = D.24533 * i;
    D.24535 = (sizetype) D.24534;
    D.24536 = D.24535 + 16;
    D.24537 = D.24527 + D.24536;
    if (D.24537 <= ptr) goto <D.24538>; else goto <D.24539>;
    <D.24538>:
    D.24527 = block->block;
    D.24533 = block->obj_size;
    D.24540 = i + 1;
    D.24541 = D.24533 * D.24540;
    D.24542 = (sizetype) D.24541;
    D.24543 = D.24542 + 16;
    D.24544 = D.24527 + D.24543;
    if (D.24544 > ptr) goto <D.24545>; else goto <D.24546>;
    <D.24545>:
    D.24527 = block->block;
    D.24533 = block->obj_size;
    D.24534 = D.24533 * i;
    D.24535 = (sizetype) D.24534;
    D.24536 = D.24535 + 16;
    D.24537 = D.24527 + D.24536;
    *start = D.24537;
    goto <D.21857>;
    <D.24546>:
    <D.24539>:
    i = i + 1;
    <D.21859>:
    if (i <= count) goto <D.21858>; else goto <D.21857>;
    <D.21857>:
    D.24548 = BIT_FIELD_REF <*block, 8, 96>;
    D.24549 = D.24548 & 1;
    D.24550 = D.24549 == 0;
    D.24547 = (gboolean) D.24550;
    return D.24547;
  }
  <D.24532>:
  <D.24529>:
  block = block->next;
  <D.21861>:
  if (block != 0B) goto <D.21860>; else goto <D.21862>;
  <D.21862>:
  D.24547 = 0;
  return D.24547;
}


major_have_computer_minor_collection_allowance ()
{
  unsigned int D.24552;
  unsigned int D.24553;
  int have_swept.151;
  _Bool D.24555;
  long int D.24556;
  long int D.24557;
  int num_empty_blocks.152;
  _Bool D.24563;
  long int D.24564;
  long int D.24565;
  unsigned int num_empty_blocks_orig.153;
  unsigned int D.24569;
  int i.154;
  unsigned int i.155;
  unsigned int D.24573;
  void * * D.24574;
  _Bool D.24575;
  long int D.24576;
  long int D.24577;
  unsigned int num_empty_blocks.156;
  unsigned int i.157;
  unsigned int D.24582;
  void * * D.24583;
  _Bool D.24584;
  long int D.24585;
  long int D.24586;
  unsigned int dest.158;
  unsigned int D.24592;
  void * * D.24593;
  _Bool D.24596;
  _Bool D.24597;
  _Bool D.24598;
  int D.24599;
  _Bool D.24600;
  long int D.24601;
  long int D.24602;
  sizetype d.159;
  sizetype D.24606;
  sizetype D.24607;
  void * * D.24608;
  void * D.24609;
  char * D.24610;
  int D.24613;
  int D.24614;
  unsigned int first.160;
  unsigned int D.24618;
  void * * D.24619;
  void * D.24620;
  int D.24621;
  unsigned int D.24622;
  unsigned int j.161;
  unsigned int D.24624;
  void * * D.24625;
  int num_empty_blocks.162;
  long long int D.24627;
  long long int stat_major_blocks_freed.163;
  long long int stat_major_blocks_freed.164;
  long long int stat_major_blocks_freed_ideal.165;
  long long int stat_major_blocks_freed_ideal.166;
  long long int stat_major_blocks_freed_less_ideal.167;
  long long int stat_major_blocks_freed_less_ideal.168;
  _Bool D.24637;
  _Bool D.24638;
  _Bool D.24639;
  int D.24640;
  _Bool D.24641;
  long int D.24642;
  long int D.24643;
  _Bool D.24646;
  long int D.24647;
  long int D.24648;
  _Bool D.24652;
  long int D.24653;
  long int D.24654;
  _Bool D.24657;
  long int D.24658;
  long int D.24659;
  int num_major_sections.169;
  void * empty_blocks.170;
  int num_empty_blocks.171;
  long long int stat_major_blocks_freed.172;
  long long int stat_major_blocks_freed_individual.173;
  long long int stat_major_blocks_freed_individual.174;
  int section_reserve;
  void fallback = <<< error >>>;

  D.24552 = sgen_get_minor_collection_allowance ();
  D.24553 = D.24552 / 16384;
  section_reserve = (int) D.24553;
  have_swept.151 = have_swept;
  D.24555 = have_swept.151 == 0;
  D.24556 = (long int) D.24555;
  D.24557 = __builtin_expect (D.24556, 0);
  if (D.24557 != 0) goto <D.24558>; else goto <D.24559>;
  <D.24558>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1898, "have_swept");
  <D.24559>:
  {
    int i;
    int num_empty_blocks_orig;
    int num_blocks;
    int arr_length;
    void * block;
    void * * empty_block_arr;
    void * * rebuild_next;

    num_empty_blocks.152 = num_empty_blocks;
    if (num_empty_blocks.152 <= section_reserve) goto <D.24561>; else goto <D.24562>;
    <D.24561>:
    return;
    <D.24562>:
    num_empty_blocks.152 = num_empty_blocks;
    D.24563 = num_empty_blocks.152 <= 0;
    D.24564 = (long int) D.24563;
    D.24565 = __builtin_expect (D.24564, 0);
    if (D.24565 != 0) goto <D.24566>; else goto <D.24567>;
    <D.24566>:
    monoeg_g_log (0B, 4, "section reserve can\'t be negative");
    <D.22509>:
    goto <D.22509>;
    <D.24567>:
    num_empty_blocks_orig = num_empty_blocks;
    num_empty_blocks_orig.153 = (unsigned int) num_empty_blocks_orig;
    D.24569 = num_empty_blocks_orig.153 * 4;
    empty_block_arr = sgen_alloc_internal_dynamic (D.24569, 17, 0);
    if (empty_block_arr == 0B) goto fallback; else goto <D.24570>;
    <D.24570>:
    i = 0;
    block = empty_blocks;
    goto <D.22512>;
    <D.22511>:
    i.154 = i;
    i = i.154 + 1;
    i.155 = (unsigned int) i.154;
    D.24573 = i.155 * 4;
    D.24574 = empty_block_arr + D.24573;
    *D.24574 = block;
    block = MEM[(void * *)block];
    <D.22512>:
    if (block != 0B) goto <D.22511>; else goto <D.22513>;
    <D.22513>:
    num_empty_blocks.152 = num_empty_blocks;
    D.24575 = i != num_empty_blocks.152;
    D.24576 = (long int) D.24575;
    D.24577 = __builtin_expect (D.24576, 0);
    if (D.24577 != 0) goto <D.24578>; else goto <D.24579>;
    <D.24578>:
    monoeg_g_log (0B, 4, "empty block count wrong");
    <D.22514>:
    goto <D.22514>;
    <D.24579>:
    num_empty_blocks.152 = num_empty_blocks;
    num_empty_blocks.156 = (unsigned int) num_empty_blocks.152;
    sgen_qsort (empty_block_arr, num_empty_blocks.156, 4, compare_pointers);
    arr_length = num_empty_blocks_orig;
    num_blocks = 32;
    goto <D.22532>;
    <D.22531>:
    {
      int first;
      int dest;

      first = -1;
      dest = 0;
      dest = 0;
      i = 0;
      goto <D.22527>;
      <D.22526>:
      {
        int d;
        void * block;

        d = dest;
        i.157 = (unsigned int) i;
        D.24582 = i.157 * 4;
        D.24583 = empty_block_arr + D.24582;
        block = *D.24583;
        D.24584 = block == 0B;
        D.24585 = (long int) D.24584;
        D.24586 = __builtin_expect (D.24585, 0);
        if (D.24586 != 0) goto <D.24587>; else goto <D.24588>;
        <D.24587>:
        monoeg_g_log (0B, 4, "we\'re not shifting correctly");
        <D.22519>:
        goto <D.22519>;
        <D.24588>:
        if (i != dest) goto <D.24589>; else goto <D.24590>;
        <D.24589>:
        dest.158 = (unsigned int) dest;
        D.24592 = dest.158 * 4;
        D.24593 = empty_block_arr + D.24592;
        *D.24593 = block;
        i.157 = (unsigned int) i;
        D.24582 = i.157 * 4;
        D.24583 = empty_block_arr + D.24582;
        *D.24583 = 0B;
        <D.24590>:
        dest = dest + 1;
        if (first < 0) goto <D.24594>; else goto <D.24595>;
        <D.24594>:
        first = d;
        // predicted unlikely by continue predictor.
        goto <D.22520>;
        <D.24595>:
        D.24596 = first < 0;
        D.24597 = d <= first;
        D.24598 = D.24596 | D.24597;
        D.24599 = (int) D.24598;
        D.24600 = D.24599 != 0;
        D.24601 = (long int) D.24600;
        D.24602 = __builtin_expect (D.24601, 0);
        if (D.24602 != 0) goto <D.24603>; else goto <D.24604>;
        <D.24603>:
        monoeg_g_log (0B, 4, "algorithm is wrong");
        <D.22521>:
        goto <D.22521>;
        <D.24604>:
        d.159 = (sizetype) d;
        D.24606 = d.159 + 1073741823;
        D.24607 = D.24606 * 4;
        D.24608 = empty_block_arr + D.24607;
        D.24609 = *D.24608;
        D.24610 = D.24609 + 16384;
        if (D.24610 != block) goto <D.24611>; else goto <D.24612>;
        <D.24611>:
        first = d;
        // predicted unlikely by continue predictor.
        goto <D.22520>;
        <D.24612>:
        D.24613 = d + 1;
        D.24614 = D.24613 - first;
        if (D.24614 == num_blocks) goto <D.24615>; else goto <D.24616>;
        <D.24615>:
        {
          int j;

          first.160 = (unsigned int) first;
          D.24618 = first.160 * 4;
          D.24619 = empty_block_arr + D.24618;
          D.24620 = *D.24619;
          D.24621 = num_blocks * 16384;
          D.24622 = (unsigned int) D.24621;
          sgen_free_os_memory (D.24620, D.24622, 1);
          j = first;
          goto <D.22524>;
          <D.22523>:
          j.161 = (unsigned int) j;
          D.24624 = j.161 * 4;
          D.24625 = empty_block_arr + D.24624;
          *D.24625 = 0B;
          j = j + 1;
          <D.22524>:
          if (j <= d) goto <D.22523>; else goto <D.22525>;
          <D.22525>:
          dest = first;
          first = -1;
          num_empty_blocks.152 = num_empty_blocks;
          num_empty_blocks.162 = num_empty_blocks.152 - num_blocks;
          num_empty_blocks = num_empty_blocks.162;
          D.24627 = (long long int) num_blocks;
          stat_major_blocks_freed.163 = stat_major_blocks_freed;
          stat_major_blocks_freed.164 = D.24627 + stat_major_blocks_freed.163;
          stat_major_blocks_freed = stat_major_blocks_freed.164;
          if (num_blocks == 32) goto <D.24630>; else goto <D.24631>;
          <D.24630>:
          D.24627 = (long long int) num_blocks;
          stat_major_blocks_freed_ideal.165 = stat_major_blocks_freed_ideal;
          stat_major_blocks_freed_ideal.166 = D.24627 + stat_major_blocks_freed_ideal.165;
          stat_major_blocks_freed_ideal = stat_major_blocks_freed_ideal.166;
          goto <D.24634>;
          <D.24631>:
          D.24627 = (long long int) num_blocks;
          stat_major_blocks_freed_less_ideal.167 = stat_major_blocks_freed_less_ideal;
          stat_major_blocks_freed_less_ideal.168 = D.24627 + stat_major_blocks_freed_less_ideal.167;
          stat_major_blocks_freed_less_ideal = stat_major_blocks_freed_less_ideal.168;
          <D.24634>:
        }
        <D.24616>:
      }
      <D.22520>:
      i = i + 1;
      <D.22527>:
      if (i < arr_length) goto <D.22526>; else goto <D.22528>;
      <D.22528>:
      D.24637 = dest > i;
      D.24638 = dest > arr_length;
      D.24639 = D.24637 | D.24638;
      D.24640 = (int) D.24639;
      D.24641 = D.24640 != 0;
      D.24642 = (long int) D.24641;
      D.24643 = __builtin_expect (D.24642, 0);
      if (D.24643 != 0) goto <D.24644>; else goto <D.24645>;
      <D.24644>:
      monoeg_g_log (0B, 4, "array length is off");
      <D.22529>:
      goto <D.22529>;
      <D.24645>:
      arr_length = dest;
      num_empty_blocks.152 = num_empty_blocks;
      D.24646 = arr_length != num_empty_blocks.152;
      D.24647 = (long int) D.24646;
      D.24648 = __builtin_expect (D.24647, 0);
      if (D.24648 != 0) goto <D.24649>; else goto <D.24650>;
      <D.24649>:
      monoeg_g_log (0B, 4, "array length is off");
      <D.22530>:
      goto <D.22530>;
      <D.24650>:
      num_blocks = num_blocks >> 1;
    }
    <D.22532>:
    num_empty_blocks.152 = num_empty_blocks;
    if (num_empty_blocks.152 > section_reserve) goto <D.24651>; else goto <D.22533>;
    <D.24651>:
    if (num_blocks > 1) goto <D.22531>; else goto <D.22533>;
    <D.22533>:
    rebuild_next = &empty_blocks;
    i = 0;
    goto <D.22537>;
    <D.22536>:
    {
      void * block;

      i.157 = (unsigned int) i;
      D.24582 = i.157 * 4;
      D.24583 = empty_block_arr + D.24582;
      block = *D.24583;
      D.24652 = block == 0B;
      D.24653 = (long int) D.24652;
      D.24654 = __builtin_expect (D.24653, 0);
      if (D.24654 != 0) goto <D.24655>; else goto <D.24656>;
      <D.24655>:
      monoeg_g_log (0B, 4, "we\'re missing blocks");
      <D.22535>:
      goto <D.22535>;
      <D.24656>:
      *rebuild_next = block;
      rebuild_next = block;
    }
    i = i + 1;
    <D.22537>:
    if (i < arr_length) goto <D.22536>; else goto <D.22538>;
    <D.22538>:
    *rebuild_next = 0B;
    num_empty_blocks_orig.153 = (unsigned int) num_empty_blocks_orig;
    D.24569 = num_empty_blocks_orig.153 * 4;
    sgen_free_internal_dynamic (empty_block_arr, D.24569, 17);
  }
  num_empty_blocks.152 = num_empty_blocks;
  D.24657 = num_empty_blocks.152 < 0;
  D.24658 = (long int) D.24657;
  D.24659 = __builtin_expect (D.24658, 0);
  if (D.24659 != 0) goto <D.24660>; else goto <D.24661>;
  <D.24660>:
  monoeg_g_log (0B, 4, "we freed more blocks than we had in the first place?");
  <D.22539>:
  goto <D.22539>;
  <D.24661>:
  fallback:
  num_empty_blocks.152 = num_empty_blocks;
  num_major_sections.169 = num_major_sections;
  if (num_empty_blocks.152 <= num_major_sections.169) goto <D.24663>; else goto <D.24664>;
  <D.24663>:
  return;
  <D.24664>:
  goto <D.22542>;
  <D.22541>:
  {
    void * next;

    empty_blocks.170 = empty_blocks;
    next = MEM[(void * *)empty_blocks.170];
    empty_blocks.170 = empty_blocks;
    sgen_free_os_memory (empty_blocks.170, 16384, 1);
    empty_blocks = next;
    num_empty_blocks.152 = num_empty_blocks;
    num_empty_blocks.171 = num_empty_blocks.152 + -1;
    num_empty_blocks = num_empty_blocks.171;
    stat_major_blocks_freed.163 = stat_major_blocks_freed;
    stat_major_blocks_freed.172 = stat_major_blocks_freed.163 + 1;
    stat_major_blocks_freed = stat_major_blocks_freed.172;
    stat_major_blocks_freed_individual.173 = stat_major_blocks_freed_individual;
    stat_major_blocks_freed_individual.174 = stat_major_blocks_freed_individual.173 + 1;
    stat_major_blocks_freed_individual = stat_major_blocks_freed_individual.174;
  }
  <D.22542>:
  num_empty_blocks.152 = num_empty_blocks;
  if (num_empty_blocks.152 > section_reserve) goto <D.22541>; else goto <D.22543>;
  <D.22543>:
}


compare_pointers (const void * va, const void * vb)
{
  int D.24673;
  char * a;
  char * b;

  a = MEM[(char * *)va];
  b = MEM[(char * *)vb];
  if (a < b) goto <D.24671>; else goto <D.24672>;
  <D.24671>:
  D.24673 = -1;
  return D.24673;
  <D.24672>:
  if (a > b) goto <D.24674>; else goto <D.24675>;
  <D.24674>:
  D.24673 = 1;
  return D.24673;
  <D.24675>:
  D.24673 = 0;
  return D.24673;
}


major_finish_major_collection ()
{

}


major_start_major_collection ()
{
  gboolean * evacuate_block_obj_sizes.175;
  unsigned int i.176;
  unsigned int D.24679;
  gboolean * D.24680;
  int D.24681;
  struct MSBlockInfo * * D.24684;
  struct MSBlockInfo * * D.24685;
  struct MSBlockInfo * * D.24686;
  struct MSBlockInfo * * D.24687;
  int num_block_obj_sizes.177;
  int lazy_sweep.178;
  struct MSBlockInfo * D.24692;
  int i;

  i = 0;
  goto <D.22482>;
  <D.22481>:
  evacuate_block_obj_sizes.175 = evacuate_block_obj_sizes;
  i.176 = (unsigned int) i;
  D.24679 = i.176 * 4;
  D.24680 = evacuate_block_obj_sizes.175 + D.24679;
  D.24681 = *D.24680;
  if (D.24681 == 0) goto <D.24682>; else goto <D.24683>;
  <D.24682>:
  // predicted unlikely by continue predictor.
  goto <D.22480>;
  <D.24683>:
  D.24684 = free_block_lists[0];
  i.176 = (unsigned int) i;
  D.24679 = i.176 * 4;
  D.24685 = D.24684 + D.24679;
  *D.24685 = 0B;
  D.24686 = free_block_lists[2];
  i.176 = (unsigned int) i;
  D.24679 = i.176 * 4;
  D.24687 = D.24686 + D.24679;
  *D.24687 = 0B;
  <D.22480>:
  i = i + 1;
  <D.22482>:
  num_block_obj_sizes.177 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.177) goto <D.22481>; else goto <D.22483>;
  <D.22483>:
  lazy_sweep.178 = lazy_sweep;
  if (lazy_sweep.178 != 0) goto <D.24690>; else goto <D.24691>;
  <D.24690>:
  {
    struct MSBlockInfo * * iter;

    iter = &all_blocks;
    goto <D.22487>;
    <D.22486>:
    {
      struct MSBlockInfo * block;

      block = *iter;
      sweep_block (block, 1);
      iter = &block->next;
    }
    <D.22487>:
    D.24692 = *iter;
    if (D.24692 != 0B) goto <D.22486>; else goto <D.22488>;
    <D.22488>:
  }
  <D.24691>:
}


sweep_block (struct MSBlockInfo * block, gboolean during_major_collection)
{
  int D.24695;
  _Bool D.24696;
  long int D.24697;
  long int D.24698;
  unsigned char D.24701;
  unsigned char D.24702;
  int D.24705;
  mword[64] * D.24706;
  void * * D.24707;
  int count;
  void * reversed;

  reversed = 0B;
  if (during_major_collection == 0) goto <D.24693>; else goto <D.24694>;
  <D.24693>:
  D.24695 = sgen_concurrent_collection_in_progress ();
  D.24696 = D.24695 != 0;
  D.24697 = (long int) D.24696;
  D.24698 = __builtin_expect (D.24697, 0);
  if (D.24698 != 0) goto <D.24699>; else goto <D.24700>;
  <D.24699>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1551, "!sgen_concurrent_collection_in_progress ()");
  <D.24700>:
  <D.24694>:
  D.24701 = BIT_FIELD_REF <*block, 8, 96>;
  D.24702 = D.24701 & 16;
  if (D.24702 != 0) goto <D.24703>; else goto <D.24704>;
  <D.24703>:
  return;
  <D.24704>:
  D.24705 = block->obj_size;
  count = 16368 / D.24705;
  block->free_list = 0B;
  D.24705 = block->obj_size;
  switch (D.24705) <default: <D.22385>, case 16: <D.22383>>
  <D.22383>:
  sweep_block_for_size (block, count, 16);
  goto <D.22384>;
  <D.22385>:
  D.24705 = block->obj_size;
  sweep_block_for_size (block, count, D.24705);
  goto <D.22384>;
  <D.22384>:
  D.24706 = &block->mark_words;
  memset (D.24706, 0, 256);
  reversed = 0B;
  goto <D.22388>;
  <D.22387>:
  {
    void * next;

    D.24707 = block->free_list;
    next = *D.24707;
    D.24707 = block->free_list;
    *D.24707 = reversed;
    reversed = block->free_list;
    block->free_list = next;
  }
  <D.22388>:
  D.24707 = block->free_list;
  if (D.24707 != 0B) goto <D.22387>; else goto <D.22389>;
  <D.22389>:
  block->free_list = reversed;
  block->swept = 1;
}


sweep_block_for_size (struct MSBlockInfo * block, int count, int obj_size)
{
  char * D.24709;
  int D.24710;
  sizetype D.24711;
  sizetype D.24712;
  int obj.179;
  int obj.180;
  int D.24715;
  int D.24716;
  unsigned int D.24720;
  long int D.24721;
  long unsigned int D.24722;
  long unsigned int D.24723;
  void * D.24731;
  char * D.24734;
  char * D.24736;
  unsigned int obj_size.181;
  void * * D.24738;
  int obj_index;

  obj_index = 0;
  goto <D.22375>;
  <D.22374>:
  {
    int word;
    int bit;
    void * obj;

    D.24709 = block->block;
    D.24710 = obj_size * obj_index;
    D.24711 = (sizetype) D.24710;
    D.24712 = D.24711 + 16;
    obj = D.24709 + D.24712;
    {
      int i;

      obj.179 = (int) obj;
      obj.180 = (int) obj;
      D.24715 = obj.180 & -16384;
      D.24716 = obj.179 - D.24715;
      i = D.24716 >> 3;
      if (1 != 0) goto <D.24717>; else goto <D.24718>;
      <D.24717>:
      word = i >> 5;
      bit = i & 31;
      goto <D.24719>;
      <D.24718>:
      word = i >> 6;
      bit = i & 63;
      <D.24719>:
    }
    D.24720 = block->mark_words[word];
    D.24721 = 1 << bit;
    D.24722 = (long unsigned int) D.24721;
    D.24723 = D.24720 & D.24722;
    if (D.24723 != 0) goto <D.24724>; else goto <D.24725>;
    <D.24724>:
    if (0 != 0) goto <D.24726>; else goto <D.24727>;
    <D.24726>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.22373>:
    goto <D.22373>;
    <D.24727>:
    goto <D.24728>;
    <D.24725>:
    D.24731 = MEM[(void * *)obj];
    if (D.24731 != 0B) goto <D.24732>; else goto <D.24733>;
    <D.24732>:
    D.24734 = MEM[(char * *)obj];
    D.24709 = block->block;
    if (D.24734 < D.24709) goto <D.24729>; else goto <D.24735>;
    <D.24735>:
    D.24734 = MEM[(char * *)obj];
    D.24709 = block->block;
    D.24736 = D.24709 + 16384;
    if (D.24734 >= D.24736) goto <D.24729>; else goto <D.24730>;
    <D.24729>:
    obj_size.181 = (unsigned int) obj_size;
    memset (obj, 0, obj_size.181);
    <D.24730>:
    <D.24733>:
    D.24738 = block->free_list;
    MEM[(void * *)obj] = D.24738;
    block->free_list = obj;
    <D.24728>:
  }
  obj_index = obj_index + 1;
  <D.22375>:
  if (obj_index < count) goto <D.22374>; else goto <D.22376>;
  <D.22376>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.24741;
  int D.24746;
  void * D.24748;
  unsigned int D.24749;

  D.24741 = __builtin_constant_p (__len);
  if (D.24741 != 0) goto <D.24742>; else goto <D.24743>;
  <D.24742>:
  if (__len == 0) goto <D.24744>; else goto <D.24745>;
  <D.24744>:
  D.24746 = __builtin_constant_p (__ch);
  if (D.24746 == 0) goto <D.24739>; else goto <D.24747>;
  <D.24747>:
  if (__ch != 0) goto <D.24739>; else goto <D.24740>;
  <D.24739>:
  __warn_memset_zero_len ();
  D.24748 = __dest;
  return D.24748;
  <D.24740>:
  <D.24745>:
  <D.24743>:
  D.24749 = __builtin_object_size (__dest, 0);
  D.24748 = __builtin___memset_chk (__dest, __ch, __len, D.24749);
  return D.24748;
}


major_finish_nursery_collection ()
{
  int num_major_sections.182;
  int old_num_major_sections.183;
  int D.24753;

  num_major_sections.182 = num_major_sections;
  old_num_major_sections.183 = old_num_major_sections;
  D.24753 = num_major_sections.182 - old_num_major_sections.183;
  sgen_register_major_sections_alloced (D.24753);
}


major_start_nursery_collection ()
{
  int num_major_sections.184;

  num_major_sections.184 = num_major_sections;
  old_num_major_sections = num_major_sections.184;
}


major_get_used_size ()
{
  int D.24755;
  int D.24756;
  long long int D.24757;
  long long int D.24758;
  gint64 D.24759;
  gint64 size;
  struct MSBlockInfo * block;

  size = 0;
  block = all_blocks;
  goto <D.22575>;
  <D.22574>:
  {
    int count;
    void * * iter;

    D.24755 = block->obj_size;
    count = 16368 / D.24755;
    D.24755 = block->obj_size;
    D.24756 = D.24755 * count;
    D.24757 = (long long int) D.24756;
    size = D.24757 + size;
    iter = block->free_list;
    goto <D.22572>;
    <D.22571>:
    D.24755 = block->obj_size;
    D.24758 = (long long int) D.24755;
    size = size - D.24758;
    iter = *iter;
    <D.22572>:
    if (iter != 0B) goto <D.22571>; else goto <D.22573>;
    <D.22573>:
  }
  block = block->next;
  <D.22575>:
  if (block != 0B) goto <D.22574>; else goto <D.22576>;
  <D.22576>:
  D.24759 = size;
  return D.24759;
}


major_dump_heap (struct FILE * heap_dump_file)
{
  int num_block_obj_sizes.185;
  unsigned int num_block_obj_sizes.186;
  unsigned int D.24763;
  unsigned int i.187;
  unsigned int D.24765;
  int * D.24766;
  int * D.24767;
  int D.24768;
  int D.24769;
  unsigned int index.188;
  unsigned int D.24771;
  int * D.24772;
  int D.24773;
  int D.24774;
  char * D.24777;
  int D.24778;
  sizetype D.24779;
  sizetype D.24780;
  char * D.24781;
  void * D.24782;
  char * D.24785;
  char * D.24787;
  int * D.24788;
  int D.24789;
  int D.24790;
  int * block_obj_sizes.189;
  int * D.24792;
  int D.24793;
  int D.24794;
  int D.24799;
  sizetype D.24800;
  sizetype D.24801;
  char * D.24802;
  void * D.24803;
  char * D.24805;
  int D.24811;
  sizetype D.24812;
  sizetype D.24813;
  char * D.24814;
  struct MSBlockInfo * block;
  int * slots_available;
  int * slots_used;
  int i;

  num_block_obj_sizes.185 = num_block_obj_sizes;
  num_block_obj_sizes.186 = (unsigned int) num_block_obj_sizes.185;
  D.24763 = num_block_obj_sizes.186 * 4;
  slots_available = __builtin_alloca (D.24763);
  num_block_obj_sizes.185 = num_block_obj_sizes;
  num_block_obj_sizes.186 = (unsigned int) num_block_obj_sizes.185;
  D.24763 = num_block_obj_sizes.186 * 4;
  slots_used = __builtin_alloca (D.24763);
  i = 0;
  goto <D.21917>;
  <D.21916>:
  i.187 = (unsigned int) i;
  D.24765 = i.187 * 4;
  D.24766 = slots_available + D.24765;
  i.187 = (unsigned int) i;
  D.24765 = i.187 * 4;
  D.24767 = slots_used + D.24765;
  *D.24767 = 0;
  D.24768 = *D.24767;
  *D.24766 = D.24768;
  i = i + 1;
  <D.21917>:
  num_block_obj_sizes.185 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.185) goto <D.21916>; else goto <D.21918>;
  <D.21918>:
  block = all_blocks;
  goto <D.21925>;
  <D.21924>:
  {
    int index;
    int count;

    D.24769 = block->obj_size;
    index = ms_find_block_obj_size_index (D.24769);
    D.24769 = block->obj_size;
    count = 16368 / D.24769;
    index.188 = (unsigned int) index;
    D.24771 = index.188 * 4;
    D.24772 = slots_available + D.24771;
    index.188 = (unsigned int) index;
    D.24771 = index.188 * 4;
    D.24772 = slots_available + D.24771;
    D.24773 = *D.24772;
    D.24774 = D.24773 + count;
    *D.24772 = D.24774;
    i = 0;
    goto <D.21922>;
    <D.21921>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24778 = D.24769 * i;
    D.24779 = (sizetype) D.24778;
    D.24780 = D.24779 + 16;
    D.24781 = D.24777 + D.24780;
    D.24782 = MEM[(void * *)D.24781];
    if (D.24782 != 0B) goto <D.24783>; else goto <D.24784>;
    <D.24783>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24778 = D.24769 * i;
    D.24779 = (sizetype) D.24778;
    D.24780 = D.24779 + 16;
    D.24781 = D.24777 + D.24780;
    D.24785 = MEM[(char * *)D.24781];
    D.24777 = block->block;
    if (D.24785 < D.24777) goto <D.24775>; else goto <D.24786>;
    <D.24786>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24778 = D.24769 * i;
    D.24779 = (sizetype) D.24778;
    D.24780 = D.24779 + 16;
    D.24781 = D.24777 + D.24780;
    D.24785 = MEM[(char * *)D.24781];
    D.24777 = block->block;
    D.24787 = D.24777 + 16384;
    if (D.24785 >= D.24787) goto <D.24775>; else goto <D.24776>;
    <D.24775>:
    index.188 = (unsigned int) index;
    D.24771 = index.188 * 4;
    D.24788 = slots_used + D.24771;
    D.24789 = *D.24788;
    D.24790 = D.24789 + 1;
    *D.24788 = D.24790;
    <D.24776>:
    <D.24784>:
    i = i + 1;
    <D.21922>:
    if (i < count) goto <D.21921>; else goto <D.21923>;
    <D.21923>:
  }
  block = block->next;
  <D.21925>:
  if (block != 0B) goto <D.21924>; else goto <D.21926>;
  <D.21926>:
  fprintf (heap_dump_file, "<occupancies>\n");
  i = 0;
  goto <D.21928>;
  <D.21927>:
  block_obj_sizes.189 = block_obj_sizes;
  i.187 = (unsigned int) i;
  D.24765 = i.187 * 4;
  D.24792 = block_obj_sizes.189 + D.24765;
  D.24793 = *D.24792;
  i.187 = (unsigned int) i;
  D.24765 = i.187 * 4;
  D.24766 = slots_available + D.24765;
  D.24794 = *D.24766;
  i.187 = (unsigned int) i;
  D.24765 = i.187 * 4;
  D.24767 = slots_used + D.24765;
  D.24768 = *D.24767;
  fprintf (heap_dump_file, "<occupancy size=\"%d\" available=\"%d\" used=\"%d\" />\n", D.24793, D.24794, D.24768);
  i = i + 1;
  <D.21928>:
  num_block_obj_sizes.185 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.185) goto <D.21927>; else goto <D.21929>;
  <D.21929>:
  fprintf (heap_dump_file, "</occupancies>\n");
  block = all_blocks;
  goto <D.21937>;
  <D.21936>:
  {
    int count;
    int i;
    int start;

    D.24769 = block->obj_size;
    count = 16368 / D.24769;
    start = -1;
    fprintf (heap_dump_file, "<section type=\"%s\" size=\"%zu\">\n", "old", 16368);
    i = 0;
    goto <D.21934>;
    <D.21933>:
    if (i < count) goto <D.24798>; else goto <D.24795>;
    <D.24798>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24799 = D.24769 * i;
    D.24800 = (sizetype) D.24799;
    D.24801 = D.24800 + 16;
    D.24802 = D.24777 + D.24801;
    D.24803 = MEM[(void * *)D.24802];
    if (D.24803 != 0B) goto <D.24804>; else goto <D.24795>;
    <D.24804>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24799 = D.24769 * i;
    D.24800 = (sizetype) D.24799;
    D.24801 = D.24800 + 16;
    D.24802 = D.24777 + D.24801;
    D.24805 = MEM[(char * *)D.24802];
    D.24777 = block->block;
    if (D.24805 < D.24777) goto <D.24796>; else goto <D.24806>;
    <D.24806>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24799 = D.24769 * i;
    D.24800 = (sizetype) D.24799;
    D.24801 = D.24800 + 16;
    D.24802 = D.24777 + D.24801;
    D.24805 = MEM[(char * *)D.24802];
    D.24777 = block->block;
    D.24787 = D.24777 + 16384;
    if (D.24805 >= D.24787) goto <D.24796>; else goto <D.24795>;
    <D.24796>:
    if (start < 0) goto <D.24807>; else goto <D.24808>;
    <D.24807>:
    start = i;
    <D.24808>:
    goto <D.24797>;
    <D.24795>:
    if (start >= 0) goto <D.24809>; else goto <D.24810>;
    <D.24809>:
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24811 = D.24769 * start;
    D.24812 = (sizetype) D.24811;
    D.24813 = D.24812 + 16;
    D.24814 = D.24777 + D.24813;
    D.24777 = block->block;
    D.24769 = block->obj_size;
    D.24799 = D.24769 * i;
    D.24800 = (sizetype) D.24799;
    D.24801 = D.24800 + 16;
    D.24802 = D.24777 + D.24801;
    D.24777 = block->block;
    sgen_dump_occupied (D.24814, D.24802, D.24777);
    start = -1;
    <D.24810>:
    <D.24797>:
    i = i + 1;
    <D.21934>:
    if (i <= count) goto <D.21933>; else goto <D.21935>;
    <D.21935>:
    fprintf (heap_dump_file, "</section>\n");
  }
  block = block->next;
  <D.21937>:
  if (block != 0B) goto <D.21936>; else goto <D.21938>;
  <D.21938>:
}


major_check_scan_starts ()
{

}


major_sweep ()
{
  ms_sweep ();
}


ms_sweep ()
{
  int num_block_obj_sizes.190;
  unsigned int num_block_obj_sizes.191;
  unsigned int D.24817;
  unsigned int i.192;
  unsigned int D.24819;
  int * D.24820;
  int * D.24821;
  int * D.24822;
  int D.24823;
  int D.24824;
  unsigned int j.193;
  unsigned int D.24826;
  struct MSBlockInfo * * D.24827;
  <unnamed-unsigned:1> D.24828;
  <unnamed-unsigned:1> D.24829;
  int D.24830;
  guint8 * D.24831;
  unsigned int D.24834;
  int D.24835;
  int lazy_sweep.194;
  unsigned int obj_size_index.195;
  unsigned int D.24848;
  int * D.24849;
  int D.24850;
  int D.24851;
  int * D.24852;
  int D.24853;
  int D.24854;
  int * D.24855;
  int D.24856;
  int D.24857;
  unsigned char D.24860;
  unsigned char D.24861;
  _Bool D.24862;
  int D.24863;
  int D.24864;
  int D.24865;
  int D.24866;
  int iftmp.196;
  int D.24868;
  int D.24869;
  unsigned int index.197;
  unsigned int D.24874;
  struct MSBlockInfo * * D.24875;
  struct MSBlockInfo * D.24876;
  struct MSBlockInfo * D.24878;
  char * D.24879;
  int num_major_sections.198;
  int num_major_sections.199;
  struct MSBlockInfo * D.24882;
  float D.24883;
  int D.24884;
  float D.24885;
  float evacuation_threshold.200;
  gboolean * evacuate_block_obj_sizes.201;
  gboolean * D.24892;
  int * block_obj_sizes.202;
  int * D.24894;
  int D.24895;
  int D.24896;
  int D.24897;
  int D.24900;
  unsigned int D.24901;
  unsigned int D.24902;
  float D.24903;
  float D.24904;
  float D.24905;
  float concurrent_evacuation_threshold.203;
  float D.24907;
  _Bool D.24908;
  int want_evacuation.204;
  int i;
  struct MSBlockInfo * * iter;
  int * slots_available;
  int * slots_used;
  int * num_blocks;
  mword total_evacuate_heap;
  mword total_evacuate_saved;

  num_block_obj_sizes.190 = num_block_obj_sizes;
  num_block_obj_sizes.191 = (unsigned int) num_block_obj_sizes.190;
  D.24817 = num_block_obj_sizes.191 * 4;
  slots_available = __builtin_alloca (D.24817);
  num_block_obj_sizes.190 = num_block_obj_sizes;
  num_block_obj_sizes.191 = (unsigned int) num_block_obj_sizes.190;
  D.24817 = num_block_obj_sizes.191 * 4;
  slots_used = __builtin_alloca (D.24817);
  num_block_obj_sizes.190 = num_block_obj_sizes;
  num_block_obj_sizes.191 = (unsigned int) num_block_obj_sizes.190;
  D.24817 = num_block_obj_sizes.191 * 4;
  num_blocks = __builtin_alloca (D.24817);
  total_evacuate_heap = 0;
  total_evacuate_saved = 0;
  i = 0;
  goto <D.22405>;
  <D.22404>:
  i.192 = (unsigned int) i;
  D.24819 = i.192 * 4;
  D.24820 = slots_available + D.24819;
  i.192 = (unsigned int) i;
  D.24819 = i.192 * 4;
  D.24821 = slots_used + D.24819;
  i.192 = (unsigned int) i;
  D.24819 = i.192 * 4;
  D.24822 = num_blocks + D.24819;
  *D.24822 = 0;
  D.24823 = *D.24822;
  *D.24821 = D.24823;
  D.24824 = *D.24821;
  *D.24820 = D.24824;
  i = i + 1;
  <D.22405>:
  num_block_obj_sizes.190 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.190) goto <D.22404>; else goto <D.22406>;
  <D.22406>:
  i = 0;
  goto <D.22413>;
  <D.22412>:
  {
    struct MSBlockInfo * * free_blocks;
    int j;

    free_blocks = free_block_lists[i];
    j = 0;
    goto <D.22410>;
    <D.22409>:
    j.193 = (unsigned int) j;
    D.24826 = j.193 * 4;
    D.24827 = free_blocks + D.24826;
    *D.24827 = 0B;
    j = j + 1;
    <D.22410>:
    num_block_obj_sizes.190 = num_block_obj_sizes;
    if (j < num_block_obj_sizes.190) goto <D.22409>; else goto <D.22411>;
    <D.22411>:
  }
  i = i + 1;
  <D.22413>:
  if (i <= 3) goto <D.22412>; else goto <D.22414>;
  <D.22414>:
  iter = &all_blocks;
  goto <D.22428>;
  <D.22427>:
  {
    struct MSBlockInfo * block;
    int count;
    gboolean have_live;
    gboolean has_pinned;
    gboolean have_free;
    int obj_size_index;
    int nused;

    block = *iter;
    have_live = 0;
    have_free = 0;
    nused = 0;
    obj_size_index = block->obj_size_index;
    D.24828 = block->has_pinned;
    has_pinned = (gboolean) D.24828;
    D.24829 = block->pinned;
    block->has_pinned = D.24829;
    block->is_to_space = 0;
    block->swept = 0;
    D.24830 = block->obj_size;
    count = 16368 / D.24830;
    D.24831 = block->cardtable_mod_union;
    if (D.24831 != 0B) goto <D.24832>; else goto <D.24833>;
    <D.24832>:
    D.24831 = block->cardtable_mod_union;
    sgen_free_internal_dynamic (D.24831, 32, 28);
    block->cardtable_mod_union = 0B;
    <D.24833>:
    i = 0;
    goto <D.22423>;
    <D.22422>:
    D.24834 = block->mark_words[i];
    D.24835 = bitcount (D.24834);
    nused = D.24835 + nused;
    i = i + 1;
    <D.22423>:
    i.192 = (unsigned int) i;
    if (i.192 <= 63) goto <D.22422>; else goto <D.22424>;
    <D.22424>:
    if (nused != 0) goto <D.24836>; else goto <D.24837>;
    <D.24836>:
    have_live = 1;
    <D.24837>:
    if (nused < count) goto <D.24838>; else goto <D.24839>;
    <D.24838>:
    have_free = 1;
    <D.24839>:
    lazy_sweep.194 = lazy_sweep;
    if (lazy_sweep.194 == 0) goto <D.24841>; else goto <D.24842>;
    <D.24841>:
    sweep_block (block, 1);
    <D.24842>:
    if (have_live != 0) goto <D.24843>; else goto <D.24844>;
    <D.24843>:
    if (has_pinned == 0) goto <D.24845>; else goto <D.24846>;
    <D.24845>:
    obj_size_index.195 = (unsigned int) obj_size_index;
    D.24848 = obj_size_index.195 * 4;
    D.24849 = num_blocks + D.24848;
    D.24850 = *D.24849;
    D.24851 = D.24850 + 1;
    *D.24849 = D.24851;
    obj_size_index.195 = (unsigned int) obj_size_index;
    D.24848 = obj_size_index.195 * 4;
    D.24852 = slots_used + D.24848;
    obj_size_index.195 = (unsigned int) obj_size_index;
    D.24848 = obj_size_index.195 * 4;
    D.24852 = slots_used + D.24848;
    D.24853 = *D.24852;
    D.24854 = D.24853 + nused;
    *D.24852 = D.24854;
    obj_size_index.195 = (unsigned int) obj_size_index;
    D.24848 = obj_size_index.195 * 4;
    D.24855 = slots_available + D.24848;
    obj_size_index.195 = (unsigned int) obj_size_index;
    D.24848 = obj_size_index.195 * 4;
    D.24855 = slots_available + D.24848;
    D.24856 = *D.24855;
    D.24857 = D.24856 + count;
    *D.24855 = D.24857;
    <D.24846>:
    iter = &block->next;
    if (have_free != 0) goto <D.24858>; else goto <D.24859>;
    <D.24858>:
    {
      struct MSBlockInfo * * free_blocks;
      int index;

      D.24860 = BIT_FIELD_REF <*block, 8, 96>;
      D.24861 = D.24860 & 1;
      D.24862 = D.24861 != 0;
      D.24863 = (int) D.24862;
      D.24860 = BIT_FIELD_REF <*block, 8, 96>;
      D.24864 = (int) D.24860;
      D.24865 = D.24864 & 2;
      D.24866 = D.24863 | D.24865;
      free_blocks = free_block_lists[D.24866];
      D.24830 = block->obj_size;
      D.24868 = D.24830 + 7;
      D.24869 = D.24868 >> 3;
      if (D.24869 <= 31) goto <D.24870>; else goto <D.24871>;
      <D.24870>:
      D.24830 = block->obj_size;
      D.24868 = D.24830 + 7;
      D.24869 = D.24868 >> 3;
      iftmp.196 = fast_block_obj_size_indexes[D.24869];
      goto <D.24872>;
      <D.24871>:
      D.24830 = block->obj_size;
      iftmp.196 = ms_find_block_obj_size_index (D.24830);
      <D.24872>:
      index = iftmp.196;
      index.197 = (unsigned int) index;
      D.24874 = index.197 * 4;
      D.24875 = free_blocks + D.24874;
      D.24876 = *D.24875;
      block->next_free = D.24876;
      index.197 = (unsigned int) index;
      D.24874 = index.197 * 4;
      D.24875 = free_blocks + D.24874;
      *D.24875 = block;
    }
    <D.24859>:
    update_heap_boundaries_for_block (block);
    goto <D.24877>;
    <D.24844>:
    D.24878 = block->next;
    *iter = D.24878;
    D.24879 = block->block;
    ms_free_block (D.24879);
    sgen_free_internal (block, 16);
    num_major_sections.198 = num_major_sections;
    num_major_sections.199 = num_major_sections.198 + -1;
    num_major_sections = num_major_sections.199;
    <D.24877>:
  }
  <D.22428>:
  D.24882 = *iter;
  if (D.24882 != 0B) goto <D.22427>; else goto <D.22429>;
  <D.22429>:
  i = 0;
  goto <D.22433>;
  <D.22432>:
  {
    float usage;

    i.192 = (unsigned int) i;
    D.24819 = i.192 * 4;
    D.24821 = slots_used + D.24819;
    D.24824 = *D.24821;
    D.24883 = (float) D.24824;
    i.192 = (unsigned int) i;
    D.24819 = i.192 * 4;
    D.24820 = slots_available + D.24819;
    D.24884 = *D.24820;
    D.24885 = (float) D.24884;
    usage = D.24883 / D.24885;
    i.192 = (unsigned int) i;
    D.24819 = i.192 * 4;
    D.24822 = num_blocks + D.24819;
    D.24823 = *D.24822;
    if (D.24823 > 5) goto <D.24888>; else goto <D.24886>;
    <D.24888>:
    evacuation_threshold.200 = evacuation_threshold;
    if (usage < evacuation_threshold.200) goto <D.24890>; else goto <D.24886>;
    <D.24890>:
    evacuate_block_obj_sizes.201 = evacuate_block_obj_sizes;
    i.192 = (unsigned int) i;
    D.24819 = i.192 * 4;
    D.24892 = evacuate_block_obj_sizes.201 + D.24819;
    *D.24892 = 1;
    goto <D.24887>;
    <D.24886>:
    evacuate_block_obj_sizes.201 = evacuate_block_obj_sizes;
    i.192 = (unsigned int) i;
    D.24819 = i.192 * 4;
    D.24892 = evacuate_block_obj_sizes.201 + D.24819;
    *D.24892 = 0;
    <D.24887>:
    {
      mword total_bytes;

      block_obj_sizes.202 = block_obj_sizes;
      i.192 = (unsigned int) i;
      D.24819 = i.192 * 4;
      D.24894 = block_obj_sizes.202 + D.24819;
      D.24895 = *D.24894;
      i.192 = (unsigned int) i;
      D.24819 = i.192 * 4;
      D.24820 = slots_available + D.24819;
      D.24884 = *D.24820;
      D.24896 = D.24895 * D.24884;
      total_bytes = (mword) D.24896;
      total_evacuate_heap = total_evacuate_heap + total_bytes;
      evacuate_block_obj_sizes.201 = evacuate_block_obj_sizes;
      i.192 = (unsigned int) i;
      D.24819 = i.192 * 4;
      D.24892 = evacuate_block_obj_sizes.201 + D.24819;
      D.24897 = *D.24892;
      if (D.24897 != 0) goto <D.24898>; else goto <D.24899>;
      <D.24898>:
      block_obj_sizes.202 = block_obj_sizes;
      i.192 = (unsigned int) i;
      D.24819 = i.192 * 4;
      D.24894 = block_obj_sizes.202 + D.24819;
      D.24895 = *D.24894;
      i.192 = (unsigned int) i;
      D.24819 = i.192 * 4;
      D.24821 = slots_used + D.24819;
      D.24824 = *D.24821;
      D.24900 = D.24895 * D.24824;
      D.24901 = (unsigned int) D.24900;
      D.24902 = total_bytes - D.24901;
      total_evacuate_saved = D.24902 + total_evacuate_saved;
      <D.24899>:
    }
  }
  i = i + 1;
  <D.22433>:
  num_block_obj_sizes.190 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.190) goto <D.22432>; else goto <D.22434>;
  <D.22434>:
  D.24903 = (float) total_evacuate_saved;
  D.24904 = (float) total_evacuate_heap;
  D.24905 = D.24903 / D.24904;
  concurrent_evacuation_threshold.203 = concurrent_evacuation_threshold;
  D.24907 = 1.0e+0 - concurrent_evacuation_threshold.203;
  D.24908 = D.24905 > D.24907;
  want_evacuation.204 = (int) D.24908;
  want_evacuation = want_evacuation.204;
  have_swept = 1;
}


bitcount (mword d)
{
  int D.24912;
  int D.24914;
  int D.24915;
  int count;

  count = 0;
  if (1 != 0) goto <D.24910>; else goto <D.24911>;
  <D.24910>:
  D.24912 = __builtin_popcountl (d);
  count = D.24912 + count;
  goto <D.24913>;
  <D.24911>:
  D.24914 = __builtin_popcount (d);
  count = D.24914 + count;
  <D.24913>:
  D.24915 = count;
  return D.24915;
}


update_heap_boundaries_for_block (struct MSBlockInfo * block)
{
  char * D.24917;
  unsigned int D.24918;
  unsigned int D.24919;

  D.24917 = block->block;
  D.24918 = (unsigned int) D.24917;
  D.24917 = block->block;
  D.24918 = (unsigned int) D.24917;
  D.24919 = D.24918 + 16384;
  sgen_update_heap_boundaries (D.24918, D.24919);
}


ms_free_block (void * block)
{
  void * D.24920;
  int D.24921;
  int D.24922;
  void * empty;

  sgen_memgov_release_space (16384, 1);
  memset (block, 0, 16384);
  <D.21755>:
  empty = empty_blocks;
  MEM[(void * *)block] = empty;
  D.24920 = InterlockedCompareExchangePointer (&empty_blocks, block, empty);
  if (D.24920 != empty) goto <D.21755>; else goto <D.21756>;
  <D.21756>:
  {
    int __old_x;

    <D.21758>:
    __old_x = num_empty_blocks;
    D.24921 = __old_x + 1;
    D.24922 = InterlockedCompareExchange (&num_empty_blocks, D.24921, __old_x);
    if (D.24922 != __old_x) goto <D.21758>; else goto <D.21759>;
    <D.21759>:
  }
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.24923;
  unsigned int comp.205;
  unsigned int exch.206;
  unsigned int D.24926;

  comp.205 = (unsigned int) comp;
  exch.206 = (unsigned int) exch;
  D.24926 = __sync_val_compare_and_swap_4 (dest, comp.205, exch.206);
  D.24923 = (void *) D.24926;
  return D.24923;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.24928;
  unsigned int comp.207;
  unsigned int exch.208;
  unsigned int D.24931;

  comp.207 = (unsigned int) comp;
  exch.208 = (unsigned int) exch;
  D.24931 = __sync_val_compare_and_swap_4 (dest, comp.207, exch.208);
  D.24928 = (gint32) D.24931;
  return D.24928;
}


major_init_to_space ()
{

}


major_get_cardtable_mod_union_for_object (char * obj)
{
  unsigned int obj.209;
  unsigned int D.24934;
  struct MSBlockHeader * D.24935;
  guint8 * D.24936;
  guint8 * D.24937;
  int obj.210;
  char * D.24939;
  void * D.24940;
  int D.24941;
  int D.24942;
  int D.24943;
  sizetype D.24944;
  struct MSBlockInfo * block;

  obj.209 = (unsigned int) obj;
  D.24934 = obj.209 & 4294950912;
  D.24935 = (struct MSBlockHeader *) D.24934;
  block = D.24935->info;
  D.24937 = block->cardtable_mod_union;
  obj.210 = (int) obj;
  D.24939 = block->block;
  D.24940 = sgen_card_table_align_pointer (D.24939);
  D.24941 = (int) D.24940;
  D.24942 = obj.210 - D.24941;
  D.24943 = D.24942 >> 9;
  D.24944 = (sizetype) D.24943;
  D.24936 = D.24937 + D.24944;
  return D.24936;
}


update_cardtable_mod_union ()
{
  guint8 * D.24946;
  char * D.24947;
  guint8 * D.24948;
  unsigned int num_cards.211;
  _Bool D.24950;
  long int D.24951;
  long int D.24952;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.22684>;
  <D.22683>:
  {
    size_t num_cards;

    try
      {
        D.24946 = block->cardtable_mod_union;
        D.24947 = block->block;
        D.24948 = sgen_card_table_update_mod_union (D.24946, D.24947, 16384, &num_cards);
        block->cardtable_mod_union = D.24948;
        num_cards.211 = num_cards;
        D.24950 = num_cards.211 != 32;
        D.24951 = (long int) D.24950;
        D.24952 = __builtin_expect (D.24951, 0);
        if (D.24952 != 0) goto <D.24953>; else goto <D.24954>;
        <D.24953>:
        monoeg_g_log (0B, 4, "Number of cards calculation is wrong");
        <D.22682>:
        goto <D.22682>;
        <D.24954>:
      }
    finally
      {
        num_cards = {CLOBBER};
      }
  }
  block = block->next;
  <D.22684>:
  if (block != 0B) goto <D.22683>; else goto <D.22685>;
  <D.22685>:
}


major_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  unsigned char D.24955;
  unsigned char D.24956;
  char * D.24959;
  unsigned int D.24960;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.22611>;
  <D.22610>:
  D.24955 = BIT_FIELD_REF <*block, 8, 96>;
  D.24956 = D.24955 & 2;
  if (D.24956 != 0) goto <D.24957>; else goto <D.24958>;
  <D.24957>:
  D.24959 = block->block;
  D.24960 = (unsigned int) D.24959;
  callback (D.24960, 16384);
  <D.24958>:
  block = block->next;
  <D.22611>:
  if (block != 0B) goto <D.22610>; else goto <D.22612>;
  <D.22612>:
}


major_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  struct SgenObjectOperations * D.24961;
  int concurrent_mark.212;
  _Bool D.24965;
  long int D.24966;
  long int D.24967;
  unsigned char D.24970;
  unsigned char D.24971;
  unsigned int block_start.213;
  int D.24982;
  unsigned char D.24985;
  void * D.24989;
  char * D.24991;
  char * D.24993;
  int obj.214;
  int obj.215;
  int D.24998;
  int D.24999;
  unsigned int D.25003;
  long int D.25004;
  long unsigned int D.25005;
  long unsigned int D.25006;
  int base.216;
  int D.25009;
  unsigned int block_obj_size.217;
  sizetype card_offset.218;
  guint8 * D.25012;
  sizetype block_obj_size.219;
  int card_data.220;
  int card_base.221;
  int D.25022;
  sizetype D.25023;
  unsigned char D.25024;
  int start.222;
  char * D.25033;
  int D.25034;
  int D.25035;
  int D.25036;
  sizetype D.25037;
  sizetype D.25038;
  void * D.25040;
  char * D.25042;
  int obj.223;
  int obj.224;
  int D.25048;
  int D.25049;
  unsigned int D.25053;
  long int D.25054;
  long unsigned int D.25055;
  long unsigned int D.25056;
  struct MSBlockInfo * block;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  void next_large = <<< error >>>;
  void next_small = <<< error >>>;

  D.24961 = sgen_get_current_object_ops ();
  scan_func = D.24961->scan_object;
  concurrent_mark.212 = concurrent_mark;
  if (concurrent_mark.212 == 0) goto <D.24963>; else goto <D.24964>;
  <D.24963>:
  D.24965 = mod_union != 0;
  D.24966 = (long int) D.24965;
  D.24967 = __builtin_expect (D.24966, 0);
  if (D.24967 != 0) goto <D.24968>; else goto <D.24969>;
  <D.24968>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2225, "!mod_union");
  <D.24969>:
  <D.24964>:
  block = all_blocks;
  goto <D.22675>;
  <D.22674>:
  {
    int block_obj_size;
    char * block_start;

    D.24970 = BIT_FIELD_REF <*block, 8, 96>;
    D.24971 = D.24970 & 2;
    if (D.24971 == 0) goto <D.24972>; else goto <D.24973>;
    <D.24972>:
    // predicted unlikely by continue predictor.
    goto <D.22640>;
    <D.24973>:
    block_obj_size = block->obj_size;
    block_start = block->block;
    if (block_obj_size > 511) goto <D.24974>; else goto <D.24975>;
    <D.24974>:
    {
      guint8 * cards;
      guint8 cards_data[32];
      char * obj;
      char * end;
      char * base;

      try
        {
          if (mod_union != 0) goto <D.24976>; else goto <D.24977>;
          <D.24976>:
          cards = block->cardtable_mod_union;
          if (cards == 0B) goto <D.24978>; else goto <D.24979>;
          <D.24978>:
          // predicted unlikely by continue predictor.
          goto <D.22640>;
          <D.24979>:
          goto <D.24980>;
          <D.24977>:
          cards = &cards_data;
          block_start.213 = (unsigned int) block_start;
          D.24982 = sgen_card_table_get_card_data (&cards_data, block_start.213, 32);
          if (D.24982 == 0) goto <D.24983>; else goto <D.24984>;
          <D.24983>:
          // predicted unlikely by continue predictor.
          goto <D.22640>;
          <D.24984>:
          <D.24980>:
          obj = block_start + 16;
          end = block_start + 16384;
          base = sgen_card_table_align_pointer (obj);
          goto <D.22652>;
          <D.22651>:
          {
            int card_offset;

            D.24970 = BIT_FIELD_REF <*block, 8, 96>;
            D.24985 = D.24970 & 16;
            if (D.24985 == 0) goto <D.24986>; else goto <D.24987>;
            <D.24986>:
            sweep_block (block, 0);
            <D.24987>:
            D.24989 = MEM[(void * *)obj];
            if (D.24989 == 0B) goto next_large; else goto <D.24990>;
            <D.24990>:
            D.24991 = MEM[(char * *)obj];
            if (D.24991 >= block_start) goto <D.24992>; else goto <D.24988>;
            <D.24992>:
            D.24991 = MEM[(char * *)obj];
            D.24993 = block_start + 16384;
            if (D.24991 < D.24993) goto next_large; else goto <D.24988>;
            <D.24988>:
            if (mod_union != 0) goto <D.24994>; else goto <D.24995>;
            <D.24994>:
            {
              int w;
              int b;

              {
                int i;

                obj.214 = (int) obj;
                obj.215 = (int) obj;
                D.24998 = obj.215 & -16384;
                D.24999 = obj.214 - D.24998;
                i = D.24999 >> 3;
                if (1 != 0) goto <D.25000>; else goto <D.25001>;
                <D.25000>:
                w = i >> 5;
                b = i & 31;
                goto <D.25002>;
                <D.25001>:
                w = i >> 6;
                b = i & 63;
                <D.25002>:
              }
              D.25003 = block->mark_words[w];
              D.25004 = 1 << b;
              D.25005 = (long unsigned int) D.25004;
              D.25006 = D.25003 & D.25005;
              if (D.25006 == 0) goto next_large; else goto <D.25007>;
              <D.25007>:
            }
            <D.24995>:
            obj.214 = (int) obj;
            base.216 = (int) base;
            D.25009 = obj.214 - base.216;
            card_offset = D.25009 >> 9;
            block_obj_size.217 = (unsigned int) block_obj_size;
            card_offset.218 = (sizetype) card_offset;
            D.25012 = cards + card_offset.218;
            sgen_cardtable_scan_object (obj, block_obj_size.217, D.25012, mod_union, queue);
            next_large:
            block_obj_size.219 = (sizetype) block_obj_size;
            obj = obj + block_obj_size.219;
          }
          <D.22652>:
          if (obj < end) goto <D.22651>; else goto <D.22653>;
          <D.22653>:
        }
      finally
        {
          cards_data = {CLOBBER};
        }
    }
    goto <D.25014>;
    <D.24975>:
    {
      guint8 * card_data;
      guint8 * card_base;
      guint8 * card_data_end;

      if (mod_union != 0) goto <D.25015>; else goto <D.25016>;
      <D.25015>:
      card_base = block->cardtable_mod_union;
      card_data = card_base;
      if (card_data == 0B) goto <D.25017>; else goto <D.25018>;
      <D.25017>:
      // predicted unlikely by continue predictor.
      goto <D.22640>;
      <D.25018>:
      goto <D.25019>;
      <D.25016>:
      block_start.213 = (unsigned int) block_start;
      card_base = sgen_card_table_get_card_address (block_start.213);
      card_data = card_base;
      <D.25019>:
      card_data_end = card_data + 32;
      card_data = initial_skip_card (card_data);
      goto <D.22672>;
      <D.22671>:
      {
        int index;
        int idx;
        char * start;
        char * end;
        char * first_obj;
        char * obj;

        card_data.220 = (int) card_data;
        card_base.221 = (int) card_base;
        idx = card_data.220 - card_base.221;
        D.25022 = idx * 512;
        D.25023 = (sizetype) D.25022;
        start = block_start + D.25023;
        end = start + 512;
        D.25024 = *card_data;
        if (D.25024 == 0) goto <D.25025>; else goto <D.25026>;
        <D.25025>:
        // predicted unlikely by continue predictor.
        goto <D.22663>;
        <D.25026>:
        D.24970 = BIT_FIELD_REF <*block, 8, 96>;
        D.24985 = D.24970 & 16;
        if (D.24985 == 0) goto <D.25027>; else goto <D.25028>;
        <D.25027>:
        sweep_block (block, 0);
        <D.25028>:
        sgen_card_table_prepare_card_for_scanning (card_data);
        if (idx == 0) goto <D.25029>; else goto <D.25030>;
        <D.25029>:
        index = 0;
        goto <D.25031>;
        <D.25030>:
        start.222 = (int) start;
        D.25033 = block_start + 16;
        D.25034 = (int) D.25033;
        D.25035 = start.222 - D.25034;
        index = D.25035 / block_obj_size;
        <D.25031>:
        D.25036 = block_obj_size * index;
        D.25037 = (sizetype) D.25036;
        D.25038 = D.25037 + 16;
        first_obj = block_start + D.25038;
        obj = first_obj;
        goto <D.22669>;
        <D.22668>:
        D.25040 = MEM[(void * *)obj];
        if (D.25040 == 0B) goto next_small; else goto <D.25041>;
        <D.25041>:
        D.25042 = MEM[(char * *)obj];
        if (D.25042 >= block_start) goto <D.25043>; else goto <D.25039>;
        <D.25043>:
        D.25042 = MEM[(char * *)obj];
        D.24993 = block_start + 16384;
        if (D.25042 < D.24993) goto next_small; else goto <D.25039>;
        <D.25039>:
        if (mod_union != 0) goto <D.25044>; else goto <D.25045>;
        <D.25044>:
        {
          int w;
          int b;

          {
            int i;

            obj.223 = (int) obj;
            obj.224 = (int) obj;
            D.25048 = obj.224 & -16384;
            D.25049 = obj.223 - D.25048;
            i = D.25049 >> 3;
            if (1 != 0) goto <D.25050>; else goto <D.25051>;
            <D.25050>:
            w = i >> 5;
            b = i & 31;
            goto <D.25052>;
            <D.25051>:
            w = i >> 6;
            b = i & 63;
            <D.25052>:
          }
          D.25053 = block->mark_words[w];
          D.25054 = 1 << b;
          D.25055 = (long unsigned int) D.25054;
          D.25056 = D.25053 & D.25055;
          if (D.25056 == 0) goto next_small; else goto <D.25057>;
          <D.25057>:
        }
        <D.25045>:
        scan_func (obj, queue);
        next_small:
        block_obj_size.219 = (sizetype) block_obj_size;
        obj = obj + block_obj_size.219;
        <D.22669>:
        if (obj < end) goto <D.22668>; else goto <D.22670>;
        <D.22670>:
      }
      <D.22663>:
      card_data = card_data + 1;
      <D.22672>:
      if (card_data < card_data_end) goto <D.22671>; else goto <D.22673>;
      <D.22673>:
    }
    <D.25014>:
  }
  <D.22640>:
  block = block->next;
  <D.22675>:
  if (block != 0B) goto <D.22674>; else goto <D.22676>;
  <D.22676>:
}


sgen_card_table_get_card_address (mword address)
{
  guint8 * D.25060;
  guint8 * sgen_cardtable.225;
  unsigned int D.25062;

  sgen_cardtable.225 = sgen_cardtable;
  D.25062 = address >> 9;
  D.25060 = sgen_cardtable.225 + D.25062;
  return D.25060;
}


initial_skip_card (guint8 * card_data)
{
  unsigned int i.226;
  unsigned int D.25065;
  mword * D.25066;
  guint8 * D.25070;
  sizetype i.227;
  guint8 * D.25072;
  unsigned char D.25073;
  mword * cards;
  mword card;
  int i;

  cards = card_data;
  i = 0;
  goto <D.22621>;
  <D.22620>:
  i.226 = (unsigned int) i;
  D.25065 = i.226 * 4;
  D.25066 = cards + D.25065;
  card = *D.25066;
  if (card != 0) goto <D.22619>; else goto <D.25067>;
  <D.25067>:
  i = i + 1;
  <D.22621>:
  if (i <= 7) goto <D.22620>; else goto <D.22619>;
  <D.22619>:
  if (i == 8) goto <D.25068>; else goto <D.25069>;
  <D.25068>:
  D.25070 = card_data + 32;
  return D.25070;
  <D.25069>:
  i = i * 4;
  goto <D.22623>;
  <D.22622>:
  i.227 = (sizetype) i;
  D.25072 = card_data + i.227;
  D.25073 = *D.25072;
  if (D.25073 != 0) goto <D.25074>; else goto <D.25075>;
  <D.25074>:
  i.227 = (sizetype) i;
  D.25070 = card_data + i.227;
  return D.25070;
  <D.25075>:
  i = i + 1;
  <D.22623>:
  if (i <= 31) goto <D.22622>; else goto <D.22624>;
  <D.22624>:
  D.25070 = card_data;
  return D.25070;
}


sgen_card_table_prepare_card_for_scanning (guint8 * card)
{
  *card = 0;
}


pin_major_object (char * obj, struct SgenGrayQueue * queue)
{
  int concurrent_mark.228;
  unsigned int obj.229;
  unsigned int D.25081;
  struct MSBlockHeader * D.25082;
  int obj.230;
  int obj.231;
  int D.25085;
  int D.25086;
  unsigned int D.25092;
  long int D.25093;
  long unsigned int D.25094;
  long unsigned int D.25095;
  long unsigned int D.25098;
  unsigned char D.25099;
  unsigned char D.25100;
  int iftmp.232;
  struct GrayQueueSection * D.25107;
  int D.25109;
  _Bool D.25110;
  long int D.25111;
  long int D.25112;
  int D.25116;
  int D.25117;
  struct MSBlockInfo * block;

  concurrent_mark.228 = concurrent_mark;
  if (concurrent_mark.228 != 0) goto <D.25078>; else goto <D.25079>;
  <D.25078>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-marksweep.c", 1107);
  <D.25079>:
  obj.229 = (unsigned int) obj;
  D.25081 = obj.229 & 4294950912;
  D.25082 = (struct MSBlockHeader *) D.25081;
  block = D.25082->info;
  block->has_pinned = 1;
  {
    int __word;
    int __bit;

    {
      int i;

      obj.230 = (int) obj;
      obj.231 = (int) obj;
      D.25085 = obj.231 & -16384;
      D.25086 = obj.230 - D.25085;
      i = D.25086 >> 3;
      if (1 != 0) goto <D.25087>; else goto <D.25088>;
      <D.25087>:
      __word = i >> 5;
      __bit = i & 31;
      goto <D.25089>;
      <D.25088>:
      __word = i >> 6;
      __bit = i & 63;
      <D.25089>:
    }
    if (0 != 0) goto <D.25090>; else goto <D.25091>;
    <D.25090>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.21947>:
    goto <D.21947>;
    <D.25091>:
    D.25092 = block->mark_words[__word];
    D.25093 = 1 << __bit;
    D.25094 = (long unsigned int) D.25093;
    D.25095 = D.25092 & D.25094;
    if (D.25095 == 0) goto <D.25096>; else goto <D.25097>;
    <D.25096>:
    D.25092 = block->mark_words[__word];
    D.25093 = 1 << __bit;
    D.25094 = (long unsigned int) D.25093;
    D.25098 = D.25092 | D.25094;
    block->mark_words[__word] = D.25098;
    D.25099 = BIT_FIELD_REF <*block, 8, 96>;
    D.25100 = D.25099 & 2;
    if (D.25100 != 0) goto <D.25101>; else goto <D.25102>;
    <D.25101>:
    D.25107 = queue->first;
    if (D.25107 == 0B) goto <D.25104>; else goto <D.25108>;
    <D.25108>:
    D.25107 = queue->first;
    D.25109 = D.25107->end;
    if (D.25109 == 125) goto <D.25104>; else goto <D.25105>;
    <D.25104>:
    iftmp.232 = 1;
    goto <D.25106>;
    <D.25105>:
    iftmp.232 = 0;
    <D.25106>:
    D.25110 = iftmp.232 != 0;
    D.25111 = (long int) D.25110;
    D.25112 = __builtin_expect (D.25111, 0);
    if (D.25112 != 0) goto <D.25113>; else goto <D.25114>;
    <D.25113>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.25115>;
    <D.25114>:
    D.25107 = queue->first;
    D.25107 = queue->first;
    D.25109 = D.25107->end;
    D.25116 = D.25109;
    D.25117 = D.25116 + 1;
    D.25107->end = D.25117;
    D.25107->objects[D.25116] = obj;
    <D.25115>:
    __builtin_prefetch (obj);
    <D.25102>:
    <D.25097>:
  }
}


major_pin_objects (struct SgenGrayQueue * queue)
{
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.22556>;
  <D.22555>:
  mark_pinned_objects_in_block (block, queue);
  block = block->next;
  <D.22556>:
  if (block != 0B) goto <D.22555>; else goto <D.22557>;
  <D.22557>:
}


mark_pinned_objects_in_block (struct MSBlockInfo * block, struct SgenGrayQueue * queue)
{
  int D.25118;
  void * * D.25121;
  unsigned int i.233;
  unsigned int D.25123;
  void * * D.25124;
  void * D.25125;
  int D.25126;
  char * D.25127;
  char * D.25128;
  int D.25129;
  int D.25130;
  int D.25131;
  int D.25134;
  int D.25137;
  sizetype D.25138;
  sizetype D.25139;
  char * D.25140;
  int D.25141;
  int D.25142;
  int D.25143;
  int D.25144;
  unsigned int D.25150;
  long int D.25151;
  long unsigned int D.25152;
  long unsigned int D.25153;
  void * D.25156;
  char * D.25159;
  char * D.25161;
  long unsigned int D.25162;
  unsigned char D.25163;
  unsigned char D.25164;
  int iftmp.234;
  struct GrayQueueSection * D.25171;
  int D.25173;
  _Bool D.25174;
  long int D.25175;
  long int D.25176;
  int D.25180;
  int D.25181;
  int i;
  int last_index;

  last_index = -1;
  D.25118 = block->pin_queue_num_entries;
  if (D.25118 == 0) goto <D.25119>; else goto <D.25120>;
  <D.25119>:
  return;
  <D.25120>:
  block->has_pinned = 1;
  i = 0;
  goto <D.22361>;
  <D.22360>:
  {
    int index;

    D.25121 = block->pin_queue_start;
    i.233 = (unsigned int) i;
    D.25123 = i.233 * 4;
    D.25124 = D.25121 + D.25123;
    D.25125 = *D.25124;
    D.25126 = (int) D.25125;
    D.25127 = block->block;
    D.25128 = D.25127 + 16;
    D.25129 = (int) D.25128;
    D.25130 = D.25126 - D.25129;
    D.25131 = block->obj_size;
    index = D.25130 / D.25131;
    if (0 != 0) goto <D.25132>; else goto <D.25133>;
    <D.25132>:
    D.25121 = block->pin_queue_start;
    i.233 = (unsigned int) i;
    D.25123 = i.233 * 4;
    D.25124 = D.25121 + D.25123;
    D.25125 = *D.25124;
    D.25131 = block->obj_size;
    D.25134 = 16368 / D.25131;
    monoeg_g_log (0B, 4, "invalid object %p index %d max-index %d", D.25125, index, D.25134);
    <D.22355>:
    goto <D.22355>;
    <D.25133>:
    if (index == last_index) goto <D.25135>; else goto <D.25136>;
    <D.25135>:
    // predicted unlikely by continue predictor.
    goto <D.22356>;
    <D.25136>:
    {
      int __word;
      int __bit;

      {
        int i;

        D.25127 = block->block;
        D.25131 = block->obj_size;
        D.25137 = D.25131 * index;
        D.25138 = (sizetype) D.25137;
        D.25139 = D.25138 + 16;
        D.25140 = D.25127 + D.25139;
        D.25141 = (int) D.25140;
        D.25127 = block->block;
        D.25131 = block->obj_size;
        D.25137 = D.25131 * index;
        D.25138 = (sizetype) D.25137;
        D.25139 = D.25138 + 16;
        D.25140 = D.25127 + D.25139;
        D.25142 = (int) D.25140;
        D.25143 = D.25142 & -16384;
        D.25144 = D.25141 - D.25143;
        i = D.25144 >> 3;
        if (1 != 0) goto <D.25145>; else goto <D.25146>;
        <D.25145>:
        __word = i >> 5;
        __bit = i & 31;
        goto <D.25147>;
        <D.25146>:
        __word = i >> 6;
        __bit = i & 63;
        <D.25147>:
      }
      D.25150 = block->mark_words[__word];
      D.25151 = 1 << __bit;
      D.25152 = (long unsigned int) D.25151;
      D.25153 = D.25150 & D.25152;
      if (D.25153 == 0) goto <D.25154>; else goto <D.25155>;
      <D.25154>:
      D.25127 = block->block;
      D.25131 = block->obj_size;
      D.25137 = D.25131 * index;
      D.25138 = (sizetype) D.25137;
      D.25139 = D.25138 + 16;
      D.25140 = D.25127 + D.25139;
      D.25156 = MEM[(void * *)D.25140];
      if (D.25156 != 0B) goto <D.25157>; else goto <D.25158>;
      <D.25157>:
      D.25127 = block->block;
      D.25131 = block->obj_size;
      D.25137 = D.25131 * index;
      D.25138 = (sizetype) D.25137;
      D.25139 = D.25138 + 16;
      D.25140 = D.25127 + D.25139;
      D.25159 = MEM[(char * *)D.25140];
      D.25127 = block->block;
      if (D.25159 < D.25127) goto <D.25148>; else goto <D.25160>;
      <D.25160>:
      D.25127 = block->block;
      D.25131 = block->obj_size;
      D.25137 = D.25131 * index;
      D.25138 = (sizetype) D.25137;
      D.25139 = D.25138 + 16;
      D.25140 = D.25127 + D.25139;
      D.25159 = MEM[(char * *)D.25140];
      D.25127 = block->block;
      D.25161 = D.25127 + 16384;
      if (D.25159 >= D.25161) goto <D.25148>; else goto <D.25149>;
      <D.25148>:
      D.25150 = block->mark_words[__word];
      D.25151 = 1 << __bit;
      D.25152 = (long unsigned int) D.25151;
      D.25162 = D.25150 | D.25152;
      block->mark_words[__word] = D.25162;
      D.25163 = BIT_FIELD_REF <*block, 8, 96>;
      D.25164 = D.25163 & 2;
      if (D.25164 != 0) goto <D.25165>; else goto <D.25166>;
      <D.25165>:
      D.25171 = queue->first;
      if (D.25171 == 0B) goto <D.25168>; else goto <D.25172>;
      <D.25172>:
      D.25171 = queue->first;
      D.25173 = D.25171->end;
      if (D.25173 == 125) goto <D.25168>; else goto <D.25169>;
      <D.25168>:
      iftmp.234 = 1;
      goto <D.25170>;
      <D.25169>:
      iftmp.234 = 0;
      <D.25170>:
      D.25174 = iftmp.234 != 0;
      D.25175 = (long int) D.25174;
      D.25176 = __builtin_expect (D.25175, 0);
      if (D.25176 != 0) goto <D.25177>; else goto <D.25178>;
      <D.25177>:
      D.25127 = block->block;
      D.25131 = block->obj_size;
      D.25137 = D.25131 * index;
      D.25138 = (sizetype) D.25137;
      D.25139 = D.25138 + 16;
      D.25140 = D.25127 + D.25139;
      sgen_gray_object_enqueue (queue, D.25140);
      goto <D.25179>;
      <D.25178>:
      D.25171 = queue->first;
      D.25171 = queue->first;
      D.25173 = D.25171->end;
      D.25180 = D.25173;
      D.25181 = D.25180 + 1;
      D.25171->end = D.25181;
      D.25127 = block->block;
      D.25131 = block->obj_size;
      D.25137 = D.25131 * index;
      D.25138 = (sizetype) D.25137;
      D.25139 = D.25138 + 16;
      D.25140 = D.25127 + D.25139;
      D.25171->objects[D.25180] = D.25140;
      <D.25179>:
      D.25127 = block->block;
      D.25131 = block->obj_size;
      D.25137 = D.25131 * index;
      D.25138 = (sizetype) D.25137;
      D.25139 = D.25138 + 16;
      D.25140 = D.25127 + D.25139;
      __builtin_prefetch (D.25140);
      <D.25166>:
      <D.25149>:
      <D.25158>:
      <D.25155>:
    }
    last_index = index;
  }
  <D.22356>:
  i = i + 1;
  <D.22361>:
  D.25118 = block->pin_queue_num_entries;
  if (D.25118 > i) goto <D.22360>; else goto <D.22362>;
  <D.22362>:
}


major_find_pin_queue_start_ends (struct SgenGrayQueue * queue)
{
  char * D.25183;
  void * D.25184;
  void * D.25185;
  int * D.25186;
  void * * D.25187;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.22549>;
  <D.22548>:
  D.25183 = block->block;
  D.25184 = D.25183 + 16;
  D.25183 = block->block;
  D.25185 = D.25183 + 16384;
  D.25186 = &block->pin_queue_num_entries;
  D.25187 = sgen_find_optimized_pin_queue_area (D.25184, D.25185, D.25186);
  block->pin_queue_start = D.25187;
  block = block->next;
  <D.22549>:
  if (block != 0B) goto <D.22548>; else goto <D.22550>;
  <D.22550>:
}


major_free_non_pinned_object (char * obj, size_t size)
{
  free_object (obj, size, 0);
}


free_object (char * obj, size_t size, gboolean pinned)
{
  unsigned int obj.235;
  unsigned int D.25189;
  struct MSBlockHeader * D.25190;
  unsigned char D.25191;
  unsigned char D.25192;
  <unnamed-unsigned:1> D.25197;
  int D.25198;
  int obj.236;
  int obj.237;
  int D.25203;
  int D.25204;
  void * * D.25210;
  _Bool D.25213;
  int D.25214;
  int D.25215;
  int D.25216;
  int D.25217;
  int iftmp.238;
  unsigned int D.25219;
  unsigned int D.25220;
  int size.239;
  unsigned int size_index.240;
  unsigned int D.25228;
  struct MSBlockInfo * * D.25229;
  struct MSBlockInfo * D.25230;
  struct MSBlockInfo * block;
  int word;
  int bit;

  obj.235 = (unsigned int) obj;
  D.25189 = obj.235 & 4294950912;
  D.25190 = (struct MSBlockHeader *) D.25189;
  block = D.25190->info;
  D.25191 = BIT_FIELD_REF <*block, 8, 96>;
  D.25192 = D.25191 & 16;
  if (D.25192 == 0) goto <D.25193>; else goto <D.25194>;
  <D.25193>:
  sweep_block (block, 0);
  <D.25194>:
  if (0 != 0) goto <D.25195>; else goto <D.25196>;
  <D.25195>:
  D.25197 = block->pinned;
  D.25198 = (int) D.25197;
  monoeg_g_log (0B, 4, "free-object pinning mixup object %p pinned %d block %p pinned %d", obj, pinned, block, D.25198);
  <D.21814>:
  goto <D.21814>;
  <D.25196>:
  if (0 != 0) goto <D.25199>; else goto <D.25200>;
  <D.25199>:
  monoeg_g_log (0B, 4, "object %p is already free", obj);
  <D.21815>:
  goto <D.21815>;
  <D.25200>:
  {
    int i;

    obj.236 = (int) obj;
    obj.237 = (int) obj;
    D.25203 = obj.237 & -16384;
    D.25204 = obj.236 - D.25203;
    i = D.25204 >> 3;
    if (1 != 0) goto <D.25205>; else goto <D.25206>;
    <D.25205>:
    word = i >> 5;
    bit = i & 31;
    goto <D.25207>;
    <D.25206>:
    word = i >> 6;
    bit = i & 63;
    <D.25207>:
  }
  if (0 != 0) goto <D.25208>; else goto <D.25209>;
  <D.25208>:
  monoeg_g_log (0B, 4, "object %p has mark bit set");
  <D.21817>:
  goto <D.21817>;
  <D.25209>:
  D.25210 = block->free_list;
  if (D.25210 == 0B) goto <D.25211>; else goto <D.25212>;
  <D.25211>:
  {
    struct MSBlockInfo * * free_blocks;
    int size_index;

    D.25213 = pinned != 0;
    D.25214 = (int) D.25213;
    D.25191 = BIT_FIELD_REF <*block, 8, 96>;
    D.25215 = (int) D.25191;
    D.25216 = D.25215 & 2;
    D.25217 = D.25214 | D.25216;
    free_blocks = free_block_lists[D.25217];
    D.25219 = size + 7;
    D.25220 = D.25219 >> 3;
    if (D.25220 <= 31) goto <D.25221>; else goto <D.25222>;
    <D.25221>:
    D.25219 = size + 7;
    D.25220 = D.25219 >> 3;
    iftmp.238 = fast_block_obj_size_indexes[D.25220];
    goto <D.25223>;
    <D.25222>:
    size.239 = (int) size;
    iftmp.238 = ms_find_block_obj_size_index (size.239);
    <D.25223>:
    size_index = iftmp.238;
    if (0 != 0) goto <D.25225>; else goto <D.25226>;
    <D.25225>:
    monoeg_g_log (0B, 4, "block %p doesn\'t have a free-list of object but belongs to a free-list of blocks");
    <D.21820>:
    goto <D.21820>;
    <D.25226>:
    size_index.240 = (unsigned int) size_index;
    D.25228 = size_index.240 * 4;
    D.25229 = free_blocks + D.25228;
    D.25230 = *D.25229;
    block->next_free = D.25230;
    size_index.240 = (unsigned int) size_index;
    D.25228 = size_index.240 * 4;
    D.25229 = free_blocks + D.25228;
    *D.25229 = block;
  }
  <D.25212>:
  memset (obj, 0, size);
  D.25210 = block->free_list;
  MEM[(void * *)obj] = D.25210;
  block->free_list = obj;
}


major_iterate_objects (gboolean non_pinned, gboolean pinned, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data)
{
  int D.25231;
  unsigned char D.25232;
  unsigned char D.25233;
  int lazy_sweep.241;
  char * D.25245;
  int D.25246;
  sizetype D.25247;
  sizetype D.25248;
  void * D.25251;
  char * D.25254;
  char * D.25256;
  unsigned int D.25257;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.21878>;
  <D.21877>:
  {
    int count;
    int i;

    D.25231 = block->obj_size;
    count = 16368 / D.25231;
    D.25232 = BIT_FIELD_REF <*block, 8, 96>;
    D.25233 = D.25232 & 1;
    if (D.25233 != 0) goto <D.25234>; else goto <D.25235>;
    <D.25234>:
    if (pinned == 0) goto <D.25236>; else goto <D.25237>;
    <D.25236>:
    // predicted unlikely by continue predictor.
    goto <D.21872>;
    <D.25237>:
    <D.25235>:
    D.25232 = BIT_FIELD_REF <*block, 8, 96>;
    D.25233 = D.25232 & 1;
    if (D.25233 == 0) goto <D.25238>; else goto <D.25239>;
    <D.25238>:
    if (non_pinned == 0) goto <D.25240>; else goto <D.25241>;
    <D.25240>:
    // predicted unlikely by continue predictor.
    goto <D.21872>;
    <D.25241>:
    <D.25239>:
    lazy_sweep.241 = lazy_sweep;
    if (lazy_sweep.241 != 0) goto <D.25243>; else goto <D.25244>;
    <D.25243>:
    sweep_block (block, 0);
    <D.25244>:
    i = 0;
    goto <D.21875>;
    <D.21874>:
    {
      void * * obj;

      D.25245 = block->block;
      D.25231 = block->obj_size;
      D.25246 = D.25231 * i;
      D.25247 = (sizetype) D.25246;
      D.25248 = D.25247 + 16;
      obj = D.25245 + D.25248;
      D.25251 = *obj;
      if (D.25251 != 0B) goto <D.25252>; else goto <D.25253>;
      <D.25252>:
      D.25254 = MEM[(char * *)obj];
      D.25245 = block->block;
      if (D.25254 < D.25245) goto <D.25249>; else goto <D.25255>;
      <D.25255>:
      D.25254 = MEM[(char * *)obj];
      D.25245 = block->block;
      D.25256 = D.25245 + 16384;
      if (D.25254 >= D.25256) goto <D.25249>; else goto <D.25250>;
      <D.25249>:
      D.25231 = block->obj_size;
      D.25257 = (unsigned int) D.25231;
      callback (obj, D.25257, data);
      <D.25250>:
      <D.25253>:
    }
    i = i + 1;
    <D.21875>:
    if (i < count) goto <D.21874>; else goto <D.21876>;
    <D.21876>:
  }
  <D.21872>:
  block = block->next;
  <D.21878>:
  if (block != 0B) goto <D.21877>; else goto <D.21879>;
  <D.21879>:
}


free_pinned_object (char * obj, size_t size)
{
  free_object (obj, size, 1);
}


major_alloc_object (struct MonoVTable * vtable, int size, gboolean has_references)
{
  void * D.25258;

  D.25258 = alloc_obj (vtable, size, 0, has_references);
  return D.25258;
}


alloc_obj (struct MonoVTable * vtable, int size, gboolean pinned, gboolean has_references)
{
  int iftmp.242;
  int D.25261;
  int D.25262;
  _Bool D.25266;
  int D.25267;
  int iftmp.243;
  int D.25272;
  unsigned int size_index.244;
  unsigned int D.25274;
  struct MSBlockInfo * * D.25275;
  struct MSBlockInfo * D.25276;
  int D.25279;
  _Bool D.25280;
  long int D.25281;
  long int D.25282;
  void * D.25285;
  int size_index;
  struct MSBlockInfo * * free_blocks;
  void * obj;

  D.25261 = size + 7;
  D.25262 = D.25261 >> 3;
  if (D.25262 <= 31) goto <D.25263>; else goto <D.25264>;
  <D.25263>:
  D.25261 = size + 7;
  D.25262 = D.25261 >> 3;
  iftmp.242 = fast_block_obj_size_indexes[D.25262];
  goto <D.25265>;
  <D.25264>:
  iftmp.242 = ms_find_block_obj_size_index (size);
  <D.25265>:
  size_index = iftmp.242;
  D.25266 = pinned != 0;
  D.25267 = (int) D.25266;
  if (has_references != 0) goto <D.25269>; else goto <D.25270>;
  <D.25269>:
  iftmp.243 = 2;
  goto <D.25271>;
  <D.25270>:
  iftmp.243 = 0;
  <D.25271>:
  D.25272 = D.25267 | iftmp.243;
  free_blocks = free_block_lists[D.25272];
  size_index.244 = (unsigned int) size_index;
  D.25274 = size_index.244 * 4;
  D.25275 = free_blocks + D.25274;
  D.25276 = *D.25275;
  if (D.25276 == 0B) goto <D.25277>; else goto <D.25278>;
  <D.25277>:
  D.25279 = ms_alloc_block (size_index, pinned, has_references);
  D.25280 = D.25279 == 0;
  D.25281 = (long int) D.25280;
  D.25282 = __builtin_expect (D.25281, 0);
  if (D.25282 != 0) goto <D.25283>; else goto <D.25284>;
  <D.25283>:
  D.25285 = 0B;
  return D.25285;
  <D.25284>:
  <D.25278>:
  obj = unlink_slot_from_free_list_uncontested (free_blocks, size_index);
  MEM[(struct MonoVTable * *)obj] = vtable;
  D.25285 = obj;
  return D.25285;
}


ms_alloc_block (int size_index, gboolean pinned, gboolean has_references)
{
  int * block_obj_sizes.245;
  unsigned int size_index.246;
  unsigned int D.25289;
  int * D.25290;
  _Bool D.25291;
  int D.25292;
  int iftmp.247;
  int D.25297;
  int D.25298;
  gboolean D.25301;
  unsigned char D.25304;
  <unnamed-unsigned:1> D.25305;
  unsigned char D.25306;
  <unnamed-unsigned:1> D.25307;
  int D.25308;
  _Bool D.25309;
  void * D.25310;
  char * D.25311;
  sizetype size.248;
  int D.25313;
  struct MSBlockInfo * * D.25314;
  struct MSBlockInfo * D.25315;
  struct MSBlockInfo * all_blocks.249;
  int num_major_sections.250;
  int num_major_sections.251;
  int size;
  int count;
  struct MSBlockInfo * info;
  struct MSBlockHeader * header;
  struct MSBlockInfo * * free_blocks;
  char * obj_start;
  int i;

  block_obj_sizes.245 = block_obj_sizes;
  size_index.246 = (unsigned int) size_index;
  D.25289 = size_index.246 * 4;
  D.25290 = block_obj_sizes.245 + D.25289;
  size = *D.25290;
  count = 16368 / size;
  D.25291 = pinned != 0;
  D.25292 = (int) D.25291;
  if (has_references != 0) goto <D.25294>; else goto <D.25295>;
  <D.25294>:
  iftmp.247 = 2;
  goto <D.25296>;
  <D.25295>:
  iftmp.247 = 0;
  <D.25296>:
  D.25297 = D.25292 | iftmp.247;
  free_blocks = free_block_lists[D.25297];
  D.25298 = sgen_memgov_try_alloc_space (16384, 1);
  if (D.25298 == 0) goto <D.25299>; else goto <D.25300>;
  <D.25299>:
  D.25301 = 0;
  return D.25301;
  <D.25300>:
  info = sgen_alloc_internal (16);
  if (0 != 0) goto <D.25302>; else goto <D.25303>;
  <D.25302>:
  monoeg_g_log (0B, 4, "block with %d objects, it must hold at least 2", count);
  <D.21772>:
  goto <D.21772>;
  <D.25303>:
  info->obj_size = size;
  info->obj_size_index = size_index;
  D.25304 = (unsigned char) pinned;
  D.25305 = (<unnamed-unsigned:1>) D.25304;
  info->pinned = D.25305;
  D.25306 = (unsigned char) has_references;
  D.25307 = (<unnamed-unsigned:1>) D.25306;
  info->has_references = D.25307;
  D.25304 = (unsigned char) pinned;
  D.25305 = (<unnamed-unsigned:1>) D.25304;
  info->has_pinned = D.25305;
  D.25308 = sgen_get_current_collection_generation ();
  D.25309 = D.25308 == 1;
  info->is_to_space = D.25309;
  info->swept = 1;
  D.25310 = ms_get_empty_block ();
  info->block = D.25310;
  header = info->block;
  header->info = info;
  info->cardtable_mod_union = 0B;
  update_heap_boundaries_for_block (info);
  D.25311 = info->block;
  obj_start = D.25311 + 16;
  info->free_list = obj_start;
  i = 0;
  goto <D.21775>;
  <D.21774>:
  {
    char * next_obj_start;

    size.248 = (sizetype) size;
    next_obj_start = obj_start + size.248;
    MEM[(void * *)obj_start] = next_obj_start;
    obj_start = next_obj_start;
  }
  i = i + 1;
  <D.21775>:
  D.25313 = count + -1;
  if (D.25313 > i) goto <D.21774>; else goto <D.21776>;
  <D.21776>:
  MEM[(void * *)obj_start] = 0B;
  size_index.246 = (unsigned int) size_index;
  D.25289 = size_index.246 * 4;
  D.25314 = free_blocks + D.25289;
  D.25315 = *D.25314;
  info->next_free = D.25315;
  size_index.246 = (unsigned int) size_index;
  D.25289 = size_index.246 * 4;
  D.25314 = free_blocks + D.25289;
  *D.25314 = info;
  all_blocks.249 = all_blocks;
  info->next = all_blocks.249;
  all_blocks = info;
  num_major_sections.250 = num_major_sections;
  num_major_sections.251 = num_major_sections.250 + 1;
  num_major_sections = num_major_sections.251;
  D.25301 = 1;
  return D.25301;
}


ms_get_empty_block ()
{
  void * empty_blocks.252;
  int D.25323;
  unsigned int D.25324;
  const char * iftmp.253;
  void * D.25330;
  int D.25331;
  int D.25332;
  long long int D.25333;
  long long int stat_major_blocks_alloced.254;
  long long int stat_major_blocks_alloced.255;
  long long int stat_major_blocks_alloced_less_ideal.256;
  long long int stat_major_blocks_alloced_less_ideal.257;
  void * D.25341;
  int D.25342;
  int D.25343;
  unsigned int block.258;
  unsigned int D.25345;
  _Bool D.25346;
  long int D.25347;
  long int D.25348;
  void * D.25351;
  char * p;
  int i;
  void * block;
  void * empty;
  void * next;
  void retry = <<< error >>>;

  retry:
  empty_blocks.252 = empty_blocks;
  if (empty_blocks.252 == 0B) goto <D.25321>; else goto <D.25322>;
  <D.25321>:
  {
    int alloc_num;

    alloc_num = 32;
    <D.21737>:
    D.25323 = alloc_num * 16384;
    D.25324 = (unsigned int) D.25323;
    if (alloc_num == 1) goto <D.25326>; else goto <D.25327>;
    <D.25326>:
    iftmp.253 = "major heap section";
    goto <D.25328>;
    <D.25327>:
    iftmp.253 = 0B;
    <D.25328>:
    p = sgen_alloc_os_memory_aligned (D.25324, 16384, 3, iftmp.253);
    if (p != 0B) goto <D.21736>; else goto <D.25329>;
    <D.25329>:
    alloc_num = alloc_num >> 1;
    goto <D.21737>;
    <D.21736>:
    i = 0;
    goto <D.21741>;
    <D.21740>:
    block = p;
    <D.21738>:
    empty = empty_blocks;
    MEM[(void * *)block] = empty;
    D.25330 = InterlockedCompareExchangePointer (&empty_blocks, block, empty);
    if (D.25330 != empty) goto <D.21738>; else goto <D.21739>;
    <D.21739>:
    p = p + 16384;
    i = i + 1;
    <D.21741>:
    if (i < alloc_num) goto <D.21740>; else goto <D.21742>;
    <D.21742>:
    {
      int __old_x;

      <D.21744>:
      __old_x = num_empty_blocks;
      D.25331 = __old_x + alloc_num;
      D.25332 = InterlockedCompareExchange (&num_empty_blocks, D.25331, __old_x);
      if (D.25332 != __old_x) goto <D.21744>; else goto <D.21745>;
      <D.21745>:
    }
    D.25333 = (long long int) alloc_num;
    stat_major_blocks_alloced.254 = stat_major_blocks_alloced;
    stat_major_blocks_alloced.255 = D.25333 + stat_major_blocks_alloced.254;
    stat_major_blocks_alloced = stat_major_blocks_alloced.255;
    if (alloc_num != 32) goto <D.25336>; else goto <D.25337>;
    <D.25336>:
    D.25333 = (long long int) alloc_num;
    stat_major_blocks_alloced_less_ideal.256 = stat_major_blocks_alloced_less_ideal;
    stat_major_blocks_alloced_less_ideal.257 = D.25333 + stat_major_blocks_alloced_less_ideal.256;
    stat_major_blocks_alloced_less_ideal = stat_major_blocks_alloced_less_ideal.257;
    <D.25337>:
  }
  <D.25322>:
  <D.21746>:
  empty = empty_blocks;
  if (empty == 0B) goto retry; else goto <D.25340>;
  <D.25340>:
  block = empty;
  next = MEM[(void * *)block];
  D.25341 = InterlockedCompareExchangePointer (&empty_blocks, next, empty);
  if (D.25341 != empty) goto <D.21746>; else goto <D.21747>;
  <D.21747>:
  {
    int __old_x;

    <D.21749>:
    __old_x = num_empty_blocks;
    D.25342 = __old_x + -1;
    D.25343 = InterlockedCompareExchange (&num_empty_blocks, D.25342, __old_x);
    if (D.25343 != __old_x) goto <D.21749>; else goto <D.21750>;
    <D.21750>:
  }
  MEM[(void * *)block] = 0B;
  block.258 = (unsigned int) block;
  D.25345 = block.258 & 16383;
  D.25346 = D.25345 != 0;
  D.25347 = (long int) D.25346;
  D.25348 = __builtin_expect (D.25347, 0);
  if (D.25348 != 0) goto <D.25349>; else goto <D.25350>;
  <D.25349>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 421, "!((mword)block & (MS_BLOCK_SIZE - 1))");
  <D.25350>:
  D.25351 = block;
  return D.25351;
}


unlink_slot_from_free_list_uncontested (struct MSBlockInfo * * free_blocks, int size_index)
{
  unsigned int size_index.259;
  unsigned int D.25354;
  struct MSBlockInfo * * D.25355;
  unsigned char D.25358;
  unsigned char D.25359;
  _Bool D.25360;
  long int D.25361;
  long int D.25362;
  long long int stat_major_blocks_lazy_swept.260;
  long long int stat_major_blocks_lazy_swept.261;
  void * D.25369;
  void * * D.25370;
  struct MSBlockInfo * D.25373;
  void * D.25374;
  struct MSBlockInfo * block;
  void * obj;

  size_index.259 = (unsigned int) size_index;
  D.25354 = size_index.259 * 4;
  D.25355 = free_blocks + D.25354;
  block = *D.25355;
  if (0 != 0) goto <D.25356>; else goto <D.25357>;
  <D.25356>:
  monoeg_g_log (0B, 4, "no free block to unlink from free_blocks %p size_index %d", free_blocks, size_index);
  <D.21790>:
  goto <D.21790>;
  <D.25357>:
  D.25358 = BIT_FIELD_REF <*block, 8, 96>;
  D.25359 = D.25358 & 16;
  D.25360 = D.25359 == 0;
  D.25361 = (long int) D.25360;
  D.25362 = __builtin_expect (D.25361, 0);
  if (D.25362 != 0) goto <D.25363>; else goto <D.25364>;
  <D.25363>:
  stat_major_blocks_lazy_swept.260 = stat_major_blocks_lazy_swept;
  stat_major_blocks_lazy_swept.261 = stat_major_blocks_lazy_swept.260 + 1;
  stat_major_blocks_lazy_swept = stat_major_blocks_lazy_swept.261;
  sweep_block (block, 0);
  <D.25364>:
  obj = block->free_list;
  if (0 != 0) goto <D.25367>; else goto <D.25368>;
  <D.25367>:
  monoeg_g_log (0B, 4, "block %p in free list had no available object to alloc from", block);
  <D.21791>:
  goto <D.21791>;
  <D.25368>:
  D.25369 = MEM[(void * *)obj];
  block->free_list = D.25369;
  D.25370 = block->free_list;
  if (D.25370 == 0B) goto <D.25371>; else goto <D.25372>;
  <D.25371>:
  size_index.259 = (unsigned int) size_index;
  D.25354 = size_index.259 * 4;
  D.25355 = free_blocks + D.25354;
  D.25373 = block->next_free;
  *D.25355 = D.25373;
  block->next_free = 0B;
  <D.25372>:
  D.25374 = obj;
  return D.25374;
}


major_alloc_degraded (struct MonoVTable * vtable, size_t size)
{
  int size.262;
  void * D.25377;
  unsigned int D.25378;
  int D.25379;
  _Bool D.25380;
  long int D.25381;
  long int D.25382;
  int num_major_sections.263;
  _Bool D.25386;
  long int D.25387;
  long int D.25388;
  int D.25391;
  void * D.25392;
  void * obj;
  int old_num_sections;

  old_num_sections = num_major_sections;
  size.262 = (int) size;
  D.25377 = vtable->gc_descr;
  D.25378 = (unsigned int) D.25377;
  D.25379 = sgen_gc_descr_has_references (D.25378);
  obj = alloc_obj (vtable, size.262, 0, D.25379);
  D.25380 = obj != 0B;
  D.25381 = (long int) D.25380;
  D.25382 = __builtin_expect (D.25381, 1);
  if (D.25382 != 0) goto <D.25383>; else goto <D.25384>;
  <D.25383>:
  num_major_sections.263 = num_major_sections;
  D.25386 = num_major_sections.263 < old_num_sections;
  D.25387 = (long int) D.25386;
  D.25388 = __builtin_expect (D.25387, 0);
  if (D.25388 != 0) goto <D.25389>; else goto <D.25390>;
  <D.25389>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 842, "num_major_sections >= old_num_sections");
  <D.25390>:
  num_major_sections.263 = num_major_sections;
  D.25391 = num_major_sections.263 - old_num_sections;
  sgen_register_major_sections_alloced (D.25391);
  <D.25384>:
  D.25392 = obj;
  return D.25392;
}


major_alloc_small_pinned_obj (struct MonoVTable * vtable, size_t size, gboolean has_references)
{
  int size.264;
  void * D.25397;
  void * res;

  size.264 = (int) size;
  res = alloc_obj (vtable, size.264, 1, has_references);
  if (res == 0B) goto <D.25395>; else goto <D.25396>;
  <D.25395>:
  sgen_perform_collection (0, 1, "pinned alloc failure", 1);
  size.264 = (int) size;
  res = alloc_obj (vtable, size.264, 1, has_references);
  <D.25396>:
  D.25397 = res;
  return D.25397;
}


major_is_object_live (char * obj)
{
  int D.25399;
  gboolean D.25402;
  unsigned int D.25403;
  unsigned int D.25404;
  unsigned int obj.265;
  unsigned int D.25408;
  struct MSBlockHeader * D.25409;
  int obj.266;
  int obj.267;
  int D.25414;
  int D.25415;
  unsigned int D.25419;
  long int D.25420;
  long unsigned int D.25421;
  long unsigned int D.25422;
  _Bool D.25423;
  struct MSBlockInfo * block;
  int word;
  int bit;
  mword objsize;

  D.25399 = sgen_ptr_in_nursery (obj);
  if (D.25399 != 0) goto <D.25400>; else goto <D.25401>;
  <D.25400>:
  D.25402 = 0;
  return D.25402;
  <D.25401>:
  D.25403 = sgen_safe_object_get_size (obj);
  D.25404 = D.25403 + 7;
  objsize = D.25404 & 4294967288;
  if (objsize > 8000) goto <D.25405>; else goto <D.25406>;
  <D.25405>:
  D.25402 = 0;
  return D.25402;
  <D.25406>:
  obj.265 = (unsigned int) obj;
  D.25408 = obj.265 & 4294950912;
  D.25409 = (struct MSBlockHeader *) D.25408;
  block = D.25409->info;
  if (0 != 0) goto <D.25410>; else goto <D.25411>;
  <D.25410>:
  monoeg_g_log (0B, 4, "block %p is pinned, BTW why is this bad?");
  <D.21848>:
  goto <D.21848>;
  <D.25411>:
  {
    int i;

    obj.266 = (int) obj;
    obj.267 = (int) obj;
    D.25414 = obj.267 & -16384;
    D.25415 = obj.266 - D.25414;
    i = D.25415 >> 3;
    if (1 != 0) goto <D.25416>; else goto <D.25417>;
    <D.25416>:
    word = i >> 5;
    bit = i & 31;
    goto <D.25418>;
    <D.25417>:
    word = i >> 6;
    bit = i & 63;
    <D.25418>:
  }
  D.25419 = block->mark_words[word];
  D.25420 = 1 << bit;
  D.25421 = (long unsigned int) D.25420;
  D.25422 = D.25419 & D.25421;
  D.25423 = D.25422 != 0;
  D.25402 = (gboolean) D.25423;
  return D.25402;
}


major_alloc_heap (mword nursery_size, mword nursery_align, int the_nursery_bits)
{
  void * D.25428;
  char * start;

  if (nursery_align != 0) goto <D.25425>; else goto <D.25426>;
  <D.25425>:
  start = sgen_alloc_os_memory_aligned (nursery_size, nursery_align, 3, "nursery");
  goto <D.25427>;
  <D.25426>:
  start = sgen_alloc_os_memory (nursery_size, 3, "nursery");
  <D.25427>:
  D.25428 = start;
  return D.25428;
}


major_get_and_reset_num_major_objects_marked ()
{
  long long int D.25430;

  D.25430 = 0;
  return D.25430;
}


ms_calculate_block_obj_sizes (double factor, int * arr)
{
  double D.25432;
  int D.25433;
  int D.25434;
  unsigned int num_sizes.268;
  unsigned int D.25440;
  int * D.25441;
  int D.25442;
  double target_size;
  int num_sizes;
  int last_size;

  target_size = 8.0e+0;
  num_sizes = 0;
  last_size = 0;
  <D.22467>:
  {
    int target_count;
    int size;

    D.25432 = 1.6368e+4 / target_size;
    target_count = __builtin_lceil (D.25432);
    D.25433 = 16368 / target_count;
    D.25434 = D.25433 & -8;
    size = MIN_EXPR <D.25434, 8000>;
    if (size != last_size) goto <D.25435>; else goto <D.25436>;
    <D.25435>:
    if (arr != 0B) goto <D.25437>; else goto <D.25438>;
    <D.25437>:
    num_sizes.268 = (unsigned int) num_sizes;
    D.25440 = num_sizes.268 * 4;
    D.25441 = arr + D.25440;
    *D.25441 = size;
    <D.25438>:
    num_sizes = num_sizes + 1;
    last_size = size;
    <D.25436>:
    target_size = target_size * factor;
  }
  if (last_size <= 7999) goto <D.22467>; else goto <D.22468>;
  <D.22468>:
  D.25442 = num_sizes;
  return D.25442;
}


alloc_free_block_lists (struct MSBlockInfo * * * lists)
{
  unsigned int i.269;
  unsigned int D.25445;
  struct MSBlockInfo * * * D.25446;
  int num_block_obj_sizes.270;
  unsigned int num_block_obj_sizes.271;
  unsigned int D.25449;
  void * D.25450;
  int i;

  i = 0;
  goto <D.22695>;
  <D.22694>:
  i.269 = (unsigned int) i;
  D.25445 = i.269 * 4;
  D.25446 = lists + D.25445;
  num_block_obj_sizes.270 = num_block_obj_sizes;
  num_block_obj_sizes.271 = (unsigned int) num_block_obj_sizes.270;
  D.25449 = num_block_obj_sizes.271 * 4;
  D.25450 = sgen_alloc_internal_dynamic (D.25449, 15, 1);
  *D.25446 = D.25450;
  i = i + 1;
  <D.22695>:
  if (i <= 3) goto <D.22694>; else goto <D.22696>;
  <D.22696>:
}


ms_find_block_obj_size_index (int size)
{
  int * block_obj_sizes.272;
  unsigned int i.273;
  unsigned int D.25455;
  int * D.25456;
  int D.25457;
  int D.25460;
  int num_block_obj_sizes.274;
  int i;

  if (0 != 0) goto <D.25451>; else goto <D.25452>;
  <D.25451>:
  monoeg_g_log (0B, 4, "size %d is bigger than max small object size %d", size, 8000);
  <D.21712>:
  goto <D.21712>;
  <D.25452>:
  i = 0;
  goto <D.21714>;
  <D.21713>:
  block_obj_sizes.272 = block_obj_sizes;
  i.273 = (unsigned int) i;
  D.25455 = i.273 * 4;
  D.25456 = block_obj_sizes.272 + D.25455;
  D.25457 = *D.25456;
  if (D.25457 >= size) goto <D.25458>; else goto <D.25459>;
  <D.25458>:
  D.25460 = i;
  return D.25460;
  <D.25459>:
  i = i + 1;
  <D.21714>:
  num_block_obj_sizes.274 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.274) goto <D.21713>; else goto <D.21715>;
  <D.21715>:
  monoeg_g_log (0B, 4, "no object of size %d\n", size);
  <D.21716>:
  goto <D.21716>;
}


sgen_marksweep_conc_init (struct SgenMajorCollector * collector)
{
  sgen_marksweep_init_internal (collector, 1);
}


