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;
  long unsigned int D.20777;
  long unsigned int D.20778;
  void * block_obj_sizes.2;
  int * block_obj_sizes.3;
  void * evacuate_block_obj_sizes.4;
  gboolean * evacuate_block_obj_sizes.5;
  long unsigned int D.20783;
  long unsigned int D.20784;
  gboolean * D.20785;
  int D.20786;
  int D.20787;
  int iftmp.6;
  int D.20789;
  int D.20790;
  int D.20794;
  _Bool D.20795;
  long int D.20796;
  long int D.20797;
  int i;

  sgen_register_fixed_internal_mem_type (16, 320);
  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;
  D.20777 = (long unsigned int) num_block_obj_sizes.1;
  D.20778 = D.20777 * 4;
  block_obj_sizes.2 = sgen_alloc_internal_dynamic (D.20778, 15, 1);
  block_obj_sizes = block_obj_sizes.2;
  block_obj_sizes.3 = block_obj_sizes;
  ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, block_obj_sizes.3);
  num_block_obj_sizes.1 = num_block_obj_sizes;
  D.20777 = (long unsigned int) num_block_obj_sizes.1;
  D.20778 = D.20777 * 4;
  evacuate_block_obj_sizes.4 = sgen_alloc_internal_dynamic (D.20778, 15, 1);
  evacuate_block_obj_sizes = evacuate_block_obj_sizes.4;
  i = 0;
  goto <D.20760>;
  <D.20759>:
  evacuate_block_obj_sizes.5 = evacuate_block_obj_sizes;
  D.20783 = (long unsigned int) i;
  D.20784 = D.20783 * 4;
  D.20785 = evacuate_block_obj_sizes.5 + D.20784;
  *D.20785 = 0;
  i = i + 1;
  <D.20760>:
  num_block_obj_sizes.1 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.1) goto <D.20759>; else goto <D.20761>;
  <D.20761>:
  alloc_free_block_lists (&free_block_lists);
  i = 0;
  goto <D.20763>;
  <D.20762>:
  D.20786 = i * 8;
  D.20787 = ms_find_block_obj_size_index (D.20786);
  fast_block_obj_size_indexes[i] = D.20787;
  i = i + 1;
  <D.20763>:
  if (i <= 31) goto <D.20762>; else goto <D.20764>;
  <D.20764>:
  i = 0;
  goto <D.20766>;
  <D.20765>:
  D.20789 = i + 7;
  D.20790 = D.20789 >> 3;
  if (D.20790 <= 31) goto <D.20791>; else goto <D.20792>;
  <D.20791>:
  D.20789 = i + 7;
  D.20790 = D.20789 >> 3;
  iftmp.6 = fast_block_obj_size_indexes[D.20790];
  goto <D.20793>;
  <D.20792>:
  iftmp.6 = ms_find_block_obj_size_index (i);
  <D.20793>:
  D.20794 = ms_find_block_obj_size_index (i);
  D.20795 = iftmp.6 != D.20794;
  D.20796 = (long int) D.20795;
  D.20797 = __builtin_expect (D.20796, 0);
  if (D.20797 != 0) goto <D.20798>; else goto <D.20799>;
  <D.20798>:
  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.20799>:
  i = i + 1;
  <D.20766>:
  if (i <= 255) goto <D.20765>; else goto <D.20767>;
  <D.20767>:
  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);
  collector->section_size = 16384;
  collector->is_parallel = 0;
  concurrent_mark = is_concurrent;
  if (is_concurrent != 0) goto <D.20800>; else goto <D.20801>;
  <D.20800>:
  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.20802>;
  <D.20801>:
  collector->is_concurrent = 0;
  collector->want_synchronous_collection = 0B;
  <D.20802>:
  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.20803>; else goto <D.20804>;
  <D.20803>:
  collector->update_cardtable_mod_union = update_cardtable_mod_union;
  collector->get_cardtable_mod_union_for_object = major_get_cardtable_mod_union_for_object;
  <D.20804>:
  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.20805>; else goto <D.20806>;
  <D.20805>:
  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.20806>:
  if (0 != 0) goto <D.20807>; else goto <D.20808>;
  <D.20807>:
  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.20808>:
}


major_scan_vtype_concurrent (char * start, mword desc, struct SgenGrayQueue * queue)
{
  long unsigned int D.20809;
  long unsigned int D.20810;
  long unsigned int D.20813;
  long unsigned int D.20814;
  long unsigned int D.20815;
  long unsigned int D.20816;
  long unsigned int D.20817;
  long unsigned int D.20818;
  int D.20822;
  struct FILE * gc_debug_file.7;
  void * D.20829;
  int iftmp.8;
  int D.20833;
  int D.20835;
  _Bool D.20837;
  long int D.20838;
  long int D.20839;
  int iftmp.9;
  int D.20845;
  int D.20847;
  _Bool D.20849;
  long int D.20850;
  long int D.20851;
  int D.20857;
  int iftmp.10;
  int D.20866;
  int D.20868;
  _Bool D.20870;
  long int D.20871;
  long int D.20872;
  int iftmp.11;
  int D.20878;
  int D.20880;
  _Bool D.20882;
  long int D.20883;
  long int D.20884;
  long unsigned int D.20887;
  long unsigned int D.20888;
  int D.20889;
  int D.20893;
  void * D.20899;
  int iftmp.12;
  int D.20903;
  int D.20905;
  _Bool D.20907;
  long int D.20908;
  long int D.20909;
  int iftmp.13;
  int D.20915;
  int D.20917;
  _Bool D.20919;
  long int D.20920;
  long int D.20921;
  long unsigned int D.20924;
  long unsigned int D.20925;
  int D.20926;
  int D.20930;
  int iftmp.14;
  int D.20939;
  int D.20941;
  _Bool D.20943;
  long int D.20944;
  long int D.20945;
  int iftmp.15;
  int D.20951;
  int D.20953;
  _Bool D.20955;
  long int D.20956;
  long int D.20957;
  long unsigned int D.20960;
  long unsigned int D.20963;
  int D.20964;
  int D.20965;
  unsigned int D.20968;
  unsigned int el_size.16;
  unsigned int D.20970;
  sizetype D.20971;
  int D.20975;
  void * D.20981;
  int iftmp.17;
  int D.20985;
  int D.20987;
  _Bool D.20989;
  long int D.20990;
  long int D.20991;
  int iftmp.18;
  int D.20997;
  int D.20999;
  _Bool D.21001;
  long int D.21002;
  long int D.21003;
  int D.21009;
  int D.21010;
  long unsigned int D.21011;
  long unsigned int D.21012;
  long unsigned int D.21013;
  long unsigned int D.21014;
  void * * D.21015;
  int D.21019;
  void * D.21025;
  int iftmp.19;
  int D.21029;
  void * D.21031;
  int D.21032;
  _Bool D.21034;
  long int D.21035;
  long int D.21036;
  void * D.21039;
  int iftmp.20;
  int D.21043;
  int D.21045;
  _Bool D.21047;
  long int D.21048;
  long int D.21049;
  sizetype D.21052;
  long unsigned int D.21056;
  int D.21062;
  void * D.21068;
  int iftmp.21;
  int D.21072;
  int D.21074;
  _Bool D.21076;
  long int D.21077;
  long int D.21078;
  int iftmp.22;
  int D.21084;
  int D.21086;
  _Bool D.21088;
  long int D.21089;
  long int D.21090;
  long unsigned int D.21093;
  int D.21099;
  void * D.21105;
  int iftmp.23;
  int D.21109;
  int D.21111;
  _Bool D.21113;
  long int D.21114;
  long int D.21115;
  int iftmp.24;
  int D.21121;
  int D.21123;
  _Bool D.21125;
  long int D.21126;
  long int D.21127;
  long unsigned int D.21130;
  unsigned int D.21131;
  unsigned int D.21132;
  struct MonoVTable * D.21135;
  struct MonoClass * D.21136;
  const char * D.21137;
  const char * D.21138;
  gsize * bitmap_data.25;
  long unsigned int D.21140;
  int D.21146;
  void * D.21152;
  int iftmp.26;
  int D.21156;
  int D.21158;
  _Bool D.21160;
  long int D.21161;
  long int D.21162;
  int iftmp.27;
  int D.21168;
  int D.21170;
  _Bool D.21172;
  long int D.21173;
  long int D.21174;
  int bwords.28;

  start = start + 18446744073709551600;
  D.20809 = desc & 7;
  switch (D.20809) <default: <D.20446>, case 1: <D.20363>, case 2: <D.20374>, case 3: <D.20430>, case 4: <D.20386>, case 5: <D.20422>, case 7: <D.20445>>
  <D.20363>:
  D.20810 = desc & 4294901760;
  if (D.20810 != 0) goto <D.20811>; else goto <D.20812>;
  <D.20811>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.20813 = desc >> 16;
    D.20814 = D.20813 & 255;
    D.20815 = D.20814 * 8;
    _objptr = _objptr + D.20815;
    D.20816 = desc >> 24;
    D.20817 = D.20816 & 255;
    D.20818 = D.20817 * 8;
    _objptr_end = _objptr + D.20818;
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.20821>; else goto <D.20819>;
      <D.20821>:
      D.20822 = sgen_ptr_in_nursery (__old);
      if (D.20822 == 0) goto <D.20823>; else goto <D.20819>;
      <D.20823>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.20824>; else goto <D.20825>;
      <D.20824>:
      if (__old != __copy) goto <D.20826>; else goto <D.20827>;
      <D.20826>:
      gc_debug_file.7 = gc_debug_file;
      D.20829 = *_objptr;
      fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20829, __old);
      gc_debug_file.7 = gc_debug_file;
      fflush (gc_debug_file.7);
      <D.20827>:
      <D.20825>:
      D.20833 = sgen_ptr_in_nursery (__copy);
      if (D.20833 != 0) goto <D.20834>; else goto <D.20831>;
      <D.20834>:
      D.20835 = sgen_ptr_in_nursery (_objptr);
      if (D.20835 == 0) goto <D.20836>; else goto <D.20831>;
      <D.20836>:
      iftmp.8 = 1;
      goto <D.20832>;
      <D.20831>:
      iftmp.8 = 0;
      <D.20832>:
      D.20837 = iftmp.8 != 0;
      D.20838 = (long int) D.20837;
      D.20839 = __builtin_expect (D.20838, 0);
      if (D.20839 != 0) goto <D.20840>; else goto <D.20841>;
      <D.20840>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.20841>:
      goto <D.20820>;
      <D.20819>:
      D.20845 = sgen_ptr_in_nursery (__old);
      if (D.20845 != 0) goto <D.20846>; else goto <D.20843>;
      <D.20846>:
      D.20847 = sgen_ptr_in_nursery (_objptr);
      if (D.20847 == 0) goto <D.20848>; else goto <D.20843>;
      <D.20848>:
      iftmp.9 = 1;
      goto <D.20844>;
      <D.20843>:
      iftmp.9 = 0;
      <D.20844>:
      D.20849 = iftmp.9 != 0;
      D.20850 = (long int) D.20849;
      D.20851 = __builtin_expect (D.20850, 0);
      if (D.20851 != 0) goto <D.20852>; else goto <D.20853>;
      <D.20852>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.20853>:
      <D.20820>:
    }
    _objptr = _objptr + 8;
    goto <D.20371>;
    <D.20370>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.20856>; else goto <D.20854>;
      <D.20856>:
      D.20857 = sgen_ptr_in_nursery (__old);
      if (D.20857 == 0) goto <D.20858>; else goto <D.20854>;
      <D.20858>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.20859>; else goto <D.20860>;
      <D.20859>:
      if (__old != __copy) goto <D.20861>; else goto <D.20862>;
      <D.20861>:
      gc_debug_file.7 = gc_debug_file;
      D.20829 = *_objptr;
      fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20829, __old);
      gc_debug_file.7 = gc_debug_file;
      fflush (gc_debug_file.7);
      <D.20862>:
      <D.20860>:
      D.20866 = sgen_ptr_in_nursery (__copy);
      if (D.20866 != 0) goto <D.20867>; else goto <D.20864>;
      <D.20867>:
      D.20868 = sgen_ptr_in_nursery (_objptr);
      if (D.20868 == 0) goto <D.20869>; else goto <D.20864>;
      <D.20869>:
      iftmp.10 = 1;
      goto <D.20865>;
      <D.20864>:
      iftmp.10 = 0;
      <D.20865>:
      D.20870 = iftmp.10 != 0;
      D.20871 = (long int) D.20870;
      D.20872 = __builtin_expect (D.20871, 0);
      if (D.20872 != 0) goto <D.20873>; else goto <D.20874>;
      <D.20873>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.20874>:
      goto <D.20855>;
      <D.20854>:
      D.20878 = sgen_ptr_in_nursery (__old);
      if (D.20878 != 0) goto <D.20879>; else goto <D.20876>;
      <D.20879>:
      D.20880 = sgen_ptr_in_nursery (_objptr);
      if (D.20880 == 0) goto <D.20881>; else goto <D.20876>;
      <D.20881>:
      iftmp.11 = 1;
      goto <D.20877>;
      <D.20876>:
      iftmp.11 = 0;
      <D.20877>:
      D.20882 = iftmp.11 != 0;
      D.20883 = (long int) D.20882;
      D.20884 = __builtin_expect (D.20883, 0);
      if (D.20884 != 0) goto <D.20885>; else goto <D.20886>;
      <D.20885>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.20886>:
      <D.20855>:
    }
    _objptr = _objptr + 8;
    <D.20371>:
    if (_objptr < _objptr_end) goto <D.20370>; else goto <D.20372>;
    <D.20372>:
  }
  <D.20812>:
  goto <D.20373>;
  <D.20374>:
  {
    void * * _objptr;
    gsize _bmap;

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

      _index = __builtin_ctzl (_bmap);
      D.20887 = (long unsigned int) _index;
      D.20888 = D.20887 * 8;
      _objptr = _objptr + D.20888;
      D.20889 = _index + 1;
      _bmap = _bmap >> D.20889;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20892>; else goto <D.20890>;
        <D.20892>:
        D.20893 = sgen_ptr_in_nursery (__old);
        if (D.20893 == 0) goto <D.20894>; else goto <D.20890>;
        <D.20894>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20895>; else goto <D.20896>;
        <D.20895>:
        if (__old != __copy) goto <D.20897>; else goto <D.20898>;
        <D.20897>:
        gc_debug_file.7 = gc_debug_file;
        D.20899 = *_objptr;
        fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20899, __old);
        gc_debug_file.7 = gc_debug_file;
        fflush (gc_debug_file.7);
        <D.20898>:
        <D.20896>:
        D.20903 = sgen_ptr_in_nursery (__copy);
        if (D.20903 != 0) goto <D.20904>; else goto <D.20901>;
        <D.20904>:
        D.20905 = sgen_ptr_in_nursery (_objptr);
        if (D.20905 == 0) goto <D.20906>; else goto <D.20901>;
        <D.20906>:
        iftmp.12 = 1;
        goto <D.20902>;
        <D.20901>:
        iftmp.12 = 0;
        <D.20902>:
        D.20907 = iftmp.12 != 0;
        D.20908 = (long int) D.20907;
        D.20909 = __builtin_expect (D.20908, 0);
        if (D.20909 != 0) goto <D.20910>; else goto <D.20911>;
        <D.20910>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20911>:
        goto <D.20891>;
        <D.20890>:
        D.20915 = sgen_ptr_in_nursery (__old);
        if (D.20915 != 0) goto <D.20916>; else goto <D.20913>;
        <D.20916>:
        D.20917 = sgen_ptr_in_nursery (_objptr);
        if (D.20917 == 0) goto <D.20918>; else goto <D.20913>;
        <D.20918>:
        iftmp.13 = 1;
        goto <D.20914>;
        <D.20913>:
        iftmp.13 = 0;
        <D.20914>:
        D.20919 = iftmp.13 != 0;
        D.20920 = (long int) D.20919;
        D.20921 = __builtin_expect (D.20920, 0);
        if (D.20921 != 0) goto <D.20922>; else goto <D.20923>;
        <D.20922>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20923>:
        <D.20891>:
      }
      _objptr = _objptr + 8;
    }
    goto <D.20384>;
    <D.20383>:
    {
      int _index;

      _index = __builtin_ctzl (_bmap);
      D.20924 = (long unsigned int) _index;
      D.20925 = D.20924 * 8;
      _objptr = _objptr + D.20925;
      D.20926 = _index + 1;
      _bmap = _bmap >> D.20926;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20929>; else goto <D.20927>;
        <D.20929>:
        D.20930 = sgen_ptr_in_nursery (__old);
        if (D.20930 == 0) goto <D.20931>; else goto <D.20927>;
        <D.20931>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20932>; else goto <D.20933>;
        <D.20932>:
        if (__old != __copy) goto <D.20934>; else goto <D.20935>;
        <D.20934>:
        gc_debug_file.7 = gc_debug_file;
        D.20899 = *_objptr;
        fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20899, __old);
        gc_debug_file.7 = gc_debug_file;
        fflush (gc_debug_file.7);
        <D.20935>:
        <D.20933>:
        D.20939 = sgen_ptr_in_nursery (__copy);
        if (D.20939 != 0) goto <D.20940>; else goto <D.20937>;
        <D.20940>:
        D.20941 = sgen_ptr_in_nursery (_objptr);
        if (D.20941 == 0) goto <D.20942>; else goto <D.20937>;
        <D.20942>:
        iftmp.14 = 1;
        goto <D.20938>;
        <D.20937>:
        iftmp.14 = 0;
        <D.20938>:
        D.20943 = iftmp.14 != 0;
        D.20944 = (long int) D.20943;
        D.20945 = __builtin_expect (D.20944, 0);
        if (D.20945 != 0) goto <D.20946>; else goto <D.20947>;
        <D.20946>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20947>:
        goto <D.20928>;
        <D.20927>:
        D.20951 = sgen_ptr_in_nursery (__old);
        if (D.20951 != 0) goto <D.20952>; else goto <D.20949>;
        <D.20952>:
        D.20953 = sgen_ptr_in_nursery (_objptr);
        if (D.20953 == 0) goto <D.20954>; else goto <D.20949>;
        <D.20954>:
        iftmp.15 = 1;
        goto <D.20950>;
        <D.20949>:
        iftmp.15 = 0;
        <D.20950>:
        D.20955 = iftmp.15 != 0;
        D.20956 = (long int) D.20955;
        D.20957 = __builtin_expect (D.20956, 0);
        if (D.20957 != 0) goto <D.20958>; else goto <D.20959>;
        <D.20958>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20959>:
        <D.20928>:
      }
      _objptr = _objptr + 8;
    }
    <D.20384>:
    if (_bmap != 0) goto <D.20383>; else goto <D.20385>;
    <D.20385>:
  }
  goto <D.20373>;
  <D.20386>:
  D.20960 = desc & 4294950912;
  if (D.20960 != 0) goto <D.20961>; else goto <D.20962>;
  <D.20961>:
  {
    int el_size;
    int etype;

    D.20963 = desc >> 3;
    D.20964 = (int) D.20963;
    el_size = D.20964 & 1023;
    D.20965 = (int) desc;
    etype = D.20965 & 49152;
    if (etype == 16384) goto <D.20966>; else goto <D.20967>;
    <D.20966>:
    {
      void * * p;
      void * * end_refs;

      p = start + 32;
      D.20968 = MEM[(struct MonoArray *)start].max_length;
      el_size.16 = (unsigned int) el_size;
      D.20970 = D.20968 * el_size.16;
      D.20971 = (sizetype) D.20970;
      end_refs = p + D.20971;
      goto <D.20394>;
      <D.20393>:
      {
        void * __old;
        void * __copy;

        __old = *p;
        if (__old != 0B) goto <D.20974>; else goto <D.20972>;
        <D.20974>:
        D.20975 = sgen_ptr_in_nursery (__old);
        if (D.20975 == 0) goto <D.20976>; else goto <D.20972>;
        <D.20976>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (p, __old, queue);
        __copy = *p;
        if (0 != 0) goto <D.20977>; else goto <D.20978>;
        <D.20977>:
        if (__old != __copy) goto <D.20979>; else goto <D.20980>;
        <D.20979>:
        gc_debug_file.7 = gc_debug_file;
        D.20981 = *p;
        fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", p, D.20981, __old);
        gc_debug_file.7 = gc_debug_file;
        fflush (gc_debug_file.7);
        <D.20980>:
        <D.20978>:
        D.20985 = sgen_ptr_in_nursery (__copy);
        if (D.20985 != 0) goto <D.20986>; else goto <D.20983>;
        <D.20986>:
        D.20987 = sgen_ptr_in_nursery (p);
        if (D.20987 == 0) goto <D.20988>; else goto <D.20983>;
        <D.20988>:
        iftmp.17 = 1;
        goto <D.20984>;
        <D.20983>:
        iftmp.17 = 0;
        <D.20984>:
        D.20989 = iftmp.17 != 0;
        D.20990 = (long int) D.20989;
        D.20991 = __builtin_expect (D.20990, 0);
        if (D.20991 != 0) goto <D.20992>; else goto <D.20993>;
        <D.20992>:
        sgen_add_to_global_remset (p, __copy);
        <D.20993>:
        goto <D.20973>;
        <D.20972>:
        D.20997 = sgen_ptr_in_nursery (__old);
        if (D.20997 != 0) goto <D.20998>; else goto <D.20995>;
        <D.20998>:
        D.20999 = sgen_ptr_in_nursery (p);
        if (D.20999 == 0) goto <D.21000>; else goto <D.20995>;
        <D.21000>:
        iftmp.18 = 1;
        goto <D.20996>;
        <D.20995>:
        iftmp.18 = 0;
        <D.20996>:
        D.21001 = iftmp.18 != 0;
        D.21002 = (long int) D.21001;
        D.21003 = __builtin_expect (D.21002, 0);
        if (D.21003 != 0) goto <D.21004>; else goto <D.21005>;
        <D.21004>:
        sgen_add_to_global_remset (p, __old);
        <D.21005>:
        <D.20973>:
      }
      p = p + 8;
      <D.20394>:
      if (p < end_refs) goto <D.20393>; else goto <D.20395>;
      <D.20395>:
    }
    goto <D.21006>;
    <D.20967>:
    if (etype == 32768) goto <D.21007>; else goto <D.21008>;
    <D.21007>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.20813 = desc >> 16;
      D.21009 = (int) D.20813;
      offset = D.21009 & 255;
      D.20816 = desc >> 24;
      D.21010 = (int) D.20816;
      num_refs = D.21010 & 255;
      e_start = start + 32;
      D.20968 = MEM[(struct MonoArray *)start].max_length;
      el_size.16 = (unsigned int) el_size;
      D.20970 = D.20968 * el_size.16;
      D.20971 = (sizetype) D.20970;
      e_end = e_start + D.20971;
      goto <D.20408>;
      <D.20407>:
      {
        void * * p;
        int i;

        p = e_start;
        D.21011 = (long unsigned int) offset;
        D.21012 = D.21011 * 8;
        p = p + D.21012;
        i = 0;
        goto <D.20405>;
        <D.20404>:
        {
          void * __old;
          void * __copy;

          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21015 = p + D.21014;
          __old = *D.21015;
          if (__old != 0B) goto <D.21018>; else goto <D.21016>;
          <D.21018>:
          D.21019 = sgen_ptr_in_nursery (__old);
          if (D.21019 == 0) goto <D.21020>; else goto <D.21016>;
          <D.21020>:
          __builtin_prefetch (__old);
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21015 = p + D.21014;
          major_copy_or_mark_object_concurrent (D.21015, __old, queue);
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21015 = p + D.21014;
          __copy = *D.21015;
          if (0 != 0) goto <D.21021>; else goto <D.21022>;
          <D.21021>:
          if (__old != __copy) goto <D.21023>; else goto <D.21024>;
          <D.21023>:
          gc_debug_file.7 = gc_debug_file;
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21015 = p + D.21014;
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21015 = p + D.21014;
          D.21025 = *D.21015;
          fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", D.21015, D.21025, __old);
          gc_debug_file.7 = gc_debug_file;
          fflush (gc_debug_file.7);
          <D.21024>:
          <D.21022>:
          D.21029 = sgen_ptr_in_nursery (__copy);
          if (D.21029 != 0) goto <D.21030>; else goto <D.21027>;
          <D.21030>:
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21031 = p + D.21014;
          D.21032 = sgen_ptr_in_nursery (D.21031);
          if (D.21032 == 0) goto <D.21033>; else goto <D.21027>;
          <D.21033>:
          iftmp.19 = 1;
          goto <D.21028>;
          <D.21027>:
          iftmp.19 = 0;
          <D.21028>:
          D.21034 = iftmp.19 != 0;
          D.21035 = (long int) D.21034;
          D.21036 = __builtin_expect (D.21035, 0);
          if (D.21036 != 0) goto <D.21037>; else goto <D.21038>;
          <D.21037>:
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21039 = p + D.21014;
          sgen_add_to_global_remset (D.21039, __copy);
          <D.21038>:
          goto <D.21017>;
          <D.21016>:
          D.21043 = sgen_ptr_in_nursery (__old);
          if (D.21043 != 0) goto <D.21044>; else goto <D.21041>;
          <D.21044>:
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21031 = p + D.21014;
          D.21045 = sgen_ptr_in_nursery (D.21031);
          if (D.21045 == 0) goto <D.21046>; else goto <D.21041>;
          <D.21046>:
          iftmp.20 = 1;
          goto <D.21042>;
          <D.21041>:
          iftmp.20 = 0;
          <D.21042>:
          D.21047 = iftmp.20 != 0;
          D.21048 = (long int) D.21047;
          D.21049 = __builtin_expect (D.21048, 0);
          if (D.21049 != 0) goto <D.21050>; else goto <D.21051>;
          <D.21050>:
          D.21013 = (long unsigned int) i;
          D.21014 = D.21013 * 8;
          D.21039 = p + D.21014;
          sgen_add_to_global_remset (D.21039, __old);
          <D.21051>:
          <D.21017>:
        }
        i = i + 1;
        <D.20405>:
        if (i < num_refs) goto <D.20404>; else goto <D.20406>;
        <D.20406>:
        D.21052 = (sizetype) el_size;
        e_start = e_start + D.21052;
      }
      <D.20408>:
      if (e_start < e_end) goto <D.20407>; else goto <D.20409>;
      <D.20409>:
    }
    goto <D.21053>;
    <D.21008>:
    if (etype == 49152) goto <D.21054>; else goto <D.21055>;
    <D.21054>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 32;
      D.20968 = MEM[(struct MonoArray *)start].max_length;
      el_size.16 = (unsigned int) el_size;
      D.20970 = D.20968 * el_size.16;
      D.20971 = (sizetype) D.20970;
      e_end = e_start + D.20971;
      goto <D.20420>;
      <D.20419>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.20417>;
        <D.20416>:
        D.21056 = _bmap & 1;
        if (D.21056 != 0) goto <D.21057>; else goto <D.21058>;
        <D.21057>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.21061>; else goto <D.21059>;
          <D.21061>:
          D.21062 = sgen_ptr_in_nursery (__old);
          if (D.21062 == 0) goto <D.21063>; else goto <D.21059>;
          <D.21063>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.21064>; else goto <D.21065>;
          <D.21064>:
          if (__old != __copy) goto <D.21066>; else goto <D.21067>;
          <D.21066>:
          gc_debug_file.7 = gc_debug_file;
          D.21068 = *p;
          fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", p, D.21068, __old);
          gc_debug_file.7 = gc_debug_file;
          fflush (gc_debug_file.7);
          <D.21067>:
          <D.21065>:
          D.21072 = sgen_ptr_in_nursery (__copy);
          if (D.21072 != 0) goto <D.21073>; else goto <D.21070>;
          <D.21073>:
          D.21074 = sgen_ptr_in_nursery (p);
          if (D.21074 == 0) goto <D.21075>; else goto <D.21070>;
          <D.21075>:
          iftmp.21 = 1;
          goto <D.21071>;
          <D.21070>:
          iftmp.21 = 0;
          <D.21071>:
          D.21076 = iftmp.21 != 0;
          D.21077 = (long int) D.21076;
          D.21078 = __builtin_expect (D.21077, 0);
          if (D.21078 != 0) goto <D.21079>; else goto <D.21080>;
          <D.21079>:
          sgen_add_to_global_remset (p, __copy);
          <D.21080>:
          goto <D.21060>;
          <D.21059>:
          D.21084 = sgen_ptr_in_nursery (__old);
          if (D.21084 != 0) goto <D.21085>; else goto <D.21082>;
          <D.21085>:
          D.21086 = sgen_ptr_in_nursery (p);
          if (D.21086 == 0) goto <D.21087>; else goto <D.21082>;
          <D.21087>:
          iftmp.22 = 1;
          goto <D.21083>;
          <D.21082>:
          iftmp.22 = 0;
          <D.21083>:
          D.21088 = iftmp.22 != 0;
          D.21089 = (long int) D.21088;
          D.21090 = __builtin_expect (D.21089, 0);
          if (D.21090 != 0) goto <D.21091>; else goto <D.21092>;
          <D.21091>:
          sgen_add_to_global_remset (p, __old);
          <D.21092>:
          <D.21060>:
        }
        <D.21058>:
        _bmap = _bmap >> 1;
        p = p + 8;
        <D.20417>:
        if (_bmap != 0) goto <D.20416>; else goto <D.20418>;
        <D.20418>:
        D.21052 = (sizetype) el_size;
        e_start = e_start + D.21052;
      }
      <D.20420>:
      if (e_start < e_end) goto <D.20419>; else goto <D.20421>;
      <D.20421>:
    }
    <D.21055>:
    <D.21053>:
    <D.21006>:
  }
  <D.20962>:
  goto <D.20373>;
  <D.20422>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 16;
    goto <D.20428>;
    <D.20427>:
    D.21093 = _bmap & 1;
    if (D.21093 != 0) goto <D.21094>; else goto <D.21095>;
    <D.21094>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.21098>; else goto <D.21096>;
      <D.21098>:
      D.21099 = sgen_ptr_in_nursery (__old);
      if (D.21099 == 0) goto <D.21100>; else goto <D.21096>;
      <D.21100>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.21101>; else goto <D.21102>;
      <D.21101>:
      if (__old != __copy) goto <D.21103>; else goto <D.21104>;
      <D.21103>:
      gc_debug_file.7 = gc_debug_file;
      D.21105 = *_objptr;
      fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21105, __old);
      gc_debug_file.7 = gc_debug_file;
      fflush (gc_debug_file.7);
      <D.21104>:
      <D.21102>:
      D.21109 = sgen_ptr_in_nursery (__copy);
      if (D.21109 != 0) goto <D.21110>; else goto <D.21107>;
      <D.21110>:
      D.21111 = sgen_ptr_in_nursery (_objptr);
      if (D.21111 == 0) goto <D.21112>; else goto <D.21107>;
      <D.21112>:
      iftmp.23 = 1;
      goto <D.21108>;
      <D.21107>:
      iftmp.23 = 0;
      <D.21108>:
      D.21113 = iftmp.23 != 0;
      D.21114 = (long int) D.21113;
      D.21115 = __builtin_expect (D.21114, 0);
      if (D.21115 != 0) goto <D.21116>; else goto <D.21117>;
      <D.21116>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.21117>:
      goto <D.21097>;
      <D.21096>:
      D.21121 = sgen_ptr_in_nursery (__old);
      if (D.21121 != 0) goto <D.21122>; else goto <D.21119>;
      <D.21122>:
      D.21123 = sgen_ptr_in_nursery (_objptr);
      if (D.21123 == 0) goto <D.21124>; else goto <D.21119>;
      <D.21124>:
      iftmp.24 = 1;
      goto <D.21120>;
      <D.21119>:
      iftmp.24 = 0;
      <D.21120>:
      D.21125 = iftmp.24 != 0;
      D.21126 = (long int) D.21125;
      D.21127 = __builtin_expect (D.21126, 0);
      if (D.21127 != 0) goto <D.21128>; else goto <D.21129>;
      <D.21128>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.21129>:
      <D.21097>:
    }
    <D.21095>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 8;
    <D.20428>:
    if (_bmap != 0) goto <D.20427>; else goto <D.20429>;
    <D.20429>:
  }
  goto <D.20373>;
  <D.20430>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.21130 = *bitmap_data;
    D.21131 = (unsigned int) D.21130;
    D.21132 = D.21131 + 4294967295;
    bwords = (int) D.21132;
    start_run = _objptr;
    bitmap_data = bitmap_data + 8;
    if (0 != 0) goto <D.21133>; else goto <D.21134>;
    <D.21133>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.21135 = myobj->vtable;
      D.21136 = D.21135->klass;
      D.21137 = D.21136->name_space;
      D.21135 = myobj->vtable;
      D.21136 = D.21135->klass;
      D.21138 = D.21136->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21137, D.21138);
    }
    <D.21134>:
    goto <D.20443>;
    <D.20442>:
    {
      gsize _bmap;

      bitmap_data.25 = bitmap_data;
      bitmap_data = bitmap_data.25 + 8;
      _bmap = *bitmap_data.25;
      _objptr = start_run;
      goto <D.20440>;
      <D.20439>:
      D.21140 = _bmap & 1;
      if (D.21140 != 0) goto <D.21141>; else goto <D.21142>;
      <D.21141>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21145>; else goto <D.21143>;
        <D.21145>:
        D.21146 = sgen_ptr_in_nursery (__old);
        if (D.21146 == 0) goto <D.21147>; else goto <D.21143>;
        <D.21147>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21148>; else goto <D.21149>;
        <D.21148>:
        if (__old != __copy) goto <D.21150>; else goto <D.21151>;
        <D.21150>:
        gc_debug_file.7 = gc_debug_file;
        D.21152 = *_objptr;
        fprintf (gc_debug_file.7, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21152, __old);
        gc_debug_file.7 = gc_debug_file;
        fflush (gc_debug_file.7);
        <D.21151>:
        <D.21149>:
        D.21156 = sgen_ptr_in_nursery (__copy);
        if (D.21156 != 0) goto <D.21157>; else goto <D.21154>;
        <D.21157>:
        D.21158 = sgen_ptr_in_nursery (_objptr);
        if (D.21158 == 0) goto <D.21159>; else goto <D.21154>;
        <D.21159>:
        iftmp.26 = 1;
        goto <D.21155>;
        <D.21154>:
        iftmp.26 = 0;
        <D.21155>:
        D.21160 = iftmp.26 != 0;
        D.21161 = (long int) D.21160;
        D.21162 = __builtin_expect (D.21161, 0);
        if (D.21162 != 0) goto <D.21163>; else goto <D.21164>;
        <D.21163>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21164>:
        goto <D.21144>;
        <D.21143>:
        D.21168 = sgen_ptr_in_nursery (__old);
        if (D.21168 != 0) goto <D.21169>; else goto <D.21166>;
        <D.21169>:
        D.21170 = sgen_ptr_in_nursery (_objptr);
        if (D.21170 == 0) goto <D.21171>; else goto <D.21166>;
        <D.21171>:
        iftmp.27 = 1;
        goto <D.21167>;
        <D.21166>:
        iftmp.27 = 0;
        <D.21167>:
        D.21172 = iftmp.27 != 0;
        D.21173 = (long int) D.21172;
        D.21174 = __builtin_expect (D.21173, 0);
        if (D.21174 != 0) goto <D.21175>; else goto <D.21176>;
        <D.21175>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21176>:
        <D.21144>:
      }
      <D.21142>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20440>:
      if (_bmap != 0) goto <D.20439>; else goto <D.20441>;
      <D.20441>:
      start_run = start_run + 512;
    }
    <D.20443>:
    bwords.28 = bwords;
    bwords = bwords.28 + -1;
    if (bwords.28 > 0) goto <D.20442>; else goto <D.20444>;
    <D.20444>:
  }
  goto <D.20373>;
  <D.20445>:
  goto <D.20373>;
  <D.20446>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.20373>:
}


major_copy_or_mark_object_concurrent (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int iftmp.29;
  long unsigned int D.21182;
  long unsigned int D.21183;
  long unsigned int D.21185;
  _Bool D.21187;
  long int D.21188;
  long int D.21189;
  int D.21192;
  unsigned int D.21195;
  unsigned int D.21196;
  long unsigned int D.21197;
  long unsigned int obj.30;
  long unsigned int D.21201;
  struct MSBlockHeader * D.21202;
  long int obj.31;
  long int obj.32;
  long int D.21205;
  long int D.21206;
  long int D.21207;
  long unsigned int D.21213;
  long int D.21214;
  long unsigned int D.21215;
  long unsigned int D.21216;
  long unsigned int D.21219;
  long unsigned int D.21220;
  long unsigned int D.21221;
  int iftmp.33;
  struct GrayQueueSection * D.21228;
  int D.21230;
  _Bool D.21231;
  long int D.21232;
  long int D.21233;
  int D.21237;
  int D.21238;
  int D.21240;
  struct MonoVTable * D.21243;
  void * D.21244;
  long unsigned int D.21245;
  int D.21246;
  int iftmp.34;
  _Bool D.21254;
  long int D.21255;
  long int D.21256;
  int D.21260;
  int D.21261;

  D.21182 = MEM[(mword *)obj];
  D.21183 = D.21182 & 1;
  if (D.21183 != 0) goto <D.21184>; else goto <D.21180>;
  <D.21184>:
  D.21182 = MEM[(mword *)obj];
  D.21185 = D.21182 & 18446744073709551612;
  if (D.21185 != 0) goto <D.21186>; else goto <D.21180>;
  <D.21186>:
  iftmp.29 = 1;
  goto <D.21181>;
  <D.21180>:
  iftmp.29 = 0;
  <D.21181>:
  D.21187 = iftmp.29 != 0;
  D.21188 = (long int) D.21187;
  D.21189 = __builtin_expect (D.21188, 0);
  if (D.21189 != 0) goto <D.21190>; else goto <D.21191>;
  <D.21190>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1280, "!SGEN_OBJECT_IS_FORWARDED (obj)");
  <D.21191>:
  D.21192 = sgen_ptr_in_nursery (obj);
  if (D.21192 == 0) goto <D.21193>; else goto <D.21194>;
  <D.21193>:
  {
    mword objsize;

    D.21195 = sgen_safe_object_get_size (obj);
    D.21196 = D.21195 + 7;
    D.21197 = (long unsigned int) D.21196;
    objsize = D.21197 & 4294967288;
    if (objsize <= 8000) goto <D.21198>; else goto <D.21199>;
    <D.21198>:
    {
      struct MSBlockInfo * block;

      obj.30 = (long unsigned int) obj;
      D.21201 = obj.30 & 18446744073709535232;
      D.21202 = (struct MSBlockHeader *) D.21201;
      block = D.21202->info;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.31 = (long int) obj;
          obj.32 = (long int) obj;
          D.21205 = obj.32 & -16384;
          D.21206 = obj.31 - D.21205;
          D.21207 = D.21206 >> 3;
          i = (int) D.21207;
          if (0 != 0) goto <D.21208>; else goto <D.21209>;
          <D.21208>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.21210>;
          <D.21209>:
          __word = i >> 6;
          __bit = i & 63;
          <D.21210>:
        }
        if (0 != 0) goto <D.21211>; else goto <D.21212>;
        <D.21211>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.20092>:
        goto <D.20092>;
        <D.21212>:
        D.21213 = block->mark_words[__word];
        D.21214 = 1 << __bit;
        D.21215 = (long unsigned int) D.21214;
        D.21216 = D.21213 & D.21215;
        if (D.21216 == 0) goto <D.21217>; else goto <D.21218>;
        <D.21217>:
        D.21213 = block->mark_words[__word];
        D.21214 = 1 << __bit;
        D.21215 = (long unsigned int) D.21214;
        D.21219 = D.21213 | D.21215;
        block->mark_words[__word] = D.21219;
        D.21220 = BIT_FIELD_REF <*block, 64, 64>;
        D.21221 = D.21220 & 8589934592;
        if (D.21221 != 0) goto <D.21222>; else goto <D.21223>;
        <D.21222>:
        D.21228 = queue->first;
        if (D.21228 == 0B) goto <D.21225>; else goto <D.21229>;
        <D.21229>:
        D.21228 = queue->first;
        D.21230 = D.21228->end;
        if (D.21230 == 125) goto <D.21225>; else goto <D.21226>;
        <D.21225>:
        iftmp.33 = 1;
        goto <D.21227>;
        <D.21226>:
        iftmp.33 = 0;
        <D.21227>:
        D.21231 = iftmp.33 != 0;
        D.21232 = (long int) D.21231;
        D.21233 = __builtin_expect (D.21232, 0);
        if (D.21233 != 0) goto <D.21234>; else goto <D.21235>;
        <D.21234>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.21236>;
        <D.21235>:
        D.21228 = queue->first;
        D.21228 = queue->first;
        D.21230 = D.21228->end;
        D.21237 = D.21230;
        D.21238 = D.21237 + 1;
        D.21228->end = D.21238;
        D.21228->objects[D.21237] = obj;
        <D.21236>:
        __builtin_prefetch (obj);
        <D.21223>:
        <D.21218>:
      }
    }
    goto <D.21239>;
    <D.21199>:
    D.21240 = sgen_los_object_is_pinned (obj);
    if (D.21240 != 0) goto <D.21241>; else goto <D.21242>;
    <D.21241>:
    return;
    <D.21242>:
    sgen_los_pin_object (obj);
    D.21182 = MEM[(mword *)obj];
    D.21185 = D.21182 & 18446744073709551612;
    D.21243 = (struct MonoVTable *) D.21185;
    D.21244 = D.21243->gc_descr;
    D.21245 = (long unsigned int) D.21244;
    D.21246 = sgen_gc_descr_has_references (D.21245);
    if (D.21246 != 0) goto <D.21247>; else goto <D.21248>;
    <D.21247>:
    D.21228 = queue->first;
    if (D.21228 == 0B) goto <D.21250>; else goto <D.21253>;
    <D.21253>:
    D.21228 = queue->first;
    D.21230 = D.21228->end;
    if (D.21230 == 125) goto <D.21250>; else goto <D.21251>;
    <D.21250>:
    iftmp.34 = 1;
    goto <D.21252>;
    <D.21251>:
    iftmp.34 = 0;
    <D.21252>:
    D.21254 = iftmp.34 != 0;
    D.21255 = (long int) D.21254;
    D.21256 = __builtin_expect (D.21255, 0);
    if (D.21256 != 0) goto <D.21257>; else goto <D.21258>;
    <D.21257>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.21259>;
    <D.21258>:
    D.21228 = queue->first;
    D.21228 = queue->first;
    D.21230 = D.21228->end;
    D.21260 = D.21230;
    D.21261 = D.21260 + 1;
    D.21228->end = D.21261;
    D.21228->objects[D.21260] = obj;
    <D.21259>:
    __builtin_prefetch (obj);
    <D.21248>:
    <D.21239>:
  }
  <D.21194>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.35;
  long unsigned int D.21264;
  long unsigned int D.21265;
  long unsigned int D.21268;
  guint D.21272;
  struct MonoVTable * D.21273;
  char * forwarded;

  D.21264 = MEM[(mword *)obj];
  D.21265 = D.21264 & 1;
  if (D.21265 != 0) goto <D.21266>; else goto <D.21267>;
  <D.21266>:
  D.21264 = MEM[(mword *)obj];
  D.21268 = D.21264 & 18446744073709551612;
  iftmp.35 = (char *) D.21268;
  goto <D.21269>;
  <D.21267>:
  iftmp.35 = 0B;
  <D.21269>:
  forwarded = iftmp.35;
  if (forwarded != 0B) goto <D.21270>; else goto <D.21271>;
  <D.21270>:
  obj = forwarded;
  <D.21271>:
  D.21264 = MEM[(mword *)obj];
  D.21268 = D.21264 & 18446744073709551612;
  D.21273 = (struct MonoVTable *) D.21268;
  D.21272 = sgen_par_object_get_size (D.21273, obj);
  return D.21272;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.21275;
  long unsigned int D.21276;
  guint D.21281;
  int D.21282;
  int D.21283;
  unsigned int D.21284;
  long unsigned int D.21287;
  int D.21288;
  unsigned int D.21289;
  unsigned int element_size.36;
  unsigned int D.21291;
  long unsigned int D.21292;
  long unsigned int D.21293;
  struct MonoClass * D.21296;
  unsigned char D.21297;
  long unsigned int D.21298;
  long unsigned int D.21299;
  mword descr;
  mword type;

  D.21275 = vtable->gc_descr;
  descr = (mword) D.21275;
  type = descr & 7;
  D.21276 = type + 18446744073709551615;
  if (D.21276 <= 1) goto <D.21277>; else goto <D.21278>;
  <D.21277>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.21279>; else goto <D.21280>;
    <D.21279>:
    D.21282 = MEM[(struct MonoString *)o].length;
    D.21283 = D.21282 * 2;
    D.21284 = (unsigned int) D.21283;
    D.21281 = D.21284 + 26;
    return D.21281;
    <D.21280>:
    D.21281 = (guint) size;
    return D.21281;
  }
  <D.21278>:
  if (type == 4) goto <D.21285>; else goto <D.21286>;
  <D.21285>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.21287 = descr >> 3;
    D.21288 = (int) D.21287;
    element_size = D.21288 & 1023;
    array = o;
    D.21289 = array->max_length;
    element_size.36 = (unsigned int) element_size;
    D.21291 = D.21289 * element_size.36;
    D.21292 = (long unsigned int) D.21291;
    size = D.21292 + 32;
    D.21293 = descr & 8192;
    if (D.21293 != 0) goto <D.21294>; else goto <D.21295>;
    <D.21294>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.21296 = vtable->klass;
    D.21297 = D.21296->rank;
    D.21298 = (long unsigned int) D.21297;
    D.21299 = D.21298 * 8;
    size = D.21299 + size;
    <D.21295>:
    D.21281 = (guint) size;
    return D.21281;
  }
  <D.21286>:
  D.21281 = slow_object_get_size (vtable, o);
  return D.21281;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.21301;
  guint D.21304;
  int D.21305;
  int D.21306;
  unsigned int D.21307;
  unsigned char D.21308;
  int D.21311;
  unsigned int D.21312;
  unsigned int D.21313;
  unsigned int D.21314;
  long unsigned int D.21315;
  struct MonoArrayBounds * D.21316;
  _Bool D.21317;
  long int D.21318;
  long int D.21319;
  long unsigned int D.21322;
  long unsigned int D.21323;
  int D.21324;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.21301 = mono_defaults.string_class;
  if (D.21301 == klass) goto <D.21302>; else goto <D.21303>;
  <D.21302>:
  D.21305 = MEM[(struct MonoString *)o].length;
  D.21306 = D.21305 * 2;
  D.21307 = (unsigned int) D.21306;
  D.21304 = D.21307 + 26;
  return D.21304;
  <D.21303>:
  D.21308 = klass->rank;
  if (D.21308 != 0) goto <D.21309>; else goto <D.21310>;
  <D.21309>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.21311 = klass->sizes.element_size;
    D.21312 = (unsigned int) D.21311;
    D.21313 = array->max_length;
    D.21314 = D.21312 * D.21313;
    D.21315 = (long unsigned int) D.21314;
    size = D.21315 + 32;
    D.21316 = array->bounds;
    D.21317 = D.21316 != 0B;
    D.21318 = (long int) D.21317;
    D.21319 = __builtin_expect (D.21318, 0);
    if (D.21319 != 0) goto <D.21320>; else goto <D.21321>;
    <D.21320>:
    size = size + 3;
    size = size & 18446744073709551612;
    D.21308 = klass->rank;
    D.21322 = (long unsigned int) D.21308;
    D.21323 = D.21322 * 8;
    size = D.21323 + size;
    <D.21321>:
    D.21304 = (guint) size;
    return D.21304;
  }
  <D.21310>:
  D.21324 = klass->instance_size;
  D.21304 = (guint) D.21324;
  return D.21304;
}


sgen_gc_descr_has_references (mword desc)
{
  long unsigned int D.21326;
  gboolean D.21329;
  long unsigned int D.21330;
  long unsigned int D.21333;

  D.21326 = desc & 4294901767;
  if (D.21326 == 1) goto <D.21327>; else goto <D.21328>;
  <D.21327>:
  D.21329 = 0;
  return D.21329;
  <D.21328>:
  D.21330 = desc & 49159;
  if (D.21330 == 4) goto <D.21331>; else goto <D.21332>;
  <D.21331>:
  D.21329 = 0;
  return D.21329;
  <D.21332>:
  D.21333 = desc & 7;
  if (D.21333 == 7) goto <D.21334>; else goto <D.21335>;
  <D.21334>:
  D.21329 = 0;
  return D.21329;
  <D.21335>:
  D.21329 = 1;
  return D.21329;
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.21337;
  int sgen_nursery_bits.37;
  int D.21339;
  int D.21340;
  long unsigned int D.21341;
  long unsigned int p.38;
  long unsigned int D.21343;
  char * sgen_nursery_start.39;
  long unsigned int sgen_nursery_start.40;
  _Bool D.21346;

  sgen_nursery_bits.37 = sgen_nursery_bits;
  D.21339 = 1 << sgen_nursery_bits.37;
  D.21340 = -D.21339;
  D.21341 = (long unsigned int) D.21340;
  p.38 = (long unsigned int) p;
  D.21343 = D.21341 & p.38;
  sgen_nursery_start.39 = sgen_nursery_start;
  sgen_nursery_start.40 = (long unsigned int) sgen_nursery_start.39;
  D.21346 = D.21343 == sgen_nursery_start.40;
  D.21337 = (gboolean) D.21346;
  return D.21337;
}


major_scan_object_concurrent (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.21348;
  long unsigned int D.21349;
  long unsigned int D.21350;
  long unsigned int D.21351;
  long unsigned int D.21354;
  long unsigned int D.21355;
  long unsigned int D.21356;
  long unsigned int D.21357;
  long unsigned int D.21358;
  long unsigned int D.21359;
  int D.21363;
  struct FILE * gc_debug_file.41;
  void * D.21370;
  int iftmp.42;
  int D.21374;
  int D.21376;
  _Bool D.21378;
  long int D.21379;
  long int D.21380;
  int iftmp.43;
  int D.21386;
  int D.21388;
  _Bool D.21390;
  long int D.21391;
  long int D.21392;
  int D.21398;
  int iftmp.44;
  int D.21407;
  int D.21409;
  _Bool D.21411;
  long int D.21412;
  long int D.21413;
  int iftmp.45;
  int D.21419;
  int D.21421;
  _Bool D.21423;
  long int D.21424;
  long int D.21425;
  long unsigned int D.21428;
  long unsigned int D.21429;
  int D.21430;
  int D.21434;
  void * D.21440;
  int iftmp.46;
  int D.21444;
  int D.21446;
  _Bool D.21448;
  long int D.21449;
  long int D.21450;
  int iftmp.47;
  int D.21456;
  int D.21458;
  _Bool D.21460;
  long int D.21461;
  long int D.21462;
  long unsigned int D.21465;
  long unsigned int D.21466;
  int D.21467;
  int D.21471;
  int iftmp.48;
  int D.21480;
  int D.21482;
  _Bool D.21484;
  long int D.21485;
  long int D.21486;
  int iftmp.49;
  int D.21492;
  int D.21494;
  _Bool D.21496;
  long int D.21497;
  long int D.21498;
  long unsigned int D.21501;
  long unsigned int D.21504;
  int D.21505;
  int D.21506;
  unsigned int D.21509;
  unsigned int el_size.50;
  unsigned int D.21511;
  sizetype D.21512;
  int D.21516;
  void * D.21522;
  int iftmp.51;
  int D.21526;
  int D.21528;
  _Bool D.21530;
  long int D.21531;
  long int D.21532;
  int iftmp.52;
  int D.21538;
  int D.21540;
  _Bool D.21542;
  long int D.21543;
  long int D.21544;
  int D.21550;
  int D.21551;
  long unsigned int D.21552;
  long unsigned int D.21553;
  long unsigned int D.21554;
  long unsigned int D.21555;
  void * * D.21556;
  int D.21560;
  void * D.21566;
  int iftmp.53;
  int D.21570;
  void * D.21572;
  int D.21573;
  _Bool D.21575;
  long int D.21576;
  long int D.21577;
  void * D.21580;
  int iftmp.54;
  int D.21584;
  int D.21586;
  _Bool D.21588;
  long int D.21589;
  long int D.21590;
  sizetype D.21593;
  long unsigned int D.21597;
  int D.21603;
  void * D.21609;
  int iftmp.55;
  int D.21613;
  int D.21615;
  _Bool D.21617;
  long int D.21618;
  long int D.21619;
  int iftmp.56;
  int D.21625;
  int D.21627;
  _Bool D.21629;
  long int D.21630;
  long int D.21631;
  long unsigned int D.21634;
  int D.21640;
  void * D.21646;
  int iftmp.57;
  int D.21650;
  int D.21652;
  _Bool D.21654;
  long int D.21655;
  long int D.21656;
  int iftmp.58;
  int D.21662;
  int D.21664;
  _Bool D.21666;
  long int D.21667;
  long int D.21668;
  long unsigned int D.21671;
  unsigned int D.21672;
  unsigned int D.21673;
  struct MonoVTable * D.21676;
  struct MonoClass * D.21677;
  const char * D.21678;
  const char * D.21679;
  gsize * bitmap_data.59;
  long unsigned int D.21681;
  int D.21687;
  void * D.21693;
  int iftmp.60;
  int D.21697;
  int D.21699;
  _Bool D.21701;
  long int D.21702;
  long int D.21703;
  int iftmp.61;
  int D.21709;
  int D.21711;
  _Bool D.21713;
  long int D.21714;
  long int D.21715;
  int bwords.62;
  long unsigned int D.21719;
  gsize * mbitmap_data.63;
  long unsigned int D.21721;
  unsigned int D.21722;
  unsigned int D.21723;
  struct MonoClass * D.21724;
  unsigned int el_size.64;
  unsigned int D.21726;
  sizetype D.21727;
  const char * D.21730;
  const char * D.21731;
  gsize * bitmap_data.65;
  long unsigned int D.21733;
  int D.21739;
  void * D.21745;
  int iftmp.66;
  int D.21749;
  int D.21751;
  _Bool D.21753;
  long int D.21754;
  long int D.21755;
  int iftmp.67;
  int D.21761;
  int D.21763;
  _Bool D.21765;
  long int D.21766;
  long int D.21767;
  unsigned int bwords.68;
  sizetype D.21771;

  {
    struct GCVTable * vt;
    mword desc;

    D.21348 = MEM[(mword *)start];
    D.21349 = D.21348 & 18446744073709551612;
    vt = (struct GCVTable *) D.21349;
    desc = vt->desc;
    D.21350 = desc & 7;
    switch (D.21350) <default: <D.20357>, case 1: <D.20252>, case 2: <D.20263>, case 3: <D.20319>, case 4: <D.20275>, case 5: <D.20311>, case 6: <D.20334>, case 7: <D.20356>>
    <D.20252>:
    D.21351 = desc & 4294901760;
    if (D.21351 != 0) goto <D.21352>; else goto <D.21353>;
    <D.21352>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.21354 = desc >> 16;
      D.21355 = D.21354 & 255;
      D.21356 = D.21355 * 8;
      _objptr = _objptr + D.21356;
      D.21357 = desc >> 24;
      D.21358 = D.21357 & 255;
      D.21359 = D.21358 * 8;
      _objptr_end = _objptr + D.21359;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21362>; else goto <D.21360>;
        <D.21362>:
        D.21363 = sgen_ptr_in_nursery (__old);
        if (D.21363 == 0) goto <D.21364>; else goto <D.21360>;
        <D.21364>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21365>; else goto <D.21366>;
        <D.21365>:
        if (__old != __copy) goto <D.21367>; else goto <D.21368>;
        <D.21367>:
        gc_debug_file.41 = gc_debug_file;
        D.21370 = *_objptr;
        fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21370, __old);
        gc_debug_file.41 = gc_debug_file;
        fflush (gc_debug_file.41);
        <D.21368>:
        <D.21366>:
        D.21374 = sgen_ptr_in_nursery (__copy);
        if (D.21374 != 0) goto <D.21375>; else goto <D.21372>;
        <D.21375>:
        D.21376 = sgen_ptr_in_nursery (_objptr);
        if (D.21376 == 0) goto <D.21377>; else goto <D.21372>;
        <D.21377>:
        iftmp.42 = 1;
        goto <D.21373>;
        <D.21372>:
        iftmp.42 = 0;
        <D.21373>:
        D.21378 = iftmp.42 != 0;
        D.21379 = (long int) D.21378;
        D.21380 = __builtin_expect (D.21379, 0);
        if (D.21380 != 0) goto <D.21381>; else goto <D.21382>;
        <D.21381>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21382>:
        goto <D.21361>;
        <D.21360>:
        D.21386 = sgen_ptr_in_nursery (__old);
        if (D.21386 != 0) goto <D.21387>; else goto <D.21384>;
        <D.21387>:
        D.21388 = sgen_ptr_in_nursery (_objptr);
        if (D.21388 == 0) goto <D.21389>; else goto <D.21384>;
        <D.21389>:
        iftmp.43 = 1;
        goto <D.21385>;
        <D.21384>:
        iftmp.43 = 0;
        <D.21385>:
        D.21390 = iftmp.43 != 0;
        D.21391 = (long int) D.21390;
        D.21392 = __builtin_expect (D.21391, 0);
        if (D.21392 != 0) goto <D.21393>; else goto <D.21394>;
        <D.21393>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21394>:
        <D.21361>:
      }
      _objptr = _objptr + 8;
      goto <D.20260>;
      <D.20259>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21397>; else goto <D.21395>;
        <D.21397>:
        D.21398 = sgen_ptr_in_nursery (__old);
        if (D.21398 == 0) goto <D.21399>; else goto <D.21395>;
        <D.21399>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21400>; else goto <D.21401>;
        <D.21400>:
        if (__old != __copy) goto <D.21402>; else goto <D.21403>;
        <D.21402>:
        gc_debug_file.41 = gc_debug_file;
        D.21370 = *_objptr;
        fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21370, __old);
        gc_debug_file.41 = gc_debug_file;
        fflush (gc_debug_file.41);
        <D.21403>:
        <D.21401>:
        D.21407 = sgen_ptr_in_nursery (__copy);
        if (D.21407 != 0) goto <D.21408>; else goto <D.21405>;
        <D.21408>:
        D.21409 = sgen_ptr_in_nursery (_objptr);
        if (D.21409 == 0) goto <D.21410>; else goto <D.21405>;
        <D.21410>:
        iftmp.44 = 1;
        goto <D.21406>;
        <D.21405>:
        iftmp.44 = 0;
        <D.21406>:
        D.21411 = iftmp.44 != 0;
        D.21412 = (long int) D.21411;
        D.21413 = __builtin_expect (D.21412, 0);
        if (D.21413 != 0) goto <D.21414>; else goto <D.21415>;
        <D.21414>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21415>:
        goto <D.21396>;
        <D.21395>:
        D.21419 = sgen_ptr_in_nursery (__old);
        if (D.21419 != 0) goto <D.21420>; else goto <D.21417>;
        <D.21420>:
        D.21421 = sgen_ptr_in_nursery (_objptr);
        if (D.21421 == 0) goto <D.21422>; else goto <D.21417>;
        <D.21422>:
        iftmp.45 = 1;
        goto <D.21418>;
        <D.21417>:
        iftmp.45 = 0;
        <D.21418>:
        D.21423 = iftmp.45 != 0;
        D.21424 = (long int) D.21423;
        D.21425 = __builtin_expect (D.21424, 0);
        if (D.21425 != 0) goto <D.21426>; else goto <D.21427>;
        <D.21426>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21427>:
        <D.21396>:
      }
      _objptr = _objptr + 8;
      <D.20260>:
      if (_objptr < _objptr_end) goto <D.20259>; else goto <D.20261>;
      <D.20261>:
    }
    <D.21353>:
    goto <D.20262>;
    <D.20263>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.21428 = (long unsigned int) _index;
        D.21429 = D.21428 * 8;
        _objptr = _objptr + D.21429;
        D.21430 = _index + 1;
        _bmap = _bmap >> D.21430;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21433>; else goto <D.21431>;
          <D.21433>:
          D.21434 = sgen_ptr_in_nursery (__old);
          if (D.21434 == 0) goto <D.21435>; else goto <D.21431>;
          <D.21435>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21436>; else goto <D.21437>;
          <D.21436>:
          if (__old != __copy) goto <D.21438>; else goto <D.21439>;
          <D.21438>:
          gc_debug_file.41 = gc_debug_file;
          D.21440 = *_objptr;
          fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21440, __old);
          gc_debug_file.41 = gc_debug_file;
          fflush (gc_debug_file.41);
          <D.21439>:
          <D.21437>:
          D.21444 = sgen_ptr_in_nursery (__copy);
          if (D.21444 != 0) goto <D.21445>; else goto <D.21442>;
          <D.21445>:
          D.21446 = sgen_ptr_in_nursery (_objptr);
          if (D.21446 == 0) goto <D.21447>; else goto <D.21442>;
          <D.21447>:
          iftmp.46 = 1;
          goto <D.21443>;
          <D.21442>:
          iftmp.46 = 0;
          <D.21443>:
          D.21448 = iftmp.46 != 0;
          D.21449 = (long int) D.21448;
          D.21450 = __builtin_expect (D.21449, 0);
          if (D.21450 != 0) goto <D.21451>; else goto <D.21452>;
          <D.21451>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21452>:
          goto <D.21432>;
          <D.21431>:
          D.21456 = sgen_ptr_in_nursery (__old);
          if (D.21456 != 0) goto <D.21457>; else goto <D.21454>;
          <D.21457>:
          D.21458 = sgen_ptr_in_nursery (_objptr);
          if (D.21458 == 0) goto <D.21459>; else goto <D.21454>;
          <D.21459>:
          iftmp.47 = 1;
          goto <D.21455>;
          <D.21454>:
          iftmp.47 = 0;
          <D.21455>:
          D.21460 = iftmp.47 != 0;
          D.21461 = (long int) D.21460;
          D.21462 = __builtin_expect (D.21461, 0);
          if (D.21462 != 0) goto <D.21463>; else goto <D.21464>;
          <D.21463>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21464>:
          <D.21432>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.20273>;
      <D.20272>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.21465 = (long unsigned int) _index;
        D.21466 = D.21465 * 8;
        _objptr = _objptr + D.21466;
        D.21467 = _index + 1;
        _bmap = _bmap >> D.21467;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21470>; else goto <D.21468>;
          <D.21470>:
          D.21471 = sgen_ptr_in_nursery (__old);
          if (D.21471 == 0) goto <D.21472>; else goto <D.21468>;
          <D.21472>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21473>; else goto <D.21474>;
          <D.21473>:
          if (__old != __copy) goto <D.21475>; else goto <D.21476>;
          <D.21475>:
          gc_debug_file.41 = gc_debug_file;
          D.21440 = *_objptr;
          fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21440, __old);
          gc_debug_file.41 = gc_debug_file;
          fflush (gc_debug_file.41);
          <D.21476>:
          <D.21474>:
          D.21480 = sgen_ptr_in_nursery (__copy);
          if (D.21480 != 0) goto <D.21481>; else goto <D.21478>;
          <D.21481>:
          D.21482 = sgen_ptr_in_nursery (_objptr);
          if (D.21482 == 0) goto <D.21483>; else goto <D.21478>;
          <D.21483>:
          iftmp.48 = 1;
          goto <D.21479>;
          <D.21478>:
          iftmp.48 = 0;
          <D.21479>:
          D.21484 = iftmp.48 != 0;
          D.21485 = (long int) D.21484;
          D.21486 = __builtin_expect (D.21485, 0);
          if (D.21486 != 0) goto <D.21487>; else goto <D.21488>;
          <D.21487>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21488>:
          goto <D.21469>;
          <D.21468>:
          D.21492 = sgen_ptr_in_nursery (__old);
          if (D.21492 != 0) goto <D.21493>; else goto <D.21490>;
          <D.21493>:
          D.21494 = sgen_ptr_in_nursery (_objptr);
          if (D.21494 == 0) goto <D.21495>; else goto <D.21490>;
          <D.21495>:
          iftmp.49 = 1;
          goto <D.21491>;
          <D.21490>:
          iftmp.49 = 0;
          <D.21491>:
          D.21496 = iftmp.49 != 0;
          D.21497 = (long int) D.21496;
          D.21498 = __builtin_expect (D.21497, 0);
          if (D.21498 != 0) goto <D.21499>; else goto <D.21500>;
          <D.21499>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21500>:
          <D.21469>:
        }
        _objptr = _objptr + 8;
      }
      <D.20273>:
      if (_bmap != 0) goto <D.20272>; else goto <D.20274>;
      <D.20274>:
    }
    goto <D.20262>;
    <D.20275>:
    D.21501 = desc & 4294950912;
    if (D.21501 != 0) goto <D.21502>; else goto <D.21503>;
    <D.21502>:
    {
      int el_size;
      int etype;

      D.21504 = desc >> 3;
      D.21505 = (int) D.21504;
      el_size = D.21505 & 1023;
      D.21506 = (int) desc;
      etype = D.21506 & 49152;
      if (etype == 16384) goto <D.21507>; else goto <D.21508>;
      <D.21507>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.21509 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.21511 = D.21509 * el_size.50;
        D.21512 = (sizetype) D.21511;
        end_refs = p + D.21512;
        goto <D.20283>;
        <D.20282>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.21515>; else goto <D.21513>;
          <D.21515>:
          D.21516 = sgen_ptr_in_nursery (__old);
          if (D.21516 == 0) goto <D.21517>; else goto <D.21513>;
          <D.21517>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.21518>; else goto <D.21519>;
          <D.21518>:
          if (__old != __copy) goto <D.21520>; else goto <D.21521>;
          <D.21520>:
          gc_debug_file.41 = gc_debug_file;
          D.21522 = *p;
          fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", p, D.21522, __old);
          gc_debug_file.41 = gc_debug_file;
          fflush (gc_debug_file.41);
          <D.21521>:
          <D.21519>:
          D.21526 = sgen_ptr_in_nursery (__copy);
          if (D.21526 != 0) goto <D.21527>; else goto <D.21524>;
          <D.21527>:
          D.21528 = sgen_ptr_in_nursery (p);
          if (D.21528 == 0) goto <D.21529>; else goto <D.21524>;
          <D.21529>:
          iftmp.51 = 1;
          goto <D.21525>;
          <D.21524>:
          iftmp.51 = 0;
          <D.21525>:
          D.21530 = iftmp.51 != 0;
          D.21531 = (long int) D.21530;
          D.21532 = __builtin_expect (D.21531, 0);
          if (D.21532 != 0) goto <D.21533>; else goto <D.21534>;
          <D.21533>:
          sgen_add_to_global_remset (p, __copy);
          <D.21534>:
          goto <D.21514>;
          <D.21513>:
          D.21538 = sgen_ptr_in_nursery (__old);
          if (D.21538 != 0) goto <D.21539>; else goto <D.21536>;
          <D.21539>:
          D.21540 = sgen_ptr_in_nursery (p);
          if (D.21540 == 0) goto <D.21541>; else goto <D.21536>;
          <D.21541>:
          iftmp.52 = 1;
          goto <D.21537>;
          <D.21536>:
          iftmp.52 = 0;
          <D.21537>:
          D.21542 = iftmp.52 != 0;
          D.21543 = (long int) D.21542;
          D.21544 = __builtin_expect (D.21543, 0);
          if (D.21544 != 0) goto <D.21545>; else goto <D.21546>;
          <D.21545>:
          sgen_add_to_global_remset (p, __old);
          <D.21546>:
          <D.21514>:
        }
        p = p + 8;
        <D.20283>:
        if (p < end_refs) goto <D.20282>; else goto <D.20284>;
        <D.20284>:
      }
      goto <D.21547>;
      <D.21508>:
      if (etype == 32768) goto <D.21548>; else goto <D.21549>;
      <D.21548>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.21354 = desc >> 16;
        D.21550 = (int) D.21354;
        offset = D.21550 & 255;
        D.21357 = desc >> 24;
        D.21551 = (int) D.21357;
        num_refs = D.21551 & 255;
        e_start = start + 32;
        D.21509 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.21511 = D.21509 * el_size.50;
        D.21512 = (sizetype) D.21511;
        e_end = e_start + D.21512;
        goto <D.20297>;
        <D.20296>:
        {
          void * * p;
          int i;

          p = e_start;
          D.21552 = (long unsigned int) offset;
          D.21553 = D.21552 * 8;
          p = p + D.21553;
          i = 0;
          goto <D.20294>;
          <D.20293>:
          {
            void * __old;
            void * __copy;

            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21556 = p + D.21555;
            __old = *D.21556;
            if (__old != 0B) goto <D.21559>; else goto <D.21557>;
            <D.21559>:
            D.21560 = sgen_ptr_in_nursery (__old);
            if (D.21560 == 0) goto <D.21561>; else goto <D.21557>;
            <D.21561>:
            __builtin_prefetch (__old);
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21556 = p + D.21555;
            major_copy_or_mark_object_concurrent (D.21556, __old, queue);
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21556 = p + D.21555;
            __copy = *D.21556;
            if (0 != 0) goto <D.21562>; else goto <D.21563>;
            <D.21562>:
            if (__old != __copy) goto <D.21564>; else goto <D.21565>;
            <D.21564>:
            gc_debug_file.41 = gc_debug_file;
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21556 = p + D.21555;
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21556 = p + D.21555;
            D.21566 = *D.21556;
            fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", D.21556, D.21566, __old);
            gc_debug_file.41 = gc_debug_file;
            fflush (gc_debug_file.41);
            <D.21565>:
            <D.21563>:
            D.21570 = sgen_ptr_in_nursery (__copy);
            if (D.21570 != 0) goto <D.21571>; else goto <D.21568>;
            <D.21571>:
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21572 = p + D.21555;
            D.21573 = sgen_ptr_in_nursery (D.21572);
            if (D.21573 == 0) goto <D.21574>; else goto <D.21568>;
            <D.21574>:
            iftmp.53 = 1;
            goto <D.21569>;
            <D.21568>:
            iftmp.53 = 0;
            <D.21569>:
            D.21575 = iftmp.53 != 0;
            D.21576 = (long int) D.21575;
            D.21577 = __builtin_expect (D.21576, 0);
            if (D.21577 != 0) goto <D.21578>; else goto <D.21579>;
            <D.21578>:
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21580 = p + D.21555;
            sgen_add_to_global_remset (D.21580, __copy);
            <D.21579>:
            goto <D.21558>;
            <D.21557>:
            D.21584 = sgen_ptr_in_nursery (__old);
            if (D.21584 != 0) goto <D.21585>; else goto <D.21582>;
            <D.21585>:
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21572 = p + D.21555;
            D.21586 = sgen_ptr_in_nursery (D.21572);
            if (D.21586 == 0) goto <D.21587>; else goto <D.21582>;
            <D.21587>:
            iftmp.54 = 1;
            goto <D.21583>;
            <D.21582>:
            iftmp.54 = 0;
            <D.21583>:
            D.21588 = iftmp.54 != 0;
            D.21589 = (long int) D.21588;
            D.21590 = __builtin_expect (D.21589, 0);
            if (D.21590 != 0) goto <D.21591>; else goto <D.21592>;
            <D.21591>:
            D.21554 = (long unsigned int) i;
            D.21555 = D.21554 * 8;
            D.21580 = p + D.21555;
            sgen_add_to_global_remset (D.21580, __old);
            <D.21592>:
            <D.21558>:
          }
          i = i + 1;
          <D.20294>:
          if (i < num_refs) goto <D.20293>; else goto <D.20295>;
          <D.20295>:
          D.21593 = (sizetype) el_size;
          e_start = e_start + D.21593;
        }
        <D.20297>:
        if (e_start < e_end) goto <D.20296>; else goto <D.20298>;
        <D.20298>:
      }
      goto <D.21594>;
      <D.21549>:
      if (etype == 49152) goto <D.21595>; else goto <D.21596>;
      <D.21595>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.21509 = MEM[(struct MonoArray *)start].max_length;
        el_size.50 = (unsigned int) el_size;
        D.21511 = D.21509 * el_size.50;
        D.21512 = (sizetype) D.21511;
        e_end = e_start + D.21512;
        goto <D.20309>;
        <D.20308>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20306>;
          <D.20305>:
          D.21597 = _bmap & 1;
          if (D.21597 != 0) goto <D.21598>; else goto <D.21599>;
          <D.21598>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.21602>; else goto <D.21600>;
            <D.21602>:
            D.21603 = sgen_ptr_in_nursery (__old);
            if (D.21603 == 0) goto <D.21604>; else goto <D.21600>;
            <D.21604>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.21605>; else goto <D.21606>;
            <D.21605>:
            if (__old != __copy) goto <D.21607>; else goto <D.21608>;
            <D.21607>:
            gc_debug_file.41 = gc_debug_file;
            D.21609 = *p;
            fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", p, D.21609, __old);
            gc_debug_file.41 = gc_debug_file;
            fflush (gc_debug_file.41);
            <D.21608>:
            <D.21606>:
            D.21613 = sgen_ptr_in_nursery (__copy);
            if (D.21613 != 0) goto <D.21614>; else goto <D.21611>;
            <D.21614>:
            D.21615 = sgen_ptr_in_nursery (p);
            if (D.21615 == 0) goto <D.21616>; else goto <D.21611>;
            <D.21616>:
            iftmp.55 = 1;
            goto <D.21612>;
            <D.21611>:
            iftmp.55 = 0;
            <D.21612>:
            D.21617 = iftmp.55 != 0;
            D.21618 = (long int) D.21617;
            D.21619 = __builtin_expect (D.21618, 0);
            if (D.21619 != 0) goto <D.21620>; else goto <D.21621>;
            <D.21620>:
            sgen_add_to_global_remset (p, __copy);
            <D.21621>:
            goto <D.21601>;
            <D.21600>:
            D.21625 = sgen_ptr_in_nursery (__old);
            if (D.21625 != 0) goto <D.21626>; else goto <D.21623>;
            <D.21626>:
            D.21627 = sgen_ptr_in_nursery (p);
            if (D.21627 == 0) goto <D.21628>; else goto <D.21623>;
            <D.21628>:
            iftmp.56 = 1;
            goto <D.21624>;
            <D.21623>:
            iftmp.56 = 0;
            <D.21624>:
            D.21629 = iftmp.56 != 0;
            D.21630 = (long int) D.21629;
            D.21631 = __builtin_expect (D.21630, 0);
            if (D.21631 != 0) goto <D.21632>; else goto <D.21633>;
            <D.21632>:
            sgen_add_to_global_remset (p, __old);
            <D.21633>:
            <D.21601>:
          }
          <D.21599>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20306>:
          if (_bmap != 0) goto <D.20305>; else goto <D.20307>;
          <D.20307>:
          D.21593 = (sizetype) el_size;
          e_start = e_start + D.21593;
        }
        <D.20309>:
        if (e_start < e_end) goto <D.20308>; else goto <D.20310>;
        <D.20310>:
      }
      <D.21596>:
      <D.21594>:
      <D.21547>:
    }
    <D.21503>:
    goto <D.20262>;
    <D.20311>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20317>;
      <D.20316>:
      D.21634 = _bmap & 1;
      if (D.21634 != 0) goto <D.21635>; else goto <D.21636>;
      <D.21635>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21639>; else goto <D.21637>;
        <D.21639>:
        D.21640 = sgen_ptr_in_nursery (__old);
        if (D.21640 == 0) goto <D.21641>; else goto <D.21637>;
        <D.21641>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21642>; else goto <D.21643>;
        <D.21642>:
        if (__old != __copy) goto <D.21644>; else goto <D.21645>;
        <D.21644>:
        gc_debug_file.41 = gc_debug_file;
        D.21646 = *_objptr;
        fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21646, __old);
        gc_debug_file.41 = gc_debug_file;
        fflush (gc_debug_file.41);
        <D.21645>:
        <D.21643>:
        D.21650 = sgen_ptr_in_nursery (__copy);
        if (D.21650 != 0) goto <D.21651>; else goto <D.21648>;
        <D.21651>:
        D.21652 = sgen_ptr_in_nursery (_objptr);
        if (D.21652 == 0) goto <D.21653>; else goto <D.21648>;
        <D.21653>:
        iftmp.57 = 1;
        goto <D.21649>;
        <D.21648>:
        iftmp.57 = 0;
        <D.21649>:
        D.21654 = iftmp.57 != 0;
        D.21655 = (long int) D.21654;
        D.21656 = __builtin_expect (D.21655, 0);
        if (D.21656 != 0) goto <D.21657>; else goto <D.21658>;
        <D.21657>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21658>:
        goto <D.21638>;
        <D.21637>:
        D.21662 = sgen_ptr_in_nursery (__old);
        if (D.21662 != 0) goto <D.21663>; else goto <D.21660>;
        <D.21663>:
        D.21664 = sgen_ptr_in_nursery (_objptr);
        if (D.21664 == 0) goto <D.21665>; else goto <D.21660>;
        <D.21665>:
        iftmp.58 = 1;
        goto <D.21661>;
        <D.21660>:
        iftmp.58 = 0;
        <D.21661>:
        D.21666 = iftmp.58 != 0;
        D.21667 = (long int) D.21666;
        D.21668 = __builtin_expect (D.21667, 0);
        if (D.21668 != 0) goto <D.21669>; else goto <D.21670>;
        <D.21669>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21670>:
        <D.21638>:
      }
      <D.21636>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20317>:
      if (_bmap != 0) goto <D.20316>; else goto <D.20318>;
      <D.20318>:
    }
    goto <D.20262>;
    <D.20319>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.21671 = *bitmap_data;
      D.21672 = (unsigned int) D.21671;
      D.21673 = D.21672 + 4294967295;
      bwords = (int) D.21673;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.21674>; else goto <D.21675>;
      <D.21674>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.21676 = myobj->vtable;
        D.21677 = D.21676->klass;
        D.21678 = D.21677->name_space;
        D.21676 = myobj->vtable;
        D.21677 = D.21676->klass;
        D.21679 = D.21677->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21678, D.21679);
      }
      <D.21675>:
      goto <D.20332>;
      <D.20331>:
      {
        gsize _bmap;

        bitmap_data.59 = bitmap_data;
        bitmap_data = bitmap_data.59 + 8;
        _bmap = *bitmap_data.59;
        _objptr = start_run;
        goto <D.20329>;
        <D.20328>:
        D.21681 = _bmap & 1;
        if (D.21681 != 0) goto <D.21682>; else goto <D.21683>;
        <D.21682>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21686>; else goto <D.21684>;
          <D.21686>:
          D.21687 = sgen_ptr_in_nursery (__old);
          if (D.21687 == 0) goto <D.21688>; else goto <D.21684>;
          <D.21688>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21689>; else goto <D.21690>;
          <D.21689>:
          if (__old != __copy) goto <D.21691>; else goto <D.21692>;
          <D.21691>:
          gc_debug_file.41 = gc_debug_file;
          D.21693 = *_objptr;
          fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21693, __old);
          gc_debug_file.41 = gc_debug_file;
          fflush (gc_debug_file.41);
          <D.21692>:
          <D.21690>:
          D.21697 = sgen_ptr_in_nursery (__copy);
          if (D.21697 != 0) goto <D.21698>; else goto <D.21695>;
          <D.21698>:
          D.21699 = sgen_ptr_in_nursery (_objptr);
          if (D.21699 == 0) goto <D.21700>; else goto <D.21695>;
          <D.21700>:
          iftmp.60 = 1;
          goto <D.21696>;
          <D.21695>:
          iftmp.60 = 0;
          <D.21696>:
          D.21701 = iftmp.60 != 0;
          D.21702 = (long int) D.21701;
          D.21703 = __builtin_expect (D.21702, 0);
          if (D.21703 != 0) goto <D.21704>; else goto <D.21705>;
          <D.21704>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21705>:
          goto <D.21685>;
          <D.21684>:
          D.21709 = sgen_ptr_in_nursery (__old);
          if (D.21709 != 0) goto <D.21710>; else goto <D.21707>;
          <D.21710>:
          D.21711 = sgen_ptr_in_nursery (_objptr);
          if (D.21711 == 0) goto <D.21712>; else goto <D.21707>;
          <D.21712>:
          iftmp.61 = 1;
          goto <D.21708>;
          <D.21707>:
          iftmp.61 = 0;
          <D.21708>:
          D.21713 = iftmp.61 != 0;
          D.21714 = (long int) D.21713;
          D.21715 = __builtin_expect (D.21714, 0);
          if (D.21715 != 0) goto <D.21716>; else goto <D.21717>;
          <D.21716>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21717>:
          <D.21685>:
        }
        <D.21683>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20329>:
        if (_bmap != 0) goto <D.20328>; else goto <D.20330>;
        <D.20330>:
        start_run = start_run + 512;
      }
      <D.20332>:
      bwords.62 = bwords;
      bwords = bwords.62 + -1;
      if (bwords.62 > 0) goto <D.20331>; else goto <D.20333>;
      <D.20333>:
    }
    goto <D.20262>;
    <D.20334>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.21719 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.21719);
      mbitmap_data.63 = mbitmap_data;
      mbitmap_data = mbitmap_data.63 + 8;
      D.21721 = *mbitmap_data.63;
      D.21722 = (unsigned int) D.21721;
      D.21723 = D.21722 + 4294967295;
      mbwords = (int) D.21723;
      D.21724 = vt->klass;
      el_size = mono_array_element_size (D.21724);
      e_start = start + 32;
      D.21509 = MEM[(struct MonoArray *)start].max_length;
      el_size.64 = (unsigned int) el_size;
      D.21726 = D.21509 * el_size.64;
      D.21727 = (sizetype) D.21726;
      e_end = e_start + D.21727;
      if (0 != 0) goto <D.21728>; else goto <D.21729>;
      <D.21728>:
      D.21719 = vt->desc;
      D.21724 = vt->klass;
      D.21730 = D.21724->name_space;
      D.21724 = vt->klass;
      D.21731 = D.21724->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.21719, D.21730, D.21731);
      <D.21729>:
      goto <D.20354>;
      <D.20353>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.65 = bitmap_data;
          bitmap_data = bitmap_data.65 + 8;
          _bmap = *bitmap_data.65;
          start_run = _objptr;
          goto <D.20348>;
          <D.20347>:
          D.21733 = _bmap & 1;
          if (D.21733 != 0) goto <D.21734>; else goto <D.21735>;
          <D.21734>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.21738>; else goto <D.21736>;
            <D.21738>:
            D.21739 = sgen_ptr_in_nursery (__old);
            if (D.21739 == 0) goto <D.21740>; else goto <D.21736>;
            <D.21740>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.21741>; else goto <D.21742>;
            <D.21741>:
            if (__old != __copy) goto <D.21743>; else goto <D.21744>;
            <D.21743>:
            gc_debug_file.41 = gc_debug_file;
            D.21745 = *_objptr;
            fprintf (gc_debug_file.41, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21745, __old);
            gc_debug_file.41 = gc_debug_file;
            fflush (gc_debug_file.41);
            <D.21744>:
            <D.21742>:
            D.21749 = sgen_ptr_in_nursery (__copy);
            if (D.21749 != 0) goto <D.21750>; else goto <D.21747>;
            <D.21750>:
            D.21751 = sgen_ptr_in_nursery (_objptr);
            if (D.21751 == 0) goto <D.21752>; else goto <D.21747>;
            <D.21752>:
            iftmp.66 = 1;
            goto <D.21748>;
            <D.21747>:
            iftmp.66 = 0;
            <D.21748>:
            D.21753 = iftmp.66 != 0;
            D.21754 = (long int) D.21753;
            D.21755 = __builtin_expect (D.21754, 0);
            if (D.21755 != 0) goto <D.21756>; else goto <D.21757>;
            <D.21756>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.21757>:
            goto <D.21737>;
            <D.21736>:
            D.21761 = sgen_ptr_in_nursery (__old);
            if (D.21761 != 0) goto <D.21762>; else goto <D.21759>;
            <D.21762>:
            D.21763 = sgen_ptr_in_nursery (_objptr);
            if (D.21763 == 0) goto <D.21764>; else goto <D.21759>;
            <D.21764>:
            iftmp.67 = 1;
            goto <D.21760>;
            <D.21759>:
            iftmp.67 = 0;
            <D.21760>:
            D.21765 = iftmp.67 != 0;
            D.21766 = (long int) D.21765;
            D.21767 = __builtin_expect (D.21766, 0);
            if (D.21767 != 0) goto <D.21768>; else goto <D.21769>;
            <D.21768>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.21769>:
            <D.21737>:
          }
          <D.21735>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20348>:
          if (_bmap != 0) goto <D.20347>; else goto <D.20349>;
          <D.20349>:
          _objptr = start_run + 512;
        }
        <D.20351>:
        bwords.68 = bwords;
        bwords = bwords.68 + 4294967295;
        if (bwords.68 != 0) goto <D.20350>; else goto <D.20352>;
        <D.20352>:
        D.21771 = (sizetype) el_size;
        e_start = e_start + D.21771;
      }
      <D.20354>:
      if (e_start < e_end) goto <D.20353>; else goto <D.20355>;
      <D.20355>:
    }
    goto <D.20262>;
    <D.20356>:
    goto <D.20262>;
    <D.20357>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20262>:
  }
}


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

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


major_scan_object (char * start, struct SgenGrayQueue * queue)
{
  long unsigned int D.21774;
  long unsigned int D.21775;
  long unsigned int D.21776;
  long unsigned int D.21777;
  long unsigned int D.21780;
  long unsigned int D.21781;
  long unsigned int D.21782;
  long unsigned int D.21783;
  long unsigned int D.21784;
  long unsigned int D.21785;
  struct FILE * gc_debug_file.69;
  void * D.21793;
  int iftmp.70;
  int D.21797;
  int D.21799;
  _Bool D.21801;
  long int D.21802;
  long int D.21803;
  int iftmp.71;
  int D.21818;
  int D.21820;
  _Bool D.21822;
  long int D.21823;
  long int D.21824;
  long unsigned int D.21830;
  long unsigned int D.21831;
  int D.21832;
  void * D.21839;
  int iftmp.72;
  int D.21843;
  int D.21845;
  _Bool D.21847;
  long int D.21848;
  long int D.21849;
  long unsigned int D.21855;
  long unsigned int D.21856;
  int D.21857;
  int iftmp.73;
  int D.21867;
  int D.21869;
  _Bool D.21871;
  long int D.21872;
  long int D.21873;
  long unsigned int D.21879;
  long unsigned int D.21882;
  int D.21883;
  int D.21884;
  unsigned int D.21887;
  unsigned int el_size.74;
  unsigned int D.21889;
  sizetype D.21890;
  void * D.21897;
  int iftmp.75;
  int D.21901;
  int D.21903;
  _Bool D.21905;
  long int D.21906;
  long int D.21907;
  int D.21916;
  int D.21917;
  long unsigned int D.21918;
  long unsigned int D.21919;
  long unsigned int D.21920;
  long unsigned int D.21921;
  void * * D.21922;
  void * D.21929;
  int iftmp.76;
  int D.21933;
  void * D.21935;
  int D.21936;
  _Bool D.21938;
  long int D.21939;
  long int D.21940;
  void * D.21943;
  sizetype D.21947;
  long unsigned int D.21951;
  void * D.21960;
  int iftmp.77;
  int D.21964;
  int D.21966;
  _Bool D.21968;
  long int D.21969;
  long int D.21970;
  long unsigned int D.21976;
  void * D.21985;
  int iftmp.78;
  int D.21989;
  int D.21991;
  _Bool D.21993;
  long int D.21994;
  long int D.21995;
  long unsigned int D.22001;
  unsigned int D.22002;
  unsigned int D.22003;
  struct MonoVTable * D.22006;
  struct MonoClass * D.22007;
  const char * D.22008;
  const char * D.22009;
  gsize * bitmap_data.79;
  long unsigned int D.22011;
  void * D.22020;
  int iftmp.80;
  int D.22024;
  int D.22026;
  _Bool D.22028;
  long int D.22029;
  long int D.22030;
  int bwords.81;
  long unsigned int D.22037;
  gsize * mbitmap_data.82;
  long unsigned int D.22039;
  unsigned int D.22040;
  unsigned int D.22041;
  struct MonoClass * D.22042;
  unsigned int el_size.83;
  unsigned int D.22044;
  sizetype D.22045;
  const char * D.22048;
  const char * D.22049;
  gsize * bitmap_data.84;
  long unsigned int D.22051;
  void * D.22060;
  int iftmp.85;
  int D.22064;
  int D.22066;
  _Bool D.22068;
  long int D.22069;
  long int D.22070;
  unsigned int bwords.86;
  sizetype D.22077;

  {
    struct GCVTable * vt;
    mword desc;

    D.21774 = MEM[(mword *)start];
    D.21775 = D.21774 & 18446744073709551612;
    vt = (struct GCVTable *) D.21775;
    desc = vt->desc;
    D.21776 = desc & 7;
    switch (D.21776) <default: <D.20244>, case 1: <D.20139>, case 2: <D.20150>, case 3: <D.20206>, case 4: <D.20162>, case 5: <D.20198>, case 6: <D.20221>, case 7: <D.20243>>
    <D.20139>:
    D.21777 = desc & 4294901760;
    if (D.21777 != 0) goto <D.21778>; else goto <D.21779>;
    <D.21778>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.21780 = desc >> 16;
      D.21781 = D.21780 & 255;
      D.21782 = D.21781 * 8;
      _objptr = _objptr + D.21782;
      D.21783 = desc >> 24;
      D.21784 = D.21783 & 255;
      D.21785 = D.21784 * 8;
      _objptr_end = _objptr + D.21785;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21786>; else goto <D.21787>;
        <D.21786>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21788>; else goto <D.21789>;
        <D.21788>:
        if (__old != __copy) goto <D.21790>; else goto <D.21791>;
        <D.21790>:
        gc_debug_file.69 = gc_debug_file;
        D.21793 = *_objptr;
        fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21793, __old);
        gc_debug_file.69 = gc_debug_file;
        fflush (gc_debug_file.69);
        <D.21791>:
        <D.21789>:
        D.21797 = sgen_ptr_in_nursery (__copy);
        if (D.21797 != 0) goto <D.21798>; else goto <D.21795>;
        <D.21798>:
        D.21799 = sgen_ptr_in_nursery (_objptr);
        if (D.21799 == 0) goto <D.21800>; else goto <D.21795>;
        <D.21800>:
        iftmp.70 = 1;
        goto <D.21796>;
        <D.21795>:
        iftmp.70 = 0;
        <D.21796>:
        D.21801 = iftmp.70 != 0;
        D.21802 = (long int) D.21801;
        D.21803 = __builtin_expect (D.21802, 0);
        if (D.21803 != 0) goto <D.21804>; else goto <D.21805>;
        <D.21804>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21805>:
        goto <D.21806>;
        <D.21787>:
        if (0 != 0) goto <D.21807>; else goto <D.21808>;
        <D.21807>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21808>:
        <D.21806>:
      }
      _objptr = _objptr + 8;
      goto <D.20147>;
      <D.20146>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21809>; else goto <D.21810>;
        <D.21809>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21811>; else goto <D.21812>;
        <D.21811>:
        if (__old != __copy) goto <D.21813>; else goto <D.21814>;
        <D.21813>:
        gc_debug_file.69 = gc_debug_file;
        D.21793 = *_objptr;
        fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21793, __old);
        gc_debug_file.69 = gc_debug_file;
        fflush (gc_debug_file.69);
        <D.21814>:
        <D.21812>:
        D.21818 = sgen_ptr_in_nursery (__copy);
        if (D.21818 != 0) goto <D.21819>; else goto <D.21816>;
        <D.21819>:
        D.21820 = sgen_ptr_in_nursery (_objptr);
        if (D.21820 == 0) goto <D.21821>; else goto <D.21816>;
        <D.21821>:
        iftmp.71 = 1;
        goto <D.21817>;
        <D.21816>:
        iftmp.71 = 0;
        <D.21817>:
        D.21822 = iftmp.71 != 0;
        D.21823 = (long int) D.21822;
        D.21824 = __builtin_expect (D.21823, 0);
        if (D.21824 != 0) goto <D.21825>; else goto <D.21826>;
        <D.21825>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21826>:
        goto <D.21827>;
        <D.21810>:
        if (0 != 0) goto <D.21828>; else goto <D.21829>;
        <D.21828>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21829>:
        <D.21827>:
      }
      _objptr = _objptr + 8;
      <D.20147>:
      if (_objptr < _objptr_end) goto <D.20146>; else goto <D.20148>;
      <D.20148>:
    }
    <D.21779>:
    goto <D.20149>;
    <D.20150>:
    {
      void * * _objptr;
      gsize _bmap;

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

        _index = __builtin_ctzl (_bmap);
        D.21830 = (long unsigned int) _index;
        D.21831 = D.21830 * 8;
        _objptr = _objptr + D.21831;
        D.21832 = _index + 1;
        _bmap = _bmap >> D.21832;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21833>; else goto <D.21834>;
          <D.21833>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21835>; else goto <D.21836>;
          <D.21835>:
          if (__old != __copy) goto <D.21837>; else goto <D.21838>;
          <D.21837>:
          gc_debug_file.69 = gc_debug_file;
          D.21839 = *_objptr;
          fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21839, __old);
          gc_debug_file.69 = gc_debug_file;
          fflush (gc_debug_file.69);
          <D.21838>:
          <D.21836>:
          D.21843 = sgen_ptr_in_nursery (__copy);
          if (D.21843 != 0) goto <D.21844>; else goto <D.21841>;
          <D.21844>:
          D.21845 = sgen_ptr_in_nursery (_objptr);
          if (D.21845 == 0) goto <D.21846>; else goto <D.21841>;
          <D.21846>:
          iftmp.72 = 1;
          goto <D.21842>;
          <D.21841>:
          iftmp.72 = 0;
          <D.21842>:
          D.21847 = iftmp.72 != 0;
          D.21848 = (long int) D.21847;
          D.21849 = __builtin_expect (D.21848, 0);
          if (D.21849 != 0) goto <D.21850>; else goto <D.21851>;
          <D.21850>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21851>:
          goto <D.21852>;
          <D.21834>:
          if (0 != 0) goto <D.21853>; else goto <D.21854>;
          <D.21853>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21854>:
          <D.21852>:
        }
        _objptr = _objptr + 8;
      }
      goto <D.20160>;
      <D.20159>:
      {
        int _index;

        _index = __builtin_ctzl (_bmap);
        D.21855 = (long unsigned int) _index;
        D.21856 = D.21855 * 8;
        _objptr = _objptr + D.21856;
        D.21857 = _index + 1;
        _bmap = _bmap >> D.21857;
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21858>; else goto <D.21859>;
          <D.21858>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21860>; else goto <D.21861>;
          <D.21860>:
          if (__old != __copy) goto <D.21862>; else goto <D.21863>;
          <D.21862>:
          gc_debug_file.69 = gc_debug_file;
          D.21839 = *_objptr;
          fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21839, __old);
          gc_debug_file.69 = gc_debug_file;
          fflush (gc_debug_file.69);
          <D.21863>:
          <D.21861>:
          D.21867 = sgen_ptr_in_nursery (__copy);
          if (D.21867 != 0) goto <D.21868>; else goto <D.21865>;
          <D.21868>:
          D.21869 = sgen_ptr_in_nursery (_objptr);
          if (D.21869 == 0) goto <D.21870>; else goto <D.21865>;
          <D.21870>:
          iftmp.73 = 1;
          goto <D.21866>;
          <D.21865>:
          iftmp.73 = 0;
          <D.21866>:
          D.21871 = iftmp.73 != 0;
          D.21872 = (long int) D.21871;
          D.21873 = __builtin_expect (D.21872, 0);
          if (D.21873 != 0) goto <D.21874>; else goto <D.21875>;
          <D.21874>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21875>:
          goto <D.21876>;
          <D.21859>:
          if (0 != 0) goto <D.21877>; else goto <D.21878>;
          <D.21877>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21878>:
          <D.21876>:
        }
        _objptr = _objptr + 8;
      }
      <D.20160>:
      if (_bmap != 0) goto <D.20159>; else goto <D.20161>;
      <D.20161>:
    }
    goto <D.20149>;
    <D.20162>:
    D.21879 = desc & 4294950912;
    if (D.21879 != 0) goto <D.21880>; else goto <D.21881>;
    <D.21880>:
    {
      int el_size;
      int etype;

      D.21882 = desc >> 3;
      D.21883 = (int) D.21882;
      el_size = D.21883 & 1023;
      D.21884 = (int) desc;
      etype = D.21884 & 49152;
      if (etype == 16384) goto <D.21885>; else goto <D.21886>;
      <D.21885>:
      {
        void * * p;
        void * * end_refs;

        p = start + 32;
        D.21887 = MEM[(struct MonoArray *)start].max_length;
        el_size.74 = (unsigned int) el_size;
        D.21889 = D.21887 * el_size.74;
        D.21890 = (sizetype) D.21889;
        end_refs = p + D.21890;
        goto <D.20170>;
        <D.20169>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.21891>; else goto <D.21892>;
          <D.21891>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.21893>; else goto <D.21894>;
          <D.21893>:
          if (__old != __copy) goto <D.21895>; else goto <D.21896>;
          <D.21895>:
          gc_debug_file.69 = gc_debug_file;
          D.21897 = *p;
          fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", p, D.21897, __old);
          gc_debug_file.69 = gc_debug_file;
          fflush (gc_debug_file.69);
          <D.21896>:
          <D.21894>:
          D.21901 = sgen_ptr_in_nursery (__copy);
          if (D.21901 != 0) goto <D.21902>; else goto <D.21899>;
          <D.21902>:
          D.21903 = sgen_ptr_in_nursery (p);
          if (D.21903 == 0) goto <D.21904>; else goto <D.21899>;
          <D.21904>:
          iftmp.75 = 1;
          goto <D.21900>;
          <D.21899>:
          iftmp.75 = 0;
          <D.21900>:
          D.21905 = iftmp.75 != 0;
          D.21906 = (long int) D.21905;
          D.21907 = __builtin_expect (D.21906, 0);
          if (D.21907 != 0) goto <D.21908>; else goto <D.21909>;
          <D.21908>:
          sgen_add_to_global_remset (p, __copy);
          <D.21909>:
          goto <D.21910>;
          <D.21892>:
          if (0 != 0) goto <D.21911>; else goto <D.21912>;
          <D.21911>:
          sgen_add_to_global_remset (p, __old);
          <D.21912>:
          <D.21910>:
        }
        p = p + 8;
        <D.20170>:
        if (p < end_refs) goto <D.20169>; else goto <D.20171>;
        <D.20171>:
      }
      goto <D.21913>;
      <D.21886>:
      if (etype == 32768) goto <D.21914>; else goto <D.21915>;
      <D.21914>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.21780 = desc >> 16;
        D.21916 = (int) D.21780;
        offset = D.21916 & 255;
        D.21783 = desc >> 24;
        D.21917 = (int) D.21783;
        num_refs = D.21917 & 255;
        e_start = start + 32;
        D.21887 = MEM[(struct MonoArray *)start].max_length;
        el_size.74 = (unsigned int) el_size;
        D.21889 = D.21887 * el_size.74;
        D.21890 = (sizetype) D.21889;
        e_end = e_start + D.21890;
        goto <D.20184>;
        <D.20183>:
        {
          void * * p;
          int i;

          p = e_start;
          D.21918 = (long unsigned int) offset;
          D.21919 = D.21918 * 8;
          p = p + D.21919;
          i = 0;
          goto <D.20181>;
          <D.20180>:
          {
            void * __old;
            void * __copy;

            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21922 = p + D.21921;
            __old = *D.21922;
            if (__old != 0B) goto <D.21923>; else goto <D.21924>;
            <D.21923>:
            __builtin_prefetch (__old);
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21922 = p + D.21921;
            major_copy_or_mark_object (D.21922, __old, queue);
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21922 = p + D.21921;
            __copy = *D.21922;
            if (0 != 0) goto <D.21925>; else goto <D.21926>;
            <D.21925>:
            if (__old != __copy) goto <D.21927>; else goto <D.21928>;
            <D.21927>:
            gc_debug_file.69 = gc_debug_file;
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21922 = p + D.21921;
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21922 = p + D.21921;
            D.21929 = *D.21922;
            fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", D.21922, D.21929, __old);
            gc_debug_file.69 = gc_debug_file;
            fflush (gc_debug_file.69);
            <D.21928>:
            <D.21926>:
            D.21933 = sgen_ptr_in_nursery (__copy);
            if (D.21933 != 0) goto <D.21934>; else goto <D.21931>;
            <D.21934>:
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21935 = p + D.21921;
            D.21936 = sgen_ptr_in_nursery (D.21935);
            if (D.21936 == 0) goto <D.21937>; else goto <D.21931>;
            <D.21937>:
            iftmp.76 = 1;
            goto <D.21932>;
            <D.21931>:
            iftmp.76 = 0;
            <D.21932>:
            D.21938 = iftmp.76 != 0;
            D.21939 = (long int) D.21938;
            D.21940 = __builtin_expect (D.21939, 0);
            if (D.21940 != 0) goto <D.21941>; else goto <D.21942>;
            <D.21941>:
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21943 = p + D.21921;
            sgen_add_to_global_remset (D.21943, __copy);
            <D.21942>:
            goto <D.21944>;
            <D.21924>:
            if (0 != 0) goto <D.21945>; else goto <D.21946>;
            <D.21945>:
            D.21920 = (long unsigned int) i;
            D.21921 = D.21920 * 8;
            D.21943 = p + D.21921;
            sgen_add_to_global_remset (D.21943, __old);
            <D.21946>:
            <D.21944>:
          }
          i = i + 1;
          <D.20181>:
          if (i < num_refs) goto <D.20180>; else goto <D.20182>;
          <D.20182>:
          D.21947 = (sizetype) el_size;
          e_start = e_start + D.21947;
        }
        <D.20184>:
        if (e_start < e_end) goto <D.20183>; else goto <D.20185>;
        <D.20185>:
      }
      goto <D.21948>;
      <D.21915>:
      if (etype == 49152) goto <D.21949>; else goto <D.21950>;
      <D.21949>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 32;
        D.21887 = MEM[(struct MonoArray *)start].max_length;
        el_size.74 = (unsigned int) el_size;
        D.21889 = D.21887 * el_size.74;
        D.21890 = (sizetype) D.21889;
        e_end = e_start + D.21890;
        goto <D.20196>;
        <D.20195>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.20193>;
          <D.20192>:
          D.21951 = _bmap & 1;
          if (D.21951 != 0) goto <D.21952>; else goto <D.21953>;
          <D.21952>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.21954>; else goto <D.21955>;
            <D.21954>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.21956>; else goto <D.21957>;
            <D.21956>:
            if (__old != __copy) goto <D.21958>; else goto <D.21959>;
            <D.21958>:
            gc_debug_file.69 = gc_debug_file;
            D.21960 = *p;
            fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", p, D.21960, __old);
            gc_debug_file.69 = gc_debug_file;
            fflush (gc_debug_file.69);
            <D.21959>:
            <D.21957>:
            D.21964 = sgen_ptr_in_nursery (__copy);
            if (D.21964 != 0) goto <D.21965>; else goto <D.21962>;
            <D.21965>:
            D.21966 = sgen_ptr_in_nursery (p);
            if (D.21966 == 0) goto <D.21967>; else goto <D.21962>;
            <D.21967>:
            iftmp.77 = 1;
            goto <D.21963>;
            <D.21962>:
            iftmp.77 = 0;
            <D.21963>:
            D.21968 = iftmp.77 != 0;
            D.21969 = (long int) D.21968;
            D.21970 = __builtin_expect (D.21969, 0);
            if (D.21970 != 0) goto <D.21971>; else goto <D.21972>;
            <D.21971>:
            sgen_add_to_global_remset (p, __copy);
            <D.21972>:
            goto <D.21973>;
            <D.21955>:
            if (0 != 0) goto <D.21974>; else goto <D.21975>;
            <D.21974>:
            sgen_add_to_global_remset (p, __old);
            <D.21975>:
            <D.21973>:
          }
          <D.21953>:
          _bmap = _bmap >> 1;
          p = p + 8;
          <D.20193>:
          if (_bmap != 0) goto <D.20192>; else goto <D.20194>;
          <D.20194>:
          D.21947 = (sizetype) el_size;
          e_start = e_start + D.21947;
        }
        <D.20196>:
        if (e_start < e_end) goto <D.20195>; else goto <D.20197>;
        <D.20197>:
      }
      <D.21950>:
      <D.21948>:
      <D.21913>:
    }
    <D.21881>:
    goto <D.20149>;
    <D.20198>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 16;
      goto <D.20204>;
      <D.20203>:
      D.21976 = _bmap & 1;
      if (D.21976 != 0) goto <D.21977>; else goto <D.21978>;
      <D.21977>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21979>; else goto <D.21980>;
        <D.21979>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21981>; else goto <D.21982>;
        <D.21981>:
        if (__old != __copy) goto <D.21983>; else goto <D.21984>;
        <D.21983>:
        gc_debug_file.69 = gc_debug_file;
        D.21985 = *_objptr;
        fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21985, __old);
        gc_debug_file.69 = gc_debug_file;
        fflush (gc_debug_file.69);
        <D.21984>:
        <D.21982>:
        D.21989 = sgen_ptr_in_nursery (__copy);
        if (D.21989 != 0) goto <D.21990>; else goto <D.21987>;
        <D.21990>:
        D.21991 = sgen_ptr_in_nursery (_objptr);
        if (D.21991 == 0) goto <D.21992>; else goto <D.21987>;
        <D.21992>:
        iftmp.78 = 1;
        goto <D.21988>;
        <D.21987>:
        iftmp.78 = 0;
        <D.21988>:
        D.21993 = iftmp.78 != 0;
        D.21994 = (long int) D.21993;
        D.21995 = __builtin_expect (D.21994, 0);
        if (D.21995 != 0) goto <D.21996>; else goto <D.21997>;
        <D.21996>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21997>:
        goto <D.21998>;
        <D.21980>:
        if (0 != 0) goto <D.21999>; else goto <D.22000>;
        <D.21999>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.22000>:
        <D.21998>:
      }
      <D.21978>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 8;
      <D.20204>:
      if (_bmap != 0) goto <D.20203>; else goto <D.20205>;
      <D.20205>:
    }
    goto <D.20149>;
    <D.20206>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.22001 = *bitmap_data;
      D.22002 = (unsigned int) D.22001;
      D.22003 = D.22002 + 4294967295;
      bwords = (int) D.22003;
      start_run = _objptr;
      bitmap_data = bitmap_data + 8;
      if (0 != 0) goto <D.22004>; else goto <D.22005>;
      <D.22004>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.22006 = myobj->vtable;
        D.22007 = D.22006->klass;
        D.22008 = D.22007->name_space;
        D.22006 = myobj->vtable;
        D.22007 = D.22006->klass;
        D.22009 = D.22007->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.22008, D.22009);
      }
      <D.22005>:
      goto <D.20219>;
      <D.20218>:
      {
        gsize _bmap;

        bitmap_data.79 = bitmap_data;
        bitmap_data = bitmap_data.79 + 8;
        _bmap = *bitmap_data.79;
        _objptr = start_run;
        goto <D.20216>;
        <D.20215>:
        D.22011 = _bmap & 1;
        if (D.22011 != 0) goto <D.22012>; else goto <D.22013>;
        <D.22012>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.22014>; else goto <D.22015>;
          <D.22014>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.22016>; else goto <D.22017>;
          <D.22016>:
          if (__old != __copy) goto <D.22018>; else goto <D.22019>;
          <D.22018>:
          gc_debug_file.69 = gc_debug_file;
          D.22020 = *_objptr;
          fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.22020, __old);
          gc_debug_file.69 = gc_debug_file;
          fflush (gc_debug_file.69);
          <D.22019>:
          <D.22017>:
          D.22024 = sgen_ptr_in_nursery (__copy);
          if (D.22024 != 0) goto <D.22025>; else goto <D.22022>;
          <D.22025>:
          D.22026 = sgen_ptr_in_nursery (_objptr);
          if (D.22026 == 0) goto <D.22027>; else goto <D.22022>;
          <D.22027>:
          iftmp.80 = 1;
          goto <D.22023>;
          <D.22022>:
          iftmp.80 = 0;
          <D.22023>:
          D.22028 = iftmp.80 != 0;
          D.22029 = (long int) D.22028;
          D.22030 = __builtin_expect (D.22029, 0);
          if (D.22030 != 0) goto <D.22031>; else goto <D.22032>;
          <D.22031>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.22032>:
          goto <D.22033>;
          <D.22015>:
          if (0 != 0) goto <D.22034>; else goto <D.22035>;
          <D.22034>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.22035>:
          <D.22033>:
        }
        <D.22013>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 8;
        <D.20216>:
        if (_bmap != 0) goto <D.20215>; else goto <D.20217>;
        <D.20217>:
        start_run = start_run + 512;
      }
      <D.20219>:
      bwords.81 = bwords;
      bwords = bwords.81 + -1;
      if (bwords.81 > 0) goto <D.20218>; else goto <D.20220>;
      <D.20220>:
    }
    goto <D.20149>;
    <D.20221>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.22037 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.22037);
      mbitmap_data.82 = mbitmap_data;
      mbitmap_data = mbitmap_data.82 + 8;
      D.22039 = *mbitmap_data.82;
      D.22040 = (unsigned int) D.22039;
      D.22041 = D.22040 + 4294967295;
      mbwords = (int) D.22041;
      D.22042 = vt->klass;
      el_size = mono_array_element_size (D.22042);
      e_start = start + 32;
      D.21887 = MEM[(struct MonoArray *)start].max_length;
      el_size.83 = (unsigned int) el_size;
      D.22044 = D.21887 * el_size.83;
      D.22045 = (sizetype) D.22044;
      e_end = e_start + D.22045;
      if (0 != 0) goto <D.22046>; else goto <D.22047>;
      <D.22046>:
      D.22037 = vt->desc;
      D.22042 = vt->klass;
      D.22048 = D.22042->name_space;
      D.22042 = vt->klass;
      D.22049 = D.22042->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.22037, D.22048, D.22049);
      <D.22047>:
      goto <D.20241>;
      <D.20240>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.84 = bitmap_data;
          bitmap_data = bitmap_data.84 + 8;
          _bmap = *bitmap_data.84;
          start_run = _objptr;
          goto <D.20235>;
          <D.20234>:
          D.22051 = _bmap & 1;
          if (D.22051 != 0) goto <D.22052>; else goto <D.22053>;
          <D.22052>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.22054>; else goto <D.22055>;
            <D.22054>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.22056>; else goto <D.22057>;
            <D.22056>:
            if (__old != __copy) goto <D.22058>; else goto <D.22059>;
            <D.22058>:
            gc_debug_file.69 = gc_debug_file;
            D.22060 = *_objptr;
            fprintf (gc_debug_file.69, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.22060, __old);
            gc_debug_file.69 = gc_debug_file;
            fflush (gc_debug_file.69);
            <D.22059>:
            <D.22057>:
            D.22064 = sgen_ptr_in_nursery (__copy);
            if (D.22064 != 0) goto <D.22065>; else goto <D.22062>;
            <D.22065>:
            D.22066 = sgen_ptr_in_nursery (_objptr);
            if (D.22066 == 0) goto <D.22067>; else goto <D.22062>;
            <D.22067>:
            iftmp.85 = 1;
            goto <D.22063>;
            <D.22062>:
            iftmp.85 = 0;
            <D.22063>:
            D.22068 = iftmp.85 != 0;
            D.22069 = (long int) D.22068;
            D.22070 = __builtin_expect (D.22069, 0);
            if (D.22070 != 0) goto <D.22071>; else goto <D.22072>;
            <D.22071>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.22072>:
            goto <D.22073>;
            <D.22055>:
            if (0 != 0) goto <D.22074>; else goto <D.22075>;
            <D.22074>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.22075>:
            <D.22073>:
          }
          <D.22053>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 8;
          <D.20235>:
          if (_bmap != 0) goto <D.20234>; else goto <D.20236>;
          <D.20236>:
          _objptr = start_run + 512;
        }
        <D.20238>:
        bwords.86 = bwords;
        bwords = bwords.86 + 4294967295;
        if (bwords.86 != 0) goto <D.20237>; else goto <D.20239>;
        <D.20239>:
        D.22077 = (sizetype) el_size;
        e_start = e_start + D.22077;
      }
      <D.20241>:
      if (e_start < e_end) goto <D.20240>; else goto <D.20242>;
      <D.20242>:
    }
    goto <D.20149>;
    <D.20243>:
    goto <D.20149>;
    <D.20244>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.20149>:
  }
}


major_copy_or_mark_object (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int current_collection_generation.87;
  int D.22084;
  char * iftmp.88;
  long unsigned int D.22088;
  long unsigned int D.22089;
  long unsigned int D.22092;
  long unsigned int D.22096;
  int D.22099;
  _Bool D.22102;
  long int D.22103;
  long int D.22104;
  int D.22107;
  long unsigned int obj.89;
  long unsigned int D.22111;
  struct MSBlockHeader * D.22112;
  gboolean * evacuate_block_obj_sizes.90;
  long unsigned int D.22114;
  long unsigned int D.22115;
  gboolean * D.22116;
  long int obj.91;
  long int obj.92;
  long int D.22119;
  long int D.22120;
  long int D.22121;
  long unsigned int D.22127;
  long int D.22128;
  long unsigned int D.22129;
  long unsigned int D.22130;
  long unsigned int D.22133;
  long unsigned int D.22134;
  long unsigned int D.22135;
  int iftmp.93;
  struct GrayQueueSection * D.22142;
  int D.22144;
  _Bool D.22145;
  long int D.22146;
  long int D.22147;
  int D.22151;
  int D.22152;
  int D.22153;
  long unsigned int D.22161;
  long int D.22162;
  long unsigned int D.22163;
  long unsigned int D.22164;
  char * iftmp.94;
  unsigned int D.22172;
  unsigned int D.22173;
  long unsigned int D.22174;
  long unsigned int D.22177;
  long unsigned int D.22178;
  gboolean * D.22179;
  long unsigned int D.22182;
  _Bool D.22184;
  long int D.22185;
  long int D.22186;
  long unsigned int D.22189;
  long unsigned int D.22197;
  long int D.22198;
  long unsigned int D.22199;
  long unsigned int D.22200;
  long unsigned int D.22203;
  int iftmp.95;
  _Bool D.22211;
  long int D.22212;
  long int D.22213;
  int D.22217;
  int D.22218;
  int D.22220;
  struct MonoVTable * D.22223;
  void * D.22224;
  long unsigned int D.22225;
  int D.22226;
  int iftmp.96;
  _Bool D.22234;
  long int D.22235;
  long int D.22236;
  int D.22240;
  int D.22241;
  struct MSBlockInfo * block;
  void do_copy_object = <<< error >>>;

  if (0 != 0) goto <D.22079>; else goto <D.22080>;
  <D.22079>:
  monoeg_g_log (0B, 4, "null object from pointer %p", ptr);
  <D.20099>:
  goto <D.20099>;
  <D.22080>:
  if (0 != 0) goto <D.22081>; else goto <D.22082>;
  <D.22081>:
  current_collection_generation.87 = current_collection_generation;
  monoeg_g_log (0B, 4, "old gen parallel allocator called from a %d collection", current_collection_generation.87);
  <D.20100>:
  goto <D.20100>;
  <D.22082>:
  D.22084 = sgen_ptr_in_nursery (obj);
  if (D.22084 != 0) goto <D.22085>; else goto <D.22086>;
  <D.22085>:
  {
    int word;
    int bit;
    char * forwarded;
    char * old_obj;

    D.22088 = MEM[(mword *)obj];
    D.22089 = D.22088 & 1;
    if (D.22089 != 0) goto <D.22090>; else goto <D.22091>;
    <D.22090>:
    D.22088 = MEM[(mword *)obj];
    D.22092 = D.22088 & 18446744073709551612;
    iftmp.88 = (char *) D.22092;
    goto <D.22093>;
    <D.22091>:
    iftmp.88 = 0B;
    <D.22093>:
    forwarded = iftmp.88;
    if (forwarded != 0B) goto <D.22094>; else goto <D.22095>;
    <D.22094>:
    *ptr = forwarded;
    return;
    <D.22095>:
    D.22088 = MEM[(mword *)obj];
    D.22096 = D.22088 & 2;
    if (D.22096 != 0) goto <D.22097>; else goto <D.22098>;
    <D.22097>:
    return;
    <D.22098>:
    D.22099 = sgen_nursery_is_to_space (obj);
    if (D.22099 != 0) goto <D.22100>; else goto <D.22101>;
    <D.22100>:
    return;
    <D.22101>:
    do_copy_object:
    old_obj = obj;
    obj = copy_object_no_checks (obj, queue);
    D.22102 = old_obj == obj;
    D.22103 = (long int) D.22102;
    D.22104 = __builtin_expect (D.22103, 0);
    if (D.22104 != 0) goto <D.22105>; else goto <D.22106>;
    <D.22105>:
    D.22107 = sgen_ptr_in_nursery (obj);
    if (D.22107 == 0) goto <D.22108>; else goto <D.22109>;
    <D.22108>:
    {
      int size_index;

      obj.89 = (long unsigned int) obj;
      D.22111 = obj.89 & 18446744073709535232;
      D.22112 = (struct MSBlockHeader *) D.22111;
      block = D.22112->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.90 = evacuate_block_obj_sizes;
      D.22114 = (long unsigned int) size_index;
      D.22115 = D.22114 * 4;
      D.22116 = evacuate_block_obj_sizes.90 + D.22115;
      *D.22116 = 0;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.91 = (long int) obj;
          obj.92 = (long int) obj;
          D.22119 = obj.92 & -16384;
          D.22120 = obj.91 - D.22119;
          D.22121 = D.22120 >> 3;
          i = (int) D.22121;
          if (0 != 0) goto <D.22122>; else goto <D.22123>;
          <D.22122>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.22124>;
          <D.22123>:
          __word = i >> 6;
          __bit = i & 63;
          <D.22124>:
        }
        if (0 != 0) goto <D.22125>; else goto <D.22126>;
        <D.22125>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.20110>:
        goto <D.20110>;
        <D.22126>:
        D.22127 = block->mark_words[__word];
        D.22128 = 1 << __bit;
        D.22129 = (long unsigned int) D.22128;
        D.22130 = D.22127 & D.22129;
        if (D.22130 == 0) goto <D.22131>; else goto <D.22132>;
        <D.22131>:
        D.22127 = block->mark_words[__word];
        D.22128 = 1 << __bit;
        D.22129 = (long unsigned int) D.22128;
        D.22133 = D.22127 | D.22129;
        block->mark_words[__word] = D.22133;
        D.22134 = BIT_FIELD_REF <*block, 64, 64>;
        D.22135 = D.22134 & 8589934592;
        if (D.22135 != 0) goto <D.22136>; else goto <D.22137>;
        <D.22136>:
        D.22142 = queue->first;
        if (D.22142 == 0B) goto <D.22139>; else goto <D.22143>;
        <D.22143>:
        D.22142 = queue->first;
        D.22144 = D.22142->end;
        if (D.22144 == 125) goto <D.22139>; else goto <D.22140>;
        <D.22139>:
        iftmp.93 = 1;
        goto <D.22141>;
        <D.22140>:
        iftmp.93 = 0;
        <D.22141>:
        D.22145 = iftmp.93 != 0;
        D.22146 = (long int) D.22145;
        D.22147 = __builtin_expect (D.22146, 0);
        if (D.22147 != 0) goto <D.22148>; else goto <D.22149>;
        <D.22148>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.22150>;
        <D.22149>:
        D.22142 = queue->first;
        D.22142 = queue->first;
        D.22144 = D.22142->end;
        D.22151 = D.22144;
        D.22152 = D.22151 + 1;
        D.22142->end = D.22152;
        D.22142->objects[D.22151] = obj;
        <D.22150>:
        __builtin_prefetch (obj);
        <D.22137>:
        <D.22132>:
      }
    }
    <D.22109>:
    return;
    <D.22106>:
    *ptr = obj;
    D.22153 = sgen_ptr_in_nursery (obj);
    if (D.22153 == 0) goto <D.22154>; else goto <D.22155>;
    <D.22154>:
    obj.89 = (long unsigned int) obj;
    D.22111 = obj.89 & 18446744073709535232;
    D.22112 = (struct MSBlockHeader *) D.22111;
    block = D.22112->info;
    {
      int i;

      obj.91 = (long int) obj;
      obj.92 = (long int) obj;
      D.22119 = obj.92 & -16384;
      D.22120 = obj.91 - D.22119;
      D.22121 = D.22120 >> 3;
      i = (int) D.22121;
      if (0 != 0) goto <D.22156>; else goto <D.22157>;
      <D.22156>:
      word = i >> 5;
      bit = i & 31;
      goto <D.22158>;
      <D.22157>:
      word = i >> 6;
      bit = i & 63;
      <D.22158>:
    }
    if (0 != 0) goto <D.22159>; else goto <D.22160>;
    <D.22159>:
    monoeg_g_log (0B, 4, "object %p already marked", obj);
    <D.20112>:
    goto <D.20112>;
    <D.22160>:
    D.22161 = block->mark_words[word];
    D.22162 = 1 << bit;
    D.22163 = (long unsigned int) D.22162;
    D.22164 = D.22161 | D.22163;
    block->mark_words[word] = D.22164;
    <D.22155>:
  }
  goto <D.22165>;
  <D.22086>:
  {
    char * forwarded;
    mword objsize;

    D.22088 = MEM[(mword *)obj];
    D.22089 = D.22088 & 1;
    if (D.22089 != 0) goto <D.22167>; else goto <D.22168>;
    <D.22167>:
    D.22088 = MEM[(mword *)obj];
    D.22092 = D.22088 & 18446744073709551612;
    iftmp.94 = (char *) D.22092;
    goto <D.22169>;
    <D.22168>:
    iftmp.94 = 0B;
    <D.22169>:
    forwarded = iftmp.94;
    if (forwarded != 0B) goto <D.22170>; else goto <D.22171>;
    <D.22170>:
    *ptr = forwarded;
    return;
    <D.22171>:
    D.22172 = sgen_safe_object_get_size (obj);
    D.22173 = D.22172 + 7;
    D.22174 = (long unsigned int) D.22173;
    objsize = D.22174 & 4294967288;
    if (objsize <= 8000) goto <D.22175>; else goto <D.22176>;
    <D.22175>:
    {
      int size_index;
      gboolean evacuate;

      obj.89 = (long unsigned int) obj;
      D.22111 = obj.89 & 18446744073709535232;
      D.22112 = (struct MSBlockHeader *) D.22111;
      block = D.22112->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.90 = evacuate_block_obj_sizes;
      D.22177 = (long unsigned int) size_index;
      D.22178 = D.22177 * 4;
      D.22179 = evacuate_block_obj_sizes.90 + D.22178;
      evacuate = *D.22179;
      if (evacuate != 0) goto <D.22181>; else goto <D.22180>;
      <D.22181>:
      D.22134 = BIT_FIELD_REF <*block, 64, 64>;
      D.22182 = D.22134 & 17179869184;
      if (D.22182 == 0) goto <D.22183>; else goto <D.22180>;
      <D.22183>:
      D.22088 = MEM[(mword *)obj];
      D.22096 = D.22088 & 2;
      D.22184 = D.22096 != 0;
      D.22185 = (long int) D.22184;
      D.22186 = __builtin_expect (D.22185, 0);
      if (D.22186 != 0) goto <D.22187>; else goto <D.22188>;
      <D.22187>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1425, "!SGEN_OBJECT_IS_PINNED (obj)");
      <D.22188>:
      D.22134 = BIT_FIELD_REF <*block, 64, 64>;
      D.22189 = D.22134 & 34359738368;
      if (D.22189 != 0) goto <D.22190>; else goto <D.22191>;
      <D.22190>:
      return;
      <D.22191>:
      goto do_copy_object;
      <D.22180>:
      {
        int __word;
        int __bit;

        {
          int i;

          obj.91 = (long int) obj;
          obj.92 = (long int) obj;
          D.22119 = obj.92 & -16384;
          D.22120 = obj.91 - D.22119;
          D.22121 = D.22120 >> 3;
          i = (int) D.22121;
          if (0 != 0) goto <D.22192>; else goto <D.22193>;
          <D.22192>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.22194>;
          <D.22193>:
          __word = i >> 6;
          __bit = i & 63;
          <D.22194>:
        }
        if (0 != 0) goto <D.22195>; else goto <D.22196>;
        <D.22195>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.20120>:
        goto <D.20120>;
        <D.22196>:
        D.22197 = block->mark_words[__word];
        D.22198 = 1 << __bit;
        D.22199 = (long unsigned int) D.22198;
        D.22200 = D.22197 & D.22199;
        if (D.22200 == 0) goto <D.22201>; else goto <D.22202>;
        <D.22201>:
        D.22197 = block->mark_words[__word];
        D.22198 = 1 << __bit;
        D.22199 = (long unsigned int) D.22198;
        D.22203 = D.22197 | D.22199;
        block->mark_words[__word] = D.22203;
        D.22134 = BIT_FIELD_REF <*block, 64, 64>;
        D.22135 = D.22134 & 8589934592;
        if (D.22135 != 0) goto <D.22204>; else goto <D.22205>;
        <D.22204>:
        D.22142 = queue->first;
        if (D.22142 == 0B) goto <D.22207>; else goto <D.22210>;
        <D.22210>:
        D.22142 = queue->first;
        D.22144 = D.22142->end;
        if (D.22144 == 125) goto <D.22207>; else goto <D.22208>;
        <D.22207>:
        iftmp.95 = 1;
        goto <D.22209>;
        <D.22208>:
        iftmp.95 = 0;
        <D.22209>:
        D.22211 = iftmp.95 != 0;
        D.22212 = (long int) D.22211;
        D.22213 = __builtin_expect (D.22212, 0);
        if (D.22213 != 0) goto <D.22214>; else goto <D.22215>;
        <D.22214>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.22216>;
        <D.22215>:
        D.22142 = queue->first;
        D.22142 = queue->first;
        D.22144 = D.22142->end;
        D.22217 = D.22144;
        D.22218 = D.22217 + 1;
        D.22142->end = D.22218;
        D.22142->objects[D.22217] = obj;
        <D.22216>:
        __builtin_prefetch (obj);
        <D.22205>:
        <D.22202>:
      }
    }
    goto <D.22219>;
    <D.22176>:
    D.22220 = sgen_los_object_is_pinned (obj);
    if (D.22220 != 0) goto <D.22221>; else goto <D.22222>;
    <D.22221>:
    return;
    <D.22222>:
    sgen_los_pin_object (obj);
    D.22088 = MEM[(mword *)obj];
    D.22092 = D.22088 & 18446744073709551612;
    D.22223 = (struct MonoVTable *) D.22092;
    D.22224 = D.22223->gc_descr;
    D.22225 = (long unsigned int) D.22224;
    D.22226 = sgen_gc_descr_has_references (D.22225);
    if (D.22226 != 0) goto <D.22227>; else goto <D.22228>;
    <D.22227>:
    D.22142 = queue->first;
    if (D.22142 == 0B) goto <D.22230>; else goto <D.22233>;
    <D.22233>:
    D.22142 = queue->first;
    D.22144 = D.22142->end;
    if (D.22144 == 125) goto <D.22230>; else goto <D.22231>;
    <D.22230>:
    iftmp.96 = 1;
    goto <D.22232>;
    <D.22231>:
    iftmp.96 = 0;
    <D.22232>:
    D.22234 = iftmp.96 != 0;
    D.22235 = (long int) D.22234;
    D.22236 = __builtin_expect (D.22235, 0);
    if (D.22236 != 0) goto <D.22237>; else goto <D.22238>;
    <D.22237>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.22239>;
    <D.22238>:
    D.22142 = queue->first;
    D.22142 = queue->first;
    D.22144 = D.22142->end;
    D.22240 = D.22144;
    D.22241 = D.22240 + 1;
    D.22142->end = D.22241;
    D.22142->objects[D.22240] = obj;
    <D.22239>:
    __builtin_prefetch (obj);
    <D.22228>:
    <D.22219>:
  }
  <D.22165>:
}


sgen_nursery_is_to_space (char * object)
{
  long int object.97;
  char * sgen_nursery_start.98;
  long int sgen_nursery_start.99;
  long int D.22246;
  long int D.22247;
  int D.22248;
  _Bool D.22249;
  long int D.22250;
  long int D.22251;
  char * D.22254;
  char * D.22255;
  int sgen_space_bitmap_size.100;
  _Bool D.22257;
  long int D.22258;
  long int D.22259;
  gboolean D.22262;
  char * sgen_space_bitmap.101;
  sizetype D.22264;
  char * D.22265;
  char D.22266;
  int D.22267;
  int D.22268;
  int D.22269;
  _Bool D.22270;
  int idx;
  int byte;
  int bit;

  object.97 = (long int) object;
  sgen_nursery_start.98 = sgen_nursery_start;
  sgen_nursery_start.99 = (long int) sgen_nursery_start.98;
  D.22246 = object.97 - sgen_nursery_start.99;
  D.22247 = D.22246 >> 9;
  idx = (int) D.22247;
  byte = idx / 8;
  bit = idx & 7;
  D.22248 = sgen_ptr_in_nursery (object);
  D.22249 = D.22248 == 0;
  D.22250 = (long int) D.22249;
  D.22251 = __builtin_expect (D.22250, 0);
  if (D.22251 != 0) goto <D.22252>; else goto <D.22253>;
  <D.22252>:
  D.22254 = sgen_get_nursery_start ();
  D.22255 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.22254, D.22255);
  <D.19153>:
  goto <D.19153>;
  <D.22253>:
  sgen_space_bitmap_size.100 = sgen_space_bitmap_size;
  D.22257 = byte >= sgen_space_bitmap_size.100;
  D.22258 = (long int) D.22257;
  D.22259 = __builtin_expect (D.22258, 0);
  if (D.22259 != 0) goto <D.22260>; else goto <D.22261>;
  <D.22260>:
  sgen_space_bitmap_size.100 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.100);
  <D.19154>:
  goto <D.19154>;
  <D.22261>:
  sgen_space_bitmap.101 = sgen_space_bitmap;
  D.22264 = (sizetype) byte;
  D.22265 = sgen_space_bitmap.101 + D.22264;
  D.22266 = *D.22265;
  D.22267 = (int) D.22266;
  D.22268 = D.22267 >> bit;
  D.22269 = D.22268 & 1;
  D.22270 = D.22269 != 0;
  D.22262 = (gboolean) D.22270;
  return D.22262;
}


sgen_get_nursery_start ()
{
  char * D.22272;

  D.22272 = sgen_nursery_start;
  return D.22272;
}


sgen_get_nursery_end ()
{
  char * D.22274;

  D.22274 = sgen_nursery_end;
  return D.22274;
}


copy_object_no_checks (void * obj, struct SgenGrayQueue * queue)
{
  void * D.22276;
  long unsigned int D.22277;
  unsigned int D.22278;
  unsigned int D.22279;
  long unsigned int D.22280;
  char * (*<T30ed>) (struct MonoVTable *, char *, size_t, gboolean) D.22281;
  _Bool D.22282;
  long int D.22283;
  long int D.22284;
  int D.22287;
  _Bool D.22291;
  long int D.22292;
  long int D.22293;
  void * D.22296;
  struct SgenGrayQueue * iftmp.102;
  long unsigned int destination.103;
  long unsigned int D.22302;
  struct MonoVTable * vt;
  gboolean has_references;
  mword objsize;
  char * destination;

  vt = MEM[(struct MonoObject *)obj].vtable;
  D.22276 = vt->gc_descr;
  D.22277 = (long unsigned int) D.22276;
  has_references = sgen_gc_descr_has_references (D.22277);
  D.22278 = sgen_par_object_get_size (vt, obj);
  D.22279 = D.22278 + 7;
  D.22280 = (long unsigned int) D.22279;
  objsize = D.22280 & 4294967288;
  D.22281 = sgen_minor_collector.alloc_for_promotion;
  destination = D.22281 (vt, obj, objsize, has_references);
  D.22282 = destination == 0B;
  D.22283 = (long int) D.22282;
  D.22284 = __builtin_expect (D.22283, 0);
  if (D.22284 != 0) goto <D.22285>; else goto <D.22286>;
  <D.22285>:
  D.22287 = sgen_ptr_in_nursery (obj);
  if (D.22287 != 0) goto <D.22288>; else goto <D.22289>;
  <D.22288>:
  sgen_pin_object (obj, queue);
  goto <D.22290>;
  <D.22289>:
  D.22291 = objsize > 8000;
  D.22292 = (long int) D.22291;
  D.22293 = __builtin_expect (D.22292, 0);
  if (D.22293 != 0) goto <D.22294>; else goto <D.22295>;
  <D.22294>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-copy-object.h", 115, "objsize <= SGEN_MAX_SMALL_OBJ_SIZE");
  <D.22295>:
  pin_major_object (obj, queue);
  <D.22290>:
  sgen_set_pinned_from_failed_allocation (objsize);
  D.22296 = obj;
  return D.22296;
  <D.22286>:
  if (has_references != 0) goto <D.22298>; else goto <D.22299>;
  <D.22298>:
  iftmp.102 = queue;
  goto <D.22300>;
  <D.22299>:
  iftmp.102 = 0B;
  <D.22300>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.102);
  destination.103 = (long unsigned int) destination;
  D.22302 = destination.103 | 1;
  MEM[(mword *)obj] = D.22302;
  D.22296 = destination;
  return D.22296;
}


par_copy_object_no_checks (char * destination, struct MonoVTable * vt, void * obj, mword objsize, struct SgenGrayQueue * queue)
{
  struct MonoClass * D.22306;
  const char * D.22307;
  const char * D.22308;
  struct FILE * gc_debug_file.104;
  struct MonoVTable * D.22312;
  struct MonoClass * D.22313;
  const char * D.22314;
  long unsigned int D.22317;
  const void * D.22318;
  mword * D.22319;
  long unsigned int D.22320;
  mword * D.22321;
  long unsigned int D.22322;
  mword * D.22323;
  long unsigned int D.22324;
  mword * D.22325;
  long unsigned int D.22326;
  mword * D.22327;
  long unsigned int D.22328;
  mword * D.22329;
  long unsigned int D.22330;
  mword * D.22331;
  long unsigned int D.22332;
  void * D.22334;
  const void * D.22335;
  long unsigned int D.22336;
  int iftmp.105;
  unsigned char D.22342;
  struct MonoArrayBounds * D.22344;
  _Bool D.22346;
  long int D.22347;
  long int D.22348;
  long int D.22351;
  long int obj.106;
  long int D.22353;
  sizetype D.22354;
  struct MonoArrayBounds * D.22355;
  int D.22358;
  long unsigned int D.22359;
  <unnamed type> mono_profiler_events.107;
  unsigned int D.22361;
  _Bool D.22362;
  long int D.22363;
  long int D.22364;
  const char * D.22371;
  int iftmp.108;
  struct GrayQueueSection * D.22376;
  int D.22378;
  _Bool D.22379;
  long int D.22380;
  long int D.22381;
  int D.22385;
  int D.22386;
  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.22304>; else goto <D.22305>;
  <D.22304>:
  D.22306 = vt->klass;
  D.22307 = D.22306->name_space;
  D.22306 = vt->klass;
  D.22308 = D.22306->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s was not initialized", vt, D.22307, D.22308);
  <D.20070>:
  goto <D.20070>;
  <D.22305>:
  if (0 != 0) goto <D.22309>; else goto <D.22310>;
  <D.22309>:
  gc_debug_file.104 = gc_debug_file;
  D.22312 = MEM[(struct MonoObject *)obj].vtable;
  D.22313 = D.22312->klass;
  D.22314 = D.22313->name;
  fprintf (gc_debug_file.104, " (to %p, %s size: %lu)\n", destination, D.22314, objsize);
  gc_debug_file.104 = gc_debug_file;
  fflush (gc_debug_file.104);
  <D.22310>:
  if (objsize <= 64) goto <D.22315>; else goto <D.22316>;
  <D.22315>:
  {
    mword * dest;

    dest = destination;
    D.22317 = objsize / 8;
    D.22318 = copy_labels[D.22317];
    goto D.22318;
    LAB_8:
    D.22319 = dest + 56;
    D.22320 = MEM[(mword *)obj + 56B];
    *D.22319 = D.22320;
    LAB_7:
    D.22321 = dest + 48;
    D.22322 = MEM[(mword *)obj + 48B];
    *D.22321 = D.22322;
    LAB_6:
    D.22323 = dest + 40;
    D.22324 = MEM[(mword *)obj + 40B];
    *D.22323 = D.22324;
    LAB_5:
    D.22325 = dest + 32;
    D.22326 = MEM[(mword *)obj + 32B];
    *D.22325 = D.22326;
    LAB_4:
    D.22327 = dest + 24;
    D.22328 = MEM[(mword *)obj + 24B];
    *D.22327 = D.22328;
    LAB_3:
    D.22329 = dest + 16;
    D.22330 = MEM[(mword *)obj + 16B];
    *D.22329 = D.22330;
    LAB_2:
    D.22331 = dest + 8;
    D.22332 = MEM[(mword *)obj + 8B];
    *D.22331 = D.22332;
    LAB_1:
    LAB_0:
  }
  goto <D.22333>;
  <D.22316>:
  D.22334 = destination + 8;
  D.22335 = obj + 8;
  D.22336 = objsize + 18446744073709551608;
  mono_gc_memmove_aligned (D.22334, D.22335, D.22336);
  <D.22333>:
  if (0 != 0) goto <D.22337>; else goto <D.22338>;
  <D.22337>:
  D.22306 = vt->klass;
  D.22307 = D.22306->name_space;
  D.22306 = vt->klass;
  D.22308 = D.22306->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s has no gc descriptor", vt, D.22307, D.22308);
  <D.20072>:
  goto <D.20072>;
  <D.22338>:
  D.22342 = vt->rank;
  if (D.22342 != 0) goto <D.22343>; else goto <D.22340>;
  <D.22343>:
  D.22344 = MEM[(struct MonoArray *)obj].bounds;
  if (D.22344 != 0B) goto <D.22345>; else goto <D.22340>;
  <D.22345>:
  iftmp.105 = 1;
  goto <D.22341>;
  <D.22340>:
  iftmp.105 = 0;
  <D.22341>:
  D.22346 = iftmp.105 != 0;
  D.22347 = (long int) D.22346;
  D.22348 = __builtin_expect (D.22347, 0);
  if (D.22348 != 0) goto <D.22349>; else goto <D.22350>;
  <D.22349>:
  {
    struct MonoArray * array;

    array = destination;
    D.22344 = MEM[(struct MonoArray *)obj].bounds;
    D.22351 = (long int) D.22344;
    obj.106 = (long int) obj;
    D.22353 = D.22351 - obj.106;
    D.22354 = (sizetype) D.22353;
    D.22355 = destination + D.22354;
    array->bounds = D.22355;
    if (0 != 0) goto <D.22356>; else goto <D.22357>;
    <D.22356>:
    gc_debug_file.104 = gc_debug_file;
    D.22342 = vt->rank;
    D.22358 = (int) D.22342;
    D.22359 = mono_array_length (array);
    fprintf (gc_debug_file.104, "Array instance %p: size: %lu, rank: %d, length: %lu\n", array, objsize, D.22358, D.22359);
    gc_debug_file.104 = gc_debug_file;
    fflush (gc_debug_file.104);
    <D.22357>:
  }
  <D.22350>:
  mono_profiler_events.107 = mono_profiler_events;
  D.22361 = mono_profiler_events.107 & 524288;
  D.22362 = D.22361 != 0;
  D.22363 = (long int) D.22362;
  D.22364 = __builtin_expect (D.22363, 0);
  if (D.22364 != 0) goto <D.22365>; else goto <D.22366>;
  <D.22365>:
  sgen_register_moved_object (obj, destination);
  <D.22366>:
  obj = destination;
  if (queue != 0B) goto <D.22367>; else goto <D.22368>;
  <D.22367>:
  if (0 != 0) goto <D.22369>; else goto <D.22370>;
  <D.22369>:
  gc_debug_file.104 = gc_debug_file;
  D.22371 = sgen_safe_name (obj);
  fprintf (gc_debug_file.104, "Enqueuing gray object %p (%s)\n", obj, D.22371);
  gc_debug_file.104 = gc_debug_file;
  fflush (gc_debug_file.104);
  <D.22370>:
  D.22376 = queue->first;
  if (D.22376 == 0B) goto <D.22373>; else goto <D.22377>;
  <D.22377>:
  D.22376 = queue->first;
  D.22378 = D.22376->end;
  if (D.22378 == 125) goto <D.22373>; else goto <D.22374>;
  <D.22373>:
  iftmp.108 = 1;
  goto <D.22375>;
  <D.22374>:
  iftmp.108 = 0;
  <D.22375>:
  D.22379 = iftmp.108 != 0;
  D.22380 = (long int) D.22379;
  D.22381 = __builtin_expect (D.22380, 0);
  if (D.22381 != 0) goto <D.22382>; else goto <D.22383>;
  <D.22382>:
  sgen_gray_object_enqueue (queue, obj);
  goto <D.22384>;
  <D.22383>:
  D.22376 = queue->first;
  D.22376 = queue->first;
  D.22378 = D.22376->end;
  D.22385 = D.22378;
  D.22386 = D.22385 + 1;
  D.22376->end = D.22386;
  D.22376->objects[D.22385] = obj;
  <D.22384>:
  __builtin_prefetch (obj);
  <D.22368>:
}


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

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


major_describe_pointer (char * ptr)
{
  char * D.22392;
  char * D.22394;
  int gc_debug_level.110;
  _Bool D.22396;
  long int D.22397;
  long int D.22398;
  struct FILE * gc_debug_file.111;
  int D.22402;
  <unnamed-unsigned:1> D.22403;
  int D.22404;
  <unnamed-unsigned:1> D.22405;
  int D.22406;
  long int ptr.112;
  char * D.22408;
  long int D.22409;
  long int D.22410;
  long int D.22411;
  long int D.22412;
  int D.22413;
  sizetype D.22414;
  sizetype D.22415;
  int iftmp.113;
  void * D.22420;
  char * D.22422;
  struct MonoVTable * iftmp.114;
  long unsigned int D.22427;
  long unsigned int D.22428;
  long int obj.115;
  long int obj.116;
  long int D.22432;
  long int D.22433;
  long int D.22434;
  long unsigned int D.22438;
  unsigned int D.22439;
  long int D.22440;
  unsigned int D.22441;
  unsigned int D.22442;
  long int D.22459;
  _Bool D.22465;
  int D.22466;
  struct MonoVTable * D.22467;
  struct MSBlockInfo * block;

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

    D.22392 = block->block;
    if (D.22392 > ptr) goto <D.22390>; else goto <D.22393>;
    <D.22393>:
    D.22392 = block->block;
    D.22394 = D.22392 + 16384;
    if (D.22394 <= ptr) goto <D.22390>; else goto <D.22391>;
    <D.22390>:
    // predicted unlikely by continue predictor.
    goto <D.20000>;
    <D.22391>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22399>; else goto <D.22400>;
    <D.22399>:
    gc_debug_file.111 = gc_debug_file;
    D.22392 = block->block;
    D.22402 = block->obj_size;
    D.22403 = block->pinned;
    D.22404 = (int) D.22403;
    D.22405 = block->has_references;
    D.22406 = (int) D.22405;
    fprintf (gc_debug_file.111, "major-ptr (block %p sz %d pin %d ref %d)\n\n", D.22392, D.22402, D.22404, D.22406);
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22400>:
    ptr.112 = (long int) ptr;
    D.22392 = block->block;
    D.22408 = D.22392 + 16;
    D.22409 = (long int) D.22408;
    D.22410 = ptr.112 - D.22409;
    D.22402 = block->obj_size;
    D.22411 = (long int) D.22402;
    D.22412 = D.22410 / D.22411;
    idx = (int) D.22412;
    D.22392 = block->block;
    D.22402 = block->obj_size;
    D.22413 = D.22402 * idx;
    D.22414 = (sizetype) D.22413;
    D.22415 = D.22414 + 16;
    obj = D.22392 + D.22415;
    D.22420 = MEM[(void * *)obj];
    if (D.22420 != 0B) goto <D.22421>; else goto <D.22417>;
    <D.22421>:
    D.22422 = MEM[(char * *)obj];
    D.22392 = block->block;
    if (D.22422 < D.22392) goto <D.22418>; else goto <D.22423>;
    <D.22423>:
    D.22422 = MEM[(char * *)obj];
    D.22392 = block->block;
    D.22394 = D.22392 + 16384;
    if (D.22422 >= D.22394) goto <D.22418>; else goto <D.22417>;
    <D.22418>:
    iftmp.113 = 1;
    goto <D.22419>;
    <D.22417>:
    iftmp.113 = 0;
    <D.22419>:
    live = iftmp.113;
    if (live != 0) goto <D.22425>; else goto <D.22426>;
    <D.22425>:
    D.22427 = MEM[(mword *)obj];
    D.22428 = D.22427 & 18446744073709551612;
    iftmp.114 = (struct MonoVTable *) D.22428;
    goto <D.22429>;
    <D.22426>:
    iftmp.114 = 0B;
    <D.22429>:
    vtable = iftmp.114;
    {
      int i;

      obj.115 = (long int) obj;
      obj.116 = (long int) obj;
      D.22432 = obj.116 & -16384;
      D.22433 = obj.115 - D.22432;
      D.22434 = D.22433 >> 3;
      i = (int) D.22434;
      if (0 != 0) goto <D.22435>; else goto <D.22436>;
      <D.22435>:
      w = i >> 5;
      b = i & 31;
      goto <D.22437>;
      <D.22436>:
      w = i >> 6;
      b = i & 63;
      <D.22437>:
    }
    D.22438 = block->mark_words[w];
    D.22439 = (unsigned int) D.22438;
    D.22440 = 1 << b;
    D.22441 = (unsigned int) D.22440;
    D.22442 = D.22439 & D.22441;
    marked = (gboolean) D.22442;
    if (obj == ptr) goto <D.22443>; else goto <D.22444>;
    <D.22443>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22445>; else goto <D.22446>;
    <D.22445>:
    gc_debug_file.111 = gc_debug_file;
    fprintf (gc_debug_file.111, "\t(\n");
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22446>:
    if (live != 0) goto <D.22447>; else goto <D.22448>;
    <D.22447>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22449>; else goto <D.22450>;
    <D.22449>:
    gc_debug_file.111 = gc_debug_file;
    fprintf (gc_debug_file.111, "object\n");
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22450>:
    goto <D.22451>;
    <D.22448>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22452>; else goto <D.22453>;
    <D.22452>:
    gc_debug_file.111 = gc_debug_file;
    fprintf (gc_debug_file.111, "dead-object\n");
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22453>:
    <D.22451>:
    goto <D.22454>;
    <D.22444>:
    if (live != 0) goto <D.22455>; else goto <D.22456>;
    <D.22455>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22457>; else goto <D.22458>;
    <D.22457>:
    gc_debug_file.111 = gc_debug_file;
    ptr.112 = (long int) ptr;
    obj.115 = (long int) obj;
    D.22459 = ptr.112 - obj.115;
    fprintf (gc_debug_file.111, "interior-ptr offset %td\n", D.22459);
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22458>:
    goto <D.22460>;
    <D.22456>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22461>; else goto <D.22462>;
    <D.22461>:
    gc_debug_file.111 = gc_debug_file;
    ptr.112 = (long int) ptr;
    obj.115 = (long int) obj;
    D.22459 = ptr.112 - obj.115;
    fprintf (gc_debug_file.111, "dead-interior-ptr offset %td\n", D.22459);
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22462>:
    <D.22460>:
    <D.22454>:
    gc_debug_level.110 = gc_debug_level;
    D.22396 = gc_debug_level.110 >= 0;
    D.22397 = (long int) D.22396;
    D.22398 = __builtin_expect (D.22397, 0);
    if (D.22398 != 0) goto <D.22463>; else goto <D.22464>;
    <D.22463>:
    gc_debug_file.111 = gc_debug_file;
    D.22465 = marked != 0;
    D.22466 = (int) D.22465;
    fprintf (gc_debug_file.111, " marked %d)\n\n", D.22466);
    gc_debug_file.111 = gc_debug_file;
    fflush (gc_debug_file.111);
    <D.22464>:
    D.22467 = vtable;
    return D.22467;
  }
  <D.20000>:
  block = block->next;
  <D.20003>:
  if (block != 0B) goto <D.20002>; else goto <D.20004>;
  <D.20004>:
  D.22467 = 0B;
  return D.22467;
}


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

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


major_is_valid_object (char * object)
{
  char * D.22473;
  char * D.22475;
  long int object.117;
  char * D.22477;
  long int D.22478;
  long int D.22479;
  int D.22480;
  long int D.22481;
  long int D.22482;
  int D.22483;
  sizetype D.22484;
  sizetype D.22485;
  gboolean D.22488;
  int iftmp.118;
  void * D.22493;
  char * D.22495;
  struct MSBlockInfo * block;

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

    D.22473 = block->block;
    if (D.22473 > object) goto <D.22471>; else goto <D.22474>;
    <D.22474>:
    D.22473 = block->block;
    D.22475 = D.22473 + 16384;
    if (D.22475 <= object) goto <D.22471>; else goto <D.22472>;
    <D.22471>:
    // predicted unlikely by continue predictor.
    goto <D.19985>;
    <D.22472>:
    object.117 = (long int) object;
    D.22473 = block->block;
    D.22477 = D.22473 + 16;
    D.22478 = (long int) D.22477;
    D.22479 = object.117 - D.22478;
    D.22480 = block->obj_size;
    D.22481 = (long int) D.22480;
    D.22482 = D.22479 / D.22481;
    idx = (int) D.22482;
    D.22473 = block->block;
    D.22480 = block->obj_size;
    D.22483 = D.22480 * idx;
    D.22484 = (sizetype) D.22483;
    D.22485 = D.22484 + 16;
    obj = D.22473 + D.22485;
    if (obj != object) goto <D.22486>; else goto <D.22487>;
    <D.22486>:
    D.22488 = 0;
    return D.22488;
    <D.22487>:
    D.22493 = MEM[(void * *)obj];
    if (D.22493 != 0B) goto <D.22494>; else goto <D.22490>;
    <D.22494>:
    D.22495 = MEM[(char * *)obj];
    D.22473 = block->block;
    if (D.22495 < D.22473) goto <D.22491>; else goto <D.22496>;
    <D.22496>:
    D.22495 = MEM[(char * *)obj];
    D.22473 = block->block;
    D.22475 = D.22473 + 16384;
    if (D.22495 >= D.22475) goto <D.22491>; else goto <D.22490>;
    <D.22491>:
    iftmp.118 = 1;
    goto <D.22492>;
    <D.22490>:
    iftmp.118 = 0;
    <D.22492>:
    D.22488 = iftmp.118;
    return D.22488;
  }
  <D.19985>:
  block = block->next;
  <D.19987>:
  if (block != 0B) goto <D.19986>; else goto <D.19988>;
  <D.19988>:
  D.22488 = 0;
  return D.22488;
}


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

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


major_print_gc_param_usage ()
{
  struct _IO_FILE * stderr.120;

  stderr.120 = stderr;
  fprintf (stderr.120, "  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.22500;
  char * D.22503;
  unsigned int percentage.121;
  struct _IO_FILE * stderr.122;
  float D.22508;
  float evacuation_threshold.123;
  gboolean D.22510;
  int D.20648;
  int iftmp.124;
  int D.20647;
  const char[11] * D.22514;
  unsigned char D.22515;
  int D.22516;
  unsigned char D.22517;
  int D.22518;
  const unsigned char * D.22523;
  unsigned char D.22524;
  int D.22525;
  const unsigned char * D.22526;
  unsigned char D.22527;
  int D.22528;
  const unsigned char * D.22533;
  unsigned char D.22534;
  int D.22535;
  const unsigned char * D.22536;
  unsigned char D.22537;
  int D.22538;
  const unsigned char * D.22543;
  unsigned char D.22544;
  int D.22545;
  const unsigned char * D.22546;
  unsigned char D.22547;
  int D.22548;
  int D.20657;
  int iftmp.125;
  int D.20656;
  const char[14] * D.22555;
  unsigned char D.22556;
  int D.22557;
  unsigned char D.22558;
  int D.22559;
  const unsigned char * D.22564;
  unsigned char D.22565;
  int D.22566;
  const unsigned char * D.22567;
  unsigned char D.22568;
  int D.22569;
  const unsigned char * D.22574;
  unsigned char D.22575;
  int D.22576;
  const unsigned char * D.22577;
  unsigned char D.22578;
  int D.22579;
  const unsigned char * D.22584;
  unsigned char D.22585;
  int D.22586;
  const unsigned char * D.22587;
  unsigned char D.22588;
  int D.22589;

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

    D.22503 = __builtin_strchr (opt, 61);
    arg = D.22503 + 1;
    percentage = atoi (arg);
    percentage.121 = (unsigned int) percentage;
    if (percentage.121 > 100) goto <D.22505>; else goto <D.22506>;
    <D.22505>:
    stderr.122 = stderr;
    fprintf (stderr.122, "evacuation-threshold must be an integer in the range 0-100.\n");
    exit (1);
    <D.22506>:
    D.22508 = (float) percentage;
    evacuation_threshold.123 = D.22508 / 1.0e+2;
    evacuation_threshold = evacuation_threshold.123;
    D.22510 = 1;
    return D.22510;
  }
  <D.22502>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = opt;
      D.22514 = "lazy-sweep";
      D.22515 = MEM[(const unsigned char *)D.22514];
      D.22516 = (int) D.22515;
      D.22517 = *__s2;
      D.22518 = (int) D.22517;
      __result = D.22516 - D.22518;
      {
        if (__s2_len != 0) goto <D.22519>; else goto <D.22520>;
        <D.22519>:
        if (__result == 0) goto <D.22521>; else goto <D.22522>;
        <D.22521>:
        D.22523 = &MEM[(void *)"lazy-sweep" + 1B];
        D.22524 = *D.22523;
        D.22525 = (int) D.22524;
        D.22526 = __s2 + 1;
        D.22527 = *D.22526;
        D.22528 = (int) D.22527;
        __result = D.22525 - D.22528;
        if (__s2_len > 1) goto <D.22529>; else goto <D.22530>;
        <D.22529>:
        if (__result == 0) goto <D.22531>; else goto <D.22532>;
        <D.22531>:
        D.22533 = &MEM[(void *)"lazy-sweep" + 2B];
        D.22534 = *D.22533;
        D.22535 = (int) D.22534;
        D.22536 = __s2 + 2;
        D.22537 = *D.22536;
        D.22538 = (int) D.22537;
        __result = D.22535 - D.22538;
        if (__s2_len > 2) goto <D.22539>; else goto <D.22540>;
        <D.22539>:
        if (__result == 0) goto <D.22541>; else goto <D.22542>;
        <D.22541>:
        D.22543 = &MEM[(void *)"lazy-sweep" + 3B];
        D.22544 = *D.22543;
        D.22545 = (int) D.22544;
        D.22546 = __s2 + 3;
        D.22547 = *D.22546;
        D.22548 = (int) D.22547;
        __result = D.22545 - D.22548;
        <D.22542>:
        <D.22540>:
        <D.22532>:
        <D.22530>:
        <D.22522>:
        <D.22520>:
      }
      D.20647 = __result;
    }
    iftmp.124 = -D.20647;
    goto <D.22549>;
    <D.22513>:
    iftmp.124 = __builtin_strcmp (opt, "lazy-sweep");
    <D.22549>:
    D.20648 = iftmp.124;
  }
  if (D.20648 == 0) goto <D.22550>; else goto <D.22551>;
  <D.22550>:
  lazy_sweep = 1;
  D.22510 = 1;
  return D.22510;
  <D.22551>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = opt;
      D.22555 = "no-lazy-sweep";
      D.22556 = MEM[(const unsigned char *)D.22555];
      D.22557 = (int) D.22556;
      D.22558 = *__s2;
      D.22559 = (int) D.22558;
      __result = D.22557 - D.22559;
      {
        if (__s2_len != 0) goto <D.22560>; else goto <D.22561>;
        <D.22560>:
        if (__result == 0) goto <D.22562>; else goto <D.22563>;
        <D.22562>:
        D.22564 = &MEM[(void *)"no-lazy-sweep" + 1B];
        D.22565 = *D.22564;
        D.22566 = (int) D.22565;
        D.22567 = __s2 + 1;
        D.22568 = *D.22567;
        D.22569 = (int) D.22568;
        __result = D.22566 - D.22569;
        if (__s2_len > 1) goto <D.22570>; else goto <D.22571>;
        <D.22570>:
        if (__result == 0) goto <D.22572>; else goto <D.22573>;
        <D.22572>:
        D.22574 = &MEM[(void *)"no-lazy-sweep" + 2B];
        D.22575 = *D.22574;
        D.22576 = (int) D.22575;
        D.22577 = __s2 + 2;
        D.22578 = *D.22577;
        D.22579 = (int) D.22578;
        __result = D.22576 - D.22579;
        if (__s2_len > 2) goto <D.22580>; else goto <D.22581>;
        <D.22580>:
        if (__result == 0) goto <D.22582>; else goto <D.22583>;
        <D.22582>:
        D.22584 = &MEM[(void *)"no-lazy-sweep" + 3B];
        D.22585 = *D.22584;
        D.22586 = (int) D.22585;
        D.22587 = __s2 + 3;
        D.22588 = *D.22587;
        D.22589 = (int) D.22588;
        __result = D.22586 - D.22589;
        <D.22583>:
        <D.22581>:
        <D.22573>:
        <D.22571>:
        <D.22563>:
        <D.22561>:
      }
      D.20656 = __result;
    }
    iftmp.125 = -D.20656;
    goto <D.22590>;
    <D.22554>:
    iftmp.125 = __builtin_strcmp (opt, "no-lazy-sweep");
    <D.22590>:
    D.20657 = iftmp.125;
  }
  if (D.20657 == 0) goto <D.22591>; else goto <D.22592>;
  <D.22591>:
  lazy_sweep = 0;
  D.22510 = 1;
  return D.22510;
  <D.22592>:
  D.22510 = 0;
  return D.22510;
}


atoi (const char * __nptr)
{
  int D.22594;
  long int D.22595;

  D.22595 = strtol (__nptr, 0B, 10);
  D.22594 = (int) D.22595;
  return D.22594;
}


get_num_major_sections ()
{
  int D.22597;

  D.22597 = num_major_sections;
  return D.22597;
}


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.22599;
  char * D.22602;
  gboolean D.22605;
  <unnamed-unsigned:1> D.22606;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19881>;
  <D.19880>:
  D.22599 = block->block;
  if (D.22599 <= ptr) goto <D.22600>; else goto <D.22601>;
  <D.22600>:
  D.22599 = block->block;
  D.22602 = D.22599 + 16384;
  if (D.22602 >= ptr) goto <D.22603>; else goto <D.22604>;
  <D.22603>:
  D.22606 = block->pinned;
  D.22605 = (gboolean) D.22606;
  return D.22605;
  <D.22604>:
  <D.22601>:
  block = block->next;
  <D.19881>:
  if (block != 0B) goto <D.19880>; else goto <D.19882>;
  <D.19882>:
  D.22605 = 0;
  return D.22605;
}


major_ptr_is_in_non_pinned_space (char * ptr, char * * start)
{
  char * D.22608;
  char * D.22611;
  int D.22614;
  int D.22615;
  sizetype D.22616;
  sizetype D.22617;
  char * D.22618;
  int D.22621;
  int D.22622;
  sizetype D.22623;
  sizetype D.22624;
  char * D.22625;
  gboolean D.22628;
  long unsigned int D.22629;
  long unsigned int D.22630;
  _Bool D.22631;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19960>;
  <D.19959>:
  D.22608 = block->block;
  if (D.22608 <= ptr) goto <D.22609>; else goto <D.22610>;
  <D.22609>:
  D.22608 = block->block;
  D.22611 = D.22608 + 16384;
  if (D.22611 >= ptr) goto <D.22612>; else goto <D.22613>;
  <D.22612>:
  {
    int count;
    int i;

    D.22614 = block->obj_size;
    count = 16368 / D.22614;
    *start = 0B;
    i = 0;
    goto <D.19958>;
    <D.19957>:
    D.22608 = block->block;
    D.22614 = block->obj_size;
    D.22615 = D.22614 * i;
    D.22616 = (sizetype) D.22615;
    D.22617 = D.22616 + 16;
    D.22618 = D.22608 + D.22617;
    if (D.22618 <= ptr) goto <D.22619>; else goto <D.22620>;
    <D.22619>:
    D.22608 = block->block;
    D.22614 = block->obj_size;
    D.22621 = i + 1;
    D.22622 = D.22614 * D.22621;
    D.22623 = (sizetype) D.22622;
    D.22624 = D.22623 + 16;
    D.22625 = D.22608 + D.22624;
    if (D.22625 > ptr) goto <D.22626>; else goto <D.22627>;
    <D.22626>:
    D.22608 = block->block;
    D.22614 = block->obj_size;
    D.22615 = D.22614 * i;
    D.22616 = (sizetype) D.22615;
    D.22617 = D.22616 + 16;
    D.22618 = D.22608 + D.22617;
    *start = D.22618;
    goto <D.19956>;
    <D.22627>:
    <D.22620>:
    i = i + 1;
    <D.19958>:
    if (i <= count) goto <D.19957>; else goto <D.19956>;
    <D.19956>:
    D.22629 = BIT_FIELD_REF <*block, 64, 64>;
    D.22630 = D.22629 & 4294967296;
    D.22631 = D.22630 == 0;
    D.22628 = (gboolean) D.22631;
    return D.22628;
  }
  <D.22613>:
  <D.22610>:
  block = block->next;
  <D.19960>:
  if (block != 0B) goto <D.19959>; else goto <D.19961>;
  <D.19961>:
  D.22628 = 0;
  return D.22628;
}


major_have_computer_minor_collection_allowance ()
{
  long unsigned int D.22633;
  long unsigned int D.22634;
  int have_swept.126;
  _Bool D.22636;
  long int D.22637;
  long int D.22638;
  void * empty_blocks.127;
  int num_empty_blocks.128;
  int num_empty_blocks.129;
  long long int stat_major_blocks_freed.130;
  long long int stat_major_blocks_freed.131;
  int section_reserve;

  D.22633 = sgen_get_minor_collection_allowance ();
  D.22634 = D.22633 / 16384;
  section_reserve = (int) D.22634;
  have_swept.126 = have_swept;
  D.22636 = have_swept.126 == 0;
  D.22637 = (long int) D.22636;
  D.22638 = __builtin_expect (D.22637, 0);
  if (D.22638 != 0) goto <D.22639>; else goto <D.22640>;
  <D.22639>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1898, "have_swept");
  <D.22640>:
  goto <D.20597>;
  <D.20596>:
  {
    void * next;

    empty_blocks.127 = empty_blocks;
    next = MEM[(void * *)empty_blocks.127];
    empty_blocks.127 = empty_blocks;
    sgen_free_os_memory (empty_blocks.127, 16384, 1);
    empty_blocks = next;
    num_empty_blocks.128 = num_empty_blocks;
    num_empty_blocks.129 = num_empty_blocks.128 + -1;
    num_empty_blocks = num_empty_blocks.129;
    stat_major_blocks_freed.130 = stat_major_blocks_freed;
    stat_major_blocks_freed.131 = stat_major_blocks_freed.130 + 1;
    stat_major_blocks_freed = stat_major_blocks_freed.131;
  }
  <D.20597>:
  num_empty_blocks.128 = num_empty_blocks;
  if (num_empty_blocks.128 > section_reserve) goto <D.20596>; else goto <D.20598>;
  <D.20598>:
}


major_finish_major_collection ()
{

}


major_start_major_collection ()
{
  gboolean * evacuate_block_obj_sizes.132;
  long unsigned int D.22647;
  long unsigned int D.22648;
  gboolean * D.22649;
  int D.22650;
  struct MSBlockInfo * * D.22653;
  long unsigned int D.22654;
  struct MSBlockInfo * * D.22655;
  struct MSBlockInfo * * D.22656;
  struct MSBlockInfo * * D.22657;
  int num_block_obj_sizes.133;
  int lazy_sweep.134;
  struct MSBlockInfo * D.22662;
  int i;

  i = 0;
  goto <D.20581>;
  <D.20580>:
  evacuate_block_obj_sizes.132 = evacuate_block_obj_sizes;
  D.22647 = (long unsigned int) i;
  D.22648 = D.22647 * 4;
  D.22649 = evacuate_block_obj_sizes.132 + D.22648;
  D.22650 = *D.22649;
  if (D.22650 == 0) goto <D.22651>; else goto <D.22652>;
  <D.22651>:
  // predicted unlikely by continue predictor.
  goto <D.20579>;
  <D.22652>:
  D.22653 = free_block_lists[0];
  D.22647 = (long unsigned int) i;
  D.22654 = D.22647 * 8;
  D.22655 = D.22653 + D.22654;
  *D.22655 = 0B;
  D.22656 = free_block_lists[2];
  D.22647 = (long unsigned int) i;
  D.22654 = D.22647 * 8;
  D.22657 = D.22656 + D.22654;
  *D.22657 = 0B;
  <D.20579>:
  i = i + 1;
  <D.20581>:
  num_block_obj_sizes.133 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.133) goto <D.20580>; else goto <D.20582>;
  <D.20582>:
  lazy_sweep.134 = lazy_sweep;
  if (lazy_sweep.134 != 0) goto <D.22660>; else goto <D.22661>;
  <D.22660>:
  {
    struct MSBlockInfo * * iter;

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

      block = *iter;
      sweep_block (block, 1);
      iter = &block->next;
    }
    <D.20586>:
    D.22662 = *iter;
    if (D.22662 != 0B) goto <D.20585>; else goto <D.20587>;
    <D.20587>:
  }
  <D.22661>:
}


sweep_block (struct MSBlockInfo * block, gboolean during_major_collection)
{
  int D.22665;
  _Bool D.22666;
  long int D.22667;
  long int D.22668;
  long unsigned int D.22671;
  long unsigned int D.22672;
  int D.22675;
  mword[32] * D.22676;
  void * * D.22677;
  int count;
  void * reversed;

  reversed = 0B;
  if (during_major_collection == 0) goto <D.22663>; else goto <D.22664>;
  <D.22663>:
  D.22665 = sgen_concurrent_collection_in_progress ();
  D.22666 = D.22665 != 0;
  D.22667 = (long int) D.22666;
  D.22668 = __builtin_expect (D.22667, 0);
  if (D.22668 != 0) goto <D.22669>; else goto <D.22670>;
  <D.22669>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1551, "!sgen_concurrent_collection_in_progress ()");
  <D.22670>:
  <D.22664>:
  D.22671 = BIT_FIELD_REF <*block, 64, 64>;
  D.22672 = D.22671 & 68719476736;
  if (D.22672 != 0) goto <D.22673>; else goto <D.22674>;
  <D.22673>:
  return;
  <D.22674>:
  D.22675 = block->obj_size;
  count = 16368 / D.22675;
  block->free_list = 0B;
  D.22675 = block->obj_size;
  switch (D.22675) <default: <D.20484>, case 16: <D.20482>>
  <D.20482>:
  sweep_block_for_size (block, count, 16);
  goto <D.20483>;
  <D.20484>:
  D.22675 = block->obj_size;
  sweep_block_for_size (block, count, D.22675);
  goto <D.20483>;
  <D.20483>:
  D.22676 = &block->mark_words;
  memset (D.22676, 0, 256);
  reversed = 0B;
  goto <D.20487>;
  <D.20486>:
  {
    void * next;

    D.22677 = block->free_list;
    next = *D.22677;
    D.22677 = block->free_list;
    *D.22677 = reversed;
    reversed = block->free_list;
    block->free_list = next;
  }
  <D.20487>:
  D.22677 = block->free_list;
  if (D.22677 != 0B) goto <D.20486>; else goto <D.20488>;
  <D.20488>:
  block->free_list = reversed;
  block->swept = 1;
}


sweep_block_for_size (struct MSBlockInfo * block, int count, int obj_size)
{
  char * D.22679;
  int D.22680;
  sizetype D.22681;
  sizetype D.22682;
  long int obj.135;
  long int obj.136;
  long int D.22685;
  long int D.22686;
  long int D.22687;
  long unsigned int D.22691;
  long int D.22692;
  long unsigned int D.22693;
  long unsigned int D.22694;
  void * D.22702;
  char * D.22705;
  char * D.22707;
  long unsigned int D.22708;
  void * * D.22709;
  int obj_index;

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

    D.22679 = block->block;
    D.22680 = obj_size * obj_index;
    D.22681 = (sizetype) D.22680;
    D.22682 = D.22681 + 16;
    obj = D.22679 + D.22682;
    {
      int i;

      obj.135 = (long int) obj;
      obj.136 = (long int) obj;
      D.22685 = obj.136 & -16384;
      D.22686 = obj.135 - D.22685;
      D.22687 = D.22686 >> 3;
      i = (int) D.22687;
      if (0 != 0) goto <D.22688>; else goto <D.22689>;
      <D.22688>:
      word = i >> 5;
      bit = i & 31;
      goto <D.22690>;
      <D.22689>:
      word = i >> 6;
      bit = i & 63;
      <D.22690>:
    }
    D.22691 = block->mark_words[word];
    D.22692 = 1 << bit;
    D.22693 = (long unsigned int) D.22692;
    D.22694 = D.22691 & D.22693;
    if (D.22694 != 0) goto <D.22695>; else goto <D.22696>;
    <D.22695>:
    if (0 != 0) goto <D.22697>; else goto <D.22698>;
    <D.22697>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.20472>:
    goto <D.20472>;
    <D.22698>:
    goto <D.22699>;
    <D.22696>:
    D.22702 = MEM[(void * *)obj];
    if (D.22702 != 0B) goto <D.22703>; else goto <D.22704>;
    <D.22703>:
    D.22705 = MEM[(char * *)obj];
    D.22679 = block->block;
    if (D.22705 < D.22679) goto <D.22700>; else goto <D.22706>;
    <D.22706>:
    D.22705 = MEM[(char * *)obj];
    D.22679 = block->block;
    D.22707 = D.22679 + 16384;
    if (D.22705 >= D.22707) goto <D.22700>; else goto <D.22701>;
    <D.22700>:
    D.22708 = (long unsigned int) obj_size;
    memset (obj, 0, D.22708);
    <D.22701>:
    <D.22704>:
    D.22709 = block->free_list;
    MEM[(void * *)obj] = D.22709;
    block->free_list = obj;
    <D.22699>:
  }
  obj_index = obj_index + 1;
  <D.20474>:
  if (obj_index < count) goto <D.20473>; else goto <D.20475>;
  <D.20475>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22712;
  int D.22717;
  void * D.22719;
  long unsigned int D.22720;

  D.22712 = __builtin_constant_p (__len);
  if (D.22712 != 0) goto <D.22713>; else goto <D.22714>;
  <D.22713>:
  if (__len == 0) goto <D.22715>; else goto <D.22716>;
  <D.22715>:
  D.22717 = __builtin_constant_p (__ch);
  if (D.22717 == 0) goto <D.22710>; else goto <D.22718>;
  <D.22718>:
  if (__ch != 0) goto <D.22710>; else goto <D.22711>;
  <D.22710>:
  __warn_memset_zero_len ();
  D.22719 = __dest;
  return D.22719;
  <D.22711>:
  <D.22716>:
  <D.22714>:
  D.22720 = __builtin_object_size (__dest, 0);
  D.22719 = __builtin___memset_chk (__dest, __ch, __len, D.22720);
  return D.22719;
}


major_finish_nursery_collection ()
{
  int num_major_sections.137;
  int old_num_major_sections.138;
  int D.22724;

  num_major_sections.137 = num_major_sections;
  old_num_major_sections.138 = old_num_major_sections;
  D.22724 = num_major_sections.137 - old_num_major_sections.138;
  sgen_register_major_sections_alloced (D.22724);
}


major_start_nursery_collection ()
{
  int num_major_sections.139;

  num_major_sections.139 = num_major_sections;
  old_num_major_sections = num_major_sections.139;
}


major_get_used_size ()
{
  int D.22726;
  int D.22727;
  long int D.22728;
  long int D.22729;
  gint64 D.22730;
  gint64 size;
  struct MSBlockInfo * block;

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

    D.22726 = block->obj_size;
    count = 16368 / D.22726;
    D.22726 = block->obj_size;
    D.22727 = D.22726 * count;
    D.22728 = (long int) D.22727;
    size = D.22728 + size;
    iter = block->free_list;
    goto <D.20627>;
    <D.20626>:
    D.22726 = block->obj_size;
    D.22729 = (long int) D.22726;
    size = size - D.22729;
    iter = *iter;
    <D.20627>:
    if (iter != 0B) goto <D.20626>; else goto <D.20628>;
    <D.20628>:
  }
  block = block->next;
  <D.20630>:
  if (block != 0B) goto <D.20629>; else goto <D.20631>;
  <D.20631>:
  D.22730 = size;
  return D.22730;
}


major_dump_heap (struct FILE * heap_dump_file)
{
  int num_block_obj_sizes.140;
  long unsigned int D.22733;
  long unsigned int D.22734;
  long unsigned int D.22735;
  long unsigned int D.22736;
  int * D.22737;
  int * D.22738;
  int D.22739;
  int D.22740;
  long unsigned int D.22741;
  long unsigned int D.22742;
  int * D.22743;
  int D.22744;
  int D.22745;
  char * D.22748;
  int D.22749;
  sizetype D.22750;
  sizetype D.22751;
  char * D.22752;
  void * D.22753;
  char * D.22756;
  char * D.22758;
  int * D.22759;
  int D.22760;
  int D.22761;
  int * block_obj_sizes.141;
  int * D.22763;
  int D.22764;
  int D.22765;
  int D.22770;
  sizetype D.22771;
  sizetype D.22772;
  char * D.22773;
  void * D.22774;
  char * D.22776;
  int D.22782;
  sizetype D.22783;
  sizetype D.22784;
  char * D.22785;
  struct MSBlockInfo * block;
  int * slots_available;
  int * slots_used;
  int i;

  num_block_obj_sizes.140 = num_block_obj_sizes;
  D.22733 = (long unsigned int) num_block_obj_sizes.140;
  D.22734 = D.22733 * 4;
  slots_available = __builtin_alloca (D.22734);
  num_block_obj_sizes.140 = num_block_obj_sizes;
  D.22733 = (long unsigned int) num_block_obj_sizes.140;
  D.22734 = D.22733 * 4;
  slots_used = __builtin_alloca (D.22734);
  i = 0;
  goto <D.20016>;
  <D.20015>:
  D.22735 = (long unsigned int) i;
  D.22736 = D.22735 * 4;
  D.22737 = slots_available + D.22736;
  D.22735 = (long unsigned int) i;
  D.22736 = D.22735 * 4;
  D.22738 = slots_used + D.22736;
  *D.22738 = 0;
  D.22739 = *D.22738;
  *D.22737 = D.22739;
  i = i + 1;
  <D.20016>:
  num_block_obj_sizes.140 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.140) goto <D.20015>; else goto <D.20017>;
  <D.20017>:
  block = all_blocks;
  goto <D.20024>;
  <D.20023>:
  {
    int index;
    int count;

    D.22740 = block->obj_size;
    index = ms_find_block_obj_size_index (D.22740);
    D.22740 = block->obj_size;
    count = 16368 / D.22740;
    D.22741 = (long unsigned int) index;
    D.22742 = D.22741 * 4;
    D.22743 = slots_available + D.22742;
    D.22741 = (long unsigned int) index;
    D.22742 = D.22741 * 4;
    D.22743 = slots_available + D.22742;
    D.22744 = *D.22743;
    D.22745 = D.22744 + count;
    *D.22743 = D.22745;
    i = 0;
    goto <D.20021>;
    <D.20020>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22749 = D.22740 * i;
    D.22750 = (sizetype) D.22749;
    D.22751 = D.22750 + 16;
    D.22752 = D.22748 + D.22751;
    D.22753 = MEM[(void * *)D.22752];
    if (D.22753 != 0B) goto <D.22754>; else goto <D.22755>;
    <D.22754>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22749 = D.22740 * i;
    D.22750 = (sizetype) D.22749;
    D.22751 = D.22750 + 16;
    D.22752 = D.22748 + D.22751;
    D.22756 = MEM[(char * *)D.22752];
    D.22748 = block->block;
    if (D.22756 < D.22748) goto <D.22746>; else goto <D.22757>;
    <D.22757>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22749 = D.22740 * i;
    D.22750 = (sizetype) D.22749;
    D.22751 = D.22750 + 16;
    D.22752 = D.22748 + D.22751;
    D.22756 = MEM[(char * *)D.22752];
    D.22748 = block->block;
    D.22758 = D.22748 + 16384;
    if (D.22756 >= D.22758) goto <D.22746>; else goto <D.22747>;
    <D.22746>:
    D.22741 = (long unsigned int) index;
    D.22742 = D.22741 * 4;
    D.22759 = slots_used + D.22742;
    D.22760 = *D.22759;
    D.22761 = D.22760 + 1;
    *D.22759 = D.22761;
    <D.22747>:
    <D.22755>:
    i = i + 1;
    <D.20021>:
    if (i < count) goto <D.20020>; else goto <D.20022>;
    <D.20022>:
  }
  block = block->next;
  <D.20024>:
  if (block != 0B) goto <D.20023>; else goto <D.20025>;
  <D.20025>:
  fprintf (heap_dump_file, "<occupancies>\n");
  i = 0;
  goto <D.20027>;
  <D.20026>:
  block_obj_sizes.141 = block_obj_sizes;
  D.22735 = (long unsigned int) i;
  D.22736 = D.22735 * 4;
  D.22763 = block_obj_sizes.141 + D.22736;
  D.22764 = *D.22763;
  D.22735 = (long unsigned int) i;
  D.22736 = D.22735 * 4;
  D.22737 = slots_available + D.22736;
  D.22765 = *D.22737;
  D.22735 = (long unsigned int) i;
  D.22736 = D.22735 * 4;
  D.22738 = slots_used + D.22736;
  D.22739 = *D.22738;
  fprintf (heap_dump_file, "<occupancy size=\"%d\" available=\"%d\" used=\"%d\" />\n", D.22764, D.22765, D.22739);
  i = i + 1;
  <D.20027>:
  num_block_obj_sizes.140 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.140) goto <D.20026>; else goto <D.20028>;
  <D.20028>:
  fprintf (heap_dump_file, "</occupancies>\n");
  block = all_blocks;
  goto <D.20036>;
  <D.20035>:
  {
    int count;
    int i;
    int start;

    D.22740 = block->obj_size;
    count = 16368 / D.22740;
    start = -1;
    fprintf (heap_dump_file, "<section type=\"%s\" size=\"%zu\">\n", "old", 16368);
    i = 0;
    goto <D.20033>;
    <D.20032>:
    if (i < count) goto <D.22769>; else goto <D.22766>;
    <D.22769>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22770 = D.22740 * i;
    D.22771 = (sizetype) D.22770;
    D.22772 = D.22771 + 16;
    D.22773 = D.22748 + D.22772;
    D.22774 = MEM[(void * *)D.22773];
    if (D.22774 != 0B) goto <D.22775>; else goto <D.22766>;
    <D.22775>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22770 = D.22740 * i;
    D.22771 = (sizetype) D.22770;
    D.22772 = D.22771 + 16;
    D.22773 = D.22748 + D.22772;
    D.22776 = MEM[(char * *)D.22773];
    D.22748 = block->block;
    if (D.22776 < D.22748) goto <D.22767>; else goto <D.22777>;
    <D.22777>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22770 = D.22740 * i;
    D.22771 = (sizetype) D.22770;
    D.22772 = D.22771 + 16;
    D.22773 = D.22748 + D.22772;
    D.22776 = MEM[(char * *)D.22773];
    D.22748 = block->block;
    D.22758 = D.22748 + 16384;
    if (D.22776 >= D.22758) goto <D.22767>; else goto <D.22766>;
    <D.22767>:
    if (start < 0) goto <D.22778>; else goto <D.22779>;
    <D.22778>:
    start = i;
    <D.22779>:
    goto <D.22768>;
    <D.22766>:
    if (start >= 0) goto <D.22780>; else goto <D.22781>;
    <D.22780>:
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22782 = D.22740 * start;
    D.22783 = (sizetype) D.22782;
    D.22784 = D.22783 + 16;
    D.22785 = D.22748 + D.22784;
    D.22748 = block->block;
    D.22740 = block->obj_size;
    D.22770 = D.22740 * i;
    D.22771 = (sizetype) D.22770;
    D.22772 = D.22771 + 16;
    D.22773 = D.22748 + D.22772;
    D.22748 = block->block;
    sgen_dump_occupied (D.22785, D.22773, D.22748);
    start = -1;
    <D.22781>:
    <D.22768>:
    i = i + 1;
    <D.20033>:
    if (i <= count) goto <D.20032>; else goto <D.20034>;
    <D.20034>:
    fprintf (heap_dump_file, "</section>\n");
  }
  block = block->next;
  <D.20036>:
  if (block != 0B) goto <D.20035>; else goto <D.20037>;
  <D.20037>:
}


major_check_scan_starts ()
{

}


major_sweep ()
{
  ms_sweep ();
}


ms_sweep ()
{
  int num_block_obj_sizes.142;
  long unsigned int D.22787;
  long unsigned int D.22788;
  long unsigned int D.22789;
  long unsigned int D.22790;
  int * D.22791;
  int * D.22792;
  int * D.22793;
  int D.22794;
  int D.22795;
  long unsigned int D.22796;
  long unsigned int D.22797;
  struct MSBlockInfo * * D.22798;
  <unnamed-unsigned:1> D.22799;
  <unnamed-unsigned:1> D.22800;
  int D.22801;
  guint8 * D.22802;
  long unsigned int D.22805;
  int D.22806;
  unsigned int i.143;
  int lazy_sweep.144;
  long unsigned int D.22819;
  long unsigned int D.22820;
  int * D.22821;
  int D.22822;
  int D.22823;
  int * D.22824;
  int D.22825;
  int D.22826;
  int * D.22827;
  int D.22828;
  int D.22829;
  long unsigned int D.22832;
  long unsigned int D.22833;
  _Bool D.22834;
  int D.22835;
  int iftmp.145;
  long unsigned int D.22837;
  int D.22841;
  int iftmp.146;
  int D.22843;
  int D.22844;
  long unsigned int D.22848;
  long unsigned int D.22849;
  struct MSBlockInfo * * D.22850;
  struct MSBlockInfo * D.22851;
  struct MSBlockInfo * D.22853;
  char * D.22854;
  int num_major_sections.147;
  int num_major_sections.148;
  struct MSBlockInfo * D.22857;
  float D.22858;
  int D.22859;
  float D.22860;
  float evacuation_threshold.149;
  gboolean * evacuate_block_obj_sizes.150;
  gboolean * D.22867;
  int * block_obj_sizes.151;
  int * D.22869;
  int D.22870;
  int D.22871;
  int D.22872;
  int D.22875;
  long unsigned int D.22876;
  long unsigned int D.22877;
  float D.22878;
  float D.22879;
  float D.22880;
  float concurrent_evacuation_threshold.152;
  float D.22882;
  _Bool D.22883;
  int want_evacuation.153;
  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.142 = num_block_obj_sizes;
  D.22787 = (long unsigned int) num_block_obj_sizes.142;
  D.22788 = D.22787 * 4;
  slots_available = __builtin_alloca (D.22788);
  num_block_obj_sizes.142 = num_block_obj_sizes;
  D.22787 = (long unsigned int) num_block_obj_sizes.142;
  D.22788 = D.22787 * 4;
  slots_used = __builtin_alloca (D.22788);
  num_block_obj_sizes.142 = num_block_obj_sizes;
  D.22787 = (long unsigned int) num_block_obj_sizes.142;
  D.22788 = D.22787 * 4;
  num_blocks = __builtin_alloca (D.22788);
  total_evacuate_heap = 0;
  total_evacuate_saved = 0;
  i = 0;
  goto <D.20504>;
  <D.20503>:
  D.22789 = (long unsigned int) i;
  D.22790 = D.22789 * 4;
  D.22791 = slots_available + D.22790;
  D.22789 = (long unsigned int) i;
  D.22790 = D.22789 * 4;
  D.22792 = slots_used + D.22790;
  D.22789 = (long unsigned int) i;
  D.22790 = D.22789 * 4;
  D.22793 = num_blocks + D.22790;
  *D.22793 = 0;
  D.22794 = *D.22793;
  *D.22792 = D.22794;
  D.22795 = *D.22792;
  *D.22791 = D.22795;
  i = i + 1;
  <D.20504>:
  num_block_obj_sizes.142 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.142) goto <D.20503>; else goto <D.20505>;
  <D.20505>:
  i = 0;
  goto <D.20512>;
  <D.20511>:
  {
    struct MSBlockInfo * * free_blocks;
    int j;

    free_blocks = free_block_lists[i];
    j = 0;
    goto <D.20509>;
    <D.20508>:
    D.22796 = (long unsigned int) j;
    D.22797 = D.22796 * 8;
    D.22798 = free_blocks + D.22797;
    *D.22798 = 0B;
    j = j + 1;
    <D.20509>:
    num_block_obj_sizes.142 = num_block_obj_sizes;
    if (j < num_block_obj_sizes.142) goto <D.20508>; else goto <D.20510>;
    <D.20510>:
  }
  i = i + 1;
  <D.20512>:
  if (i <= 3) goto <D.20511>; else goto <D.20513>;
  <D.20513>:
  iter = &all_blocks;
  goto <D.20527>;
  <D.20526>:
  {
    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.22799 = block->has_pinned;
    has_pinned = (gboolean) D.22799;
    D.22800 = block->pinned;
    block->has_pinned = D.22800;
    block->is_to_space = 0;
    block->swept = 0;
    D.22801 = block->obj_size;
    count = 16368 / D.22801;
    D.22802 = block->cardtable_mod_union;
    if (D.22802 != 0B) goto <D.22803>; else goto <D.22804>;
    <D.22803>:
    D.22802 = block->cardtable_mod_union;
    sgen_free_internal_dynamic (D.22802, 32, 28);
    block->cardtable_mod_union = 0B;
    <D.22804>:
    i = 0;
    goto <D.20522>;
    <D.20521>:
    D.22805 = block->mark_words[i];
    D.22806 = bitcount (D.22805);
    nused = D.22806 + nused;
    i = i + 1;
    <D.20522>:
    i.143 = (unsigned int) i;
    if (i.143 <= 31) goto <D.20521>; else goto <D.20523>;
    <D.20523>:
    if (nused != 0) goto <D.22808>; else goto <D.22809>;
    <D.22808>:
    have_live = 1;
    <D.22809>:
    if (nused < count) goto <D.22810>; else goto <D.22811>;
    <D.22810>:
    have_free = 1;
    <D.22811>:
    lazy_sweep.144 = lazy_sweep;
    if (lazy_sweep.144 == 0) goto <D.22813>; else goto <D.22814>;
    <D.22813>:
    sweep_block (block, 1);
    <D.22814>:
    if (have_live != 0) goto <D.22815>; else goto <D.22816>;
    <D.22815>:
    if (has_pinned == 0) goto <D.22817>; else goto <D.22818>;
    <D.22817>:
    D.22819 = (long unsigned int) obj_size_index;
    D.22820 = D.22819 * 4;
    D.22821 = num_blocks + D.22820;
    D.22822 = *D.22821;
    D.22823 = D.22822 + 1;
    *D.22821 = D.22823;
    D.22819 = (long unsigned int) obj_size_index;
    D.22820 = D.22819 * 4;
    D.22824 = slots_used + D.22820;
    D.22819 = (long unsigned int) obj_size_index;
    D.22820 = D.22819 * 4;
    D.22824 = slots_used + D.22820;
    D.22825 = *D.22824;
    D.22826 = D.22825 + nused;
    *D.22824 = D.22826;
    D.22819 = (long unsigned int) obj_size_index;
    D.22820 = D.22819 * 4;
    D.22827 = slots_available + D.22820;
    D.22819 = (long unsigned int) obj_size_index;
    D.22820 = D.22819 * 4;
    D.22827 = slots_available + D.22820;
    D.22828 = *D.22827;
    D.22829 = D.22828 + count;
    *D.22827 = D.22829;
    <D.22818>:
    iter = &block->next;
    if (have_free != 0) goto <D.22830>; else goto <D.22831>;
    <D.22830>:
    {
      struct MSBlockInfo * * free_blocks;
      int index;

      D.22832 = BIT_FIELD_REF <*block, 64, 64>;
      D.22833 = D.22832 & 4294967296;
      D.22834 = D.22833 != 0;
      D.22835 = (int) D.22834;
      D.22832 = BIT_FIELD_REF <*block, 64, 64>;
      D.22837 = D.22832 & 8589934592;
      if (D.22837 != 0) goto <D.22838>; else goto <D.22839>;
      <D.22838>:
      iftmp.145 = 2;
      goto <D.22840>;
      <D.22839>:
      iftmp.145 = 0;
      <D.22840>:
      D.22841 = D.22835 | iftmp.145;
      free_blocks = free_block_lists[D.22841];
      D.22801 = block->obj_size;
      D.22843 = D.22801 + 7;
      D.22844 = D.22843 >> 3;
      if (D.22844 <= 31) goto <D.22845>; else goto <D.22846>;
      <D.22845>:
      D.22801 = block->obj_size;
      D.22843 = D.22801 + 7;
      D.22844 = D.22843 >> 3;
      iftmp.146 = fast_block_obj_size_indexes[D.22844];
      goto <D.22847>;
      <D.22846>:
      D.22801 = block->obj_size;
      iftmp.146 = ms_find_block_obj_size_index (D.22801);
      <D.22847>:
      index = iftmp.146;
      D.22848 = (long unsigned int) index;
      D.22849 = D.22848 * 8;
      D.22850 = free_blocks + D.22849;
      D.22851 = *D.22850;
      block->next_free = D.22851;
      D.22848 = (long unsigned int) index;
      D.22849 = D.22848 * 8;
      D.22850 = free_blocks + D.22849;
      *D.22850 = block;
    }
    <D.22831>:
    update_heap_boundaries_for_block (block);
    goto <D.22852>;
    <D.22816>:
    D.22853 = block->next;
    *iter = D.22853;
    D.22854 = block->block;
    ms_free_block (D.22854);
    sgen_free_internal (block, 16);
    num_major_sections.147 = num_major_sections;
    num_major_sections.148 = num_major_sections.147 + -1;
    num_major_sections = num_major_sections.148;
    <D.22852>:
  }
  <D.20527>:
  D.22857 = *iter;
  if (D.22857 != 0B) goto <D.20526>; else goto <D.20528>;
  <D.20528>:
  i = 0;
  goto <D.20532>;
  <D.20531>:
  {
    float usage;

    D.22789 = (long unsigned int) i;
    D.22790 = D.22789 * 4;
    D.22792 = slots_used + D.22790;
    D.22795 = *D.22792;
    D.22858 = (float) D.22795;
    D.22789 = (long unsigned int) i;
    D.22790 = D.22789 * 4;
    D.22791 = slots_available + D.22790;
    D.22859 = *D.22791;
    D.22860 = (float) D.22859;
    usage = D.22858 / D.22860;
    D.22789 = (long unsigned int) i;
    D.22790 = D.22789 * 4;
    D.22793 = num_blocks + D.22790;
    D.22794 = *D.22793;
    if (D.22794 > 5) goto <D.22863>; else goto <D.22861>;
    <D.22863>:
    evacuation_threshold.149 = evacuation_threshold;
    if (usage < evacuation_threshold.149) goto <D.22865>; else goto <D.22861>;
    <D.22865>:
    evacuate_block_obj_sizes.150 = evacuate_block_obj_sizes;
    D.22789 = (long unsigned int) i;
    D.22790 = D.22789 * 4;
    D.22867 = evacuate_block_obj_sizes.150 + D.22790;
    *D.22867 = 1;
    goto <D.22862>;
    <D.22861>:
    evacuate_block_obj_sizes.150 = evacuate_block_obj_sizes;
    D.22789 = (long unsigned int) i;
    D.22790 = D.22789 * 4;
    D.22867 = evacuate_block_obj_sizes.150 + D.22790;
    *D.22867 = 0;
    <D.22862>:
    {
      mword total_bytes;

      block_obj_sizes.151 = block_obj_sizes;
      D.22789 = (long unsigned int) i;
      D.22790 = D.22789 * 4;
      D.22869 = block_obj_sizes.151 + D.22790;
      D.22870 = *D.22869;
      D.22789 = (long unsigned int) i;
      D.22790 = D.22789 * 4;
      D.22791 = slots_available + D.22790;
      D.22859 = *D.22791;
      D.22871 = D.22870 * D.22859;
      total_bytes = (mword) D.22871;
      total_evacuate_heap = total_evacuate_heap + total_bytes;
      evacuate_block_obj_sizes.150 = evacuate_block_obj_sizes;
      D.22789 = (long unsigned int) i;
      D.22790 = D.22789 * 4;
      D.22867 = evacuate_block_obj_sizes.150 + D.22790;
      D.22872 = *D.22867;
      if (D.22872 != 0) goto <D.22873>; else goto <D.22874>;
      <D.22873>:
      block_obj_sizes.151 = block_obj_sizes;
      D.22789 = (long unsigned int) i;
      D.22790 = D.22789 * 4;
      D.22869 = block_obj_sizes.151 + D.22790;
      D.22870 = *D.22869;
      D.22789 = (long unsigned int) i;
      D.22790 = D.22789 * 4;
      D.22792 = slots_used + D.22790;
      D.22795 = *D.22792;
      D.22875 = D.22870 * D.22795;
      D.22876 = (long unsigned int) D.22875;
      D.22877 = total_bytes - D.22876;
      total_evacuate_saved = D.22877 + total_evacuate_saved;
      <D.22874>:
    }
  }
  i = i + 1;
  <D.20532>:
  num_block_obj_sizes.142 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.142) goto <D.20531>; else goto <D.20533>;
  <D.20533>:
  D.22878 = (float) total_evacuate_saved;
  D.22879 = (float) total_evacuate_heap;
  D.22880 = D.22878 / D.22879;
  concurrent_evacuation_threshold.152 = concurrent_evacuation_threshold;
  D.22882 = 1.0e+0 - concurrent_evacuation_threshold.152;
  D.22883 = D.22880 > D.22882;
  want_evacuation.153 = (int) D.22883;
  want_evacuation = want_evacuation.153;
  have_swept = 1;
}


bitcount (mword d)
{
  int D.22887;
  unsigned int D.22889;
  int D.22890;
  int D.22891;
  int count;

  count = 0;
  if (1 != 0) goto <D.22885>; else goto <D.22886>;
  <D.22885>:
  D.22887 = __builtin_popcountl (d);
  count = D.22887 + count;
  goto <D.22888>;
  <D.22886>:
  D.22889 = (unsigned int) d;
  D.22890 = __builtin_popcount (D.22889);
  count = D.22890 + count;
  <D.22888>:
  D.22891 = count;
  return D.22891;
}


update_heap_boundaries_for_block (struct MSBlockInfo * block)
{
  char * D.22893;
  long unsigned int D.22894;
  long unsigned int D.22895;

  D.22893 = block->block;
  D.22894 = (long unsigned int) D.22893;
  D.22893 = block->block;
  D.22894 = (long unsigned int) D.22893;
  D.22895 = D.22894 + 16384;
  sgen_update_heap_boundaries (D.22894, D.22895);
}


ms_free_block (void * block)
{
  void * D.22896;
  int D.22897;
  int D.22898;
  void * empty;

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

    <D.19857>:
    __old_x = num_empty_blocks;
    D.22897 = __old_x + 1;
    D.22898 = InterlockedCompareExchange (&num_empty_blocks, D.22897, __old_x);
    if (D.22898 != __old_x) goto <D.19857>; else goto <D.19858>;
    <D.19858>:
  }
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.22899;
  long unsigned int comp.154;
  long unsigned int exch.155;
  long unsigned int D.22902;

  comp.154 = (long unsigned int) comp;
  exch.155 = (long unsigned int) exch;
  D.22902 = __sync_val_compare_and_swap_8 (dest, comp.154, exch.155);
  D.22899 = (void *) D.22902;
  return D.22899;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.22904;
  unsigned int comp.156;
  unsigned int exch.157;
  unsigned int D.22907;

  comp.156 = (unsigned int) comp;
  exch.157 = (unsigned int) exch;
  D.22907 = __sync_val_compare_and_swap_4 (dest, comp.156, exch.157);
  D.22904 = (gint32) D.22907;
  return D.22904;
}


major_init_to_space ()
{

}


major_get_cardtable_mod_union_for_object (char * obj)
{
  long unsigned int obj.158;
  long unsigned int D.22910;
  struct MSBlockHeader * D.22911;
  guint8 * D.22912;
  guint8 * D.22913;
  long int obj.159;
  char * D.22915;
  void * D.22916;
  long int D.22917;
  long int D.22918;
  long int D.22919;
  sizetype D.22920;
  struct MSBlockInfo * block;

  obj.158 = (long unsigned int) obj;
  D.22910 = obj.158 & 18446744073709535232;
  D.22911 = (struct MSBlockHeader *) D.22910;
  block = D.22911->info;
  D.22913 = block->cardtable_mod_union;
  obj.159 = (long int) obj;
  D.22915 = block->block;
  D.22916 = sgen_card_table_align_pointer (D.22915);
  D.22917 = (long int) D.22916;
  D.22918 = obj.159 - D.22917;
  D.22919 = D.22918 >> 9;
  D.22920 = (sizetype) D.22919;
  D.22912 = D.22913 + D.22920;
  return D.22912;
}


update_cardtable_mod_union ()
{
  guint8 * D.22922;
  char * D.22923;
  guint8 * D.22924;
  long unsigned int num_cards.160;
  _Bool D.22926;
  long int D.22927;
  long int D.22928;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20738>;
  <D.20737>:
  {
    size_t num_cards;

    try
      {
        D.22922 = block->cardtable_mod_union;
        D.22923 = block->block;
        D.22924 = sgen_card_table_update_mod_union (D.22922, D.22923, 16384, &num_cards);
        block->cardtable_mod_union = D.22924;
        num_cards.160 = num_cards;
        D.22926 = num_cards.160 != 32;
        D.22927 = (long int) D.22926;
        D.22928 = __builtin_expect (D.22927, 0);
        if (D.22928 != 0) goto <D.22929>; else goto <D.22930>;
        <D.22929>:
        monoeg_g_log (0B, 4, "Number of cards calculation is wrong");
        <D.20736>:
        goto <D.20736>;
        <D.22930>:
      }
    finally
      {
        num_cards = {CLOBBER};
      }
  }
  block = block->next;
  <D.20738>:
  if (block != 0B) goto <D.20737>; else goto <D.20739>;
  <D.20739>:
}


major_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  long unsigned int D.22931;
  long unsigned int D.22932;
  char * D.22935;
  long unsigned int D.22936;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20666>;
  <D.20665>:
  D.22931 = BIT_FIELD_REF <*block, 64, 64>;
  D.22932 = D.22931 & 8589934592;
  if (D.22932 != 0) goto <D.22933>; else goto <D.22934>;
  <D.22933>:
  D.22935 = block->block;
  D.22936 = (long unsigned int) D.22935;
  callback (D.22936, 16384);
  <D.22934>:
  block = block->next;
  <D.20666>:
  if (block != 0B) goto <D.20665>; else goto <D.20667>;
  <D.20667>:
}


major_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  struct SgenObjectOperations * D.22937;
  int concurrent_mark.161;
  _Bool D.22941;
  long int D.22942;
  long int D.22943;
  long unsigned int D.22946;
  long unsigned int D.22947;
  long unsigned int block_start.162;
  long unsigned int D.22958;
  void * D.22962;
  char * D.22964;
  char * D.22966;
  long int obj.163;
  long int obj.164;
  long int D.22971;
  long int D.22972;
  long int D.22973;
  long unsigned int D.22977;
  long int D.22978;
  long unsigned int D.22979;
  long unsigned int D.22980;
  long int base.165;
  long int D.22983;
  long int D.22984;
  long unsigned int D.22985;
  sizetype D.22986;
  guint8 * D.22987;
  sizetype D.22988;
  long int card_data.166;
  long int card_base.167;
  long int D.22997;
  int D.22998;
  sizetype D.22999;
  unsigned char D.23000;
  long int start.168;
  char * D.23009;
  long int D.23010;
  long int D.23011;
  long int D.23012;
  long int D.23013;
  int D.23014;
  sizetype D.23015;
  sizetype D.23016;
  void * D.23018;
  char * D.23020;
  long int obj.169;
  long int obj.170;
  long int D.23026;
  long int D.23027;
  long int D.23028;
  long unsigned int D.23032;
  long int D.23033;
  long unsigned int D.23034;
  long unsigned int D.23035;
  struct MSBlockInfo * block;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  void next_large = <<< error >>>;
  void next_small = <<< error >>>;

  D.22937 = sgen_get_current_object_ops ();
  scan_func = D.22937->scan_object;
  concurrent_mark.161 = concurrent_mark;
  if (concurrent_mark.161 == 0) goto <D.22939>; else goto <D.22940>;
  <D.22939>:
  D.22941 = mod_union != 0;
  D.22942 = (long int) D.22941;
  D.22943 = __builtin_expect (D.22942, 0);
  if (D.22943 != 0) goto <D.22944>; else goto <D.22945>;
  <D.22944>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2225, "!mod_union");
  <D.22945>:
  <D.22940>:
  block = all_blocks;
  goto <D.20729>;
  <D.20728>:
  {
    int block_obj_size;
    char * block_start;

    D.22946 = BIT_FIELD_REF <*block, 64, 64>;
    D.22947 = D.22946 & 8589934592;
    if (D.22947 == 0) goto <D.22948>; else goto <D.22949>;
    <D.22948>:
    // predicted unlikely by continue predictor.
    goto <D.20695>;
    <D.22949>:
    block_obj_size = block->obj_size;
    block_start = block->block;
    if (block_obj_size > 511) goto <D.22950>; else goto <D.22951>;
    <D.22950>:
    {
      guint8 * cards;
      char * obj;
      char * end;
      char * base;

      if (mod_union != 0) goto <D.22952>; else goto <D.22953>;
      <D.22952>:
      cards = block->cardtable_mod_union;
      if (cards == 0B) goto <D.22954>; else goto <D.22955>;
      <D.22954>:
      // predicted unlikely by continue predictor.
      goto <D.20695>;
      <D.22955>:
      goto <D.22956>;
      <D.22953>:
      block_start.162 = (long unsigned int) block_start;
      cards = sgen_card_table_get_shadow_card_address (block_start.162);
      <D.22956>:
      obj = block_start + 16;
      end = block_start + 16384;
      base = sgen_card_table_align_pointer (obj);
      goto <D.20706>;
      <D.20705>:
      {
        int card_offset;

        D.22946 = BIT_FIELD_REF <*block, 64, 64>;
        D.22958 = D.22946 & 68719476736;
        if (D.22958 == 0) goto <D.22959>; else goto <D.22960>;
        <D.22959>:
        sweep_block (block, 0);
        <D.22960>:
        D.22962 = MEM[(void * *)obj];
        if (D.22962 == 0B) goto next_large; else goto <D.22963>;
        <D.22963>:
        D.22964 = MEM[(char * *)obj];
        if (D.22964 >= block_start) goto <D.22965>; else goto <D.22961>;
        <D.22965>:
        D.22964 = MEM[(char * *)obj];
        D.22966 = block_start + 16384;
        if (D.22964 < D.22966) goto next_large; else goto <D.22961>;
        <D.22961>:
        if (mod_union != 0) goto <D.22967>; else goto <D.22968>;
        <D.22967>:
        {
          int w;
          int b;

          {
            int i;

            obj.163 = (long int) obj;
            obj.164 = (long int) obj;
            D.22971 = obj.164 & -16384;
            D.22972 = obj.163 - D.22971;
            D.22973 = D.22972 >> 3;
            i = (int) D.22973;
            if (0 != 0) goto <D.22974>; else goto <D.22975>;
            <D.22974>:
            w = i >> 5;
            b = i & 31;
            goto <D.22976>;
            <D.22975>:
            w = i >> 6;
            b = i & 63;
            <D.22976>:
          }
          D.22977 = block->mark_words[w];
          D.22978 = 1 << b;
          D.22979 = (long unsigned int) D.22978;
          D.22980 = D.22977 & D.22979;
          if (D.22980 == 0) goto next_large; else goto <D.22981>;
          <D.22981>:
        }
        <D.22968>:
        obj.163 = (long int) obj;
        base.165 = (long int) base;
        D.22983 = obj.163 - base.165;
        D.22984 = D.22983 >> 9;
        card_offset = (int) D.22984;
        D.22985 = (long unsigned int) block_obj_size;
        D.22986 = (sizetype) card_offset;
        D.22987 = cards + D.22986;
        sgen_cardtable_scan_object (obj, D.22985, D.22987, mod_union, queue);
        next_large:
        D.22988 = (sizetype) block_obj_size;
        obj = obj + D.22988;
      }
      <D.20706>:
      if (obj < end) goto <D.20705>; else goto <D.20707>;
      <D.20707>:
    }
    goto <D.22989>;
    <D.22951>:
    {
      guint8 * card_data;
      guint8 * card_base;
      guint8 * card_data_end;

      if (mod_union != 0) goto <D.22990>; else goto <D.22991>;
      <D.22990>:
      card_base = block->cardtable_mod_union;
      card_data = card_base;
      if (card_data == 0B) goto <D.22992>; else goto <D.22993>;
      <D.22992>:
      // predicted unlikely by continue predictor.
      goto <D.20695>;
      <D.22993>:
      goto <D.22994>;
      <D.22991>:
      block_start.162 = (long unsigned int) block_start;
      card_base = sgen_card_table_get_shadow_card_address (block_start.162);
      card_data = card_base;
      <D.22994>:
      card_data_end = card_data + 32;
      card_data = initial_skip_card (card_data);
      goto <D.20726>;
      <D.20725>:
      {
        int index;
        int idx;
        char * start;
        char * end;
        char * first_obj;
        char * obj;

        card_data.166 = (long int) card_data;
        card_base.167 = (long int) card_base;
        D.22997 = card_data.166 - card_base.167;
        idx = (int) D.22997;
        D.22998 = idx * 512;
        D.22999 = (sizetype) D.22998;
        start = block_start + D.22999;
        end = start + 512;
        D.23000 = *card_data;
        if (D.23000 == 0) goto <D.23001>; else goto <D.23002>;
        <D.23001>:
        // predicted unlikely by continue predictor.
        goto <D.20717>;
        <D.23002>:
        D.22946 = BIT_FIELD_REF <*block, 64, 64>;
        D.22958 = D.22946 & 68719476736;
        if (D.22958 == 0) goto <D.23003>; else goto <D.23004>;
        <D.23003>:
        sweep_block (block, 0);
        <D.23004>:
        sgen_card_table_prepare_card_for_scanning (card_data);
        if (idx == 0) goto <D.23005>; else goto <D.23006>;
        <D.23005>:
        index = 0;
        goto <D.23007>;
        <D.23006>:
        start.168 = (long int) start;
        D.23009 = block_start + 16;
        D.23010 = (long int) D.23009;
        D.23011 = start.168 - D.23010;
        D.23012 = (long int) block_obj_size;
        D.23013 = D.23011 / D.23012;
        index = (int) D.23013;
        <D.23007>:
        D.23014 = block_obj_size * index;
        D.23015 = (sizetype) D.23014;
        D.23016 = D.23015 + 16;
        first_obj = block_start + D.23016;
        obj = first_obj;
        goto <D.20723>;
        <D.20722>:
        D.23018 = MEM[(void * *)obj];
        if (D.23018 == 0B) goto next_small; else goto <D.23019>;
        <D.23019>:
        D.23020 = MEM[(char * *)obj];
        if (D.23020 >= block_start) goto <D.23021>; else goto <D.23017>;
        <D.23021>:
        D.23020 = MEM[(char * *)obj];
        D.22966 = block_start + 16384;
        if (D.23020 < D.22966) goto next_small; else goto <D.23017>;
        <D.23017>:
        if (mod_union != 0) goto <D.23022>; else goto <D.23023>;
        <D.23022>:
        {
          int w;
          int b;

          {
            int i;

            obj.169 = (long int) obj;
            obj.170 = (long int) obj;
            D.23026 = obj.170 & -16384;
            D.23027 = obj.169 - D.23026;
            D.23028 = D.23027 >> 3;
            i = (int) D.23028;
            if (0 != 0) goto <D.23029>; else goto <D.23030>;
            <D.23029>:
            w = i >> 5;
            b = i & 31;
            goto <D.23031>;
            <D.23030>:
            w = i >> 6;
            b = i & 63;
            <D.23031>:
          }
          D.23032 = block->mark_words[w];
          D.23033 = 1 << b;
          D.23034 = (long unsigned int) D.23033;
          D.23035 = D.23032 & D.23034;
          if (D.23035 == 0) goto next_small; else goto <D.23036>;
          <D.23036>:
        }
        <D.23023>:
        scan_func (obj, queue);
        next_small:
        D.22988 = (sizetype) block_obj_size;
        obj = obj + D.22988;
        <D.20723>:
        if (obj < end) goto <D.20722>; else goto <D.20724>;
        <D.20724>:
      }
      <D.20717>:
      card_data = card_data + 1;
      <D.20726>:
      if (card_data < card_data_end) goto <D.20725>; else goto <D.20727>;
      <D.20727>:
    }
    <D.22989>:
  }
  <D.20695>:
  block = block->next;
  <D.20729>:
  if (block != 0B) goto <D.20728>; else goto <D.20730>;
  <D.20730>:
}


sgen_card_table_get_shadow_card_address (mword address)
{
  guint8 * D.23037;
  guint8 * sgen_shadow_cardtable.171;
  long unsigned int D.23039;
  sizetype D.23040;

  sgen_shadow_cardtable.171 = sgen_shadow_cardtable;
  D.23039 = address >> 9;
  D.23040 = D.23039 & 8388607;
  D.23037 = sgen_shadow_cardtable.171 + D.23040;
  return D.23037;
}


initial_skip_card (guint8 * card_data)
{
  long unsigned int D.23042;
  long unsigned int D.23043;
  mword * D.23044;
  guint8 * D.23048;
  sizetype D.23049;
  guint8 * D.23050;
  unsigned char D.23051;
  mword * cards;
  mword card;
  int i;

  cards = card_data;
  i = 0;
  goto <D.20676>;
  <D.20675>:
  D.23042 = (long unsigned int) i;
  D.23043 = D.23042 * 8;
  D.23044 = cards + D.23043;
  card = *D.23044;
  if (card != 0) goto <D.20674>; else goto <D.23045>;
  <D.23045>:
  i = i + 1;
  <D.20676>:
  if (i <= 3) goto <D.20675>; else goto <D.20674>;
  <D.20674>:
  if (i == 4) goto <D.23046>; else goto <D.23047>;
  <D.23046>:
  D.23048 = card_data + 32;
  return D.23048;
  <D.23047>:
  i = i * 8;
  goto <D.20678>;
  <D.20677>:
  D.23049 = (sizetype) i;
  D.23050 = card_data + D.23049;
  D.23051 = *D.23050;
  if (D.23051 != 0) goto <D.23052>; else goto <D.23053>;
  <D.23052>:
  D.23049 = (sizetype) i;
  D.23048 = card_data + D.23049;
  return D.23048;
  <D.23053>:
  i = i + 1;
  <D.20678>:
  if (i <= 31) goto <D.20677>; else goto <D.20679>;
  <D.20679>:
  D.23048 = card_data;
  return D.23048;
}


sgen_card_table_prepare_card_for_scanning (guint8 * card)
{

}


pin_major_object (char * obj, struct SgenGrayQueue * queue)
{
  int concurrent_mark.172;
  long unsigned int obj.173;
  long unsigned int D.23059;
  struct MSBlockHeader * D.23060;
  long int obj.174;
  long int obj.175;
  long int D.23063;
  long int D.23064;
  long int D.23065;
  long unsigned int D.23071;
  long int D.23072;
  long unsigned int D.23073;
  long unsigned int D.23074;
  long unsigned int D.23077;
  long unsigned int D.23078;
  long unsigned int D.23079;
  int iftmp.176;
  struct GrayQueueSection * D.23086;
  int D.23088;
  _Bool D.23089;
  long int D.23090;
  long int D.23091;
  int D.23095;
  int D.23096;
  struct MSBlockInfo * block;

  concurrent_mark.172 = concurrent_mark;
  if (concurrent_mark.172 != 0) goto <D.23056>; else goto <D.23057>;
  <D.23056>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-marksweep.c", 1107);
  <D.23057>:
  obj.173 = (long unsigned int) obj;
  D.23059 = obj.173 & 18446744073709535232;
  D.23060 = (struct MSBlockHeader *) D.23059;
  block = D.23060->info;
  block->has_pinned = 1;
  {
    int __word;
    int __bit;

    {
      int i;

      obj.174 = (long int) obj;
      obj.175 = (long int) obj;
      D.23063 = obj.175 & -16384;
      D.23064 = obj.174 - D.23063;
      D.23065 = D.23064 >> 3;
      i = (int) D.23065;
      if (0 != 0) goto <D.23066>; else goto <D.23067>;
      <D.23066>:
      __word = i >> 5;
      __bit = i & 31;
      goto <D.23068>;
      <D.23067>:
      __word = i >> 6;
      __bit = i & 63;
      <D.23068>:
    }
    if (0 != 0) goto <D.23069>; else goto <D.23070>;
    <D.23069>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.20046>:
    goto <D.20046>;
    <D.23070>:
    D.23071 = block->mark_words[__word];
    D.23072 = 1 << __bit;
    D.23073 = (long unsigned int) D.23072;
    D.23074 = D.23071 & D.23073;
    if (D.23074 == 0) goto <D.23075>; else goto <D.23076>;
    <D.23075>:
    D.23071 = block->mark_words[__word];
    D.23072 = 1 << __bit;
    D.23073 = (long unsigned int) D.23072;
    D.23077 = D.23071 | D.23073;
    block->mark_words[__word] = D.23077;
    D.23078 = BIT_FIELD_REF <*block, 64, 64>;
    D.23079 = D.23078 & 8589934592;
    if (D.23079 != 0) goto <D.23080>; else goto <D.23081>;
    <D.23080>:
    D.23086 = queue->first;
    if (D.23086 == 0B) goto <D.23083>; else goto <D.23087>;
    <D.23087>:
    D.23086 = queue->first;
    D.23088 = D.23086->end;
    if (D.23088 == 125) goto <D.23083>; else goto <D.23084>;
    <D.23083>:
    iftmp.176 = 1;
    goto <D.23085>;
    <D.23084>:
    iftmp.176 = 0;
    <D.23085>:
    D.23089 = iftmp.176 != 0;
    D.23090 = (long int) D.23089;
    D.23091 = __builtin_expect (D.23090, 0);
    if (D.23091 != 0) goto <D.23092>; else goto <D.23093>;
    <D.23092>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.23094>;
    <D.23093>:
    D.23086 = queue->first;
    D.23086 = queue->first;
    D.23088 = D.23086->end;
    D.23095 = D.23088;
    D.23096 = D.23095 + 1;
    D.23086->end = D.23096;
    D.23086->objects[D.23095] = obj;
    <D.23094>:
    __builtin_prefetch (obj);
    <D.23081>:
    <D.23076>:
  }
}


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

  block = all_blocks;
  goto <D.20611>;
  <D.20610>:
  mark_pinned_objects_in_block (block, queue);
  block = block->next;
  <D.20611>:
  if (block != 0B) goto <D.20610>; else goto <D.20612>;
  <D.20612>:
}


mark_pinned_objects_in_block (struct MSBlockInfo * block, struct SgenGrayQueue * queue)
{
  int D.23097;
  void * * D.23100;
  long unsigned int D.23101;
  long unsigned int D.23102;
  void * * D.23103;
  void * D.23104;
  long int D.23105;
  char * D.23106;
  char * D.23107;
  long int D.23108;
  long int D.23109;
  int D.23110;
  long int D.23111;
  long int D.23112;
  int D.23115;
  int D.23118;
  sizetype D.23119;
  sizetype D.23120;
  char * D.23121;
  long int D.23122;
  long int D.23123;
  long int D.23124;
  long int D.23125;
  long int D.23126;
  long unsigned int D.23132;
  long int D.23133;
  long unsigned int D.23134;
  long unsigned int D.23135;
  void * D.23138;
  char * D.23141;
  char * D.23143;
  long unsigned int D.23144;
  long unsigned int D.23145;
  long unsigned int D.23146;
  int iftmp.177;
  struct GrayQueueSection * D.23153;
  int D.23155;
  _Bool D.23156;
  long int D.23157;
  long int D.23158;
  int D.23162;
  int D.23163;
  int i;
  int last_index;

  last_index = -1;
  D.23097 = block->pin_queue_num_entries;
  if (D.23097 == 0) goto <D.23098>; else goto <D.23099>;
  <D.23098>:
  return;
  <D.23099>:
  block->has_pinned = 1;
  i = 0;
  goto <D.20460>;
  <D.20459>:
  {
    int index;

    D.23100 = block->pin_queue_start;
    D.23101 = (long unsigned int) i;
    D.23102 = D.23101 * 8;
    D.23103 = D.23100 + D.23102;
    D.23104 = *D.23103;
    D.23105 = (long int) D.23104;
    D.23106 = block->block;
    D.23107 = D.23106 + 16;
    D.23108 = (long int) D.23107;
    D.23109 = D.23105 - D.23108;
    D.23110 = block->obj_size;
    D.23111 = (long int) D.23110;
    D.23112 = D.23109 / D.23111;
    index = (int) D.23112;
    if (0 != 0) goto <D.23113>; else goto <D.23114>;
    <D.23113>:
    D.23100 = block->pin_queue_start;
    D.23101 = (long unsigned int) i;
    D.23102 = D.23101 * 8;
    D.23103 = D.23100 + D.23102;
    D.23104 = *D.23103;
    D.23110 = block->obj_size;
    D.23115 = 16368 / D.23110;
    monoeg_g_log (0B, 4, "invalid object %p index %d max-index %d", D.23104, index, D.23115);
    <D.20454>:
    goto <D.20454>;
    <D.23114>:
    if (index == last_index) goto <D.23116>; else goto <D.23117>;
    <D.23116>:
    // predicted unlikely by continue predictor.
    goto <D.20455>;
    <D.23117>:
    {
      int __word;
      int __bit;

      {
        int i;

        D.23106 = block->block;
        D.23110 = block->obj_size;
        D.23118 = D.23110 * index;
        D.23119 = (sizetype) D.23118;
        D.23120 = D.23119 + 16;
        D.23121 = D.23106 + D.23120;
        D.23122 = (long int) D.23121;
        D.23106 = block->block;
        D.23110 = block->obj_size;
        D.23118 = D.23110 * index;
        D.23119 = (sizetype) D.23118;
        D.23120 = D.23119 + 16;
        D.23121 = D.23106 + D.23120;
        D.23123 = (long int) D.23121;
        D.23124 = D.23123 & -16384;
        D.23125 = D.23122 - D.23124;
        D.23126 = D.23125 >> 3;
        i = (int) D.23126;
        if (0 != 0) goto <D.23127>; else goto <D.23128>;
        <D.23127>:
        __word = i >> 5;
        __bit = i & 31;
        goto <D.23129>;
        <D.23128>:
        __word = i >> 6;
        __bit = i & 63;
        <D.23129>:
      }
      D.23132 = block->mark_words[__word];
      D.23133 = 1 << __bit;
      D.23134 = (long unsigned int) D.23133;
      D.23135 = D.23132 & D.23134;
      if (D.23135 == 0) goto <D.23136>; else goto <D.23137>;
      <D.23136>:
      D.23106 = block->block;
      D.23110 = block->obj_size;
      D.23118 = D.23110 * index;
      D.23119 = (sizetype) D.23118;
      D.23120 = D.23119 + 16;
      D.23121 = D.23106 + D.23120;
      D.23138 = MEM[(void * *)D.23121];
      if (D.23138 != 0B) goto <D.23139>; else goto <D.23140>;
      <D.23139>:
      D.23106 = block->block;
      D.23110 = block->obj_size;
      D.23118 = D.23110 * index;
      D.23119 = (sizetype) D.23118;
      D.23120 = D.23119 + 16;
      D.23121 = D.23106 + D.23120;
      D.23141 = MEM[(char * *)D.23121];
      D.23106 = block->block;
      if (D.23141 < D.23106) goto <D.23130>; else goto <D.23142>;
      <D.23142>:
      D.23106 = block->block;
      D.23110 = block->obj_size;
      D.23118 = D.23110 * index;
      D.23119 = (sizetype) D.23118;
      D.23120 = D.23119 + 16;
      D.23121 = D.23106 + D.23120;
      D.23141 = MEM[(char * *)D.23121];
      D.23106 = block->block;
      D.23143 = D.23106 + 16384;
      if (D.23141 >= D.23143) goto <D.23130>; else goto <D.23131>;
      <D.23130>:
      D.23132 = block->mark_words[__word];
      D.23133 = 1 << __bit;
      D.23134 = (long unsigned int) D.23133;
      D.23144 = D.23132 | D.23134;
      block->mark_words[__word] = D.23144;
      D.23145 = BIT_FIELD_REF <*block, 64, 64>;
      D.23146 = D.23145 & 8589934592;
      if (D.23146 != 0) goto <D.23147>; else goto <D.23148>;
      <D.23147>:
      D.23153 = queue->first;
      if (D.23153 == 0B) goto <D.23150>; else goto <D.23154>;
      <D.23154>:
      D.23153 = queue->first;
      D.23155 = D.23153->end;
      if (D.23155 == 125) goto <D.23150>; else goto <D.23151>;
      <D.23150>:
      iftmp.177 = 1;
      goto <D.23152>;
      <D.23151>:
      iftmp.177 = 0;
      <D.23152>:
      D.23156 = iftmp.177 != 0;
      D.23157 = (long int) D.23156;
      D.23158 = __builtin_expect (D.23157, 0);
      if (D.23158 != 0) goto <D.23159>; else goto <D.23160>;
      <D.23159>:
      D.23106 = block->block;
      D.23110 = block->obj_size;
      D.23118 = D.23110 * index;
      D.23119 = (sizetype) D.23118;
      D.23120 = D.23119 + 16;
      D.23121 = D.23106 + D.23120;
      sgen_gray_object_enqueue (queue, D.23121);
      goto <D.23161>;
      <D.23160>:
      D.23153 = queue->first;
      D.23153 = queue->first;
      D.23155 = D.23153->end;
      D.23162 = D.23155;
      D.23163 = D.23162 + 1;
      D.23153->end = D.23163;
      D.23106 = block->block;
      D.23110 = block->obj_size;
      D.23118 = D.23110 * index;
      D.23119 = (sizetype) D.23118;
      D.23120 = D.23119 + 16;
      D.23121 = D.23106 + D.23120;
      D.23153->objects[D.23162] = D.23121;
      <D.23161>:
      D.23106 = block->block;
      D.23110 = block->obj_size;
      D.23118 = D.23110 * index;
      D.23119 = (sizetype) D.23118;
      D.23120 = D.23119 + 16;
      D.23121 = D.23106 + D.23120;
      __builtin_prefetch (D.23121);
      <D.23148>:
      <D.23131>:
      <D.23140>:
      <D.23137>:
    }
    last_index = index;
  }
  <D.20455>:
  i = i + 1;
  <D.20460>:
  D.23097 = block->pin_queue_num_entries;
  if (D.23097 > i) goto <D.20459>; else goto <D.20461>;
  <D.20461>:
}


major_find_pin_queue_start_ends (struct SgenGrayQueue * queue)
{
  char * D.23165;
  void * D.23166;
  void * D.23167;
  int * D.23168;
  void * * D.23169;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.20604>;
  <D.20603>:
  D.23165 = block->block;
  D.23166 = D.23165 + 16;
  D.23165 = block->block;
  D.23167 = D.23165 + 16384;
  D.23168 = &block->pin_queue_num_entries;
  D.23169 = sgen_find_optimized_pin_queue_area (D.23166, D.23167, D.23168);
  block->pin_queue_start = D.23169;
  block = block->next;
  <D.20604>:
  if (block != 0B) goto <D.20603>; else goto <D.20605>;
  <D.20605>:
}


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


free_object (char * obj, size_t size, gboolean pinned)
{
  long unsigned int obj.178;
  long unsigned int D.23171;
  struct MSBlockHeader * D.23172;
  long unsigned int D.23173;
  long unsigned int D.23174;
  <unnamed-unsigned:1> D.23179;
  int D.23180;
  long int obj.179;
  long int obj.180;
  long int D.23185;
  long int D.23186;
  long int D.23187;
  void * * D.23193;
  _Bool D.23196;
  int D.23197;
  int iftmp.181;
  long unsigned int D.23199;
  int D.23203;
  int iftmp.182;
  long unsigned int D.23205;
  long unsigned int D.23206;
  int D.23210;
  long unsigned int D.23213;
  long unsigned int D.23214;
  struct MSBlockInfo * * D.23215;
  struct MSBlockInfo * D.23216;
  struct MSBlockInfo * block;
  int word;
  int bit;

  obj.178 = (long unsigned int) obj;
  D.23171 = obj.178 & 18446744073709535232;
  D.23172 = (struct MSBlockHeader *) D.23171;
  block = D.23172->info;
  D.23173 = BIT_FIELD_REF <*block, 64, 64>;
  D.23174 = D.23173 & 68719476736;
  if (D.23174 == 0) goto <D.23175>; else goto <D.23176>;
  <D.23175>:
  sweep_block (block, 0);
  <D.23176>:
  if (0 != 0) goto <D.23177>; else goto <D.23178>;
  <D.23177>:
  D.23179 = block->pinned;
  D.23180 = (int) D.23179;
  monoeg_g_log (0B, 4, "free-object pinning mixup object %p pinned %d block %p pinned %d", obj, pinned, block, D.23180);
  <D.19913>:
  goto <D.19913>;
  <D.23178>:
  if (0 != 0) goto <D.23181>; else goto <D.23182>;
  <D.23181>:
  monoeg_g_log (0B, 4, "object %p is already free", obj);
  <D.19914>:
  goto <D.19914>;
  <D.23182>:
  {
    int i;

    obj.179 = (long int) obj;
    obj.180 = (long int) obj;
    D.23185 = obj.180 & -16384;
    D.23186 = obj.179 - D.23185;
    D.23187 = D.23186 >> 3;
    i = (int) D.23187;
    if (0 != 0) goto <D.23188>; else goto <D.23189>;
    <D.23188>:
    word = i >> 5;
    bit = i & 31;
    goto <D.23190>;
    <D.23189>:
    word = i >> 6;
    bit = i & 63;
    <D.23190>:
  }
  if (0 != 0) goto <D.23191>; else goto <D.23192>;
  <D.23191>:
  monoeg_g_log (0B, 4, "object %p has mark bit set");
  <D.19916>:
  goto <D.19916>;
  <D.23192>:
  D.23193 = block->free_list;
  if (D.23193 == 0B) goto <D.23194>; else goto <D.23195>;
  <D.23194>:
  {
    struct MSBlockInfo * * free_blocks;
    int size_index;

    D.23196 = pinned != 0;
    D.23197 = (int) D.23196;
    D.23173 = BIT_FIELD_REF <*block, 64, 64>;
    D.23199 = D.23173 & 8589934592;
    if (D.23199 != 0) goto <D.23200>; else goto <D.23201>;
    <D.23200>:
    iftmp.181 = 2;
    goto <D.23202>;
    <D.23201>:
    iftmp.181 = 0;
    <D.23202>:
    D.23203 = D.23197 | iftmp.181;
    free_blocks = free_block_lists[D.23203];
    D.23205 = size + 7;
    D.23206 = D.23205 >> 3;
    if (D.23206 <= 31) goto <D.23207>; else goto <D.23208>;
    <D.23207>:
    D.23205 = size + 7;
    D.23206 = D.23205 >> 3;
    iftmp.182 = fast_block_obj_size_indexes[D.23206];
    goto <D.23209>;
    <D.23208>:
    D.23210 = (int) size;
    iftmp.182 = ms_find_block_obj_size_index (D.23210);
    <D.23209>:
    size_index = iftmp.182;
    if (0 != 0) goto <D.23211>; else goto <D.23212>;
    <D.23211>:
    monoeg_g_log (0B, 4, "block %p doesn\'t have a free-list of object but belongs to a free-list of blocks");
    <D.19919>:
    goto <D.19919>;
    <D.23212>:
    D.23213 = (long unsigned int) size_index;
    D.23214 = D.23213 * 8;
    D.23215 = free_blocks + D.23214;
    D.23216 = *D.23215;
    block->next_free = D.23216;
    D.23213 = (long unsigned int) size_index;
    D.23214 = D.23213 * 8;
    D.23215 = free_blocks + D.23214;
    *D.23215 = block;
  }
  <D.23195>:
  memset (obj, 0, size);
  D.23193 = block->free_list;
  MEM[(void * *)obj] = D.23193;
  block->free_list = obj;
}


major_iterate_objects (gboolean non_pinned, gboolean pinned, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data)
{
  int D.23217;
  long unsigned int D.23218;
  long unsigned int D.23219;
  int lazy_sweep.183;
  char * D.23231;
  int D.23232;
  sizetype D.23233;
  sizetype D.23234;
  void * D.23237;
  char * D.23240;
  char * D.23242;
  long unsigned int D.23243;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19977>;
  <D.19976>:
  {
    int count;
    int i;

    D.23217 = block->obj_size;
    count = 16368 / D.23217;
    D.23218 = BIT_FIELD_REF <*block, 64, 64>;
    D.23219 = D.23218 & 4294967296;
    if (D.23219 != 0) goto <D.23220>; else goto <D.23221>;
    <D.23220>:
    if (pinned == 0) goto <D.23222>; else goto <D.23223>;
    <D.23222>:
    // predicted unlikely by continue predictor.
    goto <D.19971>;
    <D.23223>:
    <D.23221>:
    D.23218 = BIT_FIELD_REF <*block, 64, 64>;
    D.23219 = D.23218 & 4294967296;
    if (D.23219 == 0) goto <D.23224>; else goto <D.23225>;
    <D.23224>:
    if (non_pinned == 0) goto <D.23226>; else goto <D.23227>;
    <D.23226>:
    // predicted unlikely by continue predictor.
    goto <D.19971>;
    <D.23227>:
    <D.23225>:
    lazy_sweep.183 = lazy_sweep;
    if (lazy_sweep.183 != 0) goto <D.23229>; else goto <D.23230>;
    <D.23229>:
    sweep_block (block, 0);
    <D.23230>:
    i = 0;
    goto <D.19974>;
    <D.19973>:
    {
      void * * obj;

      D.23231 = block->block;
      D.23217 = block->obj_size;
      D.23232 = D.23217 * i;
      D.23233 = (sizetype) D.23232;
      D.23234 = D.23233 + 16;
      obj = D.23231 + D.23234;
      D.23237 = *obj;
      if (D.23237 != 0B) goto <D.23238>; else goto <D.23239>;
      <D.23238>:
      D.23240 = MEM[(char * *)obj];
      D.23231 = block->block;
      if (D.23240 < D.23231) goto <D.23235>; else goto <D.23241>;
      <D.23241>:
      D.23240 = MEM[(char * *)obj];
      D.23231 = block->block;
      D.23242 = D.23231 + 16384;
      if (D.23240 >= D.23242) goto <D.23235>; else goto <D.23236>;
      <D.23235>:
      D.23217 = block->obj_size;
      D.23243 = (long unsigned int) D.23217;
      callback (obj, D.23243, data);
      <D.23236>:
      <D.23239>:
    }
    i = i + 1;
    <D.19974>:
    if (i < count) goto <D.19973>; else goto <D.19975>;
    <D.19975>:
  }
  <D.19971>:
  block = block->next;
  <D.19977>:
  if (block != 0B) goto <D.19976>; else goto <D.19978>;
  <D.19978>:
}


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

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


alloc_obj (struct MonoVTable * vtable, int size, gboolean pinned, gboolean has_references)
{
  int iftmp.184;
  int D.23247;
  int D.23248;
  _Bool D.23252;
  int D.23253;
  int iftmp.185;
  int D.23258;
  long unsigned int D.23259;
  long unsigned int D.23260;
  struct MSBlockInfo * * D.23261;
  struct MSBlockInfo * D.23262;
  int D.23265;
  _Bool D.23266;
  long int D.23267;
  long int D.23268;
  void * D.23271;
  int size_index;
  struct MSBlockInfo * * free_blocks;
  void * obj;

  D.23247 = size + 7;
  D.23248 = D.23247 >> 3;
  if (D.23248 <= 31) goto <D.23249>; else goto <D.23250>;
  <D.23249>:
  D.23247 = size + 7;
  D.23248 = D.23247 >> 3;
  iftmp.184 = fast_block_obj_size_indexes[D.23248];
  goto <D.23251>;
  <D.23250>:
  iftmp.184 = ms_find_block_obj_size_index (size);
  <D.23251>:
  size_index = iftmp.184;
  D.23252 = pinned != 0;
  D.23253 = (int) D.23252;
  if (has_references != 0) goto <D.23255>; else goto <D.23256>;
  <D.23255>:
  iftmp.185 = 2;
  goto <D.23257>;
  <D.23256>:
  iftmp.185 = 0;
  <D.23257>:
  D.23258 = D.23253 | iftmp.185;
  free_blocks = free_block_lists[D.23258];
  D.23259 = (long unsigned int) size_index;
  D.23260 = D.23259 * 8;
  D.23261 = free_blocks + D.23260;
  D.23262 = *D.23261;
  if (D.23262 == 0B) goto <D.23263>; else goto <D.23264>;
  <D.23263>:
  D.23265 = ms_alloc_block (size_index, pinned, has_references);
  D.23266 = D.23265 == 0;
  D.23267 = (long int) D.23266;
  D.23268 = __builtin_expect (D.23267, 0);
  if (D.23268 != 0) goto <D.23269>; else goto <D.23270>;
  <D.23269>:
  D.23271 = 0B;
  return D.23271;
  <D.23270>:
  <D.23264>:
  obj = unlink_slot_from_free_list_uncontested (free_blocks, size_index);
  MEM[(struct MonoVTable * *)obj] = vtable;
  D.23271 = obj;
  return D.23271;
}


ms_alloc_block (int size_index, gboolean pinned, gboolean has_references)
{
  int * block_obj_sizes.186;
  long unsigned int D.23274;
  long unsigned int D.23275;
  int * D.23276;
  _Bool D.23277;
  int D.23278;
  int iftmp.187;
  int D.23283;
  int D.23284;
  gboolean D.23287;
  unsigned char D.23290;
  <unnamed-unsigned:1> D.23291;
  unsigned char D.23292;
  <unnamed-unsigned:1> D.23293;
  int D.23294;
  _Bool D.23295;
  void * D.23296;
  char * D.23297;
  sizetype D.23298;
  int D.23299;
  long unsigned int D.23300;
  struct MSBlockInfo * * D.23301;
  struct MSBlockInfo * D.23302;
  struct MSBlockInfo * all_blocks.188;
  int num_major_sections.189;
  int num_major_sections.190;
  int size;
  int count;
  struct MSBlockInfo * info;
  struct MSBlockHeader * header;
  struct MSBlockInfo * * free_blocks;
  char * obj_start;
  int i;

  block_obj_sizes.186 = block_obj_sizes;
  D.23274 = (long unsigned int) size_index;
  D.23275 = D.23274 * 4;
  D.23276 = block_obj_sizes.186 + D.23275;
  size = *D.23276;
  count = 16368 / size;
  D.23277 = pinned != 0;
  D.23278 = (int) D.23277;
  if (has_references != 0) goto <D.23280>; else goto <D.23281>;
  <D.23280>:
  iftmp.187 = 2;
  goto <D.23282>;
  <D.23281>:
  iftmp.187 = 0;
  <D.23282>:
  D.23283 = D.23278 | iftmp.187;
  free_blocks = free_block_lists[D.23283];
  D.23284 = sgen_memgov_try_alloc_space (16384, 1);
  if (D.23284 == 0) goto <D.23285>; else goto <D.23286>;
  <D.23285>:
  D.23287 = 0;
  return D.23287;
  <D.23286>:
  info = sgen_alloc_internal (16);
  if (0 != 0) goto <D.23288>; else goto <D.23289>;
  <D.23288>:
  monoeg_g_log (0B, 4, "block with %d objects, it must hold at least 2", count);
  <D.19871>:
  goto <D.19871>;
  <D.23289>:
  info->obj_size = size;
  info->obj_size_index = size_index;
  D.23290 = (unsigned char) pinned;
  D.23291 = (<unnamed-unsigned:1>) D.23290;
  info->pinned = D.23291;
  D.23292 = (unsigned char) has_references;
  D.23293 = (<unnamed-unsigned:1>) D.23292;
  info->has_references = D.23293;
  D.23290 = (unsigned char) pinned;
  D.23291 = (<unnamed-unsigned:1>) D.23290;
  info->has_pinned = D.23291;
  D.23294 = sgen_get_current_collection_generation ();
  D.23295 = D.23294 == 1;
  info->is_to_space = D.23295;
  info->swept = 1;
  D.23296 = ms_get_empty_block ();
  info->block = D.23296;
  header = info->block;
  header->info = info;
  info->cardtable_mod_union = 0B;
  update_heap_boundaries_for_block (info);
  D.23297 = info->block;
  obj_start = D.23297 + 16;
  info->free_list = obj_start;
  i = 0;
  goto <D.19874>;
  <D.19873>:
  {
    char * next_obj_start;

    D.23298 = (sizetype) size;
    next_obj_start = obj_start + D.23298;
    MEM[(void * *)obj_start] = next_obj_start;
    obj_start = next_obj_start;
  }
  i = i + 1;
  <D.19874>:
  D.23299 = count + -1;
  if (D.23299 > i) goto <D.19873>; else goto <D.19875>;
  <D.19875>:
  MEM[(void * *)obj_start] = 0B;
  D.23274 = (long unsigned int) size_index;
  D.23300 = D.23274 * 8;
  D.23301 = free_blocks + D.23300;
  D.23302 = *D.23301;
  info->next_free = D.23302;
  D.23274 = (long unsigned int) size_index;
  D.23300 = D.23274 * 8;
  D.23301 = free_blocks + D.23300;
  *D.23301 = info;
  all_blocks.188 = all_blocks;
  info->next = all_blocks.188;
  all_blocks = info;
  num_major_sections.189 = num_major_sections;
  num_major_sections.190 = num_major_sections.189 + 1;
  num_major_sections = num_major_sections.190;
  D.23287 = 1;
  return D.23287;
}


ms_get_empty_block ()
{
  void * empty_blocks.191;
  int D.23310;
  long unsigned int D.23311;
  const char * iftmp.192;
  void * D.23317;
  int D.23318;
  int D.23319;
  long long int D.23320;
  long long int stat_major_blocks_alloced.193;
  long long int stat_major_blocks_alloced.194;
  void * D.23324;
  int D.23325;
  int D.23326;
  long unsigned int block.195;
  long unsigned int D.23328;
  _Bool D.23329;
  long int D.23330;
  long int D.23331;
  void * D.23334;
  char * p;
  int i;
  void * block;
  void * empty;
  void * next;
  void retry = <<< error >>>;

  retry:
  empty_blocks.191 = empty_blocks;
  if (empty_blocks.191 == 0B) goto <D.23308>; else goto <D.23309>;
  <D.23308>:
  {
    int alloc_num;

    alloc_num = 32;
    <D.19836>:
    D.23310 = alloc_num * 16384;
    D.23311 = (long unsigned int) D.23310;
    if (alloc_num == 1) goto <D.23313>; else goto <D.23314>;
    <D.23313>:
    iftmp.192 = "major heap section";
    goto <D.23315>;
    <D.23314>:
    iftmp.192 = 0B;
    <D.23315>:
    p = sgen_alloc_os_memory_aligned (D.23311, 16384, 3, iftmp.192);
    if (p != 0B) goto <D.19835>; else goto <D.23316>;
    <D.23316>:
    alloc_num = alloc_num >> 1;
    goto <D.19836>;
    <D.19835>:
    i = 0;
    goto <D.19840>;
    <D.19839>:
    block = p;
    <D.19837>:
    empty = empty_blocks;
    MEM[(void * *)block] = empty;
    D.23317 = InterlockedCompareExchangePointer (&empty_blocks, block, empty);
    if (D.23317 != empty) goto <D.19837>; else goto <D.19838>;
    <D.19838>:
    p = p + 16384;
    i = i + 1;
    <D.19840>:
    if (i < alloc_num) goto <D.19839>; else goto <D.19841>;
    <D.19841>:
    {
      int __old_x;

      <D.19843>:
      __old_x = num_empty_blocks;
      D.23318 = __old_x + alloc_num;
      D.23319 = InterlockedCompareExchange (&num_empty_blocks, D.23318, __old_x);
      if (D.23319 != __old_x) goto <D.19843>; else goto <D.19844>;
      <D.19844>:
    }
    D.23320 = (long long int) alloc_num;
    stat_major_blocks_alloced.193 = stat_major_blocks_alloced;
    stat_major_blocks_alloced.194 = D.23320 + stat_major_blocks_alloced.193;
    stat_major_blocks_alloced = stat_major_blocks_alloced.194;
  }
  <D.23309>:
  <D.19845>:
  empty = empty_blocks;
  if (empty == 0B) goto retry; else goto <D.23323>;
  <D.23323>:
  block = empty;
  next = MEM[(void * *)block];
  D.23324 = InterlockedCompareExchangePointer (&empty_blocks, next, empty);
  if (D.23324 != empty) goto <D.19845>; else goto <D.19846>;
  <D.19846>:
  {
    int __old_x;

    <D.19848>:
    __old_x = num_empty_blocks;
    D.23325 = __old_x + -1;
    D.23326 = InterlockedCompareExchange (&num_empty_blocks, D.23325, __old_x);
    if (D.23326 != __old_x) goto <D.19848>; else goto <D.19849>;
    <D.19849>:
  }
  MEM[(void * *)block] = 0B;
  block.195 = (long unsigned int) block;
  D.23328 = block.195 & 16383;
  D.23329 = D.23328 != 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>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 421, "!((mword)block & (MS_BLOCK_SIZE - 1))");
  <D.23333>:
  D.23334 = block;
  return D.23334;
}


unlink_slot_from_free_list_uncontested (struct MSBlockInfo * * free_blocks, int size_index)
{
  long unsigned int D.23336;
  long unsigned int D.23337;
  struct MSBlockInfo * * D.23338;
  long unsigned int D.23341;
  long unsigned int D.23342;
  _Bool D.23343;
  long int D.23344;
  long int D.23345;
  long long int stat_major_blocks_lazy_swept.196;
  long long int stat_major_blocks_lazy_swept.197;
  void * D.23352;
  void * * D.23353;
  struct MSBlockInfo * D.23356;
  void * D.23357;
  struct MSBlockInfo * block;
  void * obj;

  D.23336 = (long unsigned int) size_index;
  D.23337 = D.23336 * 8;
  D.23338 = free_blocks + D.23337;
  block = *D.23338;
  if (0 != 0) goto <D.23339>; else goto <D.23340>;
  <D.23339>:
  monoeg_g_log (0B, 4, "no free block to unlink from free_blocks %p size_index %d", free_blocks, size_index);
  <D.19889>:
  goto <D.19889>;
  <D.23340>:
  D.23341 = BIT_FIELD_REF <*block, 64, 64>;
  D.23342 = D.23341 & 68719476736;
  D.23343 = D.23342 == 0;
  D.23344 = (long int) D.23343;
  D.23345 = __builtin_expect (D.23344, 0);
  if (D.23345 != 0) goto <D.23346>; else goto <D.23347>;
  <D.23346>:
  stat_major_blocks_lazy_swept.196 = stat_major_blocks_lazy_swept;
  stat_major_blocks_lazy_swept.197 = stat_major_blocks_lazy_swept.196 + 1;
  stat_major_blocks_lazy_swept = stat_major_blocks_lazy_swept.197;
  sweep_block (block, 0);
  <D.23347>:
  obj = block->free_list;
  if (0 != 0) goto <D.23350>; else goto <D.23351>;
  <D.23350>:
  monoeg_g_log (0B, 4, "block %p in free list had no available object to alloc from", block);
  <D.19890>:
  goto <D.19890>;
  <D.23351>:
  D.23352 = MEM[(void * *)obj];
  block->free_list = D.23352;
  D.23353 = block->free_list;
  if (D.23353 == 0B) goto <D.23354>; else goto <D.23355>;
  <D.23354>:
  D.23336 = (long unsigned int) size_index;
  D.23337 = D.23336 * 8;
  D.23338 = free_blocks + D.23337;
  D.23356 = block->next_free;
  *D.23338 = D.23356;
  block->next_free = 0B;
  <D.23355>:
  D.23357 = obj;
  return D.23357;
}


major_alloc_degraded (struct MonoVTable * vtable, size_t size)
{
  int D.23359;
  void * D.23360;
  long unsigned int D.23361;
  int D.23362;
  _Bool D.23363;
  long int D.23364;
  long int D.23365;
  int num_major_sections.198;
  _Bool D.23369;
  long int D.23370;
  long int D.23371;
  int D.23374;
  void * D.23375;
  void * obj;
  int old_num_sections;

  old_num_sections = num_major_sections;
  D.23359 = (int) size;
  D.23360 = vtable->gc_descr;
  D.23361 = (long unsigned int) D.23360;
  D.23362 = sgen_gc_descr_has_references (D.23361);
  obj = alloc_obj (vtable, D.23359, 0, D.23362);
  D.23363 = obj != 0B;
  D.23364 = (long int) D.23363;
  D.23365 = __builtin_expect (D.23364, 1);
  if (D.23365 != 0) goto <D.23366>; else goto <D.23367>;
  <D.23366>:
  num_major_sections.198 = num_major_sections;
  D.23369 = num_major_sections.198 < old_num_sections;
  D.23370 = (long int) D.23369;
  D.23371 = __builtin_expect (D.23370, 0);
  if (D.23371 != 0) goto <D.23372>; else goto <D.23373>;
  <D.23372>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 842, "num_major_sections >= old_num_sections");
  <D.23373>:
  num_major_sections.198 = num_major_sections;
  D.23374 = num_major_sections.198 - old_num_sections;
  sgen_register_major_sections_alloced (D.23374);
  <D.23367>:
  D.23375 = obj;
  return D.23375;
}


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

  D.23377 = (int) size;
  res = alloc_obj (vtable, D.23377, 1, has_references);
  if (res == 0B) goto <D.23378>; else goto <D.23379>;
  <D.23378>:
  sgen_perform_collection (0, 1, "pinned alloc failure", 1);
  D.23377 = (int) size;
  res = alloc_obj (vtable, D.23377, 1, has_references);
  <D.23379>:
  D.23380 = res;
  return D.23380;
}


major_is_object_live (char * obj)
{
  int D.23382;
  gboolean D.23385;
  unsigned int D.23386;
  unsigned int D.23387;
  long unsigned int D.23388;
  long unsigned int obj.199;
  long unsigned int D.23392;
  struct MSBlockHeader * D.23393;
  long int obj.200;
  long int obj.201;
  long int D.23398;
  long int D.23399;
  long int D.23400;
  long unsigned int D.23404;
  long int D.23405;
  long unsigned int D.23406;
  long unsigned int D.23407;
  _Bool D.23408;
  struct MSBlockInfo * block;
  int word;
  int bit;
  mword objsize;

  D.23382 = sgen_ptr_in_nursery (obj);
  if (D.23382 != 0) goto <D.23383>; else goto <D.23384>;
  <D.23383>:
  D.23385 = 0;
  return D.23385;
  <D.23384>:
  D.23386 = sgen_safe_object_get_size (obj);
  D.23387 = D.23386 + 7;
  D.23388 = (long unsigned int) D.23387;
  objsize = D.23388 & 4294967288;
  if (objsize > 8000) goto <D.23389>; else goto <D.23390>;
  <D.23389>:
  D.23385 = 0;
  return D.23385;
  <D.23390>:
  obj.199 = (long unsigned int) obj;
  D.23392 = obj.199 & 18446744073709535232;
  D.23393 = (struct MSBlockHeader *) D.23392;
  block = D.23393->info;
  if (0 != 0) goto <D.23394>; else goto <D.23395>;
  <D.23394>:
  monoeg_g_log (0B, 4, "block %p is pinned, BTW why is this bad?");
  <D.19947>:
  goto <D.19947>;
  <D.23395>:
  {
    int i;

    obj.200 = (long int) obj;
    obj.201 = (long int) obj;
    D.23398 = obj.201 & -16384;
    D.23399 = obj.200 - D.23398;
    D.23400 = D.23399 >> 3;
    i = (int) D.23400;
    if (0 != 0) goto <D.23401>; else goto <D.23402>;
    <D.23401>:
    word = i >> 5;
    bit = i & 31;
    goto <D.23403>;
    <D.23402>:
    word = i >> 6;
    bit = i & 63;
    <D.23403>:
  }
  D.23404 = block->mark_words[word];
  D.23405 = 1 << bit;
  D.23406 = (long unsigned int) D.23405;
  D.23407 = D.23404 & D.23406;
  D.23408 = D.23407 != 0;
  D.23385 = (gboolean) D.23408;
  return D.23385;
}


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

  if (nursery_align != 0) goto <D.23410>; else goto <D.23411>;
  <D.23410>:
  start = sgen_alloc_os_memory_aligned (nursery_size, nursery_align, 3, "nursery");
  goto <D.23412>;
  <D.23411>:
  start = sgen_alloc_os_memory (nursery_size, 3, "nursery");
  <D.23412>:
  D.23413 = start;
  return D.23413;
}


major_get_and_reset_num_major_objects_marked ()
{
  long long int D.23415;

  D.23415 = 0;
  return D.23415;
}


ms_calculate_block_obj_sizes (double factor, int * arr)
{
  double D.23417;
  double D.23418;
  int D.23419;
  int D.23420;
  long unsigned int D.23425;
  long unsigned int D.23426;
  int * D.23427;
  int D.23428;
  double target_size;
  int num_sizes;
  int last_size;

  target_size = 1.6e+1;
  num_sizes = 0;
  last_size = 0;
  <D.20566>:
  {
    int target_count;
    int size;

    D.23417 = 1.6368e+4 / target_size;
    D.23418 = ceil (D.23417);
    target_count = (int) D.23418;
    D.23419 = 16368 / target_count;
    D.23420 = D.23419 & -8;
    size = MIN_EXPR <D.23420, 8000>;
    if (size != last_size) goto <D.23421>; else goto <D.23422>;
    <D.23421>:
    if (arr != 0B) goto <D.23423>; else goto <D.23424>;
    <D.23423>:
    D.23425 = (long unsigned int) num_sizes;
    D.23426 = D.23425 * 4;
    D.23427 = arr + D.23426;
    *D.23427 = size;
    <D.23424>:
    num_sizes = num_sizes + 1;
    last_size = size;
    <D.23422>:
    target_size = target_size * factor;
  }
  if (last_size <= 7999) goto <D.20566>; else goto <D.20567>;
  <D.20567>:
  D.23428 = num_sizes;
  return D.23428;
}


alloc_free_block_lists (struct MSBlockInfo * * * lists)
{
  long unsigned int D.23430;
  long unsigned int D.23431;
  struct MSBlockInfo * * * D.23432;
  int num_block_obj_sizes.202;
  long unsigned int D.23434;
  long unsigned int D.23435;
  void * D.23436;
  int i;

  i = 0;
  goto <D.20749>;
  <D.20748>:
  D.23430 = (long unsigned int) i;
  D.23431 = D.23430 * 8;
  D.23432 = lists + D.23431;
  num_block_obj_sizes.202 = num_block_obj_sizes;
  D.23434 = (long unsigned int) num_block_obj_sizes.202;
  D.23435 = D.23434 * 8;
  D.23436 = sgen_alloc_internal_dynamic (D.23435, 15, 1);
  *D.23432 = D.23436;
  i = i + 1;
  <D.20749>:
  if (i <= 3) goto <D.20748>; else goto <D.20750>;
  <D.20750>:
}


ms_find_block_obj_size_index (int size)
{
  int * block_obj_sizes.203;
  long unsigned int D.23440;
  long unsigned int D.23441;
  int * D.23442;
  int D.23443;
  int D.23446;
  int num_block_obj_sizes.204;
  int i;

  if (0 != 0) goto <D.23437>; else goto <D.23438>;
  <D.23437>:
  monoeg_g_log (0B, 4, "size %d is bigger than max small object size %d", size, 8000);
  <D.19811>:
  goto <D.19811>;
  <D.23438>:
  i = 0;
  goto <D.19813>;
  <D.19812>:
  block_obj_sizes.203 = block_obj_sizes;
  D.23440 = (long unsigned int) i;
  D.23441 = D.23440 * 4;
  D.23442 = block_obj_sizes.203 + D.23441;
  D.23443 = *D.23442;
  if (D.23443 >= size) goto <D.23444>; else goto <D.23445>;
  <D.23444>:
  D.23446 = i;
  return D.23446;
  <D.23445>:
  i = i + 1;
  <D.19813>:
  num_block_obj_sizes.204 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.204) goto <D.19812>; else goto <D.19814>;
  <D.19814>:
  monoeg_g_log (0B, 4, "no object of size %d\n", size);
  <D.19815>:
  goto <D.19815>;
}


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


