void if_eg(long x, long n, long *dest) {
  long val = x;
  if (n == 100) {
    val *= 13;
  } else if (n == 102) {
    val += 10;
    val += 11;
  } else if (n == 103) {
    val += 11;
  } else if (n == 104 || n == 106) {
    val *= val;
  } else {
    val = 0;
  }
  *dest = val;
}


x86 assembly (clang, -O0):
<if_eg>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x64,-0x10(%rbp)
jne    1131 <if_eg+0x31>
imul   $0xd,-0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    11b4 <if_eg+0xb4>
cmpq   $0x66,-0x10(%rbp)
jne    1159 <if_eg+0x59>
mov    -0x20(%rbp),%rax
add    $0xa,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0xb,%rax
mov    %rax,-0x20(%rbp)
jmp    11af <if_eg+0xaf>
cmpq   $0x67,-0x10(%rbp)
jne    1175 <if_eg+0x75>
mov    -0x20(%rbp),%rax
add    $0xb,%rax
mov    %rax,-0x20(%rbp)
jmp    11aa <if_eg+0xaa>
cmpq   $0x68,-0x10(%rbp)
je     118b <if_eg+0x8b>
cmpq   $0x6a,-0x10(%rbp)
jne    119d <if_eg+0x9d>
mov    -0x20(%rbp),%rax
imul   -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    11a5 <if_eg+0xa5>
movq   $0x0,-0x20(%rbp)
jmp    11aa <if_eg+0xaa>
jmp    11af <if_eg+0xaf>
jmp    11b4 <if_eg+0xb4>
mov    -0x20(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<if_eg>:
cmp    $0x67,%rsi
je     111e <if_eg+0x1e>
cmp    $0x66,%rsi
je     1126 <if_eg+0x26>
cmp    $0x64,%rsi
jne    112e <if_eg+0x2e>
lea    (%rdi,%rdi,2),%rax
lea    (%rdi,%rax,4),%rdi
mov    %rdi,(%rdx)
ret
add    $0xb,%rdi
mov    %rdi,(%rdx)
ret
add    $0x15,%rdi
mov    %rdi,(%rdx)
ret
and    $0xfffffffffffffffd,%rsi
imul   %rdi,%rdi
xor    %eax,%eax
cmp    $0x68,%rsi
cmovne %rax,%rdi
mov    %rdi,(%rdx)
ret

LLVM IR (-O0):
define void @if_eg(i64 %0, i64 %1, i64* %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64*
%7 = alloca i64
store i64 %0, i64* %4
store i64 %1, i64* %5
store i64* %2, i64** %6
%8 = load i64, i64* %4
store i64 %8, i64* %7
%9 = load i64, i64* %5
%10 = icmp eq i64 %9, 100
br i1 %10, label %11, label %14
11: ; preds = %3
%12 = load i64, i64* %7
%13 = mul nsw i64 %12, 13
store i64 %13, i64* %7
br label %42
14: ; preds = %3
%15 = load i64, i64* %5
%16 = icmp eq i64 %15, 102
br i1 %16, label %17, label %22
17: ; preds = %14
%18 = load i64, i64* %7
%19 = add nsw i64 %18, 10
store i64 %19, i64* %7
%20 = load i64, i64* %7
%21 = add nsw i64 %20, 11
store i64 %21, i64* %7
br label %41
22: ; preds = %14
%23 = load i64, i64* %5
%24 = icmp eq i64 %23, 103
br i1 %24, label %25, label %28
25: ; preds = %22
%26 = load i64, i64* %7
%27 = add nsw i64 %26, 11
store i64 %27, i64* %7
br label %40
28: ; preds = %22
%29 = load i64, i64* %5
%30 = icmp eq i64 %29, 104
br i1 %30, label %34, label %31
31: ; preds = %28
%32 = load i64, i64* %5
%33 = icmp eq i64 %32, 106
br i1 %33, label %34, label %38
34: ; preds = %31, %28
%35 = load i64, i64* %7
%36 = load i64, i64* %7
%37 = mul nsw i64 %36, %35
store i64 %37, i64* %7
br label %39
38: ; preds = %31
store i64 0, i64* %7
br label %39
39: ; preds = %38, %34
br label %40
40: ; preds = %39, %25
br label %41
41: ; preds = %40, %17
br label %42
42: ; preds = %41, %11
%43 = load i64, i64* %7
%44 = load i64*, i64** %6
store i64 %43, i64* %44
ret void
}

LLVM IR (-O2):
define void @if_eg(i64 %0, i64 %1, i64* nocapture writeonly %2) {
switch i64 %1, label %10 [
i64 100, label %4
i64 102, label %6
i64 103, label %8
]
4: ; preds = %3
%5 = mul nsw i64 %0, 13
br label %15
6: ; preds = %3
%7 = add nsw i64 %0, 21
br label %15
8: ; preds = %3
%9 = add nsw i64 %0, 11
br label %15
10: ; preds = %3
%11 = and i64 %1, -3
%12 = icmp eq i64 %11, 104
%13 = mul nsw i64 %0, %0
%14 = select i1 %12, i64 %13, i64 0
br label %15
15: ; preds = %10, %6, %8, %4
%16 = phi i64 [ %5, %4 ], [ %7, %6 ], [ %9, %8 ], [ %14, %10 ]
store i64 %16, i64* %2
ret void
}