mono_perform_abc_removal (struct MonoCompile * cfg)
{
  unsigned int D.22582;
  int verbose_level.0;
  int verbose_level.1;
  struct MonoMethod * D.22587;
  char * D.22588;
  unsigned int D.22589;
  unsigned int D.22590;
  struct MonoMemPool * D.22591;
  void * D.22592;
  unsigned int D.22593;
  void * D.22594;
  unsigned int D.22595;
  void * D.22596;
  unsigned int D.22597;
  void * D.22598;
  MonoIntegerValueKind * D.22599;
  long unsigned int D.22600;
  long unsigned int D.22601;
  MonoIntegerValueKind * D.22602;
  struct MonoSummarizedValueRelation * D.22603;
  long unsigned int D.22604;
  struct MonoSummarizedValueRelation * D.22605;
  struct MonoInst * * D.22606;
  long unsigned int D.22607;
  struct MonoInst * * D.22608;
  unsigned int i.2;
  int D.22612;
  short unsigned int D.22613;
  int D.22614;
  int D.22615;
  int D.22616;
  char D.22619;
  short unsigned int D.22621;
  struct MonoInst * iftmp.3;
  int D.22627;
  unsigned int D.22628;
  unsigned int D.22629;
  struct MonoInst * * D.22632;
  long unsigned int D.22633;
  long unsigned int D.22634;
  struct MonoInst * * D.22635;
  long unsigned int D.22639;
  MonoIntegerValueKind * D.22640;
  struct MonoType * D.22641;
  <unnamed type> D.22642;
  <unnamed type> D.22643;
  long unsigned int D.22644;
  struct MonoSummarizedValueRelation * D.22645;
  int D.22646;
  struct MonoSummarizedValueRelation * D.22649;
  int D.22652;
  struct MonoSummarizedValue * D.22659;
  <unnamed type> D.22660;
  unsigned int D.22663;
  long unsigned int D.22664;
  long unsigned int D.22665;
  struct MonoSummarizedValueRelation * D.22666;
  int D.22667;
  int D.22668;
  long unsigned int D.22669;
  long unsigned int D.22670;
  struct MonoSummarizedValueRelation * D.22671;
  struct MonoSummarizedValueRelation * D.22672;
  struct MonoSummarizedValueRelation * D.22673;
  struct MonoSummarizedValue * D.22676;
  struct MonoBasicBlock * * D.22677;
  struct MonoBasicBlock * D.22678;
  struct MonoVariableRelationsEvaluationArea area;
  struct MonoBasicBlock * bb;
  int i;

  try
    {
      D.22582 = cfg->verbose_level;
      verbose_level.0 = (int) D.22582;
      verbose_level = verbose_level.0;
      verbose_level.1 = verbose_level;
      if (verbose_level.1 > 2) goto <D.22585>; else goto <D.22586>;
      <D.22585>:
      D.22587 = cfg->method;
      D.22588 = mono_method_full_name (D.22587, 1);
      printf ("\nRemoving array bound checks in %s\n", D.22588);
      <D.22586>:
      area.cfg = cfg;
      D.22589 = cfg->next_vreg;
      D.22590 = D.22589 * 96;
      D.22591 = cfg->mempool;
      D.22592 = mono_mempool_alloc (D.22591, D.22590);
      area.relations = D.22592;
      D.22589 = cfg->next_vreg;
      D.22593 = D.22589 * 40;
      D.22591 = cfg->mempool;
      D.22594 = mono_mempool_alloc (D.22591, D.22593);
      area.contexts = D.22594;
      D.22589 = cfg->next_vreg;
      D.22595 = D.22589 * 4;
      D.22591 = cfg->mempool;
      D.22596 = mono_mempool_alloc (D.22591, D.22595);
      area.variable_value_kind = D.22596;
      D.22589 = cfg->next_vreg;
      D.22597 = D.22589 * 8;
      D.22591 = cfg->mempool;
      D.22598 = mono_mempool_alloc (D.22591, D.22597);
      area.defs = D.22598;
      i = 0;
      goto <D.22561>;
      <D.22560>:
      D.22599 = area.variable_value_kind;
      D.22600 = (long unsigned int) i;
      D.22601 = D.22600 * 4;
      D.22602 = D.22599 + D.22601;
      *D.22602 = 0;
      D.22603 = area.relations;
      D.22600 = (long unsigned int) i;
      D.22604 = D.22600 * 48;
      D.22605 = D.22603 + D.22604;
      D.22605->relation = 1;
      D.22603 = area.relations;
      D.22600 = (long unsigned int) i;
      D.22604 = D.22600 * 48;
      D.22605 = D.22603 + D.22604;
      D.22605->relation_is_static_definition = 1;
      D.22603 = area.relations;
      D.22600 = (long unsigned int) i;
      D.22604 = D.22600 * 48;
      D.22605 = D.22603 + D.22604;
      D.22605->related_value.type = 0;
      D.22603 = area.relations;
      D.22600 = (long unsigned int) i;
      D.22604 = D.22600 * 48;
      D.22605 = D.22603 + D.22604;
      D.22605->next = 0B;
      D.22606 = area.defs;
      D.22600 = (long unsigned int) i;
      D.22607 = D.22600 * 8;
      D.22608 = D.22606 + D.22607;
      *D.22608 = 0B;
      i = i + 1;
      <D.22561>:
      i.2 = (unsigned int) i;
      D.22589 = cfg->next_vreg;
      if (i.2 < D.22589) goto <D.22560>; else goto <D.22562>;
      <D.22562>:
      bb = cfg->bb_entry;
      goto <D.22574>;
      <D.22573>:
      {
        struct MonoInst * ins;

        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.22610>; else goto <D.22611>;
        <D.22610>:
        D.22612 = bb->block_num;
        printf ("\nABCREM BLOCK %d:\n", D.22612);
        <D.22611>:
        ins = bb->code;
        goto <D.22571>;
        <D.22570>:
        {
          const char * spec;

          D.22613 = ins->opcode;
          D.22614 = (int) D.22613;
          D.22615 = D.22614 + -313;
          D.22616 = D.22615 * 4;
          spec = &ins_info[D.22616];
          D.22619 = *spec;
          if (D.22619 == 32) goto <D.22617>; else goto <D.22620>;
          <D.22620>:
          D.22613 = ins->opcode;
          D.22621 = D.22613 + 65162;
          if (D.22621 <= 16) goto <D.22617>; else goto <D.22618>;
          <D.22617>:
          // predicted unlikely by continue predictor.
          goto <D.22565>;
          <D.22618>:
          D.22619 = *spec;
          if (D.22619 == 105) goto <D.22622>; else goto <D.22623>;
          <D.22622>:
          {
            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.22624>; else goto <D.22625>;
                <D.22624>:
                mono_print_ins (ins);
                <D.22625>:
                D.22627 = ins->dreg;
                D.22628 = (unsigned int) D.22627;
                D.22629 = cfg->vreg_to_inst_len;
                if (D.22628 < D.22629) goto <D.22630>; else goto <D.22631>;
                <D.22630>:
                D.22632 = cfg->vreg_to_inst;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22634 = D.22633 * 8;
                D.22635 = D.22632 + D.22634;
                iftmp.3 = *D.22635;
                goto <D.22636>;
                <D.22631>:
                iftmp.3 = 0B;
                <D.22636>:
                var = iftmp.3;
                if (var != 0B) goto <D.22637>; else goto <D.22638>;
                <D.22637>:
                D.22599 = area.variable_value_kind;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22639 = D.22633 * 4;
                D.22640 = D.22599 + D.22639;
                D.22641 = var->data.op[1].vtype;
                D.22642 = type_to_value_kind (D.22641);
                *D.22640 = D.22642;
                <D.22638>:
                D.22599 = area.variable_value_kind;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22639 = D.22633 * 4;
                D.22640 = D.22599 + D.22639;
                D.22643 = *D.22640;
                D.22603 = area.relations;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22644 = D.22633 * 48;
                D.22645 = D.22603 + D.22644;
                effective_value_kind = get_relation_from_ins (&area, ins, D.22645, D.22643);
                range.lower = -2147483648;
                range.upper = 2147483647;
                D.22599 = area.variable_value_kind;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22639 = D.22633 * 4;
                D.22640 = D.22599 + D.22639;
                D.22643 = *D.22640;
                apply_value_kind_to_range (&range, D.22643);
                apply_value_kind_to_range (&range, effective_value_kind);
                D.22646 = range.upper;
                if (D.22646 != 2147483647) goto <D.22647>; else goto <D.22648>;
                <D.22647>:
                D.22591 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22591, 48);
                type_relation->relation = 3;
                type_relation->related_value.type = 1;
                D.22646 = range.upper;
                type_relation->related_value.value.constant.value = D.22646;
                type_relation->relation_is_static_definition = 1;
                D.22603 = area.relations;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22644 = D.22633 * 48;
                D.22645 = D.22603 + D.22644;
                D.22649 = D.22645->next;
                type_relation->next = D.22649;
                D.22603 = area.relations;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22644 = D.22633 * 48;
                D.22645 = D.22603 + D.22644;
                D.22645->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22650>; else goto <D.22651>;
                <D.22650>:
                D.22646 = range.upper;
                D.22627 = ins->dreg;
                printf ("[var%d <= %d]", D.22627, D.22646);
                <D.22651>:
                <D.22648>:
                D.22652 = range.lower;
                if (D.22652 != -2147483648) goto <D.22653>; else goto <D.22654>;
                <D.22653>:
                D.22591 = cfg->mempool;
                type_relation = mono_mempool_alloc (D.22591, 48);
                type_relation->relation = 5;
                type_relation->related_value.type = 1;
                D.22652 = range.lower;
                type_relation->related_value.value.constant.value = D.22652;
                type_relation->relation_is_static_definition = 1;
                D.22603 = area.relations;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22644 = D.22633 * 48;
                D.22645 = D.22603 + D.22644;
                D.22649 = D.22645->next;
                type_relation->next = D.22649;
                D.22603 = area.relations;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22644 = D.22633 * 48;
                D.22645 = D.22603 + D.22644;
                D.22645->next = type_relation;
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22655>; else goto <D.22656>;
                <D.22655>:
                D.22652 = range.lower;
                D.22627 = ins->dreg;
                printf ("[var%d >= %d]", D.22627, D.22652);
                <D.22656>:
                <D.22654>:
                verbose_level.1 = verbose_level;
                if (verbose_level.1 > 2) goto <D.22657>; else goto <D.22658>;
                <D.22657>:
                D.22627 = ins->dreg;
                printf ("Summarized variable %d: ", D.22627);
                D.22603 = area.relations;
                D.22627 = ins->dreg;
                D.22633 = (long unsigned int) D.22627;
                D.22644 = D.22633 * 48;
                D.22645 = D.22603 + D.22644;
                D.22659 = &D.22645->related_value;
                print_summarized_value (D.22659);
                printf ("\n");
                <D.22658>:
              }
            finally
              {
                range = {CLOBBER};
              }
          }
          <D.22623>:
        }
        <D.22565>:
        ins = ins->next;
        <D.22571>:
        if (ins != 0B) goto <D.22570>; else goto <D.22572>;
        <D.22572>:
      }
      bb = bb->next_bb;
      <D.22574>:
      if (bb != 0B) goto <D.22573>; else goto <D.22575>;
      <D.22575>:
      i = 0;
      goto <D.22579>;
      <D.22578>:
      D.22603 = area.relations;
      D.22600 = (long unsigned int) i;
      D.22604 = D.22600 * 48;
      D.22605 = D.22603 + D.22604;
      D.22660 = D.22605->related_value.type;
      if (D.22660 == 2) goto <D.22661>; else goto <D.22662>;
      <D.22661>:
      {
        int related_index;
        int related_variable;

        D.22589 = cfg->next_vreg;
        i.2 = (unsigned int) i;
        D.22663 = D.22589 + i.2;
        related_index = (int) D.22663;
        D.22603 = area.relations;
        D.22600 = (long unsigned int) i;
        D.22604 = D.22600 * 48;
        D.22605 = D.22603 + D.22604;
        related_variable = D.22605->related_value.value.variable.variable;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22666->relation = 1;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22666->relation_is_static_definition = 1;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22666->related_value.type = 2;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22666->related_value.value.variable.variable = i;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22603 = area.relations;
        D.22600 = (long unsigned int) i;
        D.22604 = D.22600 * 48;
        D.22605 = D.22603 + D.22604;
        D.22667 = D.22605->related_value.value.variable.delta;
        D.22668 = -D.22667;
        D.22666->related_value.value.variable.delta = D.22668;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22603 = area.relations;
        D.22669 = (long unsigned int) related_variable;
        D.22670 = D.22669 * 48;
        D.22671 = D.22603 + D.22670;
        D.22672 = D.22671->next;
        D.22666->next = D.22672;
        D.22603 = area.relations;
        D.22669 = (long unsigned int) related_variable;
        D.22670 = D.22669 * 48;
        D.22671 = D.22603 + D.22670;
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22673 = D.22603 + D.22665;
        D.22671->next = D.22673;
        verbose_level.1 = verbose_level;
        if (verbose_level.1 > 2) goto <D.22674>; else goto <D.22675>;
        <D.22674>:
        printf ("Added symmetric summarized value for variable variable %d (to %d): ", i, related_variable);
        D.22603 = area.relations;
        D.22664 = (long unsigned int) related_index;
        D.22665 = D.22664 * 48;
        D.22666 = D.22603 + D.22665;
        D.22676 = &D.22666->related_value;
        print_summarized_value (D.22676);
        printf ("\n");
        <D.22675>:
      }
      <D.22662>:
      i = i + 1;
      <D.22579>:
      i.2 = (unsigned int) i;
      D.22589 = cfg->next_vreg;
      if (i.2 < D.22589) goto <D.22578>; else goto <D.22580>;
      <D.22580>:
      D.22677 = cfg->bblocks;
      D.22678 = *D.22677;
      process_block (cfg, D.22678, &area);
    }
  finally
    {
      area = {CLOBBER};
    }
}


type_to_value_kind (struct MonoType * type)
{
  unsigned char D.22679;
  unsigned char D.22680;
  MonoIntegerValueKind D.22683;
  unsigned char D.22684;
  int D.22685;

  D.22679 = BIT_FIELD_REF <*type, 8, 88>;
  D.22680 = D.22679 & 64;
  if (D.22680 != 0) goto <D.22681>; else goto <D.22682>;
  <D.22681>:
  D.22683 = 0;
  return D.22683;
  <D.22682>:
  D.22684 = type->type;
  D.22685 = (int) D.22684;
  switch (D.22685) <default: <D.22553>, case 4: <D.22543>, case 5: <D.22544>, case 6: <D.22545>, case 7: <D.22546>, case 8: <D.22547>, case 9: <D.22548>, case 10: <D.22551>, case 11: <D.22552>, case 24: <D.22549>, case 25: <D.22550>>
  <D.22543>:
  D.22683 = 1;
  return D.22683;
  <D.22544>:
  D.22683 = 17;
  return D.22683;
  <D.22545>:
  D.22683 = 2;
  return D.22683;
  <D.22546>:
  D.22683 = 18;
  return D.22683;
  <D.22547>:
  D.22683 = 4;
  return D.22683;
  <D.22548>:
  D.22683 = 20;
  return D.22683;
  <D.22549>:
  D.22683 = 8;
  return D.22683;
  <D.22550>:
  D.22683 = 24;
  return D.22683;
  <D.22551>:
  D.22683 = 8;
  return D.22683;
  <D.22552>:
  D.22683 = 24;
  return D.22683;
  <D.22553>:
  D.22683 = 0;
  return D.22683;
}


get_relation_from_ins (struct MonoVariableRelationsEvaluationArea * area, struct MonoInst * ins, struct MonoSummarizedValueRelation * result, MonoIntegerValueKind result_value_kind)
{
  unsigned char D.22687;
  short unsigned int D.22694;
  int D.22695;
  long int D.22696;
  int D.22697;
  int D.22698;
  int * D.22699;
  int D.22700;
  int * D.22701;
  long int D.22702;
  int D.22703;
  unsigned int D.22704;
  unsigned int D.22705;
  int D.22706;
  int D.22707;
  struct MonoInst * * D.22708;
  int D.22709;
  long unsigned int D.22710;
  long unsigned int D.22711;
  struct MonoInst * * D.22712;
  MonoIntegerValueKind D.22713;
  MonoIntegerValueKind value_kind;
  struct MonoSummarizedValue * value;

  value = &result->related_value;
  D.22687 = ins->type;
  if (D.22687 == 2) goto <D.22688>; else goto <D.22689>;
  <D.22688>:
  value_kind = 8;
  goto <D.22690>;
  <D.22689>:
  D.22687 = ins->type;
  if (D.22687 == 1) goto <D.22691>; else goto <D.22692>;
  <D.22691>:
  value_kind = 4;
  goto <D.22693>;
  <D.22692>:
  value_kind = 0;
  <D.22693>:
  <D.22690>:
  result->relation = 1;
  value->type = 0;
  D.22694 = ins->opcode;
  D.22695 = (int) D.22694;
  switch (D.22695) <default: <D.22366>, case 314: <D.22365>, case 319: <D.22359>, case 362: <D.22355>, case 428: <D.22357>, case 575: <D.22362>, case 629: <D.22360>, case 630: <D.22361>, case 766: <D.22358>, case 786: <D.22364>, case 787: <D.22363>>
  <D.22355>:
  value->type = 1;
  D.22696 = ins->data.op[0].const_val;
  D.22697 = (int) D.22696;
  value->value.constant.value = D.22697;
  goto <D.22356>;
  <D.22357>:
  value->type = 2;
  D.22698 = ins->sreg1;
  value->value.variable.variable = D.22698;
  value->value.variable.delta = 0;
  goto <D.22356>;
  <D.22358>:
  value->type = 2;
  D.22698 = ins->sreg1;
  value->value.variable.variable = D.22698;
  value->value.variable.delta = 0;
  value_kind = 8;
  goto <D.22356>;
  <D.22359>:
  value->type = 3;
  D.22699 = ins->data.op[1].phi_args;
  D.22700 = *D.22699;
  value->value.phi.number_of_alternatives = D.22700;
  D.22699 = ins->data.op[1].phi_args;
  D.22701 = D.22699 + 4;
  value->value.phi.phi_alternatives = D.22701;
  goto <D.22356>;
  <D.22360>:
  value->type = 2;
  D.22698 = ins->sreg1;
  value->value.variable.variable = D.22698;
  D.22702 = ins->data.op[1].const_val;
  D.22703 = (int) D.22702;
  value->value.variable.delta = D.22703;
  goto <D.22356>;
  <D.22361>:
  value->type = 2;
  D.22698 = ins->sreg1;
  value->value.variable.variable = D.22698;
  D.22702 = ins->data.op[1].const_val;
  D.22704 = (unsigned int) D.22702;
  D.22705 = -D.22704;
  D.22706 = (int) D.22705;
  value->value.variable.delta = D.22706;
  goto <D.22356>;
  <D.22362>:
  result->relation = 2;
  value->type = 2;
  D.22707 = ins->sreg2;
  value->value.variable.variable = D.22707;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.22356>;
  <D.22363>:
  value->type = 2;
  D.22698 = ins->sreg1;
  value->value.variable.variable = D.22698;
  value->value.variable.delta = 0;
  value_kind = 20;
  goto <D.22356>;
  <D.22364>:
  value->type = 2;
  D.22698 = ins->sreg1;
  value->value.variable.variable = D.22698;
  value->value.variable.delta = 0;
  D.22708 = area->defs;
  D.22709 = ins->dreg;
  D.22710 = (long unsigned int) D.22709;
  D.22711 = D.22710 * 8;
  D.22712 = D.22708 + D.22711;
  *D.22712 = ins;
  goto <D.22356>;
  <D.22365>:
  result->relation = 4;
  value->type = 1;
  value->value.constant.value = 0;
  goto <D.22356>;
  <D.22366>:
  goto <D.22356>;
  <D.22356>:
  D.22713 = value_kind;
  return D.22713;
}


apply_value_kind_to_range (struct MonoRelationsEvaluationRange * range, MonoIntegerValueKind value_kind)
{
  unsigned int D.22718;
  int D.22721;
  unsigned int D.22724;
  int D.22727;

  if (value_kind != 0) goto <D.22716>; else goto <D.22717>;
  <D.22716>:
  D.22718 = value_kind & 16;
  if (D.22718 != 0) goto <D.22719>; else goto <D.22720>;
  <D.22719>:
  D.22721 = range->lower;
  if (D.22721 < 0) goto <D.22722>; else goto <D.22723>;
  <D.22722>:
  range->lower = 0;
  <D.22723>:
  D.22724 = value_kind & 15;
  if (D.22724 == 1) goto <D.22725>; else goto <D.22726>;
  <D.22725>:
  D.22727 = range->upper;
  if (D.22727 > 255) goto <D.22728>; else goto <D.22729>;
  <D.22728>:
  range->upper = 255;
  <D.22729>:
  goto <D.22730>;
  <D.22726>:
  D.22724 = value_kind & 15;
  if (D.22724 == 2) goto <D.22731>; else goto <D.22732>;
  <D.22731>:
  D.22727 = range->upper;
  if (D.22727 > 65535) goto <D.22733>; else goto <D.22734>;
  <D.22733>:
  range->upper = 65535;
  <D.22734>:
  <D.22732>:
  <D.22730>:
  goto <D.22735>;
  <D.22720>:
  D.22724 = value_kind & 15;
  if (D.22724 == 1) goto <D.22736>; else goto <D.22737>;
  <D.22736>:
  D.22721 = range->lower;
  if (D.22721 < -128) goto <D.22738>; else goto <D.22739>;
  <D.22738>:
  range->lower = -128;
  <D.22739>:
  D.22727 = range->upper;
  if (D.22727 > 127) goto <D.22740>; else goto <D.22741>;
  <D.22740>:
  range->upper = 127;
  <D.22741>:
  goto <D.22742>;
  <D.22737>:
  D.22724 = value_kind & 15;
  if (D.22724 == 2) goto <D.22743>; else goto <D.22744>;
  <D.22743>:
  D.22721 = range->lower;
  if (D.22721 < -32768) goto <D.22745>; else goto <D.22746>;
  <D.22745>:
  range->lower = -32768;
  <D.22746>:
  D.22727 = range->upper;
  if (D.22727 > 32767) goto <D.22747>; else goto <D.22748>;
  <D.22747>:
  range->upper = 32767;
  <D.22748>:
  <D.22744>:
  <D.22742>:
  <D.22735>:
  <D.22717>:
}


print_summarized_value (struct MonoSummarizedValue * value)
{
  <unnamed type> D.22749;
  int D.22750;
  int D.22751;
  int D.22752;
  int * D.22755;
  long unsigned int D.22756;
  long unsigned int D.22757;
  int * D.22758;
  int D.22759;
  int D.22760;

  D.22749 = value->type;
  switch (D.22749) <default: <D.22327>, case 0: <D.22318>, case 1: <D.22320>, case 2: <D.22321>, case 3: <D.22322>>
  <D.22318>:
  printf ("ANY");
  goto <D.22319>;
  <D.22320>:
  D.22750 = value->value.constant.value;
  printf ("CONSTANT %d", D.22750);
  goto <D.22319>;
  <D.22321>:
  D.22751 = value->value.variable.delta;
  D.22752 = value->value.variable.variable;
  printf ("VARIABLE %d, delta %d", D.22752, D.22751);
  goto <D.22319>;
  <D.22322>:
  {
    int phi;

    printf ("PHI (");
    phi = 0;
    goto <D.22325>;
    <D.22324>:
    if (phi != 0) goto <D.22753>; else goto <D.22754>;
    <D.22753>:
    printf (",");
    <D.22754>:
    D.22755 = value->value.phi.phi_alternatives;
    D.22756 = (long unsigned int) phi;
    D.22757 = D.22756 * 4;
    D.22758 = D.22755 + D.22757;
    D.22759 = *D.22758;
    printf ("%d", D.22759);
    phi = phi + 1;
    <D.22325>:
    D.22760 = value->value.phi.number_of_alternatives;
    if (D.22760 > phi) goto <D.22324>; else goto <D.22326>;
    <D.22326>:
    printf (")");
    goto <D.22319>;
  }
  <D.22327>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 118);
  <D.22319>:
}


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

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


process_block (struct MonoCompile * cfg, struct MonoBasicBlock * bb, struct MonoVariableRelationsEvaluationArea * area)
{
  int verbose_level.4;
  int D.22766;
  int D.22767;
  unsigned int D.22768;
  <unnamed type> D.22773;
  int D.22776;
  <unnamed type> D.22777;
  int D.22780;
  short unsigned int D.22783;
  struct MonoMemPool * D.22790;
  struct GSList * check_relations.5;
  struct GSList * check_relations.6;
  struct GSList * check_relations.7;
  int D.22796;
  int D.22797;
  int D.22802;
  int D.22803;
  short unsigned int D.22808;
  short unsigned int D.22812;
  struct MonoInst * * D.22816;
  long unsigned int D.22817;
  long unsigned int D.22818;
  struct MonoInst * * D.22819;
  struct MonoInst * D.22820;
  short unsigned int D.22823;
  unsigned char D.22828;
  unsigned char D.22829;
  void * D.22832;
  void * D.22833;
  int inst_index;
  struct MonoInst * ins;
  struct MonoAdditionalVariableRelationsForBB additional_relations;
  struct GSList * dominated_bb;
  struct GSList * l;
  struct GSList * check_relations;

  try
    {
      check_relations = 0B;
      verbose_level.4 = verbose_level;
      if (verbose_level.4 > 2) goto <D.22764>; else goto <D.22765>;
      <D.22764>:
      D.22766 = bb->dfn;
      D.22767 = bb->block_num;
      printf ("\nProcessing block %d [dfn %d]...\n", D.22767, D.22766);
      <D.22765>:
      D.22768 = bb->region;
      if (D.22768 != 4294967295) goto <D.22769>; else goto <D.22770>;
      <D.22769>:
      return;
      <D.22770>:
      get_relations_from_previous_bb (area, bb, &additional_relations);
      verbose_level.4 = verbose_level;
      if (verbose_level.4 > 2) goto <D.22771>; else goto <D.22772>;
      <D.22771>:
      D.22773 = additional_relations.relation1.relation.relation;
      if (D.22773 != 7) goto <D.22774>; else goto <D.22775>;
      <D.22774>:
      D.22776 = additional_relations.relation1.variable;
      printf ("Adding relation 1 on variable %d: ", D.22776);
      print_summarized_value_relation (&additional_relations.relation1.relation);
      printf ("\n");
      <D.22775>:
      D.22777 = additional_relations.relation2.relation.relation;
      if (D.22777 != 7) goto <D.22778>; else goto <D.22779>;
      <D.22778>:
      D.22780 = additional_relations.relation2.variable;
      printf ("Adding relation 2 on variable %d: ", D.22780);
      print_summarized_value_relation (&additional_relations.relation2.relation);
      printf ("\n");
      <D.22779>:
      <D.22772>:
      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.22532>;
      <D.22531>:
      {
        struct MonoAdditionalVariableRelation * rel;
        int array_var;
        int index_var;

        verbose_level.4 = verbose_level;
        if (verbose_level.4 > 2) goto <D.22781>; else goto <D.22782>;
        <D.22781>:
        printf ("Processing instruction %d\n", inst_index);
        inst_index = inst_index + 1;
        <D.22782>:
        D.22783 = ins->opcode;
        if (D.22783 == 788) goto <D.22784>; else goto <D.22785>;
        <D.22784>:
        verbose_level.4 = verbose_level;
        if (verbose_level.4 > 2) goto <D.22786>; else goto <D.22787>;
        <D.22786>:
        printf ("Attempting check removal...\n");
        <D.22787>:
        array_var = ins->sreg1;
        index_var = ins->sreg2;
        remove_abc_from_inst (ins, area);
        D.22783 = ins->opcode;
        if (D.22783 != 316) goto <D.22788>; else goto <D.22789>;
        <D.22788>:
        D.22790 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22790, 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);
        check_relations.5 = check_relations;
        D.22790 = cfg->mempool;
        check_relations.6 = g_slist_append_mempool (D.22790, check_relations.5, rel);
        check_relations = check_relations.6;
        D.22790 = cfg->mempool;
        rel = mono_mempool_alloc0 (D.22790, 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);
        check_relations.5 = check_relations;
        D.22790 = cfg->mempool;
        check_relations.7 = g_slist_append_mempool (D.22790, check_relations.5, rel);
        check_relations = check_relations.7;
        <D.22789>:
        <D.22785>:
        D.22783 = ins->opcode;
        if (D.22783 == 340) goto <D.22794>; else goto <D.22795>;
        <D.22794>:
        D.22796 = ins->sreg1;
        D.22797 = eval_non_null (area, D.22796);
        if (D.22797 != 0) goto <D.22798>; else goto <D.22799>;
        <D.22798>:
        verbose_level.4 = verbose_level;
        if (verbose_level.4 > 1) goto <D.22800>; else goto <D.22801>;
        <D.22800>:
        printf ("ARRAY-ACCESS: removed check_this instruction.\n");
        <D.22801>:
        ins->opcode = 316;
        ins->dreg = -1;
        ins->sreg3 = -1;
        D.22802 = ins->sreg3;
        ins->sreg2 = D.22802;
        D.22803 = ins->sreg2;
        ins->sreg1 = D.22803;
        <D.22799>:
        <D.22795>:
        D.22783 = ins->opcode;
        if (D.22783 == 803) goto <D.22804>; else goto <D.22805>;
        <D.22804>:
        D.22796 = ins->sreg1;
        add_non_null (area, cfg, D.22796, &check_relations);
        <D.22805>:
        if (0 != 0) goto <D.22806>; else goto <D.22807>;
        <D.22806>:
        {
          int reg;

          D.22783 = ins->opcode;
          D.22808 = D.22783 + 65162;
          if (D.22808 <= 16) goto <D.22809>; else goto <D.22810>;
          <D.22809>:
          reg = ins->dreg;
          goto <D.22811>;
          <D.22810>:
          D.22783 = ins->opcode;
          D.22812 = D.22783 + 65145;
          if (D.22812 <= 12) goto <D.22813>; else goto <D.22814>;
          <D.22813>:
          reg = ins->sreg1;
          goto <D.22815>;
          <D.22814>:
          reg = ins->sreg1;
          <D.22815>:
          <D.22811>:
          D.22816 = area->defs;
          D.22817 = (long unsigned int) reg;
          D.22818 = D.22817 * 8;
          D.22819 = D.22816 + D.22818;
          D.22820 = *D.22819;
          if (D.22820 != 0B) goto <D.22821>; else goto <D.22822>;
          <D.22821>:
          D.22816 = area->defs;
          D.22817 = (long unsigned int) reg;
          D.22818 = D.22817 * 8;
          D.22819 = D.22816 + D.22818;
          D.22820 = *D.22819;
          D.22823 = D.22820->opcode;
          if (D.22823 == 786) goto <D.22824>; else goto <D.22825>;
          <D.22824>:
          verbose_level.4 = verbose_level;
          if (verbose_level.4 > 1) goto <D.22826>; else goto <D.22827>;
          <D.22826>:
          printf ("ARRAY-ACCESS: removed MONO_INST_FAULT flag.\n");
          <D.22827>:
          D.22828 = ins->flags;
          D.22829 = D.22828 & 223;
          ins->flags = D.22829;
          <D.22825>:
          <D.22822>:
        }
        <D.22807>:
      }
      ins = ins->next;
      <D.22532>:
      if (ins != 0B) goto <D.22531>; else goto <D.22533>;
      <D.22533>:
      verbose_level.4 = verbose_level;
      if (verbose_level.4 > 2) goto <D.22830>; else goto <D.22831>;
      <D.22830>:
      D.22766 = bb->dfn;
      D.22767 = bb->block_num;
      printf ("Processing block %d [dfn %d] done.\n", D.22767, D.22766);
      <D.22831>:
      dominated_bb = bb->dominated;
      goto <D.22535>;
      <D.22534>:
      D.22832 = dominated_bb->data;
      process_block (cfg, D.22832, area);
      dominated_bb = dominated_bb->next;
      <D.22535>:
      if (dominated_bb != 0B) goto <D.22534>; else goto <D.22536>;
      <D.22536>:
      l = check_relations;
      goto <D.22538>;
      <D.22537>:
      D.22833 = l->data;
      remove_change_from_evaluation_area (D.22833);
      l = l->next;
      <D.22538>:
      if (l != 0B) goto <D.22537>; else goto <D.22539>;
      <D.22539>:
      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.22837;
  struct MonoBasicBlock * * D.22840;
  struct MonoInst * D.22843;
  struct MonoInst * D.22845;
  struct MonoInst * D.22846;
  struct MonoBasicBlock * * D.22849;
  struct MonoBasicBlock * D.22850;
  struct MonoBasicBlock * * D.22854;
  struct MonoBasicBlock * D.22855;
  unsigned int D.22861;
  unsigned int D.22862;
  unsigned int D.22863;
  unsigned int D.22864;
  unsigned int D.22865;
  unsigned int D.22866;
  unsigned int D.22867;
  short unsigned int D.22868;
  int D.22871;
  int D.22872;
  long int D.22876;
  int D.22877;
  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.22837 = bb->in_count;
  if (D.22837 == 1) goto <D.22838>; else goto <D.22839>;
  <D.22838>:
  D.22840 = bb->in_bb;
  in_bb = *D.22840;
  D.22843 = in_bb->last_ins;
  if (D.22843 == 0B) goto <D.22841>; else goto <D.22844>;
  <D.22844>:
  D.22845 = in_bb->code;
  D.22843 = in_bb->last_ins;
  if (D.22845 == D.22843) goto <D.22841>; else goto <D.22842>;
  <D.22841>:
  return;
  <D.22842>:
  ins = in_bb->code;
  goto <D.22395>;
  <D.22394>:
  ins = ins->next;
  <D.22395>:
  D.22846 = ins->next;
  D.22843 = in_bb->last_ins;
  if (D.22846 != D.22843) goto <D.22394>; else goto <D.22396>;
  <D.22396>:
  compare = ins;
  branch = ins->next;
  branch_relation = get_relation_from_branch_instruction (branch);
  if (branch_relation != 7) goto <D.22847>; else goto <D.22848>;
  <D.22847>:
  D.22849 = branch->data.op[1].many_blocks;
  D.22850 = *D.22849;
  if (D.22850 == bb) goto <D.22851>; else goto <D.22852>;
  <D.22851>:
  code_path = 1;
  goto <D.22853>;
  <D.22852>:
  D.22849 = branch->data.op[1].many_blocks;
  D.22854 = D.22849 + 8;
  D.22855 = *D.22854;
  if (D.22855 == bb) goto <D.22856>; else goto <D.22857>;
  <D.22856>:
  code_path = 0;
  goto <D.22858>;
  <D.22857>:
  code_path = 1;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 475);
  <D.22858>:
  <D.22853>:
  if (code_path == 0) goto <D.22859>; else goto <D.22860>;
  <D.22859>:
  D.22861 = ~branch_relation;
  branch_relation = D.22861 & 7;
  <D.22860>:
  D.22862 = branch_relation & 1;
  D.22863 = branch_relation & 2;
  D.22864 = D.22863 << 1;
  D.22865 = D.22862 | D.22864;
  D.22866 = branch_relation & 4;
  D.22867 = D.22866 >> 1;
  symmetric_relation = D.22865 | D.22867;
  D.22868 = compare->opcode;
  if (D.22868 == 326) goto <D.22869>; else goto <D.22870>;
  <D.22869>:
  D.22871 = compare->sreg1;
  relations->relation1.variable = D.22871;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 2;
  D.22872 = compare->sreg2;
  relations->relation1.relation.related_value.value.variable.variable = D.22872;
  relations->relation1.relation.related_value.value.variable.delta = 0;
  D.22872 = compare->sreg2;
  relations->relation2.variable = D.22872;
  relations->relation2.relation.relation = symmetric_relation;
  relations->relation2.relation.related_value.type = 2;
  D.22871 = compare->sreg1;
  relations->relation2.relation.related_value.value.variable.variable = D.22871;
  relations->relation2.relation.related_value.value.variable.delta = 0;
  goto <D.22873>;
  <D.22870>:
  D.22868 = compare->opcode;
  if (D.22868 == 327) goto <D.22874>; else goto <D.22875>;
  <D.22874>:
  D.22871 = compare->sreg1;
  relations->relation1.variable = D.22871;
  relations->relation1.relation.relation = branch_relation;
  relations->relation1.relation.related_value.type = 1;
  D.22876 = compare->data.op[1].const_val;
  D.22877 = (int) D.22876;
  relations->relation1.relation.related_value.value.constant.value = D.22877;
  <D.22875>:
  <D.22873>:
  <D.22848>:
  <D.22839>:
}


get_relation_from_branch_instruction (struct MonoInst * ins)
{
  short unsigned int D.22882;
  short unsigned int D.22883;
  _Bool D.22884;
  short unsigned int D.22885;
  _Bool D.22886;
  _Bool D.22887;
  short unsigned int D.22889;
  short unsigned int D.22890;
  int D.22891;
  MonoValueRelation D.22892;

  D.22882 = ins->opcode;
  D.22883 = D.22882 + 64981;
  D.22884 = D.22883 <= 9;
  D.22885 = D.22882 + 64874;
  D.22886 = D.22885 <= 9;
  D.22887 = D.22884 | D.22886;
  if (D.22887 != 0) goto <D.22879>; else goto <D.22888>;
  <D.22888>:
  D.22889 = ins->opcode;
  D.22890 = D.22889 + 64884;
  if (D.22890 <= 9) goto <D.22879>; else goto <D.22880>;
  <D.22879>:
  {
    CompRelation rel;

    D.22889 = ins->opcode;
    D.22891 = (int) D.22889;
    rel = mono_opcode_to_cond (D.22891);
    switch (rel) <default: <D.22381>, case 0: <D.22371>, case 1: <D.22372>, case 2: <D.22373>, case 3: <D.22375>, case 4: <D.22377>, case 5: <D.22379>, case 6: <D.22374>, case 7: <D.22376>, case 8: <D.22378>, case 9: <D.22380>>
    <D.22371>:
    D.22892 = 1;
    return D.22892;
    <D.22372>:
    D.22892 = 6;
    return D.22892;
    <D.22373>:
    <D.22374>:
    D.22892 = 3;
    return D.22892;
    <D.22375>:
    <D.22376>:
    D.22892 = 5;
    return D.22892;
    <D.22377>:
    <D.22378>:
    D.22892 = 2;
    return D.22892;
    <D.22379>:
    <D.22380>:
    D.22892 = 4;
    return D.22892;
    <D.22381>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 421);
    D.22892 = 7;
    return D.22892;
  }
  goto <D.22881>;
  <D.22880>:
  D.22892 = 7;
  return D.22892;
  <D.22881>:
}


print_summarized_value_relation (struct MonoSummarizedValueRelation * relation)
{
  <unnamed type> D.22894;
  int D.22895;
  struct MonoSummarizedValue * D.22896;

  printf ("Relation ");
  D.22894 = relation->relation;
  D.22895 = (int) D.22894;
  print_relation (D.22895);
  printf (" with value ");
  D.22896 = &relation->related_value;
  print_summarized_value (D.22896);
}


print_relation (int relation)
{
  int D.22897;
  int D.22900;
  int D.22905;
  int print_or;

  print_or = 0;
  printf ("(");
  D.22897 = relation & 2;
  if (D.22897 != 0) goto <D.22898>; else goto <D.22899>;
  <D.22898>:
  printf ("LT");
  print_or = 1;
  <D.22899>:
  D.22900 = relation & 1;
  if (D.22900 != 0) goto <D.22901>; else goto <D.22902>;
  <D.22901>:
  if (print_or != 0) goto <D.22903>; else goto <D.22904>;
  <D.22903>:
  printf ("|");
  <D.22904>:
  printf ("EQ");
  print_or = 1;
  <D.22902>:
  D.22905 = relation & 4;
  if (D.22905 != 0) goto <D.22906>; else goto <D.22907>;
  <D.22906>:
  if (print_or != 0) goto <D.22908>; else goto <D.22909>;
  <D.22908>:
  printf ("|");
  <D.22909>:
  printf ("GT");
  print_or = 1;
  <D.22907>:
  printf (")");
}


remove_abc_from_inst (struct MonoInst * ins, struct MonoVariableRelationsEvaluationArea * area)
{
  struct MonoRelationsEvaluationContext * D.22910;
  long unsigned int D.22911;
  long unsigned int D.22912;
  long unsigned int D.22913;
  long unsigned int D.22914;
  struct MonoCompile * D.22915;
  unsigned int D.22916;
  int D.22917;
  int D.22921;
  int D.22923;
  int D.22925;
  int D.22926;
  int verbose_level.8;
  int D.22930;
  int D.22931;
  int array_variable;
  int index_variable;
  struct MonoRelationsEvaluationContext * array_context;
  struct MonoRelationsEvaluationContext * index_context;

  array_variable = ins->sreg1;
  index_variable = ins->sreg2;
  D.22910 = area->contexts;
  D.22911 = (long unsigned int) array_variable;
  D.22912 = D.22911 * 40;
  array_context = D.22910 + D.22912;
  D.22910 = area->contexts;
  D.22913 = (long unsigned int) index_variable;
  D.22914 = D.22913 * 40;
  index_context = D.22910 + D.22914;
  D.22915 = area->cfg;
  D.22916 = D.22915->next_vreg;
  D.22917 = (int) D.22916;
  D.22910 = area->contexts;
  clean_contexts (D.22910, D.22917);
  evaluate_relation_with_target_variable (area, index_variable, array_variable, 0B);
  evaluate_relation_with_target_variable (area, array_variable, array_variable, 0B);
  D.22921 = index_context->ranges.zero.lower;
  if (D.22921 >= 0) goto <D.22922>; else goto <D.22918>;
  <D.22922>:
  D.22923 = index_context->ranges.variable.upper;
  if (D.22923 < 0) goto <D.22919>; else goto <D.22924>;
  <D.22924>:
  D.22925 = index_context->ranges.zero.upper;
  D.22926 = array_context->ranges.zero.lower;
  if (D.22925 < D.22926) goto <D.22919>; else goto <D.22918>;
  <D.22919>:
  verbose_level.8 = verbose_level;
  if (verbose_level.8 > 1) goto <D.22928>; else goto <D.22929>;
  <D.22928>:
  printf ("ARRAY-ACCESS: removed bounds check on array %d with index %d\n", array_variable, index_variable);
  <D.22929>:
  ins->opcode = 316;
  ins->dreg = -1;
  ins->sreg3 = -1;
  D.22930 = ins->sreg3;
  ins->sreg2 = D.22930;
  D.22931 = ins->sreg2;
  ins->sreg1 = D.22931;
  goto <D.22920>;
  <D.22918>:
  verbose_level.8 = verbose_level;
  if (verbose_level.8 > 2) goto <D.22932>; else goto <D.22933>;
  <D.22932>:
  D.22921 = index_context->ranges.zero.lower;
  if (D.22921 >= 0) goto <D.22934>; else goto <D.22935>;
  <D.22934>:
  printf ("ARRAY-ACCESS: Removed lower bound check on array %d with index %d\n", array_variable, index_variable);
  <D.22935>:
  D.22923 = index_context->ranges.variable.upper;
  if (D.22923 < 0) goto <D.22936>; else goto <D.22937>;
  <D.22936>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through variable) on array %d with index %d\n", array_variable, index_variable);
  <D.22937>:
  D.22925 = index_context->ranges.zero.upper;
  D.22926 = array_context->ranges.zero.lower;
  if (D.22925 < D.22926) goto <D.22938>; else goto <D.22939>;
  <D.22938>:
  printf ("ARRAY-ACCESS: Removed upper bound check (through constant) on array %d with index %d\n", array_variable, index_variable);
  <D.22939>:
  <D.22933>:
  <D.22920>:
}


clean_contexts (struct MonoRelationsEvaluationContext * contexts, int number)
{
  long unsigned int D.22940;
  long unsigned int D.22941;
  struct MonoRelationsEvaluationContext * D.22942;
  int i;

  i = 0;
  goto <D.22414>;
  <D.22413>:
  D.22940 = (long unsigned int) i;
  D.22941 = D.22940 * 40;
  D.22942 = contexts + D.22941;
  D.22942->status = 0;
  i = i + 1;
  <D.22414>:
  if (i < number) goto <D.22413>; else goto <D.22415>;
  <D.22415>:
}


evaluate_relation_with_target_variable (struct MonoVariableRelationsEvaluationArea * area, int variable, int target_variable, struct MonoRelationsEvaluationContext * father_context)
{
  struct MonoRelationsEvaluationContext * D.22943;
  long unsigned int D.22944;
  long unsigned int D.22945;
  <unnamed type> D.22946;
  struct MonoSummarizedValueRelation * D.22947;
  long unsigned int D.22948;
  int verbose_level.9;
  <unnamed type> D.22958;
  <unnamed type> D.22959;
  int D.22960;
  struct MonoRelationsEvaluationRange * D.22961;
  long unsigned int D.22964;
  long unsigned int D.22965;
  <unnamed type> D.22969;
  struct MonoSummarizedValueRelation * D.22971;
  <unnamed type> D.22972;
  int D.22974;
  unsigned int D.22975;
  int D.22984;
  int D.22986;
  int iftmp.10;
  int D.22989;
  int iftmp.11;
  int D.23004;
  int iftmp.12;
  int D.23007;
  int iftmp.13;
  int D.23022;
  int iftmp.14;
  int D.23025;
  int iftmp.15;
  int D.23040;
  int iftmp.16;
  int D.23043;
  int iftmp.17;
  struct MonoRelationsEvaluationRanges * D.23057;
  struct MonoRelationsEvaluationRanges * D.23062;
  int * D.23065;
  long unsigned int D.23066;
  long unsigned int D.23067;
  int * D.23068;
  unsigned int D.23073;
  unsigned int D.23076;
  unsigned int D.23079;
  long unsigned int D.23083;
  long unsigned int D.23084;
  struct MonoRelationsEvaluationContext * D.23085;
  int D.23086;
  int D.23087;
  int D.23088;
  int D.23089;
  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.23103;
  int D.23104;
  int D.23105;
  int D.23106;
  struct MonoSummarizedValueRelation * D.23116;
  struct MonoSummarizedValueRelation * D.23119;
  int D.23120;
  <unnamed type> D.23123;
  int D.23126;
  <unnamed type> D.23144;
  unsigned int D.23145;
  struct MonoRelationsEvaluationContext * context;

  D.22943 = area->contexts;
  D.22944 = (long unsigned int) variable;
  D.22945 = D.22944 * 40;
  context = D.22943 + D.22945;
  D.22946 = context->status;
  switch (D.22946) <default: <D.22491>, case 0: <D.22455>, case 1: <D.22477>, case 2: <D.22490>>
  <D.22455>:
  {
    struct MonoSummarizedValueRelation * relation;

    D.22947 = area->relations;
    D.22944 = (long unsigned int) variable;
    D.22948 = D.22944 * 48;
    relation = D.22947 + D.22948;
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.22950>; else goto <D.22951>;
    <D.22950>:
    printf ("Evaluating variable %d (target variable %d)\n", variable, target_variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22951>:
    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.22952>; else goto <D.22953>;
    <D.22952>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.22954>; else goto <D.22955>;
    <D.22954>:
    printf ("Target variable reached (%d), continuing to evaluate relations with constants\n", variable);
    <D.22955>:
    context->ranges.variable.lower = 0;
    context->ranges.variable.upper = 0;
    <D.22953>:
    goto <D.22474>;
    <D.22473>:
    context->current_relation = relation;
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.22956>; else goto <D.22957>;
    <D.22956>:
    printf ("Processing (%d): ", variable);
    print_summarized_value_relation (relation);
    printf ("\n");
    <D.22957>:
    D.22958 = relation->related_value.type;
    switch (D.22958) <default: <D.22472>, case 0: <D.22457>, case 1: <D.22459>, case 2: <D.22460>, case 3: <D.22463>>
    <D.22457>:
    goto <D.22458>;
    <D.22459>:
    D.22959 = relation->relation;
    D.22960 = relation->related_value.value.constant.value;
    D.22961 = &context->ranges.zero;
    intersect_value (D.22961, D.22960, D.22959);
    goto <D.22458>;
    <D.22460>:
    D.22959 = relation->relation;
    if (D.22959 != 7) goto <D.22962>; else goto <D.22963>;
    <D.22962>:
    {
      int related_variable;
      struct MonoRelationsEvaluationContext * related_context;

      related_variable = relation->related_value.value.variable.variable;
      D.22943 = area->contexts;
      D.22964 = (long unsigned int) related_variable;
      D.22965 = D.22964 * 40;
      related_context = D.22943 + D.22965;
      D.22969 = related_context->status;
      if (D.22969 == 0) goto <D.22966>; else goto <D.22970>;
      <D.22970>:
      D.22971 = related_context->current_relation;
      D.22972 = D.22971->related_value.type;
      if (D.22972 != 2) goto <D.22966>; else goto <D.22973>;
      <D.22973>:
      D.22971 = related_context->current_relation;
      D.22974 = D.22971->related_value.value.variable.variable;
      if (D.22974 != variable) goto <D.22966>; else goto <D.22967>;
      <D.22966>:
      evaluate_relation_with_target_variable (area, related_variable, target_variable, context);
      D.22946 = context->status;
      D.22975 = D.22946 & 28;
      if (D.22975 != 0) goto <D.22976>; else goto <D.22977>;
      <D.22976>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.22978>; else goto <D.22979>;
      <D.22978>:
      printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
      D.22946 = context->status;
      print_evaluation_context_status (D.22946);
      <D.22979>:
      D.22969 = related_context->status;
      if (D.22969 == 2) goto <D.22980>; else goto <D.22981>;
      <D.22980>:
      context->ranges = related_context->ranges;
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 > 0) goto <D.22985>; else goto <D.22982>;
      <D.22985>:
      D.22986 = context->ranges.zero.lower;
      if (D.22986 != -2147483648) goto <D.22987>; else goto <D.22982>;
      <D.22987>:
      D.22986 = context->ranges.zero.lower;
      D.22984 = relation->related_value.value.variable.delta;
      D.22989 = D.22986 + D.22984;
      D.22986 = context->ranges.zero.lower;
      if (D.22989 > D.22986) goto <D.22990>; else goto <D.22991>;
      <D.22990>:
      D.22986 = context->ranges.zero.lower;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.10 = D.22986 + D.22984;
      goto <D.22992>;
      <D.22991>:
      iftmp.10 = 2147483647;
      <D.22992>:
      context->ranges.zero.lower = iftmp.10;
      goto <D.22983>;
      <D.22982>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 < 0) goto <D.22993>; else goto <D.22994>;
      <D.22993>:
      D.22986 = context->ranges.zero.lower;
      if (D.22986 != 2147483647) goto <D.22995>; else goto <D.22996>;
      <D.22995>:
      D.22986 = context->ranges.zero.lower;
      D.22984 = relation->related_value.value.variable.delta;
      D.22989 = D.22986 + D.22984;
      D.22986 = context->ranges.zero.lower;
      if (D.22989 < D.22986) goto <D.22998>; else goto <D.22999>;
      <D.22998>:
      D.22986 = context->ranges.zero.lower;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.11 = D.22986 + D.22984;
      goto <D.23000>;
      <D.22999>:
      iftmp.11 = -2147483648;
      <D.23000>:
      context->ranges.zero.lower = iftmp.11;
      <D.22996>:
      <D.22994>:
      <D.22983>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 > 0) goto <D.23003>; else goto <D.23001>;
      <D.23003>:
      D.23004 = context->ranges.zero.upper;
      if (D.23004 != -2147483648) goto <D.23005>; else goto <D.23001>;
      <D.23005>:
      D.23004 = context->ranges.zero.upper;
      D.22984 = relation->related_value.value.variable.delta;
      D.23007 = D.23004 + D.22984;
      D.23004 = context->ranges.zero.upper;
      if (D.23007 > D.23004) goto <D.23008>; else goto <D.23009>;
      <D.23008>:
      D.23004 = context->ranges.zero.upper;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.12 = D.23004 + D.22984;
      goto <D.23010>;
      <D.23009>:
      iftmp.12 = 2147483647;
      <D.23010>:
      context->ranges.zero.upper = iftmp.12;
      goto <D.23002>;
      <D.23001>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 < 0) goto <D.23011>; else goto <D.23012>;
      <D.23011>:
      D.23004 = context->ranges.zero.upper;
      if (D.23004 != 2147483647) goto <D.23013>; else goto <D.23014>;
      <D.23013>:
      D.23004 = context->ranges.zero.upper;
      D.22984 = relation->related_value.value.variable.delta;
      D.23007 = D.23004 + D.22984;
      D.23004 = context->ranges.zero.upper;
      if (D.23007 < D.23004) goto <D.23016>; else goto <D.23017>;
      <D.23016>:
      D.23004 = context->ranges.zero.upper;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.13 = D.23004 + D.22984;
      goto <D.23018>;
      <D.23017>:
      iftmp.13 = -2147483648;
      <D.23018>:
      context->ranges.zero.upper = iftmp.13;
      <D.23014>:
      <D.23012>:
      <D.23002>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 > 0) goto <D.23021>; else goto <D.23019>;
      <D.23021>:
      D.23022 = context->ranges.variable.lower;
      if (D.23022 != -2147483648) goto <D.23023>; else goto <D.23019>;
      <D.23023>:
      D.23022 = context->ranges.variable.lower;
      D.22984 = relation->related_value.value.variable.delta;
      D.23025 = D.23022 + D.22984;
      D.23022 = context->ranges.variable.lower;
      if (D.23025 > D.23022) goto <D.23026>; else goto <D.23027>;
      <D.23026>:
      D.23022 = context->ranges.variable.lower;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.14 = D.23022 + D.22984;
      goto <D.23028>;
      <D.23027>:
      iftmp.14 = 2147483647;
      <D.23028>:
      context->ranges.variable.lower = iftmp.14;
      goto <D.23020>;
      <D.23019>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 < 0) goto <D.23029>; else goto <D.23030>;
      <D.23029>:
      D.23022 = context->ranges.variable.lower;
      if (D.23022 != 2147483647) goto <D.23031>; else goto <D.23032>;
      <D.23031>:
      D.23022 = context->ranges.variable.lower;
      D.22984 = relation->related_value.value.variable.delta;
      D.23025 = D.23022 + D.22984;
      D.23022 = context->ranges.variable.lower;
      if (D.23025 < D.23022) goto <D.23034>; else goto <D.23035>;
      <D.23034>:
      D.23022 = context->ranges.variable.lower;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.15 = D.23022 + D.22984;
      goto <D.23036>;
      <D.23035>:
      iftmp.15 = -2147483648;
      <D.23036>:
      context->ranges.variable.lower = iftmp.15;
      <D.23032>:
      <D.23030>:
      <D.23020>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 > 0) goto <D.23039>; else goto <D.23037>;
      <D.23039>:
      D.23040 = context->ranges.variable.upper;
      if (D.23040 != -2147483648) goto <D.23041>; else goto <D.23037>;
      <D.23041>:
      D.23040 = context->ranges.variable.upper;
      D.22984 = relation->related_value.value.variable.delta;
      D.23043 = D.23040 + D.22984;
      D.23040 = context->ranges.variable.upper;
      if (D.23043 > D.23040) goto <D.23044>; else goto <D.23045>;
      <D.23044>:
      D.23040 = context->ranges.variable.upper;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.16 = D.23040 + D.22984;
      goto <D.23046>;
      <D.23045>:
      iftmp.16 = 2147483647;
      <D.23046>:
      context->ranges.variable.upper = iftmp.16;
      goto <D.23038>;
      <D.23037>:
      D.22984 = relation->related_value.value.variable.delta;
      if (D.22984 < 0) goto <D.23047>; else goto <D.23048>;
      <D.23047>:
      D.23040 = context->ranges.variable.upper;
      if (D.23040 != 2147483647) goto <D.23049>; else goto <D.23050>;
      <D.23049>:
      D.23040 = context->ranges.variable.upper;
      D.22984 = relation->related_value.value.variable.delta;
      D.23043 = D.23040 + D.22984;
      D.23040 = context->ranges.variable.upper;
      if (D.23043 < D.23040) goto <D.23052>; else goto <D.23053>;
      <D.23052>:
      D.23040 = context->ranges.variable.upper;
      D.22984 = relation->related_value.value.variable.delta;
      iftmp.17 = D.23040 + D.22984;
      goto <D.23054>;
      <D.23053>:
      iftmp.17 = -2147483648;
      <D.23054>:
      context->ranges.variable.upper = iftmp.17;
      <D.23050>:
      <D.23048>:
      <D.23038>:
      context->status = 2;
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23055>; else goto <D.23056>;
      <D.23055>:
      printf (", ranges already computed, result: \n");
      D.23057 = &context->ranges;
      print_evaluation_context_ranges (D.23057);
      D.22984 = relation->related_value.value.variable.delta;
      printf (" (delta is %d)\n", D.22984);
      <D.23056>:
      goto <D.23058>;
      <D.22981>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23059>; else goto <D.23060>;
      <D.23059>:
      printf (", ranges not computed\n");
      <D.23060>:
      <D.23058>:
      goto <D.23061>;
      <D.22977>:
      D.22959 = relation->relation;
      D.22984 = relation->related_value.value.variable.delta;
      D.23062 = &related_context->ranges;
      D.23057 = &context->ranges;
      intersect_ranges (D.23057, D.23062, D.22984, D.22959);
      <D.23061>:
      goto <D.22968>;
      <D.22967>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23063>; else goto <D.23064>;
      <D.23063>:
      printf ("Relation is a back-edge in this traversal, skipping\n");
      <D.23064>:
      <D.22968>:
    }
    <D.22963>:
    goto <D.22458>;
    <D.22463>:
    {
      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.22470>;
          <D.22469>:
          {
            int phi_alternative;

            D.23065 = relation->related_value.value.phi.phi_alternatives;
            D.23066 = (long unsigned int) phi;
            D.23067 = D.23066 * 4;
            D.23068 = D.23065 + D.23067;
            phi_alternative = *D.23068;
            evaluate_relation_with_target_variable (area, phi_alternative, target_variable, context);
            D.22946 = context->status;
            D.22975 = D.22946 & 28;
            if (D.22975 != 0) goto <D.23069>; else goto <D.23070>;
            <D.23069>:
            verbose_level.9 = verbose_level;
            if (verbose_level.9 > 2) goto <D.23071>; else goto <D.23072>;
            <D.23071>:
            printf ("Recursivity detected for variable %d (target variable %d), status ", variable, target_variable);
            D.22946 = context->status;
            print_evaluation_context_status (D.22946);
            printf ("\n");
            <D.23072>:
            D.22946 = context->status;
            D.23073 = D.22946 & 4;
            if (D.23073 != 0) goto <D.23074>; else goto <D.23075>;
            <D.23074>:
            is_ascending = 1;
            <D.23075>:
            D.22946 = context->status;
            D.23076 = D.22946 & 8;
            if (D.23076 != 0) goto <D.23077>; else goto <D.23078>;
            <D.23077>:
            is_descending = 1;
            <D.23078>:
            D.22946 = context->status;
            D.23079 = D.22946 & 16;
            if (D.23079 != 0) goto <D.23080>; else goto <D.23081>;
            <D.23080>:
            is_ascending = 1;
            is_descending = 1;
            <D.23081>:
            context->status = 1;
            goto <D.23082>;
            <D.23070>:
            D.22943 = area->contexts;
            D.23083 = (long unsigned int) phi_alternative;
            D.23084 = D.23083 * 40;
            D.23085 = D.22943 + D.23084;
            D.23086 = D.23085->ranges.zero.lower;
            D.23087 = phi_ranges.zero.lower;
            D.23088 = MIN_EXPR <D.23086, D.23087>;
            phi_ranges.zero.lower = D.23088;
            D.22943 = area->contexts;
            D.23083 = (long unsigned int) phi_alternative;
            D.23084 = D.23083 * 40;
            D.23085 = D.22943 + D.23084;
            D.23089 = D.23085->ranges.zero.upper;
            D.23090 = phi_ranges.zero.upper;
            D.23091 = MAX_EXPR <D.23089, D.23090>;
            phi_ranges.zero.upper = D.23091;
            D.22943 = area->contexts;
            D.23083 = (long unsigned int) phi_alternative;
            D.23084 = D.23083 * 40;
            D.23085 = D.22943 + D.23084;
            D.23092 = D.23085->ranges.variable.lower;
            D.23093 = phi_ranges.variable.lower;
            D.23094 = MIN_EXPR <D.23092, D.23093>;
            phi_ranges.variable.lower = D.23094;
            D.22943 = area->contexts;
            D.23083 = (long unsigned int) phi_alternative;
            D.23084 = D.23083 * 40;
            D.23085 = D.22943 + D.23084;
            D.23095 = D.23085->ranges.variable.upper;
            D.23096 = phi_ranges.variable.upper;
            D.23097 = MAX_EXPR <D.23095, D.23096>;
            phi_ranges.variable.upper = D.23097;
            <D.23082>:
          }
          phi = phi + 1;
          <D.22470>:
          D.23098 = relation->related_value.value.phi.number_of_alternatives;
          if (D.23098 > phi) goto <D.22469>; else goto <D.22471>;
          <D.22471>:
          if (is_ascending != 0) goto <D.23099>; else goto <D.23100>;
          <D.23099>:
          phi_ranges.zero.upper = 2147483647;
          phi_ranges.variable.upper = 2147483647;
          <D.23100>:
          if (is_descending != 0) goto <D.23101>; else goto <D.23102>;
          <D.23101>:
          phi_ranges.zero.lower = -2147483648;
          phi_ranges.variable.lower = -2147483648;
          <D.23102>:
          D.23087 = phi_ranges.zero.lower;
          D.22986 = context->ranges.zero.lower;
          D.23103 = MAX_EXPR <D.23087, D.22986>;
          context->ranges.zero.lower = D.23103;
          D.23090 = phi_ranges.zero.upper;
          D.23004 = context->ranges.zero.upper;
          D.23104 = MIN_EXPR <D.23090, D.23004>;
          context->ranges.zero.upper = D.23104;
          D.23093 = phi_ranges.variable.lower;
          D.23022 = context->ranges.variable.lower;
          D.23105 = MAX_EXPR <D.23093, D.23022>;
          context->ranges.variable.lower = D.23105;
          D.23096 = phi_ranges.variable.upper;
          D.23040 = context->ranges.variable.upper;
          D.23106 = MIN_EXPR <D.23096, D.23040>;
          context->ranges.variable.upper = D.23106;
          goto <D.22458>;
        }
      finally
        {
          phi_ranges = {CLOBBER};
        }
    }
    <D.22472>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 819);
    <D.22458>:
    relation = relation->next;
    <D.22474>:
    if (relation != 0B) goto <D.22473>; else goto <D.22475>;
    <D.22475>:
    D.22946 = context->status;
    D.22975 = D.22946 & 28;
    if (D.22975 != 0) goto <D.23107>; else goto <D.23108>;
    <D.23107>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23109>; else goto <D.23110>;
    <D.23109>:
    printf ("Recursivity for variable %d (target variable %d) discards computation, status ", variable, target_variable);
    D.22946 = context->status;
    print_evaluation_context_status (D.22946);
    printf ("\n");
    <D.23110>:
    context->status = 0;
    goto <D.23111>;
    <D.23108>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23112>; else goto <D.23113>;
    <D.23112>:
    printf ("Ranges for variable %d (target variable %d) computed: ", variable, target_variable);
    D.23057 = &context->ranges;
    print_evaluation_context_ranges (D.23057);
    printf ("\n");
    <D.23113>:
    context->status = 2;
    <D.23111>:
    goto <D.22476>;
  }
  <D.22477>:
  {
    struct MonoRelationsEvaluationContext * current_context;
    struct MonoRelationsEvaluationContext * last_context;
    gboolean evaluation_can_be_recursive;
    gboolean evaluation_is_definition;
    int path_value;

    current_context = father_context;
    last_context = context->father;
    evaluation_can_be_recursive = 1;
    evaluation_is_definition = 1;
    path_value = 0;
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23114>; else goto <D.23115>;
    <D.23114>:
    printf ("Evaluation of variable %d (target variable %d) already in progress\n", variable, target_variable);
    print_evaluation_context (context);
    D.23116 = context->current_relation;
    print_summarized_value_relation (D.23116);
    printf ("\n");
    <D.23115>:
    goto <D.22484>;
    <D.22483>:
    if (current_context == 0B) goto <D.23117>; else goto <D.23118>;
    <D.23117>:
    printf ("Broken recursive ring in ABC removal\n");
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 867);
    <D.23118>:
    D.23119 = current_context->current_relation;
    D.23120 = D.23119->relation_is_static_definition;
    if (D.23120 != 0) goto <D.23121>; else goto <D.23122>;
    <D.23121>:
    D.23119 = current_context->current_relation;
    D.23123 = D.23119->related_value.type;
    if (D.23123 == 2) goto <D.23124>; else goto <D.23125>;
    <D.23124>:
    D.23119 = current_context->current_relation;
    D.23126 = D.23119->related_value.value.variable.delta;
    path_value = D.23126 + path_value;
    goto <D.23127>;
    <D.23125>:
    D.23119 = current_context->current_relation;
    D.23123 = D.23119->related_value.type;
    if (D.23123 != 3) goto <D.23128>; else goto <D.23129>;
    <D.23128>:
    evaluation_can_be_recursive = 0;
    <D.23129>:
    <D.23127>:
    goto <D.23130>;
    <D.23122>:
    evaluation_is_definition = 0;
    evaluation_can_be_recursive = 0;
    <D.23130>:
    current_context = current_context->father;
    <D.22484>:
    if (current_context != last_context) goto <D.22483>; else goto <D.22485>;
    <D.22485>:
    if (evaluation_is_definition != 0) goto <D.23131>; else goto <D.23132>;
    <D.23131>:
    {
      MonoRelationsEvaluationStatus recursive_status;

      if (evaluation_can_be_recursive != 0) goto <D.23133>; else goto <D.23134>;
      <D.23133>:
      if (path_value > 0) goto <D.23135>; else goto <D.23136>;
      <D.23135>:
      recursive_status = 4;
      goto <D.23137>;
      <D.23136>:
      if (path_value < 0) goto <D.23138>; else goto <D.23139>;
      <D.23138>:
      recursive_status = 8;
      goto <D.23140>;
      <D.23139>:
      recursive_status = 16;
      <D.23140>:
      <D.23137>:
      goto <D.23141>;
      <D.23134>:
      recursive_status = 16;
      <D.23141>:
      verbose_level.9 = verbose_level;
      if (verbose_level.9 > 2) goto <D.23142>; else goto <D.23143>;
      <D.23142>:
      printf ("Recursivity accepted (");
      print_evaluation_context_status (recursive_status);
      printf (")\n");
      <D.23143>:
      current_context = father_context;
      goto <D.22488>;
      <D.22487>:
      D.23144 = current_context->status;
      D.23145 = D.23144 | recursive_status;
      current_context->status = D.23145;
      current_context = current_context->father;
      <D.22488>:
      if (current_context != last_context) goto <D.22487>; else goto <D.22489>;
      <D.22489>:
    }
    goto <D.23146>;
    <D.23132>:
    verbose_level.9 = verbose_level;
    if (verbose_level.9 > 2) goto <D.23147>; else goto <D.23148>;
    <D.23147>:
    printf ("Recursivity rejected (some relation in the cycle is not a defintion)\n");
    <D.23148>:
    <D.23146>:
    goto <D.22476>;
  }
  <D.22490>:
  return;
  <D.22491>:
  verbose_level.9 = verbose_level;
  if (verbose_level.9 > 2) goto <D.23149>; else goto <D.23150>;
  <D.23149>:
  printf ("Variable %d (target variable %d) already in a recursive ring, skipping\n", variable, target_variable);
  print_evaluation_context (context);
  D.23116 = context->current_relation;
  print_summarized_value_relation (D.23116);
  printf ("\n");
  <D.23150>:
  goto <D.22476>;
  <D.22476>:
}


intersect_value (struct MonoRelationsEvaluationRange * range, int value, MonoValueRelation relation)
{
  int D.23155;
  int D.23156;
  int D.23157;
  int D.23158;
  int iftmp.18;
  unsigned int value.19;
  unsigned int D.23161;
  int D.23165;
  int iftmp.20;
  int D.23170;

  switch (relation) <default: <D.22430>, case 0: <D.22421>, case 1: <D.22424>, case 2: <D.22426>, case 3: <D.22427>, case 4: <D.22428>, case 5: <D.22429>, case 6: <D.22425>, case 7: <D.22423>>
  <D.22421>:
  range->lower = 2147483647;
  range->upper = -2147483648;
  goto <D.22422>;
  <D.22423>:
  goto <D.22422>;
  <D.22424>:
  D.23155 = range->upper;
  D.23156 = MIN_EXPR <D.23155, value>;
  range->upper = D.23156;
  D.23157 = range->lower;
  D.23158 = MAX_EXPR <D.23157, value>;
  range->lower = D.23158;
  goto <D.22422>;
  <D.22425>:
  goto <D.22422>;
  <D.22426>:
  value.19 = (unsigned int) value;
  D.23161 = value.19 + 2147483647;
  if (D.23161 <= 4294967293) goto <D.23162>; else goto <D.23163>;
  <D.23162>:
  iftmp.18 = value + -1;
  goto <D.23164>;
  <D.23163>:
  iftmp.18 = value;
  <D.23164>:
  D.23155 = range->upper;
  D.23165 = MIN_EXPR <iftmp.18, D.23155>;
  range->upper = D.23165;
  goto <D.22422>;
  <D.22427>:
  D.23155 = range->upper;
  D.23156 = MIN_EXPR <D.23155, value>;
  range->upper = D.23156;
  goto <D.22422>;
  <D.22428>:
  value.19 = (unsigned int) value;
  D.23161 = value.19 + 2147483647;
  if (D.23161 <= 4294967293) goto <D.23167>; else goto <D.23168>;
  <D.23167>:
  iftmp.20 = value + 1;
  goto <D.23169>;
  <D.23168>:
  iftmp.20 = value;
  <D.23169>:
  D.23157 = range->lower;
  D.23170 = MAX_EXPR <iftmp.20, D.23157>;
  range->lower = D.23170;
  goto <D.22422>;
  <D.22429>:
  D.23157 = range->lower;
  D.23158 = MAX_EXPR <D.23157, value>;
  range->lower = D.23158;
  goto <D.22422>;
  <D.22430>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 586);
  <D.22422>:
}


intersect_ranges (struct MonoRelationsEvaluationRanges * ranges, struct MonoRelationsEvaluationRanges * other_ranges, int delta, MonoValueRelation relation)
{
  int D.23174;
  int D.23175;
  int D.23176;
  int D.23177;
  int D.23178;
  int D.23179;
  int D.23180;
  int D.23181;
  int D.23182;
  int D.23183;
  int D.23184;
  int D.23185;
  int iftmp.21;
  unsigned int D.23187;
  unsigned int D.23188;
  int D.23192;
  int iftmp.22;
  unsigned int D.23194;
  unsigned int D.23195;
  int D.23199;
  int iftmp.23;
  unsigned int D.23201;
  unsigned int D.23202;
  int D.23206;
  int iftmp.24;
  unsigned int D.23208;
  unsigned int D.23209;
  int D.23213;
  int D.23218;
  int iftmp.25;
  int D.23221;
  int iftmp.26;
  int D.23236;
  int iftmp.27;
  int D.23239;
  int iftmp.28;
  int D.23254;
  int iftmp.29;
  int D.23257;
  int iftmp.30;
  int D.23272;
  int iftmp.31;
  int D.23275;
  int iftmp.32;

  if (delta == 0) goto <D.23172>; else goto <D.23173>;
  <D.23172>:
  switch (relation) <default: <D.22446>, case 0: <D.22437>, case 1: <D.22440>, case 2: <D.22442>, case 3: <D.22443>, case 4: <D.22444>, case 5: <D.22445>, case 6: <D.22441>, case 7: <D.22439>>
  <D.22437>:
  ranges->zero.lower = 2147483647;
  ranges->zero.upper = -2147483648;
  ranges->variable.lower = 2147483647;
  ranges->variable.upper = -2147483648;
  goto <D.22438>;
  <D.22439>:
  goto <D.22438>;
  <D.22440>:
  D.23174 = other_ranges->zero.lower;
  D.23175 = ranges->zero.lower;
  D.23176 = MAX_EXPR <D.23174, D.23175>;
  ranges->zero.lower = D.23176;
  D.23177 = other_ranges->zero.upper;
  D.23178 = ranges->zero.upper;
  D.23179 = MIN_EXPR <D.23177, D.23178>;
  ranges->zero.upper = D.23179;
  D.23180 = other_ranges->variable.lower;
  D.23181 = ranges->variable.lower;
  D.23182 = MAX_EXPR <D.23180, D.23181>;
  ranges->variable.lower = D.23182;
  D.23183 = other_ranges->variable.upper;
  D.23184 = ranges->variable.upper;
  D.23185 = MIN_EXPR <D.23183, D.23184>;
  ranges->variable.upper = D.23185;
  goto <D.22438>;
  <D.22441>:
  goto <D.22438>;
  <D.22442>:
  D.23177 = other_ranges->zero.upper;
  D.23187 = (unsigned int) D.23177;
  D.23188 = D.23187 + 2147483647;
  if (D.23188 > 4294967293) goto <D.23189>; else goto <D.23190>;
  <D.23189>:
  iftmp.21 = other_ranges->zero.upper;
  goto <D.23191>;
  <D.23190>:
  D.23177 = other_ranges->zero.upper;
  iftmp.21 = D.23177 + -1;
  <D.23191>:
  D.23178 = ranges->zero.upper;
  D.23192 = MIN_EXPR <iftmp.21, D.23178>;
  ranges->zero.upper = D.23192;
  D.23183 = other_ranges->variable.upper;
  D.23194 = (unsigned int) D.23183;
  D.23195 = D.23194 + 2147483647;
  if (D.23195 > 4294967293) goto <D.23196>; else goto <D.23197>;
  <D.23196>:
  iftmp.22 = other_ranges->variable.upper;
  goto <D.23198>;
  <D.23197>:
  D.23183 = other_ranges->variable.upper;
  iftmp.22 = D.23183 + -1;
  <D.23198>:
  D.23184 = ranges->variable.upper;
  D.23199 = MIN_EXPR <iftmp.22, D.23184>;
  ranges->variable.upper = D.23199;
  goto <D.22438>;
  <D.22443>:
  D.23177 = other_ranges->zero.upper;
  D.23178 = ranges->zero.upper;
  D.23179 = MIN_EXPR <D.23177, D.23178>;
  ranges->zero.upper = D.23179;
  D.23183 = other_ranges->variable.upper;
  D.23184 = ranges->variable.upper;
  D.23185 = MIN_EXPR <D.23183, D.23184>;
  ranges->variable.upper = D.23185;
  goto <D.22438>;
  <D.22444>:
  D.23174 = other_ranges->zero.lower;
  D.23201 = (unsigned int) D.23174;
  D.23202 = D.23201 + 2147483647;
  if (D.23202 > 4294967293) goto <D.23203>; else goto <D.23204>;
  <D.23203>:
  iftmp.23 = other_ranges->zero.lower;
  goto <D.23205>;
  <D.23204>:
  D.23174 = other_ranges->zero.lower;
  iftmp.23 = D.23174 + 1;
  <D.23205>:
  D.23175 = ranges->zero.lower;
  D.23206 = MAX_EXPR <iftmp.23, D.23175>;
  ranges->zero.lower = D.23206;
  D.23180 = other_ranges->variable.lower;
  D.23208 = (unsigned int) D.23180;
  D.23209 = D.23208 + 2147483647;
  if (D.23209 > 4294967293) goto <D.23210>; else goto <D.23211>;
  <D.23210>:
  iftmp.24 = other_ranges->variable.lower;
  goto <D.23212>;
  <D.23211>:
  D.23180 = other_ranges->variable.lower;
  iftmp.24 = D.23180 + 1;
  <D.23212>:
  D.23181 = ranges->variable.lower;
  D.23213 = MAX_EXPR <iftmp.24, D.23181>;
  ranges->variable.lower = D.23213;
  goto <D.22438>;
  <D.22445>:
  D.23174 = other_ranges->zero.lower;
  D.23175 = ranges->zero.lower;
  D.23176 = MAX_EXPR <D.23174, D.23175>;
  ranges->zero.lower = D.23176;
  D.23180 = other_ranges->variable.lower;
  D.23181 = ranges->variable.lower;
  D.23182 = MAX_EXPR <D.23180, D.23181>;
  ranges->variable.lower = D.23182;
  goto <D.22438>;
  <D.22446>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "abcremoval.c", 633);
  <D.22438>:
  goto <D.23214>;
  <D.23173>:
  {
    struct MonoRelationsEvaluationRanges translated_ranges;

    try
      {
        translated_ranges = *other_ranges;
        if (delta > 0) goto <D.23217>; else goto <D.23215>;
        <D.23217>:
        D.23218 = translated_ranges.zero.lower;
        if (D.23218 != -2147483648) goto <D.23219>; else goto <D.23215>;
        <D.23219>:
        D.23218 = translated_ranges.zero.lower;
        D.23221 = D.23218 + delta;
        D.23218 = translated_ranges.zero.lower;
        if (D.23221 > D.23218) goto <D.23222>; else goto <D.23223>;
        <D.23222>:
        D.23218 = translated_ranges.zero.lower;
        iftmp.25 = D.23218 + delta;
        goto <D.23224>;
        <D.23223>:
        iftmp.25 = 2147483647;
        <D.23224>:
        translated_ranges.zero.lower = iftmp.25;
        goto <D.23216>;
        <D.23215>:
        if (delta < 0) goto <D.23225>; else goto <D.23226>;
        <D.23225>:
        D.23218 = translated_ranges.zero.lower;
        if (D.23218 != 2147483647) goto <D.23227>; else goto <D.23228>;
        <D.23227>:
        D.23218 = translated_ranges.zero.lower;
        D.23221 = D.23218 + delta;
        D.23218 = translated_ranges.zero.lower;
        if (D.23221 < D.23218) goto <D.23230>; else goto <D.23231>;
        <D.23230>:
        D.23218 = translated_ranges.zero.lower;
        iftmp.26 = D.23218 + delta;
        goto <D.23232>;
        <D.23231>:
        iftmp.26 = -2147483648;
        <D.23232>:
        translated_ranges.zero.lower = iftmp.26;
        <D.23228>:
        <D.23226>:
        <D.23216>:
        if (delta > 0) goto <D.23235>; else goto <D.23233>;
        <D.23235>:
        D.23236 = translated_ranges.zero.upper;
        if (D.23236 != -2147483648) goto <D.23237>; else goto <D.23233>;
        <D.23237>:
        D.23236 = translated_ranges.zero.upper;
        D.23239 = D.23236 + delta;
        D.23236 = translated_ranges.zero.upper;
        if (D.23239 > D.23236) goto <D.23240>; else goto <D.23241>;
        <D.23240>:
        D.23236 = translated_ranges.zero.upper;
        iftmp.27 = D.23236 + delta;
        goto <D.23242>;
        <D.23241>:
        iftmp.27 = 2147483647;
        <D.23242>:
        translated_ranges.zero.upper = iftmp.27;
        goto <D.23234>;
        <D.23233>:
        if (delta < 0) goto <D.23243>; else goto <D.23244>;
        <D.23243>:
        D.23236 = translated_ranges.zero.upper;
        if (D.23236 != 2147483647) goto <D.23245>; else goto <D.23246>;
        <D.23245>:
        D.23236 = translated_ranges.zero.upper;
        D.23239 = D.23236 + delta;
        D.23236 = translated_ranges.zero.upper;
        if (D.23239 < D.23236) goto <D.23248>; else goto <D.23249>;
        <D.23248>:
        D.23236 = translated_ranges.zero.upper;
        iftmp.28 = D.23236 + delta;
        goto <D.23250>;
        <D.23249>:
        iftmp.28 = -2147483648;
        <D.23250>:
        translated_ranges.zero.upper = iftmp.28;
        <D.23246>:
        <D.23244>:
        <D.23234>:
        if (delta > 0) goto <D.23253>; else goto <D.23251>;
        <D.23253>:
        D.23254 = translated_ranges.variable.lower;
        if (D.23254 != -2147483648) goto <D.23255>; else goto <D.23251>;
        <D.23255>:
        D.23254 = translated_ranges.variable.lower;
        D.23257 = D.23254 + delta;
        D.23254 = translated_ranges.variable.lower;
        if (D.23257 > D.23254) goto <D.23258>; else goto <D.23259>;
        <D.23258>:
        D.23254 = translated_ranges.variable.lower;
        iftmp.29 = D.23254 + delta;
        goto <D.23260>;
        <D.23259>:
        iftmp.29 = 2147483647;
        <D.23260>:
        translated_ranges.variable.lower = iftmp.29;
        goto <D.23252>;
        <D.23251>:
        if (delta < 0) goto <D.23261>; else goto <D.23262>;
        <D.23261>:
        D.23254 = translated_ranges.variable.lower;
        if (D.23254 != 2147483647) goto <D.23263>; else goto <D.23264>;
        <D.23263>:
        D.23254 = translated_ranges.variable.lower;
        D.23257 = D.23254 + delta;
        D.23254 = translated_ranges.variable.lower;
        if (D.23257 < D.23254) goto <D.23266>; else goto <D.23267>;
        <D.23266>:
        D.23254 = translated_ranges.variable.lower;
        iftmp.30 = D.23254 + delta;
        goto <D.23268>;
        <D.23267>:
        iftmp.30 = -2147483648;
        <D.23268>:
        translated_ranges.variable.lower = iftmp.30;
        <D.23264>:
        <D.23262>:
        <D.23252>:
        if (delta > 0) goto <D.23271>; else goto <D.23269>;
        <D.23271>:
        D.23272 = translated_ranges.variable.upper;
        if (D.23272 != -2147483648) goto <D.23273>; else goto <D.23269>;
        <D.23273>:
        D.23272 = translated_ranges.variable.upper;
        D.23275 = D.23272 + delta;
        D.23272 = translated_ranges.variable.upper;
        if (D.23275 > D.23272) goto <D.23276>; else goto <D.23277>;
        <D.23276>:
        D.23272 = translated_ranges.variable.upper;
        iftmp.31 = D.23272 + delta;
        goto <D.23278>;
        <D.23277>:
        iftmp.31 = 2147483647;
        <D.23278>:
        translated_ranges.variable.upper = iftmp.31;
        goto <D.23270>;
        <D.23269>:
        if (delta < 0) goto <D.23279>; else goto <D.23280>;
        <D.23279>:
        D.23272 = translated_ranges.variable.upper;
        if (D.23272 != 2147483647) goto <D.23281>; else goto <D.23282>;
        <D.23281>:
        D.23272 = translated_ranges.variable.upper;
        D.23275 = D.23272 + delta;
        D.23272 = translated_ranges.variable.upper;
        if (D.23275 < D.23272) goto <D.23284>; else goto <D.23285>;
        <D.23284>:
        D.23272 = translated_ranges.variable.upper;
        iftmp.32 = D.23272 + delta;
        goto <D.23286>;
        <D.23285>:
        iftmp.32 = -2147483648;
        <D.23286>:
        translated_ranges.variable.upper = iftmp.32;
        <D.23282>:
        <D.23280>:
        <D.23270>:
        intersect_ranges (ranges, &translated_ranges, 0, relation);
      }
    finally
      {
        translated_ranges = {CLOBBER};
      }
  }
  <D.23214>:
}


print_evaluation_context_ranges (struct MonoRelationsEvaluationRanges * ranges)
{
  int D.23289;
  int D.23290;
  int D.23291;
  int D.23292;

  D.23289 = ranges->variable.upper;
  D.23290 = ranges->variable.lower;
  D.23291 = ranges->zero.upper;
  D.23292 = ranges->zero.lower;
  printf ("(ranges: zero [%d,%d], variable [%d,%d])", D.23292, D.23291, D.23290, D.23289);
}


print_evaluation_context_status (MonoRelationsEvaluationStatus status)
{
  unsigned int D.23296;
  unsigned int D.23301;
  unsigned int D.23306;
  unsigned int D.23311;
  unsigned int D.23316;

  if (status == 0) goto <D.23293>; else goto <D.23294>;
  <D.23293>:
  printf ("EVALUATION_NOT_STARTED");
  goto <D.23295>;
  <D.23294>:
  {
    gboolean print_or;

    print_or = 0;
    printf ("(");
    D.23296 = status & 1;
    if (D.23296 != 0) goto <D.23297>; else goto <D.23298>;
    <D.23297>:
    if (print_or != 0) goto <D.23299>; else goto <D.23300>;
    <D.23299>:
    printf ("|");
    <D.23300>:
    printf ("EVALUATION_IN_PROGRESS");
    print_or = 1;
    <D.23298>:
    D.23301 = status & 2;
    if (D.23301 != 0) goto <D.23302>; else goto <D.23303>;
    <D.23302>:
    if (print_or != 0) goto <D.23304>; else goto <D.23305>;
    <D.23304>:
    printf ("|");
    <D.23305>:
    printf ("EVALUATION_COMPLETED");
    print_or = 1;
    <D.23303>:
    D.23306 = status & 4;
    if (D.23306 != 0) goto <D.23307>; else goto <D.23308>;
    <D.23307>:
    if (print_or != 0) goto <D.23309>; else goto <D.23310>;
    <D.23309>:
    printf ("|");
    <D.23310>:
    printf ("RECURSIVELY_ASCENDING");
    print_or = 1;
    <D.23308>:
    D.23311 = status & 8;
    if (D.23311 != 0) goto <D.23312>; else goto <D.23313>;
    <D.23312>:
    if (print_or != 0) goto <D.23314>; else goto <D.23315>;
    <D.23314>:
    printf ("|");
    <D.23315>:
    printf ("RECURSIVELY_DESCENDING");
    print_or = 1;
    <D.23313>:
    D.23316 = status & 16;
    if (D.23316 != 0) goto <D.23317>; else goto <D.23318>;
    <D.23317>:
    if (print_or != 0) goto <D.23319>; else goto <D.23320>;
    <D.23319>:
    printf ("|");
    <D.23320>:
    printf ("RECURSIVELY_INDEFINITE");
    print_or = 1;
    <D.23318>:
    printf (")");
  }
  <D.23295>:
}


print_evaluation_context (struct MonoRelationsEvaluationContext * context)
{
  <unnamed type> D.23321;
  unsigned int D.23322;
  struct MonoRelationsEvaluationRanges * D.23325;

  printf ("Context status: ");
  D.23321 = context->status;
  print_evaluation_context_status (D.23321);
  D.23321 = context->status;
  D.23322 = D.23321 & 3;
  if (D.23322 != 0) goto <D.23323>; else goto <D.23324>;
  <D.23323>:
  D.23325 = &context->ranges;
  print_evaluation_context_ranges (D.23325);
  <D.23324>:
  printf ("\n");
}


apply_change_to_evaluation_area (struct MonoVariableRelationsEvaluationArea * area, struct MonoAdditionalVariableRelation * change)
{
  <unnamed type> D.23326;
  struct MonoSummarizedValueRelation * D.23329;
  int D.23330;
  long unsigned int D.23331;
  long unsigned int D.23332;
  struct MonoSummarizedValueRelation * D.23333;
  int D.23335;
  struct MonoSummarizedValueRelation * D.23336;
  struct MonoSummarizedValueRelation * base_relation;

  D.23326 = change->relation.relation;
  if (D.23326 != 7) goto <D.23327>; else goto <D.23328>;
  <D.23327>:
  D.23329 = area->relations;
  D.23330 = change->variable;
  D.23331 = (long unsigned int) D.23330;
  D.23332 = D.23331 * 48;
  base_relation = D.23329 + D.23332;
  goto <D.22403>;
  <D.22402>:
  base_relation = base_relation->next;
  <D.22403>:
  D.23333 = base_relation->next;
  if (D.23333 != 0B) goto <D.23334>; else goto <D.22404>;
  <D.23334>:
  D.23333 = base_relation->next;
  D.23335 = D.23333->relation_is_static_definition;
  if (D.23335 != 0) goto <D.22402>; else goto <D.22404>;
  <D.22404>:
  change->insertion_point = base_relation;
  D.23333 = base_relation->next;
  change->relation.next = D.23333;
  D.23336 = &change->relation;
  base_relation->next = D.23336;
  <D.23328>:
}


g_slist_append_mempool (struct MonoMemPool * mp, struct GSList * list, void * data)
{
  struct GSList * D.23339;
  struct GSList * D.23340;
  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.23337>; else goto <D.23338>;
  <D.23337>:
  last = list;
  goto <D.6705>;
  <D.6704>:
  last = last->next;
  <D.6705>:
  D.23339 = last->next;
  if (D.23339 != 0B) goto <D.6704>; else goto <D.6706>;
  <D.6706>:
  last->next = new_list;
  D.23340 = list;
  return D.23340;
  <D.23338>:
  D.23340 = new_list;
  return D.23340;
}


eval_non_null (struct MonoVariableRelationsEvaluationArea * area, int reg)
{
  struct MonoRelationsEvaluationContext * D.23342;
  long unsigned int D.23343;
  long unsigned int D.23344;
  struct MonoCompile * D.23345;
  unsigned int D.23346;
  int D.23347;
  gboolean D.23348;
  int D.23349;
  _Bool D.23350;
  struct MonoRelationsEvaluationContext * context;

  D.23342 = area->contexts;
  D.23343 = (long unsigned int) reg;
  D.23344 = D.23343 * 40;
  context = D.23342 + D.23344;
  D.23345 = area->cfg;
  D.23346 = D.23345->next_vreg;
  D.23347 = (int) D.23346;
  D.23342 = area->contexts;
  clean_contexts (D.23342, D.23347);
  evaluate_relation_with_target_variable (area, reg, reg, 0B);
  D.23349 = context->ranges.zero.lower;
  D.23350 = D.23349 > 0;
  D.23348 = (gboolean) D.23350;
  return D.23348;
}


add_non_null (struct MonoVariableRelationsEvaluationArea * area, struct MonoCompile * cfg, int reg, struct GSList * * check_relations)
{
  struct MonoMemPool * D.23352;
  struct GSList * D.23353;
  struct GSList * D.23354;
  struct MonoAdditionalVariableRelation * rel;

  D.23352 = cfg->mempool;
  rel = mono_mempool_alloc0 (D.23352, 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.23353 = *check_relations;
  D.23352 = cfg->mempool;
  D.23354 = g_slist_append_mempool (D.23352, D.23353, rel);
  *check_relations = D.23354;
}


remove_change_from_evaluation_area (struct MonoAdditionalVariableRelation * change)
{
  struct MonoSummarizedValueRelation * D.23355;
  struct MonoSummarizedValueRelation * D.23358;

  D.23355 = change->insertion_point;
  if (D.23355 != 0B) goto <D.23356>; else goto <D.23357>;
  <D.23356>:
  D.23355 = change->insertion_point;
  D.23358 = change->relation.next;
  D.23355->next = D.23358;
  change->relation.next = 0B;
  <D.23357>:
}


