#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 */
bool valid(int num, int row, int col, int index, bool **rows, bool **cols,
           bool **boxes) {
  return !rows[row][num] && !cols[col][num] && !boxes[index][num];
}


x86 assembly (clang, -O0):
<valid>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8,-0x18(%rbp)
mov    %r9,-0x20(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,8),%rcx
movslq -0x4(%rbp),%rdx
xor    %eax,%eax
cmpl   $0x0,(%rcx,%rdx,4)
mov    %al,-0x21(%rbp)
jne    1176 <valid+0x76>
mov    -0x20(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,8),%rcx
movslq -0x4(%rbp),%rdx
xor    %eax,%eax
cmpl   $0x0,(%rcx,%rdx,4)
mov    %al,-0x21(%rbp)
jne    1176 <valid+0x76>
mov    0x10(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x4(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
setne  %al
xor    $0xff,%al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<valid>:
movslq %esi,%rax
mov    (%r8,%rax,8),%rsi
movslq %edi,%rdi
xor    %eax,%eax
cmpl   $0x0,(%rsi,%rdi,4)
je     1113 <valid+0x13>
ret
movslq %edx,%rdx
mov    (%r9,%rdx,8),%rdx
cmpl   $0x0,(%rdx,%rdi,4)
jne    1112 <valid+0x12>
mov    0x8(%rsp),%rax
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rcx
xor    %eax,%eax
cmpl   $0x0,(%rcx,%rdi,4)
sete   %al
ret

LLVM IR (-O0):
define i32 @valid(i32 %0, i32 %1, i32 %2, i32 %3, i32** %4, i32** %5, i32** %6) {
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32**
%13 = alloca i32**
%14 = 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
store i32** %6, i32*** %14
%15 = load i32**, i32*** %12
%16 = load i32, i32* %9
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i32*, i32** %15, i64 %17
%19 = load i32*, i32** %18
%20 = load i32, i32* %8
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i32, i32* %19, i64 %21
%23 = load i32, i32* %22
%24 = icmp ne i32 %23, 0
br i1 %24, label %48, label %25
25: ; preds = %7
%26 = load i32**, i32*** %13
%27 = load i32, i32* %10
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i32*, i32** %26, i64 %28
%30 = load i32*, i32** %29
%31 = load i32, i32* %8
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i32, i32* %30, i64 %32
%34 = load i32, i32* %33
%35 = icmp ne i32 %34, 0
br i1 %35, label %48, label %36
36: ; preds = %25
%37 = load i32**, i32*** %14
%38 = load i32, i32* %11
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i32*, i32** %37, i64 %39
%41 = load i32*, i32** %40
%42 = load i32, i32* %8
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i32, i32* %41, i64 %43
%45 = load i32, i32* %44
%46 = icmp ne i32 %45, 0
%47 = xor i1 %46, true
br label %48
48: ; preds = %36, %25, %7
%49 = phi i1 [ false, %25 ], [ false, %7 ], [ %47, %36 ]
%50 = zext i1 %49 to i32
ret i32 %50
}

LLVM IR (-O2):
define i32 @valid(i32 %0, i32 %1, i32 %2, i32 %3, i32** nocapture %4, i32** nocapture %5, i32** nocapture %6) {
%8 = sext i32 %1 to i64
%9 = getelementptr inbounds i32*, i32** %4, i64 %8
%10 = load i32*, i32** %9
%11 = sext i32 %0 to i64
%12 = getelementptr inbounds i32, i32* %10, i64 %11
%13 = load i32, i32* %12
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %30
15: ; preds = %7
%16 = sext i32 %2 to i64
%17 = getelementptr inbounds i32*, i32** %5, i64 %16
%18 = load i32*, i32** %17
%19 = getelementptr inbounds i32, i32* %18, i64 %11
%20 = load i32, i32* %19
%21 = icmp eq i32 %20, 0
br i1 %21, label %22, label %30
22: ; preds = %15
%23 = sext i32 %3 to i64
%24 = getelementptr inbounds i32*, i32** %6, i64 %23
%25 = load i32*, i32** %24
%26 = getelementptr inbounds i32, i32* %25, i64 %11
%27 = load i32, i32* %26
%28 = icmp eq i32 %27, 0
%29 = zext i1 %28 to i32
br label %30
30: ; preds = %22, %15, %7
%31 = phi i32 [ 0, %15 ], [ 0, %7 ], [ %29, %22 ]
ret i32 %31
}