#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 check_price(float);
void update_bar(float bar[16], float bid, float ask) {
  if ((bid = check_price(bid)) != 0.f) {
    bar[6] = bid;
    if (bar[0] == 0.f)
      bar[4] = bar[2] = bar[0] = bid;
    else {
      if (bid > bar[4])
        bar[4] = bid;
      if (bid < bar[2])
        bar[2] = bid;
    }
  }
  if ((ask = check_price(ask)) != 0.f) {
    bar[7] = ask;
    if (bar[1] == 0.f)
      bar[3] = bar[5] = bar[1] = ask;
    else {
      if (ask > bar[3])
        bar[3] = ask;
      if (ask < bar[5])
        bar[5] = ask;
    }
  }
}


x86 assembly (clang, -O0):
<update_bar>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  %xmm1,-0x10(%rbp)
movss  -0xc(%rbp),%xmm0
call   1030 <check_price@plt>
movss  %xmm0,-0xc(%rbp)
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    114c <update_bar+0x3c>
jp     114c <update_bar+0x3c>
jmp    11e8 <update_bar+0xd8>
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x18(%rax)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1198 <update_bar+0x88>
jp     1198 <update_bar+0x88>
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movss  %xmm0,0x10(%rax)
jmp    11e3 <update_bar+0xd3>
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%rax
ucomiss 0x10(%rax),%xmm0
jbe    11b9 <update_bar+0xa9>
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x10(%rax)
movss  -0xc(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    11de <update_bar+0xce>
movss  -0xc(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
jmp    11e3 <update_bar+0xd3>
jmp    11e8 <update_bar+0xd8>
movss  -0x10(%rbp),%xmm0
call   1030 <check_price@plt>
movss  %xmm0,-0x10(%rbp)
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    120e <update_bar+0xfe>
jp     120e <update_bar+0xfe>
jmp    12ac <update_bar+0x19c>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x1c(%rax)
mov    -0x8(%rbp),%rax
movss  0x4(%rax),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    125c <update_bar+0x14c>
jp     125c <update_bar+0x14c>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  %xmm0,0x14(%rax)
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    12a7 <update_bar+0x197>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
ucomiss 0xc(%rax),%xmm0
jbe    127d <update_bar+0x16d>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  -0x10(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    12a2 <update_bar+0x192>
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x14(%rax)
jmp    12a7 <update_bar+0x197>
jmp    12ac <update_bar+0x19c>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<update_bar>:
push   %rbx
sub    $0x10,%rsp
movss  %xmm1,0xc(%rsp)
mov    %rdi,%rbx
call   1030 <check_price@plt>
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm0
jne    112d <update_bar+0x1d>
jnp    1169 <update_bar+0x59>
movss  %xmm0,0x18(%rbx)
movss  (%rbx),%xmm1
ucomiss %xmm2,%xmm1
jne    114c <update_bar+0x3c>
jp     114c <update_bar+0x3c>
movss  %xmm0,(%rbx)
movss  %xmm0,0x8(%rbx)
lea    0x10(%rbx),%rax
jmp    1165 <update_bar+0x55>
ucomiss 0x10(%rbx),%xmm0
jbe    1157 <update_bar+0x47>
movss  %xmm0,0x10(%rbx)
movss  0x8(%rbx),%xmm1
ucomiss %xmm0,%xmm1
jbe    1169 <update_bar+0x59>
lea    0x8(%rbx),%rax
movss  %xmm0,(%rax)
movss  0xc(%rsp),%xmm0
call   1030 <check_price@plt>
ucomiss 0xe85(%rip),%xmm0
jne    117f <update_bar+0x6f>
jnp    11c0 <update_bar+0xb0>
movss  %xmm0,0x1c(%rbx)
movss  0x4(%rbx),%xmm1
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm1
jne    11a3 <update_bar+0x93>
jp     11a3 <update_bar+0x93>
movss  %xmm0,0x4(%rbx)
movss  %xmm0,0x14(%rbx)
add    $0xc,%rbx
jmp    11bc <update_bar+0xac>
ucomiss 0xc(%rbx),%xmm0
jbe    11ae <update_bar+0x9e>
movss  %xmm0,0xc(%rbx)
movss  0x14(%rbx),%xmm1
ucomiss %xmm0,%xmm1
jbe    11c0 <update_bar+0xb0>
add    $0x14,%rbx
movss  %xmm0,(%rbx)
add    $0x10,%rsp
pop    %rbx
ret

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

LLVM IR (-O2):
define void @update_bar(float* nocapture %0, float %1, float %2) {
%4 = tail call float @check_price(float %1)
%5 = fcmp une float %4, 0.000000e+00
br i1 %5, label %6, label %24
6: ; preds = %3
%7 = getelementptr inbounds float, float* %0, i64 6
store float %4, float* %7
%8 = load float, float* %0
%9 = fcmp oeq float %8, 0.000000e+00
br i1 %9, label %10, label %13
10: ; preds = %6
store float %4, float* %0
%11 = getelementptr inbounds float, float* %0, i64 2
store float %4, float* %11
%12 = getelementptr inbounds float, float* %0, i64 4
br label %22
13: ; preds = %6
%14 = getelementptr inbounds float, float* %0, i64 4
%15 = load float, float* %14
%16 = fcmp ogt float %4, %15
br i1 %16, label %17, label %18
17: ; preds = %13
store float %4, float* %14
br label %18
18: ; preds = %17, %13
%19 = getelementptr inbounds float, float* %0, i64 2
%20 = load float, float* %19
%21 = fcmp olt float %4, %20
br i1 %21, label %22, label %24
22: ; preds = %18, %10
%23 = phi float* [ %12, %10 ], [ %19, %18 ]
store float %4, float* %23
br label %24
24: ; preds = %22, %18, %3
%25 = tail call float @check_price(float %2)
%26 = fcmp une float %25, 0.000000e+00
br i1 %26, label %27, label %46
27: ; preds = %24
%28 = getelementptr inbounds float, float* %0, i64 7
store float %25, float* %28
%29 = getelementptr inbounds float, float* %0, i64 1
%30 = load float, float* %29
%31 = fcmp oeq float %30, 0.000000e+00
br i1 %31, label %32, label %35
32: ; preds = %27
store float %25, float* %29
%33 = getelementptr inbounds float, float* %0, i64 5
store float %25, float* %33
%34 = getelementptr inbounds float, float* %0, i64 3
br label %44
35: ; preds = %27
%36 = getelementptr inbounds float, float* %0, i64 3
%37 = load float, float* %36
%38 = fcmp ogt float %25, %37
br i1 %38, label %39, label %40
39: ; preds = %35
store float %25, float* %36
br label %40
40: ; preds = %39, %35
%41 = getelementptr inbounds float, float* %0, i64 5
%42 = load float, float* %41
%43 = fcmp olt float %25, %42
br i1 %43, label %44, label %46
44: ; preds = %40, %32
%45 = phi float* [ %34, %32 ], [ %41, %40 ]
store float %25, float* %45
br label %46
46: ; preds = %44, %40, %24
ret void
}