mono_branch_optimize_exception_target (struct MonoCompile * cfg, struct MonoBasicBlock * bb, const char * exname)
{
  unsigned int D.21716;
  unsigned int D.21717;
  struct MonoInst * D.21720;
  unsigned int D.21723;
  unsigned int D.21725;
  struct MonoImage * D.21726;
  struct MonoExceptionClause * D.21727;
  unsigned int i.0;
  unsigned int D.21729;
  unsigned int D.21730;
  unsigned int D.21731;
  unsigned int D.21734;
  unsigned int D.21735;
  unsigned int D.21739;
  struct MonoClass * D.21741;
  int D.21743;
  struct MonoBasicBlock * * D.21745;
  unsigned int D.21746;
  unsigned int D.21747;
  struct MonoBasicBlock * * D.21748;
  unsigned int D.21751;
  unsigned int D.21752;
  struct MonoBasicBlock * D.21754;
  unsigned int D.21755;
  unsigned int D.21756;
  unsigned int D.21761;
  unsigned int D.21762;
  struct MonoMemPool * D.21765;
  int D.21766;
  int D.21767;
  const unsigned char * D.21768;
  void * D.21769;
  struct MonoBasicBlock * * D.21770;
  unsigned int D.21771;
  int D.21774;
  const char * D.21775;
  struct MonoMethod * D.21776;
  struct MonoClass * D.21777;
  const char * D.21778;
  const char * D.21779;
  <unnamed-unsigned:15> D.21780;
  int D.21781;
  struct MonoMethodHeader * header;
  struct MonoExceptionClause * clause;
  struct MonoClass * exclass;
  int i;

  header = cfg->header;
  D.21716 = cfg->opt;
  D.21717 = D.21716 & 1048576;
  if (D.21717 == 0) goto <D.21718>; else goto <D.21719>;
  <D.21718>:
  D.21720 = 0B;
  return D.21720;
  <D.21719>:
  D.21723 = bb->region;
  if (D.21723 == 4294967295) goto <D.21721>; else goto <D.21724>;
  <D.21724>:
  D.21723 = bb->region;
  D.21725 = D.21723 & 240;
  if (D.21725 != 0) goto <D.21721>; else goto <D.21722>;
  <D.21721>:
  D.21720 = 0B;
  return D.21720;
  <D.21722>:
  D.21726 = mono_get_corlib ();
  exclass = mono_class_from_name (D.21726, "System", exname);
  i = 0;
  goto <D.21479>;
  <D.21478>:
  D.21727 = header->clauses;
  i.0 = (unsigned int) i;
  D.21729 = i.0 * 24;
  clause = D.21727 + D.21729;
  D.21730 = clause->try_offset;
  D.21731 = bb->real_offset;
  if (D.21730 <= D.21731) goto <D.21732>; else goto <D.21733>;
  <D.21732>:
  D.21731 = bb->real_offset;
  D.21730 = clause->try_offset;
  D.21734 = clause->try_len;
  D.21735 = D.21730 + D.21734;
  if (D.21731 < D.21735) goto <D.21736>; else goto <D.21737>;
  <D.21736>:
  D.21739 = clause->flags;
  if (D.21739 == 0) goto <D.21740>; else goto <D.21738>;
  <D.21740>:
  D.21741 = clause->data.catch_class;
  if (D.21741 != 0B) goto <D.21742>; else goto <D.21738>;
  <D.21742>:
  D.21741 = clause->data.catch_class;
  D.21743 = mono_class_is_assignable_from (D.21741, exclass);
  if (D.21743 != 0) goto <D.21744>; else goto <D.21738>;
  <D.21744>:
  {
    struct MonoBasicBlock * tbb;

    D.21745 = cfg->cil_offset_to_bb;
    D.21746 = clause->handler_offset;
    D.21747 = D.21746 * 4;
    D.21748 = D.21745 + D.21747;
    tbb = *D.21748;
    if (tbb != 0B) goto <D.21750>; else goto <D.21749>;
    <D.21750>:
    D.21751 = BIT_FIELD_REF <*tbb, 32, 480>;
    D.21752 = D.21751 & 12;
    if (D.21752 == 4) goto <D.21753>; else goto <D.21749>;
    <D.21753>:
    {
      struct MonoBasicBlock * targetbb;
      gboolean unsafe;

      targetbb = tbb;
      unsafe = 0;
      goto <D.21476>;
      <D.21475>:
      D.21754 = tbb->next_bb;
      D.21755 = D.21754->flags;
      D.21756 = D.21755 & 8;
      if (D.21756 != 0) goto <D.21757>; else goto <D.21758>;
      <D.21757>:
      unsafe = 1;
      goto <D.21474>;
      <D.21758>:
      tbb = tbb->next_bb;
      <D.21476>:
      if (unsafe == 0) goto <D.21759>; else goto <D.21474>;
      <D.21759>:
      D.21754 = tbb->next_bb;
      if (D.21754 != 0B) goto <D.21760>; else goto <D.21474>;
      <D.21760>:
      D.21761 = tbb->region;
      D.21754 = tbb->next_bb;
      D.21762 = D.21754->region;
      if (D.21761 == D.21762) goto <D.21475>; else goto <D.21474>;
      <D.21474>:
      if (unsafe == 0) goto <D.21763>; else goto <D.21764>;
      <D.21763>:
      {
        struct MonoInst * jump;

        D.21765 = cfg->mempool;
        jump = mono_mempool_alloc0 (D.21765, 56);
        jump->opcode = 442;
        jump->dreg = -1;
        jump->sreg3 = -1;
        D.21766 = jump->sreg3;
        jump->sreg2 = D.21766;
        D.21767 = jump->sreg2;
        jump->sreg1 = D.21767;
        D.21768 = cfg->ip;
        jump->cil_code = D.21768;
        D.21765 = cfg->mempool;
        D.21769 = mono_mempool_alloc0 (D.21765, 56);
        jump->data.op[1].src = D.21769;
        D.21770 = jump->data.op[1].many_blocks;
        *D.21770 = targetbb;
        D.21771 = cfg->verbose_level;
        if (D.21771 > 2) goto <D.21772>; else goto <D.21773>;
        <D.21772>:
        D.21774 = targetbb->block_num;
        D.21741 = clause->data.catch_class;
        D.21775 = D.21741->name;
        D.21776 = cfg->method;
        D.21777 = D.21776->klass;
        D.21778 = D.21777->name;
        D.21776 = cfg->method;
        D.21779 = D.21776->name;
        monoeg_g_print ("found exception to optimize - returning branch to BB%d (%s) (instead of throw) for method %s:%s\n", D.21774, D.21775, D.21778, D.21779);
        <D.21773>:
        D.21720 = jump;
        return D.21720;
      }
      <D.21764>:
      D.21720 = 0B;
      return D.21720;
    }
    <D.21749>:
    D.21720 = 0B;
    return D.21720;
  }
  <D.21738>:
  D.21720 = 0B;
  return D.21720;
  <D.21737>:
  <D.21733>:
  i = i + 1;
  <D.21479>:
  D.21780 = header->num_clauses;
  D.21781 = (int) D.21780;
  if (D.21781 > i) goto <D.21478>; else goto <D.21480>;
  <D.21480>:
  D.21720 = 0B;
  return D.21720;
}


mono_replace_ins (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoInst * ins, struct MonoInst * * prev, struct MonoBasicBlock * first_bb, struct MonoBasicBlock * last_bb)
{
  short unsigned int D.21785;
  struct MonoInst * D.21788;
  struct MonoBasicBlock * * D.21791;
  struct MonoBasicBlock * D.21792;
  short int D.21793;
  struct MonoInst * D.21794;
  struct MonoInst * D.21797;
  struct MonoInst * D.21799;
  <unnamed-unsigned:1> D.21803;
  unsigned char D.21804;
  <unnamed-unsigned:1> D.21805;
  unsigned char D.21806;
  unsigned char D.21807;
  <unnamed-unsigned:1> D.21808;
  unsigned int D.21810;
  struct MonoInst * D.21811;
  <unnamed-unsigned:1> D.21819;
  unsigned char D.21820;
  unsigned char D.21821;
  <unnamed-unsigned:1> D.21822;
  struct MonoInst * D.21825;
  struct MonoBasicBlock * * D.21826;
  unsigned int i.1;
  unsigned int D.21828;
  struct MonoBasicBlock * * D.21829;
  struct MonoBasicBlock * D.21830;
  short int D.21831;
  int D.21832;
  struct MonoInst * D.21836;
  struct MonoBasicBlock * * D.21837;
  struct MonoBasicBlock * D.21838;
  struct MonoBasicBlock * * D.21839;
  int D.21840;
  struct MonoBasicBlock * D.21841;
  struct MonoBasicBlock * D.21842;
  struct MonoInst * next;

  next = ins->next;
  if (next != 0B) goto <D.21783>; else goto <D.21784>;
  <D.21783>:
  D.21785 = next->opcode;
  if (D.21785 == 316) goto <D.21786>; else goto <D.21787>;
  <D.21786>:
  D.21788 = next->next;
  ins->next = D.21788;
  next = next->next;
  <D.21787>:
  <D.21784>:
  if (first_bb == last_bb) goto <D.21789>; else goto <D.21790>;
  <D.21789>:
  goto <D.21501>;
  <D.21500>:
  D.21791 = first_bb->out_bb;
  D.21792 = *D.21791;
  mono_unlink_bblock (cfg, first_bb, D.21792);
  <D.21501>:
  D.21793 = first_bb->out_count;
  if (D.21793 != 0) goto <D.21500>; else goto <D.21502>;
  <D.21502>:
  D.21794 = *prev;
  if (D.21794 != 0B) goto <D.21795>; else goto <D.21796>;
  <D.21795>:
  D.21794 = *prev;
  D.21797 = first_bb->code;
  D.21794->next = D.21797;
  D.21797 = first_bb->code;
  D.21794 = *prev;
  D.21797->prev = D.21794;
  goto <D.21798>;
  <D.21796>:
  D.21797 = first_bb->code;
  bb->code = D.21797;
  <D.21798>:
  D.21799 = last_bb->last_ins;
  D.21799->next = next;
  if (next != 0B) goto <D.21800>; else goto <D.21801>;
  <D.21800>:
  D.21799 = last_bb->last_ins;
  next->prev = D.21799;
  goto <D.21802>;
  <D.21801>:
  D.21799 = last_bb->last_ins;
  bb->last_ins = D.21799;
  <D.21802>:
  D.21799 = last_bb->last_ins;
  *prev = D.21799;
  D.21803 = bb->has_array_access;
  D.21804 = (unsigned char) D.21803;
  D.21805 = first_bb->has_array_access;
  D.21806 = (unsigned char) D.21805;
  D.21807 = D.21804 | D.21806;
  D.21808 = (<unnamed-unsigned:1>) D.21807;
  bb->has_array_access = D.21808;
  goto <D.21809>;
  <D.21790>:
  {
    int i;
    int count;
    struct MonoBasicBlock * * tmp_bblocks;
    struct MonoBasicBlock * tmp;
    struct MonoInst * last;

    tmp = first_bb;
    goto <D.21509>;
    <D.21508>:
    D.21810 = bb->region;
    tmp->region = D.21810;
    tmp = tmp->next_bb;
    <D.21509>:
    if (tmp != 0B) goto <D.21508>; else goto <D.21510>;
    <D.21510>:
    D.21811 = ins->next;
    if (D.21811 != 0B) goto <D.21812>; else goto <D.21813>;
    <D.21812>:
    D.21811 = ins->next;
    D.21811->prev = 0B;
    <D.21813>:
    ins->next = 0B;
    bb->last_ins = ins;
    D.21799 = last_bb->last_ins;
    if (D.21799 != 0B) goto <D.21814>; else goto <D.21815>;
    <D.21814>:
    D.21799 = last_bb->last_ins;
    D.21799->next = next;
    if (next != 0B) goto <D.21816>; else goto <D.21817>;
    <D.21816>:
    D.21799 = last_bb->last_ins;
    next->prev = D.21799;
    <D.21817>:
    goto <D.21818>;
    <D.21815>:
    last_bb->code = next;
    <D.21818>:
    D.21819 = last_bb->has_array_access;
    D.21820 = (unsigned char) D.21819;
    D.21803 = bb->has_array_access;
    D.21804 = (unsigned char) D.21803;
    D.21821 = D.21820 | D.21804;
    D.21822 = (<unnamed-unsigned:1>) D.21821;
    last_bb->has_array_access = D.21822;
    if (next != 0B) goto <D.21823>; else goto <D.21824>;
    <D.21823>:
    last = next;
    goto <D.21512>;
    <D.21511>:
    last = last->next;
    <D.21512>:
    D.21825 = last->next;
    if (D.21825 != 0B) goto <D.21511>; else goto <D.21513>;
    <D.21513>:
    last_bb->last_ins = last;
    <D.21824>:
    i = 0;
    goto <D.21515>;
    <D.21514>:
    D.21826 = bb->out_bb;
    i.1 = (unsigned int) i;
    D.21828 = i.1 * 4;
    D.21829 = D.21826 + D.21828;
    D.21830 = *D.21829;
    mono_link_bblock (cfg, last_bb, D.21830);
    i = i + 1;
    <D.21515>:
    D.21831 = bb->out_count;
    D.21832 = (int) D.21831;
    if (D.21832 > i) goto <D.21514>; else goto <D.21516>;
    <D.21516>:
    D.21794 = *prev;
    if (D.21794 != 0B) goto <D.21833>; else goto <D.21834>;
    <D.21833>:
    D.21794 = *prev;
    D.21797 = first_bb->code;
    D.21794->next = D.21797;
    D.21797 = first_bb->code;
    D.21794 = *prev;
    D.21797->prev = D.21794;
    goto <D.21835>;
    <D.21834>:
    D.21797 = first_bb->code;
    bb->code = D.21797;
    <D.21835>:
    D.21836 = first_bb->last_ins;
    bb->last_ins = D.21836;
    D.21803 = bb->has_array_access;
    D.21804 = (unsigned char) D.21803;
    D.21805 = first_bb->has_array_access;
    D.21806 = (unsigned char) D.21805;
    D.21807 = D.21804 | D.21806;
    D.21808 = (<unnamed-unsigned:1>) D.21807;
    bb->has_array_access = D.21808;
    tmp_bblocks = bb->out_bb;
    D.21831 = bb->out_count;
    count = (int) D.21831;
    i = 0;
    goto <D.21518>;
    <D.21517>:
    i.1 = (unsigned int) i;
    D.21828 = i.1 * 4;
    D.21837 = tmp_bblocks + D.21828;
    D.21838 = *D.21837;
    mono_unlink_bblock (cfg, bb, D.21838);
    i = i + 1;
    <D.21518>:
    if (i < count) goto <D.21517>; else goto <D.21519>;
    <D.21519>:
    i = 0;
    goto <D.21522>;
    <D.21521>:
    {
      struct MonoBasicBlock * out_bb;

      D.21791 = first_bb->out_bb;
      i.1 = (unsigned int) i;
      D.21828 = i.1 * 4;
      D.21839 = D.21791 + D.21828;
      out_bb = *D.21839;
      mono_link_bblock (cfg, bb, out_bb);
    }
    i = i + 1;
    <D.21522>:
    D.21793 = first_bb->out_count;
    D.21840 = (int) D.21793;
    if (D.21840 > i) goto <D.21521>; else goto <D.21523>;
    <D.21523>:
    i = 0;
    goto <D.21526>;
    <D.21525>:
    {
      struct MonoBasicBlock * out_bb;

      D.21826 = bb->out_bb;
      i.1 = (unsigned int) i;
      D.21828 = i.1 * 4;
      D.21829 = D.21826 + D.21828;
      out_bb = *D.21829;
      mono_unlink_bblock (cfg, first_bb, out_bb);
    }
    i = i + 1;
    <D.21526>:
    D.21831 = bb->out_count;
    D.21832 = (int) D.21831;
    if (D.21832 > i) goto <D.21525>; else goto <D.21527>;
    <D.21527>:
    D.21841 = bb->next_bb;
    last_bb->next_bb = D.21841;
    D.21842 = first_bb->next_bb;
    bb->next_bb = D.21842;
    *prev = 0B;
  }
  <D.21809>:
}


mono_if_conversion (struct MonoCompile * cfg)
{

}


mono_nullify_basic_block (struct MonoBasicBlock * bb)
{
  struct MonoInst * D.21843;

  bb->in_count = 0;
  bb->out_count = 0;
  bb->in_bb = 0B;
  bb->out_bb = 0B;
  bb->next_bb = 0B;
  bb->last_ins = 0B;
  D.21843 = bb->last_ins;
  bb->code = D.21843;
  bb->cil_code = 0B;
}


mono_merge_basic_blocks (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoBasicBlock * bbn)
{
  <unnamed-unsigned:1> D.21844;
  unsigned char D.21845;
  <unnamed-unsigned:1> D.21846;
  unsigned char D.21847;
  unsigned char D.21848;
  <unnamed-unsigned:1> D.21849;
  <unnamed-unsigned:1> D.21850;
  unsigned char D.21851;
  <unnamed-unsigned:1> D.21852;
  unsigned char D.21853;
  unsigned char D.21854;
  <unnamed-unsigned:1> D.21855;
  struct MonoBasicBlock * * D.21856;
  unsigned int i.2;
  unsigned int D.21858;
  struct MonoBasicBlock * * D.21859;
  struct MonoBasicBlock * D.21860;
  short int D.21861;
  int D.21862;
  struct MonoBasicBlock * D.21863;
  unsigned int D.21864;
  unsigned int D.21865;
  short unsigned int D.21868;
  struct MonoBasicBlock * D.21871;
  _Bool D.21872;
  long int D.21873;
  long int D.21874;
  int D.21877;
  int D.21878;
  unsigned int D.21879;
  struct MonoInst * D.21887;
  struct MonoInst * D.21890;
  struct MonoJumpInfoBBTable * iftmp.3;
  struct MonoJumpInfoBBTable * iftmp.4;
  struct MonoJumpInfoBBTable * iftmp.5;
  struct MonoJumpInfoBBTable * iftmp.6;
  struct MonoBasicBlock * * D.21909;
  unsigned int i.7;
  unsigned int D.21911;
  struct MonoBasicBlock * * D.21912;
  struct MonoBasicBlock * D.21913;
  _Bool D.21916;
  long int D.21917;
  long int D.21918;
  int D.21921;
  struct MonoInst * D.21925;
  short unsigned int D.21927;
  short unsigned int D.21928;
  short unsigned int D.21930;
  short unsigned int D.21932;
  struct MonoBasicBlock * * D.21933;
  struct MonoBasicBlock * * D.21934;
  struct MonoBasicBlock * D.21935;
  _Bool D.21936;
  long int D.21937;
  long int D.21938;
  int D.21950;
  int D.21951;
  <unnamed-unsigned:1> D.21952;
  unsigned char D.21953;
  <unnamed-unsigned:1> D.21954;
  unsigned char D.21955;
  unsigned char D.21956;
  <unnamed-unsigned:1> D.21957;
  <unnamed-unsigned:1> D.21958;
  unsigned char D.21959;
  <unnamed-unsigned:1> D.21960;
  unsigned char D.21961;
  unsigned char D.21962;
  <unnamed-unsigned:1> D.21963;
  struct MonoInst * D.21966;
  struct MonoInst * D.21969;
  struct MonoBasicBlock * D.21972;
  struct MonoBasicBlock * D.21975;
  struct MonoBasicBlock * D.21977;
  short int D.21982;
  struct MonoBasicBlock * * D.21985;
  struct MonoBasicBlock * D.21986;
  struct MonoMemPool * D.22001;
  const unsigned char * D.22002;
  struct MonoInst * inst;
  struct MonoBasicBlock * prev_bb;
  int i;

  D.21844 = bb->has_array_access;
  D.21845 = (unsigned char) D.21844;
  D.21846 = bbn->has_array_access;
  D.21847 = (unsigned char) D.21846;
  D.21848 = D.21845 | D.21847;
  D.21849 = (<unnamed-unsigned:1>) D.21848;
  bb->has_array_access = D.21849;
  D.21850 = bb->extended;
  D.21851 = (unsigned char) D.21850;
  D.21852 = bbn->extended;
  D.21853 = (unsigned char) D.21852;
  D.21854 = D.21851 | D.21853;
  D.21855 = (<unnamed-unsigned:1>) D.21854;
  bb->extended = D.21855;
  mono_unlink_bblock (cfg, bb, bbn);
  i = 0;
  goto <D.21610>;
  <D.21609>:
  D.21856 = bbn->out_bb;
  i.2 = (unsigned int) i;
  D.21858 = i.2 * 4;
  D.21859 = D.21856 + D.21858;
  D.21860 = *D.21859;
  mono_link_bblock (cfg, bb, D.21860);
  i = i + 1;
  <D.21610>:
  D.21861 = bbn->out_count;
  D.21862 = (int) D.21861;
  if (D.21862 > i) goto <D.21609>; else goto <D.21611>;
  <D.21611>:
  goto <D.21613>;
  <D.21612>:
  D.21856 = bbn->out_bb;
  D.21863 = *D.21856;
  mono_unlink_bblock (cfg, bbn, D.21863);
  <D.21613>:
  D.21861 = bbn->out_count;
  if (D.21861 != 0) goto <D.21612>; else goto <D.21614>;
  <D.21614>:
  D.21864 = BIT_FIELD_REF <*bb, 32, 896>;
  D.21865 = D.21864 & 2097152;
  if (D.21865 != 0) goto <D.21866>; else goto <D.21867>;
  <D.21866>:
  inst = bb->code;
  goto <D.21616>;
  <D.21615>:
  D.21868 = inst->opcode;
  if (D.21868 == 735) goto <D.21869>; else goto <D.21870>;
  <D.21869>:
  D.21871 = inst->data.op[0].target_block;
  D.21872 = D.21871 != bbn;
  D.21873 = (long int) D.21872;
  D.21874 = __builtin_expect (D.21873, 0);
  if (D.21874 != 0) goto <D.21875>; else goto <D.21876>;
  <D.21875>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "branch-opts.c", 984, "inst->inst_target_bb == bbn");
  <D.21876>:
  inst->opcode = 316;
  inst->dreg = -1;
  inst->sreg3 = -1;
  D.21877 = inst->sreg3;
  inst->sreg2 = D.21877;
  D.21878 = inst->sreg2;
  inst->sreg1 = D.21878;
  <D.21870>:
  inst = inst->next;
  <D.21616>:
  if (inst != 0B) goto <D.21615>; else goto <D.21617>;
  <D.21617>:
  <D.21867>:
  D.21864 = BIT_FIELD_REF <*bb, 32, 896>;
  D.21879 = D.21864 & 1048576;
  if (D.21879 != 0) goto <D.21880>; else goto <D.21881>;
  <D.21880>:
  inst = bb->code;
  goto <D.21624>;
  <D.21623>:
  D.21868 = inst->opcode;
  if (D.21868 == 731) goto <D.21882>; else goto <D.21885>;
  <D.21885>:
  D.21868 = inst->opcode;
  if (D.21868 == 732) goto <D.21886>; else goto <D.21883>;
  <D.21886>:
  D.21887 = inst->data.op[1].src;
  if (D.21887 == 8B) goto <D.21882>; else goto <D.21883>;
  <D.21883>:
  D.21868 = inst->opcode;
  if (D.21868 == 370) goto <D.21882>; else goto <D.21888>;
  <D.21888>:
  D.21868 = inst->opcode;
  if (D.21868 == 734) goto <D.21889>; else goto <D.21884>;
  <D.21889>:
  D.21887 = inst->data.op[1].src;
  D.21890 = D.21887->data.op[1].src;
  if (D.21890 == 8B) goto <D.21882>; else goto <D.21884>;
  <D.21882>:
  {
    int i;
    struct MonoJumpInfoBBTable * table;

    D.21868 = inst->opcode;
    if (D.21868 == 731) goto <D.21892>; else goto <D.21893>;
    <D.21892>:
    iftmp.3 = inst->data.op[0].p;
    goto <D.21894>;
    <D.21893>:
    D.21868 = inst->opcode;
    if (D.21868 == 732) goto <D.21898>; else goto <D.21896>;
    <D.21898>:
    D.21887 = inst->data.op[1].src;
    if (D.21887 == 8B) goto <D.21899>; else goto <D.21896>;
    <D.21899>:
    iftmp.4 = inst->data.op[0].p;
    goto <D.21897>;
    <D.21896>:
    D.21868 = inst->opcode;
    if (D.21868 == 370) goto <D.21901>; else goto <D.21902>;
    <D.21901>:
    iftmp.5 = inst->data.op[0].p;
    goto <D.21903>;
    <D.21902>:
    D.21868 = inst->opcode;
    if (D.21868 == 734) goto <D.21907>; else goto <D.21905>;
    <D.21907>:
    D.21887 = inst->data.op[1].src;
    D.21890 = D.21887->data.op[1].src;
    if (D.21890 == 8B) goto <D.21908>; else goto <D.21905>;
    <D.21908>:
    D.21887 = inst->data.op[1].src;
    iftmp.6 = D.21887->data.op[0].p;
    goto <D.21906>;
    <D.21905>:
    iftmp.6 = 0B;
    <D.21906>:
    iftmp.5 = iftmp.6;
    <D.21903>:
    iftmp.4 = iftmp.5;
    <D.21897>:
    iftmp.3 = iftmp.4;
    <D.21894>:
    table = iftmp.3;
    i = 0;
    goto <D.21621>;
    <D.21620>:
    D.21909 = table->table;
    i.7 = (unsigned int) i;
    D.21911 = i.7 * 4;
    D.21912 = D.21909 + D.21911;
    D.21913 = *D.21912;
    if (D.21913 != 0B) goto <D.21914>; else goto <D.21915>;
    <D.21914>:
    D.21909 = table->table;
    i.7 = (unsigned int) i;
    D.21911 = i.7 * 4;
    D.21912 = D.21909 + D.21911;
    D.21913 = *D.21912;
    D.21916 = D.21913 != bbn;
    D.21917 = (long int) D.21916;
    D.21918 = __builtin_expect (D.21917, 0);
    if (D.21918 != 0) goto <D.21919>; else goto <D.21920>;
    <D.21919>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "branch-opts.c", 997, "table->table [i] == bbn");
    <D.21920>:
    <D.21915>:
    D.21909 = table->table;
    i.7 = (unsigned int) i;
    D.21911 = i.7 * 4;
    D.21912 = D.21909 + D.21911;
    *D.21912 = 0B;
    i = i + 1;
    <D.21621>:
    D.21921 = table->table_size;
    if (D.21921 > i) goto <D.21620>; else goto <D.21622>;
    <D.21622>:
  }
  <D.21884>:
  inst = inst->next;
  <D.21624>:
  if (inst != 0B) goto <D.21623>; else goto <D.21625>;
  <D.21625>:
  <D.21881>:
  D.21925 = bb->last_ins;
  if (D.21925 != 0B) goto <D.21926>; else goto <D.21922>;
  <D.21926>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21928 = D.21927 + 64985;
  if (D.21928 <= 9) goto <D.21923>; else goto <D.21929>;
  <D.21929>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21930 = D.21927 + 64878;
  if (D.21930 <= 9) goto <D.21923>; else goto <D.21931>;
  <D.21931>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21932 = D.21927 + 64888;
  if (D.21932 <= 9) goto <D.21923>; else goto <D.21922>;
  <D.21923>:
  D.21925 = bb->last_ins;
  D.21933 = D.21925->data.op[1].many_blocks;
  D.21934 = D.21933 + 4;
  D.21935 = *D.21934;
  D.21936 = D.21935 != bbn;
  D.21937 = (long int) D.21936;
  D.21938 = __builtin_expect (D.21937, 0);
  if (D.21938 != 0) goto <D.21939>; else goto <D.21940>;
  <D.21939>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "branch-opts.c", 1005, "bb->last_ins->inst_false_bb == bbn");
  <D.21940>:
  D.21925 = bb->last_ins;
  D.21933 = D.21925->data.op[1].many_blocks;
  D.21934 = D.21933 + 4;
  *D.21934 = 0B;
  bb->extended = 1;
  goto <D.21924>;
  <D.21922>:
  D.21925 = bb->last_ins;
  if (D.21925 != 0B) goto <D.21943>; else goto <D.21944>;
  <D.21943>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21928 = D.21927 + 64985;
  if (D.21928 <= 9) goto <D.21941>; else goto <D.21945>;
  <D.21945>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21930 = D.21927 + 64878;
  if (D.21930 <= 9) goto <D.21941>; else goto <D.21946>;
  <D.21946>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21932 = D.21927 + 64888;
  if (D.21932 <= 9) goto <D.21941>; else goto <D.21947>;
  <D.21947>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  if (D.21927 == 442) goto <D.21941>; else goto <D.21948>;
  <D.21948>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  if (D.21927 == 759) goto <D.21941>; else goto <D.21949>;
  <D.21949>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  if (D.21927 == 370) goto <D.21941>; else goto <D.21942>;
  <D.21941>:
  D.21925 = bb->last_ins;
  D.21925->opcode = 316;
  D.21925 = bb->last_ins;
  D.21925->dreg = -1;
  D.21925 = bb->last_ins;
  D.21925 = bb->last_ins;
  D.21925 = bb->last_ins;
  D.21925->sreg3 = -1;
  D.21950 = D.21925->sreg3;
  D.21925->sreg2 = D.21950;
  D.21951 = D.21925->sreg2;
  D.21925->sreg1 = D.21951;
  <D.21942>:
  <D.21944>:
  <D.21924>:
  D.21952 = bb->has_call_handler;
  D.21953 = (unsigned char) D.21952;
  D.21954 = bbn->has_call_handler;
  D.21955 = (unsigned char) D.21954;
  D.21956 = D.21953 | D.21955;
  D.21957 = (<unnamed-unsigned:1>) D.21956;
  bb->has_call_handler = D.21957;
  D.21958 = bb->has_jump_table;
  D.21959 = (unsigned char) D.21958;
  D.21960 = bbn->has_jump_table;
  D.21961 = (unsigned char) D.21960;
  D.21962 = D.21959 | D.21961;
  D.21963 = (<unnamed-unsigned:1>) D.21962;
  bb->has_jump_table = D.21963;
  D.21925 = bb->last_ins;
  if (D.21925 != 0B) goto <D.21964>; else goto <D.21965>;
  <D.21964>:
  D.21966 = bbn->code;
  if (D.21966 != 0B) goto <D.21967>; else goto <D.21968>;
  <D.21967>:
  D.21925 = bb->last_ins;
  D.21966 = bbn->code;
  D.21925->next = D.21966;
  D.21966 = bbn->code;
  D.21925 = bb->last_ins;
  D.21966->prev = D.21925;
  D.21969 = bbn->last_ins;
  bb->last_ins = D.21969;
  <D.21968>:
  goto <D.21970>;
  <D.21965>:
  D.21966 = bbn->code;
  bb->code = D.21966;
  D.21969 = bbn->last_ins;
  bb->last_ins = D.21969;
  <D.21970>:
  prev_bb = cfg->bb_entry;
  goto <D.21627>;
  <D.21626>:
  prev_bb = prev_bb->next_bb;
  <D.21627>:
  if (prev_bb != 0B) goto <D.21971>; else goto <D.21628>;
  <D.21971>:
  D.21972 = prev_bb->next_bb;
  if (D.21972 != bbn) goto <D.21626>; else goto <D.21628>;
  <D.21628>:
  if (prev_bb != 0B) goto <D.21973>; else goto <D.21974>;
  <D.21973>:
  D.21975 = bbn->next_bb;
  prev_bb->next_bb = D.21975;
  goto <D.21976>;
  <D.21974>:
  D.21977 = bb->next_bb;
  if (D.21977 == bbn) goto <D.21978>; else goto <D.21979>;
  <D.21978>:
  D.21975 = bbn->next_bb;
  bb->next_bb = D.21975;
  <D.21979>:
  <D.21976>:
  mono_nullify_basic_block (bbn);
  D.21925 = bb->last_ins;
  if (D.21925 != 0B) goto <D.21980>; else goto <D.21981>;
  <D.21980>:
  D.21982 = bb->out_count;
  if (D.21982 == 1) goto <D.21983>; else goto <D.21984>;
  <D.21983>:
  D.21985 = bb->out_bb;
  D.21986 = *D.21985;
  D.21977 = bb->next_bb;
  if (D.21986 != D.21977) goto <D.21987>; else goto <D.21988>;
  <D.21987>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21928 = D.21927 + 64985;
  if (D.21928 > 9) goto <D.21989>; else goto <D.21990>;
  <D.21989>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21930 = D.21927 + 64878;
  if (D.21930 > 9) goto <D.21991>; else goto <D.21992>;
  <D.21991>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  D.21932 = D.21927 + 64888;
  if (D.21932 > 9) goto <D.21993>; else goto <D.21994>;
  <D.21993>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  if (D.21927 != 442) goto <D.21995>; else goto <D.21996>;
  <D.21995>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  if (D.21927 != 759) goto <D.21997>; else goto <D.21998>;
  <D.21997>:
  D.21925 = bb->last_ins;
  D.21927 = D.21925->opcode;
  if (D.21927 != 370) goto <D.21999>; else goto <D.22000>;
  <D.21999>:
  D.22001 = cfg->mempool;
  inst = mono_mempool_alloc0 (D.22001, 56);
  inst->opcode = 442;
  inst->dreg = -1;
  inst->sreg3 = -1;
  D.21877 = inst->sreg3;
  inst->sreg2 = D.21877;
  D.21878 = inst->sreg2;
  inst->sreg1 = D.21878;
  D.22002 = cfg->ip;
  inst->cil_code = D.22002;
  D.21985 = bb->out_bb;
  D.21986 = *D.21985;
  inst->data.op[0].target_block = D.21986;
  D.21925 = bb->last_ins;
  if (D.21925 != 0B) goto <D.22003>; else goto <D.22004>;
  <D.22003>:
  D.21925 = bb->last_ins;
  D.21925->next = inst;
  D.21925 = bb->last_ins;
  inst->prev = D.21925;
  bb->last_ins = inst;
  goto <D.22005>;
  <D.22004>:
  bb->last_ins = inst;
  D.21925 = bb->last_ins;
  bb->code = D.21925;
  <D.22005>:
  <D.22000>:
  <D.21998>:
  <D.21996>:
  <D.21994>:
  <D.21992>:
  <D.21990>:
  <D.21988>:
  <D.21984>:
  <D.21981>:
}


mono_remove_bblock (struct MonoCompile * cfg, struct MonoBasicBlock * bb)
{
  struct MonoBasicBlock * D.22007;
  _Bool D.22008;
  long int D.22009;
  long int D.22010;
  struct MonoBasicBlock * D.22013;
  struct MonoBasicBlock * tmp_bb;

  tmp_bb = cfg->bb_entry;
  goto <D.21648>;
  <D.21647>:
  tmp_bb = tmp_bb->next_bb;
  <D.21648>:
  if (tmp_bb != 0B) goto <D.22006>; else goto <D.21649>;
  <D.22006>:
  D.22007 = tmp_bb->next_bb;
  if (D.22007 != bb) goto <D.21647>; else goto <D.21649>;
  <D.21649>:
  D.22008 = tmp_bb == 0B;
  D.22009 = (long int) D.22008;
  D.22010 = __builtin_expect (D.22009, 0);
  if (D.22010 != 0) goto <D.22011>; else goto <D.22012>;
  <D.22011>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "branch-opts.c", 1092, "tmp_bb");
  <D.22012>:
  D.22013 = bb->next_bb;
  tmp_bb->next_bb = D.22013;
}


mono_remove_critical_edges (struct MonoCompile * cfg)
{
  unsigned int D.22014;
  int D.22017;
  struct MonoBasicBlock * * D.22018;
  unsigned int i.8;
  unsigned int D.22020;
  struct MonoBasicBlock * * D.22021;
  struct MonoBasicBlock * D.22022;
  int D.22023;
  short int D.22024;
  int D.22025;
  struct MonoBasicBlock * * D.22026;
  struct MonoBasicBlock * * D.22027;
  struct MonoBasicBlock * D.22028;
  int D.22029;
  short int D.22030;
  int D.22031;
  struct MonoInst * D.22032;
  unsigned int in_bb_index.9;
  unsigned int D.22038;
  struct MonoBasicBlock * * D.22039;
  short int D.22042;
  struct MonoInst * D.22045;
  short unsigned int D.22047;
  struct MonoMemPool * D.22048;
  unsigned int D.22049;
  unsigned int D.22050;
  unsigned int D.22051;
  int D.22052;
  unsigned int D.22053;
  int D.22054;
  struct MonoBasicBlock * D.22057;
  struct MonoBasicBlock * * D.22060;
  unsigned int i.10;
  unsigned int D.22062;
  struct MonoBasicBlock * * D.22063;
  struct MonoBasicBlock * D.22064;
  int D.22067;
  int D.22068;
  const unsigned char * D.22069;
  struct MonoInst * D.22070;
  unsigned char * D.22074;
  short int D.22075;
  int D.22076;
  unsigned int D.22078;
  unsigned int D.22079;
  int D.22080;
  int D.22081;
  int D.22082;
  struct MonoInst * D.22083;
  unsigned char * D.22087;
  int D.22090;
  void * D.22091;
  struct MonoBasicBlock * * D.22092;
  void * D.22093;
  struct MonoBasicBlock * * D.22094;
  int D.22097;
  int D.22098;
  unsigned int i.11;
  unsigned int D.22102;
  struct MonoBasicBlock * * D.22103;
  struct MonoBasicBlock * D.22104;
  int D.22105;
  struct MonoBasicBlock * * D.22106;
  struct MonoBasicBlock * D.22107;
  int D.22108;
  struct MonoBasicBlock * bb;
  struct MonoBasicBlock * previous_bb;

  D.22014 = cfg->verbose_level;
  if (D.22014 > 3) goto <D.22015>; else goto <D.22016>;
  <D.22015>:
  bb = cfg->bb_entry;
  goto <D.21663>;
  <D.21662>:
  {
    int i;

    D.22017 = bb->block_num;
    printf ("remove_critical_edges, BEFORE BB%d (in:", D.22017);
    i = 0;
    goto <D.21657>;
    <D.21656>:
    D.22018 = bb->in_bb;
    i.8 = (unsigned int) i;
    D.22020 = i.8 * 4;
    D.22021 = D.22018 + D.22020;
    D.22022 = *D.22021;
    D.22023 = D.22022->block_num;
    printf (" %d", D.22023);
    i = i + 1;
    <D.21657>:
    D.22024 = bb->in_count;
    D.22025 = (int) D.22024;
    if (D.22025 > i) goto <D.21656>; else goto <D.21658>;
    <D.21658>:
    printf (") (out:");
    i = 0;
    goto <D.21660>;
    <D.21659>:
    D.22026 = bb->out_bb;
    i.8 = (unsigned int) i;
    D.22020 = i.8 * 4;
    D.22027 = D.22026 + D.22020;
    D.22028 = *D.22027;
    D.22029 = D.22028->block_num;
    printf (" %d", D.22029);
    i = i + 1;
    <D.21660>:
    D.22030 = bb->out_count;
    D.22031 = (int) D.22030;
    if (D.22031 > i) goto <D.21659>; else goto <D.21661>;
    <D.21661>:
    printf (")");
    D.22032 = bb->last_ins;
    if (D.22032 != 0B) goto <D.22033>; else goto <D.22034>;
    <D.22033>:
    printf (" ");
    D.22032 = bb->last_ins;
    mono_print_ins (D.22032);
    <D.22034>:
    printf ("\n");
  }
  bb = bb->next_bb;
  <D.21663>:
  if (bb != 0B) goto <D.21662>; else goto <D.21664>;
  <D.21664>:
  <D.22016>:
  previous_bb = cfg->bb_entry;
  bb = previous_bb->next_bb;
  goto <D.21679>;
  <D.21678>:
  D.22024 = bb->in_count;
  if (D.22024 > 1) goto <D.22035>; else goto <D.22036>;
  <D.22035>:
  {
    int in_bb_index;

    in_bb_index = 0;
    goto <D.21676>;
    <D.21675>:
    {
      struct MonoBasicBlock * in_bb;

      D.22018 = bb->in_bb;
      in_bb_index.9 = (unsigned int) in_bb_index;
      D.22038 = in_bb_index.9 * 4;
      D.22039 = D.22018 + D.22038;
      in_bb = *D.22039;
      D.22042 = in_bb->out_count;
      if (D.22042 > 1) goto <D.22040>; else goto <D.22043>;
      <D.22043>:
      D.22042 = in_bb->out_count;
      if (D.22042 == 1) goto <D.22044>; else goto <D.22041>;
      <D.22044>:
      D.22045 = in_bb->last_ins;
      if (D.22045 != 0B) goto <D.22046>; else goto <D.22041>;
      <D.22046>:
      D.22045 = in_bb->last_ins;
      D.22047 = D.22045->opcode;
      if (D.22047 == 759) goto <D.22040>; else goto <D.22041>;
      <D.22040>:
      {
        struct MonoBasicBlock * new_bb;

        D.22048 = cfg->mempool;
        new_bb = mono_mempool_alloc0 (D.22048, 172);
        D.22049 = cfg->num_bblocks;
        D.22050 = D.22049;
        D.22051 = D.22050 + 1;
        cfg->num_bblocks = D.22051;
        D.22052 = (int) D.22050;
        new_bb->block_num = D.22052;
        D.22053 = bb->region;
        new_bb->region = D.22053;
        D.22054 = mono_bb_is_fall_through (cfg, previous_bb);
        if (D.22054 != 0) goto <D.22055>; else goto <D.22056>;
        <D.22055>:
        D.22057 = cfg->bb_entry;
        if (D.22057 != previous_bb) goto <D.22058>; else goto <D.22059>;
        <D.22058>:
        {
          int i;

          i = 0;
          goto <D.21672>;
          <D.21671>:
          D.22060 = previous_bb->out_bb;
          i.10 = (unsigned int) i;
          D.22062 = i.10 * 4;
          D.22063 = D.22060 + D.22062;
          D.22064 = *D.22063;
          if (D.22064 == bb) goto <D.22065>; else goto <D.22066>;
          <D.22065>:
          {
            struct MonoInst * jump;

            D.22048 = cfg->mempool;
            jump = mono_mempool_alloc0 (D.22048, 56);
            jump->opcode = 442;
            jump->dreg = -1;
            jump->sreg3 = -1;
            D.22067 = jump->sreg3;
            jump->sreg2 = D.22067;
            D.22068 = jump->sreg2;
            jump->sreg1 = D.22068;
            D.22069 = cfg->ip;
            jump->cil_code = D.22069;
            D.22070 = previous_bb->last_ins;
            if (D.22070 != 0B) goto <D.22071>; else goto <D.22072>;
            <D.22071>:
            D.22070 = previous_bb->last_ins;
            D.22070->next = jump;
            D.22070 = previous_bb->last_ins;
            jump->prev = D.22070;
            previous_bb->last_ins = jump;
            goto <D.22073>;
            <D.22072>:
            previous_bb->last_ins = jump;
            D.22070 = previous_bb->last_ins;
            previous_bb->code = D.22070;
            <D.22073>:
            D.22074 = previous_bb->cil_code;
            jump->cil_code = D.22074;
            jump->data.op[0].target_block = bb;
            goto <D.21670>;
          }
          <D.22066>:
          i = i + 1;
          <D.21672>:
          D.22075 = previous_bb->out_count;
          D.22076 = (int) D.22075;
          if (D.22076 > i) goto <D.21671>; else goto <D.21670>;
          <D.21670>:
        }
        goto <D.22077>;
        <D.22059>:
        {
          struct MonoInst * jump;
          struct MonoBasicBlock * new_bb_after_entry;

          D.22048 = cfg->mempool;
          new_bb_after_entry = mono_mempool_alloc0 (D.22048, 172);
          D.22049 = cfg->num_bblocks;
          D.22078 = D.22049;
          D.22079 = D.22078 + 1;
          cfg->num_bblocks = D.22079;
          D.22080 = (int) D.22078;
          new_bb_after_entry->block_num = D.22080;
          D.22053 = bb->region;
          new_bb_after_entry->region = D.22053;
          D.22048 = cfg->mempool;
          jump = mono_mempool_alloc0 (D.22048, 56);
          jump->opcode = 442;
          jump->dreg = -1;
          jump->sreg3 = -1;
          D.22081 = jump->sreg3;
          jump->sreg2 = D.22081;
          D.22082 = jump->sreg2;
          jump->sreg1 = D.22082;
          D.22069 = cfg->ip;
          jump->cil_code = D.22069;
          D.22083 = new_bb_after_entry->last_ins;
          if (D.22083 != 0B) goto <D.22084>; else goto <D.22085>;
          <D.22084>:
          D.22083 = new_bb_after_entry->last_ins;
          D.22083->next = jump;
          D.22083 = new_bb_after_entry->last_ins;
          jump->prev = D.22083;
          new_bb_after_entry->last_ins = jump;
          goto <D.22086>;
          <D.22085>:
          new_bb_after_entry->last_ins = jump;
          D.22083 = new_bb_after_entry->last_ins;
          new_bb_after_entry->code = D.22083;
          <D.22086>:
          D.22087 = bb->cil_code;
          jump->cil_code = D.22087;
          jump->data.op[0].target_block = bb;
          mono_unlink_bblock (cfg, previous_bb, bb);
          mono_link_bblock (cfg, new_bb_after_entry, bb);
          mono_link_bblock (cfg, previous_bb, new_bb_after_entry);
          previous_bb->next_bb = new_bb_after_entry;
          previous_bb = new_bb_after_entry;
          D.22014 = cfg->verbose_level;
          if (D.22014 > 2) goto <D.22088>; else goto <D.22089>;
          <D.22088>:
          D.22090 = new_bb_after_entry->block_num;
          D.22017 = bb->block_num;
          printf ("remove_critical_edges, added helper BB%d jumping to BB%d\n", D.22090, D.22017);
          <D.22089>:
        }
        <D.22077>:
        <D.22056>:
        previous_bb->next_bb = new_bb;
        new_bb->next_bb = bb;
        previous_bb = new_bb;
        D.22048 = cfg->mempool;
        D.22091 = mono_mempool_alloc (D.22048, 4);
        new_bb->in_bb = D.22091;
        D.22092 = new_bb->in_bb;
        *D.22092 = in_bb;
        new_bb->in_count = 1;
        D.22048 = cfg->mempool;
        D.22093 = mono_mempool_alloc (D.22048, 4);
        new_bb->out_bb = D.22093;
        D.22094 = new_bb->out_bb;
        *D.22094 = bb;
        new_bb->out_count = 1;
        replace_out_block (in_bb, bb, new_bb);
        replace_out_block_in_code (in_bb, bb, new_bb);
        replace_in_block (bb, in_bb, new_bb);
        D.22014 = cfg->verbose_level;
        if (D.22014 > 2) goto <D.22095>; else goto <D.22096>;
        <D.22095>:
        D.22097 = in_bb->block_num;
        D.22017 = bb->block_num;
        D.22098 = new_bb->block_num;
        printf ("remove_critical_edges, removed critical edge from BB%d to BB%d (added BB%d)\n", D.22097, D.22017, D.22098);
        <D.22096>:
      }
      <D.22041>:
    }
    in_bb_index = in_bb_index + 1;
    <D.21676>:
    D.22024 = bb->in_count;
    D.22025 = (int) D.22024;
    if (D.22025 > in_bb_index) goto <D.21675>; else goto <D.21677>;
    <D.21677>:
  }
  <D.22036>:
  previous_bb = previous_bb->next_bb;
  bb = bb->next_bb;
  <D.21679>:
  if (bb != 0B) goto <D.21678>; else goto <D.21680>;
  <D.21680>:
  D.22014 = cfg->verbose_level;
  if (D.22014 > 3) goto <D.22099>; else goto <D.22100>;
  <D.22099>:
  bb = cfg->bb_entry;
  goto <D.21689>;
  <D.21688>:
  {
    int i;

    D.22017 = bb->block_num;
    printf ("remove_critical_edges, AFTER BB%d (in:", D.22017);
    i = 0;
    goto <D.21683>;
    <D.21682>:
    D.22018 = bb->in_bb;
    i.11 = (unsigned int) i;
    D.22102 = i.11 * 4;
    D.22103 = D.22018 + D.22102;
    D.22104 = *D.22103;
    D.22105 = D.22104->block_num;
    printf (" %d", D.22105);
    i = i + 1;
    <D.21683>:
    D.22024 = bb->in_count;
    D.22025 = (int) D.22024;
    if (D.22025 > i) goto <D.21682>; else goto <D.21684>;
    <D.21684>:
    printf (") (out:");
    i = 0;
    goto <D.21686>;
    <D.21685>:
    D.22026 = bb->out_bb;
    i.11 = (unsigned int) i;
    D.22102 = i.11 * 4;
    D.22106 = D.22026 + D.22102;
    D.22107 = *D.22106;
    D.22108 = D.22107->block_num;
    printf (" %d", D.22108);
    i = i + 1;
    <D.21686>:
    D.22030 = bb->out_count;
    D.22031 = (int) D.22030;
    if (D.22031 > i) goto <D.21685>; else goto <D.21687>;
    <D.21687>:
    printf (")");
    D.22032 = bb->last_ins;
    if (D.22032 != 0B) goto <D.22109>; else goto <D.22110>;
    <D.22109>:
    printf (" ");
    D.22032 = bb->last_ins;
    mono_print_ins (D.22032);
    <D.22110>:
    printf ("\n");
  }
  bb = bb->next_bb;
  <D.21689>:
  if (bb != 0B) goto <D.21688>; else goto <D.21690>;
  <D.21690>:
  <D.22100>:
}


mono_bb_is_fall_through (struct MonoCompile * cfg, struct MonoBasicBlock * bb)
{
  gboolean D.22111;
  int iftmp.12;
  struct MonoBasicBlock * D.22116;
  unsigned int D.22118;
  unsigned int D.22119;
  struct MonoInst * D.22121;
  short unsigned int D.22123;
  short unsigned int D.22124;
  short unsigned int D.22126;
  short unsigned int D.22128;

  D.22116 = bb->next_bb;
  if (D.22116 != 0B) goto <D.22117>; else goto <D.22113>;
  <D.22117>:
  D.22116 = bb->next_bb;
  D.22118 = D.22116->region;
  D.22119 = bb->region;
  if (D.22118 == D.22119) goto <D.22120>; else goto <D.22113>;
  <D.22120>:
  D.22121 = bb->last_ins;
  if (D.22121 == 0B) goto <D.22114>; else goto <D.22122>;
  <D.22122>:
  D.22121 = bb->last_ins;
  D.22123 = D.22121->opcode;
  D.22124 = D.22123 + 64985;
  if (D.22124 > 9) goto <D.22125>; else goto <D.22113>;
  <D.22125>:
  D.22121 = bb->last_ins;
  D.22123 = D.22121->opcode;
  D.22126 = D.22123 + 64878;
  if (D.22126 > 9) goto <D.22127>; else goto <D.22113>;
  <D.22127>:
  D.22121 = bb->last_ins;
  D.22123 = D.22121->opcode;
  D.22128 = D.22123 + 64888;
  if (D.22128 > 9) goto <D.22129>; else goto <D.22113>;
  <D.22129>:
  D.22121 = bb->last_ins;
  D.22123 = D.22121->opcode;
  if (D.22123 != 442) goto <D.22130>; else goto <D.22113>;
  <D.22130>:
  D.22121 = bb->last_ins;
  D.22123 = D.22121->opcode;
  if (D.22123 != 759) goto <D.22131>; else goto <D.22113>;
  <D.22131>:
  D.22121 = bb->last_ins;
  D.22123 = D.22121->opcode;
  if (D.22123 != 370) goto <D.22114>; else goto <D.22113>;
  <D.22114>:
  iftmp.12 = 1;
  goto <D.22115>;
  <D.22113>:
  iftmp.12 = 0;
  <D.22115>:
  D.22111 = iftmp.12;
  return D.22111;
}


replace_out_block (struct MonoBasicBlock * bb, struct MonoBasicBlock * orig, struct MonoBasicBlock * repl)
{
  struct MonoBasicBlock * * D.22133;
  unsigned int i.13;
  unsigned int D.22135;
  struct MonoBasicBlock * * D.22136;
  short int D.22141;
  sizetype D.22144;
  sizetype D.22145;
  sizetype D.22146;
  struct MonoBasicBlock * * D.22147;
  struct MonoBasicBlock * D.22148;
  short int D.22149;
  unsigned short D.22150;
  unsigned short D.22151;
  short int D.22152;
  int D.22154;
  int i;

  i = 0;
  goto <D.21542>;
  <D.21541>:
  {
    struct MonoBasicBlock * ob;

    D.22133 = bb->out_bb;
    i.13 = (unsigned int) i;
    D.22135 = i.13 * 4;
    D.22136 = D.22133 + D.22135;
    ob = *D.22136;
    if (ob == orig) goto <D.22137>; else goto <D.22138>;
    <D.22137>:
    if (repl == 0B) goto <D.22139>; else goto <D.22140>;
    <D.22139>:
    D.22141 = bb->out_count;
    if (D.22141 > 1) goto <D.22142>; else goto <D.22143>;
    <D.22142>:
    D.22133 = bb->out_bb;
    i.13 = (unsigned int) i;
    D.22135 = i.13 * 4;
    D.22136 = D.22133 + D.22135;
    D.22133 = bb->out_bb;
    D.22141 = bb->out_count;
    D.22144 = (sizetype) D.22141;
    D.22145 = D.22144 + 1073741823;
    D.22146 = D.22145 * 4;
    D.22147 = D.22133 + D.22146;
    D.22148 = *D.22147;
    *D.22136 = D.22148;
    <D.22143>:
    D.22141 = bb->out_count;
    D.22149 = D.22141;
    D.22150 = (unsigned short) D.22149;
    D.22151 = D.22150 + 65535;
    D.22152 = (short int) D.22151;
    bb->out_count = D.22152;
    goto <D.22153>;
    <D.22140>:
    D.22133 = bb->out_bb;
    i.13 = (unsigned int) i;
    D.22135 = i.13 * 4;
    D.22136 = D.22133 + D.22135;
    *D.22136 = repl;
    <D.22153>:
    <D.22138>:
  }
  i = i + 1;
  <D.21542>:
  D.22141 = bb->out_count;
  D.22154 = (int) D.22141;
  if (D.22154 > i) goto <D.21541>; else goto <D.21543>;
  <D.21543>:
}


replace_out_block_in_code (struct MonoBasicBlock * bb, struct MonoBasicBlock * orig, struct MonoBasicBlock * repl)
{
  short unsigned int D.22155;
  int D.22156;
  struct MonoBasicBlock * D.22157;
  struct MonoClass * D.22162;
  struct MonoBasicBlock * * D.22163;
  unsigned int i.14;
  unsigned int D.22165;
  struct MonoBasicBlock * * D.22166;
  struct MonoBasicBlock * D.22167;
  short unsigned int D.22173;
  short unsigned int D.22175;
  short unsigned int D.22177;
  struct MonoBasicBlock * D.22178;
  struct MonoBasicBlock * * D.22181;
  struct MonoBasicBlock * D.22182;
  struct MonoInst * D.22190;
  struct MonoInst * D.22193;
  struct MonoJumpInfoBBTable * iftmp.15;
  struct MonoJumpInfoBBTable * iftmp.16;
  struct MonoJumpInfoBBTable * iftmp.17;
  struct MonoJumpInfoBBTable * iftmp.18;
  struct MonoBasicBlock * * D.22212;
  unsigned int i.19;
  unsigned int D.22214;
  struct MonoBasicBlock * * D.22215;
  struct MonoBasicBlock * D.22216;
  int D.22219;
  struct MonoInst * ins;

  ins = bb->code;
  goto <D.21576>;
  <D.21575>:
  D.22155 = ins->opcode;
  D.22156 = (int) D.22155;
  switch (D.22156) <default: <D.21569>, case 370: <D.21563>, case 442: <D.21560>, case 735: <D.21562>>
  <D.21560>:
  D.22157 = ins->data.op[0].target_block;
  if (D.22157 == orig) goto <D.22158>; else goto <D.22159>;
  <D.22158>:
  ins->data.op[0].target_block = repl;
  <D.22159>:
  goto <D.21561>;
  <D.21562>:
  D.22157 = ins->data.op[0].target_block;
  if (D.22157 == orig) goto <D.22160>; else goto <D.22161>;
  <D.22160>:
  ins->data.op[0].target_block = repl;
  <D.22161>:
  goto <D.21561>;
  <D.21563>:
  {
    int i;
    int n;

    D.22162 = ins->klass;
    n = (int) D.22162;
    i = 0;
    goto <D.21567>;
    <D.21566>:
    D.22163 = ins->data.op[1].many_blocks;
    i.14 = (unsigned int) i;
    D.22165 = i.14 * 4;
    D.22166 = D.22163 + D.22165;
    D.22167 = *D.22166;
    if (D.22167 == orig) goto <D.22168>; else goto <D.22169>;
    <D.22168>:
    D.22163 = ins->data.op[1].many_blocks;
    i.14 = (unsigned int) i;
    D.22165 = i.14 * 4;
    D.22166 = D.22163 + D.22165;
    *D.22166 = repl;
    <D.22169>:
    i = i + 1;
    <D.21567>:
    if (i < n) goto <D.21566>; else goto <D.21568>;
    <D.21568>:
    goto <D.21561>;
  }
  <D.21569>:
  D.22155 = ins->opcode;
  D.22173 = D.22155 + 64985;
  if (D.22173 <= 9) goto <D.22170>; else goto <D.22174>;
  <D.22174>:
  D.22155 = ins->opcode;
  D.22175 = D.22155 + 64878;
  if (D.22175 <= 9) goto <D.22170>; else goto <D.22176>;
  <D.22176>:
  D.22155 = ins->opcode;
  D.22177 = D.22155 + 64888;
  if (D.22177 <= 9) goto <D.22170>; else goto <D.22171>;
  <D.22170>:
  D.22163 = ins->data.op[1].many_blocks;
  D.22178 = *D.22163;
  if (D.22178 == orig) goto <D.22179>; else goto <D.22180>;
  <D.22179>:
  D.22163 = ins->data.op[1].many_blocks;
  *D.22163 = repl;
  <D.22180>:
  D.22163 = ins->data.op[1].many_blocks;
  D.22181 = D.22163 + 4;
  D.22182 = *D.22181;
  if (D.22182 == orig) goto <D.22183>; else goto <D.22184>;
  <D.22183>:
  D.22163 = ins->data.op[1].many_blocks;
  D.22181 = D.22163 + 4;
  *D.22181 = repl;
  <D.22184>:
  goto <D.22172>;
  <D.22171>:
  D.22155 = ins->opcode;
  if (D.22155 == 731) goto <D.22185>; else goto <D.22188>;
  <D.22188>:
  D.22155 = ins->opcode;
  if (D.22155 == 732) goto <D.22189>; else goto <D.22186>;
  <D.22189>:
  D.22190 = ins->data.op[1].src;
  if (D.22190 == 8B) goto <D.22185>; else goto <D.22186>;
  <D.22186>:
  D.22155 = ins->opcode;
  if (D.22155 == 370) goto <D.22185>; else goto <D.22191>;
  <D.22191>:
  D.22155 = ins->opcode;
  if (D.22155 == 734) goto <D.22192>; else goto <D.22187>;
  <D.22192>:
  D.22190 = ins->data.op[1].src;
  D.22193 = D.22190->data.op[1].src;
  if (D.22193 == 8B) goto <D.22185>; else goto <D.22187>;
  <D.22185>:
  {
    int i;
    struct MonoJumpInfoBBTable * table;

    D.22155 = ins->opcode;
    if (D.22155 == 731) goto <D.22195>; else goto <D.22196>;
    <D.22195>:
    iftmp.15 = ins->data.op[0].p;
    goto <D.22197>;
    <D.22196>:
    D.22155 = ins->opcode;
    if (D.22155 == 732) goto <D.22201>; else goto <D.22199>;
    <D.22201>:
    D.22190 = ins->data.op[1].src;
    if (D.22190 == 8B) goto <D.22202>; else goto <D.22199>;
    <D.22202>:
    iftmp.16 = ins->data.op[0].p;
    goto <D.22200>;
    <D.22199>:
    D.22155 = ins->opcode;
    if (D.22155 == 370) goto <D.22204>; else goto <D.22205>;
    <D.22204>:
    iftmp.17 = ins->data.op[0].p;
    goto <D.22206>;
    <D.22205>:
    D.22155 = ins->opcode;
    if (D.22155 == 734) goto <D.22210>; else goto <D.22208>;
    <D.22210>:
    D.22190 = ins->data.op[1].src;
    D.22193 = D.22190->data.op[1].src;
    if (D.22193 == 8B) goto <D.22211>; else goto <D.22208>;
    <D.22211>:
    D.22190 = ins->data.op[1].src;
    iftmp.18 = D.22190->data.op[0].p;
    goto <D.22209>;
    <D.22208>:
    iftmp.18 = 0B;
    <D.22209>:
    iftmp.17 = iftmp.18;
    <D.22206>:
    iftmp.16 = iftmp.17;
    <D.22200>:
    iftmp.15 = iftmp.16;
    <D.22197>:
    table = iftmp.15;
    i = 0;
    goto <D.21573>;
    <D.21572>:
    D.22212 = table->table;
    i.19 = (unsigned int) i;
    D.22214 = i.19 * 4;
    D.22215 = D.22212 + D.22214;
    D.22216 = *D.22215;
    if (D.22216 == orig) goto <D.22217>; else goto <D.22218>;
    <D.22217>:
    D.22212 = table->table;
    i.19 = (unsigned int) i;
    D.22214 = i.19 * 4;
    D.22215 = D.22212 + D.22214;
    *D.22215 = repl;
    <D.22218>:
    i = i + 1;
    <D.21573>:
    D.22219 = table->table_size;
    if (D.22219 > i) goto <D.21572>; else goto <D.21574>;
    <D.21574>:
  }
  <D.22187>:
  <D.22172>:
  goto <D.21561>;
  <D.21561>:
  ins = ins->next;
  <D.21576>:
  if (ins != 0B) goto <D.21575>; else goto <D.21577>;
  <D.21577>:
}


replace_in_block (struct MonoBasicBlock * bb, struct MonoBasicBlock * orig, struct MonoBasicBlock * repl)
{
  struct MonoBasicBlock * * D.22220;
  unsigned int i.20;
  unsigned int D.22222;
  struct MonoBasicBlock * * D.22223;
  short int D.22228;
  sizetype D.22231;
  sizetype D.22232;
  sizetype D.22233;
  struct MonoBasicBlock * * D.22234;
  struct MonoBasicBlock * D.22235;
  short int D.22236;
  unsigned short D.22237;
  unsigned short D.22238;
  short int D.22239;
  int D.22241;
  int i;

  i = 0;
  goto <D.21552>;
  <D.21551>:
  {
    struct MonoBasicBlock * ib;

    D.22220 = bb->in_bb;
    i.20 = (unsigned int) i;
    D.22222 = i.20 * 4;
    D.22223 = D.22220 + D.22222;
    ib = *D.22223;
    if (ib == orig) goto <D.22224>; else goto <D.22225>;
    <D.22224>:
    if (repl == 0B) goto <D.22226>; else goto <D.22227>;
    <D.22226>:
    D.22228 = bb->in_count;
    if (D.22228 > 1) goto <D.22229>; else goto <D.22230>;
    <D.22229>:
    D.22220 = bb->in_bb;
    i.20 = (unsigned int) i;
    D.22222 = i.20 * 4;
    D.22223 = D.22220 + D.22222;
    D.22220 = bb->in_bb;
    D.22228 = bb->in_count;
    D.22231 = (sizetype) D.22228;
    D.22232 = D.22231 + 1073741823;
    D.22233 = D.22232 * 4;
    D.22234 = D.22220 + D.22233;
    D.22235 = *D.22234;
    *D.22223 = D.22235;
    <D.22230>:
    D.22228 = bb->in_count;
    D.22236 = D.22228;
    D.22237 = (unsigned short) D.22236;
    D.22238 = D.22237 + 65535;
    D.22239 = (short int) D.22238;
    bb->in_count = D.22239;
    goto <D.22240>;
    <D.22227>:
    D.22220 = bb->in_bb;
    i.20 = (unsigned int) i;
    D.22222 = i.20 * 4;
    D.22223 = D.22220 + D.22222;
    *D.22223 = repl;
    <D.22240>:
    <D.22225>:
  }
  i = i + 1;
  <D.21552>:
  D.22228 = bb->in_count;
  D.22241 = (int) D.22228;
  if (D.22241 > i) goto <D.21551>; else goto <D.21553>;
  <D.21553>:
}


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

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


mono_optimize_branches (struct MonoCompile * cfg)
{
  unsigned int D.22244;
  struct MonoBasicBlock * D.22248;
  unsigned int D.22249;
  unsigned int D.22252;
  unsigned int D.22253;
  int D.22256;
  short int D.22261;
  struct MonoBasicBlock * D.22264;
  unsigned int D.22267;
  unsigned int D.22270;
  int D.22273;
  struct MonoBasicBlock * D.22274;
  struct MonoBasicBlock * * D.22275;
  unsigned int i.21;
  unsigned int D.22277;
  struct MonoBasicBlock * * D.22278;
  struct MonoBasicBlock * D.22279;
  short int D.22280;
  int D.22281;
  short int D.22282;
  struct MonoBasicBlock * * D.22285;
  struct MonoInst * D.22288;
  short unsigned int D.22291;
  short unsigned int D.22294;
  short unsigned int D.22296;
  short unsigned int D.22298;
  struct MonoBasicBlock * * D.22299;
  struct MonoBasicBlock * D.22300;
  int D.22303;
  int D.22304;
  struct MonoBasicBlock * D.22307;
  unsigned int D.22314;
  unsigned int D.22315;
  unsigned int D.22322;
  struct MonoInst * D.22347;
  short unsigned int D.22350;
  struct MonoBasicBlock * D.22353;
  unsigned int D.22356;
  int D.22361;
  struct MonoInst * D.22375;
  struct MonoInst * D.22377;
  unsigned char D.22378;
  unsigned char D.22379;
  int D.22380;
  int D.22381;
  int D.22385;
  int D.22408;
  struct MonoBasicBlock * * D.22409;
  struct MonoBasicBlock * D.22410;
  unsigned int D.22429;
  unsigned int D.22430;
  int D.22439;
  struct MonoBasicBlock * * D.22442;
  struct MonoBasicBlock * D.22443;
  _Bool D.22444;
  long int D.22445;
  long int D.22446;
  unsigned int D.22464;
  unsigned int D.22465;
  unsigned int D.22468;
  unsigned int D.22471;
  unsigned int D.22474;
  unsigned int D.22475;
  short unsigned int D.22476;
  int i;
  int changed;
  struct MonoBasicBlock * bb;
  struct MonoBasicBlock * bbn;
  guint32 niterations;

  changed = 0;
  D.22244 = cfg->num_bblocks;
  if (D.22244 > 1000) goto <D.22245>; else goto <D.22246>;
  <D.22245>:
  D.22244 = cfg->num_bblocks;
  niterations = D.22244 * 2;
  goto <D.22247>;
  <D.22246>:
  niterations = 1000;
  <D.22247>:
  <D.21713>:
  {
    struct MonoBasicBlock * previous_bb;

    changed = 0;
    niterations = niterations + 4294967295;
    previous_bb = cfg->bb_entry;
    D.22248 = cfg->bb_entry;
    bb = D.22248->next_bb;
    goto <D.21711>;
    <D.21710>:
    D.22249 = bb->region;
    if (D.22249 != 4294967295) goto <D.22250>; else goto <D.22251>;
    <D.22250>:
    // predicted unlikely by continue predictor.
    goto <D.21700>;
    <D.22251>:
    D.22252 = BIT_FIELD_REF <*bb, 32, 896>;
    D.22253 = D.22252 & 131072;
    if (D.22253 == 0) goto <D.22254>; else goto <D.22255>;
    <D.22254>:
    D.22256 = remove_block_if_useless (cfg, bb, previous_bb);
    if (D.22256 != 0) goto <D.22257>; else goto <D.22258>;
    <D.22257>:
    changed = 1;
    // predicted unlikely by continue predictor.
    goto <D.21700>;
    <D.22258>:
    <D.22255>:
    bbn = bb->next_bb;
    if (bbn != 0B) goto <D.22259>; else goto <D.22260>;
    <D.22259>:
    D.22261 = bbn->in_count;
    if (D.22261 == 0) goto <D.22262>; else goto <D.22263>;
    <D.22262>:
    D.22264 = cfg->bb_exit;
    if (D.22264 != bbn) goto <D.22265>; else goto <D.22266>;
    <D.22265>:
    D.22249 = bb->region;
    D.22267 = bbn->region;
    if (D.22249 == D.22267) goto <D.22268>; else goto <D.22269>;
    <D.22268>:
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22271>; else goto <D.22272>;
    <D.22271>:
    D.22273 = bbn->block_num;
    monoeg_g_print ("nullify block triggered %d\n", D.22273);
    <D.22272>:
    D.22274 = bbn->next_bb;
    bb->next_bb = D.22274;
    i = 0;
    goto <D.21702>;
    <D.21701>:
    D.22275 = bbn->out_bb;
    i.21 = (unsigned int) i;
    D.22277 = i.21 * 4;
    D.22278 = D.22275 + D.22277;
    D.22279 = *D.22278;
    replace_in_block (D.22279, bbn, 0B);
    i = i + 1;
    <D.21702>:
    D.22280 = bbn->out_count;
    D.22281 = (int) D.22280;
    if (D.22281 > i) goto <D.21701>; else goto <D.21703>;
    <D.21703>:
    mono_nullify_basic_block (bbn);
    changed = 1;
    <D.22269>:
    <D.22266>:
    <D.22263>:
    <D.22260>:
    D.22282 = bb->out_count;
    if (D.22282 == 1) goto <D.22283>; else goto <D.22284>;
    <D.22283>:
    D.22285 = bb->out_bb;
    bbn = *D.22285;
    D.22288 = bb->last_ins;
    if (D.22288 != 0B) goto <D.22289>; else goto <D.22290>;
    <D.22289>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    if (D.22291 != 442) goto <D.22292>; else goto <D.22293>;
    <D.22292>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22294 = D.22291 + 64985;
    if (D.22294 <= 9) goto <D.22286>; else goto <D.22295>;
    <D.22295>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22296 = D.22291 + 64878;
    if (D.22296 <= 9) goto <D.22286>; else goto <D.22297>;
    <D.22297>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22298 = D.22291 + 64888;
    if (D.22298 <= 9) goto <D.22286>; else goto <D.22287>;
    <D.22286>:
    D.22288 = bb->last_ins;
    D.22288->opcode = 442;
    D.22288 = bb->last_ins;
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22300 = *D.22299;
    D.22288->data.op[0].target_block = D.22300;
    changed = 1;
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22301>; else goto <D.22302>;
    <D.22301>:
    D.22303 = bb->block_num;
    D.22282 = bb->out_count;
    D.22304 = (int) D.22282;
    monoeg_g_print ("cond branch removal triggered in %d %d\n", D.22303, D.22304);
    <D.22302>:
    <D.22287>:
    <D.22293>:
    <D.22290>:
    D.22249 = bb->region;
    D.22267 = bbn->region;
    if (D.22249 == D.22267) goto <D.22305>; else goto <D.22306>;
    <D.22305>:
    D.22307 = bb->next_bb;
    if (D.22307 == bbn) goto <D.22308>; else goto <D.22309>;
    <D.22308>:
    D.22288 = bb->last_ins;
    if (D.22288 != 0B) goto <D.22310>; else goto <D.22311>;
    <D.22310>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    if (D.22291 == 442) goto <D.22312>; else goto <D.22313>;
    <D.22312>:
    D.22314 = BIT_FIELD_REF <*bbn, 32, 896>;
    D.22315 = D.22314 & 65536;
    if (D.22315 == 0) goto <D.22316>; else goto <D.22317>;
    <D.22316>:
    D.22288 = bb->last_ins;
    D.22288->opcode = 316;
    changed = 1;
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22318>; else goto <D.22319>;
    <D.22318>:
    D.22303 = bb->block_num;
    D.22273 = bbn->block_num;
    monoeg_g_print ("br removal triggered %d -> %d\n", D.22303, D.22273);
    <D.22319>:
    <D.22317>:
    <D.22313>:
    <D.22311>:
    D.22261 = bbn->in_count;
    if (D.22261 == 1) goto <D.22320>; else goto <D.22321>;
    <D.22320>:
    D.22252 = BIT_FIELD_REF <*bb, 32, 896>;
    D.22322 = D.22252 & 524288;
    if (D.22322 == 0) goto <D.22323>; else goto <D.22324>;
    <D.22323>:
    D.22264 = cfg->bb_exit;
    if (D.22264 != bbn) goto <D.22325>; else goto <D.22326>;
    <D.22325>:
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22327>; else goto <D.22328>;
    <D.22327>:
    D.22303 = bb->block_num;
    D.22273 = bbn->block_num;
    monoeg_g_print ("block merge triggered %d -> %d\n", D.22303, D.22273);
    <D.22328>:
    mono_merge_basic_blocks (cfg, bb, bbn);
    changed = 1;
    // predicted unlikely by continue predictor.
    goto <D.21700>;
    <D.22326>:
    <D.22324>:
    <D.22321>:
    <D.22309>:
    <D.22306>:
    <D.22284>:
    bbn = bb->next_bb;
    if (bbn != 0B) goto <D.22329>; else goto <D.22330>;
    <D.22329>:
    D.22261 = bbn->in_count;
    if (D.22261 == 0) goto <D.22331>; else goto <D.22332>;
    <D.22331>:
    D.22264 = cfg->bb_exit;
    if (D.22264 != bbn) goto <D.22333>; else goto <D.22334>;
    <D.22333>:
    D.22249 = bb->region;
    D.22267 = bbn->region;
    if (D.22249 == D.22267) goto <D.22335>; else goto <D.22336>;
    <D.22335>:
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22337>; else goto <D.22338>;
    <D.22337>:
    D.22273 = bbn->block_num;
    monoeg_g_print ("nullify block triggered %d\n", D.22273);
    <D.22338>:
    D.22274 = bbn->next_bb;
    bb->next_bb = D.22274;
    i = 0;
    goto <D.21705>;
    <D.21704>:
    D.22275 = bbn->out_bb;
    i.21 = (unsigned int) i;
    D.22277 = i.21 * 4;
    D.22278 = D.22275 + D.22277;
    D.22279 = *D.22278;
    replace_in_block (D.22279, bbn, 0B);
    i = i + 1;
    <D.21705>:
    D.22280 = bbn->out_count;
    D.22281 = (int) D.22280;
    if (D.22281 > i) goto <D.21704>; else goto <D.21706>;
    <D.21706>:
    mono_nullify_basic_block (bbn);
    changed = 1;
    // predicted unlikely by continue predictor.
    goto <D.21700>;
    <D.22336>:
    <D.22334>:
    <D.22332>:
    <D.22330>:
    D.22282 = bb->out_count;
    if (D.22282 == 1) goto <D.22339>; else goto <D.22340>;
    <D.22339>:
    D.22285 = bb->out_bb;
    bbn = *D.22285;
    D.22288 = bb->last_ins;
    if (D.22288 != 0B) goto <D.22341>; else goto <D.22342>;
    <D.22341>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    if (D.22291 == 442) goto <D.22343>; else goto <D.22344>;
    <D.22343>:
    D.22288 = bb->last_ins;
    bbn = D.22288->data.op[0].target_block;
    D.22249 = bb->region;
    D.22267 = bbn->region;
    if (D.22249 == D.22267) goto <D.22345>; else goto <D.22346>;
    <D.22345>:
    D.22347 = bbn->code;
    if (D.22347 != 0B) goto <D.22348>; else goto <D.22349>;
    <D.22348>:
    D.22347 = bbn->code;
    D.22350 = D.22347->opcode;
    if (D.22350 == 442) goto <D.22351>; else goto <D.22352>;
    <D.22351>:
    D.22347 = bbn->code;
    D.22353 = D.22347->data.op[0].target_block;
    if (D.22353 != bbn) goto <D.22354>; else goto <D.22355>;
    <D.22354>:
    D.22347 = bbn->code;
    D.22353 = D.22347->data.op[0].target_block;
    D.22356 = D.22353->region;
    D.22249 = bb->region;
    if (D.22356 == D.22249) goto <D.22357>; else goto <D.22358>;
    <D.22357>:
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22359>; else goto <D.22360>;
    <D.22359>:
    D.22303 = bb->block_num;
    D.22273 = bbn->block_num;
    D.22347 = bbn->code;
    D.22353 = D.22347->data.op[0].target_block;
    D.22361 = D.22353->block_num;
    monoeg_g_print ("branch to branch triggered %d -> %d -> %d\n", D.22303, D.22273, D.22361);
    <D.22360>:
    replace_in_block (bbn, bb, 0B);
    D.22347 = bbn->code;
    D.22353 = D.22347->data.op[0].target_block;
    replace_out_block (bb, bbn, D.22353);
    D.22347 = bbn->code;
    D.22353 = D.22347->data.op[0].target_block;
    mono_link_bblock (cfg, bb, D.22353);
    D.22288 = bb->last_ins;
    D.22347 = bbn->code;
    D.22353 = D.22347->data.op[0].target_block;
    D.22288->data.op[0].target_block = D.22353;
    changed = 1;
    // predicted unlikely by continue predictor.
    goto <D.21700>;
    <D.22358>:
    <D.22355>:
    <D.22352>:
    <D.22349>:
    <D.22346>:
    <D.22344>:
    <D.22342>:
    goto <D.22362>;
    <D.22340>:
    D.22282 = bb->out_count;
    if (D.22282 == 2) goto <D.22363>; else goto <D.22364>;
    <D.22363>:
    D.22288 = bb->last_ins;
    if (D.22288 != 0B) goto <D.22369>; else goto <D.22370>;
    <D.22369>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22294 = D.22291 + 64985;
    if (D.22294 <= 9) goto <D.22367>; else goto <D.22371>;
    <D.22371>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22296 = D.22291 + 64878;
    if (D.22296 <= 9) goto <D.22367>; else goto <D.22372>;
    <D.22372>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22298 = D.22291 + 64888;
    if (D.22298 <= 9) goto <D.22367>; else goto <D.22368>;
    <D.22367>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22296 = D.22291 + 64878;
    if (D.22296 > 9) goto <D.22373>; else goto <D.22374>;
    <D.22373>:
    D.22288 = bb->last_ins;
    D.22375 = D.22288->data.op[0].src;
    if (D.22375 == 0B) goto <D.22365>; else goto <D.22376>;
    <D.22376>:
    D.22288 = bb->last_ins;
    D.22375 = D.22288->data.op[0].src;
    D.22377 = D.22375->data.op[0].src;
    D.22378 = D.22377->type;
    if (D.22378 != 4) goto <D.22365>; else goto <D.22366>;
    <D.22365>:
    {
      int branch_result;
      struct MonoBasicBlock * taken_branch_target;
      struct MonoBasicBlock * untaken_branch_target;

      taken_branch_target = 0B;
      untaken_branch_target = 0B;
      D.22288 = bb->last_ins;
      D.22379 = D.22288->flags;
      D.22380 = (int) D.22379;
      D.22381 = D.22380 & 8;
      if (D.22381 != 0) goto <D.22382>; else goto <D.22383>;
      <D.22382>:
      branch_result = 1;
      goto <D.22384>;
      <D.22383>:
      D.22288 = bb->last_ins;
      D.22379 = D.22288->flags;
      D.22380 = (int) D.22379;
      D.22385 = D.22380 & 16;
      if (D.22385 != 0) goto <D.22386>; else goto <D.22387>;
      <D.22386>:
      branch_result = 0;
      goto <D.22388>;
      <D.22387>:
      branch_result = 2;
      <D.22388>:
      <D.22384>:
      if (branch_result == 1) goto <D.22389>; else goto <D.22390>;
      <D.22389>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      taken_branch_target = *D.22299;
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      untaken_branch_target = MEM[(struct MonoBasicBlock * *)D.22299 + 4B];
      goto <D.22391>;
      <D.22390>:
      if (branch_result == 0) goto <D.22392>; else goto <D.22393>;
      <D.22392>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      taken_branch_target = MEM[(struct MonoBasicBlock * *)D.22299 + 4B];
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      untaken_branch_target = *D.22299;
      <D.22393>:
      <D.22391>:
      if (taken_branch_target != 0B) goto <D.22394>; else goto <D.22395>;
      <D.22394>:
      D.22288 = bb->last_ins;
      D.22288->opcode = 442;
      D.22288 = bb->last_ins;
      D.22288->data.op[0].target_block = taken_branch_target;
      D.22252 = BIT_FIELD_REF <*bb, 32, 896>;
      D.22322 = D.22252 & 524288;
      if (D.22322 == 0) goto <D.22396>; else goto <D.22397>;
      <D.22396>:
      mono_unlink_bblock (cfg, bb, untaken_branch_target);
      <D.22397>:
      changed = 1;
      // predicted unlikely by continue predictor.
      goto <D.21700>;
      <D.22395>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      bbn = *D.22299;
      D.22249 = bb->region;
      D.22267 = bbn->region;
      if (D.22249 == D.22267) goto <D.22398>; else goto <D.22399>;
      <D.22398>:
      D.22347 = bbn->code;
      if (D.22347 != 0B) goto <D.22400>; else goto <D.22401>;
      <D.22400>:
      D.22347 = bbn->code;
      D.22350 = D.22347->opcode;
      if (D.22350 == 442) goto <D.22402>; else goto <D.22403>;
      <D.22402>:
      D.22347 = bbn->code;
      D.22353 = D.22347->data.op[0].target_block;
      D.22356 = D.22353->region;
      D.22249 = bb->region;
      if (D.22356 == D.22249) goto <D.22404>; else goto <D.22405>;
      <D.22404>:
      D.22270 = cfg->verbose_level;
      if (D.22270 > 2) goto <D.22406>; else goto <D.22407>;
      <D.22406>:
      D.22303 = bb->block_num;
      D.22273 = bbn->block_num;
      D.22347 = bbn->code;
      D.22353 = D.22347->data.op[0].target_block;
      D.22361 = D.22353->block_num;
      D.22347 = bbn->code;
      D.22350 = D.22347->opcode;
      D.22408 = (int) D.22350;
      monoeg_g_print ("cbranch1 to branch triggered %d -> (%d) %d (0x%02x)\n", D.22303, D.22273, D.22361, D.22408);
      <D.22407>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22300 = *D.22299;
      mono_unlink_bblock (cfg, bb, D.22300);
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22409 = D.22299 + 4;
      D.22410 = *D.22409;
      mono_unlink_bblock (cfg, bb, D.22410);
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22347 = bbn->code;
      D.22353 = D.22347->data.op[0].target_block;
      *D.22299 = D.22353;
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22300 = *D.22299;
      mono_link_bblock (cfg, bb, D.22300);
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22409 = D.22299 + 4;
      D.22410 = *D.22409;
      mono_link_bblock (cfg, bb, D.22410);
      changed = 1;
      // predicted unlikely by continue predictor.
      goto <D.21700>;
      <D.22405>:
      <D.22403>:
      <D.22401>:
      <D.22399>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      bbn = MEM[(struct MonoBasicBlock * *)D.22299 + 4B];
      if (bbn != 0B) goto <D.22411>; else goto <D.22412>;
      <D.22411>:
      D.22249 = bb->region;
      D.22267 = bbn->region;
      if (D.22249 == D.22267) goto <D.22413>; else goto <D.22414>;
      <D.22413>:
      D.22347 = bbn->code;
      if (D.22347 != 0B) goto <D.22415>; else goto <D.22416>;
      <D.22415>:
      D.22347 = bbn->code;
      D.22350 = D.22347->opcode;
      if (D.22350 == 442) goto <D.22417>; else goto <D.22418>;
      <D.22417>:
      D.22347 = bbn->code;
      D.22353 = D.22347->data.op[0].target_block;
      D.22356 = D.22353->region;
      D.22249 = bb->region;
      if (D.22356 == D.22249) goto <D.22419>; else goto <D.22420>;
      <D.22419>:
      D.22270 = cfg->verbose_level;
      if (D.22270 > 2) goto <D.22421>; else goto <D.22422>;
      <D.22421>:
      D.22303 = bb->block_num;
      D.22273 = bbn->block_num;
      D.22347 = bbn->code;
      D.22353 = D.22347->data.op[0].target_block;
      D.22361 = D.22353->block_num;
      D.22347 = bbn->code;
      D.22350 = D.22347->opcode;
      D.22408 = (int) D.22350;
      monoeg_g_print ("cbranch2 to branch triggered %d -> (%d) %d (0x%02x)\n", D.22303, D.22273, D.22361, D.22408);
      <D.22422>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22300 = *D.22299;
      mono_unlink_bblock (cfg, bb, D.22300);
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22409 = D.22299 + 4;
      D.22410 = *D.22409;
      mono_unlink_bblock (cfg, bb, D.22410);
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22409 = D.22299 + 4;
      D.22347 = bbn->code;
      D.22353 = D.22347->data.op[0].target_block;
      *D.22409 = D.22353;
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22300 = *D.22299;
      mono_link_bblock (cfg, bb, D.22300);
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      D.22409 = D.22299 + 4;
      D.22410 = *D.22409;
      mono_link_bblock (cfg, bb, D.22410);
      changed = 1;
      // predicted unlikely by continue predictor.
      goto <D.21700>;
      <D.22420>:
      <D.22418>:
      <D.22416>:
      <D.22414>:
      <D.22412>:
      D.22288 = bb->last_ins;
      D.22299 = D.22288->data.op[1].many_blocks;
      bbn = MEM[(struct MonoBasicBlock * *)D.22299 + 4B];
      if (bbn != 0B) goto <D.22423>; else goto <D.22424>;
      <D.22423>:
      D.22249 = bb->region;
      D.22267 = bbn->region;
      if (D.22249 == D.22267) goto <D.22425>; else goto <D.22426>;
      <D.22425>:
      D.22261 = bbn->in_count;
      if (D.22261 == 1) goto <D.22427>; else goto <D.22428>;
      <D.22427>:
      D.22429 = BIT_FIELD_REF <*cfg, 32, 3392>;
      D.22430 = D.22429 & 8;
      if (D.22430 != 0) goto <D.22431>; else goto <D.22432>;
      <D.22431>:
      D.22264 = cfg->bb_exit;
      if (D.22264 != bbn) goto <D.22433>; else goto <D.22434>;
      <D.22433>:
      D.22252 = BIT_FIELD_REF <*bb, 32, 896>;
      D.22322 = D.22252 & 524288;
      if (D.22322 == 0) goto <D.22435>; else goto <D.22436>;
      <D.22435>:
      D.22314 = BIT_FIELD_REF <*bbn, 32, 896>;
      D.22315 = D.22314 & 65536;
      if (D.22315 == 0) goto <D.22437>; else goto <D.22438>;
      <D.22437>:
      D.22439 = mono_bblocks_linked (bbn, bb);
      if (D.22439 == 0) goto <D.22440>; else goto <D.22441>;
      <D.22440>:
      D.22442 = bbn->in_bb;
      D.22443 = *D.22442;
      D.22444 = D.22443 != bb;
      D.22445 = (long int) D.22444;
      D.22446 = __builtin_expect (D.22445, 0);
      if (D.22446 != 0) goto <D.22447>; else goto <D.22448>;
      <D.22447>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "branch-opts.c", 1432, "bbn->in_bb [0] == bb");
      <D.22448>:
      D.22270 = cfg->verbose_level;
      if (D.22270 > 2) goto <D.22449>; else goto <D.22450>;
      <D.22449>:
      D.22303 = bb->block_num;
      D.22273 = bbn->block_num;
      monoeg_g_print ("merge false branch target triggered BB%d -> BB%d\n", D.22303, D.22273);
      <D.22450>:
      mono_merge_basic_blocks (cfg, bb, bbn);
      changed = 1;
      // predicted unlikely by continue predictor.
      goto <D.21700>;
      <D.22441>:
      <D.22438>:
      <D.22436>:
      <D.22434>:
      <D.22432>:
      <D.22428>:
      <D.22426>:
      <D.22424>:
    }
    <D.22366>:
    <D.22374>:
    <D.22368>:
    <D.22370>:
    D.22288 = bb->last_ins;
    if (D.22288 != 0B) goto <D.22455>; else goto <D.22456>;
    <D.22455>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22294 = D.22291 + 64985;
    if (D.22294 <= 9) goto <D.22453>; else goto <D.22457>;
    <D.22457>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22296 = D.22291 + 64878;
    if (D.22296 <= 9) goto <D.22453>; else goto <D.22458>;
    <D.22458>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22298 = D.22291 + 64888;
    if (D.22298 <= 9) goto <D.22453>; else goto <D.22454>;
    <D.22453>:
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22296 = D.22291 + 64878;
    if (D.22296 > 9) goto <D.22459>; else goto <D.22460>;
    <D.22459>:
    D.22288 = bb->last_ins;
    D.22375 = D.22288->data.op[0].src;
    if (D.22375 == 0B) goto <D.22451>; else goto <D.22461>;
    <D.22461>:
    D.22288 = bb->last_ins;
    D.22375 = D.22288->data.op[0].src;
    D.22377 = D.22375->data.op[0].src;
    D.22378 = D.22377->type;
    if (D.22378 != 4) goto <D.22451>; else goto <D.22452>;
    <D.22451>:
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22409 = D.22299 + 4;
    D.22410 = *D.22409;
    if (D.22410 != 0B) goto <D.22462>; else goto <D.22463>;
    <D.22462>:
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22409 = D.22299 + 4;
    D.22410 = *D.22409;
    D.22464 = BIT_FIELD_REF <*D.22410, 32, 896>;
    D.22465 = D.22464 & 65536;
    if (D.22465 != 0) goto <D.22466>; else goto <D.22467>;
    <D.22466>:
    D.22249 = bb->region;
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22409 = D.22299 + 4;
    D.22410 = *D.22409;
    D.22468 = D.22410->region;
    if (D.22249 == D.22468) goto <D.22469>; else goto <D.22470>;
    <D.22469>:
    D.22429 = BIT_FIELD_REF <*cfg, 32, 3392>;
    D.22471 = D.22429 & 16777216;
    if (D.22471 == 0) goto <D.22472>; else goto <D.22473>;
    <D.22472>:
    D.22288 = bb->last_ins;
    D.22288 = bb->last_ins;
    D.22291 = D.22288->opcode;
    D.22474 = (unsigned int) D.22291;
    D.22475 = mono_reverse_branch_op (D.22474);
    D.22476 = (short unsigned int) D.22475;
    D.22288->opcode = D.22476;
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    bbn = MEM[(struct MonoBasicBlock * *)D.22299 + 4B];
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22409 = D.22299 + 4;
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22300 = *D.22299;
    *D.22409 = D.22300;
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    *D.22299 = bbn;
    D.22288 = bb->last_ins;
    D.22299 = D.22288->data.op[1].many_blocks;
    D.22300 = *D.22299;
    move_basic_block_to_end (cfg, D.22300);
    D.22270 = cfg->verbose_level;
    if (D.22270 > 2) goto <D.22477>; else goto <D.22478>;
    <D.22477>:
    D.22303 = bb->block_num;
    monoeg_g_print ("cbranch to throw block triggered %d.\n", D.22303);
    <D.22478>:
    <D.22473>:
    <D.22470>:
    <D.22467>:
    <D.22463>:
    <D.22452>:
    <D.22460>:
    <D.22454>:
    <D.22456>:
    <D.22364>:
    <D.22362>:
    <D.21700>:
    previous_bb = bb;
    bb = bb->next_bb;
    <D.21711>:
    if (bb != 0B) goto <D.21710>; else goto <D.21712>;
    <D.21712>:
  }
  if (changed != 0) goto <D.22479>; else goto <D.21714>;
  <D.22479>:
  if (niterations != 0) goto <D.21713>; else goto <D.21714>;
  <D.21714>:
}


remove_block_if_useless (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoBasicBlock * previous_bb)
{
  unsigned int D.22480;
  gboolean D.22483;
  short unsigned int D.22484;
  int D.22485;
  short int D.22490;
  struct MonoBasicBlock * * D.22492;
  struct MonoBasicBlock * D.22493;
  struct MonoBasicBlock * D.22494;
  struct MonoInst * D.22496;
  short unsigned int D.22499;
  struct MonoBasicBlock * D.22502;
  unsigned int D.22507;
  unsigned int D.22508;
  unsigned int D.22514;
  int D.22517;
  struct MonoBasicBlock * * D.22518;
  short int D.22519;
  int D.22522;
  struct MonoBasicBlock * * D.22525;
  unsigned int i.22;
  unsigned int D.22527;
  struct MonoBasicBlock * * D.22528;
  struct MonoBasicBlock * D.22529;
  struct MonoMemPool * D.22532;
  int D.22533;
  int D.22534;
  const unsigned char * D.22535;
  unsigned char * D.22539;
  short int D.22540;
  int D.22541;
  struct MonoBasicBlock * target_bb;
  struct MonoInst * inst;

  target_bb = 0B;
  D.22480 = bb->region;
  if (D.22480 != 4294967295) goto <D.22481>; else goto <D.22482>;
  <D.22481>:
  bb->not_useless = 1;
  D.22483 = 0;
  return D.22483;
  <D.22482>:
  inst = bb->code;
  goto <D.21590>;
  <D.21589>:
  D.22484 = inst->opcode;
  D.22485 = (int) D.22484;
  switch (D.22485) <default: <D.21588>, case 316: <D.21585>, case 442: <D.21587>>
  <D.21585>:
  goto <D.21586>;
  <D.21587>:
  target_bb = inst->data.op[0].target_block;
  goto <D.21586>;
  <D.21588>:
  bb->not_useless = 1;
  D.22483 = 0;
  return D.22483;
  <D.21586>:
  inst = inst->next;
  <D.21590>:
  if (inst != 0B) goto <D.21589>; else goto <D.21591>;
  <D.21591>:
  if (target_bb == 0B) goto <D.22486>; else goto <D.22487>;
  <D.22486>:
  D.22490 = bb->out_count;
  if (D.22490 == 1) goto <D.22491>; else goto <D.22488>;
  <D.22491>:
  D.22492 = bb->out_bb;
  D.22493 = *D.22492;
  D.22494 = bb->next_bb;
  if (D.22493 == D.22494) goto <D.22495>; else goto <D.22488>;
  <D.22495>:
  target_bb = bb->next_bb;
  goto <D.22489>;
  <D.22488>:
  D.22483 = 0;
  return D.22483;
  <D.22489>:
  <D.22487>:
  D.22496 = previous_bb->last_ins;
  if (D.22496 != 0B) goto <D.22497>; else goto <D.22498>;
  <D.22497>:
  D.22496 = previous_bb->last_ins;
  D.22499 = D.22496->opcode;
  if (D.22499 == 370) goto <D.22500>; else goto <D.22501>;
  <D.22500>:
  D.22483 = 0;
  return D.22483;
  <D.22501>:
  <D.22498>:
  D.22502 = cfg->bb_entry;
  if (D.22502 == previous_bb) goto <D.22503>; else goto <D.22504>;
  <D.22503>:
  D.22494 = bb->next_bb;
  if (D.22494 != target_bb) goto <D.22505>; else goto <D.22506>;
  <D.22505>:
  D.22483 = 0;
  return D.22483;
  <D.22506>:
  <D.22504>:
  D.22507 = previous_bb->region;
  D.22508 = D.22507 & 240;
  if (D.22508 == 0) goto <D.22509>; else goto <D.22510>;
  <D.22509>:
  D.22483 = 0;
  return D.22483;
  <D.22510>:
  if (target_bb != 0B) goto <D.22512>; else goto <D.22511>;
  <D.22512>:
  if (target_bb != bb) goto <D.22513>; else goto <D.22511>;
  <D.22513>:
  {
    int i;

    D.22514 = cfg->verbose_level;
    if (D.22514 > 1) goto <D.22515>; else goto <D.22516>;
    <D.22515>:
    D.22517 = bb->block_num;
    printf ("remove_block_if_useless, removed BB%d\n", D.22517);
    <D.22516>:
    goto <D.21595>;
    <D.21594>:
    {
      struct MonoBasicBlock * in_bb;

      D.22518 = bb->in_bb;
      in_bb = *D.22518;
      mono_unlink_bblock (cfg, in_bb, bb);
      mono_link_bblock (cfg, in_bb, target_bb);
      replace_out_block_in_code (in_bb, bb, target_bb);
    }
    <D.21595>:
    D.22519 = bb->in_count;
    if (D.22519 != 0) goto <D.21594>; else goto <D.21596>;
    <D.21596>:
    mono_unlink_bblock (cfg, bb, target_bb);
    D.22502 = cfg->bb_entry;
    if (D.22502 != previous_bb) goto <D.22520>; else goto <D.22521>;
    <D.22520>:
    D.22522 = mono_bb_is_fall_through (cfg, previous_bb);
    if (D.22522 != 0) goto <D.22523>; else goto <D.22524>;
    <D.22523>:
    i = 0;
    goto <D.21600>;
    <D.21599>:
    D.22525 = previous_bb->out_bb;
    i.22 = (unsigned int) i;
    D.22527 = i.22 * 4;
    D.22528 = D.22525 + D.22527;
    D.22529 = *D.22528;
    if (D.22529 == target_bb) goto <D.22530>; else goto <D.22531>;
    <D.22530>:
    {
      struct MonoInst * jump;

      D.22532 = cfg->mempool;
      jump = mono_mempool_alloc0 (D.22532, 56);
      jump->opcode = 442;
      jump->dreg = -1;
      jump->sreg3 = -1;
      D.22533 = jump->sreg3;
      jump->sreg2 = D.22533;
      D.22534 = jump->sreg2;
      jump->sreg1 = D.22534;
      D.22535 = cfg->ip;
      jump->cil_code = D.22535;
      D.22496 = previous_bb->last_ins;
      if (D.22496 != 0B) goto <D.22536>; else goto <D.22537>;
      <D.22536>:
      D.22496 = previous_bb->last_ins;
      D.22496->next = jump;
      D.22496 = previous_bb->last_ins;
      jump->prev = D.22496;
      previous_bb->last_ins = jump;
      goto <D.22538>;
      <D.22537>:
      previous_bb->last_ins = jump;
      D.22496 = previous_bb->last_ins;
      previous_bb->code = D.22496;
      <D.22538>:
      D.22539 = previous_bb->cil_code;
      jump->cil_code = D.22539;
      jump->data.op[0].target_block = target_bb;
      goto <D.21598>;
    }
    <D.22531>:
    i = i + 1;
    <D.21600>:
    D.22540 = previous_bb->out_count;
    D.22541 = (int) D.22540;
    if (D.22541 > i) goto <D.21599>; else goto <D.21598>;
    <D.21598>:
    <D.22524>:
    <D.22521>:
    D.22494 = bb->next_bb;
    previous_bb->next_bb = D.22494;
    mono_nullify_basic_block (bb);
    D.22483 = 1;
    return D.22483;
  }
  <D.22511>:
  D.22483 = 0;
  return D.22483;
}


move_basic_block_to_end (struct MonoCompile * cfg, struct MonoBasicBlock * bb)
{
  struct MonoBasicBlock * D.22544;
  struct MonoBasicBlock * D.22548;
  struct MonoInst * D.22553;
  short unsigned int D.22555;
  short unsigned int D.22559;
  short unsigned int D.22561;
  short unsigned int D.22563;
  struct MonoMemPool * D.22564;
  int D.22565;
  int D.22566;
  const unsigned char * D.22567;
  struct MonoBasicBlock * bbn;
  struct MonoBasicBlock * next;

  next = bb->next_bb;
  bbn = cfg->bb_entry;
  goto <D.21636>;
  <D.21635>:
  bbn = bbn->next_bb;
  <D.21636>:
  D.22544 = bbn->next_bb;
  if (D.22544 != 0B) goto <D.22545>; else goto <D.21637>;
  <D.22545>:
  D.22544 = bbn->next_bb;
  if (D.22544 != bb) goto <D.21635>; else goto <D.21637>;
  <D.21637>:
  D.22544 = bbn->next_bb;
  if (D.22544 != 0B) goto <D.22546>; else goto <D.22547>;
  <D.22546>:
  D.22548 = bb->next_bb;
  bbn->next_bb = D.22548;
  <D.22547>:
  bbn = cfg->bb_entry;
  goto <D.21639>;
  <D.21638>:
  bbn = bbn->next_bb;
  <D.21639>:
  D.22544 = bbn->next_bb;
  if (D.22544 != 0B) goto <D.21638>; else goto <D.21640>;
  <D.21640>:
  bbn->next_bb = bb;
  bb->next_bb = 0B;
  if (next != 0B) goto <D.22551>; else goto <D.22552>;
  <D.22551>:
  D.22553 = bb->last_ins;
  if (D.22553 == 0B) goto <D.22549>; else goto <D.22554>;
  <D.22554>:
  D.22553 = bb->last_ins;
  D.22555 = D.22553->opcode;
  if (D.22555 != 798) goto <D.22556>; else goto <D.22550>;
  <D.22556>:
  D.22553 = bb->last_ins;
  D.22555 = D.22553->opcode;
  if (D.22555 != 442) goto <D.22557>; else goto <D.22550>;
  <D.22557>:
  D.22553 = bb->last_ins;
  D.22555 = D.22553->opcode;
  if (D.22555 != 759) goto <D.22558>; else goto <D.22550>;
  <D.22558>:
  D.22553 = bb->last_ins;
  D.22555 = D.22553->opcode;
  D.22559 = D.22555 + 64985;
  if (D.22559 > 9) goto <D.22560>; else goto <D.22550>;
  <D.22560>:
  D.22553 = bb->last_ins;
  D.22555 = D.22553->opcode;
  D.22561 = D.22555 + 64878;
  if (D.22561 > 9) goto <D.22562>; else goto <D.22550>;
  <D.22562>:
  D.22553 = bb->last_ins;
  D.22555 = D.22553->opcode;
  D.22563 = D.22555 + 64888;
  if (D.22563 > 9) goto <D.22549>; else goto <D.22550>;
  <D.22549>:
  {
    struct MonoInst * ins;

    D.22564 = cfg->mempool;
    ins = mono_mempool_alloc0 (D.22564, 56);
    ins->opcode = 442;
    ins->dreg = -1;
    ins->sreg3 = -1;
    D.22565 = ins->sreg3;
    ins->sreg2 = D.22565;
    D.22566 = ins->sreg2;
    ins->sreg1 = D.22566;
    D.22567 = cfg->ip;
    ins->cil_code = D.22567;
    D.22553 = bb->last_ins;
    if (D.22553 != 0B) goto <D.22568>; else goto <D.22569>;
    <D.22568>:
    D.22553 = bb->last_ins;
    D.22553->next = ins;
    D.22553 = bb->last_ins;
    ins->prev = D.22553;
    bb->last_ins = ins;
    goto <D.22570>;
    <D.22569>:
    bb->last_ins = ins;
    D.22553 = bb->last_ins;
    bb->code = D.22553;
    <D.22570>:
    mono_link_bblock (cfg, bb, next);
    ins->data.op[0].target_block = next;
  }
  <D.22550>:
  <D.22552>:
}


