mini_gc_enable_gc_maps_for_aot ()
{
  enable_gc_maps_for_aot = 1;
}


mini_gc_set_slot_type_from_fp (struct MonoCompile * cfg, int slot_offset, GCSlotType type)
{
  unsigned char D.22943;
  unsigned char D.22944;
  unsigned int slot_offset.0;
  unsigned int D.22948;
  _Bool D.22949;
  long int D.22950;
  long int D.22951;
  int D.22954;
  unsigned int D.22955;
  unsigned int D.22956;
  void * D.22957;
  struct GSList * D.22958;
  struct MonoMemPool * D.22959;
  struct GSList * D.22960;
  struct MonoCompileGC * gcfg;

  gcfg = cfg->gc_info;
  D.22943 = BIT_FIELD_REF <*cfg, 8, 3424>;
  D.22944 = D.22943 & 128;
  if (D.22944 == 0) goto <D.22945>; else goto <D.22946>;
  <D.22945>:
  return;
  <D.22946>:
  slot_offset.0 = (unsigned int) slot_offset;
  D.22948 = slot_offset.0 & 3;
  D.22949 = D.22948 != 0;
  D.22950 = (long int) D.22949;
  D.22951 = __builtin_expect (D.22950, 0);
  if (D.22951 != 0) goto <D.22952>; else goto <D.22953>;
  <D.22952>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1279, "slot_offset % SIZEOF_SLOT == 0");
  <D.22953>:
  D.22954 = slot_offset << 16;
  D.22955 = (unsigned int) D.22954;
  D.22956 = D.22955 | type;
  D.22957 = (void *) D.22956;
  D.22958 = gcfg->stack_slots_from_fp;
  D.22959 = cfg->mempool;
  D.22960 = g_slist_prepend_mempool (D.22959, D.22958, D.22957);
  gcfg->stack_slots_from_fp = D.22960;
}


g_slist_prepend_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.22962;
  struct GSList * new_list;

  new_list = mono_mempool_alloc (mp, 8);
  new_list->data = data;
  new_list->next = list;
  D.22962 = new_list;
  return D.22962;
}


mini_gc_set_slot_type_from_cfa (struct MonoCompile * cfg, int slot_offset, GCSlotType type)
{
  unsigned char D.22964;
  unsigned char D.22965;
  _Bool D.22968;
  long int D.22969;
  long int D.22970;
  unsigned int slot_offset.1;
  unsigned int D.22974;
  _Bool D.22975;
  long int D.22976;
  long int D.22977;
  int D.22980;
  unsigned int D.22981;
  unsigned int D.22982;
  void * D.22983;
  struct GSList * D.22984;
  struct MonoMemPool * D.22985;
  struct GSList * D.22986;
  struct MonoCompileGC * gcfg;
  int slot;

  gcfg = cfg->gc_info;
  slot = slot_offset / -4;
  D.22964 = BIT_FIELD_REF <*cfg, 8, 3424>;
  D.22965 = D.22964 & 128;
  if (D.22965 == 0) goto <D.22966>; else goto <D.22967>;
  <D.22966>:
  return;
  <D.22967>:
  D.22968 = slot_offset > 0;
  D.22969 = (long int) D.22968;
  D.22970 = __builtin_expect (D.22969, 0);
  if (D.22970 != 0) goto <D.22971>; else goto <D.22972>;
  <D.22971>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1302, "slot_offset <= 0");
  <D.22972>:
  slot_offset.1 = (unsigned int) slot_offset;
  D.22974 = slot_offset.1 & 3;
  D.22975 = D.22974 != 0;
  D.22976 = (long int) D.22975;
  D.22977 = __builtin_expect (D.22976, 0);
  if (D.22977 != 0) goto <D.22978>; else goto <D.22979>;
  <D.22978>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1303, "slot_offset % SIZEOF_SLOT == 0");
  <D.22979>:
  D.22980 = slot << 16;
  D.22981 = (unsigned int) D.22980;
  D.22982 = D.22981 | type;
  D.22983 = (void *) D.22982;
  D.22984 = gcfg->stack_slots_from_cfa;
  D.22985 = cfg->mempool;
  D.22986 = g_slist_prepend_mempool (D.22985, D.22984, D.22983);
  gcfg->stack_slots_from_cfa = D.22986;
}


mini_gc_create_gc_map (struct MonoCompile * cfg)
{
  unsigned char D.22988;
  unsigned char D.22989;
  unsigned int D.22992;
  unsigned int D.22993;

  D.22988 = BIT_FIELD_REF <*cfg, 8, 3424>;
  D.22989 = D.22988 & 128;
  if (D.22989 == 0) goto <D.22990>; else goto <D.22991>;
  <D.22990>:
  return;
  <D.22991>:
  D.22992 = cfg->comp_done;
  D.22993 = D.22992 & 16;
  if (D.22993 == 0) goto <D.22994>; else goto <D.22995>;
  <D.22994>:
  return;
  <D.22995>:
  mono_analyze_liveness_gc (cfg);
  compute_frame_size (cfg);
  init_gcfg (cfg);
  process_spill_slots (cfg);
  process_other_slots (cfg);
  process_param_area_slots (cfg);
  process_variables (cfg);
  process_finally_clauses (cfg);
  create_map (cfg);
}


compute_frame_size (struct MonoCompile * cfg)
{
  struct MonoMethod * D.22997;
  int D.22998;
  int D.22999;
  int D.23000;
  int D.23001;
  struct MonoInst * * D.23002;
  unsigned int i.2;
  unsigned int D.23004;
  struct MonoInst * * D.23005;
  short unsigned int D.23006;
  int D.23009;
  struct MonoType * D.23010;
  struct MonoGenericSharingContext * D.23011;
  int D.23012;
  int D.23013;
  int D.23014;
  int D.23015;
  short unsigned int D.23016;
  int D.23017;
  <unnamed-unsigned:1> D.23018;
  int D.23019;
  int D.23020;
  unsigned int D.23021;
  int D.23022;
  unsigned int D.23023;
  _Bool D.23024;
  long int D.23025;
  long int D.23026;
  int D.23029;
  _Bool D.23030;
  long int D.23031;
  long int D.23032;
  void * D.23035;
  unsigned int D.23036;
  unsigned int D.23037;
  int D.23040;
  int D.23041;
  int D.23042;
  int D.23043;
  int D.23044;
  int D.23045;
  int D.23046;
  int i;
  int locals_min_offset;
  int locals_max_offset;
  int cfa_min_offset;
  int cfa_max_offset;
  int min_offset;
  int max_offset;
  struct MonoCompileGC * gcfg;
  struct MonoMethodSignature * sig;
  struct GSList * l;

  gcfg = cfg->gc_info;
  D.22997 = cfg->method;
  sig = mono_method_signature (D.22997);
  D.22998 = cfg->locals_min_stack_offset;
  D.22999 = D.22998 + 3;
  locals_min_offset = D.22999 & -4;
  locals_max_offset = cfg->locals_max_stack_offset;
  D.23000 = locals_min_offset + 3;
  locals_min_offset = D.23000 & -4;
  D.23001 = locals_max_offset + 3;
  locals_max_offset = D.23001 & -4;
  min_offset = locals_min_offset;
  max_offset = locals_max_offset;
  i = 0;
  goto <D.22793>;
  <D.22792>:
  {
    struct MonoInst * ins;

    D.23002 = cfg->args;
    i.2 = (unsigned int) i;
    D.23004 = i.2 * 4;
    D.23005 = D.23002 + D.23004;
    ins = *D.23005;
    D.23006 = ins->opcode;
    if (D.23006 == 367) goto <D.23007>; else goto <D.23008>;
    <D.23007>:
    {
      int size;
      int size_in_slots;

      D.23009 = ins->backend.is_pinvoke;
      D.23010 = ins->data.op[1].vtype;
      D.23011 = cfg->generic_sharing_context;
      size = mini_type_stack_size_full (D.23011, D.23010, 0B, D.23009);
      D.23012 = size + 3;
      size_in_slots = D.23012 >> 2;
      D.23013 = ins->data.op[0].const_val;
      min_offset = MIN_EXPR <D.23013, min_offset>;
      D.23013 = ins->data.op[0].const_val;
      D.23014 = size_in_slots * 4;
      D.23015 = D.23013 + D.23014;
      max_offset = MAX_EXPR <D.23015, max_offset>;
    }
    <D.23008>:
  }
  i = i + 1;
  <D.22793>:
  D.23016 = sig->param_count;
  D.23017 = (int) D.23016;
  D.23018 = sig->hasthis;
  D.23019 = (int) D.23018;
  D.23020 = D.23017 + D.23019;
  if (D.23020 > i) goto <D.22792>; else goto <D.22794>;
  <D.22794>:
  D.23021 = cfg->frame_reg;
  D.23022 = cfg->cfa_reg;
  D.23023 = (unsigned int) D.23022;
  D.23024 = D.23021 != D.23023;
  D.23025 = (long int) D.23024;
  D.23026 = __builtin_expect (D.23025, 0);
  if (D.23026 != 0) goto <D.23027>; else goto <D.23028>;
  <D.23027>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2030, "cfg->frame_reg == cfg->cfa_reg");
  <D.23028>:
  D.23029 = cfg->cfa_offset;
  D.23030 = D.23029 <= 0;
  D.23031 = (long int) D.23030;
  D.23032 = __builtin_expect (D.23031, 0);
  if (D.23032 != 0) goto <D.23033>; else goto <D.23034>;
  <D.23033>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2031, "cfg->cfa_offset > 0");
  <D.23034>:
  cfa_min_offset = 0;
  cfa_max_offset = cfg->cfa_offset;
  min_offset = MIN_EXPR <cfa_min_offset, min_offset>;
  max_offset = MAX_EXPR <cfa_max_offset, max_offset>;
  l = gcfg->stack_slots_from_fp;
  goto <D.22798>;
  <D.22797>:
  {
    gint data;
    int offset;

    D.23035 = l->data;
    data = (gint) D.23035;
    offset = data >> 16;
    min_offset = MIN_EXPR <offset, min_offset>;
  }
  l = l->next;
  <D.22798>:
  if (l != 0B) goto <D.22797>; else goto <D.22799>;
  <D.22799>:
  D.23036 = cfg->flags;
  D.23037 = D.23036 & 64;
  if (D.23037 == 0) goto <D.23038>; else goto <D.23039>;
  <D.23038>:
  {
    int stack_offset;

    D.23040 = cfg->stack_offset;
    D.23041 = D.23040 + 3;
    stack_offset = D.23041 & -4;
    D.23042 = -stack_offset;
    min_offset = MIN_EXPR <D.23042, min_offset>;
  }
  <D.23039>:
  D.23043 = cfg->arch.sp_fp_offset;
  D.23044 = cfg->arch.param_area_size;
  D.23045 = D.23043 + D.23044;
  D.23046 = -D.23045;
  min_offset = MIN_EXPR <D.23046, min_offset>;
  gcfg->min_offset = min_offset;
  gcfg->max_offset = max_offset;
  gcfg->locals_min_offset = locals_min_offset;
  gcfg->locals_max_offset = locals_max_offset;
}


init_gcfg (struct MonoCompile * cfg)
{
  struct GSList * D.23047;
  unsigned int D.23048;
  unsigned int ncallsites.3;
  unsigned int D.23050;
  unsigned int ncallsites.4;
  unsigned int D.23052;
  struct MonoMemPool * D.23053;
  int i.5;
  unsigned int i.6;
  unsigned int D.23056;
  struct GCCallSite * * D.23057;
  void * D.23058;
  sizetype i.7;
  sizetype D.23060;
  sizetype D.23061;
  struct GCCallSite * * D.23062;
  struct GCCallSite * D.23063;
  int D.23064;
  unsigned int i.8;
  unsigned int D.23066;
  struct GCCallSite * * D.23067;
  struct GCCallSite * D.23068;
  int D.23069;
  _Bool D.23070;
  long int D.23071;
  long int D.23072;
  unsigned int D.23075;
  int D.23078;
  int D.23079;
  struct MonoMethod * D.23080;
  char * D.23081;
  int D.23082;
  int D.23083;
  int D.23084;
  int D.23085;
  int D.23086;
  unsigned int D.23087;
  void * D.23088;
  void * D.23089;
  int D.23090;
  int D.23091;
  unsigned int D.23092;
  void * D.23093;
  void * D.23094;
  int D.23095;
  unsigned int D.23096;
  guint8 * D.23097;
  unsigned int D.23098;
  int D.23099;
  unsigned int D.23100;
  unsigned int D.23101;
  int i;
  int nregs;
  int nslots;
  struct MonoCompileGC * gcfg;
  struct GCCallSite * * callsites;
  int ncallsites;
  struct MonoBasicBlock * bb;
  struct GSList * l;

  gcfg = cfg->gc_info;
  ncallsites = 0;
  bb = cfg->bb_entry;
  goto <D.22813>;
  <D.22812>:
  D.23047 = bb->gc_callsites;
  D.23048 = monoeg_g_slist_length (D.23047);
  ncallsites.3 = (unsigned int) ncallsites;
  D.23050 = D.23048 + ncallsites.3;
  ncallsites = (int) D.23050;
  bb = bb->next_bb;
  <D.22813>:
  if (bb != 0B) goto <D.22812>; else goto <D.22814>;
  <D.22814>:
  ncallsites.4 = (unsigned int) ncallsites;
  D.23052 = ncallsites.4 * 4;
  D.23053 = cfg->mempool;
  callsites = mono_mempool_alloc0 (D.23053, D.23052);
  i = 0;
  bb = cfg->bb_entry;
  goto <D.22819>;
  <D.22818>:
  l = bb->gc_callsites;
  goto <D.22816>;
  <D.22815>:
  i.5 = i;
  i = i.5 + 1;
  i.6 = (unsigned int) i.5;
  D.23056 = i.6 * 4;
  D.23057 = callsites + D.23056;
  D.23058 = l->data;
  *D.23057 = D.23058;
  l = l->next;
  <D.22816>:
  if (l != 0B) goto <D.22815>; else goto <D.22817>;
  <D.22817>:
  bb = bb->next_bb;
  <D.22819>:
  if (bb != 0B) goto <D.22818>; else goto <D.22820>;
  <D.22820>:
  i = 1;
  goto <D.22822>;
  <D.22821>:
  i.7 = (sizetype) i;
  D.23060 = i.7 + 1073741823;
  D.23061 = D.23060 * 4;
  D.23062 = callsites + D.23061;
  D.23063 = *D.23062;
  D.23064 = D.23063->pc_offset;
  i.8 = (unsigned int) i;
  D.23066 = i.8 * 4;
  D.23067 = callsites + D.23066;
  D.23068 = *D.23067;
  D.23069 = D.23068->pc_offset;
  D.23070 = D.23064 >= D.23069;
  D.23071 = (long int) D.23070;
  D.23072 = __builtin_expect (D.23071, 0);
  if (D.23072 != 0) goto <D.23073>; else goto <D.23074>;
  <D.23073>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2097, "callsites [i - 1]->pc_offset < callsites [i]->pc_offset");
  <D.23074>:
  i = i + 1;
  <D.22822>:
  if (i < ncallsites) goto <D.22821>; else goto <D.22823>;
  <D.22823>:
  D.23075 = cfg->verbose_level;
  if (D.23075 > 1) goto <D.23076>; else goto <D.23077>;
  <D.23076>:
  D.23078 = gcfg->max_offset;
  D.23079 = gcfg->min_offset;
  D.23080 = cfg->method;
  D.23081 = mono_method_full_name (D.23080, 1);
  printf ("GC Map for %s: 0x%x-0x%x\n", D.23081, D.23079, D.23078);
  <D.23077>:
  D.23078 = gcfg->max_offset;
  D.23079 = gcfg->min_offset;
  D.23082 = D.23078 - D.23079;
  nslots = D.23082 / 4;
  nregs = 8;
  gcfg->nslots = nslots;
  gcfg->nregs = nregs;
  gcfg->callsites = callsites;
  gcfg->ncallsites = ncallsites;
  D.23083 = ncallsites + 7;
  D.23084 = D.23083 >> 3;
  gcfg->stack_bitmap_width = D.23084;
  D.23083 = ncallsites + 7;
  D.23084 = D.23083 >> 3;
  gcfg->reg_bitmap_width = D.23084;
  D.23085 = gcfg->stack_bitmap_width;
  D.23086 = D.23085 * nslots;
  D.23087 = (unsigned int) D.23086;
  D.23053 = cfg->mempool;
  D.23088 = mono_mempool_alloc0 (D.23053, D.23087);
  gcfg->stack_ref_bitmap = D.23088;
  D.23085 = gcfg->stack_bitmap_width;
  D.23086 = D.23085 * nslots;
  D.23087 = (unsigned int) D.23086;
  D.23053 = cfg->mempool;
  D.23089 = mono_mempool_alloc0 (D.23053, D.23087);
  gcfg->stack_pin_bitmap = D.23089;
  D.23090 = gcfg->reg_bitmap_width;
  D.23091 = D.23090 * nregs;
  D.23092 = (unsigned int) D.23091;
  D.23053 = cfg->mempool;
  D.23093 = mono_mempool_alloc0 (D.23053, D.23092);
  gcfg->reg_ref_bitmap = D.23093;
  D.23090 = gcfg->reg_bitmap_width;
  D.23091 = D.23090 * nregs;
  D.23092 = (unsigned int) D.23091;
  D.23053 = cfg->mempool;
  D.23094 = mono_mempool_alloc0 (D.23053, D.23092);
  gcfg->reg_pin_bitmap = D.23094;
  D.23085 = gcfg->stack_bitmap_width;
  D.23095 = D.23085 * nregs;
  D.23096 = (unsigned int) D.23095;
  D.23097 = gcfg->stack_pin_bitmap;
  memset (D.23097, 255, D.23096);
  i = 0;
  goto <D.22825>;
  <D.22824>:
  D.23098 = cfg->used_int_regs;
  D.23099 = 1 << i;
  D.23100 = (unsigned int) D.23099;
  D.23101 = D.23098 & D.23100;
  if (D.23101 != 0) goto <D.23102>; else goto <D.23103>;
  <D.23102>:
  set_reg_slot_everywhere (gcfg, i, 0);
  <D.23103>:
  i = i + 1;
  <D.22825>:
  if (i < nregs) goto <D.22824>; else goto <D.22826>;
  <D.22826>:
}


printf (const char * restrict __fmt)
{
  int D.23104;

  D.23104 = __printf_chk (1, __fmt, __builtin_va_arg_pack ());
  return D.23104;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.23108;
  int D.23113;
  void * D.23115;
  unsigned int D.23116;

  D.23108 = __builtin_constant_p (__len);
  if (D.23108 != 0) goto <D.23109>; else goto <D.23110>;
  <D.23109>:
  if (__len == 0) goto <D.23111>; else goto <D.23112>;
  <D.23111>:
  D.23113 = __builtin_constant_p (__ch);
  if (D.23113 == 0) goto <D.23106>; else goto <D.23114>;
  <D.23114>:
  if (__ch != 0) goto <D.23106>; else goto <D.23107>;
  <D.23106>:
  __warn_memset_zero_len ();
  D.23115 = __dest;
  return D.23115;
  <D.23107>:
  <D.23112>:
  <D.23110>:
  D.23116 = __builtin_object_size (__dest, 0);
  D.23115 = __builtin___memset_chk (__dest, __ch, __len, D.23116);
  return D.23115;
}


set_reg_slot_everywhere (struct MonoCompileGC * gcfg, int slot, GCSlotType type)
{
  int D.23118;
  int cindex;

  cindex = 0;
  goto <D.22563>;
  <D.22562>:
  set_reg_slot (gcfg, slot, cindex, type);
  cindex = cindex + 1;
  <D.22563>:
  D.23118 = gcfg->ncallsites;
  if (D.23118 > cindex) goto <D.22562>; else goto <D.22564>;
  <D.22564>:
}


set_reg_slot (struct MonoCompileGC * gcfg, int slot, int callsite_index, GCSlotType type)
{
  int iftmp.9;
  int D.23124;
  _Bool D.23125;
  long int D.23126;
  long int D.23127;
  int D.23132;
  guint8 * D.23133;
  guint8 * D.23134;

  if (slot < 0) goto <D.23120>; else goto <D.23123>;
  <D.23123>:
  D.23124 = gcfg->nregs;
  if (D.23124 <= slot) goto <D.23120>; else goto <D.23121>;
  <D.23120>:
  iftmp.9 = 1;
  goto <D.23122>;
  <D.23121>:
  iftmp.9 = 0;
  <D.23122>:
  D.23125 = iftmp.9 != 0;
  D.23126 = (long int) D.23125;
  D.23127 = __builtin_expect (D.23126, 0);
  if (D.23127 != 0) goto <D.23128>; else goto <D.23129>;
  <D.23128>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1385, "slot >= 0 && slot < gcfg->nregs");
  <D.23129>:
  if (type == 2) goto <D.23130>; else goto <D.23131>;
  <D.23130>:
  D.23132 = gcfg->reg_bitmap_width;
  D.23133 = gcfg->reg_ref_bitmap;
  clear_bit (D.23133, D.23132, slot, callsite_index);
  D.23132 = gcfg->reg_bitmap_width;
  D.23134 = gcfg->reg_pin_bitmap;
  set_bit (D.23134, D.23132, slot, callsite_index);
  goto <D.23135>;
  <D.23131>:
  if (type == 1) goto <D.23136>; else goto <D.23137>;
  <D.23136>:
  D.23132 = gcfg->reg_bitmap_width;
  D.23133 = gcfg->reg_ref_bitmap;
  set_bit (D.23133, D.23132, slot, callsite_index);
  D.23132 = gcfg->reg_bitmap_width;
  D.23134 = gcfg->reg_pin_bitmap;
  clear_bit (D.23134, D.23132, slot, callsite_index);
  goto <D.23138>;
  <D.23137>:
  if (type == 0) goto <D.23139>; else goto <D.23140>;
  <D.23139>:
  D.23132 = gcfg->reg_bitmap_width;
  D.23133 = gcfg->reg_ref_bitmap;
  clear_bit (D.23133, D.23132, slot, callsite_index);
  D.23132 = gcfg->reg_bitmap_width;
  D.23134 = gcfg->reg_pin_bitmap;
  clear_bit (D.23134, D.23132, slot, callsite_index);
  <D.23140>:
  <D.23138>:
  <D.23135>:
}


set_bit (guint8 * bitmap, int width, int y, int x)
{
  int D.23141;
  int D.23142;
  int D.23143;
  sizetype D.23144;
  guint8 * D.23145;
  unsigned char D.23146;
  signed char D.23147;
  int D.23148;
  int D.23149;
  signed char D.23150;
  signed char D.23151;
  unsigned char D.23152;

  D.23141 = width * y;
  D.23142 = x / 8;
  D.23143 = D.23141 + D.23142;
  D.23144 = (sizetype) D.23143;
  D.23145 = bitmap + D.23144;
  D.23141 = width * y;
  D.23143 = D.23141 + D.23142;
  D.23144 = (sizetype) D.23143;
  D.23145 = bitmap + D.23144;
  D.23146 = *D.23145;
  D.23147 = (signed char) D.23146;
  D.23148 = x % 8;
  D.23149 = 1 << D.23148;
  D.23150 = (signed char) D.23149;
  D.23151 = D.23147 | D.23150;
  D.23152 = (unsigned char) D.23151;
  *D.23145 = D.23152;
}


clear_bit (guint8 * bitmap, int width, int y, int x)
{
  int D.23153;
  int D.23154;
  int D.23155;
  sizetype D.23156;
  guint8 * D.23157;
  unsigned char D.23158;
  signed char D.23159;
  int D.23160;
  int D.23161;
  signed char D.23162;
  signed char D.23163;
  signed char D.23164;
  unsigned char D.23165;

  D.23153 = width * y;
  D.23154 = x / 8;
  D.23155 = D.23153 + D.23154;
  D.23156 = (sizetype) D.23155;
  D.23157 = bitmap + D.23156;
  D.23153 = width * y;
  D.23155 = D.23153 + D.23154;
  D.23156 = (sizetype) D.23155;
  D.23157 = bitmap + D.23156;
  D.23158 = *D.23157;
  D.23159 = (signed char) D.23158;
  D.23160 = x % 8;
  D.23161 = 1 << D.23160;
  D.23162 = (signed char) D.23161;
  D.23163 = ~D.23162;
  D.23164 = D.23159 & D.23163;
  D.23165 = (unsigned char) D.23164;
  *D.23157 = D.23165;
}


process_spill_slots (struct MonoCompile * cfg)
{
  struct MonoSpillInfo * D.23166;
  unsigned int spill_slot.10;
  unsigned int D.23168;
  struct MonoSpillInfo * D.23169;
  unsigned int bank.11;
  unsigned int D.23171;
  struct MonoSpillInfo * D.23174;
  unsigned int spill_slot.12;
  unsigned int D.23176;
  struct MonoSpillInfo * D.23177;
  int D.23181;
  int D.23182;
  int D.23183;
  int D.23184;
  unsigned int D.23185;
  int D.23188;
  const char * iftmp.13;
  const char * D.23193;
  struct MonoSpillInfo * D.23194;
  unsigned int i.14;
  unsigned int D.23196;
  struct MonoSpillInfo * D.23197;
  int D.23202;
  const char * iftmp.15;
  int D.23207;
  struct MonoSpillInfo * D.23208;
  struct MonoSpillInfo * D.23209;
  int D.23214;
  const char * iftmp.16;
  int D.23219;
  struct MonoCompileGC * gcfg;
  struct MonoBasicBlock * bb;
  struct GSList * l;
  int i;

  gcfg = cfg->gc_info;
  bb = cfg->bb_entry;
  goto <D.22593>;
  <D.22592>:
  l = bb->spill_slot_defs;
  goto <D.22590>;
  <D.22589>:
  {
    struct MonoInst * def;
    int spill_slot;
    int bank;
    int offset;
    int slot;

    def = l->data;
    spill_slot = def->data.op[0].const_val;
    bank = def->data.op[1].const_val;
    D.23166 = cfg->spill_info[bank];
    spill_slot.10 = (unsigned int) spill_slot;
    D.23168 = spill_slot.10 * 4;
    D.23169 = D.23166 + D.23168;
    offset = D.23169->offset;
    slot = fp_offset_to_slot (cfg, offset);
    bank.11 = (unsigned int) bank;
    D.23171 = bank.11 + 4294967294;
    if (D.23171 <= 1) goto <D.23172>; else goto <D.23173>;
    <D.23172>:
    set_slot_everywhere (gcfg, slot, 0);
    <D.23173>:
  }
  l = l->next;
  <D.22590>:
  if (l != 0B) goto <D.22589>; else goto <D.22591>;
  <D.22591>:
  bb = bb->next_bb;
  <D.22593>:
  if (bb != 0B) goto <D.22592>; else goto <D.22594>;
  <D.22594>:
  bb = cfg->bb_entry;
  goto <D.22605>;
  <D.22604>:
  l = bb->spill_slot_defs;
  goto <D.22602>;
  <D.22601>:
  {
    struct MonoInst * def;
    int spill_slot;
    int bank;
    int offset;
    int slot;
    GCSlotType type;

    def = l->data;
    spill_slot = def->data.op[0].const_val;
    bank = def->data.op[1].const_val;
    D.23174 = cfg->spill_info[bank];
    spill_slot.12 = (unsigned int) spill_slot;
    D.23176 = spill_slot.12 * 4;
    D.23177 = D.23174 + D.23176;
    offset = D.23177->offset;
    slot = fp_offset_to_slot (cfg, offset);
    if (bank == 3) goto <D.23178>; else goto <D.23179>;
    <D.23178>:
    type = 2;
    goto <D.23180>;
    <D.23179>:
    type = 1;
    <D.23180>:
    D.23181 = bb->native_offset;
    D.23182 = bb->native_length;
    D.23183 = D.23181 + D.23182;
    D.23184 = def->backend.pc_offset;
    set_slot_in_range (gcfg, slot, D.23184, D.23183, type);
    D.23185 = cfg->verbose_level;
    if (D.23185 > 1) goto <D.23186>; else goto <D.23187>;
    <D.23186>:
    D.23188 = ABS_EXPR <offset>;
    if (offset >= 0) goto <D.23190>; else goto <D.23191>;
    <D.23190>:
    iftmp.13 = "";
    goto <D.23192>;
    <D.23191>:
    iftmp.13 = "-";
    <D.23192>:
    D.23193 = slot_type_to_string (type);
    printf ("\t%s spill slot at %s0x%x(fp) (slot = %d)\n", D.23193, iftmp.13, D.23188, slot);
    <D.23187>:
  }
  l = l->next;
  <D.22602>:
  if (l != 0B) goto <D.22601>; else goto <D.22603>;
  <D.22603>:
  bb = bb->next_bb;
  <D.22605>:
  if (bb != 0B) goto <D.22604>; else goto <D.22606>;
  <D.22606>:
  i = 0;
  goto <D.22611>;
  <D.22610>:
  {
    int offset;
    int slot;

    D.23194 = cfg->spill_info[1];
    i.14 = (unsigned int) i;
    D.23196 = i.14 * 4;
    D.23197 = D.23194 + D.23196;
    offset = D.23197->offset;
    if (offset == -1) goto <D.23198>; else goto <D.23199>;
    <D.23198>:
    // predicted unlikely by continue predictor.
    goto <D.22609>;
    <D.23199>:
    slot = fp_offset_to_slot (cfg, offset);
    set_slot_everywhere (gcfg, slot, 0);
    D.23185 = cfg->verbose_level;
    if (D.23185 > 1) goto <D.23200>; else goto <D.23201>;
    <D.23200>:
    D.23202 = ABS_EXPR <offset>;
    if (offset >= 0) goto <D.23204>; else goto <D.23205>;
    <D.23204>:
    iftmp.15 = "";
    goto <D.23206>;
    <D.23205>:
    iftmp.15 = "-";
    <D.23206>:
    printf ("\tfp spill slot at %s0x%x(fp) (slot = %d)\n", iftmp.15, D.23202, slot);
    <D.23201>:
  }
  <D.22609>:
  i = i + 1;
  <D.22611>:
  D.23207 = cfg->spill_info_len[1];
  if (D.23207 > i) goto <D.22610>; else goto <D.22612>;
  <D.22612>:
  i = 0;
  goto <D.22617>;
  <D.22616>:
  {
    int offset;
    int slot;

    D.23208 = cfg->spill_info[0];
    i.14 = (unsigned int) i;
    D.23196 = i.14 * 4;
    D.23209 = D.23208 + D.23196;
    offset = D.23209->offset;
    if (offset == -1) goto <D.23210>; else goto <D.23211>;
    <D.23210>:
    // predicted unlikely by continue predictor.
    goto <D.22615>;
    <D.23211>:
    slot = fp_offset_to_slot (cfg, offset);
    set_slot_everywhere (gcfg, slot, 0);
    D.23185 = cfg->verbose_level;
    if (D.23185 > 1) goto <D.23212>; else goto <D.23213>;
    <D.23212>:
    D.23214 = ABS_EXPR <offset>;
    if (offset >= 0) goto <D.23216>; else goto <D.23217>;
    <D.23216>:
    iftmp.16 = "";
    goto <D.23218>;
    <D.23217>:
    iftmp.16 = "-";
    <D.23218>:
    printf ("\tint spill slot at %s0x%x(fp) (slot = %d)\n", iftmp.16, D.23214, slot);
    <D.23213>:
  }
  <D.22615>:
  i = i + 1;
  <D.22617>:
  D.23219 = cfg->spill_info_len[0];
  if (D.23219 > i) goto <D.22616>; else goto <D.22618>;
  <D.22618>:
}


set_slot_in_range (struct MonoCompileGC * gcfg, int slot, int from, int to, GCSlotType type)
{
  struct GCCallSite * * D.23220;
  unsigned int cindex.17;
  unsigned int D.23222;
  struct GCCallSite * * D.23223;
  struct GCCallSite * D.23224;
  _Bool D.23225;
  _Bool D.23226;
  _Bool D.23227;
  int D.23230;
  int cindex;

  cindex = 0;
  goto <D.22548>;
  <D.22547>:
  {
    int callsite_offset;

    D.23220 = gcfg->callsites;
    cindex.17 = (unsigned int) cindex;
    D.23222 = cindex.17 * 4;
    D.23223 = D.23220 + D.23222;
    D.23224 = *D.23223;
    callsite_offset = D.23224->pc_offset;
    D.23225 = callsite_offset >= from;
    D.23226 = callsite_offset < to;
    D.23227 = D.23225 & D.23226;
    if (D.23227 != 0) goto <D.23228>; else goto <D.23229>;
    <D.23228>:
    set_slot (gcfg, slot, cindex, type);
    <D.23229>:
  }
  cindex = cindex + 1;
  <D.22548>:
  D.23230 = gcfg->ncallsites;
  if (D.23230 > cindex) goto <D.22547>; else goto <D.22549>;
  <D.22549>:
}


set_slot (struct MonoCompileGC * gcfg, int slot, int callsite_index, GCSlotType type)
{
  int iftmp.18;
  int D.23236;
  _Bool D.23237;
  long int D.23238;
  long int D.23239;
  int D.23244;
  guint8 * D.23245;
  guint8 * D.23246;

  if (slot < 0) goto <D.23232>; else goto <D.23235>;
  <D.23235>:
  D.23236 = gcfg->nslots;
  if (D.23236 <= slot) goto <D.23232>; else goto <D.23233>;
  <D.23232>:
  iftmp.18 = 1;
  goto <D.23234>;
  <D.23233>:
  iftmp.18 = 0;
  <D.23234>:
  D.23237 = iftmp.18 != 0;
  D.23238 = (long int) D.23237;
  D.23239 = __builtin_expect (D.23238, 0);
  if (D.23239 != 0) goto <D.23240>; else goto <D.23241>;
  <D.23240>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1327, "slot >= 0 && slot < gcfg->nslots");
  <D.23241>:
  if (type == 2) goto <D.23242>; else goto <D.23243>;
  <D.23242>:
  D.23244 = gcfg->stack_bitmap_width;
  D.23245 = gcfg->stack_ref_bitmap;
  clear_bit (D.23245, D.23244, slot, callsite_index);
  D.23244 = gcfg->stack_bitmap_width;
  D.23246 = gcfg->stack_pin_bitmap;
  set_bit (D.23246, D.23244, slot, callsite_index);
  goto <D.23247>;
  <D.23243>:
  if (type == 1) goto <D.23248>; else goto <D.23249>;
  <D.23248>:
  D.23244 = gcfg->stack_bitmap_width;
  D.23245 = gcfg->stack_ref_bitmap;
  set_bit (D.23245, D.23244, slot, callsite_index);
  D.23244 = gcfg->stack_bitmap_width;
  D.23246 = gcfg->stack_pin_bitmap;
  clear_bit (D.23246, D.23244, slot, callsite_index);
  goto <D.23250>;
  <D.23249>:
  if (type == 0) goto <D.23251>; else goto <D.23252>;
  <D.23251>:
  D.23244 = gcfg->stack_bitmap_width;
  D.23245 = gcfg->stack_ref_bitmap;
  clear_bit (D.23245, D.23244, slot, callsite_index);
  D.23244 = gcfg->stack_bitmap_width;
  D.23246 = gcfg->stack_pin_bitmap;
  clear_bit (D.23246, D.23244, slot, callsite_index);
  <D.23252>:
  <D.23250>:
  <D.23247>:
}


slot_type_to_string (GCSlotType type)
{
  const char * D.23253;

  switch (type) <default: <D.22373>, case 0: <D.22371>, case 1: <D.22370>, case 2: <D.22372>>
  <D.22370>:
  D.23253 = "ref";
  return D.23253;
  <D.22371>:
  D.23253 = "noref";
  return D.23253;
  <D.22372>:
  D.23253 = "pin";
  return D.23253;
  <D.22373>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-gc.c", 663);
  D.23253 = 0B;
  return D.23253;
}


fp_offset_to_slot (struct MonoCompile * cfg, int offset)
{
  int D.23255;
  int D.23256;
  int D.23257;
  struct MonoCompileGC * gcfg;

  gcfg = cfg->gc_info;
  D.23256 = gcfg->min_offset;
  D.23257 = offset - D.23256;
  D.23255 = D.23257 / 4;
  return D.23255;
}


set_slot_everywhere (struct MonoCompileGC * gcfg, int slot, GCSlotType type)
{
  unsigned int width.19;
  sizetype pos.20;
  void * D.23263;
  void * D.23264;
  int width;
  int pos;
  guint8 * ref_bitmap;
  guint8 * pin_bitmap;

  ref_bitmap = gcfg->stack_ref_bitmap;
  pin_bitmap = gcfg->stack_pin_bitmap;
  width = gcfg->stack_bitmap_width;
  pos = width * slot;
  if (type == 2) goto <D.23259>; else goto <D.23260>;
  <D.23259>:
  width.19 = (unsigned int) width;
  pos.20 = (sizetype) pos;
  D.23263 = ref_bitmap + pos.20;
  memset (D.23263, 0, width.19);
  width.19 = (unsigned int) width;
  pos.20 = (sizetype) pos;
  D.23264 = pin_bitmap + pos.20;
  memset (D.23264, 255, width.19);
  goto <D.23265>;
  <D.23260>:
  if (type == 1) goto <D.23266>; else goto <D.23267>;
  <D.23266>:
  width.19 = (unsigned int) width;
  pos.20 = (sizetype) pos;
  D.23263 = ref_bitmap + pos.20;
  memset (D.23263, 255, width.19);
  width.19 = (unsigned int) width;
  pos.20 = (sizetype) pos;
  D.23264 = pin_bitmap + pos.20;
  memset (D.23264, 0, width.19);
  goto <D.23268>;
  <D.23267>:
  if (type == 0) goto <D.23269>; else goto <D.23270>;
  <D.23269>:
  width.19 = (unsigned int) width;
  pos.20 = (sizetype) pos;
  D.23263 = ref_bitmap + pos.20;
  memset (D.23263, 0, width.19);
  width.19 = (unsigned int) width;
  pos.20 = (sizetype) pos;
  D.23264 = pin_bitmap + pos.20;
  memset (D.23264, 0, width.19);
  <D.23270>:
  <D.23268>:
  <D.23265>:
}


process_other_slots (struct MonoCompile * cfg)
{
  void * D.23271;
  unsigned int D.23272;
  int D.23273;
  int D.23274;
  int D.23275;
  int D.23276;
  int D.23277;
  unsigned int D.23278;
  int D.23283;
  int D.23284;
  const char * iftmp.21;
  int D.23289;
  struct MonoCompileGC * gcfg;
  struct GSList * l;

  gcfg = cfg->gc_info;
  l = gcfg->stack_slots_from_cfa;
  goto <D.22630>;
  <D.22629>:
  {
    guint data;
    int cfa_slot;
    GCSlotType type;
    int slot;

    D.23271 = l->data;
    data = (guint) D.23271;
    D.23272 = data >> 16;
    cfa_slot = (int) D.23272;
    type = data & 255;
    D.23273 = cfg->cfa_offset;
    D.23274 = D.23273 / 4;
    D.23275 = D.23274 - cfa_slot;
    D.23276 = gcfg->min_offset;
    D.23277 = D.23276 / -4;
    slot = D.23275 + D.23277;
    set_slot_everywhere (gcfg, slot, type);
    D.23278 = cfg->verbose_level;
    if (D.23278 > 1) goto <D.23279>; else goto <D.23280>;
    <D.23279>:
    {
      int fp_offset;

      fp_offset = slot_to_fp_offset (cfg, slot);
      if (type == 0) goto <D.23281>; else goto <D.23282>;
      <D.23281>:
      D.23283 = cfa_slot * 4;
      D.23284 = ABS_EXPR <fp_offset>;
      if (fp_offset >= 0) goto <D.23286>; else goto <D.23287>;
      <D.23286>:
      iftmp.21 = "";
      goto <D.23288>;
      <D.23287>:
      iftmp.21 = "-";
      <D.23288>:
      printf ("\tnoref slot at %s0x%x(fp) (slot = %d) (cfa - 0x%x)\n", iftmp.21, D.23284, slot, D.23283);
      <D.23282>:
    }
    <D.23280>:
  }
  l = l->next;
  <D.22630>:
  if (l != 0B) goto <D.22629>; else goto <D.22631>;
  <D.22631>:
  l = gcfg->stack_slots_from_fp;
  goto <D.22637>;
  <D.22636>:
  {
    gint data;
    int offset;
    GCSlotType type;
    int slot;

    D.23271 = l->data;
    data = (gint) D.23271;
    offset = data >> 16;
    D.23289 = data & 255;
    type = (GCSlotType) D.23289;
    slot = fp_offset_to_slot (cfg, offset);
    set_slot_everywhere (gcfg, slot, type);
    D.23278 = cfg->verbose_level;
    if (D.23278 > 1) goto <D.23290>; else goto <D.23291>;
    <D.23290>:
    if (type == 1) goto <D.23292>; else goto <D.23293>;
    <D.23292>:
    printf ("\tref slot at fp+0x%x (slot = %d)\n", offset, slot);
    goto <D.23294>;
    <D.23293>:
    if (type == 0) goto <D.23295>; else goto <D.23296>;
    <D.23295>:
    printf ("\tnoref slot at 0x%x(fp) (slot = %d)\n", offset, slot);
    <D.23296>:
    <D.23294>:
    <D.23291>:
  }
  l = l->next;
  <D.22637>:
  if (l != 0B) goto <D.22636>; else goto <D.22638>;
  <D.22638>:
}


slot_to_fp_offset (struct MonoCompile * cfg, int slot)
{
  int D.23297;
  int D.23298;
  int D.23299;
  struct MonoCompileGC * gcfg;

  gcfg = cfg->gc_info;
  D.23298 = slot * 4;
  D.23299 = gcfg->min_offset;
  D.23297 = D.23298 + D.23299;
  return D.23297;
}


process_param_area_slots (struct MonoCompile * cfg)
{
  unsigned int D.23301;
  unsigned int D.23302;
  int D.23305;
  unsigned int D.23306;
  unsigned int D.23307;
  struct MonoMemPool * D.23308;
  struct GCCallSite * * D.23309;
  unsigned int cindex.22;
  unsigned int D.23311;
  struct GCCallSite * * D.23312;
  int D.23313;
  struct MonoGenericSharingContext * D.23316;
  int D.23317;
  int iftmp.23;
  int D.23323;
  _Bool D.23325;
  long int D.23326;
  long int D.23327;
  unsigned int D.23330;
  unsigned int D.23331;
  gboolean * D.23332;
  unsigned int i.24;
  unsigned int D.23334;
  int D.23335;
  unsigned int i.25;
  unsigned int D.23337;
  gboolean * D.23338;
  int D.23339;
  struct MonoCompileGC * gcfg;
  int cindex;
  int i;
  gboolean * is_param;

  gcfg = cfg->gc_info;
  D.23301 = cfg->flags;
  D.23302 = D.23301 & 1;
  if (D.23302 != 0) goto <D.23303>; else goto <D.23304>;
  <D.23303>:
  return;
  <D.23304>:
  D.23305 = gcfg->nslots;
  D.23306 = (unsigned int) D.23305;
  D.23307 = D.23306 * 4;
  D.23308 = cfg->mempool;
  is_param = mono_mempool_alloc0 (D.23308, D.23307);
  cindex = 0;
  goto <D.22741>;
  <D.22740>:
  {
    struct GCCallSite * callsite;
    struct GSList * l;

    D.23309 = gcfg->callsites;
    cindex.22 = (unsigned int) cindex;
    D.23311 = cindex.22 * 4;
    D.23312 = D.23309 + D.23311;
    callsite = *D.23312;
    l = callsite->param_slots;
    goto <D.22738>;
    <D.22737>:
    {
      struct MonoInst * def;
      struct MonoType * t;
      int sp_offset;
      int fp_offset;
      int slot;
      guint32 align;
      guint32 size;

      try
        {
          def = l->data;
          t = def->data.op[1].vtype;
          sp_offset = def->data.op[0].const_val;
          fp_offset = sp_offset_to_fp_offset (cfg, sp_offset);
          slot = fp_offset_to_slot (cfg, fp_offset);
          D.23313 = mono_type_is_struct (t);
          if (D.23313 != 0) goto <D.23314>; else goto <D.23315>;
          <D.23314>:
          D.23316 = cfg->generic_sharing_context;
          D.23317 = mini_type_stack_size_full (D.23316, t, &align, 0);
          size = (guint32) D.23317;
          goto <D.23318>;
          <D.23315>:
          size = 4;
          <D.23318>:
          i = 0;
          goto <D.22735>;
          <D.22734>:
          D.23323 = slot + i;
          if (D.23323 < 0) goto <D.23320>; else goto <D.23324>;
          <D.23324>:
          D.23323 = slot + i;
          D.23305 = gcfg->nslots;
          if (D.23323 >= D.23305) goto <D.23320>; else goto <D.23321>;
          <D.23320>:
          iftmp.23 = 1;
          goto <D.23322>;
          <D.23321>:
          iftmp.23 = 0;
          <D.23322>:
          D.23325 = iftmp.23 != 0;
          D.23326 = (long int) D.23325;
          D.23327 = __builtin_expect (D.23326, 0);
          if (D.23327 != 0) goto <D.23328>; else goto <D.23329>;
          <D.23328>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1913, "slot + i >= 0 && slot + i < gcfg->nslots");
          <D.23329>:
          D.23323 = slot + i;
          D.23330 = (unsigned int) D.23323;
          D.23331 = D.23330 * 4;
          D.23332 = is_param + D.23331;
          *D.23332 = 1;
          i = i + 1;
          <D.22735>:
          i.24 = (unsigned int) i;
          D.23334 = size / 4;
          if (i.24 < D.23334) goto <D.22734>; else goto <D.22736>;
          <D.22736>:
        }
      finally
        {
          align = {CLOBBER};
        }
    }
    l = l->next;
    <D.22738>:
    if (l != 0B) goto <D.22737>; else goto <D.22739>;
    <D.22739>:
  }
  cindex = cindex + 1;
  <D.22741>:
  D.23335 = gcfg->ncallsites;
  if (D.23335 > cindex) goto <D.22740>; else goto <D.22742>;
  <D.22742>:
  i = 0;
  goto <D.22744>;
  <D.22743>:
  i.25 = (unsigned int) i;
  D.23337 = i.25 * 4;
  D.23338 = is_param + D.23337;
  D.23339 = *D.23338;
  if (D.23339 != 0) goto <D.23340>; else goto <D.23341>;
  <D.23340>:
  set_slot_everywhere (gcfg, i, 0);
  <D.23341>:
  i = i + 1;
  <D.22744>:
  D.23305 = gcfg->nslots;
  if (D.23305 > i) goto <D.22743>; else goto <D.22745>;
  <D.22745>:
}


sp_offset_to_fp_offset (struct MonoCompile * cfg, int sp_offset)
{
  unsigned int D.23343;
  _Bool D.23344;
  long int D.23345;
  long int D.23346;
  int D.23349;
  int D.23350;
  int D.23351;

  D.23343 = cfg->frame_reg;
  D.23344 = D.23343 != 5;
  D.23345 = (long int) D.23344;
  D.23346 = __builtin_expect (D.23345, 0);
  if (D.23346 != 0) goto <D.23347>; else goto <D.23348>;
  <D.23347>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1868, "cfg->frame_reg == X86_EBP");
  <D.23348>:
  D.23350 = cfg->arch.sp_fp_offset;
  D.23351 = -D.23350;
  D.23349 = D.23351 - sp_offset;
  return D.23349;
}


process_variables (struct MonoCompile * cfg)
{
  struct MonoMethod * D.23353;
  int D.23354;
  int D.23355;
  int D.23356;
  unsigned int D.23357;
  unsigned int D.23358;
  struct MonoBasicBlock * D.23359;
  short unsigned int D.23360;
  unsigned int vreg.26;
  unsigned int D.23364;
  int * D.23365;
  int D.23366;
  int D.23369;
  _Bool D.23370;
  long int D.23371;
  long int D.23372;
  struct MonoInst * * D.23375;
  unsigned int i.27;
  unsigned int D.23377;
  struct MonoInst * * D.23378;
  unsigned int i.28;
  unsigned int D.23380;
  _Bool D.23381;
  struct MonoInst * D.23382;
  short unsigned int D.23387;
  int D.23389;
  struct MonoMethodVar * D.23390;
  unsigned int D.23391;
  unsigned char D.23392;
  unsigned char D.23393;
  struct MonoInst * * D.23396;
  struct MonoInst * D.23397;
  struct MonoClass * D.23400;
  unsigned char D.23401;
  unsigned char D.23402;
  <unnamed-unsigned:1> D.23405;
  _Bool D.23408;
  long int D.23409;
  long int D.23410;
  int D.23416;
  _Bool D.23417;
  struct GCCallSite * * D.23421;
  unsigned int cindex.29;
  unsigned int D.23423;
  struct GCCallSite * * D.23424;
  struct GCCallSite * D.23425;
  guint8 * D.23426;
  int D.23427;
  sizetype D.23428;
  guint8 * D.23429;
  unsigned char D.23430;
  int D.23431;
  int D.23432;
  int D.23433;
  int D.23434;
  int D.23437;
  unsigned int D.23438;
  int D.23441;
  const char * D.23442;
  const char * iftmp.30;
  const char * D.23447;
  int D.23450;
  unsigned int D.23451;
  unsigned int D.23452;
  int D.23455;
  unsigned char D.23458;
  int D.23459;
  int D.23460;
  int pos.31;
  struct MonoType * D.23466;
  char * D.23467;
  int D.23468;
  const char * D.23469;
  int D.23470;
  int D.23473;
  struct MonoClass * D.23476;
  int D.23478;
  char * D.23481;
  unsigned int size_in_slots.32;
  unsigned int D.23483;
  int D.23484;
  int D.23485;
  int D.23486;
  const char * D.23487;
  int D.23488;
  const char * D.23489;
  unsigned char D.23490;
  unsigned char D.23491;
  unsigned int j.33;
  unsigned int D.23497;
  int D.23498;
  unsigned int D.23503;
  unsigned int D.23504;
  int * D.23505;
  int D.23506;
  int D.23513;
  unsigned int j.34;
  unsigned int D.23517;
  unsigned int D.23518;
  gsize * D.23519;
  unsigned int D.23520;
  int D.23521;
  unsigned int D.23522;
  unsigned int D.23523;
  GCSlotType iftmp.35;
  unsigned int D.23530;
  int D.23531;
  int numbits.36;
  int D.23537;
  int D.23538;
  const char * iftmp.37;
  int D.23551;
  unsigned char D.23552;
  unsigned char D.23553;
  char * D.23563;
  int D.23564;
  const char * iftmp.38;
  int D.23569;
  char * D.23574;
  const char * iftmp.39;
  const char * iftmp.40;
  unsigned char D.23585;
  unsigned char D.23586;
  _Bool D.23587;
  _Bool D.23588;
  _Bool D.23589;
  unsigned int D.23592;
  int D.23593;
  char * D.23596;
  int iftmp.41;
  const char * iftmp.42;
  int D.23605;
  unsigned int D.23615;
  int D.23616;
  char * D.23620;
  const char * iftmp.43;
  char * D.23632;
  const char * iftmp.44;
  const char * iftmp.45;
  unsigned int D.23641;
  struct MonoCompileGC * gcfg;
  struct MonoMethodSignature * sig;
  int i;
  int locals_min_slot;
  int locals_max_slot;
  int cindex;
  struct MonoBasicBlock * bb;
  struct MonoInst * tmp;
  int * pc_offsets;
  int locals_min_offset;
  int locals_max_offset;

  gcfg = cfg->gc_info;
  D.23353 = cfg->method;
  sig = mono_method_signature (D.23353);
  locals_min_offset = gcfg->locals_min_offset;
  locals_max_offset = gcfg->locals_max_offset;
  D.23354 = gcfg->min_offset;
  D.23355 = locals_min_offset - D.23354;
  locals_min_slot = D.23355 / 4;
  D.23354 = gcfg->min_offset;
  D.23356 = locals_max_offset - D.23354;
  locals_max_slot = D.23356 / 4;
  i = locals_min_slot;
  goto <D.22665>;
  <D.22664>:
  set_slot_everywhere (gcfg, i, 0);
  i = i + 1;
  <D.22665>:
  if (i < locals_max_slot) goto <D.22664>; else goto <D.22666>;
  <D.22666>:
  D.23357 = cfg->next_vreg;
  D.23358 = D.23357 * 4;
  pc_offsets = monoeg_malloc0 (D.23358);
  D.23359 = cfg->bb_entry;
  bb = D.23359->next_bb;
  tmp = bb->code;
  goto <D.22669>;
  <D.22668>:
  D.23360 = tmp->opcode;
  if (D.23360 == 1000) goto <D.23361>; else goto <D.23362>;
  <D.23361>:
  {
    int vreg;

    vreg = tmp->data.op[1].const_val;
    vreg.26 = (unsigned int) vreg;
    D.23364 = vreg.26 * 4;
    D.23365 = pc_offsets + D.23364;
    D.23366 = *D.23365;
    if (D.23366 == 0) goto <D.23367>; else goto <D.23368>;
    <D.23367>:
    D.23369 = tmp->backend.pc_offset;
    D.23370 = D.23369 <= 0;
    D.23371 = (long int) D.23370;
    D.23372 = __builtin_expect (D.23371, 0);
    if (D.23372 != 0) goto <D.23373>; else goto <D.23374>;
    <D.23373>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1613, "tmp->backend.pc_offset > 0");
    <D.23374>:
    vreg.26 = (unsigned int) vreg;
    D.23364 = vreg.26 * 4;
    D.23365 = pc_offsets + D.23364;
    D.23369 = tmp->backend.pc_offset;
    *D.23365 = D.23369;
    <D.23368>:
  }
  <D.23362>:
  tmp = tmp->next;
  <D.22669>:
  if (tmp != 0B) goto <D.22668>; else goto <D.22670>;
  <D.22670>:
  i = 0;
  goto <D.22712>;
  <D.22711>:
  {
    struct MonoInst * ins;
    struct MonoType * t;
    struct MonoMethodVar * vmv;
    guint32 pos;
    gboolean byref;
    gboolean is_this;
    gboolean is_arg;

    D.23375 = cfg->varinfo;
    i.27 = (unsigned int) i;
    D.23377 = i.27 * 4;
    D.23378 = D.23375 + D.23377;
    ins = *D.23378;
    t = ins->data.op[1].vtype;
    is_this = 0;
    i.28 = (unsigned int) i;
    D.23380 = cfg->locals_start;
    D.23381 = i.28 < D.23380;
    is_arg = (gboolean) D.23381;
    D.23382 = cfg->ret;
    if (D.23382 == ins) goto <D.23383>; else goto <D.23384>;
    <D.23383>:
    D.23387 = ins->opcode;
    if (D.23387 != 367) goto <D.23385>; else goto <D.23388>;
    <D.23388>:
    D.23389 = mono_type_is_struct (t);
    if (D.23389 == 0) goto <D.23385>; else goto <D.23386>;
    <D.23385>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23386>:
    <D.23384>:
    D.23390 = cfg->vars;
    i.27 = (unsigned int) i;
    D.23391 = i.27 * 56;
    vmv = D.23390 + D.23391;
    D.23392 = BIT_FIELD_REF <*sig, 8, 80>;
    D.23393 = D.23392 & 64;
    if (D.23393 != 0) goto <D.23394>; else goto <D.23395>;
    <D.23394>:
    D.23396 = cfg->args;
    D.23397 = *D.23396;
    if (D.23397 == ins) goto <D.23398>; else goto <D.23399>;
    <D.23398>:
    D.23353 = cfg->method;
    D.23400 = D.23353->klass;
    D.23401 = BIT_FIELD_REF <*D.23400, 8, 160>;
    D.23402 = D.23401 & 8;
    if (D.23402 == 0) goto <D.23403>; else goto <D.23404>;
    <D.23403>:
    D.23353 = cfg->method;
    D.23400 = D.23353->klass;
    t = &D.23400->byval_arg;
    is_this = 1;
    <D.23404>:
    <D.23399>:
    <D.23395>:
    D.23405 = t->byref;
    byref = (gboolean) D.23405;
    D.23387 = ins->opcode;
    if (D.23387 == 366) goto <D.23406>; else goto <D.23407>;
    <D.23406>:
    {
      int hreg;
      GCSlotType slot_type;

      t = mini_type_get_underlying_type (0B, t);
      hreg = ins->dreg;
      D.23408 = hreg > 7;
      D.23409 = (long int) D.23408;
      D.23410 = __builtin_expect (D.23409, 0);
      if (D.23410 != 0) goto <D.23411>; else goto <D.23412>;
      <D.23411>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1653, "hreg < MONO_MAX_IREGS");
      <D.23412>:
      if (byref != 0) goto <D.23413>; else goto <D.23414>;
      <D.23413>:
      slot_type = 2;
      goto <D.23415>;
      <D.23414>:
      D.23416 = mini_type_is_reference (cfg, t);
      D.23417 = D.23416 != 0;
      slot_type = (GCSlotType) D.23417;
      <D.23415>:
      if (slot_type == 2) goto <D.23418>; else goto <D.23419>;
      <D.23418>:
      set_reg_slot_everywhere (gcfg, hreg, slot_type);
      goto <D.23420>;
      <D.23419>:
      cindex = 0;
      goto <D.22682>;
      <D.22681>:
      D.23421 = gcfg->callsites;
      cindex.29 = (unsigned int) cindex;
      D.23423 = cindex.29 * 4;
      D.23424 = D.23421 + D.23423;
      D.23425 = *D.23424;
      D.23426 = D.23425->liveness;
      D.23427 = i / 8;
      D.23428 = (sizetype) D.23427;
      D.23429 = D.23426 + D.23428;
      D.23430 = *D.23429;
      D.23431 = (int) D.23430;
      D.23432 = i % 8;
      D.23433 = D.23431 >> D.23432;
      D.23434 = D.23433 & 1;
      if (D.23434 != 0) goto <D.23435>; else goto <D.23436>;
      <D.23435>:
      set_reg_slot (gcfg, hreg, cindex, slot_type);
      <D.23436>:
      cindex = cindex + 1;
      <D.22682>:
      D.23437 = gcfg->ncallsites;
      if (D.23437 > cindex) goto <D.22681>; else goto <D.22683>;
      <D.22683>:
      <D.23420>:
      D.23438 = cfg->verbose_level;
      if (D.23438 > 1) goto <D.23439>; else goto <D.23440>;
      <D.23439>:
      D.23441 = vmv->vreg;
      D.23442 = mono_arch_regname (hreg);
      if (is_arg != 0) goto <D.23444>; else goto <D.23445>;
      <D.23444>:
      iftmp.30 = "arg ";
      goto <D.23446>;
      <D.23445>:
      iftmp.30 = "";
      <D.23446>:
      D.23447 = slot_type_to_string (slot_type);
      printf ("\t%s %sreg %s(R%d)\n", D.23447, iftmp.30, D.23442, D.23441);
      <D.23440>:
      // predicted unlikely by continue predictor.
      goto <D.22678>;
    }
    <D.23407>:
    D.23387 = ins->opcode;
    if (D.23387 != 367) goto <D.23448>; else goto <D.23449>;
    <D.23448>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23449>:
    D.23450 = ins->data.op[0].const_val;
    D.23451 = (unsigned int) D.23450;
    D.23452 = D.23451 & 3;
    if (D.23452 != 0) goto <D.23453>; else goto <D.23454>;
    <D.23453>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23454>:
    D.23450 = ins->data.op[0].const_val;
    D.23455 = fp_offset_to_slot (cfg, D.23450);
    pos = (guint32) D.23455;
    if (is_arg != 0) goto <D.23456>; else goto <D.23457>;
    <D.23456>:
    D.23458 = ins->flags;
    D.23459 = (int) D.23458;
    D.23460 = D.23459 & 2;
    if (D.23460 != 0) goto <D.23461>; else goto <D.23462>;
    <D.23461>:
    pos.31 = (int) pos;
    set_slot_everywhere (gcfg, pos.31, 0);
    D.23438 = cfg->verbose_level;
    if (D.23438 > 1) goto <D.23464>; else goto <D.23465>;
    <D.23464>:
    D.23466 = ins->data.op[1].vtype;
    D.23467 = mono_type_full_name (D.23466);
    D.23450 = ins->data.op[0].const_val;
    D.23468 = get_offset_val (D.23450);
    D.23450 = ins->data.op[0].const_val;
    D.23469 = get_offset_sign (D.23450);
    printf ("\tdead arg at fp%s0x%x (slot = %d): %s\n", D.23469, D.23468, pos, D.23467);
    <D.23465>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23462>:
    <D.23457>:
    D.23470 = mono_type_is_struct (t);
    if (D.23470 != 0) goto <D.23471>; else goto <D.23472>;
    <D.23471>:
    {
      int numbits;
      int j;
      gsize * bitmap;
      gboolean pin;
      int size;
      int size_in_slots;

      try
        {
          numbits = 0;
          bitmap = 0B;
          pin = 0;
          D.23473 = ins->backend.is_pinvoke;
          if (D.23473 != 0) goto <D.23474>; else goto <D.23475>;
          <D.23474>:
          D.23476 = ins->klass;
          size = mono_class_native_size (D.23476, 0B);
          goto <D.23477>;
          <D.23475>:
          D.23476 = ins->klass;
          size = mono_class_value_size (D.23476, 0B);
          <D.23477>:
          D.23478 = size + 3;
          size_in_slots = D.23478 >> 2;
          D.23438 = cfg->verbose_level;
          if (D.23438 > 1) goto <D.23479>; else goto <D.23480>;
          <D.23479>:
          D.23466 = ins->data.op[1].vtype;
          D.23481 = mono_type_full_name (D.23466);
          size_in_slots.32 = (unsigned int) size_in_slots;
          D.23483 = pos + size_in_slots.32;
          D.23450 = ins->data.op[0].const_val;
          D.23484 = size_in_slots * 4;
          D.23485 = D.23450 + D.23484;
          D.23486 = get_offset_val (D.23485);
          D.23450 = ins->data.op[0].const_val;
          D.23487 = get_offset_sign (D.23450);
          D.23450 = ins->data.op[0].const_val;
          D.23488 = get_offset_val (D.23450);
          D.23450 = ins->data.op[0].const_val;
          D.23489 = get_offset_sign (D.23450);
          D.23441 = vmv->vreg;
          printf ("\tvtype R%d at %s0x%x(fp)-%s0x%x(fp) (slot %d-%d): %s\n", D.23441, D.23489, D.23488, D.23487, D.23486, pos, D.23483, D.23481);
          <D.23480>:
          D.23476 = ins->klass;
          D.23490 = BIT_FIELD_REF <*D.23476, 8, 184>;
          D.23491 = D.23490 & 8;
          if (D.23491 == 0) goto <D.23492>; else goto <D.23493>;
          <D.23492>:
          if (is_arg != 0) goto <D.23494>; else goto <D.23495>;
          <D.23494>:
          j = 0;
          goto <D.22691>;
          <D.22690>:
          j.33 = (unsigned int) j;
          D.23497 = pos + j.33;
          D.23498 = (int) D.23497;
          set_slot_everywhere (gcfg, D.23498, 0);
          j = j + 1;
          <D.22691>:
          if (j < size_in_slots) goto <D.22690>; else goto <D.22692>;
          <D.22692>:
          <D.23495>:
          // predicted unlikely by continue predictor.
          goto <D.22678>;
          <D.23493>:
          bitmap = get_vtype_bitmap (t, &numbits);
          if (bitmap == 0B) goto <D.23499>; else goto <D.23500>;
          <D.23499>:
          pin = 1;
          <D.23500>:
          if (is_arg == 0) goto <D.23501>; else goto <D.23502>;
          <D.23501>:
          D.23441 = vmv->vreg;
          D.23503 = (unsigned int) D.23441;
          D.23504 = D.23503 * 4;
          D.23505 = pc_offsets + D.23504;
          D.23506 = *D.23505;
          if (D.23506 == 0) goto <D.23507>; else goto <D.23508>;
          <D.23507>:
          pin = 1;
          <D.23508>:
          D.23473 = ins->backend.is_pinvoke;
          if (D.23473 != 0) goto <D.23509>; else goto <D.23510>;
          <D.23509>:
          pin = 1;
          <D.23510>:
          <D.23502>:
          if (bitmap != 0B) goto <D.23511>; else goto <D.23512>;
          <D.23511>:
          cindex = 0;
          goto <D.22697>;
          <D.22696>:
          D.23421 = gcfg->callsites;
          cindex.29 = (unsigned int) cindex;
          D.23423 = cindex.29 * 4;
          D.23424 = D.23421 + D.23423;
          D.23425 = *D.23424;
          D.23513 = D.23425->pc_offset;
          D.23441 = vmv->vreg;
          D.23503 = (unsigned int) D.23441;
          D.23504 = D.23503 * 4;
          D.23505 = pc_offsets + D.23504;
          D.23506 = *D.23505;
          if (D.23513 > D.23506) goto <D.23514>; else goto <D.23515>;
          <D.23514>:
          j = 0;
          goto <D.22694>;
          <D.22693>:
          j.34 = (unsigned int) j;
          D.23517 = j.34 / 32;
          D.23518 = D.23517 * 4;
          D.23519 = bitmap + D.23518;
          D.23520 = *D.23519;
          D.23521 = j & 31;
          D.23522 = 1 << D.23521;
          D.23523 = D.23520 & D.23522;
          if (D.23523 != 0) goto <D.23524>; else goto <D.23525>;
          <D.23524>:
          if (pin != 0) goto <D.23527>; else goto <D.23528>;
          <D.23527>:
          iftmp.35 = 2;
          goto <D.23529>;
          <D.23528>:
          iftmp.35 = 1;
          <D.23529>:
          j.33 = (unsigned int) j;
          D.23497 = pos + j.33;
          D.23530 = D.23497 + 4294967294;
          D.23531 = (int) D.23530;
          set_slot (gcfg, D.23531, cindex, iftmp.35);
          <D.23525>:
          j = j + 1;
          <D.22694>:
          numbits.36 = numbits;
          if (j < numbits.36) goto <D.22693>; else goto <D.22695>;
          <D.22695>:
          <D.23515>:
          cindex = cindex + 1;
          <D.22697>:
          D.23437 = gcfg->ncallsites;
          if (D.23437 > cindex) goto <D.22696>; else goto <D.22698>;
          <D.22698>:
          D.23438 = cfg->verbose_level;
          if (D.23438 > 1) goto <D.23533>; else goto <D.23534>;
          <D.23533>:
          j = 0;
          goto <D.22700>;
          <D.22699>:
          j.34 = (unsigned int) j;
          D.23517 = j.34 / 32;
          D.23518 = D.23517 * 4;
          D.23519 = bitmap + D.23518;
          D.23520 = *D.23519;
          D.23521 = j & 31;
          D.23522 = 1 << D.23521;
          D.23523 = D.23520 & D.23522;
          if (D.23523 != 0) goto <D.23535>; else goto <D.23536>;
          <D.23535>:
          j.33 = (unsigned int) j;
          D.23497 = pos + j.33;
          D.23530 = D.23497 + 4294967294;
          D.23531 = (int) D.23530;
          D.23450 = ins->data.op[0].const_val;
          D.23537 = j * 4;
          D.23538 = D.23450 + D.23537;
          if (pin != 0) goto <D.23540>; else goto <D.23541>;
          <D.23540>:
          iftmp.37 = "pin";
          goto <D.23542>;
          <D.23541>:
          iftmp.37 = "ref";
          <D.23542>:
          printf ("\t\t%s slot at 0x%x(fp) (slot = %d)\n", iftmp.37, D.23538, D.23531);
          <D.23536>:
          j = j + 1;
          <D.22700>:
          numbits.36 = numbits;
          if (j < numbits.36) goto <D.22699>; else goto <D.22701>;
          <D.22701>:
          <D.23534>:
          goto <D.23543>;
          <D.23512>:
          D.23438 = cfg->verbose_level;
          if (D.23438 > 1) goto <D.23544>; else goto <D.23545>;
          <D.23544>:
          printf ("\t\tpinned\n");
          <D.23545>:
          j = 0;
          goto <D.22703>;
          <D.22702>:
          j.33 = (unsigned int) j;
          D.23497 = pos + j.33;
          D.23498 = (int) D.23497;
          set_slot_everywhere (gcfg, D.23498, 2);
          j = j + 1;
          <D.22703>:
          if (j < size_in_slots) goto <D.22702>; else goto <D.22704>;
          <D.22704>:
          <D.23543>:
          monoeg_g_free (bitmap);
          // predicted unlikely by continue predictor.
          goto <D.22678>;
        }
      finally
        {
          numbits = {CLOBBER};
        }
    }
    <D.23472>:
    if (is_arg == 0) goto <D.23548>; else goto <D.23549>;
    <D.23548>:
    D.23450 = ins->data.op[0].const_val;
    D.23354 = gcfg->min_offset;
    if (D.23450 < D.23354) goto <D.23546>; else goto <D.23550>;
    <D.23550>:
    D.23450 = ins->data.op[0].const_val;
    D.23551 = gcfg->max_offset;
    if (D.23450 >= D.23551) goto <D.23546>; else goto <D.23547>;
    <D.23546>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23547>:
    <D.23549>:
    D.23552 = BIT_FIELD_REF <*t, 8, 56>;
    D.23553 = D.23552 & 64;
    if (D.23553 != 0) goto <D.23554>; else goto <D.23555>;
    <D.23554>:
    if (is_arg != 0) goto <D.23556>; else goto <D.23557>;
    <D.23556>:
    pos.31 = (int) pos;
    set_slot_everywhere (gcfg, pos.31, 2);
    goto <D.23558>;
    <D.23557>:
    cindex = 0;
    goto <D.22706>;
    <D.22705>:
    D.23421 = gcfg->callsites;
    cindex.29 = (unsigned int) cindex;
    D.23423 = cindex.29 * 4;
    D.23424 = D.23421 + D.23423;
    D.23425 = *D.23424;
    D.23426 = D.23425->liveness;
    D.23427 = i / 8;
    D.23428 = (sizetype) D.23427;
    D.23429 = D.23426 + D.23428;
    D.23430 = *D.23429;
    D.23431 = (int) D.23430;
    D.23432 = i % 8;
    D.23433 = D.23431 >> D.23432;
    D.23434 = D.23433 & 1;
    if (D.23434 != 0) goto <D.23559>; else goto <D.23560>;
    <D.23559>:
    pos.31 = (int) pos;
    set_slot (gcfg, pos.31, cindex, 2);
    <D.23560>:
    cindex = cindex + 1;
    <D.22706>:
    D.23437 = gcfg->ncallsites;
    if (D.23437 > cindex) goto <D.22705>; else goto <D.22707>;
    <D.22707>:
    <D.23558>:
    D.23438 = cfg->verbose_level;
    if (D.23438 > 1) goto <D.23561>; else goto <D.23562>;
    <D.23561>:
    D.23466 = ins->data.op[1].vtype;
    D.23563 = mono_type_full_name (D.23466);
    D.23441 = vmv->vreg;
    D.23450 = ins->data.op[0].const_val;
    D.23564 = ABS_EXPR <D.23450>;
    D.23450 = ins->data.op[0].const_val;
    if (D.23450 < 0) goto <D.23566>; else goto <D.23567>;
    <D.23566>:
    iftmp.38 = "-";
    goto <D.23568>;
    <D.23567>:
    iftmp.38 = "";
    <D.23568>:
    printf ("\tbyref at %s0x%x(fp) (R%d, slot = %d): %s\n", iftmp.38, D.23564, D.23441, pos, D.23563);
    <D.23562>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23555>:
    t = mini_type_get_underlying_type (0B, t);
    D.23569 = mini_type_is_reference (cfg, t);
    if (D.23569 == 0) goto <D.23570>; else goto <D.23571>;
    <D.23570>:
    pos.31 = (int) pos;
    set_slot_everywhere (gcfg, pos.31, 0);
    D.23438 = cfg->verbose_level;
    if (D.23438 > 1) goto <D.23572>; else goto <D.23573>;
    <D.23572>:
    D.23466 = ins->data.op[1].vtype;
    D.23574 = mono_type_full_name (D.23466);
    D.23441 = vmv->vreg;
    D.23450 = ins->data.op[0].const_val;
    D.23564 = ABS_EXPR <D.23450>;
    D.23450 = ins->data.op[0].const_val;
    if (D.23450 < 0) goto <D.23576>; else goto <D.23577>;
    <D.23576>:
    iftmp.39 = "-";
    goto <D.23578>;
    <D.23577>:
    iftmp.39 = "";
    <D.23578>:
    if (is_arg != 0) goto <D.23580>; else goto <D.23581>;
    <D.23580>:
    iftmp.40 = " arg";
    goto <D.23582>;
    <D.23581>:
    iftmp.40 = "";
    <D.23582>:
    printf ("\tnoref%s at %s0x%x(fp) (R%d, slot = %d): %s\n", iftmp.40, iftmp.39, D.23564, D.23441, pos, D.23574);
    <D.23573>:
    D.23552 = BIT_FIELD_REF <*t, 8, 56>;
    D.23553 = D.23552 & 64;
    if (D.23553 == 0) goto <D.23583>; else goto <D.23584>;
    <D.23583>:
    D.23585 = t->type;
    D.23586 = D.23585 + 246;
    D.23587 = D.23586 <= 1;
    D.23588 = D.23585 == 13;
    D.23589 = D.23587 | D.23588;
    if (D.23589 != 0) goto <D.23590>; else goto <D.23591>;
    <D.23590>:
    D.23592 = pos + 1;
    D.23593 = (int) D.23592;
    set_slot_everywhere (gcfg, D.23593, 0);
    D.23438 = cfg->verbose_level;
    if (D.23438 > 1) goto <D.23594>; else goto <D.23595>;
    <D.23594>:
    D.23466 = ins->data.op[1].vtype;
    D.23596 = mono_type_full_name (D.23466);
    D.23592 = pos + 1;
    D.23441 = vmv->vreg;
    D.23450 = ins->data.op[0].const_val;
    if (D.23450 < 0) goto <D.23598>; else goto <D.23599>;
    <D.23598>:
    D.23450 = ins->data.op[0].const_val;
    iftmp.41 = -4 - D.23450;
    goto <D.23600>;
    <D.23599>:
    D.23450 = ins->data.op[0].const_val;
    iftmp.41 = D.23450 + 4;
    <D.23600>:
    D.23450 = ins->data.op[0].const_val;
    if (D.23450 < 0) goto <D.23602>; else goto <D.23603>;
    <D.23602>:
    iftmp.42 = "-";
    goto <D.23604>;
    <D.23603>:
    iftmp.42 = "";
    <D.23604>:
    printf ("\tnoref at %s0x%x(fp) (R%d, slot = %d): %s\n", iftmp.42, iftmp.41, D.23441, D.23592, D.23596);
    <D.23595>:
    <D.23591>:
    <D.23584>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23571>:
    D.23458 = ins->flags;
    D.23459 = (int) D.23458;
    D.23605 = D.23459 & 20;
    if (D.23605 != 0) goto <D.23606>; else goto <D.23607>;
    <D.23606>:
    if (is_this == 0) goto <D.23608>; else goto <D.23609>;
    <D.23608>:
    if (is_arg != 0) goto <D.23610>; else goto <D.23611>;
    <D.23610>:
    pos.31 = (int) pos;
    set_slot_everywhere (gcfg, pos.31, 1);
    goto <D.23612>;
    <D.23611>:
    D.23441 = vmv->vreg;
    D.23503 = (unsigned int) D.23441;
    D.23504 = D.23503 * 4;
    D.23505 = pc_offsets + D.23504;
    D.23506 = *D.23505;
    if (D.23506 != 0) goto <D.23613>; else goto <D.23614>;
    <D.23613>:
    D.23441 = vmv->vreg;
    D.23503 = (unsigned int) D.23441;
    D.23504 = D.23503 * 4;
    D.23505 = pc_offsets + D.23504;
    D.23506 = *D.23505;
    pos.31 = (int) pos;
    set_slot_in_range (gcfg, pos.31, 0, D.23506, 2);
    D.23615 = cfg->code_size;
    D.23616 = (int) D.23615;
    D.23441 = vmv->vreg;
    D.23503 = (unsigned int) D.23441;
    D.23504 = D.23503 * 4;
    D.23505 = pc_offsets + D.23504;
    D.23506 = *D.23505;
    pos.31 = (int) pos;
    set_slot_in_range (gcfg, pos.31, D.23506, D.23616, 1);
    goto <D.23617>;
    <D.23614>:
    pos.31 = (int) pos;
    set_slot_everywhere (gcfg, pos.31, 2);
    <D.23617>:
    <D.23612>:
    D.23438 = cfg->verbose_level;
    if (D.23438 > 1) goto <D.23618>; else goto <D.23619>;
    <D.23618>:
    D.23466 = ins->data.op[1].vtype;
    D.23620 = mono_type_full_name (D.23466);
    D.23441 = vmv->vreg;
    D.23450 = ins->data.op[0].const_val;
    D.23564 = ABS_EXPR <D.23450>;
    D.23450 = ins->data.op[0].const_val;
    if (D.23450 < 0) goto <D.23622>; else goto <D.23623>;
    <D.23622>:
    iftmp.43 = "-";
    goto <D.23624>;
    <D.23623>:
    iftmp.43 = "";
    <D.23624>:
    printf ("\tvolatile ref at %s0x%x(fp) (R%d, slot = %d): %s\n", iftmp.43, D.23564, D.23441, pos, D.23620);
    <D.23619>:
    // predicted unlikely by continue predictor.
    goto <D.22678>;
    <D.23609>:
    <D.23607>:
    if (is_arg != 0) goto <D.23625>; else goto <D.23626>;
    <D.23625>:
    pos.31 = (int) pos;
    set_slot_everywhere (gcfg, pos.31, 1);
    goto <D.23627>;
    <D.23626>:
    cindex = 0;
    goto <D.22709>;
    <D.22708>:
    D.23421 = gcfg->callsites;
    cindex.29 = (unsigned int) cindex;
    D.23423 = cindex.29 * 4;
    D.23424 = D.23421 + D.23423;
    D.23425 = *D.23424;
    D.23426 = D.23425->liveness;
    D.23427 = i / 8;
    D.23428 = (sizetype) D.23427;
    D.23429 = D.23426 + D.23428;
    D.23430 = *D.23429;
    D.23431 = (int) D.23430;
    D.23432 = i % 8;
    D.23433 = D.23431 >> D.23432;
    D.23434 = D.23433 & 1;
    if (D.23434 != 0) goto <D.23628>; else goto <D.23629>;
    <D.23628>:
    pos.31 = (int) pos;
    set_slot (gcfg, pos.31, cindex, 1);
    <D.23629>:
    cindex = cindex + 1;
    <D.22709>:
    D.23437 = gcfg->ncallsites;
    if (D.23437 > cindex) goto <D.22708>; else goto <D.22710>;
    <D.22710>:
    <D.23627>:
    D.23438 = cfg->verbose_level;
    if (D.23438 > 1) goto <D.23630>; else goto <D.23631>;
    <D.23630>:
    D.23466 = ins->data.op[1].vtype;
    D.23632 = mono_type_full_name (D.23466);
    D.23441 = vmv->vreg;
    D.23450 = ins->data.op[0].const_val;
    D.23564 = ABS_EXPR <D.23450>;
    D.23450 = ins->data.op[0].const_val;
    if (D.23450 < 0) goto <D.23634>; else goto <D.23635>;
    <D.23634>:
    iftmp.44 = "-";
    goto <D.23636>;
    <D.23635>:
    iftmp.44 = "";
    <D.23636>:
    if (is_arg != 0) goto <D.23638>; else goto <D.23639>;
    <D.23638>:
    iftmp.45 = " arg";
    goto <D.23640>;
    <D.23639>:
    iftmp.45 = "";
    <D.23640>:
    printf ("\tref%s at %s0x%x(fp) (R%d, slot = %d): %s\n", iftmp.45, iftmp.44, D.23564, D.23441, pos, D.23632);
    <D.23631>:
  }
  <D.22678>:
  i = i + 1;
  <D.22712>:
  i.28 = (unsigned int) i;
  D.23641 = cfg->num_varinfo;
  if (i.28 < D.23641) goto <D.22711>; else goto <D.22713>;
  <D.22713>:
  monoeg_g_free (pc_offsets);
}


get_offset_val (int offset)
{
  int D.23643;

  D.23643 = ABS_EXPR <offset>;
  return D.23643;
}


get_offset_sign (int offset)
{
  const char * D.23645;
  const char * iftmp.46;

  if (offset < 0) goto <D.23647>; else goto <D.23648>;
  <D.23647>:
  iftmp.46 = "-";
  goto <D.23649>;
  <D.23648>:
  iftmp.46 = "+";
  <D.23649>:
  D.23645 = iftmp.46;
  return D.23645;
}


get_vtype_bitmap (struct MonoType * t, int * numbits)
{
  struct MonoGenericContainer * D.23653;
  int D.23655;
  gsize * D.23656;
  void * D.23657;
  struct MonoClass * klass;

  klass = mono_class_from_mono_type (t);
  D.23653 = klass->generic_container;
  if (D.23653 != 0B) goto <D.23651>; else goto <D.23654>;
  <D.23654>:
  D.23655 = mono_class_is_open_constructed_type (t);
  if (D.23655 != 0) goto <D.23651>; else goto <D.23652>;
  <D.23651>:
  D.23656 = 0B;
  return D.23656;
  <D.23652>:
  mono_class_compute_gc_descriptor (klass);
  D.23657 = klass->gc_descr;
  D.23656 = mono_gc_get_bitmap_for_descr (D.23657, numbits);
  return D.23656;
}


process_finally_clauses (struct MonoCompile * cfg)
{
  struct MonoMethodHeader * D.23659;
  struct MonoExceptionClause * D.23660;
  unsigned int i.47;
  unsigned int D.23662;
  unsigned int D.23663;
  <unnamed-unsigned:15> D.23666;
  int D.23667;
  unsigned int D.23670;
  unsigned int j.48;
  unsigned int D.23674;
  struct GCCallSite * * D.23675;
  struct GCCallSite * D.23676;
  unsigned int D.23677;
  unsigned int D.23678;
  unsigned int D.23681;
  unsigned int D.23682;
  unsigned int D.23685;
  struct MonoCompileGC * gcfg;
  struct GCCallSite * * callsites;
  int ncallsites;
  gboolean has_finally;
  int i;
  int j;
  int nslots;
  int nregs;

  gcfg = cfg->gc_info;
  ncallsites = gcfg->ncallsites;
  nslots = gcfg->nslots;
  nregs = gcfg->nregs;
  callsites = gcfg->callsites;
  has_finally = 0;
  i = 0;
  goto <D.22759>;
  <D.22758>:
  {
    struct MonoExceptionClause * clause;

    D.23659 = cfg->header;
    D.23660 = D.23659->clauses;
    i.47 = (unsigned int) i;
    D.23662 = i.47 * 24;
    clause = D.23660 + D.23662;
    D.23663 = clause->flags;
    if (D.23663 == 2) goto <D.23664>; else goto <D.23665>;
    <D.23664>:
    has_finally = 1;
    <D.23665>:
  }
  i = i + 1;
  <D.22759>:
  D.23659 = cfg->header;
  D.23666 = D.23659->num_clauses;
  D.23667 = (int) D.23666;
  if (D.23667 > i) goto <D.22758>; else goto <D.22760>;
  <D.22760>:
  if (has_finally != 0) goto <D.23668>; else goto <D.23669>;
  <D.23668>:
  D.23670 = cfg->verbose_level;
  if (D.23670 > 1) goto <D.23671>; else goto <D.23672>;
  <D.23671>:
  printf ("\tMethod has finally clauses, pessimizing live ranges.\n");
  <D.23672>:
  j = 0;
  goto <D.22774>;
  <D.22773>:
  {
    struct MonoBasicBlock * bb;
    struct MonoExceptionClause * clause;
    gboolean is_in_finally;

    j.48 = (unsigned int) j;
    D.23674 = j.48 * 4;
    D.23675 = callsites + D.23674;
    D.23676 = *D.23675;
    bb = D.23676->bb;
    is_in_finally = 0;
    i = 0;
    goto <D.22766>;
    <D.22765>:
    D.23659 = cfg->header;
    D.23660 = D.23659->clauses;
    i.47 = (unsigned int) i;
    D.23662 = i.47 * 24;
    clause = D.23660 + D.23662;
    D.23677 = clause->handler_offset;
    D.23678 = bb->real_offset;
    if (D.23677 <= D.23678) goto <D.23679>; else goto <D.23680>;
    <D.23679>:
    D.23678 = bb->real_offset;
    D.23677 = clause->handler_offset;
    D.23681 = clause->handler_len;
    D.23682 = D.23677 + D.23681;
    if (D.23678 < D.23682) goto <D.23683>; else goto <D.23684>;
    <D.23683>:
    D.23685 = clause->flags;
    if (D.23685 == 2) goto <D.23686>; else goto <D.23687>;
    <D.23686>:
    is_in_finally = 1;
    goto <D.22764>;
    <D.23687>:
    <D.23684>:
    <D.23680>:
    i = i + 1;
    <D.22766>:
    D.23659 = cfg->header;
    D.23666 = D.23659->num_clauses;
    D.23667 = (int) D.23666;
    if (D.23667 > i) goto <D.22765>; else goto <D.22764>;
    <D.22764>:
    if (is_in_finally != 0) goto <D.23688>; else goto <D.23689>;
    <D.23688>:
    i = 0;
    goto <D.22768>;
    <D.22767>:
    set_slot (gcfg, i, j, 2);
    i = i + 1;
    <D.22768>:
    if (i < nslots) goto <D.22767>; else goto <D.22769>;
    <D.22769>:
    i = 0;
    goto <D.22771>;
    <D.22770>:
    set_reg_slot (gcfg, i, j, 2);
    i = i + 1;
    <D.22771>:
    if (i < nregs) goto <D.22770>; else goto <D.22772>;
    <D.22772>:
    <D.23689>:
  }
  j = j + 1;
  <D.22774>:
  if (j < ncallsites) goto <D.22773>; else goto <D.22775>;
  <D.22775>:
  <D.23669>:
}


create_map (struct MonoCompile * cfg)
{
  int D.23690;
  guint8 * D.23691;
  int D.23692;
  guint8 * D.23695;
  int D.23696;
  int D.23705;
  int D.23706;
  int D.23710;
  int D.23711;
  int D.23713;
  int D.23714;
  int D.23715;
  _Bool D.23723;
  long int D.23724;
  long int D.23725;
  _Bool D.23728;
  long int D.23729;
  long int D.23730;
  unsigned int D.23733;
  int D.23734;
  unsigned int D.23735;
  unsigned int D.23736;
  int D.23739;
  guint8 * D.23740;
  int D.23741;
  guint8 * D.23744;
  int D.23745;
  unsigned int D.23750;
  unsigned int D.23753;
  int D.23756;
  int D.23757;
  int D.23758;
  int D.23759;
  int iftmp.49;
  int iftmp.50;
  int D.23768;
  int iftmp.51;
  int D.23773;
  int iftmp.52;
  struct MonoMemPool * D.23778;
  unsigned int D.23779;
  unsigned char D.23780;
  int D.23781;
  int D.23782;
  int D.23783;
  int D.23784;
  unsigned char D.23785;
  <unnamed-unsigned:1> D.23786;
  unsigned char D.23787;
  <unnamed-unsigned:1> D.23788;
  unsigned char D.23789;
  <unnamed-unsigned:1> D.23790;
  unsigned char D.23791;
  <unnamed-unsigned:1> D.23792;
  _Bool D.23793;
  long int D.23794;
  long int D.23795;
  unsigned char D.23798;
  unsigned char D.23799;
  unsigned int bitmaps_size.53;
  unsigned int bitmaps_offset.54;
  unsigned int D.23804;
  int D.23805;
  int D.23808;
  unsigned int D.23811;
  int D.23812;
  unsigned int D.23817;
  unsigned int D.23818;
  int D.23821;
  unsigned int D.23826;
  unsigned int D.23827;
  int D.23830;
  unsigned int D.23833;
  guint8 * endbuf.55;
  int endbuf.56;
  int buf.57;
  int D.23843;
  _Bool D.23844;
  long int D.23845;
  long int D.23846;
  unsigned char D.23849;
  int D.23850;
  int D.23851;
  int D.23852;
  int D.23853;
  int D.23854;
  unsigned int D.23855;
  int D.23856;
  int D.23857;
  unsigned int D.23858;
  unsigned int D.23859;
  unsigned int D.23860;
  unsigned int alloc_size.58;
  struct MonoDomain * D.23862;
  unsigned int encoded_size.59;
  sizetype encoded_size.60;
  int p.61;
  int D.23866;
  int D.23867;
  sizetype i.62;
  guint8 * D.23871;
  unsigned int i.63;
  unsigned int D.23873;
  struct GCCallSite * * D.23874;
  struct GCCallSite * D.23875;
  int D.23876;
  unsigned char D.23877;
  int D.23878;
  unsigned int D.23879;
  unsigned int ncallsites.64;
  unsigned int D.23881;
  int D.23882;
  unsigned int D.23886;
  guint16 * D.23887;
  short unsigned int D.23888;
  int D.23889;
  unsigned int D.23890;
  unsigned int D.23891;
  unsigned int D.23892;
  int D.23893;
  guint32 * D.23895;
  unsigned int D.23896;
  int D.23897;
  unsigned int D.23898;
  unsigned int D.23899;
  unsigned int D.23900;
  int D.23901;
  int D.23902;
  sizetype D.23903;
  unsigned int bitmaps_size.65;
  sizetype bitmaps_size.66;
  int emap.67;
  int D.23907;
  _Bool D.23908;
  long int D.23909;
  long int D.23910;
  int D.23913;
  int D.23914;
  int D.23915;
  int D.23916;
  int D.23917;
  int D.23918;
  int D.23919;
  unsigned int D.23920;
  unsigned int encoded_size.68;
  unsigned int D.23922;
  int D.23923;
  struct MonoJitInfo * D.23924;
  unsigned int alloc_size.69;
  int D.23926;
  int D.23927;
  int D.23928;
  int D.23929;
  int D.23930;
  int D.23931;
  int D.23932;
  int D.23933;
  struct GCMap * map;
  int i;
  int j;
  int nregs;
  int nslots;
  int nref_regs;
  int npin_regs;
  int alloc_size;
  int bitmaps_size;
  int bitmaps_offset;
  int ntypes[16];
  int stack_bitmap_width;
  int stack_bitmap_size;
  int reg_ref_bitmap_width;
  int reg_ref_bitmap_size;
  int reg_pin_bitmap_width;
  int reg_pin_bitmap_size;
  int bindex;
  int start;
  int end;
  gboolean has_ref_slots;
  gboolean has_pin_slots;
  gboolean has_ref_regs;
  gboolean has_pin_regs;
  struct MonoCompileGC * gcfg;
  struct GCCallSite * * callsites;
  int ncallsites;
  guint8 * bitmap;
  guint8 * bitmaps;
  guint32 reg_ref_mask;
  guint32 reg_pin_mask;

  try
    {
      gcfg = cfg->gc_info;
      ncallsites = gcfg->ncallsites;
      nslots = gcfg->nslots;
      nregs = gcfg->nregs;
      callsites = gcfg->callsites;
      has_ref_slots = 0;
      has_pin_slots = 0;
      start = -1;
      end = -1;
      memset (&ntypes, 0, 64);
      i = 0;
      goto <D.22874>;
      <D.22873>:
      {
        gboolean has_ref;
        gboolean has_pin;

        has_ref = 0;
        has_pin = 0;
        D.23690 = gcfg->stack_bitmap_width;
        D.23691 = gcfg->stack_pin_bitmap;
        D.23692 = has_bit_set (D.23691, D.23690, i);
        if (D.23692 != 0) goto <D.23693>; else goto <D.23694>;
        <D.23693>:
        has_pin = 1;
        <D.23694>:
        D.23690 = gcfg->stack_bitmap_width;
        D.23695 = gcfg->stack_ref_bitmap;
        D.23696 = has_bit_set (D.23695, D.23690, i);
        if (D.23696 != 0) goto <D.23697>; else goto <D.23698>;
        <D.23697>:
        has_ref = 1;
        <D.23698>:
        if (has_ref != 0) goto <D.23699>; else goto <D.23700>;
        <D.23699>:
        has_ref_slots = 1;
        <D.23700>:
        if (has_pin != 0) goto <D.23701>; else goto <D.23702>;
        <D.23701>:
        has_pin_slots = 1;
        <D.23702>:
        if (has_ref != 0) goto <D.23703>; else goto <D.23704>;
        <D.23703>:
        D.23705 = ntypes[1];
        D.23706 = D.23705 + 1;
        ntypes[1] = D.23706;
        goto <D.23707>;
        <D.23704>:
        if (has_pin != 0) goto <D.23708>; else goto <D.23709>;
        <D.23708>:
        D.23710 = ntypes[2];
        D.23711 = D.23710 + 1;
        ntypes[2] = D.23711;
        goto <D.23712>;
        <D.23709>:
        D.23713 = ntypes[0];
        D.23714 = D.23713 + 1;
        ntypes[0] = D.23714;
        <D.23712>:
        <D.23707>:
        D.23715 = has_ref | has_pin;
        if (D.23715 != 0) goto <D.23716>; else goto <D.23717>;
        <D.23716>:
        if (start == -1) goto <D.23718>; else goto <D.23719>;
        <D.23718>:
        start = i;
        <D.23719>:
        end = i + 1;
        <D.23717>:
      }
      i = i + 1;
      <D.22874>:
      if (i < nslots) goto <D.22873>; else goto <D.22875>;
      <D.22875>:
      if (start == -1) goto <D.23720>; else goto <D.23721>;
      <D.23720>:
      end = nslots;
      start = end;
      goto <D.23722>;
      <D.23721>:
      D.23723 = start == -1;
      D.23724 = (long int) D.23723;
      D.23725 = __builtin_expect (D.23724, 0);
      if (D.23725 != 0) goto <D.23726>; else goto <D.23727>;
      <D.23726>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2214, "start != -1");
      <D.23727>:
      D.23728 = start >= end;
      D.23729 = (long int) D.23728;
      D.23730 = __builtin_expect (D.23729, 0);
      if (D.23730 != 0) goto <D.23731>; else goto <D.23732>;
      <D.23731>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2215, "start < end");
      <D.23732>:
      <D.23722>:
      has_ref_regs = 0;
      has_pin_regs = 0;
      reg_ref_mask = 0;
      reg_pin_mask = 0;
      nref_regs = 0;
      npin_regs = 0;
      i = 0;
      goto <D.22880>;
      <D.22879>:
      {
        gboolean has_ref;
        gboolean has_pin;

        has_ref = 0;
        has_pin = 0;
        D.23733 = cfg->used_int_regs;
        D.23734 = 1 << i;
        D.23735 = (unsigned int) D.23734;
        D.23736 = D.23733 & D.23735;
        if (D.23736 == 0) goto <D.23737>; else goto <D.23738>;
        <D.23737>:
        // predicted unlikely by continue predictor.
        goto <D.22878>;
        <D.23738>:
        D.23739 = gcfg->reg_bitmap_width;
        D.23740 = gcfg->reg_pin_bitmap;
        D.23741 = has_bit_set (D.23740, D.23739, i);
        if (D.23741 != 0) goto <D.23742>; else goto <D.23743>;
        <D.23742>:
        has_pin = 1;
        <D.23743>:
        D.23739 = gcfg->reg_bitmap_width;
        D.23744 = gcfg->reg_ref_bitmap;
        D.23745 = has_bit_set (D.23744, D.23739, i);
        if (D.23745 != 0) goto <D.23746>; else goto <D.23747>;
        <D.23746>:
        has_ref = 1;
        <D.23747>:
        if (has_ref != 0) goto <D.23748>; else goto <D.23749>;
        <D.23748>:
        D.23734 = 1 << i;
        D.23750 = (unsigned int) D.23734;
        reg_ref_mask = D.23750 | reg_ref_mask;
        has_ref_regs = 1;
        nref_regs = nref_regs + 1;
        <D.23749>:
        if (has_pin != 0) goto <D.23751>; else goto <D.23752>;
        <D.23751>:
        D.23734 = 1 << i;
        D.23750 = (unsigned int) D.23734;
        reg_pin_mask = D.23750 | reg_pin_mask;
        has_pin_regs = 1;
        npin_regs = npin_regs + 1;
        <D.23752>:
      }
      <D.22878>:
      i = i + 1;
      <D.22880>:
      if (i < nregs) goto <D.22879>; else goto <D.22881>;
      <D.22881>:
      D.23753 = cfg->verbose_level;
      if (D.23753 > 1) goto <D.23754>; else goto <D.23755>;
      <D.23754>:
      D.23710 = ntypes[2];
      D.23713 = ntypes[0];
      D.23705 = ntypes[1];
      printf ("Slots: %d Start: %d End: %d Refs: %d NoRefs: %d Pin: %d Callsites: %d\n", nslots, start, end, D.23705, D.23713, D.23710, ncallsites);
      <D.23755>:
      D.23756 = end - start;
      D.23757 = D.23756 + 7;
      stack_bitmap_width = D.23757 >> 3;
      stack_bitmap_size = stack_bitmap_width * ncallsites;
      D.23758 = nref_regs + 7;
      reg_ref_bitmap_width = D.23758 >> 3;
      reg_ref_bitmap_size = reg_ref_bitmap_width * ncallsites;
      D.23759 = npin_regs + 7;
      reg_pin_bitmap_width = D.23759 >> 3;
      reg_pin_bitmap_size = reg_pin_bitmap_width * ncallsites;
      if (has_ref_slots != 0) goto <D.23761>; else goto <D.23762>;
      <D.23761>:
      iftmp.49 = stack_bitmap_size;
      goto <D.23763>;
      <D.23762>:
      iftmp.49 = 0;
      <D.23763>:
      if (has_pin_slots != 0) goto <D.23765>; else goto <D.23766>;
      <D.23765>:
      iftmp.50 = stack_bitmap_size;
      goto <D.23767>;
      <D.23766>:
      iftmp.50 = 0;
      <D.23767>:
      D.23768 = iftmp.49 + iftmp.50;
      if (has_ref_regs != 0) goto <D.23770>; else goto <D.23771>;
      <D.23770>:
      iftmp.51 = reg_ref_bitmap_size;
      goto <D.23772>;
      <D.23771>:
      iftmp.51 = 0;
      <D.23772>:
      D.23773 = D.23768 + iftmp.51;
      if (has_pin_regs != 0) goto <D.23775>; else goto <D.23776>;
      <D.23775>:
      iftmp.52 = reg_pin_bitmap_size;
      goto <D.23777>;
      <D.23776>:
      iftmp.52 = 0;
      <D.23777>:
      bitmaps_size = D.23773 + iftmp.52;
      D.23778 = cfg->mempool;
      map = mono_mempool_alloc0 (D.23778, 60);
      D.23779 = cfg->frame_reg;
      D.23780 = (unsigned char) D.23779;
      map->frame_reg = D.23780;
      D.23781 = gcfg->min_offset;
      map->start_offset = D.23781;
      D.23781 = gcfg->min_offset;
      D.23782 = nslots * 4;
      D.23783 = D.23781 + D.23782;
      map->end_offset = D.23783;
      D.23784 = start * 4;
      map->map_offset = D.23784;
      D.23756 = end - start;
      map->nslots = D.23756;
      D.23785 = (unsigned char) has_ref_slots;
      D.23786 = (<unnamed-unsigned:1>) D.23785;
      map->has_ref_slots = D.23786;
      D.23787 = (unsigned char) has_pin_slots;
      D.23788 = (<unnamed-unsigned:1>) D.23787;
      map->has_pin_slots = D.23788;
      D.23789 = (unsigned char) has_ref_regs;
      D.23790 = (<unnamed-unsigned:1>) D.23789;
      map->has_ref_regs = D.23790;
      D.23791 = (unsigned char) has_pin_regs;
      D.23792 = (<unnamed-unsigned:1>) D.23791;
      map->has_pin_regs = D.23792;
      D.23793 = nregs > 31;
      D.23794 = (long int) D.23793;
      D.23795 = __builtin_expect (D.23794, 0);
      if (D.23795 != 0) goto <D.23796>; else goto <D.23797>;
      <D.23796>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2273, "nregs < 32");
      <D.23797>:
      D.23733 = cfg->used_int_regs;
      map->used_int_regs = D.23733;
      map->reg_ref_mask = reg_ref_mask;
      map->reg_pin_mask = reg_pin_mask;
      D.23798 = (unsigned char) nref_regs;
      map->nref_regs = D.23798;
      D.23799 = (unsigned char) npin_regs;
      map->npin_regs = D.23799;
      bitmaps_size.53 = (unsigned int) bitmaps_size;
      D.23778 = cfg->mempool;
      bitmaps = mono_mempool_alloc0 (D.23778, bitmaps_size.53);
      bitmaps_offset = 0;
      if (has_ref_slots != 0) goto <D.23801>; else goto <D.23802>;
      <D.23801>:
      bitmaps_offset.54 = (unsigned int) bitmaps_offset;
      map->stack_ref_bitmap_offset = bitmaps_offset.54;
      bitmaps_offset = bitmaps_offset + stack_bitmap_size;
      D.23804 = map->stack_ref_bitmap_offset;
      bitmap = bitmaps + D.23804;
      i = 0;
      goto <D.22886>;
      <D.22885>:
      j = 0;
      goto <D.22883>;
      <D.22882>:
      D.23690 = gcfg->stack_bitmap_width;
      D.23695 = gcfg->stack_ref_bitmap;
      D.23805 = get_bit (D.23695, D.23690, i, j);
      if (D.23805 != 0) goto <D.23806>; else goto <D.23807>;
      <D.23806>:
      D.23808 = i - start;
      set_bit (bitmap, stack_bitmap_width, j, D.23808);
      <D.23807>:
      j = j + 1;
      <D.22883>:
      if (j < ncallsites) goto <D.22882>; else goto <D.22884>;
      <D.22884>:
      i = i + 1;
      <D.22886>:
      if (i < nslots) goto <D.22885>; else goto <D.22887>;
      <D.22887>:
      <D.23802>:
      if (has_pin_slots != 0) goto <D.23809>; else goto <D.23810>;
      <D.23809>:
      bitmaps_offset.54 = (unsigned int) bitmaps_offset;
      map->stack_pin_bitmap_offset = bitmaps_offset.54;
      bitmaps_offset = bitmaps_offset + stack_bitmap_size;
      D.23811 = map->stack_pin_bitmap_offset;
      bitmap = bitmaps + D.23811;
      i = 0;
      goto <D.22892>;
      <D.22891>:
      j = 0;
      goto <D.22889>;
      <D.22888>:
      D.23690 = gcfg->stack_bitmap_width;
      D.23691 = gcfg->stack_pin_bitmap;
      D.23812 = get_bit (D.23691, D.23690, i, j);
      if (D.23812 != 0) goto <D.23813>; else goto <D.23814>;
      <D.23813>:
      D.23808 = i - start;
      set_bit (bitmap, stack_bitmap_width, j, D.23808);
      <D.23814>:
      j = j + 1;
      <D.22889>:
      if (j < ncallsites) goto <D.22888>; else goto <D.22890>;
      <D.22890>:
      i = i + 1;
      <D.22892>:
      if (i < nslots) goto <D.22891>; else goto <D.22893>;
      <D.22893>:
      <D.23810>:
      if (has_ref_regs != 0) goto <D.23815>; else goto <D.23816>;
      <D.23815>:
      bitmaps_offset.54 = (unsigned int) bitmaps_offset;
      map->reg_ref_bitmap_offset = bitmaps_offset.54;
      bitmaps_offset = bitmaps_offset + reg_ref_bitmap_size;
      D.23817 = map->reg_ref_bitmap_offset;
      bitmap = bitmaps + D.23817;
      bindex = 0;
      i = 0;
      goto <D.22898>;
      <D.22897>:
      D.23734 = 1 << i;
      D.23750 = (unsigned int) D.23734;
      D.23818 = D.23750 & reg_ref_mask;
      if (D.23818 != 0) goto <D.23819>; else goto <D.23820>;
      <D.23819>:
      j = 0;
      goto <D.22895>;
      <D.22894>:
      D.23739 = gcfg->reg_bitmap_width;
      D.23744 = gcfg->reg_ref_bitmap;
      D.23821 = get_bit (D.23744, D.23739, i, j);
      if (D.23821 != 0) goto <D.23822>; else goto <D.23823>;
      <D.23822>:
      set_bit (bitmap, reg_ref_bitmap_width, j, bindex);
      <D.23823>:
      j = j + 1;
      <D.22895>:
      if (j < ncallsites) goto <D.22894>; else goto <D.22896>;
      <D.22896>:
      bindex = bindex + 1;
      <D.23820>:
      i = i + 1;
      <D.22898>:
      if (i < nregs) goto <D.22897>; else goto <D.22899>;
      <D.22899>:
      <D.23816>:
      if (has_pin_regs != 0) goto <D.23824>; else goto <D.23825>;
      <D.23824>:
      bitmaps_offset.54 = (unsigned int) bitmaps_offset;
      map->reg_pin_bitmap_offset = bitmaps_offset.54;
      bitmaps_offset = bitmaps_offset + reg_pin_bitmap_size;
      D.23826 = map->reg_pin_bitmap_offset;
      bitmap = bitmaps + D.23826;
      bindex = 0;
      i = 0;
      goto <D.22904>;
      <D.22903>:
      D.23734 = 1 << i;
      D.23750 = (unsigned int) D.23734;
      D.23827 = D.23750 & reg_pin_mask;
      if (D.23827 != 0) goto <D.23828>; else goto <D.23829>;
      <D.23828>:
      j = 0;
      goto <D.22901>;
      <D.22900>:
      D.23739 = gcfg->reg_bitmap_width;
      D.23740 = gcfg->reg_pin_bitmap;
      D.23830 = get_bit (D.23740, D.23739, i, j);
      if (D.23830 != 0) goto <D.23831>; else goto <D.23832>;
      <D.23831>:
      set_bit (bitmap, reg_pin_bitmap_width, j, bindex);
      <D.23832>:
      j = j + 1;
      <D.22901>:
      if (j < ncallsites) goto <D.22900>; else goto <D.22902>;
      <D.22902>:
      bindex = bindex + 1;
      <D.23829>:
      i = i + 1;
      <D.22904>:
      if (i < nregs) goto <D.22903>; else goto <D.22905>;
      <D.22905>:
      <D.23825>:
      map->ncallsites = ncallsites;
      D.23833 = cfg->code_len;
      if (D.23833 <= 255) goto <D.23834>; else goto <D.23835>;
      <D.23834>:
      map->callsite_entry_size = 1;
      goto <D.23836>;
      <D.23835>:
      D.23833 = cfg->code_len;
      if (D.23833 <= 65535) goto <D.23837>; else goto <D.23838>;
      <D.23837>:
      map->callsite_entry_size = 2;
      goto <D.23839>;
      <D.23838>:
      map->callsite_entry_size = 4;
      <D.23839>:
      <D.23836>:
      {
        guint8 buf[256];
        guint8 * endbuf;
        struct GCEncodedMap * emap;
        int encoded_size;
        guint8 * p;

        try
          {
            encode_gc_map (map, &buf, &endbuf);
            endbuf.55 = endbuf;
            endbuf.56 = (int) endbuf.55;
            buf.57 = (int) &buf;
            D.23843 = endbuf.56 - buf.57;
            D.23844 = D.23843 > 255;
            D.23845 = (long int) D.23844;
            D.23846 = __builtin_expect (D.23845, 0);
            if (D.23846 != 0) goto <D.23847>; else goto <D.23848>;
            <D.23847>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2358, "endbuf - buf < 256");
            <D.23848>:
            endbuf.55 = endbuf;
            endbuf.56 = (int) endbuf.55;
            buf.57 = (int) &buf;
            encoded_size = endbuf.56 - buf.57;
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23851 = D.23850 + -1;
            D.23852 = D.23851 + encoded_size;
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23853 = -D.23850;
            D.23854 = D.23852 & D.23853;
            D.23855 = (unsigned int) D.23854;
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23856 = map->ncallsites;
            D.23857 = D.23850 * D.23856;
            D.23858 = (unsigned int) D.23857;
            D.23859 = D.23855 + D.23858;
            bitmaps_size.53 = (unsigned int) bitmaps_size;
            D.23860 = D.23859 + bitmaps_size.53;
            alloc_size = (int) D.23860;
            alloc_size.58 = (unsigned int) alloc_size;
            D.23862 = cfg->domain;
            emap = mono_domain_alloc0 (D.23862, alloc_size.58);
            p = &emap->encoded[0];
            encoded_size.59 = (unsigned int) encoded_size;
            memcpy (p, &buf, encoded_size.59);
            encoded_size.60 = (sizetype) encoded_size;
            p = p + encoded_size.60;
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23851 = D.23850 + -1;
            p.61 = (int) p;
            D.23866 = D.23851 + p.61;
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23853 = -D.23850;
            D.23867 = D.23866 & D.23853;
            p = (guint8 *) D.23867;
            D.23849 = map->callsite_entry_size;
            if (D.23849 == 1) goto <D.23868>; else goto <D.23869>;
            <D.23868>:
            {
              guint8 * offsets;

              offsets = p;
              i = 0;
              goto <D.22913>;
              <D.22912>:
              i.62 = (sizetype) i;
              D.23871 = offsets + i.62;
              i.63 = (unsigned int) i;
              D.23873 = i.63 * 4;
              D.23874 = callsites + D.23873;
              D.23875 = *D.23874;
              D.23876 = D.23875->pc_offset;
              D.23877 = (unsigned char) D.23876;
              *D.23871 = D.23877;
              i = i + 1;
              <D.22913>:
              if (i < ncallsites) goto <D.22912>; else goto <D.22914>;
              <D.22914>:
              D.23878 = stats.gc_callsites8_size;
              D.23879 = (unsigned int) D.23878;
              ncallsites.64 = (unsigned int) ncallsites;
              D.23881 = D.23879 + ncallsites.64;
              D.23882 = (int) D.23881;
              stats.gc_callsites8_size = D.23882;
            }
            goto <D.23883>;
            <D.23869>:
            D.23849 = map->callsite_entry_size;
            if (D.23849 == 2) goto <D.23884>; else goto <D.23885>;
            <D.23884>:
            {
              guint16 * offsets;

              offsets = p;
              i = 0;
              goto <D.22917>;
              <D.22916>:
              i.63 = (unsigned int) i;
              D.23886 = i.63 * 2;
              D.23887 = offsets + D.23886;
              i.63 = (unsigned int) i;
              D.23873 = i.63 * 4;
              D.23874 = callsites + D.23873;
              D.23875 = *D.23874;
              D.23876 = D.23875->pc_offset;
              D.23888 = (short unsigned int) D.23876;
              *D.23887 = D.23888;
              i = i + 1;
              <D.22917>:
              if (i < ncallsites) goto <D.22916>; else goto <D.22918>;
              <D.22918>:
              D.23889 = stats.gc_callsites16_size;
              D.23890 = (unsigned int) D.23889;
              ncallsites.64 = (unsigned int) ncallsites;
              D.23891 = ncallsites.64 * 2;
              D.23892 = D.23890 + D.23891;
              D.23893 = (int) D.23892;
              stats.gc_callsites16_size = D.23893;
            }
            goto <D.23894>;
            <D.23885>:
            {
              guint32 * offsets;

              offsets = p;
              i = 0;
              goto <D.22921>;
              <D.22920>:
              i.63 = (unsigned int) i;
              D.23873 = i.63 * 4;
              D.23895 = offsets + D.23873;
              i.63 = (unsigned int) i;
              D.23873 = i.63 * 4;
              D.23874 = callsites + D.23873;
              D.23875 = *D.23874;
              D.23876 = D.23875->pc_offset;
              D.23896 = (unsigned int) D.23876;
              *D.23895 = D.23896;
              i = i + 1;
              <D.22921>:
              if (i < ncallsites) goto <D.22920>; else goto <D.22922>;
              <D.22922>:
              D.23897 = stats.gc_callsites32_size;
              D.23898 = (unsigned int) D.23897;
              ncallsites.64 = (unsigned int) ncallsites;
              D.23899 = ncallsites.64 * 4;
              D.23900 = D.23898 + D.23899;
              D.23901 = (int) D.23900;
              stats.gc_callsites32_size = D.23901;
            }
            <D.23894>:
            <D.23883>:
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23902 = D.23850 * ncallsites;
            D.23903 = (sizetype) D.23902;
            p = p + D.23903;
            bitmaps_size.65 = (unsigned int) bitmaps_size;
            memcpy (p, bitmaps, bitmaps_size.65);
            bitmaps_size.66 = (sizetype) bitmaps_size;
            p = p + bitmaps_size.66;
            p.61 = (int) p;
            emap.67 = (int) emap;
            D.23907 = p.61 - emap.67;
            D.23908 = D.23907 > alloc_size;
            D.23909 = (long int) D.23908;
            D.23910 = __builtin_expect (D.23909, 0);
            if (D.23910 != 0) goto <D.23911>; else goto <D.23912>;
            <D.23911>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 2396, "(guint8*)p - (guint8*)emap <= alloc_size");
            <D.23912>:
            D.23913 = stats.gc_maps_size;
            D.23914 = D.23913 + alloc_size;
            stats.gc_maps_size = D.23914;
            D.23915 = stats.gc_callsites_size;
            D.23849 = map->callsite_entry_size;
            D.23850 = (int) D.23849;
            D.23902 = D.23850 * ncallsites;
            D.23916 = D.23915 + D.23902;
            stats.gc_callsites_size = D.23916;
            D.23917 = stats.gc_bitmaps_size;
            D.23918 = D.23917 + bitmaps_size;
            stats.gc_bitmaps_size = D.23918;
            D.23919 = stats.gc_map_struct_size;
            D.23920 = (unsigned int) D.23919;
            encoded_size.68 = (unsigned int) encoded_size;
            D.23922 = D.23920 + encoded_size.68;
            D.23923 = (int) D.23922;
            stats.gc_map_struct_size = D.23923;
            D.23924 = cfg->jit_info;
            D.23924->gc_info = emap;
            cfg->gc_map = emap;
            alloc_size.69 = (unsigned int) alloc_size;
            cfg->gc_map_size = alloc_size.69;
          }
        finally
          {
            buf = {CLOBBER};
            endbuf = {CLOBBER};
          }
      }
      D.23926 = stats.all_slots;
      D.23927 = D.23926 + nslots;
      stats.all_slots = D.23927;
      D.23928 = stats.ref_slots;
      D.23705 = ntypes[1];
      D.23929 = D.23928 + D.23705;
      stats.ref_slots = D.23929;
      D.23930 = stats.noref_slots;
      D.23713 = ntypes[0];
      D.23931 = D.23930 + D.23713;
      stats.noref_slots = D.23931;
      D.23932 = stats.pin_slots;
      D.23710 = ntypes[2];
      D.23933 = D.23932 + D.23710;
      stats.pin_slots = D.23933;
    }
  finally
    {
      ntypes = {CLOBBER};
    }
}


has_bit_set (guint8 * bitmap, int width, int slot)
{
  int D.23934;
  sizetype D.23935;
  guint8 * D.23936;
  unsigned char D.23937;
  gboolean D.23939;
  _Bool D.23940;
  int i;
  int pos;

  pos = width * slot;
  i = 0;
  goto <D.22836>;
  <D.22835>:
  D.23934 = pos + i;
  D.23935 = (sizetype) D.23934;
  D.23936 = bitmap + D.23935;
  D.23937 = *D.23936;
  if (D.23937 != 0) goto <D.22834>; else goto <D.23938>;
  <D.23938>:
  i = i + 1;
  <D.22836>:
  if (i < width) goto <D.22835>; else goto <D.22834>;
  <D.22834>:
  D.23940 = i < width;
  D.23939 = (gboolean) D.23940;
  return D.23939;
}


get_bit (guint8 * bitmap, int width, int y, int x)
{
  int D.23942;
  int D.23943;
  int D.23944;
  int D.23945;
  sizetype D.23946;
  guint8 * D.23947;
  unsigned char D.23948;
  int D.23949;
  int D.23950;
  int D.23951;

  D.23943 = width * y;
  D.23944 = x / 8;
  D.23945 = D.23943 + D.23944;
  D.23946 = (sizetype) D.23945;
  D.23947 = bitmap + D.23946;
  D.23948 = *D.23947;
  D.23949 = (int) D.23948;
  D.23950 = x % 8;
  D.23951 = 1 << D.23950;
  D.23942 = D.23949 & D.23951;
  return D.23942;
}


encode_gc_map (struct GCMap * map, guint8 * buf, guint8 * * endbuf)
{
  guint8 * buf.70;
  int D.23954;
  int D.23955;
  int D.23956;
  int D.23957;
  int D.23958;
  int D.23959;
  int D.23960;
  unsigned int D.23961;
  unsigned char D.23962;
  _Bool D.23963;
  long int D.23964;
  long int D.23965;
  unsigned char D.23968;
  int D.23969;
  int D.23970;
  _Bool D.23971;
  long int D.23972;
  long int D.23973;
  unsigned char D.23976;
  unsigned char D.23977;
  _Bool D.23978;
  int D.23979;
  int iftmp.71;
  unsigned char D.23981;
  int D.23985;
  int D.23986;
  int D.23987;
  int D.23988;
  int D.23989;
  int D.23990;
  int D.23991;
  int D.23992;
  int D.23993;
  int D.23994;
  unsigned int D.23995;
  unsigned int D.23996;
  unsigned int D.23997;
  unsigned int D.23998;
  unsigned char D.23999;
  unsigned int D.24002;
  unsigned int D.24003;
  unsigned char D.24004;
  unsigned int D.24007;
  unsigned int D.24008;
  int D.24009;
  unsigned int D.24010;
  guint32 flags;
  guint32 freg;

  buf.70 = buf;
  D.23954 = map->start_offset;
  D.23955 = D.23954 / 4;
  encode_sleb128 (D.23955, buf.70, &buf);
  buf.70 = buf;
  D.23956 = map->end_offset;
  D.23957 = D.23956 / 4;
  encode_sleb128 (D.23957, buf.70, &buf);
  buf.70 = buf;
  D.23958 = map->map_offset;
  D.23959 = D.23958 / 4;
  encode_sleb128 (D.23959, buf.70, &buf);
  buf.70 = buf;
  D.23960 = map->nslots;
  D.23961 = (unsigned int) D.23960;
  encode_uleb128 (D.23961, buf.70, &buf);
  D.23962 = map->callsite_entry_size;
  D.23963 = D.23962 > 4;
  D.23964 = (long int) D.23963;
  D.23965 = __builtin_expect (D.23964, 0);
  if (D.23965 != 0) goto <D.23966>; else goto <D.23967>;
  <D.23966>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 487, "map->callsite_entry_size <= 4");
  <D.23967>:
  D.23968 = map->frame_reg;
  D.23969 = (int) D.23968;
  D.23970 = encode_frame_reg (D.23969);
  freg = (guint32) D.23970;
  D.23971 = freg > 1;
  D.23972 = (long int) D.23971;
  D.23973 = __builtin_expect (D.23972, 0);
  if (D.23973 != 0) goto <D.23974>; else goto <D.23975>;
  <D.23974>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 489, "freg < 2");
  <D.23975>:
  D.23976 = BIT_FIELD_REF <*map, 8, 144>;
  D.23977 = D.23976 & 2;
  D.23978 = D.23977 != 0;
  D.23979 = (int) D.23978;
  D.23976 = BIT_FIELD_REF <*map, 8, 144>;
  D.23981 = D.23976 & 1;
  if (D.23981 != 0) goto <D.23982>; else goto <D.23983>;
  <D.23982>:
  iftmp.71 = 2;
  goto <D.23984>;
  <D.23983>:
  iftmp.71 = 0;
  <D.23984>:
  D.23985 = D.23979 | iftmp.71;
  D.23976 = BIT_FIELD_REF <*map, 8, 144>;
  D.23986 = (int) D.23976;
  D.23987 = D.23986 & 4;
  D.23988 = D.23985 | D.23987;
  D.23976 = BIT_FIELD_REF <*map, 8, 144>;
  D.23986 = (int) D.23976;
  D.23989 = D.23986 & 8;
  D.23990 = D.23988 | D.23989;
  D.23962 = map->callsite_entry_size;
  D.23991 = (int) D.23962;
  D.23992 = D.23991 + -1;
  D.23993 = D.23992 << 4;
  D.23994 = D.23990 | D.23993;
  D.23995 = (unsigned int) D.23994;
  D.23996 = freg << 6;
  flags = D.23995 | D.23996;
  buf.70 = buf;
  encode_uleb128 (flags, buf.70, &buf);
  buf.70 = buf;
  D.23997 = map->used_int_regs;
  D.23998 = encode_regmask (D.23997);
  encode_uleb128 (D.23998, buf.70, &buf);
  D.23976 = BIT_FIELD_REF <*map, 8, 144>;
  D.23999 = D.23976 & 4;
  if (D.23999 != 0) goto <D.24000>; else goto <D.24001>;
  <D.24000>:
  buf.70 = buf;
  D.24002 = map->reg_ref_mask;
  D.24003 = encode_regmask (D.24002);
  encode_uleb128 (D.24003, buf.70, &buf);
  <D.24001>:
  D.23976 = BIT_FIELD_REF <*map, 8, 144>;
  D.24004 = D.23976 & 8;
  if (D.24004 != 0) goto <D.24005>; else goto <D.24006>;
  <D.24005>:
  buf.70 = buf;
  D.24007 = map->reg_pin_mask;
  D.24008 = encode_regmask (D.24007);
  encode_uleb128 (D.24008, buf.70, &buf);
  <D.24006>:
  buf.70 = buf;
  D.24009 = map->ncallsites;
  D.24010 = (unsigned int) D.24009;
  encode_uleb128 (D.24010, buf.70, &buf);
  buf.70 = buf;
  *endbuf = buf.70;
}


encode_sleb128 (gint32 value, guint8 * buf, guint8 * * endbuf)
{
  _Bool D.24011;
  unsigned char D.24012;
  unsigned int D.24015;
  int D.24016;
  int D.24017;
  int D.24018;
  int D.24024;
  int D.24025;
  guint8 * p.72;
  gboolean more;
  gboolean negative;
  guint32 size;
  guint8 byte;
  guint8 * p;

  more = 1;
  D.24011 = value < 0;
  negative = (gboolean) D.24011;
  size = 32;
  p = buf;
  goto <D.22263>;
  <D.22262>:
  D.24012 = (unsigned char) value;
  byte = D.24012 & 127;
  value = value >> 7;
  if (negative != 0) goto <D.24013>; else goto <D.24014>;
  <D.24013>:
  D.24015 = size + 4294967289;
  D.24016 = (int) D.24015;
  D.24017 = 1 << D.24016;
  D.24018 = -D.24017;
  value = D.24018 | value;
  <D.24014>:
  if (value == 0) goto <D.24023>; else goto <D.24019>;
  <D.24023>:
  D.24024 = (int) byte;
  D.24025 = D.24024 & 64;
  if (D.24025 == 0) goto <D.24020>; else goto <D.24019>;
  <D.24019>:
  if (value == -1) goto <D.24026>; else goto <D.24021>;
  <D.24026>:
  D.24024 = (int) byte;
  D.24025 = D.24024 & 64;
  if (D.24025 != 0) goto <D.24020>; else goto <D.24021>;
  <D.24020>:
  more = 0;
  goto <D.24022>;
  <D.24021>:
  byte = byte | 128;
  <D.24022>:
  p.72 = p;
  p = p.72 + 1;
  *p.72 = byte;
  <D.22263>:
  if (more != 0) goto <D.22262>; else goto <D.22264>;
  <D.22264>:
  *endbuf = p;
}


encode_frame_reg (int frame_reg)
{
  int D.24030;

  if (frame_reg == 5) goto <D.24028>; else goto <D.24029>;
  <D.24028>:
  D.24030 = 0;
  return D.24030;
  <D.24029>:
  if (frame_reg == 4) goto <D.24031>; else goto <D.24032>;
  <D.24031>:
  D.24030 = 1;
  return D.24030;
  <D.24032>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-gc.c", 395);
  D.24030 = -1;
  return D.24030;
}


encode_regmask (guint32 regmask)
{
  int D.24034;
  int D.24035;
  unsigned int D.24036;
  unsigned int D.24037;
  int D.24040;
  unsigned int D.24041;
  unsigned int i.73;
  _Bool D.24043;
  long int D.24044;
  long int D.24045;
  guint32 D.24048;
  int i;
  guint32 res;

  res = 0;
  i = 0;
  goto <D.22298>;
  <D.22297>:
  D.24034 = callee_saved_regs[i];
  D.24035 = 1 << D.24034;
  D.24036 = (unsigned int) D.24035;
  D.24037 = D.24036 & regmask;
  if (D.24037 != 0) goto <D.24038>; else goto <D.24039>;
  <D.24038>:
  D.24040 = 1 << i;
  D.24041 = (unsigned int) D.24040;
  res = D.24041 | res;
  D.24034 = callee_saved_regs[i];
  D.24035 = 1 << D.24034;
  D.24036 = (unsigned int) D.24035;
  regmask = regmask - D.24036;
  <D.24039>:
  i = i + 1;
  <D.22298>:
  i.73 = (unsigned int) i;
  if (i.73 <= 2) goto <D.22297>; else goto <D.22299>;
  <D.22299>:
  D.24043 = regmask != 0;
  D.24044 = (long int) D.24043;
  D.24045 = __builtin_expect (D.24044, 0);
  if (D.24045 != 0) goto <D.24046>; else goto <D.24047>;
  <D.24046>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 456, "regmask == 0");
  <D.24047>:
  D.24048 = res;
  return D.24048;
}


encode_uleb128 (guint32 value, guint8 * buf, guint8 * * endbuf)
{
  unsigned char D.24050;
  guint8 * p.74;
  guint8 * p;

  p = buf;
  <D.22250>:
  {
    guint8 b;

    D.24050 = (unsigned char) value;
    b = D.24050 & 127;
    value = value >> 7;
    if (value != 0) goto <D.24051>; else goto <D.24052>;
    <D.24051>:
    b = b | 128;
    <D.24052>:
    p.74 = p;
    p = p.74 + 1;
    *p.74 = b;
  }
  if (value != 0) goto <D.22250>; else goto <D.22251>;
  <D.22251>:
  *endbuf = p;
}


memcpy (void * restrict __dest, const void * restrict __src, size_t __len)
{
  void * D.24054;
  unsigned int D.24055;

  D.24055 = __builtin_object_size (__dest, 0);
  D.24054 = __builtin___memcpy_chk (__dest, __src, __len, D.24055);
  return D.24054;
}


mini_gc_init ()
{
  struct FILE * logfile.75;
  struct MonoGCCallbacks cb;

  try
    {
      memset (&cb, 0, 16);
      cb.thread_attach_func = thread_attach_func;
      cb.thread_detach_func = thread_detach_func;
      cb.thread_suspend_func = thread_suspend_func;
      cb.thread_mark_func = thread_mark_func;
      mono_gc_set_gc_callbacks (&cb);
      logfile.75 = mono_gc_get_logfile ();
      logfile = logfile.75;
      parse_debug_options ();
      mono_counters_register ("GC Maps size", 512, &stats.gc_maps_size);
      mono_counters_register ("GC Call Sites size", 512, &stats.gc_callsites_size);
      mono_counters_register ("GC Bitmaps size", 512, &stats.gc_bitmaps_size);
      mono_counters_register ("GC Map struct size", 512, &stats.gc_map_struct_size);
      mono_counters_register ("GC Call Sites encoded using 8 bits", 512, &stats.gc_callsites8_size);
      mono_counters_register ("GC Call Sites encoded using 16 bits", 512, &stats.gc_callsites16_size);
      mono_counters_register ("GC Call Sites encoded using 32 bits", 512, &stats.gc_callsites32_size);
      mono_counters_register ("GC Map slots (all)", 512, &stats.all_slots);
      mono_counters_register ("GC Map slots (ref)", 512, &stats.ref_slots);
      mono_counters_register ("GC Map slots (noref)", 512, &stats.noref_slots);
      mono_counters_register ("GC Map slots (pin)", 512, &stats.pin_slots);
      mono_counters_register ("GC TLS Data size", 512, &stats.tlsdata_size);
      mono_counters_register ("Stack space scanned (all)", 512, &stats.scanned_stacks);
      mono_counters_register ("Stack space scanned (native)", 512, &stats.scanned_native);
      mono_counters_register ("Stack space scanned (other)", 512, &stats.scanned_other);
      mono_counters_register ("Stack space scanned (using GC Maps)", 512, &stats.scanned);
      mono_counters_register ("Stack space scanned (precise)", 512, &stats.scanned_precisely);
      mono_counters_register ("Stack space scanned (pin)", 512, &stats.scanned_conservatively);
      mono_counters_register ("Stack space scanned (pin registers)", 512, &stats.scanned_registers);
    }
  finally
    {
      cb = {CLOBBER};
    }
}


thread_mark_func (void * user_data, guint8 * stack_start, guint8 * stack_end, gboolean precise)
{
  struct TlsData * tls;

  tls = user_data;
  if (precise == 0) goto <D.24058>; else goto <D.24059>;
  <D.24058>:
  conservative_pass (tls, stack_start, stack_end);
  goto <D.24060>;
  <D.24059>:
  precise_pass (tls, stack_start, stack_end);
  <D.24060>:
}


conservative_pass (struct TlsData * tls, guint8 * stack_start, guint8 * stack_end)
{
  struct MonoInternalThread * D.24065;
  int D.24067;
  int stack_end.76;
  int stack_start.77;
  int D.24070;
  int D.24071;
  void * lmf.78;
  int D.24073;
  struct MonoContext * D.24077;
  mgreg_t * D.24079;
  mgreg_t * D.24082;
  void * D.24085;
  unsigned int stack_limit.79;
  unsigned int D.24087;
  _Bool D.24088;
  long int D.24089;
  long int D.24090;
  void * D.24093;
  struct MonoDomain * iftmp.80;
  struct MonoDomain * D.24095;
  <unnamed type> D.24100;
  void * D.24116;
  int D.24117;
  void * D.24118;
  int D.24119;
  unsigned char D.24120;
  unsigned char D.24121;
  int D.24124;
  _Bool D.24126;
  long int D.24127;
  long int D.24128;
  unsigned int emap.81;
  unsigned int D.24134;
  _Bool D.24135;
  long int D.24136;
  long int D.24137;
  int precise_frame_limit_inited.82;
  const gchar * D.24143;
  const gchar * D.24146;
  int precise_frame_limit.83;
  int precise_frame_limit.84;
  int D.24151;
  char * D.24154;
  int D.24157;
  guint8 * D.24158;
  unsigned char D.24159;
  int D.24160;
  int D.24161;
  guint8 * p.85;
  int p.86;
  int D.24164;
  int D.24165;
  int D.24166;
  guint8 * p.87;
  int D.24168;
  int D.24169;
  sizetype D.24170;
  guint8 * p.88;
  unsigned char D.24172;
  int D.24173;
  int D.24174;
  int D.24175;
  sizetype D.24176;
  int D.24177;
  sizetype D.24178;
  sizetype D.24179;
  int D.24180;
  sizetype D.24181;
  guint8 * D.24184;
  sizetype i.89;
  guint8 * D.24186;
  unsigned char D.24187;
  int D.24188;
  int D.24189;
  guint16 * D.24194;
  unsigned int i.90;
  unsigned int D.24196;
  guint16 * D.24197;
  short unsigned int D.24198;
  int D.24199;
  guint32 * D.24202;
  unsigned int D.24203;
  guint32 * D.24204;
  unsigned int D.24205;
  unsigned int D.24206;
  char * D.24210;
  int D.24213;
  int real_frame_start.91;
  int stack_limit.92;
  int D.24216;
  int D.24217;
  unsigned char D.24218;
  unsigned char D.24219;
  int D.24222;
  int D.24223;
  unsigned int D.24224;
  int D.24225;
  unsigned int D.24226;
  unsigned int D.24227;
  int D.24228;
  sizetype D.24229;
  guint8 * D.24230;
  unsigned char D.24231;
  int D.24232;
  int D.24233;
  int D.24234;
  void * D.24237;
  int D.24240;
  int D.24241;
  int D.24242;
  int D.24243;
  unsigned int D.24244;
  int D.24245;
  unsigned int D.24246;
  unsigned char D.24247;
  unsigned char D.24250;
  int D.24251;
  int D.24252;
  unsigned int D.24253;
  int D.24254;
  unsigned int D.24255;
  unsigned int D.24256;
  int D.24257;
  unsigned int D.24258;
  unsigned int D.24259;
  unsigned int D.24262;
  unsigned int D.24263;
  int D.24266;
  sizetype D.24267;
  guint8 * D.24268;
  unsigned char D.24269;
  int D.24270;
  int D.24271;
  int D.24272;
  int D.24273;
  int D.24276;
  unsigned int D.24277;
  int D.24278;
  _Bool D.24279;
  long int D.24280;
  long int D.24281;
  unsigned char D.24284;
  unsigned int D.24287;
  int D.24288;
  unsigned int D.24289;
  unsigned int D.24290;
  guint8 * D.24291;
  int frame_start.93;
  int D.24294;
  unsigned char D.24295;
  unsigned char D.24298;
  int D.24299;
  int D.24300;
  unsigned int D.24301;
  int D.24302;
  unsigned int D.24303;
  unsigned int D.24304;
  unsigned int D.24305;
  unsigned int D.24306;
  int D.24311;
  sizetype D.24312;
  guint8 * D.24313;
  unsigned char D.24314;
  int D.24315;
  int D.24316;
  int D.24317;
  int D.24318;
  int D.24321;
  int D.24322;
  int D.24323;
  int D.24324;
  unsigned int D.24327;
  int D.24332;
  int D.24339;
  int D.24340;
  int D.24341;
  int D.24342;
  int D.24343;
  int D.24344;
  int D.24345;
  int D.24346;
  int D.24347;
  int D.24348;
  int D.24349;
  struct MonoJitInfo * ji;
  struct MonoMethod * method;
  struct MonoContext ctx;
  struct MonoContext new_ctx;
  struct MonoLMF * lmf;
  guint8 * stack_limit;
  gboolean last;
  struct GCMap * map;
  struct GCMap map_tmp;
  struct GCEncodedMap * emap;
  guint8 * fp;
  guint8 * p;
  guint8 * real_frame_start;
  guint8 * frame_start;
  guint8 * frame_end;
  int i;
  int pc_offset;
  int cindex;
  int bitmap_width;
  int scanned;
  int scanned_precisely;
  int scanned_conservatively;
  int scanned_registers;
  gboolean res;
  struct StackFrameInfo frame;
  mgreg_t * reg_locations[8];
  mgreg_t * new_reg_locations[8];
  guint8 * bitmaps;
  struct FrameInfo * fi;
  guint32 precise_regmask;

  try
    {
      last = 1;
      scanned = 0;
      if (tls != 0B) goto <D.24061>; else goto <D.24062>;
      <D.24061>:
      tls->nframes = 0;
      tls->ref_to_track = 0B;
      <D.24062>:
      D.24065 = mono_thread_internal_current ();
      if (D.24065 == 0B) goto <D.24063>; else goto <D.24066>;
      <D.24066>:
      if (tls == 0B) goto <D.24063>; else goto <D.24064>;
      <D.24063>:
      mono_gc_conservatively_scan_area (stack_start, stack_end);
      D.24067 = stats.scanned_stacks;
      stack_end.76 = (int) stack_end;
      stack_start.77 = (int) stack_start;
      D.24070 = stack_end.76 - stack_start.77;
      D.24071 = D.24067 + D.24070;
      stats.scanned_stacks = D.24071;
      return;
      <D.24064>:
      lmf.78 = tls->unwind_state.unwind_data[1];
      lmf = lmf.78;
      frame.domain = 0B;
      scanned = 0;
      scanned_precisely = 0;
      scanned_conservatively = 0;
      scanned_registers = 0;
      stack_limit = stack_start;
      D.24073 = tls->unwind_state.valid;
      if (D.24073 == 0) goto <D.24074>; else goto <D.24075>;
      <D.24074>:
      memset (&new_ctx, 0, 36);
      goto <D.24076>;
      <D.24075>:
      D.24077 = &tls->unwind_state.ctx;
      memcpy (&new_ctx, D.24077, 36);
      <D.24076>:
      memset (&reg_locations, 0, 32);
      memset (&new_reg_locations, 0, 32);
      <D.22457>:
      D.24073 = tls->unwind_state.valid;
      if (D.24073 == 0) goto <D.22413>; else goto <D.24078>;
      <D.24078>:
      memcpy (&ctx, &new_ctx, 36);
      i = 0;
      goto <D.22415>;
      <D.22414>:
      D.24079 = new_reg_locations[i];
      if (D.24079 != 0B) goto <D.24080>; else goto <D.24081>;
      <D.24080>:
      D.24082 = reg_locations[i];
      if (D.24082 != 0B) goto <D.24083>; else goto <D.24084>;
      <D.24083>:
      D.24082 = reg_locations[i];
      D.24085 = D.24082 + 4;
      D.24082 = reg_locations[i];
      mono_gc_conservatively_scan_area (D.24082, D.24085);
      scanned_registers = scanned_registers + 4;
      <D.24084>:
      D.24079 = new_reg_locations[i];
      reg_locations[i] = D.24079;
      <D.24081>:
      i = i + 1;
      <D.22415>:
      if (i <= 7) goto <D.22414>; else goto <D.22416>;
      <D.22416>:
      stack_limit.79 = (unsigned int) stack_limit;
      D.24087 = stack_limit.79 & 3;
      D.24088 = D.24087 != 0;
      D.24089 = (long int) D.24088;
      D.24090 = __builtin_expect (D.24089, 0);
      if (D.24090 != 0) goto <D.24091>; else goto <D.24092>;
      <D.24091>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 784, "(mgreg_t)stack_limit % SIZEOF_SLOT == 0");
      <D.24092>:
      D.24093 = tls->unwind_state.unwind_data[2];
      D.24095 = frame.domain;
      if (D.24095 != 0B) goto <D.24096>; else goto <D.24097>;
      <D.24096>:
      iftmp.80 = frame.domain;
      goto <D.24098>;
      <D.24097>:
      iftmp.80 = tls->unwind_state.unwind_data[0];
      <D.24098>:
      res = mono_find_jit_info_ext (iftmp.80, D.24093, 0B, &ctx, &new_ctx, 0B, &lmf, &new_reg_locations, &frame);
      if (res == 0) goto <D.22413>; else goto <D.24099>;
      <D.24099>:
      ji = frame.ji;
      D.24100 = frame.type;
      if (D.24100 == 2) goto <D.24101>; else goto <D.24102>;
      <D.24101>:
      i = 0;
      goto <D.22418>;
      <D.22417>:
      D.24082 = reg_locations[i];
      if (D.24082 != 0B) goto <D.24103>; else goto <D.24104>;
      <D.24103>:
      D.24082 = reg_locations[i];
      D.24085 = D.24082 + 4;
      D.24082 = reg_locations[i];
      mono_gc_conservatively_scan_area (D.24082, D.24085);
      scanned_registers = scanned_registers + 4;
      <D.24104>:
      reg_locations[i] = 0B;
      new_reg_locations[i] = 0B;
      i = i + 1;
      <D.22418>:
      if (i <= 7) goto <D.22417>; else goto <D.22419>;
      <D.22419>:
      ctx = new_ctx;
      // predicted unlikely by continue predictor.
      goto <D.22420>;
      <D.24102>:
      if (ji != 0B) goto <D.24105>; else goto <D.24106>;
      <D.24105>:
      method = jinfo_get_method (ji);
      goto <D.24107>;
      <D.24106>:
      method = 0B;
      <D.24107>:
      if (last != 0) goto <D.24108>; else goto <D.24109>;
      <D.24108>:
      if (ji != 0B) goto <D.24110>; else goto <D.24111>;
      <D.24110>:
      <D.24111>:
      last = 0;
      i = 0;
      goto <D.22422>;
      <D.22421>:
      D.24082 = reg_locations[i];
      if (D.24082 != 0B) goto <D.24112>; else goto <D.24113>;
      <D.24112>:
      D.24082 = reg_locations[i];
      D.24085 = D.24082 + 4;
      D.24082 = reg_locations[i];
      mono_gc_conservatively_scan_area (D.24082, D.24085);
      scanned_registers = scanned_registers + 4;
      <D.24113>:
      D.24079 = new_reg_locations[i];
      if (D.24079 != 0B) goto <D.24114>; else goto <D.24115>;
      <D.24114>:
      D.24079 = new_reg_locations[i];
      D.24116 = D.24079 + 4;
      D.24079 = new_reg_locations[i];
      mono_gc_conservatively_scan_area (D.24079, D.24116);
      scanned_registers = scanned_registers + 4;
      <D.24115>:
      reg_locations[i] = 0B;
      new_reg_locations[i] = 0B;
      i = i + 1;
      <D.22422>:
      if (i <= 7) goto <D.22421>; else goto <D.22423>;
      <D.22423>:
      // predicted unlikely by continue predictor.
      goto <D.22420>;
      <D.24109>:
      D.24117 = ctx.eip;
      D.24118 = ji->code_start;
      D.24119 = (int) D.24118;
      pc_offset = D.24117 - D.24119;
      D.24120 = BIT_FIELD_REF <*method, 8, 160>;
      D.24121 = D.24120 & 124;
      if (D.24121 == 24) goto <D.24122>; else goto <D.24123>;
      <D.24122>:
      // predicted unlikely by continue predictor.
      goto <D.22420>;
      <D.24123>:
      D.24124 = tls->nframes;
      if (D.24124 == 50) goto <D.22413>; else goto <D.24125>;
      <D.24125>:
      D.24126 = pc_offset < 0;
      D.24127 = (long int) D.24126;
      D.24128 = __builtin_expect (D.24127, 0);
      if (D.24128 != 0) goto <D.24129>; else goto <D.24130>;
      <D.24129>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 877, "pc_offset >= 0");
      <D.24130>:
      emap = ji->gc_info;
      if (emap == 0B) goto <D.24131>; else goto <D.24132>;
      <D.24131>:
      // predicted unlikely by continue predictor.
      goto <D.22420>;
      <D.24132>:
      emap.81 = (unsigned int) emap;
      D.24134 = emap.81 & 3;
      D.24135 = D.24134 != 0;
      D.24136 = (long int) D.24135;
      D.24137 = __builtin_expect (D.24136, 0);
      if (D.24137 != 0) goto <D.24138>; else goto <D.24139>;
      <D.24138>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 888, "((mgreg_t)emap % 4) == 0");
      <D.24139>:
      precise_frame_limit_inited.82 = precise_frame_limit_inited;
      if (precise_frame_limit_inited.82 == 0) goto <D.24141>; else goto <D.24142>;
      <D.24141>:
      D.24143 = monoeg_g_getenv ("MONO_PRECISE_COUNT");
      if (D.24143 != 0B) goto <D.24144>; else goto <D.24145>;
      <D.24144>:
      D.24146 = monoeg_g_getenv ("MONO_PRECISE_COUNT");
      precise_frame_limit.83 = atoi (D.24146);
      precise_frame_limit = precise_frame_limit.83;
      <D.24145>:
      precise_frame_limit_inited = 1;
      <D.24142>:
      precise_frame_limit.84 = precise_frame_limit;
      if (precise_frame_limit.84 != -1) goto <D.24149>; else goto <D.24150>;
      <D.24149>:
      D.24151 = precise_frame_count[0];
      precise_frame_limit.84 = precise_frame_limit;
      if (D.24151 == precise_frame_limit.84) goto <D.24152>; else goto <D.24153>;
      <D.24152>:
      D.24154 = mono_method_full_name (method, 1);
      printf ("LAST PRECISE FRAME: %s\n", D.24154);
      <D.24153>:
      D.24151 = precise_frame_count[0];
      precise_frame_limit.84 = precise_frame_limit;
      if (D.24151 > precise_frame_limit.84) goto <D.24155>; else goto <D.24156>;
      <D.24155>:
      // predicted unlikely by continue predictor.
      goto <D.22420>;
      <D.24156>:
      <D.24150>:
      D.24151 = precise_frame_count[0];
      D.24157 = D.24151 + 1;
      precise_frame_count[0] = D.24157;
      map = &map_tmp;
      memset (map, 0, 60);
      D.24158 = &emap->encoded[0];
      decode_gc_map (D.24158, map, &p);
      D.24159 = map->callsite_entry_size;
      D.24160 = (int) D.24159;
      D.24161 = D.24160 + -1;
      p.85 = p;
      p.86 = (int) p.85;
      D.24164 = D.24161 + p.86;
      D.24159 = map->callsite_entry_size;
      D.24160 = (int) D.24159;
      D.24165 = -D.24160;
      D.24166 = D.24164 & D.24165;
      p.87 = (guint8 *) D.24166;
      p = p.87;
      p.85 = p;
      map->callsites.offsets8 = p.85;
      p.85 = p;
      D.24159 = map->callsite_entry_size;
      D.24160 = (int) D.24159;
      D.24168 = map->ncallsites;
      D.24169 = D.24160 * D.24168;
      D.24170 = (sizetype) D.24169;
      p.88 = p.85 + D.24170;
      p = p.88;
      bitmaps = p;
      D.24172 = map->frame_reg;
      D.24173 = (int) D.24172;
      D.24174 = get_frame_pointer (&ctx, D.24173);
      fp = (guint8 *) D.24174;
      D.24175 = map->start_offset;
      D.24176 = (sizetype) D.24175;
      real_frame_start = fp + D.24176;
      D.24175 = map->start_offset;
      D.24176 = (sizetype) D.24175;
      D.24177 = map->map_offset;
      D.24178 = (sizetype) D.24177;
      D.24179 = D.24176 + D.24178;
      frame_start = fp + D.24179;
      D.24180 = map->end_offset;
      D.24181 = (sizetype) D.24180;
      frame_end = fp + D.24181;
      D.24159 = map->callsite_entry_size;
      if (D.24159 == 1) goto <D.24182>; else goto <D.24183>;
      <D.24182>:
      i = 0;
      goto <D.22426>;
      <D.22425>:
      D.24184 = map->callsites.offsets8;
      i.89 = (sizetype) i;
      D.24186 = D.24184 + i.89;
      D.24187 = *D.24186;
      D.24188 = (int) D.24187;
      D.24189 = pc_offset + 1;
      if (D.24188 == D.24189) goto <D.22424>; else goto <D.24190>;
      <D.24190>:
      i = i + 1;
      <D.22426>:
      D.24168 = map->ncallsites;
      if (D.24168 > i) goto <D.22425>; else goto <D.22424>;
      <D.22424>:
      goto <D.24191>;
      <D.24183>:
      D.24159 = map->callsite_entry_size;
      if (D.24159 == 2) goto <D.24192>; else goto <D.24193>;
      <D.24192>:
      i = 0;
      goto <D.22429>;
      <D.22428>:
      D.24194 = map->callsites.offsets16;
      i.90 = (unsigned int) i;
      D.24196 = i.90 * 2;
      D.24197 = D.24194 + D.24196;
      D.24198 = *D.24197;
      D.24199 = (int) D.24198;
      D.24189 = pc_offset + 1;
      if (D.24199 == D.24189) goto <D.22427>; else goto <D.24200>;
      <D.24200>:
      i = i + 1;
      <D.22429>:
      D.24168 = map->ncallsites;
      if (D.24168 > i) goto <D.22428>; else goto <D.22427>;
      <D.22427>:
      goto <D.24201>;
      <D.24193>:
      i = 0;
      goto <D.22432>;
      <D.22431>:
      D.24202 = map->callsites.offsets32;
      i.90 = (unsigned int) i;
      D.24203 = i.90 * 4;
      D.24204 = D.24202 + D.24203;
      D.24205 = *D.24204;
      D.24189 = pc_offset + 1;
      D.24206 = (unsigned int) D.24189;
      if (D.24205 == D.24206) goto <D.22430>; else goto <D.24207>;
      <D.24207>:
      i = i + 1;
      <D.22432>:
      D.24168 = map->ncallsites;
      if (D.24168 > i) goto <D.22431>; else goto <D.22430>;
      <D.22430>:
      <D.24201>:
      <D.24191>:
      D.24168 = map->ncallsites;
      if (D.24168 == i) goto <D.24208>; else goto <D.24209>;
      <D.24208>:
      D.24210 = mono_method_full_name (method, 1);
      D.24189 = pc_offset + 1;
      printf ("Unable to find ip offset 0x%x in callsite list of %s.\n", D.24189, D.24210);
      monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-gc.c", 945);
      <D.24209>:
      cindex = i;
      if (real_frame_start > stack_limit) goto <D.24211>; else goto <D.24212>;
      <D.24211>:
      mono_gc_conservatively_scan_area (stack_limit, real_frame_start);
      D.24213 = stats.scanned_other;
      real_frame_start.91 = (int) real_frame_start;
      stack_limit.92 = (int) stack_limit;
      D.24216 = real_frame_start.91 - stack_limit.92;
      D.24217 = D.24213 + D.24216;
      stats.scanned_other = D.24217;
      <D.24212>:
      D.24218 = BIT_FIELD_REF <*map, 8, 144>;
      D.24219 = D.24218 & 1;
      if (D.24219 != 0) goto <D.24220>; else goto <D.24221>;
      <D.24220>:
      {
        int bitmap_width;
        guint8 * pin_bitmap;
        guint8 * p;
        gboolean pinned;

        D.24222 = map->nslots;
        D.24223 = D.24222 + 7;
        bitmap_width = D.24223 >> 3;
        D.24224 = map->stack_pin_bitmap_offset;
        D.24225 = bitmap_width * cindex;
        D.24226 = (unsigned int) D.24225;
        D.24227 = D.24224 + D.24226;
        pin_bitmap = bitmaps + D.24227;
        p = frame_start;
        i = 0;
        goto <D.22438>;
        <D.22437>:
        D.24228 = i / 8;
        D.24229 = (sizetype) D.24228;
        D.24230 = pin_bitmap + D.24229;
        D.24231 = *D.24230;
        D.24232 = (int) D.24231;
        D.24233 = i % 8;
        D.24234 = 1 << D.24233;
        pinned = D.24232 & D.24234;
        if (pinned != 0) goto <D.24235>; else goto <D.24236>;
        <D.24235>:
        D.24237 = p + 4;
        mono_gc_conservatively_scan_area (p, D.24237);
        scanned_conservatively = scanned_conservatively + 4;
        goto <D.24238>;
        <D.24236>:
        scanned_precisely = scanned_precisely + 4;
        <D.24238>:
        p = p + 4;
        i = i + 1;
        <D.22438>:
        D.24222 = map->nslots;
        if (D.24222 > i) goto <D.22437>; else goto <D.22439>;
        <D.22439>:
      }
      goto <D.24239>;
      <D.24221>:
      D.24222 = map->nslots;
      D.24240 = D.24222 * 4;
      scanned_precisely = D.24240 + scanned_precisely;
      <D.24239>:
      D.24180 = map->end_offset;
      D.24175 = map->start_offset;
      D.24241 = D.24180 - D.24175;
      D.24222 = map->nslots;
      D.24242 = D.24222 * -4;
      D.24243 = D.24241 + D.24242;
      scanned_precisely = D.24243 + scanned_precisely;
      D.24244 = map->used_int_regs;
      D.24172 = map->frame_reg;
      D.24173 = (int) D.24172;
      D.24245 = 1 << D.24173;
      D.24246 = (unsigned int) D.24245;
      precise_regmask = D.24244 | D.24246;
      D.24218 = BIT_FIELD_REF <*map, 8, 144>;
      D.24247 = D.24218 & 8;
      if (D.24247 != 0) goto <D.24248>; else goto <D.24249>;
      <D.24248>:
      {
        int bitmap_width;
        guint8 * pin_bitmap;
        int bindex;

        D.24250 = map->npin_regs;
        D.24251 = (int) D.24250;
        D.24252 = D.24251 + 7;
        bitmap_width = D.24252 >> 3;
        D.24253 = map->reg_pin_bitmap_offset;
        D.24254 = bitmap_width * cindex;
        D.24255 = (unsigned int) D.24254;
        D.24256 = D.24253 + D.24255;
        pin_bitmap = bitmaps + D.24256;
        bindex = 0;
        i = 0;
        goto <D.22445>;
        <D.22444>:
        D.24244 = map->used_int_regs;
        D.24257 = 1 << i;
        D.24258 = (unsigned int) D.24257;
        D.24259 = D.24244 & D.24258;
        if (D.24259 == 0) goto <D.24260>; else goto <D.24261>;
        <D.24260>:
        // predicted unlikely by continue predictor.
        goto <D.22443>;
        <D.24261>:
        D.24262 = map->reg_pin_mask;
        D.24257 = 1 << i;
        D.24258 = (unsigned int) D.24257;
        D.24263 = D.24262 & D.24258;
        if (D.24263 == 0) goto <D.24264>; else goto <D.24265>;
        <D.24264>:
        // predicted unlikely by continue predictor.
        goto <D.22443>;
        <D.24265>:
        D.24266 = bindex / 8;
        D.24267 = (sizetype) D.24266;
        D.24268 = pin_bitmap + D.24267;
        D.24269 = *D.24268;
        D.24270 = (int) D.24269;
        D.24271 = bindex % 8;
        D.24272 = D.24270 >> D.24271;
        D.24273 = D.24272 & 1;
        if (D.24273 != 0) goto <D.24274>; else goto <D.24275>;
        <D.24274>:
        D.24257 = 1 << i;
        D.24276 = ~D.24257;
        D.24277 = (unsigned int) D.24276;
        precise_regmask = D.24277 & precise_regmask;
        <D.24275>:
        bindex = bindex + 1;
        <D.22443>:
        i = i + 1;
        <D.22445>:
        if (i <= 7) goto <D.22444>; else goto <D.22446>;
        <D.22446>:
      }
      <D.24249>:
      D.24180 = map->end_offset;
      D.24175 = map->start_offset;
      D.24241 = D.24180 - D.24175;
      scanned = D.24241 + scanned;
      D.24278 = scanned_precisely + scanned_conservatively;
      D.24279 = D.24278 != scanned;
      D.24280 = (long int) D.24279;
      D.24281 = __builtin_expect (D.24280, 0);
      if (D.24281 != 0) goto <D.24282>; else goto <D.24283>;
      <D.24282>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 1011, "scanned == scanned_precisely + scanned_conservatively");
      <D.24283>:
      stack_limit = frame_end;
      D.24124 = tls->nframes;
      fi = &tls->frames[D.24124];
      D.24222 = map->nslots;
      fi->nslots = D.24222;
      D.24222 = map->nslots;
      D.24223 = D.24222 + 7;
      bitmap_width = D.24223 >> 3;
      D.24218 = BIT_FIELD_REF <*map, 8, 144>;
      D.24284 = D.24218 & 2;
      if (D.24284 != 0) goto <D.24285>; else goto <D.24286>;
      <D.24285>:
      D.24287 = map->stack_ref_bitmap_offset;
      D.24288 = bitmap_width * cindex;
      D.24289 = (unsigned int) D.24288;
      D.24290 = D.24287 + D.24289;
      D.24291 = bitmaps + D.24290;
      fi->bitmap = D.24291;
      goto <D.24292>;
      <D.24286>:
      fi->bitmap = 0B;
      <D.24292>:
      frame_start.93 = (int) frame_start;
      stack_start.77 = (int) stack_start;
      D.24294 = frame_start.93 - stack_start.77;
      fi->frame_start_offset = D.24294;
      fi->nreg_locations = 0;
      D.24218 = BIT_FIELD_REF <*map, 8, 144>;
      D.24295 = D.24218 & 4;
      if (D.24295 != 0) goto <D.24296>; else goto <D.24297>;
      <D.24296>:
      {
        int bitmap_width;
        guint8 * ref_bitmap;
        int bindex;

        D.24298 = map->nref_regs;
        D.24299 = (int) D.24298;
        D.24300 = D.24299 + 7;
        bitmap_width = D.24300 >> 3;
        D.24301 = map->reg_ref_bitmap_offset;
        D.24302 = bitmap_width * cindex;
        D.24303 = (unsigned int) D.24302;
        D.24304 = D.24301 + D.24303;
        ref_bitmap = bitmaps + D.24304;
        bindex = 0;
        i = 0;
        goto <D.22452>;
        <D.22451>:
        D.24305 = map->reg_ref_mask;
        D.24257 = 1 << i;
        D.24258 = (unsigned int) D.24257;
        D.24306 = D.24305 & D.24258;
        if (D.24306 == 0) goto <D.24307>; else goto <D.24308>;
        <D.24307>:
        // predicted unlikely by continue predictor.
        goto <D.22450>;
        <D.24308>:
        D.24082 = reg_locations[i];
        if (D.24082 != 0B) goto <D.24309>; else goto <D.24310>;
        <D.24309>:
        D.24311 = bindex / 8;
        D.24312 = (sizetype) D.24311;
        D.24313 = ref_bitmap + D.24312;
        D.24314 = *D.24313;
        D.24315 = (int) D.24314;
        D.24316 = bindex % 8;
        D.24317 = D.24315 >> D.24316;
        D.24318 = D.24317 & 1;
        if (D.24318 != 0) goto <D.24319>; else goto <D.24320>;
        <D.24319>:
        D.24321 = fi->nreg_locations;
        D.24082 = reg_locations[i];
        D.24322 = (int) D.24082;
        stack_start.77 = (int) stack_start;
        D.24323 = D.24322 - stack_start.77;
        fi->reg_locations[D.24321] = D.24323;
        D.24321 = fi->nreg_locations;
        D.24324 = D.24321 + 1;
        fi->nreg_locations = D.24324;
        <D.24320>:
        <D.24310>:
        bindex = bindex + 1;
        <D.22450>:
        i = i + 1;
        <D.22452>:
        if (i <= 7) goto <D.22451>; else goto <D.22453>;
        <D.22453>:
      }
      <D.24297>:
      if (precise_regmask != 0) goto <D.24325>; else goto <D.24326>;
      <D.24325>:
      i = 0;
      goto <D.22455>;
      <D.22454>:
      D.24257 = 1 << i;
      D.24258 = (unsigned int) D.24257;
      D.24327 = D.24258 & precise_regmask;
      if (D.24327 != 0) goto <D.24328>; else goto <D.24329>;
      <D.24328>:
      D.24082 = reg_locations[i];
      if (D.24082 != 0B) goto <D.24330>; else goto <D.24331>;
      <D.24330>:
      <D.24331>:
      reg_locations[i] = 0B;
      <D.24329>:
      i = i + 1;
      <D.22455>:
      if (i <= 7) goto <D.22454>; else goto <D.22456>;
      <D.22456>:
      <D.24326>:
      D.24124 = tls->nframes;
      D.24332 = D.24124 + 1;
      tls->nframes = D.24332;
      <D.22420>:
      goto <D.22457>;
      <D.22413>:
      i = 0;
      goto <D.22459>;
      <D.22458>:
      D.24082 = reg_locations[i];
      if (D.24082 != 0B) goto <D.24333>; else goto <D.24334>;
      <D.24333>:
      D.24082 = reg_locations[i];
      D.24085 = D.24082 + 4;
      D.24082 = reg_locations[i];
      mono_gc_conservatively_scan_area (D.24082, D.24085);
      scanned_registers = scanned_registers + 4;
      <D.24334>:
      D.24079 = new_reg_locations[i];
      if (D.24079 != 0B) goto <D.24335>; else goto <D.24336>;
      <D.24335>:
      D.24079 = new_reg_locations[i];
      D.24116 = D.24079 + 4;
      D.24079 = new_reg_locations[i];
      mono_gc_conservatively_scan_area (D.24079, D.24116);
      scanned_registers = scanned_registers + 4;
      <D.24336>:
      i = i + 1;
      <D.22459>:
      if (i <= 7) goto <D.22458>; else goto <D.22460>;
      <D.22460>:
      if (stack_limit < stack_end) goto <D.24337>; else goto <D.24338>;
      <D.24337>:
      mono_gc_conservatively_scan_area (stack_limit, stack_end);
      D.24339 = stats.scanned_native;
      stack_end.76 = (int) stack_end;
      stack_limit.92 = (int) stack_limit;
      D.24340 = stack_end.76 - stack_limit.92;
      D.24341 = D.24339 + D.24340;
      stats.scanned_native = D.24341;
      <D.24338>:
      D.24067 = stats.scanned_stacks;
      stack_end.76 = (int) stack_end;
      stack_start.77 = (int) stack_start;
      D.24070 = stack_end.76 - stack_start.77;
      D.24071 = D.24067 + D.24070;
      stats.scanned_stacks = D.24071;
      D.24342 = stats.scanned;
      D.24343 = D.24342 + scanned;
      stats.scanned = D.24343;
      D.24344 = stats.scanned_precisely;
      D.24345 = D.24344 + scanned_precisely;
      stats.scanned_precisely = D.24345;
      D.24346 = stats.scanned_conservatively;
      D.24347 = D.24346 + scanned_conservatively;
      stats.scanned_conservatively = D.24347;
      D.24348 = stats.scanned_registers;
      D.24349 = D.24348 + scanned_registers;
      stats.scanned_registers = D.24349;
    }
  finally
    {
      ctx = {CLOBBER};
      new_ctx = {CLOBBER};
      lmf = {CLOBBER};
      map_tmp = {CLOBBER};
      p = {CLOBBER};
      frame = {CLOBBER};
      reg_locations = {CLOBBER};
      new_reg_locations = {CLOBBER};
    }
}


jinfo_get_method (struct MonoJitInfo * ji)
{
  struct MonoMethod * D.24353;

  D.24353 = mono_jit_info_get_method (ji);
  return D.24353;
}


atoi (const char * __nptr)
{
  int D.24355;

  D.24355 = strtol (__nptr, 0B, 10);
  return D.24355;
}


decode_gc_map (guint8 * buf, struct GCMap * map, guint8 * * endbuf)
{
  guint8 * buf.94;
  int D.24358;
  int D.24359;
  int D.24360;
  int D.24361;
  int D.24362;
  int D.24363;
  unsigned int D.24364;
  int D.24365;
  unsigned int D.24366;
  _Bool D.24367;
  unsigned int D.24368;
  _Bool D.24369;
  unsigned int D.24370;
  _Bool D.24371;
  unsigned int D.24372;
  _Bool D.24373;
  unsigned int D.24374;
  unsigned char D.24375;
  unsigned char D.24376;
  unsigned char D.24377;
  unsigned int D.24378;
  int D.24379;
  unsigned char D.24380;
  unsigned int D.24381;
  unsigned int D.24382;
  unsigned char D.24383;
  unsigned char D.24384;
  unsigned int D.24387;
  unsigned int D.24388;
  unsigned int D.24389;
  int D.24390;
  unsigned int D.24391;
  unsigned int D.24392;
  unsigned char D.24395;
  unsigned char D.24396;
  unsigned int D.24399;
  unsigned int D.24400;
  unsigned int D.24401;
  unsigned int D.24402;
  unsigned int D.24405;
  int D.24406;
  int D.24407;
  int D.24408;
  int D.24409;
  int D.24410;
  unsigned char D.24411;
  int D.24412;
  int D.24413;
  int D.24414;
  unsigned char D.24415;
  int D.24416;
  int D.24417;
  int D.24418;
  unsigned int offset.95;
  unsigned char D.24420;
  unsigned char D.24423;
  guint32 flags;
  int stack_bitmap_size;
  int reg_ref_bitmap_size;
  int reg_pin_bitmap_size;
  int offset;
  int freg;
  int i;
  int n;

  buf.94 = buf;
  D.24358 = decode_sleb128 (buf.94, &buf);
  D.24359 = D.24358 * 4;
  map->start_offset = D.24359;
  buf.94 = buf;
  D.24360 = decode_sleb128 (buf.94, &buf);
  D.24361 = D.24360 * 4;
  map->end_offset = D.24361;
  buf.94 = buf;
  D.24362 = decode_sleb128 (buf.94, &buf);
  D.24363 = D.24362 * 4;
  map->map_offset = D.24363;
  buf.94 = buf;
  D.24364 = decode_uleb128 (buf.94, &buf);
  D.24365 = (int) D.24364;
  map->nslots = D.24365;
  buf.94 = buf;
  flags = decode_uleb128 (buf.94, &buf);
  D.24366 = flags & 1;
  D.24367 = D.24366 != 0;
  map->has_ref_slots = D.24367;
  D.24368 = flags & 2;
  D.24369 = D.24368 != 0;
  map->has_pin_slots = D.24369;
  D.24370 = flags & 4;
  D.24371 = D.24370 != 0;
  map->has_ref_regs = D.24371;
  D.24372 = flags & 8;
  D.24373 = D.24372 != 0;
  map->has_pin_regs = D.24373;
  D.24374 = flags >> 4;
  D.24375 = (unsigned char) D.24374;
  D.24376 = D.24375 & 3;
  D.24377 = D.24376 + 1;
  map->callsite_entry_size = D.24377;
  D.24378 = flags >> 6;
  freg = (int) D.24378;
  D.24379 = decode_frame_reg (freg);
  D.24380 = (unsigned char) D.24379;
  map->frame_reg = D.24380;
  buf.94 = buf;
  D.24381 = decode_uleb128 (buf.94, &buf);
  D.24382 = decode_regmask (D.24381);
  map->used_int_regs = D.24382;
  D.24383 = BIT_FIELD_REF <*map, 8, 144>;
  D.24384 = D.24383 & 4;
  if (D.24384 != 0) goto <D.24385>; else goto <D.24386>;
  <D.24385>:
  buf.94 = buf;
  D.24387 = decode_uleb128 (buf.94, &buf);
  D.24388 = decode_regmask (D.24387);
  map->reg_ref_mask = D.24388;
  n = 0;
  i = 0;
  goto <D.22329>;
  <D.22328>:
  D.24389 = map->reg_ref_mask;
  D.24390 = 1 << i;
  D.24391 = (unsigned int) D.24390;
  D.24392 = D.24389 & D.24391;
  if (D.24392 != 0) goto <D.24393>; else goto <D.24394>;
  <D.24393>:
  n = n + 1;
  <D.24394>:
  i = i + 1;
  <D.22329>:
  if (i <= 7) goto <D.22328>; else goto <D.22330>;
  <D.22330>:
  D.24395 = (unsigned char) n;
  map->nref_regs = D.24395;
  <D.24386>:
  D.24383 = BIT_FIELD_REF <*map, 8, 144>;
  D.24396 = D.24383 & 8;
  if (D.24396 != 0) goto <D.24397>; else goto <D.24398>;
  <D.24397>:
  buf.94 = buf;
  D.24399 = decode_uleb128 (buf.94, &buf);
  D.24400 = decode_regmask (D.24399);
  map->reg_pin_mask = D.24400;
  n = 0;
  i = 0;
  goto <D.22332>;
  <D.22331>:
  D.24401 = map->reg_pin_mask;
  D.24390 = 1 << i;
  D.24391 = (unsigned int) D.24390;
  D.24402 = D.24401 & D.24391;
  if (D.24402 != 0) goto <D.24403>; else goto <D.24404>;
  <D.24403>:
  n = n + 1;
  <D.24404>:
  i = i + 1;
  <D.22332>:
  if (i <= 7) goto <D.22331>; else goto <D.22333>;
  <D.22333>:
  D.24395 = (unsigned char) n;
  map->npin_regs = D.24395;
  <D.24398>:
  buf.94 = buf;
  D.24405 = decode_uleb128 (buf.94, &buf);
  D.24406 = (int) D.24405;
  map->ncallsites = D.24406;
  D.24407 = map->nslots;
  D.24408 = D.24407 + 7;
  D.24409 = D.24408 >> 3;
  D.24410 = map->ncallsites;
  stack_bitmap_size = D.24409 * D.24410;
  D.24411 = map->nref_regs;
  D.24412 = (int) D.24411;
  D.24413 = D.24412 + 7;
  D.24414 = D.24413 >> 3;
  D.24410 = map->ncallsites;
  reg_ref_bitmap_size = D.24414 * D.24410;
  D.24415 = map->npin_regs;
  D.24416 = (int) D.24415;
  D.24417 = D.24416 + 7;
  D.24418 = D.24417 >> 3;
  D.24410 = map->ncallsites;
  reg_pin_bitmap_size = D.24418 * D.24410;
  offset = 0;
  offset.95 = (unsigned int) offset;
  map->stack_ref_bitmap_offset = offset.95;
  D.24383 = BIT_FIELD_REF <*map, 8, 144>;
  D.24420 = D.24383 & 2;
  if (D.24420 != 0) goto <D.24421>; else goto <D.24422>;
  <D.24421>:
  offset = offset + stack_bitmap_size;
  <D.24422>:
  offset.95 = (unsigned int) offset;
  map->stack_pin_bitmap_offset = offset.95;
  D.24383 = BIT_FIELD_REF <*map, 8, 144>;
  D.24423 = D.24383 & 1;
  if (D.24423 != 0) goto <D.24424>; else goto <D.24425>;
  <D.24424>:
  offset = offset + stack_bitmap_size;
  <D.24425>:
  offset.95 = (unsigned int) offset;
  map->reg_ref_bitmap_offset = offset.95;
  D.24383 = BIT_FIELD_REF <*map, 8, 144>;
  D.24384 = D.24383 & 4;
  if (D.24384 != 0) goto <D.24426>; else goto <D.24427>;
  <D.24426>:
  offset = offset + reg_ref_bitmap_size;
  <D.24427>:
  offset.95 = (unsigned int) offset;
  map->reg_pin_bitmap_offset = offset.95;
  D.24383 = BIT_FIELD_REF <*map, 8, 144>;
  D.24396 = D.24383 & 8;
  if (D.24396 != 0) goto <D.24428>; else goto <D.24429>;
  <D.24428>:
  offset = offset + reg_pin_bitmap_size;
  <D.24429>:
  buf.94 = buf;
  *endbuf = buf.94;
}


decode_sleb128 (guint8 * buf, guint8 * * endbuf)
{
  int D.24430;
  int D.24431;
  int D.24432;
  signed char b.96;
  int D.24438;
  int D.24441;
  int D.24442;
  gint32 D.24443;
  guint8 * p;
  gint32 res;
  int shift;

  p = buf;
  res = 0;
  shift = 0;
  <D.22284>:
  {
    guint8 b;

    b = *p;
    p = p + 1;
    D.24430 = (int) b;
    D.24431 = D.24430 & 127;
    D.24432 = D.24431 << shift;
    res = D.24432 | res;
    shift = shift + 7;
    b.96 = (signed char) b;
    if (b.96 >= 0) goto <D.24434>; else goto <D.24435>;
    <D.24434>:
    if (shift <= 31) goto <D.24436>; else goto <D.24437>;
    <D.24436>:
    D.24430 = (int) b;
    D.24438 = D.24430 & 64;
    if (D.24438 != 0) goto <D.24439>; else goto <D.24440>;
    <D.24439>:
    D.24441 = 1 << shift;
    D.24442 = -D.24441;
    res = D.24442 | res;
    <D.24440>:
    <D.24437>:
    goto <D.22283>;
    <D.24435>:
  }
  goto <D.22284>;
  <D.22283>:
  *endbuf = p;
  D.24443 = res;
  return D.24443;
}


decode_frame_reg (int encoded)
{
  int D.24447;

  if (encoded == 0) goto <D.24445>; else goto <D.24446>;
  <D.24445>:
  D.24447 = 5;
  return D.24447;
  <D.24446>:
  if (encoded == 1) goto <D.24448>; else goto <D.24449>;
  <D.24448>:
  D.24447 = 4;
  return D.24447;
  <D.24449>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-gc.c", 425);
  D.24447 = -1;
  return D.24447;
}


decode_regmask (guint32 regmask)
{
  int D.24451;
  unsigned int D.24452;
  unsigned int D.24453;
  int D.24456;
  int D.24457;
  unsigned int D.24458;
  unsigned int i.97;
  guint32 D.24460;
  int i;
  guint32 res;

  res = 0;
  i = 0;
  goto <D.22306>;
  <D.22305>:
  D.24451 = 1 << i;
  D.24452 = (unsigned int) D.24451;
  D.24453 = D.24452 & regmask;
  if (D.24453 != 0) goto <D.24454>; else goto <D.24455>;
  <D.24454>:
  D.24456 = callee_saved_regs[i];
  D.24457 = 1 << D.24456;
  D.24458 = (unsigned int) D.24457;
  res = D.24458 | res;
  <D.24455>:
  i = i + 1;
  <D.22306>:
  i.97 = (unsigned int) i;
  if (i.97 <= 2) goto <D.22305>; else goto <D.22307>;
  <D.22307>:
  D.24460 = res;
  return D.24460;
}


decode_uleb128 (guint8 * buf, guint8 * * endbuf)
{
  int D.24462;
  int D.24463;
  int D.24464;
  unsigned int D.24465;
  signed char b.98;
  guint32 D.24468;
  guint8 * p;
  guint32 res;
  int shift;

  p = buf;
  res = 0;
  shift = 0;
  <D.22274>:
  {
    guint8 b;

    b = *p;
    p = p + 1;
    D.24462 = (int) b;
    D.24463 = D.24462 & 127;
    D.24464 = D.24463 << shift;
    D.24465 = (unsigned int) D.24464;
    res = D.24465 | res;
    b.98 = (signed char) b;
    if (b.98 >= 0) goto <D.22273>; else goto <D.24467>;
    <D.24467>:
    shift = shift + 7;
  }
  goto <D.22274>;
  <D.22273>:
  *endbuf = p;
  D.24468 = res;
  return D.24468;
}


get_frame_pointer (struct MonoContext * ctx, int frame_reg)
{
  mgreg_t D.24472;

  if (frame_reg == 4) goto <D.24470>; else goto <D.24471>;
  <D.24470>:
  D.24472 = ctx->esp;
  return D.24472;
  <D.24471>:
  if (frame_reg == 5) goto <D.24473>; else goto <D.24474>;
  <D.24473>:
  D.24472 = ctx->ebp;
  return D.24472;
  <D.24474>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-gc.c", 692);
  D.24472 = 0;
  return D.24472;
}


precise_pass (struct TlsData * tls, guint8 * stack_start, guint8 * stack_end)
{
  int D.24478;
  int D.24481;
  sizetype D.24482;
  guint8 * D.24483;
  int D.24486;
  sizetype D.24487;
  int D.24488;
  sizetype D.24489;
  guint8 * D.24490;
  unsigned char D.24491;
  int D.24492;
  int D.24493;
  int D.24494;
  void * D.24499;
  int D.24502;
  int D.24503;
  sizetype D.24504;
  void * D.24507;
  int D.24509;
  int D.24510;
  void * D.24511;
  int D.24514;
  int D.24515;
  int findex;
  int i;
  struct FrameInfo * fi;
  guint8 * frame_start;

  if (tls == 0B) goto <D.24476>; else goto <D.24477>;
  <D.24476>:
  return;
  <D.24477>:
  D.24478 = tls->unwind_state.valid;
  if (D.24478 == 0) goto <D.24479>; else goto <D.24480>;
  <D.24479>:
  return;
  <D.24480>:
  findex = 0;
  goto <D.22483>;
  <D.22482>:
  fi = &tls->frames[findex];
  D.24481 = fi->frame_start_offset;
  D.24482 = (sizetype) D.24481;
  frame_start = stack_start + D.24482;
  D.24483 = fi->bitmap;
  if (D.24483 != 0B) goto <D.24484>; else goto <D.24485>;
  <D.24484>:
  {
    guint8 * ref_bitmap;
    gboolean live;

    ref_bitmap = fi->bitmap;
    i = 0;
    goto <D.22475>;
    <D.22474>:
    {
      struct MonoObject * * ptr;

      D.24486 = i * 4;
      D.24487 = (sizetype) D.24486;
      ptr = frame_start + D.24487;
      D.24488 = i / 8;
      D.24489 = (sizetype) D.24488;
      D.24490 = ref_bitmap + D.24489;
      D.24491 = *D.24490;
      D.24492 = (int) D.24491;
      D.24493 = i % 8;
      D.24494 = 1 << D.24493;
      live = D.24492 & D.24494;
      if (live != 0) goto <D.24495>; else goto <D.24496>;
      <D.24495>:
      {
        struct MonoObject * obj;

        obj = *ptr;
        if (obj != 0B) goto <D.24497>; else goto <D.24498>;
        <D.24497>:
        D.24499 = mono_gc_scan_object (obj);
        *ptr = D.24499;
        goto <D.24500>;
        <D.24498>:
        <D.24500>:
      }
      goto <D.24501>;
      <D.24496>:
      <D.24501>:
    }
    i = i + 1;
    <D.22475>:
    D.24502 = fi->nslots;
    if (D.24502 > i) goto <D.22474>; else goto <D.22476>;
    <D.22476>:
  }
  <D.24485>:
  i = 0;
  goto <D.22480>;
  <D.22479>:
  {
    struct MonoObject * * ptr;
    struct MonoObject * obj;

    D.24503 = fi->reg_locations[i];
    D.24504 = (sizetype) D.24503;
    ptr = stack_start + D.24504;
    obj = *ptr;
    if (obj != 0B) goto <D.24505>; else goto <D.24506>;
    <D.24505>:
    D.24507 = mono_gc_scan_object (obj);
    *ptr = D.24507;
    goto <D.24508>;
    <D.24506>:
    <D.24508>:
  }
  i = i + 1;
  <D.22480>:
  D.24509 = fi->nreg_locations;
  if (D.24509 > i) goto <D.22479>; else goto <D.22481>;
  <D.22481>:
  findex = findex + 1;
  <D.22483>:
  D.24510 = tls->nframes;
  if (D.24510 > findex) goto <D.22482>; else goto <D.22484>;
  <D.22484>:
  D.24511 = tls->ref_to_track;
  if (D.24511 != 0B) goto <D.24512>; else goto <D.24513>;
  <D.24512>:
  {
    mgreg_t * p;

    p = stack_start;
    goto <D.22487>;
    <D.22486>:
    D.24514 = *p;
    D.24511 = tls->ref_to_track;
    D.24515 = (int) D.24511;
    if (D.24514 == D.24515) goto <D.24516>; else goto <D.24517>;
    <D.24516>:
    printf ("REF AT %p.\n", p);
    <D.24517>:
    p = p + 4;
    <D.22487>:
    if (p < stack_end) goto <D.22486>; else goto <D.22488>;
    <D.22488>:
  }
  <D.24513>:
}


thread_suspend_func (void * user_data, void * sigctx, struct MonoContext * ctx)
{
  int D.24521;
  unsigned int D.24522;
  unsigned int D.24523;
  struct MonoThreadInfo * D.24526;
  _Bool D.24527;
  long int D.24528;
  long int D.24529;
  int D.24532;
  long unsigned int D.24533;
  struct MonoThreadUnwindState * D.24534;
  struct MonoLMF * D.24536;
  struct MonoContext * D.24539;
  unsigned int mono_jit_tls_id.99;
  void * D.24545;
  struct MonoDomain * D.24546;
  void * D.24547;
  struct TlsData * tls;

  tls = user_data;
  if (tls == 0B) goto <D.24519>; else goto <D.24520>;
  <D.24519>:
  return;
  <D.24520>:
  D.24521 = tls->tid;
  D.24522 = (unsigned int) D.24521;
  D.24523 = GetCurrentThreadId ();
  if (D.24522 != D.24523) goto <D.24524>; else goto <D.24525>;
  <D.24524>:
  {
    gboolean res;

    D.24526 = tls->info;
    D.24527 = D.24526 == 0B;
    D.24528 = (long int) D.24527;
    D.24529 = __builtin_expect (D.24528, 0);
    if (D.24529 != 0) goto <D.24530>; else goto <D.24531>;
    <D.24530>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-gc.c", 600, "tls->info");
    <D.24531>:
    D.24526 = tls->info;
    D.24532 = D.24526->native_handle;
    D.24521 = tls->tid;
    D.24533 = (long unsigned int) D.24521;
    D.24534 = &tls->unwind_state;
    res = mono_thread_state_init_from_handle (D.24534, D.24533, D.24532);
  }
  goto <D.24535>;
  <D.24525>:
  D.24536 = mono_get_lmf ();
  tls->unwind_state.unwind_data[1] = D.24536;
  if (sigctx != 0B) goto <D.24537>; else goto <D.24538>;
  <D.24537>:
  D.24539 = &tls->unwind_state.ctx;
  mono_arch_sigctx_to_monoctx (sigctx, D.24539);
  tls->unwind_state.valid = 1;
  goto <D.24540>;
  <D.24538>:
  if (ctx != 0B) goto <D.24541>; else goto <D.24542>;
  <D.24541>:
  D.24539 = &tls->unwind_state.ctx;
  memcpy (D.24539, ctx, 36);
  tls->unwind_state.valid = 1;
  goto <D.24543>;
  <D.24542>:
  tls->unwind_state.valid = 0;
  <D.24543>:
  <D.24540>:
  mono_jit_tls_id.99 = mono_jit_tls_id;
  D.24545 = pthread_getspecific (mono_jit_tls_id.99);
  tls->unwind_state.unwind_data[2] = D.24545;
  D.24546 = mono_domain_get ();
  tls->unwind_state.unwind_data[0] = D.24546;
  <D.24535>:
  D.24547 = tls->unwind_state.unwind_data[0];
  if (D.24547 == 0B) goto <D.24548>; else goto <D.24549>;
  <D.24548>:
  tls->unwind_state.valid = 0;
  return;
  <D.24549>:
}


thread_detach_func (void * user_data)
{
  struct TlsData * tls;

  tls = user_data;
  monoeg_g_free (tls);
}


thread_attach_func ()
{
  unsigned int D.24551;
  int D.24552;
  struct MonoThreadInfo * D.24553;
  int D.24554;
  unsigned int D.24555;
  unsigned int D.24556;
  int D.24557;
  void * D.24558;
  struct TlsData * tls;

  tls = monoeg_malloc0 (2468);
  D.24551 = GetCurrentThreadId ();
  D.24552 = (int) D.24551;
  tls->tid = D.24552;
  D.24553 = mono_thread_info_current ();
  tls->info = D.24553;
  D.24554 = stats.tlsdata_size;
  D.24555 = (unsigned int) D.24554;
  D.24556 = D.24555 + 2468;
  D.24557 = (int) D.24556;
  stats.tlsdata_size = D.24557;
  D.24558 = tls;
  return D.24558;
}


parse_debug_options ()
{
  struct _IO_FILE * stderr.100;
  char * D.24564;
  char * * opts;
  char * * ptr;
  const char * env;

  env = monoeg_g_getenv ("MONO_GCMAP_DEBUG");
  if (env == 0B) goto <D.24560>; else goto <D.24561>;
  <D.24560>:
  return;
  <D.24561>:
  opts = monoeg_g_strsplit (env, ",", -1);
  ptr = opts;
  goto <D.22933>;
  <D.22932>:
  stderr.100 = stderr;
  fprintf (stderr.100, "Invalid format for the MONO_GCMAP_DEBUG env variable: \'%s\'\n", env);
  exit (1);
  ptr = ptr + 4;
  <D.22933>:
  if (ptr != 0B) goto <D.24563>; else goto <D.22934>;
  <D.24563>:
  D.24564 = *ptr;
  if (D.24564 != 0B) goto <D.22932>; else goto <D.22934>;
  <D.22934>:
  monoeg_g_strfreev (opts);
}


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

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


mini_gc_init_cfg (struct MonoCompile * cfg)
{
  int D.24568;

  D.24568 = mono_gc_is_moving ();
  if (D.24568 != 0) goto <D.24569>; else goto <D.24570>;
  <D.24569>:
  cfg->disable_ref_noref_stack_slot_share = 1;
  cfg->gen_write_barriers = 1;
  <D.24570>:
  mini_gc_init_gc_map (cfg);
}


mini_gc_init_gc_map (struct MonoCompile * cfg)
{
  int D.24573;
  unsigned char D.24576;
  unsigned char D.24577;
  int enable_gc_maps_for_aot.101;
  int D.24584;
  int precise_count.102;
  int precise_count.103;
  const gchar * D.24589;
  const gchar * D.24592;
  int D.24593;
  struct MonoMethod * D.24596;
  char * D.24597;
  const gchar * D.24598;
  int D.24599;
  struct MonoMemPool * D.24602;
  void * D.24603;

  if (0 != 0) goto <D.24571>; else goto <D.24572>;
  <D.24571>:
  return;
  <D.24572>:
  D.24573 = mono_gc_is_moving ();
  if (D.24573 == 0) goto <D.24574>; else goto <D.24575>;
  <D.24574>:
  return;
  <D.24575>:
  D.24576 = BIT_FIELD_REF <*cfg, 8, 3392>;
  D.24577 = D.24576 & 64;
  if (D.24577 != 0) goto <D.24578>; else goto <D.24579>;
  <D.24578>:
  enable_gc_maps_for_aot.101 = enable_gc_maps_for_aot;
  if (enable_gc_maps_for_aot.101 == 0) goto <D.24581>; else goto <D.24582>;
  <D.24581>:
  return;
  <D.24582>:
  goto <D.24583>;
  <D.24579>:
  D.24584 = mono_gc_precise_stack_mark_enabled ();
  if (D.24584 == 0) goto <D.24585>; else goto <D.24586>;
  <D.24585>:
  return;
  <D.24586>:
  <D.24583>:
  {
    static int precise_count;

    precise_count.102 = precise_count;
    precise_count.103 = precise_count.102 + 1;
    precise_count = precise_count.103;
    D.24589 = monoeg_g_getenv ("MONO_GCMAP_COUNT");
    if (D.24589 != 0B) goto <D.24590>; else goto <D.24591>;
    <D.24590>:
    D.24592 = monoeg_g_getenv ("MONO_GCMAP_COUNT");
    D.24593 = atoi (D.24592);
    precise_count.102 = precise_count;
    if (D.24593 == precise_count.102) goto <D.24594>; else goto <D.24595>;
    <D.24594>:
    D.24596 = cfg->method;
    D.24597 = mono_method_full_name (D.24596, 1);
    printf ("LAST: %s\n", D.24597);
    <D.24595>:
    D.24598 = monoeg_g_getenv ("MONO_GCMAP_COUNT");
    D.24599 = atoi (D.24598);
    precise_count.102 = precise_count;
    if (D.24599 < precise_count.102) goto <D.24600>; else goto <D.24601>;
    <D.24600>:
    return;
    <D.24601>:
    <D.24591>:
  }
  cfg->compute_gc_maps = 1;
  D.24602 = cfg->mempool;
  D.24603 = mono_mempool_alloc0 (D.24602, 64);
  cfg->gc_info = D.24603;
}


