@@ -156,17 +156,17 @@ end
156
156
# # tc = terminatecondition(loop, us, n, loopsym, inclmask, 1)
157
157
# looprange = if loop.startexact
158
158
# if loop.stopexact
159
- # Expr(:(=), loopsym, Expr(:call, :(:), loop.starthint, loop.stophint))
159
+ # Expr(:(=), loopsym, Expr(:call, :(:), loop.starthint-1 , loop.stophint-1 ))
160
160
# else
161
161
# # expectation = expect(Expr(:call, :(>), loop.stopsym, loop.starthint-5))
162
- # Expr(:(=), loopsym, Expr(:call, :(:), loop.starthint, loop.stopsym))
162
+ # Expr(:(=), loopsym, Expr(:call, :(:), loop.starthint-1, Expr(:call, lv(:staticm1), loop.stopsym) ))
163
163
# end
164
164
# elseif loop.stopexact
165
165
# # expectation = expect(Expr(:call, :(>), loop.stophint+5, loop.startsym))
166
- # Expr(:(=), loopsym, Expr(:call, :(:), loop.startsym, loop.stophint))
166
+ # Expr(:(=), loopsym, Expr(:call, :(:), Expr(:call, lv(:staticm1), loop.startsym) , loop.stophint - 1 ))
167
167
# else
168
168
# # expectation = expect(Expr(:call, :(>), loop.stopsym, Expr(:call, lv(:vsub), loop.startsym, 5)))
169
- # Expr(:(=), loopsym, Expr(:call, :(:), loop.startsym, loop.stopsym))
169
+ # Expr(:(=), loopsym, Expr(:call, :(:), Expr(:call, lv(:staticm1), loop.startsym), Expr(:call, lv(:staticm1), loop.stopsym) ))
170
170
# end
171
171
# body = lower_block(ls, us, n, false, 1)
172
172
# push!(body.args, Expr(:loopinfo, (Symbol("llvm.loop.unroll.count"), 4)))
180
180
# q
181
181
# else
182
182
# # Expr(:block, assumption, expectation, q)
183
+ # q
183
184
# Expr(:block, loopiteratesatleastonce(loop), q)
184
185
# end
185
186
# end
187
+ # function lower_unroll_for_throughput(ls::LoopSet, us::UnrollSpecification, n::Int, loop::Loop, loopsym::Symbol)
188
+ # sl = startloop(loop, false, loopsym)
189
+ # UF = 4
190
+ # tcc = terminatecondition(loop, us, n, loopsym, false, 1)
191
+ # tcu = terminatecondition(loop, us, n, loopsym, false, UF)
192
+ # body = lower_block(ls, us, n, false, 1)
193
+ # # loopisstatic = isstaticloop(loop)
194
+ # unrolledlabel = gensym(:unrolled)
195
+ # cleanuplabel = gensym(:cleanup)
196
+ # gotounrolled = Expr(:macrocall, Symbol("@goto"), LineNumberNode(@__LINE__, Symbol(@__FILE__)), unrolledlabel)
197
+ # gotocleanup = Expr(:macrocall, Symbol("@goto"), LineNumberNode(@__LINE__, Symbol(@__FILE__)), cleanuplabel)
198
+ # branch = Expr(:if, tcu, gotounrolled, gotocleanup)
199
+ # unrolled = Expr(:block, Expr(:macrocall, Symbol("@label"), LineNumberNode(@__LINE__, Symbol(@__FILE__)), unrolledlabel))
200
+ # foreach(_ -> push!(unrolled.args, body), 1:UF)
201
+ # push!(unrolled.args, Expr(:if, tcu, gotounrolled, Expr(:if, tcc, gotocleanup)))
202
+ # cleanup = Expr(:block, Expr(:macrocall, Symbol("@label"), LineNumberNode(@__LINE__, Symbol(@__FILE__)), cleanuplabel), body, Expr(:if, tcc, gotocleanup))
203
+ # Expr(:let, sl, Expr(:block, branch, unrolled, cleanup))
204
+ # end
186
205
187
206
function assume (ex)
188
207
Expr (:call , Expr (:(.), Expr (:(.), :LoopVectorization , QuoteNode (:SIMDPirates )), QuoteNode (:assume )), ex)
@@ -207,24 +226,21 @@ function lower_no_unroll(ls::LoopSet, us::UnrollSpecification, n::Int, inclmask:
207
226
nisvectorized = isvectorized (us, n)
208
227
loopsym = names (ls)[n]
209
228
loop = getloop (ls, loopsym)
210
- # if VERSION ≥ v"1.4" && !nisvectorized && !inclmask && isone(n) && !ls.loadelimination[] && (us.u₁ > 1) && (usorig.u₁ == us.u₁) && (usorig.u₂ == us.u₂) && length(loop) > 7
229
+ # if !nisvectorized && !inclmask && isone(n) && !ls.loadelimination[] && (us.u₁ > 1) && (usorig.u₁ == us.u₁) && (usorig.u₂ == us.u₂) && length(loop) > 7
230
+ # # return lower_unroll_for_throughput(ls, us, n, loop, loopsym)
211
231
# return lower_llvm_unroll(ls, us, n, loop)
212
232
# end
213
233
sl = startloop (loop, nisvectorized, loopsym)
214
234
tc = terminatecondition (loop, us, n, loopsym, inclmask, 1 )
215
235
body = lower_block (ls, us, n, inclmask, 1 )
216
- q = if (usorig. u₁ == us. u₁) && (usorig. u₂ == us. u₂) && ! isstaticloop (loop) && ! inclmask# && !ls.loadelimination[]
217
- # Expr(:block, sl, assumeloopiteratesatleastonce(loop), Expr(:while, tc, body))
218
- if nisvectorized
219
- Expr (:block , loopiteratesatleastonce (loop, true ), Expr (:while , expect (tc), body))
220
- else
221
- # Expr(:block, sl, assume(tc), Expr(:while, tc, body))
222
- push! (body. args, Expr (:|| , expect (tc), Expr (:break )))
223
- # Expr(:block, sl, assume(tc), Expr(:while, true, body))
224
- Expr (:block , Expr (:while , true , body))
225
- end
236
+ q = if nisvectorized
237
+ # Expr(:block, loopiteratesatleastonce(loop, true), Expr(:while, expect(tc), body))
238
+ Expr (:block , Expr (:while , expect (tc), body))
226
239
else
227
- Expr (:block , Expr (:while , tc, body))
240
+ # Expr(:block, sl, assume(tc), Expr(:while, tc, body))
241
+ push! (body. args, Expr (:|| , expect (tc), Expr (:break )))
242
+ # Expr(:block, sl, assume(tc), Expr(:while, true, body))
243
+ Expr (:block , Expr (:while , true , body))
228
244
end
229
245
230
246
if nisvectorized
0 commit comments