float maximum_of(float *x, long start, long stop) {
  long i;
  float result = -1E20f;
  for (i = start; i < stop; i++) {
    if (result < x[i]) {
      result = x[i];
    }
  }
  return result;
}


x86 assembly (clang, -O0):
<maximum_of>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movss  0xee8(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1176 <maximum_of+0x76>
movss  -0x24(%rbp),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jbe    1160 <maximum_of+0x60>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    1165 <maximum_of+0x65>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1125 <maximum_of+0x25>
movss  -0x24(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<maximum_of>:
cmp    %rsi,%rdx
jle    1171 <maximum_of+0x71>
mov    %edx,%ecx
sub    %esi,%ecx
mov    %rsi,%rax
not    %rax
add    %rdx,%rax
and    $0x3,%rcx
je     117a <maximum_of+0x7a>
movss  0xee0(%rip),%xmm1
movss  (%rdi,%rsi,4),%xmm0
maxss  %xmm1,%xmm0
add    $0x1,%rsi
movaps %xmm0,%xmm1
add    $0xffffffffffffffff,%rcx
jne    1120 <maximum_of+0x20>
cmp    $0x3,%rax
jb     1170 <maximum_of+0x70>
nopl   0x0(%rax)
movss  (%rdi,%rsi,4),%xmm1
maxss  %xmm0,%xmm1
movss  0x4(%rdi,%rsi,4),%xmm0
maxss  %xmm1,%xmm0
movss  0x8(%rdi,%rsi,4),%xmm1
maxss  %xmm0,%xmm1
movss  0xc(%rdi,%rsi,4),%xmm0
maxss  %xmm1,%xmm0
add    $0x4,%rsi
cmp    %rsi,%rdx
jne    1140 <maximum_of+0x40>
ret
movss  0xe87(%rip),%xmm0
ret
movss  0xe7e(%rip),%xmm0
cmp    $0x3,%rax
jae    1140 <maximum_of+0x40>
jmp    1170 <maximum_of+0x70>

LLVM IR (-O0):
define float @maximum_of(float* %0, i64 %1, i64 %2) {
%4 = alloca float*
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca float
store float* %0, float** %4
store i64 %1, i64* %5
store i64 %2, i64* %6
store float 0xC415AF1D80000000, float* %8
%9 = load i64, i64* %5
store i64 %9, i64* %7
br label %10
10: ; preds = %27, %3
%11 = load i64, i64* %7
%12 = load i64, i64* %6
%13 = icmp slt i64 %11, %12
br i1 %13, label %14, label %30
14: ; preds = %10
%15 = load float, float* %8
%16 = load float*, float** %4
%17 = load i64, i64* %7
%18 = getelementptr inbounds float, float* %16, i64 %17
%19 = load float, float* %18
%20 = fcmp olt float %15, %19
br i1 %20, label %21, label %26
21: ; preds = %14
%22 = load float*, float** %4
%23 = load i64, i64* %7
%24 = getelementptr inbounds float, float* %22, i64 %23
%25 = load float, float* %24
store float %25, float* %8
br label %26
26: ; preds = %21, %14
br label %27
27: ; preds = %26
%28 = load i64, i64* %7
%29 = add nsw i64 %28, 1
store i64 %29, i64* %7
br label %10
30: ; preds = %10
%31 = load float, float* %8
ret float %31
}

LLVM IR (-O2):
define float @maximum_of(float* nocapture %0, i64 %1, i64 %2) {
%4 = icmp sgt i64 %2, %1
br i1 %4, label %5, label %51
5: ; preds = %3
%6 = sub i64 %2, %1
%7 = xor i64 %1, -1
%8 = add i64 %7, %2
%9 = and i64 %6, 3
%10 = icmp eq i64 %9, 0
br i1 %10, label %22, label %11
11: ; preds = %5, %11
%12 = phi float [ %18, %11 ], [ 0xC415AF1D80000000, %5 ]
%13 = phi i64 [ %19, %11 ], [ %1, %5 ]
%14 = phi i64 [ %20, %11 ], [ 0, %5 ]
%15 = getelementptr inbounds float, float* %0, i64 %13
%16 = load float, float* %15
%17 = fcmp olt float %12, %16
%18 = select i1 %17, float %16, float %12
%19 = add nsw i64 %13, 1
%20 = add i64 %14, 1
%21 = icmp eq i64 %20, %9
br i1 %21, label %22, label %11
22: ; preds = %11, %5
%23 = phi float [ undef, %5 ], [ %18, %11 ]
%24 = phi float [ 0xC415AF1D80000000, %5 ], [ %18, %11 ]
%25 = phi i64 [ %1, %5 ], [ %19, %11 ]
%26 = icmp ult i64 %8, 3
br i1 %26, label %51, label %27
27: ; preds = %22, %27
%28 = phi float [ %48, %27 ], [ %24, %22 ]
%29 = phi i64 [ %49, %27 ], [ %25, %22 ]
%30 = getelementptr inbounds float, float* %0, i64 %29
%31 = load float, float* %30
%32 = fcmp olt float %28, %31
%33 = select i1 %32, float %31, float %28
%34 = add nsw i64 %29, 1
%35 = getelementptr inbounds float, float* %0, i64 %34
%36 = load float, float* %35
%37 = fcmp olt float %33, %36
%38 = select i1 %37, float %36, float %33
%39 = add nsw i64 %29, 2
%40 = getelementptr inbounds float, float* %0, i64 %39
%41 = load float, float* %40
%42 = fcmp olt float %38, %41
%43 = select i1 %42, float %41, float %38
%44 = add nsw i64 %29, 3
%45 = getelementptr inbounds float, float* %0, i64 %44
%46 = load float, float* %45
%47 = fcmp olt float %43, %46
%48 = select i1 %47, float %46, float %43
%49 = add nsw i64 %29, 4
%50 = icmp eq i64 %49, %2
br i1 %50, label %51, label %27
51: ; preds = %22, %27, %3
%52 = phi float [ 0xC415AF1D80000000, %3 ], [ %23, %22 ], [ %48, %27 ]
ret float %52
}