int mymax2(int *it, int *end) {
  int max = *it;
  while (++it != end)
    if (*it > max)
      max = *it;
  return max;
}


x86 assembly (clang, -O0):
<mymax2>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
cmp    -0x10(%rbp),%rax
je     1148 <mymax2+0x48>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
cmp    -0x14(%rbp),%eax
jle    1143 <mymax2+0x43>
mov    -0x8(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x14(%rbp)
jmp    1115 <mymax2+0x15>
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mymax2>:
mov    (%rdi),%eax
lea    0x4(%rdi),%rcx
cmp    %rsi,%rcx
je     1280 <mymax2+0x180>
mov    %rsi,%r10
sub    %rdi,%r10
add    $0xfffffffffffffff8,%r10
cmp    $0x1c,%r10
jb     1270 <mymax2+0x170>
shr    $0x2,%r10
add    $0x1,%r10
mov    %r10,%r8
and    $0xfffffffffffffff8,%r8
movd   %eax,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x8(%r8),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     1281 <mymax2+0x181>
mov    %r9,%rdx
and    $0xfffffffffffffffe,%rdx
xor    %eax,%eax
movdqa %xmm0,%xmm1
movdqu 0x4(%rdi,%rax,4),%xmm2
movdqu 0x14(%rdi,%rax,4),%xmm3
movdqu 0x24(%rdi,%rax,4),%xmm4
movdqu 0x34(%rdi,%rax,4),%xmm5
movdqa %xmm2,%xmm6
pcmpgtd %xmm0,%xmm6
pand   %xmm6,%xmm2
pandn  %xmm0,%xmm6
por    %xmm2,%xmm6
movdqa %xmm3,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm3
pandn  %xmm1,%xmm2
por    %xmm3,%xmm2
movdqa %xmm4,%xmm0
pcmpgtd %xmm6,%xmm0
pand   %xmm0,%xmm4
pandn  %xmm6,%xmm0
por    %xmm4,%xmm0
movdqa %xmm5,%xmm1
pcmpgtd %xmm2,%xmm1
pand   %xmm1,%xmm5
pandn  %xmm2,%xmm1
por    %xmm5,%xmm1
add    $0x10,%rax
add    $0xfffffffffffffffe,%rdx
jne    1160 <mymax2+0x60>
test   $0x1,%r9b
je     1213 <mymax2+0x113>
movdqu (%rcx,%rax,4),%xmm2
movdqu 0x10(%rcx,%rax,4),%xmm3
movdqa %xmm2,%xmm4
pcmpgtd %xmm0,%xmm4
pand   %xmm4,%xmm2
pandn  %xmm0,%xmm4
por    %xmm2,%xmm4
movdqa %xmm3,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm3
pandn  %xmm1,%xmm2
por    %xmm3,%xmm2
movdqa %xmm4,%xmm0
movdqa %xmm2,%xmm1
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm0
pandn  %xmm1,%xmm2
por    %xmm0,%xmm2
pshufd $0xee,%xmm2,%xmm0
movdqa %xmm2,%xmm1
pcmpgtd %xmm0,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm0,%xmm1
por    %xmm2,%xmm1
pshufd $0x55,%xmm1,%xmm0
movdqa %xmm1,%xmm2
pcmpgtd %xmm0,%xmm2
pand   %xmm2,%xmm1
pandn  %xmm0,%xmm2
por    %xmm1,%xmm2
movd   %xmm2,%eax
cmp    %r8,%r10
je     1280 <mymax2+0x180>
lea    (%rcx,%r8,4),%rcx
cs nopw 0x0(%rax,%rax,1)
mov    (%rcx),%edx
cmp    %eax,%edx
cmovg  %edx,%eax
add    $0x4,%rcx
cmp    %rsi,%rcx
jne    1270 <mymax2+0x170>
ret
xor    %eax,%eax
movdqa %xmm0,%xmm1
test   $0x1,%r9b
jne    11d8 <mymax2+0xd8>
jmp    1213 <mymax2+0x113>

LLVM IR (-O0):
define i32 @mymax2(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = alloca i32*
%5 = alloca i32
store i32* %0, i32** %3
store i32* %1, i32** %4
%6 = load i32*, i32** %3
%7 = load i32, i32* %6
store i32 %7, i32* %5
br label %8
8: ; preds = %21, %2
%9 = load i32*, i32** %3
%10 = getelementptr inbounds i32, i32* %9, i32 1
store i32* %10, i32** %3
%11 = load i32*, i32** %4
%12 = icmp ne i32* %10, %11
br i1 %12, label %13, label %22
13: ; preds = %8
%14 = load i32*, i32** %3
%15 = load i32, i32* %14
%16 = load i32, i32* %5
%17 = icmp sgt i32 %15, %16
br i1 %17, label %18, label %21
18: ; preds = %13
%19 = load i32*, i32** %3
%20 = load i32, i32* %19
store i32 %20, i32* %5
br label %21
21: ; preds = %18, %13
br label %8
22: ; preds = %8
%23 = load i32, i32* %5
ret i32 %23
}

LLVM IR (-O2):
define i32 @mymax2(i32* %0, i32* readnone %1) {
%3 = load i32, i32* %0
%4 = getelementptr inbounds i32, i32* %0, i64 1
%5 = icmp eq i32* %4, %1
br i1 %5, label %91, label %6
6: ; preds = %2
%7 = ptrtoint i32* %1 to i64
%8 = ptrtoint i32* %0 to i64
%9 = add i64 %7, -8
%10 = sub i64 %9, %8
%11 = lshr i64 %10, 2
%12 = add nuw nsw i64 %11, 1
%13 = icmp ult i64 %10, 28
br i1 %13, label %80, label %14
14: ; preds = %6
%15 = and i64 %12, 9223372036854775800
%16 = getelementptr i32, i32* %4, i64 %15
%17 = insertelement <4 x i32> poison, i32 %3, i64 0
%18 = shufflevector <4 x i32> %17, <4 x i32> poison, <4 x i32> zeroinitializer
%19 = add nsw i64 %15, -8
%20 = lshr exact i64 %19, 3
%21 = add nuw nsw i64 %20, 1
%22 = and i64 %21, 1
%23 = icmp eq i64 %19, 0
br i1 %23, label %55, label %24
24: ; preds = %14
%25 = and i64 %21, 4611686018427387902
br label %26
26: ; preds = %26, %24
%27 = phi i64 [ 0, %24 ], [ %52, %26 ]
%28 = phi <4 x i32> [ %18, %24 ], [ %50, %26 ]
%29 = phi <4 x i32> [ %18, %24 ], [ %51, %26 ]
%30 = phi i64 [ 0, %24 ], [ %53, %26 ]
%31 = getelementptr i32, i32* %4, i64 %27
%32 = bitcast i32* %31 to <4 x i32>*
%33 = load <4 x i32>, <4 x i32>* %32
%34 = getelementptr i32, i32* %31, i64 4
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = icmp sgt <4 x i32> %33, %28
%38 = icmp sgt <4 x i32> %36, %29
%39 = select <4 x i1> %37, <4 x i32> %33, <4 x i32> %28
%40 = select <4 x i1> %38, <4 x i32> %36, <4 x i32> %29
%41 = or i64 %27, 8
%42 = getelementptr i32, i32* %4, i64 %41
%43 = bitcast i32* %42 to <4 x i32>*
%44 = load <4 x i32>, <4 x i32>* %43
%45 = getelementptr i32, i32* %42, i64 4
%46 = bitcast i32* %45 to <4 x i32>*
%47 = load <4 x i32>, <4 x i32>* %46
%48 = icmp sgt <4 x i32> %44, %39
%49 = icmp sgt <4 x i32> %47, %40
%50 = select <4 x i1> %48, <4 x i32> %44, <4 x i32> %39
%51 = select <4 x i1> %49, <4 x i32> %47, <4 x i32> %40
%52 = add nuw i64 %27, 16
%53 = add i64 %30, 2
%54 = icmp eq i64 %53, %25
br i1 %54, label %55, label %26
55: ; preds = %26, %14
%56 = phi <4 x i32> [ undef, %14 ], [ %50, %26 ]
%57 = phi <4 x i32> [ undef, %14 ], [ %51, %26 ]
%58 = phi i64 [ 0, %14 ], [ %52, %26 ]
%59 = phi <4 x i32> [ %18, %14 ], [ %50, %26 ]
%60 = phi <4 x i32> [ %18, %14 ], [ %51, %26 ]
%61 = icmp eq i64 %22, 0
br i1 %61, label %73, label %62
62: ; preds = %55
%63 = getelementptr i32, i32* %4, i64 %58
%64 = bitcast i32* %63 to <4 x i32>*
%65 = load <4 x i32>, <4 x i32>* %64
%66 = getelementptr i32, i32* %63, i64 4
%67 = bitcast i32* %66 to <4 x i32>*
%68 = load <4 x i32>, <4 x i32>* %67
%69 = icmp sgt <4 x i32> %65, %59
%70 = icmp sgt <4 x i32> %68, %60
%71 = select <4 x i1> %69, <4 x i32> %65, <4 x i32> %59
%72 = select <4 x i1> %70, <4 x i32> %68, <4 x i32> %60
br label %73
73: ; preds = %55, %62
%74 = phi <4 x i32> [ %56, %55 ], [ %71, %62 ]
%75 = phi <4 x i32> [ %57, %55 ], [ %72, %62 ]
%76 = icmp sgt <4 x i32> %74, %75
%77 = select <4 x i1> %76, <4 x i32> %74, <4 x i32> %75
%78 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %77)
%79 = icmp eq i64 %12, %15
br i1 %79, label %91, label %80
80: ; preds = %6, %73
%81 = phi i32* [ %4, %6 ], [ %16, %73 ]
%82 = phi i32 [ %3, %6 ], [ %78, %73 ]
br label %83
83: ; preds = %80, %83
%84 = phi i32* [ %89, %83 ], [ %81, %80 ]
%85 = phi i32 [ %88, %83 ], [ %82, %80 ]
%86 = load i32, i32* %84
%87 = icmp sgt i32 %86, %85
%88 = select i1 %87, i32 %86, i32 %85
%89 = getelementptr inbounds i32, i32* %84, i64 1
%90 = icmp eq i32* %89, %1
br i1 %90, label %91, label %83
91: ; preds = %83, %73, %2
%92 = phi i32 [ %3, %2 ], [ %78, %73 ], [ %88, %83 ]
ret i32 %92
}