int canContinue(int field[][4]) {
  for (int i = 0; i < 4; ++i) {
    for (int j = 0; j < 4; ++j) {
      if ((i < 4 - 1) && (field[i + 1][j] == field[i][j]) ||
          (j < 4 - 1) && (field[i][j + 1] == field[i][j])) {
        return 1;
      }
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<canContinue>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    11de <canContinue+0xde>
movl   $0x0,-0x18(%rbp)
cmpl   $0x4,-0x18(%rbp)
jge    11cb <canContinue+0xcb>
cmpl   $0x3,-0x14(%rbp)
jge    116b <canContinue+0x6b>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
shl    $0x4,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rcx
movslq -0x18(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
je     11ac <canContinue+0xac>
cmpl   $0x3,-0x18(%rbp)
jge    11b8 <canContinue+0xb8>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rcx
movslq -0x18(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jne    11b8 <canContinue+0xb8>
movl   $0x1,-0x4(%rbp)
jmp    11e5 <canContinue+0xe5>
jmp    11bd <canContinue+0xbd>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1120 <canContinue+0x20>
jmp    11d0 <canContinue+0xd0>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    110f <canContinue+0xf>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<canContinue>:
mov    0x10(%rdi),%eax
cmp    (%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x4(%rdi),%eax
cmp    (%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x14(%rdi),%eax
cmp    0x4(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x8(%rdi),%eax
cmp    0x4(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x18(%rdi),%eax
cmp    0x8(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0xc(%rdi),%eax
cmp    0x8(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x1c(%rdi),%eax
cmp    0xc(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x20(%rdi),%eax
cmp    0x10(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x14(%rdi),%eax
cmp    0x10(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x24(%rdi),%eax
cmp    0x14(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x18(%rdi),%eax
cmp    0x14(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x28(%rdi),%eax
cmp    0x18(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x1c(%rdi),%eax
cmp    0x18(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x2c(%rdi),%eax
cmp    0x1c(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x30(%rdi),%eax
cmp    0x20(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x24(%rdi),%eax
cmp    0x20(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x34(%rdi),%eax
cmp    0x24(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x28(%rdi),%eax
cmp    0x24(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x38(%rdi),%eax
cmp    0x28(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x2c(%rdi),%eax
cmp    0x28(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x3c(%rdi),%eax
cmp    0x2c(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x34(%rdi),%eax
cmp    0x30(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x38(%rdi),%eax
cmp    0x34(%rdi),%eax
je     11e0 <canContinue+0xe0>
mov    0x3c(%rdi),%ecx
xor    %eax,%eax
cmp    0x38(%rdi),%ecx
jne    11e5 <canContinue+0xe5>
mov    $0x1,%eax
ret

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

LLVM IR (-O2):
define i32 @canContinue([4 x i32]* nocapture %0) {
%2 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 0
%3 = load i32, i32* %2
%4 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 0
%5 = load i32, i32* %4
%6 = icmp eq i32 %3, %5
br i1 %6, label %145, label %7
7: ; preds = %1
%8 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 1
%9 = load i32, i32* %8
%10 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 0
%11 = load i32, i32* %10
%12 = icmp eq i32 %9, %11
br i1 %12, label %145, label %13
13: ; preds = %7
%14 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%15 = load i32, i32* %14
%16 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 1
%17 = load i32, i32* %16
%18 = icmp eq i32 %15, %17
br i1 %18, label %145, label %19
19: ; preds = %13
%20 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 2
%21 = load i32, i32* %20
%22 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 1
%23 = load i32, i32* %22
%24 = icmp eq i32 %21, %23
br i1 %24, label %145, label %25
25: ; preds = %19
%26 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 2
%27 = load i32, i32* %26
%28 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 2
%29 = load i32, i32* %28
%30 = icmp eq i32 %27, %29
br i1 %30, label %145, label %31
31: ; preds = %25
%32 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 3
%33 = load i32, i32* %32
%34 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 2
%35 = load i32, i32* %34
%36 = icmp eq i32 %33, %35
br i1 %36, label %145, label %37
37: ; preds = %31
%38 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 3
%39 = load i32, i32* %38
%40 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 0, i64 3
%41 = load i32, i32* %40
%42 = icmp eq i32 %39, %41
br i1 %42, label %145, label %43
43: ; preds = %37
%44 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 0
%45 = load i32, i32* %44
%46 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 0
%47 = load i32, i32* %46
%48 = icmp eq i32 %45, %47
br i1 %48, label %145, label %49
49: ; preds = %43
%50 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%51 = load i32, i32* %50
%52 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 0
%53 = load i32, i32* %52
%54 = icmp eq i32 %51, %53
br i1 %54, label %145, label %55
55: ; preds = %49
%56 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 1
%57 = load i32, i32* %56
%58 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%59 = load i32, i32* %58
%60 = icmp eq i32 %57, %59
br i1 %60, label %145, label %61
61: ; preds = %55
%62 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 2
%63 = load i32, i32* %62
%64 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 1
%65 = load i32, i32* %64
%66 = icmp eq i32 %63, %65
br i1 %66, label %145, label %67
67: ; preds = %61
%68 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 2
%69 = load i32, i32* %68
%70 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 2
%71 = load i32, i32* %70
%72 = icmp eq i32 %69, %71
br i1 %72, label %145, label %73
73: ; preds = %67
%74 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 3
%75 = load i32, i32* %74
%76 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 2
%77 = load i32, i32* %76
%78 = icmp eq i32 %75, %77
br i1 %78, label %145, label %79
79: ; preds = %73
%80 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 3
%81 = load i32, i32* %80
%82 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 1, i64 3
%83 = load i32, i32* %82
%84 = icmp eq i32 %81, %83
br i1 %84, label %145, label %85
85: ; preds = %79
%86 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 0
%87 = load i32, i32* %86
%88 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 0
%89 = load i32, i32* %88
%90 = icmp eq i32 %87, %89
br i1 %90, label %145, label %91
91: ; preds = %85
%92 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 1
%93 = load i32, i32* %92
%94 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 0
%95 = load i32, i32* %94
%96 = icmp eq i32 %93, %95
br i1 %96, label %145, label %97
97: ; preds = %91
%98 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 1
%99 = load i32, i32* %98
%100 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 1
%101 = load i32, i32* %100
%102 = icmp eq i32 %99, %101
br i1 %102, label %145, label %103
103: ; preds = %97
%104 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 2
%105 = load i32, i32* %104
%106 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 1
%107 = load i32, i32* %106
%108 = icmp eq i32 %105, %107
br i1 %108, label %145, label %109
109: ; preds = %103
%110 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 2
%111 = load i32, i32* %110
%112 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 2
%113 = load i32, i32* %112
%114 = icmp eq i32 %111, %113
br i1 %114, label %145, label %115
115: ; preds = %109
%116 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 3
%117 = load i32, i32* %116
%118 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 2
%119 = load i32, i32* %118
%120 = icmp eq i32 %117, %119
br i1 %120, label %145, label %121
121: ; preds = %115
%122 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 3
%123 = load i32, i32* %122
%124 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 2, i64 3
%125 = load i32, i32* %124
%126 = icmp eq i32 %123, %125
br i1 %126, label %145, label %127
127: ; preds = %121
%128 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 1
%129 = load i32, i32* %128
%130 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 0
%131 = load i32, i32* %130
%132 = icmp eq i32 %129, %131
br i1 %132, label %145, label %133
133: ; preds = %127
%134 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 2
%135 = load i32, i32* %134
%136 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 1
%137 = load i32, i32* %136
%138 = icmp eq i32 %135, %137
br i1 %138, label %145, label %139
139: ; preds = %133
%140 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 3
%141 = load i32, i32* %140
%142 = getelementptr inbounds [4 x i32], [4 x i32]* %0, i64 3, i64 2
%143 = load i32, i32* %142
%144 = icmp eq i32 %141, %143
br i1 %144, label %145, label %146
145: ; preds = %139, %133, %127, %121, %115, %109, %103, %97, %91, %85, %79, %73, %67, %61, %55, %49, %43, %37, %31, %25, %19, %13, %1, %7
br label %146
146: ; preds = %139, %145
%147 = phi i32 [ 1, %145 ], [ 0, %139 ]
ret i32 %147
}