void next_generation(int *a, int *b, int l) {
  int i;
  i = 1;
  b[0] = 0;
  b[l - 1] = 0;
  while (i < l - 1) {
    i = i + 1;
    if (a[i - 1] == 1 || a[i + 1] == 1) {
      if (!(a[i - 1] == 1 && a[i + 1] == 1)) {
        b[i] = 1;
        continue;
      }
    }
    b[i] = 0;
  }
  i = 0;
  while (i < l)
    ;
  {
    i = i + 1;
    a[i] = b[i];
  }
}


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    -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)
mov    -0x18(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11d7 <next_generation+0xd7>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
je     117c <next_generation+0x7c>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    11c3 <next_generation+0xc3>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
jne    11aa <next_generation+0xaa>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpl   $0x1,(%rax,%rcx,4)
je     11be <next_generation+0xbe>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
jmp    1134 <next_generation+0x34>
jmp    11c3 <next_generation+0xc3>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
jmp    1134 <next_generation+0x34>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11ef <next_generation+0xef>
jmp    11de <next_generation+0xde>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<next_generation>:
movl   $0x0,(%rsi)
movslq %edx,%rax
movl   $0x0,-0x4(%rsi,%rax,4)
cmp    $0x3,%edx
jl     1214 <next_generation+0x114>
lea    -0x1(%rdx),%eax
mov    %eax,%r9d
lea    -0x1(%r9),%r8
mov    $0x1,%r11d
cmp    $0x8,%r8
jb     11dc <next_generation+0xdc>
lea    0x8(%rsi),%rax
lea    (%rdi,%r9,4),%rcx
add    $0x8,%rcx
cmp    %rcx,%rax
jae    115a <next_generation+0x5a>
lea    (%rsi,%r9,4),%rax
add    $0x4,%rax
lea    0x4(%rdi),%rcx
cmp    %rax,%rcx
jb     11dc <next_generation+0xdc>
mov    %r8,%r10
and    $0xfffffffffffffff8,%r10
lea    0x1(%r10),%r11
xor    %eax,%eax
movdqa 0xe91(%rip),%xmm0
nop
movdqu 0x4(%rdi,%rax,4),%xmm1
movdqu 0xc(%rdi,%rax,4),%xmm2
movdqu 0x14(%rdi,%rax,4),%xmm3
movdqu 0x1c(%rdi,%rax,4),%xmm4
pcmpeqd %xmm0,%xmm1
pcmpeqd %xmm0,%xmm3
pcmpeqd %xmm0,%xmm2
pcmpeqd %xmm0,%xmm4
movdqa %xmm1,%xmm5
pand   %xmm2,%xmm5
movdqa %xmm3,%xmm6
pand   %xmm4,%xmm6
por    %xmm1,%xmm2
pandn  %xmm2,%xmm5
por    %xmm3,%xmm4
pandn  %xmm4,%xmm6
psrld  $0x1f,%xmm5
psrld  $0x1f,%xmm6
movdqu %xmm5,0x8(%rsi,%rax,4)
movdqu %xmm6,0x18(%rsi,%rax,4)
add    $0x8,%rax
cmp    %rax,%r10
jne    1170 <next_generation+0x70>
cmp    %r10,%r8
je     1214 <next_generation+0x114>
mov    %r11,%rax
not    %rax
test   $0x1,%r9b
jne    120f <next_generation+0x10f>
mov    0x8(%rdi,%r11,4),%ecx
cmpl   $0x1,(%rdi,%r11,4)
jne    12a1 <next_generation+0x1a1>
xor    %r8d,%r8d
cmp    $0x1,%ecx
je     1206 <next_generation+0x106>
mov    $0x1,%r8d
mov    %r8d,0x4(%rsi,%r11,4)
add    $0x1,%r11
add    %r9,%rax
jne    123e <next_generation+0x13e>
test   %edx,%edx
jle    129a <next_generation+0x19a>
nopl   0x0(%rax)
jmp    1220 <next_generation+0x120>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    $0x1,%ecx
mov    %ecx,0x8(%rsi,%rax,4)
cmp    %r11,%r9
je     1214 <next_generation+0x114>
mov    %r11,%rax
mov    0x8(%rdi,%r11,4),%r8d
cmpl   $0x1,(%rdi,%r11,4)
jne    1260 <next_generation+0x160>
xor    %ecx,%ecx
cmp    $0x1,%r8d
jne    1268 <next_generation+0x168>
jmp    126d <next_generation+0x16d>
nopw   0x0(%rax,%rax,1)
xor    %ecx,%ecx
cmp    $0x1,%r8d
jne    126d <next_generation+0x16d>
mov    $0x1,%ecx
mov    %ecx,0x4(%rsi,%rax,4)
lea    0x2(%rax),%r11
mov    0xc(%rdi,%rax,4),%r8d
cmpl   $0x1,0x4(%rdi,%rax,4)
jne    1290 <next_generation+0x190>
xor    %ecx,%ecx
cmp    $0x1,%r8d
jne    1230 <next_generation+0x130>
jmp    1235 <next_generation+0x135>
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
cmp    $0x1,%r8d
je     1230 <next_generation+0x130>
jmp    1235 <next_generation+0x135>
mov    0x4(%rsi),%eax
mov    %eax,0x4(%rdi)
ret
xor    %r8d,%r8d
cmp    $0x1,%ecx
je     1200 <next_generation+0x100>
jmp    1206 <next_generation+0x106>

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
%8 = load i32*, i32** %5
%9 = getelementptr inbounds i32, i32* %8, i64 0
store i32 0, i32* %9
%10 = load i32*, i32** %5
%11 = load i32, i32* %6
%12 = sub nsw i32 %11, 1
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i32, i32* %10, i64 %13
store i32 0, i32* %14
br label %15
15: ; preds = %60, %54, %3
%16 = load i32, i32* %7
%17 = load i32, i32* %6
%18 = sub nsw i32 %17, 1
%19 = icmp slt i32 %16, %18
br i1 %19, label %20, label %65
20: ; preds = %15
%21 = load i32, i32* %7
%22 = add nsw i32 %21, 1
store i32 %22, i32* %7
%23 = load i32*, i32** %4
%24 = load i32, i32* %7
%25 = sub nsw i32 %24, 1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i32, i32* %23, i64 %26
%28 = load i32, i32* %27
%29 = icmp eq i32 %28, 1
br i1 %29, label %38, label %30
30: ; preds = %20
%31 = load i32*, i32** %4
%32 = load i32, i32* %7
%33 = add nsw i32 %32, 1
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i32, i32* %31, i64 %34
%36 = load i32, i32* %35
%37 = icmp eq i32 %36, 1
br i1 %37, label %38, label %60
38: ; preds = %30, %20
%39 = load i32*, i32** %4
%40 = load i32, i32* %7
%41 = sub nsw i32 %40, 1
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i32, i32* %39, i64 %42
%44 = load i32, i32* %43
%45 = icmp eq i32 %44, 1
br i1 %45, label %46, label %54
46: ; preds = %38
%47 = load i32*, i32** %4
%48 = load i32, i32* %7
%49 = add nsw i32 %48, 1
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i32, i32* %47, i64 %50
%52 = load i32, i32* %51
%53 = icmp eq i32 %52, 1
br i1 %53, label %59, label %54
54: ; preds = %46, %38
%55 = load i32*, i32** %5
%56 = load i32, i32* %7
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i32, i32* %55, i64 %57
store i32 1, i32* %58
br label %15
59: ; preds = %46
br label %60
60: ; preds = %59, %30
%61 = load i32*, i32** %5
%62 = load i32, i32* %7
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds i32, i32* %61, i64 %63
store i32 0, i32* %64
br label %15
65: ; preds = %15
store i32 0, i32* %7
br label %66
66: ; preds = %70, %65
%67 = load i32, i32* %7
%68 = load i32, i32* %6
%69 = icmp slt i32 %67, %68
br i1 %69, label %70, label %71
70: ; preds = %66
br label %66
71: ; preds = %66
%72 = load i32, i32* %7
%73 = add nsw i32 %72, 1
store i32 %73, i32* %7
%74 = load i32*, i32** %5
%75 = load i32, i32* %7
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i32, i32* %74, i64 %76
%78 = load i32, i32* %77
%79 = load i32*, i32** %4
%80 = load i32, i32* %7
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i32, i32* %79, i64 %81
store i32 %78, i32* %82
ret void
}

LLVM IR (-O2):
define void @next_generation(i32* nocapture %0, i32* nocapture %1, i32 %2) {
store i32 0, i32* %1
%4 = add nsw i32 %2, -1
%5 = sext i32 %4 to i64
%6 = getelementptr inbounds i32, i32* %1, i64 %5
store i32 0, i32* %6
%7 = icmp sgt i32 %2, 2
br i1 %7, label %8, label %88
8: ; preds = %3
%9 = zext i32 %4 to i64
%10 = add nsw i64 %9, -1
%11 = icmp ult i64 %10, 8
br i1 %11, label %64, label %12
12: ; preds = %8
%13 = getelementptr i32, i32* %1, i64 2
%14 = add nuw nsw i64 %9, 1
%15 = getelementptr i32, i32* %1, i64 %14
%16 = getelementptr i32, i32* %0, i64 1
%17 = add nuw nsw i64 %9, 2
%18 = getelementptr i32, i32* %0, i64 %17
%19 = icmp ult i32* %13, %18
%20 = icmp ult i32* %16, %15
%21 = and i1 %19, %20
br i1 %21, label %64, label %22
22: ; preds = %12
%23 = and i64 %10, -8
%24 = or i64 %23, 1
br label %25
25: ; preds = %25, %22
%26 = phi i64 [ 0, %22 ], [ %60, %25 ]
%27 = or i64 %26, 1
%28 = or i64 %26, 2
%29 = getelementptr inbounds i32, i32* %0, i64 %27
%30 = bitcast i32* %29 to <4 x i32>*
%31 = load <4 x i32>, <4 x i32>* %30
%32 = getelementptr inbounds i32, i32* %29, i64 4
%33 = bitcast i32* %32 to <4 x i32>*
%34 = load <4 x i32>, <4 x i32>* %33
%35 = icmp eq <4 x i32> %31, <i32 1, i32 1, i32 1, i32 1>
%36 = icmp eq <4 x i32> %34, <i32 1, i32 1, i32 1, i32 1>
%37 = or i64 %26, 3
%38 = getelementptr inbounds i32, i32* %0, i64 %37
%39 = bitcast i32* %38 to <4 x i32>*
%40 = load <4 x i32>, <4 x i32>* %39
%41 = getelementptr inbounds i32, i32* %38, i64 4
%42 = bitcast i32* %41 to <4 x i32>*
%43 = load <4 x i32>, <4 x i32>* %42
%44 = icmp eq <4 x i32> %40, <i32 1, i32 1, i32 1, i32 1>
%45 = icmp eq <4 x i32> %43, <i32 1, i32 1, i32 1, i32 1>
%46 = select <4 x i1> %35, <4 x i1> %44, <4 x i1> zeroinitializer
%47 = select <4 x i1> %36, <4 x i1> %45, <4 x i1> zeroinitializer
%48 = select <4 x i1> %35, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %44
%49 = select <4 x i1> %36, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %45
%50 = xor <4 x i1> %46, <i1 true, i1 true, i1 true, i1 true>
%51 = xor <4 x i1> %47, <i1 true, i1 true, i1 true, i1 true>
%52 = select <4 x i1> %48, <4 x i1> %50, <4 x i1> zeroinitializer
%53 = zext <4 x i1> %52 to <4 x i32>
%54 = select <4 x i1> %49, <4 x i1> %51, <4 x i1> zeroinitializer
%55 = zext <4 x i1> %54 to <4 x i32>
%56 = getelementptr inbounds i32, i32* %1, i64 %28
%57 = bitcast i32* %56 to <4 x i32>*
store <4 x i32> %53, <4 x i32>* %57
%58 = getelementptr inbounds i32, i32* %56, i64 4
%59 = bitcast i32* %58 to <4 x i32>*
store <4 x i32> %55, <4 x i32>* %59
%60 = add nuw i64 %26, 8
%61 = icmp eq i64 %60, %23
br i1 %61, label %62, label %25
62: ; preds = %25
%63 = icmp eq i64 %10, %23
br i1 %63, label %88, label %64
64: ; preds = %12, %8, %62
%65 = phi i64 [ 1, %12 ], [ 1, %8 ], [ %24, %62 ]
%66 = xor i64 %65, -1
%67 = and i64 %9, 1
%68 = icmp eq i64 %67, 0
br i1 %68, label %69, label %84
69: ; preds = %64
%70 = add nuw nsw i64 %65, 1
%71 = getelementptr inbounds i32, i32* %0, i64 %65
%72 = load i32, i32* %71
%73 = icmp eq i32 %72, 1
%74 = add nuw nsw i64 %65, 2
%75 = getelementptr inbounds i32, i32* %0, i64 %74
%76 = load i32, i32* %75
%77 = icmp eq i32 %76, 1
br i1 %73, label %79, label %78
78: ; preds = %69
br i1 %77, label %80, label %81
79: ; preds = %69
br i1 %77, label %81, label %80
80: ; preds = %79, %78
br label %81
81: ; preds = %80, %79, %78
%82 = phi i32 [ 1, %80 ], [ 0, %79 ], [ 0, %78 ]
%83 = getelementptr inbounds i32, i32* %1, i64 %70
store i32 %82, i32* %83
br label %84
84: ; preds = %81, %64
%85 = phi i64 [ %65, %64 ], [ %70, %81 ]
%86 = sub nsw i64 0, %9
%87 = icmp eq i64 %66, %86
br i1 %87, label %88, label %90
88: ; preds = %84, %117, %62, %3
%89 = icmp sgt i32 %2, 0
br i1 %89, label %121, label %122
90: ; preds = %84, %117
%91 = phi i64 [ %106, %117 ], [ %85, %84 ]
%92 = add nuw nsw i64 %91, 1
%93 = getelementptr inbounds i32, i32* %0, i64 %91
%94 = load i32, i32* %93
%95 = icmp eq i32 %94, 1
%96 = add nuw nsw i64 %91, 2
%97 = getelementptr inbounds i32, i32* %0, i64 %96
%98 = load i32, i32* %97
%99 = icmp eq i32 %98, 1
br i1 %95, label %101, label %100
100: ; preds = %90
br i1 %99, label %102, label %103
101: ; preds = %90
br i1 %99, label %103, label %102
102: ; preds = %100, %101
br label %103
103: ; preds = %100, %101, %102
%104 = phi i32 [ 1, %102 ], [ 0, %101 ], [ 0, %100 ]
%105 = getelementptr inbounds i32, i32* %1, i64 %92
store i32 %104, i32* %105
%106 = add nuw nsw i64 %91, 2
%107 = getelementptr inbounds i32, i32* %0, i64 %92
%108 = load i32, i32* %107
%109 = icmp eq i32 %108, 1
%110 = add nuw nsw i64 %91, 3
%111 = getelementptr inbounds i32, i32* %0, i64 %110
%112 = load i32, i32* %111
%113 = icmp eq i32 %112, 1
br i1 %109, label %115, label %114
114: ; preds = %103
br i1 %113, label %116, label %117
115: ; preds = %103
br i1 %113, label %117, label %116
116: ; preds = %115, %114
br label %117
117: ; preds = %116, %115, %114
%118 = phi i32 [ 1, %116 ], [ 0, %115 ], [ 0, %114 ]
%119 = getelementptr inbounds i32, i32* %1, i64 %106
store i32 %118, i32* %119
%120 = icmp eq i64 %106, %9
br i1 %120, label %88, label %90
121: ; preds = %88, %121
br label %121
122: ; preds = %88
%123 = getelementptr inbounds i32, i32* %1, i64 1
%124 = load i32, i32* %123
%125 = getelementptr inbounds i32, i32* %0, i64 1
store i32 %124, i32* %125
ret void
}