@@ -94,42 +94,47 @@ subexpr(ex::Number, incr::Number) = ex - incr
94
94
subexpr (ex, incr:: Number ) = addexpr (ex, - incr)
95
95
96
96
staticmulincr (ptr, incr) = Expr (:call , lv (:staticmul ), Expr (:call , :eltype , ptr), incr)
97
- callpointer (sym) = Expr (:call , :pointer , sym)
97
+ callpointerforcomparison (sym) = Expr (:call , lv ( :pointerforcomparison ) , sym)
98
98
function vec_looprange (loopmax, UF:: Int , mangledname:: Symbol , ptrcomp:: Bool )
99
- incr = if isone (UF)
100
- Expr ( :call , lv ( :valsub ), VECTORWIDTHSYMBOL, 1 )
99
+ if ptrcomp
100
+ vec_looprange (loopmax, UF, callpointerforcomparison (mangledname ), staticmulincr (mangledname, VECTORWIDTHSYMBOL) )
101
101
else
102
- Expr ( :call , lv ( :valmulsub ), VECTORWIDTHSYMBOL, UF, 1 )
102
+ vec_looprange (loopmax, UF, mangledname, VECTORWIDTHSYMBOL )
103
103
end
104
- incr = ptrcomp ? staticmulincr (mangledname, incr) : incr
105
- compexpr = subexpr (loopmax, incr )
106
- if ptrcomp
107
- Expr (:call , : < , callpointer (mangledname), compexpr )
104
+ end
105
+ function vec_looprange (loopmax, UF :: Int , mangledname, W )
106
+ incr = if isone (UF)
107
+ Expr (:call , lv ( :valsub ), W, 1 )
108
108
else
109
- Expr (:call , : < , mangledname, compexpr )
109
+ Expr (:call , lv ( :valmulsub ), W, UF, 1 )
110
110
end
111
+ compexpr = subexpr (loopmax, incr)
112
+ Expr (:call , :< , mangledname, compexpr)
111
113
end
112
114
113
- function looprange (stopcon, incr:: Int , mangledname:: Symbol , ptrcomp:: Bool )
114
- incr = 1 - incr
115
+ # function looprange(stopcon, incr::Int, mangledname::Symbol, ptrcomp::Bool, verbose)
116
+ # if ptrcomp
117
+ # looprange(stopcon, Expr(:call, lv(:vsub), staticmulincr(mangledname, incr), 1), callpointer(mangledname), verbose)
118
+ # else
119
+ # looprange(stopcon, incr - 1, mangledname)
120
+ # end
121
+ # end
122
+ # function looprange(stopcon, incr, mangledname, verbose)
123
+ # if verbose
124
+ # Expr(:call, :<, :(@show $mangledname), :(@show $(subexpr(stopcon, incr))))
125
+ # else
126
+ # Expr(:call, :<, mangledname, subexpr(stopcon, incr))
127
+ # end
128
+ # end
129
+ function looprange (stopcon, incr:: Int , mangledname)
115
130
if iszero (incr)
116
- if ptrcomp
117
- Expr (:call , :< , callpointer (mangledname), stopcon)
118
- else
119
- Expr (:call , :< , mangledname, stopcon)
120
- end
121
- elseif ptrcomp
122
- Expr (:call , :< , callpointer (mangledname), addexpr (stopcon, staticmulincr (mangledname, incr)))
131
+ Expr (:call , :≤ , mangledname, stopcon)
123
132
else
124
- if isone (incr)
125
- Expr (:call , :≤ , mangledname, stopcon)
126
- else
127
- Expr (:call , :< , mangledname, addexpr (stopcon, incr))
128
- end
133
+ Expr (:call , :≤ , mangledname, subexpr (stopcon, incr))
129
134
end
130
135
end
131
- function looprange (loop:: Loop , incr:: Int , mangledname:: Symbol )
132
- loop. stopexact ? looprange (loop. stophint, incr, mangledname, false ) : looprange (loop. stopsym, incr, mangledname, false )
136
+ function looprange (loop:: Loop , incr:: Int , mangledname)
137
+ loop. stopexact ? looprange (loop. stophint, incr, mangledname) : looprange (loop. stopsym, incr, mangledname)
133
138
end
134
139
function terminatecondition (
135
140
loop:: Loop , us:: UnrollSpecification , n:: Int , mangledname:: Symbol , inclmask:: Bool , UF:: Int = unrollfactor (us, n)
@@ -168,6 +173,23 @@ function incrementloopcounter!(q, us::UnrollSpecification, n::Int, UF::Int = unr
168
173
push! (q. args, UF)
169
174
end
170
175
end
176
+ function looplengthexpr (loop:: Loop )
177
+ if loop. stopexact
178
+ if loop. startexact
179
+ length (loop)
180
+ else
181
+ Expr (:call , lv (:vsub ), loop. stophint + 1 , loop. startsym)
182
+ end
183
+ elseif loop. startexact
184
+ if isone (loop. starthint)
185
+ loop. stopsym
186
+ else
187
+ Expr (:call , lv (:vsub ), loop. stopsym, loop. starthint - 1 )
188
+ end
189
+ else
190
+ Expr (:call , lv (:vsub ), loop. stopsym, Expr (:call , lv (:staticm1 ), loop. startsym))
191
+ end
192
+ end
171
193
172
194
# load/compute/store × isunrolled × istiled × pre/post loop × Loop number
173
195
struct LoopOrder <: AbstractArray{Vector{Operation},5}
@@ -199,6 +221,11 @@ Base.@propagate_inbounds Base.getindex(lo::LoopOrder, i...) = lo.oporder[LinearI
199
221
200
222
@enum NumberType:: Int8 HardInt HardFloat IntOrFloat INVALID
201
223
224
+ struct LoopStartStopManager
225
+ terminators:: Vector{Int}
226
+ incrementedptrs:: Vector{Vector{ArrayReferenceMeta}}
227
+ uniquearrayrefs:: Vector{ArrayReferenceMeta}
228
+ end
202
229
# Must make it easy to iterate
203
230
# outer_reductions is a vector of indices (within operation vectors) of the reduction operation, eg the vmuladd op in a dot product
204
231
# O(N) search is faster at small sizes
@@ -228,10 +255,12 @@ struct LoopSet
228
255
place_after_loop:: Vector{Bool}
229
256
unrollspecification:: Base.RefValue{UnrollSpecification}
230
257
loadelimination:: Base.RefValue{Bool}
258
+ lssm:: Base.RefValue{LoopStartStopManager}
231
259
mod:: Symbol
232
260
end
233
261
234
262
263
+
235
264
function cost_vec_buf (ls:: LoopSet )
236
265
cv = @view (ls. cost_vec[:,2 ])
237
266
@inbounds for i ∈ 1 : 4
@@ -312,7 +341,8 @@ function LoopSet(mod::Symbol)
312
341
ArrayReferenceMeta[],
313
342
Matrix {Float64} (undef, 4 , 2 ),
314
343
Matrix {Float64} (undef, 4 , 2 ),
315
- Bool[], Bool[], Ref {UnrollSpecification} (), Ref (false ), mod
344
+ Bool[], Bool[], Ref {UnrollSpecification} (),
345
+ Ref (false ), Ref {LoopStartStopManager} (), mod
316
346
)
317
347
end
318
348
0 commit comments