__attribute__((visibility ("hidden")))
mono_perform_abc_removal (struct MonoCompile * cfg)
{
  unsigned int D.22502;
  int D.22503;
  int verbose_level.0;
  struct MonoMethod * D.22507;
  char * D.22508;
  struct MonoMemPool * D.22509;
  unsigned int D.22510;
  unsigned int D.22511;
  void * D.22512;
  unsigned int D.22513;
  void * D.22514;
  unsigned int D.22515;
  void * D.22516;
  unsigned int D.22517;
  void * D.22518;
  MonoIntegerValueKind * D.22519;
  long unsigned int D.22520;
  long unsigned int D.22521;
  MonoIntegerValueKind * D.22522;
  struct MonoSummarizedValueRelation * D.22523;
  long unsigned int D.22524;
  struct MonoSummarizedValueRelation * D.22525;
  struct MonoInst * * D.22526;
  long unsigned int D.22527;
  struct MonoInst * * D.22528;
  unsigned int i.1;
  int D.22532;
  short unsigned int D.22533;
  int D.22534;
  int D.22535;
  int D.22536;
  char D.22539;
  short unsigned int D.22541;
  struct MonoInst * iftmp.2;
  int D.22547;
  unsigned int D.22548;
  unsigned int D.22549;
  struct MonoInst * * D.22552;
  long unsigned int D.22553;
  long unsigned int D.22554;
  struct MonoInst * * D.22555;
  long unsigned int D.22559;
  MonoIntegerValueKind * D.22560;
  struct MonoType * D.22561;
  <unnamed type> D.22562;
  long unsigned int D.22563;
  struct MonoSummarizedValueRelation * D.22564;
  <unnamed type> D.22565;
  int D.22566;
  struct MonoSummarizedValueRelation * D.22569;
  int D.22572;
  struct MonoSummarizedValue * D.22579;
  <unnamed type> D.22580;
  unsigned int D.22583;
  long unsigned int D.22584;
  long unsigned int D.22585;
  struct MonoSummarizedValueRelation * D.22586;
  int D.22587;
  int D.22588;
  long unsigned int D.22589;
  long unsigned int D.22590;
  struct MonoSummarizedValueRelation * D.22591;
  struct MonoSummarizedValueRelation * D.22592;
  struct MonoSummarizedValue * D.22595;
  struct MonoBasicBlock * * D.22596;
  struct MonoBasicBlock * D.22597;
  struct MonoVariableRelationsEvaluationArea area;
  struct MonoBasicBlock * bb;
  int i;

  try
    {
      D.22502 = cfg->verbose_level;
      D.22503 = (int) D.22502;
      verbose_level = D.22503;
      verbose_level.0 = verbose_level;
      if (verbose_level.0 > 2) goto <D.22505>; else goto <D.22506>;
      <D.22505>:
      D.22507 = cfg->method;
      D.22508 = mono_method_full_name (D.22507, 1);
      printf ("\nRemoving array bound checks in %s\n", D.22508);
      <D.22506>:
      area.cfg = cfg;
      D.22509 = cfg->mempool;
      D.22510 = cfg->next_vreg;
      D.22511 = D.22510 * 96;
      D.22512 = mono_mempool_alloc (D.22509, D.22511);
      area.relations = D.22512;
      D.22509 = cfg->mempool;
      D.22510 = cfg->next_vreg;
      D.22513 = D.22510 * 40;
      D.22514 = mono_mempool_alloc (D.22509, D.22513);
      area.contexts = D.22514;
      D.22509 = cfg->mempool;
      D.22510 = cfg->next_vreg;
      D.22515 = D.22510 * 4;
      D.22516 = mono_mempool_alloc (D.22509, D.22515);
      area.variable_value_kind = D.22516;
      D.22509 = cfg->mempool;
      D.22510 = cfg->next_vreg;
      D.22517 = D.22510 * 8;
      D.22518 = mono_mempool_alloc (D.22509, D.22517);
      area.defs = D.22518;
      i = 0;
      goto <D.22481>;
      <D.22480>:
      D.22519 = area.variable_value_kind;
      D.22520 = (long unsigned int) i;
      D.22521 = D.22520 * 4;
      D.22522 = D.22519 + D.22521;
      *D.22522 = 0;
      D.22523 = area.relations;
      D.22520 = (long unsigned int) i;
      D.22524 = D.22520 * 48;
      D.22525 = D.22523 + D.22524;
      D.22525->relation = 1;
      D.22523 = area.relations;
      D.22520 = (long unsigned int) i;
      D.22524 = D.22520 * 48;
      D.22525 = D.22523 + D.22524;
      D.22525->relation_is_static_definition = 1;
      D.22523 = area.relations;
      D.22520 = (long unsigned int) i;
      D.22524 = D.22520 * 48;
      D.22525 = D.22523 + D.22524;
      D.22525->related_value.type = 0;
      D.22523 = area.relations;
      D.22520 = (long unsigned int) i;
      D.22524 = D.22520 * 48;
      D.22525 = D.22523 + D.22524;
      D.22525->next = 0B;
      D.22526 = area.defs;
      D.22520 = (long unsigned int) i;
      D.22527 = D.22520 * 8;
      D.22528 = D.22526 + D.22527;
      *D.22528 = 0B;
      i = i + 1;
      <D.22481>:
      D.22510 = cfg->next_vreg;
      i.1 = (unsigned int) i;
      if (D.22510 > i.1) goto <D.22480>; else goto <D.22482>;
      <D.22482>:
      bb = cfg->bb_entry;
      goto <D.22494>;
      <D.22493>:
      {
        struct MonoInst * ins;

        verbose_level.0 = verbose_level;
        if (verbose_level.0 > 2) goto <D.22530>; else goto <D.22531>;
        <D.22530>:
        D.22532 = bb->block_num;
        printf ("\nABCREM BLOCK %d:\n", D.22532);
        <D.22531>:
        ins = bb->code;
        goto <D.22491>;
        <D.22490>:
        {
          const char * spec;

          D.22533 = ins->opcode;
          D.22534 = (int) D.22533;
          D.22535 = D.22534 + -313;
          D.22536 = D.22535 * 4;
          spec = &ins_info[D.22536];
          D.22539 = *spec;
          if (D.22539 == 32) goto <D.22537>; else goto <D.22540>;
          <D.22540>:
          D.22533 = ins->opcode;
          D.22541 = D.22533 + 65162;
          if (D.22541 <= 13) goto <D.22537>; else goto <D.22538>;
          <D.22537>:
          // predicted unlikely by continue predictor.
          goto <D.22485>;
          <D.22538>:
          D.22539 = *spec;
          if (D.22539 == 105) goto <D.22542>; else goto <D.22543>;
          <D.22542>:
          {
            MonoIntegerValueKind effective_value_kind;
            struct MonoRelationsEvaluationRange range;
            struct MonoSummarizedValueRelation * type_relation;
            struct MonoInst * var;

            try
              {
                verbose_level.0 = verbose_level;
                if (verbose_level.0 > 2) goto <D.22544>; else goto <D.22545>;
                <D.22544>:
                mono_print_ins (ins);
                <D.22545>:
                D.22547 = ins->dreg;
                D.22548 = (unsigned int) D.22547;
                D.22549 = cfg->vreg_to_inst_len;
                if (D.22548 < D.22549) goto <D.22550>; else goto <D.22551>;
                <D.22550>:
                D.22552 = cfg->vreg_to_inst;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22554 = D.22553 * 8;
                D.22555 = D.22552 + D.22554;
                iftmp.2 = *D.22555;
                goto <D.22556>;
                <D.22551>:
                iftmp.2 = 0B;
                <D.22556>:
                var = iftmp.2;
                if (var != 0B) goto <D.22557>; else goto <D.22558>;
                <D.22557>:
                D.22519 = area.variable_value_kind;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22559 = D.22553 * 4;
                D.22560 = D.22519 + D.22559;
                D.22561 = var->data.op[1].vtype;
                D.22562 = type_to_value_kind (D.22561);
                *D.22560 = D.22562;
                <D.22558>:
                D.22523 = area.relations;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22563 = D.22553 * 48;
                D.22564 = D.22523 + D.22563;
                D.22519 = area.variable_value_kind;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22559 = D.22553 * 4;
                D.22560 = D.22519 + D.22559;
                D.22565 = *D.22560;
                effective_value_kind = get_relation_from_ins (&area, ins, D.22564, D.22565);
                range.lower = -2147483648;
                range.upper = 2147483647;
                D.22519 = area.variable_value_kind;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22559 = D.22553 * 4;
                D.22560 = D.22519 + D.22559;
                D.22565 = *D.22560;
                apply_value_kind_to_range (&range, D.22565);
                apply_value_kind_to_range (&range, effective_value_kind);
                D.22566 = range.upper;
                if (D.22566 != 2147483647) goto <D.22567>; else goto <D.22568>;
                <D.22567>:
                D.22509 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22509, 48);
                type_relation->relation = 3;
                type_relation->related_value.type = 1;
                D.22566 = range.upper;
                type_relation->related_value.value.constant.value = D.22566;
                type_relation->relation_is_static_definition = 1;
                D.22523 = area.relations;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22563 = D.22553 * 48;
                D.22564 = D.22523 + D.22563;
                D.22569 = D.22564->next;
                type_relation->next = D.22569;
                D.22523 = area.relations;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22563 = D.22553 * 48;
                D.22564 = D.22523 + D.22563;
                D.22564->next = type_relation;
                verbose_level.0 = verbose_level;
                if (verbose_level.0 > 2) goto <D.22570>; else goto <D.22571>;
                <D.22570>:
                D.22547 = ins->dreg;
                D.22566 = range.upper;
                printf ("[var%d <= %d]", D.22547, D.22566);
                <D.22571>:
                <D.22568>:
                D.22572 = range.lower;
                if (D.22572 != -2147483648) goto <D.22573>; else goto <D.22574>;
                <D.22573>:
                D.22509 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22509, 48);
                type_relation->relation = 5;
                type_relation->related_value.type = 1;
                D.22572 = range.lower;
                type_relation->related_value.value.constant.value = D.22572;
                type_relation->relation_is_static_definition = 1;
                D.22523 = area.relations;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22563 = D.22553 * 48;
                D.22564 = D.22523 + D.22563;
                D.22569 = D.22564->next;
                type_relation->next = D.22569;
                D.22523 = area.relations;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22563 = D.22553 * 48;
                D.22564 = D.22523 + D.22563;
                D.22564->next = type_relation;
                verbose_level.0 = verbose_level;
                if (verbose_level.0 > 2) goto <D.22575>; else goto <D.22576>;
                <D.22575>:
                D.22547 = ins->dreg;
                D.22572 = range.lower;
                printf ("[var%d >= %d]", D.22547, D.22572);
                <D.22576>:
                <D.22574>:
                verbose_level.0 = verbose_level;
                if (verbose_level.0 > 2) goto <D.22577>; else goto <D.22578>;
                <D.22577>:
                D.22547 = ins->dreg;
                printf ("Summarized variable %d: ", D.22547);
                D.22523 = area.relations;
                D.22547 = ins->dreg;
                D.22553 = (long unsigned int) D.22547;
                D.22563 = D.22553 * 48;
                D.22564 = D.22523 + D.22563;
                D.22579 = &D.22564->related_value;
                print_summarized_value (D.22579);
                printf ("\n");
                <D.22578>:
              }
            finally
              {
                range = {CLOBBER};
              }
          }
          <D.22543>:
        }
        <D.22485>:
        ins = ins->next;
        <D.22491>:
        if (ins != 0B) goto <D.22490>; else goto <D.22492>;
        <D.22492>:
      }
      bb = bb->next_bb;
      <D.22494>:
      if (bb != 0B) goto <D.22493>; else goto <D.22495>;
      <D.22495>:
      i = 0;
      goto <D.22499>;
      <D.22498>:
      D.22523 = area.relations;
      D.22520 = (long unsigned int) i;
      D.22524 = D.22520 * 48;
      D.22525 = D.22523 + D.22524;
      D.22580 = D.22525->related_value.type;
      if (D.22580 == 2) goto <D.22581>; else goto <D.22582>;
      <D.22581>:
      {
        int related_index;
        int related_variable;

        D.22510 = cfg->next_vreg;
        i.1 = (unsigned int) i;
        D.22583 = D.22510 + i.1;
        related_index = (int) D.22583;
        D.22523 = area.relations;
        D.22520 = (long unsigned int) i;
        D.22524 = D.22520 * 48;
        D.22525 = D.22523 + D.22524;
        related_variable = D.22525->related_value.value.variable.variable;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22586->relation = 1;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22586->relation_is_static_definition = 1;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22586->related_value.type = 2;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22586->related_value.value.variable.variable = i;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22523 = area.relations;
        D.22520 = (long unsigned int) i;
        D.22524 = D.22520 * 48;
        D.22525 = D.22523 + D.22524;
        D.22587 = D.22525->related_value.value.variable.delta;
        D.22588 = -D.22587;
        D.22586->related_value.value.variable.delta = D.22588;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22523 = area.relations;
        D.22589 = (long unsigned int) related_variable;
        D.22590 = D.22589 * 48;
        D.22591 = D.22523 + D.22590;
        D.22592 = D.22591->next;
        D.22586->next = D.22592;
        D.22523 = area.relations;
        D.22589 = (long unsigned int) related_variable;
        D.22590 = D.22589 * 48;
        D.22591 = D.22523 + D.22590;
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22591->next = D.22586;
        verbose_level.0 = verbose_level;
        if (verbose_level.0 > 2) goto <D.22593>; else goto <D.22594>;
        <D.22593>:
        printf ("Added symmetric summarized value for variable variable %d (to %d): ", i, related_variable);
        D.22523 = area.relations;
        D.22584 = (long unsigned int) related_index;
        D.22585 = D.22584 * 48;
        D.22586 = D.22523 + D.22585;
        D.22595 = &D.22586->related_value;
        print_summarized_value (D.22595);
        printf ("\n");
        <D.22594>:
      }
      <D.22582>:
      i = i + 1;
      <D.22499>:
      D.22510 = cfg->next_vreg;
      i.1 = (unsigned int) i;
      if (D.22510 > i.1) goto <D.22498>; else goto <D.22500>;
      <D.22500>:
      D.22596 = cfg->bblocks;
      D.22597 = *D.22596;
      process_block (cfg, D.22597, &area);
    }
  finally
    {
      area = {CLOBBER};
    }
}


type_to_value_kind (struct MonoType * type)
{
  long unsigned int D.22598;
  long unsigned int D.22599;
  MonoIntegerValueKind D.22602;
  unsigned char D.22603;
  int D.22604;

  D.22598 = BIT_FIELD_REF <*type, 64, 64>;
  D.22599 = D.22598 & 8589934592;
  if (D.22599 != 0) goto <D.22600>; else goto <D.22601>;
  <D.22600>:
  D.22602 = 0;
  return D.22602;
  <D.22601>:
  D.22603 = type->type;
  D.22604 = (int) D.22603;
  switch (D.22604) <default: <D.22473>, case 4: <D.22463>, case 5: <D.22464>, case 6: <D.22465>, case 7: <D.22466>, case 8: <D.22467>, case 9: <D.22468>, case 10: <D.22471>, case 11: <D.22472>, case 24: <D.22469>, case 25: <D.22470>>
  <D.22463>:
  D.22602 = 1;
  return D.22602;
  <D.22464>:
  D.22602 = 17;
  return D.22602;
  <D.22465>:
  D.22602 = 2;
  return D.22602;
  <D.22466>:
  D.22602 = 18;
  return D.22602;
  <D.22467>:
  D.22602 = 4;
  return D.22602;
  <D.22468>:
  D.22602 = 20;
  return D.22602;
  <D.22469>:
  D.22602 = 8;
  return D.22602;
  <D.22470>:
  D.22602 = 24;
  return D.22602;
  <D.22471>:
  D.22602 = 8;
  return D.22602;
  <D.22472>:
  D.22602 = 24;
  return D.22602;
  <D.22473>:
  D.22602 = 0;
  return D.22602;
}


get_relation_from_ins (struct MonoVariableRelationsEvaluationArea * area, struct MonoInst * ins, struct MonoSummarizedValueRelation * result, MonoIntegerValueKind result_value_kind)
{
  unsigned char D.22606;
  short unsigned int D.22613;
  int D.22614;
  long int D.22615;
  int D.22616;
  int D.22617;
  int * D.22618;
  int D.22619;
  int * D.22620;
  long int D.22621;
  int D.22622;
  unsigned int D.22623;
  unsigned int D.22624;
  int D.22625;
  int D.22626;
  struct MonoInst * * D.22627;
  int D.22628;
  long unsigned int D.22629;
  long unsigned int D.22630;
  struct MonoInst * * D.22631;
  MonoIntegerValueKind D.22632;
  MonoIntegerValueKind value_kind;
  struct MonoSummarizedValue * value;

  value = &result->related_value;
  D.22606 = ins->type;
  if (D.22606 == 2) goto <D.22607>; else goto <D.22608>;
  <D.22607>:
  value_kind = 8;
  goto <D.22609>;
  <D.22608>:
  D.22606 = ins->type;
  if (D.22606 == 1) goto <D.22610>; else goto <D.22611>;
  <D.22610>:
  value_kind = 4;
  goto <D.22612>;
  <D.22611>:
  value_kind = 0;
  <D.22612>:
  <D.22609>:
  result->relation = 1;
  value->type = 0;
  D.22613 = ins->opcode;
  D.22614 = (int) D.22613;
  switch (D.22614) <default: <D.22286>, case 314: <D.22285>, case 319: <D.22279>, case 362: <D.22275>, case 424: <D.22277>, case 571: <D.22282>, case 625: <D.22280>, case 626: <D.22281>, case 762: <D.22278>, case 782: <D.22284>, case 783: <D.22283>>
  <D.22275>:
  value->type = 1;
  D.22615 = ins->data.op[0].const_val;
  D.22616 = (int) D.22615;
  value->value.constant.value = D.22616;
  goto <D.22276>;
  <D.22277>:
  value->type = 2;
  D.22617 = ins->sreg1;
  value->value.variable.variable = D.22617;
  value->value.variable.delta = 0;
  goto <D.22276>;
  <D.22278>:
  value->type = 2;
  D.22617 = ins->sreg1;
  value->value.variable.variable = D.22617;
  value->value.variable.delta = 0;
  value_kind = 8;
  goto <D.22276>;
  <D.22279>:
  value->type = 3;
  D.22618 = ins->data.op[1].phi_args;
  D.22619 = *D.22618;
  value->value.phi.number_of_alternatives = D.22619;
  D.22618 = ins->data.op[1].phi_args;
  D.22620 = D.22618 + 4;
  value->value.phi.phi_alternatives = D.22620;
  goto <D.22276>;
  <D.22280>:
  value->type = 2;
  D.22617 = ins->sreg1;
  value->value.variable.variable = D.22617;
  D.22621 = ins->data.op[1].const_val;
  D.22622 = (int) D.22621;
  value->value.variable.delta = D.22622;
  goto <D.22276>;
  <D.22281>:
  value->type = 2;
  D.22617 = ins->sreg1;
  value->value.variable.variable = D.22617;
  D.22621 = ins->data.op[1].const_val;
  D.22623 = (unsigned int) D.22621;
  D.22624 = -D.22623;
  D.22625 = (int) D.22624;
  value->value.variable.delta = D.22625;
  goto <D.22276>;
  <D.22282>:
  result->relation = 2;
  value->type = 2;
  D.22626 = ins->sreg2;
  value->value.variable.variable = D.22626;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.22276>;
  <D.22283>:
  value->type = 2;
  D.22617 = ins->sreg1;
  value->value.variable.variable = D.22617;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.22276>;
  <D.22284>:
  value->type = 2;
  D.22617 = ins->sreg1;
  value->value.variable.variable = D.22617;
  value->value.variable.delta = 0;
  D.22627 = area->defs;
  D.22628 = ins->dreg;
  D.22629 = (long unsigned int) D.22628;
  D.22630 = D.22629 * 8;
  D.22631 = D.22627 + D.22630;
  *D.22631 = ins;
  goto <D.22276>;
  <D.22285>:
  result->relation = 4;
  value->type = 1;
  value->value.constant.value = 0;
  goto <D.22276>;
  <D.22286>:
  goto <D.22276>;
  <D.22276>:
  D.22632 = value_kind;
  return D.22632;
}


apply_value_kind_to_range (struct MonoRelationsEvaluationRange * range, MonoIntegerValueKind value_kind)
{
  unsigned int D.22637;
  int D.22640;
  unsigned int D.22643;
  int D.22646;

  if (value_kind != 0) goto <D.22635>; else goto <D.22636>;
  <D.22635>:
  D.22637 = value_kind & 16;
  if (D.22637 != 0) goto <D.22638>; else goto <D.22639>;
  <D.22638>:
  D.22640 = range->lower;
  if (D.22640 < 0) goto <D.22641>; else goto <D.22642>;
  <D.22641>:
  range->lower = 0;
  <D.22642>:
  D.22643 = value_kind & 15;
  if (D.22643 == 1) goto <D.22644>; else goto <D.22645>;
  <D.22644>:
  D.22646 = range->upper;
  if (D.22646 > 255) goto <D.22647>; else goto <D.22648>;
  <D.22647>:
  range->upper = 255;
  <D.22648>:
  goto <D.22649>;
  <D.22645>:
  D.22643 = value_kind & 15;
  if (D.22643 == 2) goto <D.22650>; else goto <D.22651>;
  <D.22650>:
  D.22646 = range->upper;
  if (D.22646 > 65535) goto <D.22652>; else goto <D.22653>;
  <D.22652>:
  range->upper = 65535;
  <D.22653>:
  <D.22651>:
  <D.22649>:
  goto <D.22654>;
  <D.22639>:
  D.22643 = value_kind & 15;
  if (D.22643 == 1) goto <D.22655>; else goto <D.22656>;
  <D.22655>:
  D.22640 = range->lower;
  if (D.22640 < -128) goto <D.22657>; else goto <D.22658>;
  <D.22657>:
  range->lower = -128;
  <D.22658>:
  D.22646 = range->upper;
  if (D.22646 > 127) goto <D.22659>; else goto <D.22660>;
  <D.22659>:
  range->upper = 127;
  <D.22660>:
  goto <D.22661>;
  <D.22656>:
  D.22643 = value_kind & 15;
  if (D.22643 == 2) goto <D.22662>; else goto <D.22663>;
  <D.22662>:
  D.22640 = range->lower;
  if (D.22640 < -32768) goto <D.22664>; else goto <D.22665>;
  <D.22664>:
  range->lower = -32768;
  <D.22665>:
  D.22646 = range->upper;
  if (D.22646 > 32767) goto <D.22666>; else goto <D.22667>;
  <D.22666>:
  range->upper = 32767;
  <D.22667>:
  <D.22663>:
  <D.22661>:
  <D.22654>:
  <D.22636>:
}


print_summarized_value (struct MonoSummarizedValue * value)
{
  <unnamed type> D.22668;
  int D.22669;
  int D.22670;
  int D.22671;
  int * D.22674;
  long unsigned int D.22675;
  long unsigned int D.22676;
  int * D.22677;
  int D.22678;
  int D.22679;

  D.22668 = value->type;
  switch (D.22668) <default: <D.22247>, case 0: <D.22238>, case 1: <D.22240>, case 2: <D.22241>, case 3: <D.22242>>
  <D.22238>:
  printf ("ANY");
  goto <D.22239>;
  <D.22240>:
  D.22669 = value->value.constant.value;
  printf ("CONSTANT %d", D.22669);
  goto <D.22239>;
  <D.22241>:
  D.22670 = value->value.variable.variable;
  D.22671 = value->value.variable.delta;
  printf ("VARIABLE %d, delta %d", D.22670, D.22671);
  goto <D.22239>;
  <D.22242>:
  {
    int phi;

    printf ("PHI (");
    phi = 0;
    goto <D.22245>;
    <D.22244>:
    if (phi != 0) goto <D.22672>; else goto <D.22673>;
    <D.22672>:
    printf (",");
    <D.22673>:
    D.22674 = value->value.phi.phi_alternatives;
    D.22675 = (long unsigned int) phi;
    D.22676 = D.22675 * 4;
    D.22677 = D.22674 + D.22676;
    D.22678 = *D.22677;
    printf ("%d", D.22678);
    phi = phi + 1;
    <D.22245>:
    D.22679 = value->value.phi.number_of_alternatives;
    if (D.22679 > phi) goto <D.22244>; else goto <D.22246>;
    <D.22246>:
    printf (")");
    goto <D.22239>;
  }
  <D.22247>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 118);
  <D.22239>:
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__))
printf (const char * restrict __fmt)
{
  int D.22680;

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


process_block (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoVariableRelationsEvaluationArea * area)
{
  int verbose_level.3;
  int D.22685;
  int D.22686;
  unsigned int D.22687;
  <unnamed type> D.22692;
  int D.22695;
  <unnamed type> D.22696;
  int D.22699;
  short unsigned int D.22702;
  struct MonoMemPool * D.22709;
  struct GSList * check_relations.4;
  struct GSList * check_relations.5;
  struct GSList * check_relations.6;
  int D.22715;
  int D.22716;
  int D.22721;
  int D.22722;
  short unsigned int D.22727;
  short unsigned int D.22731;
  struct MonoInst * * D.22735;
  long unsigned int D.22736;
  long unsigned int D.22737;
  struct MonoInst * * D.22738;
  struct MonoInst * D.22739;
  short unsigned int D.22742;
  unsigned char D.22747;
  unsigned char D.22748;
  void * D.22751;
  void * D.22752;
  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.3 = verbose_level;
      if (verbose_level.3 > 2) goto <D.22683>; else goto <D.22684>;
      <D.22683>:
      D.22685 = bb->block_num;
      D.22686 = bb->dfn;
      printf ("\nProcessing block %d [dfn %d]...\n", D.22685, D.22686);
      <D.22684>:
      D.22687 = bb->region;
      if (D.22687 != 4294967295) goto <D.22688>; else goto <D.22689>;
      <D.22688>:
      return;
      <D.22689>:
      get_relations_from_previous_bb (area, bb, &additional_relations);
      verbose_level.3 = verbose_level;
      if (verbose_level.3 > 2) goto <D.22690>; else goto <D.22691>;
      <D.22690>:
      D.22692 = additional_relations.relation1.relation.relation;
      if (D.22692 != 7) goto <D.22693>; else goto <D.22694>;
      <D.22693>:
      D.22695 = additional_relations.relation1.variable;
      printf ("Adding relation 1 on variable %d: ", D.22695);
      print_summarized_value_relation (&additional_relations.relation1.relation);
      printf ("\n");
      <D.22694>:
      D.22696 = additional_relations.relation2.relation.relation;
      if (D.22696 != 7) goto <D.22697>; else goto <D.22698>;
      <D.22697>:
      D.22699 = additional_relations.relation2.variable;
      printf ("Adding relation 2 on variable %d: ", D.22699);
      print_summarized_value_relation (&additional_relations.relation2.relation);
      printf ("\n");
      <D.22698>:
      <D.22691>:
      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.22452>;
      <D.22451>:
      {
        struct MonoAdditionalVariableRelation * rel;
        int array_var;
        int index_var;

        verbose_level.3 = verbose_level;
        if (verbose_level.3 > 2) goto <D.22700>; else goto <D.22701>;
        <D.22700>:
        printf ("Processing instruction %d\n", inst_index);
        inst_index = inst_index + 1;
        <D.22701>:
        D.22702 = ins->opcode;
        if (D.22702 == 784) goto <D.22703>; else goto <D.22704>;
        <D.22703>:
        verbose_level.3 = verbose_level;
        if (verbose_level.3 > 2) goto <D.22705>; else goto <D.22706>;
        <D.22705>:
        printf ("Attempting check removal...\n");
        <D.22706>:
        array_var = ins->sreg1;
        index_var = ins->sreg2;
        remove_abc_from_inst (ins, area);
        D.22702 = ins->opcode;
        if (D.22702 != 316) goto <D.22707>; else goto <D.22708>;
        <D.22707>:
        D.22709 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22709, 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.22709 = cfg->mempool;
        check_relations.4 = check_relations;
        check_relations.5 = g_slist_append_mempool (D.22709, check_relations.4, rel);
        check_relations = check_relations.5;
        D.22709 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22709, 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.22709 = cfg->mempool;
        check_relations.4 = check_relations;
        check_relations.6 = g_slist_append_mempool (D.22709, check_relations.4, rel);
        check_relations = check_relations.6;
        <D.22708>:
        <D.22704>:
        D.22702 = ins->opcode;
        if (D.22702 == 340) goto <D.22713>; else goto <D.22714>;
        <D.22713>:
        D.22715 = ins->sreg1;
        D.22716 = eval_non_null (area, D.22715);
        if (D.22716 != 0) goto <D.22717>; else goto <D.22718>;
        <D.22717>:
        verbose_level.3 = verbose_level;
        if (verbose_level.3 > 1) goto <D.22719>; else goto <D.22720>;
        <D.22719>:
        printf ("ARRAY-ACCESS: removed check_this instruction.\n");
        <D.22720>:
        ins->opcode = 316;
        ins->dreg = -1;
        ins->sreg3 = -1;
        D.22721 = ins->sreg3;
        ins->sreg2 = D.22721;
        D.22722 = ins->sreg2;
        ins->sreg1 = D.22722;
        <D.22718>:
        <D.22714>:
        D.22702 = ins->opcode;
        if (D.22702 == 799) goto <D.22723>; else goto <D.22724>;
        <D.22723>:
        D.22715 = ins->sreg1;
        add_non_null (area, cfg, D.22715, &check_relations);
        <D.22724>:
        if (0 != 0) goto <D.22725>; else goto <D.22726>;
        <D.22725>:
        {
          int reg;

          D.22702 = ins->opcode;
          D.22727 = D.22702 + 65162;
          if (D.22727 <= 13) goto <D.22728>; else goto <D.22729>;
          <D.22728>:
          reg = ins->dreg;
          goto <D.22730>;
          <D.22729>:
          D.22702 = ins->opcode;
          D.22731 = D.22702 + 65148;
          if (D.22731 <= 11) goto <D.22732>; else goto <D.22733>;
          <D.22732>:
          reg = ins->sreg1;
          goto <D.22734>;
          <D.22733>:
          reg = ins->sreg1;
          <D.22734>:
          <D.22730>:
          D.22735 = area->defs;
          D.22736 = (long unsigned int) reg;
          D.22737 = D.22736 * 8;
          D.22738 = D.22735 + D.22737;
          D.22739 = *D.22738;
          if (D.22739 != 0B) goto <D.22740>; else goto <D.22741>;
          <D.22740>:
          D.22735 = area->defs;
          D.22736 = (long unsigned int) reg;
          D.22737 = D.22736 * 8;
          D.22738 = D.22735 + D.22737;
          D.22739 = *D.22738;
          D.22742 = D.22739->opcode;
          if (D.22742 == 782) goto <D.22743>; else goto <D.22744>;
          <D.22743>:
          verbose_level.3 = verbose_level;
          if (verbose_level.3 > 1) goto <D.22745>; else goto <D.22746>;
          <D.22745>:
          printf ("ARRAY-ACCESS: removed MONO_INST_FAULT flag.\n");
          <D.22746>:
          D.22747 = ins->flags;
          D.22748 = D.22747 & 223;
          ins->flags = D.22748;
          <D.22744>:
          <D.22741>:
        }
        <D.22726>:
      }
      ins = ins->next;
      <D.22452>:
      if (ins != 0B) goto <D.22451>; else goto <D.22453>;
      <D.22453>:
      verbose_level.3 = verbose_level;
      if (verbose_level.3 > 2) goto <D.22749>; else goto <D.22750>;
      <D.22749>:
      D.22685 = bb->block_num;
      D.22686 = bb->dfn;
      printf ("Processing block %d [dfn %d] done.\n", D.22685, D.22686);
      <D.22750>:
      dominated_bb = bb->dominated;
      goto <D.22455>;
      <D.22454>:
      D.22751 = dominated_bb->data;
      process_block (cfg, D.22751, area);
      dominated_bb = dominated_bb->next;
      <D.22455>:
      if (dominated_bb != 0B) goto <D.22454>; else goto <D.22456>;
      <D.22456>:
      l = check_relations;
      goto <D.22458>;
      <D.22457>:
      D.22752 = l->data;
      remove_change_from_evaluation_area (D.22752);
      l = l->next;
      <D.22458>:
      if (l != 0B) goto <D.22457>; else goto <D.22459>;
      <D.22459>:
      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.22756;
  struct MonoBasicBlock * * D.22759;
  struct MonoInst * D.22762;
  struct MonoInst * D.22764;
  struct MonoInst * D.22765;
  struct MonoBasicBlock * * D.22768;
  struct MonoBasicBlock * D.22769;
  struct MonoBasicBlock * * D.22773;
  struct MonoBasicBlock * D.22774;
  unsigned int D.22780;
  unsigned int D.22781;
  unsigned int D.22782;
  unsigned int D.22783;
  unsigned int D.22784;
  unsigned int D.22785;
  unsigned int D.22786;
  short unsigned int D.22787;
  int D.22790;
  int D.22791;
  long int D.22795;
  int D.22796;
  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.22756 = bb->in_count;
  if (D.22756 == 1) goto <D.22757>; else goto <D.22758>;
  <D.22757>:
  D.22759 = bb->in_bb;
  in_bb = *D.22759;
  D.22762 = in_bb->last_ins;
  if (D.22762 == 0B) goto <D.22760>; else goto <D.22763>;
  <D.22763>:
  D.22764 = in_bb->code;
  D.22762 = in_bb->last_ins;
  if (D.22764 == D.22762) goto <D.22760>; else goto <D.22761>;
  <D.22760>:
  return;
  <D.22761>:
  ins = in_bb->code;
  goto <D.22315>;
  <D.22314>:
  ins = ins->next;
  <D.22315>:
  D.22765 = ins->next;
  D.22762 = in_bb->last_ins;
  if (D.22765 != D.22762) goto <D.22314>; else goto <D.22316>;
  <D.22316>:
  compare = ins;
  branch = ins->next;
  branch_relation = get_relation_from_branch_instruction (branch);
  if (branch_relation != 7) goto <D.22766>; else goto <D.22767>;
  <D.22766>:
  D.22768 = branch->data.op[1].many_blocks;
  D.22769 = *D.22768;
  if (D.22769 == bb) goto <D.22770>; else goto <D.22771>;
  <D.22770>:
  code_path = 1;
  goto <D.22772>;
  <D.22771>:
  D.22768 = branch->data.op[1].many_blocks;
  D.22773 = D.22768 + 8;
  D.22774 = *D.22773;
  if (D.22774 == bb) goto <D.22775>; else goto <D.22776>;
  <D.22775>:
  code_path = 0;
  goto <D.22777>;
  <D.22776>:
  code_path = 1;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 475);
  <D.22777>:
  <D.22772>:
  if (code_path == 0) goto <D.22778>; else goto <D.22779>;
  <D.22778>:
  D.22780 = ~branch_relation;
  branch_relation = D.22780 & 7;
  <D.22779>:
  D.22781 = branch_relation & 1;
  D.22782 = branch_relation << 1;
  D.22783 = D.22782 & 4;
  D.22784 = D.22781 | D.22783;
  D.22785 = branch_relation >> 1;
  D.22786 = D.22785 & 2;
  symmetric_relation = D.22784 | D.22786;
  D.22787 = compare->opcode;
  if (D.22787 == 326) goto <D.22788>; else goto <D.22789>;
  <D.22788>:
  D.22790 = compare->sreg1;
  relations->relation1.variable = D.22790;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 2;
  D.22791 = compare->sreg2;
  relations->relation1.relation.related_value.value.variable.variable = D.22791;
  relations->relation1.relation.related_value.value.variable.delta = 0;
  D.22791 = compare->sreg2;
  relations->relation2.variable = D.22791;
  relations->relation2.relation.relation = symmetric_relation;
  relations->relation2.relation.related_value.type = 2;
  D.22790 = compare->sreg1;
  relations->relation2.relation.related_value.value.variable.variable = D.22790;
  relations->relation2.relation.related_value.value.variable.delta = 0;
  goto <D.22792>;
  <D.22789>:
  D.22787 = compare->opcode;
  if (D.22787 == 327) goto <D.22793>; else goto <D.22794>;
  <D.22793>:
  D.22790 = compare->sreg1;
  relations->relation1.variable = D.22790;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 1;
  D.22795 = compare->data.op[1].const_val;
  D.22796 = (int) D.22795;
  relations->relation1.relation.related_value.value.constant.value = D.22796;
  <D.22794>:
  <D.22792>:
  <D.22767>:
  <D.22758>:
}


get_relation_from_branch_instruction (struct MonoInst * ins)
{
  short unsigned int D.22801;
  short unsigned int D.22802;
  short unsigned int D.22804;
  short unsigned int D.22806;
  int D.22807;
  MonoValueRelation D.22808;

  D.22801 = ins->opcode;
  D.22802 = D.22801 + 64985;
  if (D.22802 <= 9) goto <D.22798>; else goto <D.22803>;
  <D.22803>:
  D.22801 = ins->opcode;
  D.22804 = D.22801 + 64878;
  if (D.22804 <= 9) goto <D.22798>; else goto <D.22805>;
  <D.22805>:
  D.22801 = ins->opcode;
  D.22806 = D.22801 + 64888;
  if (D.22806 <= 9) goto <D.22798>; else goto <D.22799>;
  <D.22798>:
  {
    CompRelation rel;

    D.22801 = ins->opcode;
    D.22807 = (int) D.22801;
    rel = mono_opcode_to_cond (D.22807);
    switch (rel) <default: <D.22301>, case 0: <D.22291>, case 1: <D.22292>, case 2: <D.22293>, case 3: <D.22295>, case 4: <D.22297>, case 5: <D.22299>, case 6: <D.22294>, case 7: <D.22296>, case 8: <D.22298>, case 9: <D.22300>>
    <D.22291>:
    D.22808 = 1;
    return D.22808;
    <D.22292>:
    D.22808 = 6;
    return D.22808;
    <D.22293>:
    <D.22294>:
    D.22808 = 3;
    return D.22808;
    <D.22295>:
    <D.22296>:
    D.22808 = 5;
    return D.22808;
    <D.22297>:
    <D.22298>:
    D.22808 = 2;
    return D.22808;
    <D.22299>:
    <D.22300>:
    D.22808 = 4;
    return D.22808;
    <D.22301>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 421);
    D.22808 = 7;
    return D.22808;
  }
  goto <D.22800>;
  <D.22799>:
  D.22808 = 7;
  return D.22808;
  <D.22800>:
}


print_summarized_value_relation (struct MonoSummarizedValueRelation * relation)
{
  <unnamed type> D.22810;
  int D.22811;
  struct MonoSummarizedValue * D.22812;

  printf ("Relation ");
  D.22810 = relation->relation;
  D.22811 = (int) D.22810;
  print_relation (D.22811);
  printf (" with value ");
  D.22812 = &relation->related_value;
  print_summarized_value (D.22812);
}


print_relation (int relation)
{
  int D.22813;
  int D.22816;
  int D.22821;
  int print_or;

  print_or = 0;
  printf ("(");
  D.22813 = relation & 2;
  if (D.22813 != 0) goto <D.22814>; else goto <D.22815>;
  <D.22814>:
  printf ("LT");
  print_or = 1;
  <D.22815>:
  D.22816 = relation & 1;
  if (D.22816 != 0) goto <D.22817>; else goto <D.22818>;
  <D.22817>:
  if (print_or != 0) goto <D.22819>; else goto <D.22820>;
  <D.22819>:
  printf ("|");
  <D.22820>:
  printf ("EQ");
  print_or = 1;
  <D.22818>:
  D.22821 = relation & 4;
  if (D.22821 != 0) goto <D.22822>; else goto <D.22823>;
  <D.22822>:
  if (print_or != 0) goto <D.22824>; else goto <D.22825>;
  <D.22824>:
  printf ("|");
  <D.22825>:
  printf ("GT");
  print_or = 1;
  <D.22823>:
  printf (")");
}


remove_abc_from_inst (struct MonoInst * ins, struct MonoVariableRelationsEvaluationArea * area)
{
  struct MonoRelationsEvaluationContext * D.22826;
  long unsigned int D.22827;
  long unsigned int D.22828;
  long unsigned int D.22829;
  long unsigned int D.22830;
  struct MonoCompile * D.22831;
  unsigned int D.22832;
  int D.22833;
  int D.22837;
  int D.22839;
  int D.22841;
  int D.22842;
  int verbose_level.7;
  int D.22846;
  int D.22847;
  int array_variable;
  int index_variable;
  struct MonoRelationsEvaluationContext * array_context;
  struct MonoRelationsEvaluationContext * index_context;

  array_variable = ins->sreg1;
  index_variable = ins->sreg2;
  D.22826 = area->contexts;
  D.22827 = (long unsigned int) array_variable;
  D.22828 = D.22827 * 40;
  array_context = D.22826 + D.22828;
  D.22826 = area->contexts;
  D.22829 = (long unsigned int) index_variable;
  D.22830 = D.22829 * 40;
  index_context = D.22826 + D.22830;
  D.22826 = area->contexts;
  D.22831 = area->cfg;
  D.22832 = D.22831->next_vreg;
  D.22833 = (int) D.22832;
  clean_contexts (D.22826, D.22833);
  evaluate_relation_with_target_variable (area, index_variable, array_variable, 0B);
  evaluate_relation_with_target_variable (area, array_variable, array_variable, 0B);
  D.22837 = index_context->ranges.zero.lower;
  if (D.22837 >= 0) goto <D.22838>; else goto <D.22834>;
  <D.22838>:
  D.22839 = index_context->ranges.variable.upper;
  if (D.22839 < 0) goto <D.22835>; else goto <D.22840>;
  <D.22840>:
  D.22841 = index_context->ranges.zero.upper;
  D.22842 = array_context->ranges.zero.lower;
  if (D.22841 < D.22842) goto <D.22835>; else goto <D.22834>;
  <D.22835>:
  verbose_level.7 = verbose_level;
  if (verbose_level.7 > 1) goto <D.22844>; else goto <D.22845>;
  <D.22844>:
  printf ("ARRAY-ACCESS: removed bounds check on array %d with index %d\n", array_variable, index_variable);
  <D.22845>:
  ins->opcode = 316;
  ins->dreg = -1;
  ins->sreg3 = -1;
  D.22846 = ins->sreg3;
  ins->sreg2 = D.22846;
  D.22847 = ins->sreg2;
  ins->sreg1 = D.22847;
  goto <D.22836>;
  <D.22834>:
  verbose_level.7 = verbose_level;
  if (verbose_level.7 > 2) goto <D.22848>; else goto <D.22849>;
  <D.22848>:
  D.22837 = index_context->ranges.zero.lower;
  if (D.22837 >= 0) goto <D.22850>; else goto <D.22851>;
  <D.22850>:
  printf ("ARRAY-ACCESS: Removed lower bound check on array %d with index %d\n", array_variable, index_variable);
  <D.22851>:
  D.22839 = index_context->ranges.variable.upper;
  if (D.22839 < 0) goto <D.22852>; else goto <D.22853>;
  <D.22852>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through variable) on array %d with index %d\n", array_variable, index_variable);
  <D.22853>:
  D.22841 = index_context->ranges.zero.upper;
  D.22842 = array_context->ranges.zero.lower;
  if (D.22841 < D.22842) goto <D.22854>; else goto <D.22855>;
  <D.22854>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through constant) on array %d with index %d\n", array_variable, index_variable);
  <D.22855>:
  <D.22849>:
  <D.22836>:
}


clean_contexts (struct MonoRelationsEvaluationContext * contexts, int number)
{
  long unsigned int D.22856;
  long unsigned int D.22857;
  struct MonoRelationsEvaluationContext * D.22858;
  int i;

  i = 0;
  goto <D.22334>;
  <D.22333>:
  D.22856 = (long unsigned int) i;
  D.22857 = D.22856 * 40;
  D.22858 = contexts + D.22857;
  D.22858->status = 0;
  i = i + 1;
  <D.22334>:
  if (i < number) goto <D.22333>; else goto <D.22335>;
  <D.22335>:
}


evaluate_relation_with_target_variable (struct MonoVariableRelationsEvaluationArea * area, int variable, int target_variable, struct MonoRelationsEvaluationContext * father_context)
{
  struct MonoRelationsEvaluationContext * D.22859;
  long unsigned int D.22860;
  long unsigned int D.22861;
  <unnamed type> D.22862;
  struct MonoSummarizedValueRelation * D.22863;
  long unsigned int D.22864;
  int verbose_level.8;
  <unnamed type> D.22874;
  struct MonoRelationsEvaluationRange * D.22875;
  int D.22876;
  <unnamed type> D.22877;
  long unsigned int D.22880;
  long unsigned int D.22881;
  <unnamed type> D.22885;
  struct MonoSummarizedValueRelation * D.22887;
  <unnamed type> D.22888;
  int D.22890;
  unsigned int D.22891;
  int D.22900;
  int D.22902;
  int iftmp.9;
  int D.22905;
  int iftmp.10;
  int D.22920;
  int iftmp.11;
  int D.22923;
  int iftmp.12;
  int D.22938;
  int iftmp.13;
  int D.22941;
  int iftmp.14;
  int D.22956;
  int iftmp.15;
  int D.22959;
  int iftmp.16;
  struct MonoRelationsEvaluationRanges * D.22973;
  struct MonoRelationsEvaluationRanges * D.22978;
  int * D.22981;
  long unsigned int D.22982;
  long unsigned int D.22983;
  int * D.22984;
  unsigned int D.22989;
  unsigned int D.22992;
  unsigned int D.22995;
  long unsigned int D.22999;
  long unsigned int D.23000;
  struct MonoRelationsEvaluationContext * D.23001;
  int D.23002;
  int D.23003;
  int D.23004;
  int D.23005;
  int D.23006;
  int D.23007;
  int D.23008;
  int D.23009;
  int D.23010;
  int D.23011;
  int D.23012;
  int D.23013;
  int D.23014;
  int D.23019;
  int D.23020;
  int D.23021;
  int D.23022;
  struct MonoSummarizedValueRelation * D.23032;
  struct MonoSummarizedValueRelation * D.23035;
  int D.23036;
  <unnamed type> D.23039;
  int D.23042;
  <unnamed type> D.23060;
  unsigned int D.23061;
  struct MonoRelationsEvaluationContext * context;

  D.22859 = area->contexts;
  D.22860 = (long unsigned int) variable;
  D.22861 = D.22860 * 40;
  context = D.22859 + D.22861;
  D.22862 = context->status;
  switch (D.22862) <default: <D.22411>, case 0: <D.22375>, case 1: <D.22397>, case 2: <D.22410>>
  <D.22375>:
  {
    struct MonoSummarizedValueRelation * relation;

    D.22863 = area->relations;
    D.22860 = (long unsigned int) variable;
    D.22864 = D.22860 * 48;
    relation = D.22863 + D.22864;
    verbose_level.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.22866>; else goto <D.22867>;
    <D.22866>:
    printf ("Evaluating variable %d (target variable %d)\n", variable, target_variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22867>:
    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.22868>; else goto <D.22869>;
    <D.22868>:
    verbose_level.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.22870>; else goto <D.22871>;
    <D.22870>:
    printf ("Target variable reached (%d), continuing to evaluate relations with constants\n", variable);
    <D.22871>:
    context->ranges.variable.lower = 0;
    context->ranges.variable.upper = 0;
    <D.22869>:
    goto <D.22394>;
    <D.22393>:
    context->current_relation = relation;
    verbose_level.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.22872>; else goto <D.22873>;
    <D.22872>:
    printf ("Processing (%d): ", variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22873>:
    D.22874 = relation->related_value.type;
    switch (D.22874) <default: <D.22392>, case 0: <D.22377>, case 1: <D.22379>, case 2: <D.22380>, case 3: <D.22383>>
    <D.22377>:
    goto <D.22378>;
    <D.22379>:
    D.22875 = &context->ranges.zero;
    D.22876 = relation->related_value.value.constant.value;
    D.22877 = relation->relation;
    intersect_value (D.22875, D.22876, D.22877);
    goto <D.22378>;
    <D.22380>:
    D.22877 = relation->relation;
    if (D.22877 != 7) goto <D.22878>; else goto <D.22879>;
    <D.22878>:
    {
      int related_variable;
      struct MonoRelationsEvaluationContext * related_context;

      related_variable = relation->related_value.value.variable.variable;
      D.22859 = area->contexts;
      D.22880 = (long unsigned int) related_variable;
      D.22881 = D.22880 * 40;
      related_context = D.22859 + D.22881;
      D.22885 = related_context->status;
      if (D.22885 == 0) goto <D.22882>; else goto <D.22886>;
      <D.22886>:
      D.22887 = related_context->current_relation;
      D.22888 = D.22887->related_value.type;
      if (D.22888 != 2) goto <D.22882>; else goto <D.22889>;
      <D.22889>:
      D.22887 = related_context->current_relation;
      D.22890 = D.22887->related_value.value.variable.variable;
      if (D.22890 != variable) goto <D.22882>; else goto <D.22883>;
      <D.22882>:
      evaluate_relation_with_target_variable (area, related_variable, target_variable, context);
      D.22862 = context->status;
      D.22891 = D.22862 & 28;
      if (D.22891 != 0) goto <D.22892>; else goto <D.22893>;
      <D.22892>:
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22894>; else goto <D.22895>;
      <D.22894>:
      printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
      D.22862 = context->status;
      print_evaluation_context_status (D.22862);
      <D.22895>:
      D.22885 = related_context->status;
      if (D.22885 == 2) goto <D.22896>; else goto <D.22897>;
      <D.22896>:
      context->ranges = related_context->ranges;
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 > 0) goto <D.22901>; else goto <D.22898>;
      <D.22901>:
      D.22902 = context->ranges.zero.lower;
      if (D.22902 != -2147483648) goto <D.22903>; else goto <D.22898>;
      <D.22903>:
      D.22902 = context->ranges.zero.lower;
      D.22900 = relation->related_value.value.variable.delta;
      D.22905 = D.22902 + D.22900;
      D.22902 = context->ranges.zero.lower;
      if (D.22905 > D.22902) goto <D.22906>; else goto <D.22907>;
      <D.22906>:
      D.22902 = context->ranges.zero.lower;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.9 = D.22902 + D.22900;
      goto <D.22908>;
      <D.22907>:
      iftmp.9 = 2147483647;
      <D.22908>:
      context->ranges.zero.lower = iftmp.9;
      goto <D.22899>;
      <D.22898>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 < 0) goto <D.22909>; else goto <D.22910>;
      <D.22909>:
      D.22902 = context->ranges.zero.lower;
      if (D.22902 != 2147483647) goto <D.22911>; else goto <D.22912>;
      <D.22911>:
      D.22902 = context->ranges.zero.lower;
      D.22900 = relation->related_value.value.variable.delta;
      D.22905 = D.22902 + D.22900;
      D.22902 = context->ranges.zero.lower;
      if (D.22905 < D.22902) goto <D.22914>; else goto <D.22915>;
      <D.22914>:
      D.22902 = context->ranges.zero.lower;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.10 = D.22902 + D.22900;
      goto <D.22916>;
      <D.22915>:
      iftmp.10 = -2147483648;
      <D.22916>:
      context->ranges.zero.lower = iftmp.10;
      <D.22912>:
      <D.22910>:
      <D.22899>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 > 0) goto <D.22919>; else goto <D.22917>;
      <D.22919>:
      D.22920 = context->ranges.zero.upper;
      if (D.22920 != -2147483648) goto <D.22921>; else goto <D.22917>;
      <D.22921>:
      D.22920 = context->ranges.zero.upper;
      D.22900 = relation->related_value.value.variable.delta;
      D.22923 = D.22920 + D.22900;
      D.22920 = context->ranges.zero.upper;
      if (D.22923 > D.22920) goto <D.22924>; else goto <D.22925>;
      <D.22924>:
      D.22920 = context->ranges.zero.upper;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.11 = D.22920 + D.22900;
      goto <D.22926>;
      <D.22925>:
      iftmp.11 = 2147483647;
      <D.22926>:
      context->ranges.zero.upper = iftmp.11;
      goto <D.22918>;
      <D.22917>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 < 0) goto <D.22927>; else goto <D.22928>;
      <D.22927>:
      D.22920 = context->ranges.zero.upper;
      if (D.22920 != 2147483647) goto <D.22929>; else goto <D.22930>;
      <D.22929>:
      D.22920 = context->ranges.zero.upper;
      D.22900 = relation->related_value.value.variable.delta;
      D.22923 = D.22920 + D.22900;
      D.22920 = context->ranges.zero.upper;
      if (D.22923 < D.22920) goto <D.22932>; else goto <D.22933>;
      <D.22932>:
      D.22920 = context->ranges.zero.upper;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.12 = D.22920 + D.22900;
      goto <D.22934>;
      <D.22933>:
      iftmp.12 = -2147483648;
      <D.22934>:
      context->ranges.zero.upper = iftmp.12;
      <D.22930>:
      <D.22928>:
      <D.22918>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 > 0) goto <D.22937>; else goto <D.22935>;
      <D.22937>:
      D.22938 = context->ranges.variable.lower;
      if (D.22938 != -2147483648) goto <D.22939>; else goto <D.22935>;
      <D.22939>:
      D.22938 = context->ranges.variable.lower;
      D.22900 = relation->related_value.value.variable.delta;
      D.22941 = D.22938 + D.22900;
      D.22938 = context->ranges.variable.lower;
      if (D.22941 > D.22938) goto <D.22942>; else goto <D.22943>;
      <D.22942>:
      D.22938 = context->ranges.variable.lower;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.13 = D.22938 + D.22900;
      goto <D.22944>;
      <D.22943>:
      iftmp.13 = 2147483647;
      <D.22944>:
      context->ranges.variable.lower = iftmp.13;
      goto <D.22936>;
      <D.22935>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 < 0) goto <D.22945>; else goto <D.22946>;
      <D.22945>:
      D.22938 = context->ranges.variable.lower;
      if (D.22938 != 2147483647) goto <D.22947>; else goto <D.22948>;
      <D.22947>:
      D.22938 = context->ranges.variable.lower;
      D.22900 = relation->related_value.value.variable.delta;
      D.22941 = D.22938 + D.22900;
      D.22938 = context->ranges.variable.lower;
      if (D.22941 < D.22938) goto <D.22950>; else goto <D.22951>;
      <D.22950>:
      D.22938 = context->ranges.variable.lower;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.14 = D.22938 + D.22900;
      goto <D.22952>;
      <D.22951>:
      iftmp.14 = -2147483648;
      <D.22952>:
      context->ranges.variable.lower = iftmp.14;
      <D.22948>:
      <D.22946>:
      <D.22936>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 > 0) goto <D.22955>; else goto <D.22953>;
      <D.22955>:
      D.22956 = context->ranges.variable.upper;
      if (D.22956 != -2147483648) goto <D.22957>; else goto <D.22953>;
      <D.22957>:
      D.22956 = context->ranges.variable.upper;
      D.22900 = relation->related_value.value.variable.delta;
      D.22959 = D.22956 + D.22900;
      D.22956 = context->ranges.variable.upper;
      if (D.22959 > D.22956) goto <D.22960>; else goto <D.22961>;
      <D.22960>:
      D.22956 = context->ranges.variable.upper;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.15 = D.22956 + D.22900;
      goto <D.22962>;
      <D.22961>:
      iftmp.15 = 2147483647;
      <D.22962>:
      context->ranges.variable.upper = iftmp.15;
      goto <D.22954>;
      <D.22953>:
      D.22900 = relation->related_value.value.variable.delta;
      if (D.22900 < 0) goto <D.22963>; else goto <D.22964>;
      <D.22963>:
      D.22956 = context->ranges.variable.upper;
      if (D.22956 != 2147483647) goto <D.22965>; else goto <D.22966>;
      <D.22965>:
      D.22956 = context->ranges.variable.upper;
      D.22900 = relation->related_value.value.variable.delta;
      D.22959 = D.22956 + D.22900;
      D.22956 = context->ranges.variable.upper;
      if (D.22959 < D.22956) goto <D.22968>; else goto <D.22969>;
      <D.22968>:
      D.22956 = context->ranges.variable.upper;
      D.22900 = relation->related_value.value.variable.delta;
      iftmp.16 = D.22956 + D.22900;
      goto <D.22970>;
      <D.22969>:
      iftmp.16 = -2147483648;
      <D.22970>:
      context->ranges.variable.upper = iftmp.16;
      <D.22966>:
      <D.22964>:
      <D.22954>:
      context->status = 2;
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22971>; else goto <D.22972>;
      <D.22971>:
      printf (", ranges already computed, result: \n");
      D.22973 = &context->ranges;
      print_evaluation_context_ranges (D.22973);
      D.22900 = relation->related_value.value.variable.delta;
      printf (" (delta is %d)\n", D.22900);
      <D.22972>:
      goto <D.22974>;
      <D.22897>:
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22975>; else goto <D.22976>;
      <D.22975>:
      printf (", ranges not computed\n");
      <D.22976>:
      <D.22974>:
      goto <D.22977>;
      <D.22893>:
      D.22973 = &context->ranges;
      D.22978 = &related_context->ranges;
      D.22900 = relation->related_value.value.variable.delta;
      D.22877 = relation->relation;
      intersect_ranges (D.22973, D.22978, D.22900, D.22877);
      <D.22977>:
      goto <D.22884>;
      <D.22883>:
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.22979>; else goto <D.22980>;
      <D.22979>:
      printf ("Relation is a back-edge in this traversal, skipping\n");
      <D.22980>:
      <D.22884>:
    }
    <D.22879>:
    goto <D.22378>;
    <D.22383>:
    {
      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.22390>;
          <D.22389>:
          {
            int phi_alternative;

            D.22981 = relation->related_value.value.phi.phi_alternatives;
            D.22982 = (long unsigned int) phi;
            D.22983 = D.22982 * 4;
            D.22984 = D.22981 + D.22983;
            phi_alternative = *D.22984;
            evaluate_relation_with_target_variable (area, phi_alternative, target_variable, context);
            D.22862 = context->status;
            D.22891 = D.22862 & 28;
            if (D.22891 != 0) goto <D.22985>; else goto <D.22986>;
            <D.22985>:
            verbose_level.8 = verbose_level;
            if (verbose_level.8 > 2) goto <D.22987>; else goto <D.22988>;
            <D.22987>:
            printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
            D.22862 = context->status;
            print_evaluation_context_status (D.22862);
            printf ("\n");
            <D.22988>:
            D.22862 = context->status;
            D.22989 = D.22862 & 4;
            if (D.22989 != 0) goto <D.22990>; else goto <D.22991>;
            <D.22990>:
            is_ascending = 1;
            <D.22991>:
            D.22862 = context->status;
            D.22992 = D.22862 & 8;
            if (D.22992 != 0) goto <D.22993>; else goto <D.22994>;
            <D.22993>:
            is_descending = 1;
            <D.22994>:
            D.22862 = context->status;
            D.22995 = D.22862 & 16;
            if (D.22995 != 0) goto <D.22996>; else goto <D.22997>;
            <D.22996>:
            is_ascending = 1;
            is_descending = 1;
            <D.22997>:
            context->status = 1;
            goto <D.22998>;
            <D.22986>:
            D.22859 = area->contexts;
            D.22999 = (long unsigned int) phi_alternative;
            D.23000 = D.22999 * 40;
            D.23001 = D.22859 + D.23000;
            D.23002 = D.23001->ranges.zero.lower;
            D.23003 = phi_ranges.zero.lower;
            D.23004 = MIN_EXPR <D.23002, D.23003>;
            phi_ranges.zero.lower = D.23004;
            D.22859 = area->contexts;
            D.22999 = (long unsigned int) phi_alternative;
            D.23000 = D.22999 * 40;
            D.23001 = D.22859 + D.23000;
            D.23005 = D.23001->ranges.zero.upper;
            D.23006 = phi_ranges.zero.upper;
            D.23007 = MAX_EXPR <D.23005, D.23006>;
            phi_ranges.zero.upper = D.23007;
            D.22859 = area->contexts;
            D.22999 = (long unsigned int) phi_alternative;
            D.23000 = D.22999 * 40;
            D.23001 = D.22859 + D.23000;
            D.23008 = D.23001->ranges.variable.lower;
            D.23009 = phi_ranges.variable.lower;
            D.23010 = MIN_EXPR <D.23008, D.23009>;
            phi_ranges.variable.lower = D.23010;
            D.22859 = area->contexts;
            D.22999 = (long unsigned int) phi_alternative;
            D.23000 = D.22999 * 40;
            D.23001 = D.22859 + D.23000;
            D.23011 = D.23001->ranges.variable.upper;
            D.23012 = phi_ranges.variable.upper;
            D.23013 = MAX_EXPR <D.23011, D.23012>;
            phi_ranges.variable.upper = D.23013;
            <D.22998>:
          }
          phi = phi + 1;
          <D.22390>:
          D.23014 = relation->related_value.value.phi.number_of_alternatives;
          if (D.23014 > phi) goto <D.22389>; else goto <D.22391>;
          <D.22391>:
          if (is_ascending != 0) goto <D.23015>; else goto <D.23016>;
          <D.23015>:
          phi_ranges.zero.upper = 2147483647;
          phi_ranges.variable.upper = 2147483647;
          <D.23016>:
          if (is_descending != 0) goto <D.23017>; else goto <D.23018>;
          <D.23017>:
          phi_ranges.zero.lower = -2147483648;
          phi_ranges.variable.lower = -2147483648;
          <D.23018>:
          D.23003 = phi_ranges.zero.lower;
          D.22902 = context->ranges.zero.lower;
          D.23019 = MAX_EXPR <D.23003, D.22902>;
          context->ranges.zero.lower = D.23019;
          D.23006 = phi_ranges.zero.upper;
          D.22920 = context->ranges.zero.upper;
          D.23020 = MIN_EXPR <D.23006, D.22920>;
          context->ranges.zero.upper = D.23020;
          D.23009 = phi_ranges.variable.lower;
          D.22938 = context->ranges.variable.lower;
          D.23021 = MAX_EXPR <D.23009, D.22938>;
          context->ranges.variable.lower = D.23021;
          D.23012 = phi_ranges.variable.upper;
          D.22956 = context->ranges.variable.upper;
          D.23022 = MIN_EXPR <D.23012, D.22956>;
          context->ranges.variable.upper = D.23022;
          goto <D.22378>;
        }
      finally
        {
          phi_ranges = {CLOBBER};
        }
    }
    <D.22392>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 819);
    <D.22378>:
    relation = relation->next;
    <D.22394>:
    if (relation != 0B) goto <D.22393>; else goto <D.22395>;
    <D.22395>:
    D.22862 = context->status;
    D.22891 = D.22862 & 28;
    if (D.22891 != 0) goto <D.23023>; else goto <D.23024>;
    <D.23023>:
    verbose_level.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.23025>; else goto <D.23026>;
    <D.23025>:
    printf ("Recursivity for variable %d (target variable %d) discards computation, status ", variable, target_variable);
    D.22862 = context->status;
    print_evaluation_context_status (D.22862);
    printf ("\n");
    <D.23026>:
    context->status = 0;
    goto <D.23027>;
    <D.23024>:
    verbose_level.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.23028>; else goto <D.23029>;
    <D.23028>:
    printf ("Ranges for variable %d (target variable %d) computed: ", variable, target_variable);
    D.22973 = &context->ranges;
    print_evaluation_context_ranges (D.22973);
    printf ("\n");
    <D.23029>:
    context->status = 2;
    <D.23027>:
    goto <D.22396>;
  }
  <D.22397>:
  {
    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.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.23030>; else goto <D.23031>;
    <D.23030>:
    printf ("Evaluation of variable %d (target variable %d) already in progress\n", variable, target_variable);
    print_evaluation_context (context);
    D.23032 = context->current_relation;
    print_summarized_value_relation (D.23032);
    printf ("\n");
    <D.23031>:
    goto <D.22404>;
    <D.22403>:
    if (current_context == 0B) goto <D.23033>; else goto <D.23034>;
    <D.23033>:
    printf ("Broken recursive ring in ABC removal\n");
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 867);
    <D.23034>:
    D.23035 = current_context->current_relation;
    D.23036 = D.23035->relation_is_static_definition;
    if (D.23036 != 0) goto <D.23037>; else goto <D.23038>;
    <D.23037>:
    D.23035 = current_context->current_relation;
    D.23039 = D.23035->related_value.type;
    if (D.23039 == 2) goto <D.23040>; else goto <D.23041>;
    <D.23040>:
    D.23035 = current_context->current_relation;
    D.23042 = D.23035->related_value.value.variable.delta;
    path_value = D.23042 + path_value;
    goto <D.23043>;
    <D.23041>:
    D.23035 = current_context->current_relation;
    D.23039 = D.23035->related_value.type;
    if (D.23039 != 3) goto <D.23044>; else goto <D.23045>;
    <D.23044>:
    evaluation_can_be_recursive = 0;
    <D.23045>:
    <D.23043>:
    goto <D.23046>;
    <D.23038>:
    evaluation_is_definition = 0;
    evaluation_can_be_recursive = 0;
    <D.23046>:
    current_context = current_context->father;
    <D.22404>:
    if (current_context != last_context) goto <D.22403>; else goto <D.22405>;
    <D.22405>:
    if (evaluation_is_definition != 0) goto <D.23047>; else goto <D.23048>;
    <D.23047>:
    {
      MonoRelationsEvaluationStatus recursive_status;

      if (evaluation_can_be_recursive != 0) goto <D.23049>; else goto <D.23050>;
      <D.23049>:
      if (path_value > 0) goto <D.23051>; else goto <D.23052>;
      <D.23051>:
      recursive_status = 4;
      goto <D.23053>;
      <D.23052>:
      if (path_value < 0) goto <D.23054>; else goto <D.23055>;
      <D.23054>:
      recursive_status = 8;
      goto <D.23056>;
      <D.23055>:
      recursive_status = 16;
      <D.23056>:
      <D.23053>:
      goto <D.23057>;
      <D.23050>:
      recursive_status = 16;
      <D.23057>:
      verbose_level.8 = verbose_level;
      if (verbose_level.8 > 2) goto <D.23058>; else goto <D.23059>;
      <D.23058>:
      printf ("Recursivity accepted (");
      print_evaluation_context_status (recursive_status);
      printf (")\n");
      <D.23059>:
      current_context = father_context;
      goto <D.22408>;
      <D.22407>:
      D.23060 = current_context->status;
      D.23061 = D.23060 | recursive_status;
      current_context->status = D.23061;
      current_context = current_context->father;
      <D.22408>:
      if (current_context != last_context) goto <D.22407>; else goto <D.22409>;
      <D.22409>:
    }
    goto <D.23062>;
    <D.23048>:
    verbose_level.8 = verbose_level;
    if (verbose_level.8 > 2) goto <D.23063>; else goto <D.23064>;
    <D.23063>:
    printf ("Recursivity rejected (some relation in the cycle is not a defintion)\n");
    <D.23064>:
    <D.23062>:
    goto <D.22396>;
  }
  <D.22410>:
  return;
  <D.22411>:
  verbose_level.8 = verbose_level;
  if (verbose_level.8 > 2) goto <D.23065>; else goto <D.23066>;
  <D.23065>:
  printf ("Variable %d (target variable %d) already in a recursive ring, skipping\n", variable, target_variable);
  print_evaluation_context (context);
  D.23032 = context->current_relation;
  print_summarized_value_relation (D.23032);
  printf ("\n");
  <D.23066>:
  goto <D.22396>;
  <D.22396>:
}


intersect_value (struct MonoRelationsEvaluationRange * range, int value, MonoValueRelation relation)
{
  int D.23071;
  int D.23072;
  int D.23073;
  int D.23074;
  int iftmp.17;
  unsigned int value.18;
  unsigned int D.23077;
  int D.23081;
  int iftmp.19;
  int D.23086;

  switch (relation) <default: <D.22350>, case 0: <D.22341>, case 1: <D.22344>, case 2: <D.22346>, case 3: <D.22347>, case 4: <D.22348>, case 5: <D.22349>, case 6: <D.22345>, case 7: <D.22343>>
  <D.22341>:
  range->lower = 2147483647;
  range->upper = -2147483648;
  goto <D.22342>;
  <D.22343>:
  goto <D.22342>;
  <D.22344>:
  D.23071 = range->upper;
  D.23072 = MIN_EXPR <D.23071, value>;
  range->upper = D.23072;
  D.23073 = range->lower;
  D.23074 = MAX_EXPR <D.23073, value>;
  range->lower = D.23074;
  goto <D.22342>;
  <D.22345>:
  goto <D.22342>;
  <D.22346>:
  value.18 = (unsigned int) value;
  D.23077 = value.18 + 2147483647;
  if (D.23077 <= 4294967293) goto <D.23078>; else goto <D.23079>;
  <D.23078>:
  iftmp.17 = value + -1;
  goto <D.23080>;
  <D.23079>:
  iftmp.17 = value;
  <D.23080>:
  D.23071 = range->upper;
  D.23081 = MIN_EXPR <iftmp.17, D.23071>;
  range->upper = D.23081;
  goto <D.22342>;
  <D.22347>:
  D.23071 = range->upper;
  D.23072 = MIN_EXPR <D.23071, value>;
  range->upper = D.23072;
  goto <D.22342>;
  <D.22348>:
  value.18 = (unsigned int) value;
  D.23077 = value.18 + 2147483647;
  if (D.23077 <= 4294967293) goto <D.23083>; else goto <D.23084>;
  <D.23083>:
  iftmp.19 = value + 1;
  goto <D.23085>;
  <D.23084>:
  iftmp.19 = value;
  <D.23085>:
  D.23073 = range->lower;
  D.23086 = MAX_EXPR <iftmp.19, D.23073>;
  range->lower = D.23086;
  goto <D.22342>;
  <D.22349>:
  D.23073 = range->lower;
  D.23074 = MAX_EXPR <D.23073, value>;
  range->lower = D.23074;
  goto <D.22342>;
  <D.22350>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 586);
  <D.22342>:
}


intersect_ranges (struct MonoRelationsEvaluationRanges * ranges, struct MonoRelationsEvaluationRanges * other_ranges, int delta, MonoValueRelation relation)
{
  int D.23090;
  int D.23091;
  int D.23092;
  int D.23093;
  int D.23094;
  int D.23095;
  int D.23096;
  int D.23097;
  int D.23098;
  int D.23099;
  int D.23100;
  int D.23101;
  int iftmp.20;
  unsigned int D.23103;
  unsigned int D.23104;
  int D.23108;
  int iftmp.21;
  unsigned int D.23110;
  unsigned int D.23111;
  int D.23115;
  int iftmp.22;
  unsigned int D.23117;
  unsigned int D.23118;
  int D.23122;
  int iftmp.23;
  unsigned int D.23124;
  unsigned int D.23125;
  int D.23129;
  int D.23134;
  int iftmp.24;
  int D.23137;
  int iftmp.25;
  int D.23152;
  int iftmp.26;
  int D.23155;
  int iftmp.27;
  int D.23170;
  int iftmp.28;
  int D.23173;
  int iftmp.29;
  int D.23188;
  int iftmp.30;
  int D.23191;
  int iftmp.31;

  if (delta == 0) goto <D.23088>; else goto <D.23089>;
  <D.23088>:
  switch (relation) <default: <D.22366>, case 0: <D.22357>, case 1: <D.22360>, case 2: <D.22362>, case 3: <D.22363>, case 4: <D.22364>, case 5: <D.22365>, case 6: <D.22361>, case 7: <D.22359>>
  <D.22357>:
  ranges->zero.lower = 2147483647;
  ranges->zero.upper = -2147483648;
  ranges->variable.lower = 2147483647;
  ranges->variable.upper = -2147483648;
  goto <D.22358>;
  <D.22359>:
  goto <D.22358>;
  <D.22360>:
  D.23090 = other_ranges->zero.lower;
  D.23091 = ranges->zero.lower;
  D.23092 = MAX_EXPR <D.23090, D.23091>;
  ranges->zero.lower = D.23092;
  D.23093 = other_ranges->zero.upper;
  D.23094 = ranges->zero.upper;
  D.23095 = MIN_EXPR <D.23093, D.23094>;
  ranges->zero.upper = D.23095;
  D.23096 = other_ranges->variable.lower;
  D.23097 = ranges->variable.lower;
  D.23098 = MAX_EXPR <D.23096, D.23097>;
  ranges->variable.lower = D.23098;
  D.23099 = other_ranges->variable.upper;
  D.23100 = ranges->variable.upper;
  D.23101 = MIN_EXPR <D.23099, D.23100>;
  ranges->variable.upper = D.23101;
  goto <D.22358>;
  <D.22361>:
  goto <D.22358>;
  <D.22362>:
  D.23093 = other_ranges->zero.upper;
  D.23103 = (unsigned int) D.23093;
  D.23104 = D.23103 + 2147483647;
  if (D.23104 > 4294967293) goto <D.23105>; else goto <D.23106>;
  <D.23105>:
  iftmp.20 = other_ranges->zero.upper;
  goto <D.23107>;
  <D.23106>:
  D.23093 = other_ranges->zero.upper;
  iftmp.20 = D.23093 + -1;
  <D.23107>:
  D.23094 = ranges->zero.upper;
  D.23108 = MIN_EXPR <iftmp.20, D.23094>;
  ranges->zero.upper = D.23108;
  D.23099 = other_ranges->variable.upper;
  D.23110 = (unsigned int) D.23099;
  D.23111 = D.23110 + 2147483647;
  if (D.23111 > 4294967293) goto <D.23112>; else goto <D.23113>;
  <D.23112>:
  iftmp.21 = other_ranges->variable.upper;
  goto <D.23114>;
  <D.23113>:
  D.23099 = other_ranges->variable.upper;
  iftmp.21 = D.23099 + -1;
  <D.23114>:
  D.23100 = ranges->variable.upper;
  D.23115 = MIN_EXPR <iftmp.21, D.23100>;
  ranges->variable.upper = D.23115;
  goto <D.22358>;
  <D.22363>:
  D.23093 = other_ranges->zero.upper;
  D.23094 = ranges->zero.upper;
  D.23095 = MIN_EXPR <D.23093, D.23094>;
  ranges->zero.upper = D.23095;
  D.23099 = other_ranges->variable.upper;
  D.23100 = ranges->variable.upper;
  D.23101 = MIN_EXPR <D.23099, D.23100>;
  ranges->variable.upper = D.23101;
  goto <D.22358>;
  <D.22364>:
  D.23090 = other_ranges->zero.lower;
  D.23117 = (unsigned int) D.23090;
  D.23118 = D.23117 + 2147483647;
  if (D.23118 > 4294967293) goto <D.23119>; else goto <D.23120>;
  <D.23119>:
  iftmp.22 = other_ranges->zero.lower;
  goto <D.23121>;
  <D.23120>:
  D.23090 = other_ranges->zero.lower;
  iftmp.22 = D.23090 + 1;
  <D.23121>:
  D.23091 = ranges->zero.lower;
  D.23122 = MAX_EXPR <iftmp.22, D.23091>;
  ranges->zero.lower = D.23122;
  D.23096 = other_ranges->variable.lower;
  D.23124 = (unsigned int) D.23096;
  D.23125 = D.23124 + 2147483647;
  if (D.23125 > 4294967293) goto <D.23126>; else goto <D.23127>;
  <D.23126>:
  iftmp.23 = other_ranges->variable.lower;
  goto <D.23128>;
  <D.23127>:
  D.23096 = other_ranges->variable.lower;
  iftmp.23 = D.23096 + 1;
  <D.23128>:
  D.23097 = ranges->variable.lower;
  D.23129 = MAX_EXPR <iftmp.23, D.23097>;
  ranges->variable.lower = D.23129;
  goto <D.22358>;
  <D.22365>:
  D.23090 = other_ranges->zero.lower;
  D.23091 = ranges->zero.lower;
  D.23092 = MAX_EXPR <D.23090, D.23091>;
  ranges->zero.lower = D.23092;
  D.23096 = other_ranges->variable.lower;
  D.23097 = ranges->variable.lower;
  D.23098 = MAX_EXPR <D.23096, D.23097>;
  ranges->variable.lower = D.23098;
  goto <D.22358>;
  <D.22366>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 633);
  <D.22358>:
  goto <D.23130>;
  <D.23089>:
  {
    struct MonoRelationsEvaluationRanges translated_ranges;

    try
      {
        translated_ranges = *other_ranges;
        if (delta > 0) goto <D.23133>; else goto <D.23131>;
        <D.23133>:
        D.23134 = translated_ranges.zero.lower;
        if (D.23134 != -2147483648) goto <D.23135>; else goto <D.23131>;
        <D.23135>:
        D.23134 = translated_ranges.zero.lower;
        D.23137 = D.23134 + delta;
        D.23134 = translated_ranges.zero.lower;
        if (D.23137 > D.23134) goto <D.23138>; else goto <D.23139>;
        <D.23138>:
        D.23134 = translated_ranges.zero.lower;
        iftmp.24 = D.23134 + delta;
        goto <D.23140>;
        <D.23139>:
        iftmp.24 = 2147483647;
        <D.23140>:
        translated_ranges.zero.lower = iftmp.24;
        goto <D.23132>;
        <D.23131>:
        if (delta < 0) goto <D.23141>; else goto <D.23142>;
        <D.23141>:
        D.23134 = translated_ranges.zero.lower;
        if (D.23134 != 2147483647) goto <D.23143>; else goto <D.23144>;
        <D.23143>:
        D.23134 = translated_ranges.zero.lower;
        D.23137 = D.23134 + delta;
        D.23134 = translated_ranges.zero.lower;
        if (D.23137 < D.23134) goto <D.23146>; else goto <D.23147>;
        <D.23146>:
        D.23134 = translated_ranges.zero.lower;
        iftmp.25 = D.23134 + delta;
        goto <D.23148>;
        <D.23147>:
        iftmp.25 = -2147483648;
        <D.23148>:
        translated_ranges.zero.lower = iftmp.25;
        <D.23144>:
        <D.23142>:
        <D.23132>:
        if (delta > 0) goto <D.23151>; else goto <D.23149>;
        <D.23151>:
        D.23152 = translated_ranges.zero.upper;
        if (D.23152 != -2147483648) goto <D.23153>; else goto <D.23149>;
        <D.23153>:
        D.23152 = translated_ranges.zero.upper;
        D.23155 = D.23152 + delta;
        D.23152 = translated_ranges.zero.upper;
        if (D.23155 > D.23152) goto <D.23156>; else goto <D.23157>;
        <D.23156>:
        D.23152 = translated_ranges.zero.upper;
        iftmp.26 = D.23152 + delta;
        goto <D.23158>;
        <D.23157>:
        iftmp.26 = 2147483647;
        <D.23158>:
        translated_ranges.zero.upper = iftmp.26;
        goto <D.23150>;
        <D.23149>:
        if (delta < 0) goto <D.23159>; else goto <D.23160>;
        <D.23159>:
        D.23152 = translated_ranges.zero.upper;
        if (D.23152 != 2147483647) goto <D.23161>; else goto <D.23162>;
        <D.23161>:
        D.23152 = translated_ranges.zero.upper;
        D.23155 = D.23152 + delta;
        D.23152 = translated_ranges.zero.upper;
        if (D.23155 < D.23152) goto <D.23164>; else goto <D.23165>;
        <D.23164>:
        D.23152 = translated_ranges.zero.upper;
        iftmp.27 = D.23152 + delta;
        goto <D.23166>;
        <D.23165>:
        iftmp.27 = -2147483648;
        <D.23166>:
        translated_ranges.zero.upper = iftmp.27;
        <D.23162>:
        <D.23160>:
        <D.23150>:
        if (delta > 0) goto <D.23169>; else goto <D.23167>;
        <D.23169>:
        D.23170 = translated_ranges.variable.lower;
        if (D.23170 != -2147483648) goto <D.23171>; else goto <D.23167>;
        <D.23171>:
        D.23170 = translated_ranges.variable.lower;
        D.23173 = D.23170 + delta;
        D.23170 = translated_ranges.variable.lower;
        if (D.23173 > D.23170) goto <D.23174>; else goto <D.23175>;
        <D.23174>:
        D.23170 = translated_ranges.variable.lower;
        iftmp.28 = D.23170 + delta;
        goto <D.23176>;
        <D.23175>:
        iftmp.28 = 2147483647;
        <D.23176>:
        translated_ranges.variable.lower = iftmp.28;
        goto <D.23168>;
        <D.23167>:
        if (delta < 0) goto <D.23177>; else goto <D.23178>;
        <D.23177>:
        D.23170 = translated_ranges.variable.lower;
        if (D.23170 != 2147483647) goto <D.23179>; else goto <D.23180>;
        <D.23179>:
        D.23170 = translated_ranges.variable.lower;
        D.23173 = D.23170 + delta;
        D.23170 = translated_ranges.variable.lower;
        if (D.23173 < D.23170) goto <D.23182>; else goto <D.23183>;
        <D.23182>:
        D.23170 = translated_ranges.variable.lower;
        iftmp.29 = D.23170 + delta;
        goto <D.23184>;
        <D.23183>:
        iftmp.29 = -2147483648;
        <D.23184>:
        translated_ranges.variable.lower = iftmp.29;
        <D.23180>:
        <D.23178>:
        <D.23168>:
        if (delta > 0) goto <D.23187>; else goto <D.23185>;
        <D.23187>:
        D.23188 = translated_ranges.variable.upper;
        if (D.23188 != -2147483648) goto <D.23189>; else goto <D.23185>;
        <D.23189>:
        D.23188 = translated_ranges.variable.upper;
        D.23191 = D.23188 + delta;
        D.23188 = translated_ranges.variable.upper;
        if (D.23191 > D.23188) goto <D.23192>; else goto <D.23193>;
        <D.23192>:
        D.23188 = translated_ranges.variable.upper;
        iftmp.30 = D.23188 + delta;
        goto <D.23194>;
        <D.23193>:
        iftmp.30 = 2147483647;
        <D.23194>:
        translated_ranges.variable.upper = iftmp.30;
        goto <D.23186>;
        <D.23185>:
        if (delta < 0) goto <D.23195>; else goto <D.23196>;
        <D.23195>:
        D.23188 = translated_ranges.variable.upper;
        if (D.23188 != 2147483647) goto <D.23197>; else goto <D.23198>;
        <D.23197>:
        D.23188 = translated_ranges.variable.upper;
        D.23191 = D.23188 + delta;
        D.23188 = translated_ranges.variable.upper;
        if (D.23191 < D.23188) goto <D.23200>; else goto <D.23201>;
        <D.23200>:
        D.23188 = translated_ranges.variable.upper;
        iftmp.31 = D.23188 + delta;
        goto <D.23202>;
        <D.23201>:
        iftmp.31 = -2147483648;
        <D.23202>:
        translated_ranges.variable.upper = iftmp.31;
        <D.23198>:
        <D.23196>:
        <D.23186>:
        intersect_ranges (ranges, &translated_ranges, 0, relation);
      }
    finally
      {
        translated_ranges = {CLOBBER};
      }
  }
  <D.23130>:
}


print_evaluation_context_ranges (struct MonoRelationsEvaluationRanges * ranges)
{
  int D.23205;
  int D.23206;
  int D.23207;
  int D.23208;

  D.23205 = ranges->zero.lower;
  D.23206 = ranges->zero.upper;
  D.23207 = ranges->variable.lower;
  D.23208 = ranges->variable.upper;
  printf ("(ranges: zero [%d,%d], variable [%d,%d])", D.23205, D.23206, D.23207, D.23208);
}


print_evaluation_context_status (MonoRelationsEvaluationStatus status)
{
  unsigned int D.23212;
  unsigned int D.23217;
  unsigned int D.23222;
  unsigned int D.23227;
  unsigned int D.23232;

  if (status == 0) goto <D.23209>; else goto <D.23210>;
  <D.23209>:
  printf ("EVALUATION_NOT_STARTED");
  goto <D.23211>;
  <D.23210>:
  {
    gboolean print_or;

    print_or = 0;
    printf ("(");
    D.23212 = status & 1;
    if (D.23212 != 0) goto <D.23213>; else goto <D.23214>;
    <D.23213>:
    if (print_or != 0) goto <D.23215>; else goto <D.23216>;
    <D.23215>:
    printf ("|");
    <D.23216>:
    printf ("EVALUATION_IN_PROGRESS");
    print_or = 1;
    <D.23214>:
    D.23217 = status & 2;
    if (D.23217 != 0) goto <D.23218>; else goto <D.23219>;
    <D.23218>:
    if (print_or != 0) goto <D.23220>; else goto <D.23221>;
    <D.23220>:
    printf ("|");
    <D.23221>:
    printf ("EVALUATION_COMPLETED");
    print_or = 1;
    <D.23219>:
    D.23222 = status & 4;
    if (D.23222 != 0) goto <D.23223>; else goto <D.23224>;
    <D.23223>:
    if (print_or != 0) goto <D.23225>; else goto <D.23226>;
    <D.23225>:
    printf ("|");
    <D.23226>:
    printf ("RECURSIVELY_ASCENDING");
    print_or = 1;
    <D.23224>:
    D.23227 = status & 8;
    if (D.23227 != 0) goto <D.23228>; else goto <D.23229>;
    <D.23228>:
    if (print_or != 0) goto <D.23230>; else goto <D.23231>;
    <D.23230>:
    printf ("|");
    <D.23231>:
    printf ("RECURSIVELY_DESCENDING");
    print_or = 1;
    <D.23229>:
    D.23232 = status & 16;
    if (D.23232 != 0) goto <D.23233>; else goto <D.23234>;
    <D.23233>:
    if (print_or != 0) goto <D.23235>; else goto <D.23236>;
    <D.23235>:
    printf ("|");
    <D.23236>:
    printf ("RECURSIVELY_INDEFINITE");
    print_or = 1;
    <D.23234>:
    printf (")");
  }
  <D.23211>:
}


print_evaluation_context (struct MonoRelationsEvaluationContext * context)
{
  <unnamed type> D.23237;
  unsigned int D.23238;
  struct MonoRelationsEvaluationRanges * D.23241;

  printf ("Context status: ");
  D.23237 = context->status;
  print_evaluation_context_status (D.23237);
  D.23237 = context->status;
  D.23238 = D.23237 & 3;
  if (D.23238 != 0) goto <D.23239>; else goto <D.23240>;
  <D.23239>:
  D.23241 = &context->ranges;
  print_evaluation_context_ranges (D.23241);
  <D.23240>:
  printf ("\n");
}


apply_change_to_evaluation_area (struct MonoVariableRelationsEvaluationArea * area, struct MonoAdditionalVariableRelation * change)
{
  <unnamed type> D.23242;
  struct MonoSummarizedValueRelation * D.23245;
  int D.23246;
  long unsigned int D.23247;
  long unsigned int D.23248;
  struct MonoSummarizedValueRelation * D.23249;
  int D.23251;
  struct MonoSummarizedValueRelation * D.23252;
  struct MonoSummarizedValueRelation * base_relation;

  D.23242 = change->relation.relation;
  if (D.23242 != 7) goto <D.23243>; else goto <D.23244>;
  <D.23243>:
  D.23245 = area->relations;
  D.23246 = change->variable;
  D.23247 = (long unsigned int) D.23246;
  D.23248 = D.23247 * 48;
  base_relation = D.23245 + D.23248;
  goto <D.22323>;
  <D.22322>:
  base_relation = base_relation->next;
  <D.22323>:
  D.23249 = base_relation->next;
  if (D.23249 != 0B) goto <D.23250>; else goto <D.22324>;
  <D.23250>:
  D.23249 = base_relation->next;
  D.23251 = D.23249->relation_is_static_definition;
  if (D.23251 != 0) goto <D.22322>; else goto <D.22324>;
  <D.22324>:
  change->insertion_point = base_relation;
  D.23249 = base_relation->next;
  change->relation.next = D.23249;
  D.23252 = &change->relation;
  base_relation->next = D.23252;
  <D.23244>:
}


g_slist_append_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.23255;
  struct GSList * D.23256;
  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.23253>; else goto <D.23254>;
  <D.23253>:
  last = list;
  goto <D.6872>;
  <D.6871>:
  last = last->next;
  <D.6872>:
  D.23255 = last->next;
  if (D.23255 != 0B) goto <D.6871>; else goto <D.6873>;
  <D.6873>:
  last->next = new_list;
  D.23256 = list;
  return D.23256;
  <D.23254>:
  D.23256 = new_list;
  return D.23256;
}


eval_non_null (struct MonoVariableRelationsEvaluationArea * area, int reg)
{
  struct MonoRelationsEvaluationContext * D.23258;
  long unsigned int D.23259;
  long unsigned int D.23260;
  struct MonoCompile * D.23261;
  unsigned int D.23262;
  int D.23263;
  gboolean D.23264;
  int D.23265;
  _Bool D.23266;
  struct MonoRelationsEvaluationContext * context;

  D.23258 = area->contexts;
  D.23259 = (long unsigned int) reg;
  D.23260 = D.23259 * 40;
  context = D.23258 + D.23260;
  D.23258 = area->contexts;
  D.23261 = area->cfg;
  D.23262 = D.23261->next_vreg;
  D.23263 = (int) D.23262;
  clean_contexts (D.23258, D.23263);
  evaluate_relation_with_target_variable (area, reg, reg, 0B);
  D.23265 = context->ranges.zero.lower;
  D.23266 = D.23265 > 0;
  D.23264 = (gboolean) D.23266;
  return D.23264;
}


add_non_null (struct MonoVariableRelationsEvaluationArea * area, struct MonoCompile * cfg, int reg, struct GSList * * check_relations)
{
  struct MonoMemPool * D.23268;
  struct GSList * D.23269;
  struct GSList * D.23270;
  struct MonoAdditionalVariableRelation * rel;

  D.23268 = cfg->mempool;
  rel = mono_mempool_alloc0 (D.23268, 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.23268 = cfg->mempool;
  D.23269 = *check_relations;
  D.23270 = g_slist_append_mempool (D.23268, D.23269, rel);
  *check_relations = D.23270;
}


remove_change_from_evaluation_area (struct MonoAdditionalVariableRelation * change)
{
  struct MonoSummarizedValueRelation * D.23271;
  struct MonoSummarizedValueRelation * D.23274;

  D.23271 = change->insertion_point;
  if (D.23271 != 0B) goto <D.23272>; else goto <D.23273>;
  <D.23272>:
  D.23271 = change->insertion_point;
  D.23274 = change->relation.next;
  D.23271->next = D.23274;
  change->relation.next = 0B;
  <D.23273>:
}


