void __attribute__((noipa))
f(signed char *restrict a, signed char *restrict b, signed char *restrict c) {
  for (long int i = 0; i < 50; ++i) {
    int tmp = b[i];
    tmp ^= 0x55;
    tmp += 0;
    tmp += c[i];
    tmp >>= 1;
    tmp |= 0x40;
    a[i] = tmp;
  }
}


x86 assembly (clang, -O0):
<f>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
cmpq   $0x32,-0x20(%rbp)
jge    1189 <f+0x89>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
xor    $0x55,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
or     $0x40,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1118 <f+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<f>:
movdqu (%rsi),%xmm0
movdqa 0xef4(%rip),%xmm1
pxor   %xmm1,%xmm0
punpcklbw %xmm0,%xmm2
psraw  $0x8,%xmm2
punpckhbw %xmm0,%xmm0
psraw  $0x8,%xmm0
movdqu (%rdx),%xmm3
punpcklbw %xmm3,%xmm4
psraw  $0x8,%xmm4
paddw  %xmm2,%xmm4
punpckhbw %xmm3,%xmm2
psraw  $0x8,%xmm2
paddw  %xmm0,%xmm2
psrlw  $0x1,%xmm4
psrlw  $0x1,%xmm2
movdqa 0xebe(%rip),%xmm0
pand   %xmm0,%xmm2
pand   %xmm0,%xmm4
packuswb %xmm2,%xmm4
movdqa 0xeba(%rip),%xmm2
por    %xmm2,%xmm4
movdqu %xmm4,(%rdi)
movdqu 0x10(%rsi),%xmm3
pxor   %xmm1,%xmm3
punpcklbw %xmm3,%xmm4
psraw  $0x8,%xmm4
punpckhbw %xmm3,%xmm3
psraw  $0x8,%xmm3
movdqu 0x10(%rdx),%xmm5
punpcklbw %xmm5,%xmm6
psraw  $0x8,%xmm6
paddw  %xmm4,%xmm6
punpckhbw %xmm5,%xmm4
psraw  $0x8,%xmm4
paddw  %xmm3,%xmm4
psrlw  $0x1,%xmm6
psrlw  $0x1,%xmm4
pand   %xmm0,%xmm4
pand   %xmm0,%xmm6
packuswb %xmm4,%xmm6
por    %xmm2,%xmm6
movdqu %xmm6,0x10(%rdi)
movdqu 0x20(%rsi),%xmm3
pxor   %xmm1,%xmm3
punpcklbw %xmm3,%xmm1
psraw  $0x8,%xmm1
punpckhbw %xmm3,%xmm3
psraw  $0x8,%xmm3
movdqu 0x20(%rdx),%xmm4
punpcklbw %xmm4,%xmm5
psraw  $0x8,%xmm5
paddw  %xmm1,%xmm5
punpckhbw %xmm4,%xmm1
psraw  $0x8,%xmm1
paddw  %xmm3,%xmm1
psrlw  $0x1,%xmm5
psrlw  $0x1,%xmm1
pand   %xmm0,%xmm1
pand   %xmm0,%xmm5
packuswb %xmm1,%xmm5
por    %xmm2,%xmm5
movdqu %xmm5,0x20(%rdi)
movsbl 0x30(%rsi),%eax
xor    $0x55,%eax
movsbl 0x30(%rdx),%ecx
add    %eax,%ecx
shr    %ecx
or     $0x40,%cl
mov    %cl,0x30(%rdi)
movsbl 0x31(%rsi),%eax
xor    $0x55,%eax
movsbl 0x31(%rdx),%ecx
add    %eax,%ecx
shr    %ecx
or     $0x40,%cl
mov    %cl,0x31(%rdi)
ret

LLVM IR (-O0):
define void @f(i8* noalias %0, i8* noalias %1, i8* noalias %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
store i8* %2, i8** %6
store i64 0, i64* %7
br label %9
9: ; preds = %38, %3
%10 = load i64, i64* %7
%11 = icmp slt i64 %10, 50
br i1 %11, label %12, label %41
12: ; preds = %9
%13 = load i8*, i8** %5
%14 = load i64, i64* %7
%15 = getelementptr inbounds i8, i8* %13, i64 %14
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
store i32 %17, i32* %8
%18 = load i32, i32* %8
%19 = xor i32 %18, 85
store i32 %19, i32* %8
%20 = load i32, i32* %8
%21 = add nsw i32 %20, 0
store i32 %21, i32* %8
%22 = load i8*, i8** %6
%23 = load i64, i64* %7
%24 = getelementptr inbounds i8, i8* %22, i64 %23
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = load i32, i32* %8
%28 = add nsw i32 %27, %26
store i32 %28, i32* %8
%29 = load i32, i32* %8
%30 = ashr i32 %29, 1
store i32 %30, i32* %8
%31 = load i32, i32* %8
%32 = or i32 %31, 64
store i32 %32, i32* %8
%33 = load i32, i32* %8
%34 = trunc i32 %33 to i8
%35 = load i8*, i8** %4
%36 = load i64, i64* %7
%37 = getelementptr inbounds i8, i8* %35, i64 %36
store i8 %34, i8* %37
br label %38
38: ; preds = %12
%39 = load i64, i64* %7
%40 = add nsw i64 %39, 1
store i64 %40, i64* %7
br label %9
41: ; preds = %9
ret void
}

LLVM IR (-O2):
define void @f(i8* noalias nocapture writeonly %0, i8* noalias nocapture %1, i8* noalias nocapture %2) {
%4 = bitcast i8* %1 to <16 x i8>*
%5 = load <16 x i8>, <16 x i8>* %4
%6 = xor <16 x i8> %5, <i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85>
%7 = sext <16 x i8> %6 to <16 x i16>
%8 = bitcast i8* %2 to <16 x i8>*
%9 = load <16 x i8>, <16 x i8>* %8
%10 = sext <16 x i8> %9 to <16 x i16>
%11 = add nsw <16 x i16> %7, %10
%12 = lshr <16 x i16> %11, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%13 = trunc <16 x i16> %12 to <16 x i8>
%14 = or <16 x i8> %13, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
%15 = bitcast i8* %0 to <16 x i8>*
store <16 x i8> %14, <16 x i8>* %15
%16 = getelementptr inbounds i8, i8* %1, i64 16
%17 = bitcast i8* %16 to <16 x i8>*
%18 = load <16 x i8>, <16 x i8>* %17
%19 = xor <16 x i8> %18, <i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85>
%20 = sext <16 x i8> %19 to <16 x i16>
%21 = getelementptr inbounds i8, i8* %2, i64 16
%22 = bitcast i8* %21 to <16 x i8>*
%23 = load <16 x i8>, <16 x i8>* %22
%24 = sext <16 x i8> %23 to <16 x i16>
%25 = add nsw <16 x i16> %20, %24
%26 = lshr <16 x i16> %25, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%27 = trunc <16 x i16> %26 to <16 x i8>
%28 = or <16 x i8> %27, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
%29 = getelementptr inbounds i8, i8* %0, i64 16
%30 = bitcast i8* %29 to <16 x i8>*
store <16 x i8> %28, <16 x i8>* %30
%31 = getelementptr inbounds i8, i8* %1, i64 32
%32 = bitcast i8* %31 to <16 x i8>*
%33 = load <16 x i8>, <16 x i8>* %32
%34 = xor <16 x i8> %33, <i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85, i8 85>
%35 = sext <16 x i8> %34 to <16 x i16>
%36 = getelementptr inbounds i8, i8* %2, i64 32
%37 = bitcast i8* %36 to <16 x i8>*
%38 = load <16 x i8>, <16 x i8>* %37
%39 = sext <16 x i8> %38 to <16 x i16>
%40 = add nsw <16 x i16> %35, %39
%41 = lshr <16 x i16> %40, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%42 = trunc <16 x i16> %41 to <16 x i8>
%43 = or <16 x i8> %42, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
%44 = getelementptr inbounds i8, i8* %0, i64 32
%45 = bitcast i8* %44 to <16 x i8>*
store <16 x i8> %43, <16 x i8>* %45
%46 = getelementptr inbounds i8, i8* %1, i64 48
%47 = load i8, i8* %46
%48 = xor i8 %47, 85
%49 = sext i8 %48 to i16
%50 = getelementptr inbounds i8, i8* %2, i64 48
%51 = load i8, i8* %50
%52 = sext i8 %51 to i16
%53 = add nsw i16 %49, %52
%54 = lshr i16 %53, 1
%55 = trunc i16 %54 to i8
%56 = or i8 %55, 64
%57 = getelementptr inbounds i8, i8* %0, i64 48
store i8 %56, i8* %57
%58 = getelementptr inbounds i8, i8* %1, i64 49
%59 = load i8, i8* %58
%60 = xor i8 %59, 85
%61 = sext i8 %60 to i16
%62 = getelementptr inbounds i8, i8* %2, i64 49
%63 = load i8, i8* %62
%64 = sext i8 %63 to i16
%65 = add nsw i16 %61, %64
%66 = lshr i16 %65, 1
%67 = trunc i16 %66 to i8
%68 = or i8 %67, 64
%69 = getelementptr inbounds i8, i8* %0, i64 49
store i8 %68, i8* %69
ret void
}