#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 */
scalar_t__ candidatoCabeEnCaja(int **, int, int, int);
scalar_t__ candidatoCabeEnColumna(int **, int, int);
scalar_t__ candidatoCabeEnFila(int **, int, int);
int /*<<< orphan*/ ubicacionUnicaEnCaja(int **, int, int, int);
int /*<<< orphan*/ ubicacionUnicaEnColumna(int **, int, int);
int /*<<< orphan*/ ubicacionUnicaEnFila(int **, int, int);
int rellenarSiUnicaPosicion(int s[9][9]) {
  int candidato;
  int f, c;
  int noSeHanRealizadoCambios;
  for (noSeHanRealizadoCambios = 1, candidato = 1; candidato <= 9;
       candidato++) {
    for (f = 0; f < 9; f++) {
      for (c = 0; c < 9; c++) {
        if (s[f][c] == 0 && candidatoCabeEnFila(s, f, candidato) &&
            candidatoCabeEnColumna(s, c, candidato) &&
            candidatoCabeEnCaja(s, f, c, candidato)) {
          noSeHanRealizadoCambios = !ubicacionUnicaEnFila(s, f, candidato);
          if (noSeHanRealizadoCambios) {
            noSeHanRealizadoCambios = !ubicacionUnicaEnColumna(s, c, candidato);
          }
          if (noSeHanRealizadoCambios) {
            noSeHanRealizadoCambios = !ubicacionUnicaEnCaja(s, f, c, candidato);
          }
          if (!noSeHanRealizadoCambios) {
            s[f][c] = candidato;
            return 1;
          }
        }
      }
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<rellenarSiUnicaPosicion>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x1,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x9,-0x14(%rbp)
jg     12f2 <rellenarSiUnicaPosicion+0x192>
movl   $0x0,-0x18(%rbp)
cmpl   $0x9,-0x18(%rbp)
jge    12df <rellenarSiUnicaPosicion+0x17f>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x9,-0x1c(%rbp)
jge    12cc <rellenarSiUnicaPosicion+0x16c>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
imul   $0x24,%rcx,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    12b9 <rellenarSiUnicaPosicion+0x159>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%esi
mov    -0x14(%rbp),%edx
call   1030 <candidatoCabeEnFila@plt>
cmp    $0x0,%rax
je     12b9 <rellenarSiUnicaPosicion+0x159>
mov    -0x10(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    -0x14(%rbp),%edx
call   1070 <candidatoCabeEnColumna@plt>
cmp    $0x0,%rax
je     12b9 <rellenarSiUnicaPosicion+0x159>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%esi
mov    -0x1c(%rbp),%edx
mov    -0x14(%rbp),%ecx
call   1040 <candidatoCabeEnCaja@plt>
cmp    $0x0,%rax
je     12b9 <rellenarSiUnicaPosicion+0x159>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%esi
mov    -0x14(%rbp),%edx
call   1050 <ubicacionUnicaEnFila@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     1259 <rellenarSiUnicaPosicion+0xf9>
mov    -0x10(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    -0x14(%rbp),%edx
call   1080 <ubicacionUnicaEnColumna@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     1285 <rellenarSiUnicaPosicion+0x125>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%esi
mov    -0x1c(%rbp),%edx
mov    -0x14(%rbp),%ecx
call   1060 <ubicacionUnicaEnCaja@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jne    12b4 <rellenarSiUnicaPosicion+0x154>
mov    -0x14(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
imul   $0x24,%rcx,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movl   $0x1,-0x4(%rbp)
jmp    12f9 <rellenarSiUnicaPosicion+0x199>
jmp    12b9 <rellenarSiUnicaPosicion+0x159>
jmp    12be <rellenarSiUnicaPosicion+0x15e>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    119c <rellenarSiUnicaPosicion+0x3c>
jmp    12d1 <rellenarSiUnicaPosicion+0x171>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    118b <rellenarSiUnicaPosicion+0x2b>
jmp    12e4 <rellenarSiUnicaPosicion+0x184>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    117a <rellenarSiUnicaPosicion+0x1a>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rellenarSiUnicaPosicion>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %rdi,%r14
mov    $0x1,%r12d
mov    %r14,%rbp
xor    %r15d,%r15d
jmp    1192 <rellenarSiUnicaPosicion+0x32>
nopl   0x0(%rax)
add    $0x1,%r15
add    $0x24,%rbp
cmp    $0x9,%r15
je     1228 <rellenarSiUnicaPosicion+0xc8>
xor    %ebx,%ebx
jmp    11aa <rellenarSiUnicaPosicion+0x4a>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%rbx
cmp    $0x9,%rbx
je     1180 <rellenarSiUnicaPosicion+0x20>
cmpl   $0x0,0x0(%rbp,%rbx,4)
jne    11a0 <rellenarSiUnicaPosicion+0x40>
mov    %r14,%rdi
mov    %r15d,%esi
mov    %r12d,%edx
call   1030 <candidatoCabeEnFila@plt>
test   %rax,%rax
je     11a0 <rellenarSiUnicaPosicion+0x40>
mov    %r14,%rdi
mov    %ebx,%esi
mov    %r12d,%edx
call   1070 <candidatoCabeEnColumna@plt>
test   %rax,%rax
je     11a0 <rellenarSiUnicaPosicion+0x40>
mov    %r14,%rdi
mov    %r15d,%esi
mov    %ebx,%edx
mov    %r12d,%ecx
call   1040 <candidatoCabeEnCaja@plt>
test   %rax,%rax
je     11a0 <rellenarSiUnicaPosicion+0x40>
mov    %r14,%rdi
mov    %r15d,%esi
mov    %r12d,%edx
call   1050 <ubicacionUnicaEnFila@plt>
test   %eax,%eax
jne    123a <rellenarSiUnicaPosicion+0xda>
mov    %r14,%rdi
mov    %ebx,%esi
mov    %r12d,%edx
call   1080 <ubicacionUnicaEnColumna@plt>
test   %eax,%eax
jne    123a <rellenarSiUnicaPosicion+0xda>
mov    %r14,%rdi
mov    %r15d,%esi
mov    %ebx,%edx
mov    %r12d,%ecx
call   1060 <ubicacionUnicaEnCaja@plt>
test   %eax,%eax
je     11a0 <rellenarSiUnicaPosicion+0x40>
jmp    123a <rellenarSiUnicaPosicion+0xda>
add    $0x1,%r12d
cmp    $0xa,%r12d
jne    1171 <rellenarSiUnicaPosicion+0x11>
xor    %eax,%eax
jmp    1244 <rellenarSiUnicaPosicion+0xe4>
mov    %r12d,0x0(%rbp,%rbx,4)
mov    $0x1,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @rellenarSiUnicaPosicion([9 x i32]* %0) {
%2 = alloca i32
%3 = alloca [9 x i32]*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store [9 x i32]* %0, [9 x i32]** %3
store i32 1, i32* %7
store i32 1, i32* %4
br label %8
8: ; preds = %106, %1
%9 = load i32, i32* %4
%10 = icmp sle i32 %9, 9
br i1 %10, label %11, label %109
11: ; preds = %8
store i32 0, i32* %5
br label %12
12: ; preds = %102, %11
%13 = load i32, i32* %5
%14 = icmp slt i32 %13, 9
br i1 %14, label %15, label %105
15: ; preds = %12
store i32 0, i32* %6
br label %16
16: ; preds = %98, %15
%17 = load i32, i32* %6
%18 = icmp slt i32 %17, 9
br i1 %18, label %19, label %101
19: ; preds = %16
%20 = load [9 x i32]*, [9 x i32]** %3
%21 = load i32, i32* %5
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [9 x i32], [9 x i32]* %20, i64 %22
%24 = load i32, i32* %6
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [9 x i32], [9 x i32]* %23, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = icmp eq i32 %27, 0
br i1 %28, label %29, label %97
29: ; preds = %19
%30 = load [9 x i32]*, [9 x i32]** %3
%31 = bitcast [9 x i32]* %30 to i32**
%32 = load i32, i32* %5
%33 = load i32, i32* %4
%34 = call i64 @candidatoCabeEnFila(i32** %31, i32 %32, i32 %33)
%35 = icmp ne i64 %34, 0
br i1 %35, label %36, label %97
36: ; preds = %29
%37 = load [9 x i32]*, [9 x i32]** %3
%38 = bitcast [9 x i32]* %37 to i32**
%39 = load i32, i32* %6
%40 = load i32, i32* %4
%41 = call i64 @candidatoCabeEnColumna(i32** %38, i32 %39, i32 %40)
%42 = icmp ne i64 %41, 0
br i1 %42, label %43, label %97
43: ; preds = %36
%44 = load [9 x i32]*, [9 x i32]** %3
%45 = bitcast [9 x i32]* %44 to i32**
%46 = load i32, i32* %5
%47 = load i32, i32* %6
%48 = load i32, i32* %4
%49 = call i64 @candidatoCabeEnCaja(i32** %45, i32 %46, i32 %47, i32 %48)
%50 = icmp ne i64 %49, 0
br i1 %50, label %51, label %97
51: ; preds = %43
%52 = load [9 x i32]*, [9 x i32]** %3
%53 = bitcast [9 x i32]* %52 to i32**
%54 = load i32, i32* %5
%55 = load i32, i32* %4
%56 = call i32 @ubicacionUnicaEnFila(i32** %53, i32 %54, i32 %55)
%57 = icmp ne i32 %56, 0
%58 = xor i1 %57, true
%59 = zext i1 %58 to i32
store i32 %59, i32* %7
%60 = load i32, i32* %7
%61 = icmp ne i32 %60, 0
br i1 %61, label %62, label %71
62: ; preds = %51
%63 = load [9 x i32]*, [9 x i32]** %3
%64 = bitcast [9 x i32]* %63 to i32**
%65 = load i32, i32* %6
%66 = load i32, i32* %4
%67 = call i32 @ubicacionUnicaEnColumna(i32** %64, i32 %65, i32 %66)
%68 = icmp ne i32 %67, 0
%69 = xor i1 %68, true
%70 = zext i1 %69 to i32
store i32 %70, i32* %7
br label %71
71: ; preds = %62, %51
%72 = load i32, i32* %7
%73 = icmp ne i32 %72, 0
br i1 %73, label %74, label %84
74: ; preds = %71
%75 = load [9 x i32]*, [9 x i32]** %3
%76 = bitcast [9 x i32]* %75 to i32**
%77 = load i32, i32* %5
%78 = load i32, i32* %6
%79 = load i32, i32* %4
%80 = call i32 @ubicacionUnicaEnCaja(i32** %76, i32 %77, i32 %78, i32 %79)
%81 = icmp ne i32 %80, 0
%82 = xor i1 %81, true
%83 = zext i1 %82 to i32
store i32 %83, i32* %7
br label %84
84: ; preds = %74, %71
%85 = load i32, i32* %7
%86 = icmp ne i32 %85, 0
br i1 %86, label %96, label %87
87: ; preds = %84
%88 = load i32, i32* %4
%89 = load [9 x i32]*, [9 x i32]** %3
%90 = load i32, i32* %5
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds [9 x i32], [9 x i32]* %89, i64 %91
%93 = load i32, i32* %6
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds [9 x i32], [9 x i32]* %92, i64 0, i64 %94
store i32 %88, i32* %95
store i32 1, i32* %2
br label %110
96: ; preds = %84
br label %97
97: ; preds = %96, %43, %36, %29, %19
br label %98
98: ; preds = %97
%99 = load i32, i32* %6
%100 = add nsw i32 %99, 1
store i32 %100, i32* %6
br label %16
101: ; preds = %16
br label %102
102: ; preds = %101
%103 = load i32, i32* %5
%104 = add nsw i32 %103, 1
store i32 %104, i32* %5
br label %12
105: ; preds = %12
br label %106
106: ; preds = %105
%107 = load i32, i32* %4
%108 = add nsw i32 %107, 1
store i32 %108, i32* %4
br label %8
109: ; preds = %8
store i32 0, i32* %2
br label %110
110: ; preds = %109, %87
%111 = load i32, i32* %2
ret i32 %111
}

LLVM IR (-O2):
define i32 @rellenarSiUnicaPosicion([9 x i32]* %0) {
%2 = bitcast [9 x i32]* %0 to i32**
br label %3
3: ; preds = %1, %39
%4 = phi i32 [ 1, %1 ], [ %40, %39 ]
br label %5
5: ; preds = %3, %36
%6 = phi i64 [ 0, %3 ], [ %37, %36 ]
%7 = trunc i64 %6 to i32
br label %8
8: ; preds = %5, %33
%9 = phi i64 [ 0, %5 ], [ %34, %33 ]
%10 = getelementptr inbounds [9 x i32], [9 x i32]* %0, i64 %6, i64 %9
%11 = load i32, i32* %10
%12 = icmp eq i32 %11, 0
br i1 %12, label %13, label %33
13: ; preds = %8
%14 = tail call i64 @candidatoCabeEnFila(i32** %2, i32 %7, i32 %4)
%15 = icmp eq i64 %14, 0
br i1 %15, label %33, label %16
16: ; preds = %13
%17 = trunc i64 %9 to i32
%18 = tail call i64 @candidatoCabeEnColumna(i32** %2, i32 %17, i32 %4)
%19 = icmp eq i64 %18, 0
br i1 %19, label %33, label %20
20: ; preds = %16
%21 = tail call i64 @candidatoCabeEnCaja(i32** %2, i32 %7, i32 %17, i32 %4)
%22 = icmp eq i64 %21, 0
br i1 %22, label %33, label %23
23: ; preds = %20
%24 = tail call i32 @ubicacionUnicaEnFila(i32** %2, i32 %7, i32 %4)
%25 = icmp eq i32 %24, 0
br i1 %25, label %26, label %32
26: ; preds = %23
%27 = tail call i32 @ubicacionUnicaEnColumna(i32** %2, i32 %17, i32 %4)
%28 = icmp eq i32 %27, 0
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = tail call i32 @ubicacionUnicaEnCaja(i32** %2, i32 %7, i32 %17, i32 %4)
%31 = icmp eq i32 %30, 0
br i1 %31, label %33, label %32
32: ; preds = %23, %26, %29
store i32 %4, i32* %10
br label %42
33: ; preds = %8, %13, %16, %20, %29
%34 = add nuw nsw i64 %9, 1
%35 = icmp eq i64 %34, 9
br i1 %35, label %36, label %8
36: ; preds = %33
%37 = add nuw nsw i64 %6, 1
%38 = icmp eq i64 %37, 9
br i1 %38, label %39, label %5
39: ; preds = %36
%40 = add nuw nsw i32 %4, 1
%41 = icmp eq i32 %40, 10
br i1 %41, label %42, label %3
42: ; preds = %39, %32
%43 = phi i32 [ 1, %32 ], [ 0, %39 ]
ret i32 %43
}