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


sgen_marksweep_init_internal (struct SgenMajorCollector * collector, gboolean is_concurrent)
{
  int num_block_obj_sizes.0;
  int num_block_obj_sizes.1;
  unsigned int num_block_obj_sizes.2;
  unsigned int D.19889;
  void * block_obj_sizes.3;
  int * block_obj_sizes.4;
  void * evacuate_block_obj_sizes.5;
  gboolean * evacuate_block_obj_sizes.6;
  unsigned int i.7;
  unsigned int D.19895;
  gboolean * D.19896;
  int D.19897;
  int D.19898;
  int iftmp.8;
  int D.19900;
  int D.19901;
  int D.19905;
  _Bool D.19906;
  long int D.19907;
  long int D.19908;
  int i;

  sgen_register_fixed_internal_mem_type (16, 296);
  num_block_obj_sizes.0 = ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, 0B);
  num_block_obj_sizes = num_block_obj_sizes.0;
  num_block_obj_sizes.1 = num_block_obj_sizes;
  num_block_obj_sizes.2 = (unsigned int) num_block_obj_sizes.1;
  D.19889 = num_block_obj_sizes.2 * 4;
  block_obj_sizes.3 = sgen_alloc_internal_dynamic (D.19889, 15, 1);
  block_obj_sizes = block_obj_sizes.3;
  block_obj_sizes.4 = block_obj_sizes;
  ms_calculate_block_obj_sizes (1.4142135623730951454746218587388284504413604736328125e+0, block_obj_sizes.4);
  num_block_obj_sizes.1 = num_block_obj_sizes;
  num_block_obj_sizes.2 = (unsigned int) num_block_obj_sizes.1;
  D.19889 = num_block_obj_sizes.2 * 4;
  evacuate_block_obj_sizes.5 = sgen_alloc_internal_dynamic (D.19889, 15, 1);
  evacuate_block_obj_sizes = evacuate_block_obj_sizes.5;
  i = 0;
  goto <D.19871>;
  <D.19870>:
  evacuate_block_obj_sizes.6 = evacuate_block_obj_sizes;
  i.7 = (unsigned int) i;
  D.19895 = i.7 * 4;
  D.19896 = evacuate_block_obj_sizes.6 + D.19895;
  *D.19896 = 0;
  i = i + 1;
  <D.19871>:
  num_block_obj_sizes.1 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.1) goto <D.19870>; else goto <D.19872>;
  <D.19872>:
  alloc_free_block_lists (&free_block_lists);
  i = 0;
  goto <D.19874>;
  <D.19873>:
  D.19897 = i * 8;
  D.19898 = ms_find_block_obj_size_index (D.19897);
  fast_block_obj_size_indexes[i] = D.19898;
  i = i + 1;
  <D.19874>:
  if (i <= 31) goto <D.19873>; else goto <D.19875>;
  <D.19875>:
  i = 0;
  goto <D.19877>;
  <D.19876>:
  D.19900 = i + 7;
  D.19901 = D.19900 >> 3;
  if (D.19901 <= 31) goto <D.19902>; else goto <D.19903>;
  <D.19902>:
  D.19900 = i + 7;
  D.19901 = D.19900 >> 3;
  iftmp.8 = fast_block_obj_size_indexes[D.19901];
  goto <D.19904>;
  <D.19903>:
  iftmp.8 = ms_find_block_obj_size_index (i);
  <D.19904>:
  D.19905 = ms_find_block_obj_size_index (i);
  D.19906 = iftmp.8 != D.19905;
  D.19907 = (long int) D.19906;
  D.19908 = __builtin_expect (D.19907, 0);
  if (D.19908 != 0) goto <D.19909>; else goto <D.19910>;
  <D.19909>:
  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.19910>:
  i = i + 1;
  <D.19877>:
  if (i <= 255) goto <D.19876>; else goto <D.19878>;
  <D.19878>:
  mono_counters_register ("# major blocks allocated", 515, &stat_major_blocks_alloced);
  mono_counters_register ("# major blocks freed", 515, &stat_major_blocks_freed);
  mono_counters_register ("# major blocks lazy swept", 515, &stat_major_blocks_lazy_swept);
  mono_counters_register ("# major objects evacuated", 515, &stat_major_objects_evacuated);
  mono_counters_register ("# major blocks freed ideally", 515, &stat_major_blocks_freed_ideal);
  mono_counters_register ("# major blocks freed less ideally", 515, &stat_major_blocks_freed_less_ideal);
  mono_counters_register ("# major blocks freed individually", 515, &stat_major_blocks_freed_individual);
  mono_counters_register ("# major blocks allocated less ideally", 515, &stat_major_blocks_alloced_less_ideal);
  collector->section_size = 16384;
  collector->is_parallel = 0;
  concurrent_mark = is_concurrent;
  if (is_concurrent != 0) goto <D.19911>; else goto <D.19912>;
  <D.19911>:
  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.19913>;
  <D.19912>:
  collector->is_concurrent = 0;
  collector->want_synchronous_collection = 0B;
  <D.19913>:
  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.19914>; else goto <D.19915>;
  <D.19914>:
  collector->update_cardtable_mod_union = update_cardtable_mod_union;
  collector->get_cardtable_mod_union_for_object = major_get_cardtable_mod_union_for_object;
  <D.19915>:
  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.19916>; else goto <D.19917>;
  <D.19916>:
  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.19917>:
  if (0 != 0) goto <D.19918>; else goto <D.19919>;
  <D.19918>:
  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.19919>:
}


major_scan_vtype_concurrent (char * start, mword desc, struct SgenGrayQueue * queue)
{
  unsigned int D.19920;
  unsigned int D.19921;
  unsigned int D.19924;
  unsigned int D.19925;
  unsigned int D.19926;
  unsigned int D.19927;
  unsigned int D.19928;
  int D.19932;
  struct FILE * gc_debug_file.9;
  void * D.19939;
  int iftmp.10;
  int D.19943;
  int D.19945;
  _Bool D.19947;
  long int D.19948;
  long int D.19949;
  int iftmp.11;
  int D.19955;
  int D.19957;
  _Bool D.19959;
  long int D.19960;
  long int D.19961;
  int D.19967;
  int iftmp.12;
  int D.19976;
  int D.19978;
  _Bool D.19980;
  long int D.19981;
  long int D.19982;
  int iftmp.13;
  int D.19988;
  int D.19990;
  _Bool D.19992;
  long int D.19993;
  long int D.19994;
  unsigned int _index.14;
  unsigned int D.19998;
  int D.19999;
  int D.20003;
  void * D.20009;
  int iftmp.15;
  int D.20013;
  int D.20015;
  _Bool D.20017;
  long int D.20018;
  long int D.20019;
  int iftmp.16;
  int D.20025;
  int D.20027;
  _Bool D.20029;
  long int D.20030;
  long int D.20031;
  unsigned int _index.17;
  unsigned int D.20035;
  int D.20036;
  int D.20040;
  int iftmp.18;
  int D.20049;
  int D.20051;
  _Bool D.20053;
  long int D.20054;
  long int D.20055;
  int iftmp.19;
  int D.20061;
  int D.20063;
  _Bool D.20065;
  long int D.20066;
  long int D.20067;
  unsigned int D.20070;
  unsigned int D.20073;
  int D.20074;
  int desc.20;
  unsigned int D.20078;
  unsigned int el_size.21;
  unsigned int D.20080;
  int D.20084;
  void * D.20090;
  int iftmp.22;
  int D.20094;
  int D.20096;
  _Bool D.20098;
  long int D.20099;
  long int D.20100;
  int iftmp.23;
  int D.20106;
  int D.20108;
  _Bool D.20110;
  long int D.20111;
  long int D.20112;
  int D.20118;
  unsigned int offset.24;
  unsigned int D.20120;
  unsigned int i.25;
  unsigned int D.20122;
  void * * D.20123;
  int D.20127;
  void * D.20133;
  int iftmp.26;
  int D.20137;
  void * D.20139;
  int D.20140;
  _Bool D.20142;
  long int D.20143;
  long int D.20144;
  void * D.20147;
  int iftmp.27;
  int D.20151;
  int D.20153;
  _Bool D.20155;
  long int D.20156;
  long int D.20157;
  sizetype el_size.28;
  unsigned int D.20164;
  int D.20170;
  void * D.20176;
  int iftmp.29;
  int D.20180;
  int D.20182;
  _Bool D.20184;
  long int D.20185;
  long int D.20186;
  int iftmp.30;
  int D.20192;
  int D.20194;
  _Bool D.20196;
  long int D.20197;
  long int D.20198;
  unsigned int D.20201;
  int D.20207;
  void * D.20213;
  int iftmp.31;
  int D.20217;
  int D.20219;
  _Bool D.20221;
  long int D.20222;
  long int D.20223;
  int iftmp.32;
  int D.20229;
  int D.20231;
  _Bool D.20233;
  long int D.20234;
  long int D.20235;
  unsigned int D.20238;
  unsigned int D.20239;
  struct MonoVTable * D.20242;
  struct MonoClass * D.20243;
  const char * D.20244;
  const char * D.20245;
  gsize * bitmap_data.33;
  unsigned int D.20247;
  int D.20253;
  void * D.20259;
  int iftmp.34;
  int D.20263;
  int D.20265;
  _Bool D.20267;
  long int D.20268;
  long int D.20269;
  int iftmp.35;
  int D.20275;
  int D.20277;
  _Bool D.20279;
  long int D.20280;
  long int D.20281;
  int bwords.36;

  start = start + 4294967288;
  D.19920 = desc & 7;
  switch (D.19920) <default: <D.19512>, case 1: <D.19429>, case 2: <D.19440>, case 3: <D.19496>, case 4: <D.19452>, case 5: <D.19488>, case 7: <D.19511>>
  <D.19429>:
  D.19921 = desc & 4294901760;
  if (D.19921 != 0) goto <D.19922>; else goto <D.19923>;
  <D.19922>:
  {
    void * * _objptr_end;
    void * * _objptr;

    _objptr = start;
    D.19924 = desc >> 16;
    D.19925 = D.19924 & 255;
    D.19926 = D.19925 * 4;
    _objptr = _objptr + D.19926;
    D.19927 = desc >> 24;
    D.19928 = D.19927 * 4;
    _objptr_end = _objptr + D.19928;
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19931>; else goto <D.19929>;
      <D.19931>:
      D.19932 = sgen_ptr_in_nursery (__old);
      if (D.19932 == 0) goto <D.19933>; else goto <D.19929>;
      <D.19933>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19934>; else goto <D.19935>;
      <D.19934>:
      if (__old != __copy) goto <D.19936>; else goto <D.19937>;
      <D.19936>:
      gc_debug_file.9 = gc_debug_file;
      D.19939 = *_objptr;
      fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19939, __old);
      gc_debug_file.9 = gc_debug_file;
      fflush (gc_debug_file.9);
      <D.19937>:
      <D.19935>:
      D.19943 = sgen_ptr_in_nursery (__copy);
      if (D.19943 != 0) goto <D.19944>; else goto <D.19941>;
      <D.19944>:
      D.19945 = sgen_ptr_in_nursery (_objptr);
      if (D.19945 == 0) goto <D.19946>; else goto <D.19941>;
      <D.19946>:
      iftmp.10 = 1;
      goto <D.19942>;
      <D.19941>:
      iftmp.10 = 0;
      <D.19942>:
      D.19947 = iftmp.10 != 0;
      D.19948 = (long int) D.19947;
      D.19949 = __builtin_expect (D.19948, 0);
      if (D.19949 != 0) goto <D.19950>; else goto <D.19951>;
      <D.19950>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19951>:
      goto <D.19930>;
      <D.19929>:
      D.19955 = sgen_ptr_in_nursery (__old);
      if (D.19955 != 0) goto <D.19956>; else goto <D.19953>;
      <D.19956>:
      D.19957 = sgen_ptr_in_nursery (_objptr);
      if (D.19957 == 0) goto <D.19958>; else goto <D.19953>;
      <D.19958>:
      iftmp.11 = 1;
      goto <D.19954>;
      <D.19953>:
      iftmp.11 = 0;
      <D.19954>:
      D.19959 = iftmp.11 != 0;
      D.19960 = (long int) D.19959;
      D.19961 = __builtin_expect (D.19960, 0);
      if (D.19961 != 0) goto <D.19962>; else goto <D.19963>;
      <D.19962>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.19963>:
      <D.19930>:
    }
    _objptr = _objptr + 4;
    goto <D.19437>;
    <D.19436>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.19966>; else goto <D.19964>;
      <D.19966>:
      D.19967 = sgen_ptr_in_nursery (__old);
      if (D.19967 == 0) goto <D.19968>; else goto <D.19964>;
      <D.19968>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.19969>; else goto <D.19970>;
      <D.19969>:
      if (__old != __copy) goto <D.19971>; else goto <D.19972>;
      <D.19971>:
      gc_debug_file.9 = gc_debug_file;
      D.19939 = *_objptr;
      fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.19939, __old);
      gc_debug_file.9 = gc_debug_file;
      fflush (gc_debug_file.9);
      <D.19972>:
      <D.19970>:
      D.19976 = sgen_ptr_in_nursery (__copy);
      if (D.19976 != 0) goto <D.19977>; else goto <D.19974>;
      <D.19977>:
      D.19978 = sgen_ptr_in_nursery (_objptr);
      if (D.19978 == 0) goto <D.19979>; else goto <D.19974>;
      <D.19979>:
      iftmp.12 = 1;
      goto <D.19975>;
      <D.19974>:
      iftmp.12 = 0;
      <D.19975>:
      D.19980 = iftmp.12 != 0;
      D.19981 = (long int) D.19980;
      D.19982 = __builtin_expect (D.19981, 0);
      if (D.19982 != 0) goto <D.19983>; else goto <D.19984>;
      <D.19983>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.19984>:
      goto <D.19965>;
      <D.19964>:
      D.19988 = sgen_ptr_in_nursery (__old);
      if (D.19988 != 0) goto <D.19989>; else goto <D.19986>;
      <D.19989>:
      D.19990 = sgen_ptr_in_nursery (_objptr);
      if (D.19990 == 0) goto <D.19991>; else goto <D.19986>;
      <D.19991>:
      iftmp.13 = 1;
      goto <D.19987>;
      <D.19986>:
      iftmp.13 = 0;
      <D.19987>:
      D.19992 = iftmp.13 != 0;
      D.19993 = (long int) D.19992;
      D.19994 = __builtin_expect (D.19993, 0);
      if (D.19994 != 0) goto <D.19995>; else goto <D.19996>;
      <D.19995>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.19996>:
      <D.19965>:
    }
    _objptr = _objptr + 4;
    <D.19437>:
    if (_objptr < _objptr_end) goto <D.19436>; else goto <D.19438>;
    <D.19438>:
  }
  <D.19923>:
  goto <D.19439>;
  <D.19440>:
  {
    void * * _objptr;
    gsize _bmap;

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

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

        __old = *_objptr;
        if (__old != 0B) goto <D.20002>; else goto <D.20000>;
        <D.20002>:
        D.20003 = sgen_ptr_in_nursery (__old);
        if (D.20003 == 0) goto <D.20004>; else goto <D.20000>;
        <D.20004>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20005>; else goto <D.20006>;
        <D.20005>:
        if (__old != __copy) goto <D.20007>; else goto <D.20008>;
        <D.20007>:
        gc_debug_file.9 = gc_debug_file;
        D.20009 = *_objptr;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20009, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.20008>:
        <D.20006>:
        D.20013 = sgen_ptr_in_nursery (__copy);
        if (D.20013 != 0) goto <D.20014>; else goto <D.20011>;
        <D.20014>:
        D.20015 = sgen_ptr_in_nursery (_objptr);
        if (D.20015 == 0) goto <D.20016>; else goto <D.20011>;
        <D.20016>:
        iftmp.15 = 1;
        goto <D.20012>;
        <D.20011>:
        iftmp.15 = 0;
        <D.20012>:
        D.20017 = iftmp.15 != 0;
        D.20018 = (long int) D.20017;
        D.20019 = __builtin_expect (D.20018, 0);
        if (D.20019 != 0) goto <D.20020>; else goto <D.20021>;
        <D.20020>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20021>:
        goto <D.20001>;
        <D.20000>:
        D.20025 = sgen_ptr_in_nursery (__old);
        if (D.20025 != 0) goto <D.20026>; else goto <D.20023>;
        <D.20026>:
        D.20027 = sgen_ptr_in_nursery (_objptr);
        if (D.20027 == 0) goto <D.20028>; else goto <D.20023>;
        <D.20028>:
        iftmp.16 = 1;
        goto <D.20024>;
        <D.20023>:
        iftmp.16 = 0;
        <D.20024>:
        D.20029 = iftmp.16 != 0;
        D.20030 = (long int) D.20029;
        D.20031 = __builtin_expect (D.20030, 0);
        if (D.20031 != 0) goto <D.20032>; else goto <D.20033>;
        <D.20032>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20033>:
        <D.20001>:
      }
      _objptr = _objptr + 4;
    }
    goto <D.19450>;
    <D.19449>:
    {
      int _index;

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

        __old = *_objptr;
        if (__old != 0B) goto <D.20039>; else goto <D.20037>;
        <D.20039>:
        D.20040 = sgen_ptr_in_nursery (__old);
        if (D.20040 == 0) goto <D.20041>; else goto <D.20037>;
        <D.20041>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20042>; else goto <D.20043>;
        <D.20042>:
        if (__old != __copy) goto <D.20044>; else goto <D.20045>;
        <D.20044>:
        gc_debug_file.9 = gc_debug_file;
        D.20009 = *_objptr;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20009, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.20045>:
        <D.20043>:
        D.20049 = sgen_ptr_in_nursery (__copy);
        if (D.20049 != 0) goto <D.20050>; else goto <D.20047>;
        <D.20050>:
        D.20051 = sgen_ptr_in_nursery (_objptr);
        if (D.20051 == 0) goto <D.20052>; else goto <D.20047>;
        <D.20052>:
        iftmp.18 = 1;
        goto <D.20048>;
        <D.20047>:
        iftmp.18 = 0;
        <D.20048>:
        D.20053 = iftmp.18 != 0;
        D.20054 = (long int) D.20053;
        D.20055 = __builtin_expect (D.20054, 0);
        if (D.20055 != 0) goto <D.20056>; else goto <D.20057>;
        <D.20056>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20057>:
        goto <D.20038>;
        <D.20037>:
        D.20061 = sgen_ptr_in_nursery (__old);
        if (D.20061 != 0) goto <D.20062>; else goto <D.20059>;
        <D.20062>:
        D.20063 = sgen_ptr_in_nursery (_objptr);
        if (D.20063 == 0) goto <D.20064>; else goto <D.20059>;
        <D.20064>:
        iftmp.19 = 1;
        goto <D.20060>;
        <D.20059>:
        iftmp.19 = 0;
        <D.20060>:
        D.20065 = iftmp.19 != 0;
        D.20066 = (long int) D.20065;
        D.20067 = __builtin_expect (D.20066, 0);
        if (D.20067 != 0) goto <D.20068>; else goto <D.20069>;
        <D.20068>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20069>:
        <D.20038>:
      }
      _objptr = _objptr + 4;
    }
    <D.19450>:
    if (_bmap != 0) goto <D.19449>; else goto <D.19451>;
    <D.19451>:
  }
  goto <D.19439>;
  <D.19452>:
  D.20070 = desc & 4294950912;
  if (D.20070 != 0) goto <D.20071>; else goto <D.20072>;
  <D.20071>:
  {
    int el_size;
    int etype;

    D.20073 = desc >> 3;
    D.20074 = (int) D.20073;
    el_size = D.20074 & 1023;
    desc.20 = (int) desc;
    etype = desc.20 & 49152;
    if (etype == 16384) goto <D.20076>; else goto <D.20077>;
    <D.20076>:
    {
      void * * p;
      void * * end_refs;

      p = start + 16;
      D.20078 = MEM[(struct MonoArray *)start].max_length;
      el_size.21 = (unsigned int) el_size;
      D.20080 = D.20078 * el_size.21;
      end_refs = p + D.20080;
      goto <D.19460>;
      <D.19459>:
      {
        void * __old;
        void * __copy;

        __old = *p;
        if (__old != 0B) goto <D.20083>; else goto <D.20081>;
        <D.20083>:
        D.20084 = sgen_ptr_in_nursery (__old);
        if (D.20084 == 0) goto <D.20085>; else goto <D.20081>;
        <D.20085>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (p, __old, queue);
        __copy = *p;
        if (0 != 0) goto <D.20086>; else goto <D.20087>;
        <D.20086>:
        if (__old != __copy) goto <D.20088>; else goto <D.20089>;
        <D.20088>:
        gc_debug_file.9 = gc_debug_file;
        D.20090 = *p;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", p, D.20090, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.20089>:
        <D.20087>:
        D.20094 = sgen_ptr_in_nursery (__copy);
        if (D.20094 != 0) goto <D.20095>; else goto <D.20092>;
        <D.20095>:
        D.20096 = sgen_ptr_in_nursery (p);
        if (D.20096 == 0) goto <D.20097>; else goto <D.20092>;
        <D.20097>:
        iftmp.22 = 1;
        goto <D.20093>;
        <D.20092>:
        iftmp.22 = 0;
        <D.20093>:
        D.20098 = iftmp.22 != 0;
        D.20099 = (long int) D.20098;
        D.20100 = __builtin_expect (D.20099, 0);
        if (D.20100 != 0) goto <D.20101>; else goto <D.20102>;
        <D.20101>:
        sgen_add_to_global_remset (p, __copy);
        <D.20102>:
        goto <D.20082>;
        <D.20081>:
        D.20106 = sgen_ptr_in_nursery (__old);
        if (D.20106 != 0) goto <D.20107>; else goto <D.20104>;
        <D.20107>:
        D.20108 = sgen_ptr_in_nursery (p);
        if (D.20108 == 0) goto <D.20109>; else goto <D.20104>;
        <D.20109>:
        iftmp.23 = 1;
        goto <D.20105>;
        <D.20104>:
        iftmp.23 = 0;
        <D.20105>:
        D.20110 = iftmp.23 != 0;
        D.20111 = (long int) D.20110;
        D.20112 = __builtin_expect (D.20111, 0);
        if (D.20112 != 0) goto <D.20113>; else goto <D.20114>;
        <D.20113>:
        sgen_add_to_global_remset (p, __old);
        <D.20114>:
        <D.20082>:
      }
      p = p + 4;
      <D.19460>:
      if (p < end_refs) goto <D.19459>; else goto <D.19461>;
      <D.19461>:
    }
    goto <D.20115>;
    <D.20077>:
    if (etype == 32768) goto <D.20116>; else goto <D.20117>;
    <D.20116>:
    {
      int offset;
      int num_refs;
      char * e_start;
      char * e_end;

      D.19924 = desc >> 16;
      D.20118 = (int) D.19924;
      offset = D.20118 & 255;
      D.19927 = desc >> 24;
      num_refs = (int) D.19927;
      e_start = start + 16;
      D.20078 = MEM[(struct MonoArray *)start].max_length;
      el_size.21 = (unsigned int) el_size;
      D.20080 = D.20078 * el_size.21;
      e_end = e_start + D.20080;
      goto <D.19474>;
      <D.19473>:
      {
        void * * p;
        int i;

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

          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20123 = p + D.20122;
          __old = *D.20123;
          if (__old != 0B) goto <D.20126>; else goto <D.20124>;
          <D.20126>:
          D.20127 = sgen_ptr_in_nursery (__old);
          if (D.20127 == 0) goto <D.20128>; else goto <D.20124>;
          <D.20128>:
          __builtin_prefetch (__old);
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20123 = p + D.20122;
          major_copy_or_mark_object_concurrent (D.20123, __old, queue);
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20123 = p + D.20122;
          __copy = *D.20123;
          if (0 != 0) goto <D.20129>; else goto <D.20130>;
          <D.20129>:
          if (__old != __copy) goto <D.20131>; else goto <D.20132>;
          <D.20131>:
          gc_debug_file.9 = gc_debug_file;
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20123 = p + D.20122;
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20123 = p + D.20122;
          D.20133 = *D.20123;
          fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", D.20123, D.20133, __old);
          gc_debug_file.9 = gc_debug_file;
          fflush (gc_debug_file.9);
          <D.20132>:
          <D.20130>:
          D.20137 = sgen_ptr_in_nursery (__copy);
          if (D.20137 != 0) goto <D.20138>; else goto <D.20135>;
          <D.20138>:
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20139 = p + D.20122;
          D.20140 = sgen_ptr_in_nursery (D.20139);
          if (D.20140 == 0) goto <D.20141>; else goto <D.20135>;
          <D.20141>:
          iftmp.26 = 1;
          goto <D.20136>;
          <D.20135>:
          iftmp.26 = 0;
          <D.20136>:
          D.20142 = iftmp.26 != 0;
          D.20143 = (long int) D.20142;
          D.20144 = __builtin_expect (D.20143, 0);
          if (D.20144 != 0) goto <D.20145>; else goto <D.20146>;
          <D.20145>:
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20147 = p + D.20122;
          sgen_add_to_global_remset (D.20147, __copy);
          <D.20146>:
          goto <D.20125>;
          <D.20124>:
          D.20151 = sgen_ptr_in_nursery (__old);
          if (D.20151 != 0) goto <D.20152>; else goto <D.20149>;
          <D.20152>:
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20139 = p + D.20122;
          D.20153 = sgen_ptr_in_nursery (D.20139);
          if (D.20153 == 0) goto <D.20154>; else goto <D.20149>;
          <D.20154>:
          iftmp.27 = 1;
          goto <D.20150>;
          <D.20149>:
          iftmp.27 = 0;
          <D.20150>:
          D.20155 = iftmp.27 != 0;
          D.20156 = (long int) D.20155;
          D.20157 = __builtin_expect (D.20156, 0);
          if (D.20157 != 0) goto <D.20158>; else goto <D.20159>;
          <D.20158>:
          i.25 = (unsigned int) i;
          D.20122 = i.25 * 4;
          D.20147 = p + D.20122;
          sgen_add_to_global_remset (D.20147, __old);
          <D.20159>:
          <D.20125>:
        }
        i = i + 1;
        <D.19471>:
        if (i < num_refs) goto <D.19470>; else goto <D.19472>;
        <D.19472>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.19474>:
      if (e_start < e_end) goto <D.19473>; else goto <D.19475>;
      <D.19475>:
    }
    goto <D.20161>;
    <D.20117>:
    if (etype == 49152) goto <D.20162>; else goto <D.20163>;
    <D.20162>:
    {
      char * e_start;
      char * e_end;

      e_start = start + 16;
      D.20078 = MEM[(struct MonoArray *)start].max_length;
      el_size.21 = (unsigned int) el_size;
      D.20080 = D.20078 * el_size.21;
      e_end = e_start + D.20080;
      goto <D.19486>;
      <D.19485>:
      {
        void * * p;
        gsize _bmap;

        p = e_start;
        _bmap = desc >> 16;
        goto <D.19483>;
        <D.19482>:
        D.20164 = _bmap & 1;
        if (D.20164 != 0) goto <D.20165>; else goto <D.20166>;
        <D.20165>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.20169>; else goto <D.20167>;
          <D.20169>:
          D.20170 = sgen_ptr_in_nursery (__old);
          if (D.20170 == 0) goto <D.20171>; else goto <D.20167>;
          <D.20171>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.20172>; else goto <D.20173>;
          <D.20172>:
          if (__old != __copy) goto <D.20174>; else goto <D.20175>;
          <D.20174>:
          gc_debug_file.9 = gc_debug_file;
          D.20176 = *p;
          fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", p, D.20176, __old);
          gc_debug_file.9 = gc_debug_file;
          fflush (gc_debug_file.9);
          <D.20175>:
          <D.20173>:
          D.20180 = sgen_ptr_in_nursery (__copy);
          if (D.20180 != 0) goto <D.20181>; else goto <D.20178>;
          <D.20181>:
          D.20182 = sgen_ptr_in_nursery (p);
          if (D.20182 == 0) goto <D.20183>; else goto <D.20178>;
          <D.20183>:
          iftmp.29 = 1;
          goto <D.20179>;
          <D.20178>:
          iftmp.29 = 0;
          <D.20179>:
          D.20184 = iftmp.29 != 0;
          D.20185 = (long int) D.20184;
          D.20186 = __builtin_expect (D.20185, 0);
          if (D.20186 != 0) goto <D.20187>; else goto <D.20188>;
          <D.20187>:
          sgen_add_to_global_remset (p, __copy);
          <D.20188>:
          goto <D.20168>;
          <D.20167>:
          D.20192 = sgen_ptr_in_nursery (__old);
          if (D.20192 != 0) goto <D.20193>; else goto <D.20190>;
          <D.20193>:
          D.20194 = sgen_ptr_in_nursery (p);
          if (D.20194 == 0) goto <D.20195>; else goto <D.20190>;
          <D.20195>:
          iftmp.30 = 1;
          goto <D.20191>;
          <D.20190>:
          iftmp.30 = 0;
          <D.20191>:
          D.20196 = iftmp.30 != 0;
          D.20197 = (long int) D.20196;
          D.20198 = __builtin_expect (D.20197, 0);
          if (D.20198 != 0) goto <D.20199>; else goto <D.20200>;
          <D.20199>:
          sgen_add_to_global_remset (p, __old);
          <D.20200>:
          <D.20168>:
        }
        <D.20166>:
        _bmap = _bmap >> 1;
        p = p + 4;
        <D.19483>:
        if (_bmap != 0) goto <D.19482>; else goto <D.19484>;
        <D.19484>:
        el_size.28 = (sizetype) el_size;
        e_start = e_start + el_size.28;
      }
      <D.19486>:
      if (e_start < e_end) goto <D.19485>; else goto <D.19487>;
      <D.19487>:
    }
    <D.20163>:
    <D.20161>:
    <D.20115>:
  }
  <D.20072>:
  goto <D.19439>;
  <D.19488>:
  {
    void * * _objptr;
    gsize _bmap;

    _objptr = start;
    _bmap = desc >> 3;
    _objptr = _objptr + 8;
    goto <D.19494>;
    <D.19493>:
    D.20201 = _bmap & 1;
    if (D.20201 != 0) goto <D.20202>; else goto <D.20203>;
    <D.20202>:
    {
      void * __old;
      void * __copy;

      __old = *_objptr;
      if (__old != 0B) goto <D.20206>; else goto <D.20204>;
      <D.20206>:
      D.20207 = sgen_ptr_in_nursery (__old);
      if (D.20207 == 0) goto <D.20208>; else goto <D.20204>;
      <D.20208>:
      __builtin_prefetch (__old);
      major_copy_or_mark_object_concurrent (_objptr, __old, queue);
      __copy = *_objptr;
      if (0 != 0) goto <D.20209>; else goto <D.20210>;
      <D.20209>:
      if (__old != __copy) goto <D.20211>; else goto <D.20212>;
      <D.20211>:
      gc_debug_file.9 = gc_debug_file;
      D.20213 = *_objptr;
      fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20213, __old);
      gc_debug_file.9 = gc_debug_file;
      fflush (gc_debug_file.9);
      <D.20212>:
      <D.20210>:
      D.20217 = sgen_ptr_in_nursery (__copy);
      if (D.20217 != 0) goto <D.20218>; else goto <D.20215>;
      <D.20218>:
      D.20219 = sgen_ptr_in_nursery (_objptr);
      if (D.20219 == 0) goto <D.20220>; else goto <D.20215>;
      <D.20220>:
      iftmp.31 = 1;
      goto <D.20216>;
      <D.20215>:
      iftmp.31 = 0;
      <D.20216>:
      D.20221 = iftmp.31 != 0;
      D.20222 = (long int) D.20221;
      D.20223 = __builtin_expect (D.20222, 0);
      if (D.20223 != 0) goto <D.20224>; else goto <D.20225>;
      <D.20224>:
      sgen_add_to_global_remset (_objptr, __copy);
      <D.20225>:
      goto <D.20205>;
      <D.20204>:
      D.20229 = sgen_ptr_in_nursery (__old);
      if (D.20229 != 0) goto <D.20230>; else goto <D.20227>;
      <D.20230>:
      D.20231 = sgen_ptr_in_nursery (_objptr);
      if (D.20231 == 0) goto <D.20232>; else goto <D.20227>;
      <D.20232>:
      iftmp.32 = 1;
      goto <D.20228>;
      <D.20227>:
      iftmp.32 = 0;
      <D.20228>:
      D.20233 = iftmp.32 != 0;
      D.20234 = (long int) D.20233;
      D.20235 = __builtin_expect (D.20234, 0);
      if (D.20235 != 0) goto <D.20236>; else goto <D.20237>;
      <D.20236>:
      sgen_add_to_global_remset (_objptr, __old);
      <D.20237>:
      <D.20205>:
    }
    <D.20203>:
    _bmap = _bmap >> 1;
    _objptr = _objptr + 4;
    <D.19494>:
    if (_bmap != 0) goto <D.19493>; else goto <D.19495>;
    <D.19495>:
  }
  goto <D.19439>;
  <D.19496>:
  {
    void * * _objptr;
    gsize * bitmap_data;
    int bwords;
    void * * start_run;

    _objptr = start;
    bitmap_data = sgen_get_complex_descriptor (desc);
    D.20238 = *bitmap_data;
    D.20239 = D.20238 + 4294967295;
    bwords = (int) D.20239;
    start_run = _objptr;
    bitmap_data = bitmap_data + 4;
    if (0 != 0) goto <D.20240>; else goto <D.20241>;
    <D.20240>:
    {
      struct MonoObject * myobj;

      myobj = start;
      D.20242 = myobj->vtable;
      D.20243 = D.20242->klass;
      D.20244 = D.20243->name_space;
      D.20242 = myobj->vtable;
      D.20243 = D.20242->klass;
      D.20245 = D.20243->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.20244, D.20245);
    }
    <D.20241>:
    goto <D.19509>;
    <D.19508>:
    {
      gsize _bmap;

      bitmap_data.33 = bitmap_data;
      bitmap_data = bitmap_data.33 + 4;
      _bmap = *bitmap_data.33;
      _objptr = start_run;
      goto <D.19506>;
      <D.19505>:
      D.20247 = _bmap & 1;
      if (D.20247 != 0) goto <D.20248>; else goto <D.20249>;
      <D.20248>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20252>; else goto <D.20250>;
        <D.20252>:
        D.20253 = sgen_ptr_in_nursery (__old);
        if (D.20253 == 0) goto <D.20254>; else goto <D.20250>;
        <D.20254>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20255>; else goto <D.20256>;
        <D.20255>:
        if (__old != __copy) goto <D.20257>; else goto <D.20258>;
        <D.20257>:
        gc_debug_file.9 = gc_debug_file;
        D.20259 = *_objptr;
        fprintf (gc_debug_file.9, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20259, __old);
        gc_debug_file.9 = gc_debug_file;
        fflush (gc_debug_file.9);
        <D.20258>:
        <D.20256>:
        D.20263 = sgen_ptr_in_nursery (__copy);
        if (D.20263 != 0) goto <D.20264>; else goto <D.20261>;
        <D.20264>:
        D.20265 = sgen_ptr_in_nursery (_objptr);
        if (D.20265 == 0) goto <D.20266>; else goto <D.20261>;
        <D.20266>:
        iftmp.34 = 1;
        goto <D.20262>;
        <D.20261>:
        iftmp.34 = 0;
        <D.20262>:
        D.20267 = iftmp.34 != 0;
        D.20268 = (long int) D.20267;
        D.20269 = __builtin_expect (D.20268, 0);
        if (D.20269 != 0) goto <D.20270>; else goto <D.20271>;
        <D.20270>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20271>:
        goto <D.20251>;
        <D.20250>:
        D.20275 = sgen_ptr_in_nursery (__old);
        if (D.20275 != 0) goto <D.20276>; else goto <D.20273>;
        <D.20276>:
        D.20277 = sgen_ptr_in_nursery (_objptr);
        if (D.20277 == 0) goto <D.20278>; else goto <D.20273>;
        <D.20278>:
        iftmp.35 = 1;
        goto <D.20274>;
        <D.20273>:
        iftmp.35 = 0;
        <D.20274>:
        D.20279 = iftmp.35 != 0;
        D.20280 = (long int) D.20279;
        D.20281 = __builtin_expect (D.20280, 0);
        if (D.20281 != 0) goto <D.20282>; else goto <D.20283>;
        <D.20282>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20283>:
        <D.20251>:
      }
      <D.20249>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19506>:
      if (_bmap != 0) goto <D.19505>; else goto <D.19507>;
      <D.19507>:
      start_run = start_run + 128;
    }
    <D.19509>:
    bwords.36 = bwords;
    bwords = bwords.36 + -1;
    if (bwords.36 > 0) goto <D.19508>; else goto <D.19510>;
    <D.19510>:
  }
  goto <D.19439>;
  <D.19511>:
  goto <D.19439>;
  <D.19512>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
  <D.19439>:
}


major_copy_or_mark_object_concurrent (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int iftmp.37;
  unsigned int D.20289;
  unsigned int D.20290;
  unsigned int D.20292;
  _Bool D.20294;
  long int D.20295;
  long int D.20296;
  int D.20299;
  unsigned int D.20302;
  unsigned int D.20303;
  unsigned int obj.38;
  unsigned int D.20307;
  struct MSBlockHeader * D.20308;
  int obj.39;
  int obj.40;
  int D.20311;
  int D.20312;
  unsigned int D.20318;
  long int D.20319;
  long unsigned int D.20320;
  long unsigned int D.20321;
  long unsigned int D.20324;
  unsigned int D.20325;
  unsigned int D.20326;
  int iftmp.41;
  struct GrayQueueSection * D.20333;
  int D.20335;
  _Bool D.20336;
  long int D.20337;
  long int D.20338;
  int D.20342;
  int D.20343;
  int D.20345;
  struct MonoVTable * D.20348;
  void * D.20349;
  unsigned int D.20350;
  int D.20351;
  int iftmp.42;
  _Bool D.20359;
  long int D.20360;
  long int D.20361;
  int D.20365;
  int D.20366;

  D.20289 = MEM[(mword *)obj];
  D.20290 = D.20289 & 1;
  if (D.20290 != 0) goto <D.20291>; else goto <D.20287>;
  <D.20291>:
  D.20289 = MEM[(mword *)obj];
  D.20292 = D.20289 & 4294967292;
  if (D.20292 != 0) goto <D.20293>; else goto <D.20287>;
  <D.20293>:
  iftmp.37 = 1;
  goto <D.20288>;
  <D.20287>:
  iftmp.37 = 0;
  <D.20288>:
  D.20294 = iftmp.37 != 0;
  D.20295 = (long int) D.20294;
  D.20296 = __builtin_expect (D.20295, 0);
  if (D.20296 != 0) goto <D.20297>; else goto <D.20298>;
  <D.20297>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1280, "!SGEN_OBJECT_IS_FORWARDED (obj)");
  <D.20298>:
  D.20299 = sgen_ptr_in_nursery (obj);
  if (D.20299 == 0) goto <D.20300>; else goto <D.20301>;
  <D.20300>:
  {
    mword objsize;

    D.20302 = sgen_safe_object_get_size (obj);
    D.20303 = D.20302 + 7;
    objsize = D.20303 & 4294967288;
    if (objsize <= 8000) goto <D.20304>; else goto <D.20305>;
    <D.20304>:
    {
      struct MSBlockInfo * block;

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

        {
          int i;

          obj.39 = (int) obj;
          obj.40 = (int) obj;
          D.20311 = obj.40 & -16384;
          D.20312 = obj.39 - D.20311;
          i = D.20312 >> 3;
          if (1 != 0) goto <D.20313>; else goto <D.20314>;
          <D.20313>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.20315>;
          <D.20314>:
          __word = i >> 6;
          __bit = i & 63;
          <D.20315>:
        }
        if (0 != 0) goto <D.20316>; else goto <D.20317>;
        <D.20316>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.19158>:
        goto <D.19158>;
        <D.20317>:
        D.20318 = block->mark_words[__word];
        D.20319 = 1 << __bit;
        D.20320 = (long unsigned int) D.20319;
        D.20321 = D.20318 & D.20320;
        if (D.20321 == 0) goto <D.20322>; else goto <D.20323>;
        <D.20322>:
        D.20318 = block->mark_words[__word];
        D.20319 = 1 << __bit;
        D.20320 = (long unsigned int) D.20319;
        D.20324 = D.20318 | D.20320;
        block->mark_words[__word] = D.20324;
        D.20325 = BIT_FIELD_REF <*block, 32, 96>;
        D.20326 = D.20325 & 2;
        if (D.20326 != 0) goto <D.20327>; else goto <D.20328>;
        <D.20327>:
        D.20333 = queue->first;
        if (D.20333 == 0B) goto <D.20330>; else goto <D.20334>;
        <D.20334>:
        D.20333 = queue->first;
        D.20335 = D.20333->end;
        if (D.20335 == 125) goto <D.20330>; else goto <D.20331>;
        <D.20330>:
        iftmp.41 = 1;
        goto <D.20332>;
        <D.20331>:
        iftmp.41 = 0;
        <D.20332>:
        D.20336 = iftmp.41 != 0;
        D.20337 = (long int) D.20336;
        D.20338 = __builtin_expect (D.20337, 0);
        if (D.20338 != 0) goto <D.20339>; else goto <D.20340>;
        <D.20339>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.20341>;
        <D.20340>:
        D.20333 = queue->first;
        D.20333 = queue->first;
        D.20335 = D.20333->end;
        D.20342 = D.20335;
        D.20343 = D.20342 + 1;
        D.20333->end = D.20343;
        D.20333->objects[D.20342] = obj;
        <D.20341>:
        __builtin_prefetch (obj);
        <D.20328>:
        <D.20323>:
      }
    }
    goto <D.20344>;
    <D.20305>:
    D.20345 = sgen_los_object_is_pinned (obj);
    if (D.20345 != 0) goto <D.20346>; else goto <D.20347>;
    <D.20346>:
    return;
    <D.20347>:
    sgen_los_pin_object (obj);
    D.20289 = MEM[(mword *)obj];
    D.20292 = D.20289 & 4294967292;
    D.20348 = (struct MonoVTable *) D.20292;
    D.20349 = D.20348->gc_descr;
    D.20350 = (unsigned int) D.20349;
    D.20351 = sgen_gc_descr_has_references (D.20350);
    if (D.20351 != 0) goto <D.20352>; else goto <D.20353>;
    <D.20352>:
    D.20333 = queue->first;
    if (D.20333 == 0B) goto <D.20355>; else goto <D.20358>;
    <D.20358>:
    D.20333 = queue->first;
    D.20335 = D.20333->end;
    if (D.20335 == 125) goto <D.20355>; else goto <D.20356>;
    <D.20355>:
    iftmp.42 = 1;
    goto <D.20357>;
    <D.20356>:
    iftmp.42 = 0;
    <D.20357>:
    D.20359 = iftmp.42 != 0;
    D.20360 = (long int) D.20359;
    D.20361 = __builtin_expect (D.20360, 0);
    if (D.20361 != 0) goto <D.20362>; else goto <D.20363>;
    <D.20362>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.20364>;
    <D.20363>:
    D.20333 = queue->first;
    D.20333 = queue->first;
    D.20335 = D.20333->end;
    D.20365 = D.20335;
    D.20366 = D.20365 + 1;
    D.20333->end = D.20366;
    D.20333->objects[D.20365] = obj;
    <D.20364>:
    __builtin_prefetch (obj);
    <D.20353>:
    <D.20344>:
  }
  <D.20301>:
}


sgen_safe_object_get_size (struct MonoObject * obj)
{
  char * iftmp.43;
  unsigned int D.20369;
  unsigned int D.20370;
  unsigned int D.20373;
  guint D.20377;
  struct MonoVTable * D.20378;
  char * forwarded;

  D.20369 = MEM[(mword *)obj];
  D.20370 = D.20369 & 1;
  if (D.20370 != 0) goto <D.20371>; else goto <D.20372>;
  <D.20371>:
  D.20369 = MEM[(mword *)obj];
  D.20373 = D.20369 & 4294967292;
  iftmp.43 = (char *) D.20373;
  goto <D.20374>;
  <D.20372>:
  iftmp.43 = 0B;
  <D.20374>:
  forwarded = iftmp.43;
  if (forwarded != 0B) goto <D.20375>; else goto <D.20376>;
  <D.20375>:
  obj = forwarded;
  <D.20376>:
  D.20369 = MEM[(mword *)obj];
  D.20373 = D.20369 & 4294967292;
  D.20378 = (struct MonoVTable *) D.20373;
  D.20377 = sgen_par_object_get_size (D.20378, obj);
  return D.20377;
}


sgen_par_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  void * D.20380;
  unsigned int D.20381;
  guint D.20386;
  int D.20387;
  int D.20388;
  unsigned int D.20389;
  unsigned int D.20392;
  int D.20393;
  unsigned int D.20394;
  unsigned int element_size.44;
  unsigned int D.20396;
  unsigned int D.20397;
  struct MonoClass * D.20400;
  unsigned char D.20401;
  unsigned int D.20402;
  unsigned int D.20403;
  mword descr;
  mword type;

  D.20380 = vtable->gc_descr;
  descr = (mword) D.20380;
  type = descr & 7;
  D.20381 = type + 4294967295;
  if (D.20381 <= 1) goto <D.20382>; else goto <D.20383>;
  <D.20382>:
  {
    mword size;

    size = descr & 65528;
    if (size == 0) goto <D.20384>; else goto <D.20385>;
    <D.20384>:
    D.20387 = MEM[(struct MonoString *)o].length;
    D.20388 = D.20387 * 2;
    D.20389 = (unsigned int) D.20388;
    D.20386 = D.20389 + 14;
    return D.20386;
    <D.20385>:
    D.20386 = size;
    return D.20386;
  }
  <D.20383>:
  if (type == 4) goto <D.20390>; else goto <D.20391>;
  <D.20390>:
  {
    int element_size;
    struct MonoArray * array;
    size_t size;

    D.20392 = descr >> 3;
    D.20393 = (int) D.20392;
    element_size = D.20393 & 1023;
    array = o;
    D.20394 = array->max_length;
    element_size.44 = (unsigned int) element_size;
    D.20396 = D.20394 * element_size.44;
    size = D.20396 + 16;
    D.20397 = descr & 8192;
    if (D.20397 != 0) goto <D.20398>; else goto <D.20399>;
    <D.20398>:
    size = size + 3;
    size = size & 4294967292;
    D.20400 = vtable->klass;
    D.20401 = D.20400->rank;
    D.20402 = (unsigned int) D.20401;
    D.20403 = D.20402 * 8;
    size = D.20403 + size;
    <D.20399>:
    D.20386 = size;
    return D.20386;
  }
  <D.20391>:
  D.20386 = slow_object_get_size (vtable, o);
  return D.20386;
}


slow_object_get_size (struct MonoVTable * vtable, struct MonoObject * o)
{
  struct MonoClass * D.20405;
  guint D.20408;
  int D.20409;
  int D.20410;
  unsigned int D.20411;
  unsigned char D.20412;
  int D.20415;
  unsigned int D.20416;
  unsigned int D.20417;
  unsigned int D.20418;
  struct MonoArrayBounds * D.20419;
  _Bool D.20420;
  long int D.20421;
  long int D.20422;
  unsigned int D.20425;
  unsigned int D.20426;
  int D.20427;
  struct MonoClass * klass;

  klass = vtable->klass;
  D.20405 = mono_defaults.string_class;
  if (D.20405 == klass) goto <D.20406>; else goto <D.20407>;
  <D.20406>:
  D.20409 = MEM[(struct MonoString *)o].length;
  D.20410 = D.20409 * 2;
  D.20411 = (unsigned int) D.20410;
  D.20408 = D.20411 + 14;
  return D.20408;
  <D.20407>:
  D.20412 = klass->rank;
  if (D.20412 != 0) goto <D.20413>; else goto <D.20414>;
  <D.20413>:
  {
    struct MonoArray * array;
    size_t size;

    array = o;
    D.20415 = klass->sizes.element_size;
    D.20416 = (unsigned int) D.20415;
    D.20417 = array->max_length;
    D.20418 = D.20416 * D.20417;
    size = D.20418 + 16;
    D.20419 = array->bounds;
    D.20420 = D.20419 != 0B;
    D.20421 = (long int) D.20420;
    D.20422 = __builtin_expect (D.20421, 0);
    if (D.20422 != 0) goto <D.20423>; else goto <D.20424>;
    <D.20423>:
    size = size + 3;
    size = size & 4294967292;
    D.20412 = klass->rank;
    D.20425 = (unsigned int) D.20412;
    D.20426 = D.20425 * 8;
    size = D.20426 + size;
    <D.20424>:
    D.20408 = size;
    return D.20408;
  }
  <D.20414>:
  D.20427 = klass->instance_size;
  D.20408 = (guint) D.20427;
  return D.20408;
}


sgen_gc_descr_has_references (mword desc)
{
  unsigned int D.20429;
  gboolean D.20432;
  unsigned int D.20433;
  unsigned int D.20436;

  D.20429 = desc & 4294901767;
  if (D.20429 == 1) goto <D.20430>; else goto <D.20431>;
  <D.20430>:
  D.20432 = 0;
  return D.20432;
  <D.20431>:
  D.20433 = desc & 49159;
  if (D.20433 == 4) goto <D.20434>; else goto <D.20435>;
  <D.20434>:
  D.20432 = 0;
  return D.20432;
  <D.20435>:
  D.20436 = desc & 7;
  if (D.20436 == 7) goto <D.20437>; else goto <D.20438>;
  <D.20437>:
  D.20432 = 0;
  return D.20432;
  <D.20438>:
  D.20432 = 1;
  return D.20432;
}


sgen_ptr_in_nursery (void * p)
{
  gboolean D.20440;
  int sgen_nursery_bits.45;
  int D.20442;
  int D.20443;
  unsigned int D.20444;
  unsigned int p.46;
  unsigned int D.20446;
  char * sgen_nursery_start.47;
  unsigned int sgen_nursery_start.48;
  _Bool D.20449;

  sgen_nursery_bits.45 = sgen_nursery_bits;
  D.20442 = 1 << sgen_nursery_bits.45;
  D.20443 = -D.20442;
  D.20444 = (unsigned int) D.20443;
  p.46 = (unsigned int) p;
  D.20446 = D.20444 & p.46;
  sgen_nursery_start.47 = sgen_nursery_start;
  sgen_nursery_start.48 = (unsigned int) sgen_nursery_start.47;
  D.20449 = D.20446 == sgen_nursery_start.48;
  D.20440 = (gboolean) D.20449;
  return D.20440;
}


major_scan_object_concurrent (char * start, struct SgenGrayQueue * queue)
{
  unsigned int D.20451;
  unsigned int D.20452;
  unsigned int D.20453;
  unsigned int D.20454;
  unsigned int D.20457;
  unsigned int D.20458;
  unsigned int D.20459;
  unsigned int D.20460;
  unsigned int D.20461;
  int D.20465;
  struct FILE * gc_debug_file.49;
  void * D.20472;
  int iftmp.50;
  int D.20476;
  int D.20478;
  _Bool D.20480;
  long int D.20481;
  long int D.20482;
  int iftmp.51;
  int D.20488;
  int D.20490;
  _Bool D.20492;
  long int D.20493;
  long int D.20494;
  int D.20500;
  int iftmp.52;
  int D.20509;
  int D.20511;
  _Bool D.20513;
  long int D.20514;
  long int D.20515;
  int iftmp.53;
  int D.20521;
  int D.20523;
  _Bool D.20525;
  long int D.20526;
  long int D.20527;
  unsigned int _index.54;
  unsigned int D.20531;
  int D.20532;
  int D.20536;
  void * D.20542;
  int iftmp.55;
  int D.20546;
  int D.20548;
  _Bool D.20550;
  long int D.20551;
  long int D.20552;
  int iftmp.56;
  int D.20558;
  int D.20560;
  _Bool D.20562;
  long int D.20563;
  long int D.20564;
  unsigned int _index.57;
  unsigned int D.20568;
  int D.20569;
  int D.20573;
  int iftmp.58;
  int D.20582;
  int D.20584;
  _Bool D.20586;
  long int D.20587;
  long int D.20588;
  int iftmp.59;
  int D.20594;
  int D.20596;
  _Bool D.20598;
  long int D.20599;
  long int D.20600;
  unsigned int D.20603;
  unsigned int D.20606;
  int D.20607;
  int desc.60;
  unsigned int D.20611;
  unsigned int el_size.61;
  unsigned int D.20613;
  int D.20617;
  void * D.20623;
  int iftmp.62;
  int D.20627;
  int D.20629;
  _Bool D.20631;
  long int D.20632;
  long int D.20633;
  int iftmp.63;
  int D.20639;
  int D.20641;
  _Bool D.20643;
  long int D.20644;
  long int D.20645;
  int D.20651;
  unsigned int offset.64;
  unsigned int D.20653;
  unsigned int i.65;
  unsigned int D.20655;
  void * * D.20656;
  int D.20660;
  void * D.20666;
  int iftmp.66;
  int D.20670;
  void * D.20672;
  int D.20673;
  _Bool D.20675;
  long int D.20676;
  long int D.20677;
  void * D.20680;
  int iftmp.67;
  int D.20684;
  int D.20686;
  _Bool D.20688;
  long int D.20689;
  long int D.20690;
  sizetype el_size.68;
  unsigned int D.20697;
  int D.20703;
  void * D.20709;
  int iftmp.69;
  int D.20713;
  int D.20715;
  _Bool D.20717;
  long int D.20718;
  long int D.20719;
  int iftmp.70;
  int D.20725;
  int D.20727;
  _Bool D.20729;
  long int D.20730;
  long int D.20731;
  unsigned int D.20734;
  int D.20740;
  void * D.20746;
  int iftmp.71;
  int D.20750;
  int D.20752;
  _Bool D.20754;
  long int D.20755;
  long int D.20756;
  int iftmp.72;
  int D.20762;
  int D.20764;
  _Bool D.20766;
  long int D.20767;
  long int D.20768;
  unsigned int D.20771;
  unsigned int D.20772;
  struct MonoVTable * D.20775;
  struct MonoClass * D.20776;
  const char * D.20777;
  const char * D.20778;
  gsize * bitmap_data.73;
  unsigned int D.20780;
  int D.20786;
  void * D.20792;
  int iftmp.74;
  int D.20796;
  int D.20798;
  _Bool D.20800;
  long int D.20801;
  long int D.20802;
  int iftmp.75;
  int D.20808;
  int D.20810;
  _Bool D.20812;
  long int D.20813;
  long int D.20814;
  int bwords.76;
  unsigned int D.20818;
  gsize * mbitmap_data.77;
  unsigned int D.20820;
  unsigned int D.20821;
  struct MonoClass * D.20822;
  unsigned int el_size.78;
  unsigned int D.20824;
  const char * D.20827;
  const char * D.20828;
  gsize * bitmap_data.79;
  unsigned int D.20830;
  int D.20836;
  void * D.20842;
  int iftmp.80;
  int D.20846;
  int D.20848;
  _Bool D.20850;
  long int D.20851;
  long int D.20852;
  int iftmp.81;
  int D.20858;
  int D.20860;
  _Bool D.20862;
  long int D.20863;
  long int D.20864;
  unsigned int bwords.82;
  sizetype el_size.83;

  {
    struct GCVTable * vt;
    mword desc;

    D.20451 = MEM[(mword *)start];
    D.20452 = D.20451 & 4294967292;
    vt = (struct GCVTable *) D.20452;
    desc = vt->desc;
    D.20453 = desc & 7;
    switch (D.20453) <default: <D.19423>, case 1: <D.19318>, case 2: <D.19329>, case 3: <D.19385>, case 4: <D.19341>, case 5: <D.19377>, case 6: <D.19400>, case 7: <D.19422>>
    <D.19318>:
    D.20454 = desc & 4294901760;
    if (D.20454 != 0) goto <D.20455>; else goto <D.20456>;
    <D.20455>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.20457 = desc >> 16;
      D.20458 = D.20457 & 255;
      D.20459 = D.20458 * 4;
      _objptr = _objptr + D.20459;
      D.20460 = desc >> 24;
      D.20461 = D.20460 * 4;
      _objptr_end = _objptr + D.20461;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20464>; else goto <D.20462>;
        <D.20464>:
        D.20465 = sgen_ptr_in_nursery (__old);
        if (D.20465 == 0) goto <D.20466>; else goto <D.20462>;
        <D.20466>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20467>; else goto <D.20468>;
        <D.20467>:
        if (__old != __copy) goto <D.20469>; else goto <D.20470>;
        <D.20469>:
        gc_debug_file.49 = gc_debug_file;
        D.20472 = *_objptr;
        fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20472, __old);
        gc_debug_file.49 = gc_debug_file;
        fflush (gc_debug_file.49);
        <D.20470>:
        <D.20468>:
        D.20476 = sgen_ptr_in_nursery (__copy);
        if (D.20476 != 0) goto <D.20477>; else goto <D.20474>;
        <D.20477>:
        D.20478 = sgen_ptr_in_nursery (_objptr);
        if (D.20478 == 0) goto <D.20479>; else goto <D.20474>;
        <D.20479>:
        iftmp.50 = 1;
        goto <D.20475>;
        <D.20474>:
        iftmp.50 = 0;
        <D.20475>:
        D.20480 = iftmp.50 != 0;
        D.20481 = (long int) D.20480;
        D.20482 = __builtin_expect (D.20481, 0);
        if (D.20482 != 0) goto <D.20483>; else goto <D.20484>;
        <D.20483>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20484>:
        goto <D.20463>;
        <D.20462>:
        D.20488 = sgen_ptr_in_nursery (__old);
        if (D.20488 != 0) goto <D.20489>; else goto <D.20486>;
        <D.20489>:
        D.20490 = sgen_ptr_in_nursery (_objptr);
        if (D.20490 == 0) goto <D.20491>; else goto <D.20486>;
        <D.20491>:
        iftmp.51 = 1;
        goto <D.20487>;
        <D.20486>:
        iftmp.51 = 0;
        <D.20487>:
        D.20492 = iftmp.51 != 0;
        D.20493 = (long int) D.20492;
        D.20494 = __builtin_expect (D.20493, 0);
        if (D.20494 != 0) goto <D.20495>; else goto <D.20496>;
        <D.20495>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20496>:
        <D.20463>:
      }
      _objptr = _objptr + 4;
      goto <D.19326>;
      <D.19325>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20499>; else goto <D.20497>;
        <D.20499>:
        D.20500 = sgen_ptr_in_nursery (__old);
        if (D.20500 == 0) goto <D.20501>; else goto <D.20497>;
        <D.20501>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20502>; else goto <D.20503>;
        <D.20502>:
        if (__old != __copy) goto <D.20504>; else goto <D.20505>;
        <D.20504>:
        gc_debug_file.49 = gc_debug_file;
        D.20472 = *_objptr;
        fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20472, __old);
        gc_debug_file.49 = gc_debug_file;
        fflush (gc_debug_file.49);
        <D.20505>:
        <D.20503>:
        D.20509 = sgen_ptr_in_nursery (__copy);
        if (D.20509 != 0) goto <D.20510>; else goto <D.20507>;
        <D.20510>:
        D.20511 = sgen_ptr_in_nursery (_objptr);
        if (D.20511 == 0) goto <D.20512>; else goto <D.20507>;
        <D.20512>:
        iftmp.52 = 1;
        goto <D.20508>;
        <D.20507>:
        iftmp.52 = 0;
        <D.20508>:
        D.20513 = iftmp.52 != 0;
        D.20514 = (long int) D.20513;
        D.20515 = __builtin_expect (D.20514, 0);
        if (D.20515 != 0) goto <D.20516>; else goto <D.20517>;
        <D.20516>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20517>:
        goto <D.20498>;
        <D.20497>:
        D.20521 = sgen_ptr_in_nursery (__old);
        if (D.20521 != 0) goto <D.20522>; else goto <D.20519>;
        <D.20522>:
        D.20523 = sgen_ptr_in_nursery (_objptr);
        if (D.20523 == 0) goto <D.20524>; else goto <D.20519>;
        <D.20524>:
        iftmp.53 = 1;
        goto <D.20520>;
        <D.20519>:
        iftmp.53 = 0;
        <D.20520>:
        D.20525 = iftmp.53 != 0;
        D.20526 = (long int) D.20525;
        D.20527 = __builtin_expect (D.20526, 0);
        if (D.20527 != 0) goto <D.20528>; else goto <D.20529>;
        <D.20528>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20529>:
        <D.20498>:
      }
      _objptr = _objptr + 4;
      <D.19326>:
      if (_objptr < _objptr_end) goto <D.19325>; else goto <D.19327>;
      <D.19327>:
    }
    <D.20456>:
    goto <D.19328>;
    <D.19329>:
    {
      void * * _objptr;
      gsize _bmap;

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

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

          __old = *_objptr;
          if (__old != 0B) goto <D.20535>; else goto <D.20533>;
          <D.20535>:
          D.20536 = sgen_ptr_in_nursery (__old);
          if (D.20536 == 0) goto <D.20537>; else goto <D.20533>;
          <D.20537>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.20538>; else goto <D.20539>;
          <D.20538>:
          if (__old != __copy) goto <D.20540>; else goto <D.20541>;
          <D.20540>:
          gc_debug_file.49 = gc_debug_file;
          D.20542 = *_objptr;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20542, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.20541>:
          <D.20539>:
          D.20546 = sgen_ptr_in_nursery (__copy);
          if (D.20546 != 0) goto <D.20547>; else goto <D.20544>;
          <D.20547>:
          D.20548 = sgen_ptr_in_nursery (_objptr);
          if (D.20548 == 0) goto <D.20549>; else goto <D.20544>;
          <D.20549>:
          iftmp.55 = 1;
          goto <D.20545>;
          <D.20544>:
          iftmp.55 = 0;
          <D.20545>:
          D.20550 = iftmp.55 != 0;
          D.20551 = (long int) D.20550;
          D.20552 = __builtin_expect (D.20551, 0);
          if (D.20552 != 0) goto <D.20553>; else goto <D.20554>;
          <D.20553>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.20554>:
          goto <D.20534>;
          <D.20533>:
          D.20558 = sgen_ptr_in_nursery (__old);
          if (D.20558 != 0) goto <D.20559>; else goto <D.20556>;
          <D.20559>:
          D.20560 = sgen_ptr_in_nursery (_objptr);
          if (D.20560 == 0) goto <D.20561>; else goto <D.20556>;
          <D.20561>:
          iftmp.56 = 1;
          goto <D.20557>;
          <D.20556>:
          iftmp.56 = 0;
          <D.20557>:
          D.20562 = iftmp.56 != 0;
          D.20563 = (long int) D.20562;
          D.20564 = __builtin_expect (D.20563, 0);
          if (D.20564 != 0) goto <D.20565>; else goto <D.20566>;
          <D.20565>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.20566>:
          <D.20534>:
        }
        _objptr = _objptr + 4;
      }
      goto <D.19339>;
      <D.19338>:
      {
        int _index;

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

          __old = *_objptr;
          if (__old != 0B) goto <D.20572>; else goto <D.20570>;
          <D.20572>:
          D.20573 = sgen_ptr_in_nursery (__old);
          if (D.20573 == 0) goto <D.20574>; else goto <D.20570>;
          <D.20574>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.20575>; else goto <D.20576>;
          <D.20575>:
          if (__old != __copy) goto <D.20577>; else goto <D.20578>;
          <D.20577>:
          gc_debug_file.49 = gc_debug_file;
          D.20542 = *_objptr;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20542, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.20578>:
          <D.20576>:
          D.20582 = sgen_ptr_in_nursery (__copy);
          if (D.20582 != 0) goto <D.20583>; else goto <D.20580>;
          <D.20583>:
          D.20584 = sgen_ptr_in_nursery (_objptr);
          if (D.20584 == 0) goto <D.20585>; else goto <D.20580>;
          <D.20585>:
          iftmp.58 = 1;
          goto <D.20581>;
          <D.20580>:
          iftmp.58 = 0;
          <D.20581>:
          D.20586 = iftmp.58 != 0;
          D.20587 = (long int) D.20586;
          D.20588 = __builtin_expect (D.20587, 0);
          if (D.20588 != 0) goto <D.20589>; else goto <D.20590>;
          <D.20589>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.20590>:
          goto <D.20571>;
          <D.20570>:
          D.20594 = sgen_ptr_in_nursery (__old);
          if (D.20594 != 0) goto <D.20595>; else goto <D.20592>;
          <D.20595>:
          D.20596 = sgen_ptr_in_nursery (_objptr);
          if (D.20596 == 0) goto <D.20597>; else goto <D.20592>;
          <D.20597>:
          iftmp.59 = 1;
          goto <D.20593>;
          <D.20592>:
          iftmp.59 = 0;
          <D.20593>:
          D.20598 = iftmp.59 != 0;
          D.20599 = (long int) D.20598;
          D.20600 = __builtin_expect (D.20599, 0);
          if (D.20600 != 0) goto <D.20601>; else goto <D.20602>;
          <D.20601>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.20602>:
          <D.20571>:
        }
        _objptr = _objptr + 4;
      }
      <D.19339>:
      if (_bmap != 0) goto <D.19338>; else goto <D.19340>;
      <D.19340>:
    }
    goto <D.19328>;
    <D.19341>:
    D.20603 = desc & 4294950912;
    if (D.20603 != 0) goto <D.20604>; else goto <D.20605>;
    <D.20604>:
    {
      int el_size;
      int etype;

      D.20606 = desc >> 3;
      D.20607 = (int) D.20606;
      el_size = D.20607 & 1023;
      desc.60 = (int) desc;
      etype = desc.60 & 49152;
      if (etype == 16384) goto <D.20609>; else goto <D.20610>;
      <D.20609>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.20611 = MEM[(struct MonoArray *)start].max_length;
        el_size.61 = (unsigned int) el_size;
        D.20613 = D.20611 * el_size.61;
        end_refs = p + D.20613;
        goto <D.19349>;
        <D.19348>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.20616>; else goto <D.20614>;
          <D.20616>:
          D.20617 = sgen_ptr_in_nursery (__old);
          if (D.20617 == 0) goto <D.20618>; else goto <D.20614>;
          <D.20618>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.20619>; else goto <D.20620>;
          <D.20619>:
          if (__old != __copy) goto <D.20621>; else goto <D.20622>;
          <D.20621>:
          gc_debug_file.49 = gc_debug_file;
          D.20623 = *p;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", p, D.20623, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.20622>:
          <D.20620>:
          D.20627 = sgen_ptr_in_nursery (__copy);
          if (D.20627 != 0) goto <D.20628>; else goto <D.20625>;
          <D.20628>:
          D.20629 = sgen_ptr_in_nursery (p);
          if (D.20629 == 0) goto <D.20630>; else goto <D.20625>;
          <D.20630>:
          iftmp.62 = 1;
          goto <D.20626>;
          <D.20625>:
          iftmp.62 = 0;
          <D.20626>:
          D.20631 = iftmp.62 != 0;
          D.20632 = (long int) D.20631;
          D.20633 = __builtin_expect (D.20632, 0);
          if (D.20633 != 0) goto <D.20634>; else goto <D.20635>;
          <D.20634>:
          sgen_add_to_global_remset (p, __copy);
          <D.20635>:
          goto <D.20615>;
          <D.20614>:
          D.20639 = sgen_ptr_in_nursery (__old);
          if (D.20639 != 0) goto <D.20640>; else goto <D.20637>;
          <D.20640>:
          D.20641 = sgen_ptr_in_nursery (p);
          if (D.20641 == 0) goto <D.20642>; else goto <D.20637>;
          <D.20642>:
          iftmp.63 = 1;
          goto <D.20638>;
          <D.20637>:
          iftmp.63 = 0;
          <D.20638>:
          D.20643 = iftmp.63 != 0;
          D.20644 = (long int) D.20643;
          D.20645 = __builtin_expect (D.20644, 0);
          if (D.20645 != 0) goto <D.20646>; else goto <D.20647>;
          <D.20646>:
          sgen_add_to_global_remset (p, __old);
          <D.20647>:
          <D.20615>:
        }
        p = p + 4;
        <D.19349>:
        if (p < end_refs) goto <D.19348>; else goto <D.19350>;
        <D.19350>:
      }
      goto <D.20648>;
      <D.20610>:
      if (etype == 32768) goto <D.20649>; else goto <D.20650>;
      <D.20649>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.20457 = desc >> 16;
        D.20651 = (int) D.20457;
        offset = D.20651 & 255;
        D.20460 = desc >> 24;
        num_refs = (int) D.20460;
        e_start = start + 16;
        D.20611 = MEM[(struct MonoArray *)start].max_length;
        el_size.61 = (unsigned int) el_size;
        D.20613 = D.20611 * el_size.61;
        e_end = e_start + D.20613;
        goto <D.19363>;
        <D.19362>:
        {
          void * * p;
          int i;

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

            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20656 = p + D.20655;
            __old = *D.20656;
            if (__old != 0B) goto <D.20659>; else goto <D.20657>;
            <D.20659>:
            D.20660 = sgen_ptr_in_nursery (__old);
            if (D.20660 == 0) goto <D.20661>; else goto <D.20657>;
            <D.20661>:
            __builtin_prefetch (__old);
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20656 = p + D.20655;
            major_copy_or_mark_object_concurrent (D.20656, __old, queue);
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20656 = p + D.20655;
            __copy = *D.20656;
            if (0 != 0) goto <D.20662>; else goto <D.20663>;
            <D.20662>:
            if (__old != __copy) goto <D.20664>; else goto <D.20665>;
            <D.20664>:
            gc_debug_file.49 = gc_debug_file;
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20656 = p + D.20655;
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20656 = p + D.20655;
            D.20666 = *D.20656;
            fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", D.20656, D.20666, __old);
            gc_debug_file.49 = gc_debug_file;
            fflush (gc_debug_file.49);
            <D.20665>:
            <D.20663>:
            D.20670 = sgen_ptr_in_nursery (__copy);
            if (D.20670 != 0) goto <D.20671>; else goto <D.20668>;
            <D.20671>:
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20672 = p + D.20655;
            D.20673 = sgen_ptr_in_nursery (D.20672);
            if (D.20673 == 0) goto <D.20674>; else goto <D.20668>;
            <D.20674>:
            iftmp.66 = 1;
            goto <D.20669>;
            <D.20668>:
            iftmp.66 = 0;
            <D.20669>:
            D.20675 = iftmp.66 != 0;
            D.20676 = (long int) D.20675;
            D.20677 = __builtin_expect (D.20676, 0);
            if (D.20677 != 0) goto <D.20678>; else goto <D.20679>;
            <D.20678>:
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20680 = p + D.20655;
            sgen_add_to_global_remset (D.20680, __copy);
            <D.20679>:
            goto <D.20658>;
            <D.20657>:
            D.20684 = sgen_ptr_in_nursery (__old);
            if (D.20684 != 0) goto <D.20685>; else goto <D.20682>;
            <D.20685>:
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20672 = p + D.20655;
            D.20686 = sgen_ptr_in_nursery (D.20672);
            if (D.20686 == 0) goto <D.20687>; else goto <D.20682>;
            <D.20687>:
            iftmp.67 = 1;
            goto <D.20683>;
            <D.20682>:
            iftmp.67 = 0;
            <D.20683>:
            D.20688 = iftmp.67 != 0;
            D.20689 = (long int) D.20688;
            D.20690 = __builtin_expect (D.20689, 0);
            if (D.20690 != 0) goto <D.20691>; else goto <D.20692>;
            <D.20691>:
            i.65 = (unsigned int) i;
            D.20655 = i.65 * 4;
            D.20680 = p + D.20655;
            sgen_add_to_global_remset (D.20680, __old);
            <D.20692>:
            <D.20658>:
          }
          i = i + 1;
          <D.19360>:
          if (i < num_refs) goto <D.19359>; else goto <D.19361>;
          <D.19361>:
          el_size.68 = (sizetype) el_size;
          e_start = e_start + el_size.68;
        }
        <D.19363>:
        if (e_start < e_end) goto <D.19362>; else goto <D.19364>;
        <D.19364>:
      }
      goto <D.20694>;
      <D.20650>:
      if (etype == 49152) goto <D.20695>; else goto <D.20696>;
      <D.20695>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.20611 = MEM[(struct MonoArray *)start].max_length;
        el_size.61 = (unsigned int) el_size;
        D.20613 = D.20611 * el_size.61;
        e_end = e_start + D.20613;
        goto <D.19375>;
        <D.19374>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.19372>;
          <D.19371>:
          D.20697 = _bmap & 1;
          if (D.20697 != 0) goto <D.20698>; else goto <D.20699>;
          <D.20698>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.20702>; else goto <D.20700>;
            <D.20702>:
            D.20703 = sgen_ptr_in_nursery (__old);
            if (D.20703 == 0) goto <D.20704>; else goto <D.20700>;
            <D.20704>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.20705>; else goto <D.20706>;
            <D.20705>:
            if (__old != __copy) goto <D.20707>; else goto <D.20708>;
            <D.20707>:
            gc_debug_file.49 = gc_debug_file;
            D.20709 = *p;
            fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", p, D.20709, __old);
            gc_debug_file.49 = gc_debug_file;
            fflush (gc_debug_file.49);
            <D.20708>:
            <D.20706>:
            D.20713 = sgen_ptr_in_nursery (__copy);
            if (D.20713 != 0) goto <D.20714>; else goto <D.20711>;
            <D.20714>:
            D.20715 = sgen_ptr_in_nursery (p);
            if (D.20715 == 0) goto <D.20716>; else goto <D.20711>;
            <D.20716>:
            iftmp.69 = 1;
            goto <D.20712>;
            <D.20711>:
            iftmp.69 = 0;
            <D.20712>:
            D.20717 = iftmp.69 != 0;
            D.20718 = (long int) D.20717;
            D.20719 = __builtin_expect (D.20718, 0);
            if (D.20719 != 0) goto <D.20720>; else goto <D.20721>;
            <D.20720>:
            sgen_add_to_global_remset (p, __copy);
            <D.20721>:
            goto <D.20701>;
            <D.20700>:
            D.20725 = sgen_ptr_in_nursery (__old);
            if (D.20725 != 0) goto <D.20726>; else goto <D.20723>;
            <D.20726>:
            D.20727 = sgen_ptr_in_nursery (p);
            if (D.20727 == 0) goto <D.20728>; else goto <D.20723>;
            <D.20728>:
            iftmp.70 = 1;
            goto <D.20724>;
            <D.20723>:
            iftmp.70 = 0;
            <D.20724>:
            D.20729 = iftmp.70 != 0;
            D.20730 = (long int) D.20729;
            D.20731 = __builtin_expect (D.20730, 0);
            if (D.20731 != 0) goto <D.20732>; else goto <D.20733>;
            <D.20732>:
            sgen_add_to_global_remset (p, __old);
            <D.20733>:
            <D.20701>:
          }
          <D.20699>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.19372>:
          if (_bmap != 0) goto <D.19371>; else goto <D.19373>;
          <D.19373>:
          el_size.68 = (sizetype) el_size;
          e_start = e_start + el_size.68;
        }
        <D.19375>:
        if (e_start < e_end) goto <D.19374>; else goto <D.19376>;
        <D.19376>:
      }
      <D.20696>:
      <D.20694>:
      <D.20648>:
    }
    <D.20605>:
    goto <D.19328>;
    <D.19377>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.19383>;
      <D.19382>:
      D.20734 = _bmap & 1;
      if (D.20734 != 0) goto <D.20735>; else goto <D.20736>;
      <D.20735>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20739>; else goto <D.20737>;
        <D.20739>:
        D.20740 = sgen_ptr_in_nursery (__old);
        if (D.20740 == 0) goto <D.20741>; else goto <D.20737>;
        <D.20741>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object_concurrent (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20742>; else goto <D.20743>;
        <D.20742>:
        if (__old != __copy) goto <D.20744>; else goto <D.20745>;
        <D.20744>:
        gc_debug_file.49 = gc_debug_file;
        D.20746 = *_objptr;
        fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20746, __old);
        gc_debug_file.49 = gc_debug_file;
        fflush (gc_debug_file.49);
        <D.20745>:
        <D.20743>:
        D.20750 = sgen_ptr_in_nursery (__copy);
        if (D.20750 != 0) goto <D.20751>; else goto <D.20748>;
        <D.20751>:
        D.20752 = sgen_ptr_in_nursery (_objptr);
        if (D.20752 == 0) goto <D.20753>; else goto <D.20748>;
        <D.20753>:
        iftmp.71 = 1;
        goto <D.20749>;
        <D.20748>:
        iftmp.71 = 0;
        <D.20749>:
        D.20754 = iftmp.71 != 0;
        D.20755 = (long int) D.20754;
        D.20756 = __builtin_expect (D.20755, 0);
        if (D.20756 != 0) goto <D.20757>; else goto <D.20758>;
        <D.20757>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20758>:
        goto <D.20738>;
        <D.20737>:
        D.20762 = sgen_ptr_in_nursery (__old);
        if (D.20762 != 0) goto <D.20763>; else goto <D.20760>;
        <D.20763>:
        D.20764 = sgen_ptr_in_nursery (_objptr);
        if (D.20764 == 0) goto <D.20765>; else goto <D.20760>;
        <D.20765>:
        iftmp.72 = 1;
        goto <D.20761>;
        <D.20760>:
        iftmp.72 = 0;
        <D.20761>:
        D.20766 = iftmp.72 != 0;
        D.20767 = (long int) D.20766;
        D.20768 = __builtin_expect (D.20767, 0);
        if (D.20768 != 0) goto <D.20769>; else goto <D.20770>;
        <D.20769>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20770>:
        <D.20738>:
      }
      <D.20736>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19383>:
      if (_bmap != 0) goto <D.19382>; else goto <D.19384>;
      <D.19384>:
    }
    goto <D.19328>;
    <D.19385>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.20771 = *bitmap_data;
      D.20772 = D.20771 + 4294967295;
      bwords = (int) D.20772;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.20773>; else goto <D.20774>;
      <D.20773>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.20775 = myobj->vtable;
        D.20776 = D.20775->klass;
        D.20777 = D.20776->name_space;
        D.20775 = myobj->vtable;
        D.20776 = D.20775->klass;
        D.20778 = D.20776->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.20777, D.20778);
      }
      <D.20774>:
      goto <D.19398>;
      <D.19397>:
      {
        gsize _bmap;

        bitmap_data.73 = bitmap_data;
        bitmap_data = bitmap_data.73 + 4;
        _bmap = *bitmap_data.73;
        _objptr = start_run;
        goto <D.19395>;
        <D.19394>:
        D.20780 = _bmap & 1;
        if (D.20780 != 0) goto <D.20781>; else goto <D.20782>;
        <D.20781>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.20785>; else goto <D.20783>;
          <D.20785>:
          D.20786 = sgen_ptr_in_nursery (__old);
          if (D.20786 == 0) goto <D.20787>; else goto <D.20783>;
          <D.20787>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object_concurrent (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.20788>; else goto <D.20789>;
          <D.20788>:
          if (__old != __copy) goto <D.20790>; else goto <D.20791>;
          <D.20790>:
          gc_debug_file.49 = gc_debug_file;
          D.20792 = *_objptr;
          fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20792, __old);
          gc_debug_file.49 = gc_debug_file;
          fflush (gc_debug_file.49);
          <D.20791>:
          <D.20789>:
          D.20796 = sgen_ptr_in_nursery (__copy);
          if (D.20796 != 0) goto <D.20797>; else goto <D.20794>;
          <D.20797>:
          D.20798 = sgen_ptr_in_nursery (_objptr);
          if (D.20798 == 0) goto <D.20799>; else goto <D.20794>;
          <D.20799>:
          iftmp.74 = 1;
          goto <D.20795>;
          <D.20794>:
          iftmp.74 = 0;
          <D.20795>:
          D.20800 = iftmp.74 != 0;
          D.20801 = (long int) D.20800;
          D.20802 = __builtin_expect (D.20801, 0);
          if (D.20802 != 0) goto <D.20803>; else goto <D.20804>;
          <D.20803>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.20804>:
          goto <D.20784>;
          <D.20783>:
          D.20808 = sgen_ptr_in_nursery (__old);
          if (D.20808 != 0) goto <D.20809>; else goto <D.20806>;
          <D.20809>:
          D.20810 = sgen_ptr_in_nursery (_objptr);
          if (D.20810 == 0) goto <D.20811>; else goto <D.20806>;
          <D.20811>:
          iftmp.75 = 1;
          goto <D.20807>;
          <D.20806>:
          iftmp.75 = 0;
          <D.20807>:
          D.20812 = iftmp.75 != 0;
          D.20813 = (long int) D.20812;
          D.20814 = __builtin_expect (D.20813, 0);
          if (D.20814 != 0) goto <D.20815>; else goto <D.20816>;
          <D.20815>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.20816>:
          <D.20784>:
        }
        <D.20782>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.19395>:
        if (_bmap != 0) goto <D.19394>; else goto <D.19396>;
        <D.19396>:
        start_run = start_run + 128;
      }
      <D.19398>:
      bwords.76 = bwords;
      bwords = bwords.76 + -1;
      if (bwords.76 > 0) goto <D.19397>; else goto <D.19399>;
      <D.19399>:
    }
    goto <D.19328>;
    <D.19400>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.20818 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.20818);
      mbitmap_data.77 = mbitmap_data;
      mbitmap_data = mbitmap_data.77 + 4;
      D.20820 = *mbitmap_data.77;
      D.20821 = D.20820 + 4294967295;
      mbwords = (int) D.20821;
      D.20822 = vt->klass;
      el_size = mono_array_element_size (D.20822);
      e_start = start + 16;
      D.20611 = MEM[(struct MonoArray *)start].max_length;
      el_size.78 = (unsigned int) el_size;
      D.20824 = D.20611 * el_size.78;
      e_end = e_start + D.20824;
      if (0 != 0) goto <D.20825>; else goto <D.20826>;
      <D.20825>:
      D.20818 = vt->desc;
      D.20822 = vt->klass;
      D.20827 = D.20822->name_space;
      D.20822 = vt->klass;
      D.20828 = D.20822->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.20818, D.20827, D.20828);
      <D.20826>:
      goto <D.19420>;
      <D.19419>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.79 = bitmap_data;
          bitmap_data = bitmap_data.79 + 4;
          _bmap = *bitmap_data.79;
          start_run = _objptr;
          goto <D.19414>;
          <D.19413>:
          D.20830 = _bmap & 1;
          if (D.20830 != 0) goto <D.20831>; else goto <D.20832>;
          <D.20831>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.20835>; else goto <D.20833>;
            <D.20835>:
            D.20836 = sgen_ptr_in_nursery (__old);
            if (D.20836 == 0) goto <D.20837>; else goto <D.20833>;
            <D.20837>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object_concurrent (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.20838>; else goto <D.20839>;
            <D.20838>:
            if (__old != __copy) goto <D.20840>; else goto <D.20841>;
            <D.20840>:
            gc_debug_file.49 = gc_debug_file;
            D.20842 = *_objptr;
            fprintf (gc_debug_file.49, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20842, __old);
            gc_debug_file.49 = gc_debug_file;
            fflush (gc_debug_file.49);
            <D.20841>:
            <D.20839>:
            D.20846 = sgen_ptr_in_nursery (__copy);
            if (D.20846 != 0) goto <D.20847>; else goto <D.20844>;
            <D.20847>:
            D.20848 = sgen_ptr_in_nursery (_objptr);
            if (D.20848 == 0) goto <D.20849>; else goto <D.20844>;
            <D.20849>:
            iftmp.80 = 1;
            goto <D.20845>;
            <D.20844>:
            iftmp.80 = 0;
            <D.20845>:
            D.20850 = iftmp.80 != 0;
            D.20851 = (long int) D.20850;
            D.20852 = __builtin_expect (D.20851, 0);
            if (D.20852 != 0) goto <D.20853>; else goto <D.20854>;
            <D.20853>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.20854>:
            goto <D.20834>;
            <D.20833>:
            D.20858 = sgen_ptr_in_nursery (__old);
            if (D.20858 != 0) goto <D.20859>; else goto <D.20856>;
            <D.20859>:
            D.20860 = sgen_ptr_in_nursery (_objptr);
            if (D.20860 == 0) goto <D.20861>; else goto <D.20856>;
            <D.20861>:
            iftmp.81 = 1;
            goto <D.20857>;
            <D.20856>:
            iftmp.81 = 0;
            <D.20857>:
            D.20862 = iftmp.81 != 0;
            D.20863 = (long int) D.20862;
            D.20864 = __builtin_expect (D.20863, 0);
            if (D.20864 != 0) goto <D.20865>; else goto <D.20866>;
            <D.20865>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.20866>:
            <D.20834>:
          }
          <D.20832>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.19414>:
          if (_bmap != 0) goto <D.19413>; else goto <D.19415>;
          <D.19415>:
          _objptr = start_run + 128;
        }
        <D.19417>:
        bwords.82 = bwords;
        bwords = bwords.82 + 4294967295;
        if (bwords.82 != 0) goto <D.19416>; else goto <D.19418>;
        <D.19418>:
        el_size.83 = (sizetype) el_size;
        e_start = e_start + el_size.83;
      }
      <D.19420>:
      if (e_start < e_end) goto <D.19419>; else goto <D.19421>;
      <D.19421>:
    }
    goto <D.19328>;
    <D.19422>:
    goto <D.19328>;
    <D.19423>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.19328>:
  }
}


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

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


major_scan_object (char * start, struct SgenGrayQueue * queue)
{
  unsigned int D.20871;
  unsigned int D.20872;
  unsigned int D.20873;
  unsigned int D.20874;
  unsigned int D.20877;
  unsigned int D.20878;
  unsigned int D.20879;
  unsigned int D.20880;
  unsigned int D.20881;
  struct FILE * gc_debug_file.84;
  void * D.20889;
  int iftmp.85;
  int D.20893;
  int D.20895;
  _Bool D.20897;
  long int D.20898;
  long int D.20899;
  int iftmp.86;
  int D.20914;
  int D.20916;
  _Bool D.20918;
  long int D.20919;
  long int D.20920;
  unsigned int _index.87;
  unsigned int D.20927;
  int D.20928;
  void * D.20935;
  int iftmp.88;
  int D.20939;
  int D.20941;
  _Bool D.20943;
  long int D.20944;
  long int D.20945;
  unsigned int _index.89;
  unsigned int D.20952;
  int D.20953;
  int iftmp.90;
  int D.20963;
  int D.20965;
  _Bool D.20967;
  long int D.20968;
  long int D.20969;
  unsigned int D.20975;
  unsigned int D.20978;
  int D.20979;
  int desc.91;
  unsigned int D.20983;
  unsigned int el_size.92;
  unsigned int D.20985;
  void * D.20992;
  int iftmp.93;
  int D.20996;
  int D.20998;
  _Bool D.21000;
  long int D.21001;
  long int D.21002;
  int D.21011;
  unsigned int offset.94;
  unsigned int D.21013;
  unsigned int i.95;
  unsigned int D.21015;
  void * * D.21016;
  void * D.21023;
  int iftmp.96;
  int D.21027;
  void * D.21029;
  int D.21030;
  _Bool D.21032;
  long int D.21033;
  long int D.21034;
  void * D.21037;
  sizetype el_size.97;
  unsigned int D.21045;
  void * D.21054;
  int iftmp.98;
  int D.21058;
  int D.21060;
  _Bool D.21062;
  long int D.21063;
  long int D.21064;
  unsigned int D.21070;
  void * D.21079;
  int iftmp.99;
  int D.21083;
  int D.21085;
  _Bool D.21087;
  long int D.21088;
  long int D.21089;
  unsigned int D.21095;
  unsigned int D.21096;
  struct MonoVTable * D.21099;
  struct MonoClass * D.21100;
  const char * D.21101;
  const char * D.21102;
  gsize * bitmap_data.100;
  unsigned int D.21104;
  void * D.21113;
  int iftmp.101;
  int D.21117;
  int D.21119;
  _Bool D.21121;
  long int D.21122;
  long int D.21123;
  int bwords.102;
  unsigned int D.21130;
  gsize * mbitmap_data.103;
  unsigned int D.21132;
  unsigned int D.21133;
  struct MonoClass * D.21134;
  unsigned int el_size.104;
  unsigned int D.21136;
  const char * D.21139;
  const char * D.21140;
  gsize * bitmap_data.105;
  unsigned int D.21142;
  void * D.21151;
  int iftmp.106;
  int D.21155;
  int D.21157;
  _Bool D.21159;
  long int D.21160;
  long int D.21161;
  unsigned int bwords.107;
  sizetype el_size.108;

  {
    struct GCVTable * vt;
    mword desc;

    D.20871 = MEM[(mword *)start];
    D.20872 = D.20871 & 4294967292;
    vt = (struct GCVTable *) D.20872;
    desc = vt->desc;
    D.20873 = desc & 7;
    switch (D.20873) <default: <D.19310>, case 1: <D.19205>, case 2: <D.19216>, case 3: <D.19272>, case 4: <D.19228>, case 5: <D.19264>, case 6: <D.19287>, case 7: <D.19309>>
    <D.19205>:
    D.20874 = desc & 4294901760;
    if (D.20874 != 0) goto <D.20875>; else goto <D.20876>;
    <D.20875>:
    {
      void * * _objptr_end;
      void * * _objptr;

      _objptr = start;
      D.20877 = desc >> 16;
      D.20878 = D.20877 & 255;
      D.20879 = D.20878 * 4;
      _objptr = _objptr + D.20879;
      D.20880 = desc >> 24;
      D.20881 = D.20880 * 4;
      _objptr_end = _objptr + D.20881;
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20882>; else goto <D.20883>;
        <D.20882>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20884>; else goto <D.20885>;
        <D.20884>:
        if (__old != __copy) goto <D.20886>; else goto <D.20887>;
        <D.20886>:
        gc_debug_file.84 = gc_debug_file;
        D.20889 = *_objptr;
        fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20889, __old);
        gc_debug_file.84 = gc_debug_file;
        fflush (gc_debug_file.84);
        <D.20887>:
        <D.20885>:
        D.20893 = sgen_ptr_in_nursery (__copy);
        if (D.20893 != 0) goto <D.20894>; else goto <D.20891>;
        <D.20894>:
        D.20895 = sgen_ptr_in_nursery (_objptr);
        if (D.20895 == 0) goto <D.20896>; else goto <D.20891>;
        <D.20896>:
        iftmp.85 = 1;
        goto <D.20892>;
        <D.20891>:
        iftmp.85 = 0;
        <D.20892>:
        D.20897 = iftmp.85 != 0;
        D.20898 = (long int) D.20897;
        D.20899 = __builtin_expect (D.20898, 0);
        if (D.20899 != 0) goto <D.20900>; else goto <D.20901>;
        <D.20900>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20901>:
        goto <D.20902>;
        <D.20883>:
        if (0 != 0) goto <D.20903>; else goto <D.20904>;
        <D.20903>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20904>:
        <D.20902>:
      }
      _objptr = _objptr + 4;
      goto <D.19213>;
      <D.19212>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.20905>; else goto <D.20906>;
        <D.20905>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.20907>; else goto <D.20908>;
        <D.20907>:
        if (__old != __copy) goto <D.20909>; else goto <D.20910>;
        <D.20909>:
        gc_debug_file.84 = gc_debug_file;
        D.20889 = *_objptr;
        fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20889, __old);
        gc_debug_file.84 = gc_debug_file;
        fflush (gc_debug_file.84);
        <D.20910>:
        <D.20908>:
        D.20914 = sgen_ptr_in_nursery (__copy);
        if (D.20914 != 0) goto <D.20915>; else goto <D.20912>;
        <D.20915>:
        D.20916 = sgen_ptr_in_nursery (_objptr);
        if (D.20916 == 0) goto <D.20917>; else goto <D.20912>;
        <D.20917>:
        iftmp.86 = 1;
        goto <D.20913>;
        <D.20912>:
        iftmp.86 = 0;
        <D.20913>:
        D.20918 = iftmp.86 != 0;
        D.20919 = (long int) D.20918;
        D.20920 = __builtin_expect (D.20919, 0);
        if (D.20920 != 0) goto <D.20921>; else goto <D.20922>;
        <D.20921>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.20922>:
        goto <D.20923>;
        <D.20906>:
        if (0 != 0) goto <D.20924>; else goto <D.20925>;
        <D.20924>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.20925>:
        <D.20923>:
      }
      _objptr = _objptr + 4;
      <D.19213>:
      if (_objptr < _objptr_end) goto <D.19212>; else goto <D.19214>;
      <D.19214>:
    }
    <D.20876>:
    goto <D.19215>;
    <D.19216>:
    {
      void * * _objptr;
      gsize _bmap;

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

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

          __old = *_objptr;
          if (__old != 0B) goto <D.20929>; else goto <D.20930>;
          <D.20929>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.20931>; else goto <D.20932>;
          <D.20931>:
          if (__old != __copy) goto <D.20933>; else goto <D.20934>;
          <D.20933>:
          gc_debug_file.84 = gc_debug_file;
          D.20935 = *_objptr;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20935, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.20934>:
          <D.20932>:
          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.88 = 1;
          goto <D.20938>;
          <D.20937>:
          iftmp.88 = 0;
          <D.20938>:
          D.20943 = iftmp.88 != 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.20948>;
          <D.20930>:
          if (0 != 0) goto <D.20949>; else goto <D.20950>;
          <D.20949>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.20950>:
          <D.20948>:
        }
        _objptr = _objptr + 4;
      }
      goto <D.19226>;
      <D.19225>:
      {
        int _index;

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

          __old = *_objptr;
          if (__old != 0B) goto <D.20954>; else goto <D.20955>;
          <D.20954>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.20956>; else goto <D.20957>;
          <D.20956>:
          if (__old != __copy) goto <D.20958>; else goto <D.20959>;
          <D.20958>:
          gc_debug_file.84 = gc_debug_file;
          D.20935 = *_objptr;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.20935, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.20959>:
          <D.20957>:
          D.20963 = sgen_ptr_in_nursery (__copy);
          if (D.20963 != 0) goto <D.20964>; else goto <D.20961>;
          <D.20964>:
          D.20965 = sgen_ptr_in_nursery (_objptr);
          if (D.20965 == 0) goto <D.20966>; else goto <D.20961>;
          <D.20966>:
          iftmp.90 = 1;
          goto <D.20962>;
          <D.20961>:
          iftmp.90 = 0;
          <D.20962>:
          D.20967 = iftmp.90 != 0;
          D.20968 = (long int) D.20967;
          D.20969 = __builtin_expect (D.20968, 0);
          if (D.20969 != 0) goto <D.20970>; else goto <D.20971>;
          <D.20970>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.20971>:
          goto <D.20972>;
          <D.20955>:
          if (0 != 0) goto <D.20973>; else goto <D.20974>;
          <D.20973>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.20974>:
          <D.20972>:
        }
        _objptr = _objptr + 4;
      }
      <D.19226>:
      if (_bmap != 0) goto <D.19225>; else goto <D.19227>;
      <D.19227>:
    }
    goto <D.19215>;
    <D.19228>:
    D.20975 = desc & 4294950912;
    if (D.20975 != 0) goto <D.20976>; else goto <D.20977>;
    <D.20976>:
    {
      int el_size;
      int etype;

      D.20978 = desc >> 3;
      D.20979 = (int) D.20978;
      el_size = D.20979 & 1023;
      desc.91 = (int) desc;
      etype = desc.91 & 49152;
      if (etype == 16384) goto <D.20981>; else goto <D.20982>;
      <D.20981>:
      {
        void * * p;
        void * * end_refs;

        p = start + 16;
        D.20983 = MEM[(struct MonoArray *)start].max_length;
        el_size.92 = (unsigned int) el_size;
        D.20985 = D.20983 * el_size.92;
        end_refs = p + D.20985;
        goto <D.19236>;
        <D.19235>:
        {
          void * __old;
          void * __copy;

          __old = *p;
          if (__old != 0B) goto <D.20986>; else goto <D.20987>;
          <D.20986>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (p, __old, queue);
          __copy = *p;
          if (0 != 0) goto <D.20988>; else goto <D.20989>;
          <D.20988>:
          if (__old != __copy) goto <D.20990>; else goto <D.20991>;
          <D.20990>:
          gc_debug_file.84 = gc_debug_file;
          D.20992 = *p;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", p, D.20992, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.20991>:
          <D.20989>:
          D.20996 = sgen_ptr_in_nursery (__copy);
          if (D.20996 != 0) goto <D.20997>; else goto <D.20994>;
          <D.20997>:
          D.20998 = sgen_ptr_in_nursery (p);
          if (D.20998 == 0) goto <D.20999>; else goto <D.20994>;
          <D.20999>:
          iftmp.93 = 1;
          goto <D.20995>;
          <D.20994>:
          iftmp.93 = 0;
          <D.20995>:
          D.21000 = iftmp.93 != 0;
          D.21001 = (long int) D.21000;
          D.21002 = __builtin_expect (D.21001, 0);
          if (D.21002 != 0) goto <D.21003>; else goto <D.21004>;
          <D.21003>:
          sgen_add_to_global_remset (p, __copy);
          <D.21004>:
          goto <D.21005>;
          <D.20987>:
          if (0 != 0) goto <D.21006>; else goto <D.21007>;
          <D.21006>:
          sgen_add_to_global_remset (p, __old);
          <D.21007>:
          <D.21005>:
        }
        p = p + 4;
        <D.19236>:
        if (p < end_refs) goto <D.19235>; else goto <D.19237>;
        <D.19237>:
      }
      goto <D.21008>;
      <D.20982>:
      if (etype == 32768) goto <D.21009>; else goto <D.21010>;
      <D.21009>:
      {
        int offset;
        int num_refs;
        char * e_start;
        char * e_end;

        D.20877 = desc >> 16;
        D.21011 = (int) D.20877;
        offset = D.21011 & 255;
        D.20880 = desc >> 24;
        num_refs = (int) D.20880;
        e_start = start + 16;
        D.20983 = MEM[(struct MonoArray *)start].max_length;
        el_size.92 = (unsigned int) el_size;
        D.20985 = D.20983 * el_size.92;
        e_end = e_start + D.20985;
        goto <D.19250>;
        <D.19249>:
        {
          void * * p;
          int i;

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

            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21016 = p + D.21015;
            __old = *D.21016;
            if (__old != 0B) goto <D.21017>; else goto <D.21018>;
            <D.21017>:
            __builtin_prefetch (__old);
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21016 = p + D.21015;
            major_copy_or_mark_object (D.21016, __old, queue);
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21016 = p + D.21015;
            __copy = *D.21016;
            if (0 != 0) goto <D.21019>; else goto <D.21020>;
            <D.21019>:
            if (__old != __copy) goto <D.21021>; else goto <D.21022>;
            <D.21021>:
            gc_debug_file.84 = gc_debug_file;
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21016 = p + D.21015;
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21016 = p + D.21015;
            D.21023 = *D.21016;
            fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", D.21016, D.21023, __old);
            gc_debug_file.84 = gc_debug_file;
            fflush (gc_debug_file.84);
            <D.21022>:
            <D.21020>:
            D.21027 = sgen_ptr_in_nursery (__copy);
            if (D.21027 != 0) goto <D.21028>; else goto <D.21025>;
            <D.21028>:
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21029 = p + D.21015;
            D.21030 = sgen_ptr_in_nursery (D.21029);
            if (D.21030 == 0) goto <D.21031>; else goto <D.21025>;
            <D.21031>:
            iftmp.96 = 1;
            goto <D.21026>;
            <D.21025>:
            iftmp.96 = 0;
            <D.21026>:
            D.21032 = iftmp.96 != 0;
            D.21033 = (long int) D.21032;
            D.21034 = __builtin_expect (D.21033, 0);
            if (D.21034 != 0) goto <D.21035>; else goto <D.21036>;
            <D.21035>:
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21037 = p + D.21015;
            sgen_add_to_global_remset (D.21037, __copy);
            <D.21036>:
            goto <D.21038>;
            <D.21018>:
            if (0 != 0) goto <D.21039>; else goto <D.21040>;
            <D.21039>:
            i.95 = (unsigned int) i;
            D.21015 = i.95 * 4;
            D.21037 = p + D.21015;
            sgen_add_to_global_remset (D.21037, __old);
            <D.21040>:
            <D.21038>:
          }
          i = i + 1;
          <D.19247>:
          if (i < num_refs) goto <D.19246>; else goto <D.19248>;
          <D.19248>:
          el_size.97 = (sizetype) el_size;
          e_start = e_start + el_size.97;
        }
        <D.19250>:
        if (e_start < e_end) goto <D.19249>; else goto <D.19251>;
        <D.19251>:
      }
      goto <D.21042>;
      <D.21010>:
      if (etype == 49152) goto <D.21043>; else goto <D.21044>;
      <D.21043>:
      {
        char * e_start;
        char * e_end;

        e_start = start + 16;
        D.20983 = MEM[(struct MonoArray *)start].max_length;
        el_size.92 = (unsigned int) el_size;
        D.20985 = D.20983 * el_size.92;
        e_end = e_start + D.20985;
        goto <D.19262>;
        <D.19261>:
        {
          void * * p;
          gsize _bmap;

          p = e_start;
          _bmap = desc >> 16;
          goto <D.19259>;
          <D.19258>:
          D.21045 = _bmap & 1;
          if (D.21045 != 0) goto <D.21046>; else goto <D.21047>;
          <D.21046>:
          {
            void * __old;
            void * __copy;

            __old = *p;
            if (__old != 0B) goto <D.21048>; else goto <D.21049>;
            <D.21048>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (p, __old, queue);
            __copy = *p;
            if (0 != 0) goto <D.21050>; else goto <D.21051>;
            <D.21050>:
            if (__old != __copy) goto <D.21052>; else goto <D.21053>;
            <D.21052>:
            gc_debug_file.84 = gc_debug_file;
            D.21054 = *p;
            fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", p, D.21054, __old);
            gc_debug_file.84 = gc_debug_file;
            fflush (gc_debug_file.84);
            <D.21053>:
            <D.21051>:
            D.21058 = sgen_ptr_in_nursery (__copy);
            if (D.21058 != 0) goto <D.21059>; else goto <D.21056>;
            <D.21059>:
            D.21060 = sgen_ptr_in_nursery (p);
            if (D.21060 == 0) goto <D.21061>; else goto <D.21056>;
            <D.21061>:
            iftmp.98 = 1;
            goto <D.21057>;
            <D.21056>:
            iftmp.98 = 0;
            <D.21057>:
            D.21062 = iftmp.98 != 0;
            D.21063 = (long int) D.21062;
            D.21064 = __builtin_expect (D.21063, 0);
            if (D.21064 != 0) goto <D.21065>; else goto <D.21066>;
            <D.21065>:
            sgen_add_to_global_remset (p, __copy);
            <D.21066>:
            goto <D.21067>;
            <D.21049>:
            if (0 != 0) goto <D.21068>; else goto <D.21069>;
            <D.21068>:
            sgen_add_to_global_remset (p, __old);
            <D.21069>:
            <D.21067>:
          }
          <D.21047>:
          _bmap = _bmap >> 1;
          p = p + 4;
          <D.19259>:
          if (_bmap != 0) goto <D.19258>; else goto <D.19260>;
          <D.19260>:
          el_size.97 = (sizetype) el_size;
          e_start = e_start + el_size.97;
        }
        <D.19262>:
        if (e_start < e_end) goto <D.19261>; else goto <D.19263>;
        <D.19263>:
      }
      <D.21044>:
      <D.21042>:
      <D.21008>:
    }
    <D.20977>:
    goto <D.19215>;
    <D.19264>:
    {
      void * * _objptr;
      gsize _bmap;

      _objptr = start;
      _bmap = desc >> 3;
      _objptr = _objptr + 8;
      goto <D.19270>;
      <D.19269>:
      D.21070 = _bmap & 1;
      if (D.21070 != 0) goto <D.21071>; else goto <D.21072>;
      <D.21071>:
      {
        void * __old;
        void * __copy;

        __old = *_objptr;
        if (__old != 0B) goto <D.21073>; else goto <D.21074>;
        <D.21073>:
        __builtin_prefetch (__old);
        major_copy_or_mark_object (_objptr, __old, queue);
        __copy = *_objptr;
        if (0 != 0) goto <D.21075>; else goto <D.21076>;
        <D.21075>:
        if (__old != __copy) goto <D.21077>; else goto <D.21078>;
        <D.21077>:
        gc_debug_file.84 = gc_debug_file;
        D.21079 = *_objptr;
        fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21079, __old);
        gc_debug_file.84 = gc_debug_file;
        fflush (gc_debug_file.84);
        <D.21078>:
        <D.21076>:
        D.21083 = sgen_ptr_in_nursery (__copy);
        if (D.21083 != 0) goto <D.21084>; else goto <D.21081>;
        <D.21084>:
        D.21085 = sgen_ptr_in_nursery (_objptr);
        if (D.21085 == 0) goto <D.21086>; else goto <D.21081>;
        <D.21086>:
        iftmp.99 = 1;
        goto <D.21082>;
        <D.21081>:
        iftmp.99 = 0;
        <D.21082>:
        D.21087 = iftmp.99 != 0;
        D.21088 = (long int) D.21087;
        D.21089 = __builtin_expect (D.21088, 0);
        if (D.21089 != 0) goto <D.21090>; else goto <D.21091>;
        <D.21090>:
        sgen_add_to_global_remset (_objptr, __copy);
        <D.21091>:
        goto <D.21092>;
        <D.21074>:
        if (0 != 0) goto <D.21093>; else goto <D.21094>;
        <D.21093>:
        sgen_add_to_global_remset (_objptr, __old);
        <D.21094>:
        <D.21092>:
      }
      <D.21072>:
      _bmap = _bmap >> 1;
      _objptr = _objptr + 4;
      <D.19270>:
      if (_bmap != 0) goto <D.19269>; else goto <D.19271>;
      <D.19271>:
    }
    goto <D.19215>;
    <D.19272>:
    {
      void * * _objptr;
      gsize * bitmap_data;
      int bwords;
      void * * start_run;

      _objptr = start;
      bitmap_data = sgen_get_complex_descriptor (desc);
      D.21095 = *bitmap_data;
      D.21096 = D.21095 + 4294967295;
      bwords = (int) D.21096;
      start_run = _objptr;
      bitmap_data = bitmap_data + 4;
      if (0 != 0) goto <D.21097>; else goto <D.21098>;
      <D.21097>:
      {
        struct MonoObject * myobj;

        myobj = start;
        D.21099 = myobj->vtable;
        D.21100 = D.21099->klass;
        D.21101 = D.21100->name_space;
        D.21099 = myobj->vtable;
        D.21100 = D.21099->klass;
        D.21102 = D.21100->name;
        monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", bwords, start, desc, D.21101, D.21102);
      }
      <D.21098>:
      goto <D.19285>;
      <D.19284>:
      {
        gsize _bmap;

        bitmap_data.100 = bitmap_data;
        bitmap_data = bitmap_data.100 + 4;
        _bmap = *bitmap_data.100;
        _objptr = start_run;
        goto <D.19282>;
        <D.19281>:
        D.21104 = _bmap & 1;
        if (D.21104 != 0) goto <D.21105>; else goto <D.21106>;
        <D.21105>:
        {
          void * __old;
          void * __copy;

          __old = *_objptr;
          if (__old != 0B) goto <D.21107>; else goto <D.21108>;
          <D.21107>:
          __builtin_prefetch (__old);
          major_copy_or_mark_object (_objptr, __old, queue);
          __copy = *_objptr;
          if (0 != 0) goto <D.21109>; else goto <D.21110>;
          <D.21109>:
          if (__old != __copy) goto <D.21111>; else goto <D.21112>;
          <D.21111>:
          gc_debug_file.84 = gc_debug_file;
          D.21113 = *_objptr;
          fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21113, __old);
          gc_debug_file.84 = gc_debug_file;
          fflush (gc_debug_file.84);
          <D.21112>:
          <D.21110>:
          D.21117 = sgen_ptr_in_nursery (__copy);
          if (D.21117 != 0) goto <D.21118>; else goto <D.21115>;
          <D.21118>:
          D.21119 = sgen_ptr_in_nursery (_objptr);
          if (D.21119 == 0) goto <D.21120>; else goto <D.21115>;
          <D.21120>:
          iftmp.101 = 1;
          goto <D.21116>;
          <D.21115>:
          iftmp.101 = 0;
          <D.21116>:
          D.21121 = iftmp.101 != 0;
          D.21122 = (long int) D.21121;
          D.21123 = __builtin_expect (D.21122, 0);
          if (D.21123 != 0) goto <D.21124>; else goto <D.21125>;
          <D.21124>:
          sgen_add_to_global_remset (_objptr, __copy);
          <D.21125>:
          goto <D.21126>;
          <D.21108>:
          if (0 != 0) goto <D.21127>; else goto <D.21128>;
          <D.21127>:
          sgen_add_to_global_remset (_objptr, __old);
          <D.21128>:
          <D.21126>:
        }
        <D.21106>:
        _bmap = _bmap >> 1;
        _objptr = _objptr + 4;
        <D.19282>:
        if (_bmap != 0) goto <D.19281>; else goto <D.19283>;
        <D.19283>:
        start_run = start_run + 128;
      }
      <D.19285>:
      bwords.102 = bwords;
      bwords = bwords.102 + -1;
      if (bwords.102 > 0) goto <D.19284>; else goto <D.19286>;
      <D.19286>:
    }
    goto <D.19215>;
    <D.19287>:
    {
      gsize * mbitmap_data;
      int mbwords;
      int el_size;
      char * e_start;
      char * e_end;

      D.21130 = vt->desc;
      mbitmap_data = sgen_get_complex_descriptor (D.21130);
      mbitmap_data.103 = mbitmap_data;
      mbitmap_data = mbitmap_data.103 + 4;
      D.21132 = *mbitmap_data.103;
      D.21133 = D.21132 + 4294967295;
      mbwords = (int) D.21133;
      D.21134 = vt->klass;
      el_size = mono_array_element_size (D.21134);
      e_start = start + 16;
      D.20983 = MEM[(struct MonoArray *)start].max_length;
      el_size.104 = (unsigned int) el_size;
      D.21136 = D.20983 * el_size.104;
      e_end = e_start + D.21136;
      if (0 != 0) goto <D.21137>; else goto <D.21138>;
      <D.21137>:
      D.21130 = vt->desc;
      D.21134 = vt->klass;
      D.21139 = D.21134->name_space;
      D.21134 = vt->klass;
      D.21140 = D.21134->name;
      monoeg_g_print ("found %d at %p (0x%zx): %s.%s\n", mbwords, start, D.21130, D.21139, D.21140);
      <D.21138>:
      goto <D.19307>;
      <D.19306>:
      {
        void * * _objptr;
        gsize * bitmap_data;
        unsigned int bwords;

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

          bitmap_data.105 = bitmap_data;
          bitmap_data = bitmap_data.105 + 4;
          _bmap = *bitmap_data.105;
          start_run = _objptr;
          goto <D.19301>;
          <D.19300>:
          D.21142 = _bmap & 1;
          if (D.21142 != 0) goto <D.21143>; else goto <D.21144>;
          <D.21143>:
          {
            void * __old;
            void * __copy;

            __old = *_objptr;
            if (__old != 0B) goto <D.21145>; else goto <D.21146>;
            <D.21145>:
            __builtin_prefetch (__old);
            major_copy_or_mark_object (_objptr, __old, queue);
            __copy = *_objptr;
            if (0 != 0) goto <D.21147>; else goto <D.21148>;
            <D.21147>:
            if (__old != __copy) goto <D.21149>; else goto <D.21150>;
            <D.21149>:
            gc_debug_file.84 = gc_debug_file;
            D.21151 = *_objptr;
            fprintf (gc_debug_file.84, "Overwrote field at %p with %p (was: %p)\n", _objptr, D.21151, __old);
            gc_debug_file.84 = gc_debug_file;
            fflush (gc_debug_file.84);
            <D.21150>:
            <D.21148>:
            D.21155 = sgen_ptr_in_nursery (__copy);
            if (D.21155 != 0) goto <D.21156>; else goto <D.21153>;
            <D.21156>:
            D.21157 = sgen_ptr_in_nursery (_objptr);
            if (D.21157 == 0) goto <D.21158>; else goto <D.21153>;
            <D.21158>:
            iftmp.106 = 1;
            goto <D.21154>;
            <D.21153>:
            iftmp.106 = 0;
            <D.21154>:
            D.21159 = iftmp.106 != 0;
            D.21160 = (long int) D.21159;
            D.21161 = __builtin_expect (D.21160, 0);
            if (D.21161 != 0) goto <D.21162>; else goto <D.21163>;
            <D.21162>:
            sgen_add_to_global_remset (_objptr, __copy);
            <D.21163>:
            goto <D.21164>;
            <D.21146>:
            if (0 != 0) goto <D.21165>; else goto <D.21166>;
            <D.21165>:
            sgen_add_to_global_remset (_objptr, __old);
            <D.21166>:
            <D.21164>:
          }
          <D.21144>:
          _bmap = _bmap >> 1;
          _objptr = _objptr + 4;
          <D.19301>:
          if (_bmap != 0) goto <D.19300>; else goto <D.19302>;
          <D.19302>:
          _objptr = start_run + 128;
        }
        <D.19304>:
        bwords.107 = bwords;
        bwords = bwords.107 + 4294967295;
        if (bwords.107 != 0) goto <D.19303>; else goto <D.19305>;
        <D.19305>:
        el_size.108 = (sizetype) el_size;
        e_start = e_start + el_size.108;
      }
      <D.19307>:
      if (e_start < e_end) goto <D.19306>; else goto <D.19308>;
      <D.19308>:
    }
    goto <D.19215>;
    <D.19309>:
    goto <D.19215>;
    <D.19310>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-scan-object.h", 111);
    <D.19215>:
  }
}


major_copy_or_mark_object (void * * ptr, void * obj, struct SgenGrayQueue * queue)
{
  int current_collection_generation.109;
  int D.21175;
  char * iftmp.110;
  unsigned int D.21179;
  unsigned int D.21180;
  unsigned int D.21183;
  unsigned int D.21187;
  int D.21190;
  _Bool D.21193;
  long int D.21194;
  long int D.21195;
  int D.21198;
  unsigned int obj.111;
  unsigned int D.21202;
  struct MSBlockHeader * D.21203;
  gboolean * evacuate_block_obj_sizes.112;
  unsigned int size_index.113;
  unsigned int D.21206;
  gboolean * D.21207;
  int obj.114;
  int obj.115;
  int D.21210;
  int D.21211;
  unsigned int D.21217;
  long int D.21218;
  long unsigned int D.21219;
  long unsigned int D.21220;
  long unsigned int D.21223;
  unsigned int D.21224;
  unsigned int D.21225;
  int iftmp.116;
  struct GrayQueueSection * D.21232;
  int D.21234;
  _Bool D.21235;
  long int D.21236;
  long int D.21237;
  int D.21241;
  int D.21242;
  int D.21243;
  unsigned int D.21251;
  long int D.21252;
  long unsigned int D.21253;
  long unsigned int D.21254;
  char * iftmp.117;
  unsigned int D.21262;
  unsigned int D.21263;
  unsigned int size_index.118;
  unsigned int D.21267;
  gboolean * D.21268;
  unsigned int D.21271;
  _Bool D.21273;
  long int D.21274;
  long int D.21275;
  unsigned int D.21278;
  unsigned int D.21286;
  long int D.21287;
  long unsigned int D.21288;
  long unsigned int D.21289;
  long unsigned int D.21292;
  int iftmp.119;
  _Bool D.21300;
  long int D.21301;
  long int D.21302;
  int D.21306;
  int D.21307;
  int D.21309;
  struct MonoVTable * D.21312;
  void * D.21313;
  unsigned int D.21314;
  int D.21315;
  int iftmp.120;
  _Bool D.21323;
  long int D.21324;
  long int D.21325;
  int D.21329;
  int D.21330;
  struct MSBlockInfo * block;
  void do_copy_object = <<< error >>>;

  if (0 != 0) goto <D.21170>; else goto <D.21171>;
  <D.21170>:
  monoeg_g_log (0B, 4, "null object from pointer %p", ptr);
  <D.19165>:
  goto <D.19165>;
  <D.21171>:
  if (0 != 0) goto <D.21172>; else goto <D.21173>;
  <D.21172>:
  current_collection_generation.109 = current_collection_generation;
  monoeg_g_log (0B, 4, "old gen parallel allocator called from a %d collection", current_collection_generation.109);
  <D.19166>:
  goto <D.19166>;
  <D.21173>:
  D.21175 = sgen_ptr_in_nursery (obj);
  if (D.21175 != 0) goto <D.21176>; else goto <D.21177>;
  <D.21176>:
  {
    int word;
    int bit;
    char * forwarded;
    char * old_obj;

    D.21179 = MEM[(mword *)obj];
    D.21180 = D.21179 & 1;
    if (D.21180 != 0) goto <D.21181>; else goto <D.21182>;
    <D.21181>:
    D.21179 = MEM[(mword *)obj];
    D.21183 = D.21179 & 4294967292;
    iftmp.110 = (char *) D.21183;
    goto <D.21184>;
    <D.21182>:
    iftmp.110 = 0B;
    <D.21184>:
    forwarded = iftmp.110;
    if (forwarded != 0B) goto <D.21185>; else goto <D.21186>;
    <D.21185>:
    *ptr = forwarded;
    return;
    <D.21186>:
    D.21179 = MEM[(mword *)obj];
    D.21187 = D.21179 & 2;
    if (D.21187 != 0) goto <D.21188>; else goto <D.21189>;
    <D.21188>:
    return;
    <D.21189>:
    D.21190 = sgen_nursery_is_to_space (obj);
    if (D.21190 != 0) goto <D.21191>; else goto <D.21192>;
    <D.21191>:
    return;
    <D.21192>:
    do_copy_object:
    old_obj = obj;
    obj = copy_object_no_checks (obj, queue);
    D.21193 = old_obj == obj;
    D.21194 = (long int) D.21193;
    D.21195 = __builtin_expect (D.21194, 0);
    if (D.21195 != 0) goto <D.21196>; else goto <D.21197>;
    <D.21196>:
    D.21198 = sgen_ptr_in_nursery (obj);
    if (D.21198 == 0) goto <D.21199>; else goto <D.21200>;
    <D.21199>:
    {
      int size_index;

      obj.111 = (unsigned int) obj;
      D.21202 = obj.111 & 4294950912;
      D.21203 = (struct MSBlockHeader *) D.21202;
      block = D.21203->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.112 = evacuate_block_obj_sizes;
      size_index.113 = (unsigned int) size_index;
      D.21206 = size_index.113 * 4;
      D.21207 = evacuate_block_obj_sizes.112 + D.21206;
      *D.21207 = 0;
      {
        int __word;
        int __bit;

        {
          int i;

          obj.114 = (int) obj;
          obj.115 = (int) obj;
          D.21210 = obj.115 & -16384;
          D.21211 = obj.114 - D.21210;
          i = D.21211 >> 3;
          if (1 != 0) goto <D.21212>; else goto <D.21213>;
          <D.21212>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.21214>;
          <D.21213>:
          __word = i >> 6;
          __bit = i & 63;
          <D.21214>:
        }
        if (0 != 0) goto <D.21215>; else goto <D.21216>;
        <D.21215>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.19176>:
        goto <D.19176>;
        <D.21216>:
        D.21217 = block->mark_words[__word];
        D.21218 = 1 << __bit;
        D.21219 = (long unsigned int) D.21218;
        D.21220 = D.21217 & D.21219;
        if (D.21220 == 0) goto <D.21221>; else goto <D.21222>;
        <D.21221>:
        D.21217 = block->mark_words[__word];
        D.21218 = 1 << __bit;
        D.21219 = (long unsigned int) D.21218;
        D.21223 = D.21217 | D.21219;
        block->mark_words[__word] = D.21223;
        D.21224 = BIT_FIELD_REF <*block, 32, 96>;
        D.21225 = D.21224 & 2;
        if (D.21225 != 0) goto <D.21226>; else goto <D.21227>;
        <D.21226>:
        D.21232 = queue->first;
        if (D.21232 == 0B) goto <D.21229>; else goto <D.21233>;
        <D.21233>:
        D.21232 = queue->first;
        D.21234 = D.21232->end;
        if (D.21234 == 125) goto <D.21229>; else goto <D.21230>;
        <D.21229>:
        iftmp.116 = 1;
        goto <D.21231>;
        <D.21230>:
        iftmp.116 = 0;
        <D.21231>:
        D.21235 = iftmp.116 != 0;
        D.21236 = (long int) D.21235;
        D.21237 = __builtin_expect (D.21236, 0);
        if (D.21237 != 0) goto <D.21238>; else goto <D.21239>;
        <D.21238>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.21240>;
        <D.21239>:
        D.21232 = queue->first;
        D.21232 = queue->first;
        D.21234 = D.21232->end;
        D.21241 = D.21234;
        D.21242 = D.21241 + 1;
        D.21232->end = D.21242;
        D.21232->objects[D.21241] = obj;
        <D.21240>:
        __builtin_prefetch (obj);
        <D.21227>:
        <D.21222>:
      }
    }
    <D.21200>:
    return;
    <D.21197>:
    *ptr = obj;
    D.21243 = sgen_ptr_in_nursery (obj);
    if (D.21243 == 0) goto <D.21244>; else goto <D.21245>;
    <D.21244>:
    obj.111 = (unsigned int) obj;
    D.21202 = obj.111 & 4294950912;
    D.21203 = (struct MSBlockHeader *) D.21202;
    block = D.21203->info;
    {
      int i;

      obj.114 = (int) obj;
      obj.115 = (int) obj;
      D.21210 = obj.115 & -16384;
      D.21211 = obj.114 - D.21210;
      i = D.21211 >> 3;
      if (1 != 0) goto <D.21246>; else goto <D.21247>;
      <D.21246>:
      word = i >> 5;
      bit = i & 31;
      goto <D.21248>;
      <D.21247>:
      word = i >> 6;
      bit = i & 63;
      <D.21248>:
    }
    if (0 != 0) goto <D.21249>; else goto <D.21250>;
    <D.21249>:
    monoeg_g_log (0B, 4, "object %p already marked", obj);
    <D.19178>:
    goto <D.19178>;
    <D.21250>:
    D.21251 = block->mark_words[word];
    D.21252 = 1 << bit;
    D.21253 = (long unsigned int) D.21252;
    D.21254 = D.21251 | D.21253;
    block->mark_words[word] = D.21254;
    <D.21245>:
  }
  goto <D.21255>;
  <D.21177>:
  {
    char * forwarded;
    mword objsize;

    D.21179 = MEM[(mword *)obj];
    D.21180 = D.21179 & 1;
    if (D.21180 != 0) goto <D.21257>; else goto <D.21258>;
    <D.21257>:
    D.21179 = MEM[(mword *)obj];
    D.21183 = D.21179 & 4294967292;
    iftmp.117 = (char *) D.21183;
    goto <D.21259>;
    <D.21258>:
    iftmp.117 = 0B;
    <D.21259>:
    forwarded = iftmp.117;
    if (forwarded != 0B) goto <D.21260>; else goto <D.21261>;
    <D.21260>:
    *ptr = forwarded;
    return;
    <D.21261>:
    D.21262 = sgen_safe_object_get_size (obj);
    D.21263 = D.21262 + 7;
    objsize = D.21263 & 4294967288;
    if (objsize <= 8000) goto <D.21264>; else goto <D.21265>;
    <D.21264>:
    {
      int size_index;
      gboolean evacuate;

      obj.111 = (unsigned int) obj;
      D.21202 = obj.111 & 4294950912;
      D.21203 = (struct MSBlockHeader *) D.21202;
      block = D.21203->info;
      size_index = block->obj_size_index;
      evacuate_block_obj_sizes.112 = evacuate_block_obj_sizes;
      size_index.118 = (unsigned int) size_index;
      D.21267 = size_index.118 * 4;
      D.21268 = evacuate_block_obj_sizes.112 + D.21267;
      evacuate = *D.21268;
      if (evacuate != 0) goto <D.21270>; else goto <D.21269>;
      <D.21270>:
      D.21224 = BIT_FIELD_REF <*block, 32, 96>;
      D.21271 = D.21224 & 4;
      if (D.21271 == 0) goto <D.21272>; else goto <D.21269>;
      <D.21272>:
      D.21179 = MEM[(mword *)obj];
      D.21187 = D.21179 & 2;
      D.21273 = D.21187 != 0;
      D.21274 = (long int) D.21273;
      D.21275 = __builtin_expect (D.21274, 0);
      if (D.21275 != 0) goto <D.21276>; else goto <D.21277>;
      <D.21276>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1425, "!SGEN_OBJECT_IS_PINNED (obj)");
      <D.21277>:
      D.21224 = BIT_FIELD_REF <*block, 32, 96>;
      D.21278 = D.21224 & 8;
      if (D.21278 != 0) goto <D.21279>; else goto <D.21280>;
      <D.21279>:
      return;
      <D.21280>:
      goto do_copy_object;
      <D.21269>:
      {
        int __word;
        int __bit;

        {
          int i;

          obj.114 = (int) obj;
          obj.115 = (int) obj;
          D.21210 = obj.115 & -16384;
          D.21211 = obj.114 - D.21210;
          i = D.21211 >> 3;
          if (1 != 0) goto <D.21281>; else goto <D.21282>;
          <D.21281>:
          __word = i >> 5;
          __bit = i & 31;
          goto <D.21283>;
          <D.21282>:
          __word = i >> 6;
          __bit = i & 63;
          <D.21283>:
        }
        if (0 != 0) goto <D.21284>; else goto <D.21285>;
        <D.21284>:
        monoeg_g_log (0B, 4, "object %p not allocated", obj);
        <D.19186>:
        goto <D.19186>;
        <D.21285>:
        D.21286 = block->mark_words[__word];
        D.21287 = 1 << __bit;
        D.21288 = (long unsigned int) D.21287;
        D.21289 = D.21286 & D.21288;
        if (D.21289 == 0) goto <D.21290>; else goto <D.21291>;
        <D.21290>:
        D.21286 = block->mark_words[__word];
        D.21287 = 1 << __bit;
        D.21288 = (long unsigned int) D.21287;
        D.21292 = D.21286 | D.21288;
        block->mark_words[__word] = D.21292;
        D.21224 = BIT_FIELD_REF <*block, 32, 96>;
        D.21225 = D.21224 & 2;
        if (D.21225 != 0) goto <D.21293>; else goto <D.21294>;
        <D.21293>:
        D.21232 = queue->first;
        if (D.21232 == 0B) goto <D.21296>; else goto <D.21299>;
        <D.21299>:
        D.21232 = queue->first;
        D.21234 = D.21232->end;
        if (D.21234 == 125) goto <D.21296>; else goto <D.21297>;
        <D.21296>:
        iftmp.119 = 1;
        goto <D.21298>;
        <D.21297>:
        iftmp.119 = 0;
        <D.21298>:
        D.21300 = iftmp.119 != 0;
        D.21301 = (long int) D.21300;
        D.21302 = __builtin_expect (D.21301, 0);
        if (D.21302 != 0) goto <D.21303>; else goto <D.21304>;
        <D.21303>:
        sgen_gray_object_enqueue (queue, obj);
        goto <D.21305>;
        <D.21304>:
        D.21232 = queue->first;
        D.21232 = queue->first;
        D.21234 = D.21232->end;
        D.21306 = D.21234;
        D.21307 = D.21306 + 1;
        D.21232->end = D.21307;
        D.21232->objects[D.21306] = obj;
        <D.21305>:
        __builtin_prefetch (obj);
        <D.21294>:
        <D.21291>:
      }
    }
    goto <D.21308>;
    <D.21265>:
    D.21309 = sgen_los_object_is_pinned (obj);
    if (D.21309 != 0) goto <D.21310>; else goto <D.21311>;
    <D.21310>:
    return;
    <D.21311>:
    sgen_los_pin_object (obj);
    D.21179 = MEM[(mword *)obj];
    D.21183 = D.21179 & 4294967292;
    D.21312 = (struct MonoVTable *) D.21183;
    D.21313 = D.21312->gc_descr;
    D.21314 = (unsigned int) D.21313;
    D.21315 = sgen_gc_descr_has_references (D.21314);
    if (D.21315 != 0) goto <D.21316>; else goto <D.21317>;
    <D.21316>:
    D.21232 = queue->first;
    if (D.21232 == 0B) goto <D.21319>; else goto <D.21322>;
    <D.21322>:
    D.21232 = queue->first;
    D.21234 = D.21232->end;
    if (D.21234 == 125) goto <D.21319>; else goto <D.21320>;
    <D.21319>:
    iftmp.120 = 1;
    goto <D.21321>;
    <D.21320>:
    iftmp.120 = 0;
    <D.21321>:
    D.21323 = iftmp.120 != 0;
    D.21324 = (long int) D.21323;
    D.21325 = __builtin_expect (D.21324, 0);
    if (D.21325 != 0) goto <D.21326>; else goto <D.21327>;
    <D.21326>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.21328>;
    <D.21327>:
    D.21232 = queue->first;
    D.21232 = queue->first;
    D.21234 = D.21232->end;
    D.21329 = D.21234;
    D.21330 = D.21329 + 1;
    D.21232->end = D.21330;
    D.21232->objects[D.21329] = obj;
    <D.21328>:
    __builtin_prefetch (obj);
    <D.21317>:
    <D.21308>:
  }
  <D.21255>:
}


sgen_nursery_is_to_space (char * object)
{
  int object.121;
  char * sgen_nursery_start.122;
  int sgen_nursery_start.123;
  int D.21335;
  int D.21336;
  _Bool D.21337;
  long int D.21338;
  long int D.21339;
  char * D.21342;
  char * D.21343;
  int sgen_space_bitmap_size.124;
  _Bool D.21345;
  long int D.21346;
  long int D.21347;
  gboolean D.21350;
  char * sgen_space_bitmap.125;
  sizetype byte.126;
  char * D.21353;
  char D.21354;
  int D.21355;
  int D.21356;
  int D.21357;
  _Bool D.21358;
  int idx;
  int byte;
  int bit;

  object.121 = (int) object;
  sgen_nursery_start.122 = sgen_nursery_start;
  sgen_nursery_start.123 = (int) sgen_nursery_start.122;
  D.21335 = object.121 - sgen_nursery_start.123;
  idx = D.21335 >> 9;
  byte = idx / 8;
  bit = idx & 7;
  D.21336 = sgen_ptr_in_nursery (object);
  D.21337 = D.21336 == 0;
  D.21338 = (long int) D.21337;
  D.21339 = __builtin_expect (D.21338, 0);
  if (D.21339 != 0) goto <D.21340>; else goto <D.21341>;
  <D.21340>:
  D.21342 = sgen_get_nursery_start ();
  D.21343 = sgen_get_nursery_end ();
  monoeg_g_log (0B, 4, "object %p is not in nursery [%p - %p]", object, D.21342, D.21343);
  <D.18216>:
  goto <D.18216>;
  <D.21341>:
  sgen_space_bitmap_size.124 = sgen_space_bitmap_size;
  D.21345 = byte >= sgen_space_bitmap_size.124;
  D.21346 = (long int) D.21345;
  D.21347 = __builtin_expect (D.21346, 0);
  if (D.21347 != 0) goto <D.21348>; else goto <D.21349>;
  <D.21348>:
  sgen_space_bitmap_size.124 = sgen_space_bitmap_size;
  monoeg_g_log (0B, 4, "byte index %d out of range", byte, sgen_space_bitmap_size.124);
  <D.18217>:
  goto <D.18217>;
  <D.21349>:
  sgen_space_bitmap.125 = sgen_space_bitmap;
  byte.126 = (sizetype) byte;
  D.21353 = sgen_space_bitmap.125 + byte.126;
  D.21354 = *D.21353;
  D.21355 = (int) D.21354;
  D.21356 = D.21355 >> bit;
  D.21357 = D.21356 & 1;
  D.21358 = D.21357 != 0;
  D.21350 = (gboolean) D.21358;
  return D.21350;
}


sgen_get_nursery_start ()
{
  char * D.21360;

  D.21360 = sgen_nursery_start;
  return D.21360;
}


sgen_get_nursery_end ()
{
  char * D.21362;

  D.21362 = sgen_nursery_end;
  return D.21362;
}


copy_object_no_checks (void * obj, struct SgenGrayQueue * queue)
{
  void * D.21364;
  unsigned int D.21365;
  unsigned int D.21366;
  unsigned int D.21367;
  char * (*<T2fa5>) (struct MonoVTable *, char *, size_t, gboolean) D.21368;
  _Bool D.21369;
  long int D.21370;
  long int D.21371;
  int D.21374;
  _Bool D.21378;
  long int D.21379;
  long int D.21380;
  void * D.21383;
  struct SgenGrayQueue * iftmp.127;
  unsigned int destination.128;
  unsigned int D.21389;
  struct MonoVTable * vt;
  gboolean has_references;
  mword objsize;
  char * destination;

  vt = MEM[(struct MonoObject *)obj].vtable;
  D.21364 = vt->gc_descr;
  D.21365 = (unsigned int) D.21364;
  has_references = sgen_gc_descr_has_references (D.21365);
  D.21366 = sgen_par_object_get_size (vt, obj);
  D.21367 = D.21366 + 7;
  objsize = D.21367 & 4294967288;
  D.21368 = sgen_minor_collector.alloc_for_promotion;
  destination = D.21368 (vt, obj, objsize, has_references);
  D.21369 = destination == 0B;
  D.21370 = (long int) D.21369;
  D.21371 = __builtin_expect (D.21370, 0);
  if (D.21371 != 0) goto <D.21372>; else goto <D.21373>;
  <D.21372>:
  D.21374 = sgen_ptr_in_nursery (obj);
  if (D.21374 != 0) goto <D.21375>; else goto <D.21376>;
  <D.21375>:
  sgen_pin_object (obj, queue);
  goto <D.21377>;
  <D.21376>:
  D.21378 = objsize > 8000;
  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>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-copy-object.h", 115, "objsize <= SGEN_MAX_SMALL_OBJ_SIZE");
  <D.21382>:
  pin_major_object (obj, queue);
  <D.21377>:
  sgen_set_pinned_from_failed_allocation (objsize);
  D.21383 = obj;
  return D.21383;
  <D.21373>:
  if (has_references != 0) goto <D.21385>; else goto <D.21386>;
  <D.21385>:
  iftmp.127 = queue;
  goto <D.21387>;
  <D.21386>:
  iftmp.127 = 0B;
  <D.21387>:
  par_copy_object_no_checks (destination, vt, obj, objsize, iftmp.127);
  destination.128 = (unsigned int) destination;
  D.21389 = destination.128 | 1;
  MEM[(mword *)obj] = D.21389;
  D.21383 = destination;
  return D.21383;
}


par_copy_object_no_checks (char * destination, struct MonoVTable * vt, void * obj, mword objsize, struct SgenGrayQueue * queue)
{
  struct MonoClass * D.21393;
  const char * D.21394;
  const char * D.21395;
  struct FILE * gc_debug_file.129;
  struct MonoVTable * D.21399;
  struct MonoClass * D.21400;
  const char * D.21401;
  unsigned int D.21404;
  const void * D.21405;
  mword * D.21406;
  unsigned int D.21407;
  mword * D.21408;
  unsigned int D.21409;
  mword * D.21410;
  unsigned int D.21411;
  mword * D.21412;
  unsigned int D.21413;
  mword * D.21414;
  unsigned int D.21415;
  mword * D.21416;
  unsigned int D.21417;
  mword * D.21418;
  unsigned int D.21419;
  void * D.21421;
  const void * D.21422;
  unsigned int D.21423;
  int iftmp.130;
  unsigned char D.21429;
  struct MonoArrayBounds * D.21431;
  _Bool D.21433;
  long int D.21434;
  long int D.21435;
  int D.21438;
  int obj.131;
  int D.21440;
  sizetype D.21441;
  struct MonoArrayBounds * D.21442;
  int D.21445;
  unsigned int D.21446;
  <unnamed type> mono_profiler_events.132;
  unsigned int D.21448;
  _Bool D.21449;
  long int D.21450;
  long int D.21451;
  const char * D.21458;
  int iftmp.133;
  struct GrayQueueSection * D.21463;
  int D.21465;
  _Bool D.21466;
  long int D.21467;
  long int D.21468;
  int D.21472;
  int D.21473;
  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.21391>; else goto <D.21392>;
  <D.21391>:
  D.21393 = vt->klass;
  D.21394 = D.21393->name_space;
  D.21393 = vt->klass;
  D.21395 = D.21393->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s was not initialized", vt, D.21394, D.21395);
  <D.19136>:
  goto <D.19136>;
  <D.21392>:
  if (0 != 0) goto <D.21396>; else goto <D.21397>;
  <D.21396>:
  gc_debug_file.129 = gc_debug_file;
  D.21399 = MEM[(struct MonoObject *)obj].vtable;
  D.21400 = D.21399->klass;
  D.21401 = D.21400->name;
  fprintf (gc_debug_file.129, " (to %p, %s size: %lu)\n", destination, D.21401, objsize);
  gc_debug_file.129 = gc_debug_file;
  fflush (gc_debug_file.129);
  <D.21397>:
  if (objsize <= 32) goto <D.21402>; else goto <D.21403>;
  <D.21402>:
  {
    mword * dest;

    dest = destination;
    D.21404 = objsize / 4;
    D.21405 = copy_labels[D.21404];
    goto D.21405;
    LAB_8:
    D.21406 = dest + 28;
    D.21407 = MEM[(mword *)obj + 28B];
    *D.21406 = D.21407;
    LAB_7:
    D.21408 = dest + 24;
    D.21409 = MEM[(mword *)obj + 24B];
    *D.21408 = D.21409;
    LAB_6:
    D.21410 = dest + 20;
    D.21411 = MEM[(mword *)obj + 20B];
    *D.21410 = D.21411;
    LAB_5:
    D.21412 = dest + 16;
    D.21413 = MEM[(mword *)obj + 16B];
    *D.21412 = D.21413;
    LAB_4:
    D.21414 = dest + 12;
    D.21415 = MEM[(mword *)obj + 12B];
    *D.21414 = D.21415;
    LAB_3:
    D.21416 = dest + 8;
    D.21417 = MEM[(mword *)obj + 8B];
    *D.21416 = D.21417;
    LAB_2:
    D.21418 = dest + 4;
    D.21419 = MEM[(mword *)obj + 4B];
    *D.21418 = D.21419;
    LAB_1:
    LAB_0:
  }
  goto <D.21420>;
  <D.21403>:
  D.21421 = destination + 4;
  D.21422 = obj + 4;
  D.21423 = objsize + 4294967292;
  mono_gc_memmove_aligned (D.21421, D.21422, D.21423);
  <D.21420>:
  if (0 != 0) goto <D.21424>; else goto <D.21425>;
  <D.21424>:
  D.21393 = vt->klass;
  D.21394 = D.21393->name_space;
  D.21393 = vt->klass;
  D.21395 = D.21393->name;
  monoeg_g_log (0B, 4, "vtable %p for class %s:%s has no gc descriptor", vt, D.21394, D.21395);
  <D.19138>:
  goto <D.19138>;
  <D.21425>:
  D.21429 = vt->rank;
  if (D.21429 != 0) goto <D.21430>; else goto <D.21427>;
  <D.21430>:
  D.21431 = MEM[(struct MonoArray *)obj].bounds;
  if (D.21431 != 0B) goto <D.21432>; else goto <D.21427>;
  <D.21432>:
  iftmp.130 = 1;
  goto <D.21428>;
  <D.21427>:
  iftmp.130 = 0;
  <D.21428>:
  D.21433 = iftmp.130 != 0;
  D.21434 = (long int) D.21433;
  D.21435 = __builtin_expect (D.21434, 0);
  if (D.21435 != 0) goto <D.21436>; else goto <D.21437>;
  <D.21436>:
  {
    struct MonoArray * array;

    array = destination;
    D.21431 = MEM[(struct MonoArray *)obj].bounds;
    D.21438 = (int) D.21431;
    obj.131 = (int) obj;
    D.21440 = D.21438 - obj.131;
    D.21441 = (sizetype) D.21440;
    D.21442 = destination + D.21441;
    array->bounds = D.21442;
    if (0 != 0) goto <D.21443>; else goto <D.21444>;
    <D.21443>:
    gc_debug_file.129 = gc_debug_file;
    D.21429 = vt->rank;
    D.21445 = (int) D.21429;
    D.21446 = mono_array_length (array);
    fprintf (gc_debug_file.129, "Array instance %p: size: %lu, rank: %d, length: %lu\n", array, objsize, D.21445, D.21446);
    gc_debug_file.129 = gc_debug_file;
    fflush (gc_debug_file.129);
    <D.21444>:
  }
  <D.21437>:
  mono_profiler_events.132 = mono_profiler_events;
  D.21448 = mono_profiler_events.132 & 524288;
  D.21449 = D.21448 != 0;
  D.21450 = (long int) D.21449;
  D.21451 = __builtin_expect (D.21450, 0);
  if (D.21451 != 0) goto <D.21452>; else goto <D.21453>;
  <D.21452>:
  sgen_register_moved_object (obj, destination);
  <D.21453>:
  obj = destination;
  if (queue != 0B) goto <D.21454>; else goto <D.21455>;
  <D.21454>:
  if (0 != 0) goto <D.21456>; else goto <D.21457>;
  <D.21456>:
  gc_debug_file.129 = gc_debug_file;
  D.21458 = sgen_safe_name (obj);
  fprintf (gc_debug_file.129, "Enqueuing gray object %p (%s)\n", obj, D.21458);
  gc_debug_file.129 = gc_debug_file;
  fflush (gc_debug_file.129);
  <D.21457>:
  D.21463 = queue->first;
  if (D.21463 == 0B) goto <D.21460>; else goto <D.21464>;
  <D.21464>:
  D.21463 = queue->first;
  D.21465 = D.21463->end;
  if (D.21465 == 125) goto <D.21460>; else goto <D.21461>;
  <D.21460>:
  iftmp.133 = 1;
  goto <D.21462>;
  <D.21461>:
  iftmp.133 = 0;
  <D.21462>:
  D.21466 = iftmp.133 != 0;
  D.21467 = (long int) D.21466;
  D.21468 = __builtin_expect (D.21467, 0);
  if (D.21468 != 0) goto <D.21469>; else goto <D.21470>;
  <D.21469>:
  sgen_gray_object_enqueue (queue, obj);
  goto <D.21471>;
  <D.21470>:
  D.21463 = queue->first;
  D.21463 = queue->first;
  D.21465 = D.21463->end;
  D.21472 = D.21465;
  D.21473 = D.21472 + 1;
  D.21463->end = D.21473;
  D.21463->objects[D.21472] = obj;
  <D.21471>:
  __builtin_prefetch (obj);
  <D.21455>:
}


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

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


major_describe_pointer (char * ptr)
{
  char * D.21479;
  char * D.21481;
  int gc_debug_level.135;
  _Bool D.21483;
  long int D.21484;
  long int D.21485;
  struct FILE * gc_debug_file.136;
  int D.21489;
  <unnamed-unsigned:1> D.21490;
  int D.21491;
  <unnamed-unsigned:1> D.21492;
  int D.21493;
  int ptr.137;
  char * D.21495;
  int D.21496;
  int D.21497;
  int D.21498;
  sizetype D.21499;
  sizetype D.21500;
  int iftmp.138;
  void * D.21505;
  char * D.21507;
  struct MonoVTable * iftmp.139;
  unsigned int D.21512;
  unsigned int D.21513;
  int obj.140;
  int obj.141;
  int D.21517;
  int D.21518;
  unsigned int D.21522;
  long int D.21523;
  long unsigned int D.21524;
  long unsigned int D.21525;
  int D.21542;
  _Bool D.21548;
  int D.21549;
  struct MonoVTable * D.21550;
  struct MSBlockInfo * block;

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

    D.21479 = block->block;
    if (D.21479 > ptr) goto <D.21477>; else goto <D.21480>;
    <D.21480>:
    D.21479 = block->block;
    D.21481 = D.21479 + 16384;
    if (D.21481 <= ptr) goto <D.21477>; else goto <D.21478>;
    <D.21477>:
    // predicted unlikely by continue predictor.
    goto <D.19066>;
    <D.21478>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21486>; else goto <D.21487>;
    <D.21486>:
    gc_debug_file.136 = gc_debug_file;
    D.21479 = block->block;
    D.21489 = block->obj_size;
    D.21490 = block->pinned;
    D.21491 = (int) D.21490;
    D.21492 = block->has_references;
    D.21493 = (int) D.21492;
    fprintf (gc_debug_file.136, "major-ptr (block %p sz %d pin %d ref %d)\n\n", D.21479, D.21489, D.21491, D.21493);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21487>:
    ptr.137 = (int) ptr;
    D.21479 = block->block;
    D.21495 = D.21479 + 16;
    D.21496 = (int) D.21495;
    D.21497 = ptr.137 - D.21496;
    D.21489 = block->obj_size;
    idx = D.21497 / D.21489;
    D.21479 = block->block;
    D.21489 = block->obj_size;
    D.21498 = D.21489 * idx;
    D.21499 = (sizetype) D.21498;
    D.21500 = D.21499 + 16;
    obj = D.21479 + D.21500;
    D.21505 = MEM[(void * *)obj];
    if (D.21505 != 0B) goto <D.21506>; else goto <D.21502>;
    <D.21506>:
    D.21507 = MEM[(char * *)obj];
    D.21479 = block->block;
    if (D.21507 < D.21479) goto <D.21503>; else goto <D.21508>;
    <D.21508>:
    D.21507 = MEM[(char * *)obj];
    D.21479 = block->block;
    D.21481 = D.21479 + 16384;
    if (D.21507 >= D.21481) goto <D.21503>; else goto <D.21502>;
    <D.21503>:
    iftmp.138 = 1;
    goto <D.21504>;
    <D.21502>:
    iftmp.138 = 0;
    <D.21504>:
    live = iftmp.138;
    if (live != 0) goto <D.21510>; else goto <D.21511>;
    <D.21510>:
    D.21512 = MEM[(mword *)obj];
    D.21513 = D.21512 & 4294967292;
    iftmp.139 = (struct MonoVTable *) D.21513;
    goto <D.21514>;
    <D.21511>:
    iftmp.139 = 0B;
    <D.21514>:
    vtable = iftmp.139;
    {
      int i;

      obj.140 = (int) obj;
      obj.141 = (int) obj;
      D.21517 = obj.141 & -16384;
      D.21518 = obj.140 - D.21517;
      i = D.21518 >> 3;
      if (1 != 0) goto <D.21519>; else goto <D.21520>;
      <D.21519>:
      w = i >> 5;
      b = i & 31;
      goto <D.21521>;
      <D.21520>:
      w = i >> 6;
      b = i & 63;
      <D.21521>:
    }
    D.21522 = block->mark_words[w];
    D.21523 = 1 << b;
    D.21524 = (long unsigned int) D.21523;
    D.21525 = D.21522 & D.21524;
    marked = (gboolean) D.21525;
    if (obj == ptr) goto <D.21526>; else goto <D.21527>;
    <D.21526>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21528>; else goto <D.21529>;
    <D.21528>:
    gc_debug_file.136 = gc_debug_file;
    fprintf (gc_debug_file.136, "\t(\n");
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21529>:
    if (live != 0) goto <D.21530>; else goto <D.21531>;
    <D.21530>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21532>; else goto <D.21533>;
    <D.21532>:
    gc_debug_file.136 = gc_debug_file;
    fprintf (gc_debug_file.136, "object\n");
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21533>:
    goto <D.21534>;
    <D.21531>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21535>; else goto <D.21536>;
    <D.21535>:
    gc_debug_file.136 = gc_debug_file;
    fprintf (gc_debug_file.136, "dead-object\n");
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21536>:
    <D.21534>:
    goto <D.21537>;
    <D.21527>:
    if (live != 0) goto <D.21538>; else goto <D.21539>;
    <D.21538>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21540>; else goto <D.21541>;
    <D.21540>:
    gc_debug_file.136 = gc_debug_file;
    ptr.137 = (int) ptr;
    obj.140 = (int) obj;
    D.21542 = ptr.137 - obj.140;
    fprintf (gc_debug_file.136, "interior-ptr offset %td\n", D.21542);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21541>:
    goto <D.21543>;
    <D.21539>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21544>; else goto <D.21545>;
    <D.21544>:
    gc_debug_file.136 = gc_debug_file;
    ptr.137 = (int) ptr;
    obj.140 = (int) obj;
    D.21542 = ptr.137 - obj.140;
    fprintf (gc_debug_file.136, "dead-interior-ptr offset %td\n", D.21542);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21545>:
    <D.21543>:
    <D.21537>:
    gc_debug_level.135 = gc_debug_level;
    D.21483 = gc_debug_level.135 >= 0;
    D.21484 = (long int) D.21483;
    D.21485 = __builtin_expect (D.21484, 0);
    if (D.21485 != 0) goto <D.21546>; else goto <D.21547>;
    <D.21546>:
    gc_debug_file.136 = gc_debug_file;
    D.21548 = marked != 0;
    D.21549 = (int) D.21548;
    fprintf (gc_debug_file.136, " marked %d)\n\n", D.21549);
    gc_debug_file.136 = gc_debug_file;
    fflush (gc_debug_file.136);
    <D.21547>:
    D.21550 = vtable;
    return D.21550;
  }
  <D.19066>:
  block = block->next;
  <D.19069>:
  if (block != 0B) goto <D.19068>; else goto <D.19070>;
  <D.19070>:
  D.21550 = 0B;
  return D.21550;
}


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

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


major_is_valid_object (char * object)
{
  char * D.21556;
  char * D.21558;
  int object.142;
  char * D.21560;
  int D.21561;
  int D.21562;
  int D.21563;
  int D.21564;
  sizetype D.21565;
  sizetype D.21566;
  gboolean D.21569;
  int iftmp.143;
  void * D.21574;
  char * D.21576;
  struct MSBlockInfo * block;

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

    D.21556 = block->block;
    if (D.21556 > object) goto <D.21554>; else goto <D.21557>;
    <D.21557>:
    D.21556 = block->block;
    D.21558 = D.21556 + 16384;
    if (D.21558 <= object) goto <D.21554>; else goto <D.21555>;
    <D.21554>:
    // predicted unlikely by continue predictor.
    goto <D.19051>;
    <D.21555>:
    object.142 = (int) object;
    D.21556 = block->block;
    D.21560 = D.21556 + 16;
    D.21561 = (int) D.21560;
    D.21562 = object.142 - D.21561;
    D.21563 = block->obj_size;
    idx = D.21562 / D.21563;
    D.21556 = block->block;
    D.21563 = block->obj_size;
    D.21564 = D.21563 * idx;
    D.21565 = (sizetype) D.21564;
    D.21566 = D.21565 + 16;
    obj = D.21556 + D.21566;
    if (obj != object) goto <D.21567>; else goto <D.21568>;
    <D.21567>:
    D.21569 = 0;
    return D.21569;
    <D.21568>:
    D.21574 = MEM[(void * *)obj];
    if (D.21574 != 0B) goto <D.21575>; else goto <D.21571>;
    <D.21575>:
    D.21576 = MEM[(char * *)obj];
    D.21556 = block->block;
    if (D.21576 < D.21556) goto <D.21572>; else goto <D.21577>;
    <D.21577>:
    D.21576 = MEM[(char * *)obj];
    D.21556 = block->block;
    D.21558 = D.21556 + 16384;
    if (D.21576 >= D.21558) goto <D.21572>; else goto <D.21571>;
    <D.21572>:
    iftmp.143 = 1;
    goto <D.21573>;
    <D.21571>:
    iftmp.143 = 0;
    <D.21573>:
    D.21569 = iftmp.143;
    return D.21569;
  }
  <D.19051>:
  block = block->next;
  <D.19053>:
  if (block != 0B) goto <D.19052>; else goto <D.19054>;
  <D.19054>:
  D.21569 = 0;
  return D.21569;
}


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

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


major_print_gc_param_usage ()
{
  struct _IO_FILE * stderr.145;

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


major_handle_gc_param (const char * opt)
{
  int D.21581;
  char * D.21584;
  unsigned int percentage.146;
  struct _IO_FILE * stderr.147;
  float D.21589;
  float evacuation_threshold.148;
  gboolean D.21591;
  int D.19758;
  int iftmp.149;
  int D.19757;
  const char[11] * D.21595;
  unsigned char D.21596;
  int D.21597;
  unsigned char D.21598;
  int D.21599;
  const unsigned char * D.21604;
  unsigned char D.21605;
  int D.21606;
  const unsigned char * D.21607;
  unsigned char D.21608;
  int D.21609;
  const unsigned char * D.21614;
  unsigned char D.21615;
  int D.21616;
  const unsigned char * D.21617;
  unsigned char D.21618;
  int D.21619;
  const unsigned char * D.21624;
  unsigned char D.21625;
  int D.21626;
  const unsigned char * D.21627;
  unsigned char D.21628;
  int D.21629;
  int D.19767;
  int iftmp.150;
  int D.19766;
  const char[14] * D.21636;
  unsigned char D.21637;
  int D.21638;
  unsigned char D.21639;
  int D.21640;
  const unsigned char * D.21645;
  unsigned char D.21646;
  int D.21647;
  const unsigned char * D.21648;
  unsigned char D.21649;
  int D.21650;
  const unsigned char * D.21655;
  unsigned char D.21656;
  int D.21657;
  const unsigned char * D.21658;
  unsigned char D.21659;
  int D.21660;
  const unsigned char * D.21665;
  unsigned char D.21666;
  int D.21667;
  const unsigned char * D.21668;
  unsigned char D.21669;
  int D.21670;

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

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

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

      __s2 = opt;
      D.21595 = "lazy-sweep";
      D.21596 = MEM[(const unsigned char *)D.21595];
      D.21597 = (int) D.21596;
      D.21598 = *__s2;
      D.21599 = (int) D.21598;
      __result = D.21597 - D.21599;
      {
        if (__s2_len != 0) goto <D.21600>; else goto <D.21601>;
        <D.21600>:
        if (__result == 0) goto <D.21602>; else goto <D.21603>;
        <D.21602>:
        D.21604 = &MEM[(void *)"lazy-sweep" + 1B];
        D.21605 = *D.21604;
        D.21606 = (int) D.21605;
        D.21607 = __s2 + 1;
        D.21608 = *D.21607;
        D.21609 = (int) D.21608;
        __result = D.21606 - D.21609;
        if (__s2_len > 1) goto <D.21610>; else goto <D.21611>;
        <D.21610>:
        if (__result == 0) goto <D.21612>; else goto <D.21613>;
        <D.21612>:
        D.21614 = &MEM[(void *)"lazy-sweep" + 2B];
        D.21615 = *D.21614;
        D.21616 = (int) D.21615;
        D.21617 = __s2 + 2;
        D.21618 = *D.21617;
        D.21619 = (int) D.21618;
        __result = D.21616 - D.21619;
        if (__s2_len > 2) goto <D.21620>; else goto <D.21621>;
        <D.21620>:
        if (__result == 0) goto <D.21622>; else goto <D.21623>;
        <D.21622>:
        D.21624 = &MEM[(void *)"lazy-sweep" + 3B];
        D.21625 = *D.21624;
        D.21626 = (int) D.21625;
        D.21627 = __s2 + 3;
        D.21628 = *D.21627;
        D.21629 = (int) D.21628;
        __result = D.21626 - D.21629;
        <D.21623>:
        <D.21621>:
        <D.21613>:
        <D.21611>:
        <D.21603>:
        <D.21601>:
      }
      D.19757 = __result;
    }
    iftmp.149 = -D.19757;
    goto <D.21630>;
    <D.21594>:
    iftmp.149 = __builtin_strcmp (opt, "lazy-sweep");
    <D.21630>:
    D.19758 = iftmp.149;
  }
  if (D.19758 == 0) goto <D.21631>; else goto <D.21632>;
  <D.21631>:
  lazy_sweep = 1;
  D.21591 = 1;
  return D.21591;
  <D.21632>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = opt;
      D.21636 = "no-lazy-sweep";
      D.21637 = MEM[(const unsigned char *)D.21636];
      D.21638 = (int) D.21637;
      D.21639 = *__s2;
      D.21640 = (int) D.21639;
      __result = D.21638 - D.21640;
      {
        if (__s2_len != 0) goto <D.21641>; else goto <D.21642>;
        <D.21641>:
        if (__result == 0) goto <D.21643>; else goto <D.21644>;
        <D.21643>:
        D.21645 = &MEM[(void *)"no-lazy-sweep" + 1B];
        D.21646 = *D.21645;
        D.21647 = (int) D.21646;
        D.21648 = __s2 + 1;
        D.21649 = *D.21648;
        D.21650 = (int) D.21649;
        __result = D.21647 - D.21650;
        if (__s2_len > 1) goto <D.21651>; else goto <D.21652>;
        <D.21651>:
        if (__result == 0) goto <D.21653>; else goto <D.21654>;
        <D.21653>:
        D.21655 = &MEM[(void *)"no-lazy-sweep" + 2B];
        D.21656 = *D.21655;
        D.21657 = (int) D.21656;
        D.21658 = __s2 + 2;
        D.21659 = *D.21658;
        D.21660 = (int) D.21659;
        __result = D.21657 - D.21660;
        if (__s2_len > 2) goto <D.21661>; else goto <D.21662>;
        <D.21661>:
        if (__result == 0) goto <D.21663>; else goto <D.21664>;
        <D.21663>:
        D.21665 = &MEM[(void *)"no-lazy-sweep" + 3B];
        D.21666 = *D.21665;
        D.21667 = (int) D.21666;
        D.21668 = __s2 + 3;
        D.21669 = *D.21668;
        D.21670 = (int) D.21669;
        __result = D.21667 - D.21670;
        <D.21664>:
        <D.21662>:
        <D.21654>:
        <D.21652>:
        <D.21644>:
        <D.21642>:
      }
      D.19766 = __result;
    }
    iftmp.150 = -D.19766;
    goto <D.21671>;
    <D.21635>:
    iftmp.150 = __builtin_strcmp (opt, "no-lazy-sweep");
    <D.21671>:
    D.19767 = iftmp.150;
  }
  if (D.19767 == 0) goto <D.21672>; else goto <D.21673>;
  <D.21672>:
  lazy_sweep = 0;
  D.21591 = 1;
  return D.21591;
  <D.21673>:
  D.21591 = 0;
  return D.21591;
}


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

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


get_num_major_sections ()
{
  int D.21677;

  D.21677 = num_major_sections;
  return D.21677;
}


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.21679;
  char * D.21682;
  gboolean D.21685;
  <unnamed-unsigned:1> D.21686;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.18947>;
  <D.18946>:
  D.21679 = block->block;
  if (D.21679 <= ptr) goto <D.21680>; else goto <D.21681>;
  <D.21680>:
  D.21679 = block->block;
  D.21682 = D.21679 + 16384;
  if (D.21682 >= ptr) goto <D.21683>; else goto <D.21684>;
  <D.21683>:
  D.21686 = block->pinned;
  D.21685 = (gboolean) D.21686;
  return D.21685;
  <D.21684>:
  <D.21681>:
  block = block->next;
  <D.18947>:
  if (block != 0B) goto <D.18946>; else goto <D.18948>;
  <D.18948>:
  D.21685 = 0;
  return D.21685;
}


major_ptr_is_in_non_pinned_space (char * ptr, char * * start)
{
  char * D.21688;
  char * D.21691;
  int D.21694;
  int D.21695;
  sizetype D.21696;
  sizetype D.21697;
  char * D.21698;
  int D.21701;
  int D.21702;
  sizetype D.21703;
  sizetype D.21704;
  char * D.21705;
  gboolean D.21708;
  unsigned int D.21709;
  unsigned int D.21710;
  _Bool D.21711;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19026>;
  <D.19025>:
  D.21688 = block->block;
  if (D.21688 <= ptr) goto <D.21689>; else goto <D.21690>;
  <D.21689>:
  D.21688 = block->block;
  D.21691 = D.21688 + 16384;
  if (D.21691 >= ptr) goto <D.21692>; else goto <D.21693>;
  <D.21692>:
  {
    int count;
    int i;

    D.21694 = block->obj_size;
    count = 16368 / D.21694;
    *start = 0B;
    i = 0;
    goto <D.19024>;
    <D.19023>:
    D.21688 = block->block;
    D.21694 = block->obj_size;
    D.21695 = D.21694 * i;
    D.21696 = (sizetype) D.21695;
    D.21697 = D.21696 + 16;
    D.21698 = D.21688 + D.21697;
    if (D.21698 <= ptr) goto <D.21699>; else goto <D.21700>;
    <D.21699>:
    D.21688 = block->block;
    D.21694 = block->obj_size;
    D.21701 = i + 1;
    D.21702 = D.21694 * D.21701;
    D.21703 = (sizetype) D.21702;
    D.21704 = D.21703 + 16;
    D.21705 = D.21688 + D.21704;
    if (D.21705 > ptr) goto <D.21706>; else goto <D.21707>;
    <D.21706>:
    D.21688 = block->block;
    D.21694 = block->obj_size;
    D.21695 = D.21694 * i;
    D.21696 = (sizetype) D.21695;
    D.21697 = D.21696 + 16;
    D.21698 = D.21688 + D.21697;
    *start = D.21698;
    goto <D.19022>;
    <D.21707>:
    <D.21700>:
    i = i + 1;
    <D.19024>:
    if (i <= count) goto <D.19023>; else goto <D.19022>;
    <D.19022>:
    D.21709 = BIT_FIELD_REF <*block, 32, 96>;
    D.21710 = D.21709 & 1;
    D.21711 = D.21710 == 0;
    D.21708 = (gboolean) D.21711;
    return D.21708;
  }
  <D.21693>:
  <D.21690>:
  block = block->next;
  <D.19026>:
  if (block != 0B) goto <D.19025>; else goto <D.19027>;
  <D.19027>:
  D.21708 = 0;
  return D.21708;
}


major_have_computer_minor_collection_allowance ()
{
  unsigned int D.21713;
  unsigned int D.21714;
  int have_swept.151;
  _Bool D.21716;
  long int D.21717;
  long int D.21718;
  int num_empty_blocks.152;
  _Bool D.21724;
  long int D.21725;
  long int D.21726;
  unsigned int num_empty_blocks_orig.153;
  unsigned int D.21730;
  int i.154;
  unsigned int i.155;
  unsigned int D.21734;
  void * * D.21735;
  _Bool D.21736;
  long int D.21737;
  long int D.21738;
  unsigned int num_empty_blocks.156;
  unsigned int i.157;
  unsigned int D.21743;
  void * * D.21744;
  _Bool D.21745;
  long int D.21746;
  long int D.21747;
  unsigned int dest.158;
  unsigned int D.21753;
  void * * D.21754;
  int iftmp.159;
  _Bool D.21762;
  long int D.21763;
  long int D.21764;
  sizetype d.160;
  sizetype D.21768;
  sizetype D.21769;
  void * * D.21770;
  void * D.21771;
  char * D.21772;
  int D.21775;
  int D.21776;
  unsigned int first.161;
  unsigned int D.21780;
  void * * D.21781;
  void * D.21782;
  int D.21783;
  unsigned int D.21784;
  unsigned int j.162;
  unsigned int D.21786;
  void * * D.21787;
  int num_empty_blocks.163;
  long long int D.21789;
  long long int stat_major_blocks_freed.164;
  long long int stat_major_blocks_freed.165;
  long long int stat_major_blocks_freed_ideal.166;
  long long int stat_major_blocks_freed_ideal.167;
  long long int stat_major_blocks_freed_less_ideal.168;
  long long int stat_major_blocks_freed_less_ideal.169;
  int iftmp.170;
  _Bool D.21804;
  long int D.21805;
  long int D.21806;
  _Bool D.21809;
  long int D.21810;
  long int D.21811;
  _Bool D.21815;
  long int D.21816;
  long int D.21817;
  _Bool D.21820;
  long int D.21821;
  long int D.21822;
  int num_major_sections.171;
  void * empty_blocks.172;
  int num_empty_blocks.173;
  long long int stat_major_blocks_freed.174;
  long long int stat_major_blocks_freed_individual.175;
  long long int stat_major_blocks_freed_individual.176;
  int section_reserve;
  void fallback = <<< error >>>;

  D.21713 = sgen_get_minor_collection_allowance ();
  D.21714 = D.21713 / 16384;
  section_reserve = (int) D.21714;
  have_swept.151 = have_swept;
  D.21716 = have_swept.151 == 0;
  D.21717 = (long int) D.21716;
  D.21718 = __builtin_expect (D.21717, 0);
  if (D.21718 != 0) goto <D.21719>; else goto <D.21720>;
  <D.21719>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1898, "have_swept");
  <D.21720>:
  {
    int i;
    int num_empty_blocks_orig;
    int num_blocks;
    int arr_length;
    void * block;
    void * * empty_block_arr;
    void * * rebuild_next;

    num_empty_blocks.152 = num_empty_blocks;
    if (num_empty_blocks.152 <= section_reserve) goto <D.21722>; else goto <D.21723>;
    <D.21722>:
    return;
    <D.21723>:
    num_empty_blocks.152 = num_empty_blocks;
    D.21724 = num_empty_blocks.152 <= 0;
    D.21725 = (long int) D.21724;
    D.21726 = __builtin_expect (D.21725, 0);
    if (D.21726 != 0) goto <D.21727>; else goto <D.21728>;
    <D.21727>:
    monoeg_g_log (0B, 4, "section reserve can\'t be negative");
    <D.19674>:
    goto <D.19674>;
    <D.21728>:
    num_empty_blocks_orig = num_empty_blocks;
    num_empty_blocks_orig.153 = (unsigned int) num_empty_blocks_orig;
    D.21730 = num_empty_blocks_orig.153 * 4;
    empty_block_arr = sgen_alloc_internal_dynamic (D.21730, 17, 0);
    if (empty_block_arr == 0B) goto fallback; else goto <D.21731>;
    <D.21731>:
    i = 0;
    block = empty_blocks;
    goto <D.19677>;
    <D.19676>:
    i.154 = i;
    i = i.154 + 1;
    i.155 = (unsigned int) i.154;
    D.21734 = i.155 * 4;
    D.21735 = empty_block_arr + D.21734;
    *D.21735 = block;
    block = MEM[(void * *)block];
    <D.19677>:
    if (block != 0B) goto <D.19676>; else goto <D.19678>;
    <D.19678>:
    num_empty_blocks.152 = num_empty_blocks;
    D.21736 = i != num_empty_blocks.152;
    D.21737 = (long int) D.21736;
    D.21738 = __builtin_expect (D.21737, 0);
    if (D.21738 != 0) goto <D.21739>; else goto <D.21740>;
    <D.21739>:
    monoeg_g_log (0B, 4, "empty block count wrong");
    <D.19679>:
    goto <D.19679>;
    <D.21740>:
    num_empty_blocks.152 = num_empty_blocks;
    num_empty_blocks.156 = (unsigned int) num_empty_blocks.152;
    sgen_qsort (empty_block_arr, num_empty_blocks.156, 4, compare_pointers);
    arr_length = num_empty_blocks_orig;
    num_blocks = 32;
    goto <D.19697>;
    <D.19696>:
    {
      int first;
      int dest;

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

        d = dest;
        i.157 = (unsigned int) i;
        D.21743 = i.157 * 4;
        D.21744 = empty_block_arr + D.21743;
        block = *D.21744;
        D.21745 = block == 0B;
        D.21746 = (long int) D.21745;
        D.21747 = __builtin_expect (D.21746, 0);
        if (D.21747 != 0) goto <D.21748>; else goto <D.21749>;
        <D.21748>:
        monoeg_g_log (0B, 4, "we\'re not shifting correctly");
        <D.19684>:
        goto <D.19684>;
        <D.21749>:
        if (i != dest) goto <D.21750>; else goto <D.21751>;
        <D.21750>:
        dest.158 = (unsigned int) dest;
        D.21753 = dest.158 * 4;
        D.21754 = empty_block_arr + D.21753;
        *D.21754 = block;
        i.157 = (unsigned int) i;
        D.21743 = i.157 * 4;
        D.21744 = empty_block_arr + D.21743;
        *D.21744 = 0B;
        <D.21751>:
        dest = dest + 1;
        if (first < 0) goto <D.21755>; else goto <D.21756>;
        <D.21755>:
        first = d;
        // predicted unlikely by continue predictor.
        goto <D.19685>;
        <D.21756>:
        if (first < 0) goto <D.21758>; else goto <D.21761>;
        <D.21761>:
        if (d <= first) goto <D.21758>; else goto <D.21759>;
        <D.21758>:
        iftmp.159 = 1;
        goto <D.21760>;
        <D.21759>:
        iftmp.159 = 0;
        <D.21760>:
        D.21762 = iftmp.159 != 0;
        D.21763 = (long int) D.21762;
        D.21764 = __builtin_expect (D.21763, 0);
        if (D.21764 != 0) goto <D.21765>; else goto <D.21766>;
        <D.21765>:
        monoeg_g_log (0B, 4, "algorithm is wrong");
        <D.19686>:
        goto <D.19686>;
        <D.21766>:
        d.160 = (sizetype) d;
        D.21768 = d.160 + 1073741823;
        D.21769 = D.21768 * 4;
        D.21770 = empty_block_arr + D.21769;
        D.21771 = *D.21770;
        D.21772 = D.21771 + 16384;
        if (D.21772 != block) goto <D.21773>; else goto <D.21774>;
        <D.21773>:
        first = d;
        // predicted unlikely by continue predictor.
        goto <D.19685>;
        <D.21774>:
        D.21775 = d + 1;
        D.21776 = D.21775 - first;
        if (D.21776 == num_blocks) goto <D.21777>; else goto <D.21778>;
        <D.21777>:
        {
          int j;

          first.161 = (unsigned int) first;
          D.21780 = first.161 * 4;
          D.21781 = empty_block_arr + D.21780;
          D.21782 = *D.21781;
          D.21783 = num_blocks * 16384;
          D.21784 = (unsigned int) D.21783;
          sgen_free_os_memory (D.21782, D.21784, 1);
          j = first;
          goto <D.19689>;
          <D.19688>:
          j.162 = (unsigned int) j;
          D.21786 = j.162 * 4;
          D.21787 = empty_block_arr + D.21786;
          *D.21787 = 0B;
          j = j + 1;
          <D.19689>:
          if (j <= d) goto <D.19688>; else goto <D.19690>;
          <D.19690>:
          dest = first;
          first = -1;
          num_empty_blocks.152 = num_empty_blocks;
          num_empty_blocks.163 = num_empty_blocks.152 - num_blocks;
          num_empty_blocks = num_empty_blocks.163;
          D.21789 = (long long int) num_blocks;
          stat_major_blocks_freed.164 = stat_major_blocks_freed;
          stat_major_blocks_freed.165 = D.21789 + stat_major_blocks_freed.164;
          stat_major_blocks_freed = stat_major_blocks_freed.165;
          if (num_blocks == 32) goto <D.21792>; else goto <D.21793>;
          <D.21792>:
          D.21789 = (long long int) num_blocks;
          stat_major_blocks_freed_ideal.166 = stat_major_blocks_freed_ideal;
          stat_major_blocks_freed_ideal.167 = D.21789 + stat_major_blocks_freed_ideal.166;
          stat_major_blocks_freed_ideal = stat_major_blocks_freed_ideal.167;
          goto <D.21796>;
          <D.21793>:
          D.21789 = (long long int) num_blocks;
          stat_major_blocks_freed_less_ideal.168 = stat_major_blocks_freed_less_ideal;
          stat_major_blocks_freed_less_ideal.169 = D.21789 + stat_major_blocks_freed_less_ideal.168;
          stat_major_blocks_freed_less_ideal = stat_major_blocks_freed_less_ideal.169;
          <D.21796>:
        }
        <D.21778>:
      }
      <D.19685>:
      i = i + 1;
      <D.19692>:
      if (i < arr_length) goto <D.19691>; else goto <D.19693>;
      <D.19693>:
      if (dest > i) goto <D.21800>; else goto <D.21803>;
      <D.21803>:
      if (dest > arr_length) goto <D.21800>; else goto <D.21801>;
      <D.21800>:
      iftmp.170 = 1;
      goto <D.21802>;
      <D.21801>:
      iftmp.170 = 0;
      <D.21802>:
      D.21804 = iftmp.170 != 0;
      D.21805 = (long int) D.21804;
      D.21806 = __builtin_expect (D.21805, 0);
      if (D.21806 != 0) goto <D.21807>; else goto <D.21808>;
      <D.21807>:
      monoeg_g_log (0B, 4, "array length is off");
      <D.19694>:
      goto <D.19694>;
      <D.21808>:
      arr_length = dest;
      num_empty_blocks.152 = num_empty_blocks;
      D.21809 = arr_length != num_empty_blocks.152;
      D.21810 = (long int) D.21809;
      D.21811 = __builtin_expect (D.21810, 0);
      if (D.21811 != 0) goto <D.21812>; else goto <D.21813>;
      <D.21812>:
      monoeg_g_log (0B, 4, "array length is off");
      <D.19695>:
      goto <D.19695>;
      <D.21813>:
      num_blocks = num_blocks >> 1;
    }
    <D.19697>:
    num_empty_blocks.152 = num_empty_blocks;
    if (num_empty_blocks.152 > section_reserve) goto <D.21814>; else goto <D.19698>;
    <D.21814>:
    if (num_blocks > 1) goto <D.19696>; else goto <D.19698>;
    <D.19698>:
    rebuild_next = &empty_blocks;
    i = 0;
    goto <D.19702>;
    <D.19701>:
    {
      void * block;

      i.157 = (unsigned int) i;
      D.21743 = i.157 * 4;
      D.21744 = empty_block_arr + D.21743;
      block = *D.21744;
      D.21815 = block == 0B;
      D.21816 = (long int) D.21815;
      D.21817 = __builtin_expect (D.21816, 0);
      if (D.21817 != 0) goto <D.21818>; else goto <D.21819>;
      <D.21818>:
      monoeg_g_log (0B, 4, "we\'re missing blocks");
      <D.19700>:
      goto <D.19700>;
      <D.21819>:
      *rebuild_next = block;
      rebuild_next = block;
    }
    i = i + 1;
    <D.19702>:
    if (i < arr_length) goto <D.19701>; else goto <D.19703>;
    <D.19703>:
    *rebuild_next = 0B;
    num_empty_blocks_orig.153 = (unsigned int) num_empty_blocks_orig;
    D.21730 = num_empty_blocks_orig.153 * 4;
    sgen_free_internal_dynamic (empty_block_arr, D.21730, 17);
  }
  num_empty_blocks.152 = num_empty_blocks;
  D.21820 = num_empty_blocks.152 < 0;
  D.21821 = (long int) D.21820;
  D.21822 = __builtin_expect (D.21821, 0);
  if (D.21822 != 0) goto <D.21823>; else goto <D.21824>;
  <D.21823>:
  monoeg_g_log (0B, 4, "we freed more blocks than we had in the first place?");
  <D.19704>:
  goto <D.19704>;
  <D.21824>:
  fallback:
  num_empty_blocks.152 = num_empty_blocks;
  num_major_sections.171 = num_major_sections;
  if (num_empty_blocks.152 <= num_major_sections.171) goto <D.21826>; else goto <D.21827>;
  <D.21826>:
  return;
  <D.21827>:
  goto <D.19707>;
  <D.19706>:
  {
    void * next;

    empty_blocks.172 = empty_blocks;
    next = MEM[(void * *)empty_blocks.172];
    empty_blocks.172 = empty_blocks;
    sgen_free_os_memory (empty_blocks.172, 16384, 1);
    empty_blocks = next;
    num_empty_blocks.152 = num_empty_blocks;
    num_empty_blocks.173 = num_empty_blocks.152 + -1;
    num_empty_blocks = num_empty_blocks.173;
    stat_major_blocks_freed.164 = stat_major_blocks_freed;
    stat_major_blocks_freed.174 = stat_major_blocks_freed.164 + 1;
    stat_major_blocks_freed = stat_major_blocks_freed.174;
    stat_major_blocks_freed_individual.175 = stat_major_blocks_freed_individual;
    stat_major_blocks_freed_individual.176 = stat_major_blocks_freed_individual.175 + 1;
    stat_major_blocks_freed_individual = stat_major_blocks_freed_individual.176;
  }
  <D.19707>:
  num_empty_blocks.152 = num_empty_blocks;
  if (num_empty_blocks.152 > section_reserve) goto <D.19706>; else goto <D.19708>;
  <D.19708>:
}


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

  a = MEM[(char * *)va];
  b = MEM[(char * *)vb];
  if (a < b) goto <D.21834>; else goto <D.21835>;
  <D.21834>:
  D.21836 = -1;
  return D.21836;
  <D.21835>:
  if (a > b) goto <D.21837>; else goto <D.21838>;
  <D.21837>:
  D.21836 = 1;
  return D.21836;
  <D.21838>:
  D.21836 = 0;
  return D.21836;
}


major_finish_major_collection ()
{

}


major_start_major_collection ()
{
  gboolean * evacuate_block_obj_sizes.177;
  unsigned int i.178;
  unsigned int D.21842;
  gboolean * D.21843;
  int D.21844;
  struct MSBlockInfo * * D.21847;
  struct MSBlockInfo * * D.21848;
  struct MSBlockInfo * * D.21849;
  struct MSBlockInfo * * D.21850;
  int num_block_obj_sizes.179;
  int lazy_sweep.180;
  struct MSBlockInfo * D.21855;
  int i;

  i = 0;
  goto <D.19647>;
  <D.19646>:
  evacuate_block_obj_sizes.177 = evacuate_block_obj_sizes;
  i.178 = (unsigned int) i;
  D.21842 = i.178 * 4;
  D.21843 = evacuate_block_obj_sizes.177 + D.21842;
  D.21844 = *D.21843;
  if (D.21844 == 0) goto <D.21845>; else goto <D.21846>;
  <D.21845>:
  // predicted unlikely by continue predictor.
  goto <D.19645>;
  <D.21846>:
  D.21847 = free_block_lists[0];
  i.178 = (unsigned int) i;
  D.21842 = i.178 * 4;
  D.21848 = D.21847 + D.21842;
  *D.21848 = 0B;
  D.21849 = free_block_lists[2];
  i.178 = (unsigned int) i;
  D.21842 = i.178 * 4;
  D.21850 = D.21849 + D.21842;
  *D.21850 = 0B;
  <D.19645>:
  i = i + 1;
  <D.19647>:
  num_block_obj_sizes.179 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.179) goto <D.19646>; else goto <D.19648>;
  <D.19648>:
  lazy_sweep.180 = lazy_sweep;
  if (lazy_sweep.180 != 0) goto <D.21853>; else goto <D.21854>;
  <D.21853>:
  {
    struct MSBlockInfo * * iter;

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

      block = *iter;
      sweep_block (block, 1);
      iter = &block->next;
    }
    <D.19652>:
    D.21855 = *iter;
    if (D.21855 != 0B) goto <D.19651>; else goto <D.19653>;
    <D.19653>:
  }
  <D.21854>:
}


sweep_block (struct MSBlockInfo * block, gboolean during_major_collection)
{
  int D.21858;
  _Bool D.21859;
  long int D.21860;
  long int D.21861;
  unsigned int D.21864;
  unsigned int D.21865;
  int D.21868;
  mword[64] * D.21869;
  void * * D.21870;
  int count;
  void * reversed;

  reversed = 0B;
  if (during_major_collection == 0) goto <D.21856>; else goto <D.21857>;
  <D.21856>:
  D.21858 = sgen_concurrent_collection_in_progress ();
  D.21859 = D.21858 != 0;
  D.21860 = (long int) D.21859;
  D.21861 = __builtin_expect (D.21860, 0);
  if (D.21861 != 0) goto <D.21862>; else goto <D.21863>;
  <D.21862>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 1551, "!sgen_concurrent_collection_in_progress ()");
  <D.21863>:
  <D.21857>:
  D.21864 = BIT_FIELD_REF <*block, 32, 96>;
  D.21865 = D.21864 & 16;
  if (D.21865 != 0) goto <D.21866>; else goto <D.21867>;
  <D.21866>:
  return;
  <D.21867>:
  D.21868 = block->obj_size;
  count = 16368 / D.21868;
  block->free_list = 0B;
  D.21868 = block->obj_size;
  switch (D.21868) <default: <D.19550>, case 16: <D.19548>>
  <D.19548>:
  sweep_block_for_size (block, count, 16);
  goto <D.19549>;
  <D.19550>:
  D.21868 = block->obj_size;
  sweep_block_for_size (block, count, D.21868);
  goto <D.19549>;
  <D.19549>:
  D.21869 = &block->mark_words;
  memset (D.21869, 0, 256);
  reversed = 0B;
  goto <D.19553>;
  <D.19552>:
  {
    void * next;

    D.21870 = block->free_list;
    next = *D.21870;
    D.21870 = block->free_list;
    *D.21870 = reversed;
    reversed = block->free_list;
    block->free_list = next;
  }
  <D.19553>:
  D.21870 = block->free_list;
  if (D.21870 != 0B) goto <D.19552>; else goto <D.19554>;
  <D.19554>:
  block->free_list = reversed;
  block->swept = 1;
}


sweep_block_for_size (struct MSBlockInfo * block, int count, int obj_size)
{
  char * D.21872;
  int D.21873;
  sizetype D.21874;
  sizetype D.21875;
  int obj.181;
  int obj.182;
  int D.21878;
  int D.21879;
  unsigned int D.21883;
  long int D.21884;
  long unsigned int D.21885;
  long unsigned int D.21886;
  void * D.21894;
  char * D.21897;
  char * D.21899;
  unsigned int obj_size.183;
  void * * D.21901;
  int obj_index;

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

    D.21872 = block->block;
    D.21873 = obj_size * obj_index;
    D.21874 = (sizetype) D.21873;
    D.21875 = D.21874 + 16;
    obj = D.21872 + D.21875;
    {
      int i;

      obj.181 = (int) obj;
      obj.182 = (int) obj;
      D.21878 = obj.182 & -16384;
      D.21879 = obj.181 - D.21878;
      i = D.21879 >> 3;
      if (1 != 0) goto <D.21880>; else goto <D.21881>;
      <D.21880>:
      word = i >> 5;
      bit = i & 31;
      goto <D.21882>;
      <D.21881>:
      word = i >> 6;
      bit = i & 63;
      <D.21882>:
    }
    D.21883 = block->mark_words[word];
    D.21884 = 1 << bit;
    D.21885 = (long unsigned int) D.21884;
    D.21886 = D.21883 & D.21885;
    if (D.21886 != 0) goto <D.21887>; else goto <D.21888>;
    <D.21887>:
    if (0 != 0) goto <D.21889>; else goto <D.21890>;
    <D.21889>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.19538>:
    goto <D.19538>;
    <D.21890>:
    goto <D.21891>;
    <D.21888>:
    D.21894 = MEM[(void * *)obj];
    if (D.21894 != 0B) goto <D.21895>; else goto <D.21896>;
    <D.21895>:
    D.21897 = MEM[(char * *)obj];
    D.21872 = block->block;
    if (D.21897 < D.21872) goto <D.21892>; else goto <D.21898>;
    <D.21898>:
    D.21897 = MEM[(char * *)obj];
    D.21872 = block->block;
    D.21899 = D.21872 + 16384;
    if (D.21897 >= D.21899) goto <D.21892>; else goto <D.21893>;
    <D.21892>:
    obj_size.183 = (unsigned int) obj_size;
    memset (obj, 0, obj_size.183);
    <D.21893>:
    <D.21896>:
    D.21901 = block->free_list;
    MEM[(void * *)obj] = D.21901;
    block->free_list = obj;
    <D.21891>:
  }
  obj_index = obj_index + 1;
  <D.19540>:
  if (obj_index < count) goto <D.19539>; else goto <D.19541>;
  <D.19541>:
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.21904;
  int D.21909;
  void * D.21911;
  unsigned int D.21912;

  D.21904 = __builtin_constant_p (__len);
  if (D.21904 != 0) goto <D.21905>; else goto <D.21906>;
  <D.21905>:
  if (__len == 0) goto <D.21907>; else goto <D.21908>;
  <D.21907>:
  D.21909 = __builtin_constant_p (__ch);
  if (D.21909 == 0) goto <D.21902>; else goto <D.21910>;
  <D.21910>:
  if (__ch != 0) goto <D.21902>; else goto <D.21903>;
  <D.21902>:
  __warn_memset_zero_len ();
  D.21911 = __dest;
  return D.21911;
  <D.21903>:
  <D.21908>:
  <D.21906>:
  D.21912 = __builtin_object_size (__dest, 0);
  D.21911 = __builtin___memset_chk (__dest, __ch, __len, D.21912);
  return D.21911;
}


major_finish_nursery_collection ()
{
  int num_major_sections.184;
  int old_num_major_sections.185;
  int D.21916;

  num_major_sections.184 = num_major_sections;
  old_num_major_sections.185 = old_num_major_sections;
  D.21916 = num_major_sections.184 - old_num_major_sections.185;
  sgen_register_major_sections_alloced (D.21916);
}


major_start_nursery_collection ()
{
  int num_major_sections.186;

  num_major_sections.186 = num_major_sections;
  old_num_major_sections = num_major_sections.186;
}


major_get_used_size ()
{
  int D.21918;
  int D.21919;
  long long int D.21920;
  long long int D.21921;
  gint64 D.21922;
  gint64 size;
  struct MSBlockInfo * block;

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

    D.21918 = block->obj_size;
    count = 16368 / D.21918;
    D.21918 = block->obj_size;
    D.21919 = D.21918 * count;
    D.21920 = (long long int) D.21919;
    size = D.21920 + size;
    iter = block->free_list;
    goto <D.19737>;
    <D.19736>:
    D.21918 = block->obj_size;
    D.21921 = (long long int) D.21918;
    size = size - D.21921;
    iter = *iter;
    <D.19737>:
    if (iter != 0B) goto <D.19736>; else goto <D.19738>;
    <D.19738>:
  }
  block = block->next;
  <D.19740>:
  if (block != 0B) goto <D.19739>; else goto <D.19741>;
  <D.19741>:
  D.21922 = size;
  return D.21922;
}


major_dump_heap (struct FILE * heap_dump_file)
{
  int num_block_obj_sizes.187;
  unsigned int num_block_obj_sizes.188;
  unsigned int D.21926;
  unsigned int i.189;
  unsigned int D.21928;
  int * D.21929;
  int * D.21930;
  int D.21931;
  int D.21932;
  unsigned int index.190;
  unsigned int D.21934;
  int * D.21935;
  int D.21936;
  int D.21937;
  char * D.21940;
  int D.21941;
  sizetype D.21942;
  sizetype D.21943;
  char * D.21944;
  void * D.21945;
  char * D.21948;
  char * D.21950;
  int * D.21951;
  int D.21952;
  int D.21953;
  int * block_obj_sizes.191;
  int * D.21955;
  int D.21956;
  int D.21957;
  int D.21962;
  sizetype D.21963;
  sizetype D.21964;
  char * D.21965;
  void * D.21966;
  char * D.21968;
  int D.21974;
  sizetype D.21975;
  sizetype D.21976;
  char * D.21977;
  struct MSBlockInfo * block;
  int * slots_available;
  int * slots_used;
  int i;

  num_block_obj_sizes.187 = num_block_obj_sizes;
  num_block_obj_sizes.188 = (unsigned int) num_block_obj_sizes.187;
  D.21926 = num_block_obj_sizes.188 * 4;
  slots_available = __builtin_alloca (D.21926);
  num_block_obj_sizes.187 = num_block_obj_sizes;
  num_block_obj_sizes.188 = (unsigned int) num_block_obj_sizes.187;
  D.21926 = num_block_obj_sizes.188 * 4;
  slots_used = __builtin_alloca (D.21926);
  i = 0;
  goto <D.19082>;
  <D.19081>:
  i.189 = (unsigned int) i;
  D.21928 = i.189 * 4;
  D.21929 = slots_available + D.21928;
  i.189 = (unsigned int) i;
  D.21928 = i.189 * 4;
  D.21930 = slots_used + D.21928;
  *D.21930 = 0;
  D.21931 = *D.21930;
  *D.21929 = D.21931;
  i = i + 1;
  <D.19082>:
  num_block_obj_sizes.187 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.187) goto <D.19081>; else goto <D.19083>;
  <D.19083>:
  block = all_blocks;
  goto <D.19090>;
  <D.19089>:
  {
    int index;
    int count;

    D.21932 = block->obj_size;
    index = ms_find_block_obj_size_index (D.21932);
    D.21932 = block->obj_size;
    count = 16368 / D.21932;
    index.190 = (unsigned int) index;
    D.21934 = index.190 * 4;
    D.21935 = slots_available + D.21934;
    index.190 = (unsigned int) index;
    D.21934 = index.190 * 4;
    D.21935 = slots_available + D.21934;
    D.21936 = *D.21935;
    D.21937 = D.21936 + count;
    *D.21935 = D.21937;
    i = 0;
    goto <D.19087>;
    <D.19086>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21941 = D.21932 * i;
    D.21942 = (sizetype) D.21941;
    D.21943 = D.21942 + 16;
    D.21944 = D.21940 + D.21943;
    D.21945 = MEM[(void * *)D.21944];
    if (D.21945 != 0B) goto <D.21946>; else goto <D.21947>;
    <D.21946>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21941 = D.21932 * i;
    D.21942 = (sizetype) D.21941;
    D.21943 = D.21942 + 16;
    D.21944 = D.21940 + D.21943;
    D.21948 = MEM[(char * *)D.21944];
    D.21940 = block->block;
    if (D.21948 < D.21940) goto <D.21938>; else goto <D.21949>;
    <D.21949>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21941 = D.21932 * i;
    D.21942 = (sizetype) D.21941;
    D.21943 = D.21942 + 16;
    D.21944 = D.21940 + D.21943;
    D.21948 = MEM[(char * *)D.21944];
    D.21940 = block->block;
    D.21950 = D.21940 + 16384;
    if (D.21948 >= D.21950) goto <D.21938>; else goto <D.21939>;
    <D.21938>:
    index.190 = (unsigned int) index;
    D.21934 = index.190 * 4;
    D.21951 = slots_used + D.21934;
    D.21952 = *D.21951;
    D.21953 = D.21952 + 1;
    *D.21951 = D.21953;
    <D.21939>:
    <D.21947>:
    i = i + 1;
    <D.19087>:
    if (i < count) goto <D.19086>; else goto <D.19088>;
    <D.19088>:
  }
  block = block->next;
  <D.19090>:
  if (block != 0B) goto <D.19089>; else goto <D.19091>;
  <D.19091>:
  fprintf (heap_dump_file, "<occupancies>\n");
  i = 0;
  goto <D.19093>;
  <D.19092>:
  block_obj_sizes.191 = block_obj_sizes;
  i.189 = (unsigned int) i;
  D.21928 = i.189 * 4;
  D.21955 = block_obj_sizes.191 + D.21928;
  D.21956 = *D.21955;
  i.189 = (unsigned int) i;
  D.21928 = i.189 * 4;
  D.21929 = slots_available + D.21928;
  D.21957 = *D.21929;
  i.189 = (unsigned int) i;
  D.21928 = i.189 * 4;
  D.21930 = slots_used + D.21928;
  D.21931 = *D.21930;
  fprintf (heap_dump_file, "<occupancy size=\"%d\" available=\"%d\" used=\"%d\" />\n", D.21956, D.21957, D.21931);
  i = i + 1;
  <D.19093>:
  num_block_obj_sizes.187 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.187) goto <D.19092>; else goto <D.19094>;
  <D.19094>:
  fprintf (heap_dump_file, "</occupancies>\n");
  block = all_blocks;
  goto <D.19102>;
  <D.19101>:
  {
    int count;
    int i;
    int start;

    D.21932 = block->obj_size;
    count = 16368 / D.21932;
    start = -1;
    fprintf (heap_dump_file, "<section type=\"%s\" size=\"%zu\">\n", "old", 16368);
    i = 0;
    goto <D.19099>;
    <D.19098>:
    if (i < count) goto <D.21961>; else goto <D.21958>;
    <D.21961>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21962 = D.21932 * i;
    D.21963 = (sizetype) D.21962;
    D.21964 = D.21963 + 16;
    D.21965 = D.21940 + D.21964;
    D.21966 = MEM[(void * *)D.21965];
    if (D.21966 != 0B) goto <D.21967>; else goto <D.21958>;
    <D.21967>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21962 = D.21932 * i;
    D.21963 = (sizetype) D.21962;
    D.21964 = D.21963 + 16;
    D.21965 = D.21940 + D.21964;
    D.21968 = MEM[(char * *)D.21965];
    D.21940 = block->block;
    if (D.21968 < D.21940) goto <D.21959>; else goto <D.21969>;
    <D.21969>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21962 = D.21932 * i;
    D.21963 = (sizetype) D.21962;
    D.21964 = D.21963 + 16;
    D.21965 = D.21940 + D.21964;
    D.21968 = MEM[(char * *)D.21965];
    D.21940 = block->block;
    D.21950 = D.21940 + 16384;
    if (D.21968 >= D.21950) goto <D.21959>; else goto <D.21958>;
    <D.21959>:
    if (start < 0) goto <D.21970>; else goto <D.21971>;
    <D.21970>:
    start = i;
    <D.21971>:
    goto <D.21960>;
    <D.21958>:
    if (start >= 0) goto <D.21972>; else goto <D.21973>;
    <D.21972>:
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21974 = D.21932 * start;
    D.21975 = (sizetype) D.21974;
    D.21976 = D.21975 + 16;
    D.21977 = D.21940 + D.21976;
    D.21940 = block->block;
    D.21932 = block->obj_size;
    D.21962 = D.21932 * i;
    D.21963 = (sizetype) D.21962;
    D.21964 = D.21963 + 16;
    D.21965 = D.21940 + D.21964;
    D.21940 = block->block;
    sgen_dump_occupied (D.21977, D.21965, D.21940);
    start = -1;
    <D.21973>:
    <D.21960>:
    i = i + 1;
    <D.19099>:
    if (i <= count) goto <D.19098>; else goto <D.19100>;
    <D.19100>:
    fprintf (heap_dump_file, "</section>\n");
  }
  block = block->next;
  <D.19102>:
  if (block != 0B) goto <D.19101>; else goto <D.19103>;
  <D.19103>:
}


major_check_scan_starts ()
{

}


major_sweep ()
{
  ms_sweep ();
}


ms_sweep ()
{
  int num_block_obj_sizes.192;
  unsigned int num_block_obj_sizes.193;
  unsigned int D.21980;
  unsigned int i.194;
  unsigned int D.21982;
  int * D.21983;
  int * D.21984;
  int * D.21985;
  int D.21986;
  int D.21987;
  unsigned int j.195;
  unsigned int D.21989;
  struct MSBlockInfo * * D.21990;
  <unnamed-unsigned:1> D.21991;
  <unnamed-unsigned:1> D.21992;
  int D.21993;
  guint8 * D.21994;
  unsigned int D.21997;
  int D.21998;
  int lazy_sweep.196;
  unsigned int obj_size_index.197;
  unsigned int D.22011;
  int * D.22012;
  int D.22013;
  int D.22014;
  int * D.22015;
  int D.22016;
  int D.22017;
  int * D.22018;
  int D.22019;
  int D.22020;
  unsigned int D.22023;
  unsigned int D.22024;
  _Bool D.22025;
  int D.22026;
  int D.22027;
  int D.22028;
  int D.22029;
  int iftmp.198;
  int D.22031;
  int D.22032;
  unsigned int index.199;
  unsigned int D.22037;
  struct MSBlockInfo * * D.22038;
  struct MSBlockInfo * D.22039;
  struct MSBlockInfo * D.22041;
  char * D.22042;
  int num_major_sections.200;
  int num_major_sections.201;
  struct MSBlockInfo * D.22045;
  float D.22046;
  int D.22047;
  float D.22048;
  float evacuation_threshold.202;
  gboolean * evacuate_block_obj_sizes.203;
  gboolean * D.22055;
  int * block_obj_sizes.204;
  int * D.22057;
  int D.22058;
  int D.22059;
  int D.22060;
  int D.22063;
  unsigned int D.22064;
  unsigned int D.22065;
  float D.22066;
  float D.22067;
  float D.22068;
  float concurrent_evacuation_threshold.205;
  float D.22070;
  _Bool D.22071;
  int want_evacuation.206;
  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.192 = num_block_obj_sizes;
  num_block_obj_sizes.193 = (unsigned int) num_block_obj_sizes.192;
  D.21980 = num_block_obj_sizes.193 * 4;
  slots_available = __builtin_alloca (D.21980);
  num_block_obj_sizes.192 = num_block_obj_sizes;
  num_block_obj_sizes.193 = (unsigned int) num_block_obj_sizes.192;
  D.21980 = num_block_obj_sizes.193 * 4;
  slots_used = __builtin_alloca (D.21980);
  num_block_obj_sizes.192 = num_block_obj_sizes;
  num_block_obj_sizes.193 = (unsigned int) num_block_obj_sizes.192;
  D.21980 = num_block_obj_sizes.193 * 4;
  num_blocks = __builtin_alloca (D.21980);
  total_evacuate_heap = 0;
  total_evacuate_saved = 0;
  i = 0;
  goto <D.19570>;
  <D.19569>:
  i.194 = (unsigned int) i;
  D.21982 = i.194 * 4;
  D.21983 = slots_available + D.21982;
  i.194 = (unsigned int) i;
  D.21982 = i.194 * 4;
  D.21984 = slots_used + D.21982;
  i.194 = (unsigned int) i;
  D.21982 = i.194 * 4;
  D.21985 = num_blocks + D.21982;
  *D.21985 = 0;
  D.21986 = *D.21985;
  *D.21984 = D.21986;
  D.21987 = *D.21984;
  *D.21983 = D.21987;
  i = i + 1;
  <D.19570>:
  num_block_obj_sizes.192 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.192) goto <D.19569>; else goto <D.19571>;
  <D.19571>:
  i = 0;
  goto <D.19578>;
  <D.19577>:
  {
    struct MSBlockInfo * * free_blocks;
    int j;

    free_blocks = free_block_lists[i];
    j = 0;
    goto <D.19575>;
    <D.19574>:
    j.195 = (unsigned int) j;
    D.21989 = j.195 * 4;
    D.21990 = free_blocks + D.21989;
    *D.21990 = 0B;
    j = j + 1;
    <D.19575>:
    num_block_obj_sizes.192 = num_block_obj_sizes;
    if (j < num_block_obj_sizes.192) goto <D.19574>; else goto <D.19576>;
    <D.19576>:
  }
  i = i + 1;
  <D.19578>:
  if (i <= 3) goto <D.19577>; else goto <D.19579>;
  <D.19579>:
  iter = &all_blocks;
  goto <D.19593>;
  <D.19592>:
  {
    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.21991 = block->has_pinned;
    has_pinned = (gboolean) D.21991;
    D.21992 = block->pinned;
    block->has_pinned = D.21992;
    block->is_to_space = 0;
    block->swept = 0;
    D.21993 = block->obj_size;
    count = 16368 / D.21993;
    D.21994 = block->cardtable_mod_union;
    if (D.21994 != 0B) goto <D.21995>; else goto <D.21996>;
    <D.21995>:
    D.21994 = block->cardtable_mod_union;
    sgen_free_internal_dynamic (D.21994, 32, 28);
    block->cardtable_mod_union = 0B;
    <D.21996>:
    i = 0;
    goto <D.19588>;
    <D.19587>:
    D.21997 = block->mark_words[i];
    D.21998 = bitcount (D.21997);
    nused = D.21998 + nused;
    i = i + 1;
    <D.19588>:
    i.194 = (unsigned int) i;
    if (i.194 <= 63) goto <D.19587>; else goto <D.19589>;
    <D.19589>:
    if (nused != 0) goto <D.21999>; else goto <D.22000>;
    <D.21999>:
    have_live = 1;
    <D.22000>:
    if (nused < count) goto <D.22001>; else goto <D.22002>;
    <D.22001>:
    have_free = 1;
    <D.22002>:
    lazy_sweep.196 = lazy_sweep;
    if (lazy_sweep.196 == 0) goto <D.22004>; else goto <D.22005>;
    <D.22004>:
    sweep_block (block, 1);
    <D.22005>:
    if (have_live != 0) goto <D.22006>; else goto <D.22007>;
    <D.22006>:
    if (has_pinned == 0) goto <D.22008>; else goto <D.22009>;
    <D.22008>:
    obj_size_index.197 = (unsigned int) obj_size_index;
    D.22011 = obj_size_index.197 * 4;
    D.22012 = num_blocks + D.22011;
    D.22013 = *D.22012;
    D.22014 = D.22013 + 1;
    *D.22012 = D.22014;
    obj_size_index.197 = (unsigned int) obj_size_index;
    D.22011 = obj_size_index.197 * 4;
    D.22015 = slots_used + D.22011;
    obj_size_index.197 = (unsigned int) obj_size_index;
    D.22011 = obj_size_index.197 * 4;
    D.22015 = slots_used + D.22011;
    D.22016 = *D.22015;
    D.22017 = D.22016 + nused;
    *D.22015 = D.22017;
    obj_size_index.197 = (unsigned int) obj_size_index;
    D.22011 = obj_size_index.197 * 4;
    D.22018 = slots_available + D.22011;
    obj_size_index.197 = (unsigned int) obj_size_index;
    D.22011 = obj_size_index.197 * 4;
    D.22018 = slots_available + D.22011;
    D.22019 = *D.22018;
    D.22020 = D.22019 + count;
    *D.22018 = D.22020;
    <D.22009>:
    iter = &block->next;
    if (have_free != 0) goto <D.22021>; else goto <D.22022>;
    <D.22021>:
    {
      struct MSBlockInfo * * free_blocks;
      int index;

      D.22023 = BIT_FIELD_REF <*block, 32, 96>;
      D.22024 = D.22023 & 1;
      D.22025 = D.22024 != 0;
      D.22026 = (int) D.22025;
      D.22023 = BIT_FIELD_REF <*block, 32, 96>;
      D.22027 = (int) D.22023;
      D.22028 = D.22027 & 2;
      D.22029 = D.22026 | D.22028;
      free_blocks = free_block_lists[D.22029];
      D.21993 = block->obj_size;
      D.22031 = D.21993 + 7;
      D.22032 = D.22031 >> 3;
      if (D.22032 <= 31) goto <D.22033>; else goto <D.22034>;
      <D.22033>:
      D.21993 = block->obj_size;
      D.22031 = D.21993 + 7;
      D.22032 = D.22031 >> 3;
      iftmp.198 = fast_block_obj_size_indexes[D.22032];
      goto <D.22035>;
      <D.22034>:
      D.21993 = block->obj_size;
      iftmp.198 = ms_find_block_obj_size_index (D.21993);
      <D.22035>:
      index = iftmp.198;
      index.199 = (unsigned int) index;
      D.22037 = index.199 * 4;
      D.22038 = free_blocks + D.22037;
      D.22039 = *D.22038;
      block->next_free = D.22039;
      index.199 = (unsigned int) index;
      D.22037 = index.199 * 4;
      D.22038 = free_blocks + D.22037;
      *D.22038 = block;
    }
    <D.22022>:
    update_heap_boundaries_for_block (block);
    goto <D.22040>;
    <D.22007>:
    D.22041 = block->next;
    *iter = D.22041;
    D.22042 = block->block;
    ms_free_block (D.22042);
    sgen_free_internal (block, 16);
    num_major_sections.200 = num_major_sections;
    num_major_sections.201 = num_major_sections.200 + -1;
    num_major_sections = num_major_sections.201;
    <D.22040>:
  }
  <D.19593>:
  D.22045 = *iter;
  if (D.22045 != 0B) goto <D.19592>; else goto <D.19594>;
  <D.19594>:
  i = 0;
  goto <D.19598>;
  <D.19597>:
  {
    float usage;

    i.194 = (unsigned int) i;
    D.21982 = i.194 * 4;
    D.21984 = slots_used + D.21982;
    D.21987 = *D.21984;
    D.22046 = (float) D.21987;
    i.194 = (unsigned int) i;
    D.21982 = i.194 * 4;
    D.21983 = slots_available + D.21982;
    D.22047 = *D.21983;
    D.22048 = (float) D.22047;
    usage = D.22046 / D.22048;
    i.194 = (unsigned int) i;
    D.21982 = i.194 * 4;
    D.21985 = num_blocks + D.21982;
    D.21986 = *D.21985;
    if (D.21986 > 5) goto <D.22051>; else goto <D.22049>;
    <D.22051>:
    evacuation_threshold.202 = evacuation_threshold;
    if (usage < evacuation_threshold.202) goto <D.22053>; else goto <D.22049>;
    <D.22053>:
    evacuate_block_obj_sizes.203 = evacuate_block_obj_sizes;
    i.194 = (unsigned int) i;
    D.21982 = i.194 * 4;
    D.22055 = evacuate_block_obj_sizes.203 + D.21982;
    *D.22055 = 1;
    goto <D.22050>;
    <D.22049>:
    evacuate_block_obj_sizes.203 = evacuate_block_obj_sizes;
    i.194 = (unsigned int) i;
    D.21982 = i.194 * 4;
    D.22055 = evacuate_block_obj_sizes.203 + D.21982;
    *D.22055 = 0;
    <D.22050>:
    {
      mword total_bytes;

      block_obj_sizes.204 = block_obj_sizes;
      i.194 = (unsigned int) i;
      D.21982 = i.194 * 4;
      D.22057 = block_obj_sizes.204 + D.21982;
      D.22058 = *D.22057;
      i.194 = (unsigned int) i;
      D.21982 = i.194 * 4;
      D.21983 = slots_available + D.21982;
      D.22047 = *D.21983;
      D.22059 = D.22058 * D.22047;
      total_bytes = (mword) D.22059;
      total_evacuate_heap = total_evacuate_heap + total_bytes;
      evacuate_block_obj_sizes.203 = evacuate_block_obj_sizes;
      i.194 = (unsigned int) i;
      D.21982 = i.194 * 4;
      D.22055 = evacuate_block_obj_sizes.203 + D.21982;
      D.22060 = *D.22055;
      if (D.22060 != 0) goto <D.22061>; else goto <D.22062>;
      <D.22061>:
      block_obj_sizes.204 = block_obj_sizes;
      i.194 = (unsigned int) i;
      D.21982 = i.194 * 4;
      D.22057 = block_obj_sizes.204 + D.21982;
      D.22058 = *D.22057;
      i.194 = (unsigned int) i;
      D.21982 = i.194 * 4;
      D.21984 = slots_used + D.21982;
      D.21987 = *D.21984;
      D.22063 = D.22058 * D.21987;
      D.22064 = (unsigned int) D.22063;
      D.22065 = total_bytes - D.22064;
      total_evacuate_saved = D.22065 + total_evacuate_saved;
      <D.22062>:
    }
  }
  i = i + 1;
  <D.19598>:
  num_block_obj_sizes.192 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.192) goto <D.19597>; else goto <D.19599>;
  <D.19599>:
  D.22066 = (float) total_evacuate_saved;
  D.22067 = (float) total_evacuate_heap;
  D.22068 = D.22066 / D.22067;
  concurrent_evacuation_threshold.205 = concurrent_evacuation_threshold;
  D.22070 = 1.0e+0 - concurrent_evacuation_threshold.205;
  D.22071 = D.22068 > D.22070;
  want_evacuation.206 = (int) D.22071;
  want_evacuation = want_evacuation.206;
  have_swept = 1;
}


bitcount (mword d)
{
  int D.22075;
  int D.22077;
  int D.22078;
  int count;

  count = 0;
  if (1 != 0) goto <D.22073>; else goto <D.22074>;
  <D.22073>:
  D.22075 = __builtin_popcountl (d);
  count = D.22075 + count;
  goto <D.22076>;
  <D.22074>:
  D.22077 = __builtin_popcount (d);
  count = D.22077 + count;
  <D.22076>:
  D.22078 = count;
  return D.22078;
}


update_heap_boundaries_for_block (struct MSBlockInfo * block)
{
  char * D.22080;
  unsigned int D.22081;
  unsigned int D.22082;

  D.22080 = block->block;
  D.22081 = (unsigned int) D.22080;
  D.22080 = block->block;
  D.22081 = (unsigned int) D.22080;
  D.22082 = D.22081 + 16384;
  sgen_update_heap_boundaries (D.22081, D.22082);
}


ms_free_block (void * block)
{
  void * D.22083;
  int D.22084;
  int D.22085;
  void * empty;

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

    <D.18923>:
    __old_x = num_empty_blocks;
    D.22084 = __old_x + 1;
    D.22085 = InterlockedCompareExchange (&num_empty_blocks, D.22084, __old_x);
    if (D.22085 != __old_x) goto <D.18923>; else goto <D.18924>;
    <D.18924>:
  }
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.22086;
  unsigned int comp.207;
  unsigned int exch.208;
  unsigned int D.22089;

  comp.207 = (unsigned int) comp;
  exch.208 = (unsigned int) exch;
  D.22089 = __sync_val_compare_and_swap_4 (dest, comp.207, exch.208);
  D.22086 = (void *) D.22089;
  return D.22086;
}


InterlockedCompareExchange (volatile gint32 * dest, gint32 exch, gint32 comp)
{
  gint32 D.22091;
  unsigned int comp.209;
  unsigned int exch.210;
  unsigned int D.22094;

  comp.209 = (unsigned int) comp;
  exch.210 = (unsigned int) exch;
  D.22094 = __sync_val_compare_and_swap_4 (dest, comp.209, exch.210);
  D.22091 = (gint32) D.22094;
  return D.22091;
}


major_init_to_space ()
{

}


major_get_cardtable_mod_union_for_object (char * obj)
{
  unsigned int obj.211;
  unsigned int D.22097;
  struct MSBlockHeader * D.22098;
  guint8 * D.22099;
  guint8 * D.22100;
  int obj.212;
  char * D.22102;
  void * D.22103;
  int D.22104;
  int D.22105;
  int D.22106;
  sizetype D.22107;
  struct MSBlockInfo * block;

  obj.211 = (unsigned int) obj;
  D.22097 = obj.211 & 4294950912;
  D.22098 = (struct MSBlockHeader *) D.22097;
  block = D.22098->info;
  D.22100 = block->cardtable_mod_union;
  obj.212 = (int) obj;
  D.22102 = block->block;
  D.22103 = sgen_card_table_align_pointer (D.22102);
  D.22104 = (int) D.22103;
  D.22105 = obj.212 - D.22104;
  D.22106 = D.22105 >> 9;
  D.22107 = (sizetype) D.22106;
  D.22099 = D.22100 + D.22107;
  return D.22099;
}


update_cardtable_mod_union ()
{
  guint8 * D.22109;
  char * D.22110;
  guint8 * D.22111;
  unsigned int num_cards.213;
  _Bool D.22113;
  long int D.22114;
  long int D.22115;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19849>;
  <D.19848>:
  {
    size_t num_cards;

    try
      {
        D.22109 = block->cardtable_mod_union;
        D.22110 = block->block;
        D.22111 = sgen_card_table_update_mod_union (D.22109, D.22110, 16384, &num_cards);
        block->cardtable_mod_union = D.22111;
        num_cards.213 = num_cards;
        D.22113 = num_cards.213 != 32;
        D.22114 = (long int) D.22113;
        D.22115 = __builtin_expect (D.22114, 0);
        if (D.22115 != 0) goto <D.22116>; else goto <D.22117>;
        <D.22116>:
        monoeg_g_log (0B, 4, "Number of cards calculation is wrong");
        <D.19847>:
        goto <D.19847>;
        <D.22117>:
      }
    finally
      {
        num_cards = {CLOBBER};
      }
  }
  block = block->next;
  <D.19849>:
  if (block != 0B) goto <D.19848>; else goto <D.19850>;
  <D.19850>:
}


major_iterate_live_block_ranges (void (*sgen_cardtable_block_callback) (mword, mword) callback)
{
  unsigned int D.22118;
  unsigned int D.22119;
  char * D.22122;
  unsigned int D.22123;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19776>;
  <D.19775>:
  D.22118 = BIT_FIELD_REF <*block, 32, 96>;
  D.22119 = D.22118 & 2;
  if (D.22119 != 0) goto <D.22120>; else goto <D.22121>;
  <D.22120>:
  D.22122 = block->block;
  D.22123 = (unsigned int) D.22122;
  callback (D.22123, 16384);
  <D.22121>:
  block = block->next;
  <D.19776>:
  if (block != 0B) goto <D.19775>; else goto <D.19777>;
  <D.19777>:
}


major_scan_card_table (gboolean mod_union, struct SgenGrayQueue * queue)
{
  struct SgenObjectOperations * D.22124;
  int concurrent_mark.214;
  _Bool D.22128;
  long int D.22129;
  long int D.22130;
  unsigned int D.22133;
  unsigned int D.22134;
  unsigned int block_start.215;
  int D.22145;
  unsigned int D.22148;
  void * D.22152;
  char * D.22154;
  char * D.22156;
  int obj.216;
  int obj.217;
  int D.22161;
  int D.22162;
  unsigned int D.22166;
  long int D.22167;
  long unsigned int D.22168;
  long unsigned int D.22169;
  int base.218;
  int D.22172;
  unsigned int block_obj_size.219;
  sizetype card_offset.220;
  guint8 * D.22175;
  sizetype block_obj_size.221;
  int card_data.222;
  int card_base.223;
  int D.22185;
  sizetype D.22186;
  unsigned char D.22187;
  int start.224;
  char * D.22196;
  int D.22197;
  int D.22198;
  int D.22199;
  sizetype D.22200;
  sizetype D.22201;
  void * D.22203;
  char * D.22205;
  int obj.225;
  int obj.226;
  int D.22211;
  int D.22212;
  unsigned int D.22216;
  long int D.22217;
  long unsigned int D.22218;
  long unsigned int D.22219;
  struct MSBlockInfo * block;
  void (*ScanObjectFunc) (char *, struct SgenGrayQueue *) scan_func;
  void next_large = <<< error >>>;
  void next_small = <<< error >>>;

  D.22124 = sgen_get_current_object_ops ();
  scan_func = D.22124->scan_object;
  concurrent_mark.214 = concurrent_mark;
  if (concurrent_mark.214 == 0) goto <D.22126>; else goto <D.22127>;
  <D.22126>:
  D.22128 = mod_union != 0;
  D.22129 = (long int) D.22128;
  D.22130 = __builtin_expect (D.22129, 0);
  if (D.22130 != 0) goto <D.22131>; else goto <D.22132>;
  <D.22131>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 2225, "!mod_union");
  <D.22132>:
  <D.22127>:
  block = all_blocks;
  goto <D.19840>;
  <D.19839>:
  {
    int block_obj_size;
    char * block_start;

    D.22133 = BIT_FIELD_REF <*block, 32, 96>;
    D.22134 = D.22133 & 2;
    if (D.22134 == 0) goto <D.22135>; else goto <D.22136>;
    <D.22135>:
    // predicted unlikely by continue predictor.
    goto <D.19805>;
    <D.22136>:
    block_obj_size = block->obj_size;
    block_start = block->block;
    if (block_obj_size > 511) goto <D.22137>; else goto <D.22138>;
    <D.22137>:
    {
      guint8 * cards;
      guint8 cards_data[32];
      char * obj;
      char * end;
      char * base;

      try
        {
          if (mod_union != 0) goto <D.22139>; else goto <D.22140>;
          <D.22139>:
          cards = block->cardtable_mod_union;
          if (cards == 0B) goto <D.22141>; else goto <D.22142>;
          <D.22141>:
          // predicted unlikely by continue predictor.
          goto <D.19805>;
          <D.22142>:
          goto <D.22143>;
          <D.22140>:
          cards = &cards_data;
          block_start.215 = (unsigned int) block_start;
          D.22145 = sgen_card_table_get_card_data (&cards_data, block_start.215, 32);
          if (D.22145 == 0) goto <D.22146>; else goto <D.22147>;
          <D.22146>:
          // predicted unlikely by continue predictor.
          goto <D.19805>;
          <D.22147>:
          <D.22143>:
          obj = block_start + 16;
          end = block_start + 16384;
          base = sgen_card_table_align_pointer (obj);
          goto <D.19817>;
          <D.19816>:
          {
            int card_offset;

            D.22133 = BIT_FIELD_REF <*block, 32, 96>;
            D.22148 = D.22133 & 16;
            if (D.22148 == 0) goto <D.22149>; else goto <D.22150>;
            <D.22149>:
            sweep_block (block, 0);
            <D.22150>:
            D.22152 = MEM[(void * *)obj];
            if (D.22152 == 0B) goto next_large; else goto <D.22153>;
            <D.22153>:
            D.22154 = MEM[(char * *)obj];
            if (D.22154 >= block_start) goto <D.22155>; else goto <D.22151>;
            <D.22155>:
            D.22154 = MEM[(char * *)obj];
            D.22156 = block_start + 16384;
            if (D.22154 < D.22156) goto next_large; else goto <D.22151>;
            <D.22151>:
            if (mod_union != 0) goto <D.22157>; else goto <D.22158>;
            <D.22157>:
            {
              int w;
              int b;

              {
                int i;

                obj.216 = (int) obj;
                obj.217 = (int) obj;
                D.22161 = obj.217 & -16384;
                D.22162 = obj.216 - D.22161;
                i = D.22162 >> 3;
                if (1 != 0) goto <D.22163>; else goto <D.22164>;
                <D.22163>:
                w = i >> 5;
                b = i & 31;
                goto <D.22165>;
                <D.22164>:
                w = i >> 6;
                b = i & 63;
                <D.22165>:
              }
              D.22166 = block->mark_words[w];
              D.22167 = 1 << b;
              D.22168 = (long unsigned int) D.22167;
              D.22169 = D.22166 & D.22168;
              if (D.22169 == 0) goto next_large; else goto <D.22170>;
              <D.22170>:
            }
            <D.22158>:
            obj.216 = (int) obj;
            base.218 = (int) base;
            D.22172 = obj.216 - base.218;
            card_offset = D.22172 >> 9;
            block_obj_size.219 = (unsigned int) block_obj_size;
            card_offset.220 = (sizetype) card_offset;
            D.22175 = cards + card_offset.220;
            sgen_cardtable_scan_object (obj, block_obj_size.219, D.22175, mod_union, queue);
            next_large:
            block_obj_size.221 = (sizetype) block_obj_size;
            obj = obj + block_obj_size.221;
          }
          <D.19817>:
          if (obj < end) goto <D.19816>; else goto <D.19818>;
          <D.19818>:
        }
      finally
        {
          cards_data = {CLOBBER};
        }
    }
    goto <D.22177>;
    <D.22138>:
    {
      guint8 * card_data;
      guint8 * card_base;
      guint8 * card_data_end;

      if (mod_union != 0) goto <D.22178>; else goto <D.22179>;
      <D.22178>:
      card_base = block->cardtable_mod_union;
      card_data = card_base;
      if (card_data == 0B) goto <D.22180>; else goto <D.22181>;
      <D.22180>:
      // predicted unlikely by continue predictor.
      goto <D.19805>;
      <D.22181>:
      goto <D.22182>;
      <D.22179>:
      block_start.215 = (unsigned int) block_start;
      card_base = sgen_card_table_get_card_address (block_start.215);
      card_data = card_base;
      <D.22182>:
      card_data_end = card_data + 32;
      card_data = initial_skip_card (card_data);
      goto <D.19837>;
      <D.19836>:
      {
        int index;
        int idx;
        char * start;
        char * end;
        char * first_obj;
        char * obj;

        card_data.222 = (int) card_data;
        card_base.223 = (int) card_base;
        idx = card_data.222 - card_base.223;
        D.22185 = idx * 512;
        D.22186 = (sizetype) D.22185;
        start = block_start + D.22186;
        end = start + 512;
        D.22187 = *card_data;
        if (D.22187 == 0) goto <D.22188>; else goto <D.22189>;
        <D.22188>:
        // predicted unlikely by continue predictor.
        goto <D.19828>;
        <D.22189>:
        D.22133 = BIT_FIELD_REF <*block, 32, 96>;
        D.22148 = D.22133 & 16;
        if (D.22148 == 0) goto <D.22190>; else goto <D.22191>;
        <D.22190>:
        sweep_block (block, 0);
        <D.22191>:
        sgen_card_table_prepare_card_for_scanning (card_data);
        if (idx == 0) goto <D.22192>; else goto <D.22193>;
        <D.22192>:
        index = 0;
        goto <D.22194>;
        <D.22193>:
        start.224 = (int) start;
        D.22196 = block_start + 16;
        D.22197 = (int) D.22196;
        D.22198 = start.224 - D.22197;
        index = D.22198 / block_obj_size;
        <D.22194>:
        D.22199 = block_obj_size * index;
        D.22200 = (sizetype) D.22199;
        D.22201 = D.22200 + 16;
        first_obj = block_start + D.22201;
        obj = first_obj;
        goto <D.19834>;
        <D.19833>:
        D.22203 = MEM[(void * *)obj];
        if (D.22203 == 0B) goto next_small; else goto <D.22204>;
        <D.22204>:
        D.22205 = MEM[(char * *)obj];
        if (D.22205 >= block_start) goto <D.22206>; else goto <D.22202>;
        <D.22206>:
        D.22205 = MEM[(char * *)obj];
        D.22156 = block_start + 16384;
        if (D.22205 < D.22156) goto next_small; else goto <D.22202>;
        <D.22202>:
        if (mod_union != 0) goto <D.22207>; else goto <D.22208>;
        <D.22207>:
        {
          int w;
          int b;

          {
            int i;

            obj.225 = (int) obj;
            obj.226 = (int) obj;
            D.22211 = obj.226 & -16384;
            D.22212 = obj.225 - D.22211;
            i = D.22212 >> 3;
            if (1 != 0) goto <D.22213>; else goto <D.22214>;
            <D.22213>:
            w = i >> 5;
            b = i & 31;
            goto <D.22215>;
            <D.22214>:
            w = i >> 6;
            b = i & 63;
            <D.22215>:
          }
          D.22216 = block->mark_words[w];
          D.22217 = 1 << b;
          D.22218 = (long unsigned int) D.22217;
          D.22219 = D.22216 & D.22218;
          if (D.22219 == 0) goto next_small; else goto <D.22220>;
          <D.22220>:
        }
        <D.22208>:
        scan_func (obj, queue);
        next_small:
        block_obj_size.221 = (sizetype) block_obj_size;
        obj = obj + block_obj_size.221;
        <D.19834>:
        if (obj < end) goto <D.19833>; else goto <D.19835>;
        <D.19835>:
      }
      <D.19828>:
      card_data = card_data + 1;
      <D.19837>:
      if (card_data < card_data_end) goto <D.19836>; else goto <D.19838>;
      <D.19838>:
    }
    <D.22177>:
  }
  <D.19805>:
  block = block->next;
  <D.19840>:
  if (block != 0B) goto <D.19839>; else goto <D.19841>;
  <D.19841>:
}


sgen_card_table_get_card_address (mword address)
{
  guint8 * D.22223;
  guint8 * sgen_cardtable.227;
  unsigned int D.22225;

  sgen_cardtable.227 = sgen_cardtable;
  D.22225 = address >> 9;
  D.22223 = sgen_cardtable.227 + D.22225;
  return D.22223;
}


initial_skip_card (guint8 * card_data)
{
  unsigned int i.228;
  unsigned int D.22228;
  mword * D.22229;
  guint8 * D.22233;
  sizetype i.229;
  guint8 * D.22235;
  unsigned char D.22236;
  mword * cards;
  mword card;
  int i;

  cards = card_data;
  i = 0;
  goto <D.19786>;
  <D.19785>:
  i.228 = (unsigned int) i;
  D.22228 = i.228 * 4;
  D.22229 = cards + D.22228;
  card = *D.22229;
  if (card != 0) goto <D.19784>; else goto <D.22230>;
  <D.22230>:
  i = i + 1;
  <D.19786>:
  if (i <= 7) goto <D.19785>; else goto <D.19784>;
  <D.19784>:
  if (i == 8) goto <D.22231>; else goto <D.22232>;
  <D.22231>:
  D.22233 = card_data + 32;
  return D.22233;
  <D.22232>:
  i = i * 4;
  goto <D.19788>;
  <D.19787>:
  i.229 = (sizetype) i;
  D.22235 = card_data + i.229;
  D.22236 = *D.22235;
  if (D.22236 != 0) goto <D.22237>; else goto <D.22238>;
  <D.22237>:
  i.229 = (sizetype) i;
  D.22233 = card_data + i.229;
  return D.22233;
  <D.22238>:
  i = i + 1;
  <D.19788>:
  if (i <= 31) goto <D.19787>; else goto <D.19789>;
  <D.19789>:
  D.22233 = card_data;
  return D.22233;
}


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


pin_major_object (char * obj, struct SgenGrayQueue * queue)
{
  int concurrent_mark.230;
  unsigned int obj.231;
  unsigned int D.22244;
  struct MSBlockHeader * D.22245;
  int obj.232;
  int obj.233;
  int D.22248;
  int D.22249;
  unsigned int D.22255;
  long int D.22256;
  long unsigned int D.22257;
  long unsigned int D.22258;
  long unsigned int D.22261;
  unsigned int D.22262;
  unsigned int D.22263;
  int iftmp.234;
  struct GrayQueueSection * D.22270;
  int D.22272;
  _Bool D.22273;
  long int D.22274;
  long int D.22275;
  int D.22279;
  int D.22280;
  struct MSBlockInfo * block;

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

    {
      int i;

      obj.232 = (int) obj;
      obj.233 = (int) obj;
      D.22248 = obj.233 & -16384;
      D.22249 = obj.232 - D.22248;
      i = D.22249 >> 3;
      if (1 != 0) goto <D.22250>; else goto <D.22251>;
      <D.22250>:
      __word = i >> 5;
      __bit = i & 31;
      goto <D.22252>;
      <D.22251>:
      __word = i >> 6;
      __bit = i & 63;
      <D.22252>:
    }
    if (0 != 0) goto <D.22253>; else goto <D.22254>;
    <D.22253>:
    monoeg_g_log (0B, 4, "object %p not allocated", obj);
    <D.19112>:
    goto <D.19112>;
    <D.22254>:
    D.22255 = block->mark_words[__word];
    D.22256 = 1 << __bit;
    D.22257 = (long unsigned int) D.22256;
    D.22258 = D.22255 & D.22257;
    if (D.22258 == 0) goto <D.22259>; else goto <D.22260>;
    <D.22259>:
    D.22255 = block->mark_words[__word];
    D.22256 = 1 << __bit;
    D.22257 = (long unsigned int) D.22256;
    D.22261 = D.22255 | D.22257;
    block->mark_words[__word] = D.22261;
    D.22262 = BIT_FIELD_REF <*block, 32, 96>;
    D.22263 = D.22262 & 2;
    if (D.22263 != 0) goto <D.22264>; else goto <D.22265>;
    <D.22264>:
    D.22270 = queue->first;
    if (D.22270 == 0B) goto <D.22267>; else goto <D.22271>;
    <D.22271>:
    D.22270 = queue->first;
    D.22272 = D.22270->end;
    if (D.22272 == 125) goto <D.22267>; else goto <D.22268>;
    <D.22267>:
    iftmp.234 = 1;
    goto <D.22269>;
    <D.22268>:
    iftmp.234 = 0;
    <D.22269>:
    D.22273 = iftmp.234 != 0;
    D.22274 = (long int) D.22273;
    D.22275 = __builtin_expect (D.22274, 0);
    if (D.22275 != 0) goto <D.22276>; else goto <D.22277>;
    <D.22276>:
    sgen_gray_object_enqueue (queue, obj);
    goto <D.22278>;
    <D.22277>:
    D.22270 = queue->first;
    D.22270 = queue->first;
    D.22272 = D.22270->end;
    D.22279 = D.22272;
    D.22280 = D.22279 + 1;
    D.22270->end = D.22280;
    D.22270->objects[D.22279] = obj;
    <D.22278>:
    __builtin_prefetch (obj);
    <D.22265>:
    <D.22260>:
  }
}


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

  block = all_blocks;
  goto <D.19721>;
  <D.19720>:
  mark_pinned_objects_in_block (block, queue);
  block = block->next;
  <D.19721>:
  if (block != 0B) goto <D.19720>; else goto <D.19722>;
  <D.19722>:
}


mark_pinned_objects_in_block (struct MSBlockInfo * block, struct SgenGrayQueue * queue)
{
  int D.22281;
  void * * D.22284;
  unsigned int i.235;
  unsigned int D.22286;
  void * * D.22287;
  void * D.22288;
  int D.22289;
  char * D.22290;
  char * D.22291;
  int D.22292;
  int D.22293;
  int D.22294;
  int D.22297;
  int D.22300;
  sizetype D.22301;
  sizetype D.22302;
  char * D.22303;
  int D.22304;
  int D.22305;
  int D.22306;
  int D.22307;
  unsigned int D.22313;
  long int D.22314;
  long unsigned int D.22315;
  long unsigned int D.22316;
  void * D.22319;
  char * D.22322;
  char * D.22324;
  long unsigned int D.22325;
  unsigned int D.22326;
  unsigned int D.22327;
  int iftmp.236;
  struct GrayQueueSection * D.22334;
  int D.22336;
  _Bool D.22337;
  long int D.22338;
  long int D.22339;
  int D.22343;
  int D.22344;
  int i;
  int last_index;

  last_index = -1;
  D.22281 = block->pin_queue_num_entries;
  if (D.22281 == 0) goto <D.22282>; else goto <D.22283>;
  <D.22282>:
  return;
  <D.22283>:
  block->has_pinned = 1;
  i = 0;
  goto <D.19526>;
  <D.19525>:
  {
    int index;

    D.22284 = block->pin_queue_start;
    i.235 = (unsigned int) i;
    D.22286 = i.235 * 4;
    D.22287 = D.22284 + D.22286;
    D.22288 = *D.22287;
    D.22289 = (int) D.22288;
    D.22290 = block->block;
    D.22291 = D.22290 + 16;
    D.22292 = (int) D.22291;
    D.22293 = D.22289 - D.22292;
    D.22294 = block->obj_size;
    index = D.22293 / D.22294;
    if (0 != 0) goto <D.22295>; else goto <D.22296>;
    <D.22295>:
    D.22284 = block->pin_queue_start;
    i.235 = (unsigned int) i;
    D.22286 = i.235 * 4;
    D.22287 = D.22284 + D.22286;
    D.22288 = *D.22287;
    D.22294 = block->obj_size;
    D.22297 = 16368 / D.22294;
    monoeg_g_log (0B, 4, "invalid object %p index %d max-index %d", D.22288, index, D.22297);
    <D.19520>:
    goto <D.19520>;
    <D.22296>:
    if (index == last_index) goto <D.22298>; else goto <D.22299>;
    <D.22298>:
    // predicted unlikely by continue predictor.
    goto <D.19521>;
    <D.22299>:
    {
      int __word;
      int __bit;

      {
        int i;

        D.22290 = block->block;
        D.22294 = block->obj_size;
        D.22300 = D.22294 * index;
        D.22301 = (sizetype) D.22300;
        D.22302 = D.22301 + 16;
        D.22303 = D.22290 + D.22302;
        D.22304 = (int) D.22303;
        D.22290 = block->block;
        D.22294 = block->obj_size;
        D.22300 = D.22294 * index;
        D.22301 = (sizetype) D.22300;
        D.22302 = D.22301 + 16;
        D.22303 = D.22290 + D.22302;
        D.22305 = (int) D.22303;
        D.22306 = D.22305 & -16384;
        D.22307 = D.22304 - D.22306;
        i = D.22307 >> 3;
        if (1 != 0) goto <D.22308>; else goto <D.22309>;
        <D.22308>:
        __word = i >> 5;
        __bit = i & 31;
        goto <D.22310>;
        <D.22309>:
        __word = i >> 6;
        __bit = i & 63;
        <D.22310>:
      }
      D.22313 = block->mark_words[__word];
      D.22314 = 1 << __bit;
      D.22315 = (long unsigned int) D.22314;
      D.22316 = D.22313 & D.22315;
      if (D.22316 == 0) goto <D.22317>; else goto <D.22318>;
      <D.22317>:
      D.22290 = block->block;
      D.22294 = block->obj_size;
      D.22300 = D.22294 * index;
      D.22301 = (sizetype) D.22300;
      D.22302 = D.22301 + 16;
      D.22303 = D.22290 + D.22302;
      D.22319 = MEM[(void * *)D.22303];
      if (D.22319 != 0B) goto <D.22320>; else goto <D.22321>;
      <D.22320>:
      D.22290 = block->block;
      D.22294 = block->obj_size;
      D.22300 = D.22294 * index;
      D.22301 = (sizetype) D.22300;
      D.22302 = D.22301 + 16;
      D.22303 = D.22290 + D.22302;
      D.22322 = MEM[(char * *)D.22303];
      D.22290 = block->block;
      if (D.22322 < D.22290) goto <D.22311>; else goto <D.22323>;
      <D.22323>:
      D.22290 = block->block;
      D.22294 = block->obj_size;
      D.22300 = D.22294 * index;
      D.22301 = (sizetype) D.22300;
      D.22302 = D.22301 + 16;
      D.22303 = D.22290 + D.22302;
      D.22322 = MEM[(char * *)D.22303];
      D.22290 = block->block;
      D.22324 = D.22290 + 16384;
      if (D.22322 >= D.22324) goto <D.22311>; else goto <D.22312>;
      <D.22311>:
      D.22313 = block->mark_words[__word];
      D.22314 = 1 << __bit;
      D.22315 = (long unsigned int) D.22314;
      D.22325 = D.22313 | D.22315;
      block->mark_words[__word] = D.22325;
      D.22326 = BIT_FIELD_REF <*block, 32, 96>;
      D.22327 = D.22326 & 2;
      if (D.22327 != 0) goto <D.22328>; else goto <D.22329>;
      <D.22328>:
      D.22334 = queue->first;
      if (D.22334 == 0B) goto <D.22331>; else goto <D.22335>;
      <D.22335>:
      D.22334 = queue->first;
      D.22336 = D.22334->end;
      if (D.22336 == 125) goto <D.22331>; else goto <D.22332>;
      <D.22331>:
      iftmp.236 = 1;
      goto <D.22333>;
      <D.22332>:
      iftmp.236 = 0;
      <D.22333>:
      D.22337 = iftmp.236 != 0;
      D.22338 = (long int) D.22337;
      D.22339 = __builtin_expect (D.22338, 0);
      if (D.22339 != 0) goto <D.22340>; else goto <D.22341>;
      <D.22340>:
      D.22290 = block->block;
      D.22294 = block->obj_size;
      D.22300 = D.22294 * index;
      D.22301 = (sizetype) D.22300;
      D.22302 = D.22301 + 16;
      D.22303 = D.22290 + D.22302;
      sgen_gray_object_enqueue (queue, D.22303);
      goto <D.22342>;
      <D.22341>:
      D.22334 = queue->first;
      D.22334 = queue->first;
      D.22336 = D.22334->end;
      D.22343 = D.22336;
      D.22344 = D.22343 + 1;
      D.22334->end = D.22344;
      D.22290 = block->block;
      D.22294 = block->obj_size;
      D.22300 = D.22294 * index;
      D.22301 = (sizetype) D.22300;
      D.22302 = D.22301 + 16;
      D.22303 = D.22290 + D.22302;
      D.22334->objects[D.22343] = D.22303;
      <D.22342>:
      D.22290 = block->block;
      D.22294 = block->obj_size;
      D.22300 = D.22294 * index;
      D.22301 = (sizetype) D.22300;
      D.22302 = D.22301 + 16;
      D.22303 = D.22290 + D.22302;
      __builtin_prefetch (D.22303);
      <D.22329>:
      <D.22312>:
      <D.22321>:
      <D.22318>:
    }
    last_index = index;
  }
  <D.19521>:
  i = i + 1;
  <D.19526>:
  D.22281 = block->pin_queue_num_entries;
  if (D.22281 > i) goto <D.19525>; else goto <D.19527>;
  <D.19527>:
}


major_find_pin_queue_start_ends (struct SgenGrayQueue * queue)
{
  char * D.22346;
  void * D.22347;
  void * D.22348;
  int * D.22349;
  void * * D.22350;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19714>;
  <D.19713>:
  D.22346 = block->block;
  D.22347 = D.22346 + 16;
  D.22346 = block->block;
  D.22348 = D.22346 + 16384;
  D.22349 = &block->pin_queue_num_entries;
  D.22350 = sgen_find_optimized_pin_queue_area (D.22347, D.22348, D.22349);
  block->pin_queue_start = D.22350;
  block = block->next;
  <D.19714>:
  if (block != 0B) goto <D.19713>; else goto <D.19715>;
  <D.19715>:
}


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


free_object (char * obj, size_t size, gboolean pinned)
{
  unsigned int obj.237;
  unsigned int D.22352;
  struct MSBlockHeader * D.22353;
  unsigned int D.22354;
  unsigned int D.22355;
  <unnamed-unsigned:1> D.22360;
  int D.22361;
  int obj.238;
  int obj.239;
  int D.22366;
  int D.22367;
  void * * D.22373;
  _Bool D.22376;
  int D.22377;
  int D.22378;
  int D.22379;
  int D.22380;
  int iftmp.240;
  unsigned int D.22382;
  unsigned int D.22383;
  int size.241;
  unsigned int size_index.242;
  unsigned int D.22391;
  struct MSBlockInfo * * D.22392;
  struct MSBlockInfo * D.22393;
  struct MSBlockInfo * block;
  int word;
  int bit;

  obj.237 = (unsigned int) obj;
  D.22352 = obj.237 & 4294950912;
  D.22353 = (struct MSBlockHeader *) D.22352;
  block = D.22353->info;
  D.22354 = BIT_FIELD_REF <*block, 32, 96>;
  D.22355 = D.22354 & 16;
  if (D.22355 == 0) goto <D.22356>; else goto <D.22357>;
  <D.22356>:
  sweep_block (block, 0);
  <D.22357>:
  if (0 != 0) goto <D.22358>; else goto <D.22359>;
  <D.22358>:
  D.22360 = block->pinned;
  D.22361 = (int) D.22360;
  monoeg_g_log (0B, 4, "free-object pinning mixup object %p pinned %d block %p pinned %d", obj, pinned, block, D.22361);
  <D.18979>:
  goto <D.18979>;
  <D.22359>:
  if (0 != 0) goto <D.22362>; else goto <D.22363>;
  <D.22362>:
  monoeg_g_log (0B, 4, "object %p is already free", obj);
  <D.18980>:
  goto <D.18980>;
  <D.22363>:
  {
    int i;

    obj.238 = (int) obj;
    obj.239 = (int) obj;
    D.22366 = obj.239 & -16384;
    D.22367 = obj.238 - D.22366;
    i = D.22367 >> 3;
    if (1 != 0) goto <D.22368>; else goto <D.22369>;
    <D.22368>:
    word = i >> 5;
    bit = i & 31;
    goto <D.22370>;
    <D.22369>:
    word = i >> 6;
    bit = i & 63;
    <D.22370>:
  }
  if (0 != 0) goto <D.22371>; else goto <D.22372>;
  <D.22371>:
  monoeg_g_log (0B, 4, "object %p has mark bit set");
  <D.18982>:
  goto <D.18982>;
  <D.22372>:
  D.22373 = block->free_list;
  if (D.22373 == 0B) goto <D.22374>; else goto <D.22375>;
  <D.22374>:
  {
    struct MSBlockInfo * * free_blocks;
    int size_index;

    D.22376 = pinned != 0;
    D.22377 = (int) D.22376;
    D.22354 = BIT_FIELD_REF <*block, 32, 96>;
    D.22378 = (int) D.22354;
    D.22379 = D.22378 & 2;
    D.22380 = D.22377 | D.22379;
    free_blocks = free_block_lists[D.22380];
    D.22382 = size + 7;
    D.22383 = D.22382 >> 3;
    if (D.22383 <= 31) goto <D.22384>; else goto <D.22385>;
    <D.22384>:
    D.22382 = size + 7;
    D.22383 = D.22382 >> 3;
    iftmp.240 = fast_block_obj_size_indexes[D.22383];
    goto <D.22386>;
    <D.22385>:
    size.241 = (int) size;
    iftmp.240 = ms_find_block_obj_size_index (size.241);
    <D.22386>:
    size_index = iftmp.240;
    if (0 != 0) goto <D.22388>; else goto <D.22389>;
    <D.22388>:
    monoeg_g_log (0B, 4, "block %p doesn\'t have a free-list of object but belongs to a free-list of blocks");
    <D.18985>:
    goto <D.18985>;
    <D.22389>:
    size_index.242 = (unsigned int) size_index;
    D.22391 = size_index.242 * 4;
    D.22392 = free_blocks + D.22391;
    D.22393 = *D.22392;
    block->next_free = D.22393;
    size_index.242 = (unsigned int) size_index;
    D.22391 = size_index.242 * 4;
    D.22392 = free_blocks + D.22391;
    *D.22392 = block;
  }
  <D.22375>:
  memset (obj, 0, size);
  D.22373 = block->free_list;
  MEM[(void * *)obj] = D.22373;
  block->free_list = obj;
}


major_iterate_objects (gboolean non_pinned, gboolean pinned, void (*IterateObjectCallbackFunc) (char *, size_t, void *) callback, void * data)
{
  int D.22394;
  unsigned int D.22395;
  unsigned int D.22396;
  int lazy_sweep.243;
  char * D.22408;
  int D.22409;
  sizetype D.22410;
  sizetype D.22411;
  void * D.22414;
  char * D.22417;
  char * D.22419;
  unsigned int D.22420;
  struct MSBlockInfo * block;

  block = all_blocks;
  goto <D.19043>;
  <D.19042>:
  {
    int count;
    int i;

    D.22394 = block->obj_size;
    count = 16368 / D.22394;
    D.22395 = BIT_FIELD_REF <*block, 32, 96>;
    D.22396 = D.22395 & 1;
    if (D.22396 != 0) goto <D.22397>; else goto <D.22398>;
    <D.22397>:
    if (pinned == 0) goto <D.22399>; else goto <D.22400>;
    <D.22399>:
    // predicted unlikely by continue predictor.
    goto <D.19037>;
    <D.22400>:
    <D.22398>:
    D.22395 = BIT_FIELD_REF <*block, 32, 96>;
    D.22396 = D.22395 & 1;
    if (D.22396 == 0) goto <D.22401>; else goto <D.22402>;
    <D.22401>:
    if (non_pinned == 0) goto <D.22403>; else goto <D.22404>;
    <D.22403>:
    // predicted unlikely by continue predictor.
    goto <D.19037>;
    <D.22404>:
    <D.22402>:
    lazy_sweep.243 = lazy_sweep;
    if (lazy_sweep.243 != 0) goto <D.22406>; else goto <D.22407>;
    <D.22406>:
    sweep_block (block, 0);
    <D.22407>:
    i = 0;
    goto <D.19040>;
    <D.19039>:
    {
      void * * obj;

      D.22408 = block->block;
      D.22394 = block->obj_size;
      D.22409 = D.22394 * i;
      D.22410 = (sizetype) D.22409;
      D.22411 = D.22410 + 16;
      obj = D.22408 + D.22411;
      D.22414 = *obj;
      if (D.22414 != 0B) goto <D.22415>; else goto <D.22416>;
      <D.22415>:
      D.22417 = MEM[(char * *)obj];
      D.22408 = block->block;
      if (D.22417 < D.22408) goto <D.22412>; else goto <D.22418>;
      <D.22418>:
      D.22417 = MEM[(char * *)obj];
      D.22408 = block->block;
      D.22419 = D.22408 + 16384;
      if (D.22417 >= D.22419) goto <D.22412>; else goto <D.22413>;
      <D.22412>:
      D.22394 = block->obj_size;
      D.22420 = (unsigned int) D.22394;
      callback (obj, D.22420, data);
      <D.22413>:
      <D.22416>:
    }
    i = i + 1;
    <D.19040>:
    if (i < count) goto <D.19039>; else goto <D.19041>;
    <D.19041>:
  }
  <D.19037>:
  block = block->next;
  <D.19043>:
  if (block != 0B) goto <D.19042>; else goto <D.19044>;
  <D.19044>:
}


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

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


alloc_obj (struct MonoVTable * vtable, int size, gboolean pinned, gboolean has_references)
{
  int iftmp.244;
  int D.22424;
  int D.22425;
  _Bool D.22429;
  int D.22430;
  int iftmp.245;
  int D.22435;
  unsigned int size_index.246;
  unsigned int D.22437;
  struct MSBlockInfo * * D.22438;
  struct MSBlockInfo * D.22439;
  int D.22442;
  _Bool D.22443;
  long int D.22444;
  long int D.22445;
  void * D.22448;
  int size_index;
  struct MSBlockInfo * * free_blocks;
  void * obj;

  D.22424 = size + 7;
  D.22425 = D.22424 >> 3;
  if (D.22425 <= 31) goto <D.22426>; else goto <D.22427>;
  <D.22426>:
  D.22424 = size + 7;
  D.22425 = D.22424 >> 3;
  iftmp.244 = fast_block_obj_size_indexes[D.22425];
  goto <D.22428>;
  <D.22427>:
  iftmp.244 = ms_find_block_obj_size_index (size);
  <D.22428>:
  size_index = iftmp.244;
  D.22429 = pinned != 0;
  D.22430 = (int) D.22429;
  if (has_references != 0) goto <D.22432>; else goto <D.22433>;
  <D.22432>:
  iftmp.245 = 2;
  goto <D.22434>;
  <D.22433>:
  iftmp.245 = 0;
  <D.22434>:
  D.22435 = D.22430 | iftmp.245;
  free_blocks = free_block_lists[D.22435];
  size_index.246 = (unsigned int) size_index;
  D.22437 = size_index.246 * 4;
  D.22438 = free_blocks + D.22437;
  D.22439 = *D.22438;
  if (D.22439 == 0B) goto <D.22440>; else goto <D.22441>;
  <D.22440>:
  D.22442 = ms_alloc_block (size_index, pinned, has_references);
  D.22443 = D.22442 == 0;
  D.22444 = (long int) D.22443;
  D.22445 = __builtin_expect (D.22444, 0);
  if (D.22445 != 0) goto <D.22446>; else goto <D.22447>;
  <D.22446>:
  D.22448 = 0B;
  return D.22448;
  <D.22447>:
  <D.22441>:
  obj = unlink_slot_from_free_list_uncontested (free_blocks, size_index);
  MEM[(struct MonoVTable * *)obj] = vtable;
  D.22448 = obj;
  return D.22448;
}


ms_alloc_block (int size_index, gboolean pinned, gboolean has_references)
{
  int * block_obj_sizes.247;
  unsigned int size_index.248;
  unsigned int D.22452;
  int * D.22453;
  _Bool D.22454;
  int D.22455;
  int iftmp.249;
  int D.22460;
  int D.22461;
  gboolean D.22464;
  unsigned char D.22467;
  <unnamed-unsigned:1> D.22468;
  unsigned char D.22469;
  <unnamed-unsigned:1> D.22470;
  int D.22471;
  _Bool D.22472;
  void * D.22473;
  char * D.22474;
  sizetype size.250;
  int D.22476;
  struct MSBlockInfo * * D.22477;
  struct MSBlockInfo * D.22478;
  struct MSBlockInfo * all_blocks.251;
  int num_major_sections.252;
  int num_major_sections.253;
  int size;
  int count;
  struct MSBlockInfo * info;
  struct MSBlockHeader * header;
  struct MSBlockInfo * * free_blocks;
  char * obj_start;
  int i;

  block_obj_sizes.247 = block_obj_sizes;
  size_index.248 = (unsigned int) size_index;
  D.22452 = size_index.248 * 4;
  D.22453 = block_obj_sizes.247 + D.22452;
  size = *D.22453;
  count = 16368 / size;
  D.22454 = pinned != 0;
  D.22455 = (int) D.22454;
  if (has_references != 0) goto <D.22457>; else goto <D.22458>;
  <D.22457>:
  iftmp.249 = 2;
  goto <D.22459>;
  <D.22458>:
  iftmp.249 = 0;
  <D.22459>:
  D.22460 = D.22455 | iftmp.249;
  free_blocks = free_block_lists[D.22460];
  D.22461 = sgen_memgov_try_alloc_space (16384, 1);
  if (D.22461 == 0) goto <D.22462>; else goto <D.22463>;
  <D.22462>:
  D.22464 = 0;
  return D.22464;
  <D.22463>:
  info = sgen_alloc_internal (16);
  if (0 != 0) goto <D.22465>; else goto <D.22466>;
  <D.22465>:
  monoeg_g_log (0B, 4, "block with %d objects, it must hold at least 2", count);
  <D.18937>:
  goto <D.18937>;
  <D.22466>:
  info->obj_size = size;
  info->obj_size_index = size_index;
  D.22467 = (unsigned char) pinned;
  D.22468 = (<unnamed-unsigned:1>) D.22467;
  info->pinned = D.22468;
  D.22469 = (unsigned char) has_references;
  D.22470 = (<unnamed-unsigned:1>) D.22469;
  info->has_references = D.22470;
  D.22467 = (unsigned char) pinned;
  D.22468 = (<unnamed-unsigned:1>) D.22467;
  info->has_pinned = D.22468;
  D.22471 = sgen_get_current_collection_generation ();
  D.22472 = D.22471 == 1;
  info->is_to_space = D.22472;
  info->swept = 1;
  D.22473 = ms_get_empty_block ();
  info->block = D.22473;
  header = info->block;
  header->info = info;
  info->cardtable_mod_union = 0B;
  update_heap_boundaries_for_block (info);
  D.22474 = info->block;
  obj_start = D.22474 + 16;
  info->free_list = obj_start;
  i = 0;
  goto <D.18940>;
  <D.18939>:
  {
    char * next_obj_start;

    size.250 = (sizetype) size;
    next_obj_start = obj_start + size.250;
    MEM[(void * *)obj_start] = next_obj_start;
    obj_start = next_obj_start;
  }
  i = i + 1;
  <D.18940>:
  D.22476 = count + -1;
  if (D.22476 > i) goto <D.18939>; else goto <D.18941>;
  <D.18941>:
  MEM[(void * *)obj_start] = 0B;
  size_index.248 = (unsigned int) size_index;
  D.22452 = size_index.248 * 4;
  D.22477 = free_blocks + D.22452;
  D.22478 = *D.22477;
  info->next_free = D.22478;
  size_index.248 = (unsigned int) size_index;
  D.22452 = size_index.248 * 4;
  D.22477 = free_blocks + D.22452;
  *D.22477 = info;
  all_blocks.251 = all_blocks;
  info->next = all_blocks.251;
  all_blocks = info;
  num_major_sections.252 = num_major_sections;
  num_major_sections.253 = num_major_sections.252 + 1;
  num_major_sections = num_major_sections.253;
  D.22464 = 1;
  return D.22464;
}


ms_get_empty_block ()
{
  void * empty_blocks.254;
  int D.22486;
  unsigned int D.22487;
  const char * iftmp.255;
  void * D.22493;
  int D.22494;
  int D.22495;
  long long int D.22496;
  long long int stat_major_blocks_alloced.256;
  long long int stat_major_blocks_alloced.257;
  long long int stat_major_blocks_alloced_less_ideal.258;
  long long int stat_major_blocks_alloced_less_ideal.259;
  void * D.22504;
  int D.22505;
  int D.22506;
  unsigned int block.260;
  unsigned int D.22508;
  _Bool D.22509;
  long int D.22510;
  long int D.22511;
  void * D.22514;
  char * p;
  int i;
  void * block;
  void * empty;
  void * next;
  void retry = <<< error >>>;

  retry:
  empty_blocks.254 = empty_blocks;
  if (empty_blocks.254 == 0B) goto <D.22484>; else goto <D.22485>;
  <D.22484>:
  {
    int alloc_num;

    alloc_num = 32;
    <D.18902>:
    D.22486 = alloc_num * 16384;
    D.22487 = (unsigned int) D.22486;
    if (alloc_num == 1) goto <D.22489>; else goto <D.22490>;
    <D.22489>:
    iftmp.255 = "major heap section";
    goto <D.22491>;
    <D.22490>:
    iftmp.255 = 0B;
    <D.22491>:
    p = sgen_alloc_os_memory_aligned (D.22487, 16384, 3, iftmp.255);
    if (p != 0B) goto <D.18901>; else goto <D.22492>;
    <D.22492>:
    alloc_num = alloc_num >> 1;
    goto <D.18902>;
    <D.18901>:
    i = 0;
    goto <D.18906>;
    <D.18905>:
    block = p;
    <D.18903>:
    empty = empty_blocks;
    MEM[(void * *)block] = empty;
    D.22493 = InterlockedCompareExchangePointer (&empty_blocks, block, empty);
    if (D.22493 != empty) goto <D.18903>; else goto <D.18904>;
    <D.18904>:
    p = p + 16384;
    i = i + 1;
    <D.18906>:
    if (i < alloc_num) goto <D.18905>; else goto <D.18907>;
    <D.18907>:
    {
      int __old_x;

      <D.18909>:
      __old_x = num_empty_blocks;
      D.22494 = __old_x + alloc_num;
      D.22495 = InterlockedCompareExchange (&num_empty_blocks, D.22494, __old_x);
      if (D.22495 != __old_x) goto <D.18909>; else goto <D.18910>;
      <D.18910>:
    }
    D.22496 = (long long int) alloc_num;
    stat_major_blocks_alloced.256 = stat_major_blocks_alloced;
    stat_major_blocks_alloced.257 = D.22496 + stat_major_blocks_alloced.256;
    stat_major_blocks_alloced = stat_major_blocks_alloced.257;
    if (alloc_num != 32) goto <D.22499>; else goto <D.22500>;
    <D.22499>:
    D.22496 = (long long int) alloc_num;
    stat_major_blocks_alloced_less_ideal.258 = stat_major_blocks_alloced_less_ideal;
    stat_major_blocks_alloced_less_ideal.259 = D.22496 + stat_major_blocks_alloced_less_ideal.258;
    stat_major_blocks_alloced_less_ideal = stat_major_blocks_alloced_less_ideal.259;
    <D.22500>:
  }
  <D.22485>:
  <D.18911>:
  empty = empty_blocks;
  if (empty == 0B) goto retry; else goto <D.22503>;
  <D.22503>:
  block = empty;
  next = MEM[(void * *)block];
  D.22504 = InterlockedCompareExchangePointer (&empty_blocks, next, empty);
  if (D.22504 != empty) goto <D.18911>; else goto <D.18912>;
  <D.18912>:
  {
    int __old_x;

    <D.18914>:
    __old_x = num_empty_blocks;
    D.22505 = __old_x + -1;
    D.22506 = InterlockedCompareExchange (&num_empty_blocks, D.22505, __old_x);
    if (D.22506 != __old_x) goto <D.18914>; else goto <D.18915>;
    <D.18915>:
  }
  MEM[(void * *)block] = 0B;
  block.260 = (unsigned int) block;
  D.22508 = block.260 & 16383;
  D.22509 = D.22508 != 0;
  D.22510 = (long int) D.22509;
  D.22511 = __builtin_expect (D.22510, 0);
  if (D.22511 != 0) goto <D.22512>; else goto <D.22513>;
  <D.22512>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 421, "!((mword)block & (MS_BLOCK_SIZE - 1))");
  <D.22513>:
  D.22514 = block;
  return D.22514;
}


unlink_slot_from_free_list_uncontested (struct MSBlockInfo * * free_blocks, int size_index)
{
  unsigned int size_index.261;
  unsigned int D.22517;
  struct MSBlockInfo * * D.22518;
  unsigned int D.22521;
  unsigned int D.22522;
  _Bool D.22523;
  long int D.22524;
  long int D.22525;
  long long int stat_major_blocks_lazy_swept.262;
  long long int stat_major_blocks_lazy_swept.263;
  void * D.22532;
  void * * D.22533;
  struct MSBlockInfo * D.22536;
  void * D.22537;
  struct MSBlockInfo * block;
  void * obj;

  size_index.261 = (unsigned int) size_index;
  D.22517 = size_index.261 * 4;
  D.22518 = free_blocks + D.22517;
  block = *D.22518;
  if (0 != 0) goto <D.22519>; else goto <D.22520>;
  <D.22519>:
  monoeg_g_log (0B, 4, "no free block to unlink from free_blocks %p size_index %d", free_blocks, size_index);
  <D.18955>:
  goto <D.18955>;
  <D.22520>:
  D.22521 = BIT_FIELD_REF <*block, 32, 96>;
  D.22522 = D.22521 & 16;
  D.22523 = D.22522 == 0;
  D.22524 = (long int) D.22523;
  D.22525 = __builtin_expect (D.22524, 0);
  if (D.22525 != 0) goto <D.22526>; else goto <D.22527>;
  <D.22526>:
  stat_major_blocks_lazy_swept.262 = stat_major_blocks_lazy_swept;
  stat_major_blocks_lazy_swept.263 = stat_major_blocks_lazy_swept.262 + 1;
  stat_major_blocks_lazy_swept = stat_major_blocks_lazy_swept.263;
  sweep_block (block, 0);
  <D.22527>:
  obj = block->free_list;
  if (0 != 0) goto <D.22530>; else goto <D.22531>;
  <D.22530>:
  monoeg_g_log (0B, 4, "block %p in free list had no available object to alloc from", block);
  <D.18956>:
  goto <D.18956>;
  <D.22531>:
  D.22532 = MEM[(void * *)obj];
  block->free_list = D.22532;
  D.22533 = block->free_list;
  if (D.22533 == 0B) goto <D.22534>; else goto <D.22535>;
  <D.22534>:
  size_index.261 = (unsigned int) size_index;
  D.22517 = size_index.261 * 4;
  D.22518 = free_blocks + D.22517;
  D.22536 = block->next_free;
  *D.22518 = D.22536;
  block->next_free = 0B;
  <D.22535>:
  D.22537 = obj;
  return D.22537;
}


major_alloc_degraded (struct MonoVTable * vtable, size_t size)
{
  int size.264;
  void * D.22540;
  unsigned int D.22541;
  int D.22542;
  _Bool D.22543;
  long int D.22544;
  long int D.22545;
  int num_major_sections.265;
  _Bool D.22549;
  long int D.22550;
  long int D.22551;
  int D.22554;
  void * D.22555;
  void * obj;
  int old_num_sections;

  old_num_sections = num_major_sections;
  size.264 = (int) size;
  D.22540 = vtable->gc_descr;
  D.22541 = (unsigned int) D.22540;
  D.22542 = sgen_gc_descr_has_references (D.22541);
  obj = alloc_obj (vtable, size.264, 0, D.22542);
  D.22543 = obj != 0B;
  D.22544 = (long int) D.22543;
  D.22545 = __builtin_expect (D.22544, 1);
  if (D.22545 != 0) goto <D.22546>; else goto <D.22547>;
  <D.22546>:
  num_major_sections.265 = num_major_sections;
  D.22549 = num_major_sections.265 < old_num_sections;
  D.22550 = (long int) D.22549;
  D.22551 = __builtin_expect (D.22550, 0);
  if (D.22551 != 0) goto <D.22552>; else goto <D.22553>;
  <D.22552>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-marksweep.c", 842, "num_major_sections >= old_num_sections");
  <D.22553>:
  num_major_sections.265 = num_major_sections;
  D.22554 = num_major_sections.265 - old_num_sections;
  sgen_register_major_sections_alloced (D.22554);
  <D.22547>:
  D.22555 = obj;
  return D.22555;
}


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

  size.266 = (int) size;
  res = alloc_obj (vtable, size.266, 1, has_references);
  if (res == 0B) goto <D.22558>; else goto <D.22559>;
  <D.22558>:
  sgen_perform_collection (0, 1, "pinned alloc failure", 1);
  size.266 = (int) size;
  res = alloc_obj (vtable, size.266, 1, has_references);
  <D.22559>:
  D.22560 = res;
  return D.22560;
}


major_is_object_live (char * obj)
{
  int D.22562;
  gboolean D.22565;
  unsigned int D.22566;
  unsigned int D.22567;
  unsigned int obj.267;
  unsigned int D.22571;
  struct MSBlockHeader * D.22572;
  int obj.268;
  int obj.269;
  int D.22577;
  int D.22578;
  unsigned int D.22582;
  long int D.22583;
  long unsigned int D.22584;
  long unsigned int D.22585;
  _Bool D.22586;
  struct MSBlockInfo * block;
  int word;
  int bit;
  mword objsize;

  D.22562 = sgen_ptr_in_nursery (obj);
  if (D.22562 != 0) goto <D.22563>; else goto <D.22564>;
  <D.22563>:
  D.22565 = 0;
  return D.22565;
  <D.22564>:
  D.22566 = sgen_safe_object_get_size (obj);
  D.22567 = D.22566 + 7;
  objsize = D.22567 & 4294967288;
  if (objsize > 8000) goto <D.22568>; else goto <D.22569>;
  <D.22568>:
  D.22565 = 0;
  return D.22565;
  <D.22569>:
  obj.267 = (unsigned int) obj;
  D.22571 = obj.267 & 4294950912;
  D.22572 = (struct MSBlockHeader *) D.22571;
  block = D.22572->info;
  if (0 != 0) goto <D.22573>; else goto <D.22574>;
  <D.22573>:
  monoeg_g_log (0B, 4, "block %p is pinned, BTW why is this bad?");
  <D.19013>:
  goto <D.19013>;
  <D.22574>:
  {
    int i;

    obj.268 = (int) obj;
    obj.269 = (int) obj;
    D.22577 = obj.269 & -16384;
    D.22578 = obj.268 - D.22577;
    i = D.22578 >> 3;
    if (1 != 0) goto <D.22579>; else goto <D.22580>;
    <D.22579>:
    word = i >> 5;
    bit = i & 31;
    goto <D.22581>;
    <D.22580>:
    word = i >> 6;
    bit = i & 63;
    <D.22581>:
  }
  D.22582 = block->mark_words[word];
  D.22583 = 1 << bit;
  D.22584 = (long unsigned int) D.22583;
  D.22585 = D.22582 & D.22584;
  D.22586 = D.22585 != 0;
  D.22565 = (gboolean) D.22586;
  return D.22565;
}


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

  if (nursery_align != 0) goto <D.22588>; else goto <D.22589>;
  <D.22588>:
  start = sgen_alloc_os_memory_aligned (nursery_size, nursery_align, 3, "nursery");
  goto <D.22590>;
  <D.22589>:
  start = sgen_alloc_os_memory (nursery_size, 3, "nursery");
  <D.22590>:
  D.22591 = start;
  return D.22591;
}


major_get_and_reset_num_major_objects_marked ()
{
  long long int D.22593;

  D.22593 = 0;
  return D.22593;
}


ms_calculate_block_obj_sizes (double factor, int * arr)
{
  double D.22595;
  int D.22596;
  int D.22597;
  unsigned int num_sizes.270;
  unsigned int D.22603;
  int * D.22604;
  int D.22605;
  double target_size;
  int num_sizes;
  int last_size;

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

    D.22595 = 1.6368e+4 / target_size;
    target_count = __builtin_lceil (D.22595);
    D.22596 = 16368 / target_count;
    D.22597 = D.22596 & -8;
    size = MIN_EXPR <D.22597, 8000>;
    if (size != last_size) goto <D.22598>; else goto <D.22599>;
    <D.22598>:
    if (arr != 0B) goto <D.22600>; else goto <D.22601>;
    <D.22600>:
    num_sizes.270 = (unsigned int) num_sizes;
    D.22603 = num_sizes.270 * 4;
    D.22604 = arr + D.22603;
    *D.22604 = size;
    <D.22601>:
    num_sizes = num_sizes + 1;
    last_size = size;
    <D.22599>:
    target_size = target_size * factor;
  }
  if (last_size <= 7999) goto <D.19632>; else goto <D.19633>;
  <D.19633>:
  D.22605 = num_sizes;
  return D.22605;
}


alloc_free_block_lists (struct MSBlockInfo * * * lists)
{
  unsigned int i.271;
  unsigned int D.22608;
  struct MSBlockInfo * * * D.22609;
  int num_block_obj_sizes.272;
  unsigned int num_block_obj_sizes.273;
  unsigned int D.22612;
  void * D.22613;
  int i;

  i = 0;
  goto <D.19860>;
  <D.19859>:
  i.271 = (unsigned int) i;
  D.22608 = i.271 * 4;
  D.22609 = lists + D.22608;
  num_block_obj_sizes.272 = num_block_obj_sizes;
  num_block_obj_sizes.273 = (unsigned int) num_block_obj_sizes.272;
  D.22612 = num_block_obj_sizes.273 * 4;
  D.22613 = sgen_alloc_internal_dynamic (D.22612, 15, 1);
  *D.22609 = D.22613;
  i = i + 1;
  <D.19860>:
  if (i <= 3) goto <D.19859>; else goto <D.19861>;
  <D.19861>:
}


ms_find_block_obj_size_index (int size)
{
  int * block_obj_sizes.274;
  unsigned int i.275;
  unsigned int D.22618;
  int * D.22619;
  int D.22620;
  int D.22623;
  int num_block_obj_sizes.276;
  int i;

  if (0 != 0) goto <D.22614>; else goto <D.22615>;
  <D.22614>:
  monoeg_g_log (0B, 4, "size %d is bigger than max small object size %d", size, 8000);
  <D.18877>:
  goto <D.18877>;
  <D.22615>:
  i = 0;
  goto <D.18879>;
  <D.18878>:
  block_obj_sizes.274 = block_obj_sizes;
  i.275 = (unsigned int) i;
  D.22618 = i.275 * 4;
  D.22619 = block_obj_sizes.274 + D.22618;
  D.22620 = *D.22619;
  if (D.22620 >= size) goto <D.22621>; else goto <D.22622>;
  <D.22621>:
  D.22623 = i;
  return D.22623;
  <D.22622>:
  i = i + 1;
  <D.18879>:
  num_block_obj_sizes.276 = num_block_obj_sizes;
  if (i < num_block_obj_sizes.276) goto <D.18878>; else goto <D.18880>;
  <D.18880>:
  monoeg_g_log (0B, 4, "no object of size %d\n", size);
  <D.18881>:
  goto <D.18881>;
}


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


