@@ -498,7 +498,8 @@ function gemv!(y::StridedVector{T}, tA::AbstractChar, A::StridedVecOrMat{T}, x::
498
498
nA == 0 && return _rmul_or_fill! (y, β)
499
499
alpha, beta = promote (α, β, zero (T))
500
500
if alpha isa Union{Bool,T} && beta isa Union{Bool,T} &&
501
- stride (A, 1 ) == 1 && stride (A, 2 ) >= size (A, 1 )
501
+ stride (A, 1 ) == 1 && abs (stride (A, 2 )) >= size (A, 1 ) &&
502
+ ! iszero (stride (x, 1 )) # We only check input's stride here.
502
503
return BLAS. gemv! (tA, alpha, A, x, beta, y)
503
504
else
504
505
return generic_matvecmul! (y, tA, A, x, MulAddMul (α, β))
@@ -516,8 +517,9 @@ function gemv!(y::StridedVector{Complex{T}}, tA::AbstractChar, A::StridedVecOrMa
516
517
nA == 0 && return _rmul_or_fill! (y, β)
517
518
alpha, beta = promote (α, β, zero (T))
518
519
if alpha isa Union{Bool,T} && beta isa Union{Bool,T} &&
519
- stride (A, 1 ) == 1 && stride (A, 2 ) >= size (A, 1 ) &&
520
- stride (y, 1 ) == 1 && tA == ' N' # reinterpret-based optimization is valid only for contiguous `y`
520
+ stride (A, 1 ) == 1 && abs (stride (A, 2 )) >= size (A, 1 ) &&
521
+ stride (y, 1 ) == 1 && tA == ' N' && # reinterpret-based optimization is valid only for contiguous `y`
522
+ ! iszero (stride (x, 1 ))
521
523
BLAS. gemv! (tA, alpha, reinterpret (T, A), x, beta, reinterpret (T, y))
522
524
return y
523
525
else
@@ -535,7 +537,9 @@ function gemv!(y::StridedVector{Complex{T}}, tA::AbstractChar, A::StridedVecOrMa
535
537
mA == 0 && return y
536
538
nA == 0 && return _rmul_or_fill! (y, β)
537
539
alpha, beta = promote (α, β, zero (T))
538
- @views if alpha isa Union{Bool,T} && beta isa Union{Bool,T} && stride (A, 1 ) == 1 && stride (A, 2 ) >= size (A, 1 )
540
+ @views if alpha isa Union{Bool,T} && beta isa Union{Bool,T} &&
541
+ stride (A, 1 ) == 1 && abs (stride (A, 2 )) >= size (A, 1 ) &&
542
+ ! iszero (stride (x, 1 ))
539
543
xfl = reinterpret (reshape, T, x) # Use reshape here.
540
544
yfl = reinterpret (reshape, T, y)
541
545
BLAS. gemv! (tA, alpha, A, xfl[1 , :], beta, yfl[1 , :])
0 commit comments