void getbigcells(int *ptn, int level, int minsize, int *bigcells,
                 int *cellstart, int *cellsize, int n) {
  int cell1, cell2, j;
  int si, st;
  int bc, i, h;
  bc = 0;
  for (cell1 = 0; cell1 < n; cell1 = cell2 + 1) {
    for (cell2 = cell1; ptn[cell2] > level; ++cell2) {
    }
    if (cell2 >= cell1 + minsize - 1) {
      cellstart[bc] = cell1;
      cellsize[bc] = cell2 - cell1 + 1;
      ++bc;
    }
  }
  *bigcells = bc;
  j = bc / 3;
  h = 1;
  do
    h = 3 * h + 1;
  while (h < j);
  do {
    for (i = h; i < bc; ++i) {
      st = cellstart[i];
      si = cellsize[i];
      for (j = i; cellsize[j - h] > si ||
                  (cellsize[j - h] == si && cellstart[j - h] > st);) {
        cellsize[j] = cellsize[j - h];
        cellstart[j] = cellstart[j - h];
        if ((j -= h) < h)
          break;
      }
      cellsize[j] = si;
      cellstart[j] = st;
    }
    h /= 3;
  } while (h > 0);
}


x86 assembly (clang, -O0):
<getbigcells>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    11b6 <getbigcells+0xb6>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0xc(%rbp),%eax
jle    1164 <getbigcells+0x64>
jmp    1156 <getbigcells+0x56>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    113d <getbigcells+0x3d>
mov    -0x30(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    -0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jl     11a3 <getbigcells+0xa3>
mov    -0x2c(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%edx
sub    -0x2c(%rbp),%edx
add    $0x1,%edx
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    11a8 <getbigcells+0xa8>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    112b <getbigcells+0x2b>
mov    -0x40(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x40(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
mov    %eax,-0x34(%rbp)
movl   $0x1,-0x48(%rbp)
imul   $0x3,-0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x34(%rbp),%eax
jl     11d4 <getbigcells+0xd4>
jmp    11ef <getbigcells+0xef>
mov    -0x48(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    130c <getbigcells+0x20c>
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x44(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    $0x1,%al
cmp    -0x38(%rbp),%ecx
mov    %al,-0x49(%rbp)
jg     127e <getbigcells+0x17e>
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
xor    %eax,%eax
cmp    -0x38(%rbp),%ecx
mov    %al,-0x4a(%rbp)
jne    1278 <getbigcells+0x178>
mov    -0x20(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x3c(%rbp),%eax
setg   %al
mov    %al,-0x4a(%rbp)
mov    -0x4a(%rbp),%al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    128e <getbigcells+0x18e>
jmp    12e2 <getbigcells+0x1e2>
mov    -0x28(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    -0x48(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x48(%rbp),%ecx
mov    -0x34(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x34(%rbp)
cmp    -0x48(%rbp),%eax
jge    12dd <getbigcells+0x1dd>
jmp    12e2 <getbigcells+0x1e2>
jmp    1223 <getbigcells+0x123>
mov    -0x38(%rbp),%edx
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x3c(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11f5 <getbigcells+0xf5>
mov    -0x48(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
mov    %eax,-0x48(%rbp)
cmpl   $0x0,-0x48(%rbp)
jg     11ef <getbigcells+0xef>
pop    %rbp
ret

x86 assembly (clang, -O2):
<getbigcells>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    0x30(%rsp),%r11d
test   %r11d,%r11d
jle    116e <getbigcells+0x6e>
add    $0xffffffff,%edx
xor    %r10d,%r10d
xor    %ebx,%ebx
jmp    1125 <getbigcells+0x25>
nopl   0x0(%rax)
cmp    %r11d,%ebx
jge    1171 <getbigcells+0x71>
mov    %ebx,%r14d
movslq %ebx,%rax
lea    (%rdi,%rax,4),%r15
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %rbp,%rax
add    $0x1,%ebx
add    $0x1,%rbp
cmp    %esi,(%r15,%rax,4)
jg     1140 <getbigcells+0x40>
lea    -0x1(%rbx),%r15d
lea    (%rdx,%r14,1),%eax
cmp    %r15d,%eax
jg     1120 <getbigcells+0x20>
movslq %r10d,%r10
mov    %r14d,(%r8,%r10,4)
mov    %ebp,(%r9,%r10,4)
add    $0x1,%r10d
jmp    1120 <getbigcells+0x20>
xor    %r10d,%r10d
mov    %r10d,(%rcx)
movslq %r10d,%r14
imul   $0x55555556,%r14,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x20,%rax
add    %ecx,%eax
mov    $0x1,%edx
lea    (%rdx,%rdx,2),%edx
add    $0x1,%edx
cmp    %eax,%edx
jl     1190 <getbigcells+0x90>
jmp    11bb <getbigcells+0xbb>
nopl   0x0(%rax)
imul   $0x55555556,%r11,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x20,%rax
add    %ecx,%eax
cmp    $0x2,%edx
mov    %eax,%edx
jle    1234 <getbigcells+0x134>
movslq %edx,%r11
cmp    %r10d,%edx
jge    11a0 <getbigcells+0xa0>
xor    %r15d,%r15d
mov    %r11,%r12
jmp    11ec <getbigcells+0xec>
nopl   0x0(%rax,%rax,1)
add    %edx,%ecx
mov    %ecx,%edi
movslq %edi,%rcx
mov    %ebx,(%r9,%rcx,4)
mov    %eax,(%r8,%rcx,4)
add    $0x1,%r12
add    $0x1,%r15d
cmp    %r14,%r12
je     11a0 <getbigcells+0xa0>
mov    (%r8,%r12,4),%eax
mov    (%r9,%r12,4),%ebx
mov    %r15d,%ecx
mov    %r12d,%ebp
jmp    1215 <getbigcells+0x115>
nopl   0x0(%rax)
sub    %edx,%ebp
movslq %edi,%rdi
mov    %esi,(%r9,%rdi,4)
mov    (%r8,%rcx,4),%esi
mov    %esi,(%r8,%rdi,4)
sub    %edx,%ecx
jl     11d0 <getbigcells+0xd0>
lea    (%rdx,%rcx,1),%edi
movslq %ecx,%rcx
mov    (%r9,%rcx,4),%esi
cmp    %ebx,%esi
jg     1200 <getbigcells+0x100>
jne    1230 <getbigcells+0x130>
cmp    %eax,(%r8,%rcx,4)
jg     1200 <getbigcells+0x100>
jmp    11d4 <getbigcells+0xd4>
nopl   (%rax)
mov    %ebp,%edi
jmp    11d4 <getbigcells+0xd4>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @getbigcells(i32* nocapture %0, i32 %1, i32 %2, i32* nocapture writeonly %3, i32* nocapture %4, i32* nocapture %5, i32 %6) {
%8 = icmp sgt i32 %6, 0
br i1 %8, label %9, label %38
9: ; preds = %7
%10 = add i32 %2, -1
br label %11
11: ; preds = %9, %34
%12 = phi i32 [ 0, %9 ], [ %36, %34 ]
%13 = phi i32 [ 0, %9 ], [ %35, %34 ]
%14 = sext i32 %13 to i64
br label %15
15: ; preds = %15, %11
%16 = phi i64 [ %20, %15 ], [ %14, %11 ]
%17 = getelementptr inbounds i32, i32* %0, i64 %16
%18 = load i32, i32* %17
%19 = icmp sgt i32 %18, %1
%20 = add i64 %16, 1
br i1 %19, label %15, label %21
21: ; preds = %15
%22 = trunc i64 %16 to i32
%23 = add i32 %10, %13
%24 = icmp sgt i32 %23, %22
br i1 %24, label %25, label %27
25: ; preds = %21
%26 = add nsw i32 %22, 1
br label %34
27: ; preds = %21
%28 = sext i32 %12 to i64
%29 = getelementptr inbounds i32, i32* %4, i64 %28
store i32 %13, i32* %29
%30 = add i32 %22, 1
%31 = sub i32 %30, %13
%32 = getelementptr inbounds i32, i32* %5, i64 %28
store i32 %31, i32* %32
%33 = add nsw i32 %12, 1
br label %34
34: ; preds = %25, %27
%35 = phi i32 [ %26, %25 ], [ %30, %27 ]
%36 = phi i32 [ %12, %25 ], [ %33, %27 ]
%37 = icmp slt i32 %35, %6
br i1 %37, label %11, label %38
38: ; preds = %34, %7
%39 = phi i32 [ 0, %7 ], [ %36, %34 ]
store i32 %39, i32* %3
%40 = sdiv i32 %39, 3
br label %41
41: ; preds = %41, %38
%42 = phi i32 [ 1, %38 ], [ %44, %41 ]
%43 = mul nsw i32 %42, 3
%44 = add nsw i32 %43, 1
%45 = icmp slt i32 %44, %40
br i1 %45, label %41, label %46
46: ; preds = %41
%47 = sext i32 %39 to i64
br label %48
48: ; preds = %46, %87
%49 = phi i32 [ %88, %87 ], [ %44, %46 ]
%50 = icmp slt i32 %49, %39
br i1 %50, label %51, label %87
51: ; preds = %48
%52 = sext i32 %49 to i64
br label %53
53: ; preds = %51, %80
%54 = phi i64 [ %52, %51 ], [ %85, %80 ]
%55 = getelementptr inbounds i32, i32* %4, i64 %54
%56 = load i32, i32* %55
%57 = getelementptr inbounds i32, i32* %5, i64 %54
%58 = load i32, i32* %57
%59 = trunc i64 %54 to i32
br label %60
60: ; preds = %73, %53
%61 = phi i32 [ %59, %53 ], [ %62, %73 ]
%62 = sub nsw i32 %61, %49
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds i32, i32* %5, i64 %63
%65 = load i32, i32* %64
%66 = icmp sgt i32 %65, %58
br i1 %66, label %73, label %67
67: ; preds = %60
%68 = icmp eq i32 %65, %58
br i1 %68, label %69, label %80
69: ; preds = %67
%70 = getelementptr inbounds i32, i32* %4, i64 %63
%71 = load i32, i32* %70
%72 = icmp sgt i32 %71, %56
br i1 %72, label %73, label %80
73: ; preds = %60, %69
%74 = sext i32 %61 to i64
%75 = getelementptr inbounds i32, i32* %5, i64 %74
store i32 %65, i32* %75
%76 = getelementptr inbounds i32, i32* %4, i64 %63
%77 = load i32, i32* %76
%78 = getelementptr inbounds i32, i32* %4, i64 %74
store i32 %77, i32* %78
%79 = icmp slt i32 %62, %49
br i1 %79, label %80, label %60
80: ; preds = %67, %73, %69
%81 = phi i32 [ %62, %73 ], [ %61, %69 ], [ %61, %67 ]
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i32, i32* %5, i64 %82
store i32 %58, i32* %83
%84 = getelementptr inbounds i32, i32* %4, i64 %82
store i32 %56, i32* %84
%85 = add nsw i64 %54, 1
%86 = icmp eq i64 %85, %47
br i1 %86, label %87, label %53
87: ; preds = %80, %48
%88 = sdiv i32 %49, 3
%89 = icmp sgt i32 %49, 2
br i1 %89, label %48, label %90
90: ; preds = %87
ret void
}