sgen_get_complex_descriptor (mword desc)
{
  gsize * D.17285;
  gsize * complex_descriptors.0;
  unsigned int D.17287;
  unsigned int D.17288;

  complex_descriptors.0 = complex_descriptors;
  D.17287 = desc >> 3;
  D.17288 = D.17287 * 4;
  D.17285 = complex_descriptors.0 + D.17288;
  return D.17285;
}


mono_gc_make_descr_for_string (gsize * bitmap, int numbits)
{
  void * D.17290;

  D.17290 = 1B;
  return D.17290;
}


mono_gc_make_descr_for_object (gsize * bitmap, int numbits, size_t obj_size)
{
  unsigned int i.1;
  unsigned int D.17293;
  unsigned int D.17294;
  gsize * D.17295;
  unsigned int D.17296;
  int D.17297;
  unsigned int D.17298;
  unsigned int D.17299;
  void * desc.2;
  struct FILE * gc_debug_file.3;
  void * D.17312;
  unsigned int D.17313;
  unsigned int D.17314;
  _Bool D.17315;
  long int D.17316;
  long int D.17317;
  _Bool D.17322;
  _Bool D.17323;
  _Bool D.17324;
  int D.17327;
  int D.17328;
  int D.17331;
  unsigned int D.17332;
  unsigned int D.17333;
  int D.17334;
  unsigned int D.17335;
  unsigned int D.17336;
  unsigned int last_set.4;
  _Bool D.17340;
  _Bool D.17341;
  _Bool D.17342;
  unsigned int D.17345;
  unsigned int D.17346;
  unsigned int D.17347;
  unsigned int D.17348;
  unsigned int D.17353;
  int D.17356;
  int D.17357;
  int D.17358;
  int first_set;
  int num_set;
  int last_set;
  int i;
  mword desc;
  size_t stored_size;

  first_set = -1;
  num_set = 0;
  last_set = -1;
  desc = 0;
  stored_size = obj_size;
  stored_size = stored_size + 7;
  stored_size = stored_size & 4294967288;
  i = 0;
  goto <D.17220>;
  <D.17219>:
  i.1 = (unsigned int) i;
  D.17293 = i.1 / 32;
  D.17294 = D.17293 * 4;
  D.17295 = bitmap + D.17294;
  D.17296 = *D.17295;
  D.17297 = i & 31;
  D.17298 = 1 << D.17297;
  D.17299 = D.17296 & D.17298;
  if (D.17299 != 0) goto <D.17300>; else goto <D.17301>;
  <D.17300>:
  if (first_set < 0) goto <D.17302>; else goto <D.17303>;
  <D.17302>:
  first_set = i;
  <D.17303>:
  last_set = i;
  num_set = num_set + 1;
  <D.17301>:
  i = i + 1;
  <D.17220>:
  if (i < numbits) goto <D.17219>; else goto <D.17221>;
  <D.17221>:
  if (first_set < 0) goto <D.17304>; else goto <D.17305>;
  <D.17304>:
  if (0 != 0) goto <D.17306>; else goto <D.17307>;
  <D.17306>:
  desc.2 = (void *) desc;
  gc_debug_file.3 = gc_debug_file;
  fprintf (gc_debug_file.3, "Ptrfree descriptor %p, size: %zd\n", desc.2, stored_size);
  gc_debug_file.3 = gc_debug_file;
  fflush (gc_debug_file.3);
  <D.17307>:
  if (stored_size <= 65535) goto <D.17310>; else goto <D.17311>;
  <D.17310>:
  D.17313 = stored_size | 1;
  D.17312 = (void *) D.17313;
  return D.17312;
  <D.17311>:
  D.17312 = 7B;
  return D.17312;
  <D.17305>:
  D.17314 = stored_size & 7;
  D.17315 = D.17314 != 0;
  D.17316 = (long int) D.17315;
  D.17317 = __builtin_expect (D.17316, 0);
  if (D.17317 != 0) goto <D.17318>; else goto <D.17319>;
  <D.17318>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 149, "!(stored_size & 0x7)");
  <D.17319>:
  if (stored_size <= 65535) goto <D.17320>; else goto <D.17321>;
  <D.17320>:
  D.17322 = first_set <= 255;
  D.17323 = num_set <= 255;
  D.17324 = D.17322 & D.17323;
  if (D.17324 != 0) goto <D.17325>; else goto <D.17326>;
  <D.17325>:
  D.17327 = first_set + num_set;
  D.17328 = last_set + 1;
  if (D.17327 == D.17328) goto <D.17329>; else goto <D.17330>;
  <D.17329>:
  D.17331 = first_set << 16;
  D.17332 = (unsigned int) D.17331;
  D.17333 = D.17332 | stored_size;
  D.17334 = num_set << 24;
  D.17335 = (unsigned int) D.17334;
  D.17336 = D.17333 | D.17335;
  desc = D.17336 | 1;
  if (0 != 0) goto <D.17337>; else goto <D.17338>;
  <D.17337>:
  desc.2 = (void *) desc;
  gc_debug_file.3 = gc_debug_file;
  fprintf (gc_debug_file.3, "Runlen descriptor %p, size: %zd, first set: %d, num set: %d\n", desc.2, stored_size, first_set, num_set);
  gc_debug_file.3 = gc_debug_file;
  fflush (gc_debug_file.3);
  <D.17338>:
  D.17312 = (void *) desc;
  return D.17312;
  <D.17330>:
  <D.17326>:
  <D.17321>:
  last_set.4 = (unsigned int) last_set;
  D.17340 = last_set.4 <= 17;
  D.17341 = stored_size <= 65535;
  D.17342 = D.17340 & D.17341;
  if (D.17342 != 0) goto <D.17343>; else goto <D.17344>;
  <D.17343>:
  D.17345 = *bitmap;
  D.17346 = D.17345 >> 2;
  D.17347 = D.17346 << 16;
  D.17348 = D.17347 | stored_size;
  desc = D.17348 | 2;
  if (0 != 0) goto <D.17349>; else goto <D.17350>;
  <D.17349>:
  desc.2 = (void *) desc;
  gc_debug_file.3 = gc_debug_file;
  fprintf (gc_debug_file.3, "Smallbitmap descriptor %p, size: %zd, last set: %d\n", desc.2, stored_size, last_set);
  gc_debug_file.3 = gc_debug_file;
  fflush (gc_debug_file.3);
  <D.17350>:
  D.17312 = (void *) desc;
  return D.17312;
  <D.17344>:
  last_set.4 = (unsigned int) last_set;
  if (last_set.4 <= 30) goto <D.17351>; else goto <D.17352>;
  <D.17351>:
  D.17345 = *bitmap;
  D.17346 = D.17345 >> 2;
  D.17353 = D.17346 << 3;
  desc = D.17353 | 5;
  if (0 != 0) goto <D.17354>; else goto <D.17355>;
  <D.17354>:
  desc.2 = (void *) desc;
  gc_debug_file.3 = gc_debug_file;
  fprintf (gc_debug_file.3, "Largebitmap descriptor %p, size: %zd, last set: %d\n", desc.2, stored_size, last_set);
  gc_debug_file.3 = gc_debug_file;
  fflush (gc_debug_file.3);
  <D.17355>:
  D.17312 = (void *) desc;
  return D.17312;
  <D.17352>:
  D.17328 = last_set + 1;
  D.17356 = alloc_complex_descriptor (bitmap, D.17328);
  D.17357 = D.17356 << 3;
  D.17358 = D.17357 | 3;
  desc = (mword) D.17358;
  D.17312 = (void *) desc;
  return D.17312;
}


alloc_complex_descriptor (gsize * bitmap, int numbits)
{
  unsigned int numbits.5;
  unsigned int D.17361;
  int D.17362;
  unsigned int numbits.6;
  unsigned int D.17364;
  unsigned int D.17365;
  gsize * complex_descriptors.7;
  unsigned int i.8;
  unsigned int D.17368;
  gsize * D.17369;
  unsigned int D.17370;
  unsigned int nwords.9;
  int D.17374;
  int D.17375;
  unsigned int D.17376;
  unsigned int D.17377;
  gsize * D.17378;
  unsigned int D.17379;
  unsigned int j.10;
  unsigned int D.17381;
  gsize * D.17382;
  unsigned int D.17383;
  int D.17386;
  int D.17389;
  unsigned int i.11;
  unsigned int D.17391;
  int complex_descriptors_next.12;
  int complex_descriptors_next.17;
  int complex_descriptors_size.13;
  int D.17397;
  unsigned int new_size.14;
  unsigned int D.17399;
  void * complex_descriptors.15;
  struct FILE * gc_debug_file.16;
  unsigned int res.18;
  unsigned int D.17405;
  gsize * D.17406;
  int D.17407;
  int D.17408;
  unsigned int D.17409;
  unsigned int D.17410;
  gsize * D.17411;
  gsize * D.17412;
  unsigned int D.17413;
  unsigned int D.17416;
  void * D.17417;
  int nwords;
  int res;
  int i;

  numbits.5 = (unsigned int) numbits;
  D.17361 = numbits.5 + 31;
  D.17362 = (int) D.17361;
  numbits = D.17362 & -32;
  numbits.6 = (unsigned int) numbits;
  D.17364 = numbits.6 / 32;
  D.17365 = D.17364 + 1;
  nwords = (int) D.17365;
  sgen_gc_lock ();
  res = complex_descriptors_next;
  i = 0;
  goto <D.17195>;
  <D.17194>:
  complex_descriptors.7 = complex_descriptors;
  i.8 = (unsigned int) i;
  D.17368 = i.8 * 4;
  D.17369 = complex_descriptors.7 + D.17368;
  D.17370 = *D.17369;
  nwords.9 = (unsigned int) nwords;
  if (D.17370 == nwords.9) goto <D.17372>; else goto <D.17373>;
  <D.17372>:
  {
    int j;
    int found;

    found = 1;
    j = 0;
    goto <D.17193>;
    <D.17192>:
    complex_descriptors.7 = complex_descriptors;
    D.17374 = i + 1;
    D.17375 = D.17374 + j;
    D.17376 = (unsigned int) D.17375;
    D.17377 = D.17376 * 4;
    D.17378 = complex_descriptors.7 + D.17377;
    D.17379 = *D.17378;
    j.10 = (unsigned int) j;
    D.17381 = j.10 * 4;
    D.17382 = bitmap + D.17381;
    D.17383 = *D.17382;
    if (D.17379 != D.17383) goto <D.17384>; else goto <D.17385>;
    <D.17384>:
    found = 0;
    goto <D.17191>;
    <D.17385>:
    j = j + 1;
    <D.17193>:
    D.17386 = nwords + -1;
    if (D.17386 > j) goto <D.17192>; else goto <D.17191>;
    <D.17191>:
    if (found != 0) goto <D.17387>; else goto <D.17388>;
    <D.17387>:
    sgen_gc_unlock ();
    D.17389 = i;
    return D.17389;
    <D.17388>:
  }
  <D.17373>:
  complex_descriptors.7 = complex_descriptors;
  i.8 = (unsigned int) i;
  D.17368 = i.8 * 4;
  D.17369 = complex_descriptors.7 + D.17368;
  D.17370 = *D.17369;
  i.11 = (unsigned int) i;
  D.17391 = D.17370 + i.11;
  i = (int) D.17391;
  <D.17195>:
  complex_descriptors_next.12 = complex_descriptors_next;
  if (i < complex_descriptors_next.12) goto <D.17194>; else goto <D.17196>;
  <D.17196>:
  complex_descriptors_next.12 = complex_descriptors_next;
  complex_descriptors_next.17 = complex_descriptors_next.12 + nwords;
  complex_descriptors_size.13 = complex_descriptors_size;
  if (complex_descriptors_next.17 > complex_descriptors_size.13) goto <D.17395>; else goto <D.17396>;
  <D.17395>:
  {
    int new_size;

    complex_descriptors_size.13 = complex_descriptors_size;
    D.17397 = complex_descriptors_size.13 * 2;
    new_size = D.17397 + nwords;
    new_size.14 = (unsigned int) new_size;
    D.17399 = new_size.14 * 4;
    complex_descriptors.7 = complex_descriptors;
    complex_descriptors.15 = monoeg_realloc (complex_descriptors.7, D.17399);
    complex_descriptors = complex_descriptors.15;
    complex_descriptors_size = new_size;
  }
  <D.17396>:
  if (0 != 0) goto <D.17401>; else goto <D.17402>;
  <D.17401>:
  complex_descriptors_size.13 = complex_descriptors_size;
  gc_debug_file.16 = gc_debug_file;
  fprintf (gc_debug_file.16, "Complex descriptor %d, size: %d (total desc memory: %d)\n", res, nwords, complex_descriptors_size.13);
  gc_debug_file.16 = gc_debug_file;
  fflush (gc_debug_file.16);
  <D.17402>:
  complex_descriptors_next.12 = complex_descriptors_next;
  complex_descriptors_next.17 = complex_descriptors_next.12 + nwords;
  complex_descriptors_next = complex_descriptors_next.17;
  complex_descriptors.7 = complex_descriptors;
  res.18 = (unsigned int) res;
  D.17405 = res.18 * 4;
  D.17406 = complex_descriptors.7 + D.17405;
  nwords.9 = (unsigned int) nwords;
  *D.17406 = nwords.9;
  i = 0;
  goto <D.17199>;
  <D.17198>:
  complex_descriptors.7 = complex_descriptors;
  D.17407 = res + 1;
  D.17408 = D.17407 + i;
  D.17409 = (unsigned int) D.17408;
  D.17410 = D.17409 * 4;
  D.17411 = complex_descriptors.7 + D.17410;
  i.8 = (unsigned int) i;
  D.17368 = i.8 * 4;
  D.17412 = bitmap + D.17368;
  D.17413 = *D.17412;
  *D.17411 = D.17413;
  if (0 != 0) goto <D.17414>; else goto <D.17415>;
  <D.17414>:
  complex_descriptors.7 = complex_descriptors;
  D.17407 = res + 1;
  D.17408 = D.17407 + i;
  D.17409 = (unsigned int) D.17408;
  D.17410 = D.17409 * 4;
  D.17411 = complex_descriptors.7 + D.17410;
  D.17416 = *D.17411;
  D.17417 = (void *) D.17416;
  gc_debug_file.16 = gc_debug_file;
  fprintf (gc_debug_file.16, "\tvalue: %p\n", D.17417);
  gc_debug_file.16 = gc_debug_file;
  fflush (gc_debug_file.16);
  <D.17415>:
  i = i + 1;
  <D.17199>:
  D.17386 = nwords + -1;
  if (D.17386 > i) goto <D.17198>; else goto <D.17200>;
  <D.17200>:
  sgen_gc_unlock ();
  D.17389 = res;
  return D.17389;
}


mono_gc_make_descr_for_array (int vector, gsize * elem_bitmap, int numbits, size_t elem_size)
{
  mword iftmp.19;
  unsigned int i.20;
  unsigned int D.17424;
  unsigned int D.17425;
  gsize * D.17426;
  unsigned int D.17427;
  int D.17428;
  unsigned int D.17429;
  unsigned int D.17430;
  void * D.17439;
  unsigned int D.17440;
  unsigned int D.17441;
  unsigned int num_set.21;
  unsigned int D.17447;
  unsigned int D.17450;
  unsigned int last_set.22;
  unsigned int D.17454;
  unsigned int D.17455;
  unsigned int D.17456;
  unsigned int D.17457;
  int D.17458;
  int D.17459;
  int D.17460;
  unsigned int D.17461;
  int first_set;
  int num_set;
  int last_set;
  int i;
  mword desc;

  first_set = -1;
  num_set = 0;
  last_set = -1;
  if (vector != 0) goto <D.17420>; else goto <D.17421>;
  <D.17420>:
  iftmp.19 = 4;
  goto <D.17422>;
  <D.17421>:
  iftmp.19 = 8196;
  <D.17422>:
  desc = iftmp.19;
  i = 0;
  goto <D.17234>;
  <D.17233>:
  i.20 = (unsigned int) i;
  D.17424 = i.20 / 32;
  D.17425 = D.17424 * 4;
  D.17426 = elem_bitmap + D.17425;
  D.17427 = *D.17426;
  D.17428 = i & 31;
  D.17429 = 1 << D.17428;
  D.17430 = D.17427 & D.17429;
  if (D.17430 != 0) goto <D.17431>; else goto <D.17432>;
  <D.17431>:
  if (first_set < 0) goto <D.17433>; else goto <D.17434>;
  <D.17433>:
  first_set = i;
  <D.17434>:
  last_set = i;
  num_set = num_set + 1;
  <D.17432>:
  i = i + 1;
  <D.17234>:
  if (i < numbits) goto <D.17233>; else goto <D.17235>;
  <D.17235>:
  if (first_set < 0) goto <D.17435>; else goto <D.17436>;
  <D.17435>:
  if (elem_size <= 1023) goto <D.17437>; else goto <D.17438>;
  <D.17437>:
  D.17440 = elem_size << 3;
  D.17441 = D.17440 | desc;
  D.17439 = (void *) D.17441;
  return D.17439;
  <D.17438>:
  D.17439 = 7B;
  return D.17439;
  <D.17436>:
  if (elem_size <= 1023) goto <D.17442>; else goto <D.17443>;
  <D.17442>:
  D.17440 = elem_size << 3;
  desc = D.17440 | desc;
  if (num_set == 0) goto <D.17444>; else goto <D.17445>;
  <D.17444>:
  D.17439 = (void *) desc;
  return D.17439;
  <D.17445>:
  num_set.21 = (unsigned int) num_set;
  D.17447 = num_set.21 * 4;
  if (D.17447 == elem_size) goto <D.17448>; else goto <D.17449>;
  <D.17448>:
  D.17450 = desc | 4294918144;
  D.17439 = (void *) D.17450;
  return D.17439;
  <D.17449>:
  last_set.22 = (unsigned int) last_set;
  if (last_set.22 <= 15) goto <D.17452>; else goto <D.17453>;
  <D.17452>:
  D.17454 = *elem_bitmap;
  D.17455 = D.17454 << 16;
  D.17456 = D.17455 | desc;
  D.17457 = D.17456 | 49152;
  D.17439 = (void *) D.17457;
  return D.17439;
  <D.17453>:
  <D.17443>:
  desc = 6;
  D.17458 = last_set + 1;
  D.17459 = alloc_complex_descriptor (elem_bitmap, D.17458);
  D.17460 = D.17459 << 3;
  D.17461 = (unsigned int) D.17460;
  desc = D.17461 | desc;
  D.17439 = (void *) desc;
  return D.17439;
}


mono_gc_get_bitmap_for_descr (void * descr, int * numbits)
{
  unsigned int D.17463;
  unsigned int D.17464;
  int D.17465;
  unsigned int D.17466;
  int D.17467;
  int D.17468;
  int D.17469;
  unsigned int D.17470;
  unsigned int D.17471;
  unsigned int i.23;
  unsigned int D.17473;
  unsigned int D.17474;
  gsize * D.17475;
  unsigned int D.17476;
  int D.17477;
  unsigned int D.17478;
  unsigned int D.17479;
  gsize * D.17480;
  unsigned int D.17481;
  unsigned int D.17482;
  int D.17483;
  int D.17484;
  unsigned int D.17485;
  unsigned int D.17486;
  unsigned int bwords.24;
  unsigned int D.17488;
  unsigned int D.17489;
  int D.17490;
  unsigned int i.25;
  unsigned int D.17492;
  gsize * D.17493;
  sizetype i.26;
  sizetype D.17495;
  sizetype D.17496;
  gsize * D.17497;
  unsigned int D.17498;
  mword d;
  gsize * bitmap;

  d = (mword) descr;
  D.17463 = d & 7;
  switch (D.17463) <default: <D.17262>, case 1: <D.17242>, case 2: <D.17249>, case 3: <D.17255>, case 5: <D.17250>>
  <D.17242>:
  {
    int first_set;
    int num_set;
    int i;

    D.17464 = d >> 16;
    D.17465 = (int) D.17464;
    first_set = D.17465 & 255;
    D.17466 = d >> 24;
    num_set = (int) D.17466;
    D.17467 = first_set + num_set;
    D.17468 = D.17467 + 7;
    D.17469 = D.17468 / 8;
    D.17470 = (unsigned int) D.17469;
    D.17471 = D.17470 * 4;
    bitmap = monoeg_malloc0 (D.17471);
    i = first_set;
    goto <D.17247>;
    <D.17246>:
    i.23 = (unsigned int) i;
    D.17473 = i.23 / 32;
    D.17474 = D.17473 * 4;
    D.17475 = bitmap + D.17474;
    D.17474 = D.17473 * 4;
    D.17475 = bitmap + D.17474;
    D.17476 = *D.17475;
    D.17477 = i & 31;
    D.17478 = 1 << D.17477;
    D.17479 = D.17476 | D.17478;
    *D.17475 = D.17479;
    i = i + 1;
    <D.17247>:
    D.17467 = first_set + num_set;
    if (D.17467 > i) goto <D.17246>; else goto <D.17248>;
    <D.17248>:
    D.17467 = first_set + num_set;
    *numbits = D.17467;
    D.17480 = bitmap;
    return D.17480;
  }
  <D.17249>:
  bitmap = monoeg_malloc0 (4);
  D.17464 = d >> 16;
  D.17481 = D.17464 << 2;
  *bitmap = D.17481;
  *numbits = 32;
  D.17480 = bitmap;
  return D.17480;
  <D.17250>:
  {
    gsize bmap;

    D.17482 = d >> 3;
    bmap = D.17482 << 2;
    bitmap = monoeg_malloc0 (4);
    *bitmap = bmap;
    *numbits = 0;
    goto <D.17253>;
    <D.17252>:
    D.17483 = *numbits;
    D.17484 = D.17483 + 1;
    *numbits = D.17484;
    bmap = bmap >> 1;
    <D.17253>:
    if (bmap != 0) goto <D.17252>; else goto <D.17254>;
    <D.17254>:
    D.17480 = bitmap;
    return D.17480;
  }
  <D.17255>:
  {
    gsize * bitmap_data;
    int bwords;
    int i;

    bitmap_data = sgen_get_complex_descriptor (d);
    D.17485 = *bitmap_data;
    D.17486 = D.17485 + 4294967295;
    bwords = (int) D.17486;
    bwords.24 = (unsigned int) bwords;
    D.17488 = bwords.24 * 4;
    bitmap = monoeg_malloc0 (D.17488);
    bwords.24 = (unsigned int) bwords;
    D.17489 = bwords.24 * 32;
    D.17490 = (int) D.17489;
    *numbits = D.17490;
    i = 0;
    goto <D.17260>;
    <D.17259>:
    i.25 = (unsigned int) i;
    D.17492 = i.25 * 4;
    D.17493 = bitmap + D.17492;
    i.26 = (sizetype) i;
    D.17495 = i.26 + 1;
    D.17496 = D.17495 * 4;
    D.17497 = bitmap_data + D.17496;
    D.17498 = *D.17497;
    *D.17493 = D.17498;
    i = i + 1;
    <D.17260>:
    if (i < bwords) goto <D.17259>; else goto <D.17261>;
    <D.17261>:
    D.17480 = bitmap;
    return D.17480;
  }
  <D.17262>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "sgen-descriptor.c", 283);
}


mono_gc_make_descr_from_bitmap (gsize * bitmap, int numbits)
{
  void * D.17502;
  unsigned int numbits.27;
  unsigned int D.17506;
  unsigned int D.17507;
  unsigned int D.17508;
  int D.17509;
  unsigned int D.17510;
  unsigned int D.17511;

  if (numbits == 0) goto <D.17500>; else goto <D.17501>;
  <D.17500>:
  D.17502 = 1B;
  return D.17502;
  <D.17501>:
  numbits.27 = (unsigned int) numbits;
  if (numbits.27 <= 28) goto <D.17504>; else goto <D.17505>;
  <D.17504>:
  D.17506 = *bitmap;
  D.17507 = D.17506 << 3;
  D.17508 = D.17507 | 1;
  D.17502 = (void *) D.17508;
  return D.17502;
  <D.17505>:
  {
    mword complex;

    D.17509 = alloc_complex_descriptor (bitmap, numbits);
    complex = (mword) D.17509;
    D.17510 = complex << 3;
    D.17511 = D.17510 | 3;
    D.17502 = (void *) D.17511;
    return D.17502;
  }
}


mono_gc_make_root_descr_all_refs (int numbits)
{
  void * D.17515;
  void * D.17518;
  unsigned int numbits.28;
  unsigned int D.17520;
  unsigned int D.17521;
  unsigned int D.17522;
  unsigned int num_bytes.29;
  unsigned int numbits.30;
  unsigned int D.17527;
  unsigned int num_bytes.31;
  unsigned int D.17532;
  int D.17535;
  unsigned int D.17536;
  unsigned int D.17537;
  gsize * D.17538;
  unsigned int D.17539;
  unsigned int numbits.32;
  unsigned int D.17541;
  int D.17544;
  unsigned int D.17545;
  unsigned int D.17546;
  gsize * D.17547;
  int D.17548;
  int D.17549;
  int D.17550;
  unsigned int D.17551;
  gsize * gc_bitmap;
  void * descr;
  int num_bytes;

  num_bytes = numbits / 8;
  if (numbits <= 31) goto <D.17513>; else goto <D.17514>;
  <D.17513>:
  D.17515 = all_ref_root_descrs[numbits];
  if (D.17515 != 0B) goto <D.17516>; else goto <D.17517>;
  <D.17516>:
  D.17518 = all_ref_root_descrs[numbits];
  return D.17518;
  <D.17517>:
  <D.17514>:
  numbits.28 = (unsigned int) numbits;
  D.17520 = numbits.28 + 7;
  D.17521 = D.17520 & 4294967288;
  D.17522 = D.17521 + 4;
  gc_bitmap = monoeg_malloc0 (D.17522);
  num_bytes.29 = (unsigned int) num_bytes;
  memset (gc_bitmap, 255, num_bytes.29);
  numbits.30 = (unsigned int) numbits;
  if (numbits.30 <= 28) goto <D.17525>; else goto <D.17526>;
  <D.17525>:
  D.17527 = *gc_bitmap;
  *gc_bitmap = D.17527;
  goto <D.17528>;
  <D.17526>:
  if (numbits != 0) goto <D.17529>; else goto <D.17530>;
  <D.17529>:
  num_bytes.31 = (unsigned int) num_bytes;
  D.17532 = num_bytes.31 & 3;
  if (D.17532 != 0) goto <D.17533>; else goto <D.17534>;
  <D.17533>:
  D.17535 = num_bytes / 8;
  D.17536 = (unsigned int) D.17535;
  D.17537 = D.17536 * 4;
  D.17538 = gc_bitmap + D.17537;
  D.17535 = num_bytes / 8;
  D.17536 = (unsigned int) D.17535;
  D.17537 = D.17536 * 4;
  D.17538 = gc_bitmap + D.17537;
  D.17539 = *D.17538;
  *D.17538 = D.17539;
  <D.17534>:
  <D.17530>:
  <D.17528>:
  numbits.32 = (unsigned int) numbits;
  D.17541 = numbits.32 & 7;
  if (D.17541 != 0) goto <D.17542>; else goto <D.17543>;
  <D.17542>:
  D.17544 = numbits / 8;
  D.17545 = (unsigned int) D.17544;
  D.17546 = D.17545 * 4;
  D.17547 = gc_bitmap + D.17546;
  D.17548 = numbits % 8;
  D.17549 = 1 << D.17548;
  D.17550 = D.17549 + -1;
  D.17551 = (unsigned int) D.17550;
  *D.17547 = D.17551;
  <D.17543>:
  descr = mono_gc_make_descr_from_bitmap (gc_bitmap, numbits);
  monoeg_g_free (gc_bitmap);
  if (numbits <= 31) goto <D.17552>; else goto <D.17553>;
  <D.17552>:
  all_ref_root_descrs[numbits] = descr;
  <D.17553>:
  D.17518 = descr;
  return D.17518;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.17557;
  int D.17562;
  void * D.17564;
  unsigned int D.17565;

  D.17557 = __builtin_constant_p (__len);
  if (D.17557 != 0) goto <D.17558>; else goto <D.17559>;
  <D.17558>:
  if (__len == 0) goto <D.17560>; else goto <D.17561>;
  <D.17560>:
  D.17562 = __builtin_constant_p (__ch);
  if (D.17562 == 0) goto <D.17555>; else goto <D.17563>;
  <D.17563>:
  if (__ch != 0) goto <D.17555>; else goto <D.17556>;
  <D.17555>:
  __warn_memset_zero_len ();
  D.17564 = __dest;
  return D.17564;
  <D.17556>:
  <D.17561>:
  <D.17559>:
  D.17565 = __builtin_object_size (__dest, 0);
  D.17564 = __builtin___memset_chk (__dest, __ch, __len, D.17565);
  return D.17564;
}


mono_gc_make_root_descr_user (void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker)
{
  int user_descriptors_next.33;
  _Bool D.17568;
  long int D.17569;
  long int D.17570;
  unsigned int user_descriptors_next.34;
  unsigned int D.17574;
  unsigned int D.17575;
  int user_descriptors_next.35;
  int user_descriptors_next.36;
  void * D.17578;
  void * descr;

  user_descriptors_next.33 = user_descriptors_next;
  D.17568 = user_descriptors_next.33 > 15;
  D.17569 = (long int) D.17568;
  D.17570 = __builtin_expect (D.17569, 0);
  if (D.17570 != 0) goto <D.17571>; else goto <D.17572>;
  <D.17571>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 332, "user_descriptors_next < MAX_USER_DESCRIPTORS");
  <D.17572>:
  user_descriptors_next.33 = user_descriptors_next;
  user_descriptors_next.34 = (unsigned int) user_descriptors_next.33;
  D.17574 = user_descriptors_next.34 << 3;
  D.17575 = D.17574 | 4;
  descr = (void *) D.17575;
  user_descriptors_next.33 = user_descriptors_next;
  user_descriptors_next.35 = user_descriptors_next.33;
  user_descriptors_next.36 = user_descriptors_next.35 + 1;
  user_descriptors_next = user_descriptors_next.36;
  user_descriptors[user_descriptors_next.35] = marker;
  D.17578 = descr;
  return D.17578;
}


sgen_get_complex_descriptor_bitmap (mword desc)
{
  void * D.17580;
  gsize * complex_descriptors.37;
  unsigned int D.17582;
  unsigned int D.17583;

  complex_descriptors.37 = complex_descriptors;
  D.17582 = desc >> 3;
  D.17583 = D.17582 * 4;
  D.17580 = complex_descriptors.37 + D.17583;
  return D.17580;
}


sgen_get_user_descriptor_func (mword desc)
{
  void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) D.17585;
  unsigned int D.17586;

  D.17586 = desc >> 3;
  D.17585 = user_descriptors[D.17586];
  return D.17585;
}


