int min_max_array_all_defined(float *data, unsigned int n, float *min,
                              float *max) {
  float mx, mn, min_val, max_val;
  unsigned int i;
  if (n == 0) {
    *min = *max = 0.0;
    return 1;
  }
  min_val = max_val = data[0];
#pragma omp parallel private(mn, mx, i)
  {
    mn = mx = data[0];
#pragma omp for nowait
    for (i = 1; i < n; i++) {
      mn = (mn > data[i]) ? data[i] : mn;
      mx = (mx < data[i]) ? data[i] : mx;
    }
#pragma omp critical
    {
      if (min_val > mn)
        min_val = mn;
      if (max_val < mx)
        max_val = mx;
    }
  }
  *min = min_val;
  *max = max_val;
  return 0;
}


x86 assembly (clang, -O0):
<min_max_array_all_defined>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    113f <min_max_array_all_defined+0x3f>
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    125f <min_max_array_all_defined+0x15f>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  %xmm0,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  %xmm0,-0x30(%rbp)
movl   $0x1,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jae    1208 <min_max_array_all_defined+0x108>
movss  -0x30(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
ucomiss (%rax,%rcx,4),%xmm0
jbe    11a2 <min_max_array_all_defined+0xa2>
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x40(%rbp)
jmp    11ac <min_max_array_all_defined+0xac>
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x2c(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jbe    11e6 <min_max_array_all_defined+0xe6>
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x44(%rbp)
jmp    11f0 <min_max_array_all_defined+0xf0>
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    116a <min_max_array_all_defined+0x6a>
movss  -0x34(%rbp),%xmm0
ucomiss -0x30(%rbp),%xmm0
jbe    1221 <min_max_array_all_defined+0x121>
movss  -0x30(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x38(%rbp),%xmm1
movss  -0x2c(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    123e <min_max_array_all_defined+0x13e>
movss  -0x2c(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x34(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<min_max_array_all_defined>:
test   %esi,%esi
je     113b <min_max_array_all_defined+0x3b>
movss  (%rdi),%xmm0
movaps %xmm0,%xmm3
movaps %xmm0,%xmm4
cmp    $0x1,%esi
je     11ef <min_max_array_all_defined+0xef>
mov    %esi,%esi
lea    -0x1(%rsi),%rax
add    $0xfffffffffffffffe,%rsi
mov    %eax,%r8d
and    $0x3,%r8d
cmp    $0x3,%rsi
jae    114d <min_max_array_all_defined+0x4d>
mov    $0x1,%esi
movaps %xmm0,%xmm2
movaps %xmm0,%xmm1
jmp    11b1 <min_max_array_all_defined+0xb1>
movl   $0x0,(%rcx)
movl   $0x0,(%rdx)
mov    $0x1,%eax
ret
and    $0xfffffffffffffffc,%rax
xor    %esi,%esi
movaps %xmm0,%xmm2
movaps %xmm0,%xmm1
nopl   0x0(%rax)
movss  0x4(%rdi,%rsi,4),%xmm3
movss  0x8(%rdi,%rsi,4),%xmm4
movaps %xmm3,%xmm5
minss  %xmm2,%xmm5
maxss  %xmm1,%xmm3
movaps %xmm4,%xmm1
minss  %xmm5,%xmm1
maxss  %xmm3,%xmm4
movss  0xc(%rdi,%rsi,4),%xmm3
movaps %xmm3,%xmm5
minss  %xmm1,%xmm5
maxss  %xmm4,%xmm3
movss  0x10(%rdi,%rsi,4),%xmm1
movaps %xmm1,%xmm2
minss  %xmm5,%xmm2
maxss  %xmm3,%xmm1
add    $0x4,%rsi
cmp    %rsi,%rax
jne    1160 <min_max_array_all_defined+0x60>
add    $0x1,%rsi
movaps %xmm1,%xmm3
movaps %xmm2,%xmm4
test   %r8,%r8
je     11ef <min_max_array_all_defined+0xef>
lea    (%rdi,%rsi,4),%rax
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  (%rax,%rsi,4),%xmm3
movaps %xmm3,%xmm4
minss  %xmm2,%xmm4
maxss  %xmm1,%xmm3
add    $0x1,%rsi
movaps %xmm4,%xmm2
movaps %xmm3,%xmm1
cmp    %rsi,%r8
jne    11d0 <min_max_array_all_defined+0xd0>
minss  %xmm0,%xmm4
maxss  %xmm0,%xmm3
movss  %xmm4,(%rdx)
movss  %xmm3,(%rcx)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @min_max_array_all_defined(float* %0, i32 %1, float* %2, float* %3) {
%5 = alloca i32
%6 = alloca float*
%7 = alloca i32
%8 = alloca float*
%9 = alloca float*
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca i32
store float* %0, float** %6
store i32 %1, i32* %7
store float* %2, float** %8
store float* %3, float** %9
%15 = load i32, i32* %7
%16 = icmp eq i32 %15, 0
br i1 %16, label %17, label %20
17: ; preds = %4
%18 = load float*, float** %9
store float 0.000000e+00, float* %18
%19 = load float*, float** %8
store float 0.000000e+00, float* %19
store i32 1, i32* %5
br label %86
20: ; preds = %4
%21 = load float*, float** %6
%22 = getelementptr inbounds float, float* %21, i64 0
%23 = load float, float* %22
store float %23, float* %13
store float %23, float* %12
%24 = load float*, float** %6
%25 = getelementptr inbounds float, float* %24, i64 0
%26 = load float, float* %25
store float %26, float* %10
store float %26, float* %11
store i32 1, i32* %14
br label %27
27: ; preds = %66, %20
%28 = load i32, i32* %14
%29 = load i32, i32* %7
%30 = icmp ult i32 %28, %29
br i1 %30, label %31, label %69
31: ; preds = %27
%32 = load float, float* %11
%33 = load float*, float** %6
%34 = load i32, i32* %14
%35 = zext i32 %34 to i64
%36 = getelementptr inbounds float, float* %33, i64 %35
%37 = load float, float* %36
%38 = fcmp ogt float %32, %37
br i1 %38, label %39, label %45
39: ; preds = %31
%40 = load float*, float** %6
%41 = load i32, i32* %14
%42 = zext i32 %41 to i64
%43 = getelementptr inbounds float, float* %40, i64 %42
%44 = load float, float* %43
br label %47
45: ; preds = %31
%46 = load float, float* %11
br label %47
47: ; preds = %45, %39
%48 = phi float [ %44, %39 ], [ %46, %45 ]
store float %48, float* %11
%49 = load float, float* %10
%50 = load float*, float** %6
%51 = load i32, i32* %14
%52 = zext i32 %51 to i64
%53 = getelementptr inbounds float, float* %50, i64 %52
%54 = load float, float* %53
%55 = fcmp olt float %49, %54
br i1 %55, label %56, label %62
56: ; preds = %47
%57 = load float*, float** %6
%58 = load i32, i32* %14
%59 = zext i32 %58 to i64
%60 = getelementptr inbounds float, float* %57, i64 %59
%61 = load float, float* %60
br label %64
62: ; preds = %47
%63 = load float, float* %10
br label %64
64: ; preds = %62, %56
%65 = phi float [ %61, %56 ], [ %63, %62 ]
store float %65, float* %10
br label %66
66: ; preds = %64
%67 = load i32, i32* %14
%68 = add i32 %67, 1
store i32 %68, i32* %14
br label %27
69: ; preds = %27
%70 = load float, float* %12
%71 = load float, float* %11
%72 = fcmp ogt float %70, %71
br i1 %72, label %73, label %75
73: ; preds = %69
%74 = load float, float* %11
store float %74, float* %12
br label %75
75: ; preds = %73, %69
%76 = load float, float* %13
%77 = load float, float* %10
%78 = fcmp olt float %76, %77
br i1 %78, label %79, label %81
79: ; preds = %75
%80 = load float, float* %10
store float %80, float* %13
br label %81
81: ; preds = %79, %75
%82 = load float, float* %12
%83 = load float*, float** %8
store float %82, float* %83
%84 = load float, float* %13
%85 = load float*, float** %9
store float %84, float* %85
store i32 0, i32* %5
br label %86
86: ; preds = %81, %17
%87 = load i32, i32* %5
ret i32 %87
}

LLVM IR (-O2):
define i32 @min_max_array_all_defined(float* nocapture %0, i32 %1, float* nocapture writeonly %2, float* nocapture writeonly %3) {
%5 = icmp eq i32 %1, 0
br i1 %5, label %6, label %7
6: ; preds = %4
store float 0.000000e+00, float* %3
store float 0.000000e+00, float* %2
br label %81
7: ; preds = %4
%8 = load float, float* %0
%9 = icmp eq i32 %1, 1
br i1 %9, label %74, label %10
10: ; preds = %7
%11 = zext i32 %1 to i64
%12 = add nsw i64 %11, -1
%13 = add nsw i64 %11, -2
%14 = and i64 %12, 3
%15 = icmp ult i64 %13, 3
br i1 %15, label %53, label %16
16: ; preds = %10
%17 = and i64 %12, -4
br label %18
18: ; preds = %18, %16
%19 = phi i64 [ 1, %16 ], [ %50, %18 ]
%20 = phi float [ %8, %16 ], [ %47, %18 ]
%21 = phi float [ %8, %16 ], [ %49, %18 ]
%22 = phi i64 [ 0, %16 ], [ %51, %18 ]
%23 = getelementptr inbounds float, float* %0, i64 %19
%24 = load float, float* %23
%25 = fcmp ogt float %20, %24
%26 = select i1 %25, float %24, float %20
%27 = fcmp olt float %21, %24
%28 = select i1 %27, float %24, float %21
%29 = add nuw nsw i64 %19, 1
%30 = getelementptr inbounds float, float* %0, i64 %29
%31 = load float, float* %30
%32 = fcmp ogt float %26, %31
%33 = select i1 %32, float %31, float %26
%34 = fcmp olt float %28, %31
%35 = select i1 %34, float %31, float %28
%36 = add nuw nsw i64 %19, 2
%37 = getelementptr inbounds float, float* %0, i64 %36
%38 = load float, float* %37
%39 = fcmp ogt float %33, %38
%40 = select i1 %39, float %38, float %33
%41 = fcmp olt float %35, %38
%42 = select i1 %41, float %38, float %35
%43 = add nuw nsw i64 %19, 3
%44 = getelementptr inbounds float, float* %0, i64 %43
%45 = load float, float* %44
%46 = fcmp ogt float %40, %45
%47 = select i1 %46, float %45, float %40
%48 = fcmp olt float %42, %45
%49 = select i1 %48, float %45, float %42
%50 = add nuw nsw i64 %19, 4
%51 = add i64 %22, 4
%52 = icmp eq i64 %51, %17
br i1 %52, label %53, label %18
53: ; preds = %18, %10
%54 = phi float [ undef, %10 ], [ %47, %18 ]
%55 = phi float [ undef, %10 ], [ %49, %18 ]
%56 = phi i64 [ 1, %10 ], [ %50, %18 ]
%57 = phi float [ %8, %10 ], [ %47, %18 ]
%58 = phi float [ %8, %10 ], [ %49, %18 ]
%59 = icmp eq i64 %14, 0
br i1 %59, label %74, label %60
60: ; preds = %53, %60
%61 = phi i64 [ %71, %60 ], [ %56, %53 ]
%62 = phi float [ %68, %60 ], [ %57, %53 ]
%63 = phi float [ %70, %60 ], [ %58, %53 ]
%64 = phi i64 [ %72, %60 ], [ 0, %53 ]
%65 = getelementptr inbounds float, float* %0, i64 %61
%66 = load float, float* %65
%67 = fcmp ogt float %62, %66
%68 = select i1 %67, float %66, float %62
%69 = fcmp olt float %63, %66
%70 = select i1 %69, float %66, float %63
%71 = add nuw nsw i64 %61, 1
%72 = add i64 %64, 1
%73 = icmp eq i64 %72, %14
br i1 %73, label %74, label %60
74: ; preds = %53, %60, %7
%75 = phi float [ %8, %7 ], [ %55, %53 ], [ %70, %60 ]
%76 = phi float [ %8, %7 ], [ %54, %53 ], [ %68, %60 ]
%77 = fcmp ogt float %8, %76
%78 = select i1 %77, float %76, float %8
%79 = fcmp olt float %8, %75
%80 = select i1 %79, float %75, float %8
store float %78, float* %2
store float %80, float* %3
br label %81
81: ; preds = %74, %6
%82 = phi i32 [ 1, %6 ], [ 0, %74 ]
ret i32 %82
}