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.