Skip to content

Commit 525d649

Browse files
committed
Bug fixes
1 parent 278c566 commit 525d649

19 files changed

+154
-138
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ OffsetArrays = "1.4.1, 1.5"
2626
Requires = "1"
2727
SLEEFPirates = "0.6.7"
2828
Static = "0.2"
29-
ThreadingUtilities = "0.2.3"
29+
ThreadingUtilities = "0.3"
3030
UnPack = "1"
3131
VectorizationBase = "0.19"
3232
julia = "1.5"

src/broadcast.jl

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ end
156156
struct LowDimArray{D,T,N,A<:DenseArray{T,N}} <: DenseArray{T,N}
157157
data::A
158158
end
159-
Base.@propagate_inbounds Base.getindex(A::LowDimArray, i...) = getindex(A.data, i...)
159+
Base.@propagate_inbounds Base.getindex(A::LowDimArray, i::Vararg{Union{Integer,CartesianIndex},K}) where {K} = getindex(A.data, i...)
160160
@inline Base.size(A::LowDimArray) = Base.size(A.data)
161161
@inline Base.size(A::LowDimArray, i) = Base.size(A.data, i)
162162
@inline Base.strides(A::LowDimArray) = strides(A.data)
@@ -229,7 +229,10 @@ function LowDimArray{D}(data::A) where {D,T,N,A <: AbstractArray{T,N}}
229229
end
230230
function extract_all_1_array!(ls::LoopSet, bcname::Symbol, N::Int, elementbytes::Int)
231231
refextract = gensym!(ls, bcname)
232-
ref = Expr(:ref, bcname); foreach(_ -> push!(ref.args, :begin), 1:N)
232+
ref = Expr(:ref, bcname);
233+
for _ 1:N
234+
push!(ref.args, :begin)
235+
end
233236
pushprepreamble!(ls, Expr(:(=), refextract, ref))
234237
return add_constant!(ls, refextract, elementbytes) # or replace elementbytes with sizeof(T) ? u
235238
end
@@ -355,15 +358,15 @@ end
355358
# size of dest determines loops
356359
# function vmaterialize!(
357360
@generated function vmaterialize!(
358-
dest::AbstractArray{T,N}, bc::BC,
359-
::Val{Mod}, ::Val{UNROLL}, ::StaticInt{RS}, ::StaticInt{RC}, ::StaticInt{CLS}
360-
) where {T <: NativeTypes, N, BC <: Union{Broadcasted,Product}, Mod, UNROLL, RS, RC, CLS}
361+
dest::AbstractArray{T,N}, bc::BC, ::Val{Mod}, ::Val{UNROLL}
362+
) where {T <: NativeTypes, N, BC <: Union{Broadcasted,Product}, Mod, UNROLL}
361363
# 2+1
362364
# we have an N dimensional loop.
363365
# need to construct the LoopSet
364366
# @show typeof(dest)
365367
ls = LoopSet(Mod)
366-
set_hw!(ls, RS, RC, CLS)
368+
inline, u₁, u₂, W, rs, rc, cls, l1, l2, l3, threads = UNROLL
369+
set_hw!(ls, rs, rc, cls, l1, l2, l3)
367370
loopsyms = [gensym!(ls, "n") for n 1:N]
368371
ls.isbroadcast[] = true
369372
add_broadcast_loops!(ls, loopsyms, :dest)
@@ -372,8 +375,9 @@ end
372375
add_simple_store!(ls, :dest, ArrayReference(:dest, loopsyms), elementbytes)
373376
resize!(ls.loop_order, num_loops(ls)) # num_loops may be greater than N, eg Product
374377
# return ls
375-
inline, u₁, u₂, threads = UNROLL
376-
q = lower(ls, u₁ % Int, u₂ % Int, inline % Int)
378+
# @show u₁, u₂, inline
379+
q = iszero(u₁) ? lower_and_split_loops(ls, inline % Int) : lower(ls, u₁ % Int, u₂ % Int, inline % Int)
380+
# q = lower(ls, u₁ % Int, u₂ % Int, inline % Int)
377381
push!(q.args, :dest)
378382
# @show q
379383
# q
@@ -388,13 +392,13 @@ end
388392
# ls
389393
end
390394
@generated function vmaterialize!(
391-
dest′::Union{Adjoint{T,A},Transpose{T,A}}, bc::BC,
392-
::Val{Mod}, ::Val{UNROLL}, ::StaticInt{RS}, ::StaticInt{RC}, ::StaticInt{CLS}
393-
) where {T <: NativeTypes, N, A <: AbstractArray{T,N}, BC <: Union{Broadcasted,Product}, Mod, UNROLL, RS, RC, CLS}
395+
dest′::Union{Adjoint{T,A},Transpose{T,A}}, bc::BC, ::Val{Mod}, ::Val{UNROLL}
396+
) where {T <: NativeTypes, N, A <: AbstractArray{T,N}, BC <: Union{Broadcasted,Product}, Mod, UNROLL}
394397
# we have an N dimensional loop.
395398
# need to construct the LoopSet
396399
ls = LoopSet(Mod)
397-
set_hw!(ls, RS, RC, CLS)
400+
inline, u₁, u₂, W, rs, rc, cls, l1, l2, l3, threads = UNROLL
401+
set_hw!(ls, rs, rc, cls, l1, l2, l3)
398402
loopsyms = [gensym!(ls, "n") for n 1:N]
399403
ls.isbroadcast[] = true
400404
pushprepreamble!(ls, Expr(:(=), :dest, Expr(:call, :parent, :dest′)))
@@ -403,8 +407,8 @@ end
403407
add_broadcast!(ls, :dest, :bc, loopsyms, BC, elementbytes)
404408
add_simple_store!(ls, :dest, ArrayReference(:dest, reverse(loopsyms)), elementbytes)
405409
resize!(ls.loop_order, num_loops(ls)) # num_loops may be greater than N, eg Product
406-
inline, u₁, u₂, threads = UNROLL
407-
q = lower(ls, u₁ % Int, u₂ % Int, inline % Int)
410+
q = iszero(u₁) ? lower_and_split_loops(ls, inline % Int) : lower(ls, u₁ % Int, u₂ % Int, inline % Int)
411+
# q = lower(ls, u₁ % Int, u₂ % Int, inline % Int)
408412
push!(q.args, :dest′)
409413
q = Expr(
410414
:block,
@@ -417,10 +421,9 @@ end
417421
end
418422
# these are marked `@inline` so the `@avx` itself can choose whether or not to inline.
419423
@generated function vmaterialize!(
420-
dest::AbstractArray{T,N}, bc::Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}},
421-
::Val{Mod}, ::Val{UNROLL}, ::StaticInt{RS}, ::StaticInt{RC}, ::StaticInt{CLS}
422-
) where {T <: NativeTypes, N, T2 <: Number, Mod, UNROLL,RS,RC,CLS}
423-
inline, u₁, u₂, threads = UNROLL
424+
dest::AbstractArray{T,N}, bc::Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}}, ::Val{Mod}, ::Val{UNROLL}
425+
) where {T <: NativeTypes, N, T2 <: Number, Mod, UNROLL}
426+
inline, u₁, u₂, W, rs, rc, cls, l1, l2, l3, threads = UNROLL
424427
quote
425428
$(Expr(:meta,:inline))
426429
arg = T(first(bc.args))
@@ -431,10 +434,9 @@ end
431434
end
432435
end
433436
@generated function vmaterialize!(
434-
dest′::Union{Adjoint{T,A},Transpose{T,A}}, bc::Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}},
435-
::Val{Mod}, ::Val{UNROLL}, ::StaticInt{RS}, ::StaticInt{RC}, ::StaticInt{CLS}
436-
) where {T <: NativeTypes, N, A <: AbstractArray{T,N}, T2 <: Number, Mod, UNROLL,RS,RC,CLS}
437-
inline, u₁, u₂, threads = UNROLL
437+
dest′::Union{Adjoint{T,A},Transpose{T,A}}, bc::Broadcasted{Base.Broadcast.DefaultArrayStyle{0},Nothing,typeof(identity),Tuple{T2}}, ::Val{Mod}, ::Val{UNROLL}
438+
) where {T <: NativeTypes, N, A <: AbstractArray{T,N}, T2 <: Number, Mod, UNROLL}
439+
inline, u₁, u₂, W, rs, rc, cls, l1, l2, l3, threads = UNROLL
438440
quote
439441
$(Expr(:meta,:inline))
440442
arg = T(first(bc.args))
@@ -447,10 +449,10 @@ end
447449
end
448450

449451
@inline function vmaterialize(
450-
bc::Broadcasted, ::Val{Mod}, ::Val{UNROLL}, ::StaticInt{RS}, ::StaticInt{RC}, ::StaticInt{CLS}
451-
) where {Mod,UNROLL,RS,RC,CLS}
452+
bc::Broadcasted, ::Val{Mod}, ::Val{UNROLL}
453+
) where {Mod,UNROLL}
452454
ElType = Base.Broadcast.combine_eltypes(bc.f, bc.args)
453-
vmaterialize!(similar(bc, ElType), bc, Val{Mod}(), StaticInt{UNROLL}(), StaticInt{RS}(), StaticInt{RC}(), StaticInt{CLS}())
455+
vmaterialize!(similar(bc, ElType), bc, Val{Mod}(), Val{UNROLL}())
454456
end
455457

456458
vmaterialize!(dest, bc, ::Val, ::Val, ::StaticInt, ::StaticInt, ::StaticInt) = Base.Broadcast.materialize!(dest, bc)

src/codegen/loopstartstopmanager.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,14 @@ function use_loop_induct_var!(ls::LoopSet, q::Expr, ar::ArrayReferenceMeta, alla
114114
# ((ls.align_loops[] > 0) && (first(names(ls)) == ind))
115115

116116
# Not doing normal offset indexing
117-
uliv[i] = -findfirst(isequal(ind), looporder)::Int
117+
uliv[i] = -findfirst(Base.Fix2(===,ind), looporder)::Int
118118
# push!(gespinds.args, Expr(:call, lv(:Zero)))
119119
# push!(gespinds.args, staticexpr(1))
120120
push!(gespinds.args, staticexpr(convert(Int, strides[i])))
121121

122122
push!(offsetprecalc_descript.args, 0) # not doing offset indexing, so push 0
123123
else
124-
uliv[i] = findfirst(isequal(ind), looporder)::Int
124+
uliv[i] = findfirst(Base.Fix2(===,ind), looporder)::Int
125125
loop = getloop(ls, ind)
126126
if isknown(first(loop))
127127
push!(gespinds.args, staticexpr(gethint(first(loop))))

src/codegen/lower_compute.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,7 @@ function getu₁forreduct(ls::LoopSet, op::Operation, u₁::Int)
303303
# if it is, then op's `u₁` will be the current `u₁`
304304
# if it is not, then the opp is initialized once per full u₁
305305
while true
306-
opname = name(op)
307-
selfparentid = findfirst(opp -> name(opp) === opname, parents(op))
306+
selfparentid = findfirst(Base.Fix2(===,name(op)) name, parents(op))
308307
selfparentid === nothing && return u₁
309308
op = parents(op)[selfparentid]
310309
isreduction(op) || break
@@ -383,7 +382,7 @@ function lower_compute!(
383382
if Base.libllvm_version < v"11.0.0" && (suffix -1) && isreduct# && (iszero(suffix) || (ls.unrollspecification[].u₂ - 1 == suffix))
384383
# if (length(reduceddependencies(op)) > 0) | (length(reducedchildren(op)) > 0)# && (iszero(suffix) || (ls.unrollspecification[].u₂ - 1 == suffix))
385384
# instrfid = findfirst(isequal(instr.instr), (:vfmadd, :vfnmadd, :vfmsub, :vfnmsub))
386-
instrfid = findfirst(isequal(instr.instr), (:vfmadd_fast, :vfnmadd_fast, :vfmsub_fast, :vfnmsub_fast))
385+
instrfid = findfirst(Base.Fix2(===,instr.instr), (:vfmadd_fast, :vfnmadd_fast, :vfmsub_fast, :vfnmsub_fast))
387386
# instrfid = findfirst(isequal(instr.instr), (:vfnmadd_fast, :vfmsub_fast, :vfnmsub_fast))
388387
# @show isreduct, instrfid, instr.instr sub_fmas(ls, op, ua)
389388
# want to instcombine when parent load's deps are superset

src/codegen/lower_load.jl

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ function lower_load_no_optranslation!(
117117
u = ifelse(opu₁, u₁, 1)
118118
mvar = Symbol(variable_name(op, Core.ifelse(isu₂unrolled(op), suffix,-1)), '_', u)
119119
falseexpr = Expr(:call, lv(:False)); rs = staticexpr(reg_size(ls))
120-
121120
if all(op.ref.loopedindex)
122121
inds = unrolledindex(op, td, mask, inds_calc_by_ptr_offset)
123122
loadexpr = Expr(:call, lv(:_vload), vptr(op), inds)
@@ -207,39 +206,56 @@ function lower_load_for_optranslation!(
207206
step₂ = gethint(step(u₂loop))
208207

209208
# abs of steps are equal
210-
#
211209
equal_steps = (step₁ == step₂) (posindicator 0x03)
212-
_td = UnrollArgs(u₁loop, u₂loop, vloop, total_unroll, u₂max, Core.ifelse(equal_steps, 0, u₂max - 1))
210+
# @show step₁, step₂, posindicator, equal_steps
211+
# _td = UnrollArgs(u₁loop, u₂loop, vloop, total_unroll, u₂max, Core.ifelse(equal_steps, 0, u₂max - 1))
212+
_td = UnrollArgs(u₁loop, u₂loop, vloop, u₁, u₂max, Core.ifelse(equal_steps, 0, u₂max - 1))
213213
gespinds = mem_offset(op, _td, inds_by_ptroff, false)
214214
ptr = vptr(op)
215215
gptr = Symbol(ptr, "##GESPED##")
216216
for i eachindex(gespinds.args)
217217
if i == translationind
218218
gespinds.args[i] = Expr(:call, lv(Core.ifelse(equal_steps, :firstunroll, :lastunroll)), gespinds.args[i])
219-
else
220-
gespinds.args[i] = Expr(:call, lv(:data), gespinds.args[i])
219+
# else
220+
# gespinds.args[i] = Expr(:call, lv(:data), gespinds.args[i])
221221
end
222222
end
223223
push!(q.args, Expr(:(=), gptr, Expr(:call, lv(:gesp), ptr, gespinds)))
224224

225225
fill!(inds_by_ptroff, true)
226226

227227
@unpack ref, loopedindex = mref
228-
indices = getindicesonly(ref)
229-
old_translation_index = indices[translationind]
230-
indices[translationind] = u₁loop.itersymbol
228+
indices = copy(getindices(ref))
229+
# old_translation_index = indices[translationind]
230+
# indices[translationind] = u₁loop.itersymbol
231+
# @show indices, translationind, vloop
231232
# getindicesonly returns a view of `getindices`
232-
dummyref = ArrayReference(ref.array, getindices(ref), zero(getoffsets(ref)), getstrides(ref))
233-
loopedindex[translationind] = true
234-
dummymref = ArrayReferenceMeta(dummyref, loopedindex, gptr)
235-
233+
dummyref = ArrayReference(ref.array, indices, zero(getoffsets(ref)), getstrides(ref))
234+
# loopedindex[translationind] = true
235+
dummymref = ArrayReferenceMeta(dummyref, fill!(similar(loopedindex), true), gptr)
236+
indonly = getindicesonly(dummyref)
237+
for i eachindex(indonly)
238+
if i == translationind
239+
indonly[i] = u₁loop.itersymbol
240+
elseif !loopedindex[i]
241+
ind = indonly[i]
242+
for indop operations(ls)
243+
if isvectorized(indop) & (name(indop) === ind)
244+
indonly[i] = vloop.itersymbol
245+
break
246+
end
247+
end
248+
end
249+
end
250+
# @show indices
236251
_td = UnrollArgs(u₁loop, u₂loop, vloop, total_unroll, u₂max, -1)
237252
op.ref = dummymref
253+
# @show isu₁unrolled(op), isu₂unrolled(op)
238254
_lower_load!(q, ls, op, _td, mask)
239255
# set old values
240256
op.ref = mref
241-
loopedindex[translationind] = false
242-
indices[translationind] = old_translation_index
257+
# loopedindex[translationind] = false
258+
# indices[translationind] = old_translation_index
243259

244260
shouldbroadcast = (!isvectorized(op)) && any(isvectorized, children(op))
245261

src/codegen/lower_memory_common.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ function mem_offset(op::Operation, td::UnrollArgs, inds_calc_by_ptr_offset::Vect
145145
# addoffset!(ret, newname, stride, offset, _mmi)
146146
_mmi = indvectorized && parent !== op && (!isvectorized(parent))
147147
@assert !_mmi "Please file an issue with an example of how you got this."
148-
addoffset!(ret, newname, 1, offset, false)
148+
addoffset!(ret, 0, newname, offset, false)
149149
end
150150
end
151151
ret

src/codegen/lowering.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,9 @@ function lower_no_unroll(ls::LoopSet, us::UnrollSpecification, n::Int, inclmask:
184184
# elseif nisvectorized
185185
if loopisstatic && (isone(length(loop) ÷ W) || (n 3 && length(loop) 8W && allinteriorunrolled(ls, us, n)))
186186
q = Expr(:block)
187-
foreach(_ -> push!(q.args, body), 1:(length(loop) ÷ W))
187+
for _ 1:(length(loop) ÷ W)
188+
push!(q.args, body)
189+
end
188190
elseif nisvectorized
189191
# Expr(:block, loopiteratesatleastonce(loop, true), Expr(:while, expect(tc), body))
190192
# q = Expr(:block, Expr(maxiters == 1 ? :if : :while, tc, body))
@@ -253,7 +255,9 @@ function lower_unrolled_dynamic(ls::LoopSet, us::UnrollSpecification, n::Int, in
253255
iters = length(loop) ÷ UFW
254256
if (iters 1) || (iters*UF 16 && allinteriorunrolled(ls, us, n))# Let's set a limit on total unrolling
255257
q = Expr(:block)
256-
foreach(_ -> push!(q.args, body), 1:iters)
258+
for _ 1:iters
259+
push!(q.args, body)
260+
end
257261
else
258262
q = Expr(:while, tc, body)
259263
end

src/codegen/split_loops.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ function split_loopset(ls::LoopSet, ids)
6969
# it shouldn't.
7070
# Current behavior is incorrect when VECWIDTH chosen does actually differ between
7171
# split loops and the loops are statically sized, because code gen will then assume it is correct...
72-
set_hw!(ls_new, reg_size(ls), reg_count(ls), cache_lnsze(ls))
72+
l1, l2, l3 = cache_sze(ls)
73+
set_hw!(ls_new, reg_size(ls), reg_count(ls), cache_lnsze(ls), l1, l2, l3)
7374
ls_new.vector_width[] = ls.vector_width[]
7475
fill_offset_memop_collection!(ls)
7576
ls_new

src/condense_loopset.jl

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ array(ar::ArrayRefStruct{a,p}) where {a,p} = a
2121
ptr(ar::ArrayRefStruct{a,p}) where {a,p} = p
2222

2323
function findindoradd!(v::Vector{T}, s::T) where {T}
24-
ind = findfirst(sᵢ -> sᵢ == s, v)
24+
ind = findfirst(==(s), v)
2525
ind === nothing || return ind
2626
push!(v, s)
2727
length(v)
@@ -144,7 +144,9 @@ end
144144

145145
function loop_boundaries(ls::LoopSet)
146146
lbd = Expr(:tuple)
147-
foreach(loop -> loop_boundary!(lbd, loop), ls.loops)
147+
for loop ls.loops
148+
loop_boundary!(lbd, loop)
149+
end
148150
lbd
149151
end
150152

@@ -225,7 +227,6 @@ end
225227
val(x) = Expr(:call, Expr(:curly, :Val, x))
226228

227229
function add_grouped_strided_pointer!(extra_args::Expr, ls::LoopSet)
228-
# foreach(ref -> push!(extra_args.args, vptr(ref)), ls.refs_aliasing_syms)
229230
gsp = Expr(:call, lv(:grouped_strided_pointer))
230231
tgarrays = Expr(:tuple)
231232
i = 0
@@ -247,7 +248,7 @@ function add_grouped_strided_pointer!(extra_args::Expr, ls::LoopSet)
247248
for (vptrs,dims) ls.equalarraydims
248249
t = Expr(:tuple)
249250
for (vp,d) zip(vptrs,dims)
250-
_id = findfirst(r -> vptr(r) === vp, ls.refs_aliasing_syms)
251+
_id = findfirst(Base.Fix2(===,vp) vptr, ls.refs_aliasing_syms)
251252
_id === nothing && continue
252253
push!(t.args, Expr(:tuple, _id, d))
253254
end
@@ -258,13 +259,13 @@ function add_grouped_strided_pointer!(extra_args::Expr, ls::LoopSet)
258259
nothing
259260
end
260261

261-
first_cache() = ifelse(gt(num_cache_levels(), StaticInt{2}()), StaticInt{2}(), StaticInt{1}())
262-
function _first_cache_size(::StaticInt{FCS}) where {FCS}
263-
L1inclusive = StaticInt{FCS}() - VectorizationBase.cache_size(One())
264-
ifelse(eq(first_cache(), StaticInt(2)) & VectorizationBase.cache_inclusive(StaticInt(2)), L1inclusive, StaticInt{FCS}())
265-
end
266-
_first_cache_size(::Nothing) = StaticInt(262144)
267-
first_cache_size() = _first_cache_size(cache_size(first_cache()))
262+
# first_cache() = ifelse(gt(num_cache_levels(), StaticInt{2}()), StaticInt{2}(), StaticInt{1}())
263+
# function _first_cache_size(::StaticInt{FCS}) where {FCS}
264+
# L1inclusive = StaticInt{FCS}() - VectorizationBase.cache_size(One())
265+
# ifelse(eq(first_cache(), StaticInt(2)) & VectorizationBase.cache_inclusive(StaticInt(2)), L1inclusive, StaticInt{FCS}())
266+
# end
267+
# _first_cache_size(::Nothing) = StaticInt(262144)
268+
# first_cache_size() = _first_cache_size(cache_size(first_cache()))
268269

269270
@generated function _avx_config_val(
270271
::Val{inline}, ::Val{u₁}, ::Val{u₂}, ::Val{thread}, ::StaticInt{W},
@@ -294,7 +295,9 @@ function generate_call(ls::LoopSet, (inline,u₁,u₂)::Tuple{Bool,Int8,Int8}, t
294295
end
295296
arraysymbolinds = Symbol[]
296297
arrayref_descriptions = Expr(:tuple)
297-
foreach(ref -> push!(arrayref_descriptions.args, ArrayRefStruct(ls, ref, arraysymbolinds, ids)), ls.refs_aliasing_syms)
298+
for ref ls.refs_aliasing_syms
299+
push!(arrayref_descriptions.args, ArrayRefStruct(ls, ref, arraysymbolinds, ids))
300+
end
298301
argmeta = argmeta_and_consts_description(ls, arraysymbolinds)
299302
loop_bounds = loop_boundaries(ls)
300303
loop_syms = tuple_expr(QuoteNode, ls.loopsymbols)
@@ -307,8 +310,9 @@ function generate_call(ls::LoopSet, (inline,u₁,u₂)::Tuple{Bool,Int8,Int8}, t
307310
vargs_as_tuple || push!(q.args, lbarg)
308311
extra_args = vargs_as_tuple ? Expr(:tuple) : q
309312
add_grouped_strided_pointer!(extra_args, ls)
310-
311-
foreach(is -> push!(extra_args.args, last(is)), ls.preamble_symsym)
313+
for is ls.preamble_symsym
314+
push!(extra_args.args, last(is))
315+
end
312316
append!(extra_args.args, arraysymbolinds)
313317
add_reassigned_syms!(extra_args, ls)
314318
add_external_functions!(extra_args, ls)

0 commit comments

Comments
 (0)