@alexhunsley can probably explain better, but I checked these functions with godbold:
func f () -> Bool {
let u: Bool? = h ()
if u == false {
return false
}
else {
return true
}
}
func g () -> Bool {
let u: Bool = h ()
if u == false {
return false
}
else {
return true
}
}
func h () -> Bool {
return true
}
Assembly Code
output.f() -> Swift.Bool:
push rbp
mov rbp, rsp
sub rsp, 48
lea rdi, [rbp - 8]
xor esi, esi
mov edx, 1
call memset@PLT
call (output.h() -> Swift.Bool)
and al, 1
mov byte ptr [rbp - 8], al
lea rcx, [rbp - 10]
mov qword ptr [rbp - 32], rcx
lea rcx, [rbp - 10]
add rcx, 1
mov qword ptr [rbp - 24], rcx
mov byte ptr [rbp - 10], al
mov byte ptr [rbp - 9], 0
cmp byte ptr [rbp - 10], 2
je .LBB1_2
mov rdi, qword ptr [rbp - 32]
lea rsi, [rbp - 11]
call (outlined init with copy of Swift.Bool?)
mov rax, qword ptr [rbp - 24]
cmp byte ptr [rax], 2
je .LBB1_4
jmp .LBB1_3
.LBB1_2:
mov rax, qword ptr [rbp - 24]
cmp byte ptr [rax], 2
je .LBB1_7
jmp .LBB1_8
.LBB1_3:
mov rcx, qword ptr [rbp - 24]
mov al, byte ptr [rbp - 11]
mov cl, byte ptr [rcx]
xor al, cl
xor al, 1
mov byte ptr [rbp - 33], al
jmp .LBB1_5
.LBB1_4:
jmp .LBB1_6
.LBB1_5:
mov al, byte ptr [rbp - 33]
test al, 1
jne .LBB1_9
jmp .LBB1_10
.LBB1_6:
xor eax, eax
mov byte ptr [rbp - 33], al
jmp .LBB1_5
.LBB1_7:
mov al, 1
mov byte ptr [rbp - 33], al
jmp .LBB1_5
.LBB1_8:
jmp .LBB1_6
.LBB1_9:
xor eax, eax
mov byte ptr [rbp - 34], al
jmp .LBB1_11
.LBB1_10:
mov al, 1
mov byte ptr [rbp - 34], al
jmp .LBB1_11
.LBB1_11:
mov al, byte ptr [rbp - 34]
add rsp, 48
pop rbp
ret
output.h() -> Swift.Bool:
push rbp
mov rbp, rsp
mov al, 1
pop rbp
ret
outlined init with copy of Swift.Bool?:
push rbp
mov rbp, rsp
mov rax, rsi
mov cl, byte ptr [rdi]
mov byte ptr [rax], cl
pop rbp
ret
output.g() -> Swift.Bool:
push rbp
mov rbp, rsp
sub rsp, 16
mov byte ptr [rbp - 8], 0
call (output.h() -> Swift.Bool)
mov cl, al
mov al, cl
and al, 1
mov byte ptr [rbp - 8], al
test al, al
jne .LBB4_2
jmp .LBB4_1
.LBB4_1:
xor eax, eax
mov byte ptr [rbp - 9], al
jmp .LBB4_3
.LBB4_2:
mov al, 1
mov byte ptr [rbp - 9], al
jmp .LBB4_3
.LBB4_3:
mov al, byte ptr [rbp - 9]
add rsp, 16
pop rbp
ret
__swift_reflection_version:
.short 3
Assembly code for g looks shorter.