#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 */
scalar_t__ malloc(int);
unsigned char *plusClairNB(unsigned char *img, int xs, int ys, int *nc,
                           int *nl) {
  unsigned char *res = (unsigned char *)malloc(xs * ys);
  int nbPixels = xs * ys;
  int i;
  for (i = 0; i < nbPixels; i++) {
    unsigned int v = img[i] + img[i] / 2;
    if (v > 255) {
      v = 255;
    }
    res[i] = v;
  }
  *nc = xs;
  *nl = ys;
  return res;
}


x86 assembly (clang, -O0):
<plusClairNB>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0xc(%rbp),%edi
imul   -0x10(%rbp),%edi
call   1030 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    11b6 <plusClairNB+0xa6>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x38(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0xff,-0x34(%rbp)
jbe    1198 <plusClairNB+0x88>
movl   $0xff,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %al,%dl
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    114b <plusClairNB+0x3b>
mov    -0xc(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<plusClairNB>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %r8,%r14
mov    %rcx,%r15
mov    %edx,%r12d
mov    %esi,%r13d
mov    %rdi,%rbp
mov    %edx,%ebx
imul   %esi,%ebx
mov    %ebx,%edi
call   1030 <malloc@plt>
test   %ebx,%ebx
jle    11da <plusClairNB+0xca>
mov    %ebx,%ecx
cmp    $0x8,%ebx
jb     1161 <plusClairNB+0x51>
lea    (%rcx,%rbp,1),%rdx
cmp    %rax,%rdx
jbe    11ef <plusClairNB+0xdf>
mov    %rax,%rdx
add    %rcx,%rdx
cmp    %rbp,%rdx
jbe    11ef <plusClairNB+0xdf>
xor    %edx,%edx
mov    %rdx,%rsi
not    %rsi
test   $0x1,%cl
je     118e <plusClairNB+0x7e>
movzbl 0x0(%rbp,%rdx,1),%ebx
mov    %ebx,%edi
shr    %edi
add    %ebx,%edi
cmp    $0xff,%edi
mov    $0xff,%ebx
cmovb  %edi,%ebx
mov    %bl,(%rax,%rdx,1)
or     $0x1,%rdx
add    %rcx,%rsi
je     11da <plusClairNB+0xca>
mov    $0xff,%esi
nopl   0x0(%rax,%rax,1)
movzbl 0x0(%rbp,%rdx,1),%ebx
mov    %ebx,%edi
shr    %edi
add    %ebx,%edi
cmp    $0xff,%edi
cmovae %esi,%edi
mov    %dil,(%rax,%rdx,1)
movzbl 0x1(%rbp,%rdx,1),%ebx
mov    %ebx,%edi
shr    %edi
add    %ebx,%edi
cmp    $0xff,%edi
cmovae %esi,%edi
mov    %dil,0x1(%rax,%rdx,1)
add    $0x2,%rdx
cmp    %rdx,%rcx
jne    11a0 <plusClairNB+0x90>
mov    %r13d,(%r15)
mov    %r12d,(%r14)
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
cmp    $0x10,%ebx
jae    128c <plusClairNB+0x17c>
xor    %edx,%edx
mov    %rdx,%rsi
mov    %ecx,%edx
and    $0xfffffff8,%edx
pxor   %xmm0,%xmm0
movdqa 0xdf2(%rip),%xmm1
xchg   %ax,%ax
movq   0x0(%rbp,%rsi,1),%xmm2
punpcklbw %xmm0,%xmm2
movdqa %xmm2,%xmm3
punpcklwd %xmm0,%xmm3
punpckhwd %xmm0,%xmm2
movdqa %xmm2,%xmm4
psrld  $0x1,%xmm4
movdqa %xmm3,%xmm5
psrld  $0x1,%xmm5
paddd  %xmm3,%xmm5
paddd  %xmm2,%xmm4
movdqa %xmm1,%xmm2
pcmpgtd %xmm4,%xmm2
pand   %xmm2,%xmm4
pandn  %xmm1,%xmm2
por    %xmm4,%xmm2
movdqa %xmm1,%xmm3
pcmpgtd %xmm5,%xmm3
pand   %xmm3,%xmm5
pandn  %xmm1,%xmm3
por    %xmm5,%xmm3
packuswb %xmm2,%xmm3
packuswb %xmm3,%xmm3
movq   %xmm3,(%rax,%rsi,1)
add    $0x8,%rsi
cmp    %rsi,%rdx
jne    1210 <plusClairNB+0x100>
cmp    %rcx,%rdx
jne    1163 <plusClairNB+0x53>
jmp    11da <plusClairNB+0xca>
mov    %ecx,%edx
and    $0xfffffff0,%edx
lea    -0x10(%rdx),%rsi
mov    %rsi,%rbx
shr    $0x4,%rbx
add    $0x1,%rbx
test   %rsi,%rsi
je     1554 <plusClairNB+0x444>
mov    %rbx,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %esi,%esi
pxor   %xmm8,%xmm8
movdqa 0xd40(%rip),%xmm9
movdqu 0x0(%rbp,%rsi,1),%xmm5
movdqa %xmm5,%xmm6
punpckhbw %xmm8,%xmm6
movdqa %xmm6,%xmm0
punpcklwd %xmm8,%xmm0
punpckhwd %xmm8,%xmm6
punpcklbw %xmm8,%xmm5
movdqa %xmm5,%xmm1
punpcklwd %xmm8,%xmm1
punpckhwd %xmm8,%xmm5
movdqa %xmm5,%xmm4
psrld  $0x1,%xmm4
movdqa %xmm1,%xmm7
psrld  $0x1,%xmm7
movdqa %xmm6,%xmm3
psrld  $0x1,%xmm3
movdqa %xmm0,%xmm2
psrld  $0x1,%xmm2
paddd  %xmm0,%xmm2
paddd  %xmm6,%xmm3
paddd  %xmm1,%xmm7
paddd  %xmm5,%xmm4
movdqa %xmm9,%xmm0
pcmpgtd %xmm4,%xmm0
pand   %xmm0,%xmm4
pandn  %xmm9,%xmm0
por    %xmm4,%xmm0
movdqa %xmm9,%xmm1
pcmpgtd %xmm7,%xmm1
pand   %xmm1,%xmm7
pandn  %xmm9,%xmm1
por    %xmm7,%xmm1
packuswb %xmm0,%xmm1
movdqa %xmm9,%xmm0
pcmpgtd %xmm3,%xmm0
pand   %xmm0,%xmm3
pandn  %xmm9,%xmm0
por    %xmm3,%xmm0
movdqa %xmm9,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm9,%xmm3
por    %xmm2,%xmm3
packuswb %xmm0,%xmm3
packuswb %xmm3,%xmm1
movdqu %xmm1,(%rax,%rsi,1)
movdqu 0x10(%rbp,%rsi,1),%xmm0
movdqa %xmm0,%xmm1
punpckhbw %xmm8,%xmm1
movdqa %xmm1,%xmm4
punpcklwd %xmm8,%xmm4
punpckhwd %xmm8,%xmm1
punpcklbw %xmm8,%xmm0
movdqa %xmm0,%xmm5
punpcklwd %xmm8,%xmm5
punpckhwd %xmm8,%xmm0
movdqa %xmm0,%xmm6
psrld  $0x1,%xmm6
movdqa %xmm5,%xmm7
psrld  $0x1,%xmm7
movdqa %xmm1,%xmm3
psrld  $0x1,%xmm3
movdqa %xmm4,%xmm2
psrld  $0x1,%xmm2
paddd  %xmm4,%xmm2
paddd  %xmm1,%xmm3
paddd  %xmm5,%xmm7
paddd  %xmm0,%xmm6
movdqa %xmm9,%xmm0
pcmpgtd %xmm6,%xmm0
pand   %xmm0,%xmm6
pandn  %xmm9,%xmm0
por    %xmm6,%xmm0
movdqa %xmm9,%xmm1
pcmpgtd %xmm7,%xmm1
pand   %xmm1,%xmm7
pandn  %xmm9,%xmm1
por    %xmm7,%xmm1
packuswb %xmm0,%xmm1
movdqa %xmm9,%xmm0
pcmpgtd %xmm3,%xmm0
pand   %xmm0,%xmm3
pandn  %xmm9,%xmm0
por    %xmm3,%xmm0
movdqa %xmm9,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm9,%xmm3
por    %xmm2,%xmm3
packuswb %xmm0,%xmm3
packuswb %xmm3,%xmm1
movdqu %xmm1,0x10(%rax,%rsi,1)
add    $0x20,%rsi
add    $0xfffffffffffffffe,%rdi
jne    12c0 <plusClairNB+0x1b0>
test   $0x1,%bl
je     153d <plusClairNB+0x42d>
movdqu 0x0(%rbp,%rsi,1),%xmm2
pxor   %xmm0,%xmm0
movdqa %xmm2,%xmm3
punpckhbw %xmm0,%xmm3
movdqa %xmm3,%xmm4
punpcklwd %xmm0,%xmm4
punpckhwd %xmm0,%xmm3
punpcklbw %xmm0,%xmm2
movdqa %xmm2,%xmm5
punpcklwd %xmm0,%xmm5
punpckhwd %xmm0,%xmm2
movdqa %xmm2,%xmm6
psrld  $0x1,%xmm6
movdqa %xmm5,%xmm7
psrld  $0x1,%xmm7
movdqa %xmm3,%xmm1
psrld  $0x1,%xmm1
movdqa %xmm4,%xmm0
psrld  $0x1,%xmm0
paddd  %xmm4,%xmm0
paddd  %xmm3,%xmm1
paddd  %xmm5,%xmm7
paddd  %xmm2,%xmm6
movdqa 0xb24(%rip),%xmm2
movdqa %xmm2,%xmm3
pcmpgtd %xmm6,%xmm3
pand   %xmm3,%xmm6
pandn  %xmm2,%xmm3
por    %xmm6,%xmm3
movdqa %xmm2,%xmm4
pcmpgtd %xmm7,%xmm4
pand   %xmm4,%xmm7
pandn  %xmm2,%xmm4
por    %xmm7,%xmm4
packuswb %xmm3,%xmm4
movdqa %xmm2,%xmm3
pcmpgtd %xmm1,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm2,%xmm3
por    %xmm1,%xmm3
movdqa %xmm2,%xmm1
pcmpgtd %xmm0,%xmm1
pand   %xmm1,%xmm0
pandn  %xmm2,%xmm1
por    %xmm0,%xmm1
packuswb %xmm3,%xmm1
packuswb %xmm1,%xmm4
movdqu %xmm4,(%rax,%rsi,1)
cmp    %rcx,%rdx
je     11da <plusClairNB+0xca>
test   $0x8,%cl
jne    11fa <plusClairNB+0xea>
jmp    1163 <plusClairNB+0x53>
xor    %esi,%esi
test   $0x1,%bl
jne    1472 <plusClairNB+0x362>
jmp    153d <plusClairNB+0x42d>

LLVM IR (-O0):
define i8* @plusClairNB(i8* %0, i32 %1, i32 %2, i32* %3, i32* %4) {
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i8*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32* %3, i32** %9
store i32* %4, i32** %10
%15 = load i32, i32* %7
%16 = load i32, i32* %8
%17 = mul nsw i32 %15, %16
%18 = call i64 @malloc(i32 %17)
%19 = inttoptr i64 %18 to i8*
store i8* %19, i8** %11
%20 = load i32, i32* %7
%21 = load i32, i32* %8
%22 = mul nsw i32 %20, %21
store i32 %22, i32* %12
store i32 0, i32* %13
br label %23
23: ; preds = %52, %5
%24 = load i32, i32* %13
%25 = load i32, i32* %12
%26 = icmp slt i32 %24, %25
br i1 %26, label %27, label %55
27: ; preds = %23
%28 = load i8*, i8** %6
%29 = load i32, i32* %13
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %28, i64 %30
%32 = load i8, i8* %31
%33 = zext i8 %32 to i32
%34 = load i8*, i8** %6
%35 = load i32, i32* %13
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %34, i64 %36
%38 = load i8, i8* %37
%39 = zext i8 %38 to i32
%40 = sdiv i32 %39, 2
%41 = add nsw i32 %33, %40
store i32 %41, i32* %14
%42 = load i32, i32* %14
%43 = icmp ugt i32 %42, 255
br i1 %43, label %44, label %45
44: ; preds = %27
store i32 255, i32* %14
br label %45
45: ; preds = %44, %27
%46 = load i32, i32* %14
%47 = trunc i32 %46 to i8
%48 = load i8*, i8** %11
%49 = load i32, i32* %13
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %48, i64 %50
store i8 %47, i8* %51
br label %52
52: ; preds = %45
%53 = load i32, i32* %13
%54 = add nsw i32 %53, 1
store i32 %54, i32* %13
br label %23
55: ; preds = %23
%56 = load i32, i32* %7
%57 = load i32*, i32** %9
store i32 %56, i32* %57
%58 = load i32, i32* %8
%59 = load i32*, i32** %10
store i32 %58, i32* %59
%60 = load i8*, i8** %11
ret i8* %60
}

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