char quickselect_char(int k, int n, char *arr) {
  int i, ir, j, m, mid;
  char 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_char>:
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     11a9 <quickselect_char+0xa9>
mov    -0x18(%rbp),%eax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jne    119b <quickselect_char+0x9b>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jge    119b <quickselect_char+0x9b>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsbl (%rax,%rcx,1),%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,1),%al
mov    %al,-0x26(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jle    1243 <quickselect_char+0x143>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jle    12a4 <quickselect_char+0x1a4>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jle    1305 <quickselect_char+0x205>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
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,1),%al
mov    %al,-0x25(%rbp)
jmp    132c <quickselect_char+0x22c>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x25(%rbp),%ecx
cmp    %ecx,%eax
jl     132c <quickselect_char+0x22c>
jmp    1352 <quickselect_char+0x252>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x25(%rbp),%ecx
cmp    %ecx,%eax
jg     1352 <quickselect_char+0x252>
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1384 <quickselect_char+0x284>
jmp    13bb <quickselect_char+0x2bb>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x26(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x26(%rbp),%dl
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1327 <quickselect_char+0x227>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x25(%rbp),%dl
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     13f9 <quickselect_char+0x2f9>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     140b <quickselect_char+0x30b>
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    1410 <quickselect_char+0x310>
jmp    1127 <quickselect_char+0x27>

x86 assembly (clang, -O2):
<quickselect_char>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
lea    -0x1(%rsi),%r10d
xor    %r8d,%r8d
cmp    $0x3,%esi
jl     1226 <quickselect_char+0x126>
lea    0x1(%rdx),%r11
mov    $0x1,%esi
jmp    1153 <quickselect_char+0x53>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %cl,(%rdx,%r9,1)
mov    %r14b,0x0(%rbp)
add    $0xffffffff,%eax
cmp    %edi,%r12d
cmovge %eax,%r10d
cmovle %esi,%r8d
lea    0x1(%r8),%esi
cmp    %esi,%r10d
jle    1232 <quickselect_char+0x132>
lea    (%r8,%r10,1),%eax
sar    %eax
movslq %eax,%rcx
mov    (%rdx,%rcx,1),%al
movslq %esi,%r9
mov    (%rdx,%r9,1),%bl
mov    %bl,(%rdx,%rcx,1)
mov    %al,(%rdx,%r9,1)
movslq %r8d,%rbp
mov    (%rdx,%rbp,1),%bl
movslq %r10d,%r14
mov    (%rdx,%r14,1),%cl
cmp    %cl,%bl
jle    1190 <quickselect_char+0x90>
mov    %cl,(%rdx,%rbp,1)
mov    %bl,(%rdx,%r14,1)
mov    (%rdx,%r9,1),%al
cmp    %bl,%al
jg     1196 <quickselect_char+0x96>
jmp    11a2 <quickselect_char+0xa2>
nop
mov    %ecx,%ebx
cmp    %bl,%al
jle    11a2 <quickselect_char+0xa2>
mov    %bl,(%rdx,%r9,1)
mov    %al,(%rdx,%r14,1)
mov    (%rdx,%r9,1),%al
mov    (%rdx,%rbp,1),%r14b
cmp    %al,%r14b
jle    11c0 <quickselect_char+0xc0>
mov    %al,(%rdx,%rbp,1)
mov    %r14b,(%rdx,%r9,1)
jmp    11c3 <quickselect_char+0xc3>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %eax,%r14d
mov    %r10d,%eax
cs nopw 0x0(%rax,%rax,1)
movslq %esi,%rbx
add    %r11,%rbx
cs nopw 0x0(%rax,%rax,1)
movzbl (%rbx),%r15d
add    $0x1,%esi
add    $0x1,%rbx
cmp    %r14b,%r15b
jl     11e0 <quickselect_char+0xe0>
movslq %eax,%rbp
add    %rdx,%rbp
cs nopw 0x0(%rax,%rax,1)
movzbl -0x1(%rbp),%ecx
add    $0xffffffffffffffff,%rbp
add    $0xffffffff,%eax
cmp    %r14b,%cl
jg     1200 <quickselect_char+0x100>
lea    0x1(%rax),%r12d
cmp    %esi,%r12d
jle    1130 <quickselect_char+0x30>
mov    %cl,-0x1(%rbx)
mov    %r15b,0x0(%rbp)
jmp    11d0 <quickselect_char+0xd0>
mov    $0x1,%esi
cmp    %esi,%r10d
je     123a <quickselect_char+0x13a>
jmp    124f <quickselect_char+0x14f>
movslq %r8d,%r8
cmp    %esi,%r10d
jne    124f <quickselect_char+0x14f>
movslq %r10d,%rax
mov    (%rdx,%rax,1),%cl
mov    (%rdx,%r8,1),%bl
cmp    %bl,%cl
jge    124f <quickselect_char+0x14f>
mov    %cl,(%rdx,%r8,1)
mov    %bl,(%rdx,%rax,1)
movslq %edi,%rax
mov    -0x1(%rax,%rdx,1),%al
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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