#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(unsigned char *, unsigned char *, unsigned int);
void sharpen(unsigned char *image, unsigned char *tempBuf, unsigned int width,
             unsigned int height) {
  int pixelInd;
  int val;
  for (int row = 1; row < height - 1; row++) {
    pixelInd = width * row;
    for (int col = 1; col < width - 1; col++) {
      val = 5 * image[pixelInd + col] - image[pixelInd + col - 1] -
            image[pixelInd + col + 1] - image[pixelInd + col - width] -
            image[pixelInd + col + width];
      if (val < 0)
        val = 0;
      if (val > 255)
        val = 255;
      tempBuf[pixelInd + col] = val;
    }
  }
  memcpy(image, tempBuf, width * height);
}


x86 assembly (clang, -O0):
<sharpen>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jae    1228 <sharpen+0x118>
mov    -0x14(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jae    1215 <sharpen+0x105>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x28(%rbp),%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
imul   $0x5,%eax,%eax
mov    -0x8(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    -0x28(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    -0x8(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    -0x28(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    -0x8(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    -0x28(%rbp),%edx
sub    -0x14(%rbp),%edx
mov    %edx,%edx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    -0x8(%rbp),%rcx
mov    -0x1c(%rbp),%edx
add    -0x28(%rbp),%edx
add    -0x14(%rbp),%edx
mov    %edx,%edx
movzbl (%rcx,%rdx,1),%ecx
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    11de <sharpen+0xce>
movl   $0x0,-0x20(%rbp)
cmpl   $0xff,-0x20(%rbp)
jle    11f2 <sharpen+0xe2>
movl   $0xff,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x28(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    114f <sharpen+0x3f>
jmp    121a <sharpen+0x10a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    112d <sharpen+0x1d>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x14(%rbp),%edx
imul   -0x18(%rbp),%edx
call   1030 <memcpy@plt>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sharpen>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %edx,%r15d
mov    %rsi,-0x50(%rsp)
mov    %rcx,-0x10(%rsp)
add    $0xffffffff,%ecx
cmp    $0x2,%ecx
jb     17e3 <sharpen+0x6d3>
lea    -0x1(%r15),%r14d
mov    %ecx,%r8d
lea    -0x2(%r14),%rax
mov    %rax,0x20(%rsp)
lea    (%r15,%r15,1),%r11d
lea    0x1(%r15,%r15,1),%eax
mov    %rax,0x18(%rsp)
mov    -0x50(%rsp),%rcx
lea    0x1(%rcx),%rax
lea    (%rcx,%r14,1),%rdx
lea    -0x1(%r14),%rbp
lea    -0x1(%rdi,%r14,1),%rcx
mov    %rcx,-0x8(%rsp)
lea    (%r14,%rdi,1),%rcx
add    $0x1,%rcx
mov    %rax,-0x58(%rsp)
cmp    %rcx,%rax
setb   %cl
mov    %rdx,(%rsp)
cmp    %rdi,%rdx
seta   %al
and    %cl,%al
mov    %al,-0x79(%rsp)
mov    %rbp,%rax
and    $0xfffffffffffffff0,%rax
mov    %rax,-0x48(%rsp)
add    $0x1,%rax
mov    %rax,-0x28(%rsp)
mov    %rbp,%rax
mov    %rbp,-0x68(%rsp)
and    $0xfffffffffffffff8,%rbp
mov    %rbp,-0x38(%rsp)
lea    0x1(%rbp),%rax
mov    %rax,-0x20(%rsp)
lea    0x1(%r11),%rsi
pxor   %xmm11,%xmm11
movdqa 0xe2c(%rip),%xmm8
movdqa 0xe33(%rip),%xmm9
movdqa 0xe3a(%rip),%xmm10
mov    %r15d,%eax
mov    %rax,0x28(%rsp)
lea    0x2(%rdi),%rax
mov    %rax,-0x40(%rsp)
xor    %r13d,%r13d
mov    $0x1,%r10d
xor    %r12d,%r12d
mov    %r11,-0x18(%rsp)
mov    %r15d,%eax
mov    %r15d,-0x5c(%rsp)
movl   $0x0,-0x60(%rsp)
mov    $0x1,%ecx
mov    %r15,-0x70(%rsp)
mov    %r8,-0x78(%rsp)
jmp    125d <sharpen+0x14d>
nopl   0x0(%rax)
mov    0x30(%rsp),%rcx
add    $0x1,%rcx
addl   $0x1,-0x60(%rsp)
add    %r15d,-0x5c(%rsp)
mov    0x28(%rsp),%rax
add    %rax,%rsi
add    %rax,%r10
add    %rax,%r11
add    %rax,%r12
cmp    %r8,%rcx
je     17e3 <sharpen+0x6d3>
mov    %rcx,0x30(%rsp)
cmp    $0x2,%r14d
jb     1230 <sharpen+0x120>
movslq -0x5c(%rsp),%r9
mov    $0x1,%ebx
cmpq   $0x8,-0x68(%rsp)
jb     135b <sharpen+0x24b>
mov    -0x60(%rsp),%eax
mov    %eax,%ecx
imul   %r15d,%ecx
mov    0x18(%rsp),%rax
lea    (%rax,%rcx,1),%r15d
mov    $0xfffffffe,%ebp
sub    %ecx,%ebp
mov    %r15d,%edx
mov    0x20(%rsp),%rax
add    %eax,%edx
setb   %r8b
cmp    %eax,%ebp
jb     1351 <sharpen+0x241>
mov    %rax,%rbp
shr    $0x20,%rbp
jne    1351 <sharpen+0x241>
test   %r8b,%r8b
jne    1351 <sharpen+0x241>
test   %rbp,%rbp
jne    1351 <sharpen+0x241>
mov    %rsi,-0x30(%rsp)
mov    -0x70(%rsp),%rsi
lea    (%rcx,%rsi,1),%edx
movslq %edx,%rdx
mov    -0x58(%rsp),%rbp
add    %rdx,%rbp
add    (%rsp),%rdx
lea    (%rdi,%r15,1),%rax
mov    %rax,0x8(%rsp)
mov    -0x8(%rsp),%rax
add    %rax,%r15
add    $0x1,%ecx
lea    (%rdi,%rcx,1),%r8
mov    %r8,0x10(%rsp)
add    %rax,%rcx
cmp    %r15,%rbp
setb   %r15b
cmp    %rdx,0x8(%rsp)
setb   %r8b
and    %r15b,%r8b
mov    %rsi,%r15
mov    -0x30(%rsp),%rsi
cmp    %rcx,%rbp
setb   %cl
cmp    %rdx,0x10(%rsp)
setb   %dl
and    %cl,%dl
or     %r8b,%dl
or     -0x79(%rsp),%dl
mov    -0x78(%rsp),%r8
jne    135b <sharpen+0x24b>
cmpq   $0x10,-0x68(%rsp)
jae    13bd <sharpen+0x2ad>
xor    %edx,%edx
jmp    1652 <sharpen+0x542>
mov    -0x70(%rsp),%r15
mov    -0x78(%rsp),%r8
lea    (%rdi,%r9,1),%rcx
add    -0x50(%rsp),%r9
jmp    1381 <sharpen+0x271>
cs nopw 0x0(%rax,%rax,1)
mov    %dl,(%r9,%rbx,1)
add    $0x1,%rbx
cmp    %rbx,%r14
je     1230 <sharpen+0x120>
movzbl (%rcx,%rbx,1),%edx
lea    (%rdx,%rdx,4),%edx
movzbl -0x1(%rcx,%rbx,1),%eax
movzbl 0x1(%rcx,%rbx,1),%ebp
add    %eax,%ebp
lea    (%r12,%rbx,1),%eax
movzbl (%rdi,%rax,1),%eax
add    %ebp,%eax
lea    (%r11,%rbx,1),%ebp
movzbl (%rdi,%rbp,1),%ebp
add    %eax,%ebp
sub    %ebp,%edx
cmovs  %r13d,%edx
cmp    $0xff,%edx
jb     1370 <sharpen+0x260>
mov    $0xff,%edx
jmp    1370 <sharpen+0x260>
mov    -0x58(%rsp),%rax
lea    (%rax,%r9,1),%rdx
mov    -0x40(%rsp),%rax
lea    (%rax,%r9,1),%rbx
xor    %r8d,%r8d
mov    -0x48(%rsp),%rax
nopw   0x0(%rax,%rax,1)
movdqu -0x2(%rbx,%r8,1),%xmm2
movdqu -0x1(%rbx,%r8,1),%xmm0
movdqu (%rbx,%r8,1),%xmm4
movdqa %xmm0,%xmm1
punpcklbw %xmm11,%xmm1
movdqa %xmm1,%xmm3
punpckhwd %xmm11,%xmm3
punpcklwd %xmm11,%xmm1
punpckhbw %xmm11,%xmm0
movdqa %xmm0,%xmm6
punpckhwd %xmm11,%xmm6
punpcklwd %xmm11,%xmm0
movdqa %xmm0,%xmm12
pslld  $0x2,%xmm12
paddd  %xmm0,%xmm12
movdqa %xmm6,%xmm13
pslld  $0x2,%xmm13
paddd  %xmm6,%xmm13
movdqa %xmm1,%xmm14
pslld  $0x2,%xmm14
paddd  %xmm1,%xmm14
movdqa %xmm3,%xmm7
pslld  $0x2,%xmm7
paddd  %xmm3,%xmm7
movdqa %xmm2,%xmm3
punpcklbw %xmm11,%xmm3
movdqa %xmm3,%xmm5
punpckhwd %xmm11,%xmm5
punpcklwd %xmm11,%xmm3
punpckhbw %xmm11,%xmm2
movdqa %xmm2,%xmm6
punpckhwd %xmm11,%xmm6
punpcklwd %xmm11,%xmm2
movdqa %xmm4,%xmm1
punpcklbw %xmm11,%xmm1
movdqa %xmm1,%xmm0
punpckhwd %xmm11,%xmm0
paddd  %xmm5,%xmm0
punpcklwd %xmm11,%xmm1
paddd  %xmm3,%xmm1
punpckhbw %xmm11,%xmm4
movdqa %xmm4,%xmm5
punpckhwd %xmm11,%xmm5
paddd  %xmm6,%xmm5
punpcklwd %xmm11,%xmm4
paddd  %xmm2,%xmm4
lea    (%r10,%r8,1),%ecx
movdqu (%rdi,%rcx,1),%xmm6
movdqa %xmm6,%xmm2
punpckhbw %xmm11,%xmm2
movdqa %xmm2,%xmm3
punpcklwd %xmm11,%xmm3
paddd  %xmm4,%xmm3
punpckhwd %xmm11,%xmm2
paddd  %xmm5,%xmm2
punpcklbw %xmm11,%xmm6
movdqa %xmm6,%xmm4
punpcklwd %xmm11,%xmm4
paddd  %xmm1,%xmm4
punpckhwd %xmm11,%xmm6
paddd  %xmm0,%xmm6
lea    (%rsi,%r8,1),%ecx
movdqu (%rdi,%rcx,1),%xmm0
movdqa %xmm0,%xmm1
punpcklbw %xmm11,%xmm1
movdqa %xmm1,%xmm5
punpckhwd %xmm11,%xmm5
paddd  %xmm6,%xmm5
psubd  %xmm5,%xmm7
punpcklwd %xmm11,%xmm1
paddd  %xmm4,%xmm1
psubd  %xmm1,%xmm14
punpckhbw %xmm11,%xmm0
movdqa %xmm0,%xmm1
punpckhwd %xmm11,%xmm1
paddd  %xmm2,%xmm1
psubd  %xmm1,%xmm13
punpcklwd %xmm11,%xmm0
paddd  %xmm3,%xmm0
psubd  %xmm0,%xmm12
movdqa %xmm12,%xmm1
pcmpgtd %xmm11,%xmm1
pand   %xmm12,%xmm1
movdqa %xmm13,%xmm0
pcmpgtd %xmm11,%xmm0
pand   %xmm13,%xmm0
movdqa %xmm14,%xmm3
pcmpgtd %xmm11,%xmm3
pand   %xmm14,%xmm3
movdqa %xmm7,%xmm2
pcmpgtd %xmm11,%xmm2
pand   %xmm7,%xmm2
movdqa %xmm2,%xmm4
pxor   %xmm9,%xmm4
movdqa %xmm10,%xmm5
pcmpgtd %xmm4,%xmm5
pand   %xmm5,%xmm2
pandn  %xmm8,%xmm5
por    %xmm2,%xmm5
movdqa %xmm3,%xmm4
pxor   %xmm9,%xmm4
movdqa %xmm10,%xmm2
pcmpgtd %xmm4,%xmm2
pand   %xmm2,%xmm3
pandn  %xmm8,%xmm2
por    %xmm3,%xmm2
packuswb %xmm5,%xmm2
movdqa %xmm0,%xmm3
pxor   %xmm9,%xmm3
movdqa %xmm10,%xmm4
pcmpgtd %xmm3,%xmm4
pand   %xmm4,%xmm0
pandn  %xmm8,%xmm4
por    %xmm0,%xmm4
movdqa %xmm1,%xmm0
pxor   %xmm9,%xmm0
movdqa %xmm10,%xmm3
pcmpgtd %xmm0,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm8,%xmm3
por    %xmm1,%xmm3
packuswb %xmm4,%xmm3
packuswb %xmm3,%xmm2
movdqu %xmm2,(%rdx,%r8,1)
add    $0x10,%r8
cmp    %r8,%rax
jne    13e0 <sharpen+0x2d0>
cmp    %rax,-0x68(%rsp)
mov    -0x78(%rsp),%r8
je     1230 <sharpen+0x120>
mov    -0x48(%rsp),%rdx
mov    -0x28(%rsp),%rbx
testb  $0x8,-0x68(%rsp)
je     135b <sharpen+0x24b>
mov    -0x58(%rsp),%rax
lea    (%rax,%r9,1),%rbx
mov    -0x40(%rsp),%rax
lea    (%rax,%r9,1),%rcx
mov    -0x18(%rsp),%rax
add    %rdx,%rax
mov    -0x38(%rsp),%r8
mov    %r10,%r15
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movq   -0x1(%rcx,%rdx,1),%xmm0
punpcklbw %xmm11,%xmm0
movdqa %xmm0,%xmm2
punpckhwd %xmm11,%xmm2
punpcklwd %xmm11,%xmm0
movdqa %xmm0,%xmm1
pslld  $0x2,%xmm1
paddd  %xmm0,%xmm1
movdqa %xmm2,%xmm4
pslld  $0x2,%xmm4
paddd  %xmm2,%xmm4
movq   -0x2(%rcx,%rdx,1),%xmm0
punpcklbw %xmm11,%xmm0
movdqa %xmm0,%xmm2
punpckhwd %xmm11,%xmm2
punpcklwd %xmm11,%xmm0
movq   (%rcx,%rdx,1),%xmm3
punpcklbw %xmm11,%xmm3
movdqa %xmm3,%xmm5
punpckhwd %xmm11,%xmm5
paddd  %xmm2,%xmm5
punpcklwd %xmm11,%xmm3
paddd  %xmm0,%xmm3
lea    (%rdx,%r15,1),%esi
movq   (%rdi,%rsi,1),%xmm0
punpcklbw %xmm11,%xmm0
movdqa %xmm0,%xmm2
punpcklwd %xmm11,%xmm2
paddd  %xmm3,%xmm2
punpckhwd %xmm11,%xmm0
paddd  %xmm5,%xmm0
lea    (%rax,%r15,1),%esi
movq   (%rdi,%rsi,1),%xmm3
punpcklbw %xmm11,%xmm3
movdqa %xmm3,%xmm5
punpckhwd %xmm11,%xmm5
paddd  %xmm0,%xmm5
psubd  %xmm5,%xmm4
punpcklwd %xmm11,%xmm3
paddd  %xmm2,%xmm3
psubd  %xmm3,%xmm1
movdqa %xmm1,%xmm0
pcmpgtd %xmm11,%xmm0
pand   %xmm1,%xmm0
movdqa %xmm4,%xmm1
pcmpgtd %xmm11,%xmm1
pand   %xmm4,%xmm1
movdqa %xmm1,%xmm2
pxor   %xmm9,%xmm2
movdqa %xmm10,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm8,%xmm3
por    %xmm1,%xmm3
movdqa %xmm0,%xmm1
pxor   %xmm9,%xmm1
movdqa %xmm10,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm0
pandn  %xmm8,%xmm2
por    %xmm0,%xmm2
packuswb %xmm3,%xmm2
packuswb %xmm2,%xmm2
movq   %xmm2,(%rbx,%rdx,1)
add    $0x8,%rbx
add    $0x8,%r15
add    $0x8,%rcx
add    $0xfffffffffffffff8,%r8
cmp    %r8,%rdx
jne    1680 <sharpen+0x570>
mov    -0x20(%rsp),%rbx
mov    -0x38(%rsp),%rax
cmp    %rax,-0x68(%rsp)
mov    -0x70(%rsp),%r15
mov    -0x78(%rsp),%r8
mov    -0x30(%rsp),%rsi
je     1230 <sharpen+0x120>
jmp    135b <sharpen+0x24b>
mov    -0x10(%rsp),%rdx
imul   %r15d,%edx
mov    -0x50(%rsp),%rsi
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <memcpy@plt>

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

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