Further-reduced example function and IR (identical between 3.3 and 3.6):
julia> elty = Complex{Float64}; x = ones(elty,10); p = -1
julia> function gv(p)
av = float(abs(1.0+0.0im))
T = Float64
pp::promote_type(Float64, T) = p
sum::Float64 = av^pp
end
gv (generic function with 1 method)
julia> @code_llvm gv(p)
; Function Attrs: uwtable
define double @julia_gv_67043(i64) #-1 {
top:
%1 = call double inttoptr (i64 339752784 to double (double, double)*)(double 1
.000000e+00, double 0.000000e+00)
%2 = sitofp i64 %0 to double
%3 = call double inttoptr (i64 339772768 to double (double, double)*)(double %
1, double %2)
%4 = fadd double %2, %1
%5 = fcmp uno double %4, 0.000000e+00
%6 = fcmp ord double %3, 0.000000e+00
%7 = or i1 %6, %5
br i1 %7, label %pass, label %fail
fail: ; preds = %top
%8 = load %jl_value_t** @jl_domain_exception, align 8
call void @jl_throw_with_superfluous_argument(%jl_value_t* %8, i32 6)
unreachable
pass: ; preds = %top
ret double %3
}
asm on 3.3:
julia> @code_native gv(p)
.text
Filename: none
Source line: 2
pushq %rbp
movq %rsp, %rbp
pushq %rsi
subq $72, %rsp
vmovaps %xmm7, -48(%rbp)
vmovaps %xmm6, -32(%rbp)
movq %rcx, %rsi
movabsq $2253728, %rax # imm = 0x2263A0
vmovsd (%rax), %xmm0
movl $1752446800, %eax # imm = 0x68743750
vxorps %xmm1, %xmm1, %xmm1
Source line: 2
callq *%rax # call hypot
vmovapd %xmm0, %xmm6
Source line: 4
vcvtsi2sdq %rsi, %xmm0, %xmm7
movl $1752466784, %eax # imm = 0x68748560
Source line: 6
vmovapd %xmm7, %xmm1
callq *%rax # call pow
vucomisd %xmm0, %xmm0
jp L94
L77: vmovaps -32(%rbp), %xmm6
vmovaps -48(%rbp), %xmm7
addq $72, %rsp
popq %rsi
popq %rbp
ret
L94: vaddsd %xmm6, %xmm7, %xmm1
vucomisd %xmm1, %xmm1
jp L77
movabsq $jl_domain_exception, %rax
movq (%rax), %rcx
movabsq $jl_throw_with_superfluous_argument, %rax
movl $6, %edx
callq *%rax
asm on 3.6:
julia> @code_native gv(p)
.text
Filename: none
Source line: 0
pushq %rbp
movq %rsp, %rbp
pushq %rsi
subq $72, %rsp
vmovaps %xmm7, -32(%rbp)
vmovaps %xmm6, -48(%rbp)
movq %rcx, %rsi
movabsq $341377024, %rax # imm = 0x14590000
vmovsd (%rax), %xmm0
movl $339752784, %eax # imm = 0x14403750
vxorps %xmm1, %xmm1, %xmm1
Source line: 2
callq *%rax # call hypot
vmovaps %xmm0, %xmm6
Source line: 4
vxorps %xmm0, %xmm0, %xmm0
vcvtsi2sdq %rsi, %xmm0, %xmm7
movl $339772768, %eax # imm = 0x14408560
Source line: 6
vmovaps %xmm7, %xmm1
callq *%rax # call pow
vucomisd %xmm0, %xmm0
jnp L87
vaddsd %xmm6, %xmm7, %xmm1
vucomisd %xmm1, %xmm1
jnp L104
L87: vmovaps -48(%rbp), %xmm6
vmovaps -32(%rbp), %xmm7
addq $72, %rsp
popq %rsi
popq %rbp
retq
L104: movabsq $jl_domain_exception, %rax
movq (%rax), %rcx
movabsq $jl_throw_with_superfluous_argument, %rax
movl $6, %edx
callq *%rax
ud2