#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 fabs(double);
int testXMat(double x[]) {
  int it = 0, i, j;
  double t;
  for (i = 0, t = 0; i < 4; i++)
    for (j = 0; j < 4; j++) {
      if (x[i * 4 + j] < 0 || x[i * 4 + j] > 1)
        it = -1;
      t += x[i * 4 + j];
    }
  if (fabs(t - 1) > 1e-4)
    it = -1;
  return (it);
}


x86 assembly (clang, -O0):
<testXMat>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
cmpl   $0x4,-0x10(%rbp)
jge    11d9 <testXMat+0xc9>
movl   $0x0,-0x14(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    11c6 <testXMat+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x2,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
xorps  %xmm0,%xmm0
ucomisd (%rax,%rcx,8),%xmm0
ja     1192 <testXMat+0x82>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x2,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xe80(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1199 <testXMat+0x89>
movl   $0xffffffff,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x2,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1143 <testXMat+0x33>
jmp    11cb <testXMat+0xbb>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1132 <testXMat+0x22>
movsd  -0x20(%rbp),%xmm0
movsd  0xe22(%rip),%xmm1
subsd  %xmm1,%xmm0
call   1030 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xe05(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    120c <testXMat+0xfc>
movl   $0xffffffff,-0xc(%rbp)
mov    -0xc(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<testXMat>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
movsd  (%rdi),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
movsd  0x8(%rdi),%xmm3
seta   %al
movsd  0xec6(%rip),%xmm2
ucomisd %xmm2,%xmm0
seta   %cl
or     %al,%cl
mov    %cl,0x17(%rsp)
addsd  %xmm1,%xmm0
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %cl
or     %al,%cl
mov    %cl,0x16(%rsp)
movsd  0x10(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
seta   %cl
addsd  %xmm3,%xmm0
or     %al,%cl
mov    %cl,0x15(%rsp)
addsd  %xmm4,%xmm0
movsd  0x18(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %cl
or     %al,%cl
mov    %cl,0x14(%rsp)
movsd  0x20(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
addsd  %xmm3,%xmm0
seta   %cl
or     %al,%cl
mov    %cl,0x13(%rsp)
addsd  %xmm4,%xmm0
movsd  0x28(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %cl
or     %al,%cl
mov    %cl,0x12(%rsp)
movsd  0x30(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
seta   %cl
addsd  %xmm3,%xmm0
or     %al,%cl
mov    %cl,0x11(%rsp)
addsd  %xmm4,%xmm0
movsd  0x38(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %cl
or     %al,%cl
mov    %cl,0x10(%rsp)
movsd  0x40(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
addsd  %xmm3,%xmm0
seta   %cl
or     %al,%cl
mov    %cl,0xf(%rsp)
addsd  %xmm4,%xmm0
movsd  0x48(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %cl
or     %al,%cl
mov    %cl,0xe(%rsp)
movsd  0x50(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
seta   %r13b
addsd  %xmm3,%xmm0
or     %al,%r13b
addsd  %xmm4,%xmm0
movsd  0x58(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %bl
or     %al,%bl
movsd  0x60(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
addsd  %xmm3,%xmm0
seta   %bpl
or     %al,%bpl
addsd  %xmm4,%xmm0
movsd  0x68(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %r15b
or     %al,%r15b
movsd  0x70(%rdi),%xmm4
ucomisd %xmm4,%xmm1
seta   %al
ucomisd %xmm2,%xmm4
seta   %r12b
addsd  %xmm3,%xmm0
or     %al,%r12b
addsd  %xmm4,%xmm0
movsd  0x78(%rdi),%xmm3
ucomisd %xmm3,%xmm1
seta   %al
ucomisd %xmm2,%xmm3
seta   %r14b
or     %al,%r14b
addsd  %xmm3,%xmm0
addsd  0xd15(%rip),%xmm0
call   1030 <fabs@plt>
test   %eax,%eax
setg   %al
or     %r12b,%r14b
or     %r15b,%r14b
or     %bpl,%r14b
or     %bl,%r14b
or     %r13b,%r14b
or     0xe(%rsp),%r14b
or     0xf(%rsp),%r14b
or     0x10(%rsp),%r14b
or     0x11(%rsp),%r14b
or     0x12(%rsp),%r14b
or     0x13(%rsp),%r14b
or     0x14(%rsp),%r14b
or     0x15(%rsp),%r14b
or     0x16(%rsp),%r14b
or     0x17(%rsp),%r14b
or     %al,%r14b
movzbl %r14b,%eax
and    $0x1,%eax
neg    %eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @testXMat(double* %0) {
%2 = alloca double*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca double
store double* %0, double** %2
store i32 0, i32* %3
store i32 0, i32* %4
store double 0.000000e+00, double* %6
br label %7
7: ; preds = %50, %1
%8 = load i32, i32* %4
%9 = icmp slt i32 %8, 4
br i1 %9, label %10, label %53
10: ; preds = %7
store i32 0, i32* %5
br label %11
11: ; preds = %46, %10
%12 = load i32, i32* %5
%13 = icmp slt i32 %12, 4
br i1 %13, label %14, label %49
14: ; preds = %11
%15 = load double*, double** %2
%16 = load i32, i32* %4
%17 = mul nsw i32 %16, 4
%18 = load i32, i32* %5
%19 = add nsw i32 %17, %18
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds double, double* %15, i64 %20
%22 = load double, double* %21
%23 = fcmp olt double %22, 0.000000e+00
br i1 %23, label %34, label %24
24: ; preds = %14
%25 = load double*, double** %2
%26 = load i32, i32* %4
%27 = mul nsw i32 %26, 4
%28 = load i32, i32* %5
%29 = add nsw i32 %27, %28
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds double, double* %25, i64 %30
%32 = load double, double* %31
%33 = fcmp ogt double %32, 1.000000e+00
br i1 %33, label %34, label %35
34: ; preds = %24, %14
store i32 -1, i32* %3
br label %35
35: ; preds = %34, %24
%36 = load double*, double** %2
%37 = load i32, i32* %4
%38 = mul nsw i32 %37, 4
%39 = load i32, i32* %5
%40 = add nsw i32 %38, %39
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds double, double* %36, i64 %41
%43 = load double, double* %42
%44 = load double, double* %6
%45 = fadd double %44, %43
store double %45, double* %6
br label %46
46: ; preds = %35
%47 = load i32, i32* %5
%48 = add nsw i32 %47, 1
store i32 %48, i32* %5
br label %11
49: ; preds = %11
br label %50
50: ; preds = %49
%51 = load i32, i32* %4
%52 = add nsw i32 %51, 1
store i32 %52, i32* %4
br label %7
53: ; preds = %7
%54 = load double, double* %6
%55 = fsub double %54, 1.000000e+00
%56 = call i32 @fabs(double %55)
%57 = sitofp i32 %56 to double
%58 = fcmp ogt double %57, 1.000000e-04
br i1 %58, label %59, label %60
59: ; preds = %53
store i32 -1, i32* %3
br label %60
60: ; preds = %59, %53
%61 = load i32, i32* %3
ret i32 %61
}

LLVM IR (-O2):
define i32 @testXMat(double* nocapture %0) {
%2 = load double, double* %0
%3 = fcmp olt double %2, 0.000000e+00
%4 = fcmp ogt double %2, 1.000000e+00
%5 = or i1 %3, %4
%6 = fadd double %2, 0.000000e+00
%7 = getelementptr inbounds double, double* %0, i64 1
%8 = load double, double* %7
%9 = fcmp olt double %8, 0.000000e+00
%10 = fcmp ogt double %8, 1.000000e+00
%11 = or i1 %9, %10
%12 = fadd double %6, %8
%13 = getelementptr inbounds double, double* %0, i64 2
%14 = load double, double* %13
%15 = fcmp olt double %14, 0.000000e+00
%16 = fcmp ogt double %14, 1.000000e+00
%17 = or i1 %15, %16
%18 = fadd double %12, %14
%19 = getelementptr inbounds double, double* %0, i64 3
%20 = load double, double* %19
%21 = fcmp olt double %20, 0.000000e+00
%22 = fcmp ogt double %20, 1.000000e+00
%23 = or i1 %21, %22
%24 = fadd double %18, %20
%25 = getelementptr inbounds double, double* %0, i64 4
%26 = load double, double* %25
%27 = fcmp olt double %26, 0.000000e+00
%28 = fcmp ogt double %26, 1.000000e+00
%29 = or i1 %27, %28
%30 = fadd double %24, %26
%31 = getelementptr inbounds double, double* %0, i64 5
%32 = load double, double* %31
%33 = fcmp olt double %32, 0.000000e+00
%34 = fcmp ogt double %32, 1.000000e+00
%35 = or i1 %33, %34
%36 = fadd double %30, %32
%37 = getelementptr inbounds double, double* %0, i64 6
%38 = load double, double* %37
%39 = fcmp olt double %38, 0.000000e+00
%40 = fcmp ogt double %38, 1.000000e+00
%41 = or i1 %39, %40
%42 = fadd double %36, %38
%43 = getelementptr inbounds double, double* %0, i64 7
%44 = load double, double* %43
%45 = fcmp olt double %44, 0.000000e+00
%46 = fcmp ogt double %44, 1.000000e+00
%47 = or i1 %45, %46
%48 = fadd double %42, %44
%49 = getelementptr inbounds double, double* %0, i64 8
%50 = load double, double* %49
%51 = fcmp olt double %50, 0.000000e+00
%52 = fcmp ogt double %50, 1.000000e+00
%53 = or i1 %51, %52
%54 = fadd double %48, %50
%55 = getelementptr inbounds double, double* %0, i64 9
%56 = load double, double* %55
%57 = fcmp olt double %56, 0.000000e+00
%58 = fcmp ogt double %56, 1.000000e+00
%59 = or i1 %57, %58
%60 = fadd double %54, %56
%61 = getelementptr inbounds double, double* %0, i64 10
%62 = load double, double* %61
%63 = fcmp olt double %62, 0.000000e+00
%64 = fcmp ogt double %62, 1.000000e+00
%65 = or i1 %63, %64
%66 = fadd double %60, %62
%67 = getelementptr inbounds double, double* %0, i64 11
%68 = load double, double* %67
%69 = fcmp olt double %68, 0.000000e+00
%70 = fcmp ogt double %68, 1.000000e+00
%71 = or i1 %69, %70
%72 = fadd double %66, %68
%73 = getelementptr inbounds double, double* %0, i64 12
%74 = load double, double* %73
%75 = fcmp olt double %74, 0.000000e+00
%76 = fcmp ogt double %74, 1.000000e+00
%77 = or i1 %75, %76
%78 = fadd double %72, %74
%79 = getelementptr inbounds double, double* %0, i64 13
%80 = load double, double* %79
%81 = fcmp olt double %80, 0.000000e+00
%82 = fcmp ogt double %80, 1.000000e+00
%83 = or i1 %81, %82
%84 = fadd double %78, %80
%85 = getelementptr inbounds double, double* %0, i64 14
%86 = load double, double* %85
%87 = fcmp olt double %86, 0.000000e+00
%88 = fcmp ogt double %86, 1.000000e+00
%89 = or i1 %87, %88
%90 = fadd double %84, %86
%91 = getelementptr inbounds double, double* %0, i64 15
%92 = load double, double* %91
%93 = fcmp olt double %92, 0.000000e+00
%94 = fcmp ogt double %92, 1.000000e+00
%95 = or i1 %93, %94
%96 = fadd double %90, %92
%97 = fadd double %96, -1.000000e+00
%98 = tail call i32 @fabs(double %97)
%99 = icmp sgt i32 %98, 0
%100 = select i1 %99, i1 true, i1 %95
%101 = select i1 %100, i1 true, i1 %89
%102 = select i1 %101, i1 true, i1 %83
%103 = select i1 %102, i1 true, i1 %77
%104 = select i1 %103, i1 true, i1 %71
%105 = select i1 %104, i1 true, i1 %65
%106 = select i1 %105, i1 true, i1 %59
%107 = select i1 %106, i1 true, i1 %53
%108 = select i1 %107, i1 true, i1 %47
%109 = select i1 %108, i1 true, i1 %41
%110 = select i1 %109, i1 true, i1 %35
%111 = select i1 %110, i1 true, i1 %29
%112 = select i1 %111, i1 true, i1 %23
%113 = select i1 %112, i1 true, i1 %17
%114 = select i1 %113, i1 true, i1 %11
%115 = select i1 %114, i1 true, i1 %5
%116 = sext i1 %115 to i32
ret i32 %116
}