#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 */
typedef size_t uint8_t;
typedef int uint64_t;

/* Variables and functions */
int /*<<< orphan*/ free(int *);
int *xmalloc(int);
void hist_omp2(uint8_t *pixels, int height, int width) {
  uint64_t npixels = height * width;
  int *h = xmalloc(sizeof(*h) * 256);
  for (int i = 0; i < 256; i++)
    h[i] = 0;
  int mini = 256, maxi = -1;
#pragma omp parallel
  {
    int *hloc = xmalloc(sizeof(*hloc) * 256);
    for (int i = 0; i < 256; i++)
      hloc[i] = 0;
#pragma omp for nowait
    for (int i = 0; i < npixels; i++)
      hloc[pixels[i]]++;
    int mini_loc, maxi_loc;
    for (mini_loc = 0; mini_loc < 256 && hloc[mini_loc] == 0; mini_loc++)
      ;
    for (maxi_loc = 255; maxi_loc >= 0 && hloc[maxi_loc] == 0; maxi_loc--)
      ;
#pragma omp critical
    {
      if (mini > mini_loc)
        mini = mini_loc;
      if (maxi < maxi_loc)
        maxi = maxi_loc;
    }
    int q = 255 / (maxi - mini);
#pragma omp for
    for (int i = 0; i < npixels; i++)
      pixels[i] = (pixels[i] - mini) * q;
    free(hloc);
  }
  free(h);
}


x86 assembly (clang, -O0):
<hist_omp2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    $0x400,%edi
call   1040 <xmalloc@plt>
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x100,-0x24(%rbp)
jge    117b <hist_omp2+0x5b>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1151 <hist_omp2+0x31>
movl   $0x100,-0x28(%rbp)
movl   $0xffffffff,-0x2c(%rbp)
mov    $0x400,%edi
call   1040 <xmalloc@plt>
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    11c8 <hist_omp2+0xa8>
mov    -0x38(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    119e <hist_omp2+0x7e>
movl   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1202 <hist_omp2+0xe2>
mov    -0x38(%rbp),%rax
mov    -0x8(%rbp),%rcx
movslq -0x40(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    11cf <hist_omp2+0xaf>
movl   $0x0,-0x44(%rbp)
xor    %eax,%eax
cmpl   $0x100,-0x44(%rbp)
mov    %al,-0x51(%rbp)
jge    122d <hist_omp2+0x10d>
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
sete   %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    123d <hist_omp2+0x11d>
jmp    1250 <hist_omp2+0x130>
jmp    1242 <hist_omp2+0x122>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1209 <hist_omp2+0xe9>
movl   $0xff,-0x48(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x48(%rbp)
mov    %al,-0x52(%rbp)
jl     1278 <hist_omp2+0x158>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
sete   %al
mov    %al,-0x52(%rbp)
mov    -0x52(%rbp),%al
test   $0x1,%al
jne    1288 <hist_omp2+0x168>
jmp    129b <hist_omp2+0x17b>
jmp    128d <hist_omp2+0x16d>
mov    -0x48(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x48(%rbp)
jmp    1257 <hist_omp2+0x137>
mov    -0x28(%rbp),%eax
cmp    -0x44(%rbp),%eax
jle    12ad <hist_omp2+0x18d>
mov    -0x44(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    12bf <hist_omp2+0x19f>
mov    -0x48(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
sub    -0x28(%rbp),%ecx
mov    $0xff,%eax
cltd
idiv   %ecx
mov    %eax,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1318 <hist_omp2+0x1f8>
mov    -0x8(%rbp),%rax
movslq -0x50(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
movslq -0x28(%rbp),%rax
sub    %rax,%rdx
movslq -0x4c(%rbp),%rax
imul   %rax,%rdx
mov    -0x8(%rbp),%rax
movslq -0x50(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    12d7 <hist_omp2+0x1b7>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x20(%rbp),%rdi
call   1030 <free@plt>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hist_omp2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %edx,%r13d
mov    %esi,%r12d
mov    %rdi,%rbx
mov    $0x400,%edi
call   1050 <xmalloc@plt>
mov    %rax,%r14
xor    %ebp,%ebp
mov    $0x400,%edx
mov    %rax,%rdi
xor    %esi,%esi
call   1040 <memset@plt>
mov    $0x400,%edi
call   1050 <xmalloc@plt>
mov    %rax,%r15
mov    $0x400,%edx
mov    %rax,%rdi
xor    %esi,%esi
call   1040 <memset@plt>
imul   %r13d,%r12d
mov    %r12d,%r9d
test   %r12d,%r12d
jle    1202 <hist_omp2+0xd2>
lea    -0x1(%r9),%rcx
mov    %r9d,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    119e <hist_omp2+0x6e>
xor    %edx,%edx
jmp    11e0 <hist_omp2+0xb0>
mov    %r9d,%esi
and    $0xfffffffc,%esi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
mov    (%rbx,%rdx,8),%rcx
addl   $0x1,(%r15,%rcx,4)
mov    0x8(%rbx,%rdx,8),%rcx
addl   $0x1,(%r15,%rcx,4)
mov    0x10(%rbx,%rdx,8),%rcx
addl   $0x1,(%r15,%rcx,4)
mov    0x18(%rbx,%rdx,8),%rcx
addl   $0x1,(%r15,%rcx,4)
add    $0x4,%rdx
cmp    %rdx,%rsi
jne    11b0 <hist_omp2+0x80>
test   %rax,%rax
je     1202 <hist_omp2+0xd2>
lea    (%rbx,%rdx,8),%rcx
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
mov    (%rcx,%rdx,8),%rsi
addl   $0x1,(%r15,%rsi,4)
add    $0x1,%rdx
cmp    %rdx,%rax
jne    11f0 <hist_omp2+0xc0>
mov    $0x1,%al
cmpl   $0x0,(%r15)
je     1264 <hist_omp2+0x134>
xor    %edi,%edi
nopl   0x0(%rax)
cmpl   $0x0,0x3fc(%r15,%rdi,4)
jne    12c3 <hist_omp2+0x193>
cmpl   $0x0,0x3f8(%r15,%rdi,4)
jne    12cb <hist_omp2+0x19b>
cmpl   $0x0,0x3f4(%r15,%rdi,4)
jne    12d3 <hist_omp2+0x1a3>
lea    0xfc(%rdi),%ecx
cmpl   $0x0,(%r15,%rcx,4)
jne    12db <hist_omp2+0x1ab>
add    $0xfffffffffffffffc,%rdi
cmp    $0xffffff00,%edi
jne    1210 <hist_omp2+0xe0>
mov    $0xffffffff,%edi
jmp    12e1 <hist_omp2+0x1b1>
mov    $0xffffffffffffffff,%rdx
nopl   0x0(%rax,%rax,1)
cmpl   $0x0,0x8(%r15,%rdx,4)
jne    1504 <hist_omp2+0x3d4>
cmpl   $0x0,0xc(%r15,%rdx,4)
jne    150f <hist_omp2+0x3df>
cmpl   $0x0,0x10(%r15,%rdx,4)
jne    151a <hist_omp2+0x3ea>
cmp    $0xfb,%rdx
je     1525 <hist_omp2+0x3f5>
lea    0x4(%rdx),%rbp
cmpl   $0x0,0x14(%r15,%rdx,4)
mov    %rbp,%rdx
je     1270 <hist_omp2+0x140>
cmp    $0xff,%rbp
setb   %al
add    $0x1,%rbp
jmp    120a <hist_omp2+0xda>
add    $0xff,%edi
jmp    12e1 <hist_omp2+0x1b1>
add    $0xfe,%edi
jmp    12e1 <hist_omp2+0x1b1>
add    $0xfd,%edi
jmp    12e1 <hist_omp2+0x1b1>
add    $0xfc,%edi
test   %al,%al
mov    $0x100,%ecx
cmovne %ebp,%ecx
test   %r12d,%r12d
jle    14d8 <hist_omp2+0x3a8>
sub    %ecx,%edi
xor    %esi,%esi
mov    $0xff,%eax
xor    %edx,%edx
idiv   %edi
mov    %ecx,%edx
cltq
cmp    $0x4,%r12d
jb     14c0 <hist_omp2+0x390>
mov    %r9d,%esi
and    $0xfffffffc,%esi
movq   %rdx,%xmm0
pshufd $0x44,%xmm0,%xmm2
movq   %rax,%xmm0
pshufd $0x44,%xmm0,%xmm0
lea    -0x4(%rsi),%rcx
mov    %rcx,%r8
shr    $0x2,%r8
add    $0x1,%r8
movdqa %xmm0,%xmm8
psrlq  $0x20,%xmm8
test   %rcx,%rcx
je     14f6 <hist_omp2+0x3c6>
mov    %r8,%rbp
and    $0xfffffffffffffffe,%rbp
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nop
movdqu (%rbx,%rdi,8),%xmm7
movdqu 0x10(%rbx,%rdi,8),%xmm6
movdqu 0x20(%rbx,%rdi,8),%xmm3
movdqu 0x30(%rbx,%rdi,8),%xmm4
psubq  %xmm2,%xmm7
psubq  %xmm2,%xmm6
movdqa %xmm7,%xmm1
pmuludq %xmm8,%xmm1
movdqa %xmm7,%xmm5
psrlq  $0x20,%xmm5
pmuludq %xmm0,%xmm5
paddq  %xmm1,%xmm5
psllq  $0x20,%xmm5
pmuludq %xmm0,%xmm7
paddq  %xmm5,%xmm7
movdqa %xmm6,%xmm1
pmuludq %xmm8,%xmm1
movdqa %xmm6,%xmm5
psrlq  $0x20,%xmm5
pmuludq %xmm0,%xmm5
paddq  %xmm1,%xmm5
psllq  $0x20,%xmm5
pmuludq %xmm0,%xmm6
paddq  %xmm5,%xmm6
movdqu %xmm7,(%rbx,%rdi,8)
movdqu %xmm6,0x10(%rbx,%rdi,8)
psubq  %xmm2,%xmm3
psubq  %xmm2,%xmm4
movdqa %xmm3,%xmm1
pmuludq %xmm8,%xmm1
movdqa %xmm3,%xmm5
psrlq  $0x20,%xmm5
pmuludq %xmm0,%xmm5
paddq  %xmm1,%xmm5
psllq  $0x20,%xmm5
pmuludq %xmm0,%xmm3
paddq  %xmm5,%xmm3
movdqa %xmm4,%xmm1
pmuludq %xmm8,%xmm1
movdqa %xmm4,%xmm5
psrlq  $0x20,%xmm5
pmuludq %xmm0,%xmm5
paddq  %xmm1,%xmm5
psllq  $0x20,%xmm5
pmuludq %xmm0,%xmm4
paddq  %xmm5,%xmm4
movdqu %xmm3,0x20(%rbx,%rdi,8)
movdqu %xmm4,0x30(%rbx,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rbp
jne    1360 <hist_omp2+0x230>
test   $0x1,%r8b
je     14b7 <hist_omp2+0x387>
movdqu (%rbx,%rdi,8),%xmm3
movdqu 0x10(%rbx,%rdi,8),%xmm4
psubq  %xmm2,%xmm3
psubq  %xmm2,%xmm4
movdqa %xmm3,%xmm1
pmuludq %xmm8,%xmm1
movdqa %xmm3,%xmm2
psrlq  $0x20,%xmm2
pmuludq %xmm0,%xmm2
paddq  %xmm1,%xmm2
psllq  $0x20,%xmm2
pmuludq %xmm0,%xmm3
paddq  %xmm2,%xmm3
pmuludq %xmm4,%xmm8
movdqa %xmm4,%xmm1
psrlq  $0x20,%xmm1
pmuludq %xmm0,%xmm1
paddq  %xmm8,%xmm1
psllq  $0x20,%xmm1
pmuludq %xmm0,%xmm4
paddq  %xmm1,%xmm4
movdqu %xmm3,(%rbx,%rdi,8)
movdqu %xmm4,0x10(%rbx,%rdi,8)
cmp    %r9,%rsi
je     14d8 <hist_omp2+0x3a8>
nopl   0x0(%rax)
mov    (%rbx,%rsi,8),%rcx
sub    %rdx,%rcx
imul   %rax,%rcx
mov    %rcx,(%rbx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%r9
jne    14c0 <hist_omp2+0x390>
mov    %r15,%rdi
call   1030 <free@plt>
mov    %r14,%rdi
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>
xor    %edi,%edi
test   $0x1,%r8b
jne    144e <hist_omp2+0x31e>
jmp    14b7 <hist_omp2+0x387>
add    $0x2,%rdx
mov    %edx,%ebp
jmp    120a <hist_omp2+0xda>
add    $0x3,%rdx
mov    %edx,%ebp
jmp    120a <hist_omp2+0xda>
add    $0x4,%rdx
mov    %edx,%ebp
jmp    120a <hist_omp2+0xda>
add    $0x4,%rdx
cmp    $0xff,%rdx
setb   %al
mov    $0x100,%ebp
jmp    120a <hist_omp2+0xda>

LLVM IR (-O0):
define void @hist_omp2(i64* %0, i32 %1, i32 %2) {
%4 = alloca i64*
%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
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
store i64* %0, i64** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%19 = load i32, i32* %5
%20 = load i32, i32* %6
%21 = mul nsw i32 %19, %20
store i32 %21, i32* %7
%22 = call i32* @xmalloc(i32 1024)
store i32* %22, i32** %8
store i32 0, i32* %9
br label %23
23: ; preds = %31, %3
%24 = load i32, i32* %9
%25 = icmp slt i32 %24, 256
br i1 %25, label %26, label %34
26: ; preds = %23
%27 = load i32*, i32** %8
%28 = load i32, i32* %9
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i32, i32* %27, i64 %29
store i32 0, i32* %30
br label %31
31: ; preds = %26
%32 = load i32, i32* %9
%33 = add nsw i32 %32, 1
store i32 %33, i32* %9
br label %23
34: ; preds = %23
store i32 256, i32* %10
store i32 -1, i32* %11
%35 = call i32* @xmalloc(i32 1024)
store i32* %35, i32** %12
store i32 0, i32* %13
br label %36
36: ; preds = %44, %34
%37 = load i32, i32* %13
%38 = icmp slt i32 %37, 256
br i1 %38, label %39, label %47
39: ; preds = %36
%40 = load i32*, i32** %12
%41 = load i32, i32* %13
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i32, i32* %40, i64 %42
store i32 0, i32* %43
br label %44
44: ; preds = %39
%45 = load i32, i32* %13
%46 = add nsw i32 %45, 1
store i32 %46, i32* %13
br label %36
47: ; preds = %36
store i32 0, i32* %14
br label %48
48: ; preds = %62, %47
%49 = load i32, i32* %14
%50 = load i32, i32* %7
%51 = icmp slt i32 %49, %50
br i1 %51, label %52, label %65
52: ; preds = %48
%53 = load i32*, i32** %12
%54 = load i64*, i64** %4
%55 = load i32, i32* %14
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i64, i64* %54, i64 %56
%58 = load i64, i64* %57
%59 = getelementptr inbounds i32, i32* %53, i64 %58
%60 = load i32, i32* %59
%61 = add nsw i32 %60, 1
store i32 %61, i32* %59
br label %62
62: ; preds = %52
%63 = load i32, i32* %14
%64 = add nsw i32 %63, 1
store i32 %64, i32* %14
br label %48
65: ; preds = %48
store i32 0, i32* %15
br label %66
66: ; preds = %79, %65
%67 = load i32, i32* %15
%68 = icmp slt i32 %67, 256
br i1 %68, label %69, label %76
69: ; preds = %66
%70 = load i32*, i32** %12
%71 = load i32, i32* %15
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i32, i32* %70, i64 %72
%74 = load i32, i32* %73
%75 = icmp eq i32 %74, 0
br label %76
76: ; preds = %69, %66
%77 = phi i1 [ false, %66 ], [ %75, %69 ]
br i1 %77, label %78, label %82
78: ; preds = %76
br label %79
79: ; preds = %78
%80 = load i32, i32* %15
%81 = add nsw i32 %80, 1
store i32 %81, i32* %15
br label %66
82: ; preds = %76
store i32 255, i32* %16
br label %83
83: ; preds = %96, %82
%84 = load i32, i32* %16
%85 = icmp sge i32 %84, 0
br i1 %85, label %86, label %93
86: ; preds = %83
%87 = load i32*, i32** %12
%88 = load i32, i32* %16
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i32, i32* %87, i64 %89
%91 = load i32, i32* %90
%92 = icmp eq i32 %91, 0
br label %93
93: ; preds = %86, %83
%94 = phi i1 [ false, %83 ], [ %92, %86 ]
br i1 %94, label %95, label %99
95: ; preds = %93
br label %96
96: ; preds = %95
%97 = load i32, i32* %16
%98 = add nsw i32 %97, -1
store i32 %98, i32* %16
br label %83
99: ; preds = %93
%100 = load i32, i32* %10
%101 = load i32, i32* %15
%102 = icmp sgt i32 %100, %101
br i1 %102, label %103, label %105
103: ; preds = %99
%104 = load i32, i32* %15
store i32 %104, i32* %10
br label %105
105: ; preds = %103, %99
%106 = load i32, i32* %11
%107 = load i32, i32* %16
%108 = icmp slt i32 %106, %107
br i1 %108, label %109, label %111
109: ; preds = %105
%110 = load i32, i32* %16
store i32 %110, i32* %11
br label %111
111: ; preds = %109, %105
%112 = load i32, i32* %11
%113 = load i32, i32* %10
%114 = sub nsw i32 %112, %113
%115 = sdiv i32 255, %114
store i32 %115, i32* %17
store i32 0, i32* %18
br label %116
116: ; preds = %136, %111
%117 = load i32, i32* %18
%118 = load i32, i32* %7
%119 = icmp slt i32 %117, %118
br i1 %119, label %120, label %139
120: ; preds = %116
%121 = load i64*, i64** %4
%122 = load i32, i32* %18
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i64, i64* %121, i64 %123
%125 = load i64, i64* %124
%126 = load i32, i32* %10
%127 = sext i32 %126 to i64
%128 = sub i64 %125, %127
%129 = load i32, i32* %17
%130 = sext i32 %129 to i64
%131 = mul i64 %128, %130
%132 = load i64*, i64** %4
%133 = load i32, i32* %18
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds i64, i64* %132, i64 %134
store i64 %131, i64* %135
br label %136
136: ; preds = %120
%137 = load i32, i32* %18
%138 = add nsw i32 %137, 1
store i32 %138, i32* %18
br label %116
139: ; preds = %116
%140 = load i32*, i32** %12
%141 = call i32 @free(i32* %140)
%142 = load i32*, i32** %8
%143 = call i32 @free(i32* %142)
ret void
}

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