void minimax(int *arr, int size, int *min, int *max) {
  int i, mini, maxi;
  mini = *arr;
  maxi = *arr;
  arr++;
  for (i = 1; i < size; i++) {
    if (*arr < mini) {
      mini = *arr;
    }
    if (*arr > maxi) {
      maxi = *arr;
    }
    arr++;
  }
  *min = mini;
  *max = maxi;
}


x86 assembly (clang, -O0):
<minimax>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    118e <minimax+0x8e>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
cmp    -0x28(%rbp),%eax
jge    115c <minimax+0x5c>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jle    1174 <minimax+0x74>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1138 <minimax+0x38>
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<minimax>:
mov    (%rdi),%r11d
cmp    $0x2,%esi
jl     111f <minimax+0x1f>
lea    -0x2(%rsi),%r9d
mov    $0x1,%eax
cmp    $0x7,%r9d
jae    1127 <minimax+0x27>
mov    %r11d,%r10d
jmp    1379 <minimax+0x279>
mov    %r11d,%r10d
jmp    139c <minimax+0x29c>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
movd   %r11d,%xmm0
pshufd $0x0,%xmm0,%xmm10
lea    -0x8(%r8),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rax,%rax
je     13a3 <minimax+0x2a3>
mov    %r10,%r11
and    $0xfffffffffffffffe,%r11
xor    %eax,%eax
movdqa %xmm10,%xmm1
movdqa %xmm10,%xmm3
movdqa %xmm10,%xmm2
nopl   (%rax)
movdqu 0x4(%rdi,%rax,4),%xmm5
movdqu 0x14(%rdi,%rax,4),%xmm0
movdqu 0x24(%rdi,%rax,4),%xmm9
movdqu 0x34(%rdi,%rax,4),%xmm8
movdqa %xmm3,%xmm6
pcmpgtd %xmm5,%xmm6
movdqa %xmm5,%xmm4
pand   %xmm6,%xmm4
pandn  %xmm3,%xmm6
por    %xmm4,%xmm6
movdqa %xmm2,%xmm7
pcmpgtd %xmm0,%xmm7
movdqa %xmm0,%xmm3
pand   %xmm7,%xmm3
pandn  %xmm2,%xmm7
por    %xmm3,%xmm7
movdqa %xmm5,%xmm4
pcmpgtd %xmm10,%xmm4
pand   %xmm4,%xmm5
pandn  %xmm10,%xmm4
por    %xmm5,%xmm4
movdqa %xmm0,%xmm5
pcmpgtd %xmm1,%xmm5
pand   %xmm5,%xmm0
pandn  %xmm1,%xmm5
por    %xmm0,%xmm5
movdqa %xmm6,%xmm3
pcmpgtd %xmm9,%xmm3
movdqa %xmm9,%xmm0
pand   %xmm3,%xmm0
pandn  %xmm6,%xmm3
por    %xmm0,%xmm3
movdqa %xmm7,%xmm2
pcmpgtd %xmm8,%xmm2
movdqa %xmm8,%xmm0
pand   %xmm2,%xmm0
pandn  %xmm7,%xmm2
por    %xmm0,%xmm2
movdqa %xmm9,%xmm10
pcmpgtd %xmm4,%xmm10
pand   %xmm10,%xmm9
pandn  %xmm4,%xmm10
por    %xmm9,%xmm10
movdqa %xmm8,%xmm1
pcmpgtd %xmm5,%xmm1
pand   %xmm1,%xmm8
pandn  %xmm5,%xmm1
por    %xmm8,%xmm1
add    $0x10,%rax
add    $0xfffffffffffffffe,%r11
jne    1170 <minimax+0x70>
test   $0x1,%r10b
je     12d3 <minimax+0x1d3>
movdqu 0x4(%rdi,%rax,4),%xmm0
movdqu 0x14(%rdi,%rax,4),%xmm4
movdqa %xmm3,%xmm5
pcmpgtd %xmm0,%xmm5
movdqa %xmm0,%xmm6
pand   %xmm5,%xmm6
pandn  %xmm3,%xmm5
por    %xmm6,%xmm5
movdqa %xmm2,%xmm6
pcmpgtd %xmm4,%xmm6
movdqa %xmm4,%xmm3
pand   %xmm6,%xmm3
pandn  %xmm2,%xmm6
por    %xmm3,%xmm6
movdqa %xmm0,%xmm7
pcmpgtd %xmm10,%xmm7
pand   %xmm7,%xmm0
pandn  %xmm10,%xmm7
por    %xmm0,%xmm7
movdqa %xmm4,%xmm0
pcmpgtd %xmm1,%xmm0
pand   %xmm0,%xmm4
pandn  %xmm1,%xmm0
por    %xmm4,%xmm0
movdqa %xmm5,%xmm3
movdqa %xmm6,%xmm2
movdqa %xmm7,%xmm10
movdqa %xmm0,%xmm1
movdqa %xmm2,%xmm0
pcmpgtd %xmm3,%xmm0
pand   %xmm0,%xmm3
pandn  %xmm2,%xmm0
por    %xmm3,%xmm0
pshufd $0xee,%xmm0,%xmm2
movdqa %xmm2,%xmm3
pcmpgtd %xmm0,%xmm3
pand   %xmm3,%xmm0
pandn  %xmm2,%xmm3
por    %xmm0,%xmm3
pshufd $0x55,%xmm3,%xmm0
movdqa %xmm0,%xmm2
pcmpgtd %xmm3,%xmm2
pand   %xmm2,%xmm3
pandn  %xmm0,%xmm2
por    %xmm3,%xmm2
movd   %xmm2,%r10d
movdqa %xmm10,%xmm0
pcmpgtd %xmm1,%xmm0
pand   %xmm0,%xmm10
pandn  %xmm1,%xmm0
por    %xmm10,%xmm0
pshufd $0xee,%xmm0,%xmm1
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm0
pandn  %xmm1,%xmm2
por    %xmm0,%xmm2
pshufd $0x55,%xmm2,%xmm0
movdqa %xmm2,%xmm1
pcmpgtd %xmm0,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm0,%xmm1
por    %xmm2,%xmm1
movd   %xmm1,%r11d
cmp    %r8,%r9
je     139c <minimax+0x29c>
lea    (%rdi,%r8,4),%rdi
lea    0x1(%r8),%eax
sub    %eax,%esi
xor    %r8d,%r8d
xchg   %ax,%ax
mov    0x4(%rdi,%r8,4),%eax
cmp    %r10d,%eax
cmovl  %eax,%r10d
cmp    %r11d,%eax
cmovg  %eax,%r11d
add    $0x1,%r8
cmp    %r8d,%esi
jne    1380 <minimax+0x280>
mov    %r10d,(%rdx)
mov    %r11d,(%rcx)
ret
xor    %eax,%eax
movdqa %xmm10,%xmm1
movdqa %xmm10,%xmm3
movdqa %xmm10,%xmm2
test   $0x1,%r10b
jne    125c <minimax+0x15c>
jmp    12d3 <minimax+0x1d3>

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

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