sgen_need_major_collection (mword space_needed)
{
  int D.17861;
  gboolean D.17864;
  long unsigned int los_memory_usage.0;
  long unsigned int last_collection_los_memory_usage.1;
  long unsigned int D.17867;
  int iftmp.2;
  long unsigned int D.17872;
  int minor_collection_sections_alloced.3;
  long unsigned int D.17875;
  long unsigned int D.17876;
  long unsigned int D.17877;
  long unsigned int D.17878;
  long unsigned int minor_collection_allowance.4;
  mword los_alloced;

  D.17861 = sgen_concurrent_collection_in_progress ();
  if (D.17861 != 0) goto <D.17862>; else goto <D.17863>;
  <D.17862>:
  D.17864 = 0;
  return D.17864;
  <D.17863>:
  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.17867 = MIN_EXPR <los_memory_usage.0, last_collection_los_memory_usage.1>;
  los_alloced = los_memory_usage.0 - D.17867;
  D.17872 = sgen_memgov_available_free_space ();
  if (D.17872 < space_needed) goto <D.17869>; else goto <D.17873>;
  <D.17873>:
  minor_collection_sections_alloced.3 = minor_collection_sections_alloced;
  D.17875 = (long unsigned int) minor_collection_sections_alloced.3;
  D.17876 = major_collector.section_size;
  D.17877 = D.17875 * D.17876;
  D.17878 = D.17877 + los_alloced;
  minor_collection_allowance.4 = minor_collection_allowance;
  if (D.17878 > minor_collection_allowance.4) goto <D.17869>; else goto <D.17870>;
  <D.17869>:
  iftmp.2 = 1;
  goto <D.17871>;
  <D.17870>:
  iftmp.2 = 0;
  <D.17871>:
  D.17864 = iftmp.2;
  return D.17864;
}


sgen_memgov_available_free_space ()
{
  mword D.17881;
  long unsigned int max_heap_size.5;
  long unsigned int allocated_heap.6;
  long unsigned int D.17884;

  max_heap_size.5 = max_heap_size;
  max_heap_size.5 = max_heap_size;
  allocated_heap.6 = allocated_heap;
  D.17884 = MIN_EXPR <max_heap_size.5, allocated_heap.6>;
  D.17881 = max_heap_size.5 - D.17884;
  return D.17881;
}


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.17889;
  long int D.17890;
  long int D.17891;
  gboolean * D.17896;
  int D.17897;
  int sgen_nursery_size.8;
  double D.17903;
  double default_allowance_nursery_size_ratio.9;
  double D.17905;
  long unsigned int minor_collection_allowance.10;
  int (*<Ta3d>) (void) D.17907;
  int last_collection_old_num_major_sections.11;
  int D.17909;
  long unsigned int last_collection_old_los_memory_usage.12;
  long unsigned int last_collection_los_memory_usage.13;
  long unsigned int D.17912;
  long unsigned int D.17913;
  long unsigned int D.17914;
  long unsigned int D.17915;
  double D.17916;
  double D.17917;
  double D.17918;
  int minor_collection_sections_alloced.14;
  long unsigned int D.17920;
  long unsigned int D.17921;
  long unsigned int last_collection_los_memory_alloced.15;
  long unsigned int D.17923;
  double D.17924;
  double D.17925;
  long unsigned int D.17926;
  long unsigned int D.17927;
  long unsigned int D.17928;
  double D.17929;
  double D.17930;
  long unsigned int D.17931;
  long unsigned int los_memory_usage.16;
  long unsigned int D.17933;
  long unsigned int D.17934;
  long unsigned int minor_collection_allowance.17;
  long unsigned int minor_collection_allowance.18;
  long unsigned int D.17937;
  long unsigned int soft_heap_limit.19;
  long unsigned int D.17944;
  long unsigned int minor_collection_allowance.20;
  int debug_print_allowance.21;
  long unsigned int D.17949;
  int gc_debug_level.22;
  _Bool D.17951;
  long int D.17952;
  long int D.17953;
  long int last_collection_old_los_memory_usage.23;
  long int old_major.24;
  long unsigned int D.17958;
  long int D.17959;
  struct FILE * gc_debug_file.25;
  long int last_collection_los_memory_usage.26;
  long int new_major.27;
  long int new_heap_size.28;
  long int minor_collection_allowance.29;
  void (*<T554>) (void) D.17969;
  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.17886>; else goto <D.17887>;
  <D.17886>:
  need_calculate_minor_collection_allowance.7 = need_calculate_minor_collection_allowance;
  D.17889 = need_calculate_minor_collection_allowance.7 == 0;
  D.17890 = (long int) D.17889;
  D.17891 = __builtin_expect (D.17890, 0);
  if (D.17891 != 0) goto <D.17892>; else goto <D.17893>;
  <D.17892>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-memory-governor.c", 92, "need_calculate_minor_collection_allowance");
  <D.17893>:
  <D.17887>:
  need_calculate_minor_collection_allowance.7 = need_calculate_minor_collection_allowance;
  if (need_calculate_minor_collection_allowance.7 == 0) goto <D.17894>; else goto <D.17895>;
  <D.17894>:
  return;
  <D.17895>:
  D.17896 = major_collector.have_swept;
  D.17897 = *D.17896;
  if (D.17897 == 0) goto <D.17898>; else goto <D.17899>;
  <D.17898>:
  if (overwrite != 0) goto <D.17900>; else goto <D.17901>;
  <D.17900>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.17903 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.17905 = D.17903 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.17905;
  minor_collection_allowance = minor_collection_allowance.10;
  <D.17901>:
  return;
  <D.17899>:
  D.17907 = major_collector.get_num_major_sections;
  num_major_sections = D.17907 ();
  last_collection_old_num_major_sections.11 = last_collection_old_num_major_sections;
  D.17909 = last_collection_old_num_major_sections.11 - num_major_sections;
  num_major_sections_saved = MAX_EXPR <D.17909, 0>;
  last_collection_old_los_memory_usage.12 = last_collection_old_los_memory_usage;
  last_collection_los_memory_usage.13 = last_collection_los_memory_usage;
  D.17912 = last_collection_old_los_memory_usage.12 - last_collection_los_memory_usage.13;
  los_memory_saved = MAX_EXPR <D.17912, 1>;
  D.17913 = (long unsigned int) num_major_sections;
  D.17914 = major_collector.section_size;
  new_major = D.17913 * D.17914;
  last_collection_los_memory_usage.13 = last_collection_los_memory_usage;
  new_heap_size = new_major + last_collection_los_memory_usage.13;
  last_collection_los_memory_usage.13 = last_collection_los_memory_usage;
  D.17915 = new_major + last_collection_los_memory_usage.13;
  D.17916 = (double) D.17915;
  D.17917 = D.17916 * 5.0e-1;
  save_target = (mword) D.17917;
  D.17918 = (double) save_target;
  minor_collection_sections_alloced.14 = minor_collection_sections_alloced;
  D.17920 = (long unsigned int) minor_collection_sections_alloced.14;
  D.17914 = major_collector.section_size;
  D.17921 = D.17920 * D.17914;
  last_collection_los_memory_alloced.15 = last_collection_los_memory_alloced;
  D.17923 = D.17921 + last_collection_los_memory_alloced.15;
  D.17924 = (double) D.17923;
  D.17925 = D.17918 * D.17924;
  D.17926 = (long unsigned int) num_major_sections_saved;
  D.17914 = major_collector.section_size;
  D.17927 = D.17926 * D.17914;
  D.17928 = D.17927 + los_memory_saved;
  D.17929 = (double) D.17928;
  D.17930 = D.17925 / D.17929;
  allowance_target = double_to_mword_with_saturation (D.17930);
  sgen_nursery_size.8 = sgen_nursery_size;
  D.17903 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.17905 = D.17903 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.17905;
  D.17913 = (long unsigned int) num_major_sections;
  D.17914 = major_collector.section_size;
  D.17931 = D.17913 * D.17914;
  los_memory_usage.16 = los_memory_usage;
  D.17933 = D.17931 + los_memory_usage.16;
  D.17934 = MIN_EXPR <D.17933, allowance_target>;
  minor_collection_allowance.17 = MAX_EXPR <minor_collection_allowance.10, D.17934>;
  minor_collection_allowance = minor_collection_allowance.17;
  minor_collection_allowance.18 = minor_collection_allowance;
  D.17937 = new_heap_size + minor_collection_allowance.18;
  soft_heap_limit.19 = soft_heap_limit;
  if (D.17937 > soft_heap_limit.19) goto <D.17939>; else goto <D.17940>;
  <D.17939>:
  soft_heap_limit.19 = soft_heap_limit;
  if (new_heap_size > soft_heap_limit.19) goto <D.17941>; else goto <D.17942>;
  <D.17941>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.17903 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.17905 = D.17903 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.17905;
  minor_collection_allowance = minor_collection_allowance.10;
  goto <D.17943>;
  <D.17942>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.17903 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.17905 = D.17903 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.17905;
  soft_heap_limit.19 = soft_heap_limit;
  D.17944 = soft_heap_limit.19 - new_heap_size;
  minor_collection_allowance.20 = MAX_EXPR <minor_collection_allowance.10, D.17944>;
  minor_collection_allowance = minor_collection_allowance.20;
  <D.17943>:
  <D.17940>:
  debug_print_allowance.21 = debug_print_allowance;
  if (debug_print_allowance.21 != 0) goto <D.17947>; else goto <D.17948>;
  <D.17947>:
  {
    mword old_major;

    last_collection_old_num_major_sections.11 = last_collection_old_num_major_sections;
    D.17949 = (long unsigned int) last_collection_old_num_major_sections.11;
    D.17914 = major_collector.section_size;
    old_major = D.17949 * D.17914;
    gc_debug_level.22 = gc_debug_level;
    D.17951 = gc_debug_level.22 > 0;
    D.17952 = (long int) D.17951;
    D.17953 = __builtin_expect (D.17952, 0);
    if (D.17953 != 0) goto <D.17954>; else goto <D.17955>;
    <D.17954>:
    last_collection_old_los_memory_usage.12 = last_collection_old_los_memory_usage;
    last_collection_old_los_memory_usage.23 = (long int) last_collection_old_los_memory_usage.12;
    old_major.24 = (long int) old_major;
    last_collection_old_los_memory_usage.12 = last_collection_old_los_memory_usage;
    D.17958 = old_major + last_collection_old_los_memory_usage.12;
    D.17959 = (long int) D.17958;
    gc_debug_file.25 = gc_debug_file;
    fprintf (gc_debug_file.25, "Before collection: %ld bytes (%ld major, %ld LOS)\n", D.17959, old_major.24, last_collection_old_los_memory_usage.23);
    gc_debug_file.25 = gc_debug_file;
    fflush (gc_debug_file.25);
    <D.17955>:
    gc_debug_level.22 = gc_debug_level;
    D.17951 = gc_debug_level.22 > 0;
    D.17952 = (long int) D.17951;
    D.17953 = __builtin_expect (D.17952, 0);
    if (D.17953 != 0) goto <D.17961>; else goto <D.17962>;
    <D.17961>:
    last_collection_los_memory_usage.13 = last_collection_los_memory_usage;
    last_collection_los_memory_usage.26 = (long int) last_collection_los_memory_usage.13;
    new_major.27 = (long int) new_major;
    new_heap_size.28 = (long int) new_heap_size;
    gc_debug_file.25 = gc_debug_file;
    fprintf (gc_debug_file.25, "After collection: %ld bytes (%ld major, %ld LOS)\n", new_heap_size.28, new_major.27, last_collection_los_memory_usage.26);
    gc_debug_file.25 = gc_debug_file;
    fflush (gc_debug_file.25);
    <D.17962>:
    gc_debug_level.22 = gc_debug_level;
    D.17951 = gc_debug_level.22 > 0;
    D.17952 = (long int) D.17951;
    D.17953 = __builtin_expect (D.17952, 0);
    if (D.17953 != 0) goto <D.17966>; else goto <D.17967>;
    <D.17966>:
    minor_collection_allowance.18 = minor_collection_allowance;
    minor_collection_allowance.29 = (long int) minor_collection_allowance.18;
    gc_debug_file.25 = gc_debug_file;
    fprintf (gc_debug_file.25, "Allowance: %ld bytes\n", minor_collection_allowance.29);
    gc_debug_file.25 = gc_debug_file;
    fflush (gc_debug_file.25);
    <D.17967>:
  }
  <D.17948>:
  D.17969 = major_collector.have_computed_minor_collection_allowance;
  if (D.17969 != 0B) goto <D.17970>; else goto <D.17971>;
  <D.17970>:
  D.17969 = major_collector.have_computed_minor_collection_allowance;
  D.17969 ();
  <D.17971>:
  need_calculate_minor_collection_allowance = 0;
}


double_to_mword_with_saturation (double value)
{
  mword D.17975;

  if (value >= 1.8446744073709551616e+19) goto <D.17973>; else goto <D.17974>;
  <D.17973>:
  D.17975 = 18446744073709551615;
  return D.17975;
  <D.17974>:
  D.17975 = (mword) value;
  return D.17975;
}


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

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


sgen_memgov_minor_collection_end ()
{

}


sgen_memgov_major_collection_start ()
{
  struct SgenMajorCollector * D.17979;
  int (*<Ta3d>) (void) D.17980;
  int last_collection_old_num_major_sections.30;
  long unsigned int los_memory_usage.31;
  long unsigned int last_collection_los_memory_usage.32;
  long unsigned int D.17984;
  long unsigned int last_collection_los_memory_alloced.33;

  D.17979 = sgen_get_major_collector ();
  D.17980 = D.17979->get_num_major_sections;
  last_collection_old_num_major_sections.30 = D.17980 ();
  last_collection_old_num_major_sections = last_collection_old_num_major_sections.30;
  los_memory_usage.31 = los_memory_usage;
  los_memory_usage.31 = los_memory_usage;
  last_collection_los_memory_usage.32 = last_collection_los_memory_usage;
  D.17984 = MIN_EXPR <los_memory_usage.31, last_collection_los_memory_usage.32>;
  last_collection_los_memory_alloced.33 = los_memory_usage.31 - D.17984;
  last_collection_los_memory_alloced = last_collection_los_memory_alloced.33;
  los_memory_usage.31 = los_memory_usage;
  last_collection_old_los_memory_usage = los_memory_usage.31;
  need_calculate_minor_collection_allowance = 1;
}


sgen_memgov_major_collection_end ()
{
  long unsigned int los_memory_usage.34;

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


sgen_memgov_collection_start (int generation)
{
  int (*<Ta3d>) (void) D.17987;
  int last_major_num_sections.35;
  long unsigned int los_memory_usage.36;
  int last_los_memory_usage.37;

  D.17987 = major_collector.get_num_major_sections;
  last_major_num_sections.35 = D.17987 ();
  last_major_num_sections = last_major_num_sections.35;
  los_memory_usage.36 = los_memory_usage;
  last_los_memory_usage.37 = (int) los_memory_usage.36;
  last_los_memory_usage = last_los_memory_usage.37;
}


sgen_memgov_collection_end (int generation, struct GGTimingInfo * info, int info_count)
{
  long unsigned int D.17991;
  long unsigned int D.17992;
  struct GGTimingInfo * D.17993;
  int D.17994;
  int i;

  i = 0;
  goto <D.17786>;
  <D.17785>:
  D.17991 = (long unsigned int) i;
  D.17992 = D.17991 * 48;
  D.17993 = info + D.17992;
  D.17994 = D.17993->generation;
  if (D.17994 != -1) goto <D.17995>; else goto <D.17996>;
  <D.17995>:
  D.17991 = (long unsigned int) i;
  D.17992 = D.17991 * 48;
  D.17993 = info + D.17992;
  log_timming (D.17993);
  <D.17996>:
  i = i + 1;
  <D.17786>:
  if (i < info_count) goto <D.17785>; else goto <D.17787>;
  <D.17787>:
}


log_timming (struct GGTimingInfo * info)
{
  int (*<Ta3d>) (void) D.17997;
  int D.17998;
  long int D.18001;
  int D.18002;
  float D.18003;
  float D.18004;
  double D.18005;
  long int D.18006;
  float D.18007;
  float D.18008;
  double D.18009;
  int D.18010;
  int last_los_memory_usage.38;
  int D.18014;
  long unsigned int los_memory_usage.39;
  long unsigned int D.18016;
  long unsigned int D.18017;
  int last_major_num_sections.40;
  long unsigned int D.18019;
  long unsigned int D.18020;
  long unsigned int D.18021;
  long unsigned int D.18022;
  long unsigned int D.18023;
  long unsigned int D.18024;
  long int D.18025;
  int D.18026;
  float D.18027;
  float D.18028;
  double D.18029;
  const char * iftmp.41;
  const char * D.18031;
  const char * iftmp.42;
  int D.18040;
  long unsigned int D.18041;
  long unsigned int D.18042;
  long unsigned int D.18043;
  const char * iftmp.43;
  const char * iftmp.44;
  int num_major_sections;
  char full_timing_buff[1024];

  try
    {
      D.17997 = major_collector.get_num_major_sections;
      num_major_sections = D.17997 ();
      full_timing_buff[0] = 0;
      D.17998 = info->is_overflow;
      if (D.17998 == 0) goto <D.17999>; else goto <D.18000>;
      <D.17999>:
      D.18001 = info->bridge_time;
      D.18002 = (int) D.18001;
      D.18003 = (float) D.18002;
      D.18004 = D.18003 / 1.0e+3;
      D.18005 = (double) D.18004;
      D.18006 = info->stw_time;
      D.18007 = (float) D.18006;
      D.18008 = D.18007 / 1.0e+3;
      D.18009 = (double) D.18008;
      sprintf (&full_timing_buff, "total %.2fms, bridge %.2fms", D.18009, D.18005);
      <D.18000>:
      D.18010 = info->generation;
      if (D.18010 == 1) goto <D.18011>; else goto <D.18012>;
      <D.18011>:
      last_los_memory_usage.38 = last_los_memory_usage;
      D.18014 = last_los_memory_usage.38 / 1024;
      los_memory_usage.39 = los_memory_usage;
      D.18016 = los_memory_usage.39 / 1024;
      D.18017 = major_collector.section_size;
      last_major_num_sections.40 = last_major_num_sections;
      D.18019 = (long unsigned int) last_major_num_sections.40;
      D.18020 = D.18017 * D.18019;
      D.18021 = D.18020 / 1024;
      D.18017 = major_collector.section_size;
      D.18022 = (long unsigned int) num_major_sections;
      D.18023 = D.18017 * D.18022;
      D.18024 = D.18023 / 1024;
      D.18025 = info->total_time;
      D.18026 = (int) D.18025;
      D.18027 = (float) D.18026;
      D.18028 = D.18027 / 1.0e+3;
      D.18029 = (double) D.18028;
      D.18031 = info->reason;
      if (D.18031 != 0B) goto <D.18032>; else goto <D.18033>;
      <D.18032>:
      iftmp.41 = info->reason;
      goto <D.18034>;
      <D.18033>:
      iftmp.41 = "";
      <D.18034>:
      D.17998 = info->is_overflow;
      if (D.17998 != 0) goto <D.18036>; else goto <D.18037>;
      <D.18036>:
      iftmp.42 = "_OVERFLOW";
      goto <D.18038>;
      <D.18037>:
      iftmp.42 = "";
      <D.18038>:
      mono_trace (64, 8, "GC_MAJOR%s: (%s) pause %.2fms, %s major %dK/%dK los %dK/%dK", iftmp.42, iftmp.41, D.18029, &full_timing_buff, D.18024, D.18021, D.18016, D.18014);
      goto <D.18039>;
      <D.18012>:
      los_memory_usage.39 = los_memory_usage;
      D.18016 = los_memory_usage.39 / 1024;
      D.18017 = major_collector.section_size;
      D.18022 = (long unsigned int) num_major_sections;
      D.18023 = D.18017 * D.18022;
      D.18024 = D.18023 / 1024;
      last_major_num_sections.40 = last_major_num_sections;
      D.18040 = num_major_sections - last_major_num_sections.40;
      D.18041 = (long unsigned int) D.18040;
      D.18017 = major_collector.section_size;
      D.18042 = D.18041 * D.18017;
      D.18043 = D.18042 / 1024;
      D.18025 = info->total_time;
      D.18026 = (int) D.18025;
      D.18027 = (float) D.18026;
      D.18028 = D.18027 / 1.0e+3;
      D.18029 = (double) D.18028;
      D.18031 = info->reason;
      if (D.18031 != 0B) goto <D.18045>; else goto <D.18046>;
      <D.18045>:
      iftmp.43 = info->reason;
      goto <D.18047>;
      <D.18046>:
      iftmp.43 = "";
      <D.18047>:
      D.17998 = info->is_overflow;
      if (D.17998 != 0) goto <D.18049>; else goto <D.18050>;
      <D.18049>:
      iftmp.44 = "_OVERFLOW";
      goto <D.18051>;
      <D.18050>:
      iftmp.44 = "";
      <D.18051>:
      mono_trace (64, 8, "GC_MINOR%s: (%s) pause %.2fms, %s promoted %dK major %dK los %dK", iftmp.44, iftmp.43, D.18029, &full_timing_buff, D.18043, D.18024, D.18016);
      <D.18039>:
    }
  finally
    {
      full_timing_buff = {CLOBBER};
    }
}


sprintf (char * restrict __s, const char * restrict __fmt)
{
  int D.18052;
  long unsigned int D.18053;

  D.18053 = __builtin_object_size (__s, 1);
  D.18052 = __builtin___sprintf_chk (__s, 1, D.18053, __fmt, __builtin_va_arg_pack ());
  return D.18052;
}


sgen_register_major_sections_alloced (int num_sections)
{
  int minor_collection_sections_alloced.45;
  int minor_collection_sections_alloced.46;

  minor_collection_sections_alloced.45 = minor_collection_sections_alloced;
  minor_collection_sections_alloced.46 = minor_collection_sections_alloced.45 + num_sections;
  minor_collection_sections_alloced = minor_collection_sections_alloced.46;
}


sgen_get_minor_collection_allowance ()
{
  mword D.18057;

  D.18057 = minor_collection_allowance;
  return D.18057;
}


mono_gc_add_memory_pressure (gint64 value)
{
  long unsigned int memory_pressure.47;
  long unsigned int value.48;
  long unsigned int memory_pressure.49;

  pthread_mutex_lock (&gc_mutex);
  memory_pressure.47 = memory_pressure;
  value.48 = (long unsigned int) value;
  memory_pressure.49 = memory_pressure.47 + value.48;
  memory_pressure = memory_pressure.49;
  sgen_gc_unlock ();
}


sgen_assert_memory_alloc (void * ptr, size_t requested_size, const char * assert_description)
{
  _Bool D.18062;
  _Bool D.18063;
  _Bool D.18064;
  struct _IO_FILE * stderr.50;

  D.18062 = ptr != 0B;
  D.18063 = assert_description == 0B;
  D.18064 = D.18062 | D.18063;
  if (D.18064 != 0) goto <D.18065>; else goto <D.18066>;
  <D.18065>:
  return;
  <D.18066>:
  stderr.50 = stderr;
  fprintf (stderr.50, "Error: Garbage collector could not allocate %zu bytes of memory for %s.\n", requested_size, assert_description);
  exit (1);
}


sgen_alloc_os_memory (size_t size, SgenAllocFlags flags, const char * assert_description)
{
  unsigned int D.18069;
  _Bool D.18070;
  long int D.18071;
  long int D.18072;
  int flags.51;
  int D.18076;
  long unsigned int D.18077;
  int D.18078;
  void * __old_x.52;
  long unsigned int D.18082;
  void * D.18083;
  void * D.18084;
  unsigned int D.18085;
  void * D.18088;
  void * ptr;

  D.18069 = flags & 4294967292;
  D.18070 = D.18069 != 0;
  D.18071 = (long int) D.18070;
  D.18072 = __builtin_expect (D.18071, 0);
  if (D.18072 != 0) goto <D.18073>; else goto <D.18074>;
  <D.18073>:
  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.18074>:
  flags.51 = (int) flags;
  D.18076 = flags.51 & 2;
  D.18077 = prot_flags_for_activate (D.18076);
  D.18078 = (int) D.18077;
  ptr = mono_valloc (0B, size, D.18078);
  sgen_assert_memory_alloc (ptr, size, assert_description);
  if (ptr != 0B) goto <D.18079>; else goto <D.18080>;
  <D.18079>:
  {
    size_t __old_x;

    <D.17813>:
    __old_x = total_alloc;
    __old_x.52 = (void *) __old_x;
    D.18082 = __old_x + size;
    D.18083 = (void *) D.18082;
    D.18084 = InterlockedCompareExchangePointer (&total_alloc, D.18083, __old_x.52);
    __old_x.52 = (void *) __old_x;
    if (D.18084 != __old_x.52) goto <D.17813>; else goto <D.17814>;
    <D.17814>:
  }
  D.18085 = flags & 1;
  if (D.18085 != 0) goto <D.18086>; else goto <D.18087>;
  <D.18086>:
  <D.18087>:
  <D.18080>:
  D.18088 = ptr;
  return D.18088;
}


prot_flags_for_activate (int activate)
{
  long unsigned int iftmp.53;
  long unsigned int D.18094;
  long unsigned int prot_flags;

  if (activate != 0) goto <D.18091>; else goto <D.18092>;
  <D.18091>:
  iftmp.53 = 3;
  goto <D.18093>;
  <D.18092>:
  iftmp.53 = 0;
  <D.18093>:
  prot_flags = iftmp.53;
  D.18094 = prot_flags | 80;
  return D.18094;
}


InterlockedCompareExchangePointer (void * volatile * dest, void * exch, void * comp)
{
  void * D.18096;
  long unsigned int exch.54;
  long unsigned int comp.55;
  long unsigned int D.18099;

  exch.54 = (long unsigned int) exch;
  comp.55 = (long unsigned int) comp;
  D.18099 = __sync_val_compare_and_swap_8 (dest, comp.55, exch.54);
  D.18096 = (void *) D.18099;
  return D.18096;
}


sgen_alloc_os_memory_aligned (size_t size, mword alignment, SgenAllocFlags flags, const char * assert_description)
{
  unsigned int D.18101;
  _Bool D.18102;
  long int D.18103;
  long int D.18104;
  int flags.56;
  int D.18108;
  long unsigned int D.18109;
  int D.18110;
  void * __old_x.57;
  long unsigned int D.18114;
  void * D.18115;
  void * D.18116;
  unsigned int D.18117;
  void * D.18120;
  void * ptr;

  D.18101 = flags & 4294967292;
  D.18102 = D.18101 != 0;
  D.18103 = (long int) D.18102;
  D.18104 = __builtin_expect (D.18103, 0);
  if (D.18104 != 0) goto <D.18105>; else goto <D.18106>;
  <D.18105>:
  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.18106>:
  flags.56 = (int) flags;
  D.18108 = flags.56 & 2;
  D.18109 = prot_flags_for_activate (D.18108);
  D.18110 = (int) D.18109;
  ptr = mono_valloc_aligned (size, alignment, D.18110);
  sgen_assert_memory_alloc (ptr, size, assert_description);
  if (ptr != 0B) goto <D.18111>; else goto <D.18112>;
  <D.18111>:
  {
    size_t __old_x;

    <D.17823>:
    __old_x = total_alloc;
    __old_x.57 = (void *) __old_x;
    D.18114 = __old_x + size;
    D.18115 = (void *) D.18114;
    D.18116 = InterlockedCompareExchangePointer (&total_alloc, D.18115, __old_x.57);
    __old_x.57 = (void *) __old_x;
    if (D.18116 != __old_x.57) goto <D.17823>; else goto <D.17824>;
    <D.17824>:
  }
  D.18117 = flags & 1;
  if (D.18117 != 0) goto <D.18118>; else goto <D.18119>;
  <D.18118>:
  <D.18119>:
  <D.18112>:
  D.18120 = ptr;
  return D.18120;
}


sgen_free_os_memory (void * addr, size_t size, SgenAllocFlags flags)
{
  unsigned int D.18122;
  _Bool D.18123;
  long int D.18124;
  long int D.18125;
  void * __old_x.58;
  long unsigned int D.18129;
  void * D.18130;
  void * D.18131;
  unsigned int D.18132;

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

    <D.17831>:
    __old_x = total_alloc;
    __old_x.58 = (void *) __old_x;
    D.18129 = __old_x - size;
    D.18130 = (void *) D.18129;
    D.18131 = InterlockedCompareExchangePointer (&total_alloc, D.18130, __old_x.58);
    __old_x.58 = (void *) __old_x;
    if (D.18131 != __old_x.58) goto <D.17831>; else goto <D.17832>;
    <D.17832>:
  }
  D.18132 = flags & 1;
  if (D.18132 != 0) goto <D.18133>; else goto <D.18134>;
  <D.18133>:
  <D.18134>:
}


mono_gc_get_heap_size ()
{
  int64_t D.18135;
  long unsigned int total_alloc.59;

  total_alloc.59 = total_alloc;
  D.18135 = (int64_t) total_alloc.59;
  return D.18135;
}


sgen_memgov_release_space (mword size, int space)
{
  void * __old_x.60;
  long unsigned int D.18139;
  void * D.18140;
  void * D.18141;

  {
    size_t __old_x;

    <D.17844>:
    __old_x = allocated_heap;
    __old_x.60 = (void *) __old_x;
    D.18139 = __old_x - size;
    D.18140 = (void *) D.18139;
    D.18141 = InterlockedCompareExchangePointer (&allocated_heap, D.18140, __old_x.60);
    __old_x.60 = (void *) __old_x;
    if (D.18141 != __old_x.60) goto <D.17844>; else goto <D.17845>;
    <D.17845>:
  }
}


sgen_memgov_try_alloc_space (mword size, int space)
{
  long unsigned int D.18142;
  gboolean D.18145;
  void * __old_x.61;
  long unsigned int D.18147;
  void * D.18148;
  void * D.18149;
  long unsigned int allocated_heap.62;

  D.18142 = sgen_memgov_available_free_space ();
  if (D.18142 < size) goto <D.18143>; else goto <D.18144>;
  <D.18143>:
  D.18145 = 0;
  return D.18145;
  <D.18144>:
  {
    size_t __old_x;

    <D.17851>:
    __old_x = allocated_heap;
    __old_x.61 = (void *) __old_x;
    D.18147 = __old_x + size;
    D.18148 = (void *) D.18147;
    D.18149 = InterlockedCompareExchangePointer (&allocated_heap, D.18148, __old_x.61);
    __old_x.61 = (void *) __old_x;
    if (D.18149 != __old_x.61) goto <D.17851>; else goto <D.17852>;
    <D.17852>:
  }
  allocated_heap.62 = allocated_heap;
  mono_runtime_resource_check_limit (2, allocated_heap.62);
  D.18145 = 1;
  return D.18145;
}


sgen_memgov_init (glong max_heap, glong soft_limit, gboolean debug_allowance, double allowance_ratio, double save_target)
{
  long unsigned int soft_limit.63;
  int sgen_nursery_size.64;
  int D.18160;
  long int D.18161;
  long int D.18164;
  long int D.18165;
  long unsigned int max_heap_size.65;
  double D.18167;
  double default_allowance_nursery_size_ratio.66;
  double D.18169;
  long unsigned int minor_collection_allowance.67;

  if (soft_limit != 0) goto <D.18152>; else goto <D.18153>;
  <D.18152>:
  soft_limit.63 = (long unsigned int) soft_limit;
  soft_heap_limit = soft_limit.63;
  <D.18153>:
  debug_print_allowance = debug_allowance;
  if (max_heap == 0) goto <D.18155>; else goto <D.18156>;
  <D.18155>:
  return;
  <D.18156>:
  if (max_heap < soft_limit) goto <D.18157>; else goto <D.18158>;
  <D.18157>:
  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.18158>:
  sgen_nursery_size.64 = sgen_nursery_size;
  D.18160 = sgen_nursery_size.64 * 4;
  D.18161 = (long int) D.18160;
  if (D.18161 > max_heap) goto <D.18162>; else goto <D.18163>;
  <D.18162>:
  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.64 = sgen_nursery_size;
  D.18160 = sgen_nursery_size.64 * 4;
  max_heap = (glong) D.18160;
  <D.18163>:
  sgen_nursery_size.64 = sgen_nursery_size;
  D.18164 = (long int) sgen_nursery_size.64;
  D.18165 = max_heap - D.18164;
  max_heap_size.65 = (long unsigned int) D.18165;
  max_heap_size = max_heap_size.65;
  sgen_nursery_size.64 = sgen_nursery_size;
  D.18167 = (double) sgen_nursery_size.64;
  default_allowance_nursery_size_ratio.66 = default_allowance_nursery_size_ratio;
  D.18169 = D.18167 * default_allowance_nursery_size_ratio.66;
  minor_collection_allowance.67 = (long unsigned int) D.18169;
  minor_collection_allowance = minor_collection_allowance.67;
  if (allowance_ratio != 0.0) goto <D.18171>; else goto <D.18172>;
  <D.18171>:
  default_allowance_nursery_size_ratio = allowance_ratio;
  <D.18172>:
  if (save_target != 0.0) goto <D.18173>; else goto <D.18174>;
  <D.18173>:
  save_target_ratio = save_target;
  <D.18174>:
}


