mono_perform_abc_removal (struct MonoCompile * cfg)
{
  unsigned int D.22672;
  int verbose_level.0;
  int verbose_level.1;
  struct MonoMethod * D.22677;
  char * D.22678;
  struct MonoMemPool * D.22679;
  unsigned int D.22680;
  unsigned int D.22681;
  void * D.22682;
  unsigned int D.22683;
  void * D.22684;
  unsigned int D.22685;
  void * D.22686;
  unsigned int D.22687;
  void * D.22688;
  MonoIntegerValueKind * D.22689;
  long unsigned int D.22690;
  long unsigned int D.22691;
  MonoIntegerValueKind * D.22692;
  struct MonoSummarizedValueRelation * D.22693;
  long unsigned int D.22694;
  struct MonoSummarizedValueRelation * D.22695;
  struct MonoInst * * D.22696;
  long unsigned int D.22697;
  struct MonoInst * * D.22698;
  unsigned int i.2;
  int D.22702;
  short unsigned int D.22703;
  int D.22704;
  int D.22705;
  int D.22706;
  char D.22709;
  short unsigned int D.22711;
  struct MonoInst * iftmp.3;
  int D.22717;
  unsigned int D.22718;
  unsigned int D.22719;
  struct MonoInst * * D.22722;
  long unsigned int D.22723;
  long unsigned int D.22724;
  struct MonoInst * * D.22725;
  long unsigned int D.22729;
  MonoIntegerValueKind * D.22730;
  struct MonoType * D.22731;
  <unnamed type> D.22732;
  long unsigned int D.22733;
  struct MonoSummarizedValueRelation * D.22734;
  <unnamed type> D.22735;
  int D.22736;
  struct MonoSummarizedValueRelation * D.22739;
  int D.22742;
  struct MonoSummarizedValue * D.22749;
  <unnamed type> D.22750;
  unsigned int D.22753;
  long unsigned int D.22754;
  long unsigned int D.22755;
  struct MonoSummarizedValueRelation * D.22756;
  int D.22757;
  int D.22758;
  long unsigned int D.22759;
  long unsigned int D.22760;
  struct MonoSummarizedValueRelation * D.22761;
  struct MonoSummarizedValueRelation * D.22762;
  struct MonoSummarizedValueRelation * D.22763;
  struct MonoSummarizedValue * D.22766;
  struct MonoBasicBlock * * D.22767;
  struct MonoBasicBlock * D.22768;
  struct MonoVariableRelationsEvaluationArea area;
  struct MonoBasicBlock * bb;
  int i;

  try
    {
      D.22672 = cfg->verbose_level;
      verbose_level.0 = (int) D.22672;
      verbose_level = verbose_level.0;
      verbose_level.1 = verbose_level;
      if (verbose_level.1 > 2) goto <D.22675>; else goto <D.22676>;
      <D.22675>:
      D.22677 = cfg->method;
      D.22678 = mono_method_full_name (D.22677, 1);
      printf ("\nRemoving array bound checks in %s\n", D.22678);
      <D.22676>:
      area.cfg = cfg;
      D.22679 = cfg->mempool;
      D.22680 = cfg->next_vreg;
      D.22681 = D.22680 * 96;
      D.22682 = mono_mempool_alloc (D.22679, D.22681);
      area.relations = D.22682;
      D.22679 = cfg->mempool;
      D.22680 = cfg->next_vreg;
      D.22683 = D.22680 * 40;
      D.22684 = mono_mempool_alloc (D.22679, D.22683);
      area.contexts = D.22684;
      D.22679 = cfg->mempool;
      D.22680 = cfg->next_vreg;
      D.22685 = D.22680 * 4;
      D.22686 = mono_mempool_alloc (D.22679, D.22685);
      area.variable_value_kind = D.22686;
      D.22679 = cfg->mempool;
      D.22680 = cfg->next_vreg;
      D.22687 = D.22680 * 8;
      D.22688 = mono_mempool_alloc (D.22679, D.22687);
      area.defs = D.22688;
      i = 0;
      goto <D.22651>;
      <D.22650>:
      D.22689 = area.variable_value_kind;
      D.22690 = (long unsigned int) i;
      D.22691 = D.22690 * 4;
      D.22692 = D.22689 + D.22691;
      *D.22692 = 0;
      D.22693 = area.relations;
      D.22690 = (long unsigned int) i;
      D.22694 = D.22690 * 48;
      D.22695 = D.22693 + D.22694;
      D.22695->relation = 1;
      D.22693 = area.relations;
      D.22690 = (long unsigned int) i;
      D.22694 = D.22690 * 48;
      D.22695 = D.22693 + D.22694;
      D.22695->relation_is_static_definition = 1;
      D.22693 = area.relations;
      D.22690 = (long unsigned int) i;
      D.22694 = D.22690 * 48;
      D.22695 = D.22693 + D.22694;
      D.22695->related_value.type = 0;
      D.22693 = area.relations;
      D.22690 = (long unsigned int) i;
      D.22694 = D.22690 * 48;
      D.22695 = D.22693 + D.22694;
      D.22695->next = 0B;
      D.22696 = area.defs;
      D.22690 = (long unsigned int) i;
      D.22697 = D.22690 * 8;
      D.22698 = D.22696 + D.22697;
      *D.22698 = 0B;
      i = i + 1;
      <D.22651>:
      i.2 = (unsigned int) i;
      D.22680 = cfg->next_vreg;
      if (i.2 < D.22680) goto <D.22650>; else goto <D.22652>;
      <D.22652>:
      bb = cfg->bb_entry;
      goto <D.22664>;
      <D.22663>:
      {
        struct MonoInst * ins;

        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.22700>; else goto <D.22701>;
        <D.22700>:
        D.22702 = bb->block_num;
        printf ("\nABCREM BLOCK %d:\n", D.22702);
        <D.22701>:
        ins = bb->code;
        goto <D.22661>;
        <D.22660>:
        {
          const char * spec;

          D.22703 = ins->opcode;
          D.22704 = (int) D.22703;
          D.22705 = D.22704 + -313;
          D.22706 = D.22705 * 4;
          spec = &ins_info[D.22706];
          D.22709 = *spec;
          if (D.22709 == 32) goto <D.22707>; else goto <D.22710>;
          <D.22710>:
          D.22703 = ins->opcode;
          D.22711 = D.22703 + 65162;
          if (D.22711 <= 13) goto <D.22707>; else goto <D.22708>;
          <D.22707>:
          // predicted unlikely by continue predictor.
          goto <D.22655>;
          <D.22708>:
          D.22709 = *spec;
          if (D.22709 == 105) goto <D.22712>; else goto <D.22713>;
          <D.22712>:
          {
            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.22714>; else goto <D.22715>;
                <D.22714>:
                mono_print_ins (ins);
                <D.22715>:
                D.22717 = ins->dreg;
                D.22718 = (unsigned int) D.22717;
                D.22719 = cfg->vreg_to_inst_len;
                if (D.22718 < D.22719) goto <D.22720>; else goto <D.22721>;
                <D.22720>:
                D.22722 = cfg->vreg_to_inst;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22724 = D.22723 * 8;
                D.22725 = D.22722 + D.22724;
                iftmp.3 = *D.22725;
                goto <D.22726>;
                <D.22721>:
                iftmp.3 = 0B;
                <D.22726>:
                var = iftmp.3;
                if (var != 0B) goto <D.22727>; else goto <D.22728>;
                <D.22727>:
                D.22689 = area.variable_value_kind;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22729 = D.22723 * 4;
                D.22730 = D.22689 + D.22729;
                D.22731 = var->data.op[1].vtype;
                D.22732 = type_to_value_kind (D.22731);
                *D.22730 = D.22732;
                <D.22728>:
                D.22693 = area.relations;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22733 = D.22723 * 48;
                D.22734 = D.22693 + D.22733;
                D.22689 = area.variable_value_kind;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22729 = D.22723 * 4;
                D.22730 = D.22689 + D.22729;
                D.22735 = *D.22730;
                effective_value_kind = get_relation_from_ins (&area, ins, D.22734, D.22735);
                range.lower = -2147483648;
                range.upper = 2147483647;
                D.22689 = area.variable_value_kind;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22729 = D.22723 * 4;
                D.22730 = D.22689 + D.22729;
                D.22735 = *D.22730;
                apply_value_kind_to_range (&range, D.22735);
                apply_value_kind_to_range (&range, effective_value_kind);
                D.22736 = range.upper;
                if (D.22736 != 2147483647) goto <D.22737>; else goto <D.22738>;
                <D.22737>:
                D.22679 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22679, 48);
                type_relation->relation = 3;
                type_relation->related_value.type = 1;
                D.22736 = range.upper;
                type_relation->related_value.value.constant.value = D.22736;
                type_relation->relation_is_static_definition = 1;
                D.22693 = area.relations;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22733 = D.22723 * 48;
                D.22734 = D.22693 + D.22733;
                D.22739 = D.22734->next;
                type_relation->next = D.22739;
                D.22693 = area.relations;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22733 = D.22723 * 48;
                D.22734 = D.22693 + D.22733;
                D.22734->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22740>; else goto <D.22741>;
                <D.22740>:
                D.22717 = ins->dreg;
                D.22736 = range.upper;
                printf ("[var%d <= %d]", D.22717, D.22736);
                <D.22741>:
                <D.22738>:
                D.22742 = range.lower;
                if (D.22742 != -2147483648) goto <D.22743>; else goto <D.22744>;
                <D.22743>:
                D.22679 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22679, 48);
                type_relation->relation = 5;
                type_relation->related_value.type = 1;
                D.22742 = range.lower;
                type_relation->related_value.value.constant.value = D.22742;
                type_relation->relation_is_static_definition = 1;
                D.22693 = area.relations;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22733 = D.22723 * 48;
                D.22734 = D.22693 + D.22733;
                D.22739 = D.22734->next;
                type_relation->next = D.22739;
                D.22693 = area.relations;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22733 = D.22723 * 48;
                D.22734 = D.22693 + D.22733;
                D.22734->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22745>; else goto <D.22746>;
                <D.22745>:
                D.22717 = ins->dreg;
                D.22742 = range.lower;
                printf ("[var%d >= %d]", D.22717, D.22742);
                <D.22746>:
                <D.22744>:
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22747>; else goto <D.22748>;
                <D.22747>:
                D.22717 = ins->dreg;
                printf ("Summarized variable %d: ", D.22717);
                D.22693 = area.relations;
                D.22717 = ins->dreg;
                D.22723 = (long unsigned int) D.22717;
                D.22733 = D.22723 * 48;
                D.22734 = D.22693 + D.22733;
                D.22749 = &D.22734->related_value;
                print_summarized_value (D.22749);
                printf ("\n");
                <D.22748>:
              }
            finally
              {
                range = {CLOBBER};
              }
          }
          <D.22713>:
        }
        <D.22655>:
        ins = ins->next;
        <D.22661>:
        if (ins != 0B) goto <D.22660>; else goto <D.22662>;
        <D.22662>:
      }
      bb = bb->next_bb;
      <D.22664>:
      if (bb != 0B) goto <D.22663>; else goto <D.22665>;
      <D.22665>:
      i = 0;
      goto <D.22669>;
      <D.22668>:
      D.22693 = area.relations;
      D.22690 = (long unsigned int) i;
      D.22694 = D.22690 * 48;
      D.22695 = D.22693 + D.22694;
      D.22750 = D.22695->related_value.type;
      if (D.22750 == 2) goto <D.22751>; else goto <D.22752>;
      <D.22751>:
      {
        int related_index;
        int related_variable;

        D.22680 = cfg->next_vreg;
        i.2 = (unsigned int) i;
        D.22753 = D.22680 + i.2;
        related_index = (int) D.22753;
        D.22693 = area.relations;
        D.22690 = (long unsigned int) i;
        D.22694 = D.22690 * 48;
        D.22695 = D.22693 + D.22694;
        related_variable = D.22695->related_value.value.variable.variable;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22756->relation = 1;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22756->relation_is_static_definition = 1;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22756->related_value.type = 2;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22756->related_value.value.variable.variable = i;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22693 = area.relations;
        D.22690 = (long unsigned int) i;
        D.22694 = D.22690 * 48;
        D.22695 = D.22693 + D.22694;
        D.22757 = D.22695->related_value.value.variable.delta;
        D.22758 = -D.22757;
        D.22756->related_value.value.variable.delta = D.22758;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22693 = area.relations;
        D.22759 = (long unsigned int) related_variable;
        D.22760 = D.22759 * 48;
        D.22761 = D.22693 + D.22760;
        D.22762 = D.22761->next;
        D.22756->next = D.22762;
        D.22693 = area.relations;
        D.22759 = (long unsigned int) related_variable;
        D.22760 = D.22759 * 48;
        D.22761 = D.22693 + D.22760;
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22763 = D.22693 + D.22755;
        D.22761->next = D.22763;
        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.22764>; else goto <D.22765>;
        <D.22764>:
        printf ("Added symmetric summarized value for variable variable %d (to %d): ", i, related_variable);
        D.22693 = area.relations;
        D.22754 = (long unsigned int) related_index;
        D.22755 = D.22754 * 48;
        D.22756 = D.22693 + D.22755;
        D.22766 = &D.22756->related_value;
        print_summarized_value (D.22766);
        printf ("\n");
        <D.22765>:
      }
      <D.22752>:
      i = i + 1;
      <D.22669>:
      i.2 = (unsigned int) i;
      D.22680 = cfg->next_vreg;
      if (i.2 < D.22680) goto <D.22668>; else goto <D.22670>;
      <D.22670>:
      D.22767 = cfg->bblocks;
      D.22768 = *D.22767;
      process_block (cfg, D.22768, &area);
    }
  finally
    {
      area = {CLOBBER};
    }
}


type_to_value_kind (struct MonoType * type)
{
  long unsigned int D.22769;
  long unsigned int D.22770;
  MonoIntegerValueKind D.22773;
  unsigned char D.22774;
  int D.22775;

  D.22769 = BIT_FIELD_REF <*type, 64, 64>;
  D.22770 = D.22769 & 1073741824;
  if (D.22770 != 0) goto <D.22771>; else goto <D.22772>;
  <D.22771>:
  D.22773 = 0;
  return D.22773;
  <D.22772>:
  D.22774 = type->type;
  D.22775 = (int) D.22774;
  switch (D.22775) <default: <D.22643>, case 4: <D.22633>, case 5: <D.22634>, case 6: <D.22635>, case 7: <D.22636>, case 8: <D.22637>, case 9: <D.22638>, case 10: <D.22641>, case 11: <D.22642>, case 24: <D.22639>, case 25: <D.22640>>
  <D.22633>:
  D.22773 = 1;
  return D.22773;
  <D.22634>:
  D.22773 = 17;
  return D.22773;
  <D.22635>:
  D.22773 = 2;
  return D.22773;
  <D.22636>:
  D.22773 = 18;
  return D.22773;
  <D.22637>:
  D.22773 = 4;
  return D.22773;
  <D.22638>:
  D.22773 = 20;
  return D.22773;
  <D.22639>:
  D.22773 = 8;
  return D.22773;
  <D.22640>:
  D.22773 = 24;
  return D.22773;
  <D.22641>:
  D.22773 = 8;
  return D.22773;
  <D.22642>:
  D.22773 = 24;
  return D.22773;
  <D.22643>:
  D.22773 = 0;
  return D.22773;
}


get_relation_from_ins (struct MonoVariableRelationsEvaluationArea * area, struct MonoInst * ins, struct MonoSummarizedValueRelation * result, MonoIntegerValueKind result_value_kind)
{
  unsigned char D.22777;
  short unsigned int D.22784;
  int D.22785;
  long int D.22786;
  int D.22787;
  int D.22788;
  int * D.22789;
  int D.22790;
  int * D.22791;
  long int D.22792;
  int D.22793;
  unsigned int D.22794;
  unsigned int D.22795;
  int D.22796;
  int D.22797;
  struct MonoInst * * D.22798;
  int D.22799;
  long unsigned int D.22800;
  long unsigned int D.22801;
  struct MonoInst * * D.22802;
  MonoIntegerValueKind D.22803;
  MonoIntegerValueKind value_kind;
  struct MonoSummarizedValue * value;

  value = &result->related_value;
  D.22777 = ins->type;
  if (D.22777 == 2) goto <D.22778>; else goto <D.22779>;
  <D.22778>:
  value_kind = 8;
  goto <D.22780>;
  <D.22779>:
  D.22777 = ins->type;
  if (D.22777 == 1) goto <D.22781>; else goto <D.22782>;
  <D.22781>:
  value_kind = 4;
  goto <D.22783>;
  <D.22782>:
  value_kind = 0;
  <D.22783>:
  <D.22780>:
  result->relation = 1;
  value->type = 0;
  D.22784 = ins->opcode;
  D.22785 = (int) D.22784;
  switch (D.22785) <default: <D.22456>, case 314: <D.22455>, case 319: <D.22449>, case 362: <D.22445>, case 424: <D.22447>, case 571: <D.22452>, case 625: <D.22450>, case 626: <D.22451>, case 762: <D.22448>, case 782: <D.22454>, case 783: <D.22453>>
  <D.22445>:
  value->type = 1;
  D.22786 = ins->data.op[0].const_val;
  D.22787 = (int) D.22786;
  value->value.constant.value = D.22787;
  goto <D.22446>;
  <D.22447>:
  value->type = 2;
  D.22788 = ins->sreg1;
  value->value.variable.variable = D.22788;
  value->value.variable.delta = 0;
  goto <D.22446>;
  <D.22448>:
  value->type = 2;
  D.22788 = ins->sreg1;
  value->value.variable.variable = D.22788;
  value->value.variable.delta = 0;
  value_kind = 8;
  goto <D.22446>;
  <D.22449>:
  value->type = 3;
  D.22789 = ins->data.op[1].phi_args;
  D.22790 = *D.22789;
  value->value.phi.number_of_alternatives = D.22790;
  D.22789 = ins->data.op[1].phi_args;
  D.22791 = D.22789 + 4;
  value->value.phi.phi_alternatives = D.22791;
  goto <D.22446>;
  <D.22450>:
  value->type = 2;
  D.22788 = ins->sreg1;
  value->value.variable.variable = D.22788;
  D.22792 = ins->data.op[1].const_val;
  D.22793 = (int) D.22792;
  value->value.variable.delta = D.22793;
  goto <D.22446>;
  <D.22451>:
  value->type = 2;
  D.22788 = ins->sreg1;
  value->value.variable.variable = D.22788;
  D.22792 = ins->data.op[1].const_val;
  D.22794 = (unsigned int) D.22792;
  D.22795 = -D.22794;
  D.22796 = (int) D.22795;
  value->value.variable.delta = D.22796;
  goto <D.22446>;
  <D.22452>:
  result->relation = 2;
  value->type = 2;
  D.22797 = ins->sreg2;
  value->value.variable.variable = D.22797;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.22446>;
  <D.22453>:
  value->type = 2;
  D.22788 = ins->sreg1;
  value->value.variable.variable = D.22788;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.22446>;
  <D.22454>:
  value->type = 2;
  D.22788 = ins->sreg1;
  value->value.variable.variable = D.22788;
  value->value.variable.delta = 0;
  D.22798 = area->defs;
  D.22799 = ins->dreg;
  D.22800 = (long unsigned int) D.22799;
  D.22801 = D.22800 * 8;
  D.22802 = D.22798 + D.22801;
  *D.22802 = ins;
  goto <D.22446>;
  <D.22455>:
  result->relation = 4;
  value->type = 1;
  value->value.constant.value = 0;
  goto <D.22446>;
  <D.22456>:
  goto <D.22446>;
  <D.22446>:
  D.22803 = value_kind;
  return D.22803;
}


apply_value_kind_to_range (struct MonoRelationsEvaluationRange * range, MonoIntegerValueKind value_kind)
{
  unsigned int D.22808;
  int D.22811;
  unsigned int D.22814;
  int D.22817;

  if (value_kind != 0) goto <D.22806>; else goto <D.22807>;
  <D.22806>:
  D.22808 = value_kind & 16;
  if (D.22808 != 0) goto <D.22809>; else goto <D.22810>;
  <D.22809>:
  D.22811 = range->lower;
  if (D.22811 < 0) goto <D.22812>; else goto <D.22813>;
  <D.22812>:
  range->lower = 0;
  <D.22813>:
  D.22814 = value_kind & 15;
  if (D.22814 == 1) goto <D.22815>; else goto <D.22816>;
  <D.22815>:
  D.22817 = range->upper;
  if (D.22817 > 255) goto <D.22818>; else goto <D.22819>;
  <D.22818>:
  range->upper = 255;
  <D.22819>:
  goto <D.22820>;
  <D.22816>:
  D.22814 = value_kind & 15;
  if (D.22814 == 2) goto <D.22821>; else goto <D.22822>;
  <D.22821>:
  D.22817 = range->upper;
  if (D.22817 > 65535) goto <D.22823>; else goto <D.22824>;
  <D.22823>:
  range->upper = 65535;
  <D.22824>:
  <D.22822>:
  <D.22820>:
  goto <D.22825>;
  <D.22810>:
  D.22814 = value_kind & 15;
  if (D.22814 == 1) goto <D.22826>; else goto <D.22827>;
  <D.22826>:
  D.22811 = range->lower;
  if (D.22811 < -128) goto <D.22828>; else goto <D.22829>;
  <D.22828>:
  range->lower = -128;
  <D.22829>:
  D.22817 = range->upper;
  if (D.22817 > 127) goto <D.22830>; else goto <D.22831>;
  <D.22830>:
  range->upper = 127;
  <D.22831>:
  goto <D.22832>;
  <D.22827>:
  D.22814 = value_kind & 15;
  if (D.22814 == 2) goto <D.22833>; else goto <D.22834>;
  <D.22833>:
  D.22811 = range->lower;
  if (D.22811 < -32768) goto <D.22835>; else goto <D.22836>;
  <D.22835>:
  range->lower = -32768;
  <D.22836>:
  D.22817 = range->upper;
  if (D.22817 > 32767) goto <D.22837>; else goto <D.22838>;
  <D.22837>:
  range->upper = 32767;
  <D.22838>:
  <D.22834>:
  <D.22832>:
  <D.22825>:
  <D.22807>:
}


print_summarized_value (struct MonoSummarizedValue * value)
{
  <unnamed type> D.22839;
  int D.22840;
  int D.22841;
  int D.22842;
  int * D.22845;
  long unsigned int D.22846;
  long unsigned int D.22847;
  int * D.22848;
  int D.22849;
  int D.22850;

  D.22839 = value->type;
  switch (D.22839) <default: <D.22417>, case 0: <D.22408>, case 1: <D.22410>, case 2: <D.22411>, case 3: <D.22412>>
  <D.22408>:
  printf ("ANY");
  goto <D.22409>;
  <D.22410>:
  D.22840 = value->value.constant.value;
  printf ("CONSTANT %d", D.22840);
  goto <D.22409>;
  <D.22411>:
  D.22841 = value->value.variable.variable;
  D.22842 = value->value.variable.delta;
  printf ("VARIABLE %d, delta %d", D.22841, D.22842);
  goto <D.22409>;
  <D.22412>:
  {
    int phi;

    printf ("PHI (");
    phi = 0;
    goto <D.22415>;
    <D.22414>:
    if (phi != 0) goto <D.22843>; else goto <D.22844>;
    <D.22843>:
    printf (",");
    <D.22844>:
    D.22845 = value->value.phi.phi_alternatives;
    D.22846 = (long unsigned int) phi;
    D.22847 = D.22846 * 4;
    D.22848 = D.22845 + D.22847;
    D.22849 = *D.22848;
    printf ("%d", D.22849);
    phi = phi + 1;
    <D.22415>:
    D.22850 = value->value.phi.number_of_alternatives;
    if (D.22850 > phi) goto <D.22414>; else goto <D.22416>;
    <D.22416>:
    printf (")");
    goto <D.22409>;
  }
  <D.22417>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 118);
  <D.22409>:
}


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

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


process_block (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoVariableRelationsEvaluationArea * area)
{
  int verbose_level.4;
  int D.22856;
  int D.22857;
  unsigned int D.22858;
  <unnamed type> D.22863;
  int D.22866;
  <unnamed type> D.22867;
  int D.22870;
  short unsigned int D.22873;
  struct MonoMemPool * D.22880;
  struct GSList * check_relations.5;
  struct GSList * check_relations.6;
  struct GSList * check_relations.7;
  int D.22886;
  int D.22887;
  int D.22892;
  int D.22893;
  short unsigned int D.22898;
  short unsigned int D.22902;
  struct MonoInst * * D.22906;
  long unsigned int D.22907;
  long unsigned int D.22908;
  struct MonoInst * * D.22909;
  struct MonoInst * D.22910;
  short unsigned int D.22913;
  unsigned char D.22918;
  unsigned char D.22919;
  void * D.22922;
  void * D.22923;
  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.4 = verbose_level;
      if (verbose_level.4 > 2) goto <D.22854>; else goto <D.22855>;
      <D.22854>:
      D.22856 = bb->block_num;
      D.22857 = bb->dfn;
      printf ("\nProcessing block %d [dfn %d]...\n", D.22856, D.22857);
      <D.22855>:
      D.22858 = bb->region;
      if (D.22858 != 4294967295) goto <D.22859>; else goto <D.22860>;
      <D.22859>:
      return;
      <D.22860>:
      get_relations_from_previous_bb (area, bb, &additional_relations);
      verbose_level.4 = verbose_level;
      if (verbose_level.4 > 2) goto <D.22861>; else goto <D.22862>;
      <D.22861>:
      D.22863 = additional_relations.relation1.relation.relation;
      if (D.22863 != 7) goto <D.22864>; else goto <D.22865>;
      <D.22864>:
      D.22866 = additional_relations.relation1.variable;
      printf ("Adding relation 1 on variable %d: ", D.22866);
      print_summarized_value_relation (&additional_relations.relation1.relation);
      printf ("\n");
      <D.22865>:
      D.22867 = additional_relations.relation2.relation.relation;
      if (D.22867 != 7) goto <D.22868>; else goto <D.22869>;
      <D.22868>:
      D.22870 = additional_relations.relation2.variable;
      printf ("Adding relation 2 on variable %d: ", D.22870);
      print_summarized_value_relation (&additional_relations.relation2.relation);
      printf ("\n");
      <D.22869>:
      <D.22862>:
      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.22622>;
      <D.22621>:
      {
        struct MonoAdditionalVariableRelation * rel;
        int array_var;
        int index_var;

        verbose_level.4 = verbose_level;
        if (verbose_level.4 > 2) goto <D.22871>; else goto <D.22872>;
        <D.22871>:
        printf ("Processing instruction %d\n", inst_index);
        inst_index = inst_index + 1;
        <D.22872>:
        D.22873 = ins->opcode;
        if (D.22873 == 784) goto <D.22874>; else goto <D.22875>;
        <D.22874>:
        verbose_level.4 = verbose_level;
        if (verbose_level.4 > 2) goto <D.22876>; else goto <D.22877>;
        <D.22876>:
        printf ("Attempting check removal...\n");
        <D.22877>:
        array_var = ins->sreg1;
        index_var = ins->sreg2;
        remove_abc_from_inst (ins, area);
        D.22873 = ins->opcode;
        if (D.22873 != 316) goto <D.22878>; else goto <D.22879>;
        <D.22878>:
        D.22880 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22880, 64);
        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.22880 = cfg->mempool;
        check_relations.5 = check_relations;
        check_relations.6 = g_slist_append_mempool (D.22880, check_relations.5, rel);
        check_relations = check_relations.6;
        D.22880 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22880, 64);
        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.22880 = cfg->mempool;
        check_relations.5 = check_relations;
        check_relations.7 = g_slist_append_mempool (D.22880, check_relations.5, rel);
        check_relations = check_relations.7;
        <D.22879>:
        <D.22875>:
        D.22873 = ins->opcode;
        if (D.22873 == 340) goto <D.22884>; else goto <D.22885>;
        <D.22884>:
        D.22886 = ins->sreg1;
        D.22887 = eval_non_null (area, D.22886);
        if (D.22887 != 0) goto <D.22888>; else goto <D.22889>;
        <D.22888>:
        verbose_level.4 = verbose_level;
        if (verbose_level.4 > 1) goto <D.22890>; else goto <D.22891>;
        <D.22890>:
        printf ("ARRAY-ACCESS: removed check_this instruction.\n");
        <D.22891>:
        ins->opcode = 316;
        ins->dreg = -1;
        ins->sreg3 = -1;
        D.22892 = ins->sreg3;
        ins->sreg2 = D.22892;
        D.22893 = ins->sreg2;
        ins->sreg1 = D.22893;
        <D.22889>:
        <D.22885>:
        D.22873 = ins->opcode;
        if (D.22873 == 799) goto <D.22894>; else goto <D.22895>;
        <D.22894>:
        D.22886 = ins->sreg1;
        add_non_null (area, cfg, D.22886, &check_relations);
        <D.22895>:
        if (0 != 0) goto <D.22896>; else goto <D.22897>;
        <D.22896>:
        {
          int reg;

          D.22873 = ins->opcode;
          D.22898 = D.22873 + 65162;
          if (D.22898 <= 13) goto <D.22899>; else goto <D.22900>;
          <D.22899>:
          reg = ins->dreg;
          goto <D.22901>;
          <D.22900>:
          D.22873 = ins->opcode;
          D.22902 = D.22873 + 65148;
          if (D.22902 <= 11) goto <D.22903>; else goto <D.22904>;
          <D.22903>:
          reg = ins->sreg1;
          goto <D.22905>;
          <D.22904>:
          reg = ins->sreg1;
          <D.22905>:
          <D.22901>:
          D.22906 = area->defs;
          D.22907 = (long unsigned int) reg;
          D.22908 = D.22907 * 8;
          D.22909 = D.22906 + D.22908;
          D.22910 = *D.22909;
          if (D.22910 != 0B) goto <D.22911>; else goto <D.22912>;
          <D.22911>:
          D.22906 = area->defs;
          D.22907 = (long unsigned int) reg;
          D.22908 = D.22907 * 8;
          D.22909 = D.22906 + D.22908;
          D.22910 = *D.22909;
          D.22913 = D.22910->opcode;
          if (D.22913 == 782) goto <D.22914>; else goto <D.22915>;
          <D.22914>:
          verbose_level.4 = verbose_level;
          if (verbose_level.4 > 1) goto <D.22916>; else goto <D.22917>;
          <D.22916>:
          printf ("ARRAY-ACCESS: removed MONO_INST_FAULT flag.\n");
          <D.22917>:
          D.22918 = ins->flags;
          D.22919 = D.22918 & 223;
          ins->flags = D.22919;
          <D.22915>:
          <D.22912>:
        }
        <D.22897>:
      }
      ins = ins->next;
      <D.22622>:
      if (ins != 0B) goto <D.22621>; else goto <D.22623>;
      <D.22623>:
      verbose_level.4 = verbose_level;
      if (verbose_level.4 > 2) goto <D.22920>; else goto <D.22921>;
      <D.22920>:
      D.22856 = bb->block_num;
      D.22857 = bb->dfn;
      printf ("Processing block %d [dfn %d] done.\n", D.22856, D.22857);
      <D.22921>:
      dominated_bb = bb->dominated;
      goto <D.22625>;
      <D.22624>:
      D.22922 = dominated_bb->data;
      process_block (cfg, D.22922, area);
      dominated_bb = dominated_bb->next;
      <D.22625>:
      if (dominated_bb != 0B) goto <D.22624>; else goto <D.22626>;
      <D.22626>:
      l = check_relations;
      goto <D.22628>;
      <D.22627>:
      D.22923 = l->data;
      remove_change_from_evaluation_area (D.22923);
      l = l->next;
      <D.22628>:
      if (l != 0B) goto <D.22627>; else goto <D.22629>;
      <D.22629>:
      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.22927;
  struct MonoBasicBlock * * D.22930;
  struct MonoInst * D.22933;
  struct MonoInst * D.22935;
  struct MonoInst * D.22936;
  struct MonoBasicBlock * * D.22939;
  struct MonoBasicBlock * D.22940;
  struct MonoBasicBlock * * D.22944;
  struct MonoBasicBlock * D.22945;
  unsigned int D.22951;
  unsigned int D.22952;
  unsigned int D.22953;
  unsigned int D.22954;
  unsigned int D.22955;
  unsigned int D.22956;
  unsigned int D.22957;
  short unsigned int D.22958;
  int D.22961;
  int D.22962;
  long int D.22966;
  int D.22967;
  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.22927 = bb->in_count;
  if (D.22927 == 1) goto <D.22928>; else goto <D.22929>;
  <D.22928>:
  D.22930 = bb->in_bb;
  in_bb = *D.22930;
  D.22933 = in_bb->last_ins;
  if (D.22933 == 0B) goto <D.22931>; else goto <D.22934>;
  <D.22934>:
  D.22935 = in_bb->code;
  D.22933 = in_bb->last_ins;
  if (D.22935 == D.22933) goto <D.22931>; else goto <D.22932>;
  <D.22931>:
  return;
  <D.22932>:
  ins = in_bb->code;
  goto <D.22485>;
  <D.22484>:
  ins = ins->next;
  <D.22485>:
  D.22936 = ins->next;
  D.22933 = in_bb->last_ins;
  if (D.22936 != D.22933) goto <D.22484>; else goto <D.22486>;
  <D.22486>:
  compare = ins;
  branch = ins->next;
  branch_relation = get_relation_from_branch_instruction (branch);
  if (branch_relation != 7) goto <D.22937>; else goto <D.22938>;
  <D.22937>:
  D.22939 = branch->data.op[1].many_blocks;
  D.22940 = *D.22939;
  if (D.22940 == bb) goto <D.22941>; else goto <D.22942>;
  <D.22941>:
  code_path = 1;
  goto <D.22943>;
  <D.22942>:
  D.22939 = branch->data.op[1].many_blocks;
  D.22944 = D.22939 + 8;
  D.22945 = *D.22944;
  if (D.22945 == bb) goto <D.22946>; else goto <D.22947>;
  <D.22946>:
  code_path = 0;
  goto <D.22948>;
  <D.22947>:
  code_path = 1;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 475);
  <D.22948>:
  <D.22943>:
  if (code_path == 0) goto <D.22949>; else goto <D.22950>;
  <D.22949>:
  D.22951 = ~branch_relation;
  branch_relation = D.22951 & 7;
  <D.22950>:
  D.22952 = branch_relation & 1;
  D.22953 = branch_relation & 2;
  D.22954 = D.22953 << 1;
  D.22955 = D.22952 | D.22954;
  D.22956 = branch_relation & 4;
  D.22957 = D.22956 >> 1;
  symmetric_relation = D.22955 | D.22957;
  D.22958 = compare->opcode;
  if (D.22958 == 326) goto <D.22959>; else goto <D.22960>;
  <D.22959>:
  D.22961 = compare->sreg1;
  relations->relation1.variable = D.22961;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 2;
  D.22962 = compare->sreg2;
  relations->relation1.relation.related_value.value.variable.variable = D.22962;
  relations->relation1.relation.related_value.value.variable.delta = 0;
  D.22962 = compare->sreg2;
  relations->relation2.variable = D.22962;
  relations->relation2.relation.relation = symmetric_relation;
  relations->relation2.relation.related_value.type = 2;
  D.22961 = compare->sreg1;
  relations->relation2.relation.related_value.value.variable.variable = D.22961;
  relations->relation2.relation.related_value.value.variable.delta = 0;
  goto <D.22963>;
  <D.22960>:
  D.22958 = compare->opcode;
  if (D.22958 == 327) goto <D.22964>; else goto <D.22965>;
  <D.22964>:
  D.22961 = compare->sreg1;
  relations->relation1.variable = D.22961;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 1;
  D.22966 = compare->data.op[1].const_val;
  D.22967 = (int) D.22966;
  relations->relation1.relation.related_value.value.constant.value = D.22967;
  <D.22965>:
  <D.22963>:
  <D.22938>:
  <D.22929>:
}


get_relation_from_branch_instruction (struct MonoInst * ins)
{
  short unsigned int D.22972;
  short unsigned int D.22973;
  short unsigned int D.22975;
  short unsigned int D.22977;
  int D.22978;
  MonoValueRelation D.22979;

  D.22972 = ins->opcode;
  D.22973 = D.22972 + 64985;
  if (D.22973 <= 9) goto <D.22969>; else goto <D.22974>;
  <D.22974>:
  D.22972 = ins->opcode;
  D.22975 = D.22972 + 64878;
  if (D.22975 <= 9) goto <D.22969>; else goto <D.22976>;
  <D.22976>:
  D.22972 = ins->opcode;
  D.22977 = D.22972 + 64888;
  if (D.22977 <= 9) goto <D.22969>; else goto <D.22970>;
  <D.22969>:
  {
    CompRelation rel;

    D.22972 = ins->opcode;
    D.22978 = (int) D.22972;
    rel = mono_opcode_to_cond (D.22978);
    switch (rel) <default: <D.22471>, case 0: <D.22461>, case 1: <D.22462>, case 2: <D.22463>, case 3: <D.22465>, case 4: <D.22467>, case 5: <D.22469>, case 6: <D.22464>, case 7: <D.22466>, case 8: <D.22468>, case 9: <D.22470>>
    <D.22461>:
    D.22979 = 1;
    return D.22979;
    <D.22462>:
    D.22979 = 6;
    return D.22979;
    <D.22463>:
    <D.22464>:
    D.22979 = 3;
    return D.22979;
    <D.22465>:
    <D.22466>:
    D.22979 = 5;
    return D.22979;
    <D.22467>:
    <D.22468>:
    D.22979 = 2;
    return D.22979;
    <D.22469>:
    <D.22470>:
    D.22979 = 4;
    return D.22979;
    <D.22471>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 421);
    D.22979 = 7;
    return D.22979;
  }
  goto <D.22971>;
  <D.22970>:
  D.22979 = 7;
  return D.22979;
  <D.22971>:
}


print_summarized_value_relation (struct MonoSummarizedValueRelation * relation)
{
  <unnamed type> D.22981;
  int D.22982;
  struct MonoSummarizedValue * D.22983;

  printf ("Relation ");
  D.22981 = relation->relation;
  D.22982 = (int) D.22981;
  print_relation (D.22982);
  printf (" with value ");
  D.22983 = &relation->related_value;
  print_summarized_value (D.22983);
}


print_relation (int relation)
{
  int D.22984;
  int D.22987;
  int D.22992;
  int print_or;

  print_or = 0;
  printf ("(");
  D.22984 = relation & 2;
  if (D.22984 != 0) goto <D.22985>; else goto <D.22986>;
  <D.22985>:
  printf ("LT");
  print_or = 1;
  <D.22986>:
  D.22987 = relation & 1;
  if (D.22987 != 0) goto <D.22988>; else goto <D.22989>;
  <D.22988>:
  if (print_or != 0) goto <D.22990>; else goto <D.22991>;
  <D.22990>:
  printf ("|");
  <D.22991>:
  printf ("EQ");
  print_or = 1;
  <D.22989>:
  D.22992 = relation & 4;
  if (D.22992 != 0) goto <D.22993>; else goto <D.22994>;
  <D.22993>:
  if (print_or != 0) goto <D.22995>; else goto <D.22996>;
  <D.22995>:
  printf ("|");
  <D.22996>:
  printf ("GT");
  print_or = 1;
  <D.22994>:
  printf (")");
}


remove_abc_from_inst (struct MonoInst * ins, struct MonoVariableRelationsEvaluationArea * area)
{
  struct MonoRelationsEvaluationContext * D.22997;
  long unsigned int D.22998;
  long unsigned int D.22999;
  long unsigned int D.23000;
  long unsigned int D.23001;
  struct MonoCompile * D.23002;
  unsigned int D.23003;
  int D.23004;
  int D.23008;
  int D.23010;
  int D.23012;
  int D.23013;
  int verbose_level.8;
  int D.23017;
  int D.23018;
  int array_variable;
  int index_variable;
  struct MonoRelationsEvaluationContext * array_context;
  struct MonoRelationsEvaluationContext * index_context;

  array_variable = ins->sreg1;
  index_variable = ins->sreg2;
  D.22997 = area->contexts;
  D.22998 = (long unsigned int) array_variable;
  D.22999 = D.22998 * 40;
  array_context = D.22997 + D.22999;
  D.22997 = area->contexts;
  D.23000 = (long unsigned int) index_variable;
  D.23001 = D.23000 * 40;
  index_context = D.22997 + D.23001;
  D.22997 = area->contexts;
  D.23002 = area->cfg;
  D.23003 = D.23002->next_vreg;
  D.23004 = (int) D.23003;
  clean_contexts (D.22997, D.23004);
  evaluate_relation_with_target_variable (area, index_variable, array_variable, 0B);
  evaluate_relation_with_target_variable (area, array_variable, array_variable, 0B);
  D.23008 = index_context->ranges.zero.lower;
  if (D.23008 >= 0) goto <D.23009>; else goto <D.23005>;
  <D.23009>:
  D.23010 = index_context->ranges.variable.upper;
  if (D.23010 < 0) goto <D.23006>; else goto <D.23011>;
  <D.23011>:
  D.23012 = index_context->ranges.zero.upper;
  D.23013 = array_context->ranges.zero.lower;
  if (D.23012 < D.23013) goto <D.23006>; else goto <D.23005>;
  <D.23006>:
  verbose_level.8 = verbose_level;
  if (verbose_level.8 > 1) goto <D.23015>; else goto <D.23016>;
  <D.23015>:
  printf ("ARRAY-ACCESS: removed bounds check on array %d with index %d\n", array_variable, index_variable);
  <D.23016>:
  ins->opcode = 316;
  ins->dreg = -1;
  ins->sreg3 = -1;
  D.23017 = ins->sreg3;
  ins->sreg2 = D.23017;
  D.23018 = ins->sreg2;
  ins->sreg1 = D.23018;
  goto <D.23007>;
  <D.23005>:
  verbose_level.8 = verbose_level;
  if (verbose_level.8 > 2) goto <D.23019>; else goto <D.23020>;
  <D.23019>:
  D.23008 = index_context->ranges.zero.lower;
  if (D.23008 >= 0) goto <D.23021>; else goto <D.23022>;
  <D.23021>:
  printf ("ARRAY-ACCESS: Removed lower bound check on array %d with index %d\n", array_variable, index_variable);
  <D.23022>:
  D.23010 = index_context->ranges.variable.upper;
  if (D.23010 < 0) goto <D.23023>; else goto <D.23024>;
  <D.23023>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through variable) on array %d with index %d\n", array_variable, index_variable);
  <D.23024>:
  D.23012 = index_context->ranges.zero.upper;
  D.23013 = array_context->ranges.zero.lower;
  if (D.23012 < D.23013) goto <D.23025>; else goto <D.23026>;
  <D.23025>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through constant) on array %d with index %d\n", array_variable, index_variable);
  <D.23026>:
  <D.23020>:
  <D.23007>:
}


clean_contexts (struct MonoRelationsEvaluationContext * contexts, int number)
{
  long unsigned int D.23027;
  long unsigned int D.23028;
  struct MonoRelationsEvaluationContext * D.23029;
  int i;

  i = 0;
  goto <D.22504>;
  <D.22503>:
  D.23027 = (long unsigned int) i;
  D.23028 = D.23027 * 40;
  D.23029 = contexts + D.23028;
  D.23029->status = 0;
  i = i + 1;
  <D.22504>:
  if (i < number) goto <D.22503>; else goto <D.22505>;
  <D.22505>:
}


evaluate_relation_with_target_variable (struct MonoVariableRelationsEvaluationArea * area, int variable, int target_variable, struct MonoRelationsEvaluationContext * father_context)
{
  struct MonoRelationsEvaluationContext * D.23030;
  long unsigned int D.23031;
  long unsigned int D.23032;
  <unnamed type> D.23033;
  struct MonoSummarizedValueRelation * D.23034;
  long unsigned int D.23035;
  int verbose_level.9;
  <unnamed type> D.23045;
  struct MonoRelationsEvaluationRange * D.23046;
  int D.23047;
  <unnamed type> D.23048;
  long unsigned int D.23051;
  long unsigned int D.23052;
  <unnamed type> D.23056;
  struct MonoSummarizedValueRelation * D.23058;
  <unnamed type> D.23059;
  int D.23061;
  unsigned int D.23062;
  int D.23071;
  int D.23073;
  int iftmp.10;
  int D.23076;
  int iftmp.11;
  int D.23091;
  int iftmp.12;
  int D.23094;
  int iftmp.13;
  int D.23109;
  int iftmp.14;
  int D.23112;
  int iftmp.15;
  int D.23127;
  int iftmp.16;
  int D.23130;
  int iftmp.17;
  struct MonoRelationsEvaluationRanges * D.23144;
  struct MonoRelationsEvaluationRanges * D.23149;
  int * D.23152;
  long unsigned int D.23153;
  long unsigned int D.23154;
  int * D.23155;
  unsigned int D.23160;
  unsigned int D.23163;
  unsigned int D.23166;
  long unsigned int D.23170;
  long unsigned int D.23171;
  struct MonoRelationsEvaluationContext * D.23172;
  int D.23173;
  int D.23174;
  int D.23175;
  int D.23176;
  int D.23177;
  int D.23178;
  int D.23179;
  int D.23180;
  int D.23181;
  int D.23182;
  int D.23183;
  int D.23184;
  int D.23185;
  int D.23190;
  int D.23191;
  int D.23192;
  int D.23193;
  struct MonoSummarizedValueRelation * D.23203;
  struct MonoSummarizedValueRelation * D.23206;
  int D.23207;
  <unnamed type> D.23210;
  int D.23213;
  <unnamed type> D.23231;
  unsigned int D.23232;
  struct MonoRelationsEvaluationContext * context;

  D.23030 = area->contexts;
  D.23031 = (long unsigned int) variable;
  D.23032 = D.23031 * 40;
  context = D.23030 + D.23032;
  D.23033 = context->status;
  switch (D.23033) <default: <D.22581>, case 0: <D.22545>, case 1: <D.22567>, case 2: <D.22580>>
  <D.22545>:
  {
    struct MonoSummarizedValueRelation * relation;

    D.23034 = area->relations;
    D.23031 = (long unsigned int) variable;
    D.23035 = D.23031 * 48;
    relation = D.23034 + D.23035;
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23037>; else goto <D.23038>;
    <D.23037>:
    printf ("Evaluating variable %d (target variable %d)\n", variable, target_variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.23038>:
    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.23039>; else goto <D.23040>;
    <D.23039>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23041>; else goto <D.23042>;
    <D.23041>:
    printf ("Target variable reached (%d), continuing to evaluate relations with constants\n", variable);
    <D.23042>:
    context->ranges.variable.lower = 0;
    context->ranges.variable.upper = 0;
    <D.23040>:
    goto <D.22564>;
    <D.22563>:
    context->current_relation = relation;
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23043>; else goto <D.23044>;
    <D.23043>:
    printf ("Processing (%d): ", variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.23044>:
    D.23045 = relation->related_value.type;
    switch (D.23045) <default: <D.22562>, case 0: <D.22547>, case 1: <D.22549>, case 2: <D.22550>, case 3: <D.22553>>
    <D.22547>:
    goto <D.22548>;
    <D.22549>:
    D.23046 = &context->ranges.zero;
    D.23047 = relation->related_value.value.constant.value;
    D.23048 = relation->relation;
    intersect_value (D.23046, D.23047, D.23048);
    goto <D.22548>;
    <D.22550>:
    D.23048 = relation->relation;
    if (D.23048 != 7) goto <D.23049>; else goto <D.23050>;
    <D.23049>:
    {
      int related_variable;
      struct MonoRelationsEvaluationContext * related_context;

      related_variable = relation->related_value.value.variable.variable;
      D.23030 = area->contexts;
      D.23051 = (long unsigned int) related_variable;
      D.23052 = D.23051 * 40;
      related_context = D.23030 + D.23052;
      D.23056 = related_context->status;
      if (D.23056 == 0) goto <D.23053>; else goto <D.23057>;
      <D.23057>:
      D.23058 = related_context->current_relation;
      D.23059 = D.23058->related_value.type;
      if (D.23059 != 2) goto <D.23053>; else goto <D.23060>;
      <D.23060>:
      D.23058 = related_context->current_relation;
      D.23061 = D.23058->related_value.value.variable.variable;
      if (D.23061 != variable) goto <D.23053>; else goto <D.23054>;
      <D.23053>:
      evaluate_relation_with_target_variable (area, related_variable, target_variable, context);
      D.23033 = context->status;
      D.23062 = D.23033 & 28;
      if (D.23062 != 0) goto <D.23063>; else goto <D.23064>;
      <D.23063>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23065>; else goto <D.23066>;
      <D.23065>:
      printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
      D.23033 = context->status;
      print_evaluation_context_status (D.23033);
      <D.23066>:
      D.23056 = related_context->status;
      if (D.23056 == 2) goto <D.23067>; else goto <D.23068>;
      <D.23067>:
      context->ranges = related_context->ranges;
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 > 0) goto <D.23072>; else goto <D.23069>;
      <D.23072>:
      D.23073 = context->ranges.zero.lower;
      if (D.23073 != -2147483648) goto <D.23074>; else goto <D.23069>;
      <D.23074>:
      D.23073 = context->ranges.zero.lower;
      D.23071 = relation->related_value.value.variable.delta;
      D.23076 = D.23073 + D.23071;
      D.23073 = context->ranges.zero.lower;
      if (D.23076 > D.23073) goto <D.23077>; else goto <D.23078>;
      <D.23077>:
      D.23073 = context->ranges.zero.lower;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.10 = D.23073 + D.23071;
      goto <D.23079>;
      <D.23078>:
      iftmp.10 = 2147483647;
      <D.23079>:
      context->ranges.zero.lower = iftmp.10;
      goto <D.23070>;
      <D.23069>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 < 0) goto <D.23080>; else goto <D.23081>;
      <D.23080>:
      D.23073 = context->ranges.zero.lower;
      if (D.23073 != 2147483647) goto <D.23082>; else goto <D.23083>;
      <D.23082>:
      D.23073 = context->ranges.zero.lower;
      D.23071 = relation->related_value.value.variable.delta;
      D.23076 = D.23073 + D.23071;
      D.23073 = context->ranges.zero.lower;
      if (D.23076 < D.23073) goto <D.23085>; else goto <D.23086>;
      <D.23085>:
      D.23073 = context->ranges.zero.lower;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.11 = D.23073 + D.23071;
      goto <D.23087>;
      <D.23086>:
      iftmp.11 = -2147483648;
      <D.23087>:
      context->ranges.zero.lower = iftmp.11;
      <D.23083>:
      <D.23081>:
      <D.23070>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 > 0) goto <D.23090>; else goto <D.23088>;
      <D.23090>:
      D.23091 = context->ranges.zero.upper;
      if (D.23091 != -2147483648) goto <D.23092>; else goto <D.23088>;
      <D.23092>:
      D.23091 = context->ranges.zero.upper;
      D.23071 = relation->related_value.value.variable.delta;
      D.23094 = D.23091 + D.23071;
      D.23091 = context->ranges.zero.upper;
      if (D.23094 > D.23091) goto <D.23095>; else goto <D.23096>;
      <D.23095>:
      D.23091 = context->ranges.zero.upper;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.12 = D.23091 + D.23071;
      goto <D.23097>;
      <D.23096>:
      iftmp.12 = 2147483647;
      <D.23097>:
      context->ranges.zero.upper = iftmp.12;
      goto <D.23089>;
      <D.23088>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 < 0) goto <D.23098>; else goto <D.23099>;
      <D.23098>:
      D.23091 = context->ranges.zero.upper;
      if (D.23091 != 2147483647) goto <D.23100>; else goto <D.23101>;
      <D.23100>:
      D.23091 = context->ranges.zero.upper;
      D.23071 = relation->related_value.value.variable.delta;
      D.23094 = D.23091 + D.23071;
      D.23091 = context->ranges.zero.upper;
      if (D.23094 < D.23091) goto <D.23103>; else goto <D.23104>;
      <D.23103>:
      D.23091 = context->ranges.zero.upper;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.13 = D.23091 + D.23071;
      goto <D.23105>;
      <D.23104>:
      iftmp.13 = -2147483648;
      <D.23105>:
      context->ranges.zero.upper = iftmp.13;
      <D.23101>:
      <D.23099>:
      <D.23089>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 > 0) goto <D.23108>; else goto <D.23106>;
      <D.23108>:
      D.23109 = context->ranges.variable.lower;
      if (D.23109 != -2147483648) goto <D.23110>; else goto <D.23106>;
      <D.23110>:
      D.23109 = context->ranges.variable.lower;
      D.23071 = relation->related_value.value.variable.delta;
      D.23112 = D.23109 + D.23071;
      D.23109 = context->ranges.variable.lower;
      if (D.23112 > D.23109) goto <D.23113>; else goto <D.23114>;
      <D.23113>:
      D.23109 = context->ranges.variable.lower;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.14 = D.23109 + D.23071;
      goto <D.23115>;
      <D.23114>:
      iftmp.14 = 2147483647;
      <D.23115>:
      context->ranges.variable.lower = iftmp.14;
      goto <D.23107>;
      <D.23106>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 < 0) goto <D.23116>; else goto <D.23117>;
      <D.23116>:
      D.23109 = context->ranges.variable.lower;
      if (D.23109 != 2147483647) goto <D.23118>; else goto <D.23119>;
      <D.23118>:
      D.23109 = context->ranges.variable.lower;
      D.23071 = relation->related_value.value.variable.delta;
      D.23112 = D.23109 + D.23071;
      D.23109 = context->ranges.variable.lower;
      if (D.23112 < D.23109) goto <D.23121>; else goto <D.23122>;
      <D.23121>:
      D.23109 = context->ranges.variable.lower;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.15 = D.23109 + D.23071;
      goto <D.23123>;
      <D.23122>:
      iftmp.15 = -2147483648;
      <D.23123>:
      context->ranges.variable.lower = iftmp.15;
      <D.23119>:
      <D.23117>:
      <D.23107>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 > 0) goto <D.23126>; else goto <D.23124>;
      <D.23126>:
      D.23127 = context->ranges.variable.upper;
      if (D.23127 != -2147483648) goto <D.23128>; else goto <D.23124>;
      <D.23128>:
      D.23127 = context->ranges.variable.upper;
      D.23071 = relation->related_value.value.variable.delta;
      D.23130 = D.23127 + D.23071;
      D.23127 = context->ranges.variable.upper;
      if (D.23130 > D.23127) goto <D.23131>; else goto <D.23132>;
      <D.23131>:
      D.23127 = context->ranges.variable.upper;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.16 = D.23127 + D.23071;
      goto <D.23133>;
      <D.23132>:
      iftmp.16 = 2147483647;
      <D.23133>:
      context->ranges.variable.upper = iftmp.16;
      goto <D.23125>;
      <D.23124>:
      D.23071 = relation->related_value.value.variable.delta;
      if (D.23071 < 0) goto <D.23134>; else goto <D.23135>;
      <D.23134>:
      D.23127 = context->ranges.variable.upper;
      if (D.23127 != 2147483647) goto <D.23136>; else goto <D.23137>;
      <D.23136>:
      D.23127 = context->ranges.variable.upper;
      D.23071 = relation->related_value.value.variable.delta;
      D.23130 = D.23127 + D.23071;
      D.23127 = context->ranges.variable.upper;
      if (D.23130 < D.23127) goto <D.23139>; else goto <D.23140>;
      <D.23139>:
      D.23127 = context->ranges.variable.upper;
      D.23071 = relation->related_value.value.variable.delta;
      iftmp.17 = D.23127 + D.23071;
      goto <D.23141>;
      <D.23140>:
      iftmp.17 = -2147483648;
      <D.23141>:
      context->ranges.variable.upper = iftmp.17;
      <D.23137>:
      <D.23135>:
      <D.23125>:
      context->status = 2;
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23142>; else goto <D.23143>;
      <D.23142>:
      printf (", ranges already computed, result: \n");
      D.23144 = &context->ranges;
      print_evaluation_context_ranges (D.23144);
      D.23071 = relation->related_value.value.variable.delta;
      printf (" (delta is %d)\n", D.23071);
      <D.23143>:
      goto <D.23145>;
      <D.23068>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23146>; else goto <D.23147>;
      <D.23146>:
      printf (", ranges not computed\n");
      <D.23147>:
      <D.23145>:
      goto <D.23148>;
      <D.23064>:
      D.23144 = &context->ranges;
      D.23149 = &related_context->ranges;
      D.23071 = relation->related_value.value.variable.delta;
      D.23048 = relation->relation;
      intersect_ranges (D.23144, D.23149, D.23071, D.23048);
      <D.23148>:
      goto <D.23055>;
      <D.23054>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23150>; else goto <D.23151>;
      <D.23150>:
      printf ("Relation is a back-edge in this traversal, skipping\n");
      <D.23151>:
      <D.23055>:
    }
    <D.23050>:
    goto <D.22548>;
    <D.22553>:
    {
      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.22560>;
          <D.22559>:
          {
            int phi_alternative;

            D.23152 = relation->related_value.value.phi.phi_alternatives;
            D.23153 = (long unsigned int) phi;
            D.23154 = D.23153 * 4;
            D.23155 = D.23152 + D.23154;
            phi_alternative = *D.23155;
            evaluate_relation_with_target_variable (area, phi_alternative, target_variable, context);
            D.23033 = context->status;
            D.23062 = D.23033 & 28;
            if (D.23062 != 0) goto <D.23156>; else goto <D.23157>;
            <D.23156>:
            verbose_level.9 = verbose_level;
            if (verbose_level.9 > 2) goto <D.23158>; else goto <D.23159>;
            <D.23158>:
            printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
            D.23033 = context->status;
            print_evaluation_context_status (D.23033);
            printf ("\n");
            <D.23159>:
            D.23033 = context->status;
            D.23160 = D.23033 & 4;
            if (D.23160 != 0) goto <D.23161>; else goto <D.23162>;
            <D.23161>:
            is_ascending = 1;
            <D.23162>:
            D.23033 = context->status;
            D.23163 = D.23033 & 8;
            if (D.23163 != 0) goto <D.23164>; else goto <D.23165>;
            <D.23164>:
            is_descending = 1;
            <D.23165>:
            D.23033 = context->status;
            D.23166 = D.23033 & 16;
            if (D.23166 != 0) goto <D.23167>; else goto <D.23168>;
            <D.23167>:
            is_ascending = 1;
            is_descending = 1;
            <D.23168>:
            context->status = 1;
            goto <D.23169>;
            <D.23157>:
            D.23030 = area->contexts;
            D.23170 = (long unsigned int) phi_alternative;
            D.23171 = D.23170 * 40;
            D.23172 = D.23030 + D.23171;
            D.23173 = D.23172->ranges.zero.lower;
            D.23174 = phi_ranges.zero.lower;
            D.23175 = MIN_EXPR <D.23173, D.23174>;
            phi_ranges.zero.lower = D.23175;
            D.23030 = area->contexts;
            D.23170 = (long unsigned int) phi_alternative;
            D.23171 = D.23170 * 40;
            D.23172 = D.23030 + D.23171;
            D.23176 = D.23172->ranges.zero.upper;
            D.23177 = phi_ranges.zero.upper;
            D.23178 = MAX_EXPR <D.23176, D.23177>;
            phi_ranges.zero.upper = D.23178;
            D.23030 = area->contexts;
            D.23170 = (long unsigned int) phi_alternative;
            D.23171 = D.23170 * 40;
            D.23172 = D.23030 + D.23171;
            D.23179 = D.23172->ranges.variable.lower;
            D.23180 = phi_ranges.variable.lower;
            D.23181 = MIN_EXPR <D.23179, D.23180>;
            phi_ranges.variable.lower = D.23181;
            D.23030 = area->contexts;
            D.23170 = (long unsigned int) phi_alternative;
            D.23171 = D.23170 * 40;
            D.23172 = D.23030 + D.23171;
            D.23182 = D.23172->ranges.variable.upper;
            D.23183 = phi_ranges.variable.upper;
            D.23184 = MAX_EXPR <D.23182, D.23183>;
            phi_ranges.variable.upper = D.23184;
            <D.23169>:
          }
          phi = phi + 1;
          <D.22560>:
          D.23185 = relation->related_value.value.phi.number_of_alternatives;
          if (D.23185 > phi) goto <D.22559>; else goto <D.22561>;
          <D.22561>:
          if (is_ascending != 0) goto <D.23186>; else goto <D.23187>;
          <D.23186>:
          phi_ranges.zero.upper = 2147483647;
          phi_ranges.variable.upper = 2147483647;
          <D.23187>:
          if (is_descending != 0) goto <D.23188>; else goto <D.23189>;
          <D.23188>:
          phi_ranges.zero.lower = -2147483648;
          phi_ranges.variable.lower = -2147483648;
          <D.23189>:
          D.23174 = phi_ranges.zero.lower;
          D.23073 = context->ranges.zero.lower;
          D.23190 = MAX_EXPR <D.23174, D.23073>;
          context->ranges.zero.lower = D.23190;
          D.23177 = phi_ranges.zero.upper;
          D.23091 = context->ranges.zero.upper;
          D.23191 = MIN_EXPR <D.23177, D.23091>;
          context->ranges.zero.upper = D.23191;
          D.23180 = phi_ranges.variable.lower;
          D.23109 = context->ranges.variable.lower;
          D.23192 = MAX_EXPR <D.23180, D.23109>;
          context->ranges.variable.lower = D.23192;
          D.23183 = phi_ranges.variable.upper;
          D.23127 = context->ranges.variable.upper;
          D.23193 = MIN_EXPR <D.23183, D.23127>;
          context->ranges.variable.upper = D.23193;
          goto <D.22548>;
        }
      finally
        {
          phi_ranges = {CLOBBER};
        }
    }
    <D.22562>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 819);
    <D.22548>:
    relation = relation->next;
    <D.22564>:
    if (relation != 0B) goto <D.22563>; else goto <D.22565>;
    <D.22565>:
    D.23033 = context->status;
    D.23062 = D.23033 & 28;
    if (D.23062 != 0) goto <D.23194>; else goto <D.23195>;
    <D.23194>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23196>; else goto <D.23197>;
    <D.23196>:
    printf ("Recursivity for variable %d (target variable %d) discards computation, status ", variable, target_variable);
    D.23033 = context->status;
    print_evaluation_context_status (D.23033);
    printf ("\n");
    <D.23197>:
    context->status = 0;
    goto <D.23198>;
    <D.23195>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23199>; else goto <D.23200>;
    <D.23199>:
    printf ("Ranges for variable %d (target variable %d) computed: ", variable, target_variable);
    D.23144 = &context->ranges;
    print_evaluation_context_ranges (D.23144);
    printf ("\n");
    <D.23200>:
    context->status = 2;
    <D.23198>:
    goto <D.22566>;
  }
  <D.22567>:
  {
    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.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23201>; else goto <D.23202>;
    <D.23201>:
    printf ("Evaluation of variable %d (target variable %d) already in progress\n", variable, target_variable);
    print_evaluation_context (context);
    D.23203 = context->current_relation;
    print_summarized_value_relation (D.23203);
    printf ("\n");
    <D.23202>:
    goto <D.22574>;
    <D.22573>:
    if (current_context == 0B) goto <D.23204>; else goto <D.23205>;
    <D.23204>:
    printf ("Broken recursive ring in ABC removal\n");
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 867);
    <D.23205>:
    D.23206 = current_context->current_relation;
    D.23207 = D.23206->relation_is_static_definition;
    if (D.23207 != 0) goto <D.23208>; else goto <D.23209>;
    <D.23208>:
    D.23206 = current_context->current_relation;
    D.23210 = D.23206->related_value.type;
    if (D.23210 == 2) goto <D.23211>; else goto <D.23212>;
    <D.23211>:
    D.23206 = current_context->current_relation;
    D.23213 = D.23206->related_value.value.variable.delta;
    path_value = D.23213 + path_value;
    goto <D.23214>;
    <D.23212>:
    D.23206 = current_context->current_relation;
    D.23210 = D.23206->related_value.type;
    if (D.23210 != 3) goto <D.23215>; else goto <D.23216>;
    <D.23215>:
    evaluation_can_be_recursive = 0;
    <D.23216>:
    <D.23214>:
    goto <D.23217>;
    <D.23209>:
    evaluation_is_definition = 0;
    evaluation_can_be_recursive = 0;
    <D.23217>:
    current_context = current_context->father;
    <D.22574>:
    if (current_context != last_context) goto <D.22573>; else goto <D.22575>;
    <D.22575>:
    if (evaluation_is_definition != 0) goto <D.23218>; else goto <D.23219>;
    <D.23218>:
    {
      MonoRelationsEvaluationStatus recursive_status;

      if (evaluation_can_be_recursive != 0) goto <D.23220>; else goto <D.23221>;
      <D.23220>:
      if (path_value > 0) goto <D.23222>; else goto <D.23223>;
      <D.23222>:
      recursive_status = 4;
      goto <D.23224>;
      <D.23223>:
      if (path_value < 0) goto <D.23225>; else goto <D.23226>;
      <D.23225>:
      recursive_status = 8;
      goto <D.23227>;
      <D.23226>:
      recursive_status = 16;
      <D.23227>:
      <D.23224>:
      goto <D.23228>;
      <D.23221>:
      recursive_status = 16;
      <D.23228>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23229>; else goto <D.23230>;
      <D.23229>:
      printf ("Recursivity accepted (");
      print_evaluation_context_status (recursive_status);
      printf (")\n");
      <D.23230>:
      current_context = father_context;
      goto <D.22578>;
      <D.22577>:
      D.23231 = current_context->status;
      D.23232 = D.23231 | recursive_status;
      current_context->status = D.23232;
      current_context = current_context->father;
      <D.22578>:
      if (current_context != last_context) goto <D.22577>; else goto <D.22579>;
      <D.22579>:
    }
    goto <D.23233>;
    <D.23219>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23234>; else goto <D.23235>;
    <D.23234>:
    printf ("Recursivity rejected (some relation in the cycle is not a defintion)\n");
    <D.23235>:
    <D.23233>:
    goto <D.22566>;
  }
  <D.22580>:
  return;
  <D.22581>:
  verbose_level.9 = verbose_level;
  if (verbose_level.9 > 2) goto <D.23236>; else goto <D.23237>;
  <D.23236>:
  printf ("Variable %d (target variable %d) already in a recursive ring, skipping\n", variable, target_variable);
  print_evaluation_context (context);
  D.23203 = context->current_relation;
  print_summarized_value_relation (D.23203);
  printf ("\n");
  <D.23237>:
  goto <D.22566>;
  <D.22566>:
}


intersect_value (struct MonoRelationsEvaluationRange * range, int value, MonoValueRelation relation)
{
  int D.23242;
  int D.23243;
  int D.23244;
  int D.23245;
  int iftmp.18;
  unsigned int value.19;
  unsigned int D.23248;
  int D.23252;
  int iftmp.20;
  int D.23257;

  switch (relation) <default: <D.22520>, case 0: <D.22511>, case 1: <D.22514>, case 2: <D.22516>, case 3: <D.22517>, case 4: <D.22518>, case 5: <D.22519>, case 6: <D.22515>, case 7: <D.22513>>
  <D.22511>:
  range->lower = 2147483647;
  range->upper = -2147483648;
  goto <D.22512>;
  <D.22513>:
  goto <D.22512>;
  <D.22514>:
  D.23242 = range->upper;
  D.23243 = MIN_EXPR <D.23242, value>;
  range->upper = D.23243;
  D.23244 = range->lower;
  D.23245 = MAX_EXPR <D.23244, value>;
  range->lower = D.23245;
  goto <D.22512>;
  <D.22515>:
  goto <D.22512>;
  <D.22516>:
  value.19 = (unsigned int) value;
  D.23248 = value.19 + 2147483647;
  if (D.23248 <= 4294967293) goto <D.23249>; else goto <D.23250>;
  <D.23249>:
  iftmp.18 = value + -1;
  goto <D.23251>;
  <D.23250>:
  iftmp.18 = value;
  <D.23251>:
  D.23242 = range->upper;
  D.23252 = MIN_EXPR <iftmp.18, D.23242>;
  range->upper = D.23252;
  goto <D.22512>;
  <D.22517>:
  D.23242 = range->upper;
  D.23243 = MIN_EXPR <D.23242, value>;
  range->upper = D.23243;
  goto <D.22512>;
  <D.22518>:
  value.19 = (unsigned int) value;
  D.23248 = value.19 + 2147483647;
  if (D.23248 <= 4294967293) goto <D.23254>; else goto <D.23255>;
  <D.23254>:
  iftmp.20 = value + 1;
  goto <D.23256>;
  <D.23255>:
  iftmp.20 = value;
  <D.23256>:
  D.23244 = range->lower;
  D.23257 = MAX_EXPR <iftmp.20, D.23244>;
  range->lower = D.23257;
  goto <D.22512>;
  <D.22519>:
  D.23244 = range->lower;
  D.23245 = MAX_EXPR <D.23244, value>;
  range->lower = D.23245;
  goto <D.22512>;
  <D.22520>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 586);
  <D.22512>:
}


intersect_ranges (struct MonoRelationsEvaluationRanges * ranges, struct MonoRelationsEvaluationRanges * other_ranges, int delta, MonoValueRelation relation)
{
  int D.23261;
  int D.23262;
  int D.23263;
  int D.23264;
  int D.23265;
  int D.23266;
  int D.23267;
  int D.23268;
  int D.23269;
  int D.23270;
  int D.23271;
  int D.23272;
  int iftmp.21;
  unsigned int D.23274;
  unsigned int D.23275;
  int D.23279;
  int iftmp.22;
  unsigned int D.23281;
  unsigned int D.23282;
  int D.23286;
  int iftmp.23;
  unsigned int D.23288;
  unsigned int D.23289;
  int D.23293;
  int iftmp.24;
  unsigned int D.23295;
  unsigned int D.23296;
  int D.23300;
  int D.23305;
  int iftmp.25;
  int D.23308;
  int iftmp.26;
  int D.23323;
  int iftmp.27;
  int D.23326;
  int iftmp.28;
  int D.23341;
  int iftmp.29;
  int D.23344;
  int iftmp.30;
  int D.23359;
  int iftmp.31;
  int D.23362;
  int iftmp.32;

  if (delta == 0) goto <D.23259>; else goto <D.23260>;
  <D.23259>:
  switch (relation) <default: <D.22536>, case 0: <D.22527>, case 1: <D.22530>, case 2: <D.22532>, case 3: <D.22533>, case 4: <D.22534>, case 5: <D.22535>, case 6: <D.22531>, case 7: <D.22529>>
  <D.22527>:
  ranges->zero.lower = 2147483647;
  ranges->zero.upper = -2147483648;
  ranges->variable.lower = 2147483647;
  ranges->variable.upper = -2147483648;
  goto <D.22528>;
  <D.22529>:
  goto <D.22528>;
  <D.22530>:
  D.23261 = other_ranges->zero.lower;
  D.23262 = ranges->zero.lower;
  D.23263 = MAX_EXPR <D.23261, D.23262>;
  ranges->zero.lower = D.23263;
  D.23264 = other_ranges->zero.upper;
  D.23265 = ranges->zero.upper;
  D.23266 = MIN_EXPR <D.23264, D.23265>;
  ranges->zero.upper = D.23266;
  D.23267 = other_ranges->variable.lower;
  D.23268 = ranges->variable.lower;
  D.23269 = MAX_EXPR <D.23267, D.23268>;
  ranges->variable.lower = D.23269;
  D.23270 = other_ranges->variable.upper;
  D.23271 = ranges->variable.upper;
  D.23272 = MIN_EXPR <D.23270, D.23271>;
  ranges->variable.upper = D.23272;
  goto <D.22528>;
  <D.22531>:
  goto <D.22528>;
  <D.22532>:
  D.23264 = other_ranges->zero.upper;
  D.23274 = (unsigned int) D.23264;
  D.23275 = D.23274 + 2147483647;
  if (D.23275 > 4294967293) goto <D.23276>; else goto <D.23277>;
  <D.23276>:
  iftmp.21 = other_ranges->zero.upper;
  goto <D.23278>;
  <D.23277>:
  D.23264 = other_ranges->zero.upper;
  iftmp.21 = D.23264 + -1;
  <D.23278>:
  D.23265 = ranges->zero.upper;
  D.23279 = MIN_EXPR <iftmp.21, D.23265>;
  ranges->zero.upper = D.23279;
  D.23270 = other_ranges->variable.upper;
  D.23281 = (unsigned int) D.23270;
  D.23282 = D.23281 + 2147483647;
  if (D.23282 > 4294967293) goto <D.23283>; else goto <D.23284>;
  <D.23283>:
  iftmp.22 = other_ranges->variable.upper;
  goto <D.23285>;
  <D.23284>:
  D.23270 = other_ranges->variable.upper;
  iftmp.22 = D.23270 + -1;
  <D.23285>:
  D.23271 = ranges->variable.upper;
  D.23286 = MIN_EXPR <iftmp.22, D.23271>;
  ranges->variable.upper = D.23286;
  goto <D.22528>;
  <D.22533>:
  D.23264 = other_ranges->zero.upper;
  D.23265 = ranges->zero.upper;
  D.23266 = MIN_EXPR <D.23264, D.23265>;
  ranges->zero.upper = D.23266;
  D.23270 = other_ranges->variable.upper;
  D.23271 = ranges->variable.upper;
  D.23272 = MIN_EXPR <D.23270, D.23271>;
  ranges->variable.upper = D.23272;
  goto <D.22528>;
  <D.22534>:
  D.23261 = other_ranges->zero.lower;
  D.23288 = (unsigned int) D.23261;
  D.23289 = D.23288 + 2147483647;
  if (D.23289 > 4294967293) goto <D.23290>; else goto <D.23291>;
  <D.23290>:
  iftmp.23 = other_ranges->zero.lower;
  goto <D.23292>;
  <D.23291>:
  D.23261 = other_ranges->zero.lower;
  iftmp.23 = D.23261 + 1;
  <D.23292>:
  D.23262 = ranges->zero.lower;
  D.23293 = MAX_EXPR <iftmp.23, D.23262>;
  ranges->zero.lower = D.23293;
  D.23267 = other_ranges->variable.lower;
  D.23295 = (unsigned int) D.23267;
  D.23296 = D.23295 + 2147483647;
  if (D.23296 > 4294967293) goto <D.23297>; else goto <D.23298>;
  <D.23297>:
  iftmp.24 = other_ranges->variable.lower;
  goto <D.23299>;
  <D.23298>:
  D.23267 = other_ranges->variable.lower;
  iftmp.24 = D.23267 + 1;
  <D.23299>:
  D.23268 = ranges->variable.lower;
  D.23300 = MAX_EXPR <iftmp.24, D.23268>;
  ranges->variable.lower = D.23300;
  goto <D.22528>;
  <D.22535>:
  D.23261 = other_ranges->zero.lower;
  D.23262 = ranges->zero.lower;
  D.23263 = MAX_EXPR <D.23261, D.23262>;
  ranges->zero.lower = D.23263;
  D.23267 = other_ranges->variable.lower;
  D.23268 = ranges->variable.lower;
  D.23269 = MAX_EXPR <D.23267, D.23268>;
  ranges->variable.lower = D.23269;
  goto <D.22528>;
  <D.22536>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 633);
  <D.22528>:
  goto <D.23301>;
  <D.23260>:
  {
    struct MonoRelationsEvaluationRanges translated_ranges;

    try
      {
        translated_ranges = *other_ranges;
        if (delta > 0) goto <D.23304>; else goto <D.23302>;
        <D.23304>:
        D.23305 = translated_ranges.zero.lower;
        if (D.23305 != -2147483648) goto <D.23306>; else goto <D.23302>;
        <D.23306>:
        D.23305 = translated_ranges.zero.lower;
        D.23308 = D.23305 + delta;
        D.23305 = translated_ranges.zero.lower;
        if (D.23308 > D.23305) goto <D.23309>; else goto <D.23310>;
        <D.23309>:
        D.23305 = translated_ranges.zero.lower;
        iftmp.25 = D.23305 + delta;
        goto <D.23311>;
        <D.23310>:
        iftmp.25 = 2147483647;
        <D.23311>:
        translated_ranges.zero.lower = iftmp.25;
        goto <D.23303>;
        <D.23302>:
        if (delta < 0) goto <D.23312>; else goto <D.23313>;
        <D.23312>:
        D.23305 = translated_ranges.zero.lower;
        if (D.23305 != 2147483647) goto <D.23314>; else goto <D.23315>;
        <D.23314>:
        D.23305 = translated_ranges.zero.lower;
        D.23308 = D.23305 + delta;
        D.23305 = translated_ranges.zero.lower;
        if (D.23308 < D.23305) goto <D.23317>; else goto <D.23318>;
        <D.23317>:
        D.23305 = translated_ranges.zero.lower;
        iftmp.26 = D.23305 + delta;
        goto <D.23319>;
        <D.23318>:
        iftmp.26 = -2147483648;
        <D.23319>:
        translated_ranges.zero.lower = iftmp.26;
        <D.23315>:
        <D.23313>:
        <D.23303>:
        if (delta > 0) goto <D.23322>; else goto <D.23320>;
        <D.23322>:
        D.23323 = translated_ranges.zero.upper;
        if (D.23323 != -2147483648) goto <D.23324>; else goto <D.23320>;
        <D.23324>:
        D.23323 = translated_ranges.zero.upper;
        D.23326 = D.23323 + delta;
        D.23323 = translated_ranges.zero.upper;
        if (D.23326 > D.23323) goto <D.23327>; else goto <D.23328>;
        <D.23327>:
        D.23323 = translated_ranges.zero.upper;
        iftmp.27 = D.23323 + delta;
        goto <D.23329>;
        <D.23328>:
        iftmp.27 = 2147483647;
        <D.23329>:
        translated_ranges.zero.upper = iftmp.27;
        goto <D.23321>;
        <D.23320>:
        if (delta < 0) goto <D.23330>; else goto <D.23331>;
        <D.23330>:
        D.23323 = translated_ranges.zero.upper;
        if (D.23323 != 2147483647) goto <D.23332>; else goto <D.23333>;
        <D.23332>:
        D.23323 = translated_ranges.zero.upper;
        D.23326 = D.23323 + delta;
        D.23323 = translated_ranges.zero.upper;
        if (D.23326 < D.23323) goto <D.23335>; else goto <D.23336>;
        <D.23335>:
        D.23323 = translated_ranges.zero.upper;
        iftmp.28 = D.23323 + delta;
        goto <D.23337>;
        <D.23336>:
        iftmp.28 = -2147483648;
        <D.23337>:
        translated_ranges.zero.upper = iftmp.28;
        <D.23333>:
        <D.23331>:
        <D.23321>:
        if (delta > 0) goto <D.23340>; else goto <D.23338>;
        <D.23340>:
        D.23341 = translated_ranges.variable.lower;
        if (D.23341 != -2147483648) goto <D.23342>; else goto <D.23338>;
        <D.23342>:
        D.23341 = translated_ranges.variable.lower;
        D.23344 = D.23341 + delta;
        D.23341 = translated_ranges.variable.lower;
        if (D.23344 > D.23341) goto <D.23345>; else goto <D.23346>;
        <D.23345>:
        D.23341 = translated_ranges.variable.lower;
        iftmp.29 = D.23341 + delta;
        goto <D.23347>;
        <D.23346>:
        iftmp.29 = 2147483647;
        <D.23347>:
        translated_ranges.variable.lower = iftmp.29;
        goto <D.23339>;
        <D.23338>:
        if (delta < 0) goto <D.23348>; else goto <D.23349>;
        <D.23348>:
        D.23341 = translated_ranges.variable.lower;
        if (D.23341 != 2147483647) goto <D.23350>; else goto <D.23351>;
        <D.23350>:
        D.23341 = translated_ranges.variable.lower;
        D.23344 = D.23341 + delta;
        D.23341 = translated_ranges.variable.lower;
        if (D.23344 < D.23341) goto <D.23353>; else goto <D.23354>;
        <D.23353>:
        D.23341 = translated_ranges.variable.lower;
        iftmp.30 = D.23341 + delta;
        goto <D.23355>;
        <D.23354>:
        iftmp.30 = -2147483648;
        <D.23355>:
        translated_ranges.variable.lower = iftmp.30;
        <D.23351>:
        <D.23349>:
        <D.23339>:
        if (delta > 0) goto <D.23358>; else goto <D.23356>;
        <D.23358>:
        D.23359 = translated_ranges.variable.upper;
        if (D.23359 != -2147483648) goto <D.23360>; else goto <D.23356>;
        <D.23360>:
        D.23359 = translated_ranges.variable.upper;
        D.23362 = D.23359 + delta;
        D.23359 = translated_ranges.variable.upper;
        if (D.23362 > D.23359) goto <D.23363>; else goto <D.23364>;
        <D.23363>:
        D.23359 = translated_ranges.variable.upper;
        iftmp.31 = D.23359 + delta;
        goto <D.23365>;
        <D.23364>:
        iftmp.31 = 2147483647;
        <D.23365>:
        translated_ranges.variable.upper = iftmp.31;
        goto <D.23357>;
        <D.23356>:
        if (delta < 0) goto <D.23366>; else goto <D.23367>;
        <D.23366>:
        D.23359 = translated_ranges.variable.upper;
        if (D.23359 != 2147483647) goto <D.23368>; else goto <D.23369>;
        <D.23368>:
        D.23359 = translated_ranges.variable.upper;
        D.23362 = D.23359 + delta;
        D.23359 = translated_ranges.variable.upper;
        if (D.23362 < D.23359) goto <D.23371>; else goto <D.23372>;
        <D.23371>:
        D.23359 = translated_ranges.variable.upper;
        iftmp.32 = D.23359 + delta;
        goto <D.23373>;
        <D.23372>:
        iftmp.32 = -2147483648;
        <D.23373>:
        translated_ranges.variable.upper = iftmp.32;
        <D.23369>:
        <D.23367>:
        <D.23357>:
        intersect_ranges (ranges, &translated_ranges, 0, relation);
      }
    finally
      {
        translated_ranges = {CLOBBER};
      }
  }
  <D.23301>:
}


print_evaluation_context_ranges (struct MonoRelationsEvaluationRanges * ranges)
{
  int D.23376;
  int D.23377;
  int D.23378;
  int D.23379;

  D.23376 = ranges->zero.lower;
  D.23377 = ranges->zero.upper;
  D.23378 = ranges->variable.lower;
  D.23379 = ranges->variable.upper;
  printf ("(ranges: zero [%d,%d], variable [%d,%d])", D.23376, D.23377, D.23378, D.23379);
}


print_evaluation_context_status (MonoRelationsEvaluationStatus status)
{
  unsigned int D.23383;
  unsigned int D.23388;
  unsigned int D.23393;
  unsigned int D.23398;
  unsigned int D.23403;

  if (status == 0) goto <D.23380>; else goto <D.23381>;
  <D.23380>:
  printf ("EVALUATION_NOT_STARTED");
  goto <D.23382>;
  <D.23381>:
  {
    gboolean print_or;

    print_or = 0;
    printf ("(");
    D.23383 = status & 1;
    if (D.23383 != 0) goto <D.23384>; else goto <D.23385>;
    <D.23384>:
    if (print_or != 0) goto <D.23386>; else goto <D.23387>;
    <D.23386>:
    printf ("|");
    <D.23387>:
    printf ("EVALUATION_IN_PROGRESS");
    print_or = 1;
    <D.23385>:
    D.23388 = status & 2;
    if (D.23388 != 0) goto <D.23389>; else goto <D.23390>;
    <D.23389>:
    if (print_or != 0) goto <D.23391>; else goto <D.23392>;
    <D.23391>:
    printf ("|");
    <D.23392>:
    printf ("EVALUATION_COMPLETED");
    print_or = 1;
    <D.23390>:
    D.23393 = status & 4;
    if (D.23393 != 0) goto <D.23394>; else goto <D.23395>;
    <D.23394>:
    if (print_or != 0) goto <D.23396>; else goto <D.23397>;
    <D.23396>:
    printf ("|");
    <D.23397>:
    printf ("RECURSIVELY_ASCENDING");
    print_or = 1;
    <D.23395>:
    D.23398 = status & 8;
    if (D.23398 != 0) goto <D.23399>; else goto <D.23400>;
    <D.23399>:
    if (print_or != 0) goto <D.23401>; else goto <D.23402>;
    <D.23401>:
    printf ("|");
    <D.23402>:
    printf ("RECURSIVELY_DESCENDING");
    print_or = 1;
    <D.23400>:
    D.23403 = status & 16;
    if (D.23403 != 0) goto <D.23404>; else goto <D.23405>;
    <D.23404>:
    if (print_or != 0) goto <D.23406>; else goto <D.23407>;
    <D.23406>:
    printf ("|");
    <D.23407>:
    printf ("RECURSIVELY_INDEFINITE");
    print_or = 1;
    <D.23405>:
    printf (")");
  }
  <D.23382>:
}


print_evaluation_context (struct MonoRelationsEvaluationContext * context)
{
  <unnamed type> D.23408;
  unsigned int D.23409;
  struct MonoRelationsEvaluationRanges * D.23412;

  printf ("Context status: ");
  D.23408 = context->status;
  print_evaluation_context_status (D.23408);
  D.23408 = context->status;
  D.23409 = D.23408 & 3;
  if (D.23409 != 0) goto <D.23410>; else goto <D.23411>;
  <D.23410>:
  D.23412 = &context->ranges;
  print_evaluation_context_ranges (D.23412);
  <D.23411>:
  printf ("\n");
}


apply_change_to_evaluation_area (struct MonoVariableRelationsEvaluationArea * area, struct MonoAdditionalVariableRelation * change)
{
  <unnamed type> D.23413;
  struct MonoSummarizedValueRelation * D.23416;
  int D.23417;
  long unsigned int D.23418;
  long unsigned int D.23419;
  struct MonoSummarizedValueRelation * D.23420;
  int D.23422;
  struct MonoSummarizedValueRelation * D.23423;
  struct MonoSummarizedValueRelation * base_relation;

  D.23413 = change->relation.relation;
  if (D.23413 != 7) goto <D.23414>; else goto <D.23415>;
  <D.23414>:
  D.23416 = area->relations;
  D.23417 = change->variable;
  D.23418 = (long unsigned int) D.23417;
  D.23419 = D.23418 * 48;
  base_relation = D.23416 + D.23419;
  goto <D.22493>;
  <D.22492>:
  base_relation = base_relation->next;
  <D.22493>:
  D.23420 = base_relation->next;
  if (D.23420 != 0B) goto <D.23421>; else goto <D.22494>;
  <D.23421>:
  D.23420 = base_relation->next;
  D.23422 = D.23420->relation_is_static_definition;
  if (D.23422 != 0) goto <D.22492>; else goto <D.22494>;
  <D.22494>:
  change->insertion_point = base_relation;
  D.23420 = base_relation->next;
  change->relation.next = D.23420;
  D.23423 = &change->relation;
  base_relation->next = D.23423;
  <D.23415>:
}


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

  new_list = mono_mempool_alloc (mp, 16);
  new_list->data = data;
  new_list->next = 0B;
  if (list != 0B) goto <D.23424>; else goto <D.23425>;
  <D.23424>:
  last = list;
  goto <D.7219>;
  <D.7218>:
  last = last->next;
  <D.7219>:
  D.23426 = last->next;
  if (D.23426 != 0B) goto <D.7218>; else goto <D.7220>;
  <D.7220>:
  last->next = new_list;
  D.23427 = list;
  return D.23427;
  <D.23425>:
  D.23427 = new_list;
  return D.23427;
}


eval_non_null (struct MonoVariableRelationsEvaluationArea * area, int reg)
{
  struct MonoRelationsEvaluationContext * D.23429;
  long unsigned int D.23430;
  long unsigned int D.23431;
  struct MonoCompile * D.23432;
  unsigned int D.23433;
  int D.23434;
  gboolean D.23435;
  int D.23436;
  _Bool D.23437;
  struct MonoRelationsEvaluationContext * context;

  D.23429 = area->contexts;
  D.23430 = (long unsigned int) reg;
  D.23431 = D.23430 * 40;
  context = D.23429 + D.23431;
  D.23429 = area->contexts;
  D.23432 = area->cfg;
  D.23433 = D.23432->next_vreg;
  D.23434 = (int) D.23433;
  clean_contexts (D.23429, D.23434);
  evaluate_relation_with_target_variable (area, reg, reg, 0B);
  D.23436 = context->ranges.zero.lower;
  D.23437 = D.23436 > 0;
  D.23435 = (gboolean) D.23437;
  return D.23435;
}


add_non_null (struct MonoVariableRelationsEvaluationArea * area, struct MonoCompile * cfg, int reg, struct GSList * * check_relations)
{
  struct MonoMemPool * D.23439;
  struct GSList * D.23440;
  struct GSList * D.23441;
  struct MonoAdditionalVariableRelation * rel;

  D.23439 = cfg->mempool;
  rel = mono_mempool_alloc0 (D.23439, 64);
  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.23439 = cfg->mempool;
  D.23440 = *check_relations;
  D.23441 = g_slist_append_mempool (D.23439, D.23440, rel);
  *check_relations = D.23441;
}


remove_change_from_evaluation_area (struct MonoAdditionalVariableRelation * change)
{
  struct MonoSummarizedValueRelation * D.23442;
  struct MonoSummarizedValueRelation * D.23445;

  D.23442 = change->insertion_point;
  if (D.23442 != 0B) goto <D.23443>; else goto <D.23444>;
  <D.23443>:
  D.23442 = change->insertion_point;
  D.23445 = change->relation.next;
  D.23442->next = D.23445;
  change->relation.next = 0B;
  <D.23444>:
}


