Hi,

Consider 2 for loops as given below.

for (i = 1; i < N ; i++)
    {
      a[i] = 1;
    }
  for (i = 1; i < N ; i++)
    {
      j = j + a[i];
    }

Their corresponding GIMPLE code looks like.

loop_2 (header = 6, latch = 7, niter = , upper_bound = 999, estimate = 999)
{
  bb_6 (preds = {bb_5 bb_7 }, succs = {bb_7 bb_8 })
  {
  <bb 6>:
    # j_24 = PHI <0(5), j_12(7)>
    # i_23 = PHI <1(5), i_13(7)>
    # VUSE <a_19> { a }
    D.1189_10 = a[i_23];
    D.1190_11 = (unsigned int) D.1189_10;
    j_12 = D.1190_11 + j_24;
    i_13 = i_23 + 1;
    if (i_13 <= 999)
      goto <bb 7>;
    else
      goto <bb 8>;

  }
  bb_7 (preds = {bb_6 }, succs = {bb_6 })
  {
  <bb 7>:
    goto <bb 6>;

  }
}
loop_1 (header = 3, latch = 4, niter = , upper_bound = 999, estimate = 999)
{
  bb_3 (preds = {bb_4 bb_2 }, succs = {bb_4 bb_5 })
  {
  <bb 3>:
    # a_25 = PHI <a_19(4), a_18(2)>
    # i_22 = PHI <i_7(4), 1(2)>
    # a_19 = VDEF <a_25> { a }
    a[i_22] = 1;
    i_7 = i_22 + 1;
    if (i_7 <= 999)
      goto <bb 4>;
    else
      goto <bb 5>;

  }
  bb_4 (preds = {bb_3 }, succs = {bb_3 })
  {
  <bb 4>:
    goto <bb 3>;

  }
}

Now I have transferred all statements from loop_2 to loop_1. i.e from
bb_6 to bb_3.
Using code :

 block_stmt_iterator bsi_a, bsi_a_last, bsi_b, bsi_b_last, bsi;
  bsi_b = bsi_start (loop_b->header);
  bsi_b_last = bsi_last (loop_b->header);
  bsi_prev (&bsi_b_last);

  /* Transfer all the statements one by one.  */
  for (bsi = bsi_start (loop_a->header); !bsi_end_p (bsi);)
    {
    if ((TREE_CODE (bsi_stmt (bsi)) != COND_EXPR) && (TREE_CODE
(bsi_stmt (bsi)) != LABEL_EXPR))
           {
             update_stmt (bsi_stmt (bsi));
         bsi_move_before (&bsi, &bsi_b_last);
             fprintf (stderr, " transferred one statement. \n ");
             fprintf (dump_file, " transferred one statement. \n ");
             update_stmt (bsi_stmt (bsi));
           }
    else
           {
         bsi_next (&bsi);
           }
     }


Now the GIMPLE codes look like.


 loop_2 (header = 6, latch = 7, niter = , upper_bound = 999, estimate = 999)
{
  bb_6 (preds = {bb_5 bb_7 }, succs = {bb_7 bb_8 })
  {
  <bb 6>:
    # j_24 = PHI <0(5), j_12(7)>
    # i_23 = PHI <1(5), i_13(7)>
    if (i_13 <= 999)
      goto <bb 7>;
    else
      goto <bb 8>;

  }
  bb_7 (preds = {bb_6 }, succs = {bb_6 })
  {
  <bb 7>:
    goto <bb 6>;

  }
}
loop_1 (header = 3, latch = 4, niter = , upper_bound = 999, estimate = 999)
{
  bb_3 (preds = {bb_4 bb_2 }, succs = {bb_4 bb_5 })
  {
  <bb 3>:
    # a_25 = PHI <a_19(4), a_18(2)>
    # i_22 = PHI <i_7(4), 1(2)>
    # a_19 = VDEF <a_25> { a }
    a[i_22] = 1;
    # VUSE <a_19> { a }
    D.1189_10 = a[i_23];
    D.1190_11 = (unsigned int) D.1189_10;
    j_12 = D.1190_11 + j_24;
    i_13 = i_23 + 1;
    i_7 = i_22 + 1;
    if (i_7 <= 999)
      goto <bb 4>;
    else
      goto <bb 5>;

  }
  bb_4 (preds = {bb_3 }, succs = {bb_3 })
  {
  <bb 4>:
    goto <bb 3>;

  }
}

Now I get an internal compiler error saying
error: definition in block 6 does not dominate use in block 3
for SSA_NAME: i_23 in statement:
# VUSE <a_19>
D.1189_10 = a[i_23];

i_23 is the loop iterator of loop_2 . i_22 is the loop iterator of loop_1.

How can I rename i_23 as i_22?

Thanks,
Sandeep.

Reply via email to