Assume size is non-negative for increased efficiency (#50530)
I noticed
[here](https://github.com/JuliaLang/julia/pull/50467#discussion_r1260299610)
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)