short quickselect_short(int k, int n, short *arr) {
  int i, ir, j, m, mid;
  short a, temp;
  k--;
  m = 0;
  ir = n - 1;
  for (;;) {
    if (ir <= m + 1) {
      if (ir == m + 1 && (arr)[ir] < (arr)[m]) {
        temp = ((arr)[m]);
        ((arr)[m]) = ((arr)[ir]);
        ((arr)[ir]) = temp;
      }
      return (arr)[k];
    } else {
      mid = (m + ir) >> 1;
      temp = ((arr)[mid]);
      ((arr)[mid]) = ((arr)[m + 1]);
      ((arr)[m + 1]) = temp;
      if ((arr)[m] > (arr)[ir]) {
        temp = ((arr)[m]);
        ((arr)[m]) = ((arr)[ir]);
        ((arr)[ir]) = temp;
      }
      if ((arr)[m + 1] > (arr)[ir]) {
        temp = ((arr)[m + 1]);
        ((arr)[m + 1]) = ((arr)[ir]);
        ((arr)[ir]) = temp;
      }
      if ((arr)[m] > (arr)[m + 1]) {
        temp = ((arr)[m]);
        ((arr)[m]) = ((arr)[m + 1]);
        ((arr)[m + 1]) = temp;
      }
      i = m + 1;
      j = ir;
      a = arr[m + 1];
      for (;;) {
        do
          i++;
        while ((arr)[i] < a);
        do
          j--;
        while ((arr)[j] > a);
        if (j < i)
          break;
        temp = ((arr)[i]);
        ((arr)[i]) = ((arr)[j]);
        ((arr)[j]) = temp;
      }
      (arr)[m + 1] = (arr)[j];
      (arr)[j] = a;
      if (j >= k)
        ir = j - 1;
      if (j <= k)
        m = i;
    }
  }
}


x86 assembly (clang, -O0):
<quickselect_short>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     11af <quickselect_short+0xaf>
mov    -0x18(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jne    11a1 <quickselect_short+0xa1>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    %ecx,%eax
jge    11a1 <quickselect_short+0xa1>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%dx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
pop    %rbp
ret
mov    -0x20(%rbp),%eax
add    -0x18(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%dx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    %ecx,%eax
jle    1255 <quickselect_short+0x155>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%dx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    %ecx,%eax
jle    12bc <quickselect_short+0x1bc>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%dx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    %ecx,%eax
jle    1323 <quickselect_short+0x223>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%dx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x26(%rbp)
jmp    134c <quickselect_short+0x24c>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x26(%rbp),%ecx
cmp    %ecx,%eax
jl     134c <quickselect_short+0x24c>
jmp    1372 <quickselect_short+0x272>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x26(%rbp),%ecx
cmp    %ecx,%eax
jg     1372 <quickselect_short+0x272>
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13a4 <quickselect_short+0x2a4>
jmp    13e1 <quickselect_short+0x2e1>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%dx
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1347 <quickselect_short+0x247>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x26(%rbp),%dx
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     1423 <quickselect_short+0x323>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1435 <quickselect_short+0x335>
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    143a <quickselect_short+0x33a>
jmp    1127 <quickselect_short+0x27>

x86 assembly (clang, -O2):
<quickselect_short>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
lea    -0x1(%rsi),%r10d
xor    %r8d,%r8d
cmp    $0x3,%esi
jl     1237 <quickselect_short+0x137>
lea    0x2(%rdx),%r11
mov    $0x1,%r15d
jmp    1154 <quickselect_short+0x54>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %si,(%rdx,%r9,2)
mov    %r14w,(%rcx)
add    $0xffffffff,%eax
cmp    %edi,%r12d
cmovge %eax,%r10d
cmovle %r15d,%r8d
lea    0x1(%r8),%r15d
cmp    %r15d,%r10d
jle    1244 <quickselect_short+0x144>
lea    (%r8,%r10,1),%eax
sar    %eax
movslq %eax,%rcx
movzwl (%rdx,%rcx,2),%eax
movslq %r15d,%r9
movzwl (%rdx,%r9,2),%esi
mov    %si,(%rdx,%rcx,2)
mov    %ax,(%rdx,%r9,2)
movslq %r8d,%rbx
movzwl (%rdx,%rbx,2),%ebp
movslq %r10d,%rcx
movzwl (%rdx,%rcx,2),%esi
cmp    %si,%bp
jle    11a0 <quickselect_short+0xa0>
mov    %si,(%rdx,%rbx,2)
mov    %bp,(%rdx,%rcx,2)
movzwl (%rdx,%r9,2),%eax
cmp    %bp,%ax
jg     11a7 <quickselect_short+0xa7>
jmp    11b5 <quickselect_short+0xb5>
nopl   0x0(%rax)
mov    %esi,%ebp
cmp    %bp,%ax
jle    11b5 <quickselect_short+0xb5>
mov    %bp,(%rdx,%r9,2)
mov    %ax,(%rdx,%rcx,2)
movzwl (%rdx,%r9,2),%eax
movzwl (%rdx,%rbx,2),%r14d
cmp    %ax,%r14w
jle    11d0 <quickselect_short+0xd0>
mov    %ax,(%rdx,%rbx,2)
mov    %r14w,(%rdx,%r9,2)
jmp    11d3 <quickselect_short+0xd3>
nopl   0x0(%rax,%rax,1)
mov    %eax,%r14d
mov    %r10d,%eax
cs nopw 0x0(%rax,%rax,1)
movslq %r15d,%rcx
lea    (%r11,%rcx,2),%rbx
nopw   0x0(%rax,%rax,1)
movzwl (%rbx),%ebp
add    $0x1,%r15d
add    $0x2,%rbx
cmp    %r14w,%bp
jl     11f0 <quickselect_short+0xf0>
movslq %eax,%rcx
lea    (%rdx,%rcx,2),%rcx
nopl   0x0(%rax,%rax,1)
movzwl -0x2(%rcx),%esi
add    $0xfffffffffffffffe,%rcx
add    $0xffffffff,%eax
cmp    %r14w,%si
jg     1210 <quickselect_short+0x110>
lea    0x1(%rax),%r12d
cmp    %r15d,%r12d
jle    1130 <quickselect_short+0x30>
mov    %si,-0x2(%rbx)
mov    %bp,(%rcx)
jmp    11e0 <quickselect_short+0xe0>
mov    $0x1,%r15d
cmp    %r15d,%r10d
je     124c <quickselect_short+0x14c>
jmp    1266 <quickselect_short+0x166>
movslq %r8d,%r8
cmp    %r15d,%r10d
jne    1266 <quickselect_short+0x166>
movslq %r10d,%rax
movzwl (%rdx,%rax,2),%ecx
movzwl (%rdx,%r8,2),%esi
cmp    %si,%cx
jge    1266 <quickselect_short+0x166>
mov    %cx,(%rdx,%r8,2)
mov    %si,(%rdx,%rax,2)
movslq %edi,%rax
movzwl -0x2(%rdx,%rax,2),%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define signext i16 @quickselect_short(i32 %0, i32 %1, i16* %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i16*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i16
%13 = alloca i16
store i32 %0, i32* %4
store i32 %1, i32* %5
store i16* %2, i16** %6
%14 = load i32, i32* %4
%15 = add nsw i32 %14, -1
store i32 %15, i32* %4
store i32 0, i32* %10
%16 = load i32, i32* %5
%17 = sub nsw i32 %16, 1
store i32 %17, i32* %8
br label %18
18: ; preds = %293, %3
%19 = load i32, i32* %8
%20 = load i32, i32* %10
%21 = add nsw i32 %20, 1
%22 = icmp sle i32 %19, %21
br i1 %22, label %23, label %68
23: ; preds = %18
%24 = load i32, i32* %8
%25 = load i32, i32* %10
%26 = add nsw i32 %25, 1
%27 = icmp eq i32 %24, %26
br i1 %27, label %28, label %62
28: ; preds = %23
%29 = load i16*, i16** %6
%30 = load i32, i32* %8
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i16, i16* %29, i64 %31
%33 = load i16, i16* %32
%34 = sext i16 %33 to i32
%35 = load i16*, i16** %6
%36 = load i32, i32* %10
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i16, i16* %35, i64 %37
%39 = load i16, i16* %38
%40 = sext i16 %39 to i32
%41 = icmp slt i32 %34, %40
br i1 %41, label %42, label %62
42: ; preds = %28
%43 = load i16*, i16** %6
%44 = load i32, i32* %10
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i16, i16* %43, i64 %45
%47 = load i16, i16* %46
store i16 %47, i16* %13
%48 = load i16*, i16** %6
%49 = load i32, i32* %8
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i16, i16* %48, i64 %50
%52 = load i16, i16* %51
%53 = load i16*, i16** %6
%54 = load i32, i32* %10
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i16, i16* %53, i64 %55
store i16 %52, i16* %56
%57 = load i16, i16* %13
%58 = load i16*, i16** %6
%59 = load i32, i32* %8
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i16, i16* %58, i64 %60
store i16 %57, i16* %61
br label %62
62: ; preds = %42, %28, %23
%63 = load i16*, i16** %6
%64 = load i32, i32* %4
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i16, i16* %63, i64 %65
%67 = load i16, i16* %66
ret i16 %67
68: ; preds = %18
%69 = load i32, i32* %10
%70 = load i32, i32* %8
%71 = add nsw i32 %69, %70
%72 = ashr i32 %71, 1
store i32 %72, i32* %11
%73 = load i16*, i16** %6
%74 = load i32, i32* %11
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds i16, i16* %73, i64 %75
%77 = load i16, i16* %76
store i16 %77, i16* %13
%78 = load i16*, i16** %6
%79 = load i32, i32* %10
%80 = add nsw i32 %79, 1
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i16, i16* %78, i64 %81
%83 = load i16, i16* %82
%84 = load i16*, i16** %6
%85 = load i32, i32* %11
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i16, i16* %84, i64 %86
store i16 %83, i16* %87
%88 = load i16, i16* %13
%89 = load i16*, i16** %6
%90 = load i32, i32* %10
%91 = add nsw i32 %90, 1
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i16, i16* %89, i64 %92
store i16 %88, i16* %93
%94 = load i16*, i16** %6
%95 = load i32, i32* %10
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i16, i16* %94, i64 %96
%98 = load i16, i16* %97
%99 = sext i16 %98 to i32
%100 = load i16*, i16** %6
%101 = load i32, i32* %8
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds i16, i16* %100, i64 %102
%104 = load i16, i16* %103
%105 = sext i16 %104 to i32
%106 = icmp sgt i32 %99, %105
br i1 %106, label %107, label %127
107: ; preds = %68
%108 = load i16*, i16** %6
%109 = load i32, i32* %10
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i16, i16* %108, i64 %110
%112 = load i16, i16* %111
store i16 %112, i16* %13
%113 = load i16*, i16** %6
%114 = load i32, i32* %8
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i16, i16* %113, i64 %115
%117 = load i16, i16* %116
%118 = load i16*, i16** %6
%119 = load i32, i32* %10
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i16, i16* %118, i64 %120
store i16 %117, i16* %121
%122 = load i16, i16* %13
%123 = load i16*, i16** %6
%124 = load i32, i32* %8
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i16, i16* %123, i64 %125
store i16 %122, i16* %126
br label %127
127: ; preds = %107, %68
%128 = load i16*, i16** %6
%129 = load i32, i32* %10
%130 = add nsw i32 %129, 1
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i16, i16* %128, i64 %131
%133 = load i16, i16* %132
%134 = sext i16 %133 to i32
%135 = load i16*, i16** %6
%136 = load i32, i32* %8
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds i16, i16* %135, i64 %137
%139 = load i16, i16* %138
%140 = sext i16 %139 to i32
%141 = icmp sgt i32 %134, %140
br i1 %141, label %142, label %164
142: ; preds = %127
%143 = load i16*, i16** %6
%144 = load i32, i32* %10
%145 = add nsw i32 %144, 1
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds i16, i16* %143, i64 %146
%148 = load i16, i16* %147
store i16 %148, i16* %13
%149 = load i16*, i16** %6
%150 = load i32, i32* %8
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds i16, i16* %149, i64 %151
%153 = load i16, i16* %152
%154 = load i16*, i16** %6
%155 = load i32, i32* %10
%156 = add nsw i32 %155, 1
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds i16, i16* %154, i64 %157
store i16 %153, i16* %158
%159 = load i16, i16* %13
%160 = load i16*, i16** %6
%161 = load i32, i32* %8
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds i16, i16* %160, i64 %162
store i16 %159, i16* %163
br label %164
164: ; preds = %142, %127
%165 = load i16*, i16** %6
%166 = load i32, i32* %10
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i16, i16* %165, i64 %167
%169 = load i16, i16* %168
%170 = sext i16 %169 to i32
%171 = load i16*, i16** %6
%172 = load i32, i32* %10
%173 = add nsw i32 %172, 1
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds i16, i16* %171, i64 %174
%176 = load i16, i16* %175
%177 = sext i16 %176 to i32
%178 = icmp sgt i32 %170, %177
br i1 %178, label %179, label %201
179: ; preds = %164
%180 = load i16*, i16** %6
%181 = load i32, i32* %10
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds i16, i16* %180, i64 %182
%184 = load i16, i16* %183
store i16 %184, i16* %13
%185 = load i16*, i16** %6
%186 = load i32, i32* %10
%187 = add nsw i32 %186, 1
%188 = sext i32 %187 to i64
%189 = getelementptr inbounds i16, i16* %185, i64 %188
%190 = load i16, i16* %189
%191 = load i16*, i16** %6
%192 = load i32, i32* %10
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds i16, i16* %191, i64 %193
store i16 %190, i16* %194
%195 = load i16, i16* %13
%196 = load i16*, i16** %6
%197 = load i32, i32* %10
%198 = add nsw i32 %197, 1
%199 = sext i32 %198 to i64
%200 = getelementptr inbounds i16, i16* %196, i64 %199
store i16 %195, i16* %200
br label %201
201: ; preds = %179, %164
%202 = load i32, i32* %10
%203 = add nsw i32 %202, 1
store i32 %203, i32* %7
%204 = load i32, i32* %8
store i32 %204, i32* %9
%205 = load i16*, i16** %6
%206 = load i32, i32* %10
%207 = add nsw i32 %206, 1
%208 = sext i32 %207 to i64
%209 = getelementptr inbounds i16, i16* %205, i64 %208
%210 = load i16, i16* %209
store i16 %210, i16* %12
br label %211
211: ; preds = %244, %201
br label %212
212: ; preds = %215, %211
%213 = load i32, i32* %7
%214 = add nsw i32 %213, 1
store i32 %214, i32* %7
br label %215
215: ; preds = %212
%216 = load i16*, i16** %6
%217 = load i32, i32* %7
%218 = sext i32 %217 to i64
%219 = getelementptr inbounds i16, i16* %216, i64 %218
%220 = load i16, i16* %219
%221 = sext i16 %220 to i32
%222 = load i16, i16* %12
%223 = sext i16 %222 to i32
%224 = icmp slt i32 %221, %223
br i1 %224, label %212, label %225
225: ; preds = %215
br label %226
226: ; preds = %229, %225
%227 = load i32, i32* %9
%228 = add nsw i32 %227, -1
store i32 %228, i32* %9
br label %229
229: ; preds = %226
%230 = load i16*, i16** %6
%231 = load i32, i32* %9
%232 = sext i32 %231 to i64
%233 = getelementptr inbounds i16, i16* %230, i64 %232
%234 = load i16, i16* %233
%235 = sext i16 %234 to i32
%236 = load i16, i16* %12
%237 = sext i16 %236 to i32
%238 = icmp sgt i32 %235, %237
br i1 %238, label %226, label %239
239: ; preds = %229
%240 = load i32, i32* %9
%241 = load i32, i32* %7
%242 = icmp slt i32 %240, %241
br i1 %242, label %243, label %244
243: ; preds = %239
br label %264
244: ; preds = %239
%245 = load i16*, i16** %6
%246 = load i32, i32* %7
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds i16, i16* %245, i64 %247
%249 = load i16, i16* %248
store i16 %249, i16* %13
%250 = load i16*, i16** %6
%251 = load i32, i32* %9
%252 = sext i32 %251 to i64
%253 = getelementptr inbounds i16, i16* %250, i64 %252
%254 = load i16, i16* %253
%255 = load i16*, i16** %6
%256 = load i32, i32* %7
%257 = sext i32 %256 to i64
%258 = getelementptr inbounds i16, i16* %255, i64 %257
store i16 %254, i16* %258
%259 = load i16, i16* %13
%260 = load i16*, i16** %6
%261 = load i32, i32* %9
%262 = sext i32 %261 to i64
%263 = getelementptr inbounds i16, i16* %260, i64 %262
store i16 %259, i16* %263
br label %211
264: ; preds = %243
%265 = load i16*, i16** %6
%266 = load i32, i32* %9
%267 = sext i32 %266 to i64
%268 = getelementptr inbounds i16, i16* %265, i64 %267
%269 = load i16, i16* %268
%270 = load i16*, i16** %6
%271 = load i32, i32* %10
%272 = add nsw i32 %271, 1
%273 = sext i32 %272 to i64
%274 = getelementptr inbounds i16, i16* %270, i64 %273
store i16 %269, i16* %274
%275 = load i16, i16* %12
%276 = load i16*, i16** %6
%277 = load i32, i32* %9
%278 = sext i32 %277 to i64
%279 = getelementptr inbounds i16, i16* %276, i64 %278
store i16 %275, i16* %279
%280 = load i32, i32* %9
%281 = load i32, i32* %4
%282 = icmp sge i32 %280, %281
br i1 %282, label %283, label %286
283: ; preds = %264
%284 = load i32, i32* %9
%285 = sub nsw i32 %284, 1
store i32 %285, i32* %8
br label %286
286: ; preds = %283, %264
%287 = load i32, i32* %9
%288 = load i32, i32* %4
%289 = icmp sle i32 %287, %288
br i1 %289, label %290, label %292
290: ; preds = %286
%291 = load i32, i32* %7
store i32 %291, i32* %10
br label %292
292: ; preds = %290, %286
br label %293
293: ; preds = %292
br label %18
}

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