void recha(unsigned char *s, unsigned char *d, int lx2, int h) {
  unsigned char *dp, *sp;
  unsigned int s1, s2;
  int j;
  sp = s;
  dp = d;
  for (j = 0; j < h; j++) {
    s1 = sp[0];
    dp[0] = (dp[0] + ((unsigned int)(s1 + (s2 = sp[1]) + 1) >> 1) + 1) >> 1;
    dp[1] = (dp[1] + ((unsigned int)(s2 + (s1 = sp[2]) + 1) >> 1) + 1) >> 1;
    dp[2] = (dp[2] + ((unsigned int)(s1 + (s2 = sp[3]) + 1) >> 1) + 1) >> 1;
    dp[3] = (dp[3] + ((unsigned int)(s2 + (s1 = sp[4]) + 1) >> 1) + 1) >> 1;
    dp[4] = (dp[4] + ((unsigned int)(s1 + (s2 = sp[5]) + 1) >> 1) + 1) >> 1;
    dp[5] = (dp[5] + ((unsigned int)(s2 + (s1 = sp[6]) + 1) >> 1) + 1) >> 1;
    dp[6] = (dp[6] + ((unsigned int)(s1 + (s2 = sp[7]) + 1) >> 1) + 1) >> 1;
    dp[7] = (dp[7] + ((unsigned int)(s2 + (s1 = sp[8]) + 1) >> 1) + 1) >> 1;
    dp[8] = (dp[8] + ((unsigned int)(s1 + (s2 = sp[9]) + 1) >> 1) + 1) >> 1;
    dp[9] = (dp[9] + ((unsigned int)(s2 + (s1 = sp[10]) + 1) >> 1) + 1) >> 1;
    dp[10] = (dp[10] + ((unsigned int)(s1 + (s2 = sp[11]) + 1) >> 1) + 1) >> 1;
    dp[11] = (dp[11] + ((unsigned int)(s2 + (s1 = sp[12]) + 1) >> 1) + 1) >> 1;
    dp[12] = (dp[12] + ((unsigned int)(s1 + (s2 = sp[13]) + 1) >> 1) + 1) >> 1;
    dp[13] = (dp[13] + ((unsigned int)(s2 + (s1 = sp[14]) + 1) >> 1) + 1) >> 1;
    dp[14] = (dp[14] + ((unsigned int)(s1 + (s2 = sp[15]) + 1) >> 1) + 1) >> 1;
    dp[15] = (dp[15] + ((unsigned int)(s2 + sp[16] + 1) >> 1) + 1) >> 1;
    sp += lx2;
    dp += lx2;
  }
}


x86 assembly (clang, -O0):
<recha>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    145a <recha+0x35a>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x1(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x2(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x3(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x3(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x4(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x4(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x5(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x5(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x6(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x6(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x7(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x7(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x8(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x7(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x8(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x9(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x8(%rax)
mov    -0x20(%rbp),%rax
movzbl 0x9(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0xa(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0x9(%rax)
mov    -0x20(%rbp),%rax
movzbl 0xa(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0xb(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0xa(%rax)
mov    -0x20(%rbp),%rax
movzbl 0xb(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0xc(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0xb(%rax)
mov    -0x20(%rbp),%rax
movzbl 0xc(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0xd(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0xc(%rax)
mov    -0x20(%rbp),%rax
movzbl 0xd(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0xe(%rdx),%edx
mov    %edx,-0x2c(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0xd(%rax)
mov    -0x20(%rbp),%rax
movzbl 0xe(%rax),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0xf(%rdx),%edx
mov    %edx,-0x30(%rbp)
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0xe(%rax)
mov    -0x20(%rbp),%rax
movzbl 0xf(%rax),%eax
mov    -0x30(%rbp),%ecx
mov    -0x28(%rbp),%rdx
movzbl 0x10(%rdx),%edx
add    %edx,%ecx
add    $0x1,%ecx
shr    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
shr    $0x1,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %cl,0xf(%rax)
mov    -0x14(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1129 <recha+0x29>
pop    %rbp
ret

x86 assembly (clang, -O2):
<recha>:
test   %ecx,%ecx
jle    132d <recha+0x22d>
movslq %edx,%r8
mov    $0xf,%edx
movzbl -0xf(%rdi,%rdx,1),%r10d
movzbl -0xf(%rsi,%rdx,1),%r9d
movzbl -0xe(%rdi,%rdx,1),%r11d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xf(%rsi,%rdx,1)
movzbl -0xe(%rsi,%rdx,1),%r9d
movzbl -0xd(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xe(%rsi,%rdx,1)
movzbl -0xd(%rsi,%rdx,1),%r9d
movzbl -0xc(%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xd(%rsi,%rdx,1)
movzbl -0xc(%rsi,%rdx,1),%r9d
movzbl -0xb(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xc(%rsi,%rdx,1)
movzbl -0xb(%rsi,%rdx,1),%r9d
movzbl -0xa(%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xb(%rsi,%rdx,1)
movzbl -0xa(%rsi,%rdx,1),%r9d
movzbl -0x9(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xa(%rsi,%rdx,1)
movzbl -0x9(%rsi,%rdx,1),%r9d
movzbl -0x8(%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x9(%rsi,%rdx,1)
movzbl -0x8(%rsi,%rdx,1),%r9d
movzbl -0x7(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x8(%rsi,%rdx,1)
movzbl -0x7(%rsi,%rdx,1),%r9d
movzbl -0x6(%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x7(%rsi,%rdx,1)
movzbl -0x6(%rsi,%rdx,1),%r9d
movzbl -0x5(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x6(%rsi,%rdx,1)
movzbl -0x5(%rsi,%rdx,1),%r9d
movzbl -0x4(%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x5(%rsi,%rdx,1)
movzbl -0x4(%rsi,%rdx,1),%r9d
movzbl -0x3(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x4(%rsi,%rdx,1)
movzbl -0x3(%rsi,%rdx,1),%r9d
movzbl -0x2(%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x3(%rsi,%rdx,1)
movzbl -0x2(%rsi,%rdx,1),%r9d
movzbl -0x1(%rdi,%rdx,1),%r10d
lea    (%r11,%r10,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x2(%rsi,%rdx,1)
movzbl -0x1(%rsi,%rdx,1),%r9d
movzbl (%rdi,%rdx,1),%r11d
lea    (%r10,%r11,1),%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x1(%rsi,%rdx,1)
movzbl (%rsi,%rdx,1),%r9d
movzbl 0x1(%rdi,%rdx,1),%eax
add    %r11d,%eax
add    $0x1,%eax
shr    %eax
add    %r9d,%eax
add    $0x1,%eax
shr    %eax
mov    %al,(%rsi,%rdx,1)
add    %r8,%rdx
add    $0xffffffff,%ecx
jne    1110 <recha+0x10>
ret

LLVM IR (-O0):
define void @recha(i8* %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%14 = load i8*, i8** %5
store i8* %14, i8** %10
%15 = load i8*, i8** %6
store i8* %15, i8** %9
store i32 0, i32* %13
br label %16
16: ; preds = %321, %4
%17 = load i32, i32* %13
%18 = load i32, i32* %8
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %324
20: ; preds = %16
%21 = load i8*, i8** %10
%22 = getelementptr inbounds i8, i8* %21, i64 0
%23 = load i8, i8* %22
%24 = zext i8 %23 to i32
store i32 %24, i32* %11
%25 = load i8*, i8** %9
%26 = getelementptr inbounds i8, i8* %25, i64 0
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = load i32, i32* %11
%30 = load i8*, i8** %10
%31 = getelementptr inbounds i8, i8* %30, i64 1
%32 = load i8, i8* %31
%33 = zext i8 %32 to i32
store i32 %33, i32* %12
%34 = add i32 %29, %33
%35 = add i32 %34, 1
%36 = lshr i32 %35, 1
%37 = add i32 %28, %36
%38 = add i32 %37, 1
%39 = lshr i32 %38, 1
%40 = trunc i32 %39 to i8
%41 = load i8*, i8** %9
%42 = getelementptr inbounds i8, i8* %41, i64 0
store i8 %40, i8* %42
%43 = load i8*, i8** %9
%44 = getelementptr inbounds i8, i8* %43, i64 1
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = load i32, i32* %12
%48 = load i8*, i8** %10
%49 = getelementptr inbounds i8, i8* %48, i64 2
%50 = load i8, i8* %49
%51 = zext i8 %50 to i32
store i32 %51, i32* %11
%52 = add i32 %47, %51
%53 = add i32 %52, 1
%54 = lshr i32 %53, 1
%55 = add i32 %46, %54
%56 = add i32 %55, 1
%57 = lshr i32 %56, 1
%58 = trunc i32 %57 to i8
%59 = load i8*, i8** %9
%60 = getelementptr inbounds i8, i8* %59, i64 1
store i8 %58, i8* %60
%61 = load i8*, i8** %9
%62 = getelementptr inbounds i8, i8* %61, i64 2
%63 = load i8, i8* %62
%64 = zext i8 %63 to i32
%65 = load i32, i32* %11
%66 = load i8*, i8** %10
%67 = getelementptr inbounds i8, i8* %66, i64 3
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
store i32 %69, i32* %12
%70 = add i32 %65, %69
%71 = add i32 %70, 1
%72 = lshr i32 %71, 1
%73 = add i32 %64, %72
%74 = add i32 %73, 1
%75 = lshr i32 %74, 1
%76 = trunc i32 %75 to i8
%77 = load i8*, i8** %9
%78 = getelementptr inbounds i8, i8* %77, i64 2
store i8 %76, i8* %78
%79 = load i8*, i8** %9
%80 = getelementptr inbounds i8, i8* %79, i64 3
%81 = load i8, i8* %80
%82 = zext i8 %81 to i32
%83 = load i32, i32* %12
%84 = load i8*, i8** %10
%85 = getelementptr inbounds i8, i8* %84, i64 4
%86 = load i8, i8* %85
%87 = zext i8 %86 to i32
store i32 %87, i32* %11
%88 = add i32 %83, %87
%89 = add i32 %88, 1
%90 = lshr i32 %89, 1
%91 = add i32 %82, %90
%92 = add i32 %91, 1
%93 = lshr i32 %92, 1
%94 = trunc i32 %93 to i8
%95 = load i8*, i8** %9
%96 = getelementptr inbounds i8, i8* %95, i64 3
store i8 %94, i8* %96
%97 = load i8*, i8** %9
%98 = getelementptr inbounds i8, i8* %97, i64 4
%99 = load i8, i8* %98
%100 = zext i8 %99 to i32
%101 = load i32, i32* %11
%102 = load i8*, i8** %10
%103 = getelementptr inbounds i8, i8* %102, i64 5
%104 = load i8, i8* %103
%105 = zext i8 %104 to i32
store i32 %105, i32* %12
%106 = add i32 %101, %105
%107 = add i32 %106, 1
%108 = lshr i32 %107, 1
%109 = add i32 %100, %108
%110 = add i32 %109, 1
%111 = lshr i32 %110, 1
%112 = trunc i32 %111 to i8
%113 = load i8*, i8** %9
%114 = getelementptr inbounds i8, i8* %113, i64 4
store i8 %112, i8* %114
%115 = load i8*, i8** %9
%116 = getelementptr inbounds i8, i8* %115, i64 5
%117 = load i8, i8* %116
%118 = zext i8 %117 to i32
%119 = load i32, i32* %12
%120 = load i8*, i8** %10
%121 = getelementptr inbounds i8, i8* %120, i64 6
%122 = load i8, i8* %121
%123 = zext i8 %122 to i32
store i32 %123, i32* %11
%124 = add i32 %119, %123
%125 = add i32 %124, 1
%126 = lshr i32 %125, 1
%127 = add i32 %118, %126
%128 = add i32 %127, 1
%129 = lshr i32 %128, 1
%130 = trunc i32 %129 to i8
%131 = load i8*, i8** %9
%132 = getelementptr inbounds i8, i8* %131, i64 5
store i8 %130, i8* %132
%133 = load i8*, i8** %9
%134 = getelementptr inbounds i8, i8* %133, i64 6
%135 = load i8, i8* %134
%136 = zext i8 %135 to i32
%137 = load i32, i32* %11
%138 = load i8*, i8** %10
%139 = getelementptr inbounds i8, i8* %138, i64 7
%140 = load i8, i8* %139
%141 = zext i8 %140 to i32
store i32 %141, i32* %12
%142 = add i32 %137, %141
%143 = add i32 %142, 1
%144 = lshr i32 %143, 1
%145 = add i32 %136, %144
%146 = add i32 %145, 1
%147 = lshr i32 %146, 1
%148 = trunc i32 %147 to i8
%149 = load i8*, i8** %9
%150 = getelementptr inbounds i8, i8* %149, i64 6
store i8 %148, i8* %150
%151 = load i8*, i8** %9
%152 = getelementptr inbounds i8, i8* %151, i64 7
%153 = load i8, i8* %152
%154 = zext i8 %153 to i32
%155 = load i32, i32* %12
%156 = load i8*, i8** %10
%157 = getelementptr inbounds i8, i8* %156, i64 8
%158 = load i8, i8* %157
%159 = zext i8 %158 to i32
store i32 %159, i32* %11
%160 = add i32 %155, %159
%161 = add i32 %160, 1
%162 = lshr i32 %161, 1
%163 = add i32 %154, %162
%164 = add i32 %163, 1
%165 = lshr i32 %164, 1
%166 = trunc i32 %165 to i8
%167 = load i8*, i8** %9
%168 = getelementptr inbounds i8, i8* %167, i64 7
store i8 %166, i8* %168
%169 = load i8*, i8** %9
%170 = getelementptr inbounds i8, i8* %169, i64 8
%171 = load i8, i8* %170
%172 = zext i8 %171 to i32
%173 = load i32, i32* %11
%174 = load i8*, i8** %10
%175 = getelementptr inbounds i8, i8* %174, i64 9
%176 = load i8, i8* %175
%177 = zext i8 %176 to i32
store i32 %177, i32* %12
%178 = add i32 %173, %177
%179 = add i32 %178, 1
%180 = lshr i32 %179, 1
%181 = add i32 %172, %180
%182 = add i32 %181, 1
%183 = lshr i32 %182, 1
%184 = trunc i32 %183 to i8
%185 = load i8*, i8** %9
%186 = getelementptr inbounds i8, i8* %185, i64 8
store i8 %184, i8* %186
%187 = load i8*, i8** %9
%188 = getelementptr inbounds i8, i8* %187, i64 9
%189 = load i8, i8* %188
%190 = zext i8 %189 to i32
%191 = load i32, i32* %12
%192 = load i8*, i8** %10
%193 = getelementptr inbounds i8, i8* %192, i64 10
%194 = load i8, i8* %193
%195 = zext i8 %194 to i32
store i32 %195, i32* %11
%196 = add i32 %191, %195
%197 = add i32 %196, 1
%198 = lshr i32 %197, 1
%199 = add i32 %190, %198
%200 = add i32 %199, 1
%201 = lshr i32 %200, 1
%202 = trunc i32 %201 to i8
%203 = load i8*, i8** %9
%204 = getelementptr inbounds i8, i8* %203, i64 9
store i8 %202, i8* %204
%205 = load i8*, i8** %9
%206 = getelementptr inbounds i8, i8* %205, i64 10
%207 = load i8, i8* %206
%208 = zext i8 %207 to i32
%209 = load i32, i32* %11
%210 = load i8*, i8** %10
%211 = getelementptr inbounds i8, i8* %210, i64 11
%212 = load i8, i8* %211
%213 = zext i8 %212 to i32
store i32 %213, i32* %12
%214 = add i32 %209, %213
%215 = add i32 %214, 1
%216 = lshr i32 %215, 1
%217 = add i32 %208, %216
%218 = add i32 %217, 1
%219 = lshr i32 %218, 1
%220 = trunc i32 %219 to i8
%221 = load i8*, i8** %9
%222 = getelementptr inbounds i8, i8* %221, i64 10
store i8 %220, i8* %222
%223 = load i8*, i8** %9
%224 = getelementptr inbounds i8, i8* %223, i64 11
%225 = load i8, i8* %224
%226 = zext i8 %225 to i32
%227 = load i32, i32* %12
%228 = load i8*, i8** %10
%229 = getelementptr inbounds i8, i8* %228, i64 12
%230 = load i8, i8* %229
%231 = zext i8 %230 to i32
store i32 %231, i32* %11
%232 = add i32 %227, %231
%233 = add i32 %232, 1
%234 = lshr i32 %233, 1
%235 = add i32 %226, %234
%236 = add i32 %235, 1
%237 = lshr i32 %236, 1
%238 = trunc i32 %237 to i8
%239 = load i8*, i8** %9
%240 = getelementptr inbounds i8, i8* %239, i64 11
store i8 %238, i8* %240
%241 = load i8*, i8** %9
%242 = getelementptr inbounds i8, i8* %241, i64 12
%243 = load i8, i8* %242
%244 = zext i8 %243 to i32
%245 = load i32, i32* %11
%246 = load i8*, i8** %10
%247 = getelementptr inbounds i8, i8* %246, i64 13
%248 = load i8, i8* %247
%249 = zext i8 %248 to i32
store i32 %249, i32* %12
%250 = add i32 %245, %249
%251 = add i32 %250, 1
%252 = lshr i32 %251, 1
%253 = add i32 %244, %252
%254 = add i32 %253, 1
%255 = lshr i32 %254, 1
%256 = trunc i32 %255 to i8
%257 = load i8*, i8** %9
%258 = getelementptr inbounds i8, i8* %257, i64 12
store i8 %256, i8* %258
%259 = load i8*, i8** %9
%260 = getelementptr inbounds i8, i8* %259, i64 13
%261 = load i8, i8* %260
%262 = zext i8 %261 to i32
%263 = load i32, i32* %12
%264 = load i8*, i8** %10
%265 = getelementptr inbounds i8, i8* %264, i64 14
%266 = load i8, i8* %265
%267 = zext i8 %266 to i32
store i32 %267, i32* %11
%268 = add i32 %263, %267
%269 = add i32 %268, 1
%270 = lshr i32 %269, 1
%271 = add i32 %262, %270
%272 = add i32 %271, 1
%273 = lshr i32 %272, 1
%274 = trunc i32 %273 to i8
%275 = load i8*, i8** %9
%276 = getelementptr inbounds i8, i8* %275, i64 13
store i8 %274, i8* %276
%277 = load i8*, i8** %9
%278 = getelementptr inbounds i8, i8* %277, i64 14
%279 = load i8, i8* %278
%280 = zext i8 %279 to i32
%281 = load i32, i32* %11
%282 = load i8*, i8** %10
%283 = getelementptr inbounds i8, i8* %282, i64 15
%284 = load i8, i8* %283
%285 = zext i8 %284 to i32
store i32 %285, i32* %12
%286 = add i32 %281, %285
%287 = add i32 %286, 1
%288 = lshr i32 %287, 1
%289 = add i32 %280, %288
%290 = add i32 %289, 1
%291 = lshr i32 %290, 1
%292 = trunc i32 %291 to i8
%293 = load i8*, i8** %9
%294 = getelementptr inbounds i8, i8* %293, i64 14
store i8 %292, i8* %294
%295 = load i8*, i8** %9
%296 = getelementptr inbounds i8, i8* %295, i64 15
%297 = load i8, i8* %296
%298 = zext i8 %297 to i32
%299 = load i32, i32* %12
%300 = load i8*, i8** %10
%301 = getelementptr inbounds i8, i8* %300, i64 16
%302 = load i8, i8* %301
%303 = zext i8 %302 to i32
%304 = add i32 %299, %303
%305 = add i32 %304, 1
%306 = lshr i32 %305, 1
%307 = add i32 %298, %306
%308 = add i32 %307, 1
%309 = lshr i32 %308, 1
%310 = trunc i32 %309 to i8
%311 = load i8*, i8** %9
%312 = getelementptr inbounds i8, i8* %311, i64 15
store i8 %310, i8* %312
%313 = load i32, i32* %7
%314 = load i8*, i8** %10
%315 = sext i32 %313 to i64
%316 = getelementptr inbounds i8, i8* %314, i64 %315
store i8* %316, i8** %10
%317 = load i32, i32* %7
%318 = load i8*, i8** %9
%319 = sext i32 %317 to i64
%320 = getelementptr inbounds i8, i8* %318, i64 %319
store i8* %320, i8** %9
br label %321
321: ; preds = %20
%322 = load i32, i32* %13
%323 = add nsw i32 %322, 1
store i32 %323, i32* %13
br label %16
324: ; preds = %16
ret void
}

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