How to duplicate a loop including basic_blocks and edges?

Benedikt Huber benedikt.huber@theobroma-systems.com
Fri Jun 27 14:14:00 GMT 2014


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




More information about the Gcc mailing list