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