__attribute__((visibility ("hidden")))
mono_draw_graph (struct MonoCompile * cfg, MonoGraphOptions draw_options)
{
  _Bool D.22222;
  long int D.22223;
  long int D.22224;
  char * com;
  const char * fn;
  struct FILE * fp;
  int _i;

  fn = "/tmp/minidtree.graph";
  fp = fopen (fn, "w+");
  D.22222 = fp == 0B;
  D.22223 = (long int) D.22222;
  D.22224 = __builtin_expect (D.22223, 0);
  if (D.22224 != 0) goto <D.22225>; else goto <D.22226>;
  <D.22225>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "graph.c", 321, "fp");
  <D.22226>:
  switch (draw_options) <default: <D.22227>, case 1: <D.22217>, case 2: <D.22215>, case 4: <D.22218>, case 8: <D.22220>, case 16: <D.22219>>
  <D.22215>:
  mono_draw_dtree (cfg, fp);
  goto <D.22216>;
  <D.22217>:
  mono_draw_cfg (cfg, fp);
  goto <D.22216>;
  <D.22218>:
  <D.22219>:
  <D.22220>:
  mono_draw_code_cfg (cfg, fp);
  goto <D.22216>;
  <D.22227>:
  <D.22216>:
  fclose (fp);
  com = monoeg_g_strdup_printf ("dot %s -Tps -o %s.ps;gv %s.ps", fn, fn, fn);
  _i = system (com);
  monoeg_g_free (com);
}


mono_draw_dtree (struct MonoCompile * cfg, struct FILE * fp)
{
  unsigned int D.22228;
  unsigned int D.22229;
  _Bool D.22230;
  long int D.22231;
  long int D.22232;
  struct MonoMethod * D.22235;
  const char * D.22236;
  char * D.22237;
  char * D.22238;

  D.22228 = cfg->comp_done;
  D.22229 = D.22228 & 2;
  D.22230 = D.22229 == 0;
  D.22231 = (long int) D.22230;
  D.22232 = __builtin_expect (D.22231, 0);
  if (D.22232 != 0) goto <D.22233>; else goto <D.22234>;
  <D.22233>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "graph.c", 128, "(cfg->comp_done & MONO_COMP_IDOM)");
  <D.22234>:
  D.22235 = cfg->method;
  D.22236 = D.22235->name;
  D.22237 = convert_name (D.22236);
  fprintf (fp, "digraph %s {\n", D.22237);
  fprintf (fp, "node [fontsize=12.0]\nedge [len=1,color=red]\n");
  D.22235 = cfg->method;
  D.22238 = mono_method_full_name (D.22235, 1);
  fprintf (fp, "label=\"Dominator tree for %s\";\n", D.22238);
  fprintf (fp, "BB0 [shape=doublecircle];\n");
  fprintf (fp, "BB1 [color=red];\n");
  dtree_emit_one_loop_level (cfg, fp, 0B);
  fprintf (fp, "}\n");
}


convert_name (const char * str)
{
  long unsigned int D.22239;
  int D.22240;
  long unsigned int D.22241;
  sizetype D.22242;
  const char * D.22243;
  int D.22244;
  int j.0;
  sizetype D.22246;
  char * D.22247;
  int j.1;
  sizetype D.22249;
  char * D.22250;
  sizetype D.22251;
  char * D.22252;
  char * D.22253;
  int i;
  int j;
  int len;
  char * res;

  D.22239 = __strlen_g (str);
  len = (int) D.22239;
  D.22240 = len * 2;
  D.22241 = (long unsigned int) D.22240;
  res = monoeg_malloc (D.22241);
  j = 0;
  i = 0;
  goto <D.22149>;
  <D.22148>:
  {
    char c;

    D.22242 = (sizetype) i;
    D.22243 = str + D.22242;
    c = *D.22243;
    D.22244 = (int) c;
    switch (D.22244) <default: <D.22147>, case 46: <D.22145>>
    <D.22145>:
    j.0 = j;
    j = j.0 + 1;
    D.22246 = (sizetype) j.0;
    D.22247 = res + D.22246;
    *D.22247 = 95;
    goto <D.22146>;
    <D.22147>:
    j.1 = j;
    j = j.1 + 1;
    D.22249 = (sizetype) j.1;
    D.22250 = res + D.22249;
    *D.22250 = c;
    <D.22146>:
  }
  i = i + 1;
  <D.22149>:
  if (i < len) goto <D.22148>; else goto <D.22150>;
  <D.22150>:
  D.22251 = (sizetype) j;
  D.22252 = res + D.22251;
  *D.22252 = 0;
  D.22253 = res;
  return D.22253;
}


__attribute__((__gnu_inline__))
__strlen_g (const char * __str)
{
  size_t D.22255;
  long int __ptr.2;
  long int __str.3;
  long int D.22258;
  char * __ptr;
  char * __tmp;

  __ptr = 0B;
  __tmp = __str;
  __asm__ __volatile__("   la    0,0
0: srst  %0,%1
   jo    0b
" : "=&a" __ptr, "=&a" __tmp : "0" __ptr, "1" __tmp : "0", "memory", "cc");
  __ptr.2 = (long int) __ptr;
  __str.3 = (long int) __str;
  D.22258 = __ptr.2 - __str.3;
  D.22255 = (size_t) D.22258;
  return D.22255;
}


dtree_emit_one_loop_level (struct MonoCompile * cfg, struct FILE * fp, struct MonoBasicBlock * h)
{
  signed char D.22262;
  int D.22263;
  struct MonoBasicBlock * * D.22264;
  long unsigned int D.22265;
  long unsigned int D.22266;
  struct MonoBasicBlock * * D.22267;
  struct GList * D.22271;
  struct GList * D.22272;
  signed char D.22274;
  int D.22275;
  struct MonoBasicBlock * D.22278;
  int D.22279;
  int D.22280;
  int D.22281;
  struct GList * D.22284;
  unsigned int D.22287;
  unsigned int i.4;
  struct MonoBasicBlock * bb;
  int i;
  int level;

  level = 0;
  if (h != 0B) goto <D.22260>; else goto <D.22261>;
  <D.22260>:
  D.22262 = h->nesting;
  level = (int) D.22262;
  D.22263 = h->block_num;
  fprintf (fp, "subgraph cluster_%d {\n", D.22263);
  D.22263 = h->block_num;
  fprintf (fp, "label=\"loop_%d\"\n", D.22263);
  <D.22261>:
  i = 1;
  goto <D.22160>;
  <D.22159>:
  D.22264 = cfg->bblocks;
  D.22265 = (long unsigned int) i;
  D.22266 = D.22265 * 8;
  D.22267 = D.22264 + D.22266;
  bb = *D.22267;
  if (h == 0B) goto <D.22268>; else goto <D.22270>;
  <D.22270>:
  D.22271 = h->loop_blocks;
  D.22272 = monoeg_g_list_find (D.22271, bb);
  if (D.22272 != 0B) goto <D.22273>; else goto <D.22269>;
  <D.22273>:
  if (bb != h) goto <D.22268>; else goto <D.22269>;
  <D.22268>:
  D.22274 = bb->nesting;
  D.22275 = (int) D.22274;
  if (D.22275 == level) goto <D.22276>; else goto <D.22277>;
  <D.22276>:
  D.22278 = bb->idom;
  D.22279 = D.22278->block_num;
  D.22280 = bb->block_num;
  fprintf (fp, "BB%d -> BB%d;\n", D.22279, D.22280);
  <D.22277>:
  D.22274 = bb->nesting;
  D.22275 = (int) D.22274;
  D.22281 = level + 1;
  if (D.22275 == D.22281) goto <D.22282>; else goto <D.22283>;
  <D.22282>:
  D.22284 = bb->loop_blocks;
  if (D.22284 != 0B) goto <D.22285>; else goto <D.22286>;
  <D.22285>:
  D.22278 = bb->idom;
  D.22279 = D.22278->block_num;
  D.22280 = bb->block_num;
  fprintf (fp, "BB%d -> BB%d;\n", D.22279, D.22280);
  dtree_emit_one_loop_level (cfg, fp, bb);
  <D.22286>:
  <D.22283>:
  <D.22269>:
  i = i + 1;
  <D.22160>:
  D.22287 = cfg->num_bblocks;
  i.4 = (unsigned int) i;
  if (D.22287 > i.4) goto <D.22159>; else goto <D.22161>;
  <D.22161>:
  if (h != 0B) goto <D.22289>; else goto <D.22290>;
  <D.22289>:
  fprintf (fp, "}\n");
  <D.22290>:
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__))
fprintf (struct FILE * restrict __stream, const char * restrict __fmt)
{
  int D.22291;

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


mono_draw_cfg (struct MonoCompile * cfg, struct FILE * fp)
{
  struct MonoMethod * D.22293;
  const char * D.22294;
  char * D.22295;
  char * D.22296;

  D.22293 = cfg->method;
  D.22294 = D.22293->name;
  D.22295 = convert_name (D.22294);
  fprintf (fp, "digraph %s {\n", D.22295);
  fprintf (fp, "node [fontsize=12.0]\nedge [len=1,color=red]\n");
  D.22293 = cfg->method;
  D.22296 = mono_method_full_name (D.22293, 1);
  fprintf (fp, "label=\"CFG for %s\";\n", D.22296);
  fprintf (fp, "BB0 [shape=doublecircle];\n");
  fprintf (fp, "BB1 [color=red];\n");
  cfg_emit_one_loop_level (cfg, fp, 0B);
  fprintf (fp, "}\n");
}


cfg_emit_one_loop_level (struct MonoCompile * cfg, struct FILE * fp, struct MonoBasicBlock * h)
{
  signed char D.22299;
  int D.22300;
  struct MonoBasicBlock * D.22301;
  unsigned int D.22302;
  unsigned int D.22305;
  int D.22306;
  struct GList * D.22310;
  struct GList * D.22311;
  signed char D.22313;
  int D.22314;
  struct MonoBasicBlock * * D.22317;
  long unsigned int D.22318;
  long unsigned int D.22319;
  struct MonoBasicBlock * * D.22320;
  struct MonoBasicBlock * D.22321;
  int D.22322;
  short int D.22323;
  int D.22324;
  int D.22325;
  struct GList * D.22328;
  struct MonoBasicBlock * bb;
  int j;
  int level;

  level = 0;
  if (h != 0B) goto <D.22297>; else goto <D.22298>;
  <D.22297>:
  D.22299 = h->nesting;
  level = (int) D.22299;
  D.22300 = h->block_num;
  fprintf (fp, "subgraph cluster_%d {\n", D.22300);
  D.22300 = h->block_num;
  fprintf (fp, "label=\"loop_%d\"\n", D.22300);
  <D.22298>:
  D.22301 = cfg->bb_entry;
  bb = D.22301->next_bb;
  goto <D.22183>;
  <D.22182>:
  D.22302 = bb->region;
  if (D.22302 != 4294967295) goto <D.22303>; else goto <D.22304>;
  <D.22303>:
  D.22302 = bb->region;
  D.22305 = D.22302 & 240;
  switch (D.22305) <default: <D.22175>, case 16: <D.22172>, case 32: <D.22170>, case 64: <D.22173>, case 128: <D.22174>>
  <D.22170>:
  D.22306 = bb->block_num;
  fprintf (fp, "BB%d [color=blue];\n", D.22306);
  goto <D.22171>;
  <D.22172>:
  D.22306 = bb->block_num;
  fprintf (fp, "BB%d [color=green];\n", D.22306);
  goto <D.22171>;
  <D.22173>:
  <D.22174>:
  D.22306 = bb->block_num;
  fprintf (fp, "BB%d [color=yellow];\n", D.22306);
  goto <D.22171>;
  <D.22175>:
  goto <D.22171>;
  <D.22171>:
  <D.22304>:
  if (h == 0B) goto <D.22307>; else goto <D.22309>;
  <D.22309>:
  D.22310 = h->loop_blocks;
  D.22311 = monoeg_g_list_find (D.22310, bb);
  if (D.22311 != 0B) goto <D.22312>; else goto <D.22308>;
  <D.22312>:
  if (bb != h) goto <D.22307>; else goto <D.22308>;
  <D.22307>:
  D.22313 = bb->nesting;
  D.22314 = (int) D.22313;
  if (D.22314 == level) goto <D.22315>; else goto <D.22316>;
  <D.22315>:
  j = 0;
  goto <D.22177>;
  <D.22176>:
  D.22317 = bb->in_bb;
  D.22318 = (long unsigned int) j;
  D.22319 = D.22318 * 8;
  D.22320 = D.22317 + D.22319;
  D.22321 = *D.22320;
  D.22322 = D.22321->block_num;
  D.22306 = bb->block_num;
  fprintf (fp, "BB%d -> BB%d;\n", D.22322, D.22306);
  j = j + 1;
  <D.22177>:
  D.22323 = bb->in_count;
  D.22324 = (int) D.22323;
  if (D.22324 > j) goto <D.22176>; else goto <D.22178>;
  <D.22178>:
  <D.22316>:
  D.22313 = bb->nesting;
  D.22314 = (int) D.22313;
  D.22325 = level + 1;
  if (D.22314 == D.22325) goto <D.22326>; else goto <D.22327>;
  <D.22326>:
  D.22328 = bb->loop_blocks;
  if (D.22328 != 0B) goto <D.22329>; else goto <D.22330>;
  <D.22329>:
  j = 0;
  goto <D.22180>;
  <D.22179>:
  D.22317 = bb->in_bb;
  D.22318 = (long unsigned int) j;
  D.22319 = D.22318 * 8;
  D.22320 = D.22317 + D.22319;
  D.22321 = *D.22320;
  D.22322 = D.22321->block_num;
  D.22306 = bb->block_num;
  fprintf (fp, "BB%d -> BB%d;\n", D.22322, D.22306);
  j = j + 1;
  <D.22180>:
  D.22323 = bb->in_count;
  D.22324 = (int) D.22323;
  if (D.22324 > j) goto <D.22179>; else goto <D.22181>;
  <D.22181>:
  cfg_emit_one_loop_level (cfg, fp, bb);
  <D.22330>:
  <D.22327>:
  <D.22308>:
  bb = bb->next_bb;
  <D.22183>:
  if (bb != 0B) goto <D.22182>; else goto <D.22184>;
  <D.22184>:
  if (h != 0B) goto <D.22331>; else goto <D.22332>;
  <D.22331>:
  fprintf (fp, "}\n");
  <D.22332>:
}


mono_draw_code_cfg (struct MonoCompile * cfg, struct FILE * fp)
{
  struct MonoMethod * D.22334;
  const char * D.22335;
  char * D.22336;
  char * D.22337;
  struct MonoBasicBlock * D.22338;
  struct MonoBasicBlock * D.22339;
  unsigned int D.22344;
  unsigned int D.22345;
  unsigned int D.22347;
  unsigned int D.22348;
  int D.22350;
  struct MonoBasicBlock * bb;

  D.22334 = cfg->method;
  D.22335 = D.22334->name;
  D.22336 = convert_name (D.22335);
  fprintf (fp, "digraph %s {\n", D.22336);
  fprintf (fp, "node [fontsize=12.0]\nedge [len=1,color=red]\n");
  D.22334 = cfg->method;
  D.22337 = mono_method_full_name (D.22334, 1);
  fprintf (fp, "label=\"CFG for %s\";\n", D.22337);
  fprintf (fp, "BB0 [shape=doublecircle];\n");
  fprintf (fp, "BB1 [color=red];\n");
  D.22338 = cfg->bb_entry;
  bb = D.22338->next_bb;
  goto <D.22205>;
  <D.22204>:
  {
    struct MonoInst * inst;
    const char * color;

    D.22339 = cfg->bb_exit;
    if (D.22339 == bb) goto <D.22340>; else goto <D.22341>;
    <D.22340>:
    // predicted unlikely by continue predictor.
    goto <D.22200>;
    <D.22341>:
    D.22344 = cfg->comp_done;
    D.22345 = D.22344 & 128;
    if (D.22345 != 0) goto <D.22346>; else goto <D.22342>;
    <D.22346>:
    D.22347 = bb->flags;
    D.22348 = D.22347 & 2;
    if (D.22348 != 0) goto <D.22349>; else goto <D.22342>;
    <D.22349>:
    color = "color=red,";
    goto <D.22343>;
    <D.22342>:
    color = "";
    <D.22343>:
    D.22350 = bb->block_num;
    D.22350 = bb->block_num;
    fprintf (fp, "BB%d [%sshape=record,labeljust=l,label=\"{BB%d|", D.22350, color, D.22350);
    inst = bb->code;
    goto <D.22202>;
    <D.22201>:
    fprintf (fp, "\\n");
    inst = inst->next;
    <D.22202>:
    if (inst != 0B) goto <D.22201>; else goto <D.22203>;
    <D.22203>:
    fprintf (fp, "}\"];\n");
  }
  <D.22200>:
  bb = bb->next_bb;
  <D.22205>:
  if (bb != 0B) goto <D.22204>; else goto <D.22206>;
  <D.22206>:
  cfg_emit_one_loop_level (cfg, fp, 0B);
  fprintf (fp, "}\n");
}


