void merge(char *vector1, char *vector2) {
  int i;
  for (i = 0; i < 1129; i++)
    vector1[i] &= vector2[i];
}


x86 assembly (clang, -O0):
<merge>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x469,-0x14(%rbp)
jge    114b <merge+0x4b>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
and    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1113 <merge+0x13>
pop    %rbp
ret

x86 assembly (clang, -O2):
<merge>:
lea    0x469(%rdi),%rcx
lea    0x469(%rsi),%rax
cmp    %rdi,%rax
jbe    111c <merge+0x1c>
cmp    %rsi,%rcx
jbe    111c <merge+0x1c>
xor    %edx,%edx
jmp    1197 <merge+0x97>
mov    $0x30,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movups -0x30(%rsi,%rdx,1),%xmm0
movups -0x20(%rsi,%rdx,1),%xmm1
movups -0x30(%rdi,%rdx,1),%xmm2
andps  %xmm0,%xmm2
movups -0x20(%rdi,%rdx,1),%xmm0
andps  %xmm1,%xmm0
movups %xmm2,-0x30(%rdi,%rdx,1)
movups %xmm0,-0x20(%rdi,%rdx,1)
cmp    $0x470,%rdx
je     1184 <merge+0x84>
movups -0x10(%rsi,%rdx,1),%xmm0
movups (%rsi,%rdx,1),%xmm1
movups -0x10(%rdi,%rdx,1),%xmm2
andps  %xmm0,%xmm2
movups (%rdi,%rdx,1),%xmm0
andps  %xmm1,%xmm0
movups %xmm2,-0x10(%rdi,%rdx,1)
movups %xmm0,(%rdi,%rdx,1)
add    $0x40,%rdx
jmp    1130 <merge+0x30>
mov    0x460(%rsi),%rdx
and    %rdx,0x460(%rdi)
mov    $0x468,%edx
cmp    %rsi,%rcx
seta   %cl
cmp    %rdi,%rax
seta   %r8b
and    %cl,%r8b
mov    $0x1,%ecx
nopl   0x0(%rax)
movzbl (%rsi,%rdx,1),%eax
and    %al,(%rdi,%rdx,1)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rcx
jne    11b0 <merge+0xb0>
test   %r8b,%r8b
je     11ff <merge+0xff>
cs nopw 0x0(%rax,%rax,1)
movzbl (%rsi,%rdx,1),%eax
and    %al,(%rdi,%rdx,1)
movzbl 0x1(%rsi,%rdx,1),%eax
and    %al,0x1(%rdi,%rdx,1)
movzbl 0x2(%rsi,%rdx,1),%eax
and    %al,0x2(%rdi,%rdx,1)
movzbl 0x3(%rsi,%rdx,1),%eax
and    %al,0x3(%rdi,%rdx,1)
add    $0x4,%rdx
cmp    $0x469,%rdx
jne    11d0 <merge+0xd0>
ret

LLVM IR (-O0):
define void @merge(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
store i32 0, i32* %5
br label %6
6: ; preds = %24, %2
%7 = load i32, i32* %5
%8 = icmp slt i32 %7, 1129
br i1 %8, label %9, label %27
9: ; preds = %6
%10 = load i8*, i8** %4
%11 = load i32, i32* %5
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds i8, i8* %10, i64 %12
%14 = load i8, i8* %13
%15 = sext i8 %14 to i32
%16 = load i8*, i8** %3
%17 = load i32, i32* %5
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %16, i64 %18
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
%22 = and i32 %21, %15
%23 = trunc i32 %22 to i8
store i8 %23, i8* %19
br label %24
24: ; preds = %9
%25 = load i32, i32* %5
%26 = add nsw i32 %25, 1
store i32 %26, i32* %5
br label %6
27: ; preds = %6
ret void
}

LLVM IR (-O2):
define void @merge(i8* nocapture %0, i8* nocapture %1) {
%3 = getelementptr i8, i8* %0, i64 1129
%4 = getelementptr i8, i8* %1, i64 1129
%5 = icmp ugt i8* %4, %0
%6 = icmp ugt i8* %3, %1
%7 = and i1 %5, %6
br i1 %7, label %55, label %8
8: ; preds = %2, %28
%9 = phi i64 [ %45, %28 ], [ 0, %2 ]
%10 = getelementptr inbounds i8, i8* %1, i64 %9
%11 = bitcast i8* %10 to <16 x i8>*
%12 = load <16 x i8>, <16 x i8>* %11
%13 = getelementptr inbounds i8, i8* %10, i64 16
%14 = bitcast i8* %13 to <16 x i8>*
%15 = load <16 x i8>, <16 x i8>* %14
%16 = getelementptr inbounds i8, i8* %0, i64 %9
%17 = bitcast i8* %16 to <16 x i8>*
%18 = load <16 x i8>, <16 x i8>* %17
%19 = getelementptr inbounds i8, i8* %16, i64 16
%20 = bitcast i8* %19 to <16 x i8>*
%21 = load <16 x i8>, <16 x i8>* %20
%22 = and <16 x i8> %18, %12
%23 = and <16 x i8> %21, %15
%24 = bitcast i8* %16 to <16 x i8>*
store <16 x i8> %22, <16 x i8>* %24
%25 = bitcast i8* %19 to <16 x i8>*
store <16 x i8> %23, <16 x i8>* %25
%26 = or i64 %9, 32
%27 = icmp eq i64 %26, 1120
br i1 %27, label %46, label %28
28: ; preds = %8
%29 = getelementptr inbounds i8, i8* %1, i64 %26
%30 = bitcast i8* %29 to <16 x i8>*
%31 = load <16 x i8>, <16 x i8>* %30
%32 = getelementptr inbounds i8, i8* %29, i64 16
%33 = bitcast i8* %32 to <16 x i8>*
%34 = load <16 x i8>, <16 x i8>* %33
%35 = getelementptr inbounds i8, i8* %0, i64 %26
%36 = bitcast i8* %35 to <16 x i8>*
%37 = load <16 x i8>, <16 x i8>* %36
%38 = getelementptr inbounds i8, i8* %35, i64 16
%39 = bitcast i8* %38 to <16 x i8>*
%40 = load <16 x i8>, <16 x i8>* %39
%41 = and <16 x i8> %37, %31
%42 = and <16 x i8> %40, %34
%43 = bitcast i8* %35 to <16 x i8>*
store <16 x i8> %41, <16 x i8>* %43
%44 = bitcast i8* %38 to <16 x i8>*
store <16 x i8> %42, <16 x i8>* %44
%45 = add nuw nsw i64 %9, 64
br label %8
46: ; preds = %8
%47 = getelementptr inbounds i8, i8* %1, i64 1120
%48 = bitcast i8* %47 to <8 x i8>*
%49 = load <8 x i8>, <8 x i8>* %48
%50 = getelementptr inbounds i8, i8* %0, i64 1120
%51 = bitcast i8* %50 to <8 x i8>*
%52 = load <8 x i8>, <8 x i8>* %51
%53 = and <8 x i8> %52, %49
%54 = bitcast i8* %50 to <8 x i8>*
store <8 x i8> %53, <8 x i8>* %54
br label %55
55: ; preds = %46, %2
%56 = phi i64 [ 0, %2 ], [ 1128, %46 ]
%57 = and i1 %5, %6
br label %58
58: ; preds = %58, %55
%59 = phi i64 [ %66, %58 ], [ %56, %55 ]
%60 = phi i64 [ %67, %58 ], [ 0, %55 ]
%61 = getelementptr inbounds i8, i8* %1, i64 %59
%62 = load i8, i8* %61
%63 = getelementptr inbounds i8, i8* %0, i64 %59
%64 = load i8, i8* %63
%65 = and i8 %64, %62
store i8 %65, i8* %63
%66 = add nuw nsw i64 %59, 1
%67 = add i64 %60, 1
%68 = icmp eq i64 %60, 0
br i1 %68, label %69, label %58
69: ; preds = %58
br i1 %57, label %70, label %97
70: ; preds = %69, %70
%71 = phi i64 [ %95, %70 ], [ %66, %69 ]
%72 = getelementptr inbounds i8, i8* %1, i64 %71
%73 = load i8, i8* %72
%74 = getelementptr inbounds i8, i8* %0, i64 %71
%75 = load i8, i8* %74
%76 = and i8 %75, %73
store i8 %76, i8* %74
%77 = add nuw nsw i64 %71, 1
%78 = getelementptr inbounds i8, i8* %1, i64 %77
%79 = load i8, i8* %78
%80 = getelementptr inbounds i8, i8* %0, i64 %77
%81 = load i8, i8* %80
%82 = and i8 %81, %79
store i8 %82, i8* %80
%83 = add nuw nsw i64 %71, 2
%84 = getelementptr inbounds i8, i8* %1, i64 %83
%85 = load i8, i8* %84
%86 = getelementptr inbounds i8, i8* %0, i64 %83
%87 = load i8, i8* %86
%88 = and i8 %87, %85
store i8 %88, i8* %86
%89 = add nuw nsw i64 %71, 3
%90 = getelementptr inbounds i8, i8* %1, i64 %89
%91 = load i8, i8* %90
%92 = getelementptr inbounds i8, i8* %0, i64 %89
%93 = load i8, i8* %92
%94 = and i8 %93, %91
store i8 %94, i8* %92
%95 = add nuw nsw i64 %71, 4
%96 = icmp eq i64 %95, 1129
br i1 %96, label %97, label %70
97: ; preds = %70, %69
ret void
}