#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ memcpy(int **, int **, int);
int /*<<< orphan*/ stable_sqrt_sort_merge_left_with_x_buf(int **, int, int,
                                                          int);
int /*<<< orphan*/ stable_sqrt_sort_merge_right(int **, int, int, int);
void stable_sqrt_sort_build_blocks(int **arr, int L, int K) {
  int m, u, h, p0, p1, rest, restk, p;
  for (m = 1; m < L; m += 2) {
    u = 0;
    if ((*(*(arr + (m - 1))) - *(*(arr + m))) > 0) {
      u = 1;
    }
    arr[m - 3] = arr[m - 1 + u];
    arr[m - 2] = arr[m - u];
  }
  if (L % 2) {
    arr[L - 3] = arr[L - 1];
  }
  arr -= 2;
  for (h = 2; h < K; h *= 2) {
    p0 = 0;
    p1 = L - 2 * h;
    while (p0 <= p1) {
      stable_sqrt_sort_merge_left_with_x_buf(arr + p0, h, h, -h);
      p0 += 2 * h;
    }
    rest = L - p0;
    if (rest > h) {
      stable_sqrt_sort_merge_left_with_x_buf(arr + p0, h, rest - h, -h);
    } else {
      for (; p0 < L; p0++) {
        arr[p0 - h] = arr[p0];
      }
    }
    arr -= h;
  }
  restk = L % (2 * K);
  p = L - restk;
  if (restk <= K) {
    memcpy(arr + p + K, arr + p, restk * sizeof(int *));
  } else {
    stable_sqrt_sort_merge_right(arr + p, K, restk - K, K);
  }
  while (p > 0) {
    p -= 2 * K;
    stable_sqrt_sort_merge_right(arr + p, K, K, K);
  }
}


x86 assembly (clang, -O0):
<stable_sqrt_sort_build_blocks>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11e2 <stable_sqrt_sort_build_blocks+0xb2>
movl   $0x0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
sub    (%rcx),%eax
cmp    $0x0,%eax
jle    118d <stable_sqrt_sort_build_blocks+0x5d>
movl   $0x1,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x18(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x14(%rbp)
jmp    1149 <stable_sqrt_sort_build_blocks+0x19>
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     1218 <stable_sqrt_sort_build_blocks+0xe8>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x3,%ecx
movslq %ecx,%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
add    $0xfffffffffffffff0,%rax
mov    %rax,-0x8(%rbp)
movl   $0x2,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    132d <stable_sqrt_sort_build_blocks+0x1fd>
movl   $0x0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
mov    -0x1c(%rbp),%ecx
shl    $0x1,%ecx
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jg     1288 <stable_sqrt_sort_build_blocks+0x158>
mov    -0x8(%rbp),%rdi
movslq -0x20(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
mov    -0x1c(%rbp),%esi
mov    -0x1c(%rbp),%edx
xor    %ecx,%ecx
sub    -0x1c(%rbp),%ecx
call   1030 <stable_sqrt_sort_merge_left_with_x_buf@plt>
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    124c <stable_sqrt_sort_build_blocks+0x11c>
mov    -0xc(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jle    12c4 <stable_sqrt_sort_build_blocks+0x194>
mov    -0x8(%rbp),%rdi
movslq -0x20(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
mov    -0x1c(%rbp),%esi
mov    -0x28(%rbp),%edx
sub    -0x1c(%rbp),%edx
xor    %ecx,%ecx
sub    -0x1c(%rbp),%ecx
call   1030 <stable_sqrt_sort_merge_left_with_x_buf@plt>
jmp    1305 <stable_sqrt_sort_build_blocks+0x1d5>
jmp    12c9 <stable_sqrt_sort_build_blocks+0x199>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1300 <stable_sqrt_sort_build_blocks+0x1d0>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12c9 <stable_sqrt_sort_build_blocks+0x199>
jmp    1305 <stable_sqrt_sort_build_blocks+0x1d5>
mov    -0x1c(%rbp),%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    122b <stable_sqrt_sort_build_blocks+0xfb>
mov    -0xc(%rbp),%eax
mov    -0x10(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %edx,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jg     138e <stable_sqrt_sort_build_blocks+0x25e>
mov    -0x8(%rbp),%rdi
movslq -0x30(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
movslq -0x10(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
mov    -0x8(%rbp),%rsi
movslq -0x30(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rsi
movslq -0x2c(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edx
call   1040 <memcpy@plt>
jmp    13ae <stable_sqrt_sort_build_blocks+0x27e>
mov    -0x8(%rbp),%rdi
movslq -0x30(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
mov    -0x10(%rbp),%esi
mov    -0x2c(%rbp),%edx
sub    -0x10(%rbp),%edx
mov    -0x10(%rbp),%ecx
call   1050 <stable_sqrt_sort_merge_right@plt>
jmp    13b3 <stable_sqrt_sort_build_blocks+0x283>
cmpl   $0x0,-0x30(%rbp)
jle    13ed <stable_sqrt_sort_build_blocks+0x2bd>
mov    -0x10(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x30(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rdi
movslq -0x30(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdi
mov    -0x10(%rbp),%esi
mov    -0x10(%rbp),%edx
mov    -0x10(%rbp),%ecx
call   1050 <stable_sqrt_sort_merge_right@plt>
jmp    13b3 <stable_sqrt_sort_build_blocks+0x283>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<stable_sqrt_sort_build_blocks>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %edx,%r15d
mov    %esi,%r13d
mov    %rdi,%rbp
cmp    $0x2,%esi
jl     119e <stable_sqrt_sort_build_blocks+0x6e>
mov    %r13d,%eax
mov    $0x1,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    -0x8(%rbp,%rcx,8),%rdx
mov    0x0(%rbp,%rcx,8),%rsi
mov    (%rdx),%edx
xor    %edi,%edi
cmp    (%rsi),%edx
setg   %dil
lea    (%rcx,%rdi,1),%rdx
mov    -0x8(%rbp,%rdx,8),%rdx
mov    %rdx,-0x18(%rbp,%rcx,8)
shl    $0x3,%rdi
mov    %rbp,%rdx
sub    %rdi,%rdx
mov    (%rdx,%rcx,8),%rdx
mov    %rdx,-0x10(%rbp,%rcx,8)
add    $0x2,%rcx
cmp    %rax,%rcx
jb     1160 <stable_sqrt_sort_build_blocks+0x30>
movslq %r13d,%rbx
test   $0x1,%r13b
je     11b1 <stable_sqrt_sort_build_blocks+0x81>
mov    -0x8(%rbp,%rbx,8),%rax
mov    %rax,-0x18(%rbp,%rbx,8)
add    $0xfffffffffffffff0,%rbp
cmp    $0x3,%r15d
jl     1445 <stable_sqrt_sort_build_blocks+0x315>
mov    $0x2,%r10d
mov    %r15,0x28(%rsp)
mov    %r13,0x20(%rsp)
mov    %rbx,0x18(%rsp)
jmp    1214 <stable_sqrt_sort_build_blocks+0xe4>
cs nopw 0x0(%rax,%rax,1)
movslq %r14d,%rax
mov    0x8(%rsp),%rbp
lea    0x0(,%rax,8),%rdi
add    %rbp,%rdi
mov    %ebx,%ecx
neg    %ecx
mov    %ebx,%esi
mov    %r10d,%ebx
call   1030 <stable_sqrt_sort_merge_left_with_x_buf@plt>
mov    %ebx,%r10d
shl    $0x3,%r12
sub    %r12,%rbp
cmp    %r15d,%r10d
jge    1445 <stable_sqrt_sort_build_blocks+0x315>
mov    %rbp,0x8(%rsp)
mov    %r10d,%ebx
lea    (%rbx,%rbx,1),%r10d
mov    %r13d,%eax
sub    %r10d,%eax
mov    $0x0,%r14d
js     128b <stable_sqrt_sort_build_blocks+0x15b>
mov    %ebx,%r13d
neg    %r13d
mov    %r10d,0x14(%rsp)
movslq %r10d,%r15
mov    %eax,%eax
mov    %rax,0x30(%rsp)
lea    0x0(,%r15,8),%r12
mov    0x8(%rsp),%rbp
xor    %r14d,%r14d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rbp,%rdi
mov    %ebx,%esi
mov    %ebx,%edx
mov    %r13d,%ecx
call   1030 <stable_sqrt_sort_merge_left_with_x_buf@plt>
add    %r15,%r14
add    %r12,%rbp
cmp    0x30(%rsp),%r14
jle    1260 <stable_sqrt_sort_build_blocks+0x130>
mov    0x28(%rsp),%r15
mov    0x20(%rsp),%r13
mov    0x14(%rsp),%r10d
mov    %r13d,%edx
sub    %r14d,%edx
movslq %ebx,%r12
sub    %ebx,%edx
jg     11e0 <stable_sqrt_sort_build_blocks+0xb0>
cmp    %r13d,%r14d
mov    0x8(%rsp),%rbp
mov    0x18(%rsp),%rbx
jge    1204 <stable_sqrt_sort_build_blocks+0xd4>
movslq %r14d,%rax
mov    %rbx,%rcx
sub    %rax,%rcx
cmp    $0x4,%rcx
jb     13b0 <stable_sqrt_sort_build_blocks+0x280>
mov    %rax,%rdi
sub    %r12,%rdi
lea    0x0(,%rdi,8),%rsi
add    %rbp,%rsi
lea    0x0(,%rbx,8),%rdx
add    %rbp,%rdx
cmp    %rdx,%rsi
jae    1302 <stable_sqrt_sort_build_blocks+0x1d2>
lea    0x0(,%r12,8),%rsi
sub    %rsi,%rdx
lea    0x0(,%rax,8),%rsi
add    %rbp,%rsi
cmp    %rdx,%rsi
jb     13b0 <stable_sqrt_sort_build_blocks+0x280>
mov    %rcx,%r8
and    $0xfffffffffffffffc,%r8
lea    -0x4(%r8),%rdx
mov    %rdx,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rdx,%rdx
je     1372 <stable_sqrt_sort_build_blocks+0x242>
mov    %r9,%rsi
and    $0xfffffffffffffffe,%rsi
lea    0x30(,%rdi,8),%rdx
add    %rbp,%rdx
lea    0x30(,%rax,8),%rbx
add    %rbp,%rbx
xor    %edi,%edi
nopl   0x0(%rax)
movups -0x30(%rbx,%rdi,8),%xmm0
movups -0x20(%rbx,%rdi,8),%xmm1
movups %xmm0,-0x30(%rdx,%rdi,8)
movups %xmm1,-0x20(%rdx,%rdi,8)
movups -0x10(%rbx,%rdi,8),%xmm0
movups (%rbx,%rdi,8),%xmm1
movups %xmm0,-0x10(%rdx,%rdi,8)
movups %xmm1,(%rdx,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rsi
jne    1340 <stable_sqrt_sort_build_blocks+0x210>
jmp    1374 <stable_sqrt_sort_build_blocks+0x244>
xor    %edi,%edi
test   $0x1,%r9b
mov    0x18(%rsp),%rbx
je     1399 <stable_sqrt_sort_build_blocks+0x269>
add    %rax,%rdi
movups 0x0(%rbp,%rdi,8),%xmm0
movups 0x10(%rbp,%rdi,8),%xmm1
sub    %r12,%rdi
movups %xmm0,0x0(%rbp,%rdi,8)
movups %xmm1,0x10(%rbp,%rdi,8)
cmp    %r8,%rcx
je     1204 <stable_sqrt_sort_build_blocks+0xd4>
add    %r8,%rax
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r13d,%edx
sub    %eax,%edx
mov    %rax,%rcx
not    %rcx
add    %rbx,%rcx
and    $0x3,%rdx
je     13f3 <stable_sqrt_sort_build_blocks+0x2c3>
lea    0x0(,%r12,8),%rdi
mov    %rbp,%rsi
sub    %rdi,%rsi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    0x0(%rbp,%rax,8),%rdi
mov    %rdi,(%rsi,%rax,8)
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jne    13e0 <stable_sqrt_sort_build_blocks+0x2b0>
cmp    $0x3,%rcx
jb     1204 <stable_sqrt_sort_build_blocks+0xd4>
lea    0x0(,%r12,8),%rdx
mov    %rbp,%rcx
sub    %rdx,%rcx
add    $0x18,%rcx
nop
mov    0x0(%rbp,%rax,8),%rdx
mov    %rdx,-0x18(%rcx,%rax,8)
mov    0x8(%rbp,%rax,8),%rdx
mov    %rdx,-0x10(%rcx,%rax,8)
mov    0x10(%rbp,%rax,8),%rdx
mov    %rdx,-0x8(%rcx,%rax,8)
mov    0x18(%rbp,%rax,8),%rdx
mov    %rdx,(%rcx,%rax,8)
add    $0x4,%rax
cmp    %rax,%rbx
jne    1410 <stable_sqrt_sort_build_blocks+0x2e0>
jmp    1204 <stable_sqrt_sort_build_blocks+0xd4>
lea    (%r15,%r15,1),%r14d
mov    %r13d,%eax
cltd
idiv   %r14d
sub    %edx,%r13d
mov    %edx,%eax
movslq %r13d,%rcx
lea    0x0(,%rcx,8),%rsi
add    %rbp,%rsi
sub    %r15d,%eax
jle    147f <stable_sqrt_sort_build_blocks+0x34f>
mov    %rsi,%rdi
mov    %r15d,%esi
mov    %eax,%edx
mov    %r15d,%ecx
call   1050 <stable_sqrt_sort_merge_right@plt>
test   %r13d,%r13d
jg     1493 <stable_sqrt_sort_build_blocks+0x363>
jmp    14c7 <stable_sqrt_sort_build_blocks+0x397>
movslq %r15d,%rax
lea    (%rsi,%rax,8),%rdi
shl    $0x3,%edx
call   1040 <memcpy@plt>
test   %r13d,%r13d
jle    14c7 <stable_sqrt_sort_build_blocks+0x397>
mov    %r14d,%ebx
neg    %ebx
nopl   0x0(%rax,%rax,1)
lea    (%rbx,%r13,1),%eax
sub    %r14d,%r13d
cltq
lea    0x0(,%rax,8),%rdi
add    %rbp,%rdi
mov    %r15d,%esi
mov    %r15d,%edx
mov    %r15d,%ecx
call   1050 <stable_sqrt_sort_merge_right@plt>
test   %r13d,%r13d
jg     14a0 <stable_sqrt_sort_build_blocks+0x370>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @stable_sqrt_sort_build_blocks(i32** %0, i32 %1, i32 %2) {
%4 = alloca i32**
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i32** %0, i32*** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
store i32 1, i32* %7
br label %15
15: ; preds = %62, %3
%16 = load i32, i32* %7
%17 = load i32, i32* %5
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %65
19: ; preds = %15
store i32 0, i32* %8
%20 = load i32**, i32*** %4
%21 = load i32, i32* %7
%22 = sub nsw i32 %21, 1
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i32*, i32** %20, i64 %23
%25 = load i32*, i32** %24
%26 = load i32, i32* %25
%27 = load i32**, i32*** %4
%28 = load i32, i32* %7
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i32*, i32** %27, i64 %29
%31 = load i32*, i32** %30
%32 = load i32, i32* %31
%33 = sub nsw i32 %26, %32
%34 = icmp sgt i32 %33, 0
br i1 %34, label %35, label %36
35: ; preds = %19
store i32 1, i32* %8
br label %36
36: ; preds = %35, %19
%37 = load i32**, i32*** %4
%38 = load i32, i32* %7
%39 = sub nsw i32 %38, 1
%40 = load i32, i32* %8
%41 = add nsw i32 %39, %40
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i32*, i32** %37, i64 %42
%44 = load i32*, i32** %43
%45 = load i32**, i32*** %4
%46 = load i32, i32* %7
%47 = sub nsw i32 %46, 3
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i32*, i32** %45, i64 %48
store i32* %44, i32** %49
%50 = load i32**, i32*** %4
%51 = load i32, i32* %7
%52 = load i32, i32* %8
%53 = sub nsw i32 %51, %52
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i32*, i32** %50, i64 %54
%56 = load i32*, i32** %55
%57 = load i32**, i32*** %4
%58 = load i32, i32* %7
%59 = sub nsw i32 %58, 2
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i32*, i32** %57, i64 %60
store i32* %56, i32** %61
br label %62
62: ; preds = %36
%63 = load i32, i32* %7
%64 = add nsw i32 %63, 2
store i32 %64, i32* %7
br label %15
65: ; preds = %15
%66 = load i32, i32* %5
%67 = srem i32 %66, 2
%68 = icmp ne i32 %67, 0
br i1 %68, label %69, label %81
69: ; preds = %65
%70 = load i32**, i32*** %4
%71 = load i32, i32* %5
%72 = sub nsw i32 %71, 1
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i32*, i32** %70, i64 %73
%75 = load i32*, i32** %74
%76 = load i32**, i32*** %4
%77 = load i32, i32* %5
%78 = sub nsw i32 %77, 3
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds i32*, i32** %76, i64 %79
store i32* %75, i32** %80
br label %81
81: ; preds = %69, %65
%82 = load i32**, i32*** %4
%83 = getelementptr inbounds i32*, i32** %82, i64 -2
store i32** %83, i32*** %4
store i32 2, i32* %9
br label %84
84: ; preds = %157, %81
%85 = load i32, i32* %9
%86 = load i32, i32* %6
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %160
88: ; preds = %84
store i32 0, i32* %10
%89 = load i32, i32* %5
%90 = load i32, i32* %9
%91 = mul nsw i32 2, %90
%92 = sub nsw i32 %89, %91
store i32 %92, i32* %11
br label %93
93: ; preds = %97, %88
%94 = load i32, i32* %10
%95 = load i32, i32* %11
%96 = icmp sle i32 %94, %95
br i1 %96, label %97, label %111
97: ; preds = %93
%98 = load i32**, i32*** %4
%99 = load i32, i32* %10
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds i32*, i32** %98, i64 %100
%102 = load i32, i32* %9
%103 = load i32, i32* %9
%104 = load i32, i32* %9
%105 = sub nsw i32 0, %104
%106 = call i32 @stable_sqrt_sort_merge_left_with_x_buf(i32** %101, i32 %102, i32 %103, i32 %105)
%107 = load i32, i32* %9
%108 = mul nsw i32 2, %107
%109 = load i32, i32* %10
%110 = add nsw i32 %109, %108
store i32 %110, i32* %10
br label %93
111: ; preds = %93
%112 = load i32, i32* %5
%113 = load i32, i32* %10
%114 = sub nsw i32 %112, %113
store i32 %114, i32* %12
%115 = load i32, i32* %12
%116 = load i32, i32* %9
%117 = icmp sgt i32 %115, %116
br i1 %117, label %118, label %130
118: ; preds = %111
%119 = load i32**, i32*** %4
%120 = load i32, i32* %10
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i32*, i32** %119, i64 %121
%123 = load i32, i32* %9
%124 = load i32, i32* %12
%125 = load i32, i32* %9
%126 = sub nsw i32 %124, %125
%127 = load i32, i32* %9
%128 = sub nsw i32 0, %127
%129 = call i32 @stable_sqrt_sort_merge_left_with_x_buf(i32** %122, i32 %123, i32 %126, i32 %128)
br label %151
130: ; preds = %111
br label %131
131: ; preds = %147, %130
%132 = load i32, i32* %10
%133 = load i32, i32* %5
%134 = icmp slt i32 %132, %133
br i1 %134, label %135, label %150
135: ; preds = %131
%136 = load i32**, i32*** %4
%137 = load i32, i32* %10
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds i32*, i32** %136, i64 %138
%140 = load i32*, i32** %139
%141 = load i32**, i32*** %4
%142 = load i32, i32* %10
%143 = load i32, i32* %9
%144 = sub nsw i32 %142, %143
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds i32*, i32** %141, i64 %145
store i32* %140, i32** %146
br label %147
147: ; preds = %135
%148 = load i32, i32* %10
%149 = add nsw i32 %148, 1
store i32 %149, i32* %10
br label %131
150: ; preds = %131
br label %151
151: ; preds = %150, %118
%152 = load i32, i32* %9
%153 = load i32**, i32*** %4
%154 = sext i32 %152 to i64
%155 = sub i64 0, %154
%156 = getelementptr inbounds i32*, i32** %153, i64 %155
store i32** %156, i32*** %4
br label %157
157: ; preds = %151
%158 = load i32, i32* %9
%159 = mul nsw i32 %158, 2
store i32 %159, i32* %9
br label %84
160: ; preds = %84
%161 = load i32, i32* %5
%162 = load i32, i32* %6
%163 = mul nsw i32 2, %162
%164 = srem i32 %161, %163
store i32 %164, i32* %13
%165 = load i32, i32* %5
%166 = load i32, i32* %13
%167 = sub nsw i32 %165, %166
store i32 %167, i32* %14
%168 = load i32, i32* %13
%169 = load i32, i32* %6
%170 = icmp sle i32 %168, %169
br i1 %170, label %171, label %188
171: ; preds = %160
%172 = load i32**, i32*** %4
%173 = load i32, i32* %14
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds i32*, i32** %172, i64 %174
%176 = load i32, i32* %6
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds i32*, i32** %175, i64 %177
%179 = load i32**, i32*** %4
%180 = load i32, i32* %14
%181 = sext i32 %180 to i64
%182 = getelementptr inbounds i32*, i32** %179, i64 %181
%183 = load i32, i32* %13
%184 = sext i32 %183 to i64
%185 = mul i64 %184, 8
%186 = trunc i64 %185 to i32
%187 = call i32 @memcpy(i32** %178, i32** %182, i32 %186)
br label %199
188: ; preds = %160
%189 = load i32**, i32*** %4
%190 = load i32, i32* %14
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds i32*, i32** %189, i64 %191
%193 = load i32, i32* %6
%194 = load i32, i32* %13
%195 = load i32, i32* %6
%196 = sub nsw i32 %194, %195
%197 = load i32, i32* %6
%198 = call i32 @stable_sqrt_sort_merge_right(i32** %192, i32 %193, i32 %196, i32 %197)
br label %199
199: ; preds = %188, %171
br label %200
200: ; preds = %203, %199
%201 = load i32, i32* %14
%202 = icmp sgt i32 %201, 0
br i1 %202, label %203, label %216
203: ; preds = %200
%204 = load i32, i32* %6
%205 = mul nsw i32 2, %204
%206 = load i32, i32* %14
%207 = sub nsw i32 %206, %205
store i32 %207, i32* %14
%208 = load i32**, i32*** %4
%209 = load i32, i32* %14
%210 = sext i32 %209 to i64
%211 = getelementptr inbounds i32*, i32** %208, i64 %210
%212 = load i32, i32* %6
%213 = load i32, i32* %6
%214 = load i32, i32* %6
%215 = call i32 @stable_sqrt_sort_merge_right(i32** %211, i32 %212, i32 %213, i32 %214)
br label %200
216: ; preds = %200
ret void
}

LLVM IR (-O2):
define void @stable_sqrt_sort_build_blocks(i32** %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %1, 1
br i1 %4, label %5, label %30
5: ; preds = %3
%6 = zext i32 %1 to i64
br label %7
7: ; preds = %5, %7
%8 = phi i64 [ 1, %5 ], [ %28, %7 ]
%9 = add nsw i64 %8, -1
%10 = getelementptr inbounds i32*, i32** %0, i64 %9
%11 = load i32*, i32** %10
%12 = load i32, i32* %11
%13 = getelementptr inbounds i32*, i32** %0, i64 %8
%14 = load i32*, i32** %13
%15 = load i32, i32* %14
%16 = icmp sgt i32 %12, %15
%17 = zext i1 %16 to i64
%18 = add nuw nsw i64 %9, %17
%19 = getelementptr inbounds i32*, i32** %0, i64 %18
%20 = load i32*, i32** %19
%21 = add nsw i64 %8, -3
%22 = getelementptr inbounds i32*, i32** %0, i64 %21
store i32* %20, i32** %22
%23 = sub nsw i64 %8, %17
%24 = getelementptr inbounds i32*, i32** %0, i64 %23
%25 = load i32*, i32** %24
%26 = add nsw i64 %8, -2
%27 = getelementptr inbounds i32*, i32** %0, i64 %26
store i32* %25, i32** %27
%28 = add nuw nsw i64 %8, 2
%29 = icmp ult i64 %28, %6
br i1 %29, label %7, label %30
30: ; preds = %7, %3
%31 = and i32 %1, 1
%32 = icmp eq i32 %31, 0
br i1 %32, label %41, label %33
33: ; preds = %30
%34 = add nsw i32 %1, -1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i32*, i32** %0, i64 %35
%37 = load i32*, i32** %36
%38 = add nsw i32 %1, -3
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i32*, i32** %0, i64 %39
store i32* %37, i32** %40
br label %41
41: ; preds = %33, %30
%42 = getelementptr inbounds i32*, i32** %0, i64 -2
%43 = icmp sgt i32 %2, 2
br i1 %43, label %44, label %199
44: ; preds = %41
%45 = sext i32 %1 to i64
br label %46
46: ; preds = %44, %194
%47 = phi i32** [ %197, %194 ], [ %42, %44 ]
%48 = phi i32 [ %49, %194 ], [ 2, %44 ]
%49 = shl i32 %48, 1
%50 = sub nsw i32 %1, %49
%51 = icmp slt i32 %50, 0
br i1 %51, label %64, label %52
52: ; preds = %46
%53 = sub nsw i32 0, %48
%54 = sext i32 %49 to i64
%55 = zext i32 %50 to i64
br label %56
56: ; preds = %52, %56
%57 = phi i64 [ 0, %52 ], [ %60, %56 ]
%58 = getelementptr inbounds i32*, i32** %47, i64 %57
%59 = tail call i32 @stable_sqrt_sort_merge_left_with_x_buf(i32** %58, i32 %48, i32 %48, i32 %53)
%60 = add i64 %57, %54
%61 = icmp sgt i64 %60, %55
br i1 %61, label %62, label %56
62: ; preds = %56
%63 = trunc i64 %60 to i32
br label %64
64: ; preds = %62, %46
%65 = phi i32 [ 0, %46 ], [ %63, %62 ]
%66 = sub nsw i32 %1, %65
%67 = icmp sgt i32 %66, %48
br i1 %67, label %165, label %68
68: ; preds = %64
%69 = icmp slt i32 %65, %1
br i1 %69, label %70, label %194
70: ; preds = %68
%71 = sext i32 %65 to i64
%72 = sext i32 %48 to i64
%73 = sub nsw i64 %45, %71
%74 = icmp ult i64 %73, 4
br i1 %74, label %145, label %75
75: ; preds = %70
%76 = sub nsw i64 %71, %72
%77 = getelementptr i32*, i32** %47, i64 %76
%78 = getelementptr i32*, i32** %47, i64 %45
%79 = sub nsw i64 0, %72
%80 = getelementptr i32*, i32** %78, i64 %79
%81 = getelementptr i32*, i32** %47, i64 %71
%82 = getelementptr i32*, i32** %47, i64 %45
%83 = icmp ult i32** %77, %82
%84 = icmp ult i32** %81, %80
%85 = and i1 %83, %84
br i1 %85, label %145, label %86
86: ; preds = %75
%87 = and i64 %73, -4
%88 = add nsw i64 %87, %71
%89 = add nsw i64 %87, -4
%90 = lshr exact i64 %89, 2
%91 = add nuw nsw i64 %90, 1
%92 = and i64 %91, 1
%93 = icmp eq i64 %89, 0
br i1 %93, label %127, label %94
94: ; preds = %86
%95 = and i64 %91, 9223372036854775806
br label %96
96: ; preds = %96, %94
%97 = phi i64 [ 0, %94 ], [ %124, %96 ]
%98 = phi i64 [ 0, %94 ], [ %125, %96 ]
%99 = add i64 %97, %71
%100 = getelementptr inbounds i32*, i32** %47, i64 %99
%101 = bitcast i32** %100 to <2 x i32*>*
%102 = load <2 x i32*>, <2 x i32*>* %101
%103 = getelementptr inbounds i32*, i32** %100, i64 2
%104 = bitcast i32** %103 to <2 x i32*>*
%105 = load <2 x i32*>, <2 x i32*>* %104
%106 = sub nsw i64 %99, %72
%107 = getelementptr inbounds i32*, i32** %47, i64 %106
%108 = bitcast i32** %107 to <2 x i32*>*
store <2 x i32*> %102, <2 x i32*>* %108
%109 = getelementptr inbounds i32*, i32** %107, i64 2
%110 = bitcast i32** %109 to <2 x i32*>*
store <2 x i32*> %105, <2 x i32*>* %110
%111 = or i64 %97, 4
%112 = add i64 %111, %71
%113 = getelementptr inbounds i32*, i32** %47, i64 %112
%114 = bitcast i32** %113 to <2 x i32*>*
%115 = load <2 x i32*>, <2 x i32*>* %114
%116 = getelementptr inbounds i32*, i32** %113, i64 2
%117 = bitcast i32** %116 to <2 x i32*>*
%118 = load <2 x i32*>, <2 x i32*>* %117
%119 = sub nsw i64 %112, %72
%120 = getelementptr inbounds i32*, i32** %47, i64 %119
%121 = bitcast i32** %120 to <2 x i32*>*
store <2 x i32*> %115, <2 x i32*>* %121
%122 = getelementptr inbounds i32*, i32** %120, i64 2
%123 = bitcast i32** %122 to <2 x i32*>*
store <2 x i32*> %118, <2 x i32*>* %123
%124 = add nuw i64 %97, 8
%125 = add i64 %98, 2
%126 = icmp eq i64 %125, %95
br i1 %126, label %127, label %96
127: ; preds = %96, %86
%128 = phi i64 [ 0, %86 ], [ %124, %96 ]
%129 = icmp eq i64 %92, 0
br i1 %129, label %143, label %130
130: ; preds = %127
%131 = add i64 %128, %71
%132 = getelementptr inbounds i32*, i32** %47, i64 %131
%133 = bitcast i32** %132 to <2 x i32*>*
%134 = load <2 x i32*>, <2 x i32*>* %133
%135 = getelementptr inbounds i32*, i32** %132, i64 2
%136 = bitcast i32** %135 to <2 x i32*>*
%137 = load <2 x i32*>, <2 x i32*>* %136
%138 = sub nsw i64 %131, %72
%139 = getelementptr inbounds i32*, i32** %47, i64 %138
%140 = bitcast i32** %139 to <2 x i32*>*
store <2 x i32*> %134, <2 x i32*>* %140
%141 = getelementptr inbounds i32*, i32** %139, i64 2
%142 = bitcast i32** %141 to <2 x i32*>*
store <2 x i32*> %137, <2 x i32*>* %142
br label %143
143: ; preds = %127, %130
%144 = icmp eq i64 %73, %87
br i1 %144, label %194, label %145
145: ; preds = %75, %70, %143
%146 = phi i64 [ %71, %75 ], [ %71, %70 ], [ %88, %143 ]
%147 = sub nsw i64 %45, %146
%148 = xor i64 %146, -1
%149 = add nsw i64 %148, %45
%150 = and i64 %147, 3
%151 = icmp eq i64 %150, 0
br i1 %151, label %162, label %152
152: ; preds = %145, %152
%153 = phi i64 [ %159, %152 ], [ %146, %145 ]
%154 = phi i64 [ %160, %152 ], [ 0, %145 ]
%155 = getelementptr inbounds i32*, i32** %47, i64 %153
%156 = load i32*, i32** %155
%157 = sub nsw i64 %153, %72
%158 = getelementptr inbounds i32*, i32** %47, i64 %157
store i32* %156, i32** %158
%159 = add nsw i64 %153, 1
%160 = add i64 %154, 1
%161 = icmp eq i64 %160, %150
br i1 %161, label %162, label %152
162: ; preds = %152, %145
%163 = phi i64 [ %146, %145 ], [ %159, %152 ]
%164 = icmp ult i64 %149, 3
br i1 %164, label %194, label %171
165: ; preds = %64
%166 = sext i32 %65 to i64
%167 = getelementptr inbounds i32*, i32** %47, i64 %166
%168 = sub nsw i32 %66, %48
%169 = sub nsw i32 0, %48
%170 = tail call i32 @stable_sqrt_sort_merge_left_with_x_buf(i32** %167, i32 %48, i32 %168, i32 %169)
br label %194
171: ; preds = %162, %171
%172 = phi i64 [ %192, %171 ], [ %163, %162 ]
%173 = getelementptr inbounds i32*, i32** %47, i64 %172
%174 = load i32*, i32** %173
%175 = sub nsw i64 %172, %72
%176 = getelementptr inbounds i32*, i32** %47, i64 %175
store i32* %174, i32** %176
%177 = add nsw i64 %172, 1
%178 = getelementptr inbounds i32*, i32** %47, i64 %177
%179 = load i32*, i32** %178
%180 = sub nsw i64 %177, %72
%181 = getelementptr inbounds i32*, i32** %47, i64 %180
store i32* %179, i32** %181
%182 = add nsw i64 %172, 2
%183 = getelementptr inbounds i32*, i32** %47, i64 %182
%184 = load i32*, i32** %183
%185 = sub nsw i64 %182, %72
%186 = getelementptr inbounds i32*, i32** %47, i64 %185
store i32* %184, i32** %186
%187 = add nsw i64 %172, 3
%188 = getelementptr inbounds i32*, i32** %47, i64 %187
%189 = load i32*, i32** %188
%190 = sub nsw i64 %187, %72
%191 = getelementptr inbounds i32*, i32** %47, i64 %190
store i32* %189, i32** %191
%192 = add nsw i64 %172, 4
%193 = icmp eq i64 %192, %45
br i1 %193, label %194, label %171
194: ; preds = %162, %171, %143, %68, %165
%195 = sext i32 %48 to i64
%196 = sub nsw i64 0, %195
%197 = getelementptr inbounds i32*, i32** %47, i64 %196
%198 = icmp slt i32 %49, %2
br i1 %198, label %46, label %199
199: ; preds = %194, %41
%200 = phi i32** [ %42, %41 ], [ %197, %194 ]
%201 = shl nsw i32 %2, 1
%202 = srem i32 %1, %201
%203 = sub nsw i32 %1, %202
%204 = icmp sgt i32 %202, %2
%205 = sext i32 %203 to i64
%206 = getelementptr inbounds i32*, i32** %200, i64 %205
br i1 %204, label %212, label %207
207: ; preds = %199
%208 = sext i32 %2 to i64
%209 = getelementptr inbounds i32*, i32** %206, i64 %208
%210 = shl i32 %202, 3
%211 = tail call i32 @memcpy(i32** %209, i32** %206, i32 %210)
br label %215
212: ; preds = %199
%213 = sub nsw i32 %202, %2
%214 = tail call i32 @stable_sqrt_sort_merge_right(i32** %206, i32 %2, i32 %213, i32 %2)
br label %215
215: ; preds = %212, %207
%216 = icmp sgt i32 %203, 0
br i1 %216, label %217, label %224
217: ; preds = %215, %217
%218 = phi i32 [ %219, %217 ], [ %203, %215 ]
%219 = sub nsw i32 %218, %201
%220 = sext i32 %219 to i64
%221 = getelementptr inbounds i32*, i32** %200, i64 %220
%222 = tail call i32 @stable_sqrt_sort_merge_right(i32** %221, i32 %2, i32 %2, i32 %2)
%223 = icmp sgt i32 %219, 0
br i1 %223, label %217, label %224
224: ; preds = %217, %215
ret void
}