#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 */
short SHRT_MAX;
short SHRT_MIN;
void shortminmax(short *in, size_t size, short *min, short *max) {
  short tmin = SHRT_MAX, tmax = SHRT_MIN, *fpt;
  {
    fpt = in + size;
    do {
      if (*in > tmax)
        tmax = *in;
      if (*in < tmin)
        tmin = *in;
    } while (++in < fpt);
    *max = tmax;
    *min = tmin;
  }
}


x86 assembly (clang, -O0):
<shortminmax>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    0x2ebd(%rip),%rax
mov    (%rax),%ax
mov    %ax,-0x22(%rbp)
mov    0x2eb7(%rip),%rax
mov    (%rax),%ax
mov    %ax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
movswl (%rax),%eax
movswl -0x24(%rbp),%ecx
cmp    %ecx,%eax
jle    1161 <shortminmax+0x61>
mov    -0x8(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movswl (%rax),%eax
movswl -0x22(%rbp),%ecx
cmp    %ecx,%eax
jge    117f <shortminmax+0x7f>
mov    -0x8(%rbp),%rax
mov    (%rax),%ax
mov    %ax,-0x22(%rbp)
jmp    1184 <shortminmax+0x84>
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
cmp    -0x30(%rbp),%rax
jb     1143 <shortminmax+0x43>
mov    -0x24(%rbp),%cx
mov    -0x20(%rbp),%rax
mov    %cx,(%rax)
mov    -0x22(%rbp),%cx
mov    -0x18(%rbp),%rax
mov    %cx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<shortminmax>:
push   %rbx
mov    0x2ed0(%rip),%rax
movzwl (%rax),%eax
mov    0x2ece(%rip),%r8
lea    (%rdi,%rsi,2),%r11
lea    0x2(%rdi),%r9
cmp    %r9,%r11
cmova  %r11,%r9
movzwl (%r8),%ebx
mov    %rdi,%r10
not    %r10
add    %r9,%r10
cmp    $0x1e,%r10
jb     1250 <shortminmax+0x150>
shr    %r10
add    $0x1,%r10
mov    %r10,%r8
and    $0xfffffffffffffff0,%r8
movd   %eax,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
movd   %ebx,%xmm1
pshuflw $0x0,%xmm1,%xmm1
pshufd $0x0,%xmm1,%xmm1
lea    -0x10(%r8),%rax
mov    %rax,%r9
shr    $0x4,%r9
add    $0x1,%r9
test   %rax,%rax
je     1270 <shortminmax+0x170>
mov    %r9,%rax
and    $0xfffffffffffffffe,%rax
xor    %esi,%esi
movdqa %xmm0,%xmm2
movdqa %xmm1,%xmm3
nopl   0x0(%rax,%rax,1)
movdqu (%rdi,%rsi,2),%xmm4
movdqu 0x10(%rdi,%rsi,2),%xmm5
movdqu 0x20(%rdi,%rsi,2),%xmm6
movdqu 0x30(%rdi,%rsi,2),%xmm7
pmaxsw %xmm4,%xmm1
pmaxsw %xmm5,%xmm3
pminsw %xmm4,%xmm0
pminsw %xmm5,%xmm2
pmaxsw %xmm6,%xmm1
pmaxsw %xmm7,%xmm3
pminsw %xmm6,%xmm0
pminsw %xmm7,%xmm2
add    $0x20,%rsi
add    $0xfffffffffffffffe,%rax
jne    1190 <shortminmax+0x90>
test   $0x1,%r9b
je     11f2 <shortminmax+0xf2>
movdqu (%rdi,%rsi,2),%xmm4
movdqu 0x10(%rdi,%rsi,2),%xmm5
pmaxsw %xmm4,%xmm1
pmaxsw %xmm5,%xmm3
pminsw %xmm4,%xmm0
pminsw %xmm5,%xmm2
pminsw %xmm2,%xmm0
pmaxsw %xmm3,%xmm1
pshufd $0xee,%xmm1,%xmm2
pmaxsw %xmm1,%xmm2
pshufd $0x55,%xmm2,%xmm1
pmaxsw %xmm2,%xmm1
movdqa %xmm1,%xmm2
psrld  $0x10,%xmm2
pmaxsw %xmm1,%xmm2
movd   %xmm2,%ebx
pshufd $0xee,%xmm0,%xmm1
pminsw %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
pminsw %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrld  $0x10,%xmm1
pminsw %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r8,%r10
je     1268 <shortminmax+0x168>
lea    (%rdi,%r8,2),%rdi
nopl   0x0(%rax)
movzwl (%rdi),%esi
cmp    %bx,%si
cmovg  %esi,%ebx
cmp    %ax,%si
cmovl  %esi,%eax
add    $0x2,%rdi
cmp    %r11,%rdi
jb     1250 <shortminmax+0x150>
mov    %bx,(%rcx)
mov    %ax,(%rdx)
pop    %rbx
ret
xor    %esi,%esi
movdqa %xmm0,%xmm2
movdqa %xmm1,%xmm3
test   $0x1,%r9b
jne    11d7 <shortminmax+0xd7>
jmp    11f2 <shortminmax+0xf2>

LLVM IR (-O0):
@SHRT_MAX = global i16 0
@SHRT_MIN = global i16 0
define void @shortminmax(i16* %0, i64 %1, i16* %2, i16* %3) {
%5 = alloca i16*
%6 = alloca i64
%7 = alloca i16*
%8 = alloca i16*
%9 = alloca i16
%10 = alloca i16
%11 = alloca i16*
store i16* %0, i16** %5
store i64 %1, i64* %6
store i16* %2, i16** %7
store i16* %3, i16** %8
%12 = load i16, i16* @SHRT_MAX
store i16 %12, i16* %9
%13 = load i16, i16* @SHRT_MIN
store i16 %13, i16* %10
%14 = load i16*, i16** %5
%15 = load i64, i64* %6
%16 = getelementptr inbounds i16, i16* %14, i64 %15
store i16* %16, i16** %11
br label %17
17: ; preds = %38, %4
%18 = load i16*, i16** %5
%19 = load i16, i16* %18
%20 = sext i16 %19 to i32
%21 = load i16, i16* %10
%22 = sext i16 %21 to i32
%23 = icmp sgt i32 %20, %22
br i1 %23, label %24, label %27
24: ; preds = %17
%25 = load i16*, i16** %5
%26 = load i16, i16* %25
store i16 %26, i16* %10
br label %27
27: ; preds = %24, %17
%28 = load i16*, i16** %5
%29 = load i16, i16* %28
%30 = sext i16 %29 to i32
%31 = load i16, i16* %9
%32 = sext i16 %31 to i32
%33 = icmp slt i32 %30, %32
br i1 %33, label %34, label %37
34: ; preds = %27
%35 = load i16*, i16** %5
%36 = load i16, i16* %35
store i16 %36, i16* %9
br label %37
37: ; preds = %34, %27
br label %38
38: ; preds = %37
%39 = load i16*, i16** %5
%40 = getelementptr inbounds i16, i16* %39, i32 1
store i16* %40, i16** %5
%41 = load i16*, i16** %11
%42 = icmp ult i16* %40, %41
br i1 %42, label %17, label %43
43: ; preds = %38
%44 = load i16, i16* %10
%45 = load i16*, i16** %8
store i16 %44, i16* %45
%46 = load i16, i16* %9
%47 = load i16*, i16** %7
store i16 %46, i16* %47
ret void
}

LLVM IR (-O2):
@SHRT_MAX = global i16 0
@SHRT_MIN = global i16 0
define void @shortminmax(i16* %0, i64 %1, i16* nocapture writeonly %2, i16* nocapture writeonly %3) {
%5 = ptrtoint i16* %0 to i64
%6 = load i16, i16* @SHRT_MAX
%7 = load i16, i16* @SHRT_MIN
%8 = getelementptr inbounds i16, i16* %0, i64 %1
%9 = shl i64 %1, 1
%10 = add i64 %9, %5
%11 = add i64 %5, 2
%12 = call i64 @llvm.umax.i64(i64 %10, i64 %11)
%13 = xor i64 %5, -1
%14 = add i64 %12, %13
%15 = lshr i64 %14, 1
%16 = add nuw i64 %15, 1
%17 = icmp ult i64 %14, 30
br i1 %17, label %109, label %18
18: ; preds = %4
%19 = and i64 %16, -16
%20 = getelementptr i16, i16* %0, i64 %19
%21 = insertelement <8 x i16> poison, i16 %6, i64 0
%22 = shufflevector <8 x i16> %21, <8 x i16> poison, <8 x i32> zeroinitializer
%23 = insertelement <8 x i16> poison, i16 %7, i64 0
%24 = shufflevector <8 x i16> %23, <8 x i16> poison, <8 x i32> zeroinitializer
%25 = add i64 %19, -16
%26 = lshr exact i64 %25, 4
%27 = add nuw nsw i64 %26, 1
%28 = and i64 %27, 1
%29 = icmp eq i64 %25, 0
br i1 %29, label %71, label %30
30: ; preds = %18
%31 = and i64 %27, 2305843009213693950
br label %32
32: ; preds = %32, %30
%33 = phi i64 [ 0, %30 ], [ %68, %32 ]
%34 = phi <8 x i16> [ %22, %30 ], [ %66, %32 ]
%35 = phi <8 x i16> [ %22, %30 ], [ %67, %32 ]
%36 = phi <8 x i16> [ %24, %30 ], [ %62, %32 ]
%37 = phi <8 x i16> [ %24, %30 ], [ %63, %32 ]
%38 = phi i64 [ 0, %30 ], [ %69, %32 ]
%39 = getelementptr i16, i16* %0, i64 %33
%40 = bitcast i16* %39 to <8 x i16>*
%41 = load <8 x i16>, <8 x i16>* %40
%42 = getelementptr i16, i16* %39, i64 8
%43 = bitcast i16* %42 to <8 x i16>*
%44 = load <8 x i16>, <8 x i16>* %43
%45 = icmp sgt <8 x i16> %41, %36
%46 = icmp sgt <8 x i16> %44, %37
%47 = select <8 x i1> %45, <8 x i16> %41, <8 x i16> %36
%48 = select <8 x i1> %46, <8 x i16> %44, <8 x i16> %37
%49 = icmp slt <8 x i16> %41, %34
%50 = icmp slt <8 x i16> %44, %35
%51 = select <8 x i1> %49, <8 x i16> %41, <8 x i16> %34
%52 = select <8 x i1> %50, <8 x i16> %44, <8 x i16> %35
%53 = or i64 %33, 16
%54 = getelementptr i16, i16* %0, i64 %53
%55 = bitcast i16* %54 to <8 x i16>*
%56 = load <8 x i16>, <8 x i16>* %55
%57 = getelementptr i16, i16* %54, i64 8
%58 = bitcast i16* %57 to <8 x i16>*
%59 = load <8 x i16>, <8 x i16>* %58
%60 = icmp sgt <8 x i16> %56, %47
%61 = icmp sgt <8 x i16> %59, %48
%62 = select <8 x i1> %60, <8 x i16> %56, <8 x i16> %47
%63 = select <8 x i1> %61, <8 x i16> %59, <8 x i16> %48
%64 = icmp slt <8 x i16> %56, %51
%65 = icmp slt <8 x i16> %59, %52
%66 = select <8 x i1> %64, <8 x i16> %56, <8 x i16> %51
%67 = select <8 x i1> %65, <8 x i16> %59, <8 x i16> %52
%68 = add nuw i64 %33, 32
%69 = add i64 %38, 2
%70 = icmp eq i64 %69, %31
br i1 %70, label %71, label %32
71: ; preds = %32, %18
%72 = phi <8 x i16> [ undef, %18 ], [ %62, %32 ]
%73 = phi <8 x i16> [ undef, %18 ], [ %63, %32 ]
%74 = phi <8 x i16> [ undef, %18 ], [ %66, %32 ]
%75 = phi <8 x i16> [ undef, %18 ], [ %67, %32 ]
%76 = phi i64 [ 0, %18 ], [ %68, %32 ]
%77 = phi <8 x i16> [ %22, %18 ], [ %66, %32 ]
%78 = phi <8 x i16> [ %22, %18 ], [ %67, %32 ]
%79 = phi <8 x i16> [ %24, %18 ], [ %62, %32 ]
%80 = phi <8 x i16> [ %24, %18 ], [ %63, %32 ]
%81 = icmp eq i64 %28, 0
br i1 %81, label %97, label %82
82: ; preds = %71
%83 = getelementptr i16, i16* %0, i64 %76
%84 = bitcast i16* %83 to <8 x i16>*
%85 = load <8 x i16>, <8 x i16>* %84
%86 = getelementptr i16, i16* %83, i64 8
%87 = bitcast i16* %86 to <8 x i16>*
%88 = load <8 x i16>, <8 x i16>* %87
%89 = icmp sgt <8 x i16> %85, %79
%90 = icmp sgt <8 x i16> %88, %80
%91 = select <8 x i1> %89, <8 x i16> %85, <8 x i16> %79
%92 = select <8 x i1> %90, <8 x i16> %88, <8 x i16> %80
%93 = icmp slt <8 x i16> %85, %77
%94 = icmp slt <8 x i16> %88, %78
%95 = select <8 x i1> %93, <8 x i16> %85, <8 x i16> %77
%96 = select <8 x i1> %94, <8 x i16> %88, <8 x i16> %78
br label %97
97: ; preds = %71, %82
%98 = phi <8 x i16> [ %72, %71 ], [ %91, %82 ]
%99 = phi <8 x i16> [ %73, %71 ], [ %92, %82 ]
%100 = phi <8 x i16> [ %74, %71 ], [ %95, %82 ]
%101 = phi <8 x i16> [ %75, %71 ], [ %96, %82 ]
%102 = icmp sgt <8 x i16> %98, %99
%103 = select <8 x i1> %102, <8 x i16> %98, <8 x i16> %99
%104 = call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> %103)
%105 = icmp slt <8 x i16> %100, %101
%106 = select <8 x i1> %105, <8 x i16> %100, <8 x i16> %101
%107 = call i16 @llvm.vector.reduce.smin.v8i16(<8 x i16> %106)
%108 = icmp eq i64 %16, %19
br i1 %108, label %124, label %109
109: ; preds = %4, %97
%110 = phi i16 [ %6, %4 ], [ %107, %97 ]
%111 = phi i16 [ %7, %4 ], [ %104, %97 ]
%112 = phi i16* [ %0, %4 ], [ %20, %97 ]
br label %113
113: ; preds = %109, %113
%114 = phi i16 [ %121, %113 ], [ %110, %109 ]
%115 = phi i16 [ %119, %113 ], [ %111, %109 ]
%116 = phi i16* [ %122, %113 ], [ %112, %109 ]
%117 = load i16, i16* %116
%118 = icmp sgt i16 %117, %115
%119 = select i1 %118, i16 %117, i16 %115
%120 = icmp slt i16 %117, %114
%121 = select i1 %120, i16 %117, i16 %114
%122 = getelementptr inbounds i16, i16* %116, i64 1
%123 = icmp ult i16* %122, %8
br i1 %123, label %113, label %124
124: ; preds = %113, %97
%125 = phi i16 [ %104, %97 ], [ %119, %113 ]
%126 = phi i16 [ %107, %97 ], [ %121, %113 ]
store i16 %125, i16* %3
store i16 %126, i16* %2
ret void
}