I think LLVM auto-vectorization only really works with vector lengths that are powers of two.
Here’s the result of copy-pasting the code from the above-linked example into the REPL, followed by:
@code_native debuginfo=:none mul_as_Mat(rand(SMatrix{5,5}), rand(SMatrix{5,5}))
that is, this is the code to multiply two 5-by-5 Float64 matrices on my system:
.section __TEXT,__text,regular,pure_instructions
movq %rdi, %rax
vmovupd 120(%rsi), %ymm2
vmovsd 152(%rsi), %xmm1 ## xmm1 = mem[0],zero
vmovupd 160(%rsi), %ymm4
vmovsd 192(%rsi), %xmm6 ## xmm6 = mem[0],zero
vmovsd 32(%rdx), %xmm0 ## xmm0 = mem[0],zero
vbroadcastsd %xmm0, %ymm3
vmulpd %ymm0, %ymm6, %ymm0
vmulpd %ymm3, %ymm4, %ymm3
vmovsd 24(%rdx), %xmm7 ## xmm7 = mem[0],zero
vbroadcastsd %xmm7, %ymm5
vfmadd231pd %ymm7, %ymm1, %ymm0 ## ymm0 = (ymm1 * ymm7) + ymm0
vfmadd213pd %ymm3, %ymm2, %ymm5 ## ymm5 = (ymm2 * ymm5) + ymm3
vmovsd 72(%rdx), %xmm3 ## xmm3 = mem[0],zero
vbroadcastsd %xmm3, %ymm7
vmulpd %ymm3, %ymm6, %ymm3
vmulpd %ymm7, %ymm4, %ymm7
vmovsd 64(%rdx), %xmm9 ## xmm9 = mem[0],zero
vbroadcastsd %xmm9, %ymm8
vfmadd231pd %ymm9, %ymm1, %ymm3 ## ymm3 = (ymm1 * ymm9) + ymm3
vfmadd213pd %ymm7, %ymm2, %ymm8 ## ymm8 = (ymm2 * ymm8) + ymm7
vmovsd 112(%rdx), %xmm7 ## xmm7 = mem[0],zero
vbroadcastsd %xmm7, %ymm9
vmulpd %ymm7, %ymm6, %ymm7
vmulpd %ymm9, %ymm4, %ymm9
vmovsd 104(%rdx), %xmm11 ## xmm11 = mem[0],zero
vbroadcastsd %xmm11, %ymm10
vfmadd231pd %ymm11, %ymm1, %ymm7 ## ymm7 = (ymm1 * ymm11) + ymm7
vfmadd213pd %ymm9, %ymm2, %ymm10 ## ymm10 = (ymm2 * ymm10) + ymm9
vmovsd 152(%rdx), %xmm9 ## xmm9 = mem[0],zero
vbroadcastsd %xmm9, %ymm11
vmulpd %ymm9, %ymm6, %ymm9
vmulpd %ymm11, %ymm4, %ymm12
vmovsd 144(%rdx), %xmm11 ## xmm11 = mem[0],zero
vfmadd231pd %ymm11, %ymm1, %ymm9 ## ymm9 = (ymm1 * ymm11) + ymm9
vbroadcastsd %xmm11, %ymm11
vfmadd213pd %ymm12, %ymm2, %ymm11 ## ymm11 = (ymm2 * ymm11) + ymm12
vmovsd 192(%rdx), %xmm12 ## xmm12 = mem[0],zero
vmulpd %ymm12, %ymm6, %ymm6
vbroadcastsd %xmm12, %ymm12
vmulpd %ymm12, %ymm4, %ymm4
vmovsd 184(%rdx), %xmm12 ## xmm12 = mem[0],zero
vfmadd213pd %ymm6, %ymm12, %ymm1 ## ymm1 = (ymm12 * ymm1) + ymm6
vmovupd 80(%rsi), %ymm6
vbroadcastsd %xmm12, %ymm12
vfmadd213pd %ymm4, %ymm2, %ymm12 ## ymm12 = (ymm2 * ymm12) + ymm4
vmovsd 112(%rsi), %xmm2 ## xmm2 = mem[0],zero
vmovsd 16(%rdx), %xmm4 ## xmm4 = mem[0],zero
vfmadd231pd %ymm4, %ymm2, %ymm0 ## ymm0 = (ymm2 * ymm4) + ymm0
vbroadcastsd %xmm4, %ymm4
vfmadd213pd %ymm5, %ymm6, %ymm4 ## ymm4 = (ymm6 * ymm4) + ymm5
vmovsd 56(%rdx), %xmm5 ## xmm5 = mem[0],zero
vfmadd231pd %ymm5, %ymm2, %ymm3 ## ymm3 = (ymm2 * ymm5) + ymm3
vbroadcastsd %xmm5, %ymm5
vfmadd213pd %ymm8, %ymm6, %ymm5 ## ymm5 = (ymm6 * ymm5) + ymm8
vmovsd 96(%rdx), %xmm8 ## xmm8 = mem[0],zero
vfmadd231pd %ymm8, %ymm2, %ymm7 ## ymm7 = (ymm2 * ymm8) + ymm7
vbroadcastsd %xmm8, %ymm8
vfmadd213pd %ymm10, %ymm6, %ymm8 ## ymm8 = (ymm6 * ymm8) + ymm10
vmovsd 136(%rdx), %xmm10 ## xmm10 = mem[0],zero
vfmadd231pd %ymm10, %ymm2, %ymm9 ## ymm9 = (ymm2 * ymm10) + ymm9
vbroadcastsd %xmm10, %ymm10
vfmadd213pd %ymm11, %ymm6, %ymm10 ## ymm10 = (ymm6 * ymm10) + ymm11
vmovsd 176(%rdx), %xmm11 ## xmm11 = mem[0],zero
vfmadd213pd %ymm1, %ymm11, %ymm2 ## ymm2 = (ymm11 * ymm2) + ymm1
vmovupd 40(%rsi), %ymm1
vbroadcastsd %xmm11, %ymm11
vfmadd213pd %ymm12, %ymm6, %ymm11 ## ymm11 = (ymm6 * ymm11) + ymm12
vmovsd 72(%rsi), %xmm6 ## xmm6 = mem[0],zero
vmovsd 8(%rdx), %xmm12 ## xmm12 = mem[0],zero
vfmadd231pd %ymm12, %ymm6, %ymm0 ## ymm0 = (ymm6 * ymm12) + ymm0
vbroadcastsd %xmm12, %ymm12
vfmadd213pd %ymm4, %ymm1, %ymm12 ## ymm12 = (ymm1 * ymm12) + ymm4
vmovsd 48(%rdx), %xmm4 ## xmm4 = mem[0],zero
vfmadd231pd %ymm4, %ymm6, %ymm3 ## ymm3 = (ymm6 * ymm4) + ymm3
vbroadcastsd %xmm4, %ymm4
vfmadd213pd %ymm5, %ymm1, %ymm4 ## ymm4 = (ymm1 * ymm4) + ymm5
vmovsd 88(%rdx), %xmm5 ## xmm5 = mem[0],zero
vfmadd231pd %ymm5, %ymm6, %ymm7 ## ymm7 = (ymm6 * ymm5) + ymm7
vbroadcastsd %xmm5, %ymm5
vfmadd213pd %ymm8, %ymm1, %ymm5 ## ymm5 = (ymm1 * ymm5) + ymm8
vmovsd 128(%rdx), %xmm8 ## xmm8 = mem[0],zero
vfmadd231pd %ymm8, %ymm6, %ymm9 ## ymm9 = (ymm6 * ymm8) + ymm9
vbroadcastsd %xmm8, %ymm8
vfmadd213pd %ymm10, %ymm1, %ymm8 ## ymm8 = (ymm1 * ymm8) + ymm10
vmovsd 168(%rdx), %xmm10 ## xmm10 = mem[0],zero
vfmadd213pd %ymm2, %ymm10, %ymm6 ## ymm6 = (ymm10 * ymm6) + ymm2
vmovupd (%rsi), %ymm2
vbroadcastsd %xmm10, %ymm10
vfmadd213pd %ymm11, %ymm1, %ymm10 ## ymm10 = (ymm1 * ymm10) + ymm11
vmovsd 32(%rsi), %xmm1 ## xmm1 = mem[0],zero
vmovsd (%rdx), %xmm11 ## xmm11 = mem[0],zero
vfmadd231pd %ymm11, %ymm1, %ymm0 ## ymm0 = (ymm1 * ymm11) + ymm0
vbroadcastsd %xmm11, %ymm11
vfmadd213pd %ymm12, %ymm2, %ymm11 ## ymm11 = (ymm2 * ymm11) + ymm12
vmovsd 40(%rdx), %xmm12 ## xmm12 = mem[0],zero
vfmadd231pd %ymm12, %ymm1, %ymm3 ## ymm3 = (ymm1 * ymm12) + ymm3
vbroadcastsd %xmm12, %ymm12
vfmadd213pd %ymm4, %ymm2, %ymm12 ## ymm12 = (ymm2 * ymm12) + ymm4
vmovsd 80(%rdx), %xmm4 ## xmm4 = mem[0],zero
vfmadd231pd %ymm4, %ymm1, %ymm7 ## ymm7 = (ymm1 * ymm4) + ymm7
vbroadcastsd %xmm4, %ymm4
vfmadd213pd %ymm5, %ymm2, %ymm4 ## ymm4 = (ymm2 * ymm4) + ymm5
vmovsd 120(%rdx), %xmm5 ## xmm5 = mem[0],zero
vfmadd231pd %ymm5, %ymm1, %ymm9 ## ymm9 = (ymm1 * ymm5) + ymm9
vbroadcastsd %xmm5, %ymm5
vfmadd213pd %ymm8, %ymm2, %ymm5 ## ymm5 = (ymm2 * ymm5) + ymm8
vmovsd 160(%rdx), %xmm8 ## xmm8 = mem[0],zero
vfmadd213pd %ymm6, %ymm8, %ymm1 ## ymm1 = (ymm8 * ymm1) + ymm6
vmovupd %ymm11, (%rdi)
vpermpd $144, %ymm12, %ymm6 ## ymm6 = ymm12[0,0,1,2]
vblendpd $1, %ymm0, %ymm6, %ymm0 ## ymm0 = ymm0[0],ymm6[1,2,3]
vmovupd %ymm0, 32(%rdi)
vbroadcastsd %xmm8, %ymm0
vfmadd213pd %ymm10, %ymm2, %ymm0 ## ymm0 = (ymm2 * ymm0) + ymm10
vshufpd $5, %ymm3, %ymm12, %ymm2 ## ymm2 = ymm12[1],ymm3[0],ymm12[3],ymm3[2]
vpermpd $230, %ymm2, %ymm2 ## ymm2 = ymm2[2,1,2,3]
vinsertf128 $1, %xmm4, %ymm0, %ymm3
vblendpd $12, %ymm3, %ymm2, %ymm2 ## ymm2 = ymm2[0,1],ymm3[2,3]
vmovupd %ymm2, 64(%rdi)
vperm2f128 $33, %ymm7, %ymm4, %ymm2 ## ymm2 = ymm4[2,3],ymm7[0,1]
vbroadcastsd %xmm5, %ymm3
vblendpd $8, %ymm3, %ymm2, %ymm2 ## ymm2 = ymm2[0,1,2],ymm3[3]
vmovupd %ymm2, 96(%rdi)
vperm2f128 $33, %ymm9, %ymm5, %ymm2 ## ymm2 = ymm5[2,3],ymm9[0,1]
vshufpd $5, %ymm2, %ymm5, %ymm2 ## ymm2 = ymm5[1],ymm2[0],ymm5[3],ymm2[2]
vmovupd %ymm2, 128(%rdi)
vmovupd %ymm0, 160(%rdi)
vmovlpd %xmm1, 192(%rdi)
vzeroupper
retq
nopw %cs:(%rax,%rax)
nop