#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*/ ss_blockswap(int *, int *, int);
int ss_compare(unsigned char const *, int const *, int const *, int);
void ss_mergeforward(const unsigned char *T, const int *PA, int *first,
                     int *middle, int *last, int *buf, int depth) {
  int *a, *b, *c, *bufend;
  int t;
  int r;
  bufend = buf + (middle - first) - 1;
  ss_blockswap(buf, first, middle - first);
  for (t = *(a = first), b = buf, c = middle;;) {
    r = ss_compare(T, PA + *b, PA + *c, depth);
    if (r < 0) {
      do {
        *a++ = *b;
        if (bufend <= b) {
          *bufend = t;
          return;
        }
        *b++ = *a;
      } while (*b < 0);
    } else if (r > 0) {
      do {
        *a++ = *c, *c++ = *a;
        if (last <= c) {
          while (b < bufend) {
            *a++ = *b, *b++ = *a;
          }
          *a = *b, *b = t;
          return;
        }
      } while (*c < 0);
    } else {
      *c = ~*c;
      do {
        *a++ = *b;
        if (bufend <= b) {
          *bufend = t;
          return;
        }
        *b++ = *a;
      } while (*b < 0);
      do {
        *a++ = *c, *c++ = *a;
        if (last <= c) {
          while (b < bufend) {
            *a++ = *b, *b++ = *a;
          }
          *a = *b, *b = t;
          return;
        }
      } while (*c < 0);
    }
  }
}


x86 assembly (clang, -O0):
<ss_mergeforward>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    %rdx,%rcx
sar    $0x2,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
add    $0xfffffffffffffffc,%rax
mov    %rax,-0x50(%rbp)
mov    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    %rcx,%rax
sar    $0x2,%rax
mov    %eax,%edx
call   1040 <ss_blockswap@plt>
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    (%rax),%eax
mov    %eax,-0x54(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x40(%rbp),%rax
movslq (%rax),%rax
shl    $0x2,%rax
add    %rax,%rsi
mov    -0x10(%rbp),%rdx
mov    -0x48(%rbp),%rax
movslq (%rax),%rax
shl    $0x2,%rax
add    %rax,%rdx
mov    0x10(%rbp),%ecx
call   1030 <ss_compare@plt>
mov    %eax,-0x58(%rbp)
cmpl   $0x0,-0x58(%rbp)
jge    123e <ss_mergeforward+0x11e>
jmp    11e2 <ss_mergeforward+0xc2>
mov    -0x40(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x50(%rbp),%rax
cmp    -0x40(%rbp),%rax
ja     1215 <ss_mergeforward+0xf5>
mov    -0x54(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
jmp    1428 <ss_mergeforward+0x308>
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x40(%rbp)
mov    %ecx,(%rax)
mov    -0x40(%rbp),%rax
cmpl   $0x0,(%rax)
jl     11e2 <ss_mergeforward+0xc2>
jmp    1423 <ss_mergeforward+0x303>
cmpl   $0x0,-0x58(%rbp)
jle    1300 <ss_mergeforward+0x1e0>
jmp    124d <ss_mergeforward+0x12d>
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x48(%rbp)
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
cmp    -0x48(%rbp),%rax
ja     12e9 <ss_mergeforward+0x1c9>
jmp    128e <ss_mergeforward+0x16e>
mov    -0x40(%rbp),%rax
cmp    -0x50(%rbp),%rax
jae    12cf <ss_mergeforward+0x1af>
mov    -0x40(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x40(%rbp)
mov    %ecx,(%rax)
jmp    128e <ss_mergeforward+0x16e>
mov    -0x40(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x54(%rbp),%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
jmp    1428 <ss_mergeforward+0x308>
jmp    12ee <ss_mergeforward+0x1ce>
mov    -0x48(%rbp),%rax
cmpl   $0x0,(%rax)
jl     124d <ss_mergeforward+0x12d>
jmp    141e <ss_mergeforward+0x2fe>
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
xor    $0xffffffff,%ecx
mov    -0x48(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x40(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x50(%rbp),%rax
cmp    -0x40(%rbp),%rax
ja     1342 <ss_mergeforward+0x222>
mov    -0x54(%rbp),%ecx
mov    -0x50(%rbp),%rax
mov    %ecx,(%rax)
jmp    1428 <ss_mergeforward+0x308>
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x40(%rbp)
mov    %ecx,(%rax)
mov    -0x40(%rbp),%rax
cmpl   $0x0,(%rax)
jl     130f <ss_mergeforward+0x1ef>
jmp    136b <ss_mergeforward+0x24b>
mov    -0x48(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x48(%rbp)
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
cmp    -0x48(%rbp),%rax
ja     1407 <ss_mergeforward+0x2e7>
jmp    13ac <ss_mergeforward+0x28c>
mov    -0x40(%rbp),%rax
cmp    -0x50(%rbp),%rax
jae    13ed <ss_mergeforward+0x2cd>
mov    -0x40(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x40(%rbp)
mov    %ecx,(%rax)
jmp    13ac <ss_mergeforward+0x28c>
mov    -0x40(%rbp),%rax
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x54(%rbp),%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
jmp    1428 <ss_mergeforward+0x308>
jmp    140c <ss_mergeforward+0x2ec>
mov    -0x48(%rbp),%rax
cmpl   $0x0,(%rax)
jl     136b <ss_mergeforward+0x24b>
jmp    141e <ss_mergeforward+0x2fe>
jmp    1423 <ss_mergeforward+0x303>
jmp    11a0 <ss_mergeforward+0x80>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ss_mergeforward>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r9,%rbx
mov    %r8,0x10(%rsp)
mov    %rcx,%r15
mov    %rdx,%rbp
mov    %rsi,%r12
mov    %rdi,%r13
mov    %rcx,%rdx
sub    %rbp,%rdx
lea    (%r9,%rdx,1),%r14
add    $0xfffffffffffffffc,%r14
shr    $0x2,%rdx
mov    %r9,%rdi
mov    %rbp,%rsi
call   1040 <ss_blockswap@plt>
mov    0x0(%rbp),%eax
mov    %eax,0xc(%rsp)
movslq (%rbx),%rax
lea    (%r12,%rax,4),%rsi
movslq (%r15),%rax
lea    (%r12,%rax,4),%rdx
mov    %r13,%rdi
mov    0x50(%rsp),%ecx
call   1030 <ss_compare@plt>
test   %eax,%eax
jns    11b5 <ss_mergeforward+0x95>
mov    (%rbx),%ecx
mov    %rbx,%rax
nopl   0x0(%rax)
mov    %ecx,0x0(%rbp)
cmp    %rax,%r14
jbe    12cb <ss_mergeforward+0x1ab>
mov    0x4(%rbp),%ecx
add    $0x4,%rbp
lea    0x4(%rax),%rbx
mov    %ecx,(%rax)
mov    0x4(%rax),%ecx
mov    %rbx,%rax
test   %ecx,%ecx
js     1190 <ss_mergeforward+0x70>
jmp    1166 <ss_mergeforward+0x46>
mov    (%r15),%eax
je     11ff <ss_mergeforward+0xdf>
add    $0x4,%r15
add    $0x4,%rbp
mov    0x10(%rsp),%rcx
nopw   0x0(%rax,%rax,1)
mov    %eax,-0x4(%rbp)
mov    0x0(%rbp),%eax
mov    %eax,-0x4(%r15)
cmp    %rcx,%r15
jae    1273 <ss_mergeforward+0x153>
mov    (%r15),%eax
add    $0x4,%r15
add    $0x4,%rbp
test   %eax,%eax
js     11d0 <ss_mergeforward+0xb0>
add    $0xfffffffffffffffc,%r15
add    $0xfffffffffffffffc,%rbp
jmp    1166 <ss_mergeforward+0x46>
not    %eax
mov    %eax,(%r15)
mov    (%rbx),%ecx
lea    0x8(%rbp),%rsi
mov    %rbx,%rdx
nopl   (%rax)
mov    %ecx,0x0(%rbp)
cmp    %rdx,%r14
jbe    12cb <ss_mergeforward+0x1ab>
mov    %rsi,%rax
mov    0x4(%rbp),%ecx
add    $0x4,%rbp
lea    0x4(%rdx),%rbx
mov    %ecx,(%rdx)
mov    0x4(%rdx),%ecx
add    $0x4,%rsi
mov    %rbx,%rdx
test   %ecx,%ecx
js     1210 <ss_mergeforward+0xf0>
mov    (%r15),%ecx
add    $0x4,%r15
mov    0x10(%rsp),%rdx
mov    %ecx,-0x4(%rax)
mov    (%rax),%ecx
mov    %ecx,-0x4(%r15)
cmp    %rdx,%r15
jae    12a1 <ss_mergeforward+0x181>
mov    (%r15),%ecx
add    $0x4,%r15
add    $0x4,%rax
test   %ecx,%ecx
js     1246 <ss_mergeforward+0x126>
add    $0xfffffffffffffffc,%r15
add    $0xfffffffffffffffc,%rax
mov    %rax,%rbp
jmp    1166 <ss_mergeforward+0x46>
cmp    %r14,%rbx
jae    129c <ss_mergeforward+0x17c>
nopl   0x0(%rax,%rax,1)
mov    (%rbx),%eax
lea    0x4(%rbp),%rcx
mov    %eax,0x0(%rbp)
mov    0x4(%rbp),%eax
mov    %eax,(%rbx)
add    $0x4,%rbx
mov    %rcx,%rbp
cmp    %r14,%rbx
jb     1280 <ss_mergeforward+0x160>
jmp    12c4 <ss_mergeforward+0x1a4>
mov    %rbp,%rcx
jmp    12c4 <ss_mergeforward+0x1a4>
cmp    %r14,%rbx
jae    12c1 <ss_mergeforward+0x1a1>
mov    (%rbx),%edx
lea    0x4(%rax),%rcx
mov    %edx,(%rax)
mov    0x4(%rax),%eax
mov    %eax,(%rbx)
add    $0x4,%rbx
mov    %rcx,%rax
cmp    %r14,%rbx
jb     12a6 <ss_mergeforward+0x186>
jmp    12c4 <ss_mergeforward+0x1a4>
mov    %rax,%rcx
mov    (%rbx),%eax
mov    %eax,(%rcx)
mov    %rbx,%r14
mov    0xc(%rsp),%eax
mov    %eax,(%r14)
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @ss_mergeforward(i8* %0, i32* %1, i32* %2, i32* %3, i32* readnone %4, i32* %5, i32 %6) {
%8 = ptrtoint i32* %3 to i64
%9 = ptrtoint i32* %2 to i64
%10 = sub i64 %8, %9
%11 = ashr exact i64 %10, 2
%12 = getelementptr inbounds i32, i32* %5, i64 %11
%13 = getelementptr inbounds i32, i32* %12, i64 -1
%14 = trunc i64 %11 to i32
%15 = tail call i32 @ss_blockswap(i32* %5, i32* %2, i32 %14)
%16 = load i32, i32* %2
br label %21
17: ; preds = %70, %107
%18 = phi i32* [ %95, %107 ], [ %58, %70 ]
%19 = phi i32* [ %84, %107 ], [ %26, %70 ]
%20 = phi i32* [ %93, %107 ], [ %56, %70 ]
br label %21
21: ; preds = %17, %7
%22 = phi i32* [ %3, %7 ], [ %18, %17 ]
%23 = phi i32* [ %5, %7 ], [ %19, %17 ]
%24 = phi i32* [ %2, %7 ], [ %20, %17 ]
br label %25
25: ; preds = %44, %21
%26 = phi i32* [ %23, %21 ], [ %46, %44 ]
%27 = phi i32* [ %24, %21 ], [ %42, %44 ]
%28 = load i32, i32* %26
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i32, i32* %1, i64 %29
%31 = load i32, i32* %22
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i32, i32* %1, i64 %32
%34 = tail call i32 @ss_compare(i8* %0, i32* %30, i32* %33, i32 %6)
%35 = icmp slt i32 %34, 0
br i1 %35, label %36, label %49
36: ; preds = %25
%37 = load i32, i32* %26
br label %38
38: ; preds = %36, %44
%39 = phi i32 [ %47, %44 ], [ %37, %36 ]
%40 = phi i32* [ %46, %44 ], [ %26, %36 ]
%41 = phi i32* [ %42, %44 ], [ %27, %36 ]
%42 = getelementptr inbounds i32, i32* %41, i64 1
store i32 %39, i32* %41
%43 = icmp ugt i32* %13, %40
br i1 %43, label %44, label %114
44: ; preds = %38
%45 = load i32, i32* %42
%46 = getelementptr inbounds i32, i32* %40, i64 1
store i32 %45, i32* %40
%47 = load i32, i32* %46
%48 = icmp slt i32 %47, 0
br i1 %48, label %38, label %25
49: ; preds = %25
%50 = icmp eq i32 %34, 0
%51 = load i32, i32* %22
br i1 %50, label %73, label %52
52: ; preds = %49, %70
%53 = phi i32 [ %71, %70 ], [ %51, %49 ]
%54 = phi i32* [ %58, %70 ], [ %22, %49 ]
%55 = phi i32* [ %56, %70 ], [ %27, %49 ]
%56 = getelementptr inbounds i32, i32* %55, i64 1
store i32 %53, i32* %55
%57 = load i32, i32* %56
%58 = getelementptr inbounds i32, i32* %54, i64 1
store i32 %57, i32* %54
%59 = icmp ult i32* %58, %4
br i1 %59, label %70, label %60
60: ; preds = %52
%61 = icmp ult i32* %26, %13
br i1 %61, label %62, label %110
62: ; preds = %60, %62
%63 = phi i32* [ %66, %62 ], [ %56, %60 ]
%64 = phi i32* [ %68, %62 ], [ %26, %60 ]
%65 = load i32, i32* %64
%66 = getelementptr inbounds i32, i32* %63, i64 1
store i32 %65, i32* %63
%67 = load i32, i32* %66
%68 = getelementptr inbounds i32, i32* %64, i64 1
store i32 %67, i32* %64
%69 = icmp ult i32* %68, %13
br i1 %69, label %62, label %110
70: ; preds = %52
%71 = load i32, i32* %58
%72 = icmp slt i32 %71, 0
br i1 %72, label %52, label %17
73: ; preds = %49
%74 = xor i32 %51, -1
store i32 %74, i32* %22
%75 = load i32, i32* %26
br label %76
76: ; preds = %82, %73
%77 = phi i32 [ %75, %73 ], [ %85, %82 ]
%78 = phi i32* [ %26, %73 ], [ %84, %82 ]
%79 = phi i32* [ %27, %73 ], [ %80, %82 ]
%80 = getelementptr inbounds i32, i32* %79, i64 1
store i32 %77, i32* %79
%81 = icmp ugt i32* %13, %78
br i1 %81, label %82, label %114
82: ; preds = %76
%83 = load i32, i32* %80
%84 = getelementptr inbounds i32, i32* %78, i64 1
store i32 %83, i32* %78
%85 = load i32, i32* %84
%86 = icmp slt i32 %85, 0
br i1 %86, label %76, label %87
87: ; preds = %82
%88 = load i32, i32* %22
br label %89
89: ; preds = %87, %107
%90 = phi i32 [ %108, %107 ], [ %88, %87 ]
%91 = phi i32* [ %95, %107 ], [ %22, %87 ]
%92 = phi i32* [ %93, %107 ], [ %80, %87 ]
%93 = getelementptr inbounds i32, i32* %92, i64 1
store i32 %90, i32* %92
%94 = load i32, i32* %93
%95 = getelementptr inbounds i32, i32* %91, i64 1
store i32 %94, i32* %91
%96 = icmp ult i32* %95, %4
br i1 %96, label %107, label %97
97: ; preds = %89
%98 = icmp ult i32* %84, %13
br i1 %98, label %99, label %110
99: ; preds = %97, %99
%100 = phi i32* [ %103, %99 ], [ %93, %97 ]
%101 = phi i32* [ %105, %99 ], [ %84, %97 ]
%102 = load i32, i32* %101
%103 = getelementptr inbounds i32, i32* %100, i64 1
store i32 %102, i32* %100
%104 = load i32, i32* %103
%105 = getelementptr inbounds i32, i32* %101, i64 1
store i32 %104, i32* %101
%106 = icmp ult i32* %105, %13
br i1 %106, label %99, label %110
107: ; preds = %89
%108 = load i32, i32* %95
%109 = icmp slt i32 %108, 0
br i1 %109, label %89, label %17
110: ; preds = %62, %99, %97, %60
%111 = phi i32* [ %26, %60 ], [ %84, %97 ], [ %105, %99 ], [ %68, %62 ]
%112 = phi i32* [ %56, %60 ], [ %93, %97 ], [ %103, %99 ], [ %66, %62 ]
%113 = load i32, i32* %111
store i32 %113, i32* %112
br label %114
114: ; preds = %76, %38, %110
%115 = phi i32* [ %111, %110 ], [ %13, %38 ], [ %13, %76 ]
store i32 %16, i32* %115
ret void
}