void gen_balanced_tree(int min, int max, int **array) {
  int i;
  if (min > max)
    return;
  i = (min + max + 1) / 2;
  *(*array)++ = i;
  gen_balanced_tree(min, i - 1, array);
  gen_balanced_tree(i + 1, max, array);
}


x86 assembly (clang, -O0):
<gen_balanced_tree>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    1133 <gen_balanced_tree+0x23>
jmp    1181 <gen_balanced_tree+0x71>
mov    -0x4(%rbp),%eax
add    -0x8(%rbp),%eax
add    $0x1,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rdx
mov    (%rdx),%rax
mov    %rax,%rsi
add    $0x4,%rsi
mov    %rsi,(%rdx)
mov    %ecx,(%rax)
mov    -0x4(%rbp),%edi
mov    -0x14(%rbp),%esi
sub    $0x1,%esi
mov    -0x10(%rbp),%rdx
call   1030 <gen_balanced_tree@plt>
mov    -0x14(%rbp),%edi
add    $0x1,%edi
mov    -0x8(%rbp),%esi
mov    -0x10(%rbp),%rdx
call   1030 <gen_balanced_tree@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gen_balanced_tree>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
cmp    %esi,%edi
jg     115e <gen_balanced_tree+0x4e>
mov    %rdx,%r12
mov    %esi,%r14d
lea    0x1(%r14),%r15d
cs nopw 0x0(%rax,%rax,1)
lea    (%r15,%rdi,1),%eax
mov    %eax,%ebx
shr    $0x1f,%ebx
add    %eax,%ebx
sar    %ebx
mov    (%r12),%rax
lea    0x4(%rax),%rcx
mov    %rcx,(%r12)
mov    %ebx,(%rax)
lea    -0x1(%rbx),%esi
mov    %r12,%rdx
call   1030 <gen_balanced_tree@plt>
lea    0x1(%rbx),%edi
cmp    %r14d,%ebx
jl     1130 <gen_balanced_tree+0x20>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @gen_balanced_tree(i32 %0, i32 %1, i32** %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32**
%7 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
store i32** %2, i32*** %6
%8 = load i32, i32* %4
%9 = load i32, i32* %5
%10 = icmp sgt i32 %8, %9
br i1 %10, label %11, label %12
11: ; preds = %3
br label %30
12: ; preds = %3
%13 = load i32, i32* %4
%14 = load i32, i32* %5
%15 = add nsw i32 %13, %14
%16 = add nsw i32 %15, 1
%17 = sdiv i32 %16, 2
store i32 %17, i32* %7
%18 = load i32, i32* %7
%19 = load i32**, i32*** %6
%20 = load i32*, i32** %19
%21 = getelementptr inbounds i32, i32* %20, i32 1
store i32* %21, i32** %19
store i32 %18, i32* %20
%22 = load i32, i32* %4
%23 = load i32, i32* %7
%24 = sub nsw i32 %23, 1
%25 = load i32**, i32*** %6
%26 = load i32, i32* %7
%27 = add nsw i32 %26, 1
%28 = load i32, i32* %5
%29 = load i32**, i32*** %6
br label %30
30: ; preds = %12, %11
ret void
}

LLVM IR (-O2):
define void @gen_balanced_tree(i32 %0, i32 %1, i32** %2) {
%4 = icmp sgt i32 %0, %1
br i1 %4, label %16, label %5
5: ; preds = %3
%6 = add i32 %1, 1
br label %7
7: ; preds = %5, %7
%8 = phi i32 [ %0, %5 ], [ %14, %7 ]
%9 = add i32 %6, %8
%10 = sdiv i32 %9, 2
%11 = load i32*, i32** %2
%12 = getelementptr inbounds i32, i32* %11, i64 1
store i32* %12, i32** %2
store i32 %10, i32* %11
%13 = add nsw i32 %10, -1
tail call void @gen_balanced_tree(i32 %8, i32 %13, i32** %2)
%14 = add nsw i32 %10, 1
%15 = icmp slt i32 %10, %1
br i1 %15, label %7, label %16
16: ; preds = %7, %3
ret void
}