#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 */
float _nonz_max(float, float);
float _nonz_min(float, float);
void _merge_bars(float bar[16], float newbar[16]) {
  if (bar[0] == 0.f)
    bar[0] = newbar[0];
  if (bar[1] == 0.f)
    bar[1] = newbar[1];
  bar[2] = _nonz_min(bar[2], newbar[2]);
  bar[4] = _nonz_max(bar[4], newbar[4]);
  bar[8] = _nonz_max(bar[8], newbar[8]);
  bar[10] = _nonz_max(bar[10], newbar[10]);
  bar[11] = _nonz_min(bar[11], newbar[11]);
  bar[9] = _nonz_min(bar[9], newbar[9]);
  bar[5] = _nonz_min(bar[5], newbar[5]);
  bar[3] = _nonz_max(bar[3], newbar[3]);
  if (newbar[6] != 0.f)
    bar[6] = newbar[6];
  if (newbar[7] != 0.f)
    bar[7] = newbar[7];
}


x86 assembly (clang, -O0):
<_merge_bars>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    115a <_merge_bars+0x3a>
jp     115a <_merge_bars+0x3a>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1187 <_merge_bars+0x67>
jp     1187 <_merge_bars+0x67>
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
call   1040 <_nonz_min@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x10(%rax),%xmm1
call   1030 <_nonz_max@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movss  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x20(%rax),%xmm1
call   1030 <_nonz_max@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x20(%rax)
mov    -0x8(%rbp),%rax
movss  0x28(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x28(%rax),%xmm1
call   1030 <_nonz_max@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movss  0x2c(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x2c(%rax),%xmm1
call   1040 <_nonz_min@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x2c(%rax)
mov    -0x8(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x24(%rax),%xmm1
call   1040 <_nonz_min@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x24(%rax)
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0x14(%rax),%xmm1
call   1040 <_nonz_min@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0x14(%rax)
mov    -0x8(%rbp),%rax
movss  0xc(%rax),%xmm0
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm1
call   1030 <_nonz_max@plt>
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    12a7 <_merge_bars+0x187>
jp     12a7 <_merge_bars+0x187>
jmp    12b9 <_merge_bars+0x199>
mov    -0x10(%rbp),%rax
movss  0x18(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x18(%rax)
mov    -0x10(%rbp),%rax
movss  0x1c(%rax),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    12d9 <_merge_bars+0x1b9>
jp     12d9 <_merge_bars+0x1b9>
jmp    12eb <_merge_bars+0x1cb>
mov    -0x10(%rbp),%rax
movss  0x1c(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x1c(%rax)
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_merge_bars>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
movss  (%rdi),%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jne    1141 <_merge_bars+0x21>
jp     1141 <_merge_bars+0x21>
movss  (%r14),%xmm1
movss  %xmm1,(%rbx)
movss  0x4(%rbx),%xmm1
ucomiss %xmm0,%xmm1
jne    1158 <_merge_bars+0x38>
jp     1158 <_merge_bars+0x38>
movss  0x4(%r14),%xmm0
movss  %xmm0,0x4(%rbx)
movss  0x8(%rbx),%xmm0
movss  0x8(%r14),%xmm1
call   1040 <_nonz_min@plt>
movss  %xmm0,0x8(%rbx)
movss  0x10(%rbx),%xmm0
movss  0x10(%r14),%xmm1
call   1030 <_nonz_max@plt>
movss  %xmm0,0x10(%rbx)
movss  0x20(%rbx),%xmm0
movss  0x20(%r14),%xmm1
call   1030 <_nonz_max@plt>
movss  %xmm0,0x20(%rbx)
movss  0x28(%rbx),%xmm0
movss  0x28(%r14),%xmm1
call   1030 <_nonz_max@plt>
movss  %xmm0,0x28(%rbx)
movss  0x2c(%rbx),%xmm0
movss  0x2c(%r14),%xmm1
call   1040 <_nonz_min@plt>
movss  %xmm0,0x2c(%rbx)
movss  0x24(%rbx),%xmm0
movss  0x24(%r14),%xmm1
call   1040 <_nonz_min@plt>
movss  %xmm0,0x24(%rbx)
movss  0x14(%rbx),%xmm0
movss  0x14(%r14),%xmm1
call   1040 <_nonz_min@plt>
movss  %xmm0,0x14(%rbx)
movss  0xc(%rbx),%xmm0
movss  0xc(%r14),%xmm1
call   1030 <_nonz_max@plt>
movss  %xmm0,0xc(%rbx)
movss  0x18(%r14),%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jne    1210 <_merge_bars+0xf0>
jnp    1215 <_merge_bars+0xf5>
movss  %xmm1,0x18(%rbx)
movss  0x1c(%r14),%xmm1
ucomiss %xmm0,%xmm1
jne    1222 <_merge_bars+0x102>
jnp    1227 <_merge_bars+0x107>
movss  %xmm1,0x1c(%rbx)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @_merge_bars(float* nocapture %0, float* nocapture %1) {
%3 = load float, float* %0
%4 = fcmp oeq float %3, 0.000000e+00
br i1 %4, label %5, label %7
5: ; preds = %2
%6 = load float, float* %1
store float %6, float* %0
br label %7
7: ; preds = %5, %2
%8 = getelementptr inbounds float, float* %0, i64 1
%9 = load float, float* %8
%10 = fcmp oeq float %9, 0.000000e+00
br i1 %10, label %11, label %14
11: ; preds = %7
%12 = getelementptr inbounds float, float* %1, i64 1
%13 = load float, float* %12
store float %13, float* %8
br label %14
14: ; preds = %11, %7
%15 = getelementptr inbounds float, float* %0, i64 2
%16 = load float, float* %15
%17 = getelementptr inbounds float, float* %1, i64 2
%18 = load float, float* %17
%19 = tail call float @_nonz_min(float %16, float %18)
store float %19, float* %15
%20 = getelementptr inbounds float, float* %0, i64 4
%21 = load float, float* %20
%22 = getelementptr inbounds float, float* %1, i64 4
%23 = load float, float* %22
%24 = tail call float @_nonz_max(float %21, float %23)
store float %24, float* %20
%25 = getelementptr inbounds float, float* %0, i64 8
%26 = load float, float* %25
%27 = getelementptr inbounds float, float* %1, i64 8
%28 = load float, float* %27
%29 = tail call float @_nonz_max(float %26, float %28)
store float %29, float* %25
%30 = getelementptr inbounds float, float* %0, i64 10
%31 = load float, float* %30
%32 = getelementptr inbounds float, float* %1, i64 10
%33 = load float, float* %32
%34 = tail call float @_nonz_max(float %31, float %33)
store float %34, float* %30
%35 = getelementptr inbounds float, float* %0, i64 11
%36 = load float, float* %35
%37 = getelementptr inbounds float, float* %1, i64 11
%38 = load float, float* %37
%39 = tail call float @_nonz_min(float %36, float %38)
store float %39, float* %35
%40 = getelementptr inbounds float, float* %0, i64 9
%41 = load float, float* %40
%42 = getelementptr inbounds float, float* %1, i64 9
%43 = load float, float* %42
%44 = tail call float @_nonz_min(float %41, float %43)
store float %44, float* %40
%45 = getelementptr inbounds float, float* %0, i64 5
%46 = load float, float* %45
%47 = getelementptr inbounds float, float* %1, i64 5
%48 = load float, float* %47
%49 = tail call float @_nonz_min(float %46, float %48)
store float %49, float* %45
%50 = getelementptr inbounds float, float* %0, i64 3
%51 = load float, float* %50
%52 = getelementptr inbounds float, float* %1, i64 3
%53 = load float, float* %52
%54 = tail call float @_nonz_max(float %51, float %53)
store float %54, float* %50
%55 = getelementptr inbounds float, float* %1, i64 6
%56 = load float, float* %55
%57 = fcmp une float %56, 0.000000e+00
br i1 %57, label %58, label %60
58: ; preds = %14
%59 = getelementptr inbounds float, float* %0, i64 6
store float %56, float* %59
br label %60
60: ; preds = %58, %14
%61 = getelementptr inbounds float, float* %1, i64 7
%62 = load float, float* %61
%63 = fcmp une float %62, 0.000000e+00
br i1 %63, label %64, label %66
64: ; preds = %60
%65 = getelementptr inbounds float, float* %0, i64 7
store float %62, float* %65
br label %66
66: ; preds = %64, %60
ret void
}