float fun(int a[], int *max, int *min) {
  int i;
  float aver = 0;
  aver = *max = *min = a[0];
  for (i = 1; i < 10; i++) {
    if (*max < a[i])
      *max = a[i];
    if (*min > a[i])
      *min = a[i];
    aver += a[i];
  }
  return aver / 10;
}


x86 assembly (clang, -O0):
<fun>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    -0x18(%rbp),%rcx
mov    %eax,(%rcx)
mov    -0x10(%rbp),%rcx
mov    %eax,(%rcx)
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
movl   $0x1,-0x1c(%rbp)
cmpl   $0xa,-0x1c(%rbp)
jge    11b9 <fun+0xb9>
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x8(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jge    116c <fun+0x6c>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    -0x8(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jle    1194 <fun+0x94>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cvtsi2ssl (%rax,%rcx,4),%xmm0
addss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    113a <fun+0x3a>
movss  -0x20(%rbp),%xmm0
movss  0xe3a(%rip),%xmm1
divss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<fun>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    (%rdi),%r8d
mov    %r8d,(%rdx)
mov    %r8d,(%rsi)
mov    0x4(%rdi),%r9d
cmp    %r9d,%r8d
jge    1128 <fun+0x28>
mov    %r9d,(%rsi)
mov    %r9d,%ecx
mov    0x4(%rdi),%r9d
jmp    112b <fun+0x2b>
mov    %r8d,%ecx
mov    (%rdx),%eax
cmp    %r9d,%eax
jle    113e <fun+0x3e>
mov    %r9d,(%rdx)
mov    %r9d,%eax
mov    0x4(%rdi),%r9d
mov    (%rsi),%ecx
mov    0x8(%rdi),%r10d
cmp    %r10d,%ecx
jge    1153 <fun+0x53>
mov    %r10d,(%rsi)
mov    (%rdx),%eax
mov    %r10d,%ecx
mov    0x8(%rdi),%r10d
cmp    %r10d,%eax
jle    1164 <fun+0x64>
mov    %r10d,(%rdx)
mov    %r10d,%eax
mov    0x8(%rdi),%r10d
mov    (%rsi),%ecx
mov    0xc(%rdi),%r11d
cmp    %r11d,%ecx
jge    1179 <fun+0x79>
mov    %r11d,(%rsi)
mov    (%rdx),%eax
mov    %r11d,%ecx
mov    0xc(%rdi),%r11d
cmp    %r11d,%eax
jle    118a <fun+0x8a>
mov    %r11d,(%rdx)
mov    %r11d,%eax
mov    0xc(%rdi),%r11d
mov    (%rsi),%ecx
mov    0x10(%rdi),%r14d
cmp    %r14d,%ecx
jge    119f <fun+0x9f>
mov    %r14d,(%rsi)
mov    (%rdx),%eax
mov    %r14d,%ecx
mov    0x10(%rdi),%r14d
cmp    %r14d,%eax
jle    11b0 <fun+0xb0>
mov    %r14d,(%rdx)
mov    %r14d,%eax
mov    0x10(%rdi),%r14d
mov    (%rsi),%ecx
mov    0x14(%rdi),%r15d
cmp    %r15d,%ecx
jge    11c5 <fun+0xc5>
mov    %r15d,(%rsi)
mov    (%rdx),%eax
mov    %r15d,%ecx
mov    0x14(%rdi),%r15d
cmp    %r15d,%eax
jle    11d6 <fun+0xd6>
mov    %r15d,(%rdx)
mov    %r15d,%eax
mov    0x14(%rdi),%r15d
mov    (%rsi),%ecx
mov    0x18(%rdi),%r12d
cmp    %r12d,%ecx
jge    11eb <fun+0xeb>
mov    %r12d,(%rsi)
mov    (%rdx),%eax
mov    %r12d,%ecx
mov    0x18(%rdi),%r12d
cmp    %r12d,%eax
jle    11fc <fun+0xfc>
mov    %r12d,(%rdx)
mov    %r12d,%eax
mov    0x18(%rdi),%r12d
mov    (%rsi),%ecx
mov    0x1c(%rdi),%r13d
cmp    %r13d,%ecx
jge    1211 <fun+0x111>
mov    %r13d,(%rsi)
mov    (%rdx),%eax
mov    %r13d,%ecx
mov    0x1c(%rdi),%r13d
cmp    %r13d,%eax
jle    1222 <fun+0x122>
mov    %r13d,(%rdx)
mov    %r13d,%eax
mov    0x1c(%rdi),%r13d
mov    (%rsi),%ecx
mov    0x20(%rdi),%ebx
cmp    %ebx,%ecx
jge    1232 <fun+0x132>
mov    %ebx,(%rsi)
mov    (%rdx),%eax
mov    %ebx,%ecx
mov    0x20(%rdi),%ebx
cmp    %ebx,%eax
jle    123f <fun+0x13f>
mov    %ebx,(%rdx)
mov    %ebx,%eax
mov    0x20(%rdi),%ebx
mov    (%rsi),%ecx
mov    0x24(%rdi),%ebp
cmp    %ebp,%ecx
jge    124d <fun+0x14d>
mov    %ebp,(%rsi)
mov    (%rdx),%eax
mov    0x24(%rdi),%ebp
cmp    %ebp,%eax
jle    1256 <fun+0x156>
mov    %ebp,(%rdx)
mov    0x24(%rdi),%ebp
cvtsi2ss %r8d,%xmm0
cvtsi2ss %r9d,%xmm1
cvtsi2ss %r10d,%xmm2
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %r11d,%xmm0
addss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsi2ss %r14d,%xmm1
addss  %xmm2,%xmm0
xorps  %xmm2,%xmm2
cvtsi2ss %r15d,%xmm2
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %r12d,%xmm0
addss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsi2ss %r13d,%xmm1
addss  %xmm2,%xmm0
xorps  %xmm2,%xmm2
cvtsi2ss %ebx,%xmm2
addss  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %ebp,%xmm0
addss  %xmm1,%xmm2
addss  %xmm2,%xmm0
divss  0xd39(%rip),%xmm0
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define float @fun(i32* nocapture %0, i32* nocapture %1, i32* nocapture %2) {
%4 = load i32, i32* %0
store i32 %4, i32* %2
store i32 %4, i32* %1
%5 = getelementptr inbounds i32, i32* %0, i64 1
%6 = load i32, i32* %5
%7 = icmp slt i32 %4, %6
br i1 %7, label %8, label %10
8: ; preds = %3
store i32 %6, i32* %1
%9 = load i32, i32* %5
br label %10
10: ; preds = %8, %3
%11 = phi i32 [ %6, %8 ], [ %4, %3 ]
%12 = phi i32 [ %9, %8 ], [ %6, %3 ]
%13 = load i32, i32* %2
%14 = icmp sgt i32 %13, %12
br i1 %14, label %15, label %18
15: ; preds = %10
store i32 %12, i32* %2
%16 = load i32, i32* %5
%17 = load i32, i32* %1
br label %18
18: ; preds = %15, %10
%19 = phi i32 [ %12, %15 ], [ %13, %10 ]
%20 = phi i32 [ %17, %15 ], [ %11, %10 ]
%21 = phi i32 [ %16, %15 ], [ %12, %10 ]
%22 = getelementptr inbounds i32, i32* %0, i64 2
%23 = load i32, i32* %22
%24 = icmp slt i32 %20, %23
br i1 %24, label %25, label %28
25: ; preds = %18
store i32 %23, i32* %1
%26 = load i32, i32* %2
%27 = load i32, i32* %22
br label %28
28: ; preds = %25, %18
%29 = phi i32 [ %23, %25 ], [ %20, %18 ]
%30 = phi i32 [ %27, %25 ], [ %23, %18 ]
%31 = phi i32 [ %26, %25 ], [ %19, %18 ]
%32 = icmp sgt i32 %31, %30
br i1 %32, label %33, label %36
33: ; preds = %28
store i32 %30, i32* %2
%34 = load i32, i32* %22
%35 = load i32, i32* %1
br label %36
36: ; preds = %33, %28
%37 = phi i32 [ %30, %33 ], [ %31, %28 ]
%38 = phi i32 [ %35, %33 ], [ %29, %28 ]
%39 = phi i32 [ %34, %33 ], [ %30, %28 ]
%40 = getelementptr inbounds i32, i32* %0, i64 3
%41 = load i32, i32* %40
%42 = icmp slt i32 %38, %41
br i1 %42, label %43, label %46
43: ; preds = %36
store i32 %41, i32* %1
%44 = load i32, i32* %2
%45 = load i32, i32* %40
br label %46
46: ; preds = %43, %36
%47 = phi i32 [ %41, %43 ], [ %38, %36 ]
%48 = phi i32 [ %45, %43 ], [ %41, %36 ]
%49 = phi i32 [ %44, %43 ], [ %37, %36 ]
%50 = icmp sgt i32 %49, %48
br i1 %50, label %51, label %54
51: ; preds = %46
store i32 %48, i32* %2
%52 = load i32, i32* %40
%53 = load i32, i32* %1
br label %54
54: ; preds = %51, %46
%55 = phi i32 [ %48, %51 ], [ %49, %46 ]
%56 = phi i32 [ %53, %51 ], [ %47, %46 ]
%57 = phi i32 [ %52, %51 ], [ %48, %46 ]
%58 = getelementptr inbounds i32, i32* %0, i64 4
%59 = load i32, i32* %58
%60 = icmp slt i32 %56, %59
br i1 %60, label %61, label %64
61: ; preds = %54
store i32 %59, i32* %1
%62 = load i32, i32* %2
%63 = load i32, i32* %58
br label %64
64: ; preds = %61, %54
%65 = phi i32 [ %59, %61 ], [ %56, %54 ]
%66 = phi i32 [ %63, %61 ], [ %59, %54 ]
%67 = phi i32 [ %62, %61 ], [ %55, %54 ]
%68 = icmp sgt i32 %67, %66
br i1 %68, label %69, label %72
69: ; preds = %64
store i32 %66, i32* %2
%70 = load i32, i32* %58
%71 = load i32, i32* %1
br label %72
72: ; preds = %69, %64
%73 = phi i32 [ %66, %69 ], [ %67, %64 ]
%74 = phi i32 [ %71, %69 ], [ %65, %64 ]
%75 = phi i32 [ %70, %69 ], [ %66, %64 ]
%76 = getelementptr inbounds i32, i32* %0, i64 5
%77 = load i32, i32* %76
%78 = icmp slt i32 %74, %77
br i1 %78, label %79, label %82
79: ; preds = %72
store i32 %77, i32* %1
%80 = load i32, i32* %2
%81 = load i32, i32* %76
br label %82
82: ; preds = %79, %72
%83 = phi i32 [ %77, %79 ], [ %74, %72 ]
%84 = phi i32 [ %81, %79 ], [ %77, %72 ]
%85 = phi i32 [ %80, %79 ], [ %73, %72 ]
%86 = icmp sgt i32 %85, %84
br i1 %86, label %87, label %90
87: ; preds = %82
store i32 %84, i32* %2
%88 = load i32, i32* %76
%89 = load i32, i32* %1
br label %90
90: ; preds = %87, %82
%91 = phi i32 [ %84, %87 ], [ %85, %82 ]
%92 = phi i32 [ %89, %87 ], [ %83, %82 ]
%93 = phi i32 [ %88, %87 ], [ %84, %82 ]
%94 = getelementptr inbounds i32, i32* %0, i64 6
%95 = load i32, i32* %94
%96 = icmp slt i32 %92, %95
br i1 %96, label %97, label %100
97: ; preds = %90
store i32 %95, i32* %1
%98 = load i32, i32* %2
%99 = load i32, i32* %94
br label %100
100: ; preds = %97, %90
%101 = phi i32 [ %95, %97 ], [ %92, %90 ]
%102 = phi i32 [ %99, %97 ], [ %95, %90 ]
%103 = phi i32 [ %98, %97 ], [ %91, %90 ]
%104 = icmp sgt i32 %103, %102
br i1 %104, label %105, label %108
105: ; preds = %100
store i32 %102, i32* %2
%106 = load i32, i32* %94
%107 = load i32, i32* %1
br label %108
108: ; preds = %105, %100
%109 = phi i32 [ %102, %105 ], [ %103, %100 ]
%110 = phi i32 [ %107, %105 ], [ %101, %100 ]
%111 = phi i32 [ %106, %105 ], [ %102, %100 ]
%112 = getelementptr inbounds i32, i32* %0, i64 7
%113 = load i32, i32* %112
%114 = icmp slt i32 %110, %113
br i1 %114, label %115, label %118
115: ; preds = %108
store i32 %113, i32* %1
%116 = load i32, i32* %2
%117 = load i32, i32* %112
br label %118
118: ; preds = %115, %108
%119 = phi i32 [ %113, %115 ], [ %110, %108 ]
%120 = phi i32 [ %117, %115 ], [ %113, %108 ]
%121 = phi i32 [ %116, %115 ], [ %109, %108 ]
%122 = icmp sgt i32 %121, %120
br i1 %122, label %123, label %126
123: ; preds = %118
store i32 %120, i32* %2
%124 = load i32, i32* %112
%125 = load i32, i32* %1
br label %126
126: ; preds = %123, %118
%127 = phi i32 [ %120, %123 ], [ %121, %118 ]
%128 = phi i32 [ %125, %123 ], [ %119, %118 ]
%129 = phi i32 [ %124, %123 ], [ %120, %118 ]
%130 = getelementptr inbounds i32, i32* %0, i64 8
%131 = load i32, i32* %130
%132 = icmp slt i32 %128, %131
br i1 %132, label %133, label %136
133: ; preds = %126
store i32 %131, i32* %1
%134 = load i32, i32* %2
%135 = load i32, i32* %130
br label %136
136: ; preds = %133, %126
%137 = phi i32 [ %131, %133 ], [ %128, %126 ]
%138 = phi i32 [ %135, %133 ], [ %131, %126 ]
%139 = phi i32 [ %134, %133 ], [ %127, %126 ]
%140 = icmp sgt i32 %139, %138
br i1 %140, label %141, label %144
141: ; preds = %136
store i32 %138, i32* %2
%142 = load i32, i32* %130
%143 = load i32, i32* %1
br label %144
144: ; preds = %141, %136
%145 = phi i32 [ %138, %141 ], [ %139, %136 ]
%146 = phi i32 [ %143, %141 ], [ %137, %136 ]
%147 = phi i32 [ %142, %141 ], [ %138, %136 ]
%148 = getelementptr inbounds i32, i32* %0, i64 9
%149 = load i32, i32* %148
%150 = icmp slt i32 %146, %149
br i1 %150, label %151, label %154
151: ; preds = %144
store i32 %149, i32* %1
%152 = load i32, i32* %2
%153 = load i32, i32* %148
br label %154
154: ; preds = %151, %144
%155 = phi i32 [ %153, %151 ], [ %149, %144 ]
%156 = phi i32 [ %152, %151 ], [ %145, %144 ]
%157 = icmp sgt i32 %156, %155
br i1 %157, label %158, label %160
158: ; preds = %154
store i32 %155, i32* %2
%159 = load i32, i32* %148
br label %160
160: ; preds = %158, %154
%161 = phi i32 [ %159, %158 ], [ %155, %154 ]
%162 = sitofp i32 %4 to float
%163 = sitofp i32 %21 to float
%164 = fadd float %162, %163
%165 = sitofp i32 %39 to float
%166 = fadd float %164, %165
%167 = sitofp i32 %57 to float
%168 = fadd float %166, %167
%169 = sitofp i32 %75 to float
%170 = fadd float %168, %169
%171 = sitofp i32 %93 to float
%172 = fadd float %170, %171
%173 = sitofp i32 %111 to float
%174 = fadd float %172, %173
%175 = sitofp i32 %129 to float
%176 = fadd float %174, %175
%177 = sitofp i32 %147 to float
%178 = fadd float %176, %177
%179 = sitofp i32 %161 to float
%180 = fadd float %178, %179
%181 = fdiv float %180, 1.000000e+01
ret float %181
}