mono_perform_abc_removal (struct MonoCompile * cfg)
{
  unsigned int D.21823;
  int verbose_level.0;
  int verbose_level.1;
  struct MonoMethod * D.21828;
  char * D.21829;
  struct MonoMemPool * D.21830;
  unsigned int D.21831;
  unsigned int D.21832;
  void * D.21833;
  unsigned int D.21834;
  void * D.21835;
  unsigned int D.21836;
  void * D.21837;
  void * D.21838;
  MonoIntegerValueKind * D.21839;
  unsigned int i.2;
  unsigned int D.21841;
  MonoIntegerValueKind * D.21842;
  struct MonoSummarizedValueRelation * D.21843;
  unsigned int D.21844;
  struct MonoSummarizedValueRelation * D.21845;
  struct MonoInst * * D.21846;
  struct MonoInst * * D.21847;
  unsigned int i.3;
  int D.21851;
  short unsigned int D.21852;
  int D.21853;
  int D.21854;
  int D.21855;
  char D.21858;
  short unsigned int D.21860;
  struct MonoInst * iftmp.4;
  int D.21866;
  unsigned int D.21867;
  unsigned int D.21868;
  struct MonoInst * * D.21871;
  unsigned int D.21872;
  unsigned int D.21873;
  struct MonoInst * * D.21874;
  MonoIntegerValueKind * D.21878;
  struct MonoType * D.21879;
  <unnamed type> D.21880;
  unsigned int D.21881;
  struct MonoSummarizedValueRelation * D.21882;
  <unnamed type> D.21883;
  int D.21884;
  struct MonoSummarizedValueRelation * D.21887;
  int D.21890;
  struct MonoSummarizedValue * D.21897;
  <unnamed type> D.21898;
  unsigned int D.21901;
  unsigned int related_index.5;
  unsigned int D.21903;
  struct MonoSummarizedValueRelation * D.21904;
  int D.21905;
  int D.21906;
  unsigned int related_variable.6;
  unsigned int D.21908;
  struct MonoSummarizedValueRelation * D.21909;
  struct MonoSummarizedValueRelation * D.21910;
  struct MonoSummarizedValueRelation * D.21911;
  struct MonoSummarizedValue * D.21914;
  struct MonoBasicBlock * * D.21915;
  struct MonoBasicBlock * D.21916;
  struct MonoVariableRelationsEvaluationArea area;
  struct MonoBasicBlock * bb;
  int i;

  try
    {
      D.21823 = cfg->verbose_level;
      verbose_level.0 = (int) D.21823;
      verbose_level = verbose_level.0;
      verbose_level.1 = verbose_level;
      if (verbose_level.1 > 2) goto <D.21826>; else goto <D.21827>;
      <D.21826>:
      D.21828 = cfg->method;
      D.21829 = mono_method_full_name (D.21828, 1);
      printf ("\nRemoving array bound checks in %s\n", D.21829);
      <D.21827>:
      area.cfg = cfg;
      D.21830 = cfg->mempool;
      D.21831 = cfg->next_vreg;
      D.21832 = D.21831 * 48;
      D.21833 = mono_mempool_alloc (D.21830, D.21832);
      area.relations = D.21833;
      D.21830 = cfg->mempool;
      D.21831 = cfg->next_vreg;
      D.21834 = D.21831 * 28;
      D.21835 = mono_mempool_alloc (D.21830, D.21834);
      area.contexts = D.21835;
      D.21830 = cfg->mempool;
      D.21831 = cfg->next_vreg;
      D.21836 = D.21831 * 4;
      D.21837 = mono_mempool_alloc (D.21830, D.21836);
      area.variable_value_kind = D.21837;
      D.21830 = cfg->mempool;
      D.21831 = cfg->next_vreg;
      D.21836 = D.21831 * 4;
      D.21838 = mono_mempool_alloc (D.21830, D.21836);
      area.defs = D.21838;
      i = 0;
      goto <D.21802>;
      <D.21801>:
      D.21839 = area.variable_value_kind;
      i.2 = (unsigned int) i;
      D.21841 = i.2 * 4;
      D.21842 = D.21839 + D.21841;
      *D.21842 = 0;
      D.21843 = area.relations;
      i.2 = (unsigned int) i;
      D.21844 = i.2 * 24;
      D.21845 = D.21843 + D.21844;
      D.21845->relation = 1;
      D.21843 = area.relations;
      i.2 = (unsigned int) i;
      D.21844 = i.2 * 24;
      D.21845 = D.21843 + D.21844;
      D.21845->relation_is_static_definition = 1;
      D.21843 = area.relations;
      i.2 = (unsigned int) i;
      D.21844 = i.2 * 24;
      D.21845 = D.21843 + D.21844;
      D.21845->related_value.type = 0;
      D.21843 = area.relations;
      i.2 = (unsigned int) i;
      D.21844 = i.2 * 24;
      D.21845 = D.21843 + D.21844;
      D.21845->next = 0B;
      D.21846 = area.defs;
      i.2 = (unsigned int) i;
      D.21841 = i.2 * 4;
      D.21847 = D.21846 + D.21841;
      *D.21847 = 0B;
      i = i + 1;
      <D.21802>:
      i.3 = (unsigned int) i;
      D.21831 = cfg->next_vreg;
      if (i.3 < D.21831) goto <D.21801>; else goto <D.21803>;
      <D.21803>:
      bb = cfg->bb_entry;
      goto <D.21815>;
      <D.21814>:
      {
        struct MonoInst * ins;

        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.21849>; else goto <D.21850>;
        <D.21849>:
        D.21851 = bb->block_num;
        printf ("\nABCREM BLOCK %d:\n", D.21851);
        <D.21850>:
        ins = bb->code;
        goto <D.21812>;
        <D.21811>:
        {
          const char * spec;

          D.21852 = ins->opcode;
          D.21853 = (int) D.21852;
          D.21854 = D.21853 + -313;
          D.21855 = D.21854 * 4;
          spec = &ins_info[D.21855];
          D.21858 = *spec;
          if (D.21858 == 32) goto <D.21856>; else goto <D.21859>;
          <D.21859>:
          D.21852 = ins->opcode;
          D.21860 = D.21852 + 65162;
          if (D.21860 <= 13) goto <D.21856>; else goto <D.21857>;
          <D.21856>:
          // predicted unlikely by continue predictor.
          goto <D.21806>;
          <D.21857>:
          D.21858 = *spec;
          if (D.21858 == 105) goto <D.21861>; else goto <D.21862>;
          <D.21861>:
          {
            MonoIntegerValueKind effective_value_kind;
            struct MonoRelationsEvaluationRange range;
            struct MonoSummarizedValueRelation * type_relation;
            struct MonoInst * var;

            try
              {
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.21863>; else goto <D.21864>;
                <D.21863>:
                mono_print_ins (ins);
                <D.21864>:
                D.21866 = ins->dreg;
                D.21867 = (unsigned int) D.21866;
                D.21868 = cfg->vreg_to_inst_len;
                if (D.21867 < D.21868) goto <D.21869>; else goto <D.21870>;
                <D.21869>:
                D.21871 = cfg->vreg_to_inst;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21873 = D.21872 * 4;
                D.21874 = D.21871 + D.21873;
                iftmp.4 = *D.21874;
                goto <D.21875>;
                <D.21870>:
                iftmp.4 = 0B;
                <D.21875>:
                var = iftmp.4;
                if (var != 0B) goto <D.21876>; else goto <D.21877>;
                <D.21876>:
                D.21839 = area.variable_value_kind;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21873 = D.21872 * 4;
                D.21878 = D.21839 + D.21873;
                D.21879 = var->data.op[1].vtype;
                D.21880 = type_to_value_kind (D.21879);
                *D.21878 = D.21880;
                <D.21877>:
                D.21843 = area.relations;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21881 = D.21872 * 24;
                D.21882 = D.21843 + D.21881;
                D.21839 = area.variable_value_kind;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21873 = D.21872 * 4;
                D.21878 = D.21839 + D.21873;
                D.21883 = *D.21878;
                effective_value_kind = get_relation_from_ins (&area, ins, D.21882, D.21883);
                range.lower = -2147483648;
                range.upper = 2147483647;
                D.21839 = area.variable_value_kind;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21873 = D.21872 * 4;
                D.21878 = D.21839 + D.21873;
                D.21883 = *D.21878;
                apply_value_kind_to_range (&range, D.21883);
                apply_value_kind_to_range (&range, effective_value_kind);
                D.21884 = range.upper;
                if (D.21884 != 2147483647) goto <D.21885>; else goto <D.21886>;
                <D.21885>:
                D.21830 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.21830, 24);
                type_relation->relation = 3;
                type_relation->related_value.type = 1;
                D.21884 = range.upper;
                type_relation->related_value.value.constant.value = D.21884;
                type_relation->relation_is_static_definition = 1;
                D.21843 = area.relations;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21881 = D.21872 * 24;
                D.21882 = D.21843 + D.21881;
                D.21887 = D.21882->next;
                type_relation->next = D.21887;
                D.21843 = area.relations;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21881 = D.21872 * 24;
                D.21882 = D.21843 + D.21881;
                D.21882->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.21888>; else goto <D.21889>;
                <D.21888>:
                D.21866 = ins->dreg;
                D.21884 = range.upper;
                printf ("[var%d <= %d]", D.21866, D.21884);
                <D.21889>:
                <D.21886>:
                D.21890 = range.lower;
                if (D.21890 != -2147483648) goto <D.21891>; else goto <D.21892>;
                <D.21891>:
                D.21830 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.21830, 24);
                type_relation->relation = 5;
                type_relation->related_value.type = 1;
                D.21890 = range.lower;
                type_relation->related_value.value.constant.value = D.21890;
                type_relation->relation_is_static_definition = 1;
                D.21843 = area.relations;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21881 = D.21872 * 24;
                D.21882 = D.21843 + D.21881;
                D.21887 = D.21882->next;
                type_relation->next = D.21887;
                D.21843 = area.relations;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21881 = D.21872 * 24;
                D.21882 = D.21843 + D.21881;
                D.21882->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.21893>; else goto <D.21894>;
                <D.21893>:
                D.21866 = ins->dreg;
                D.21890 = range.lower;
                printf ("[var%d >= %d]", D.21866, D.21890);
                <D.21894>:
                <D.21892>:
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.21895>; else goto <D.21896>;
                <D.21895>:
                D.21866 = ins->dreg;
                printf ("Summarized variable %d: ", D.21866);
                D.21843 = area.relations;
                D.21866 = ins->dreg;
                D.21872 = (unsigned int) D.21866;
                D.21881 = D.21872 * 24;
                D.21882 = D.21843 + D.21881;
                D.21897 = &D.21882->related_value;
                print_summarized_value (D.21897);
                printf ("\n");
                <D.21896>:
              }
            finally
              {
                range = {CLOBBER};
              }
          }
          <D.21862>:
        }
        <D.21806>:
        ins = ins->next;
        <D.21812>:
        if (ins != 0B) goto <D.21811>; else goto <D.21813>;
        <D.21813>:
      }
      bb = bb->next_bb;
      <D.21815>:
      if (bb != 0B) goto <D.21814>; else goto <D.21816>;
      <D.21816>:
      i = 0;
      goto <D.21820>;
      <D.21819>:
      D.21843 = area.relations;
      i.2 = (unsigned int) i;
      D.21844 = i.2 * 24;
      D.21845 = D.21843 + D.21844;
      D.21898 = D.21845->related_value.type;
      if (D.21898 == 2) goto <D.21899>; else goto <D.21900>;
      <D.21899>:
      {
        int related_index;
        int related_variable;

        D.21831 = cfg->next_vreg;
        i.3 = (unsigned int) i;
        D.21901 = D.21831 + i.3;
        related_index = (int) D.21901;
        D.21843 = area.relations;
        i.2 = (unsigned int) i;
        D.21844 = i.2 * 24;
        D.21845 = D.21843 + D.21844;
        related_variable = D.21845->related_value.value.variable.variable;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21904->relation = 1;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21904->relation_is_static_definition = 1;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21904->related_value.type = 2;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21904->related_value.value.variable.variable = i;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21843 = area.relations;
        i.2 = (unsigned int) i;
        D.21844 = i.2 * 24;
        D.21845 = D.21843 + D.21844;
        D.21905 = D.21845->related_value.value.variable.delta;
        D.21906 = -D.21905;
        D.21904->related_value.value.variable.delta = D.21906;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21843 = area.relations;
        related_variable.6 = (unsigned int) related_variable;
        D.21908 = related_variable.6 * 24;
        D.21909 = D.21843 + D.21908;
        D.21910 = D.21909->next;
        D.21904->next = D.21910;
        D.21843 = area.relations;
        related_variable.6 = (unsigned int) related_variable;
        D.21908 = related_variable.6 * 24;
        D.21909 = D.21843 + D.21908;
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21911 = D.21843 + D.21903;
        D.21909->next = D.21911;
        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.21912>; else goto <D.21913>;
        <D.21912>:
        printf ("Added symmetric summarized value for variable variable %d (to %d): ", i, related_variable);
        D.21843 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.21903 = related_index.5 * 24;
        D.21904 = D.21843 + D.21903;
        D.21914 = &D.21904->related_value;
        print_summarized_value (D.21914);
        printf ("\n");
        <D.21913>:
      }
      <D.21900>:
      i = i + 1;
      <D.21820>:
      i.3 = (unsigned int) i;
      D.21831 = cfg->next_vreg;
      if (i.3 < D.21831) goto <D.21819>; else goto <D.21821>;
      <D.21821>:
      D.21915 = cfg->bblocks;
      D.21916 = *D.21915;
      process_block (cfg, D.21916, &area);
    }
  finally
    {
      area = {CLOBBER};
    }
}


type_to_value_kind (struct MonoType * type)
{
  unsigned int D.21917;
  unsigned int D.21918;
  MonoIntegerValueKind D.21921;
  unsigned char D.21922;
  int D.21923;

  D.21917 = BIT_FIELD_REF <*type, 32, 32>;
  D.21918 = D.21917 & 1073741824;
  if (D.21918 != 0) goto <D.21919>; else goto <D.21920>;
  <D.21919>:
  D.21921 = 0;
  return D.21921;
  <D.21920>:
  D.21922 = type->type;
  D.21923 = (int) D.21922;
  switch (D.21923) <default: <D.21794>, case 4: <D.21784>, case 5: <D.21785>, case 6: <D.21786>, case 7: <D.21787>, case 8: <D.21788>, case 9: <D.21789>, case 10: <D.21792>, case 11: <D.21793>, case 24: <D.21790>, case 25: <D.21791>>
  <D.21784>:
  D.21921 = 1;
  return D.21921;
  <D.21785>:
  D.21921 = 17;
  return D.21921;
  <D.21786>:
  D.21921 = 2;
  return D.21921;
  <D.21787>:
  D.21921 = 18;
  return D.21921;
  <D.21788>:
  D.21921 = 4;
  return D.21921;
  <D.21789>:
  D.21921 = 20;
  return D.21921;
  <D.21790>:
  D.21921 = 4;
  return D.21921;
  <D.21791>:
  D.21921 = 20;
  return D.21921;
  <D.21792>:
  D.21921 = 8;
  return D.21921;
  <D.21793>:
  D.21921 = 24;
  return D.21921;
  <D.21794>:
  D.21921 = 0;
  return D.21921;
}


get_relation_from_ins (struct MonoVariableRelationsEvaluationArea * area, struct MonoInst * ins, struct MonoSummarizedValueRelation * result, MonoIntegerValueKind result_value_kind)
{
  unsigned char D.21925;
  short unsigned int D.21932;
  int D.21933;
  int D.21934;
  int D.21935;
  int * D.21936;
  int D.21937;
  int * D.21938;
  int D.21939;
  int D.21940;
  int D.21941;
  struct MonoInst * * D.21942;
  int D.21943;
  unsigned int D.21944;
  unsigned int D.21945;
  struct MonoInst * * D.21946;
  MonoIntegerValueKind D.21947;
  MonoIntegerValueKind value_kind;
  struct MonoSummarizedValue * value;

  value = &result->related_value;
  D.21925 = ins->type;
  if (D.21925 == 2) goto <D.21926>; else goto <D.21927>;
  <D.21926>:
  value_kind = 8;
  goto <D.21928>;
  <D.21927>:
  D.21925 = ins->type;
  if (D.21925 == 1) goto <D.21929>; else goto <D.21930>;
  <D.21929>:
  value_kind = 4;
  goto <D.21931>;
  <D.21930>:
  value_kind = 0;
  <D.21931>:
  <D.21928>:
  result->relation = 1;
  value->type = 0;
  D.21932 = ins->opcode;
  D.21933 = (int) D.21932;
  switch (D.21933) <default: <D.21607>, case 314: <D.21606>, case 319: <D.21600>, case 362: <D.21596>, case 424: <D.21598>, case 571: <D.21603>, case 625: <D.21601>, case 626: <D.21602>, case 762: <D.21599>, case 782: <D.21605>, case 783: <D.21604>>
  <D.21596>:
  value->type = 1;
  D.21934 = ins->data.op[0].const_val;
  value->value.constant.value = D.21934;
  goto <D.21597>;
  <D.21598>:
  value->type = 2;
  D.21935 = ins->sreg1;
  value->value.variable.variable = D.21935;
  value->value.variable.delta = 0;
  goto <D.21597>;
  <D.21599>:
  value->type = 2;
  D.21935 = ins->sreg1;
  value->value.variable.variable = D.21935;
  value->value.variable.delta = 0;
  value_kind = 8;
  goto <D.21597>;
  <D.21600>:
  value->type = 3;
  D.21936 = ins->data.op[1].phi_args;
  D.21937 = *D.21936;
  value->value.phi.number_of_alternatives = D.21937;
  D.21936 = ins->data.op[1].phi_args;
  D.21938 = D.21936 + 4;
  value->value.phi.phi_alternatives = D.21938;
  goto <D.21597>;
  <D.21601>:
  value->type = 2;
  D.21935 = ins->sreg1;
  value->value.variable.variable = D.21935;
  D.21939 = ins->data.op[1].const_val;
  value->value.variable.delta = D.21939;
  goto <D.21597>;
  <D.21602>:
  value->type = 2;
  D.21935 = ins->sreg1;
  value->value.variable.variable = D.21935;
  D.21939 = ins->data.op[1].const_val;
  D.21940 = -D.21939;
  value->value.variable.delta = D.21940;
  goto <D.21597>;
  <D.21603>:
  result->relation = 2;
  value->type = 2;
  D.21941 = ins->sreg2;
  value->value.variable.variable = D.21941;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.21597>;
  <D.21604>:
  value->type = 2;
  D.21935 = ins->sreg1;
  value->value.variable.variable = D.21935;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.21597>;
  <D.21605>:
  value->type = 2;
  D.21935 = ins->sreg1;
  value->value.variable.variable = D.21935;
  value->value.variable.delta = 0;
  D.21942 = area->defs;
  D.21943 = ins->dreg;
  D.21944 = (unsigned int) D.21943;
  D.21945 = D.21944 * 4;
  D.21946 = D.21942 + D.21945;
  *D.21946 = ins;
  goto <D.21597>;
  <D.21606>:
  result->relation = 4;
  value->type = 1;
  value->value.constant.value = 0;
  goto <D.21597>;
  <D.21607>:
  goto <D.21597>;
  <D.21597>:
  D.21947 = value_kind;
  return D.21947;
}


apply_value_kind_to_range (struct MonoRelationsEvaluationRange * range, MonoIntegerValueKind value_kind)
{
  unsigned int D.21952;
  int D.21955;
  unsigned int D.21958;
  int D.21961;

  if (value_kind != 0) goto <D.21950>; else goto <D.21951>;
  <D.21950>:
  D.21952 = value_kind & 16;
  if (D.21952 != 0) goto <D.21953>; else goto <D.21954>;
  <D.21953>:
  D.21955 = range->lower;
  if (D.21955 < 0) goto <D.21956>; else goto <D.21957>;
  <D.21956>:
  range->lower = 0;
  <D.21957>:
  D.21958 = value_kind & 15;
  if (D.21958 == 1) goto <D.21959>; else goto <D.21960>;
  <D.21959>:
  D.21961 = range->upper;
  if (D.21961 > 255) goto <D.21962>; else goto <D.21963>;
  <D.21962>:
  range->upper = 255;
  <D.21963>:
  goto <D.21964>;
  <D.21960>:
  D.21958 = value_kind & 15;
  if (D.21958 == 2) goto <D.21965>; else goto <D.21966>;
  <D.21965>:
  D.21961 = range->upper;
  if (D.21961 > 65535) goto <D.21967>; else goto <D.21968>;
  <D.21967>:
  range->upper = 65535;
  <D.21968>:
  <D.21966>:
  <D.21964>:
  goto <D.21969>;
  <D.21954>:
  D.21958 = value_kind & 15;
  if (D.21958 == 1) goto <D.21970>; else goto <D.21971>;
  <D.21970>:
  D.21955 = range->lower;
  if (D.21955 < -128) goto <D.21972>; else goto <D.21973>;
  <D.21972>:
  range->lower = -128;
  <D.21973>:
  D.21961 = range->upper;
  if (D.21961 > 127) goto <D.21974>; else goto <D.21975>;
  <D.21974>:
  range->upper = 127;
  <D.21975>:
  goto <D.21976>;
  <D.21971>:
  D.21958 = value_kind & 15;
  if (D.21958 == 2) goto <D.21977>; else goto <D.21978>;
  <D.21977>:
  D.21955 = range->lower;
  if (D.21955 < -32768) goto <D.21979>; else goto <D.21980>;
  <D.21979>:
  range->lower = -32768;
  <D.21980>:
  D.21961 = range->upper;
  if (D.21961 > 32767) goto <D.21981>; else goto <D.21982>;
  <D.21981>:
  range->upper = 32767;
  <D.21982>:
  <D.21978>:
  <D.21976>:
  <D.21969>:
  <D.21951>:
}


print_summarized_value (struct MonoSummarizedValue * value)
{
  <unnamed type> D.21983;
  int D.21984;
  int D.21985;
  int D.21986;
  int * D.21989;
  unsigned int phi.7;
  unsigned int D.21991;
  int * D.21992;
  int D.21993;
  int D.21994;

  D.21983 = value->type;
  switch (D.21983) <default: <D.21568>, case 0: <D.21559>, case 1: <D.21561>, case 2: <D.21562>, case 3: <D.21563>>
  <D.21559>:
  printf ("ANY");
  goto <D.21560>;
  <D.21561>:
  D.21984 = value->value.constant.value;
  printf ("CONSTANT %d", D.21984);
  goto <D.21560>;
  <D.21562>:
  D.21985 = value->value.variable.variable;
  D.21986 = value->value.variable.delta;
  printf ("VARIABLE %d, delta %d", D.21985, D.21986);
  goto <D.21560>;
  <D.21563>:
  {
    int phi;

    printf ("PHI (");
    phi = 0;
    goto <D.21566>;
    <D.21565>:
    if (phi != 0) goto <D.21987>; else goto <D.21988>;
    <D.21987>:
    printf (",");
    <D.21988>:
    D.21989 = value->value.phi.phi_alternatives;
    phi.7 = (unsigned int) phi;
    D.21991 = phi.7 * 4;
    D.21992 = D.21989 + D.21991;
    D.21993 = *D.21992;
    printf ("%d", D.21993);
    phi = phi + 1;
    <D.21566>:
    D.21994 = value->value.phi.number_of_alternatives;
    if (D.21994 > phi) goto <D.21565>; else goto <D.21567>;
    <D.21567>:
    printf (")");
    goto <D.21560>;
  }
  <D.21568>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 118);
  <D.21560>:
}


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

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


process_block (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoVariableRelationsEvaluationArea * area)
{
  int verbose_level.8;
  int D.22000;
  int D.22001;
  unsigned int D.22002;
  <unnamed type> D.22007;
  int D.22010;
  <unnamed type> D.22011;
  int D.22014;
  short unsigned int D.22017;
  struct MonoMemPool * D.22024;
  struct GSList * check_relations.9;
  struct GSList * check_relations.10;
  struct GSList * check_relations.11;
  int D.22030;
  int D.22031;
  int D.22036;
  int D.22037;
  short unsigned int D.22042;
  short unsigned int D.22046;
  struct MonoInst * * D.22050;
  unsigned int reg.12;
  unsigned int D.22052;
  struct MonoInst * * D.22053;
  struct MonoInst * D.22054;
  short unsigned int D.22057;
  unsigned char D.22062;
  unsigned char D.22063;
  void * D.22066;
  void * D.22067;
  int inst_index;
  struct MonoInst * ins;
  struct MonoAdditionalVariableRelationsForBB additional_relations;
  struct GSList * dominated_bb;
  struct GSList * l;
  struct GSList * check_relations;

  try
    {
      check_relations = 0B;
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.21998>; else goto <D.21999>;
      <D.21998>:
      D.22000 = bb->block_num;
      D.22001 = bb->dfn;
      printf ("\nProcessing block %d [dfn %d]...\n", D.22000, D.22001);
      <D.21999>:
      D.22002 = bb->region;
      if (D.22002 != 4294967295) goto <D.22003>; else goto <D.22004>;
      <D.22003>:
      return;
      <D.22004>:
      get_relations_from_previous_bb (area, bb, &additional_relations);
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22005>; else goto <D.22006>;
      <D.22005>:
      D.22007 = additional_relations.relation1.relation.relation;
      if (D.22007 != 7) goto <D.22008>; else goto <D.22009>;
      <D.22008>:
      D.22010 = additional_relations.relation1.variable;
      printf ("Adding relation 1 on variable %d: ", D.22010);
      print_summarized_value_relation (&additional_relations.relation1.relation);
      printf ("\n");
      <D.22009>:
      D.22011 = additional_relations.relation2.relation.relation;
      if (D.22011 != 7) goto <D.22012>; else goto <D.22013>;
      <D.22012>:
      D.22014 = additional_relations.relation2.variable;
      printf ("Adding relation 2 on variable %d: ", D.22014);
      print_summarized_value_relation (&additional_relations.relation2.relation);
      printf ("\n");
      <D.22013>:
      <D.22006>:
      apply_change_to_evaluation_area (area, &additional_relations.relation1);
      apply_change_to_evaluation_area (area, &additional_relations.relation2);
      inst_index = 0;
      ins = bb->code;
      goto <D.21773>;
      <D.21772>:
      {
        struct MonoAdditionalVariableRelation * rel;
        int array_var;
        int index_var;

        verbose_level.8 = verbose_level;
        if (verbose_level.8 > 2) goto <D.22015>; else goto <D.22016>;
        <D.22015>:
        printf ("Processing instruction %d\n", inst_index);
        inst_index = inst_index + 1;
        <D.22016>:
        D.22017 = ins->opcode;
        if (D.22017 == 784) goto <D.22018>; else goto <D.22019>;
        <D.22018>:
        verbose_level.8 = verbose_level;
        if (verbose_level.8 > 2) goto <D.22020>; else goto <D.22021>;
        <D.22020>:
        printf ("Attempting check removal...\n");
        <D.22021>:
        array_var = ins->sreg1;
        index_var = ins->sreg2;
        remove_abc_from_inst (ins, area);
        D.22017 = ins->opcode;
        if (D.22017 != 316) goto <D.22022>; else goto <D.22023>;
        <D.22022>:
        D.22024 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22024, 32);
        rel->variable = index_var;
        rel->relation.relation = 2;
        rel->relation.related_value.type = 2;
        rel->relation.related_value.value.variable.variable = array_var;
        rel->relation.related_value.value.variable.delta = 0;
        apply_change_to_evaluation_area (area, rel);
        D.22024 = cfg->mempool;
        check_relations.9 = check_relations;
        check_relations.10 = g_slist_append_mempool (D.22024, check_relations.9, rel);
        check_relations = check_relations.10;
        D.22024 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22024, 32);
        rel->variable = index_var;
        rel->relation.relation = 5;
        rel->relation.related_value.type = 1;
        rel->relation.related_value.value.constant.value = 0;
        apply_change_to_evaluation_area (area, rel);
        D.22024 = cfg->mempool;
        check_relations.9 = check_relations;
        check_relations.11 = g_slist_append_mempool (D.22024, check_relations.9, rel);
        check_relations = check_relations.11;
        <D.22023>:
        <D.22019>:
        D.22017 = ins->opcode;
        if (D.22017 == 340) goto <D.22028>; else goto <D.22029>;
        <D.22028>:
        D.22030 = ins->sreg1;
        D.22031 = eval_non_null (area, D.22030);
        if (D.22031 != 0) goto <D.22032>; else goto <D.22033>;
        <D.22032>:
        verbose_level.8 = verbose_level;
        if (verbose_level.8 > 1) goto <D.22034>; else goto <D.22035>;
        <D.22034>:
        printf ("ARRAY-ACCESS: removed check_this instruction.\n");
        <D.22035>:
        ins->opcode = 316;
        ins->dreg = -1;
        ins->sreg3 = -1;
        D.22036 = ins->sreg3;
        ins->sreg2 = D.22036;
        D.22037 = ins->sreg2;
        ins->sreg1 = D.22037;
        <D.22033>:
        <D.22029>:
        D.22017 = ins->opcode;
        if (D.22017 == 799) goto <D.22038>; else goto <D.22039>;
        <D.22038>:
        D.22030 = ins->sreg1;
        add_non_null (area, cfg, D.22030, &check_relations);
        <D.22039>:
        if (0 != 0) goto <D.22040>; else goto <D.22041>;
        <D.22040>:
        {
          int reg;

          D.22017 = ins->opcode;
          D.22042 = D.22017 + 65162;
          if (D.22042 <= 13) goto <D.22043>; else goto <D.22044>;
          <D.22043>:
          reg = ins->dreg;
          goto <D.22045>;
          <D.22044>:
          D.22017 = ins->opcode;
          D.22046 = D.22017 + 65148;
          if (D.22046 <= 11) goto <D.22047>; else goto <D.22048>;
          <D.22047>:
          reg = ins->sreg1;
          goto <D.22049>;
          <D.22048>:
          reg = ins->sreg1;
          <D.22049>:
          <D.22045>:
          D.22050 = area->defs;
          reg.12 = (unsigned int) reg;
          D.22052 = reg.12 * 4;
          D.22053 = D.22050 + D.22052;
          D.22054 = *D.22053;
          if (D.22054 != 0B) goto <D.22055>; else goto <D.22056>;
          <D.22055>:
          D.22050 = area->defs;
          reg.12 = (unsigned int) reg;
          D.22052 = reg.12 * 4;
          D.22053 = D.22050 + D.22052;
          D.22054 = *D.22053;
          D.22057 = D.22054->opcode;
          if (D.22057 == 782) goto <D.22058>; else goto <D.22059>;
          <D.22058>:
          verbose_level.8 = verbose_level;
          if (verbose_level.8 > 1) goto <D.22060>; else goto <D.22061>;
          <D.22060>:
          printf ("ARRAY-ACCESS: removed MONO_INST_FAULT flag.\n");
          <D.22061>:
          D.22062 = ins->flags;
          D.22063 = D.22062 & 223;
          ins->flags = D.22063;
          <D.22059>:
          <D.22056>:
        }
        <D.22041>:
      }
      ins = ins->next;
      <D.21773>:
      if (ins != 0B) goto <D.21772>; else goto <D.21774>;
      <D.21774>:
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22064>; else goto <D.22065>;
      <D.22064>:
      D.22000 = bb->block_num;
      D.22001 = bb->dfn;
      printf ("Processing block %d [dfn %d] done.\n", D.22000, D.22001);
      <D.22065>:
      dominated_bb = bb->dominated;
      goto <D.21776>;
      <D.21775>:
      D.22066 = dominated_bb->data;
      process_block (cfg, D.22066, area);
      dominated_bb = dominated_bb->next;
      <D.21776>:
      if (dominated_bb != 0B) goto <D.21775>; else goto <D.21777>;
      <D.21777>:
      l = check_relations;
      goto <D.21779>;
      <D.21778>:
      D.22067 = l->data;
      remove_change_from_evaluation_area (D.22067);
      l = l->next;
      <D.21779>:
      if (l != 0B) goto <D.21778>; else goto <D.21780>;
      <D.21780>:
      remove_change_from_evaluation_area (&additional_relations.relation1);
      remove_change_from_evaluation_area (&additional_relations.relation2);
    }
  finally
    {
      additional_relations = {CLOBBER};
      check_relations = {CLOBBER};
    }
}


get_relations_from_previous_bb (struct MonoVariableRelationsEvaluationArea * area, struct MonoBasicBlock * bb, struct MonoAdditionalVariableRelationsForBB * relations)
{
  short int D.22071;
  struct MonoBasicBlock * * D.22074;
  struct MonoInst * D.22077;
  struct MonoInst * D.22079;
  struct MonoInst * D.22080;
  struct MonoBasicBlock * * D.22083;
  struct MonoBasicBlock * D.22084;
  struct MonoBasicBlock * * D.22088;
  struct MonoBasicBlock * D.22089;
  unsigned int D.22095;
  unsigned int D.22096;
  unsigned int D.22097;
  unsigned int D.22098;
  unsigned int D.22099;
  unsigned int D.22100;
  unsigned int D.22101;
  short unsigned int D.22102;
  int D.22105;
  int D.22106;
  int D.22110;
  struct MonoBasicBlock * in_bb;
  struct MonoInst * ins;
  struct MonoInst * compare;
  struct MonoInst * branch;
  MonoValueRelation branch_relation;
  MonoValueRelation symmetric_relation;
  gboolean code_path;

  relations->relation1.relation.relation = 7;
  relations->relation1.relation.related_value.type = 0;
  relations->relation1.relation.next = 0B;
  relations->relation1.relation.relation_is_static_definition = 0;
  relations->relation1.relation.next = 0B;
  relations->relation1.insertion_point = 0B;
  relations->relation1.variable = -1;
  relations->relation2.relation.relation = 7;
  relations->relation2.relation.related_value.type = 0;
  relations->relation2.relation.next = 0B;
  relations->relation2.relation.relation_is_static_definition = 0;
  relations->relation2.relation.next = 0B;
  relations->relation2.insertion_point = 0B;
  relations->relation2.variable = -1;
  D.22071 = bb->in_count;
  if (D.22071 == 1) goto <D.22072>; else goto <D.22073>;
  <D.22072>:
  D.22074 = bb->in_bb;
  in_bb = *D.22074;
  D.22077 = in_bb->last_ins;
  if (D.22077 == 0B) goto <D.22075>; else goto <D.22078>;
  <D.22078>:
  D.22079 = in_bb->code;
  D.22077 = in_bb->last_ins;
  if (D.22079 == D.22077) goto <D.22075>; else goto <D.22076>;
  <D.22075>:
  return;
  <D.22076>:
  ins = in_bb->code;
  goto <D.21636>;
  <D.21635>:
  ins = ins->next;
  <D.21636>:
  D.22080 = ins->next;
  D.22077 = in_bb->last_ins;
  if (D.22080 != D.22077) goto <D.21635>; else goto <D.21637>;
  <D.21637>:
  compare = ins;
  branch = ins->next;
  branch_relation = get_relation_from_branch_instruction (branch);
  if (branch_relation != 7) goto <D.22081>; else goto <D.22082>;
  <D.22081>:
  D.22083 = branch->data.op[1].many_blocks;
  D.22084 = *D.22083;
  if (D.22084 == bb) goto <D.22085>; else goto <D.22086>;
  <D.22085>:
  code_path = 1;
  goto <D.22087>;
  <D.22086>:
  D.22083 = branch->data.op[1].many_blocks;
  D.22088 = D.22083 + 4;
  D.22089 = *D.22088;
  if (D.22089 == bb) goto <D.22090>; else goto <D.22091>;
  <D.22090>:
  code_path = 0;
  goto <D.22092>;
  <D.22091>:
  code_path = 1;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 475);
  <D.22092>:
  <D.22087>:
  if (code_path == 0) goto <D.22093>; else goto <D.22094>;
  <D.22093>:
  D.22095 = ~branch_relation;
  branch_relation = D.22095 & 7;
  <D.22094>:
  D.22096 = branch_relation & 1;
  D.22097 = branch_relation & 2;
  D.22098 = D.22097 << 1;
  D.22099 = D.22096 | D.22098;
  D.22100 = branch_relation & 4;
  D.22101 = D.22100 >> 1;
  symmetric_relation = D.22099 | D.22101;
  D.22102 = compare->opcode;
  if (D.22102 == 326) goto <D.22103>; else goto <D.22104>;
  <D.22103>:
  D.22105 = compare->sreg1;
  relations->relation1.variable = D.22105;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 2;
  D.22106 = compare->sreg2;
  relations->relation1.relation.related_value.value.variable.variable = D.22106;
  relations->relation1.relation.related_value.value.variable.delta = 0;
  D.22106 = compare->sreg2;
  relations->relation2.variable = D.22106;
  relations->relation2.relation.relation = symmetric_relation;
  relations->relation2.relation.related_value.type = 2;
  D.22105 = compare->sreg1;
  relations->relation2.relation.related_value.value.variable.variable = D.22105;
  relations->relation2.relation.related_value.value.variable.delta = 0;
  goto <D.22107>;
  <D.22104>:
  D.22102 = compare->opcode;
  if (D.22102 == 327) goto <D.22108>; else goto <D.22109>;
  <D.22108>:
  D.22105 = compare->sreg1;
  relations->relation1.variable = D.22105;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 1;
  D.22110 = compare->data.op[1].const_val;
  relations->relation1.relation.related_value.value.constant.value = D.22110;
  <D.22109>:
  <D.22107>:
  <D.22082>:
  <D.22073>:
}


get_relation_from_branch_instruction (struct MonoInst * ins)
{
  short unsigned int D.22115;
  short unsigned int D.22116;
  short unsigned int D.22118;
  short unsigned int D.22120;
  int D.22121;
  MonoValueRelation D.22122;

  D.22115 = ins->opcode;
  D.22116 = D.22115 + 64985;
  if (D.22116 <= 9) goto <D.22112>; else goto <D.22117>;
  <D.22117>:
  D.22115 = ins->opcode;
  D.22118 = D.22115 + 64878;
  if (D.22118 <= 9) goto <D.22112>; else goto <D.22119>;
  <D.22119>:
  D.22115 = ins->opcode;
  D.22120 = D.22115 + 64888;
  if (D.22120 <= 9) goto <D.22112>; else goto <D.22113>;
  <D.22112>:
  {
    CompRelation rel;

    D.22115 = ins->opcode;
    D.22121 = (int) D.22115;
    rel = mono_opcode_to_cond (D.22121);
    switch (rel) <default: <D.21622>, case 0: <D.21612>, case 1: <D.21613>, case 2: <D.21614>, case 3: <D.21616>, case 4: <D.21618>, case 5: <D.21620>, case 6: <D.21615>, case 7: <D.21617>, case 8: <D.21619>, case 9: <D.21621>>
    <D.21612>:
    D.22122 = 1;
    return D.22122;
    <D.21613>:
    D.22122 = 6;
    return D.22122;
    <D.21614>:
    <D.21615>:
    D.22122 = 3;
    return D.22122;
    <D.21616>:
    <D.21617>:
    D.22122 = 5;
    return D.22122;
    <D.21618>:
    <D.21619>:
    D.22122 = 2;
    return D.22122;
    <D.21620>:
    <D.21621>:
    D.22122 = 4;
    return D.22122;
    <D.21622>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 421);
    D.22122 = 7;
    return D.22122;
  }
  goto <D.22114>;
  <D.22113>:
  D.22122 = 7;
  return D.22122;
  <D.22114>:
}


print_summarized_value_relation (struct MonoSummarizedValueRelation * relation)
{
  <unnamed type> D.22124;
  int D.22125;
  struct MonoSummarizedValue * D.22126;

  printf ("Relation ");
  D.22124 = relation->relation;
  D.22125 = (int) D.22124;
  print_relation (D.22125);
  printf (" with value ");
  D.22126 = &relation->related_value;
  print_summarized_value (D.22126);
}


print_relation (int relation)
{
  int D.22127;
  int D.22130;
  int D.22135;
  int print_or;

  print_or = 0;
  printf ("(");
  D.22127 = relation & 2;
  if (D.22127 != 0) goto <D.22128>; else goto <D.22129>;
  <D.22128>:
  printf ("LT");
  print_or = 1;
  <D.22129>:
  D.22130 = relation & 1;
  if (D.22130 != 0) goto <D.22131>; else goto <D.22132>;
  <D.22131>:
  if (print_or != 0) goto <D.22133>; else goto <D.22134>;
  <D.22133>:
  printf ("|");
  <D.22134>:
  printf ("EQ");
  print_or = 1;
  <D.22132>:
  D.22135 = relation & 4;
  if (D.22135 != 0) goto <D.22136>; else goto <D.22137>;
  <D.22136>:
  if (print_or != 0) goto <D.22138>; else goto <D.22139>;
  <D.22138>:
  printf ("|");
  <D.22139>:
  printf ("GT");
  print_or = 1;
  <D.22137>:
  printf (")");
}


remove_abc_from_inst (struct MonoInst * ins, struct MonoVariableRelationsEvaluationArea * area)
{
  struct MonoRelationsEvaluationContext * D.22140;
  unsigned int array_variable.13;
  unsigned int D.22142;
  unsigned int index_variable.14;
  unsigned int D.22144;
  struct MonoCompile * D.22145;
  unsigned int D.22146;
  int D.22147;
  int D.22151;
  int D.22153;
  int D.22155;
  int D.22156;
  int verbose_level.15;
  int D.22160;
  int D.22161;
  int array_variable;
  int index_variable;
  struct MonoRelationsEvaluationContext * array_context;
  struct MonoRelationsEvaluationContext * index_context;

  array_variable = ins->sreg1;
  index_variable = ins->sreg2;
  D.22140 = area->contexts;
  array_variable.13 = (unsigned int) array_variable;
  D.22142 = array_variable.13 * 28;
  array_context = D.22140 + D.22142;
  D.22140 = area->contexts;
  index_variable.14 = (unsigned int) index_variable;
  D.22144 = index_variable.14 * 28;
  index_context = D.22140 + D.22144;
  D.22140 = area->contexts;
  D.22145 = area->cfg;
  D.22146 = D.22145->next_vreg;
  D.22147 = (int) D.22146;
  clean_contexts (D.22140, D.22147);
  evaluate_relation_with_target_variable (area, index_variable, array_variable, 0B);
  evaluate_relation_with_target_variable (area, array_variable, array_variable, 0B);
  D.22151 = index_context->ranges.zero.lower;
  if (D.22151 >= 0) goto <D.22152>; else goto <D.22148>;
  <D.22152>:
  D.22153 = index_context->ranges.variable.upper;
  if (D.22153 < 0) goto <D.22149>; else goto <D.22154>;
  <D.22154>:
  D.22155 = index_context->ranges.zero.upper;
  D.22156 = array_context->ranges.zero.lower;
  if (D.22155 < D.22156) goto <D.22149>; else goto <D.22148>;
  <D.22149>:
  verbose_level.15 = verbose_level;
  if (verbose_level.15 > 1) goto <D.22158>; else goto <D.22159>;
  <D.22158>:
  printf ("ARRAY-ACCESS: removed bounds check on array %d with index %d\n", array_variable, index_variable);
  <D.22159>:
  ins->opcode = 316;
  ins->dreg = -1;
  ins->sreg3 = -1;
  D.22160 = ins->sreg3;
  ins->sreg2 = D.22160;
  D.22161 = ins->sreg2;
  ins->sreg1 = D.22161;
  goto <D.22150>;
  <D.22148>:
  verbose_level.15 = verbose_level;
  if (verbose_level.15 > 2) goto <D.22162>; else goto <D.22163>;
  <D.22162>:
  D.22151 = index_context->ranges.zero.lower;
  if (D.22151 >= 0) goto <D.22164>; else goto <D.22165>;
  <D.22164>:
  printf ("ARRAY-ACCESS: Removed lower bound check on array %d with index %d\n", array_variable, index_variable);
  <D.22165>:
  D.22153 = index_context->ranges.variable.upper;
  if (D.22153 < 0) goto <D.22166>; else goto <D.22167>;
  <D.22166>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through variable) on array %d with index %d\n", array_variable, index_variable);
  <D.22167>:
  D.22155 = index_context->ranges.zero.upper;
  D.22156 = array_context->ranges.zero.lower;
  if (D.22155 < D.22156) goto <D.22168>; else goto <D.22169>;
  <D.22168>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through constant) on array %d with index %d\n", array_variable, index_variable);
  <D.22169>:
  <D.22163>:
  <D.22150>:
}


clean_contexts (struct MonoRelationsEvaluationContext * contexts, int number)
{
  unsigned int i.16;
  unsigned int D.22171;
  struct MonoRelationsEvaluationContext * D.22172;
  int i;

  i = 0;
  goto <D.21655>;
  <D.21654>:
  i.16 = (unsigned int) i;
  D.22171 = i.16 * 28;
  D.22172 = contexts + D.22171;
  D.22172->status = 0;
  i = i + 1;
  <D.21655>:
  if (i < number) goto <D.21654>; else goto <D.21656>;
  <D.21656>:
}


evaluate_relation_with_target_variable (struct MonoVariableRelationsEvaluationArea * area, int variable, int target_variable, struct MonoRelationsEvaluationContext * father_context)
{
  struct MonoRelationsEvaluationContext * D.22173;
  unsigned int variable.17;
  unsigned int D.22175;
  <unnamed type> D.22176;
  struct MonoSummarizedValueRelation * D.22177;
  unsigned int D.22178;
  int verbose_level.18;
  <unnamed type> D.22188;
  struct MonoRelationsEvaluationRange * D.22189;
  int D.22190;
  <unnamed type> D.22191;
  unsigned int related_variable.19;
  unsigned int D.22195;
  <unnamed type> D.22199;
  struct MonoSummarizedValueRelation * D.22201;
  <unnamed type> D.22202;
  int D.22204;
  unsigned int D.22205;
  int D.22214;
  int D.22216;
  int iftmp.20;
  int D.22219;
  int iftmp.21;
  int D.22234;
  int iftmp.22;
  int D.22237;
  int iftmp.23;
  int D.22252;
  int iftmp.24;
  int D.22255;
  int iftmp.25;
  int D.22270;
  int iftmp.26;
  int D.22273;
  int iftmp.27;
  struct MonoRelationsEvaluationRanges * D.22287;
  struct MonoRelationsEvaluationRanges * D.22292;
  int * D.22295;
  unsigned int phi.28;
  unsigned int D.22297;
  int * D.22298;
  unsigned int D.22303;
  unsigned int D.22306;
  unsigned int D.22309;
  unsigned int phi_alternative.29;
  unsigned int D.22314;
  struct MonoRelationsEvaluationContext * D.22315;
  int D.22316;
  int D.22317;
  int D.22318;
  int D.22319;
  int D.22320;
  int D.22321;
  int D.22322;
  int D.22323;
  int D.22324;
  int D.22325;
  int D.22326;
  int D.22327;
  int D.22328;
  int D.22333;
  int D.22334;
  int D.22335;
  int D.22336;
  struct MonoSummarizedValueRelation * D.22346;
  struct MonoSummarizedValueRelation * D.22349;
  int D.22350;
  <unnamed type> D.22353;
  int D.22356;
  <unnamed type> D.22374;
  unsigned int D.22375;
  struct MonoRelationsEvaluationContext * context;

  D.22173 = area->contexts;
  variable.17 = (unsigned int) variable;
  D.22175 = variable.17 * 28;
  context = D.22173 + D.22175;
  D.22176 = context->status;
  switch (D.22176) <default: <D.21732>, case 0: <D.21696>, case 1: <D.21718>, case 2: <D.21731>>
  <D.21696>:
  {
    struct MonoSummarizedValueRelation * relation;

    D.22177 = area->relations;
    variable.17 = (unsigned int) variable;
    D.22178 = variable.17 * 24;
    relation = D.22177 + D.22178;
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22180>; else goto <D.22181>;
    <D.22180>:
    printf ("Evaluating variable %d (target variable %d)\n", variable, target_variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22181>:
    context->status = 1;
    context->father = father_context;
    context->ranges.zero.lower = -2147483648;
    context->ranges.zero.upper = 2147483647;
    context->ranges.variable.lower = -2147483648;
    context->ranges.variable.upper = 2147483647;
    if (variable == target_variable) goto <D.22182>; else goto <D.22183>;
    <D.22182>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22184>; else goto <D.22185>;
    <D.22184>:
    printf ("Target variable reached (%d), continuing to evaluate relations with constants\n", variable);
    <D.22185>:
    context->ranges.variable.lower = 0;
    context->ranges.variable.upper = 0;
    <D.22183>:
    goto <D.21715>;
    <D.21714>:
    context->current_relation = relation;
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22186>; else goto <D.22187>;
    <D.22186>:
    printf ("Processing (%d): ", variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22187>:
    D.22188 = relation->related_value.type;
    switch (D.22188) <default: <D.21713>, case 0: <D.21698>, case 1: <D.21700>, case 2: <D.21701>, case 3: <D.21704>>
    <D.21698>:
    goto <D.21699>;
    <D.21700>:
    D.22189 = &context->ranges.zero;
    D.22190 = relation->related_value.value.constant.value;
    D.22191 = relation->relation;
    intersect_value (D.22189, D.22190, D.22191);
    goto <D.21699>;
    <D.21701>:
    D.22191 = relation->relation;
    if (D.22191 != 7) goto <D.22192>; else goto <D.22193>;
    <D.22192>:
    {
      int related_variable;
      struct MonoRelationsEvaluationContext * related_context;

      related_variable = relation->related_value.value.variable.variable;
      D.22173 = area->contexts;
      related_variable.19 = (unsigned int) related_variable;
      D.22195 = related_variable.19 * 28;
      related_context = D.22173 + D.22195;
      D.22199 = related_context->status;
      if (D.22199 == 0) goto <D.22196>; else goto <D.22200>;
      <D.22200>:
      D.22201 = related_context->current_relation;
      D.22202 = D.22201->related_value.type;
      if (D.22202 != 2) goto <D.22196>; else goto <D.22203>;
      <D.22203>:
      D.22201 = related_context->current_relation;
      D.22204 = D.22201->related_value.value.variable.variable;
      if (D.22204 != variable) goto <D.22196>; else goto <D.22197>;
      <D.22196>:
      evaluate_relation_with_target_variable (area, related_variable, target_variable, context);
      D.22176 = context->status;
      D.22205 = D.22176 & 28;
      if (D.22205 != 0) goto <D.22206>; else goto <D.22207>;
      <D.22206>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22208>; else goto <D.22209>;
      <D.22208>:
      printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
      D.22176 = context->status;
      print_evaluation_context_status (D.22176);
      <D.22209>:
      D.22199 = related_context->status;
      if (D.22199 == 2) goto <D.22210>; else goto <D.22211>;
      <D.22210>:
      context->ranges = related_context->ranges;
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 > 0) goto <D.22215>; else goto <D.22212>;
      <D.22215>:
      D.22216 = context->ranges.zero.lower;
      if (D.22216 != -2147483648) goto <D.22217>; else goto <D.22212>;
      <D.22217>:
      D.22216 = context->ranges.zero.lower;
      D.22214 = relation->related_value.value.variable.delta;
      D.22219 = D.22216 + D.22214;
      D.22216 = context->ranges.zero.lower;
      if (D.22219 > D.22216) goto <D.22220>; else goto <D.22221>;
      <D.22220>:
      D.22216 = context->ranges.zero.lower;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.20 = D.22216 + D.22214;
      goto <D.22222>;
      <D.22221>:
      iftmp.20 = 2147483647;
      <D.22222>:
      context->ranges.zero.lower = iftmp.20;
      goto <D.22213>;
      <D.22212>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 < 0) goto <D.22223>; else goto <D.22224>;
      <D.22223>:
      D.22216 = context->ranges.zero.lower;
      if (D.22216 != 2147483647) goto <D.22225>; else goto <D.22226>;
      <D.22225>:
      D.22216 = context->ranges.zero.lower;
      D.22214 = relation->related_value.value.variable.delta;
      D.22219 = D.22216 + D.22214;
      D.22216 = context->ranges.zero.lower;
      if (D.22219 < D.22216) goto <D.22228>; else goto <D.22229>;
      <D.22228>:
      D.22216 = context->ranges.zero.lower;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.21 = D.22216 + D.22214;
      goto <D.22230>;
      <D.22229>:
      iftmp.21 = -2147483648;
      <D.22230>:
      context->ranges.zero.lower = iftmp.21;
      <D.22226>:
      <D.22224>:
      <D.22213>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 > 0) goto <D.22233>; else goto <D.22231>;
      <D.22233>:
      D.22234 = context->ranges.zero.upper;
      if (D.22234 != -2147483648) goto <D.22235>; else goto <D.22231>;
      <D.22235>:
      D.22234 = context->ranges.zero.upper;
      D.22214 = relation->related_value.value.variable.delta;
      D.22237 = D.22234 + D.22214;
      D.22234 = context->ranges.zero.upper;
      if (D.22237 > D.22234) goto <D.22238>; else goto <D.22239>;
      <D.22238>:
      D.22234 = context->ranges.zero.upper;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.22 = D.22234 + D.22214;
      goto <D.22240>;
      <D.22239>:
      iftmp.22 = 2147483647;
      <D.22240>:
      context->ranges.zero.upper = iftmp.22;
      goto <D.22232>;
      <D.22231>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 < 0) goto <D.22241>; else goto <D.22242>;
      <D.22241>:
      D.22234 = context->ranges.zero.upper;
      if (D.22234 != 2147483647) goto <D.22243>; else goto <D.22244>;
      <D.22243>:
      D.22234 = context->ranges.zero.upper;
      D.22214 = relation->related_value.value.variable.delta;
      D.22237 = D.22234 + D.22214;
      D.22234 = context->ranges.zero.upper;
      if (D.22237 < D.22234) goto <D.22246>; else goto <D.22247>;
      <D.22246>:
      D.22234 = context->ranges.zero.upper;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.23 = D.22234 + D.22214;
      goto <D.22248>;
      <D.22247>:
      iftmp.23 = -2147483648;
      <D.22248>:
      context->ranges.zero.upper = iftmp.23;
      <D.22244>:
      <D.22242>:
      <D.22232>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 > 0) goto <D.22251>; else goto <D.22249>;
      <D.22251>:
      D.22252 = context->ranges.variable.lower;
      if (D.22252 != -2147483648) goto <D.22253>; else goto <D.22249>;
      <D.22253>:
      D.22252 = context->ranges.variable.lower;
      D.22214 = relation->related_value.value.variable.delta;
      D.22255 = D.22252 + D.22214;
      D.22252 = context->ranges.variable.lower;
      if (D.22255 > D.22252) goto <D.22256>; else goto <D.22257>;
      <D.22256>:
      D.22252 = context->ranges.variable.lower;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.24 = D.22252 + D.22214;
      goto <D.22258>;
      <D.22257>:
      iftmp.24 = 2147483647;
      <D.22258>:
      context->ranges.variable.lower = iftmp.24;
      goto <D.22250>;
      <D.22249>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 < 0) goto <D.22259>; else goto <D.22260>;
      <D.22259>:
      D.22252 = context->ranges.variable.lower;
      if (D.22252 != 2147483647) goto <D.22261>; else goto <D.22262>;
      <D.22261>:
      D.22252 = context->ranges.variable.lower;
      D.22214 = relation->related_value.value.variable.delta;
      D.22255 = D.22252 + D.22214;
      D.22252 = context->ranges.variable.lower;
      if (D.22255 < D.22252) goto <D.22264>; else goto <D.22265>;
      <D.22264>:
      D.22252 = context->ranges.variable.lower;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.25 = D.22252 + D.22214;
      goto <D.22266>;
      <D.22265>:
      iftmp.25 = -2147483648;
      <D.22266>:
      context->ranges.variable.lower = iftmp.25;
      <D.22262>:
      <D.22260>:
      <D.22250>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 > 0) goto <D.22269>; else goto <D.22267>;
      <D.22269>:
      D.22270 = context->ranges.variable.upper;
      if (D.22270 != -2147483648) goto <D.22271>; else goto <D.22267>;
      <D.22271>:
      D.22270 = context->ranges.variable.upper;
      D.22214 = relation->related_value.value.variable.delta;
      D.22273 = D.22270 + D.22214;
      D.22270 = context->ranges.variable.upper;
      if (D.22273 > D.22270) goto <D.22274>; else goto <D.22275>;
      <D.22274>:
      D.22270 = context->ranges.variable.upper;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.26 = D.22270 + D.22214;
      goto <D.22276>;
      <D.22275>:
      iftmp.26 = 2147483647;
      <D.22276>:
      context->ranges.variable.upper = iftmp.26;
      goto <D.22268>;
      <D.22267>:
      D.22214 = relation->related_value.value.variable.delta;
      if (D.22214 < 0) goto <D.22277>; else goto <D.22278>;
      <D.22277>:
      D.22270 = context->ranges.variable.upper;
      if (D.22270 != 2147483647) goto <D.22279>; else goto <D.22280>;
      <D.22279>:
      D.22270 = context->ranges.variable.upper;
      D.22214 = relation->related_value.value.variable.delta;
      D.22273 = D.22270 + D.22214;
      D.22270 = context->ranges.variable.upper;
      if (D.22273 < D.22270) goto <D.22282>; else goto <D.22283>;
      <D.22282>:
      D.22270 = context->ranges.variable.upper;
      D.22214 = relation->related_value.value.variable.delta;
      iftmp.27 = D.22270 + D.22214;
      goto <D.22284>;
      <D.22283>:
      iftmp.27 = -2147483648;
      <D.22284>:
      context->ranges.variable.upper = iftmp.27;
      <D.22280>:
      <D.22278>:
      <D.22268>:
      context->status = 2;
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22285>; else goto <D.22286>;
      <D.22285>:
      printf (", ranges already computed, result: \n");
      D.22287 = &context->ranges;
      print_evaluation_context_ranges (D.22287);
      D.22214 = relation->related_value.value.variable.delta;
      printf (" (delta is %d)\n", D.22214);
      <D.22286>:
      goto <D.22288>;
      <D.22211>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22289>; else goto <D.22290>;
      <D.22289>:
      printf (", ranges not computed\n");
      <D.22290>:
      <D.22288>:
      goto <D.22291>;
      <D.22207>:
      D.22287 = &context->ranges;
      D.22292 = &related_context->ranges;
      D.22214 = relation->related_value.value.variable.delta;
      D.22191 = relation->relation;
      intersect_ranges (D.22287, D.22292, D.22214, D.22191);
      <D.22291>:
      goto <D.22198>;
      <D.22197>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22293>; else goto <D.22294>;
      <D.22293>:
      printf ("Relation is a back-edge in this traversal, skipping\n");
      <D.22294>:
      <D.22198>:
    }
    <D.22193>:
    goto <D.21699>;
    <D.21704>:
    {
      struct MonoRelationsEvaluationRanges phi_ranges;
      int phi;
      gboolean is_ascending;
      gboolean is_descending;

      try
        {
          is_ascending = 0;
          is_descending = 0;
          phi_ranges.zero.lower = 2147483647;
          phi_ranges.zero.upper = -2147483648;
          phi_ranges.variable.lower = 2147483647;
          phi_ranges.variable.upper = -2147483648;
          phi = 0;
          goto <D.21711>;
          <D.21710>:
          {
            int phi_alternative;

            D.22295 = relation->related_value.value.phi.phi_alternatives;
            phi.28 = (unsigned int) phi;
            D.22297 = phi.28 * 4;
            D.22298 = D.22295 + D.22297;
            phi_alternative = *D.22298;
            evaluate_relation_with_target_variable (area, phi_alternative, target_variable, context);
            D.22176 = context->status;
            D.22205 = D.22176 & 28;
            if (D.22205 != 0) goto <D.22299>; else goto <D.22300>;
            <D.22299>:
            verbose_level.18 = verbose_level;
            if (verbose_level.18 > 2) goto <D.22301>; else goto <D.22302>;
            <D.22301>:
            printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
            D.22176 = context->status;
            print_evaluation_context_status (D.22176);
            printf ("\n");
            <D.22302>:
            D.22176 = context->status;
            D.22303 = D.22176 & 4;
            if (D.22303 != 0) goto <D.22304>; else goto <D.22305>;
            <D.22304>:
            is_ascending = 1;
            <D.22305>:
            D.22176 = context->status;
            D.22306 = D.22176 & 8;
            if (D.22306 != 0) goto <D.22307>; else goto <D.22308>;
            <D.22307>:
            is_descending = 1;
            <D.22308>:
            D.22176 = context->status;
            D.22309 = D.22176 & 16;
            if (D.22309 != 0) goto <D.22310>; else goto <D.22311>;
            <D.22310>:
            is_ascending = 1;
            is_descending = 1;
            <D.22311>:
            context->status = 1;
            goto <D.22312>;
            <D.22300>:
            D.22173 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22314 = phi_alternative.29 * 28;
            D.22315 = D.22173 + D.22314;
            D.22316 = D.22315->ranges.zero.lower;
            D.22317 = phi_ranges.zero.lower;
            D.22318 = MIN_EXPR <D.22316, D.22317>;
            phi_ranges.zero.lower = D.22318;
            D.22173 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22314 = phi_alternative.29 * 28;
            D.22315 = D.22173 + D.22314;
            D.22319 = D.22315->ranges.zero.upper;
            D.22320 = phi_ranges.zero.upper;
            D.22321 = MAX_EXPR <D.22319, D.22320>;
            phi_ranges.zero.upper = D.22321;
            D.22173 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22314 = phi_alternative.29 * 28;
            D.22315 = D.22173 + D.22314;
            D.22322 = D.22315->ranges.variable.lower;
            D.22323 = phi_ranges.variable.lower;
            D.22324 = MIN_EXPR <D.22322, D.22323>;
            phi_ranges.variable.lower = D.22324;
            D.22173 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22314 = phi_alternative.29 * 28;
            D.22315 = D.22173 + D.22314;
            D.22325 = D.22315->ranges.variable.upper;
            D.22326 = phi_ranges.variable.upper;
            D.22327 = MAX_EXPR <D.22325, D.22326>;
            phi_ranges.variable.upper = D.22327;
            <D.22312>:
          }
          phi = phi + 1;
          <D.21711>:
          D.22328 = relation->related_value.value.phi.number_of_alternatives;
          if (D.22328 > phi) goto <D.21710>; else goto <D.21712>;
          <D.21712>:
          if (is_ascending != 0) goto <D.22329>; else goto <D.22330>;
          <D.22329>:
          phi_ranges.zero.upper = 2147483647;
          phi_ranges.variable.upper = 2147483647;
          <D.22330>:
          if (is_descending != 0) goto <D.22331>; else goto <D.22332>;
          <D.22331>:
          phi_ranges.zero.lower = -2147483648;
          phi_ranges.variable.lower = -2147483648;
          <D.22332>:
          D.22317 = phi_ranges.zero.lower;
          D.22216 = context->ranges.zero.lower;
          D.22333 = MAX_EXPR <D.22317, D.22216>;
          context->ranges.zero.lower = D.22333;
          D.22320 = phi_ranges.zero.upper;
          D.22234 = context->ranges.zero.upper;
          D.22334 = MIN_EXPR <D.22320, D.22234>;
          context->ranges.zero.upper = D.22334;
          D.22323 = phi_ranges.variable.lower;
          D.22252 = context->ranges.variable.lower;
          D.22335 = MAX_EXPR <D.22323, D.22252>;
          context->ranges.variable.lower = D.22335;
          D.22326 = phi_ranges.variable.upper;
          D.22270 = context->ranges.variable.upper;
          D.22336 = MIN_EXPR <D.22326, D.22270>;
          context->ranges.variable.upper = D.22336;
          goto <D.21699>;
        }
      finally
        {
          phi_ranges = {CLOBBER};
        }
    }
    <D.21713>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 819);
    <D.21699>:
    relation = relation->next;
    <D.21715>:
    if (relation != 0B) goto <D.21714>; else goto <D.21716>;
    <D.21716>:
    D.22176 = context->status;
    D.22205 = D.22176 & 28;
    if (D.22205 != 0) goto <D.22337>; else goto <D.22338>;
    <D.22337>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22339>; else goto <D.22340>;
    <D.22339>:
    printf ("Recursivity for variable %d (target variable %d) discards computation, status ", variable, target_variable);
    D.22176 = context->status;
    print_evaluation_context_status (D.22176);
    printf ("\n");
    <D.22340>:
    context->status = 0;
    goto <D.22341>;
    <D.22338>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22342>; else goto <D.22343>;
    <D.22342>:
    printf ("Ranges for variable %d (target variable %d) computed: ", variable, target_variable);
    D.22287 = &context->ranges;
    print_evaluation_context_ranges (D.22287);
    printf ("\n");
    <D.22343>:
    context->status = 2;
    <D.22341>:
    goto <D.21717>;
  }
  <D.21718>:
  {
    struct MonoRelationsEvaluationContext * current_context;
    struct MonoRelationsEvaluationContext * last_context;
    gboolean evaluation_can_be_recursive;
    gboolean evaluation_is_definition;
    int path_value;

    current_context = father_context;
    last_context = context->father;
    evaluation_can_be_recursive = 1;
    evaluation_is_definition = 1;
    path_value = 0;
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22344>; else goto <D.22345>;
    <D.22344>:
    printf ("Evaluation of variable %d (target variable %d) already in progress\n", variable, target_variable);
    print_evaluation_context (context);
    D.22346 = context->current_relation;
    print_summarized_value_relation (D.22346);
    printf ("\n");
    <D.22345>:
    goto <D.21725>;
    <D.21724>:
    if (current_context == 0B) goto <D.22347>; else goto <D.22348>;
    <D.22347>:
    printf ("Broken recursive ring in ABC removal\n");
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 867);
    <D.22348>:
    D.22349 = current_context->current_relation;
    D.22350 = D.22349->relation_is_static_definition;
    if (D.22350 != 0) goto <D.22351>; else goto <D.22352>;
    <D.22351>:
    D.22349 = current_context->current_relation;
    D.22353 = D.22349->related_value.type;
    if (D.22353 == 2) goto <D.22354>; else goto <D.22355>;
    <D.22354>:
    D.22349 = current_context->current_relation;
    D.22356 = D.22349->related_value.value.variable.delta;
    path_value = D.22356 + path_value;
    goto <D.22357>;
    <D.22355>:
    D.22349 = current_context->current_relation;
    D.22353 = D.22349->related_value.type;
    if (D.22353 != 3) goto <D.22358>; else goto <D.22359>;
    <D.22358>:
    evaluation_can_be_recursive = 0;
    <D.22359>:
    <D.22357>:
    goto <D.22360>;
    <D.22352>:
    evaluation_is_definition = 0;
    evaluation_can_be_recursive = 0;
    <D.22360>:
    current_context = current_context->father;
    <D.21725>:
    if (current_context != last_context) goto <D.21724>; else goto <D.21726>;
    <D.21726>:
    if (evaluation_is_definition != 0) goto <D.22361>; else goto <D.22362>;
    <D.22361>:
    {
      MonoRelationsEvaluationStatus recursive_status;

      if (evaluation_can_be_recursive != 0) goto <D.22363>; else goto <D.22364>;
      <D.22363>:
      if (path_value > 0) goto <D.22365>; else goto <D.22366>;
      <D.22365>:
      recursive_status = 4;
      goto <D.22367>;
      <D.22366>:
      if (path_value < 0) goto <D.22368>; else goto <D.22369>;
      <D.22368>:
      recursive_status = 8;
      goto <D.22370>;
      <D.22369>:
      recursive_status = 16;
      <D.22370>:
      <D.22367>:
      goto <D.22371>;
      <D.22364>:
      recursive_status = 16;
      <D.22371>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22372>; else goto <D.22373>;
      <D.22372>:
      printf ("Recursivity accepted (");
      print_evaluation_context_status (recursive_status);
      printf (")\n");
      <D.22373>:
      current_context = father_context;
      goto <D.21729>;
      <D.21728>:
      D.22374 = current_context->status;
      D.22375 = D.22374 | recursive_status;
      current_context->status = D.22375;
      current_context = current_context->father;
      <D.21729>:
      if (current_context != last_context) goto <D.21728>; else goto <D.21730>;
      <D.21730>:
    }
    goto <D.22376>;
    <D.22362>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22377>; else goto <D.22378>;
    <D.22377>:
    printf ("Recursivity rejected (some relation in the cycle is not a defintion)\n");
    <D.22378>:
    <D.22376>:
    goto <D.21717>;
  }
  <D.21731>:
  return;
  <D.21732>:
  verbose_level.18 = verbose_level;
  if (verbose_level.18 > 2) goto <D.22379>; else goto <D.22380>;
  <D.22379>:
  printf ("Variable %d (target variable %d) already in a recursive ring, skipping\n", variable, target_variable);
  print_evaluation_context (context);
  D.22346 = context->current_relation;
  print_summarized_value_relation (D.22346);
  printf ("\n");
  <D.22380>:
  goto <D.21717>;
  <D.21717>:
}


intersect_value (struct MonoRelationsEvaluationRange * range, int value, MonoValueRelation relation)
{
  int D.22385;
  int D.22386;
  int D.22387;
  int D.22388;
  int iftmp.30;
  unsigned int value.31;
  unsigned int D.22391;
  int D.22395;
  int iftmp.32;
  int D.22400;

  switch (relation) <default: <D.21671>, case 0: <D.21662>, case 1: <D.21665>, case 2: <D.21667>, case 3: <D.21668>, case 4: <D.21669>, case 5: <D.21670>, case 6: <D.21666>, case 7: <D.21664>>
  <D.21662>:
  range->lower = 2147483647;
  range->upper = -2147483648;
  goto <D.21663>;
  <D.21664>:
  goto <D.21663>;
  <D.21665>:
  D.22385 = range->upper;
  D.22386 = MIN_EXPR <D.22385, value>;
  range->upper = D.22386;
  D.22387 = range->lower;
  D.22388 = MAX_EXPR <D.22387, value>;
  range->lower = D.22388;
  goto <D.21663>;
  <D.21666>:
  goto <D.21663>;
  <D.21667>:
  value.31 = (unsigned int) value;
  D.22391 = value.31 + 2147483647;
  if (D.22391 <= 4294967293) goto <D.22392>; else goto <D.22393>;
  <D.22392>:
  iftmp.30 = value + -1;
  goto <D.22394>;
  <D.22393>:
  iftmp.30 = value;
  <D.22394>:
  D.22385 = range->upper;
  D.22395 = MIN_EXPR <iftmp.30, D.22385>;
  range->upper = D.22395;
  goto <D.21663>;
  <D.21668>:
  D.22385 = range->upper;
  D.22386 = MIN_EXPR <D.22385, value>;
  range->upper = D.22386;
  goto <D.21663>;
  <D.21669>:
  value.31 = (unsigned int) value;
  D.22391 = value.31 + 2147483647;
  if (D.22391 <= 4294967293) goto <D.22397>; else goto <D.22398>;
  <D.22397>:
  iftmp.32 = value + 1;
  goto <D.22399>;
  <D.22398>:
  iftmp.32 = value;
  <D.22399>:
  D.22387 = range->lower;
  D.22400 = MAX_EXPR <iftmp.32, D.22387>;
  range->lower = D.22400;
  goto <D.21663>;
  <D.21670>:
  D.22387 = range->lower;
  D.22388 = MAX_EXPR <D.22387, value>;
  range->lower = D.22388;
  goto <D.21663>;
  <D.21671>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 586);
  <D.21663>:
}


intersect_ranges (struct MonoRelationsEvaluationRanges * ranges, struct MonoRelationsEvaluationRanges * other_ranges, int delta, MonoValueRelation relation)
{
  int D.22404;
  int D.22405;
  int D.22406;
  int D.22407;
  int D.22408;
  int D.22409;
  int D.22410;
  int D.22411;
  int D.22412;
  int D.22413;
  int D.22414;
  int D.22415;
  int iftmp.33;
  unsigned int D.22417;
  unsigned int D.22418;
  int D.22422;
  int iftmp.34;
  unsigned int D.22424;
  unsigned int D.22425;
  int D.22429;
  int iftmp.35;
  unsigned int D.22431;
  unsigned int D.22432;
  int D.22436;
  int iftmp.36;
  unsigned int D.22438;
  unsigned int D.22439;
  int D.22443;
  int D.22448;
  int iftmp.37;
  int D.22451;
  int iftmp.38;
  int D.22466;
  int iftmp.39;
  int D.22469;
  int iftmp.40;
  int D.22484;
  int iftmp.41;
  int D.22487;
  int iftmp.42;
  int D.22502;
  int iftmp.43;
  int D.22505;
  int iftmp.44;

  if (delta == 0) goto <D.22402>; else goto <D.22403>;
  <D.22402>:
  switch (relation) <default: <D.21687>, case 0: <D.21678>, case 1: <D.21681>, case 2: <D.21683>, case 3: <D.21684>, case 4: <D.21685>, case 5: <D.21686>, case 6: <D.21682>, case 7: <D.21680>>
  <D.21678>:
  ranges->zero.lower = 2147483647;
  ranges->zero.upper = -2147483648;
  ranges->variable.lower = 2147483647;
  ranges->variable.upper = -2147483648;
  goto <D.21679>;
  <D.21680>:
  goto <D.21679>;
  <D.21681>:
  D.22404 = other_ranges->zero.lower;
  D.22405 = ranges->zero.lower;
  D.22406 = MAX_EXPR <D.22404, D.22405>;
  ranges->zero.lower = D.22406;
  D.22407 = other_ranges->zero.upper;
  D.22408 = ranges->zero.upper;
  D.22409 = MIN_EXPR <D.22407, D.22408>;
  ranges->zero.upper = D.22409;
  D.22410 = other_ranges->variable.lower;
  D.22411 = ranges->variable.lower;
  D.22412 = MAX_EXPR <D.22410, D.22411>;
  ranges->variable.lower = D.22412;
  D.22413 = other_ranges->variable.upper;
  D.22414 = ranges->variable.upper;
  D.22415 = MIN_EXPR <D.22413, D.22414>;
  ranges->variable.upper = D.22415;
  goto <D.21679>;
  <D.21682>:
  goto <D.21679>;
  <D.21683>:
  D.22407 = other_ranges->zero.upper;
  D.22417 = (unsigned int) D.22407;
  D.22418 = D.22417 + 2147483647;
  if (D.22418 > 4294967293) goto <D.22419>; else goto <D.22420>;
  <D.22419>:
  iftmp.33 = other_ranges->zero.upper;
  goto <D.22421>;
  <D.22420>:
  D.22407 = other_ranges->zero.upper;
  iftmp.33 = D.22407 + -1;
  <D.22421>:
  D.22408 = ranges->zero.upper;
  D.22422 = MIN_EXPR <iftmp.33, D.22408>;
  ranges->zero.upper = D.22422;
  D.22413 = other_ranges->variable.upper;
  D.22424 = (unsigned int) D.22413;
  D.22425 = D.22424 + 2147483647;
  if (D.22425 > 4294967293) goto <D.22426>; else goto <D.22427>;
  <D.22426>:
  iftmp.34 = other_ranges->variable.upper;
  goto <D.22428>;
  <D.22427>:
  D.22413 = other_ranges->variable.upper;
  iftmp.34 = D.22413 + -1;
  <D.22428>:
  D.22414 = ranges->variable.upper;
  D.22429 = MIN_EXPR <iftmp.34, D.22414>;
  ranges->variable.upper = D.22429;
  goto <D.21679>;
  <D.21684>:
  D.22407 = other_ranges->zero.upper;
  D.22408 = ranges->zero.upper;
  D.22409 = MIN_EXPR <D.22407, D.22408>;
  ranges->zero.upper = D.22409;
  D.22413 = other_ranges->variable.upper;
  D.22414 = ranges->variable.upper;
  D.22415 = MIN_EXPR <D.22413, D.22414>;
  ranges->variable.upper = D.22415;
  goto <D.21679>;
  <D.21685>:
  D.22404 = other_ranges->zero.lower;
  D.22431 = (unsigned int) D.22404;
  D.22432 = D.22431 + 2147483647;
  if (D.22432 > 4294967293) goto <D.22433>; else goto <D.22434>;
  <D.22433>:
  iftmp.35 = other_ranges->zero.lower;
  goto <D.22435>;
  <D.22434>:
  D.22404 = other_ranges->zero.lower;
  iftmp.35 = D.22404 + 1;
  <D.22435>:
  D.22405 = ranges->zero.lower;
  D.22436 = MAX_EXPR <iftmp.35, D.22405>;
  ranges->zero.lower = D.22436;
  D.22410 = other_ranges->variable.lower;
  D.22438 = (unsigned int) D.22410;
  D.22439 = D.22438 + 2147483647;
  if (D.22439 > 4294967293) goto <D.22440>; else goto <D.22441>;
  <D.22440>:
  iftmp.36 = other_ranges->variable.lower;
  goto <D.22442>;
  <D.22441>:
  D.22410 = other_ranges->variable.lower;
  iftmp.36 = D.22410 + 1;
  <D.22442>:
  D.22411 = ranges->variable.lower;
  D.22443 = MAX_EXPR <iftmp.36, D.22411>;
  ranges->variable.lower = D.22443;
  goto <D.21679>;
  <D.21686>:
  D.22404 = other_ranges->zero.lower;
  D.22405 = ranges->zero.lower;
  D.22406 = MAX_EXPR <D.22404, D.22405>;
  ranges->zero.lower = D.22406;
  D.22410 = other_ranges->variable.lower;
  D.22411 = ranges->variable.lower;
  D.22412 = MAX_EXPR <D.22410, D.22411>;
  ranges->variable.lower = D.22412;
  goto <D.21679>;
  <D.21687>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 633);
  <D.21679>:
  goto <D.22444>;
  <D.22403>:
  {
    struct MonoRelationsEvaluationRanges translated_ranges;

    try
      {
        translated_ranges = *other_ranges;
        if (delta > 0) goto <D.22447>; else goto <D.22445>;
        <D.22447>:
        D.22448 = translated_ranges.zero.lower;
        if (D.22448 != -2147483648) goto <D.22449>; else goto <D.22445>;
        <D.22449>:
        D.22448 = translated_ranges.zero.lower;
        D.22451 = D.22448 + delta;
        D.22448 = translated_ranges.zero.lower;
        if (D.22451 > D.22448) goto <D.22452>; else goto <D.22453>;
        <D.22452>:
        D.22448 = translated_ranges.zero.lower;
        iftmp.37 = D.22448 + delta;
        goto <D.22454>;
        <D.22453>:
        iftmp.37 = 2147483647;
        <D.22454>:
        translated_ranges.zero.lower = iftmp.37;
        goto <D.22446>;
        <D.22445>:
        if (delta < 0) goto <D.22455>; else goto <D.22456>;
        <D.22455>:
        D.22448 = translated_ranges.zero.lower;
        if (D.22448 != 2147483647) goto <D.22457>; else goto <D.22458>;
        <D.22457>:
        D.22448 = translated_ranges.zero.lower;
        D.22451 = D.22448 + delta;
        D.22448 = translated_ranges.zero.lower;
        if (D.22451 < D.22448) goto <D.22460>; else goto <D.22461>;
        <D.22460>:
        D.22448 = translated_ranges.zero.lower;
        iftmp.38 = D.22448 + delta;
        goto <D.22462>;
        <D.22461>:
        iftmp.38 = -2147483648;
        <D.22462>:
        translated_ranges.zero.lower = iftmp.38;
        <D.22458>:
        <D.22456>:
        <D.22446>:
        if (delta > 0) goto <D.22465>; else goto <D.22463>;
        <D.22465>:
        D.22466 = translated_ranges.zero.upper;
        if (D.22466 != -2147483648) goto <D.22467>; else goto <D.22463>;
        <D.22467>:
        D.22466 = translated_ranges.zero.upper;
        D.22469 = D.22466 + delta;
        D.22466 = translated_ranges.zero.upper;
        if (D.22469 > D.22466) goto <D.22470>; else goto <D.22471>;
        <D.22470>:
        D.22466 = translated_ranges.zero.upper;
        iftmp.39 = D.22466 + delta;
        goto <D.22472>;
        <D.22471>:
        iftmp.39 = 2147483647;
        <D.22472>:
        translated_ranges.zero.upper = iftmp.39;
        goto <D.22464>;
        <D.22463>:
        if (delta < 0) goto <D.22473>; else goto <D.22474>;
        <D.22473>:
        D.22466 = translated_ranges.zero.upper;
        if (D.22466 != 2147483647) goto <D.22475>; else goto <D.22476>;
        <D.22475>:
        D.22466 = translated_ranges.zero.upper;
        D.22469 = D.22466 + delta;
        D.22466 = translated_ranges.zero.upper;
        if (D.22469 < D.22466) goto <D.22478>; else goto <D.22479>;
        <D.22478>:
        D.22466 = translated_ranges.zero.upper;
        iftmp.40 = D.22466 + delta;
        goto <D.22480>;
        <D.22479>:
        iftmp.40 = -2147483648;
        <D.22480>:
        translated_ranges.zero.upper = iftmp.40;
        <D.22476>:
        <D.22474>:
        <D.22464>:
        if (delta > 0) goto <D.22483>; else goto <D.22481>;
        <D.22483>:
        D.22484 = translated_ranges.variable.lower;
        if (D.22484 != -2147483648) goto <D.22485>; else goto <D.22481>;
        <D.22485>:
        D.22484 = translated_ranges.variable.lower;
        D.22487 = D.22484 + delta;
        D.22484 = translated_ranges.variable.lower;
        if (D.22487 > D.22484) goto <D.22488>; else goto <D.22489>;
        <D.22488>:
        D.22484 = translated_ranges.variable.lower;
        iftmp.41 = D.22484 + delta;
        goto <D.22490>;
        <D.22489>:
        iftmp.41 = 2147483647;
        <D.22490>:
        translated_ranges.variable.lower = iftmp.41;
        goto <D.22482>;
        <D.22481>:
        if (delta < 0) goto <D.22491>; else goto <D.22492>;
        <D.22491>:
        D.22484 = translated_ranges.variable.lower;
        if (D.22484 != 2147483647) goto <D.22493>; else goto <D.22494>;
        <D.22493>:
        D.22484 = translated_ranges.variable.lower;
        D.22487 = D.22484 + delta;
        D.22484 = translated_ranges.variable.lower;
        if (D.22487 < D.22484) goto <D.22496>; else goto <D.22497>;
        <D.22496>:
        D.22484 = translated_ranges.variable.lower;
        iftmp.42 = D.22484 + delta;
        goto <D.22498>;
        <D.22497>:
        iftmp.42 = -2147483648;
        <D.22498>:
        translated_ranges.variable.lower = iftmp.42;
        <D.22494>:
        <D.22492>:
        <D.22482>:
        if (delta > 0) goto <D.22501>; else goto <D.22499>;
        <D.22501>:
        D.22502 = translated_ranges.variable.upper;
        if (D.22502 != -2147483648) goto <D.22503>; else goto <D.22499>;
        <D.22503>:
        D.22502 = translated_ranges.variable.upper;
        D.22505 = D.22502 + delta;
        D.22502 = translated_ranges.variable.upper;
        if (D.22505 > D.22502) goto <D.22506>; else goto <D.22507>;
        <D.22506>:
        D.22502 = translated_ranges.variable.upper;
        iftmp.43 = D.22502 + delta;
        goto <D.22508>;
        <D.22507>:
        iftmp.43 = 2147483647;
        <D.22508>:
        translated_ranges.variable.upper = iftmp.43;
        goto <D.22500>;
        <D.22499>:
        if (delta < 0) goto <D.22509>; else goto <D.22510>;
        <D.22509>:
        D.22502 = translated_ranges.variable.upper;
        if (D.22502 != 2147483647) goto <D.22511>; else goto <D.22512>;
        <D.22511>:
        D.22502 = translated_ranges.variable.upper;
        D.22505 = D.22502 + delta;
        D.22502 = translated_ranges.variable.upper;
        if (D.22505 < D.22502) goto <D.22514>; else goto <D.22515>;
        <D.22514>:
        D.22502 = translated_ranges.variable.upper;
        iftmp.44 = D.22502 + delta;
        goto <D.22516>;
        <D.22515>:
        iftmp.44 = -2147483648;
        <D.22516>:
        translated_ranges.variable.upper = iftmp.44;
        <D.22512>:
        <D.22510>:
        <D.22500>:
        intersect_ranges (ranges, &translated_ranges, 0, relation);
      }
    finally
      {
        translated_ranges = {CLOBBER};
      }
  }
  <D.22444>:
}


print_evaluation_context_ranges (struct MonoRelationsEvaluationRanges * ranges)
{
  int D.22519;
  int D.22520;
  int D.22521;
  int D.22522;

  D.22519 = ranges->zero.lower;
  D.22520 = ranges->zero.upper;
  D.22521 = ranges->variable.lower;
  D.22522 = ranges->variable.upper;
  printf ("(ranges: zero [%d,%d], variable [%d,%d])", D.22519, D.22520, D.22521, D.22522);
}


print_evaluation_context_status (MonoRelationsEvaluationStatus status)
{
  unsigned int D.22526;
  unsigned int D.22531;
  unsigned int D.22536;
  unsigned int D.22541;
  unsigned int D.22546;

  if (status == 0) goto <D.22523>; else goto <D.22524>;
  <D.22523>:
  printf ("EVALUATION_NOT_STARTED");
  goto <D.22525>;
  <D.22524>:
  {
    gboolean print_or;

    print_or = 0;
    printf ("(");
    D.22526 = status & 1;
    if (D.22526 != 0) goto <D.22527>; else goto <D.22528>;
    <D.22527>:
    if (print_or != 0) goto <D.22529>; else goto <D.22530>;
    <D.22529>:
    printf ("|");
    <D.22530>:
    printf ("EVALUATION_IN_PROGRESS");
    print_or = 1;
    <D.22528>:
    D.22531 = status & 2;
    if (D.22531 != 0) goto <D.22532>; else goto <D.22533>;
    <D.22532>:
    if (print_or != 0) goto <D.22534>; else goto <D.22535>;
    <D.22534>:
    printf ("|");
    <D.22535>:
    printf ("EVALUATION_COMPLETED");
    print_or = 1;
    <D.22533>:
    D.22536 = status & 4;
    if (D.22536 != 0) goto <D.22537>; else goto <D.22538>;
    <D.22537>:
    if (print_or != 0) goto <D.22539>; else goto <D.22540>;
    <D.22539>:
    printf ("|");
    <D.22540>:
    printf ("RECURSIVELY_ASCENDING");
    print_or = 1;
    <D.22538>:
    D.22541 = status & 8;
    if (D.22541 != 0) goto <D.22542>; else goto <D.22543>;
    <D.22542>:
    if (print_or != 0) goto <D.22544>; else goto <D.22545>;
    <D.22544>:
    printf ("|");
    <D.22545>:
    printf ("RECURSIVELY_DESCENDING");
    print_or = 1;
    <D.22543>:
    D.22546 = status & 16;
    if (D.22546 != 0) goto <D.22547>; else goto <D.22548>;
    <D.22547>:
    if (print_or != 0) goto <D.22549>; else goto <D.22550>;
    <D.22549>:
    printf ("|");
    <D.22550>:
    printf ("RECURSIVELY_INDEFINITE");
    print_or = 1;
    <D.22548>:
    printf (")");
  }
  <D.22525>:
}


print_evaluation_context (struct MonoRelationsEvaluationContext * context)
{
  <unnamed type> D.22551;
  unsigned int D.22552;
  struct MonoRelationsEvaluationRanges * D.22555;

  printf ("Context status: ");
  D.22551 = context->status;
  print_evaluation_context_status (D.22551);
  D.22551 = context->status;
  D.22552 = D.22551 & 3;
  if (D.22552 != 0) goto <D.22553>; else goto <D.22554>;
  <D.22553>:
  D.22555 = &context->ranges;
  print_evaluation_context_ranges (D.22555);
  <D.22554>:
  printf ("\n");
}


apply_change_to_evaluation_area (struct MonoVariableRelationsEvaluationArea * area, struct MonoAdditionalVariableRelation * change)
{
  <unnamed type> D.22556;
  struct MonoSummarizedValueRelation * D.22559;
  int D.22560;
  unsigned int D.22561;
  unsigned int D.22562;
  struct MonoSummarizedValueRelation * D.22563;
  int D.22565;
  struct MonoSummarizedValueRelation * D.22566;
  struct MonoSummarizedValueRelation * base_relation;

  D.22556 = change->relation.relation;
  if (D.22556 != 7) goto <D.22557>; else goto <D.22558>;
  <D.22557>:
  D.22559 = area->relations;
  D.22560 = change->variable;
  D.22561 = (unsigned int) D.22560;
  D.22562 = D.22561 * 24;
  base_relation = D.22559 + D.22562;
  goto <D.21644>;
  <D.21643>:
  base_relation = base_relation->next;
  <D.21644>:
  D.22563 = base_relation->next;
  if (D.22563 != 0B) goto <D.22564>; else goto <D.21645>;
  <D.22564>:
  D.22563 = base_relation->next;
  D.22565 = D.22563->relation_is_static_definition;
  if (D.22565 != 0) goto <D.21643>; else goto <D.21645>;
  <D.21645>:
  change->insertion_point = base_relation;
  D.22563 = base_relation->next;
  change->relation.next = D.22563;
  D.22566 = &change->relation;
  base_relation->next = D.22566;
  <D.22558>:
}


g_slist_append_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.22569;
  struct GSList * D.22570;
  struct GSList * new_list;
  struct GSList * last;

  new_list = mono_mempool_alloc (mp, 8);
  new_list->data = data;
  new_list->next = 0B;
  if (list != 0B) goto <D.22567>; else goto <D.22568>;
  <D.22567>:
  last = list;
  goto <D.6375>;
  <D.6374>:
  last = last->next;
  <D.6375>:
  D.22569 = last->next;
  if (D.22569 != 0B) goto <D.6374>; else goto <D.6376>;
  <D.6376>:
  last->next = new_list;
  D.22570 = list;
  return D.22570;
  <D.22568>:
  D.22570 = new_list;
  return D.22570;
}


eval_non_null (struct MonoVariableRelationsEvaluationArea * area, int reg)
{
  struct MonoRelationsEvaluationContext * D.22572;
  unsigned int reg.45;
  unsigned int D.22574;
  struct MonoCompile * D.22575;
  unsigned int D.22576;
  int D.22577;
  gboolean D.22578;
  int D.22579;
  _Bool D.22580;
  struct MonoRelationsEvaluationContext * context;

  D.22572 = area->contexts;
  reg.45 = (unsigned int) reg;
  D.22574 = reg.45 * 28;
  context = D.22572 + D.22574;
  D.22572 = area->contexts;
  D.22575 = area->cfg;
  D.22576 = D.22575->next_vreg;
  D.22577 = (int) D.22576;
  clean_contexts (D.22572, D.22577);
  evaluate_relation_with_target_variable (area, reg, reg, 0B);
  D.22579 = context->ranges.zero.lower;
  D.22580 = D.22579 > 0;
  D.22578 = (gboolean) D.22580;
  return D.22578;
}


add_non_null (struct MonoVariableRelationsEvaluationArea * area, struct MonoCompile * cfg, int reg, struct GSList * * check_relations)
{
  struct MonoMemPool * D.22582;
  struct GSList * D.22583;
  struct GSList * D.22584;
  struct MonoAdditionalVariableRelation * rel;

  D.22582 = cfg->mempool;
  rel = mono_mempool_alloc0 (D.22582, 32);
  rel->variable = reg;
  rel->relation.relation = 4;
  rel->relation.related_value.type = 1;
  rel->relation.related_value.value.constant.value = 0;
  apply_change_to_evaluation_area (area, rel);
  D.22582 = cfg->mempool;
  D.22583 = *check_relations;
  D.22584 = g_slist_append_mempool (D.22582, D.22583, rel);
  *check_relations = D.22584;
}


remove_change_from_evaluation_area (struct MonoAdditionalVariableRelation * change)
{
  struct MonoSummarizedValueRelation * D.22585;
  struct MonoSummarizedValueRelation * D.22588;

  D.22585 = change->insertion_point;
  if (D.22585 != 0B) goto <D.22586>; else goto <D.22587>;
  <D.22586>:
  D.22585 = change->insertion_point;
  D.22588 = change->relation.next;
  D.22585->next = D.22588;
  change->relation.next = 0B;
  <D.22587>:
}


