From 009936ebba55c3b96fc24bfd07883bd516fc0c09 Mon Sep 17 00:00:00 2001 From: nhz2 Date: Mon, 18 May 2026 14:55:39 -0400 Subject: [PATCH 1/3] Add support for `try_strides` `can_ptr_load` and `can_ptr_store`. --- src/adjtrans.jl | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/adjtrans.jl b/src/adjtrans.jl index 0501242c..ce06ed1d 100644 --- a/src/adjtrans.jl +++ b/src/adjtrans.jl @@ -373,6 +373,32 @@ Base.strides(A::Transpose{<:Any, <:AbstractVector}) = (stride(A.parent, 2), stri # For matrices it's slightly faster to use reverse and avoid calling stride twice Base.strides(A::Adjoint{<:Real, <:AbstractMatrix}) = reverse(strides(A.parent)) Base.strides(A::Transpose{<:Any, <:AbstractMatrix}) = reverse(strides(A.parent)) +@static if isdefined(Base, :try_strides) && isdefined(Base, :can_ptr_load) && isdefined(Base, :can_ptr_store) + function Base.try_strides(A::Adjoint{<:Real, <:AbstractVector}) + st = Base.try_strides(A.parent) + isnothing(st) && return nothing + (st[1]*Int(length(A.parent)), st[1]) + end + function Base.try_strides(A::Transpose{<:Number, <:AbstractVector}) + st = Base.try_strides(A.parent) + isnothing(st) && return nothing + (st[1]*Int(length(A.parent)), st[1]) + end + function Base.try_strides(A::Adjoint{<:Real, <:AbstractMatrix}) + st = Base.try_strides(A.parent) + isnothing(st) && return nothing + reverse(st) + end + function Base.try_strides(A::Transpose{<:Number, <:AbstractMatrix}) + st = Base.try_strides(A.parent) + isnothing(st) && return nothing + reverse(st) + end + Base.can_ptr_load(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.can_ptr_load(A.parent) + Base.can_ptr_store(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.can_ptr_store(A.parent) + Base.can_ptr_load(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.can_ptr_load(A.parent) + Base.can_ptr_store(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.can_ptr_store(A.parent) +end Base.cconvert(::Type{Ptr{T}}, A::Adjoint{<:Real, <:AbstractVecOrMat}) where {T} = Base.cconvert(Ptr{T}, A.parent) Base.cconvert(::Type{Ptr{T}}, A::Transpose{<:Any, <:AbstractVecOrMat}) where {T} = Base.cconvert(Ptr{T}, A.parent) From 007e88f0bf4b4d5635ee59a723ed54de1fce0149 Mon Sep 17 00:00:00 2001 From: nhz2 Date: Mon, 18 May 2026 20:51:08 -0400 Subject: [PATCH 2/3] change name can_ptr_load/store to is_ptr_load/storeable --- src/adjtrans.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/adjtrans.jl b/src/adjtrans.jl index ce06ed1d..d7974c8b 100644 --- a/src/adjtrans.jl +++ b/src/adjtrans.jl @@ -373,7 +373,7 @@ Base.strides(A::Transpose{<:Any, <:AbstractVector}) = (stride(A.parent, 2), stri # For matrices it's slightly faster to use reverse and avoid calling stride twice Base.strides(A::Adjoint{<:Real, <:AbstractMatrix}) = reverse(strides(A.parent)) Base.strides(A::Transpose{<:Any, <:AbstractMatrix}) = reverse(strides(A.parent)) -@static if isdefined(Base, :try_strides) && isdefined(Base, :can_ptr_load) && isdefined(Base, :can_ptr_store) +@static if isdefined(Base, :try_strides) && isdefined(Base, :is_ptr_loadable) && isdefined(Base, :is_ptr_storeable) function Base.try_strides(A::Adjoint{<:Real, <:AbstractVector}) st = Base.try_strides(A.parent) isnothing(st) && return nothing @@ -394,10 +394,10 @@ Base.strides(A::Transpose{<:Any, <:AbstractMatrix}) = reverse(strides(A.parent)) isnothing(st) && return nothing reverse(st) end - Base.can_ptr_load(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.can_ptr_load(A.parent) - Base.can_ptr_store(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.can_ptr_store(A.parent) - Base.can_ptr_load(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.can_ptr_load(A.parent) - Base.can_ptr_store(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.can_ptr_store(A.parent) + Base.is_ptr_loadable(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.is_ptr_loadable(A.parent) + Base.is_ptr_storeable(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.is_ptr_storeable(A.parent) + Base.is_ptr_loadable(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.is_ptr_loadable(A.parent) + Base.is_ptr_storeable(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.is_ptr_storeable(A.parent) end Base.cconvert(::Type{Ptr{T}}, A::Adjoint{<:Real, <:AbstractVecOrMat}) where {T} = Base.cconvert(Ptr{T}, A.parent) From eb156f17ef678efdb7eac1a51a5a97dd64e547eb Mon Sep 17 00:00:00 2001 From: nhz2 Date: Mon, 18 May 2026 21:19:48 -0400 Subject: [PATCH 3/3] change is_ptr_storeable to is_ptr_storable --- src/adjtrans.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/adjtrans.jl b/src/adjtrans.jl index d7974c8b..994cb4dc 100644 --- a/src/adjtrans.jl +++ b/src/adjtrans.jl @@ -373,7 +373,7 @@ Base.strides(A::Transpose{<:Any, <:AbstractVector}) = (stride(A.parent, 2), stri # For matrices it's slightly faster to use reverse and avoid calling stride twice Base.strides(A::Adjoint{<:Real, <:AbstractMatrix}) = reverse(strides(A.parent)) Base.strides(A::Transpose{<:Any, <:AbstractMatrix}) = reverse(strides(A.parent)) -@static if isdefined(Base, :try_strides) && isdefined(Base, :is_ptr_loadable) && isdefined(Base, :is_ptr_storeable) +@static if isdefined(Base, :try_strides) && isdefined(Base, :is_ptr_loadable) && isdefined(Base, :is_ptr_storable) function Base.try_strides(A::Adjoint{<:Real, <:AbstractVector}) st = Base.try_strides(A.parent) isnothing(st) && return nothing @@ -395,9 +395,9 @@ Base.strides(A::Transpose{<:Any, <:AbstractMatrix}) = reverse(strides(A.parent)) reverse(st) end Base.is_ptr_loadable(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.is_ptr_loadable(A.parent) - Base.is_ptr_storeable(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.is_ptr_storeable(A.parent) + Base.is_ptr_storable(A::Adjoint{<:Real, <:AbstractVecOrMat}) = Base.is_ptr_storable(A.parent) Base.is_ptr_loadable(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.is_ptr_loadable(A.parent) - Base.is_ptr_storeable(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.is_ptr_storeable(A.parent) + Base.is_ptr_storable(A::Transpose{<:Number, <:AbstractVecOrMat}) = Base.is_ptr_storable(A.parent) end Base.cconvert(::Type{Ptr{T}}, A::Adjoint{<:Real, <:AbstractVecOrMat}) where {T} = Base.cconvert(Ptr{T}, A.parent)