Go to the first, previous, next, last section, table of contents.
for i = 1 to N for j = i to N A[i] = A[j]
For the two accesses of the above loop nest, the following LIC
script will find the set of direction vectors. The systems `iterr'
and `iterw' represents the read and write iteration space and the
system `access' is the relationship between the read and the write
access. The entire system is given by intersecting the above three
systems (`full'). For each possible direction vector, a system
representing that vector is created. If that vector is valid, the
system will have a solution (`intsol()' is 1).
iterr = [ 1 <= ir <= N ir <= jr <= N ] iterw = [ 1 <= iw <= N iw <= jw <= N ] access = [ iw = jr ] full = { iterr, iterw, access } // [= =] #level3 = { full [ ir = iw jr = jw ] } intsol(level3) // [= +] #level2a = { full [ ir = iw jr > jw ] } intsol(level2a) // [= +] #level2b = { full [ ir = iw jr < jw ] } intsol(level2b) // [+ *] #level1a = { full [ ir > iw ] } intsol(level1a) // [+ *] #level1b = { full [ ir < iw ] } intsol(level1b) end
The printout of the example session:
csh> lic -c Rapid Prototyping System for Code Generation > < example2 iterr = [ 1 <= ir <= N ir <= jr <= N ] N-jr >= 0 jr-ir >= 0 N-ir >= 0 -1+ir >= 0 iterw = [ 1 <= iw <= N iw <= jw <= N ] N-jw >= 0 jw-iw >= 0 N-iw >= 0 -1+iw >= 0 access = [ iw = jr ] iw-jr >= 0 -iw+jr >= 0 full = { iterr, iterw, access } N-jr >= 0 jr-ir >= 0 N-ir >= 0 -1+ir >= 0 N-jw >= 0 jw-iw >= 0 N-iw >= 0 -1+iw >= 0 -jr+iw >= 0 jr-iw >= 0 // [= =] #level3 = { full [ ir = iw jr = jw ] } intsol(level3) 1 // [= +] #level2a = { full [ ir = iw jr > jw ] } intsol(level2a) 0 // [= +] #level2b = { full [ ir = iw jr < jw ] } intsol(level2b) 1 // [+ *] #level1a = { full [ ir > iw ] } intsol(level1a) 0 // [+ *] #level1b = { full [ ir < iw ] } intsol(level1b) 1 end > quit done(0) csh>
Thus the set of direction vectors consist of [+ *]
, [= +]
and [= =]
.
Go to the first, previous, next, last section, table of contents.