sgen_need_major_collection (mword space_needed)
{
  int D.18391;
  gboolean D.18394;
  long unsigned int los_memory_usage.0;
  long unsigned int last_collection_los_memory_usage.1;
  long unsigned int D.18397;
  int iftmp.2;
  long unsigned int D.18402;
  int minor_collection_sections_alloced.3;
  long unsigned int D.18405;
  long unsigned int D.18406;
  long unsigned int D.18407;
  long unsigned int D.18408;
  long unsigned int minor_collection_allowance.4;
  mword los_alloced;

  D.18391 = sgen_concurrent_collection_in_progress ();
  if (D.18391 != 0) goto <D.18392>; else goto <D.18393>;
  <D.18392>:
  D.18394 = 0;
  return D.18394;
  <D.18393>:
  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.18397 = MIN_EXPR <los_memory_usage.0, last_collection_los_memory_usage.1>;
  los_alloced = los_memory_usage.0 - D.18397;
  D.18402 = sgen_memgov_available_free_space ();
  if (D.18402 < space_needed) goto <D.18399>; else goto <D.18403>;
  <D.18403>:
  minor_collection_sections_alloced.3 = minor_collection_sections_alloced;
  D.18405 = (long unsigned int) minor_collection_sections_alloced.3;
  D.18406 = major_collector.section_size;
  D.18407 = D.18405 * D.18406;
  D.18408 = D.18407 + los_alloced;
  minor_collection_allowance.4 = minor_collection_allowance;
  if (D.18408 > minor_collection_allowance.4) goto <D.18399>; else goto <D.18400>;
  <D.18399>:
  iftmp.2 = 1;
  goto <D.18401>;
  <D.18400>:
  iftmp.2 = 0;
  <D.18401>:
  D.18394 = iftmp.2;
  return D.18394;
}


sgen_memgov_available_free_space ()
{
  mword D.18411;
  long unsigned int max_heap_size.5;
  long unsigned int allocated_heap.6;
  long unsigned int D.18414;

  max_heap_size.5 = max_heap_size;
  max_heap_size.5 = max_heap_size;
  allocated_heap.6 = allocated_heap;
  D.18414 = MIN_EXPR <max_heap_size.5, allocated_heap.6>;
  D.18411 = max_heap_size.5 - D.18414;
  return D.18411;
}


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.18419;
  long int D.18420;
  long int D.18421;
  gboolean * D.18426;
  int D.18427;
  int sgen_nursery_size.8;
  double D.18433;
  double default_allowance_nursery_size_ratio.9;
  double D.18435;
  long unsigned int minor_collection_allowance.10;
  int (*<Ta61>) (void) D.18437;
  int last_collection_old_num_major_sections.11;
  int D.18439;
  long unsigned int last_collection_old_los_memory_usage.12;
  long unsigned int last_collection_los_memory_usage.13;
  long unsigned int D.18442;
  long unsigned int D.18443;
  long unsigned int D.18444;
  long unsigned int D.18445;
  double D.18446;
  double D.18447;
  double D.18448;
  int minor_collection_sections_alloced.14;
  long unsigned int D.18450;
  long unsigned int D.18451;
  long unsigned int last_collection_los_memory_alloced.15;
  long unsigned int D.18453;
  double D.18454;
  double D.18455;
  long unsigned int D.18456;
  long unsigned int D.18457;
  long unsigned int D.18458;
  double D.18459;
  double D.18460;
  long unsigned int D.18461;
  long unsigned int los_memory_usage.16;
  long unsigned int D.18463;
  long unsigned int D.18464;
  long unsigned int minor_collection_allowance.17;
  long unsigned int minor_collection_allowance.18;
  long unsigned int D.18467;
  long unsigned int soft_heap_limit.19;
  long unsigned int D.18474;
  long unsigned int minor_collection_allowance.20;
  int debug_print_allowance.21;
  long unsigned int D.18479;
  int gc_debug_level.22;
  _Bool D.18481;
  long int D.18482;
  long int D.18483;
  struct FILE * gc_debug_file.23;
  long unsigned int D.18487;
  long int D.18488;
  long int old_major.24;
  long int last_collection_old_los_memory_usage.25;
  long int new_heap_size.26;
  long int new_major.27;
  long int last_collection_los_memory_usage.28;
  long int minor_collection_allowance.29;
  void (*<T555>) (void) D.18499;
  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.18416>; else goto <D.18417>;
  <D.18416>:
  need_calculate_minor_collection_allowance.7 = need_calculate_minor_collection_allowance;
  D.18419 = need_calculate_minor_collection_allowance.7 == 0;
  D.18420 = (long int) D.18419;
  D.18421 = __builtin_expect (D.18420, 0);
  if (D.18421 != 0) goto <D.18422>; else goto <D.18423>;
  <D.18422>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-memory-governor.c", 92, "need_calculate_minor_collection_allowance");
  <D.18423>:
  <D.18417>:
  need_calculate_minor_collection_allowance.7 = need_calculate_minor_collection_allowance;
  if (need_calculate_minor_collection_allowance.7 == 0) goto <D.18424>; else goto <D.18425>;
  <D.18424>:
  return;
  <D.18425>:
  D.18426 = major_collector.have_swept;
  D.18427 = *D.18426;
  if (D.18427 == 0) goto <D.18428>; else goto <D.18429>;
  <D.18428>:
  if (overwrite != 0) goto <D.18430>; else goto <D.18431>;
  <D.18430>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18433 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18435 = D.18433 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.18435;
  minor_collection_allowance = minor_collection_allowance.10;
  <D.18431>:
  return;
  <D.18429>:
  D.18437 = major_collector.get_num_major_sections;
  num_major_sections = D.18437 ();
  last_collection_old_num_major_sections.11 = last_collection_old_num_major_sections;
  D.18439 = last_collection_old_num_major_sections.11 - num_major_sections;
  num_major_sections_saved = MAX_EXPR <D.18439, 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.18442 = last_collection_old_los_memory_usage.12 - last_collection_los_memory_usage.13;
  los_memory_saved = MAX_EXPR <D.18442, 1>;
  D.18443 = (long unsigned int) num_major_sections;
  D.18444 = major_collector.section_size;
  new_major = D.18443 * D.18444;
  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.18445 = new_major + last_collection_los_memory_usage.13;
  D.18446 = (double) D.18445;
  D.18447 = D.18446 * 5.0e-1;
  save_target = (mword) D.18447;
  D.18448 = (double) save_target;
  minor_collection_sections_alloced.14 = minor_collection_sections_alloced;
  D.18450 = (long unsigned int) minor_collection_sections_alloced.14;
  D.18444 = major_collector.section_size;
  D.18451 = D.18450 * D.18444;
  last_collection_los_memory_alloced.15 = last_collection_los_memory_alloced;
  D.18453 = D.18451 + last_collection_los_memory_alloced.15;
  D.18454 = (double) D.18453;
  D.18455 = D.18448 * D.18454;
  D.18456 = (long unsigned int) num_major_sections_saved;
  D.18444 = major_collector.section_size;
  D.18457 = D.18456 * D.18444;
  D.18458 = D.18457 + los_memory_saved;
  D.18459 = (double) D.18458;
  D.18460 = D.18455 / D.18459;
  allowance_target = double_to_mword_with_saturation (D.18460);
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18433 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18435 = D.18433 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.18435;
  D.18443 = (long unsigned int) num_major_sections;
  D.18444 = major_collector.section_size;
  D.18461 = D.18443 * D.18444;
  los_memory_usage.16 = los_memory_usage;
  D.18463 = D.18461 + los_memory_usage.16;
  D.18464 = MIN_EXPR <D.18463, allowance_target>;
  minor_collection_allowance.17 = MAX_EXPR <minor_collection_allowance.10, D.18464>;
  minor_collection_allowance = minor_collection_allowance.17;
  minor_collection_allowance.18 = minor_collection_allowance;
  D.18467 = new_heap_size + minor_collection_allowance.18;
  soft_heap_limit.19 = soft_heap_limit;
  if (D.18467 > soft_heap_limit.19) goto <D.18469>; else goto <D.18470>;
  <D.18469>:
  soft_heap_limit.19 = soft_heap_limit;
  if (new_heap_size > soft_heap_limit.19) goto <D.18471>; else goto <D.18472>;
  <D.18471>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18433 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18435 = D.18433 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.18435;
  minor_collection_allowance = minor_collection_allowance.10;
  goto <D.18473>;
  <D.18472>:
  sgen_nursery_size.8 = sgen_nursery_size;
  D.18433 = (double) sgen_nursery_size.8;
  default_allowance_nursery_size_ratio.9 = default_allowance_nursery_size_ratio;
  D.18435 = D.18433 * default_allowance_nursery_size_ratio.9;
  minor_collection_allowance.10 = (long unsigned int) D.18435;
  soft_heap_limit.19 = soft_heap_limit;
  D.18474 = soft_heap_limit.19 - new_heap_size;
  minor_collection_allowance.20 = MAX_EXPR <minor_collection_allowance.10, D.18474>;
  minor_collection_allowance = minor_collection_allowance.20;
  <D.18473>:
  <D.18470>:
  debug_print_allowance.21 = debug_print_allowance;
  if (debug_print_allowance.21 != 0) goto <D.18477>; else goto <D.18478>;
  <D.18477>:
  {
    mword old_major;

    last_collection_old_num_major_sections.11 = last_collection_old_num_major_sections;
    D.18479 = (long unsigned int) last_collection_old_num_major_sections.11;
    D.18444 = major_collector.section_size;
    old_major = D.18479 * D.18444;
    gc_debug_level.22 = gc_debug_level;
    D.18481 = gc_debug_level.22 > 0;
    D.18482 = (long int) D.18481;
    D.18483 = __builtin_expect (D.18482, 0);
    if (D.18483 != 0) goto <D.18484>; else goto <D.18485>;
    <D.18484>:
    gc_debug_file.23 = gc_debug_file;
    last_collection_old_los_memory_usage.12 = last_collection_old_los_memory_usage;
    D.18487 = old_major + last_collection_old_los_memory_usage.12;
    D.18488 = (long int) D.18487;
    old_major.24 = (long int) old_major;
    last_collection_old_los_memory_usage.12 = last_collection_old_los_memory_usage;
    last_collection_old_los_memory_usage.25 = (long int) last_collection_old_los_memory_usage.12;
    fprintf (gc_debug_file.23, "Before collection: %ld bytes (%ld major, %ld LOS)\n", D.18488, old_major.24, last_collection_old_los_memory_usage.25);
    gc_debug_file.23 = gc_debug_file;
    fflush (gc_debug_file.23);
    <D.18485>:
    gc_debug_level.22 = gc_debug_level;
    D.18481 = gc_debug_level.22 > 0;
    D.18482 = (long int) D.18481;
    D.18483 = __builtin_expect (D.18482, 0);
    if (D.18483 != 0) goto <D.18491>; else goto <D.18492>;
    <D.18491>:
    gc_debug_file.23 = gc_debug_file;
    new_heap_size.26 = (long int) new_heap_size;
    new_major.27 = (long int) new_major;
    last_collection_los_memory_usage.13 = last_collection_los_memory_usage;
    last_collection_los_memory_usage.28 = (long int) last_collection_los_memory_usage.13;
    fprintf (gc_debug_file.23, "After collection: %ld bytes (%ld major, %ld LOS)\n", new_heap_size.26, new_major.27, last_collection_los_memory_usage.28);
    gc_debug_file.23 = gc_debug_file;
    fflush (gc_debug_file.23);
    <D.18492>:
    gc_debug_level.22 = gc_debug_level;
    D.18481 = gc_debug_level.22 > 0;
    D.18482 = (long int) D.18481;
    D.18483 = __builtin_expect (D.18482, 0);
    if (D.18483 != 0) goto <D.18496>; else goto <D.18497>;
    <D.18496>:
    gc_debug_file.23 = gc_debug_file;
    minor_collection_allowance.18 = minor_collection_allowance;
    minor_collection_allowance.29 = (long int) minor_collection_allowance.18;
    fprintf (gc_debug_file.23, "Allowance: %ld bytes\n", minor_collection_allowance.29);
    gc_debug_file.23 = gc_debug_file;
    fflush (gc_debug_file.23);
    <D.18497>:
  }
  <D.18478>:
  D.18499 = major_collector.have_computed_minor_collection_allowance;
  if (D.18499 != 0B) goto <D.18500>; else goto <D.18501>;
  <D.18500>:
  D.18499 = major_collector.have_computed_minor_collection_allowance;
  D.18499 ();
  <D.18501>:
  need_calculate_minor_collection_allowance = 0;
}


double_to_mword_with_saturation (double value)
{
  mword D.18505;

  if (value >= 1.8446744073709551616e+19) goto <D.18503>; else goto <D.18504>;
  <D.18503>:
  D.18505 = 18446744073709551615;
  return D.18505;
  <D.18504>:
  D.18505 = (mword) value;
  return D.18505;
}


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

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


sgen_memgov_minor_collection_end ()
{

}


sgen_memgov_major_collection_start ()
{
  struct SgenMajorCollector * D.18509;
  int (*<Ta61>) (void) D.18510;
  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.18514;
  long unsigned int last_collection_los_memory_alloced.33;

  D.18509 = sgen_get_major_collector ();
  D.18510 = D.18509->get_num_major_sections;
  last_collection_old_num_major_sections.30 = D.18510 ();
  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.18514 = MIN_EXPR <los_memory_usage.31, last_collection_los_memory_usage.32>;
  last_collection_los_memory_alloced.33 = los_memory_usage.31 - D.18514;
  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 (*<Ta61>) (void) D.18517;
  int last_major_num_sections.35;
  long unsigned int los_memory_usage.36;
  int last_los_memory_usage.37;

  D.18517 = major_collector.get_num_major_sections;
  last_major_num_sections.35 = D.18517 ();
  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.18521;
  long unsigned int D.18522;
  struct GGTimingInfo * D.18523;
  int D.18524;
  int i;

  i = 0;
  goto <D.18316>;
  <D.18315>:
  D.18521 = (long unsigned int) i;
  D.18522 = D.18521 * 48;
  D.18523 = info + D.18522;
  D.18524 = D.18523->generation;
  if (D.18524 != -1) goto <D.18525>; else goto <D.18526>;
  <D.18525>:
  D.18521 = (long unsigned int) i;
  D.18522 = D.18521 * 48;
  D.18523 = info + D.18522;
  log_timming (D.18523);
  <D.18526>:
  i = i + 1;
  <D.18316>:
  if (i < info_count) goto <D.18315>; else goto <D.18317>;
  <D.18317>:
}


log_timming (struct GGTimingInfo * info)
{
  int (*<Ta61>) (void) D.18527;
  int D.18528;
  long int D.18531;
  float D.18532;
  float D.18533;
  double D.18534;
  long int D.18535;
  int D.18536;
  float D.18537;
  float D.18538;
  double D.18539;
  int D.18540;
  const char * iftmp.38;
  const char * iftmp.39;
  const char * D.18548;
  long int D.18552;
  int D.18553;
  float D.18554;
  float D.18555;
  double D.18556;
  long unsigned int D.18557;
  long unsigned int D.18558;
  long unsigned int D.18559;
  long unsigned int D.18560;
  int last_major_num_sections.40;
  long unsigned int D.18562;
  long unsigned int D.18563;
  long unsigned int D.18564;
  long unsigned int los_memory_usage.41;
  long unsigned int D.18566;
  int last_los_memory_usage.42;
  int D.18568;
  const char * iftmp.43;
  const char * iftmp.44;
  int D.18578;
  long unsigned int D.18579;
  long unsigned int D.18580;
  long unsigned int D.18581;
  int num_major_sections;
  char full_timing_buff[1024];

  try
    {
      D.18527 = major_collector.get_num_major_sections;
      num_major_sections = D.18527 ();
      full_timing_buff[0] = 0;
      D.18528 = info->is_overflow;
      if (D.18528 == 0) goto <D.18529>; else goto <D.18530>;
      <D.18529>:
      D.18531 = info->stw_time;
      D.18532 = (float) D.18531;
      D.18533 = D.18532 / 1.0e+3;
      D.18534 = (double) D.18533;
      D.18535 = info->bridge_time;
      D.18536 = (int) D.18535;
      D.18537 = (float) D.18536;
      D.18538 = D.18537 / 1.0e+3;
      D.18539 = (double) D.18538;
      sprintf (&full_timing_buff, "total %.2fms, bridge %.2fms", D.18534, D.18539);
      <D.18530>:
      D.18540 = info->generation;
      if (D.18540 == 1) goto <D.18541>; else goto <D.18542>;
      <D.18541>:
      D.18528 = info->is_overflow;
      if (D.18528 != 0) goto <D.18544>; else goto <D.18545>;
      <D.18544>:
      iftmp.38 = "_OVERFLOW";
      goto <D.18546>;
      <D.18545>:
      iftmp.38 = "";
      <D.18546>:
      D.18548 = info->reason;
      if (D.18548 != 0B) goto <D.18549>; else goto <D.18550>;
      <D.18549>:
      iftmp.39 = info->reason;
      goto <D.18551>;
      <D.18550>:
      iftmp.39 = "";
      <D.18551>:
      D.18552 = info->total_time;
      D.18553 = (int) D.18552;
      D.18554 = (float) D.18553;
      D.18555 = D.18554 / 1.0e+3;
      D.18556 = (double) D.18555;
      D.18557 = major_collector.section_size;
      D.18558 = (long unsigned int) num_major_sections;
      D.18559 = D.18557 * D.18558;
      D.18560 = D.18559 / 1024;
      D.18557 = major_collector.section_size;
      last_major_num_sections.40 = last_major_num_sections;
      D.18562 = (long unsigned int) last_major_num_sections.40;
      D.18563 = D.18557 * D.18562;
      D.18564 = D.18563 / 1024;
      los_memory_usage.41 = los_memory_usage;
      D.18566 = los_memory_usage.41 / 1024;
      last_los_memory_usage.42 = last_los_memory_usage;
      D.18568 = last_los_memory_usage.42 / 1024;
      mono_trace (64, 8, "GC_MAJOR%s: (%s) pause %.2fms, %s major %dK/%dK los %dK/%dK", iftmp.38, iftmp.39, D.18556, &full_timing_buff, D.18560, D.18564, D.18566, D.18568);
      goto <D.18569>;
      <D.18542>:
      D.18528 = info->is_overflow;
      if (D.18528 != 0) goto <D.18571>; else goto <D.18572>;
      <D.18571>:
      iftmp.43 = "_OVERFLOW";
      goto <D.18573>;
      <D.18572>:
      iftmp.43 = "";
      <D.18573>:
      D.18548 = info->reason;
      if (D.18548 != 0B) goto <D.18575>; else goto <D.18576>;
      <D.18575>:
      iftmp.44 = info->reason;
      goto <D.18577>;
      <D.18576>:
      iftmp.44 = "";
      <D.18577>:
      D.18552 = info->total_time;
      D.18553 = (int) D.18552;
      D.18554 = (float) D.18553;
      D.18555 = D.18554 / 1.0e+3;
      D.18556 = (double) D.18555;
      last_major_num_sections.40 = last_major_num_sections;
      D.18578 = num_major_sections - last_major_num_sections.40;
      D.18579 = (long unsigned int) D.18578;
      D.18557 = major_collector.section_size;
      D.18580 = D.18579 * D.18557;
      D.18581 = D.18580 / 1024;
      D.18557 = major_collector.section_size;
      D.18558 = (long unsigned int) num_major_sections;
      D.18559 = D.18557 * D.18558;
      D.18560 = D.18559 / 1024;
      los_memory_usage.41 = los_memory_usage;
      D.18566 = los_memory_usage.41 / 1024;
      mono_trace (64, 8, "GC_MINOR%s: (%s) pause %.2fms, %s promoted %dK major %dK los %dK", iftmp.43, iftmp.44, D.18556, &full_timing_buff, D.18581, D.18560, D.18566);
      <D.18569>:
    }
  finally
    {
      full_timing_buff = {CLOBBER};
    }
}


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

  D.18583 = __builtin_object_size (__s, 1);
  D.18582 = __builtin___sprintf_chk (__s, 1, D.18583, __fmt, __builtin_va_arg_pack ());
  return D.18582;
}


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

  D.18587 = minor_collection_allowance;
  return D.18587;
}


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)
{
  struct _IO_FILE * stderr.50;

  if (ptr != 0B) goto <D.18592>; else goto <D.18594>;
  <D.18594>:
  if (assert_description == 0B) goto <D.18592>; else goto <D.18593>;
  <D.18592>:
  return;
  <D.18593>:
  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.18597;
  _Bool D.18598;
  long int D.18599;
  long int D.18600;
  int flags.51;
  int D.18604;
  long unsigned int D.18605;
  int D.18606;
  long unsigned int D.18609;
  void * D.18610;
  void * __old_x.52;
  void * D.18612;
  unsigned int D.18613;
  void * D.18616;
  void * ptr;

  D.18597 = flags & 4294967292;
  D.18598 = D.18597 != 0;
  D.18599 = (long int) D.18598;
  D.18600 = __builtin_expect (D.18599, 0);
  if (D.18600 != 0) goto <D.18601>; else goto <D.18602>;
  <D.18601>:
  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.18602>:
  flags.51 = (int) flags;
  D.18604 = flags.51 & 2;
  D.18605 = prot_flags_for_activate (D.18604);
  D.18606 = (int) D.18605;
  ptr = mono_valloc (0B, size, D.18606);
  sgen_assert_memory_alloc (ptr, size, assert_description);
  if (ptr != 0B) goto <D.18607>; else goto <D.18608>;
  <D.18607>:
  {
    size_t __old_x;

    <D.18343>:
    __old_x = total_alloc;
    D.18609 = __old_x + size;
    D.18610 = (void *) D.18609;
    __old_x.52 = (void *) __old_x;
    D.18612 = InterlockedCompareExchangePointer (&total_alloc, D.18610, __old_x.52);
    __old_x.52 = (void *) __old_x;
    if (D.18612 != __old_x.52) goto <D.18343>; else goto <D.18344>;
    <D.18344>:
  }
  D.18613 = flags & 1;
  if (D.18613 != 0) goto <D.18614>; else goto <D.18615>;
  <D.18614>:
  <D.18615>:
  <D.18608>:
  D.18616 = ptr;
  return D.18616;
}


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

  if (activate != 0) goto <D.18619>; else goto <D.18620>;
  <D.18619>:
  iftmp.53 = 3;
  goto <D.18621>;
  <D.18620>:
  iftmp.53 = 0;
  <D.18621>:
  prot_flags = iftmp.53;
  D.18622 = prot_flags | 80;
  return D.18622;
}


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

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


sgen_alloc_os_memory_aligned (size_t size, mword alignment, SgenAllocFlags flags, const char * assert_description)
{
  unsigned int D.18629;
  _Bool D.18630;
  long int D.18631;
  long int D.18632;
  int flags.56;
  int D.18636;
  long unsigned int D.18637;
  int D.18638;
  long unsigned int D.18641;
  void * D.18642;
  void * __old_x.57;
  void * D.18644;
  unsigned int D.18645;
  void * D.18648;
  void * ptr;

  D.18629 = flags & 4294967292;
  D.18630 = D.18629 != 0;
  D.18631 = (long int) D.18630;
  D.18632 = __builtin_expect (D.18631, 0);
  if (D.18632 != 0) goto <D.18633>; else goto <D.18634>;
  <D.18633>:
  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.18634>:
  flags.56 = (int) flags;
  D.18636 = flags.56 & 2;
  D.18637 = prot_flags_for_activate (D.18636);
  D.18638 = (int) D.18637;
  ptr = mono_valloc_aligned (size, alignment, D.18638);
  sgen_assert_memory_alloc (ptr, size, assert_description);
  if (ptr != 0B) goto <D.18639>; else goto <D.18640>;
  <D.18639>:
  {
    size_t __old_x;

    <D.18353>:
    __old_x = total_alloc;
    D.18641 = __old_x + size;
    D.18642 = (void *) D.18641;
    __old_x.57 = (void *) __old_x;
    D.18644 = InterlockedCompareExchangePointer (&total_alloc, D.18642, __old_x.57);
    __old_x.57 = (void *) __old_x;
    if (D.18644 != __old_x.57) goto <D.18353>; else goto <D.18354>;
    <D.18354>:
  }
  D.18645 = flags & 1;
  if (D.18645 != 0) goto <D.18646>; else goto <D.18647>;
  <D.18646>:
  <D.18647>:
  <D.18640>:
  D.18648 = ptr;
  return D.18648;
}


sgen_free_os_memory (void * addr, size_t size, SgenAllocFlags flags)
{
  unsigned int D.18650;
  _Bool D.18651;
  long int D.18652;
  long int D.18653;
  long unsigned int D.18656;
  void * D.18657;
  void * __old_x.58;
  void * D.18659;
  unsigned int D.18660;

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

    <D.18361>:
    __old_x = total_alloc;
    D.18656 = __old_x - size;
    D.18657 = (void *) D.18656;
    __old_x.58 = (void *) __old_x;
    D.18659 = InterlockedCompareExchangePointer (&total_alloc, D.18657, __old_x.58);
    __old_x.58 = (void *) __old_x;
    if (D.18659 != __old_x.58) goto <D.18361>; else goto <D.18362>;
    <D.18362>:
  }
  D.18660 = flags & 1;
  if (D.18660 != 0) goto <D.18661>; else goto <D.18662>;
  <D.18661>:
  <D.18662>:
}


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

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


sgen_memgov_release_space (mword size, int space)
{
  long unsigned int D.18666;
  void * D.18667;
  void * __old_x.60;
  void * D.18669;

  {
    size_t __old_x;

    <D.18374>:
    __old_x = allocated_heap;
    D.18666 = __old_x - size;
    D.18667 = (void *) D.18666;
    __old_x.60 = (void *) __old_x;
    D.18669 = InterlockedCompareExchangePointer (&allocated_heap, D.18667, __old_x.60);
    __old_x.60 = (void *) __old_x;
    if (D.18669 != __old_x.60) goto <D.18374>; else goto <D.18375>;
    <D.18375>:
  }
}


sgen_memgov_try_alloc_space (mword size, int space)
{
  long unsigned int D.18670;
  gboolean D.18673;
  long unsigned int D.18674;
  void * D.18675;
  void * __old_x.61;
  void * D.18677;
  long unsigned int allocated_heap.62;

  D.18670 = sgen_memgov_available_free_space ();
  if (D.18670 < size) goto <D.18671>; else goto <D.18672>;
  <D.18671>:
  D.18673 = 0;
  return D.18673;
  <D.18672>:
  {
    size_t __old_x;

    <D.18381>:
    __old_x = allocated_heap;
    D.18674 = __old_x + size;
    D.18675 = (void *) D.18674;
    __old_x.61 = (void *) __old_x;
    D.18677 = InterlockedCompareExchangePointer (&allocated_heap, D.18675, __old_x.61);
    __old_x.61 = (void *) __old_x;
    if (D.18677 != __old_x.61) goto <D.18381>; else goto <D.18382>;
    <D.18382>:
  }
  allocated_heap.62 = allocated_heap;
  mono_runtime_resource_check_limit (2, allocated_heap.62);
  D.18673 = 1;
  return D.18673;
}


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.18688;
  long int D.18689;
  long int D.18692;
  long int D.18693;
  long unsigned int max_heap_size.65;
  double D.18695;
  double default_allowance_nursery_size_ratio.66;
  double D.18697;
  long unsigned int minor_collection_allowance.67;

  if (soft_limit != 0) goto <D.18680>; else goto <D.18681>;
  <D.18680>:
  soft_limit.63 = (long unsigned int) soft_limit;
  soft_heap_limit = soft_limit.63;
  <D.18681>:
  debug_print_allowance = debug_allowance;
  if (max_heap == 0) goto <D.18683>; else goto <D.18684>;
  <D.18683>:
  return;
  <D.18684>:
  if (max_heap < soft_limit) goto <D.18685>; else goto <D.18686>;
  <D.18685>:
  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.18686>:
  sgen_nursery_size.64 = sgen_nursery_size;
  D.18688 = sgen_nursery_size.64 * 4;
  D.18689 = (long int) D.18688;
  if (D.18689 > max_heap) goto <D.18690>; else goto <D.18691>;
  <D.18690>:
  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.18688 = sgen_nursery_size.64 * 4;
  max_heap = (glong) D.18688;
  <D.18691>:
  sgen_nursery_size.64 = sgen_nursery_size;
  D.18692 = (long int) sgen_nursery_size.64;
  D.18693 = max_heap - D.18692;
  max_heap_size.65 = (long unsigned int) D.18693;
  max_heap_size = max_heap_size.65;
  sgen_nursery_size.64 = sgen_nursery_size;
  D.18695 = (double) sgen_nursery_size.64;
  default_allowance_nursery_size_ratio.66 = default_allowance_nursery_size_ratio;
  D.18697 = D.18695 * default_allowance_nursery_size_ratio.66;
  minor_collection_allowance.67 = (long unsigned int) D.18697;
  minor_collection_allowance = minor_collection_allowance.67;
  if (allowance_ratio != 0.0) goto <D.18699>; else goto <D.18700>;
  <D.18699>:
  default_allowance_nursery_size_ratio = allowance_ratio;
  <D.18700>:
  if (save_target != 0.0) goto <D.18701>; else goto <D.18702>;
  <D.18701>:
  save_target_ratio = save_target;
  <D.18702>:
}


