void scale_no_opt(unsigned char *data, int pixel_nb) {
  int i;
  unsigned char min, max;
  unsigned short beta;
  max = 0;
  min = 255;
  for (i = 0; i < pixel_nb; i++) {
    if (data[i] > max)
      max = data[i];
    if (data[i] < min)
      min = data[i];
  }
  beta = 255 << 8;
  beta = beta / (max - min);
  for (i = 0; i < pixel_nb; i++) {
    data[i] = (beta * (data[i] - min)) >> 8;
  }
}


x86 assembly (clang, -O0):
<scale_no_opt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movb   $0x0,-0x12(%rbp)
movb   $0xff,-0x11(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1185 <scale_no_opt+0x85>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0x12(%rbp),%ecx
cmp    %ecx,%eax
jle    114c <scale_no_opt+0x4c>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x12(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0x11(%rbp),%ecx
cmp    %ecx,%eax
jge    1172 <scale_no_opt+0x72>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x11(%rbp)
jmp    1177 <scale_no_opt+0x77>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    111a <scale_no_opt+0x1a>
movw   $0xff00,-0x14(%rbp)
movzwl -0x14(%rbp),%eax
movzbl -0x12(%rbp),%ecx
movzbl -0x11(%rbp),%edx
sub    %edx,%ecx
cltd
idiv   %ecx
mov    %ax,-0x14(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11ea <scale_no_opt+0xea>
movzwl -0x14(%rbp),%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
movzbl -0x11(%rbp),%edx
sub    %edx,%ecx
imul   %ecx,%eax
sar    $0x8,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    11a7 <scale_no_opt+0xa7>
pop    %rbp
ret

x86 assembly (clang, -O2):
<scale_no_opt>:
push   %rbx
test   %esi,%esi
jle    1756 <scale_no_opt+0x656>
mov    %esi,%r10d
cmp    $0x8,%esi
jae    111c <scale_no_opt+0x1c>
mov    $0xff,%dl
xor    %ecx,%ecx
xor    %ebx,%ebx
jmp    12f0 <scale_no_opt+0x1f0>
cmp    $0x20,%esi
jae    112c <scale_no_opt+0x2c>
mov    $0xff,%dl
xor    %ebx,%ebx
xor    %ecx,%ecx
jmp    124d <scale_no_opt+0x14d>
mov    %r10d,%ecx
and    $0xffffffe0,%ecx
lea    -0x20(%rcx),%rax
mov    %rax,%r8
shr    $0x5,%r8
add    $0x1,%r8
test   %rax,%rax
je     1758 <scale_no_opt+0x658>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
pcmpeqd %xmm1,%xmm1
pxor   %xmm0,%xmm0
xor    %ebx,%ebx
pxor   %xmm2,%xmm2
pcmpeqd %xmm3,%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%rdi,%rbx,1),%xmm4
movdqu 0x10(%rdi,%rbx,1),%xmm5
movdqu 0x20(%rdi,%rbx,1),%xmm6
movdqu 0x30(%rdi,%rbx,1),%xmm7
pmaxub %xmm4,%xmm0
pmaxub %xmm5,%xmm2
pminub %xmm4,%xmm1
pminub %xmm5,%xmm3
pmaxub %xmm6,%xmm0
pmaxub %xmm7,%xmm2
pminub %xmm6,%xmm1
pminub %xmm7,%xmm3
add    $0x40,%rbx
add    $0xfffffffffffffffe,%rdx
jne    1170 <scale_no_opt+0x70>
test   $0x1,%r8b
je     11d2 <scale_no_opt+0xd2>
movdqu (%rdi,%rbx,1),%xmm4
movdqu 0x10(%rdi,%rbx,1),%xmm5
pmaxub %xmm4,%xmm0
pmaxub %xmm5,%xmm2
pminub %xmm4,%xmm1
pminub %xmm5,%xmm3
pmaxub %xmm2,%xmm0
pminub %xmm3,%xmm1
pshufd $0xee,%xmm1,%xmm2
pminub %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
pminub %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrld  $0x10,%xmm2
pminub %xmm1,%xmm2
movdqa %xmm2,%xmm1
psrlw  $0x8,%xmm1
pminub %xmm2,%xmm1
movd   %xmm1,%edx
pshufd $0xee,%xmm0,%xmm1
pmaxub %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
pmaxub %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrld  $0x10,%xmm1
pmaxub %xmm0,%xmm1
movdqa %xmm1,%xmm0
psrlw  $0x8,%xmm0
pmaxub %xmm1,%xmm0
movd   %xmm0,%ebx
cmp    %r10,%rcx
je     130d <scale_no_opt+0x20d>
test   $0x18,%r10b
je     12f0 <scale_no_opt+0x1f0>
mov    %rcx,%rax
mov    %r10d,%ecx
and    $0xfffffff8,%ecx
movzbl %bl,%ebx
movd   %ebx,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
movzbl %dl,%edx
movd   %edx,%xmm1
punpcklbw %xmm1,%xmm1
pshuflw $0x0,%xmm1,%xmm1
cs nopw 0x0(%rax,%rax,1)
movq   (%rdi,%rax,1),%xmm2
pmaxub %xmm2,%xmm0
pminub %xmm2,%xmm1
add    $0x8,%rax
cmp    %rax,%rcx
jne    1280 <scale_no_opt+0x180>
pshufd $0x55,%xmm1,%xmm2
pminub %xmm1,%xmm2
movdqa %xmm2,%xmm1
psrld  $0x10,%xmm1
pminub %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrlw  $0x8,%xmm2
pminub %xmm1,%xmm2
movd   %xmm2,%edx
pshufd $0x55,%xmm0,%xmm1
pmaxub %xmm0,%xmm1
movdqa %xmm1,%xmm0
psrld  $0x10,%xmm0
pmaxub %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrlw  $0x8,%xmm1
pmaxub %xmm0,%xmm1
movd   %xmm1,%ebx
cmp    %r10,%rcx
je     130d <scale_no_opt+0x20d>
nopl   0x0(%rax)
movzbl (%rdi,%rcx,1),%eax
cmp    %bl,%al
movzbl %bl,%ebx
cmova  %eax,%ebx
cmp    %dl,%al
movzbl %dl,%edx
cmovb  %eax,%edx
add    $0x1,%rcx
cmp    %rcx,%r10
jne    12f0 <scale_no_opt+0x1f0>
test   %esi,%esi
jle    1756 <scale_no_opt+0x656>
movzbl %dl,%r8d
movzbl %bl,%ecx
sub    %r8d,%ecx
xor    %ebx,%ebx
mov    $0xff00,%eax
xor    %edx,%edx
idiv   %ecx
movzwl %ax,%eax
cmp    $0x8,%esi
jb     1740 <scale_no_opt+0x640>
movd   %r8d,%xmm8
movd   %eax,%xmm9
cmp    $0x10,%esi
jae    1409 <scale_no_opt+0x309>
xor    %ebx,%ebx
mov    %rbx,%rdx
mov    %r10d,%ebx
and    $0xfffffff8,%ebx
pshufd $0x0,%xmm8,%xmm0
pshufd $0x0,%xmm9,%xmm1
pxor   %xmm2,%xmm2
pshufd $0xf5,%xmm1,%xmm3
movdqa 0xc8f(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movq   (%rdi,%rdx,1),%xmm5
punpcklbw %xmm2,%xmm5
movdqa %xmm5,%xmm6
punpckhwd %xmm2,%xmm6
punpcklwd %xmm2,%xmm5
psubd  %xmm0,%xmm5
psubd  %xmm0,%xmm6
pshufd $0xf5,%xmm6,%xmm7
pmuludq %xmm1,%xmm6
pshufd $0xe8,%xmm6,%xmm6
pmuludq %xmm3,%xmm7
pshufd $0xe8,%xmm7,%xmm7
punpckldq %xmm7,%xmm6
pshufd $0xf5,%xmm5,%xmm7
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pmuludq %xmm3,%xmm7
pshufd $0xe8,%xmm7,%xmm7
punpckldq %xmm7,%xmm5
psrld  $0x8,%xmm5
psrld  $0x8,%xmm6
pand   %xmm4,%xmm6
pand   %xmm4,%xmm5
packuswb %xmm6,%xmm5
packuswb %xmm5,%xmm5
movq   %xmm5,(%rdi,%rdx,1)
add    $0x8,%rdx
cmp    %rdx,%rbx
jne    1380 <scale_no_opt+0x280>
cmp    %r10,%rbx
jne    1740 <scale_no_opt+0x640>
jmp    1756 <scale_no_opt+0x656>
mov    %r10d,%ebx
and    $0xfffffff0,%ebx
pshufd $0x0,%xmm8,%xmm4
pshufd $0x0,%xmm9,%xmm11
lea    -0x10(%rbx),%rcx
mov    %rcx,%r9
shr    $0x4,%r9
add    $0x1,%r9
pshufd $0xf5,%xmm11,%xmm12
test   %rcx,%rcx
je     1779 <scale_no_opt+0x679>
mov    %r9,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %edx,%edx
pxor   %xmm5,%xmm5
movdqa 0xbb1(%rip),%xmm10
nop
movdqu (%rdi,%rdx,1),%xmm0
movdqu 0x10(%rdi,%rdx,1),%xmm7
movdqa %xmm0,%xmm6
punpckhbw %xmm5,%xmm6
movdqa %xmm6,%xmm1
punpckhwd %xmm5,%xmm1
punpcklwd %xmm5,%xmm6
punpcklbw %xmm5,%xmm0
movdqa %xmm0,%xmm2
punpckhwd %xmm5,%xmm2
punpcklwd %xmm5,%xmm0
psubd  %xmm4,%xmm0
psubd  %xmm4,%xmm2
psubd  %xmm4,%xmm6
psubd  %xmm4,%xmm1
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm11,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
pshufd $0xf5,%xmm6,%xmm3
pmuludq %xmm11,%xmm6
pshufd $0xe8,%xmm6,%xmm6
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm6
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm11,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm2
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm11,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
psrld  $0x8,%xmm0
psrld  $0x8,%xmm2
psrld  $0x8,%xmm6
psrld  $0x8,%xmm1
pand   %xmm10,%xmm1
pand   %xmm10,%xmm6
packuswb %xmm1,%xmm6
pand   %xmm10,%xmm2
pand   %xmm10,%xmm0
packuswb %xmm2,%xmm0
packuswb %xmm6,%xmm0
movdqu %xmm0,(%rdi,%rdx,1)
movdqa %xmm7,%xmm1
punpckhbw %xmm5,%xmm1
movdqa %xmm1,%xmm0
punpckhwd %xmm5,%xmm0
punpcklwd %xmm5,%xmm1
punpcklbw %xmm5,%xmm7
movdqa %xmm7,%xmm2
punpckhwd %xmm5,%xmm2
punpcklwd %xmm5,%xmm7
psubd  %xmm4,%xmm7
psubd  %xmm4,%xmm2
psubd  %xmm4,%xmm1
psubd  %xmm4,%xmm0
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm11,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm11,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm11,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm2
pshufd $0xf5,%xmm7,%xmm3
pmuludq %xmm11,%xmm7
pshufd $0xe8,%xmm7,%xmm6
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm6
psrld  $0x8,%xmm6
psrld  $0x8,%xmm2
psrld  $0x8,%xmm1
psrld  $0x8,%xmm0
pand   %xmm10,%xmm0
pand   %xmm10,%xmm1
packuswb %xmm0,%xmm1
pand   %xmm10,%xmm2
pand   %xmm10,%xmm6
packuswb %xmm2,%xmm6
packuswb %xmm1,%xmm6
movdqu %xmm6,0x10(%rdi,%rdx,1)
add    $0x20,%rdx
add    $0xfffffffffffffffe,%rsi
jne    1450 <scale_no_opt+0x350>
test   $0x1,%r9b
je     1725 <scale_no_opt+0x625>
movdqu (%rdi,%rdx,1),%xmm0
pxor   %xmm1,%xmm1
movdqa %xmm0,%xmm3
punpckhbw %xmm1,%xmm3
movdqa %xmm3,%xmm5
punpckhwd %xmm1,%xmm5
punpcklwd %xmm1,%xmm3
punpcklbw %xmm1,%xmm0
movdqa %xmm0,%xmm2
punpckhwd %xmm1,%xmm2
punpcklwd %xmm1,%xmm0
psubd  %xmm4,%xmm0
psubd  %xmm4,%xmm2
psubd  %xmm4,%xmm3
psubd  %xmm4,%xmm5
pshufd $0xf5,%xmm5,%xmm1
pmuludq %xmm11,%xmm5
pshufd $0xe8,%xmm5,%xmm4
pmuludq %xmm12,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm4
pshufd $0xf5,%xmm3,%xmm5
pmuludq %xmm11,%xmm3
pshufd $0xe8,%xmm3,%xmm1
pmuludq %xmm12,%xmm5
pshufd $0xe8,%xmm5,%xmm3
punpckldq %xmm3,%xmm1
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm11,%xmm2
pshufd $0xe8,%xmm2,%xmm5
pmuludq %xmm12,%xmm3
pshufd $0xe8,%xmm3,%xmm2
punpckldq %xmm2,%xmm5
pmuludq %xmm0,%xmm11
pshufd $0xe8,%xmm11,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm12,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
psrld  $0x8,%xmm2
psrld  $0x8,%xmm5
psrld  $0x8,%xmm1
psrld  $0x8,%xmm4
movdqa 0x8fc(%rip),%xmm0
pand   %xmm0,%xmm4
pand   %xmm0,%xmm1
packuswb %xmm4,%xmm1
pand   %xmm0,%xmm5
pand   %xmm0,%xmm2
packuswb %xmm5,%xmm2
packuswb %xmm1,%xmm2
movdqu %xmm2,(%rdi,%rdx,1)
cmp    %r10,%rbx
je     1756 <scale_no_opt+0x656>
test   $0x8,%r10b
jne    134b <scale_no_opt+0x24b>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rdi,%rbx,1),%ecx
sub    %r8d,%ecx
imul   %eax,%ecx
mov    %ch,(%rdi,%rbx,1)
add    $0x1,%rbx
cmp    %rbx,%r10
jne    1740 <scale_no_opt+0x640>
pop    %rbx
ret
pcmpeqd %xmm1,%xmm1
pxor   %xmm0,%xmm0
xor    %ebx,%ebx
pxor   %xmm2,%xmm2
pcmpeqd %xmm3,%xmm3
test   $0x1,%r8b
jne    11b7 <scale_no_opt+0xb7>
jmp    11d2 <scale_no_opt+0xd2>
xor    %edx,%edx
test   $0x1,%r9b
jne    1636 <scale_no_opt+0x536>
jmp    1725 <scale_no_opt+0x625>

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

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