int median(int *arr, int a, int b, int c) {
  int m;
  if (arr[a] > arr[b] && arr[a] < arr[c] ||
      arr[a] > arr[c] && arr[a] < arr[b]) {
    m = a;
  } else if (arr[b] > arr[a] && arr[b] < arr[c] ||
             arr[b] < arr[a] && arr[b] > arr[c]) {
    m = b;
  } else if (arr[c] > arr[a] && arr[c] < arr[b] ||
             arr[c]<arr[a] & arr[c]> arr[b]) {
    m = c;
  }
  return m;
}


x86 assembly (clang, -O0):
<median>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    1149 <median+0x49>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jl     1181 <median+0x81>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    118c <median+0x8c>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jge    118c <median+0x8c>
mov    -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1297 <median+0x197>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    11c4 <median+0xc4>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jl     11fc <median+0xfc>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jge    1207 <median+0x107>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    1207 <median+0x107>
mov    -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1292 <median+0x192>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    123f <median+0x13f>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x10(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jl     1287 <median+0x187>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
setl   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
mov    (%rcx,%rdx,4),%ecx
mov    -0x8(%rbp),%rdx
movslq -0x10(%rbp),%rsi
cmp    (%rdx,%rsi,4),%ecx
setg   %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     128d <median+0x18d>
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1292 <median+0x192>
jmp    1297 <median+0x197>
mov    -0x18(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<median>:
mov    %esi,%eax
movslq %esi,%rsi
mov    (%rdi,%rsi,4),%r9d
movslq %edx,%rsi
mov    (%rdi,%rsi,4),%r8d
movslq %ecx,%rsi
mov    (%rdi,%rsi,4),%edi
cmp    %r8d,%r9d
jle    1121 <median+0x21>
cmp    %edi,%r9d
jge    1121 <median+0x21>
ret
cmp    %edi,%r9d
jle    112b <median+0x2b>
cmp    %r8d,%r9d
jl     1120 <median+0x20>
cmp    %r8d,%r9d
jge    1138 <median+0x38>
cmp    %edi,%r8d
jge    1138 <median+0x38>
mov    %edx,%eax
ret
cmp    %edi,%r8d
cmovle %ecx,%edx
cmp    %r8d,%r9d
cmovle %ecx,%edx
mov    %edx,%eax
ret

LLVM IR (-O0):
define i32 @median(i32* %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i32* %0, i32** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%10 = load i32*, i32** %5
%11 = load i32, i32* %6
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds i32, i32* %10, i64 %12
%14 = load i32, i32* %13
%15 = load i32*, i32** %5
%16 = load i32, i32* %7
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i32, i32* %15, i64 %17
%19 = load i32, i32* %18
%20 = icmp sgt i32 %14, %19
br i1 %20, label %21, label %33
21: ; preds = %4
%22 = load i32*, i32** %5
%23 = load i32, i32* %6
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i32, i32* %22, i64 %24
%26 = load i32, i32* %25
%27 = load i32*, i32** %5
%28 = load i32, i32* %8
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i32, i32* %27, i64 %29
%31 = load i32, i32* %30
%32 = icmp slt i32 %26, %31
br i1 %32, label %57, label %33
33: ; preds = %21, %4
%34 = load i32*, i32** %5
%35 = load i32, i32* %6
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i32, i32* %34, i64 %36
%38 = load i32, i32* %37
%39 = load i32*, i32** %5
%40 = load i32, i32* %8
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i32, i32* %39, i64 %41
%43 = load i32, i32* %42
%44 = icmp sgt i32 %38, %43
br i1 %44, label %45, label %59
45: ; preds = %33
%46 = load i32*, i32** %5
%47 = load i32, i32* %6
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i32, i32* %46, i64 %48
%50 = load i32, i32* %49
%51 = load i32*, i32** %5
%52 = load i32, i32* %7
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i32, i32* %51, i64 %53
%55 = load i32, i32* %54
%56 = icmp slt i32 %50, %55
br i1 %56, label %57, label %59
57: ; preds = %45, %21
%58 = load i32, i32* %6
store i32 %58, i32* %9
br label %164
59: ; preds = %45, %33
%60 = load i32*, i32** %5
%61 = load i32, i32* %7
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i32, i32* %60, i64 %62
%64 = load i32, i32* %63
%65 = load i32*, i32** %5
%66 = load i32, i32* %6
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i32, i32* %65, i64 %67
%69 = load i32, i32* %68
%70 = icmp sgt i32 %64, %69
br i1 %70, label %71, label %83
71: ; preds = %59
%72 = load i32*, i32** %5
%73 = load i32, i32* %7
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i32, i32* %72, i64 %74
%76 = load i32, i32* %75
%77 = load i32*, i32** %5
%78 = load i32, i32* %8
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds i32, i32* %77, i64 %79
%81 = load i32, i32* %80
%82 = icmp slt i32 %76, %81
br i1 %82, label %107, label %83
83: ; preds = %71, %59
%84 = load i32*, i32** %5
%85 = load i32, i32* %7
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i32, i32* %84, i64 %86
%88 = load i32, i32* %87
%89 = load i32*, i32** %5
%90 = load i32, i32* %6
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds i32, i32* %89, i64 %91
%93 = load i32, i32* %92
%94 = icmp slt i32 %88, %93
br i1 %94, label %95, label %109
95: ; preds = %83
%96 = load i32*, i32** %5
%97 = load i32, i32* %7
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i32, i32* %96, i64 %98
%100 = load i32, i32* %99
%101 = load i32*, i32** %5
%102 = load i32, i32* %8
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i32, i32* %101, i64 %103
%105 = load i32, i32* %104
%106 = icmp sgt i32 %100, %105
br i1 %106, label %107, label %109
107: ; preds = %95, %71
%108 = load i32, i32* %7
store i32 %108, i32* %9
br label %163
109: ; preds = %95, %83
%110 = load i32*, i32** %5
%111 = load i32, i32* %8
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds i32, i32* %110, i64 %112
%114 = load i32, i32* %113
%115 = load i32*, i32** %5
%116 = load i32, i32* %6
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds i32, i32* %115, i64 %117
%119 = load i32, i32* %118
%120 = icmp sgt i32 %114, %119
br i1 %120, label %121, label %133
121: ; preds = %109
%122 = load i32*, i32** %5
%123 = load i32, i32* %8
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i32, i32* %122, i64 %124
%126 = load i32, i32* %125
%127 = load i32*, i32** %5
%128 = load i32, i32* %7
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i32, i32* %127, i64 %129
%131 = load i32, i32* %130
%132 = icmp slt i32 %126, %131
br i1 %132, label %160, label %133
133: ; preds = %121, %109
%134 = load i32*, i32** %5
%135 = load i32, i32* %8
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds i32, i32* %134, i64 %136
%138 = load i32, i32* %137
%139 = load i32*, i32** %5
%140 = load i32, i32* %6
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds i32, i32* %139, i64 %141
%143 = load i32, i32* %142
%144 = icmp slt i32 %138, %143
%145 = zext i1 %144 to i32
%146 = load i32*, i32** %5
%147 = load i32, i32* %8
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i32, i32* %146, i64 %148
%150 = load i32, i32* %149
%151 = load i32*, i32** %5
%152 = load i32, i32* %7
%153 = sext i32 %152 to i64
%154 = getelementptr inbounds i32, i32* %151, i64 %153
%155 = load i32, i32* %154
%156 = icmp sgt i32 %150, %155
%157 = zext i1 %156 to i32
%158 = and i32 %145, %157
%159 = icmp ne i32 %158, 0
br i1 %159, label %160, label %162
160: ; preds = %133, %121
%161 = load i32, i32* %8
store i32 %161, i32* %9
br label %162
162: ; preds = %160, %133
br label %163
163: ; preds = %162, %107
br label %164
164: ; preds = %163, %57
%165 = load i32, i32* %9
ret i32 %165
}

LLVM IR (-O2):
define i32 @median(i32* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = sext i32 %1 to i64
%6 = getelementptr inbounds i32, i32* %0, i64 %5
%7 = load i32, i32* %6
%8 = sext i32 %2 to i64
%9 = getelementptr inbounds i32, i32* %0, i64 %8
%10 = load i32, i32* %9
%11 = icmp sgt i32 %7, %10
%12 = sext i32 %3 to i64
%13 = getelementptr inbounds i32, i32* %0, i64 %12
%14 = load i32, i32* %13
%15 = icmp slt i32 %7, %14
%16 = select i1 %11, i1 %15, i1 false
br i1 %16, label %28, label %17
17: ; preds = %4
%18 = icmp sgt i32 %7, %14
%19 = icmp slt i32 %7, %10
%20 = select i1 %18, i1 %19, i1 false
br i1 %20, label %28, label %21
21: ; preds = %17
%22 = icmp slt i32 %10, %14
%23 = select i1 %19, i1 %22, i1 false
br i1 %23, label %28, label %24
24: ; preds = %21
%25 = icmp sgt i32 %10, %14
%26 = select i1 %11, i1 %25, i1 false
%27 = select i1 %26, i32 %2, i32 %3
br label %28
28: ; preds = %4, %24, %21, %17
%29 = phi i32 [ %1, %17 ], [ %2, %21 ], [ %27, %24 ], [ %1, %4 ]
ret i32 %29
}