int quant(int num1, int num2) {
  return num1 < num2 ? quant(num1 + 1, num2) + (num1 % 2 == 0) : 0;
}


x86 assembly (clang, -O0):
<quant>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    115f <quant+0x4f>
mov    -0x4(%rbp),%edi
add    $0x1,%edi
mov    -0x8(%rbp),%esi
call   1030 <quant@plt>
mov    %eax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    -0x10(%rbp),%eax
cmp    $0x0,%edx
sete   %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    %eax,-0xc(%rbp)
jmp    1169 <quant+0x59>
xor    %eax,%eax
mov    %eax,-0xc(%rbp)
jmp    1169 <quant+0x59>
mov    -0xc(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<quant>:
xor    %eax,%eax
mov    %esi,%ecx
sub    %edi,%ecx
jle    11d0 <quant+0xd0>
xor    %eax,%eax
cmp    $0x8,%ecx
jb     11c0 <quant+0xc0>
mov    %ecx,%r8d
and    $0xfffffff8,%r8d
movd   %edi,%xmm0
pshufd $0x0,%xmm0,%xmm0
paddd  0xed1(%rip),%xmm0
lea    -0x8(%r8),%eax
mov    %eax,%edx
shr    $0x3,%edx
add    $0x1,%edx
test   %eax,%eax
je     11d1 <quant+0xd1>
mov    %edx,%eax
and    $0xfffffffe,%eax
pxor   %xmm1,%xmm1
movdqa 0xebc(%rip),%xmm3
movdqa 0xec4(%rip),%xmm4
pxor   %xmm2,%xmm2
movdqa %xmm0,%xmm5
pandn  %xmm3,%xmm5
paddd  %xmm5,%xmm1
paddd  %xmm5,%xmm2
paddd  %xmm5,%xmm1
paddd  %xmm5,%xmm2
paddd  %xmm4,%xmm0
add    $0xfffffffe,%eax
jne    1160 <quant+0x60>
test   $0x1,%dl
je     1196 <quant+0x96>
pandn  0xe82(%rip),%xmm0
paddd  %xmm0,%xmm1
paddd  %xmm0,%xmm2
paddd  %xmm2,%xmm1
pshufd $0xee,%xmm1,%xmm0
paddd  %xmm1,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r8d,%ecx
je     11d0 <quant+0xd0>
add    %edi,%r8d
mov    %r8d,%edi
nopl   0x0(%rax,%rax,1)
lea    0x1(%rdi),%ecx
not    %edi
and    $0x1,%edi
add    %edi,%eax
mov    %ecx,%edi
cmp    %ecx,%esi
jne    11c0 <quant+0xc0>
ret
pxor   %xmm1,%xmm1
pxor   %xmm2,%xmm2
test   $0x1,%dl
jne    1186 <quant+0x86>
jmp    1196 <quant+0x96>

LLVM IR (-O0):
define i32 @quant(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%5 = load i32, i32* %3
%6 = load i32, i32* %4
%7 = icmp slt i32 %5, %6
br i1 %7, label %8, label %18
8: ; preds = %2
%9 = load i32, i32* %3
%10 = add nsw i32 %9, 1
%11 = load i32, i32* %4
%12 = call i32 @quant(i32 %10, i32 %11)
%13 = load i32, i32* %3
%14 = srem i32 %13, 2
%15 = icmp eq i32 %14, 0
%16 = zext i1 %15 to i32
%17 = add nsw i32 %12, %16
br label %19
18: ; preds = %2
br label %19
19: ; preds = %18, %8
%20 = phi i32 [ %17, %8 ], [ 0, %18 ]
ret i32 %20
}

LLVM IR (-O2):
define i32 @quant(i32 %0, i32 %1) {
%3 = icmp sgt i32 %1, %0
br i1 %3, label %4, label %71
4: ; preds = %2
%5 = sub i32 %1, %0
%6 = icmp ult i32 %5, 8
br i1 %6, label %60, label %7
7: ; preds = %4
%8 = and i32 %5, -8
%9 = add i32 %8, %0
%10 = insertelement <4 x i32> poison, i32 %0, i64 0
%11 = shufflevector <4 x i32> %10, <4 x i32> poison, <4 x i32> zeroinitializer
%12 = add <4 x i32> %11, <i32 0, i32 1, i32 2, i32 3>
%13 = add i32 %8, -8
%14 = lshr exact i32 %13, 3
%15 = add nuw nsw i32 %14, 1
%16 = and i32 %15, 1
%17 = icmp eq i32 %13, 0
br i1 %17, label %40, label %18
18: ; preds = %7
%19 = and i32 %15, 1073741822
br label %20
20: ; preds = %20, %18
%21 = phi <4 x i32> [ %12, %18 ], [ %37, %20 ]
%22 = phi <4 x i32> [ zeroinitializer, %18 ], [ %35, %20 ]
%23 = phi <4 x i32> [ zeroinitializer, %18 ], [ %36, %20 ]
%24 = phi i32 [ 0, %18 ], [ %38, %20 ]
%25 = and <4 x i32> %21, <i32 1, i32 1, i32 1, i32 1>
%26 = and <4 x i32> %21, <i32 1, i32 1, i32 1, i32 1>
%27 = xor <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1>
%28 = xor <4 x i32> %26, <i32 1, i32 1, i32 1, i32 1>
%29 = add <4 x i32> %27, %22
%30 = add <4 x i32> %28, %23
%31 = and <4 x i32> %21, <i32 1, i32 1, i32 1, i32 1>
%32 = and <4 x i32> %21, <i32 1, i32 1, i32 1, i32 1>
%33 = xor <4 x i32> %31, <i32 1, i32 1, i32 1, i32 1>
%34 = xor <4 x i32> %32, <i32 1, i32 1, i32 1, i32 1>
%35 = add <4 x i32> %33, %29
%36 = add <4 x i32> %34, %30
%37 = add <4 x i32> %21, <i32 16, i32 16, i32 16, i32 16>
%38 = add i32 %24, 2
%39 = icmp eq i32 %38, %19
br i1 %39, label %40, label %20
40: ; preds = %20, %7
%41 = phi <4 x i32> [ undef, %7 ], [ %35, %20 ]
%42 = phi <4 x i32> [ undef, %7 ], [ %36, %20 ]
%43 = phi <4 x i32> [ %12, %7 ], [ %37, %20 ]
%44 = phi <4 x i32> [ zeroinitializer, %7 ], [ %35, %20 ]
%45 = phi <4 x i32> [ zeroinitializer, %7 ], [ %36, %20 ]
%46 = icmp eq i32 %16, 0
br i1 %46, label %54, label %47
47: ; preds = %40
%48 = and <4 x i32> %43, <i32 1, i32 1, i32 1, i32 1>
%49 = and <4 x i32> %43, <i32 1, i32 1, i32 1, i32 1>
%50 = xor <4 x i32> %48, <i32 1, i32 1, i32 1, i32 1>
%51 = xor <4 x i32> %49, <i32 1, i32 1, i32 1, i32 1>
%52 = add <4 x i32> %50, %44
%53 = add <4 x i32> %51, %45
br label %54
54: ; preds = %40, %47
%55 = phi <4 x i32> [ %41, %40 ], [ %52, %47 ]
%56 = phi <4 x i32> [ %42, %40 ], [ %53, %47 ]
%57 = add <4 x i32> %56, %55
%58 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %57)
%59 = icmp eq i32 %5, %8
br i1 %59, label %71, label %60
60: ; preds = %4, %54
%61 = phi i32 [ %0, %4 ], [ %9, %54 ]
%62 = phi i32 [ 0, %4 ], [ %58, %54 ]
br label %63
63: ; preds = %60, %63
%64 = phi i32 [ %66, %63 ], [ %61, %60 ]
%65 = phi i32 [ %69, %63 ], [ %62, %60 ]
%66 = add nsw i32 %64, 1
%67 = and i32 %64, 1
%68 = xor i32 %67, 1
%69 = add nuw nsw i32 %68, %65
%70 = icmp eq i32 %66, %1
br i1 %70, label %71, label %63
71: ; preds = %63, %54, %2
%72 = phi i32 [ 0, %2 ], [ %58, %54 ], [ %69, %63 ]
ret i32 %72
}