Skip to content

Commit

Permalink
Avoid introducing local variable (and GC frame store) when the inline…
Browse files Browse the repository at this point in the history
…r is

confused about the return point.
  • Loading branch information
yuyichao committed Oct 6, 2015
1 parent b5bebf2 commit ec3d2f1
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion base/array.jl
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,11 @@ end
setindex!{T}(A::Array{T}, x, i1::Real) = arrayset(A, convert(T,x)::T, to_index(i1))
setindex!{T}(A::Array{T}, x, i1::Real, i2::Real, I::Real...) = arrayset(A, convert(T,x)::T, to_index(i1), to_index(i2), to_indexes(I...)...)

unsafe_setindex!{T}(A::Array{T}, x, i1::Real, I::Real...) = @inbounds return arrayset(A, convert(T,x)::T, to_index(i1), to_indexes(I...)...)
# Type inference is confused by `@inbounds return ...` and introduces a
# local variable for the Array which disables SIMD since we don't have a
# TBAA for the GC frame yet.
unsafe_setindex!{T}(A::Array{T}, x, i1::Real, I::Real...) =
(@inbounds arrayset(A, convert(T,x)::T, to_index(i1), to_indexes(I...)...); A)

# These are redundant with the abstract fallbacks but needed for bootstrap
function setindex!(A::Array, x, I::AbstractVector{Int})
Expand Down

0 comments on commit ec3d2f1

Please sign in to comment.