diff --git a/src/stridedview.jl b/src/stridedview.jl index b7e93c0..906b041 100644 --- a/src/stridedview.jl +++ b/src/stridedview.jl @@ -286,3 +286,9 @@ function Base.elsize(::Type{<:StridedView{T, N, A}}) where {T, N, A} return Base.elsize(A) end Base.dataids(a::StridedView) = Base.dataids(a.parent) + +# The parents may have a more precise alias check than their shared-storage dataids. +# Disjoint parents imply disjoint views; overlapping parents remain conservative. +function Base.mightalias(a::StridedView, b::StridedView) + return !isempty(a) && !isempty(b) && Base.mightalias(parent(a), parent(b)) +end diff --git a/test/runtests.jl b/test/runtests.jl index 57c32a2..1f7aa8b 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -292,6 +292,20 @@ if !is_buildkite end @testset "JLArrays with StridedView" begin + @testset "alias detection" begin + buffer = JLArray{Float32}(undef, 16) + left = view(buffer, 1:8) + right = view(buffer, 9:16) + overlap = view(buffer, 5:12) + # Preserve the parents' alias check, including byte-range specializations. + for other in (left, right, overlap) + @test Base.mightalias(StridedView(left), StridedView(other)) == + Base.mightalias(left, other) + end + empty = sview(StridedView(left), 3:2) + @test !Base.mightalias(empty, StridedView(left)) + @test !Base.mightalias(StridedView(left), empty) + end @testset for T in (Float64, ComplexF64) Araw = randn(T, 10, 10, 10, 10) A = JLArray(Araw)