mono_perform_abc_removal (struct MonoCompile * cfg)
{
  unsigned int D.22144;
  int verbose_level.0;
  int verbose_level.1;
  struct MonoMethod * D.22149;
  char * D.22150;
  unsigned int D.22151;
  unsigned int D.22152;
  struct MonoMemPool * D.22153;
  void * D.22154;
  unsigned int D.22155;
  void * D.22156;
  unsigned int D.22157;
  void * D.22158;
  void * D.22159;
  MonoIntegerValueKind * D.22160;
  unsigned int i.2;
  unsigned int D.22162;
  MonoIntegerValueKind * D.22163;
  struct MonoSummarizedValueRelation * D.22164;
  unsigned int D.22165;
  struct MonoSummarizedValueRelation * D.22166;
  struct MonoInst * * D.22167;
  struct MonoInst * * D.22168;
  unsigned int i.3;
  int D.22172;
  short unsigned int D.22173;
  int D.22174;
  int D.22175;
  int D.22176;
  char D.22179;
  short unsigned int D.22181;
  struct MonoInst * iftmp.4;
  int D.22187;
  unsigned int D.22188;
  unsigned int D.22189;
  struct MonoInst * * D.22192;
  unsigned int D.22193;
  unsigned int D.22194;
  struct MonoInst * * D.22195;
  MonoIntegerValueKind * D.22199;
  struct MonoType * D.22200;
  <unnamed type> D.22201;
  <unnamed type> D.22202;
  unsigned int D.22203;
  struct MonoSummarizedValueRelation * D.22204;
  int D.22205;
  struct MonoSummarizedValueRelation * D.22208;
  int D.22211;
  struct MonoSummarizedValue * D.22218;
  <unnamed type> D.22219;
  unsigned int D.22222;
  unsigned int related_index.5;
  unsigned int D.22224;
  struct MonoSummarizedValueRelation * D.22225;
  int D.22226;
  int D.22227;
  unsigned int related_variable.6;
  unsigned int D.22229;
  struct MonoSummarizedValueRelation * D.22230;
  struct MonoSummarizedValueRelation * D.22231;
  struct MonoSummarizedValueRelation * D.22232;
  struct MonoSummarizedValue * D.22235;
  struct MonoBasicBlock * * D.22236;
  struct MonoBasicBlock * D.22237;
  struct MonoVariableRelationsEvaluationArea area;
  struct MonoBasicBlock * bb;
  int i;

  try
    {
      D.22144 = cfg->verbose_level;
      verbose_level.0 = (int) D.22144;
      verbose_level = verbose_level.0;
      verbose_level.1 = verbose_level;
      if (verbose_level.1 > 2) goto <D.22147>; else goto <D.22148>;
      <D.22147>:
      D.22149 = cfg->method;
      D.22150 = mono_method_full_name (D.22149, 1);
      printf ("\nRemoving array bound checks in %s\n", D.22150);
      <D.22148>:
      area.cfg = cfg;
      D.22151 = cfg->next_vreg;
      D.22152 = D.22151 * 48;
      D.22153 = cfg->mempool;
      D.22154 = mono_mempool_alloc (D.22153, D.22152);
      area.relations = D.22154;
      D.22151 = cfg->next_vreg;
      D.22155 = D.22151 * 28;
      D.22153 = cfg->mempool;
      D.22156 = mono_mempool_alloc (D.22153, D.22155);
      area.contexts = D.22156;
      D.22151 = cfg->next_vreg;
      D.22157 = D.22151 * 4;
      D.22153 = cfg->mempool;
      D.22158 = mono_mempool_alloc (D.22153, D.22157);
      area.variable_value_kind = D.22158;
      D.22151 = cfg->next_vreg;
      D.22157 = D.22151 * 4;
      D.22153 = cfg->mempool;
      D.22159 = mono_mempool_alloc (D.22153, D.22157);
      area.defs = D.22159;
      i = 0;
      goto <D.22123>;
      <D.22122>:
      D.22160 = area.variable_value_kind;
      i.2 = (unsigned int) i;
      D.22162 = i.2 * 4;
      D.22163 = D.22160 + D.22162;
      *D.22163 = 0;
      D.22164 = area.relations;
      i.2 = (unsigned int) i;
      D.22165 = i.2 * 24;
      D.22166 = D.22164 + D.22165;
      D.22166->relation = 1;
      D.22164 = area.relations;
      i.2 = (unsigned int) i;
      D.22165 = i.2 * 24;
      D.22166 = D.22164 + D.22165;
      D.22166->relation_is_static_definition = 1;
      D.22164 = area.relations;
      i.2 = (unsigned int) i;
      D.22165 = i.2 * 24;
      D.22166 = D.22164 + D.22165;
      D.22166->related_value.type = 0;
      D.22164 = area.relations;
      i.2 = (unsigned int) i;
      D.22165 = i.2 * 24;
      D.22166 = D.22164 + D.22165;
      D.22166->next = 0B;
      D.22167 = area.defs;
      i.2 = (unsigned int) i;
      D.22162 = i.2 * 4;
      D.22168 = D.22167 + D.22162;
      *D.22168 = 0B;
      i = i + 1;
      <D.22123>:
      i.3 = (unsigned int) i;
      D.22151 = cfg->next_vreg;
      if (i.3 < D.22151) goto <D.22122>; else goto <D.22124>;
      <D.22124>:
      bb = cfg->bb_entry;
      goto <D.22136>;
      <D.22135>:
      {
        struct MonoInst * ins;

        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.22170>; else goto <D.22171>;
        <D.22170>:
        D.22172 = bb->block_num;
        printf ("\nABCREM BLOCK %d:\n", D.22172);
        <D.22171>:
        ins = bb->code;
        goto <D.22133>;
        <D.22132>:
        {
          const char * spec;

          D.22173 = ins->opcode;
          D.22174 = (int) D.22173;
          D.22175 = D.22174 + -313;
          D.22176 = D.22175 * 4;
          spec = &ins_info[D.22176];
          D.22179 = *spec;
          if (D.22179 == 32) goto <D.22177>; else goto <D.22180>;
          <D.22180>:
          D.22173 = ins->opcode;
          D.22181 = D.22173 + 65162;
          if (D.22181 <= 16) goto <D.22177>; else goto <D.22178>;
          <D.22177>:
          // predicted unlikely by continue predictor.
          goto <D.22127>;
          <D.22178>:
          D.22179 = *spec;
          if (D.22179 == 105) goto <D.22182>; else goto <D.22183>;
          <D.22182>:
          {
            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.22184>; else goto <D.22185>;
                <D.22184>:
                mono_print_ins (ins);
                <D.22185>:
                D.22187 = ins->dreg;
                D.22188 = (unsigned int) D.22187;
                D.22189 = cfg->vreg_to_inst_len;
                if (D.22188 < D.22189) goto <D.22190>; else goto <D.22191>;
                <D.22190>:
                D.22192 = cfg->vreg_to_inst;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22194 = D.22193 * 4;
                D.22195 = D.22192 + D.22194;
                iftmp.4 = *D.22195;
                goto <D.22196>;
                <D.22191>:
                iftmp.4 = 0B;
                <D.22196>:
                var = iftmp.4;
                if (var != 0B) goto <D.22197>; else goto <D.22198>;
                <D.22197>:
                D.22160 = area.variable_value_kind;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22194 = D.22193 * 4;
                D.22199 = D.22160 + D.22194;
                D.22200 = var->data.op[1].vtype;
                D.22201 = type_to_value_kind (D.22200);
                *D.22199 = D.22201;
                <D.22198>:
                D.22160 = area.variable_value_kind;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22194 = D.22193 * 4;
                D.22199 = D.22160 + D.22194;
                D.22202 = *D.22199;
                D.22164 = area.relations;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22203 = D.22193 * 24;
                D.22204 = D.22164 + D.22203;
                effective_value_kind = get_relation_from_ins (&area, ins, D.22204, D.22202);
                range.lower = -2147483648;
                range.upper = 2147483647;
                D.22160 = area.variable_value_kind;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22194 = D.22193 * 4;
                D.22199 = D.22160 + D.22194;
                D.22202 = *D.22199;
                apply_value_kind_to_range (&range, D.22202);
                apply_value_kind_to_range (&range, effective_value_kind);
                D.22205 = range.upper;
                if (D.22205 != 2147483647) goto <D.22206>; else goto <D.22207>;
                <D.22206>:
                D.22153 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22153, 24);
                type_relation->relation = 3;
                type_relation->related_value.type = 1;
                D.22205 = range.upper;
                type_relation->related_value.value.constant.value = D.22205;
                type_relation->relation_is_static_definition = 1;
                D.22164 = area.relations;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22203 = D.22193 * 24;
                D.22204 = D.22164 + D.22203;
                D.22208 = D.22204->next;
                type_relation->next = D.22208;
                D.22164 = area.relations;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22203 = D.22193 * 24;
                D.22204 = D.22164 + D.22203;
                D.22204->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22209>; else goto <D.22210>;
                <D.22209>:
                D.22205 = range.upper;
                D.22187 = ins->dreg;
                printf ("[var%d <= %d]", D.22187, D.22205);
                <D.22210>:
                <D.22207>:
                D.22211 = range.lower;
                if (D.22211 != -2147483648) goto <D.22212>; else goto <D.22213>;
                <D.22212>:
                D.22153 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22153, 24);
                type_relation->relation = 5;
                type_relation->related_value.type = 1;
                D.22211 = range.lower;
                type_relation->related_value.value.constant.value = D.22211;
                type_relation->relation_is_static_definition = 1;
                D.22164 = area.relations;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22203 = D.22193 * 24;
                D.22204 = D.22164 + D.22203;
                D.22208 = D.22204->next;
                type_relation->next = D.22208;
                D.22164 = area.relations;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22203 = D.22193 * 24;
                D.22204 = D.22164 + D.22203;
                D.22204->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22214>; else goto <D.22215>;
                <D.22214>:
                D.22211 = range.lower;
                D.22187 = ins->dreg;
                printf ("[var%d >= %d]", D.22187, D.22211);
                <D.22215>:
                <D.22213>:
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22216>; else goto <D.22217>;
                <D.22216>:
                D.22187 = ins->dreg;
                printf ("Summarized variable %d: ", D.22187);
                D.22164 = area.relations;
                D.22187 = ins->dreg;
                D.22193 = (unsigned int) D.22187;
                D.22203 = D.22193 * 24;
                D.22204 = D.22164 + D.22203;
                D.22218 = &D.22204->related_value;
                print_summarized_value (D.22218);
                printf ("\n");
                <D.22217>:
              }
            finally
              {
                range = {CLOBBER};
              }
          }
          <D.22183>:
        }
        <D.22127>:
        ins = ins->next;
        <D.22133>:
        if (ins != 0B) goto <D.22132>; else goto <D.22134>;
        <D.22134>:
      }
      bb = bb->next_bb;
      <D.22136>:
      if (bb != 0B) goto <D.22135>; else goto <D.22137>;
      <D.22137>:
      i = 0;
      goto <D.22141>;
      <D.22140>:
      D.22164 = area.relations;
      i.2 = (unsigned int) i;
      D.22165 = i.2 * 24;
      D.22166 = D.22164 + D.22165;
      D.22219 = D.22166->related_value.type;
      if (D.22219 == 2) goto <D.22220>; else goto <D.22221>;
      <D.22220>:
      {
        int related_index;
        int related_variable;

        D.22151 = cfg->next_vreg;
        i.3 = (unsigned int) i;
        D.22222 = D.22151 + i.3;
        related_index = (int) D.22222;
        D.22164 = area.relations;
        i.2 = (unsigned int) i;
        D.22165 = i.2 * 24;
        D.22166 = D.22164 + D.22165;
        related_variable = D.22166->related_value.value.variable.variable;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22225->relation = 1;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22225->relation_is_static_definition = 1;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22225->related_value.type = 2;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22225->related_value.value.variable.variable = i;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22164 = area.relations;
        i.2 = (unsigned int) i;
        D.22165 = i.2 * 24;
        D.22166 = D.22164 + D.22165;
        D.22226 = D.22166->related_value.value.variable.delta;
        D.22227 = -D.22226;
        D.22225->related_value.value.variable.delta = D.22227;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22164 = area.relations;
        related_variable.6 = (unsigned int) related_variable;
        D.22229 = related_variable.6 * 24;
        D.22230 = D.22164 + D.22229;
        D.22231 = D.22230->next;
        D.22225->next = D.22231;
        D.22164 = area.relations;
        related_variable.6 = (unsigned int) related_variable;
        D.22229 = related_variable.6 * 24;
        D.22230 = D.22164 + D.22229;
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22232 = D.22164 + D.22224;
        D.22230->next = D.22232;
        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.22233>; else goto <D.22234>;
        <D.22233>:
        printf ("Added symmetric summarized value for variable variable %d (to %d): ", i, related_variable);
        D.22164 = area.relations;
        related_index.5 = (unsigned int) related_index;
        D.22224 = related_index.5 * 24;
        D.22225 = D.22164 + D.22224;
        D.22235 = &D.22225->related_value;
        print_summarized_value (D.22235);
        printf ("\n");
        <D.22234>:
      }
      <D.22221>:
      i = i + 1;
      <D.22141>:
      i.3 = (unsigned int) i;
      D.22151 = cfg->next_vreg;
      if (i.3 < D.22151) goto <D.22140>; else goto <D.22142>;
      <D.22142>:
      D.22236 = cfg->bblocks;
      D.22237 = *D.22236;
      process_block (cfg, D.22237, &area);
    }
  finally
    {
      area = {CLOBBER};
    }
}


type_to_value_kind (struct MonoType * type)
{
  unsigned char D.22238;
  unsigned char D.22239;
  MonoIntegerValueKind D.22242;
  unsigned char D.22243;
  int D.22244;

  D.22238 = BIT_FIELD_REF <*type, 8, 56>;
  D.22239 = D.22238 & 64;
  if (D.22239 != 0) goto <D.22240>; else goto <D.22241>;
  <D.22240>:
  D.22242 = 0;
  return D.22242;
  <D.22241>:
  D.22243 = type->type;
  D.22244 = (int) D.22243;
  switch (D.22244) <default: <D.22115>, case 4: <D.22105>, case 5: <D.22106>, case 6: <D.22107>, case 7: <D.22108>, case 8: <D.22109>, case 9: <D.22110>, case 10: <D.22113>, case 11: <D.22114>, case 24: <D.22111>, case 25: <D.22112>>
  <D.22105>:
  D.22242 = 1;
  return D.22242;
  <D.22106>:
  D.22242 = 17;
  return D.22242;
  <D.22107>:
  D.22242 = 2;
  return D.22242;
  <D.22108>:
  D.22242 = 18;
  return D.22242;
  <D.22109>:
  D.22242 = 4;
  return D.22242;
  <D.22110>:
  D.22242 = 20;
  return D.22242;
  <D.22111>:
  D.22242 = 4;
  return D.22242;
  <D.22112>:
  D.22242 = 20;
  return D.22242;
  <D.22113>:
  D.22242 = 8;
  return D.22242;
  <D.22114>:
  D.22242 = 24;
  return D.22242;
  <D.22115>:
  D.22242 = 0;
  return D.22242;
}


get_relation_from_ins (struct MonoVariableRelationsEvaluationArea * area, struct MonoInst * ins, struct MonoSummarizedValueRelation * result, MonoIntegerValueKind result_value_kind)
{
  unsigned char D.22246;
  short unsigned int D.22253;
  int D.22254;
  int D.22255;
  int D.22256;
  int * D.22257;
  int D.22258;
  int * D.22259;
  int D.22260;
  int D.22261;
  int D.22262;
  struct MonoInst * * D.22263;
  int D.22264;
  unsigned int D.22265;
  unsigned int D.22266;
  struct MonoInst * * D.22267;
  MonoIntegerValueKind D.22268;
  MonoIntegerValueKind value_kind;
  struct MonoSummarizedValue * value;

  value = &result->related_value;
  D.22246 = ins->type;
  if (D.22246 == 2) goto <D.22247>; else goto <D.22248>;
  <D.22247>:
  value_kind = 8;
  goto <D.22249>;
  <D.22248>:
  D.22246 = ins->type;
  if (D.22246 == 1) goto <D.22250>; else goto <D.22251>;
  <D.22250>:
  value_kind = 4;
  goto <D.22252>;
  <D.22251>:
  value_kind = 0;
  <D.22252>:
  <D.22249>:
  result->relation = 1;
  value->type = 0;
  D.22253 = ins->opcode;
  D.22254 = (int) D.22253;
  switch (D.22254) <default: <D.21928>, case 314: <D.21927>, case 319: <D.21921>, case 362: <D.21917>, case 428: <D.21919>, case 575: <D.21924>, case 629: <D.21922>, case 630: <D.21923>, case 766: <D.21920>, case 786: <D.21926>, case 787: <D.21925>>
  <D.21917>:
  value->type = 1;
  D.22255 = ins->data.op[0].const_val;
  value->value.constant.value = D.22255;
  goto <D.21918>;
  <D.21919>:
  value->type = 2;
  D.22256 = ins->sreg1;
  value->value.variable.variable = D.22256;
  value->value.variable.delta = 0;
  goto <D.21918>;
  <D.21920>:
  value->type = 2;
  D.22256 = ins->sreg1;
  value->value.variable.variable = D.22256;
  value->value.variable.delta = 0;
  value_kind = 8;
  goto <D.21918>;
  <D.21921>:
  value->type = 3;
  D.22257 = ins->data.op[1].phi_args;
  D.22258 = *D.22257;
  value->value.phi.number_of_alternatives = D.22258;
  D.22257 = ins->data.op[1].phi_args;
  D.22259 = D.22257 + 4;
  value->value.phi.phi_alternatives = D.22259;
  goto <D.21918>;
  <D.21922>:
  value->type = 2;
  D.22256 = ins->sreg1;
  value->value.variable.variable = D.22256;
  D.22260 = ins->data.op[1].const_val;
  value->value.variable.delta = D.22260;
  goto <D.21918>;
  <D.21923>:
  value->type = 2;
  D.22256 = ins->sreg1;
  value->value.variable.variable = D.22256;
  D.22260 = ins->data.op[1].const_val;
  D.22261 = -D.22260;
  value->value.variable.delta = D.22261;
  goto <D.21918>;
  <D.21924>:
  result->relation = 2;
  value->type = 2;
  D.22262 = ins->sreg2;
  value->value.variable.variable = D.22262;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.21918>;
  <D.21925>:
  value->type = 2;
  D.22256 = ins->sreg1;
  value->value.variable.variable = D.22256;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.21918>;
  <D.21926>:
  value->type = 2;
  D.22256 = ins->sreg1;
  value->value.variable.variable = D.22256;
  value->value.variable.delta = 0;
  D.22263 = area->defs;
  D.22264 = ins->dreg;
  D.22265 = (unsigned int) D.22264;
  D.22266 = D.22265 * 4;
  D.22267 = D.22263 + D.22266;
  *D.22267 = ins;
  goto <D.21918>;
  <D.21927>:
  result->relation = 4;
  value->type = 1;
  value->value.constant.value = 0;
  goto <D.21918>;
  <D.21928>:
  goto <D.21918>;
  <D.21918>:
  D.22268 = value_kind;
  return D.22268;
}


apply_value_kind_to_range (struct MonoRelationsEvaluationRange * range, MonoIntegerValueKind value_kind)
{
  unsigned int D.22273;
  int D.22276;
  unsigned int D.22279;
  int D.22282;

  if (value_kind != 0) goto <D.22271>; else goto <D.22272>;
  <D.22271>:
  D.22273 = value_kind & 16;
  if (D.22273 != 0) goto <D.22274>; else goto <D.22275>;
  <D.22274>:
  D.22276 = range->lower;
  if (D.22276 < 0) goto <D.22277>; else goto <D.22278>;
  <D.22277>:
  range->lower = 0;
  <D.22278>:
  D.22279 = value_kind & 15;
  if (D.22279 == 1) goto <D.22280>; else goto <D.22281>;
  <D.22280>:
  D.22282 = range->upper;
  if (D.22282 > 255) goto <D.22283>; else goto <D.22284>;
  <D.22283>:
  range->upper = 255;
  <D.22284>:
  goto <D.22285>;
  <D.22281>:
  D.22279 = value_kind & 15;
  if (D.22279 == 2) goto <D.22286>; else goto <D.22287>;
  <D.22286>:
  D.22282 = range->upper;
  if (D.22282 > 65535) goto <D.22288>; else goto <D.22289>;
  <D.22288>:
  range->upper = 65535;
  <D.22289>:
  <D.22287>:
  <D.22285>:
  goto <D.22290>;
  <D.22275>:
  D.22279 = value_kind & 15;
  if (D.22279 == 1) goto <D.22291>; else goto <D.22292>;
  <D.22291>:
  D.22276 = range->lower;
  if (D.22276 < -128) goto <D.22293>; else goto <D.22294>;
  <D.22293>:
  range->lower = -128;
  <D.22294>:
  D.22282 = range->upper;
  if (D.22282 > 127) goto <D.22295>; else goto <D.22296>;
  <D.22295>:
  range->upper = 127;
  <D.22296>:
  goto <D.22297>;
  <D.22292>:
  D.22279 = value_kind & 15;
  if (D.22279 == 2) goto <D.22298>; else goto <D.22299>;
  <D.22298>:
  D.22276 = range->lower;
  if (D.22276 < -32768) goto <D.22300>; else goto <D.22301>;
  <D.22300>:
  range->lower = -32768;
  <D.22301>:
  D.22282 = range->upper;
  if (D.22282 > 32767) goto <D.22302>; else goto <D.22303>;
  <D.22302>:
  range->upper = 32767;
  <D.22303>:
  <D.22299>:
  <D.22297>:
  <D.22290>:
  <D.22272>:
}


print_summarized_value (struct MonoSummarizedValue * value)
{
  <unnamed type> D.22304;
  int D.22305;
  int D.22306;
  int D.22307;
  int * D.22310;
  unsigned int phi.7;
  unsigned int D.22312;
  int * D.22313;
  int D.22314;
  int D.22315;

  D.22304 = value->type;
  switch (D.22304) <default: <D.21889>, case 0: <D.21880>, case 1: <D.21882>, case 2: <D.21883>, case 3: <D.21884>>
  <D.21880>:
  printf ("ANY");
  goto <D.21881>;
  <D.21882>:
  D.22305 = value->value.constant.value;
  printf ("CONSTANT %d", D.22305);
  goto <D.21881>;
  <D.21883>:
  D.22306 = value->value.variable.delta;
  D.22307 = value->value.variable.variable;
  printf ("VARIABLE %d, delta %d", D.22307, D.22306);
  goto <D.21881>;
  <D.21884>:
  {
    int phi;

    printf ("PHI (");
    phi = 0;
    goto <D.21887>;
    <D.21886>:
    if (phi != 0) goto <D.22308>; else goto <D.22309>;
    <D.22308>:
    printf (",");
    <D.22309>:
    D.22310 = value->value.phi.phi_alternatives;
    phi.7 = (unsigned int) phi;
    D.22312 = phi.7 * 4;
    D.22313 = D.22310 + D.22312;
    D.22314 = *D.22313;
    printf ("%d", D.22314);
    phi = phi + 1;
    <D.21887>:
    D.22315 = value->value.phi.number_of_alternatives;
    if (D.22315 > phi) goto <D.21886>; else goto <D.21888>;
    <D.21888>:
    printf (")");
    goto <D.21881>;
  }
  <D.21889>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 118);
  <D.21881>:
}


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

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


process_block (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoVariableRelationsEvaluationArea * area)
{
  int verbose_level.8;
  int D.22321;
  int D.22322;
  unsigned int D.22323;
  <unnamed type> D.22328;
  int D.22331;
  <unnamed type> D.22332;
  int D.22335;
  short unsigned int D.22338;
  struct MonoMemPool * D.22345;
  struct GSList * check_relations.9;
  struct GSList * check_relations.10;
  struct GSList * check_relations.11;
  int D.22351;
  int D.22352;
  int D.22357;
  int D.22358;
  short unsigned int D.22363;
  short unsigned int D.22367;
  struct MonoInst * * D.22371;
  unsigned int reg.12;
  unsigned int D.22373;
  struct MonoInst * * D.22374;
  struct MonoInst * D.22375;
  short unsigned int D.22378;
  unsigned char D.22383;
  unsigned char D.22384;
  void * D.22387;
  void * D.22388;
  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.22319>; else goto <D.22320>;
      <D.22319>:
      D.22321 = bb->dfn;
      D.22322 = bb->block_num;
      printf ("\nProcessing block %d [dfn %d]...\n", D.22322, D.22321);
      <D.22320>:
      D.22323 = bb->region;
      if (D.22323 != 4294967295) goto <D.22324>; else goto <D.22325>;
      <D.22324>:
      return;
      <D.22325>:
      get_relations_from_previous_bb (area, bb, &additional_relations);
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22326>; else goto <D.22327>;
      <D.22326>:
      D.22328 = additional_relations.relation1.relation.relation;
      if (D.22328 != 7) goto <D.22329>; else goto <D.22330>;
      <D.22329>:
      D.22331 = additional_relations.relation1.variable;
      printf ("Adding relation 1 on variable %d: ", D.22331);
      print_summarized_value_relation (&additional_relations.relation1.relation);
      printf ("\n");
      <D.22330>:
      D.22332 = additional_relations.relation2.relation.relation;
      if (D.22332 != 7) goto <D.22333>; else goto <D.22334>;
      <D.22333>:
      D.22335 = additional_relations.relation2.variable;
      printf ("Adding relation 2 on variable %d: ", D.22335);
      print_summarized_value_relation (&additional_relations.relation2.relation);
      printf ("\n");
      <D.22334>:
      <D.22327>:
      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.22094>;
      <D.22093>:
      {
        struct MonoAdditionalVariableRelation * rel;
        int array_var;
        int index_var;

        verbose_level.8 = verbose_level;
        if (verbose_level.8 > 2) goto <D.22336>; else goto <D.22337>;
        <D.22336>:
        printf ("Processing instruction %d\n", inst_index);
        inst_index = inst_index + 1;
        <D.22337>:
        D.22338 = ins->opcode;
        if (D.22338 == 788) goto <D.22339>; else goto <D.22340>;
        <D.22339>:
        verbose_level.8 = verbose_level;
        if (verbose_level.8 > 2) goto <D.22341>; else goto <D.22342>;
        <D.22341>:
        printf ("Attempting check removal...\n");
        <D.22342>:
        array_var = ins->sreg1;
        index_var = ins->sreg2;
        remove_abc_from_inst (ins, area);
        D.22338 = ins->opcode;
        if (D.22338 != 316) goto <D.22343>; else goto <D.22344>;
        <D.22343>:
        D.22345 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22345, 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);
        check_relations.9 = check_relations;
        D.22345 = cfg->mempool;
        check_relations.10 = g_slist_append_mempool (D.22345, check_relations.9, rel);
        check_relations = check_relations.10;
        D.22345 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22345, 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);
        check_relations.9 = check_relations;
        D.22345 = cfg->mempool;
        check_relations.11 = g_slist_append_mempool (D.22345, check_relations.9, rel);
        check_relations = check_relations.11;
        <D.22344>:
        <D.22340>:
        D.22338 = ins->opcode;
        if (D.22338 == 340) goto <D.22349>; else goto <D.22350>;
        <D.22349>:
        D.22351 = ins->sreg1;
        D.22352 = eval_non_null (area, D.22351);
        if (D.22352 != 0) goto <D.22353>; else goto <D.22354>;
        <D.22353>:
        verbose_level.8 = verbose_level;
        if (verbose_level.8 > 1) goto <D.22355>; else goto <D.22356>;
        <D.22355>:
        printf ("ARRAY-ACCESS: removed check_this instruction.\n");
        <D.22356>:
        ins->opcode = 316;
        ins->dreg = -1;
        ins->sreg3 = -1;
        D.22357 = ins->sreg3;
        ins->sreg2 = D.22357;
        D.22358 = ins->sreg2;
        ins->sreg1 = D.22358;
        <D.22354>:
        <D.22350>:
        D.22338 = ins->opcode;
        if (D.22338 == 803) goto <D.22359>; else goto <D.22360>;
        <D.22359>:
        D.22351 = ins->sreg1;
        add_non_null (area, cfg, D.22351, &check_relations);
        <D.22360>:
        if (0 != 0) goto <D.22361>; else goto <D.22362>;
        <D.22361>:
        {
          int reg;

          D.22338 = ins->opcode;
          D.22363 = D.22338 + 65162;
          if (D.22363 <= 16) goto <D.22364>; else goto <D.22365>;
          <D.22364>:
          reg = ins->dreg;
          goto <D.22366>;
          <D.22365>:
          D.22338 = ins->opcode;
          D.22367 = D.22338 + 65145;
          if (D.22367 <= 12) goto <D.22368>; else goto <D.22369>;
          <D.22368>:
          reg = ins->sreg1;
          goto <D.22370>;
          <D.22369>:
          reg = ins->sreg1;
          <D.22370>:
          <D.22366>:
          D.22371 = area->defs;
          reg.12 = (unsigned int) reg;
          D.22373 = reg.12 * 4;
          D.22374 = D.22371 + D.22373;
          D.22375 = *D.22374;
          if (D.22375 != 0B) goto <D.22376>; else goto <D.22377>;
          <D.22376>:
          D.22371 = area->defs;
          reg.12 = (unsigned int) reg;
          D.22373 = reg.12 * 4;
          D.22374 = D.22371 + D.22373;
          D.22375 = *D.22374;
          D.22378 = D.22375->opcode;
          if (D.22378 == 786) goto <D.22379>; else goto <D.22380>;
          <D.22379>:
          verbose_level.8 = verbose_level;
          if (verbose_level.8 > 1) goto <D.22381>; else goto <D.22382>;
          <D.22381>:
          printf ("ARRAY-ACCESS: removed MONO_INST_FAULT flag.\n");
          <D.22382>:
          D.22383 = ins->flags;
          D.22384 = D.22383 & 223;
          ins->flags = D.22384;
          <D.22380>:
          <D.22377>:
        }
        <D.22362>:
      }
      ins = ins->next;
      <D.22094>:
      if (ins != 0B) goto <D.22093>; else goto <D.22095>;
      <D.22095>:
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22385>; else goto <D.22386>;
      <D.22385>:
      D.22321 = bb->dfn;
      D.22322 = bb->block_num;
      printf ("Processing block %d [dfn %d] done.\n", D.22322, D.22321);
      <D.22386>:
      dominated_bb = bb->dominated;
      goto <D.22097>;
      <D.22096>:
      D.22387 = dominated_bb->data;
      process_block (cfg, D.22387, area);
      dominated_bb = dominated_bb->next;
      <D.22097>:
      if (dominated_bb != 0B) goto <D.22096>; else goto <D.22098>;
      <D.22098>:
      l = check_relations;
      goto <D.22100>;
      <D.22099>:
      D.22388 = l->data;
      remove_change_from_evaluation_area (D.22388);
      l = l->next;
      <D.22100>:
      if (l != 0B) goto <D.22099>; else goto <D.22101>;
      <D.22101>:
      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.22392;
  struct MonoBasicBlock * * D.22395;
  struct MonoInst * D.22398;
  struct MonoInst * D.22400;
  struct MonoInst * D.22401;
  struct MonoBasicBlock * * D.22404;
  struct MonoBasicBlock * D.22405;
  struct MonoBasicBlock * * D.22409;
  struct MonoBasicBlock * D.22410;
  unsigned int D.22416;
  unsigned int D.22417;
  unsigned int D.22418;
  unsigned int D.22419;
  unsigned int D.22420;
  unsigned int D.22421;
  unsigned int D.22422;
  short unsigned int D.22423;
  int D.22426;
  int D.22427;
  int D.22431;
  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.22392 = bb->in_count;
  if (D.22392 == 1) goto <D.22393>; else goto <D.22394>;
  <D.22393>:
  D.22395 = bb->in_bb;
  in_bb = *D.22395;
  D.22398 = in_bb->last_ins;
  if (D.22398 == 0B) goto <D.22396>; else goto <D.22399>;
  <D.22399>:
  D.22400 = in_bb->code;
  D.22398 = in_bb->last_ins;
  if (D.22400 == D.22398) goto <D.22396>; else goto <D.22397>;
  <D.22396>:
  return;
  <D.22397>:
  ins = in_bb->code;
  goto <D.21957>;
  <D.21956>:
  ins = ins->next;
  <D.21957>:
  D.22401 = ins->next;
  D.22398 = in_bb->last_ins;
  if (D.22401 != D.22398) goto <D.21956>; else goto <D.21958>;
  <D.21958>:
  compare = ins;
  branch = ins->next;
  branch_relation = get_relation_from_branch_instruction (branch);
  if (branch_relation != 7) goto <D.22402>; else goto <D.22403>;
  <D.22402>:
  D.22404 = branch->data.op[1].many_blocks;
  D.22405 = *D.22404;
  if (D.22405 == bb) goto <D.22406>; else goto <D.22407>;
  <D.22406>:
  code_path = 1;
  goto <D.22408>;
  <D.22407>:
  D.22404 = branch->data.op[1].many_blocks;
  D.22409 = D.22404 + 4;
  D.22410 = *D.22409;
  if (D.22410 == bb) goto <D.22411>; else goto <D.22412>;
  <D.22411>:
  code_path = 0;
  goto <D.22413>;
  <D.22412>:
  code_path = 1;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 475);
  <D.22413>:
  <D.22408>:
  if (code_path == 0) goto <D.22414>; else goto <D.22415>;
  <D.22414>:
  D.22416 = ~branch_relation;
  branch_relation = D.22416 & 7;
  <D.22415>:
  D.22417 = branch_relation & 1;
  D.22418 = branch_relation & 2;
  D.22419 = D.22418 << 1;
  D.22420 = D.22417 | D.22419;
  D.22421 = branch_relation & 4;
  D.22422 = D.22421 >> 1;
  symmetric_relation = D.22420 | D.22422;
  D.22423 = compare->opcode;
  if (D.22423 == 326) goto <D.22424>; else goto <D.22425>;
  <D.22424>:
  D.22426 = compare->sreg1;
  relations->relation1.variable = D.22426;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 2;
  D.22427 = compare->sreg2;
  relations->relation1.relation.related_value.value.variable.variable = D.22427;
  relations->relation1.relation.related_value.value.variable.delta = 0;
  D.22427 = compare->sreg2;
  relations->relation2.variable = D.22427;
  relations->relation2.relation.relation = symmetric_relation;
  relations->relation2.relation.related_value.type = 2;
  D.22426 = compare->sreg1;
  relations->relation2.relation.related_value.value.variable.variable = D.22426;
  relations->relation2.relation.related_value.value.variable.delta = 0;
  goto <D.22428>;
  <D.22425>:
  D.22423 = compare->opcode;
  if (D.22423 == 327) goto <D.22429>; else goto <D.22430>;
  <D.22429>:
  D.22426 = compare->sreg1;
  relations->relation1.variable = D.22426;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 1;
  D.22431 = compare->data.op[1].const_val;
  relations->relation1.relation.related_value.value.constant.value = D.22431;
  <D.22430>:
  <D.22428>:
  <D.22403>:
  <D.22394>:
}


get_relation_from_branch_instruction (struct MonoInst * ins)
{
  short unsigned int D.22436;
  short unsigned int D.22437;
  _Bool D.22438;
  short unsigned int D.22439;
  _Bool D.22440;
  _Bool D.22441;
  short unsigned int D.22443;
  short unsigned int D.22444;
  int D.22445;
  MonoValueRelation D.22446;

  D.22436 = ins->opcode;
  D.22437 = D.22436 + 64981;
  D.22438 = D.22437 <= 9;
  D.22439 = D.22436 + 64874;
  D.22440 = D.22439 <= 9;
  D.22441 = D.22438 | D.22440;
  if (D.22441 != 0) goto <D.22433>; else goto <D.22442>;
  <D.22442>:
  D.22443 = ins->opcode;
  D.22444 = D.22443 + 64884;
  if (D.22444 <= 9) goto <D.22433>; else goto <D.22434>;
  <D.22433>:
  {
    CompRelation rel;

    D.22443 = ins->opcode;
    D.22445 = (int) D.22443;
    rel = mono_opcode_to_cond (D.22445);
    switch (rel) <default: <D.21943>, case 0: <D.21933>, case 1: <D.21934>, case 2: <D.21935>, case 3: <D.21937>, case 4: <D.21939>, case 5: <D.21941>, case 6: <D.21936>, case 7: <D.21938>, case 8: <D.21940>, case 9: <D.21942>>
    <D.21933>:
    D.22446 = 1;
    return D.22446;
    <D.21934>:
    D.22446 = 6;
    return D.22446;
    <D.21935>:
    <D.21936>:
    D.22446 = 3;
    return D.22446;
    <D.21937>:
    <D.21938>:
    D.22446 = 5;
    return D.22446;
    <D.21939>:
    <D.21940>:
    D.22446 = 2;
    return D.22446;
    <D.21941>:
    <D.21942>:
    D.22446 = 4;
    return D.22446;
    <D.21943>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 421);
    D.22446 = 7;
    return D.22446;
  }
  goto <D.22435>;
  <D.22434>:
  D.22446 = 7;
  return D.22446;
  <D.22435>:
}


print_summarized_value_relation (struct MonoSummarizedValueRelation * relation)
{
  <unnamed type> D.22448;
  int D.22449;
  struct MonoSummarizedValue * D.22450;

  printf ("Relation ");
  D.22448 = relation->relation;
  D.22449 = (int) D.22448;
  print_relation (D.22449);
  printf (" with value ");
  D.22450 = &relation->related_value;
  print_summarized_value (D.22450);
}


print_relation (int relation)
{
  int D.22451;
  int D.22454;
  int D.22459;
  int print_or;

  print_or = 0;
  printf ("(");
  D.22451 = relation & 2;
  if (D.22451 != 0) goto <D.22452>; else goto <D.22453>;
  <D.22452>:
  printf ("LT");
  print_or = 1;
  <D.22453>:
  D.22454 = relation & 1;
  if (D.22454 != 0) goto <D.22455>; else goto <D.22456>;
  <D.22455>:
  if (print_or != 0) goto <D.22457>; else goto <D.22458>;
  <D.22457>:
  printf ("|");
  <D.22458>:
  printf ("EQ");
  print_or = 1;
  <D.22456>:
  D.22459 = relation & 4;
  if (D.22459 != 0) goto <D.22460>; else goto <D.22461>;
  <D.22460>:
  if (print_or != 0) goto <D.22462>; else goto <D.22463>;
  <D.22462>:
  printf ("|");
  <D.22463>:
  printf ("GT");
  print_or = 1;
  <D.22461>:
  printf (")");
}


remove_abc_from_inst (struct MonoInst * ins, struct MonoVariableRelationsEvaluationArea * area)
{
  struct MonoRelationsEvaluationContext * D.22464;
  unsigned int array_variable.13;
  unsigned int D.22466;
  unsigned int index_variable.14;
  unsigned int D.22468;
  struct MonoCompile * D.22469;
  unsigned int D.22470;
  int D.22471;
  int D.22475;
  int D.22477;
  int D.22479;
  int D.22480;
  int verbose_level.15;
  int D.22484;
  int D.22485;
  int array_variable;
  int index_variable;
  struct MonoRelationsEvaluationContext * array_context;
  struct MonoRelationsEvaluationContext * index_context;

  array_variable = ins->sreg1;
  index_variable = ins->sreg2;
  D.22464 = area->contexts;
  array_variable.13 = (unsigned int) array_variable;
  D.22466 = array_variable.13 * 28;
  array_context = D.22464 + D.22466;
  D.22464 = area->contexts;
  index_variable.14 = (unsigned int) index_variable;
  D.22468 = index_variable.14 * 28;
  index_context = D.22464 + D.22468;
  D.22469 = area->cfg;
  D.22470 = D.22469->next_vreg;
  D.22471 = (int) D.22470;
  D.22464 = area->contexts;
  clean_contexts (D.22464, D.22471);
  evaluate_relation_with_target_variable (area, index_variable, array_variable, 0B);
  evaluate_relation_with_target_variable (area, array_variable, array_variable, 0B);
  D.22475 = index_context->ranges.zero.lower;
  if (D.22475 >= 0) goto <D.22476>; else goto <D.22472>;
  <D.22476>:
  D.22477 = index_context->ranges.variable.upper;
  if (D.22477 < 0) goto <D.22473>; else goto <D.22478>;
  <D.22478>:
  D.22479 = index_context->ranges.zero.upper;
  D.22480 = array_context->ranges.zero.lower;
  if (D.22479 < D.22480) goto <D.22473>; else goto <D.22472>;
  <D.22473>:
  verbose_level.15 = verbose_level;
  if (verbose_level.15 > 1) goto <D.22482>; else goto <D.22483>;
  <D.22482>:
  printf ("ARRAY-ACCESS: removed bounds check on array %d with index %d\n", array_variable, index_variable);
  <D.22483>:
  ins->opcode = 316;
  ins->dreg = -1;
  ins->sreg3 = -1;
  D.22484 = ins->sreg3;
  ins->sreg2 = D.22484;
  D.22485 = ins->sreg2;
  ins->sreg1 = D.22485;
  goto <D.22474>;
  <D.22472>:
  verbose_level.15 = verbose_level;
  if (verbose_level.15 > 2) goto <D.22486>; else goto <D.22487>;
  <D.22486>:
  D.22475 = index_context->ranges.zero.lower;
  if (D.22475 >= 0) goto <D.22488>; else goto <D.22489>;
  <D.22488>:
  printf ("ARRAY-ACCESS: Removed lower bound check on array %d with index %d\n", array_variable, index_variable);
  <D.22489>:
  D.22477 = index_context->ranges.variable.upper;
  if (D.22477 < 0) goto <D.22490>; else goto <D.22491>;
  <D.22490>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through variable) on array %d with index %d\n", array_variable, index_variable);
  <D.22491>:
  D.22479 = index_context->ranges.zero.upper;
  D.22480 = array_context->ranges.zero.lower;
  if (D.22479 < D.22480) goto <D.22492>; else goto <D.22493>;
  <D.22492>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through constant) on array %d with index %d\n", array_variable, index_variable);
  <D.22493>:
  <D.22487>:
  <D.22474>:
}


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

  i = 0;
  goto <D.21976>;
  <D.21975>:
  i.16 = (unsigned int) i;
  D.22495 = i.16 * 28;
  D.22496 = contexts + D.22495;
  D.22496->status = 0;
  i = i + 1;
  <D.21976>:
  if (i < number) goto <D.21975>; else goto <D.21977>;
  <D.21977>:
}


evaluate_relation_with_target_variable (struct MonoVariableRelationsEvaluationArea * area, int variable, int target_variable, struct MonoRelationsEvaluationContext * father_context)
{
  struct MonoRelationsEvaluationContext * D.22497;
  unsigned int variable.17;
  unsigned int D.22499;
  <unnamed type> D.22500;
  struct MonoSummarizedValueRelation * D.22501;
  unsigned int D.22502;
  int verbose_level.18;
  <unnamed type> D.22512;
  <unnamed type> D.22513;
  int D.22514;
  struct MonoRelationsEvaluationRange * D.22515;
  unsigned int related_variable.19;
  unsigned int D.22519;
  <unnamed type> D.22523;
  struct MonoSummarizedValueRelation * D.22525;
  <unnamed type> D.22526;
  int D.22528;
  unsigned int D.22529;
  int D.22538;
  int D.22540;
  int iftmp.20;
  int D.22543;
  int iftmp.21;
  int D.22558;
  int iftmp.22;
  int D.22561;
  int iftmp.23;
  int D.22576;
  int iftmp.24;
  int D.22579;
  int iftmp.25;
  int D.22594;
  int iftmp.26;
  int D.22597;
  int iftmp.27;
  struct MonoRelationsEvaluationRanges * D.22611;
  struct MonoRelationsEvaluationRanges * D.22616;
  int * D.22619;
  unsigned int phi.28;
  unsigned int D.22621;
  int * D.22622;
  unsigned int D.22627;
  unsigned int D.22630;
  unsigned int D.22633;
  unsigned int phi_alternative.29;
  unsigned int D.22638;
  struct MonoRelationsEvaluationContext * D.22639;
  int D.22640;
  int D.22641;
  int D.22642;
  int D.22643;
  int D.22644;
  int D.22645;
  int D.22646;
  int D.22647;
  int D.22648;
  int D.22649;
  int D.22650;
  int D.22651;
  int D.22652;
  int D.22657;
  int D.22658;
  int D.22659;
  int D.22660;
  struct MonoSummarizedValueRelation * D.22670;
  struct MonoSummarizedValueRelation * D.22673;
  int D.22674;
  <unnamed type> D.22677;
  int D.22680;
  <unnamed type> D.22698;
  unsigned int D.22699;
  struct MonoRelationsEvaluationContext * context;

  D.22497 = area->contexts;
  variable.17 = (unsigned int) variable;
  D.22499 = variable.17 * 28;
  context = D.22497 + D.22499;
  D.22500 = context->status;
  switch (D.22500) <default: <D.22053>, case 0: <D.22017>, case 1: <D.22039>, case 2: <D.22052>>
  <D.22017>:
  {
    struct MonoSummarizedValueRelation * relation;

    D.22501 = area->relations;
    variable.17 = (unsigned int) variable;
    D.22502 = variable.17 * 24;
    relation = D.22501 + D.22502;
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22504>; else goto <D.22505>;
    <D.22504>:
    printf ("Evaluating variable %d (target variable %d)\n", variable, target_variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22505>:
    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.22506>; else goto <D.22507>;
    <D.22506>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22508>; else goto <D.22509>;
    <D.22508>:
    printf ("Target variable reached (%d), continuing to evaluate relations with constants\n", variable);
    <D.22509>:
    context->ranges.variable.lower = 0;
    context->ranges.variable.upper = 0;
    <D.22507>:
    goto <D.22036>;
    <D.22035>:
    context->current_relation = relation;
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22510>; else goto <D.22511>;
    <D.22510>:
    printf ("Processing (%d): ", variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22511>:
    D.22512 = relation->related_value.type;
    switch (D.22512) <default: <D.22034>, case 0: <D.22019>, case 1: <D.22021>, case 2: <D.22022>, case 3: <D.22025>>
    <D.22019>:
    goto <D.22020>;
    <D.22021>:
    D.22513 = relation->relation;
    D.22514 = relation->related_value.value.constant.value;
    D.22515 = &context->ranges.zero;
    intersect_value (D.22515, D.22514, D.22513);
    goto <D.22020>;
    <D.22022>:
    D.22513 = relation->relation;
    if (D.22513 != 7) goto <D.22516>; else goto <D.22517>;
    <D.22516>:
    {
      int related_variable;
      struct MonoRelationsEvaluationContext * related_context;

      related_variable = relation->related_value.value.variable.variable;
      D.22497 = area->contexts;
      related_variable.19 = (unsigned int) related_variable;
      D.22519 = related_variable.19 * 28;
      related_context = D.22497 + D.22519;
      D.22523 = related_context->status;
      if (D.22523 == 0) goto <D.22520>; else goto <D.22524>;
      <D.22524>:
      D.22525 = related_context->current_relation;
      D.22526 = D.22525->related_value.type;
      if (D.22526 != 2) goto <D.22520>; else goto <D.22527>;
      <D.22527>:
      D.22525 = related_context->current_relation;
      D.22528 = D.22525->related_value.value.variable.variable;
      if (D.22528 != variable) goto <D.22520>; else goto <D.22521>;
      <D.22520>:
      evaluate_relation_with_target_variable (area, related_variable, target_variable, context);
      D.22500 = context->status;
      D.22529 = D.22500 & 28;
      if (D.22529 != 0) goto <D.22530>; else goto <D.22531>;
      <D.22530>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22532>; else goto <D.22533>;
      <D.22532>:
      printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
      D.22500 = context->status;
      print_evaluation_context_status (D.22500);
      <D.22533>:
      D.22523 = related_context->status;
      if (D.22523 == 2) goto <D.22534>; else goto <D.22535>;
      <D.22534>:
      context->ranges = related_context->ranges;
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 > 0) goto <D.22539>; else goto <D.22536>;
      <D.22539>:
      D.22540 = context->ranges.zero.lower;
      if (D.22540 != -2147483648) goto <D.22541>; else goto <D.22536>;
      <D.22541>:
      D.22540 = context->ranges.zero.lower;
      D.22538 = relation->related_value.value.variable.delta;
      D.22543 = D.22540 + D.22538;
      D.22540 = context->ranges.zero.lower;
      if (D.22543 > D.22540) goto <D.22544>; else goto <D.22545>;
      <D.22544>:
      D.22540 = context->ranges.zero.lower;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.20 = D.22540 + D.22538;
      goto <D.22546>;
      <D.22545>:
      iftmp.20 = 2147483647;
      <D.22546>:
      context->ranges.zero.lower = iftmp.20;
      goto <D.22537>;
      <D.22536>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 < 0) goto <D.22547>; else goto <D.22548>;
      <D.22547>:
      D.22540 = context->ranges.zero.lower;
      if (D.22540 != 2147483647) goto <D.22549>; else goto <D.22550>;
      <D.22549>:
      D.22540 = context->ranges.zero.lower;
      D.22538 = relation->related_value.value.variable.delta;
      D.22543 = D.22540 + D.22538;
      D.22540 = context->ranges.zero.lower;
      if (D.22543 < D.22540) goto <D.22552>; else goto <D.22553>;
      <D.22552>:
      D.22540 = context->ranges.zero.lower;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.21 = D.22540 + D.22538;
      goto <D.22554>;
      <D.22553>:
      iftmp.21 = -2147483648;
      <D.22554>:
      context->ranges.zero.lower = iftmp.21;
      <D.22550>:
      <D.22548>:
      <D.22537>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 > 0) goto <D.22557>; else goto <D.22555>;
      <D.22557>:
      D.22558 = context->ranges.zero.upper;
      if (D.22558 != -2147483648) goto <D.22559>; else goto <D.22555>;
      <D.22559>:
      D.22558 = context->ranges.zero.upper;
      D.22538 = relation->related_value.value.variable.delta;
      D.22561 = D.22558 + D.22538;
      D.22558 = context->ranges.zero.upper;
      if (D.22561 > D.22558) goto <D.22562>; else goto <D.22563>;
      <D.22562>:
      D.22558 = context->ranges.zero.upper;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.22 = D.22558 + D.22538;
      goto <D.22564>;
      <D.22563>:
      iftmp.22 = 2147483647;
      <D.22564>:
      context->ranges.zero.upper = iftmp.22;
      goto <D.22556>;
      <D.22555>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 < 0) goto <D.22565>; else goto <D.22566>;
      <D.22565>:
      D.22558 = context->ranges.zero.upper;
      if (D.22558 != 2147483647) goto <D.22567>; else goto <D.22568>;
      <D.22567>:
      D.22558 = context->ranges.zero.upper;
      D.22538 = relation->related_value.value.variable.delta;
      D.22561 = D.22558 + D.22538;
      D.22558 = context->ranges.zero.upper;
      if (D.22561 < D.22558) goto <D.22570>; else goto <D.22571>;
      <D.22570>:
      D.22558 = context->ranges.zero.upper;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.23 = D.22558 + D.22538;
      goto <D.22572>;
      <D.22571>:
      iftmp.23 = -2147483648;
      <D.22572>:
      context->ranges.zero.upper = iftmp.23;
      <D.22568>:
      <D.22566>:
      <D.22556>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 > 0) goto <D.22575>; else goto <D.22573>;
      <D.22575>:
      D.22576 = context->ranges.variable.lower;
      if (D.22576 != -2147483648) goto <D.22577>; else goto <D.22573>;
      <D.22577>:
      D.22576 = context->ranges.variable.lower;
      D.22538 = relation->related_value.value.variable.delta;
      D.22579 = D.22576 + D.22538;
      D.22576 = context->ranges.variable.lower;
      if (D.22579 > D.22576) goto <D.22580>; else goto <D.22581>;
      <D.22580>:
      D.22576 = context->ranges.variable.lower;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.24 = D.22576 + D.22538;
      goto <D.22582>;
      <D.22581>:
      iftmp.24 = 2147483647;
      <D.22582>:
      context->ranges.variable.lower = iftmp.24;
      goto <D.22574>;
      <D.22573>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 < 0) goto <D.22583>; else goto <D.22584>;
      <D.22583>:
      D.22576 = context->ranges.variable.lower;
      if (D.22576 != 2147483647) goto <D.22585>; else goto <D.22586>;
      <D.22585>:
      D.22576 = context->ranges.variable.lower;
      D.22538 = relation->related_value.value.variable.delta;
      D.22579 = D.22576 + D.22538;
      D.22576 = context->ranges.variable.lower;
      if (D.22579 < D.22576) goto <D.22588>; else goto <D.22589>;
      <D.22588>:
      D.22576 = context->ranges.variable.lower;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.25 = D.22576 + D.22538;
      goto <D.22590>;
      <D.22589>:
      iftmp.25 = -2147483648;
      <D.22590>:
      context->ranges.variable.lower = iftmp.25;
      <D.22586>:
      <D.22584>:
      <D.22574>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 > 0) goto <D.22593>; else goto <D.22591>;
      <D.22593>:
      D.22594 = context->ranges.variable.upper;
      if (D.22594 != -2147483648) goto <D.22595>; else goto <D.22591>;
      <D.22595>:
      D.22594 = context->ranges.variable.upper;
      D.22538 = relation->related_value.value.variable.delta;
      D.22597 = D.22594 + D.22538;
      D.22594 = context->ranges.variable.upper;
      if (D.22597 > D.22594) goto <D.22598>; else goto <D.22599>;
      <D.22598>:
      D.22594 = context->ranges.variable.upper;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.26 = D.22594 + D.22538;
      goto <D.22600>;
      <D.22599>:
      iftmp.26 = 2147483647;
      <D.22600>:
      context->ranges.variable.upper = iftmp.26;
      goto <D.22592>;
      <D.22591>:
      D.22538 = relation->related_value.value.variable.delta;
      if (D.22538 < 0) goto <D.22601>; else goto <D.22602>;
      <D.22601>:
      D.22594 = context->ranges.variable.upper;
      if (D.22594 != 2147483647) goto <D.22603>; else goto <D.22604>;
      <D.22603>:
      D.22594 = context->ranges.variable.upper;
      D.22538 = relation->related_value.value.variable.delta;
      D.22597 = D.22594 + D.22538;
      D.22594 = context->ranges.variable.upper;
      if (D.22597 < D.22594) goto <D.22606>; else goto <D.22607>;
      <D.22606>:
      D.22594 = context->ranges.variable.upper;
      D.22538 = relation->related_value.value.variable.delta;
      iftmp.27 = D.22594 + D.22538;
      goto <D.22608>;
      <D.22607>:
      iftmp.27 = -2147483648;
      <D.22608>:
      context->ranges.variable.upper = iftmp.27;
      <D.22604>:
      <D.22602>:
      <D.22592>:
      context->status = 2;
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22609>; else goto <D.22610>;
      <D.22609>:
      printf (", ranges already computed, result: \n");
      D.22611 = &context->ranges;
      print_evaluation_context_ranges (D.22611);
      D.22538 = relation->related_value.value.variable.delta;
      printf (" (delta is %d)\n", D.22538);
      <D.22610>:
      goto <D.22612>;
      <D.22535>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22613>; else goto <D.22614>;
      <D.22613>:
      printf (", ranges not computed\n");
      <D.22614>:
      <D.22612>:
      goto <D.22615>;
      <D.22531>:
      D.22513 = relation->relation;
      D.22538 = relation->related_value.value.variable.delta;
      D.22616 = &related_context->ranges;
      D.22611 = &context->ranges;
      intersect_ranges (D.22611, D.22616, D.22538, D.22513);
      <D.22615>:
      goto <D.22522>;
      <D.22521>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22617>; else goto <D.22618>;
      <D.22617>:
      printf ("Relation is a back-edge in this traversal, skipping\n");
      <D.22618>:
      <D.22522>:
    }
    <D.22517>:
    goto <D.22020>;
    <D.22025>:
    {
      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.22032>;
          <D.22031>:
          {
            int phi_alternative;

            D.22619 = relation->related_value.value.phi.phi_alternatives;
            phi.28 = (unsigned int) phi;
            D.22621 = phi.28 * 4;
            D.22622 = D.22619 + D.22621;
            phi_alternative = *D.22622;
            evaluate_relation_with_target_variable (area, phi_alternative, target_variable, context);
            D.22500 = context->status;
            D.22529 = D.22500 & 28;
            if (D.22529 != 0) goto <D.22623>; else goto <D.22624>;
            <D.22623>:
            verbose_level.18 = verbose_level;
            if (verbose_level.18 > 2) goto <D.22625>; else goto <D.22626>;
            <D.22625>:
            printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
            D.22500 = context->status;
            print_evaluation_context_status (D.22500);
            printf ("\n");
            <D.22626>:
            D.22500 = context->status;
            D.22627 = D.22500 & 4;
            if (D.22627 != 0) goto <D.22628>; else goto <D.22629>;
            <D.22628>:
            is_ascending = 1;
            <D.22629>:
            D.22500 = context->status;
            D.22630 = D.22500 & 8;
            if (D.22630 != 0) goto <D.22631>; else goto <D.22632>;
            <D.22631>:
            is_descending = 1;
            <D.22632>:
            D.22500 = context->status;
            D.22633 = D.22500 & 16;
            if (D.22633 != 0) goto <D.22634>; else goto <D.22635>;
            <D.22634>:
            is_ascending = 1;
            is_descending = 1;
            <D.22635>:
            context->status = 1;
            goto <D.22636>;
            <D.22624>:
            D.22497 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22638 = phi_alternative.29 * 28;
            D.22639 = D.22497 + D.22638;
            D.22640 = D.22639->ranges.zero.lower;
            D.22641 = phi_ranges.zero.lower;
            D.22642 = MIN_EXPR <D.22640, D.22641>;
            phi_ranges.zero.lower = D.22642;
            D.22497 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22638 = phi_alternative.29 * 28;
            D.22639 = D.22497 + D.22638;
            D.22643 = D.22639->ranges.zero.upper;
            D.22644 = phi_ranges.zero.upper;
            D.22645 = MAX_EXPR <D.22643, D.22644>;
            phi_ranges.zero.upper = D.22645;
            D.22497 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22638 = phi_alternative.29 * 28;
            D.22639 = D.22497 + D.22638;
            D.22646 = D.22639->ranges.variable.lower;
            D.22647 = phi_ranges.variable.lower;
            D.22648 = MIN_EXPR <D.22646, D.22647>;
            phi_ranges.variable.lower = D.22648;
            D.22497 = area->contexts;
            phi_alternative.29 = (unsigned int) phi_alternative;
            D.22638 = phi_alternative.29 * 28;
            D.22639 = D.22497 + D.22638;
            D.22649 = D.22639->ranges.variable.upper;
            D.22650 = phi_ranges.variable.upper;
            D.22651 = MAX_EXPR <D.22649, D.22650>;
            phi_ranges.variable.upper = D.22651;
            <D.22636>:
          }
          phi = phi + 1;
          <D.22032>:
          D.22652 = relation->related_value.value.phi.number_of_alternatives;
          if (D.22652 > phi) goto <D.22031>; else goto <D.22033>;
          <D.22033>:
          if (is_ascending != 0) goto <D.22653>; else goto <D.22654>;
          <D.22653>:
          phi_ranges.zero.upper = 2147483647;
          phi_ranges.variable.upper = 2147483647;
          <D.22654>:
          if (is_descending != 0) goto <D.22655>; else goto <D.22656>;
          <D.22655>:
          phi_ranges.zero.lower = -2147483648;
          phi_ranges.variable.lower = -2147483648;
          <D.22656>:
          D.22641 = phi_ranges.zero.lower;
          D.22540 = context->ranges.zero.lower;
          D.22657 = MAX_EXPR <D.22641, D.22540>;
          context->ranges.zero.lower = D.22657;
          D.22644 = phi_ranges.zero.upper;
          D.22558 = context->ranges.zero.upper;
          D.22658 = MIN_EXPR <D.22644, D.22558>;
          context->ranges.zero.upper = D.22658;
          D.22647 = phi_ranges.variable.lower;
          D.22576 = context->ranges.variable.lower;
          D.22659 = MAX_EXPR <D.22647, D.22576>;
          context->ranges.variable.lower = D.22659;
          D.22650 = phi_ranges.variable.upper;
          D.22594 = context->ranges.variable.upper;
          D.22660 = MIN_EXPR <D.22650, D.22594>;
          context->ranges.variable.upper = D.22660;
          goto <D.22020>;
        }
      finally
        {
          phi_ranges = {CLOBBER};
        }
    }
    <D.22034>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 819);
    <D.22020>:
    relation = relation->next;
    <D.22036>:
    if (relation != 0B) goto <D.22035>; else goto <D.22037>;
    <D.22037>:
    D.22500 = context->status;
    D.22529 = D.22500 & 28;
    if (D.22529 != 0) goto <D.22661>; else goto <D.22662>;
    <D.22661>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22663>; else goto <D.22664>;
    <D.22663>:
    printf ("Recursivity for variable %d (target variable %d) discards computation, status ", variable, target_variable);
    D.22500 = context->status;
    print_evaluation_context_status (D.22500);
    printf ("\n");
    <D.22664>:
    context->status = 0;
    goto <D.22665>;
    <D.22662>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22666>; else goto <D.22667>;
    <D.22666>:
    printf ("Ranges for variable %d (target variable %d) computed: ", variable, target_variable);
    D.22611 = &context->ranges;
    print_evaluation_context_ranges (D.22611);
    printf ("\n");
    <D.22667>:
    context->status = 2;
    <D.22665>:
    goto <D.22038>;
  }
  <D.22039>:
  {
    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.22668>; else goto <D.22669>;
    <D.22668>:
    printf ("Evaluation of variable %d (target variable %d) already in progress\n", variable, target_variable);
    print_evaluation_context (context);
    D.22670 = context->current_relation;
    print_summarized_value_relation (D.22670);
    printf ("\n");
    <D.22669>:
    goto <D.22046>;
    <D.22045>:
    if (current_context == 0B) goto <D.22671>; else goto <D.22672>;
    <D.22671>:
    printf ("Broken recursive ring in ABC removal\n");
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 867);
    <D.22672>:
    D.22673 = current_context->current_relation;
    D.22674 = D.22673->relation_is_static_definition;
    if (D.22674 != 0) goto <D.22675>; else goto <D.22676>;
    <D.22675>:
    D.22673 = current_context->current_relation;
    D.22677 = D.22673->related_value.type;
    if (D.22677 == 2) goto <D.22678>; else goto <D.22679>;
    <D.22678>:
    D.22673 = current_context->current_relation;
    D.22680 = D.22673->related_value.value.variable.delta;
    path_value = D.22680 + path_value;
    goto <D.22681>;
    <D.22679>:
    D.22673 = current_context->current_relation;
    D.22677 = D.22673->related_value.type;
    if (D.22677 != 3) goto <D.22682>; else goto <D.22683>;
    <D.22682>:
    evaluation_can_be_recursive = 0;
    <D.22683>:
    <D.22681>:
    goto <D.22684>;
    <D.22676>:
    evaluation_is_definition = 0;
    evaluation_can_be_recursive = 0;
    <D.22684>:
    current_context = current_context->father;
    <D.22046>:
    if (current_context != last_context) goto <D.22045>; else goto <D.22047>;
    <D.22047>:
    if (evaluation_is_definition != 0) goto <D.22685>; else goto <D.22686>;
    <D.22685>:
    {
      MonoRelationsEvaluationStatus recursive_status;

      if (evaluation_can_be_recursive != 0) goto <D.22687>; else goto <D.22688>;
      <D.22687>:
      if (path_value > 0) goto <D.22689>; else goto <D.22690>;
      <D.22689>:
      recursive_status = 4;
      goto <D.22691>;
      <D.22690>:
      if (path_value < 0) goto <D.22692>; else goto <D.22693>;
      <D.22692>:
      recursive_status = 8;
      goto <D.22694>;
      <D.22693>:
      recursive_status = 16;
      <D.22694>:
      <D.22691>:
      goto <D.22695>;
      <D.22688>:
      recursive_status = 16;
      <D.22695>:
      verbose_level.18 = verbose_level;
      if (verbose_level.18 > 2) goto <D.22696>; else goto <D.22697>;
      <D.22696>:
      printf ("Recursivity accepted (");
      print_evaluation_context_status (recursive_status);
      printf (")\n");
      <D.22697>:
      current_context = father_context;
      goto <D.22050>;
      <D.22049>:
      D.22698 = current_context->status;
      D.22699 = D.22698 | recursive_status;
      current_context->status = D.22699;
      current_context = current_context->father;
      <D.22050>:
      if (current_context != last_context) goto <D.22049>; else goto <D.22051>;
      <D.22051>:
    }
    goto <D.22700>;
    <D.22686>:
    verbose_level.18 = verbose_level;
    if (verbose_level.18 > 2) goto <D.22701>; else goto <D.22702>;
    <D.22701>:
    printf ("Recursivity rejected (some relation in the cycle is not a defintion)\n");
    <D.22702>:
    <D.22700>:
    goto <D.22038>;
  }
  <D.22052>:
  return;
  <D.22053>:
  verbose_level.18 = verbose_level;
  if (verbose_level.18 > 2) goto <D.22703>; else goto <D.22704>;
  <D.22703>:
  printf ("Variable %d (target variable %d) already in a recursive ring, skipping\n", variable, target_variable);
  print_evaluation_context (context);
  D.22670 = context->current_relation;
  print_summarized_value_relation (D.22670);
  printf ("\n");
  <D.22704>:
  goto <D.22038>;
  <D.22038>:
}


intersect_value (struct MonoRelationsEvaluationRange * range, int value, MonoValueRelation relation)
{
  int D.22709;
  int D.22710;
  int D.22711;
  int D.22712;
  int iftmp.30;
  unsigned int value.31;
  unsigned int D.22715;
  int D.22719;
  int iftmp.32;
  int D.22724;

  switch (relation) <default: <D.21992>, case 0: <D.21983>, case 1: <D.21986>, case 2: <D.21988>, case 3: <D.21989>, case 4: <D.21990>, case 5: <D.21991>, case 6: <D.21987>, case 7: <D.21985>>
  <D.21983>:
  range->lower = 2147483647;
  range->upper = -2147483648;
  goto <D.21984>;
  <D.21985>:
  goto <D.21984>;
  <D.21986>:
  D.22709 = range->upper;
  D.22710 = MIN_EXPR <D.22709, value>;
  range->upper = D.22710;
  D.22711 = range->lower;
  D.22712 = MAX_EXPR <D.22711, value>;
  range->lower = D.22712;
  goto <D.21984>;
  <D.21987>:
  goto <D.21984>;
  <D.21988>:
  value.31 = (unsigned int) value;
  D.22715 = value.31 + 2147483647;
  if (D.22715 <= 4294967293) goto <D.22716>; else goto <D.22717>;
  <D.22716>:
  iftmp.30 = value + -1;
  goto <D.22718>;
  <D.22717>:
  iftmp.30 = value;
  <D.22718>:
  D.22709 = range->upper;
  D.22719 = MIN_EXPR <iftmp.30, D.22709>;
  range->upper = D.22719;
  goto <D.21984>;
  <D.21989>:
  D.22709 = range->upper;
  D.22710 = MIN_EXPR <D.22709, value>;
  range->upper = D.22710;
  goto <D.21984>;
  <D.21990>:
  value.31 = (unsigned int) value;
  D.22715 = value.31 + 2147483647;
  if (D.22715 <= 4294967293) goto <D.22721>; else goto <D.22722>;
  <D.22721>:
  iftmp.32 = value + 1;
  goto <D.22723>;
  <D.22722>:
  iftmp.32 = value;
  <D.22723>:
  D.22711 = range->lower;
  D.22724 = MAX_EXPR <iftmp.32, D.22711>;
  range->lower = D.22724;
  goto <D.21984>;
  <D.21991>:
  D.22711 = range->lower;
  D.22712 = MAX_EXPR <D.22711, value>;
  range->lower = D.22712;
  goto <D.21984>;
  <D.21992>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 586);
  <D.21984>:
}


intersect_ranges (struct MonoRelationsEvaluationRanges * ranges, struct MonoRelationsEvaluationRanges * other_ranges, int delta, MonoValueRelation relation)
{
  int D.22728;
  int D.22729;
  int D.22730;
  int D.22731;
  int D.22732;
  int D.22733;
  int D.22734;
  int D.22735;
  int D.22736;
  int D.22737;
  int D.22738;
  int D.22739;
  int iftmp.33;
  unsigned int D.22741;
  unsigned int D.22742;
  int D.22746;
  int iftmp.34;
  unsigned int D.22748;
  unsigned int D.22749;
  int D.22753;
  int iftmp.35;
  unsigned int D.22755;
  unsigned int D.22756;
  int D.22760;
  int iftmp.36;
  unsigned int D.22762;
  unsigned int D.22763;
  int D.22767;
  int D.22772;
  int iftmp.37;
  int D.22775;
  int iftmp.38;
  int D.22790;
  int iftmp.39;
  int D.22793;
  int iftmp.40;
  int D.22808;
  int iftmp.41;
  int D.22811;
  int iftmp.42;
  int D.22826;
  int iftmp.43;
  int D.22829;
  int iftmp.44;

  if (delta == 0) goto <D.22726>; else goto <D.22727>;
  <D.22726>:
  switch (relation) <default: <D.22008>, case 0: <D.21999>, case 1: <D.22002>, case 2: <D.22004>, case 3: <D.22005>, case 4: <D.22006>, case 5: <D.22007>, case 6: <D.22003>, case 7: <D.22001>>
  <D.21999>:
  ranges->zero.lower = 2147483647;
  ranges->zero.upper = -2147483648;
  ranges->variable.lower = 2147483647;
  ranges->variable.upper = -2147483648;
  goto <D.22000>;
  <D.22001>:
  goto <D.22000>;
  <D.22002>:
  D.22728 = other_ranges->zero.lower;
  D.22729 = ranges->zero.lower;
  D.22730 = MAX_EXPR <D.22728, D.22729>;
  ranges->zero.lower = D.22730;
  D.22731 = other_ranges->zero.upper;
  D.22732 = ranges->zero.upper;
  D.22733 = MIN_EXPR <D.22731, D.22732>;
  ranges->zero.upper = D.22733;
  D.22734 = other_ranges->variable.lower;
  D.22735 = ranges->variable.lower;
  D.22736 = MAX_EXPR <D.22734, D.22735>;
  ranges->variable.lower = D.22736;
  D.22737 = other_ranges->variable.upper;
  D.22738 = ranges->variable.upper;
  D.22739 = MIN_EXPR <D.22737, D.22738>;
  ranges->variable.upper = D.22739;
  goto <D.22000>;
  <D.22003>:
  goto <D.22000>;
  <D.22004>:
  D.22731 = other_ranges->zero.upper;
  D.22741 = (unsigned int) D.22731;
  D.22742 = D.22741 + 2147483647;
  if (D.22742 > 4294967293) goto <D.22743>; else goto <D.22744>;
  <D.22743>:
  iftmp.33 = other_ranges->zero.upper;
  goto <D.22745>;
  <D.22744>:
  D.22731 = other_ranges->zero.upper;
  iftmp.33 = D.22731 + -1;
  <D.22745>:
  D.22732 = ranges->zero.upper;
  D.22746 = MIN_EXPR <iftmp.33, D.22732>;
  ranges->zero.upper = D.22746;
  D.22737 = other_ranges->variable.upper;
  D.22748 = (unsigned int) D.22737;
  D.22749 = D.22748 + 2147483647;
  if (D.22749 > 4294967293) goto <D.22750>; else goto <D.22751>;
  <D.22750>:
  iftmp.34 = other_ranges->variable.upper;
  goto <D.22752>;
  <D.22751>:
  D.22737 = other_ranges->variable.upper;
  iftmp.34 = D.22737 + -1;
  <D.22752>:
  D.22738 = ranges->variable.upper;
  D.22753 = MIN_EXPR <iftmp.34, D.22738>;
  ranges->variable.upper = D.22753;
  goto <D.22000>;
  <D.22005>:
  D.22731 = other_ranges->zero.upper;
  D.22732 = ranges->zero.upper;
  D.22733 = MIN_EXPR <D.22731, D.22732>;
  ranges->zero.upper = D.22733;
  D.22737 = other_ranges->variable.upper;
  D.22738 = ranges->variable.upper;
  D.22739 = MIN_EXPR <D.22737, D.22738>;
  ranges->variable.upper = D.22739;
  goto <D.22000>;
  <D.22006>:
  D.22728 = other_ranges->zero.lower;
  D.22755 = (unsigned int) D.22728;
  D.22756 = D.22755 + 2147483647;
  if (D.22756 > 4294967293) goto <D.22757>; else goto <D.22758>;
  <D.22757>:
  iftmp.35 = other_ranges->zero.lower;
  goto <D.22759>;
  <D.22758>:
  D.22728 = other_ranges->zero.lower;
  iftmp.35 = D.22728 + 1;
  <D.22759>:
  D.22729 = ranges->zero.lower;
  D.22760 = MAX_EXPR <iftmp.35, D.22729>;
  ranges->zero.lower = D.22760;
  D.22734 = other_ranges->variable.lower;
  D.22762 = (unsigned int) D.22734;
  D.22763 = D.22762 + 2147483647;
  if (D.22763 > 4294967293) goto <D.22764>; else goto <D.22765>;
  <D.22764>:
  iftmp.36 = other_ranges->variable.lower;
  goto <D.22766>;
  <D.22765>:
  D.22734 = other_ranges->variable.lower;
  iftmp.36 = D.22734 + 1;
  <D.22766>:
  D.22735 = ranges->variable.lower;
  D.22767 = MAX_EXPR <iftmp.36, D.22735>;
  ranges->variable.lower = D.22767;
  goto <D.22000>;
  <D.22007>:
  D.22728 = other_ranges->zero.lower;
  D.22729 = ranges->zero.lower;
  D.22730 = MAX_EXPR <D.22728, D.22729>;
  ranges->zero.lower = D.22730;
  D.22734 = other_ranges->variable.lower;
  D.22735 = ranges->variable.lower;
  D.22736 = MAX_EXPR <D.22734, D.22735>;
  ranges->variable.lower = D.22736;
  goto <D.22000>;
  <D.22008>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 633);
  <D.22000>:
  goto <D.22768>;
  <D.22727>:
  {
    struct MonoRelationsEvaluationRanges translated_ranges;

    try
      {
        translated_ranges = *other_ranges;
        if (delta > 0) goto <D.22771>; else goto <D.22769>;
        <D.22771>:
        D.22772 = translated_ranges.zero.lower;
        if (D.22772 != -2147483648) goto <D.22773>; else goto <D.22769>;
        <D.22773>:
        D.22772 = translated_ranges.zero.lower;
        D.22775 = D.22772 + delta;
        D.22772 = translated_ranges.zero.lower;
        if (D.22775 > D.22772) goto <D.22776>; else goto <D.22777>;
        <D.22776>:
        D.22772 = translated_ranges.zero.lower;
        iftmp.37 = D.22772 + delta;
        goto <D.22778>;
        <D.22777>:
        iftmp.37 = 2147483647;
        <D.22778>:
        translated_ranges.zero.lower = iftmp.37;
        goto <D.22770>;
        <D.22769>:
        if (delta < 0) goto <D.22779>; else goto <D.22780>;
        <D.22779>:
        D.22772 = translated_ranges.zero.lower;
        if (D.22772 != 2147483647) goto <D.22781>; else goto <D.22782>;
        <D.22781>:
        D.22772 = translated_ranges.zero.lower;
        D.22775 = D.22772 + delta;
        D.22772 = translated_ranges.zero.lower;
        if (D.22775 < D.22772) goto <D.22784>; else goto <D.22785>;
        <D.22784>:
        D.22772 = translated_ranges.zero.lower;
        iftmp.38 = D.22772 + delta;
        goto <D.22786>;
        <D.22785>:
        iftmp.38 = -2147483648;
        <D.22786>:
        translated_ranges.zero.lower = iftmp.38;
        <D.22782>:
        <D.22780>:
        <D.22770>:
        if (delta > 0) goto <D.22789>; else goto <D.22787>;
        <D.22789>:
        D.22790 = translated_ranges.zero.upper;
        if (D.22790 != -2147483648) goto <D.22791>; else goto <D.22787>;
        <D.22791>:
        D.22790 = translated_ranges.zero.upper;
        D.22793 = D.22790 + delta;
        D.22790 = translated_ranges.zero.upper;
        if (D.22793 > D.22790) goto <D.22794>; else goto <D.22795>;
        <D.22794>:
        D.22790 = translated_ranges.zero.upper;
        iftmp.39 = D.22790 + delta;
        goto <D.22796>;
        <D.22795>:
        iftmp.39 = 2147483647;
        <D.22796>:
        translated_ranges.zero.upper = iftmp.39;
        goto <D.22788>;
        <D.22787>:
        if (delta < 0) goto <D.22797>; else goto <D.22798>;
        <D.22797>:
        D.22790 = translated_ranges.zero.upper;
        if (D.22790 != 2147483647) goto <D.22799>; else goto <D.22800>;
        <D.22799>:
        D.22790 = translated_ranges.zero.upper;
        D.22793 = D.22790 + delta;
        D.22790 = translated_ranges.zero.upper;
        if (D.22793 < D.22790) goto <D.22802>; else goto <D.22803>;
        <D.22802>:
        D.22790 = translated_ranges.zero.upper;
        iftmp.40 = D.22790 + delta;
        goto <D.22804>;
        <D.22803>:
        iftmp.40 = -2147483648;
        <D.22804>:
        translated_ranges.zero.upper = iftmp.40;
        <D.22800>:
        <D.22798>:
        <D.22788>:
        if (delta > 0) goto <D.22807>; else goto <D.22805>;
        <D.22807>:
        D.22808 = translated_ranges.variable.lower;
        if (D.22808 != -2147483648) goto <D.22809>; else goto <D.22805>;
        <D.22809>:
        D.22808 = translated_ranges.variable.lower;
        D.22811 = D.22808 + delta;
        D.22808 = translated_ranges.variable.lower;
        if (D.22811 > D.22808) goto <D.22812>; else goto <D.22813>;
        <D.22812>:
        D.22808 = translated_ranges.variable.lower;
        iftmp.41 = D.22808 + delta;
        goto <D.22814>;
        <D.22813>:
        iftmp.41 = 2147483647;
        <D.22814>:
        translated_ranges.variable.lower = iftmp.41;
        goto <D.22806>;
        <D.22805>:
        if (delta < 0) goto <D.22815>; else goto <D.22816>;
        <D.22815>:
        D.22808 = translated_ranges.variable.lower;
        if (D.22808 != 2147483647) goto <D.22817>; else goto <D.22818>;
        <D.22817>:
        D.22808 = translated_ranges.variable.lower;
        D.22811 = D.22808 + delta;
        D.22808 = translated_ranges.variable.lower;
        if (D.22811 < D.22808) goto <D.22820>; else goto <D.22821>;
        <D.22820>:
        D.22808 = translated_ranges.variable.lower;
        iftmp.42 = D.22808 + delta;
        goto <D.22822>;
        <D.22821>:
        iftmp.42 = -2147483648;
        <D.22822>:
        translated_ranges.variable.lower = iftmp.42;
        <D.22818>:
        <D.22816>:
        <D.22806>:
        if (delta > 0) goto <D.22825>; else goto <D.22823>;
        <D.22825>:
        D.22826 = translated_ranges.variable.upper;
        if (D.22826 != -2147483648) goto <D.22827>; else goto <D.22823>;
        <D.22827>:
        D.22826 = translated_ranges.variable.upper;
        D.22829 = D.22826 + delta;
        D.22826 = translated_ranges.variable.upper;
        if (D.22829 > D.22826) goto <D.22830>; else goto <D.22831>;
        <D.22830>:
        D.22826 = translated_ranges.variable.upper;
        iftmp.43 = D.22826 + delta;
        goto <D.22832>;
        <D.22831>:
        iftmp.43 = 2147483647;
        <D.22832>:
        translated_ranges.variable.upper = iftmp.43;
        goto <D.22824>;
        <D.22823>:
        if (delta < 0) goto <D.22833>; else goto <D.22834>;
        <D.22833>:
        D.22826 = translated_ranges.variable.upper;
        if (D.22826 != 2147483647) goto <D.22835>; else goto <D.22836>;
        <D.22835>:
        D.22826 = translated_ranges.variable.upper;
        D.22829 = D.22826 + delta;
        D.22826 = translated_ranges.variable.upper;
        if (D.22829 < D.22826) goto <D.22838>; else goto <D.22839>;
        <D.22838>:
        D.22826 = translated_ranges.variable.upper;
        iftmp.44 = D.22826 + delta;
        goto <D.22840>;
        <D.22839>:
        iftmp.44 = -2147483648;
        <D.22840>:
        translated_ranges.variable.upper = iftmp.44;
        <D.22836>:
        <D.22834>:
        <D.22824>:
        intersect_ranges (ranges, &translated_ranges, 0, relation);
      }
    finally
      {
        translated_ranges = {CLOBBER};
      }
  }
  <D.22768>:
}


print_evaluation_context_ranges (struct MonoRelationsEvaluationRanges * ranges)
{
  int D.22843;
  int D.22844;
  int D.22845;
  int D.22846;

  D.22843 = ranges->variable.upper;
  D.22844 = ranges->variable.lower;
  D.22845 = ranges->zero.upper;
  D.22846 = ranges->zero.lower;
  printf ("(ranges: zero [%d,%d], variable [%d,%d])", D.22846, D.22845, D.22844, D.22843);
}


print_evaluation_context_status (MonoRelationsEvaluationStatus status)
{
  unsigned int D.22850;
  unsigned int D.22855;
  unsigned int D.22860;
  unsigned int D.22865;
  unsigned int D.22870;

  if (status == 0) goto <D.22847>; else goto <D.22848>;
  <D.22847>:
  printf ("EVALUATION_NOT_STARTED");
  goto <D.22849>;
  <D.22848>:
  {
    gboolean print_or;

    print_or = 0;
    printf ("(");
    D.22850 = status & 1;
    if (D.22850 != 0) goto <D.22851>; else goto <D.22852>;
    <D.22851>:
    if (print_or != 0) goto <D.22853>; else goto <D.22854>;
    <D.22853>:
    printf ("|");
    <D.22854>:
    printf ("EVALUATION_IN_PROGRESS");
    print_or = 1;
    <D.22852>:
    D.22855 = status & 2;
    if (D.22855 != 0) goto <D.22856>; else goto <D.22857>;
    <D.22856>:
    if (print_or != 0) goto <D.22858>; else goto <D.22859>;
    <D.22858>:
    printf ("|");
    <D.22859>:
    printf ("EVALUATION_COMPLETED");
    print_or = 1;
    <D.22857>:
    D.22860 = status & 4;
    if (D.22860 != 0) goto <D.22861>; else goto <D.22862>;
    <D.22861>:
    if (print_or != 0) goto <D.22863>; else goto <D.22864>;
    <D.22863>:
    printf ("|");
    <D.22864>:
    printf ("RECURSIVELY_ASCENDING");
    print_or = 1;
    <D.22862>:
    D.22865 = status & 8;
    if (D.22865 != 0) goto <D.22866>; else goto <D.22867>;
    <D.22866>:
    if (print_or != 0) goto <D.22868>; else goto <D.22869>;
    <D.22868>:
    printf ("|");
    <D.22869>:
    printf ("RECURSIVELY_DESCENDING");
    print_or = 1;
    <D.22867>:
    D.22870 = status & 16;
    if (D.22870 != 0) goto <D.22871>; else goto <D.22872>;
    <D.22871>:
    if (print_or != 0) goto <D.22873>; else goto <D.22874>;
    <D.22873>:
    printf ("|");
    <D.22874>:
    printf ("RECURSIVELY_INDEFINITE");
    print_or = 1;
    <D.22872>:
    printf (")");
  }
  <D.22849>:
}


print_evaluation_context (struct MonoRelationsEvaluationContext * context)
{
  <unnamed type> D.22875;
  unsigned int D.22876;
  struct MonoRelationsEvaluationRanges * D.22879;

  printf ("Context status: ");
  D.22875 = context->status;
  print_evaluation_context_status (D.22875);
  D.22875 = context->status;
  D.22876 = D.22875 & 3;
  if (D.22876 != 0) goto <D.22877>; else goto <D.22878>;
  <D.22877>:
  D.22879 = &context->ranges;
  print_evaluation_context_ranges (D.22879);
  <D.22878>:
  printf ("\n");
}


apply_change_to_evaluation_area (struct MonoVariableRelationsEvaluationArea * area, struct MonoAdditionalVariableRelation * change)
{
  <unnamed type> D.22880;
  struct MonoSummarizedValueRelation * D.22883;
  int D.22884;
  unsigned int D.22885;
  unsigned int D.22886;
  struct MonoSummarizedValueRelation * D.22887;
  int D.22889;
  struct MonoSummarizedValueRelation * D.22890;
  struct MonoSummarizedValueRelation * base_relation;

  D.22880 = change->relation.relation;
  if (D.22880 != 7) goto <D.22881>; else goto <D.22882>;
  <D.22881>:
  D.22883 = area->relations;
  D.22884 = change->variable;
  D.22885 = (unsigned int) D.22884;
  D.22886 = D.22885 * 24;
  base_relation = D.22883 + D.22886;
  goto <D.21965>;
  <D.21964>:
  base_relation = base_relation->next;
  <D.21965>:
  D.22887 = base_relation->next;
  if (D.22887 != 0B) goto <D.22888>; else goto <D.21966>;
  <D.22888>:
  D.22887 = base_relation->next;
  D.22889 = D.22887->relation_is_static_definition;
  if (D.22889 != 0) goto <D.21964>; else goto <D.21966>;
  <D.21966>:
  change->insertion_point = base_relation;
  D.22887 = base_relation->next;
  change->relation.next = D.22887;
  D.22890 = &change->relation;
  base_relation->next = D.22890;
  <D.22882>:
}


g_slist_append_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.22893;
  struct GSList * D.22894;
  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.22891>; else goto <D.22892>;
  <D.22891>:
  last = list;
  goto <D.6355>;
  <D.6354>:
  last = last->next;
  <D.6355>:
  D.22893 = last->next;
  if (D.22893 != 0B) goto <D.6354>; else goto <D.6356>;
  <D.6356>:
  last->next = new_list;
  D.22894 = list;
  return D.22894;
  <D.22892>:
  D.22894 = new_list;
  return D.22894;
}


eval_non_null (struct MonoVariableRelationsEvaluationArea * area, int reg)
{
  struct MonoRelationsEvaluationContext * D.22896;
  unsigned int reg.45;
  unsigned int D.22898;
  struct MonoCompile * D.22899;
  unsigned int D.22900;
  int D.22901;
  gboolean D.22902;
  int D.22903;
  _Bool D.22904;
  struct MonoRelationsEvaluationContext * context;

  D.22896 = area->contexts;
  reg.45 = (unsigned int) reg;
  D.22898 = reg.45 * 28;
  context = D.22896 + D.22898;
  D.22899 = area->cfg;
  D.22900 = D.22899->next_vreg;
  D.22901 = (int) D.22900;
  D.22896 = area->contexts;
  clean_contexts (D.22896, D.22901);
  evaluate_relation_with_target_variable (area, reg, reg, 0B);
  D.22903 = context->ranges.zero.lower;
  D.22904 = D.22903 > 0;
  D.22902 = (gboolean) D.22904;
  return D.22902;
}


add_non_null (struct MonoVariableRelationsEvaluationArea * area, struct MonoCompile * cfg, int reg, struct GSList * * check_relations)
{
  struct MonoMemPool * D.22906;
  struct GSList * D.22907;
  struct GSList * D.22908;
  struct MonoAdditionalVariableRelation * rel;

  D.22906 = cfg->mempool;
  rel = mono_mempool_alloc0 (D.22906, 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.22907 = *check_relations;
  D.22906 = cfg->mempool;
  D.22908 = g_slist_append_mempool (D.22906, D.22907, rel);
  *check_relations = D.22908;
}


remove_change_from_evaluation_area (struct MonoAdditionalVariableRelation * change)
{
  struct MonoSummarizedValueRelation * D.22909;
  struct MonoSummarizedValueRelation * D.22912;

  D.22909 = change->insertion_point;
  if (D.22909 != 0B) goto <D.22910>; else goto <D.22911>;
  <D.22910>:
  D.22909 = change->insertion_point;
  D.22912 = change->relation.next;
  D.22909->next = D.22912;
  change->relation.next = 0B;
  <D.22911>:
}


