__attribute__((visibility ("hidden")))
sgen_need_major_collection (mword space_needed)
{
  int D.18005;
  gboolean D.18008;
  long unsigned int los_memory_usage.0;
  long unsigned int last_collection_los_memory_usage.1;
  long unsigned int D.18011;
  int iftmp.2;
  long unsigned int D.18016;
  int minor_collection_sections_alloced.3;
  long unsigned int D.18019;
  long unsigned int D.18020;
  long unsigned int D.18021;
  long unsigned int D.18022;
  long unsigned int minor_collection_allowance.4;
  mword los_alloced;

  D.18005 = sgen_concurrent_collection_in_progress ();
  if (D.18005 != 0) goto <D.18006>; else goto <D.18007>;
  <D.18006>:
  D.18008 = 0;
  return D.18008;
  <D.18007>:
  los_memory_usage.0 = los_memory_usage;
  los_memory_usage.0 = los_memory_usage;
  last_collection_los_memory_usage.1 = last_collection_los_memory_usage;
  D.18011 = MIN_EXPR <los_memory_usage.0, last_collection_los_memory_usage.1>;
  los_alloced = los_memory_usage.0 - D.18011;
  D.18016 = sgen_memgov_available_free_space ();
  if (D.18016 < space_needed) goto <D.18013>; else goto <D.18017>;
  <D.18017>:
  minor_collection_sections_alloced.3 = minor_collection_sections_alloced;
  D.18019 = (long unsigned int) minor_collection_sections_alloced.3;
  D.18020 = major_collector.section_size;
  D.18021 = D.18019 * D.18020;
  D.18022 = D.18021 + los_alloced;
  minor_collection_allowance.4 = minor_collection_allowance;
  if (D.18022 > minor_collection_allowance.4) goto <D.18013>; else goto <D.18014>;
  <D.18013>:
  iftmp.2 = 1;
  goto <D.18015>;
  <D.18014>:
  iftmp.2 = 0;
  <D.18015>:
  D.18008 = iftmp.2;
  return D.18008;
}


sgen_memgov_available_free_space ()
{
  mword D.18025;
  long unsigned int max_heap_size.5;
  long unsigned int allocated_heap.6;
  long unsigned int D.18028;

  max_heap_size.5 = max_heap_size;
  max_heap_size.5 = max_heap_size;
  allocated_heap.6 = allocated_heap;
  D.18028 = MIN_EXPR <max_heap_size.5, allocated_heap.6>;
  D.18025 = max_heap_size.5 - D.18028;
  return D.18025;
}


__attribute__((visibility ("hidden")))
sgen_memgov_minor_collection_start ()
{
  sgen_memgov_try_calculate_minor_collection_allowance (0);
}


sgen_memgov_try_calculate_minor_collection_allowance (gboolean overwrite)
{
  int need_calculate_minor_collection_allowance.7;
  _Bool D.18033;
  long int D.18034;
  long int D.18035;
  gboolean * D.18040;
  int D.18041;
  int sgen_nursery_size.8;
  double D.18047;
  double default_allowance_nursery_size_ratio.9;
  double D.18049;
  long unsigned int D.18050;
  int (*<Tb4a>) (void) D.18051;
  int last_collection_old_num_major_sections.10;
  int D.18053;
  long unsigned int last_collection_old_los_memory_usage.11;
  long unsigned int last_collection_los_memory_usage.12;
  long unsigned int D.18056;
  long unsigned int D.18057;
  long unsigned int D.18058;
  long unsigned int D.18059;
  double D.18060;
  double D.18061;
  double D.18062;
  int minor_collection_sections_alloced.13;
  long unsigned int D.18064;
  long unsigned int D.18065;
  long unsigned int last_collection_los_memory_alloced.14;
  long unsigned int D.18067;
  double D.18068;
  double D.18069;
  long unsigned int D.18070;
  long unsigned int D.18071;
  long unsigned int D.18072;
  double D.18073;
  double D.18074;
  long unsigned int D.18075;
  long unsigned int los_memory_usage.15;
  long unsigned int D.18077;
  long unsigned int D.18078;
  long unsigned int D.18079;
  long unsigned int minor_collection_allowance.16;
  long unsigned int D.18081;
  long unsigned int soft_heap_limit.17;
  long unsigned int D.18088;
  long unsigned int D.18089;
  int debug_print_allowance.18;
  long unsigned int D.18093;
  int gc_debug_level.19;
  _Bool D.18095;
  long int D.18096;
  long int D.18097;
  struct FILE * gc_debug_file.20;
  long unsigned int D.18101;
  long int D.18102;
  long int old_major.21;
  long int last_collection_old_los_memory_usage.22;
  long int new_heap_size.23;
  long int new_major.24;
  long int last_collection_los_memory_usage.25;
  long int minor_collection_allowance.26;
  void (*<T5d8>) (void) D.18113;
  int num_major_sections;
  int num_major_sections_saved;
  mword los_memory_saved;
  mword new_major;
  mword new_heap_size;
  mword save_target;
  mword allowance_target;

  if (overwrite != 0) goto <D.18030>; else goto <D.18031>;
  <D.18030>:
  need_calculate_minor_collection_allowance.7 = need_calculate_minor_collection_allowance;
  D.18033 = need_calculate_minor_collection_allowance.7 == 0;
  D.18034 = (long int) D.18033;
  D.18035 = __builtin_expect (D.18034, 0);
  if (D.18035 != 0) goto <D.18036>; else goto <D.18037>;
  <D.18036>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-memory-governor.c", 92, "need_calculate_minor_collection_allowance");
  <D.18037>:
  <D.18031>:
  need_calculate_minor_collection_allowance.7 = need_calculate_minor_collection_allowance;
  if (need_calculate_minor_collection_allowance.7 == 0) goto <D.18038>; else goto <D.18039>;
  <D.18038>:
  return;
  <D.18039>:
  D.18040 = major_collector.have_swept;
  D.18041 = *D.18040;
  if (D.18041 == 0) goto <D.18042>; else goto <D.18043>;
  <D.18042>:
  if (overwrite != 0) goto <D.18044>; else goto <D.18045>;
  <D.18044>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18047 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18049 = D.18047 * default_allowance_nursery_size_ratio.9;
  D.18050 = (long unsigned int) D.18049;
  minor_collection_allowance = D.18050;
  <D.18045>:
  return;
  <D.18043>:
  D.18051 = major_collector.get_num_major_sections;
  num_major_sections = D.18051 ();
  last_collection_old_num_major_sections.10 = last_collection_old_num_major_sections;
  D.18053 = last_collection_old_num_major_sections.10 - num_major_sections;
  num_major_sections_saved = MAX_EXPR <D.18053, 0>;
  last_collection_old_los_memory_usage.11 = last_collection_old_los_memory_usage;
  last_collection_los_memory_usage.12 = last_collection_los_memory_usage;
  D.18056 = last_collection_old_los_memory_usage.11 - last_collection_los_memory_usage.12;
  los_memory_saved = MAX_EXPR <D.18056, 1>;
  D.18057 = (long unsigned int) num_major_sections;
  D.18058 = major_collector.section_size;
  new_major = D.18057 * D.18058;
  last_collection_los_memory_usage.12 = last_collection_los_memory_usage;
  new_heap_size = new_major + last_collection_los_memory_usage.12;
  last_collection_los_memory_usage.12 = last_collection_los_memory_usage;
  D.18059 = new_major + last_collection_los_memory_usage.12;
  D.18060 = (double) D.18059;
  D.18061 = D.18060 * 5.0e-1;
  save_target = (mword) D.18061;
  D.18062 = (double) save_target;
  minor_collection_sections_alloced.13 = minor_collection_sections_alloced;
  D.18064 = (long unsigned int) minor_collection_sections_alloced.13;
  D.18058 = major_collector.section_size;
  D.18065 = D.18064 * D.18058;
  last_collection_los_memory_alloced.14 = last_collection_los_memory_alloced;
  D.18067 = D.18065 + last_collection_los_memory_alloced.14;
  D.18068 = (double) D.18067;
  D.18069 = D.18062 * D.18068;
  D.18070 = (long unsigned int) num_major_sections_saved;
  D.18058 = major_collector.section_size;
  D.18071 = D.18070 * D.18058;
  D.18072 = D.18071 + los_memory_saved;
  D.18073 = (double) D.18072;
  D.18074 = D.18069 / D.18073;
  allowance_target = double_to_mword_with_saturation (D.18074);
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18047 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18049 = D.18047 * default_allowance_nursery_size_ratio.9;
  D.18050 = (long unsigned int) D.18049;
  D.18057 = (long unsigned int) num_major_sections;
  D.18058 = major_collector.section_size;
  D.18075 = D.18057 * D.18058;
  los_memory_usage.15 = los_memory_usage;
  D.18077 = D.18075 + los_memory_usage.15;
  D.18078 = MIN_EXPR <D.18077, allowance_target>;
  D.18079 = MAX_EXPR <D.18050, D.18078>;
  minor_collection_allowance = D.18079;
  minor_collection_allowance.16 = minor_collection_allowance;
  D.18081 = new_heap_size + minor_collection_allowance.16;
  soft_heap_limit.17 = soft_heap_limit;
  if (D.18081 > soft_heap_limit.17) goto <D.18083>; else goto <D.18084>;
  <D.18083>:
  soft_heap_limit.17 = soft_heap_limit;
  if (new_heap_size > soft_heap_limit.17) goto <D.18085>; else goto <D.18086>;
  <D.18085>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18047 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18049 = D.18047 * default_allowance_nursery_size_ratio.9;
  D.18050 = (long unsigned int) D.18049;
  minor_collection_allowance = D.18050;
  goto <D.18087>;
  <D.18086>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18047 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18049 = D.18047 * default_allowance_nursery_size_ratio.9;
  D.18050 = (long unsigned int) D.18049;
  soft_heap_limit.17 = soft_heap_limit;
  D.18088 = soft_heap_limit.17 - new_heap_size;
  D.18089 = MAX_EXPR <D.18050, D.18088>;
  minor_collection_allowance = D.18089;
  <D.18087>:
  <D.18084>:
  debug_print_allowance.18 = debug_print_allowance;
  if (debug_print_allowance.18 != 0) goto <D.18091>; else goto <D.18092>;
  <D.18091>:
  {
    mword old_major;

    last_collection_old_num_major_sections.10 = last_collection_old_num_major_sections;
    D.18093 = (long unsigned int) last_collection_old_num_major_sections.10;
    D.18058 = major_collector.section_size;
    old_major = D.18093 * D.18058;
    gc_debug_level.19 = gc_debug_level;
    D.18095 = gc_debug_level.19 > 0;
    D.18096 = (long int) D.18095;
    D.18097 = __builtin_expect (D.18096, 0);
    if (D.18097 != 0) goto <D.18098>; else goto <D.18099>;
    <D.18098>:
    gc_debug_file.20 = gc_debug_file;
    last_collection_old_los_memory_usage.11 = last_collection_old_los_memory_usage;
    D.18101 = old_major + last_collection_old_los_memory_usage.11;
    D.18102 = (long int) D.18101;
    old_major.21 = (long int) old_major;
    last_collection_old_los_memory_usage.11 = last_collection_old_los_memory_usage;
    last_collection_old_los_memory_usage.22 = (long int) last_collection_old_los_memory_usage.11;
    fprintf (gc_debug_file.20, "Before collection: %ld bytes (%ld major, %ld LOS)\n", D.18102, old_major.21, last_collection_old_los_memory_usage.22);
    gc_debug_file.20 = gc_debug_file;
    fflush (gc_debug_file.20);
    <D.18099>:
    gc_debug_level.19 = gc_debug_level;
    D.18095 = gc_debug_level.19 > 0;
    D.18096 = (long int) D.18095;
    D.18097 = __builtin_expect (D.18096, 0);
    if (D.18097 != 0) goto <D.18105>; else goto <D.18106>;
    <D.18105>:
    gc_debug_file.20 = gc_debug_file;
    new_heap_size.23 = (long int) new_heap_size;
    new_major.24 = (long int) new_major;
    last_collection_los_memory_usage.12 = last_collection_los_memory_usage;
    last_collection_los_memory_usage.25 = (long int) last_collection_los_memory_usage.12;
    fprintf (gc_debug_file.20, "After collection: %ld bytes (%ld major, %ld LOS)\n", new_heap_size.23, new_major.24, last_collection_los_memory_usage.25);
    gc_debug_file.20 = gc_debug_file;
    fflush (gc_debug_file.20);
    <D.18106>:
    gc_debug_level.19 = gc_debug_level;
    D.18095 = gc_debug_level.19 > 0;
    D.18096 = (long int) D.18095;
    D.18097 = __builtin_expect (D.18096, 0);
    if (D.18097 != 0) goto <D.18110>; else goto <D.18111>;
    <D.18110>:
    gc_debug_file.20 = gc_debug_file;
    minor_collection_allowance.16 = minor_collection_allowance;
    minor_collection_allowance.26 = (long int) minor_collection_allowance.16;
    fprintf (gc_debug_file.20, "Allowance: %ld bytes\n", minor_collection_allowance.26);
    gc_debug_file.20 = gc_debug_file;
    fflush (gc_debug_file.20);
    <D.18111>:
  }
  <D.18092>:
  D.18113 = major_collector.have_computed_minor_collection_allowance;
  if (D.18113 != 0B) goto <D.18114>; else goto <D.18115>;
  <D.18114>:
  D.18113 = major_collector.have_computed_minor_collection_allowance;
  D.18113 ();
  <D.18115>:
  need_calculate_minor_collection_allowance = 0;
}


double_to_mword_with_saturation (double value)
{
  mword D.18119;

  if (value >= 1.8446744073709551616e+19) goto <D.18117>; else goto <D.18118>;
  <D.18117>:
  D.18119 = 18446744073709551615;
  return D.18119;
  <D.18118>:
  D.18119 = (mword) value;
  return D.18119;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__))
fprintf (struct FILE * restrict __stream, const char * restrict __fmt)
{
  int D.18121;

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


__attribute__((visibility ("hidden")))
sgen_memgov_minor_collection_end ()
{

}


__attribute__((visibility ("hidden")))
sgen_memgov_major_collection_start ()
{
  struct SgenMajorCollector * D.18123;
  int (*<Tb4a>) (void) D.18124;
  int D.18125;
  long unsigned int los_memory_usage.27;
  long unsigned int last_collection_los_memory_usage.28;
  long unsigned int D.18128;
  long unsigned int D.18129;

  D.18123 = sgen_get_major_collector ();
  D.18124 = D.18123->get_num_major_sections;
  D.18125 = D.18124 ();
  last_collection_old_num_major_sections = D.18125;
  los_memory_usage.27 = los_memory_usage;
  los_memory_usage.27 = los_memory_usage;
  last_collection_los_memory_usage.28 = last_collection_los_memory_usage;
  D.18128 = MIN_EXPR <los_memory_usage.27, last_collection_los_memory_usage.28>;
  D.18129 = los_memory_usage.27 - D.18128;
  last_collection_los_memory_alloced = D.18129;
  los_memory_usage.27 = los_memory_usage;
  last_collection_old_los_memory_usage = los_memory_usage.27;
  need_calculate_minor_collection_allowance = 1;
}


__attribute__((visibility ("hidden")))
sgen_memgov_major_collection_end ()
{
  long unsigned int los_memory_usage.29;

  sgen_memgov_try_calculate_minor_collection_allowance (1);
  minor_collection_sections_alloced = 0;
  los_memory_usage.29 = los_memory_usage;
  last_collection_los_memory_usage = los_memory_usage.29;
}


__attribute__((visibility ("hidden")))
sgen_memgov_collection_start (int generation)
{
  int (*<Tb4a>) (void) D.18131;
  int D.18132;
  long unsigned int los_memory_usage.30;
  int D.18134;

  D.18131 = major_collector.get_num_major_sections;
  D.18132 = D.18131 ();
  last_major_num_sections = D.18132;
  los_memory_usage.30 = los_memory_usage;
  D.18134 = (int) los_memory_usage.30;
  last_los_memory_usage = D.18134;
}


__attribute__((visibility ("hidden")))
sgen_memgov_collection_end (int generation, struct GGTimingInfo * info, int info_count)
{
  long unsigned int D.18135;
  long unsigned int D.18136;
  struct GGTimingInfo * D.18137;
  int D.18138;
  int i;

  i = 0;
  goto <D.17930>;
  <D.17929>:
  D.18135 = (long unsigned int) i;
  D.18136 = D.18135 * 48;
  D.18137 = info + D.18136;
  D.18138 = D.18137->generation;
  if (D.18138 != -1) goto <D.18139>; else goto <D.18140>;
  <D.18139>:
  D.18135 = (long unsigned int) i;
  D.18136 = D.18135 * 48;
  D.18137 = info + D.18136;
  log_timming (D.18137);
  <D.18140>:
  i = i + 1;
  <D.17930>:
  if (i < info_count) goto <D.17929>; else goto <D.17931>;
  <D.17931>:
}


log_timming (struct GGTimingInfo * info)
{
  int (*<Tb4a>) (void) D.18141;
  int D.18142;
  long int D.18145;
  float D.18146;
  float D.18147;
  double D.18148;
  long int D.18149;
  int D.18150;
  float D.18151;
  float D.18152;
  double D.18153;
  int D.18154;
  const char * iftmp.31;
  const char * iftmp.32;
  const char * D.18162;
  long int D.18166;
  int D.18167;
  float D.18168;
  float D.18169;
  double D.18170;
  long unsigned int D.18171;
  long unsigned int D.18172;
  long unsigned int D.18173;
  long unsigned int D.18174;
  int last_major_num_sections.33;
  long unsigned int D.18176;
  long unsigned int D.18177;
  long unsigned int D.18178;
  long unsigned int los_memory_usage.34;
  long unsigned int D.18180;
  int last_los_memory_usage.35;
  int D.18182;
  const char * iftmp.36;
  const char * iftmp.37;
  int D.18192;
  long unsigned int D.18193;
  long unsigned int D.18194;
  long unsigned int D.18195;
  int num_major_sections;
  char full_timing_buff[1024];

  try
    {
      D.18141 = major_collector.get_num_major_sections;
      num_major_sections = D.18141 ();
      full_timing_buff[0] = 0;
      D.18142 = info->is_overflow;
      if (D.18142 == 0) goto <D.18143>; else goto <D.18144>;
      <D.18143>:
      D.18145 = info->stw_time;
      D.18146 = (float) D.18145;
      D.18147 = D.18146 / 1.0e+3;
      D.18148 = (double) D.18147;
      D.18149 = info->bridge_time;
      D.18150 = (int) D.18149;
      D.18151 = (float) D.18150;
      D.18152 = D.18151 / 1.0e+3;
      D.18153 = (double) D.18152;
      sprintf (&full_timing_buff, "total %.2fms, bridge %.2fms", D.18148, D.18153);
      <D.18144>:
      D.18154 = info->generation;
      if (D.18154 == 1) goto <D.18155>; else goto <D.18156>;
      <D.18155>:
      D.18142 = info->is_overflow;
      if (D.18142 != 0) goto <D.18158>; else goto <D.18159>;
      <D.18158>:
      iftmp.31 = "_OVERFLOW";
      goto <D.18160>;
      <D.18159>:
      iftmp.31 = "";
      <D.18160>:
      D.18162 = info->reason;
      if (D.18162 != 0B) goto <D.18163>; else goto <D.18164>;
      <D.18163>:
      iftmp.32 = info->reason;
      goto <D.18165>;
      <D.18164>:
      iftmp.32 = "";
      <D.18165>:
      D.18166 = info->total_time;
      D.18167 = (int) D.18166;
      D.18168 = (float) D.18167;
      D.18169 = D.18168 / 1.0e+3;
      D.18170 = (double) D.18169;
      D.18171 = major_collector.section_size;
      D.18172 = (long unsigned int) num_major_sections;
      D.18173 = D.18171 * D.18172;
      D.18174 = D.18173 / 1024;
      D.18171 = major_collector.section_size;
      last_major_num_sections.33 = last_major_num_sections;
      D.18176 = (long unsigned int) last_major_num_sections.33;
      D.18177 = D.18171 * D.18176;
      D.18178 = D.18177 / 1024;
      los_memory_usage.34 = los_memory_usage;
      D.18180 = los_memory_usage.34 / 1024;
      last_los_memory_usage.35 = last_los_memory_usage;
      D.18182 = last_los_memory_usage.35 / 1024;
      mono_trace (64, 8, "GC_MAJOR%s: (%s) pause %.2fms, %s major %dK/%dK los %dK/%dK", iftmp.31, iftmp.32, D.18170, &full_timing_buff, D.18174, D.18178, D.18180, D.18182);
      goto <D.18183>;
      <D.18156>:
      D.18142 = info->is_overflow;
      if (D.18142 != 0) goto <D.18185>; else goto <D.18186>;
      <D.18185>:
      iftmp.36 = "_OVERFLOW";
      goto <D.18187>;
      <D.18186>:
      iftmp.36 = "";
      <D.18187>:
      D.18162 = info->reason;
      if (D.18162 != 0B) goto <D.18189>; else goto <D.18190>;
      <D.18189>:
      iftmp.37 = info->reason;
      goto <D.18191>;
      <D.18190>:
      iftmp.37 = "";
      <D.18191>:
      D.18166 = info->total_time;
      D.18167 = (int) D.18166;
      D.18168 = (float) D.18167;
      D.18169 = D.18168 / 1.0e+3;
      D.18170 = (double) D.18169;
      last_major_num_sections.33 = last_major_num_sections;
      D.18192 = num_major_sections - last_major_num_sections.33;
      D.18193 = (long unsigned int) D.18192;
      D.18171 = major_collector.section_size;
      D.18194 = D.18193 * D.18171;
      D.18195 = D.18194 / 1024;
      D.18171 = major_collector.section_size;
      D.18172 = (long unsigned int) num_major_sections;
      D.18173 = D.18171 * D.18172;
      D.18174 = D.18173 / 1024;
      los_memory_usage.34 = los_memory_usage;
      D.18180 = los_memory_usage.34 / 1024;
      mono_trace (64, 8, "GC_MINOR%s: (%s) pause %.2fms, %s promoted %dK major %dK los %dK", iftmp.36, iftmp.37, D.18170, &full_timing_buff, D.18195, D.18174, D.18180);
      <D.18183>:
    }
  finally
    {
      full_timing_buff = {CLOBBER};
    }
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__, __leaf__, __nothrow__))
sprintf (char * restrict __s, const char * restrict __fmt)
{
  int D.18196;
  long unsigned int D.18197;

  D.18197 = __builtin_object_size (__s, 1);
  D.18196 = __builtin___sprintf_chk (__s, 1, D.18197, __fmt, __builtin_va_arg_pack ());
  return D.18196;
}


__attribute__((visibility ("hidden")))
sgen_register_major_sections_alloced (int num_sections)
{
  int minor_collection_sections_alloced.38;
  int D.18200;

  minor_collection_sections_alloced.38 = minor_collection_sections_alloced;
  D.18200 = minor_collection_sections_alloced.38 + num_sections;
  minor_collection_sections_alloced = D.18200;
}


__attribute__((visibility ("hidden")))
sgen_get_minor_collection_allowance ()
{
  mword D.18201;

  D.18201 = minor_collection_allowance;
  return D.18201;
}


__attribute__((visibility ("hidden")))
mono_gc_add_memory_pressure (gint64 value)
{
  long unsigned int memory_pressure.39;
  long unsigned int value.40;
  long unsigned int D.18205;

  pthread_mutex_lock (&gc_mutex);
  memory_pressure.39 = memory_pressure;
  value.40 = (long unsigned int) value;
  D.18205 = memory_pressure.39 + value.40;
  memory_pressure = D.18205;
  sgen_gc_unlock ();
}


__attribute__((visibility ("hidden")))
sgen_assert_memory_alloc (void * ptr, size_t requested_size, const char * assert_description)
{
  struct _IO_FILE * stderr.41;

  if (ptr != 0B) goto <D.18206>; else goto <D.18208>;
  <D.18208>:
  if (assert_description == 0B) goto <D.18206>; else goto <D.18207>;
  <D.18206>:
  return;
  <D.18207>:
  stderr.41 = stderr;
  fprintf (stderr.41, "Error: Garbage collector could not allocate %zu bytes of memory for %s.\n", requested_size, assert_description);
  exit (1);
}


__attribute__((visibility ("hidden")))
sgen_alloc_os_memory (size_t size, SgenAllocFlags flags, const char * assert_description)
{
  unsigned int D.18211;
  _Bool D.18212;
  long int D.18213;
  long int D.18214;
  int flags.42;
  int D.18218;
  long unsigned int D.18219;
  int D.18220;
  long unsigned int D.18223;
  void * D.18224;
  void * __old_x.43;
  void * D.18226;
  unsigned int D.18227;
  void * D.18230;
  void * ptr;

  D.18211 = flags & 4294967292;
  D.18212 = D.18211 != 0;
  D.18213 = (long int) D.18212;
  D.18214 = __builtin_expect (D.18213, 0);
  if (D.18214 != 0) goto <D.18215>; else goto <D.18216>;
  <D.18215>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-memory-governor.c", 306, "!(flags & ~(SGEN_ALLOC_HEAP | SGEN_ALLOC_ACTIVATE))");
  <D.18216>:
  flags.42 = (int) flags;
  D.18218 = flags.42 & 2;
  D.18219 = prot_flags_for_activate (D.18218);
  D.18220 = (int) D.18219;
  ptr = mono_valloc (0B, size, D.18220);
  sgen_assert_memory_alloc (ptr, size, assert_description);
  if (ptr != 0B) goto <D.18221>; else goto <D.18222>;
  <D.18221>:
  {
    size_t __old_x;

    <D.17957>:
    __old_x = total_alloc;
    D.18223 = __old_x + size;
    D.18224 = (void *) D.18223;
    __old_x.43 = (void *) __old_x;
    D.18226 = InterlockedCompareExchangePointer (&total_alloc, D.18224, __old_x.43);
    __old_x.43 = (void *) __old_x;
    if (D.18226 != __old_x.43) goto <D.17957>; else goto <D.17958>;
    <D.17958>:
  }
  D.18227 = flags & 1;
  if (D.18227 != 0) goto <D.18228>; else goto <D.18229>;
  <D.18228>:
  <D.18229>:
  <D.18222>:
  D.18230 = ptr;
  return D.18230;
}


prot_flags_for_activate (int activate)
{
  long unsigned int iftmp.44;
  long unsigned int D.18236;
  long unsigned int prot_flags;

  if (activate != 0) goto <D.18233>; else goto <D.18234>;
  <D.18233>:
  iftmp.44 = 3;
  goto <D.18235>;
  <D.18234>:
  iftmp.44 = 0;
  <D.18235>:
  prot_flags = iftmp.44;
  D.18236 = prot_flags | 80;
  return D.18236;
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.18238;
  long unsigned int comp.45;
  long unsigned int exch.46;
  long unsigned int D.18241;

  comp.45 = (long unsigned int) comp;
  exch.46 = (long unsigned int) exch;
  D.18241 = __sync_val_compare_and_swap_8 (dest, comp.45, exch.46);
  D.18238 = (void *) D.18241;
  return D.18238;
}


__attribute__((visibility ("hidden")))
sgen_alloc_os_memory_aligned (size_t size, mword alignment, SgenAllocFlags flags, const char * assert_description)
{
  unsigned int D.18243;
  _Bool D.18244;
  long int D.18245;
  long int D.18246;
  int flags.47;
  int D.18250;
  long unsigned int D.18251;
  int D.18252;
  long unsigned int D.18255;
  void * D.18256;
  void * __old_x.48;
  void * D.18258;
  unsigned int D.18259;
  void * D.18262;
  void * ptr;

  D.18243 = flags & 4294967292;
  D.18244 = D.18243 != 0;
  D.18245 = (long int) D.18244;
  D.18246 = __builtin_expect (D.18245, 0);
  if (D.18246 != 0) goto <D.18247>; else goto <D.18248>;
  <D.18247>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-memory-governor.c", 324, "!(flags & ~(SGEN_ALLOC_HEAP | SGEN_ALLOC_ACTIVATE))");
  <D.18248>:
  flags.47 = (int) flags;
  D.18250 = flags.47 & 2;
  D.18251 = prot_flags_for_activate (D.18250);
  D.18252 = (int) D.18251;
  ptr = mono_valloc_aligned (size, alignment, D.18252);
  sgen_assert_memory_alloc (ptr, size, assert_description);
  if (ptr != 0B) goto <D.18253>; else goto <D.18254>;
  <D.18253>:
  {
    size_t __old_x;

    <D.17967>:
    __old_x = total_alloc;
    D.18255 = __old_x + size;
    D.18256 = (void *) D.18255;
    __old_x.48 = (void *) __old_x;
    D.18258 = InterlockedCompareExchangePointer (&total_alloc, D.18256, __old_x.48);
    __old_x.48 = (void *) __old_x;
    if (D.18258 != __old_x.48) goto <D.17967>; else goto <D.17968>;
    <D.17968>:
  }
  D.18259 = flags & 1;
  if (D.18259 != 0) goto <D.18260>; else goto <D.18261>;
  <D.18260>:
  <D.18261>:
  <D.18254>:
  D.18262 = ptr;
  return D.18262;
}


__attribute__((visibility ("hidden")))
sgen_free_os_memory (void * addr, size_t size, SgenAllocFlags flags)
{
  unsigned int D.18264;
  _Bool D.18265;
  long int D.18266;
  long int D.18267;
  long unsigned int D.18270;
  void * D.18271;
  void * __old_x.49;
  void * D.18273;
  unsigned int D.18274;

  D.18264 = flags & 4294967294;
  D.18265 = D.18264 != 0;
  D.18266 = (long int) D.18265;
  D.18267 = __builtin_expect (D.18266, 0);
  if (D.18267 != 0) goto <D.18268>; else goto <D.18269>;
  <D.18268>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-memory-governor.c", 342, "!(flags & ~SGEN_ALLOC_HEAP)");
  <D.18269>:
  mono_vfree (addr, size);
  {
    size_t __old_x;

    <D.17975>:
    __old_x = total_alloc;
    D.18270 = __old_x - size;
    D.18271 = (void *) D.18270;
    __old_x.49 = (void *) __old_x;
    D.18273 = InterlockedCompareExchangePointer (&total_alloc, D.18271, __old_x.49);
    __old_x.49 = (void *) __old_x;
    if (D.18273 != __old_x.49) goto <D.17975>; else goto <D.17976>;
    <D.17976>:
  }
  D.18274 = flags & 1;
  if (D.18274 != 0) goto <D.18275>; else goto <D.18276>;
  <D.18275>:
  <D.18276>:
}


mono_gc_get_heap_size ()
{
  int64_t D.18277;
  long unsigned int total_alloc.50;

  total_alloc.50 = total_alloc;
  D.18277 = (int64_t) total_alloc.50;
  return D.18277;
}


__attribute__((visibility ("hidden")))
sgen_memgov_release_space (mword size, int space)
{
  long unsigned int D.18280;
  void * D.18281;
  void * __old_x.51;
  void * D.18283;

  {
    size_t __old_x;

    <D.17988>:
    __old_x = allocated_heap;
    D.18280 = __old_x - size;
    D.18281 = (void *) D.18280;
    __old_x.51 = (void *) __old_x;
    D.18283 = InterlockedCompareExchangePointer (&allocated_heap, D.18281, __old_x.51);
    __old_x.51 = (void *) __old_x;
    if (D.18283 != __old_x.51) goto <D.17988>; else goto <D.17989>;
    <D.17989>:
  }
}


__attribute__((visibility ("hidden")))
sgen_memgov_try_alloc_space (mword size, int space)
{
  long unsigned int D.18284;
  gboolean D.18287;
  long unsigned int D.18288;
  void * D.18289;
  void * __old_x.52;
  void * D.18291;
  long unsigned int allocated_heap.53;

  D.18284 = sgen_memgov_available_free_space ();
  if (D.18284 < size) goto <D.18285>; else goto <D.18286>;
  <D.18285>:
  D.18287 = 0;
  return D.18287;
  <D.18286>:
  {
    size_t __old_x;

    <D.17995>:
    __old_x = allocated_heap;
    D.18288 = __old_x + size;
    D.18289 = (void *) D.18288;
    __old_x.52 = (void *) __old_x;
    D.18291 = InterlockedCompareExchangePointer (&allocated_heap, D.18289, __old_x.52);
    __old_x.52 = (void *) __old_x;
    if (D.18291 != __old_x.52) goto <D.17995>; else goto <D.17996>;
    <D.17996>:
  }
  allocated_heap.53 = allocated_heap;
  mono_runtime_resource_check_limit (2, allocated_heap.53);
  D.18287 = 1;
  return D.18287;
}


__attribute__((visibility ("hidden")))
sgen_memgov_init (glong max_heap, glong soft_limit, gboolean debug_allowance, double allowance_ratio, double save_target)
{
  long unsigned int soft_limit.54;
  int sgen_nursery_size.55;
  int D.18302;
  long int D.18303;
  long int D.18306;
  long int D.18307;
  long unsigned int D.18308;
  double D.18309;
  double default_allowance_nursery_size_ratio.56;
  double D.18311;
  long unsigned int D.18312;

  if (soft_limit != 0) goto <D.18294>; else goto <D.18295>;
  <D.18294>:
  soft_limit.54 = (long unsigned int) soft_limit;
  soft_heap_limit = soft_limit.54;
  <D.18295>:
  debug_print_allowance = debug_allowance;
  if (max_heap == 0) goto <D.18297>; else goto <D.18298>;
  <D.18297>:
  return;
  <D.18298>:
  if (max_heap < soft_limit) goto <D.18299>; else goto <D.18300>;
  <D.18299>:
  sgen_env_var_error ("MONO_GC_PARAMS", "Setting to minimum.", "`max-heap-size` must be at least as large as `soft-heap-limit`.");
  max_heap = soft_limit;
  <D.18300>:
  sgen_nursery_size.55 = sgen_nursery_size;
  D.18302 = sgen_nursery_size.55 * 4;
  D.18303 = (long int) D.18302;
  if (D.18303 > max_heap) goto <D.18304>; else goto <D.18305>;
  <D.18304>:
  sgen_env_var_error ("MONO_GC_PARAMS", "Setting to minimum.", "`max-heap-size` must be at least 4 times as large as `nursery size`.");
  sgen_nursery_size.55 = sgen_nursery_size;
  D.18302 = sgen_nursery_size.55 * 4;
  max_heap = (glong) D.18302;
  <D.18305>:
  sgen_nursery_size.55 = sgen_nursery_size;
  D.18306 = (long int) sgen_nursery_size.55;
  D.18307 = max_heap - D.18306;
  D.18308 = (long unsigned int) D.18307;
  max_heap_size = D.18308;
  sgen_nursery_size.55 = sgen_nursery_size;
  D.18309 = (double) sgen_nursery_size.55;
  default_allowance_nursery_size_ratio.56 = default_allowance_nursery_size_ratio;
  D.18311 = D.18309 * default_allowance_nursery_size_ratio.56;
  D.18312 = (long unsigned int) D.18311;
  minor_collection_allowance = D.18312;
  if (allowance_ratio != 0.0) goto <D.18313>; else goto <D.18314>;
  <D.18313>:
  default_allowance_nursery_size_ratio = allowance_ratio;
  <D.18314>:
  if (save_target != 0.0) goto <D.18315>; else goto <D.18316>;
  <D.18315>:
  save_target_ratio = save_target;
  <D.18316>:
}


