This is almost universally true across all languages. The behaviors you see are usually the result of countless heuristics stacked one atop the other, and a tiny change here can end up with huge changes there.
julia> f(x) = @fastmath sqrt.(x)
julia > @code_native debuginfo=:none f.(Tuple(rand(Float32, 8)))
vsqrtps ymm0, ymmword ptr [rsi]
mov rbp, rsp
mov rax, rdi
vmovups ymmword ptr [rdi], ymm0
pop rbp
vzeroupper
ret
julia> g() = f((1f0, 2f0, 3f0, 4f0))
julia> @code_native debuginfo=:none g()
.LCPI0_0:
.long 0x3f800000 # float 1
.long 0x3fb504f3 # float 1.41421354
.long 0x3fddb3d7 # float 1.73205078
.long 0x40000000 # float 2
.text
.globl julia_g_600
.p2align 4, 0x90
.type julia_g_600,@function
julia_g_600: # @julia_g_600
# %bb.0: # %top
push rbp
movabs rcx, offset .LCPI0_0
mov rbp, rsp
mov rax, rdi
vmovaps xmm0, xmmword ptr [rcx]
vmovups xmmword ptr [rdi], xmm0
pop rbp
ret