int __samax2(int n, float *x) {
  int i, max1, max2;
  if (x[0] > x[1]) {
    max1 = 0;
    max2 = 1;
  } else {
    max1 = 1;
    max2 = 0;
  }
  for (i = 2; i < n; i++) {
    if (x[i] > x[max1]) {
      max2 = max1;
      max1 = i;
    } else if (x[i] > x[max2])
      max2 = i;
  }
  return max2;
}


x86 assembly (clang, -O0):
<__samax2>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomiss 0x4(%rax),%xmm0
jbe    1134 <__samax2+0x34>
movl   $0x0,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
jmp    1142 <__samax2+0x42>
movl   $0x1,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x2,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11c2 <__samax2+0xc2>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
ucomiss (%rax,%rcx,4),%xmm0
jbe    1185 <__samax2+0x85>
mov    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    11af <__samax2+0xaf>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
ucomiss (%rax,%rcx,4),%xmm0
jbe    11aa <__samax2+0xaa>
mov    -0x14(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    11af <__samax2+0xaf>
jmp    11b4 <__samax2+0xb4>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1149 <__samax2+0x49>
mov    -0x1c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<__samax2>:
push   %rbx
movss  (%rsi),%xmm0
movss  0x4(%rsi),%xmm1
xor    %r10d,%r10d
ucomiss %xmm1,%xmm0
seta   %r10b
cmp    $0x3,%edi
jl     115a <__samax2+0x5a>
xor    %r9d,%r9d
ucomiss %xmm1,%xmm0
setbe  %r9b
mov    %edi,%r8d
cmp    $0x3,%edi
jne    115f <__samax2+0x5f>
mov    $0x2,%ecx
mov    %r10d,%eax
test   $0x1,%r8b
je     1158 <__samax2+0x58>
movss  (%rsi,%rcx,4),%xmm0
movslq %r9d,%rax
ucomiss (%rsi,%rax,4),%xmm0
mov    %r9d,%eax
ja     1158 <__samax2+0x58>
movslq %r10d,%rax
ucomiss (%rsi,%rax,4),%xmm0
mov    %r10d,%eax
jbe    1158 <__samax2+0x58>
mov    %ecx,%eax
pop    %rbx
ret
mov    %r10d,%eax
pop    %rbx
ret
lea    -0x2(%r8),%r11
and    $0xfffffffffffffffe,%r11
neg    %r11
mov    $0x2,%ecx
mov    $0x3,%edi
mov    %r9d,%edx
jmp    11a0 <__samax2+0xa0>
nopl   0x0(%rax)
mov    %edi,%r9d
mov    %ebx,%edx
mov    %edx,%r10d
add    $0x2,%edi
lea    (%r11,%rcx,1),%rax
add    $0x2,%rax
add    $0x2,%rcx
mov    %r9d,%edx
cmp    $0x2,%rax
je     1130 <__samax2+0x30>
movss  (%rsi,%rcx,4),%xmm0
movslq %edx,%rax
ucomiss (%rsi,%rax,4),%xmm0
jbe    11c0 <__samax2+0xc0>
mov    %ecx,%ebx
jmp    11d5 <__samax2+0xd5>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq %r10d,%rax
ucomiss (%rsi,%rax,4),%xmm0
jbe    11d0 <__samax2+0xd0>
mov    %edx,%ebx
mov    %ecx,%edx
jmp    11d5 <__samax2+0xd5>
nop
mov    %edx,%ebx
mov    %r10d,%edx
movss  0x4(%rsi,%rcx,4),%xmm0
movslq %ebx,%rax
ucomiss (%rsi,%rax,4),%xmm0
ja     1180 <__samax2+0x80>
movslq %edx,%rax
ucomiss (%rsi,%rax,4),%xmm0
jbe    1200 <__samax2+0x100>
mov    %ebx,%r9d
mov    %edi,%edx
jmp    1185 <__samax2+0x85>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %ebx,%r9d
jmp    1185 <__samax2+0x85>

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

LLVM IR (-O2):
define i32 @__samax2(i32 %0, float* nocapture %1) {
%3 = load float, float* %1
%4 = getelementptr inbounds float, float* %1, i64 1
%5 = load float, float* %4
%6 = fcmp ogt float %3, %5
%7 = zext i1 %6 to i32
%8 = icmp sgt i32 %0, 2
br i1 %8, label %9, label %79
9: ; preds = %2
%10 = xor i1 %6, true
%11 = zext i1 %10 to i32
%12 = zext i32 %0 to i64
%13 = and i64 %12, 1
%14 = icmp eq i32 %0, 3
br i1 %14, label %59, label %15
15: ; preds = %9
%16 = add nsw i64 %12, -2
%17 = and i64 %16, -2
br label %18
18: ; preds = %53, %15
%19 = phi i64 [ 2, %15 ], [ %56, %53 ]
%20 = phi i32 [ %7, %15 ], [ %55, %53 ]
%21 = phi i32 [ %11, %15 ], [ %54, %53 ]
%22 = phi i64 [ 0, %15 ], [ %57, %53 ]
%23 = getelementptr inbounds float, float* %1, i64 %19
%24 = load float, float* %23
%25 = sext i32 %21 to i64
%26 = getelementptr inbounds float, float* %1, i64 %25
%27 = load float, float* %26
%28 = fcmp ogt float %24, %27
%29 = trunc i64 %19 to i32
br i1 %28, label %36, label %30
30: ; preds = %18
%31 = sext i32 %20 to i64
%32 = getelementptr inbounds float, float* %1, i64 %31
%33 = load float, float* %32
%34 = fcmp ogt float %24, %33
br i1 %34, label %35, label %36
35: ; preds = %30
br label %36
36: ; preds = %18, %35, %30
%37 = phi i32 [ %21, %35 ], [ %21, %30 ], [ %29, %18 ]
%38 = phi i32 [ %29, %35 ], [ %20, %30 ], [ %21, %18 ]
%39 = or i64 %19, 1
%40 = getelementptr inbounds float, float* %1, i64 %39
%41 = load float, float* %40
%42 = sext i32 %37 to i64
%43 = getelementptr inbounds float, float* %1, i64 %42
%44 = load float, float* %43
%45 = fcmp ogt float %41, %44
%46 = trunc i64 %39 to i32
br i1 %45, label %53, label %47
47: ; preds = %36
%48 = sext i32 %38 to i64
%49 = getelementptr inbounds float, float* %1, i64 %48
%50 = load float, float* %49
%51 = fcmp ogt float %41, %50
br i1 %51, label %52, label %53
52: ; preds = %47
br label %53
53: ; preds = %52, %47, %36
%54 = phi i32 [ %37, %52 ], [ %37, %47 ], [ %46, %36 ]
%55 = phi i32 [ %46, %52 ], [ %38, %47 ], [ %37, %36 ]
%56 = add nuw nsw i64 %19, 2
%57 = add i64 %22, 2
%58 = icmp eq i64 %57, %17
br i1 %58, label %59, label %18
59: ; preds = %53, %9
%60 = phi i32 [ undef, %9 ], [ %55, %53 ]
%61 = phi i64 [ 2, %9 ], [ %56, %53 ]
%62 = phi i32 [ %7, %9 ], [ %55, %53 ]
%63 = phi i32 [ %11, %9 ], [ %54, %53 ]
%64 = icmp eq i64 %13, 0
br i1 %64, label %79, label %65
65: ; preds = %59
%66 = getelementptr inbounds float, float* %1, i64 %61
%67 = load float, float* %66
%68 = sext i32 %63 to i64
%69 = getelementptr inbounds float, float* %1, i64 %68
%70 = load float, float* %69
%71 = fcmp ogt float %67, %70
%72 = trunc i64 %61 to i32
br i1 %71, label %79, label %73
73: ; preds = %65
%74 = sext i32 %62 to i64
%75 = getelementptr inbounds float, float* %1, i64 %74
%76 = load float, float* %75
%77 = fcmp ogt float %67, %76
br i1 %77, label %78, label %79
78: ; preds = %73
br label %79
79: ; preds = %59, %78, %73, %65, %2
%80 = phi i32 [ %7, %2 ], [ %60, %59 ], [ %72, %78 ], [ %62, %73 ], [ %63, %65 ]
ret i32 %80
}