#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 */
int /*<<< orphan*/ printf(char *, int, int);
int kth_smallest_short(short a[], int n, int k) {
  if (n <= 0 || k < 0) {
    printf("error: kth_smallest_short(n=%d, k=%d)\n", n, k);
    return 0;
  }
  register short i, j, l, m;
  register short x;
  l = 0;
  m = n - 1;
  while (l < m) {
    x = a[k];
    i = l;
    j = m;
    do {
      while (a[i] < x)
        i++;
      while (x < a[j])
        j--;
      if (i <= j) {
        {
          register short t = (a[i]);
          (a[i]) = (a[j]);
          (a[j]) = t;
        };
        i++;
        j--;
      }
    } while (i <= j);
    if (j < k)
      l = i;
    if (k < i)
      m = j;
  }
  return a[k];
}


x86 assembly (clang, -O0):
<kth_smallest_short>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
cmpl   $0x0,-0x14(%rbp)
jle    1136 <kth_smallest_short+0x26>
cmpl   $0x0,-0x18(%rbp)
jge    1154 <kth_smallest_short+0x44>
mov    -0x14(%rbp),%esi
mov    -0x18(%rbp),%edx
lea    0xebd(%rip),%rdi
call   1030 <printf@plt>
movl   $0x0,-0x4(%rbp)
jmp    12ab <kth_smallest_short+0x19b>
movw   $0x0,-0x1e(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0x20(%rbp)
movswl -0x1e(%rbp),%eax
movswl -0x20(%rbp),%ecx
cmp    %ecx,%eax
jge    129c <kth_smallest_short+0x18c>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x22(%rbp)
mov    -0x1e(%rbp),%ax
mov    %ax,-0x1a(%rbp)
mov    -0x20(%rbp),%ax
mov    %ax,-0x1c(%rbp)
jmp    1199 <kth_smallest_short+0x89>
mov    -0x10(%rbp),%rax
movswq -0x1a(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x22(%rbp),%ecx
cmp    %ecx,%eax
jge    11c3 <kth_smallest_short+0xb3>
mov    -0x1a(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x1a(%rbp)
jmp    1199 <kth_smallest_short+0x89>
jmp    11c8 <kth_smallest_short+0xb8>
movswl -0x22(%rbp),%eax
mov    -0x10(%rbp),%rcx
movswq -0x1c(%rbp),%rdx
movswl (%rcx,%rdx,2),%ecx
cmp    %ecx,%eax
jge    11f2 <kth_smallest_short+0xe2>
mov    -0x1c(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x1c(%rbp)
jmp    11c8 <kth_smallest_short+0xb8>
movswl -0x1a(%rbp),%eax
movswl -0x1c(%rbp),%ecx
cmp    %ecx,%eax
jg     1256 <kth_smallest_short+0x146>
mov    -0x10(%rbp),%rax
movswq -0x1a(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movswq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movswq -0x1a(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x24(%rbp),%dx
mov    -0x10(%rbp),%rax
movswq -0x1c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x1a(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x1a(%rbp)
mov    -0x1c(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x1c(%rbp)
jmp    125b <kth_smallest_short+0x14b>
movswl -0x1a(%rbp),%eax
movswl -0x1c(%rbp),%ecx
cmp    %ecx,%eax
jle    1194 <kth_smallest_short+0x84>
movswl -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1280 <kth_smallest_short+0x170>
mov    -0x1a(%rbp),%ax
mov    %ax,-0x1e(%rbp)
mov    -0x18(%rbp),%eax
movswl -0x1a(%rbp),%ecx
cmp    %ecx,%eax
jge    1297 <kth_smallest_short+0x187>
mov    -0x1c(%rbp),%ax
mov    %ax,-0x20(%rbp)
jmp    1164 <kth_smallest_short+0x54>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kth_smallest_short>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
test   %esi,%esi
jle    11cd <kth_smallest_short+0xbd>
test   %edx,%edx
js     11cd <kth_smallest_short+0xbd>
add    $0xffffffff,%esi
mov    %edx,%r8d
test   %si,%si
jle    11dd <kth_smallest_short+0xcd>
xor    %r9d,%r9d
jmp    115e <kth_smallest_short+0x4e>
nopl   0x0(%rax)
movswl %r11w,%eax
movswl %r10w,%ecx
cmp    %edx,%ecx
cmovl  %r11d,%r9d
cmp    %edx,%eax
cmovg  %r10d,%esi
cmp    %si,%r9w
jge    11dd <kth_smallest_short+0xcd>
movzwl (%rdi,%r8,2),%r14d
mov    %esi,%r10d
mov    %r9d,%r11d
jmp    1176 <kth_smallest_short+0x66>
nopl   0x0(%rax,%rax,1)
cmp    %r10w,%r11w
jg     1140 <kth_smallest_short+0x30>
mov    %r11d,%ecx
nopl   0x0(%rax)
movswq %cx,%r15
movzwl (%rdi,%r15,2),%r12d
add    $0x1,%ecx
cmp    %r14w,%r12w
jl     1180 <kth_smallest_short+0x70>
lea    -0x1(%rcx),%r11d
mov    %r10d,%eax
nopl   0x0(%rax)
movswq %ax,%rbx
movzwl (%rdi,%rbx,2),%ebp
add    $0xffffffff,%eax
cmp    %bp,%r14w
jl     11a0 <kth_smallest_short+0x90>
lea    0x1(%rax),%r10d
cmp    %r10w,%r11w
jg     1170 <kth_smallest_short+0x60>
mov    %bp,(%rdi,%r15,2)
mov    %r12w,(%rdi,%rbx,2)
mov    %eax,%r10d
mov    %ecx,%r11d
jmp    1170 <kth_smallest_short+0x60>
lea    0xe2c(%rip),%rdi
call   1030 <printf@plt>
xor    %eax,%eax
jmp    11e2 <kth_smallest_short+0xd2>
movswl (%rdi,%r8,2),%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [39 x i8] c"error: kth_smallest_short(n=%d, k=%d)\0A\00"
define i32 @kth_smallest_short(i16* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i16*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i16
%9 = alloca i16
%10 = alloca i16
%11 = alloca i16
%12 = alloca i16
%13 = alloca i16
store i16* %0, i16** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%14 = load i32, i32* %6
%15 = icmp sle i32 %14, 0
br i1 %15, label %19, label %16
16: ; preds = %3
%17 = load i32, i32* %7
%18 = icmp slt i32 %17, 0
br i1 %18, label %19, label %23
19: ; preds = %16, %3
%20 = load i32, i32* %6
%21 = load i32, i32* %7
%22 = call i32 @printf(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0), i32 %20, i32 %21)
store i32 0, i32* %4
br label %128
23: ; preds = %16
store i16 0, i16* %10
%24 = load i32, i32* %6
%25 = sub nsw i32 %24, 1
%26 = trunc i32 %25 to i16
store i16 %26, i16* %11
br label %27
27: ; preds = %120, %23
%28 = load i16, i16* %10
%29 = sext i16 %28 to i32
%30 = load i16, i16* %11
%31 = sext i16 %30 to i32
%32 = icmp slt i32 %29, %31
br i1 %32, label %33, label %121
33: ; preds = %27
%34 = load i16*, i16** %5
%35 = load i32, i32* %7
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i16, i16* %34, i64 %36
%38 = load i16, i16* %37
store i16 %38, i16* %12
%39 = load i16, i16* %10
store i16 %39, i16* %8
%40 = load i16, i16* %11
store i16 %40, i16* %9
br label %41
41: ; preds = %100, %33
br label %42
42: ; preds = %52, %41
%43 = load i16*, i16** %5
%44 = load i16, i16* %8
%45 = sext i16 %44 to i64
%46 = getelementptr inbounds i16, i16* %43, i64 %45
%47 = load i16, i16* %46
%48 = sext i16 %47 to i32
%49 = load i16, i16* %12
%50 = sext i16 %49 to i32
%51 = icmp slt i32 %48, %50
br i1 %51, label %52, label %55
52: ; preds = %42
%53 = load i16, i16* %8
%54 = add i16 %53, 1
store i16 %54, i16* %8
br label %42
55: ; preds = %42
br label %56
56: ; preds = %66, %55
%57 = load i16, i16* %12
%58 = sext i16 %57 to i32
%59 = load i16*, i16** %5
%60 = load i16, i16* %9
%61 = sext i16 %60 to i64
%62 = getelementptr inbounds i16, i16* %59, i64 %61
%63 = load i16, i16* %62
%64 = sext i16 %63 to i32
%65 = icmp slt i32 %58, %64
br i1 %65, label %66, label %69
66: ; preds = %56
%67 = load i16, i16* %9
%68 = add i16 %67, -1
store i16 %68, i16* %9
br label %56
69: ; preds = %56
%70 = load i16, i16* %8
%71 = sext i16 %70 to i32
%72 = load i16, i16* %9
%73 = sext i16 %72 to i32
%74 = icmp sle i32 %71, %73
br i1 %74, label %75, label %99
75: ; preds = %69
%76 = load i16*, i16** %5
%77 = load i16, i16* %8
%78 = sext i16 %77 to i64
%79 = getelementptr inbounds i16, i16* %76, i64 %78
%80 = load i16, i16* %79
store i16 %80, i16* %13
%81 = load i16*, i16** %5
%82 = load i16, i16* %9
%83 = sext i16 %82 to i64
%84 = getelementptr inbounds i16, i16* %81, i64 %83
%85 = load i16, i16* %84
%86 = load i16*, i16** %5
%87 = load i16, i16* %8
%88 = sext i16 %87 to i64
%89 = getelementptr inbounds i16, i16* %86, i64 %88
store i16 %85, i16* %89
%90 = load i16, i16* %13
%91 = load i16*, i16** %5
%92 = load i16, i16* %9
%93 = sext i16 %92 to i64
%94 = getelementptr inbounds i16, i16* %91, i64 %93
store i16 %90, i16* %94
%95 = load i16, i16* %8
%96 = add i16 %95, 1
store i16 %96, i16* %8
%97 = load i16, i16* %9
%98 = add i16 %97, -1
store i16 %98, i16* %9
br label %99
99: ; preds = %75, %69
br label %100
100: ; preds = %99
%101 = load i16, i16* %8
%102 = sext i16 %101 to i32
%103 = load i16, i16* %9
%104 = sext i16 %103 to i32
%105 = icmp sle i32 %102, %104
br i1 %105, label %41, label %106
106: ; preds = %100
%107 = load i16, i16* %9
%108 = sext i16 %107 to i32
%109 = load i32, i32* %7
%110 = icmp slt i32 %108, %109
br i1 %110, label %111, label %113
111: ; preds = %106
%112 = load i16, i16* %8
store i16 %112, i16* %10
br label %113
113: ; preds = %111, %106
%114 = load i32, i32* %7
%115 = load i16, i16* %8
%116 = sext i16 %115 to i32
%117 = icmp slt i32 %114, %116
br i1 %117, label %118, label %120
118: ; preds = %113
%119 = load i16, i16* %9
store i16 %119, i16* %11
br label %120
120: ; preds = %118, %113
br label %27
121: ; preds = %27
%122 = load i16*, i16** %5
%123 = load i32, i32* %7
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i16, i16* %122, i64 %124
%126 = load i16, i16* %125
%127 = sext i16 %126 to i32
store i32 %127, i32* %4
br label %128
128: ; preds = %121, %19
%129 = load i32, i32* %4
ret i32 %129
}

LLVM IR (-O2):
@.str = [39 x i8] c"error: kth_smallest_short(n=%d, k=%d)\0A\00"
define i32 @kth_smallest_short(i16* nocapture %0, i32 %1, i32 %2) {
%4 = icmp slt i32 %1, 1
%5 = icmp slt i32 %2, 0
%6 = or i1 %4, %5
br i1 %6, label %7, label %9
7: ; preds = %3
%8 = tail call i32 @printf(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0), i32 %1, i32 %2)
br label %59
9: ; preds = %3
%10 = trunc i32 %1 to i16
%11 = add i16 %10, -1
%12 = icmp sgt i16 %11, 0
%13 = zext i32 %2 to i64
br i1 %12, label %14, label %55
14: ; preds = %9
%15 = getelementptr inbounds i16, i16* %0, i64 %13
br label %16
16: ; preds = %14, %47
%17 = phi i16 [ %11, %14 ], [ %53, %47 ]
%18 = phi i16 [ 0, %14 ], [ %51, %47 ]
%19 = load i16, i16* %15
br label %20
20: ; preds = %43, %16
%21 = phi i16 [ %17, %16 ], [ %44, %43 ]
%22 = phi i16 [ %18, %16 ], [ %45, %43 ]
br label %23
23: ; preds = %23, %20
%24 = phi i16 [ %22, %20 ], [ %29, %23 ]
%25 = sext i16 %24 to i64
%26 = getelementptr inbounds i16, i16* %0, i64 %25
%27 = load i16, i16* %26
%28 = icmp slt i16 %27, %19
%29 = add i16 %24, 1
br i1 %28, label %23, label %30
30: ; preds = %23
%31 = getelementptr inbounds i16, i16* %0, i64 %25
br label %32
32: ; preds = %32, %30
%33 = phi i16 [ %38, %32 ], [ %21, %30 ]
%34 = sext i16 %33 to i64
%35 = getelementptr inbounds i16, i16* %0, i64 %34
%36 = load i16, i16* %35
%37 = icmp slt i16 %19, %36
%38 = add i16 %33, -1
br i1 %37, label %32, label %39
39: ; preds = %32
%40 = icmp sgt i16 %24, %33
br i1 %40, label %43, label %41
41: ; preds = %39
%42 = getelementptr inbounds i16, i16* %0, i64 %34
store i16 %36, i16* %31
store i16 %27, i16* %42
br label %43
43: ; preds = %39, %41
%44 = phi i16 [ %38, %41 ], [ %33, %39 ]
%45 = phi i16 [ %29, %41 ], [ %24, %39 ]
%46 = icmp sgt i16 %45, %44
br i1 %46, label %47, label %20
47: ; preds = %43
%48 = sext i16 %45 to i32
%49 = sext i16 %44 to i32
%50 = icmp slt i32 %49, %2
%51 = select i1 %50, i16 %45, i16 %18
%52 = icmp sgt i32 %48, %2
%53 = select i1 %52, i16 %44, i16 %17
%54 = icmp slt i16 %51, %53
br i1 %54, label %16, label %55
55: ; preds = %47, %9
%56 = getelementptr inbounds i16, i16* %0, i64 %13
%57 = load i16, i16* %56
%58 = sext i16 %57 to i32
br label %59
59: ; preds = %55, %7
%60 = phi i32 [ 0, %7 ], [ %58, %55 ]
ret i32 %60
}