GC_default_same_obj_print_proc (void * p, void * q)
{
  long int p.0;
  long int q.1;

  p.0 = (long int) p;
  q.1 = (long int) q;
  GC_err_printf ("0x%lx and 0x%lx are not in the same object\n", p.0, q.1, 0, 0, 0, 0);
  GC_abort ("GC_same_obj test failed");
}


GC_same_obj (void * p, void * q)
{
  int GC_is_initialized.2;
  long unsigned int p.3;
  long unsigned int D.5006;
  long unsigned int q.4;
  long unsigned int D.5008;
  struct hdr * D.5011;
  void * D.5013;
  long unsigned int hhdr.5;
  sizetype p.6;
  sizetype D.5018;
  long unsigned int D.5019;
  sizetype D.5020;
  sizetype D.5021;
  long unsigned int D.5022;
  long unsigned int D.5023;
  long unsigned int D.5029;
  long int p.7;
  int D.5033;
  map_entry_type * D.5034;
  sizetype D.5035;
  map_entry_type * D.5036;
  unsigned char D.5037;
  int D.5040;
  long unsigned int D.5041;
  long unsigned int D.5042;
  long unsigned int D.5043;
  long unsigned int D.5044;
  long unsigned int D.5045;
  long unsigned int D.5047;
  int D.5048;
  sizetype D.5049;
  sizetype D.5050;
  void (*<T471>) (void *, void *) GC_same_obj_print_proc.8;
  register struct hblk * h;
  register struct hdr * hhdr;
  register char * base;
  register char * limit;
  register word sz;
  void fail = <<< error >>>;

  GC_is_initialized.2 = GC_is_initialized;
  if (GC_is_initialized.2 == 0) goto <D.5001>; else goto <D.5002>;
  <D.5001>:
  GC_init ();
  <D.5002>:
  hhdr = GC_find_header (p);
  if (hhdr == 0B) goto <D.5003>; else goto <D.5004>;
  <D.5003>:
  p.3 = (long unsigned int) p;
  D.5006 = p.3 >> 12;
  q.4 = (long unsigned int) q;
  D.5008 = q.4 >> 12;
  if (D.5006 != D.5008) goto <D.5009>; else goto <D.5010>;
  <D.5009>:
  D.5011 = GC_find_header (q);
  if (D.5011 != 0B) goto fail; else goto <D.5012>;
  <D.5012>:
  <D.5010>:
  D.5013 = p;
  return D.5013;
  <D.5004>:
  hhdr.5 = (long unsigned int) hhdr;
  if (hhdr.5 <= 4095) goto <D.5015>; else goto <D.5016>;
  <D.5015>:
  p.6 = (sizetype) p;
  D.5018 = p.6 & 18446744073709547520;
  hhdr.5 = (long unsigned int) hhdr;
  D.5019 = hhdr.5 * 4096;
  D.5020 = D.5018 - D.5019;
  h = (struct hblk *) D.5020;
  hhdr = GC_find_header (h);
  goto <D.4951>;
  <D.4950>:
  hhdr.5 = (long unsigned int) hhdr;
  D.5019 = hhdr.5 * 4096;
  D.5021 = -D.5019;
  h = h + D.5021;
  hhdr = GC_find_header (h);
  <D.4951>:
  hhdr.5 = (long unsigned int) hhdr;
  if (hhdr.5 <= 4095) goto <D.4950>; else goto <D.4952>;
  <D.4952>:
  D.5022 = hhdr->hb_sz;
  D.5023 = D.5022 * 8;
  limit = h + D.5023;
  if (p >= limit) goto fail; else goto <D.5024>;
  <D.5024>:
  if (q >= limit) goto fail; else goto <D.5025>;
  <D.5025>:
  if (q < h) goto fail; else goto <D.5026>;
  <D.5026>:
  D.5013 = p;
  return D.5013;
  <D.5016>:
  D.5022 = hhdr->hb_sz;
  sz = D.5022 << 3;
  if (sz > 2048) goto <D.5027>; else goto <D.5028>;
  <D.5027>:
  p.3 = (long unsigned int) p;
  D.5029 = p.3 & 18446744073709547520;
  base = (char *) D.5029;
  limit = base + sz;
  if (p >= limit) goto fail; else goto <D.5030>;
  <D.5030>:
  goto <D.5031>;
  <D.5028>:
  {
    register int map_entry;
    register int pdispl;

    p.7 = (long int) p;
    D.5033 = (int) p.7;
    pdispl = D.5033 & 4095;
    D.5034 = hhdr->hb_map;
    D.5035 = (sizetype) pdispl;
    D.5036 = D.5034 + D.5035;
    D.5037 = *D.5036;
    map_entry = (int) D.5037;
    if (map_entry > 253) goto <D.5038>; else goto <D.5039>;
    <D.5038>:
    D.5040 = pdispl >> 3;
    D.5041 = (long unsigned int) D.5040;
    D.5042 = sz >> 3;
    D.5043 = D.5041 % D.5042;
    map_entry = (int) D.5043;
    p.3 = (long unsigned int) p;
    q.4 = (long unsigned int) q;
    D.5044 = p.3 ^ q.4;
    D.5045 = D.5044 & 18446744073709547520;
    if (D.5045 != 0) goto fail; else goto <D.5046>;
    <D.5046>:
    <D.5039>:
    p.3 = (long unsigned int) p;
    D.5047 = p.3 & 18446744073709551608;
    base = (char *) D.5047;
    D.5048 = map_entry << 3;
    D.5049 = (sizetype) D.5048;
    D.5050 = -D.5049;
    base = base + D.5050;
    limit = base + sz;
  }
  <D.5031>:
  if (q >= limit) goto fail; else goto <D.5051>;
  <D.5051>:
  if (q < base) goto fail; else goto <D.5052>;
  <D.5052>:
  D.5013 = p;
  return D.5013;
  fail:
  GC_same_obj_print_proc.8 = GC_same_obj_print_proc;
  GC_same_obj_print_proc.8 (p, q);
  D.5013 = p;
  return D.5013;
}


GC_default_is_valid_displacement_print_proc (void * p)
{
  long int p.9;

  p.9 = (long int) p;
  GC_err_printf ("0x%lx does not point to valid object displacement\n", p.9, 0, 0, 0, 0, 0);
  GC_abort ("GC_is_valid_displacement test failed");
}


GC_is_valid_displacement (void * p)
{
  int GC_is_initialized.10;
  void * D.5061;
  long unsigned int p.11;
  long unsigned int D.5063;
  int GC_all_interior_pointers.12;
  long unsigned int hhdr.13;
  long unsigned int D.5068;
  sizetype D.5069;
  long unsigned int D.5071;
  map_entry_type * D.5072;
  map_entry_type * D.5073;
  char * D.5077;
  void (*<T4ae>) (void *) GC_is_valid_displacement_print_proc.14;
  register struct hdr * hhdr;
  register word pdispl;
  register struct hblk * h;
  register map_entry_type map_entry;
  register word sz;
  void fail = <<< error >>>;

  GC_is_initialized.10 = GC_is_initialized;
  if (GC_is_initialized.10 == 0) goto <D.5057>; else goto <D.5058>;
  <D.5057>:
  GC_init ();
  <D.5058>:
  hhdr = GC_find_header (p);
  if (hhdr == 0B) goto <D.5059>; else goto <D.5060>;
  <D.5059>:
  D.5061 = p;
  return D.5061;
  <D.5060>:
  p.11 = (long unsigned int) p;
  D.5063 = p.11 & 18446744073709547520;
  h = (struct hblk *) D.5063;
  GC_all_interior_pointers.12 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.12 != 0) goto <D.5065>; else goto <D.5066>;
  <D.5065>:
  goto <D.4969>;
  <D.4968>:
  hhdr.13 = (long unsigned int) hhdr;
  D.5068 = hhdr.13 * 4096;
  D.5069 = -D.5068;
  h = h + D.5069;
  hhdr = GC_find_header (h);
  <D.4969>:
  hhdr.13 = (long unsigned int) hhdr;
  if (hhdr.13 <= 4095) goto <D.4968>; else goto <D.4970>;
  <D.4970>:
  <D.5066>:
  hhdr.13 = (long unsigned int) hhdr;
  if (hhdr.13 <= 4095) goto fail; else goto <D.5070>;
  <D.5070>:
  D.5071 = hhdr->hb_sz;
  sz = D.5071 << 3;
  p.11 = (long unsigned int) p;
  pdispl = p.11 & 4095;
  D.5072 = hhdr->hb_map;
  D.5073 = D.5072 + pdispl;
  map_entry = *D.5073;
  if (map_entry == 255) goto fail; else goto <D.5075>;
  <D.5075>:
  if (sz > 2048) goto <D.5076>; else goto <D.5074>;
  <D.5076>:
  D.5077 = h + sz;
  if (D.5077 <= p) goto fail; else goto <D.5074>;
  <D.5074>:
  D.5061 = p;
  return D.5061;
  fail:
  GC_is_valid_displacement_print_proc.14 = GC_is_valid_displacement_print_proc;
  GC_is_valid_displacement_print_proc.14 (p);
  D.5061 = p;
  return D.5061;
}


GC_default_is_visible_print_proc (void * p)
{
  long int p.15;

  p.15 = (long int) p;
  GC_err_printf ("0x%lx is not a GC visible pointer location\n", p.15, 0, 0, 0, 0, 0);
  GC_abort ("GC_is_visible test failed");
}


GC_on_stack (char * p)
{
  GC_bool D.5081;

  D.5081 = 1;
  return D.5081;
}


GC_is_visible (void * p)
{
  long unsigned int p.16;
  long unsigned int D.5084;
  int GC_is_initialized.17;
  void * D.5092;
  void * D.5093;
  void (*<T4ae>) (void *) GC_is_visible_print_proc.18;
  register struct hdr * hhdr;
  void fail = <<< error >>>;

  p.16 = (long unsigned int) p;
  D.5084 = p.16 & 7;
  if (D.5084 != 0) goto fail; else goto <D.5085>;
  <D.5085>:
  GC_is_initialized.17 = GC_is_initialized;
  if (GC_is_initialized.17 == 0) goto <D.5087>; else goto <D.5088>;
  <D.5087>:
  GC_init ();
  <D.5088>:
  hhdr = GC_find_header (p);
  if (hhdr != 0B) goto <D.5091>; else goto <D.5089>;
  <D.5091>:
  D.5092 = GC_base (p);
  if (D.5092 == 0B) goto fail; else goto <D.5089>;
  goto <D.5090>;
  <D.5089>:
  D.5093 = p;
  return D.5093;
  <D.5090>:
  fail:
  GC_is_visible_print_proc.18 = GC_is_visible_print_proc;
  GC_is_visible_print_proc.18 (p);
  D.5093 = p;
  return D.5093;
}


GC_pre_incr (void * * p, size_t how_much)
{
  long unsigned int initial.19;
  long unsigned int D.5097;
  void * D.5098;
  int GC_all_interior_pointers.20;
  void * D.5102;
  void * initial;
  void * result;

  initial = *p;
  initial.19 = (long unsigned int) initial;
  D.5097 = initial.19 + how_much;
  D.5098 = (void *) D.5097;
  result = GC_same_obj (D.5098, initial);
  GC_all_interior_pointers.20 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.20 == 0) goto <D.5100>; else goto <D.5101>;
  <D.5100>:
  GC_is_valid_displacement (result);
  <D.5101>:
  *p = result;
  D.5102 = *p;
  return D.5102;
}


GC_post_incr (void * * p, size_t how_much)
{
  long unsigned int initial.21;
  long unsigned int D.5105;
  void * D.5106;
  int GC_all_interior_pointers.22;
  void * D.5110;
  void * initial;
  void * result;

  initial = *p;
  initial.21 = (long unsigned int) initial;
  D.5105 = initial.21 + how_much;
  D.5106 = (void *) D.5105;
  result = GC_same_obj (D.5106, initial);
  GC_all_interior_pointers.22 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.22 == 0) goto <D.5108>; else goto <D.5109>;
  <D.5108>:
  GC_is_valid_displacement (result);
  <D.5109>:
  *p = result;
  D.5110 = initial;
  return D.5110;
}


