int checkCeleb(int **xs, int i, int j) {
  if (xs[i][j] && !xs[j][i])
    return j;
  else if (!xs[i][j] && xs[i][j])
    return i;
  return -1;
}


x86 assembly (clang, -O0):
<checkCeleb>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     114d <checkCeleb+0x4d>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    114d <checkCeleb+0x4d>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1198 <checkCeleb+0x98>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    118c <checkCeleb+0x8c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     118c <checkCeleb+0x8c>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1198 <checkCeleb+0x98>
jmp    1191 <checkCeleb+0x91>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkCeleb>:
mov    %edx,%eax
movslq %esi,%rcx
mov    (%rdi,%rcx,8),%rsi
movslq %edx,%rdx
cmpl   $0x0,(%rsi,%rdx,4)
je     111c <checkCeleb+0x1c>
mov    (%rdi,%rdx,8),%rdx
cmpl   $0x0,(%rdx,%rcx,4)
je     1121 <checkCeleb+0x21>
mov    $0xffffffff,%eax
ret

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

LLVM IR (-O2):
define i32 @checkCeleb(i32** nocapture %0, i32 %1, i32 %2) {
%4 = sext i32 %1 to i64
%5 = getelementptr inbounds i32*, i32** %0, i64 %4
%6 = load i32*, i32** %5
%7 = sext i32 %2 to i64
%8 = getelementptr inbounds i32, i32* %6, i64 %7
%9 = load i32, i32* %8
%10 = icmp eq i32 %9, 0
br i1 %10, label %17, label %11
11: ; preds = %3
%12 = getelementptr inbounds i32*, i32** %0, i64 %7
%13 = load i32*, i32** %12
%14 = getelementptr inbounds i32, i32* %13, i64 %4
%15 = load i32, i32* %14
%16 = icmp eq i32 %15, 0
br i1 %16, label %18, label %17
17: ; preds = %11, %3
br label %18
18: ; preds = %11, %17
%19 = phi i32 [ -1, %17 ], [ %2, %11 ]
ret i32 %19
}