#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 */
void solution(unsigned int D, unsigned int N, float x[N],
              float A[D + 1][N + 1]) {
  bool used[D];
  for (unsigned int i = 0; i < D; i++)
    used[i] = false;
  for (unsigned int i = 0; i < N; i++) {
    x[i] = -1.;
    int pos = -1;
    for (unsigned int j = 0; j < D; j++) {
      if (0. == A[1 + j][i])
        continue;
      if ((1. == A[1 + j][i]) && (-1. == x[i]) && !used[j]) {
        x[i] = A[1 + j][N];
        pos = j;
        used[j] = true;
      } else {
        x[i] = -1.;
        break;
      }
    }
    if (-1. == x[i]) {
      x[i] = 0.;
      if (-1 != pos)
        used[pos] = false;
    }
  }
}


x86 assembly (clang, -O0):
<solution>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x8(%rbp),%ecx
mov    -0x4(%rbp),%eax
add    $0x1,%ecx
mov    %rcx,-0x48(%rbp)
mov    %rsp,%rcx
mov    %rcx,-0x20(%rbp)
lea    0xf(,%rax,4),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x40(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jae    1176 <solution+0x76>
mov    -0x40(%rbp),%rax
mov    -0x2c(%rbp),%ecx
movl   $0x0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    114e <solution+0x4e>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jae    134e <solution+0x24e>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
movss  0xe68(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
movl   $0xffffffff,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x4(%rbp),%eax
jae    12e2 <solution+0x1e2>
mov    -0x48(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
imul   %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jne    11f6 <solution+0xf6>
jp     11f6 <solution+0xf6>
jmp    12d4 <solution+0x1d4>
mov    -0x48(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
imul   %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    -0x30(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xde3(%rip),%xmm0
ucomisd %xmm1,%xmm0
jne    12b6 <solution+0x1b6>
jp     12b6 <solution+0x1b6>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdc3(%rip),%xmm0
ucomisd %xmm1,%xmm0
jne    12b6 <solution+0x1b6>
jp     12b6 <solution+0x1b6>
mov    -0x40(%rbp),%rax
mov    -0x38(%rbp),%ecx
cmpl   $0x0,(%rax,%rcx,4)
jne    12b6 <solution+0x1b6>
mov    -0x40(%rbp),%rax
mov    -0x48(%rbp),%rsi
mov    -0x18(%rbp),%rcx
mov    -0x38(%rbp),%edx
add    $0x1,%edx
mov    %edx,%edx
imul   %rsi,%rdx
shl    $0x2,%rdx
add    %rdx,%rcx
mov    -0x8(%rbp),%edx
movss  (%rcx,%rdx,4),%xmm0
mov    -0x10(%rbp),%rcx
mov    -0x30(%rbp),%edx
movss  %xmm0,(%rcx,%rdx,4)
mov    -0x38(%rbp),%ecx
mov    %ecx,-0x34(%rbp)
mov    -0x38(%rbp),%ecx
movl   $0x1,(%rax,%rcx,4)
jmp    12cf <solution+0x1cf>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
movss  0xd3b(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    12e2 <solution+0x1e2>
jmp    12d4 <solution+0x1d4>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11ab <solution+0xab>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd16(%rip),%xmm0
ucomisd %xmm1,%xmm0
jne    133b <solution+0x23b>
jp     133b <solution+0x23b>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    $0xffffffff,%eax
cmp    -0x34(%rbp),%eax
je     1336 <solution+0x236>
mov    -0x40(%rbp),%rax
movslq -0x34(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
jmp    133b <solution+0x23b>
jmp    1340 <solution+0x240>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    117d <solution+0x7d>
mov    -0x20(%rbp),%rax
mov    %rax,%rsp
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<solution>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rcx,%rbx
mov    %rdx,%r14
mov    %edi,%r15d
mov    %edi,%r13d
mov    %rsp,%r12
lea    0xf(,%r13,4),%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%r12
mov    %r12,%rsp
test   %edi,%edi
je     115d <solution+0x4d>
lea    0x0(,%r13,4),%rdx
mov    %r12,%rdi
mov    %rsi,-0x30(%rbp)
xor    %esi,%esi
call   1030 <memset@plt>
mov    -0x30(%rbp),%rsi
test   %esi,%esi
je     1250 <solution+0x140>
lea    0x1(%rsi),%ecx
mov    %esi,%r8d
lea    (%rbx,%r8,4),%r9
xor    %esi,%esi
movss  0xe87(%rip),%xmm0
xorps  %xmm1,%xmm1
movss  0xe80(%rip),%xmm2
jmp    11a9 <solution+0x99>
cs nopw 0x0(%rax,%rax,1)
movl   $0x0,(%r14,%rsi,4)
add    $0x1,%rsi
add    $0x4,%rbx
cmp    %r8,%rsi
je     1250 <solution+0x140>
movl   $0xbf800000,(%r14,%rsi,4)
bf
test   %r15d,%r15d
je     1190 <solution+0x80>
mov    $0xffffffff,%edi
mov    %rcx,%rax
movaps %xmm0,%xmm3
xor    %edx,%edx
jmp    11dc <solution+0xcc>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%rdx
add    %rcx,%rax
cmp    %rdx,%r13
je     1220 <solution+0x110>
movss  (%rbx,%rax,4),%xmm4
ucomiss %xmm1,%xmm4
jne    11e8 <solution+0xd8>
jnp    11d0 <solution+0xc0>
ucomiss %xmm2,%xmm4
jne    122f <solution+0x11f>
jp     122f <solution+0x11f>
ucomiss %xmm0,%xmm3
jne    122f <solution+0x11f>
jp     122f <solution+0x11f>
cmpl   $0x0,(%r12,%rdx,4)
jne    122f <solution+0x11f>
movss  (%r9,%rax,4),%xmm3
movss  %xmm3,(%r14,%rsi,4)
movl   $0x1,(%r12,%rdx,4)
mov    %edx,%edi
jmp    11d0 <solution+0xc0>
cs nopw 0x0(%rax,%rax,1)
nop
ucomiss %xmm0,%xmm3
jne    1198 <solution+0x88>
jp     1198 <solution+0x88>
movl   $0x0,(%r14,%rsi,4)
cmp    $0xffffffff,%edi
je     1198 <solution+0x88>
movslq %edi,%rax
movl   $0x0,(%r12,%rax,4)
jmp    1198 <solution+0x88>
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @solution(i32 %0, i32 %1, float* nocapture %2, float* nocapture %3) {
%5 = add i32 %1, 1
%6 = zext i32 %5 to i64
%7 = zext i32 %0 to i64
%8 = alloca i32, i64 %7
%9 = icmp eq i32 %0, 0
br i1 %9, label %13, label %10
10: ; preds = %4
%11 = bitcast i32* %8 to i8*
%12 = shl nuw nsw i64 %7, 2
br label %13
13: ; preds = %10, %4
%14 = icmp eq i32 %1, 0
br i1 %14, label %17, label %15
15: ; preds = %13
%16 = zext i32 %1 to i64
br label %18
17: ; preds = %56, %13
ret void
18: ; preds = %15, %56
%19 = phi i64 [ 0, %15 ], [ %57, %56 ]
%20 = getelementptr inbounds float, float* %2, i64 %19
store float -1.000000e+00, float* %20
br i1 %9, label %21, label %22
21: ; preds = %18
store float 0.000000e+00, float* %20
br label %56
22: ; preds = %18, %44
%23 = phi float [ %45, %44 ], [ -1.000000e+00, %18 ]
%24 = phi i64 [ %26, %44 ], [ 0, %18 ]
%25 = phi i32 [ %46, %44 ], [ -1, %18 ]
%26 = add nuw nsw i64 %24, 1
%27 = mul nuw nsw i64 %26, %6
%28 = getelementptr inbounds float, float* %3, i64 %27
%29 = getelementptr inbounds float, float* %28, i64 %19
%30 = load float, float* %29
%31 = fcmp oeq float %30, 0.000000e+00
br i1 %31, label %44, label %32
32: ; preds = %22
%33 = fcmp oeq float %30, 1.000000e+00
%34 = fcmp oeq float %23, -1.000000e+00
%35 = select i1 %33, i1 %34, i1 false
br i1 %35, label %36, label %50
36: ; preds = %32
%37 = getelementptr inbounds i32, i32* %8, i64 %24
%38 = load i32, i32* %37
%39 = icmp eq i32 %38, 0
br i1 %39, label %40, label %50
40: ; preds = %36
%41 = getelementptr inbounds float, float* %28, i64 %16
%42 = load float, float* %41
store float %42, float* %20
store i32 1, i32* %37
%43 = trunc i64 %24 to i32
br label %44
44: ; preds = %22, %40
%45 = phi float [ %23, %22 ], [ %42, %40 ]
%46 = phi i32 [ %25, %22 ], [ %43, %40 ]
%47 = icmp eq i64 %26, %7
br i1 %47, label %48, label %22
48: ; preds = %44
%49 = fcmp oeq float %45, -1.000000e+00
br i1 %49, label %50, label %56
50: ; preds = %36, %32, %48
%51 = phi i32 [ %46, %48 ], [ %25, %32 ], [ %25, %36 ]
store float 0.000000e+00, float* %20
%52 = icmp eq i32 %51, -1
br i1 %52, label %56, label %53
53: ; preds = %50
%54 = sext i32 %51 to i64
%55 = getelementptr inbounds i32, i32* %8, i64 %54
store i32 0, i32* %55
br label %56
56: ; preds = %21, %50, %53, %48
%57 = add nuw nsw i64 %19, 1
%58 = icmp eq i64 %57, %16
br i1 %58, label %17, label %18
}