void max_min_value(int *number) {
  int *p, *max, *min;
  max = min = number;
  for (p = number + 1; p < number + 10; p++) {
    if (*max < *p)
      max = p;
    else if (*min > *p)
      min = p;
  }
  int temp;
  temp = *min, *min = number[0], number[0] = temp;
  if (max == number)
    max = min;
  temp = *max, *max = number[9], number[9] = temp;
}


x86 assembly (clang, -O0):
<max_min_value>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x8(%rbp),%rcx
add    $0x28,%rcx
cmp    %rcx,%rax
jae    1189 <max_min_value+0x89>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jge    1154 <max_min_value+0x54>
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
jmp    1173 <max_min_value+0x73>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%eax
jle    116e <max_min_value+0x6e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    1173 <max_min_value+0x73>
jmp    1178 <max_min_value+0x78>
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    1120 <max_min_value+0x20>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
cmp    -0x8(%rbp),%rax
jne    11bd <max_min_value+0xbd>
mov    -0x20(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    0x24(%rax),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,0x24(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<max_min_value>:
lea    0x4(%rdi),%r10
mov    (%rdi),%r8d
mov    0x4(%rdi),%esi
cmp    %esi,%r8d
mov    %rdi,%rax
cmovg  %r10,%rax
cmovge %r8d,%esi
cmovge %rdi,%r10
cmovl  %rdi,%rax
lea    0x8(%rdi),%rcx
mov    0x8(%rdi),%edx
cmp    %edx,%esi
jge    1130 <max_min_value+0x30>
mov    %rcx,%r10
jmp    1139 <max_min_value+0x39>
cmp    %edx,(%rax)
cmovg  %rcx,%rax
mov    (%r10),%edx
lea    0xc(%rdi),%rcx
mov    0xc(%rdi),%esi
cmp    %esi,%edx
jge    114b <max_min_value+0x4b>
mov    %esi,%edx
mov    %rcx,%r10
jmp    1151 <max_min_value+0x51>
cmp    %esi,(%rax)
cmovg  %rcx,%rax
lea    0x10(%rdi),%r9
mov    0x10(%rdi),%ecx
cmp    %ecx,%edx
jge    1161 <max_min_value+0x61>
mov    %r9,%r10
jmp    116a <max_min_value+0x6a>
cmp    %ecx,(%rax)
cmovg  %r9,%rax
mov    (%r10),%ecx
lea    0x14(%rdi),%rsi
mov    0x14(%rdi),%edx
cmp    %edx,%ecx
jge    117c <max_min_value+0x7c>
mov    %edx,%ecx
mov    %rsi,%r10
jmp    1182 <max_min_value+0x82>
cmp    %edx,(%rax)
cmovg  %rsi,%rax
lea    0x18(%rdi),%r9
mov    0x18(%rdi),%esi
cmp    %esi,%ecx
jge    1192 <max_min_value+0x92>
mov    %r9,%r10
jmp    119b <max_min_value+0x9b>
cmp    %esi,(%rax)
cmovg  %r9,%rax
mov    (%r10),%esi
lea    0x1c(%rdi),%rcx
mov    0x1c(%rdi),%edx
cmp    %edx,%esi
jge    11ad <max_min_value+0xad>
mov    %edx,%esi
mov    %rcx,%r10
jmp    11b3 <max_min_value+0xb3>
cmp    %edx,(%rax)
cmovg  %rcx,%rax
lea    0x20(%rdi),%r9
mov    0x20(%rdi),%ecx
cmp    %ecx,%esi
jge    11c3 <max_min_value+0xc3>
mov    %r9,%r10
jmp    11cc <max_min_value+0xcc>
cmp    %ecx,(%rax)
cmovg  %r9,%rax
mov    (%r10),%ecx
lea    0x24(%rdi),%rsi
mov    0x24(%rdi),%edx
cmp    %edx,%ecx
jge    11dc <max_min_value+0xdc>
mov    %rsi,%r10
jmp    11e2 <max_min_value+0xe2>
cmp    %edx,(%rax)
cmovg  %rsi,%rax
mov    (%rax),%ecx
mov    %r8d,(%rax)
mov    %ecx,(%rdi)
cmp    %rdi,%r10
cmove  %rax,%r10
mov    (%r10),%eax
mov    0x24(%rdi),%ecx
mov    %ecx,(%r10)
mov    %eax,0x24(%rdi)
ret

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

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