Hello everybody,

I want to make a copy of a loop, but it seems that the function duplicate_loop 
does not work the way I need it.
It does not copy basic_blocks and edges.

What I need is this transformation

// Original
int foo () {
  int i, b;
  i = 0;
  b = 50;
  for (; i <= b; ++b) {
    LOOP_BODY
  }
}

// By copying the loop,
// and adapting the first condition.
int foo () {
  int i, b;
  i = 0;
  b = 50;
  for (; i < b; ++b) {
    LOOP_BODY
  }
  for (; i <= b; ++b) {
    LOOP_BODY
  }
}

// Expected result, which is basically the same as above.
int foo () {
  int i, b;
  i = 0;
  b = 50;
  for (; i < b; ++b) {
    LOOP_BODY
  }
  if (i == b) {
    LOOP_BODY
    ++b;
  }
}

So it should peel the last iteration of the loop, which is possible
when we have a GE_EXPR or a LE_EXPR and the step is 1.
Is there some functions or similar code that I could use as an example?

tree_duplicate_sese_region cannot handle regions containing a loop (as far as I 
can tell).
duplicate_loop_to_header_edge peels from the beginning and not from the end.
I tried that with some postprocessing steps, that redirect some edges, without 
success so far.
I wonder if this is a good way to go or is there a better solution.
Or should I copy everything by hand with get_loop_body and then create new 
basic_blocks and edges?

Thank you and best regards,
Benedikt


Reply via email to