On 1.12, no effects are needed:
julia> function SFibA(::Val{S}) where S
values = MVector{S, Int}(undef)
@inbounds for i in 1:S
values[i] = (i == 1 || i == 2) ? 1 : values[i-1] + values[i-2]
end
SVector{S}(values)
end
SFibA (generic function with 1 method)
julia> @code_llvm debuginfo=:none SFibA(Val(4))
; Function Signature: SFibA(Base.Val{4})
define void @julia_SFibA_5700(ptr noalias nocapture noundef nonnull sret([1 x [4 x i64]]) align 8 dereferenceable(32) %sret_return) #0 {
L61.3:
store <4 x i64> <i64 1, i64 1, i64 2, i64 3>, ptr %sret_return, align 8
ret void
}
Looks like it works up to size 12:
julia> @code_llvm debuginfo=:none SFibA(Val(12))
; Function Signature: SFibA(Base.Val{12})
define void @julia_SFibA_5928(ptr noalias nocapture noundef nonnull sret([1 x [12 x i64]]) align 8 dereferenceable(96) %sret_return) #0 {
L61.11:
store <4 x i64> <i64 1, i64 1, i64 2, i64 3>, ptr %sret_return, align 8
%"new::SArray.sroa.0.sroa.5.0.sret_return.sroa_idx" = getelementptr inbounds i8, ptr %sret_return, i64 32
store <4 x i64> <i64 5, i64 8, i64 13, i64 21>, ptr %"new::SArray.sroa.0.sroa.5.0.sret_return.sroa_idx", align 8
%"new::SArray.sroa.0.sroa.9.0.sret_return.sroa_idx" = getelementptr inbounds i8, ptr %sret_return, i64 64
store <4 x i64> <i64 34, i64 55, i64 89, i64 144>, ptr %"new::SArray.sroa.0.sroa.9.0.sret_return.sroa_idx", align 8
ret void
}