int med3func(char ***a, int ia, int ib, int ic, int depth) {
  int va, vb, vc;
  if ((va = *(**(a + ia) + depth)) == (vb = *(**(a + ib) + depth)))
    return ia;
  if ((vc = *(**(a + ic) + depth)) == va || vc == vb)
    return ic;
  return va < vb ? (vb < vc ? ib : (va < vc ? ic : ia))
                 : (vb > vc ? ib : (va < vc ? ia : ic));
}


x86 assembly (clang, -O0):
<med3func>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
mov    (%rcx,%rdx,8),%rcx
mov    (%rcx),%rcx
movslq -0x20(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
mov    %ecx,-0x28(%rbp)
cmp    %ecx,%eax
jne    115c <med3func+0x5c>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    122d <med3func+0x12d>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    (%rax),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x2c(%rbp)
cmp    -0x24(%rbp),%eax
je     118b <med3func+0x8b>
mov    -0x2c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jne    1196 <med3func+0x96>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    122d <med3func+0x12d>
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    11e7 <med3func+0xe7>
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    11b9 <med3func+0xb9>
mov    -0x18(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    11dc <med3func+0xdc>
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    11d0 <med3func+0xd0>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    11d6 <med3func+0xd6>
mov    -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1227 <med3func+0x127>
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    11fe <med3func+0xfe>
mov    -0x18(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    1221 <med3func+0x121>
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1215 <med3func+0x115>
mov    -0x14(%rbp),%eax
mov    %eax,-0x40(%rbp)
jmp    121b <med3func+0x11b>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<med3func>:
mov    %edx,%eax
movslq %esi,%rdx
mov    (%rdi,%rdx,8),%rdx
mov    (%rdx),%r9
movslq %r8d,%r10
mov    (%r9,%r10,1),%r8b
movslq %eax,%rdx
mov    (%rdi,%rdx,8),%rdx
mov    (%rdx),%rdx
mov    (%rdx,%r10,1),%r9b
cmp    %r9b,%r8b
jne    1129 <med3func+0x29>
mov    %esi,%eax
ret
movslq %ecx,%rdx
mov    (%rdi,%rdx,8),%rdx
mov    (%rdx),%rdx
mov    (%rdx,%r10,1),%dil
cmp    %r8b,%dil
je     115f <med3func+0x5f>
cmp    %r9b,%dil
je     115f <med3func+0x5f>
cmp    %r9b,%r8b
jge    1154 <med3func+0x54>
cmp    %dil,%r9b
jl     1161 <med3func+0x61>
cmp    %dil,%r8b
cmovl  %ecx,%esi
mov    %esi,%eax
ret
cmp    %dil,%r9b
jg     1161 <med3func+0x61>
cmp    %dil,%r8b
cmovl  %esi,%ecx
mov    %ecx,%eax
ret

LLVM IR (-O0):
define i32 @med3func(i8*** %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i32
%7 = alloca i8***
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i8*** %0, i8**** %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store i32 %4, i32* %11
%15 = load i8***, i8**** %7
%16 = load i32, i32* %8
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i8**, i8*** %15, i64 %17
%19 = load i8**, i8*** %18
%20 = load i8*, i8** %19
%21 = load i32, i32* %11
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %20, i64 %22
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
store i32 %25, i32* %12
%26 = load i8***, i8**** %7
%27 = load i32, i32* %9
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i8**, i8*** %26, i64 %28
%30 = load i8**, i8*** %29
%31 = load i8*, i8** %30
%32 = load i32, i32* %11
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i8, i8* %31, i64 %33
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
store i32 %36, i32* %13
%37 = icmp eq i32 %25, %36
br i1 %37, label %38, label %40
38: ; preds = %5
%39 = load i32, i32* %8
store i32 %39, i32* %6
br label %102
40: ; preds = %5
%41 = load i8***, i8**** %7
%42 = load i32, i32* %10
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8**, i8*** %41, i64 %43
%45 = load i8**, i8*** %44
%46 = load i8*, i8** %45
%47 = load i32, i32* %11
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %46, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
store i32 %51, i32* %14
%52 = load i32, i32* %12
%53 = icmp eq i32 %51, %52
br i1 %53, label %58, label %54
54: ; preds = %40
%55 = load i32, i32* %14
%56 = load i32, i32* %13
%57 = icmp eq i32 %55, %56
br i1 %57, label %58, label %60
58: ; preds = %54, %40
%59 = load i32, i32* %10
store i32 %59, i32* %6
br label %102
60: ; preds = %54
%61 = load i32, i32* %12
%62 = load i32, i32* %13
%63 = icmp slt i32 %61, %62
br i1 %63, label %64, label %82
64: ; preds = %60
%65 = load i32, i32* %13
%66 = load i32, i32* %14
%67 = icmp slt i32 %65, %66
br i1 %67, label %68, label %70
68: ; preds = %64
%69 = load i32, i32* %9
br label %80
70: ; preds = %64
%71 = load i32, i32* %12
%72 = load i32, i32* %14
%73 = icmp slt i32 %71, %72
br i1 %73, label %74, label %76
74: ; preds = %70
%75 = load i32, i32* %10
br label %78
76: ; preds = %70
%77 = load i32, i32* %8
br label %78
78: ; preds = %76, %74
%79 = phi i32 [ %75, %74 ], [ %77, %76 ]
br label %80
80: ; preds = %78, %68
%81 = phi i32 [ %69, %68 ], [ %79, %78 ]
br label %100
82: ; preds = %60
%83 = load i32, i32* %13
%84 = load i32, i32* %14
%85 = icmp sgt i32 %83, %84
br i1 %85, label %86, label %88
86: ; preds = %82
%87 = load i32, i32* %9
br label %98
88: ; preds = %82
%89 = load i32, i32* %12
%90 = load i32, i32* %14
%91 = icmp slt i32 %89, %90
br i1 %91, label %92, label %94
92: ; preds = %88
%93 = load i32, i32* %8
br label %96
94: ; preds = %88
%95 = load i32, i32* %10
br label %96
96: ; preds = %94, %92
%97 = phi i32 [ %93, %92 ], [ %95, %94 ]
br label %98
98: ; preds = %96, %86
%99 = phi i32 [ %87, %86 ], [ %97, %96 ]
br label %100
100: ; preds = %98, %80
%101 = phi i32 [ %81, %80 ], [ %99, %98 ]
store i32 %101, i32* %6
br label %102
102: ; preds = %100, %58, %38
%103 = load i32, i32* %6
ret i32 %103
}

LLVM IR (-O2):
define i32 @med3func(i8*** nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = sext i32 %1 to i64
%7 = getelementptr inbounds i8**, i8*** %0, i64 %6
%8 = load i8**, i8*** %7
%9 = load i8*, i8** %8
%10 = sext i32 %4 to i64
%11 = getelementptr inbounds i8, i8* %9, i64 %10
%12 = load i8, i8* %11
%13 = sext i32 %2 to i64
%14 = getelementptr inbounds i8**, i8*** %0, i64 %13
%15 = load i8**, i8*** %14
%16 = load i8*, i8** %15
%17 = getelementptr inbounds i8, i8* %16, i64 %10
%18 = load i8, i8* %17
%19 = icmp eq i8 %12, %18
br i1 %19, label %42, label %20
20: ; preds = %5
%21 = sext i32 %3 to i64
%22 = getelementptr inbounds i8**, i8*** %0, i64 %21
%23 = load i8**, i8*** %22
%24 = load i8*, i8** %23
%25 = getelementptr inbounds i8, i8* %24, i64 %10
%26 = load i8, i8* %25
%27 = icmp eq i8 %26, %12
%28 = icmp eq i8 %26, %18
%29 = select i1 %27, i1 true, i1 %28
br i1 %29, label %42, label %30
30: ; preds = %20
%31 = icmp slt i8 %12, %18
br i1 %31, label %32, label %37
32: ; preds = %30
%33 = icmp slt i8 %18, %26
br i1 %33, label %42, label %34
34: ; preds = %32
%35 = icmp slt i8 %12, %26
%36 = select i1 %35, i32 %3, i32 %1
br label %42
37: ; preds = %30
%38 = icmp sgt i8 %18, %26
br i1 %38, label %42, label %39
39: ; preds = %37
%40 = icmp slt i8 %12, %26
%41 = select i1 %40, i32 %1, i32 %3
br label %42
42: ; preds = %34, %39, %32, %37, %20, %5
%43 = phi i32 [ %1, %5 ], [ %3, %20 ], [ %36, %34 ], [ %41, %39 ], [ %2, %32 ], [ %2, %37 ]
ret i32 %43
}