sgen_get_complex_descriptor (mword desc)
{
  gsize * D.17265;
  gsize * complex_descriptors.0;
  unsigned int D.17267;
  unsigned int D.17268;

  complex_descriptors.0 = complex_descriptors;
  D.17267 = desc >> 3;
  D.17268 = D.17267 * 4;
  D.17265 = complex_descriptors.0 + D.17268;
  return D.17265;
}


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

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


mono_gc_make_descr_for_object (gsize * bitmap, int numbits, size_t obj_size)
{
  unsigned int i.1;
  unsigned int D.17273;
  unsigned int D.17274;
  gsize * D.17275;
  unsigned int D.17276;
  int D.17277;
  unsigned int D.17278;
  unsigned int D.17279;
  struct FILE * gc_debug_file.2;
  void * desc.3;
  void * D.17292;
  unsigned int D.17293;
  unsigned int D.17294;
  _Bool D.17295;
  long int D.17296;
  long int D.17297;
  int D.17306;
  int D.17307;
  int D.17310;
  unsigned int D.17311;
  unsigned int D.17312;
  int D.17313;
  unsigned int D.17314;
  unsigned int D.17315;
  unsigned int last_set.4;
  unsigned int D.17323;
  unsigned int D.17324;
  unsigned int D.17325;
  unsigned int D.17326;
  unsigned int D.17331;
  int D.17334;
  int D.17335;
  int D.17336;
  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.17200>;
  <D.17199>:
  i.1 = (unsigned int) i;
  D.17273 = i.1 / 32;
  D.17274 = D.17273 * 4;
  D.17275 = bitmap + D.17274;
  D.17276 = *D.17275;
  D.17277 = i & 31;
  D.17278 = 1 << D.17277;
  D.17279 = D.17276 & D.17278;
  if (D.17279 != 0) goto <D.17280>; else goto <D.17281>;
  <D.17280>:
  if (first_set < 0) goto <D.17282>; else goto <D.17283>;
  <D.17282>:
  first_set = i;
  <D.17283>:
  last_set = i;
  num_set = num_set + 1;
  <D.17281>:
  i = i + 1;
  <D.17200>:
  if (i < numbits) goto <D.17199>; else goto <D.17201>;
  <D.17201>:
  if (first_set < 0) goto <D.17284>; else goto <D.17285>;
  <D.17284>:
  if (0 != 0) goto <D.17286>; else goto <D.17287>;
  <D.17286>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Ptrfree descriptor %p, size: %zd\n", desc.3, stored_size);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17287>:
  if (stored_size <= 65535) goto <D.17290>; else goto <D.17291>;
  <D.17290>:
  D.17293 = stored_size | 1;
  D.17292 = (void *) D.17293;
  return D.17292;
  <D.17291>:
  D.17292 = 7B;
  return D.17292;
  <D.17285>:
  D.17294 = stored_size & 7;
  D.17295 = D.17294 != 0;
  D.17296 = (long int) D.17295;
  D.17297 = __builtin_expect (D.17296, 0);
  if (D.17297 != 0) goto <D.17298>; else goto <D.17299>;
  <D.17298>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 149, "!(stored_size & 0x7)");
  <D.17299>:
  if (stored_size <= 65535) goto <D.17300>; else goto <D.17301>;
  <D.17300>:
  if (first_set <= 255) goto <D.17302>; else goto <D.17303>;
  <D.17302>:
  if (num_set <= 255) goto <D.17304>; else goto <D.17305>;
  <D.17304>:
  D.17306 = first_set + num_set;
  D.17307 = last_set + 1;
  if (D.17306 == D.17307) goto <D.17308>; else goto <D.17309>;
  <D.17308>:
  D.17310 = first_set << 16;
  D.17311 = (unsigned int) D.17310;
  D.17312 = D.17311 | stored_size;
  D.17313 = num_set << 24;
  D.17314 = (unsigned int) D.17313;
  D.17315 = D.17312 | D.17314;
  desc = D.17315 | 1;
  if (0 != 0) goto <D.17316>; else goto <D.17317>;
  <D.17316>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Runlen descriptor %p, size: %zd, first set: %d, num set: %d\n", desc.3, stored_size, first_set, num_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17317>:
  D.17292 = (void *) desc;
  return D.17292;
  <D.17309>:
  <D.17305>:
  <D.17303>:
  <D.17301>:
  last_set.4 = (unsigned int) last_set;
  if (last_set.4 <= 17) goto <D.17319>; else goto <D.17320>;
  <D.17319>:
  if (stored_size <= 65535) goto <D.17321>; else goto <D.17322>;
  <D.17321>:
  D.17323 = *bitmap;
  D.17324 = D.17323 >> 2;
  D.17325 = D.17324 << 16;
  D.17326 = D.17325 | stored_size;
  desc = D.17326 | 2;
  if (0 != 0) goto <D.17327>; else goto <D.17328>;
  <D.17327>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Smallbitmap descriptor %p, size: %zd, last set: %d\n", desc.3, stored_size, last_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17328>:
  D.17292 = (void *) desc;
  return D.17292;
  <D.17322>:
  <D.17320>:
  last_set.4 = (unsigned int) last_set;
  if (last_set.4 <= 30) goto <D.17329>; else goto <D.17330>;
  <D.17329>:
  D.17323 = *bitmap;
  D.17324 = D.17323 >> 2;
  D.17331 = D.17324 << 3;
  desc = D.17331 | 5;
  if (0 != 0) goto <D.17332>; else goto <D.17333>;
  <D.17332>:
  gc_debug_file.2 = gc_debug_file;
  desc.3 = (void *) desc;
  fprintf (gc_debug_file.2, "Largebitmap descriptor %p, size: %zd, last set: %d\n", desc.3, stored_size, last_set);
  gc_debug_file.2 = gc_debug_file;
  fflush (gc_debug_file.2);
  <D.17333>:
  D.17292 = (void *) desc;
  return D.17292;
  <D.17330>:
  D.17307 = last_set + 1;
  D.17334 = alloc_complex_descriptor (bitmap, D.17307);
  D.17335 = D.17334 << 3;
  D.17336 = D.17335 | 3;
  desc = (mword) D.17336;
  D.17292 = (void *) desc;
  return D.17292;
}


alloc_complex_descriptor (gsize * bitmap, int numbits)
{
  unsigned int numbits.5;
  unsigned int D.17339;
  int D.17340;
  unsigned int numbits.6;
  unsigned int D.17342;
  unsigned int D.17343;
  gsize * complex_descriptors.7;
  unsigned int i.8;
  unsigned int D.17346;
  gsize * D.17347;
  unsigned int D.17348;
  unsigned int nwords.9;
  int D.17352;
  int D.17353;
  unsigned int D.17354;
  unsigned int D.17355;
  gsize * D.17356;
  unsigned int D.17357;
  unsigned int j.10;
  unsigned int D.17359;
  gsize * D.17360;
  unsigned int D.17361;
  int D.17364;
  int D.17367;
  unsigned int i.11;
  unsigned int D.17369;
  int complex_descriptors_next.12;
  int complex_descriptors_next.17;
  int complex_descriptors_size.13;
  int D.17375;
  unsigned int new_size.14;
  unsigned int D.17377;
  void * complex_descriptors.15;
  struct FILE * gc_debug_file.16;
  unsigned int res.18;
  unsigned int D.17383;
  gsize * D.17384;
  int D.17385;
  int D.17386;
  unsigned int D.17387;
  unsigned int D.17388;
  gsize * D.17389;
  gsize * D.17390;
  unsigned int D.17391;
  unsigned int D.17394;
  void * D.17395;
  int nwords;
  int res;
  int i;

  numbits.5 = (unsigned int) numbits;
  D.17339 = numbits.5 + 31;
  D.17340 = (int) D.17339;
  numbits = D.17340 & -32;
  numbits.6 = (unsigned int) numbits;
  D.17342 = numbits.6 / 32;
  D.17343 = D.17342 + 1;
  nwords = (int) D.17343;
  sgen_gc_lock ();
  res = complex_descriptors_next;
  i = 0;
  goto <D.17175>;
  <D.17174>:
  complex_descriptors.7 = complex_descriptors;
  i.8 = (unsigned int) i;
  D.17346 = i.8 * 4;
  D.17347 = complex_descriptors.7 + D.17346;
  D.17348 = *D.17347;
  nwords.9 = (unsigned int) nwords;
  if (D.17348 == nwords.9) goto <D.17350>; else goto <D.17351>;
  <D.17350>:
  {
    int j;
    int found;

    found = 1;
    j = 0;
    goto <D.17173>;
    <D.17172>:
    complex_descriptors.7 = complex_descriptors;
    D.17352 = i + 1;
    D.17353 = D.17352 + j;
    D.17354 = (unsigned int) D.17353;
    D.17355 = D.17354 * 4;
    D.17356 = complex_descriptors.7 + D.17355;
    D.17357 = *D.17356;
    j.10 = (unsigned int) j;
    D.17359 = j.10 * 4;
    D.17360 = bitmap + D.17359;
    D.17361 = *D.17360;
    if (D.17357 != D.17361) goto <D.17362>; else goto <D.17363>;
    <D.17362>:
    found = 0;
    goto <D.17171>;
    <D.17363>:
    j = j + 1;
    <D.17173>:
    D.17364 = nwords + -1;
    if (D.17364 > j) goto <D.17172>; else goto <D.17171>;
    <D.17171>:
    if (found != 0) goto <D.17365>; else goto <D.17366>;
    <D.17365>:
    sgen_gc_unlock ();
    D.17367 = i;
    return D.17367;
    <D.17366>:
  }
  <D.17351>:
  complex_descriptors.7 = complex_descriptors;
  i.8 = (unsigned int) i;
  D.17346 = i.8 * 4;
  D.17347 = complex_descriptors.7 + D.17346;
  D.17348 = *D.17347;
  i.11 = (unsigned int) i;
  D.17369 = D.17348 + i.11;
  i = (int) D.17369;
  <D.17175>:
  complex_descriptors_next.12 = complex_descriptors_next;
  if (i < complex_descriptors_next.12) goto <D.17174>; else goto <D.17176>;
  <D.17176>:
  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.17373>; else goto <D.17374>;
  <D.17373>:
  {
    int new_size;

    complex_descriptors_size.13 = complex_descriptors_size;
    D.17375 = complex_descriptors_size.13 * 2;
    new_size = D.17375 + nwords;
    complex_descriptors.7 = complex_descriptors;
    new_size.14 = (unsigned int) new_size;
    D.17377 = new_size.14 * 4;
    complex_descriptors.15 = monoeg_realloc (complex_descriptors.7, D.17377);
    complex_descriptors = complex_descriptors.15;
    complex_descriptors_size = new_size;
  }
  <D.17374>:
  if (0 != 0) goto <D.17379>; else goto <D.17380>;
  <D.17379>:
  gc_debug_file.16 = gc_debug_file;
  complex_descriptors_size.13 = complex_descriptors_size;
  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.17380>:
  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.17383 = res.18 * 4;
  D.17384 = complex_descriptors.7 + D.17383;
  nwords.9 = (unsigned int) nwords;
  *D.17384 = nwords.9;
  i = 0;
  goto <D.17179>;
  <D.17178>:
  complex_descriptors.7 = complex_descriptors;
  D.17385 = res + 1;
  D.17386 = D.17385 + i;
  D.17387 = (unsigned int) D.17386;
  D.17388 = D.17387 * 4;
  D.17389 = complex_descriptors.7 + D.17388;
  i.8 = (unsigned int) i;
  D.17346 = i.8 * 4;
  D.17390 = bitmap + D.17346;
  D.17391 = *D.17390;
  *D.17389 = D.17391;
  if (0 != 0) goto <D.17392>; else goto <D.17393>;
  <D.17392>:
  gc_debug_file.16 = gc_debug_file;
  complex_descriptors.7 = complex_descriptors;
  D.17385 = res + 1;
  D.17386 = D.17385 + i;
  D.17387 = (unsigned int) D.17386;
  D.17388 = D.17387 * 4;
  D.17389 = complex_descriptors.7 + D.17388;
  D.17394 = *D.17389;
  D.17395 = (void *) D.17394;
  fprintf (gc_debug_file.16, "\tvalue: %p\n", D.17395);
  gc_debug_file.16 = gc_debug_file;
  fflush (gc_debug_file.16);
  <D.17393>:
  i = i + 1;
  <D.17179>:
  D.17364 = nwords + -1;
  if (D.17364 > i) goto <D.17178>; else goto <D.17180>;
  <D.17180>:
  sgen_gc_unlock ();
  D.17367 = res;
  return D.17367;
}


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.17402;
  unsigned int D.17403;
  gsize * D.17404;
  unsigned int D.17405;
  int D.17406;
  unsigned int D.17407;
  unsigned int D.17408;
  void * D.17417;
  unsigned int D.17418;
  unsigned int D.17419;
  unsigned int num_set.21;
  unsigned int D.17425;
  unsigned int D.17428;
  unsigned int last_set.22;
  unsigned int D.17432;
  unsigned int D.17433;
  unsigned int D.17434;
  unsigned int D.17435;
  int D.17436;
  int D.17437;
  int D.17438;
  unsigned int D.17439;
  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.17398>; else goto <D.17399>;
  <D.17398>:
  iftmp.19 = 4;
  goto <D.17400>;
  <D.17399>:
  iftmp.19 = 8196;
  <D.17400>:
  desc = iftmp.19;
  i = 0;
  goto <D.17214>;
  <D.17213>:
  i.20 = (unsigned int) i;
  D.17402 = i.20 / 32;
  D.17403 = D.17402 * 4;
  D.17404 = elem_bitmap + D.17403;
  D.17405 = *D.17404;
  D.17406 = i & 31;
  D.17407 = 1 << D.17406;
  D.17408 = D.17405 & D.17407;
  if (D.17408 != 0) goto <D.17409>; else goto <D.17410>;
  <D.17409>:
  if (first_set < 0) goto <D.17411>; else goto <D.17412>;
  <D.17411>:
  first_set = i;
  <D.17412>:
  last_set = i;
  num_set = num_set + 1;
  <D.17410>:
  i = i + 1;
  <D.17214>:
  if (i < numbits) goto <D.17213>; else goto <D.17215>;
  <D.17215>:
  if (first_set < 0) goto <D.17413>; else goto <D.17414>;
  <D.17413>:
  if (elem_size <= 1023) goto <D.17415>; else goto <D.17416>;
  <D.17415>:
  D.17418 = elem_size << 3;
  D.17419 = D.17418 | desc;
  D.17417 = (void *) D.17419;
  return D.17417;
  <D.17416>:
  D.17417 = 7B;
  return D.17417;
  <D.17414>:
  if (elem_size <= 1023) goto <D.17420>; else goto <D.17421>;
  <D.17420>:
  D.17418 = elem_size << 3;
  desc = D.17418 | desc;
  if (num_set == 0) goto <D.17422>; else goto <D.17423>;
  <D.17422>:
  D.17417 = (void *) desc;
  return D.17417;
  <D.17423>:
  num_set.21 = (unsigned int) num_set;
  D.17425 = num_set.21 * 4;
  if (D.17425 == elem_size) goto <D.17426>; else goto <D.17427>;
  <D.17426>:
  D.17428 = desc | 4294918144;
  D.17417 = (void *) D.17428;
  return D.17417;
  <D.17427>:
  last_set.22 = (unsigned int) last_set;
  if (last_set.22 <= 15) goto <D.17430>; else goto <D.17431>;
  <D.17430>:
  D.17432 = *elem_bitmap;
  D.17433 = D.17432 << 16;
  D.17434 = D.17433 | desc;
  D.17435 = D.17434 | 49152;
  D.17417 = (void *) D.17435;
  return D.17417;
  <D.17431>:
  <D.17421>:
  desc = 6;
  D.17436 = last_set + 1;
  D.17437 = alloc_complex_descriptor (elem_bitmap, D.17436);
  D.17438 = D.17437 << 3;
  D.17439 = (unsigned int) D.17438;
  desc = D.17439 | desc;
  D.17417 = (void *) desc;
  return D.17417;
}


mono_gc_get_bitmap_for_descr (void * descr, int * numbits)
{
  unsigned int D.17441;
  unsigned int D.17442;
  int D.17443;
  unsigned int D.17444;
  int D.17445;
  int D.17446;
  int D.17447;
  unsigned int D.17448;
  unsigned int D.17449;
  unsigned int i.23;
  unsigned int D.17451;
  unsigned int D.17452;
  gsize * D.17453;
  unsigned int D.17454;
  int D.17455;
  unsigned int D.17456;
  unsigned int D.17457;
  gsize * D.17458;
  unsigned int D.17459;
  unsigned int D.17460;
  int D.17461;
  int D.17462;
  unsigned int D.17463;
  unsigned int D.17464;
  unsigned int bwords.24;
  unsigned int D.17466;
  unsigned int D.17467;
  int D.17468;
  unsigned int i.25;
  unsigned int D.17470;
  gsize * D.17471;
  sizetype i.26;
  sizetype D.17473;
  sizetype D.17474;
  gsize * D.17475;
  unsigned int D.17476;
  mword d;
  gsize * bitmap;

  d = (mword) descr;
  D.17441 = d & 7;
  switch (D.17441) <default: <D.17242>, case 1: <D.17222>, case 2: <D.17229>, case 3: <D.17235>, case 5: <D.17230>>
  <D.17222>:
  {
    int first_set;
    int num_set;
    int i;

    D.17442 = d >> 16;
    D.17443 = (int) D.17442;
    first_set = D.17443 & 255;
    D.17444 = d >> 24;
    num_set = (int) D.17444;
    D.17445 = first_set + num_set;
    D.17446 = D.17445 + 7;
    D.17447 = D.17446 / 8;
    D.17448 = (unsigned int) D.17447;
    D.17449 = D.17448 * 4;
    bitmap = monoeg_malloc0 (D.17449);
    i = first_set;
    goto <D.17227>;
    <D.17226>:
    i.23 = (unsigned int) i;
    D.17451 = i.23 / 32;
    D.17452 = D.17451 * 4;
    D.17453 = bitmap + D.17452;
    D.17452 = D.17451 * 4;
    D.17453 = bitmap + D.17452;
    D.17454 = *D.17453;
    D.17455 = i & 31;
    D.17456 = 1 << D.17455;
    D.17457 = D.17454 | D.17456;
    *D.17453 = D.17457;
    i = i + 1;
    <D.17227>:
    D.17445 = first_set + num_set;
    if (D.17445 > i) goto <D.17226>; else goto <D.17228>;
    <D.17228>:
    D.17445 = first_set + num_set;
    *numbits = D.17445;
    D.17458 = bitmap;
    return D.17458;
  }
  <D.17229>:
  bitmap = monoeg_malloc0 (4);
  D.17442 = d >> 16;
  D.17459 = D.17442 << 2;
  *bitmap = D.17459;
  *numbits = 32;
  D.17458 = bitmap;
  return D.17458;
  <D.17230>:
  {
    gsize bmap;

    D.17460 = d >> 3;
    bmap = D.17460 << 2;
    bitmap = monoeg_malloc0 (4);
    *bitmap = bmap;
    *numbits = 0;
    goto <D.17233>;
    <D.17232>:
    D.17461 = *numbits;
    D.17462 = D.17461 + 1;
    *numbits = D.17462;
    bmap = bmap >> 1;
    <D.17233>:
    if (bmap != 0) goto <D.17232>; else goto <D.17234>;
    <D.17234>:
    D.17458 = bitmap;
    return D.17458;
  }
  <D.17235>:
  {
    gsize * bitmap_data;
    int bwords;
    int i;

    bitmap_data = sgen_get_complex_descriptor (d);
    D.17463 = *bitmap_data;
    D.17464 = D.17463 + 4294967295;
    bwords = (int) D.17464;
    bwords.24 = (unsigned int) bwords;
    D.17466 = bwords.24 * 4;
    bitmap = monoeg_malloc0 (D.17466);
    bwords.24 = (unsigned int) bwords;
    D.17467 = bwords.24 * 32;
    D.17468 = (int) D.17467;
    *numbits = D.17468;
    i = 0;
    goto <D.17240>;
    <D.17239>:
    i.25 = (unsigned int) i;
    D.17470 = i.25 * 4;
    D.17471 = bitmap + D.17470;
    i.26 = (sizetype) i;
    D.17473 = i.26 + 1;
    D.17474 = D.17473 * 4;
    D.17475 = bitmap_data + D.17474;
    D.17476 = *D.17475;
    *D.17471 = D.17476;
    i = i + 1;
    <D.17240>:
    if (i < bwords) goto <D.17239>; else goto <D.17241>;
    <D.17241>:
    D.17458 = bitmap;
    return D.17458;
  }
  <D.17242>:
  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.17480;
  unsigned int numbits.27;
  unsigned int D.17484;
  unsigned int D.17485;
  unsigned int D.17486;
  int D.17487;
  unsigned int D.17488;
  unsigned int D.17489;

  if (numbits == 0) goto <D.17478>; else goto <D.17479>;
  <D.17478>:
  D.17480 = 1B;
  return D.17480;
  <D.17479>:
  numbits.27 = (unsigned int) numbits;
  if (numbits.27 <= 28) goto <D.17482>; else goto <D.17483>;
  <D.17482>:
  D.17484 = *bitmap;
  D.17485 = D.17484 << 3;
  D.17486 = D.17485 | 1;
  D.17480 = (void *) D.17486;
  return D.17480;
  <D.17483>:
  {
    mword complex;

    D.17487 = alloc_complex_descriptor (bitmap, numbits);
    complex = (mword) D.17487;
    D.17488 = complex << 3;
    D.17489 = D.17488 | 3;
    D.17480 = (void *) D.17489;
    return D.17480;
  }
}


mono_gc_make_root_descr_all_refs (int numbits)
{
  void * D.17493;
  void * D.17496;
  unsigned int numbits.28;
  unsigned int D.17498;
  unsigned int D.17499;
  unsigned int D.17500;
  unsigned int num_bytes.29;
  unsigned int numbits.30;
  unsigned int D.17505;
  unsigned int num_bytes.31;
  unsigned int D.17510;
  int D.17513;
  unsigned int D.17514;
  unsigned int D.17515;
  gsize * D.17516;
  unsigned int D.17517;
  unsigned int numbits.32;
  unsigned int D.17519;
  int D.17522;
  unsigned int D.17523;
  unsigned int D.17524;
  gsize * D.17525;
  int D.17526;
  int D.17527;
  int D.17528;
  unsigned int D.17529;
  gsize * gc_bitmap;
  void * descr;
  int num_bytes;

  num_bytes = numbits / 8;
  if (numbits <= 31) goto <D.17491>; else goto <D.17492>;
  <D.17491>:
  D.17493 = all_ref_root_descrs[numbits];
  if (D.17493 != 0B) goto <D.17494>; else goto <D.17495>;
  <D.17494>:
  D.17496 = all_ref_root_descrs[numbits];
  return D.17496;
  <D.17495>:
  <D.17492>:
  numbits.28 = (unsigned int) numbits;
  D.17498 = numbits.28 + 7;
  D.17499 = D.17498 & 4294967288;
  D.17500 = D.17499 + 4;
  gc_bitmap = monoeg_malloc0 (D.17500);
  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.17503>; else goto <D.17504>;
  <D.17503>:
  D.17505 = *gc_bitmap;
  *gc_bitmap = D.17505;
  goto <D.17506>;
  <D.17504>:
  if (numbits != 0) goto <D.17507>; else goto <D.17508>;
  <D.17507>:
  num_bytes.31 = (unsigned int) num_bytes;
  D.17510 = num_bytes.31 & 3;
  if (D.17510 != 0) goto <D.17511>; else goto <D.17512>;
  <D.17511>:
  D.17513 = num_bytes / 8;
  D.17514 = (unsigned int) D.17513;
  D.17515 = D.17514 * 4;
  D.17516 = gc_bitmap + D.17515;
  D.17513 = num_bytes / 8;
  D.17514 = (unsigned int) D.17513;
  D.17515 = D.17514 * 4;
  D.17516 = gc_bitmap + D.17515;
  D.17517 = *D.17516;
  *D.17516 = D.17517;
  <D.17512>:
  <D.17508>:
  <D.17506>:
  numbits.32 = (unsigned int) numbits;
  D.17519 = numbits.32 & 7;
  if (D.17519 != 0) goto <D.17520>; else goto <D.17521>;
  <D.17520>:
  D.17522 = numbits / 8;
  D.17523 = (unsigned int) D.17522;
  D.17524 = D.17523 * 4;
  D.17525 = gc_bitmap + D.17524;
  D.17526 = numbits % 8;
  D.17527 = 1 << D.17526;
  D.17528 = D.17527 + -1;
  D.17529 = (unsigned int) D.17528;
  *D.17525 = D.17529;
  <D.17521>:
  descr = mono_gc_make_descr_from_bitmap (gc_bitmap, numbits);
  monoeg_g_free (gc_bitmap);
  if (numbits <= 31) goto <D.17530>; else goto <D.17531>;
  <D.17530>:
  all_ref_root_descrs[numbits] = descr;
  <D.17531>:
  D.17496 = descr;
  return D.17496;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.17535;
  int D.17540;
  void * D.17542;
  unsigned int D.17543;

  D.17535 = __builtin_constant_p (__len);
  if (D.17535 != 0) goto <D.17536>; else goto <D.17537>;
  <D.17536>:
  if (__len == 0) goto <D.17538>; else goto <D.17539>;
  <D.17538>:
  D.17540 = __builtin_constant_p (__ch);
  if (D.17540 == 0) goto <D.17533>; else goto <D.17541>;
  <D.17541>:
  if (__ch != 0) goto <D.17533>; else goto <D.17534>;
  <D.17533>:
  __warn_memset_zero_len ();
  D.17542 = __dest;
  return D.17542;
  <D.17534>:
  <D.17539>:
  <D.17537>:
  D.17543 = __builtin_object_size (__dest, 0);
  D.17542 = __builtin___memset_chk (__dest, __ch, __len, D.17543);
  return D.17542;
}


mono_gc_make_root_descr_user (void (*MonoGCRootMarkFunc) (void *, void (*MonoGCMarkFunc) (void * *)) marker)
{
  int user_descriptors_next.33;
  _Bool D.17546;
  long int D.17547;
  long int D.17548;
  unsigned int user_descriptors_next.34;
  unsigned int D.17552;
  unsigned int D.17553;
  int user_descriptors_next.35;
  int user_descriptors_next.36;
  void * D.17556;
  void * descr;

  user_descriptors_next.33 = user_descriptors_next;
  D.17546 = user_descriptors_next.33 > 15;
  D.17547 = (long int) D.17546;
  D.17548 = __builtin_expect (D.17547, 0);
  if (D.17548 != 0) goto <D.17549>; else goto <D.17550>;
  <D.17549>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "sgen-descriptor.c", 332, "user_descriptors_next < MAX_USER_DESCRIPTORS");
  <D.17550>:
  user_descriptors_next.33 = user_descriptors_next;
  user_descriptors_next.34 = (unsigned int) user_descriptors_next.33;
  D.17552 = user_descriptors_next.34 << 3;
  D.17553 = D.17552 | 4;
  descr = (void *) D.17553;
  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.17556 = descr;
  return D.17556;
}


sgen_get_complex_descriptor_bitmap (mword desc)
{
  void * D.17558;
  gsize * complex_descriptors.37;
  unsigned int D.17560;
  unsigned int D.17561;

  complex_descriptors.37 = complex_descriptors;
  D.17560 = desc >> 3;
  D.17561 = D.17560 * 4;
  D.17558 = complex_descriptors.37 + D.17561;
  return D.17558;
}


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

  D.17564 = desc >> 3;
  D.17563 = user_descriptors[D.17564];
  return D.17563;
}


