void MC_avg_y_16_c(unsigned char *dest, const unsigned char *ref,
                   const int stride, int height) {
  do {
    dest[0] = (((((ref[0] + (ref + stride)[0] + 1) >> 1)) + dest[0] + 1) >> 1);
    dest[1] = (((((ref[1] + (ref + stride)[1] + 1) >> 1)) + dest[1] + 1) >> 1);
    dest[2] = (((((ref[2] + (ref + stride)[2] + 1) >> 1)) + dest[2] + 1) >> 1);
    dest[3] = (((((ref[3] + (ref + stride)[3] + 1) >> 1)) + dest[3] + 1) >> 1);
    dest[4] = (((((ref[4] + (ref + stride)[4] + 1) >> 1)) + dest[4] + 1) >> 1);
    dest[5] = (((((ref[5] + (ref + stride)[5] + 1) >> 1)) + dest[5] + 1) >> 1);
    dest[6] = (((((ref[6] + (ref + stride)[6] + 1) >> 1)) + dest[6] + 1) >> 1);
    dest[7] = (((((ref[7] + (ref + stride)[7] + 1) >> 1)) + dest[7] + 1) >> 1);
    dest[8] = (((((ref[8] + (ref + stride)[8] + 1) >> 1)) + dest[8] + 1) >> 1);
    dest[9] = (((((ref[9] + (ref + stride)[9] + 1) >> 1)) + dest[9] + 1) >> 1);
    dest[10] =
        (((((ref[10] + (ref + stride)[10] + 1) >> 1)) + dest[10] + 1) >> 1);
    dest[11] =
        (((((ref[11] + (ref + stride)[11] + 1) >> 1)) + dest[11] + 1) >> 1);
    dest[12] =
        (((((ref[12] + (ref + stride)[12] + 1) >> 1)) + dest[12] + 1) >> 1);
    dest[13] =
        (((((ref[13] + (ref + stride)[13] + 1) >> 1)) + dest[13] + 1) >> 1);
    dest[14] =
        (((((ref[14] + (ref + stride)[14] + 1) >> 1)) + dest[14] + 1) >> 1);
    dest[15] =
        (((((ref[15] + (ref + stride)[15] + 1) >> 1)) + dest[15] + 1) >> 1);
    ref += stride;
    dest += stride;
  } while (--height);
}


x86 assembly (clang, -O0):
<MC_avg_y_16_c>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl (%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x1(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x2(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x3(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x4(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x4(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x5(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x5(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x6(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x6(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x6(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x7(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x7(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x7(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x7(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x8(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x8(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x8(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x8(%rax)
mov    -0x10(%rbp),%rax
movzbl 0x9(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0x9(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0x9(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x9(%rax)
mov    -0x10(%rbp),%rax
movzbl 0xa(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0xa(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0xa(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xa(%rax)
mov    -0x10(%rbp),%rax
movzbl 0xb(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0xb(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0xb(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xb(%rax)
mov    -0x10(%rbp),%rax
movzbl 0xc(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0xc(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0xc(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xc(%rax)
mov    -0x10(%rbp),%rax
movzbl 0xd(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0xd(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0xd(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xd(%rax)
mov    -0x10(%rbp),%rax
movzbl 0xe(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0xe(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0xe(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xe(%rax)
mov    -0x10(%rbp),%rax
movzbl 0xf(%rax),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl 0xf(%rcx,%rdx,1),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    -0x8(%rbp),%rcx
movzbl 0xf(%rcx),%ecx
add    %ecx,%eax
add    $0x1,%eax
sar    $0x1,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0xf(%rax)
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    1112 <MC_avg_y_16_c+0x12>
pop    %rbp
ret

x86 assembly (clang, -O2):
<MC_avg_y_16_c>:
movslq %edx,%r8
add    $0xf,%rsi
add    $0xf,%rdi
nopl   0x0(%rax,%rax,1)
movzbl -0xf(%rsi),%edx
movzbl -0xf(%rsi,%r8,1),%eax
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0xf(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xf(%rdi)
movzbl -0xe(%rsi),%eax
movzbl -0xe(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0xe(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xe(%rdi)
movzbl -0xd(%rsi),%eax
movzbl -0xd(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0xd(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xd(%rdi)
movzbl -0xc(%rsi),%eax
movzbl -0xc(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0xc(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xc(%rdi)
movzbl -0xb(%rsi),%eax
movzbl -0xb(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0xb(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xb(%rdi)
movzbl -0xa(%rsi),%eax
movzbl -0xa(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0xa(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0xa(%rdi)
movzbl -0x9(%rsi),%eax
movzbl -0x9(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x9(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x9(%rdi)
movzbl -0x8(%rsi),%eax
movzbl -0x8(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x8(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x8(%rdi)
movzbl -0x7(%rsi),%eax
movzbl -0x7(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x7(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x7(%rdi)
movzbl -0x6(%rsi),%eax
movzbl -0x6(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x6(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x6(%rdi)
movzbl -0x5(%rsi),%eax
movzbl -0x5(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x5(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x5(%rdi)
movzbl -0x4(%rsi),%eax
movzbl -0x4(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x4(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x4(%rdi)
movzbl -0x3(%rsi),%eax
movzbl -0x3(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x3(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x3(%rdi)
movzbl -0x2(%rsi),%eax
movzbl -0x2(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x2(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x2(%rdi)
movzbl -0x1(%rsi),%eax
movzbl -0x1(%rsi,%r8,1),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl -0x1(%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,-0x1(%rdi)
movzbl (%rsi),%eax
movzbl (%rsi,%r8,1),%edx
add    %r8,%rsi
add    %edx,%eax
add    $0x1,%eax
shr    %eax
movzbl (%rdi),%edx
add    %edx,%eax
add    $0x1,%eax
shr    %eax
mov    %al,(%rdi)
add    %r8,%rdi
add    $0xffffffff,%ecx
jne    1110 <MC_avg_y_16_c+0x10>
ret

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

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