@@ -145,14 +145,46 @@ function lower_block(
145
145
push! (blockq. args, incrementloopcounter (us, n, loopsym, UF))
146
146
blockq
147
147
end
148
+
149
+ function lower_llvm_unroll (ls:: LoopSet , us:: UnrollSpecification , n:: Int , loop:: Loop )
150
+ loopsym = names (ls)[n]
151
+ loop = getloop (ls, loopsym)
152
+ # loopsym = mangletiledsym(loopsym, us, n)
153
+ nisvectorized = false # isvectorized(us, n)
154
+ sl = startloop (loop, nisvectorized, loopsym)
155
+ # tc = terminatecondition(loop, us, n, loopsym, inclmask, 1)
156
+ looprange = if loop. startexact
157
+ if loop. stopexact
158
+ Expr (:(= ), loopsym, Expr (:call , :(:), loop. starthint, loop. stophint))
159
+ else
160
+ Expr (:(= ), loopsym, Expr (:call , :(:), loop. starthint, loop. stopsym))
161
+ end
162
+ elseif loop. stopexact
163
+ Expr (:(= ), loopsym, Expr (:call , :(:), loop. startsym, loop. stophint))
164
+ else
165
+ Expr (:(= ), loopsym, Expr (:call , :(:), loop. startsym, loop. stopsym))
166
+ end
167
+ body = lower_block (ls, us, n, false , 1 )
168
+ push! (body. args, Expr (:loopinfo , (Symbol (" llvm.loop.unroll.count" ), 4 )))
169
+ # q = Expr( :block, sl, Expr(:while, tc, body))
170
+ q = Expr (:for , looprange, body)
171
+ # if nisvectorized
172
+ # tc = terminatecondition(loop, us, n, loopsym, true, 1)
173
+ # body = lower_block(ls, us, n, true, 1)
174
+ # push!(q.args, Expr(:if, tc, body))
175
+ # end
176
+ q
177
+ end
148
178
# tiledsym(s::Symbol) = Symbol("##outer##", s, "##outer##")
149
179
# mangletiledsym(s::Symbol, us::UnrollSpecification, n::Int) = isunrolled2(us, n) ? tiledsym(s) : s
150
180
function lower_no_unroll (ls:: LoopSet , us:: UnrollSpecification , n:: Int , inclmask:: Bool )
181
+ usorig = ls. unrollspecification[]
182
+ nisvectorized = isvectorized (us, n)
151
183
loopsym = names (ls)[n]
152
184
loop = getloop (ls, loopsym)
153
- # loopsym = mangletiledsym(loopsym, us, n)
154
- nisvectorized = isvectorized ( us, n)
155
-
185
+ 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
186
+ return lower_llvm_unroll (ls, us, n, loop )
187
+ end
156
188
sl = startloop (loop, nisvectorized, loopsym)
157
189
tc = terminatecondition (loop, us, n, loopsym, inclmask, 1 )
158
190
body = lower_block (ls, us, n, inclmask, 1 )
@@ -171,7 +203,6 @@ function lower_unrolled_dynamic(ls::LoopSet, us::UnrollSpecification, n::Int, in
171
203
order = names (ls)
172
204
loopsym = order[n]
173
205
loop = getloop (ls, loopsym)
174
- # loopsym = mangletiledsym(loopsym, us, n)
175
206
vectorized = order[vectorizedloopnum]
176
207
nisunrolled = isunrolled1 (us, n)
177
208
nisvectorized = isvectorized (us, n)
0 commit comments