void next_generation(int *current, int *next, int length) {
  int i = 1;
  for (; i < length; i++) {
    if ((current[i - 1] == 1 || current[i + 1] == 1) &&
        (current[i - 1] != current[i + 1])) {
      next[i] = 1;
    } else
      next[i] = 0;
  }
  *next = 0;
  next[length - 1] = 0;
}


x86 assembly (clang, -O0):
<next_generation>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11ac <next_generation+0xac>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
je     1150 <next_generation+0x50>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    118a <next_generation+0x8a>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x18(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
cmp    (%rcx,%rdx,4),%eax
je     118a <next_generation+0x8a>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
jmp    1199 <next_generation+0x99>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
jmp    119e <next_generation+0x9e>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1116 <next_generation+0x16>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movl   $0x0,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<next_generation>:
cmp    $0x2,%edx
jl     11d3 <next_generation+0xd3>
mov    %edx,%r10d
lea    -0x1(%r10),%r8
mov    $0x1,%ecx
cmp    $0x8,%r8
jb     1200 <next_generation+0x100>
lea    0x4(%rsi),%r9
lea    (%rdi,%r10,4),%rax
add    $0x4,%rax
cmp    %rax,%r9
jae    113d <next_generation+0x3d>
lea    (%rsi,%r10,4),%rax
cmp    %rdi,%rax
ja     1200 <next_generation+0x100>
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    0x1(%r9),%rcx
xor    %eax,%eax
movdqa 0xeae(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rdi,%rax,4),%xmm1
movdqu 0x8(%rdi,%rax,4),%xmm2
movdqu 0x10(%rdi,%rax,4),%xmm3
movdqu 0x18(%rdi,%rax,4),%xmm4
movdqa %xmm1,%xmm5
pcmpeqd %xmm0,%xmm5
movdqa %xmm3,%xmm6
pcmpeqd %xmm0,%xmm6
pcmpeqd %xmm2,%xmm1
pcmpeqd %xmm0,%xmm2
pandn  %xmm5,%xmm1
pandn  %xmm2,%xmm5
por    %xmm1,%xmm5
psrld  $0x1f,%xmm5
pcmpeqd %xmm4,%xmm3
pcmpeqd %xmm0,%xmm4
pandn  %xmm6,%xmm3
pandn  %xmm4,%xmm6
por    %xmm3,%xmm6
psrld  $0x1f,%xmm6
movdqu %xmm5,0x4(%rsi,%rax,4)
movdqu %xmm6,0x14(%rsi,%rax,4)
add    $0x8,%rax
cmp    %rax,%r9
jne    1160 <next_generation+0x60>
cmp    %r9,%r8
jne    1200 <next_generation+0x100>
movl   $0x0,(%rsi)
movslq %edx,%rax
movl   $0x0,-0x4(%rsi,%rax,4)
ret
cs nopw 0x0(%rax,%rax,1)
nop
xor    %r9d,%r9d
mov    %r9d,(%rsi,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%r10
je     11d3 <next_generation+0xd3>
mov    -0x4(%rdi,%rcx,4),%eax
mov    0x4(%rdi,%rcx,4),%r8d
mov    $0x1,%r9d
cmp    $0x1,%eax
jne    1220 <next_generation+0x120>
cmp    %r8d,%eax
je     11f0 <next_generation+0xf0>
jmp    11f3 <next_generation+0xf3>
nopl   0x0(%rax,%rax,1)
cmp    $0x1,%r8d
jne    11f0 <next_generation+0xf0>
jmp    11f3 <next_generation+0xf3>

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

LLVM IR (-O2):
define void @next_generation(i32* nocapture %0, i32* nocapture writeonly %1, i32 %2) {
%4 = icmp sgt i32 %2, 1
br i1 %4, label %5, label %75
5: ; preds = %3
%6 = zext i32 %2 to i64
%7 = add nsw i64 %6, -1
%8 = icmp ult i64 %7, 8
br i1 %8, label %54, label %9
9: ; preds = %5
%10 = getelementptr i32, i32* %1, i64 1
%11 = getelementptr i32, i32* %1, i64 %6
%12 = add nuw nsw i64 %6, 1
%13 = getelementptr i32, i32* %0, i64 %12
%14 = icmp ult i32* %10, %13
%15 = icmp ugt i32* %11, %0
%16 = and i1 %14, %15
br i1 %16, label %54, label %17
17: ; preds = %9
%18 = and i64 %7, -8
%19 = or i64 %18, 1
br label %20
20: ; preds = %20, %17
%21 = phi i64 [ 0, %17 ], [ %50, %20 ]
%22 = or i64 %21, 1
%23 = getelementptr inbounds i32, i32* %0, i64 %21
%24 = bitcast i32* %23 to <4 x i32>*
%25 = load <4 x i32>, <4 x i32>* %24
%26 = getelementptr inbounds i32, i32* %23, i64 4
%27 = bitcast i32* %26 to <4 x i32>*
%28 = load <4 x i32>, <4 x i32>* %27
%29 = icmp eq <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1>
%30 = icmp eq <4 x i32> %28, <i32 1, i32 1, i32 1, i32 1>
%31 = or i64 %21, 2
%32 = getelementptr inbounds i32, i32* %0, i64 %31
%33 = bitcast i32* %32 to <4 x i32>*
%34 = load <4 x i32>, <4 x i32>* %33
%35 = getelementptr inbounds i32, i32* %32, i64 4
%36 = bitcast i32* %35 to <4 x i32>*
%37 = load <4 x i32>, <4 x i32>* %36
%38 = icmp eq <4 x i32> %34, <i32 1, i32 1, i32 1, i32 1>
%39 = icmp eq <4 x i32> %37, <i32 1, i32 1, i32 1, i32 1>
%40 = icmp ne <4 x i32> %25, %34
%41 = icmp ne <4 x i32> %28, %37
%42 = select <4 x i1> %29, <4 x i1> %40, <4 x i1> %38
%43 = zext <4 x i1> %42 to <4 x i32>
%44 = select <4 x i1> %30, <4 x i1> %41, <4 x i1> %39
%45 = zext <4 x i1> %44 to <4 x i32>
%46 = getelementptr inbounds i32, i32* %1, i64 %22
%47 = bitcast i32* %46 to <4 x i32>*
store <4 x i32> %43, <4 x i32>* %47
%48 = getelementptr inbounds i32, i32* %46, i64 4
%49 = bitcast i32* %48 to <4 x i32>*
store <4 x i32> %45, <4 x i32>* %49
%50 = add nuw i64 %21, 8
%51 = icmp eq i64 %50, %18
br i1 %51, label %52, label %20
52: ; preds = %20
%53 = icmp eq i64 %7, %18
br i1 %53, label %75, label %54
54: ; preds = %9, %5, %52
%55 = phi i64 [ 1, %9 ], [ 1, %5 ], [ %19, %52 ]
br label %56
56: ; preds = %54, %70
%57 = phi i64 [ %73, %70 ], [ %55, %54 ]
%58 = add nsw i64 %57, -1
%59 = getelementptr inbounds i32, i32* %0, i64 %58
%60 = load i32, i32* %59
%61 = icmp eq i32 %60, 1
%62 = add nuw nsw i64 %57, 1
%63 = getelementptr inbounds i32, i32* %0, i64 %62
%64 = load i32, i32* %63
br i1 %61, label %67, label %65
65: ; preds = %56
%66 = icmp eq i32 %64, 1
br i1 %66, label %70, label %69
67: ; preds = %56
%68 = icmp eq i32 %60, %64
br i1 %68, label %69, label %70
69: ; preds = %67, %65
br label %70
70: ; preds = %67, %65, %69
%71 = phi i32 [ 0, %69 ], [ 1, %65 ], [ 1, %67 ]
%72 = getelementptr inbounds i32, i32* %1, i64 %57
store i32 %71, i32* %72
%73 = add nuw nsw i64 %57, 1
%74 = icmp eq i64 %73, %6
br i1 %74, label %75, label %56
75: ; preds = %70, %52, %3
store i32 0, i32* %1
%76 = add nsw i32 %2, -1
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds i32, i32* %1, i64 %77
store i32 0, i32* %78
ret void
}