int maxim(int *list, int n) {
  int m = list[n - 1];
  while (n--) {
    if (list[n] > m)
      m = list[n];
  }
  return (m);
}


x86 assembly (clang, -O0):
<maxim>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
cmp    $0x0,%eax
je     1159 <maxim+0x59>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x10(%rbp),%eax
jle    1154 <maxim+0x54>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x10(%rbp)
jmp    111e <maxim+0x1e>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<maxim>:
mov    %esi,%eax
sub    $0x1,%eax
cltq
mov    (%rdi,%rax,4),%eax
jb     12c1 <maxim+0x1c1>
movslq %esi,%rcx
add    $0xffffffff,%esi
cmp    $0x7,%esi
jb     12b0 <maxim+0x1b0>
add    $0x1,%rsi
mov    %rsi,%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     12c2 <maxim+0x1c2>
mov    %r9,%rax
and    $0xfffffffffffffffe,%rax
lea    (%rdi,%rcx,4),%r10
add    $0xfffffffffffffff0,%r10
mov    $0xfffffffffffffffc,%rdx
movdqa %xmm0,%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
movdqu -0x20(%r10,%rdx,4),%xmm2
movdqu -0x10(%r10,%rdx,4),%xmm3
movdqu (%r10,%rdx,4),%xmm4
movdqu 0x10(%r10,%rdx,4),%xmm5
pshufd $0x1b,%xmm5,%xmm5
pshufd $0x1b,%xmm4,%xmm4
movdqa %xmm5,%xmm6
pcmpgtd %xmm0,%xmm6
pand   %xmm6,%xmm5
pandn  %xmm0,%xmm6
por    %xmm5,%xmm6
movdqa %xmm4,%xmm5
pcmpgtd %xmm1,%xmm5
pand   %xmm5,%xmm4
pandn  %xmm1,%xmm5
por    %xmm4,%xmm5
pshufd $0x1b,%xmm3,%xmm1
pshufd $0x1b,%xmm2,%xmm2
movdqa %xmm1,%xmm0
pcmpgtd %xmm6,%xmm0
pand   %xmm0,%xmm1
pandn  %xmm6,%xmm0
por    %xmm1,%xmm0
movdqa %xmm2,%xmm1
pcmpgtd %xmm5,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm5,%xmm1
por    %xmm2,%xmm1
add    $0xfffffffffffffff0,%rdx
add    $0xfffffffffffffffe,%rax
jne    1170 <maxim+0x70>
add    $0x3,%rdx
test   $0x1,%r9b
je     1250 <maxim+0x150>
add    %rcx,%rdx
movdqu -0x1c(%rdi,%rdx,4),%xmm2
movdqu -0xc(%rdi,%rdx,4),%xmm3
pshufd $0x1b,%xmm3,%xmm3
pshufd $0x1b,%xmm2,%xmm2
movdqa %xmm3,%xmm4
pcmpgtd %xmm0,%xmm4
pand   %xmm4,%xmm3
pandn  %xmm0,%xmm4
por    %xmm3,%xmm4
movdqa %xmm2,%xmm3
pcmpgtd %xmm1,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm1,%xmm3
por    %xmm2,%xmm3
movdqa %xmm4,%xmm0
movdqa %xmm3,%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,%rsi
je     12c1 <maxim+0x1c1>
sub    %r8,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    -0x4(%rdi,%rcx,4),%edx
add    $0xffffffffffffffff,%rcx
cmp    %eax,%edx
cmovg  %edx,%eax
test   %ecx,%ecx
jne    12b0 <maxim+0x1b0>
ret
mov    $0xffffffffffffffff,%rdx
movdqa %xmm0,%xmm1
test   $0x1,%r9b
jne    1207 <maxim+0x107>
jmp    1250 <maxim+0x150>

LLVM IR (-O0):
define i32 @maxim(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* %4
%8 = sub nsw i32 %7, 1
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds i32, i32* %6, i64 %9
%11 = load i32, i32* %10
store i32 %11, i32* %5
br label %12
12: ; preds = %30, %2
%13 = load i32, i32* %4
%14 = add nsw i32 %13, -1
store i32 %14, i32* %4
%15 = icmp ne i32 %13, 0
br i1 %15, label %16, label %31
16: ; preds = %12
%17 = load i32*, i32** %3
%18 = load i32, i32* %4
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %17, i64 %19
%21 = load i32, i32* %20
%22 = load i32, i32* %5
%23 = icmp sgt i32 %21, %22
br i1 %23, label %24, label %30
24: ; preds = %16
%25 = load i32*, i32** %3
%26 = load i32, i32* %4
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i32, i32* %25, i64 %27
%29 = load i32, i32* %28
store i32 %29, i32* %5
br label %30
30: ; preds = %24, %16
br label %12
31: ; preds = %12
%32 = load i32, i32* %5
ret i32 %32
}

LLVM IR (-O2):
define i32 @maxim(i32* nocapture %0, i32 %1) {
%3 = add nsw i32 %1, -1
%4 = sext i32 %3 to i64
%5 = getelementptr inbounds i32, i32* %0, i64 %4
%6 = load i32, i32* %5
%7 = icmp eq i32 %1, 0
br i1 %7, label %111, label %8
8: ; preds = %2
%9 = sext i32 %1 to i64
%10 = add i32 %1, -1
%11 = zext i32 %10 to i64
%12 = add nuw nsw i64 %11, 1
%13 = icmp ult i32 %10, 7
br i1 %13, label %98, label %14
14: ; preds = %8
%15 = and i64 %12, 8589934584
%16 = sub nsw i64 %9, %15
%17 = insertelement <4 x i32> poison, i32 %6, 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 %68, label %24
24: ; preds = %14
%25 = and i64 %21, 4611686018427387902
br label %26
26: ; preds = %26, %24
%27 = phi i64 [ 0, %24 ], [ %63, %26 ]
%28 = phi <4 x i32> [ %18, %24 ], [ %61, %26 ]
%29 = phi <4 x i32> [ %18, %24 ], [ %62, %26 ]
%30 = phi i64 [ 0, %24 ], [ %64, %26 ]
%31 = xor i64 %27, -1
%32 = add i64 %31, %9
%33 = getelementptr inbounds i32, i32* %0, i64 %32
%34 = getelementptr inbounds i32, i32* %33, i64 -3
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = shufflevector <4 x i32> %36, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
%38 = getelementptr inbounds i32, i32* %33, i64 -4
%39 = getelementptr inbounds i32, i32* %38, i64 -3
%40 = bitcast i32* %39 to <4 x i32>*
%41 = load <4 x i32>, <4 x i32>* %40
%42 = shufflevector <4 x i32> %41, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
%43 = icmp sgt <4 x i32> %37, %28
%44 = icmp sgt <4 x i32> %42, %29
%45 = select <4 x i1> %43, <4 x i32> %37, <4 x i32> %28
%46 = select <4 x i1> %44, <4 x i32> %42, <4 x i32> %29
%47 = sub nuw nsw i64 -9, %27
%48 = add i64 %47, %9
%49 = getelementptr inbounds i32, i32* %0, i64 %48
%50 = getelementptr inbounds i32, i32* %49, i64 -3
%51 = bitcast i32* %50 to <4 x i32>*
%52 = load <4 x i32>, <4 x i32>* %51
%53 = shufflevector <4 x i32> %52, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
%54 = getelementptr inbounds i32, i32* %49, i64 -4
%55 = getelementptr inbounds i32, i32* %54, i64 -3
%56 = bitcast i32* %55 to <4 x i32>*
%57 = load <4 x i32>, <4 x i32>* %56
%58 = shufflevector <4 x i32> %57, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
%59 = icmp sgt <4 x i32> %53, %45
%60 = icmp sgt <4 x i32> %58, %46
%61 = select <4 x i1> %59, <4 x i32> %53, <4 x i32> %45
%62 = select <4 x i1> %60, <4 x i32> %58, <4 x i32> %46
%63 = add nuw i64 %27, 16
%64 = add i64 %30, 2
%65 = icmp eq i64 %64, %25
br i1 %65, label %66, label %26
66: ; preds = %26
%67 = sub i64 -17, %27
br label %68
68: ; preds = %66, %14
%69 = phi <4 x i32> [ undef, %14 ], [ %61, %66 ]
%70 = phi <4 x i32> [ undef, %14 ], [ %62, %66 ]
%71 = phi i64 [ -1, %14 ], [ %67, %66 ]
%72 = phi <4 x i32> [ %18, %14 ], [ %61, %66 ]
%73 = phi <4 x i32> [ %18, %14 ], [ %62, %66 ]
%74 = icmp eq i64 %22, 0
br i1 %74, label %91, label %75
75: ; preds = %68
%76 = add i64 %71, %9
%77 = getelementptr inbounds i32, i32* %0, i64 %76
%78 = getelementptr inbounds i32, i32* %77, i64 -3
%79 = bitcast i32* %78 to <4 x i32>*
%80 = load <4 x i32>, <4 x i32>* %79
%81 = shufflevector <4 x i32> %80, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
%82 = getelementptr inbounds i32, i32* %77, i64 -4
%83 = getelementptr inbounds i32, i32* %82, i64 -3
%84 = bitcast i32* %83 to <4 x i32>*
%85 = load <4 x i32>, <4 x i32>* %84
%86 = shufflevector <4 x i32> %85, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
%87 = icmp sgt <4 x i32> %81, %72
%88 = icmp sgt <4 x i32> %86, %73
%89 = select <4 x i1> %87, <4 x i32> %81, <4 x i32> %72
%90 = select <4 x i1> %88, <4 x i32> %86, <4 x i32> %73
br label %91
91: ; preds = %68, %75
%92 = phi <4 x i32> [ %69, %68 ], [ %89, %75 ]
%93 = phi <4 x i32> [ %70, %68 ], [ %90, %75 ]
%94 = icmp sgt <4 x i32> %92, %93
%95 = select <4 x i1> %94, <4 x i32> %92, <4 x i32> %93
%96 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %95)
%97 = icmp eq i64 %12, %15
br i1 %97, label %111, label %98
98: ; preds = %8, %91
%99 = phi i64 [ %9, %8 ], [ %16, %91 ]
%100 = phi i32 [ %6, %8 ], [ %96, %91 ]
br label %101
101: ; preds = %98, %101
%102 = phi i64 [ %104, %101 ], [ %99, %98 ]
%103 = phi i32 [ %108, %101 ], [ %100, %98 ]
%104 = add nsw i64 %102, -1
%105 = getelementptr inbounds i32, i32* %0, i64 %104
%106 = load i32, i32* %105
%107 = icmp sgt i32 %106, %103
%108 = select i1 %107, i32 %106, i32 %103
%109 = trunc i64 %104 to i32
%110 = icmp eq i32 %109, 0
br i1 %110, label %111, label %101
111: ; preds = %101, %91, %2
%112 = phi i32 [ %6, %2 ], [ %96, %91 ], [ %108, %101 ]
ret i32 %112
}