The reversal of a loop can be obtained with a scattering function as shown in this page.
CLooG input for a sample 2D loop is as follows:
c # language is C
1 4 # 1 lines and 4 columns
# eq/in m n 1
1 0 0 0 # 0 >= 0, always true
1 # We want to set manually the parameter names
m n # parameter names
# --------------------- STATEMENTS --------------------
1 # Number of statements
1 # First statement
4 6 # 3 lines and 5 columns
# eq/in i j m n 1
1 1 0 0 0 -1 # i >= 1
1 -1 0 0 1 0 # i <= n
1 0 1 0 0 -1 # j >= 1
1 0 -1 1 0 0 # j <= m
0 0 0 # for future options
1 # We want to set manually the scattering dimension names
i j # scattering dimension names
# --------------------- SCATTERING --------------------
1 # Scattering functions
4 10
# eq/in p1 p2 p3 p4 i j n m 1
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 -1 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 -1 0 0 0
0The output of CLooG is
if (m >= 1) {
for (c2=1;c2<=n;c2++) {
for (c4=1;c4<=m;c4++) {
S1(i = c2,j = c4) ;
}
}
}To reverse the inner loop, scattering function has to be changed to
# --------------------- SCATTERING --------------------
1 # Scattering functions
4 10
# eq/in p1 p2 p3 p4 i j n m 1
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 -1 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 Now the output of CLooG becomes:
if (m >= 1) {
for (c2=1;c2<=n;c2++) {
for (c4=-m;c4<=-1;c4++) {
S1(i = c2,j = -c4) ;
}
}
}