#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 */
size_t med3_s(size_t a, size_t b, size_t c) {
  return a < b ? (b < c ? b : a < c ? c : a) : (a < c ? a : b > c ? b : c);
}


x86 assembly (clang, -O0):
<med3_s>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    1171 <med3_s+0x71>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1139 <med3_s+0x39>
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    1164 <med3_s+0x64>
mov    -0x8(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1154 <med3_s+0x54>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    115c <med3_s+0x5c>
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    11bf <med3_s+0xbf>
mov    -0x8(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    118c <med3_s+0x8c>
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
jmp    11b7 <med3_s+0xb7>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
jbe    11a7 <med3_s+0xa7>
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    11af <med3_s+0xaf>
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<med3_s>:
cmp    %rsi,%rdi
jae    1118 <med3_s+0x18>
mov    %rsi,%rax
cmp    %rdx,%rsi
jb     112a <med3_s+0x2a>
cmp    %rdx,%rdi
cmovb  %rdx,%rdi
mov    %rdi,%rax
ret
mov    %rdi,%rax
cmp    %rdx,%rdi
jb     112a <med3_s+0x2a>
cmp    %rdx,%rsi
cmova  %rsi,%rdx
mov    %rdx,%rax
ret

LLVM IR (-O0):
define i64 @med3_s(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
store i64 %0, i64* %4
store i64 %1, i64* %5
store i64 %2, i64* %6
%7 = load i64, i64* %4
%8 = load i64, i64* %5
%9 = icmp ult i64 %7, %8
br i1 %9, label %10, label %28
10: ; preds = %3
%11 = load i64, i64* %5
%12 = load i64, i64* %6
%13 = icmp ult i64 %11, %12
br i1 %13, label %14, label %16
14: ; preds = %10
%15 = load i64, i64* %5
br label %26
16: ; preds = %10
%17 = load i64, i64* %4
%18 = load i64, i64* %6
%19 = icmp ult i64 %17, %18
br i1 %19, label %20, label %22
20: ; preds = %16
%21 = load i64, i64* %6
br label %24
22: ; preds = %16
%23 = load i64, i64* %4
br label %24
24: ; preds = %22, %20
%25 = phi i64 [ %21, %20 ], [ %23, %22 ]
br label %26
26: ; preds = %24, %14
%27 = phi i64 [ %15, %14 ], [ %25, %24 ]
br label %46
28: ; preds = %3
%29 = load i64, i64* %4
%30 = load i64, i64* %6
%31 = icmp ult i64 %29, %30
br i1 %31, label %32, label %34
32: ; preds = %28
%33 = load i64, i64* %4
br label %44
34: ; preds = %28
%35 = load i64, i64* %5
%36 = load i64, i64* %6
%37 = icmp ugt i64 %35, %36
br i1 %37, label %38, label %40
38: ; preds = %34
%39 = load i64, i64* %5
br label %42
40: ; preds = %34
%41 = load i64, i64* %6
br label %42
42: ; preds = %40, %38
%43 = phi i64 [ %39, %38 ], [ %41, %40 ]
br label %44
44: ; preds = %42, %32
%45 = phi i64 [ %33, %32 ], [ %43, %42 ]
br label %46
46: ; preds = %44, %26
%47 = phi i64 [ %27, %26 ], [ %45, %44 ]
ret i64 %47
}

LLVM IR (-O2):
define i64 @med3_s(i64 %0, i64 %1, i64 %2) {
%4 = icmp ult i64 %0, %1
br i1 %4, label %5, label %10
5: ; preds = %3
%6 = icmp ult i64 %1, %2
br i1 %6, label %15, label %7
7: ; preds = %5
%8 = icmp ult i64 %0, %2
%9 = select i1 %8, i64 %2, i64 %0
br label %15
10: ; preds = %3
%11 = icmp ult i64 %0, %2
br i1 %11, label %15, label %12
12: ; preds = %10
%13 = icmp ugt i64 %1, %2
%14 = select i1 %13, i64 %1, i64 %2
br label %15
15: ; preds = %10, %5, %12, %7
%16 = phi i64 [ %9, %7 ], [ %14, %12 ], [ %1, %5 ], [ %0, %10 ]
ret i64 %16
}