#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int abs(int);
int /*<<< orphan*/ check_for_collision(int, int, int, int, int **);
int /*<<< orphan*/ is_square_empty(int, int, int **);
int check_valid_move_pawn(int x1, int y1, int x2, int y2, int thisPieceColor,
                          int **board) {
  if ((thisPieceColor == 1 && (y2 - y1) < 1) ||
      (thisPieceColor == 2 && (y1 - y2) < 1)) {
    return 0;
  }
  if (x2 - x1 == 0 &&
      ((thisPieceColor == 1 && (y2 - y1) == 1) ||
       (thisPieceColor == 2 && (y1 - y2) == 1)) &&
      !(check_for_collision(x1, y1, x2, y2, board))) {
    return 1;
  }
  if (x2 - x1 == 0 &&
      ((thisPieceColor == 1 && (y2 - y1) > 1) ||
       (thisPieceColor == 2 && (y1 - y2) > 1)) &&
      !(check_for_collision(x1, y1, x2, y2, board))) {
    if (thisPieceColor == 1 && (y2 - y1) == 2 && y1 == 2) {
      return 1;
    }
    if (thisPieceColor == 2 && (y1 - y2) == 2 && y1 == 7) {
      return 1;
    }
    return 0;
  }
  if (x2 != x1) {
    if ((abs(x2 - x1) == 1) && (y2 - y1 == 1) &&
        !(is_square_empty(x2, y2, board))) {
      return 1;
    }
    return 0;
  }
  return 0;
}


x86 assembly (clang, -O0):
<check_valid_move_pawn>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9,-0x20(%rbp)
cmpl   $0x1,-0x18(%rbp)
jne    1165 <check_valid_move_pawn+0x35>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    $0x1,%eax
jl     117e <check_valid_move_pawn+0x4e>
cmpl   $0x2,-0x18(%rbp)
jne    118a <check_valid_move_pawn+0x5a>
mov    -0xc(%rbp),%eax
sub    -0x14(%rbp),%eax
cmp    $0x1,%eax
jge    118a <check_valid_move_pawn+0x5a>
movl   $0x0,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
mov    -0x10(%rbp),%eax
sub    -0x8(%rbp),%eax
cmp    $0x0,%eax
jne    11f5 <check_valid_move_pawn+0xc5>
cmpl   $0x1,-0x18(%rbp)
jne    11b2 <check_valid_move_pawn+0x82>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    $0x1,%eax
je     11cb <check_valid_move_pawn+0x9b>
cmpl   $0x2,-0x18(%rbp)
jne    11f5 <check_valid_move_pawn+0xc5>
mov    -0xc(%rbp),%eax
sub    -0x14(%rbp),%eax
cmp    $0x1,%eax
jne    11f5 <check_valid_move_pawn+0xc5>
mov    -0x8(%rbp),%edi
mov    -0xc(%rbp),%esi
mov    -0x10(%rbp),%edx
mov    -0x14(%rbp),%ecx
mov    -0x20(%rbp),%r8
call   1040 <check_for_collision@plt>
cmp    $0x0,%eax
jne    11f5 <check_valid_move_pawn+0xc5>
movl   $0x1,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
mov    -0x10(%rbp),%eax
sub    -0x8(%rbp),%eax
cmp    $0x0,%eax
jne    12be <check_valid_move_pawn+0x18e>
cmpl   $0x1,-0x18(%rbp)
jne    121d <check_valid_move_pawn+0xed>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    $0x1,%eax
jg     1236 <check_valid_move_pawn+0x106>
cmpl   $0x2,-0x18(%rbp)
jne    12be <check_valid_move_pawn+0x18e>
mov    -0xc(%rbp),%eax
sub    -0x14(%rbp),%eax
cmp    $0x1,%eax
jle    12be <check_valid_move_pawn+0x18e>
mov    -0x8(%rbp),%edi
mov    -0xc(%rbp),%esi
mov    -0x10(%rbp),%edx
mov    -0x14(%rbp),%ecx
mov    -0x20(%rbp),%r8
call   1040 <check_for_collision@plt>
cmp    $0x0,%eax
jne    12be <check_valid_move_pawn+0x18e>
cmpl   $0x1,-0x18(%rbp)
jne    1283 <check_valid_move_pawn+0x153>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    $0x2,%eax
jne    1283 <check_valid_move_pawn+0x153>
cmpl   $0x2,-0xc(%rbp)
jne    1283 <check_valid_move_pawn+0x153>
movl   $0x1,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
cmpl   $0x2,-0x18(%rbp)
jne    12b2 <check_valid_move_pawn+0x182>
mov    -0xc(%rbp),%eax
sub    -0x14(%rbp),%eax
cmp    $0x2,%eax
jne    12b2 <check_valid_move_pawn+0x182>
cmpl   $0x7,-0xc(%rbp)
jne    12b2 <check_valid_move_pawn+0x182>
movl   $0x1,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
movl   $0x0,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
mov    -0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
je     131d <check_valid_move_pawn+0x1ed>
mov    -0x10(%rbp),%edi
sub    -0x8(%rbp),%edi
call   1030 <abs@plt>
cmp    $0x1,%eax
jne    1311 <check_valid_move_pawn+0x1e1>
mov    -0x14(%rbp),%eax
sub    -0xc(%rbp),%eax
cmp    $0x1,%eax
jne    1311 <check_valid_move_pawn+0x1e1>
mov    -0x10(%rbp),%edi
mov    -0x14(%rbp),%esi
mov    -0x20(%rbp),%rdx
call   1050 <is_square_empty@plt>
cmp    $0x0,%eax
jne    1311 <check_valid_move_pawn+0x1e1>
movl   $0x1,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
movl   $0x0,-0x4(%rbp)
jmp    1324 <check_valid_move_pawn+0x1f4>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_valid_move_pawn>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r8d,%r13d
mov    %ecx,%ebx
mov    %edx,%r12d
mov    %esi,%ebp
mov    %edi,%r14d
xor    %ecx,%ecx
cmp    %ebx,%esi
jl     114b <check_valid_move_pawn+0x2b>
cmp    $0x1,%r13d
je     126e <check_valid_move_pawn+0x14e>
mov    %ebp,%r15d
sub    %ebx,%r15d
jg     115d <check_valid_move_pawn+0x3d>
cmp    $0x2,%r13d
je     126e <check_valid_move_pawn+0x14e>
mov    %r12d,%edx
sub    %r14d,%edx
je     11a7 <check_valid_move_pawn+0x87>
cmp    %r14d,%r12d
je     126e <check_valid_move_pawn+0x14e>
mov    %edx,%eax
neg    %eax
cmovs  %edx,%eax
cmp    $0x1,%eax
jne    126e <check_valid_move_pawn+0x14e>
mov    %ebx,%eax
sub    %ebp,%eax
cmp    $0x1,%eax
jne    126e <check_valid_move_pawn+0x14e>
mov    %r12d,%edi
mov    %ebx,%esi
mov    %r9,%rdx
call   1040 <is_square_empty@plt>
xor    %ecx,%ecx
test   %eax,%eax
jne    126e <check_valid_move_pawn+0x14e>
jmp    1269 <check_valid_move_pawn+0x149>
mov    %ebx,%eax
sub    %ebp,%eax
mov    %eax,0x8(%rsp)
cmp    $0x1,%r13d
mov    %r9,0x10(%rsp)
mov    %edx,0xc(%rsp)
jne    11c5 <check_valid_move_pawn+0xa5>
cmpl   $0x1,0x8(%rsp)
je     11d1 <check_valid_move_pawn+0xb1>
cmp    $0x2,%r13d
jne    11f2 <check_valid_move_pawn+0xd2>
cmp    $0x1,%r15d
jne    11f2 <check_valid_move_pawn+0xd2>
mov    %r14d,%edi
mov    %ebp,%esi
mov    %r12d,%edx
mov    %ebx,%ecx
mov    %r9,%r8
call   1030 <check_for_collision@plt>
mov    0xc(%rsp),%edx
mov    0x10(%rsp),%r9
xor    %ecx,%ecx
test   %eax,%eax
je     1269 <check_valid_move_pawn+0x149>
cmp    $0x1,%r13d
jne    11ff <check_valid_move_pawn+0xdf>
cmpl   $0x1,0x8(%rsp)
jg     1213 <check_valid_move_pawn+0xf3>
cmp    $0x2,%r13d
jne    1165 <check_valid_move_pawn+0x45>
cmp    $0x2,%r15d
jl     1165 <check_valid_move_pawn+0x45>
mov    %r14d,%edi
mov    %ebp,%esi
mov    %r12d,%edx
mov    %ebx,%ecx
mov    %r9,%r8
call   1030 <check_for_collision@plt>
mov    0xc(%rsp),%edx
mov    0x10(%rsp),%r9
xor    %ecx,%ecx
test   %eax,%eax
jne    1165 <check_valid_move_pawn+0x45>
cmp    $0x1,%r13d
jne    124f <check_valid_move_pawn+0x12f>
cmp    $0x2,%ebp
jne    124f <check_valid_move_pawn+0x12f>
mov    $0x1,%ecx
cmpl   $0x2,0x8(%rsp)
je     126e <check_valid_move_pawn+0x14e>
cmp    $0x2,%r13d
jne    1265 <check_valid_move_pawn+0x145>
cmp    $0x7,%ebp
jne    1265 <check_valid_move_pawn+0x145>
mov    $0x1,%ecx
cmp    $0x2,%r15d
je     126e <check_valid_move_pawn+0x14e>
xor    %ecx,%ecx
jmp    126e <check_valid_move_pawn+0x14e>
mov    $0x1,%ecx
mov    %ecx,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @check_valid_move_pawn(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32** %5) {
%7 = icmp eq i32 %4, 1
%8 = icmp sge i32 %1, %3
%9 = and i1 %8, %7
br i1 %9, label %62, label %10
10: ; preds = %6
%11 = icmp eq i32 %4, 2
%12 = icmp sle i32 %1, %3
%13 = and i1 %12, %11
br i1 %13, label %62, label %14
14: ; preds = %10
%15 = sub nsw i32 %2, %0
%16 = icmp eq i32 %15, 0
br i1 %16, label %17, label %50
17: ; preds = %14
%18 = sub nsw i32 %3, %1
%19 = icmp eq i32 %18, 1
%20 = select i1 %7, i1 %19, i1 false
br i1 %20, label %25, label %21
21: ; preds = %17
%22 = sub nsw i32 %1, %3
%23 = icmp eq i32 %22, 1
%24 = select i1 %11, i1 %23, i1 false
br i1 %24, label %25, label %28
25: ; preds = %21, %17
%26 = tail call i32 @check_for_collision(i32 %0, i32 %1, i32 %2, i32 %3, i32** %5)
%27 = icmp eq i32 %26, 0
br i1 %27, label %62, label %28
28: ; preds = %21, %25
%29 = icmp sgt i32 %18, 1
%30 = select i1 %7, i1 %29, i1 false
br i1 %30, label %35, label %31
31: ; preds = %28
%32 = sub nsw i32 %1, %3
%33 = icmp sgt i32 %32, 1
%34 = select i1 %11, i1 %33, i1 false
br i1 %34, label %35, label %50
35: ; preds = %31, %28
%36 = tail call i32 @check_for_collision(i32 %0, i32 %1, i32 %2, i32 %3, i32** %5)
%37 = icmp eq i32 %36, 0
br i1 %37, label %38, label %50
38: ; preds = %35
br i1 %7, label %39, label %43
39: ; preds = %38
%40 = icmp eq i32 %18, 2
%41 = icmp eq i32 %1, 2
%42 = and i1 %41, %40
br i1 %42, label %62, label %43
43: ; preds = %39, %38
br i1 %11, label %44, label %49
44: ; preds = %43
%45 = sub nsw i32 %1, %3
%46 = icmp eq i32 %45, 2
%47 = icmp eq i32 %1, 7
%48 = and i1 %47, %46
br i1 %48, label %62, label %49
49: ; preds = %44, %43
br label %62
50: ; preds = %14, %35, %31
%51 = icmp eq i32 %2, %0
br i1 %51, label %62, label %52
52: ; preds = %50
%53 = tail call i32 @llvm.abs.i32(i32 %15, i1 true)
%54 = icmp eq i32 %53, 1
%55 = sub nsw i32 %3, %1
%56 = icmp eq i32 %55, 1
%57 = select i1 %54, i1 %56, i1 false
br i1 %57, label %58, label %61
58: ; preds = %52
%59 = tail call i32 @is_square_empty(i32 %2, i32 %3, i32** %5)
%60 = icmp eq i32 %59, 0
br i1 %60, label %62, label %61
61: ; preds = %58, %52
br label %62
62: ; preds = %50, %58, %44, %39, %25, %6, %10, %61, %49
%63 = phi i32 [ 0, %61 ], [ 0, %49 ], [ 0, %10 ], [ 0, %6 ], [ 1, %25 ], [ 1, %39 ], [ 1, %44 ], [ 1, %58 ], [ 0, %50 ]
ret i32 %63
}