You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Assume size is non-negative for increased efficiency (#50530)
I noticed
[here](#50467 (comment))
that `lastindex(x::Base.OneTo)` is not simply `x.stop`. This PR performs
that optimization and many more by assuming `size` always returns
positive numbers.
```
julia> @code_native lastindex(Base.OneTo(5)) # master
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 13, 0
.globl _julia_lastindex_81 ; -- Begin function julia_lastindex_81
.p2align 2
_julia_lastindex_81: ; @julia_lastindex_81
; ┌ @ abstractarray.jl:423 within `lastindex`
; %bb.0: ; %top
; │┌ @ abstractarray.jl:386 within `eachindex`
; ││┌ @ abstractarray.jl:134 within `axes1`
; │││┌ @ range.jl:708 within `axes`
; ││││┌ @ range.jl:471 within `oneto`
; │││││┌ @ range.jl:469 within `OneTo` @ range.jl:454
; ││││││┌ @ promotion.jl:532 within `max`
; │││││││┌ @ int.jl:83 within `<`
ldr x8, [x0]
; │││││││└
; │││││││┌ @ essentials.jl:642 within `ifelse`
cmp x8, #0
csel x0, x8, xzr, gt
; │└└└└└└└
ret
; └
; -- End function
.subsections_via_symbols
julia> @code_native lastindex(Base.OneTo(5)) # pr
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 13, 0
.globl _julia_lastindex_13253 ; -- Begin function julia_lastindex_13253
.p2align 2
_julia_lastindex_13253: ; @julia_lastindex_13253
; ┌ @ abstractarray.jl:423 within `lastindex`
; %bb.0: ; %top
ldr x0, [x0]
ret
; └
; -- End function
.subsections_via_symbols
```
Also removed `axes(r::AbstractRange) = (oneto(length(r)),)` (added in
#40382, @vtjnash) as redundant with the general `axes` method.
The obvious downside here is that if someone defines an object with
negative size, its axes will include Base.OneTo with negative stop. I
think that is acceptable, but if not, we can gate this optimization to a
set of known types (all AbstractArray types defined in Base should have
non-negative size)
0 commit comments