#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 /*<<< orphan*/ exchange(float **, int, int);
int /*<<< orphan*/ linear(float **, int, int, int, int);
int /*<<< orphan*/ scale(float **, int, int);
void row_echelon(float A[6][10 + 1]) {
  int i, j, k;
  for (i = 0, j = 0; i < 6 && j < 10; i++, j++) {
    for (k = i; k < 6 && ((A[k][j]) <= 0.00001 && (A[k][j]) >= -0.00001); k++)
      ;
    if (k != i && k < 6)
      exchange(A, i, k);
    if (k == 6) {
      i--;
      continue;
    }
    scale(A, i, 1 / A[i][j]);
    A[i][j] = 1;
    for (k = 0; k < 6; k++) {
      if (k == i)
        continue;
      linear(A, k, i, 1, -1 * A[k][j]);
    }
  }
}


x86 assembly (clang, -O0):
<row_echelon>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
xor    %eax,%eax
cmpl   $0x6,-0xc(%rbp)
mov    %al,-0x15(%rbp)
jge    1163 <row_echelon+0x33>
cmpl   $0xa,-0x10(%rbp)
setl   %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
test   $0x1,%al
jne    1173 <row_echelon+0x43>
jmp    1324 <row_echelon+0x1f4>
mov    -0xc(%rbp),%eax
mov    %eax,-0x14(%rbp)
xor    %eax,%eax
cmpl   $0x6,-0x14(%rbp)
mov    %al,-0x16(%rbp)
jge    11ef <row_echelon+0xbf>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
xor    %eax,%eax
movsd  0xe52(%rip),%xmm0
ucomisd %xmm1,%xmm0
mov    %al,-0x17(%rbp)
jb     11e9 <row_echelon+0xb9>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe29(%rip),%xmm1
ucomisd %xmm1,%xmm0
setae  %al
mov    %al,-0x17(%rbp)
mov    -0x17(%rbp),%al
mov    %al,-0x16(%rbp)
mov    -0x16(%rbp),%al
test   $0x1,%al
jne    11ff <row_echelon+0xcf>
jmp    1212 <row_echelon+0xe2>
jmp    1204 <row_echelon+0xd4>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1179 <row_echelon+0x49>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
je     1237 <row_echelon+0x107>
cmpl   $0x6,-0x14(%rbp)
jge    1237 <row_echelon+0x107>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0x14(%rbp),%edx
call   1050 <exchange@plt>
cmpl   $0x6,-0x14(%rbp)
jne    124f <row_echelon+0x11f>
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
jmp    130d <row_echelon+0x1dd>
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
movss  0xd9f(%rip),%xmm0
divss  (%rax,%rcx,4),%xmm0
cvttss2si %xmm0,%edx
call   1040 <scale@plt>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
movss  0xd76(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
movl   $0x0,-0x14(%rbp)
cmpl   $0x6,-0x14(%rbp)
jge    1308 <row_echelon+0x1d8>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    12c1 <row_echelon+0x191>
jmp    12fa <row_echelon+0x1ca>
mov    -0x8(%rbp),%rdi
mov    -0x14(%rbp),%esi
mov    -0xc(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0x10(%rbp),%rcx
movss  0xd2e(%rip),%xmm0
mulss  (%rax,%rcx,4),%xmm0
cvttss2si %xmm0,%r8d
mov    $0x1,%ecx
call   1030 <linear@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12a6 <row_echelon+0x176>
jmp    130d <row_echelon+0x1dd>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    114a <row_echelon+0x1a>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<row_echelon>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdi,%r14
lea    0x2c(%rdi),%r15
xor    %r12d,%r12d
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
movslq %ebx,%rdx
imul   $0x2c,%rdx,%rax
lea    (%r14,%rax,1),%r13
movss  0x0(%r13,%r12,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe92(%rip),%xmm1
ucomisd %xmm0,%xmm1
mov    $0x1,%cl
jb     11c2 <row_echelon+0x92>
movsd  0xe8a(%rip),%xmm2
ucomisd %xmm2,%xmm0
jb     11c2 <row_echelon+0x92>
add    %r15,%rax
lea    -0x5(%rbx),%ecx
xor    %esi,%esi
nopl   0x0(%rax)
cmp    %esi,%ecx
je     1310 <row_echelon+0x1e0>
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
add    $0xffffffffffffffff,%rsi
ucomisd %xmm0,%xmm1
jb     11b4 <row_echelon+0x84>
add    $0x2c,%rax
ucomisd %xmm2,%xmm0
jae    1190 <row_echelon+0x60>
sub    %rsi,%rdx
lea    -0x1(%rdx),%rax
cmp    $0x5,%rax
setl   %cl
cmp    %edx,%ebx
je     11d4 <row_echelon+0xa4>
test   %cl,%cl
je     11d4 <row_echelon+0xa4>
mov    %r14,%rdi
mov    %ebx,%esi
call   1050 <exchange@plt>
movss  0xe34(%rip),%xmm0
divss  0x0(%r13,%r12,4),%xmm0
cvttss2si %xmm0,%edx
mov    %r14,%rdi
mov    %ebx,%esi
call   1040 <scale@plt>
movl   $0x3f800000,0x0(%r13,%r12,4)
80 3f
test   %ebx,%ebx
je     1226 <row_echelon+0xf6>
movss  (%r14,%r12,4),%xmm0
xorps  0xe15(%rip),%xmm0
cvttss2si %xmm0,%r8d
mov    %r14,%rdi
xor    %esi,%esi
mov    %ebx,%edx
mov    $0x1,%ecx
call   1030 <linear@plt>
cmp    $0x1,%ebx
je     1252 <row_echelon+0x122>
movss  0x2c(%r14,%r12,4),%xmm0
xorps  0xdec(%rip),%xmm0
cvttss2si %xmm0,%r8d
mov    %r14,%rdi
mov    $0x1,%esi
mov    %ebx,%edx
mov    $0x1,%ecx
call   1030 <linear@plt>
cmp    $0x2,%ebx
je     127e <row_echelon+0x14e>
movss  0x58(%r14,%r12,4),%xmm0
xorps  0xdc0(%rip),%xmm0
cvttss2si %xmm0,%r8d
mov    %r14,%rdi
mov    $0x2,%esi
mov    %ebx,%edx
mov    $0x1,%ecx
call   1030 <linear@plt>
cmp    $0x3,%ebx
je     12ad <row_echelon+0x17d>
movss  0x84(%r14,%r12,4),%xmm0
xorps  0xd91(%rip),%xmm0
cvttss2si %xmm0,%r8d
mov    %r14,%rdi
mov    $0x3,%esi
mov    %ebx,%edx
mov    $0x1,%ecx
call   1030 <linear@plt>
cmp    $0x4,%ebx
je     12dc <row_echelon+0x1ac>
movss  0xb0(%r14,%r12,4),%xmm0
xorps  0xd62(%rip),%xmm0
cvttss2si %xmm0,%r8d
mov    %r14,%rdi
mov    $0x4,%esi
mov    %ebx,%edx
mov    $0x1,%ecx
call   1030 <linear@plt>
cmp    $0x5,%ebx
je     1331 <row_echelon+0x201>
movss  0xdc(%r14,%r12,4),%xmm0
xorps  0xd33(%rip),%xmm0
cvttss2si %xmm0,%r8d
mov    %r14,%rdi
mov    $0x5,%esi
mov    %ebx,%edx
mov    $0x1,%ecx
call   1030 <linear@plt>
cmp    $0x4,%ebx
jle    1318 <row_echelon+0x1e8>
jmp    1331 <row_echelon+0x201>
nopl   (%rax)
add    $0xffffffff,%ebx
cmp    $0x4,%ebx
jg     1331 <row_echelon+0x201>
add    $0x1,%ebx
lea    0x1(%r12),%rax
add    $0x4,%r15
cmp    $0x9,%r12
mov    %rax,%r12
jb     1150 <row_echelon+0x20>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @row_echelon([11 x float]* %0) {
%2 = alloca [11 x float]*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store [11 x float]* %0, [11 x float]** %2
store i32 0, i32* %3
store i32 0, i32* %4
br label %6
6: ; preds = %118, %1
%7 = load i32, i32* %3
%8 = icmp slt i32 %7, 6
br i1 %8, label %9, label %12
9: ; preds = %6
%10 = load i32, i32* %4
%11 = icmp slt i32 %10, 10
br label %12
12: ; preds = %9, %6
%13 = phi i1 [ false, %6 ], [ %11, %9 ]
br i1 %13, label %14, label %123
14: ; preds = %12
%15 = load i32, i32* %3
store i32 %15, i32* %5
br label %16
16: ; preds = %46, %14
%17 = load i32, i32* %5
%18 = icmp slt i32 %17, 6
br i1 %18, label %19, label %43
19: ; preds = %16
%20 = load [11 x float]*, [11 x float]** %2
%21 = load i32, i32* %5
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [11 x float], [11 x float]* %20, i64 %22
%24 = load i32, i32* %4
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [11 x float], [11 x float]* %23, i64 0, i64 %25
%27 = load float, float* %26
%28 = fpext float %27 to double
%29 = fcmp ole double %28, 1.000000e-05
br i1 %29, label %30, label %41
30: ; preds = %19
%31 = load [11 x float]*, [11 x float]** %2
%32 = load i32, i32* %5
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [11 x float], [11 x float]* %31, i64 %33
%35 = load i32, i32* %4
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds [11 x float], [11 x float]* %34, i64 0, i64 %36
%38 = load float, float* %37
%39 = fpext float %38 to double
%40 = fcmp oge double %39, -1.000000e-05
br label %41
41: ; preds = %30, %19
%42 = phi i1 [ false, %19 ], [ %40, %30 ]
br label %43
43: ; preds = %41, %16
%44 = phi i1 [ false, %16 ], [ %42, %41 ]
br i1 %44, label %45, label %49
45: ; preds = %43
br label %46
46: ; preds = %45
%47 = load i32, i32* %5
%48 = add nsw i32 %47, 1
store i32 %48, i32* %5
br label %16
49: ; preds = %43
%50 = load i32, i32* %5
%51 = load i32, i32* %3
%52 = icmp ne i32 %50, %51
br i1 %52, label %53, label %62
53: ; preds = %49
%54 = load i32, i32* %5
%55 = icmp slt i32 %54, 6
br i1 %55, label %56, label %62
56: ; preds = %53
%57 = load [11 x float]*, [11 x float]** %2
%58 = bitcast [11 x float]* %57 to float**
%59 = load i32, i32* %3
%60 = load i32, i32* %5
%61 = call i32 @exchange(float** %58, i32 %59, i32 %60)
br label %62
62: ; preds = %56, %53, %49
%63 = load i32, i32* %5
%64 = icmp eq i32 %63, 6
br i1 %64, label %65, label %68
65: ; preds = %62
%66 = load i32, i32* %3
%67 = add nsw i32 %66, -1
store i32 %67, i32* %3
br label %118
68: ; preds = %62
%69 = load [11 x float]*, [11 x float]** %2
%70 = bitcast [11 x float]* %69 to float**
%71 = load i32, i32* %3
%72 = load [11 x float]*, [11 x float]** %2
%73 = load i32, i32* %3
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds [11 x float], [11 x float]* %72, i64 %74
%76 = load i32, i32* %4
%77 = sext i32 %76 to i64
%78 = getelementptr inbounds [11 x float], [11 x float]* %75, i64 0, i64 %77
%79 = load float, float* %78
%80 = fdiv float 1.000000e+00, %79
%81 = fptosi float %80 to i32
%82 = call i32 @scale(float** %70, i32 %71, i32 %81)
%83 = load [11 x float]*, [11 x float]** %2
%84 = load i32, i32* %3
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds [11 x float], [11 x float]* %83, i64 %85
%87 = load i32, i32* %4
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [11 x float], [11 x float]* %86, i64 0, i64 %88
store float 1.000000e+00, float* %89
store i32 0, i32* %5
br label %90
90: ; preds = %114, %68
%91 = load i32, i32* %5
%92 = icmp slt i32 %91, 6
br i1 %92, label %93, label %117
93: ; preds = %90
%94 = load i32, i32* %5
%95 = load i32, i32* %3
%96 = icmp eq i32 %94, %95
br i1 %96, label %97, label %98
97: ; preds = %93
br label %114
98: ; preds = %93
%99 = load [11 x float]*, [11 x float]** %2
%100 = bitcast [11 x float]* %99 to float**
%101 = load i32, i32* %5
%102 = load i32, i32* %3
%103 = load [11 x float]*, [11 x float]** %2
%104 = load i32, i32* %5
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds [11 x float], [11 x float]* %103, i64 %105
%107 = load i32, i32* %4
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds [11 x float], [11 x float]* %106, i64 0, i64 %108
%110 = load float, float* %109
%111 = fmul float -1.000000e+00, %110
%112 = fptosi float %111 to i32
%113 = call i32 @linear(float** %100, i32 %101, i32 %102, i32 1, i32 %112)
br label %114
114: ; preds = %98, %97
%115 = load i32, i32* %5
%116 = add nsw i32 %115, 1
store i32 %116, i32* %5
br label %90
117: ; preds = %90
br label %118
118: ; preds = %117, %65
%119 = load i32, i32* %3
%120 = add nsw i32 %119, 1
store i32 %120, i32* %3
%121 = load i32, i32* %4
%122 = add nsw i32 %121, 1
store i32 %122, i32* %4
br label %6
123: ; preds = %12
ret void
}

LLVM IR (-O2):
define void @row_echelon([11 x float]* %0) {
%2 = bitcast [11 x float]* %0 to float**
br label %3
3: ; preds = %85, %1
%4 = phi i64 [ 0, %1 ], [ %88, %85 ]
%5 = phi i32 [ 0, %1 ], [ %87, %85 ]
%6 = sext i32 %5 to i64
%7 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 %6, i64 %4
%8 = load float, float* %7
%9 = fpext float %8 to double
%10 = fcmp ugt double %9, 1.000000e-05
%11 = fcmp ult double %9, -1.000000e-05
%12 = or i1 %10, %11
br i1 %12, label %27, label %20
13: ; preds = %20
%14 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 %22, i64 %4
%15 = load float, float* %14
%16 = fpext float %15 to double
%17 = fcmp ugt double %16, 1.000000e-05
%18 = fcmp ult double %16, -1.000000e-05
%19 = or i1 %17, %18
br i1 %19, label %25, label %20
20: ; preds = %3, %13
%21 = phi i64 [ %22, %13 ], [ %6, %3 ]
%22 = add nsw i64 %21, 1
%23 = trunc i64 %22 to i32
%24 = icmp eq i32 %23, 6
br i1 %24, label %35, label %13
25: ; preds = %13
%26 = icmp slt i64 %21, 5
br label %27
27: ; preds = %25, %3
%28 = phi i64 [ %22, %25 ], [ %6, %3 ]
%29 = phi i1 [ %26, %25 ], [ true, %3 ]
%30 = trunc i64 %28 to i32
%31 = icmp ne i32 %5, %30
%32 = and i1 %31, %29
br i1 %32, label %33, label %37
33: ; preds = %27
%34 = tail call i32 @exchange(float** %2, i32 %5, i32 %30)
br label %37
35: ; preds = %20
%36 = add nsw i32 %5, -1
br label %85
37: ; preds = %27, %33
%38 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 %6, i64 %4
%39 = load float, float* %38
%40 = fdiv float 1.000000e+00, %39
%41 = fptosi float %40 to i32
%42 = tail call i32 @scale(float** %2, i32 %5, i32 %41)
store float 1.000000e+00, float* %38
%43 = icmp eq i32 %5, 0
br i1 %43, label %51, label %44
44: ; preds = %37
%45 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 0, i64 %4
%46 = load float, float* %45
%47 = fneg float %46
%48 = fptosi float %47 to i32
%49 = tail call i32 @linear(float** %2, i32 0, i32 %5, i32 1, i32 %48)
%50 = icmp eq i32 %5, 1
br i1 %50, label %58, label %51
51: ; preds = %37, %44
%52 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 1, i64 %4
%53 = load float, float* %52
%54 = fneg float %53
%55 = fptosi float %54 to i32
%56 = tail call i32 @linear(float** %2, i32 1, i32 %5, i32 1, i32 %55)
%57 = icmp eq i32 %5, 2
br i1 %57, label %65, label %58
58: ; preds = %44, %51
%59 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 2, i64 %4
%60 = load float, float* %59
%61 = fneg float %60
%62 = fptosi float %61 to i32
%63 = tail call i32 @linear(float** %2, i32 2, i32 %5, i32 1, i32 %62)
%64 = icmp eq i32 %5, 3
br i1 %64, label %72, label %65
65: ; preds = %51, %58
%66 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 3, i64 %4
%67 = load float, float* %66
%68 = fneg float %67
%69 = fptosi float %68 to i32
%70 = tail call i32 @linear(float** %2, i32 3, i32 %5, i32 1, i32 %69)
%71 = icmp eq i32 %5, 4
br i1 %71, label %79, label %72
72: ; preds = %58, %65
%73 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 4, i64 %4
%74 = load float, float* %73
%75 = fneg float %74
%76 = fptosi float %75 to i32
%77 = tail call i32 @linear(float** %2, i32 4, i32 %5, i32 1, i32 %76)
%78 = icmp eq i32 %5, 5
br i1 %78, label %92, label %79
79: ; preds = %65, %72
%80 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 5, i64 %4
%81 = load float, float* %80
%82 = fneg float %81
%83 = fptosi float %82 to i32
%84 = tail call i32 @linear(float** %2, i32 5, i32 %5, i32 1, i32 %83)
br label %85
85: ; preds = %79, %35
%86 = phi i32 [ %36, %35 ], [ %5, %79 ]
%87 = add nsw i32 %86, 1
%88 = add nuw nsw i64 %4, 1
%89 = icmp slt i32 %86, 5
%90 = icmp ult i64 %4, 9
%91 = select i1 %89, i1 %90, i1 false
br i1 %91, label %3, label %92
92: ; preds = %72, %85
ret void
}