short max_svector(short *v, long nl, long nh) {
  int i;
  short m;
  m = v[nl];
  for (i = nl + 1; i <= nh; i++) {
    if (v[i] > m)
      m = v[i];
  }
  return m;
}


x86 assembly (clang, -O0):
<max_svector>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x1e(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %eax,-0x1c(%rbp)
movslq -0x1c(%rbp),%rax
cmp    -0x18(%rbp),%rax
jg     1174 <max_svector+0x74>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
movswl -0x1e(%rbp),%ecx
cmp    %ecx,%eax
jle    1161 <max_svector+0x61>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x1e(%rbp)
jmp    1166 <max_svector+0x66>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    112b <max_svector+0x2b>
movswl -0x1e(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<max_svector>:
push   %r14
push   %rbx
movzwl (%rdi,%rsi,2),%eax
lea    0x1(%rsi),%ecx
movslq %ecx,%r8
cmp    %rdx,%r8
jg     1156 <max_svector+0x56>
lea    0x1(%rdx),%r14
mov    %esi,%ebx
add    $0x2,%ebx
movslq %ebx,%rbx
cmp    %rbx,%r14
mov    %rbx,%r9
cmovg  %r14,%r9
sub    %rbx,%r9
add    $0x1,%r9
cmp    $0x10,%r9
jae    115a <max_svector+0x5a>
add    $0x1,%ecx
nopl   0x0(%rax,%rax,1)
movzwl (%rdi,%r8,2),%esi
cmp    %ax,%si
cmovg  %esi,%eax
movslq %ecx,%r8
add    $0x1,%ecx
cmp    %rdx,%r8
jle    1140 <max_svector+0x40>
pop    %rbx
pop    %r14
ret
lea    0x2(%rsi),%r10d
movslq %r10d,%rbx
cmp    %rbx,%r14
cmovle %rbx,%r14
sub    %rbx,%r14
lea    (%rcx,%r14,1),%ebx
cmp    %ecx,%ebx
jl     1135 <max_svector+0x35>
mov    %r14,%r11
shr    $0x20,%r11
jne    1135 <max_svector+0x35>
add    %r14d,%esi
add    $0x2,%esi
cmp    %r10d,%esi
jl     1135 <max_svector+0x35>
test   %r11,%r11
jne    1135 <max_svector+0x35>
mov    %r9,%r10
and    $0xfffffffffffffff0,%r10
movd   %eax,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x10(%r10),%rax
mov    %rax,%r11
shr    $0x4,%r11
add    $0x1,%r11
test   %rax,%rax
je     1258 <max_svector+0x158>
mov    %r11,%rax
and    $0xfffffffffffffffe,%rax
lea    (%rdi,%r8,2),%rbx
add    $0x30,%rbx
xor    %esi,%esi
movdqa %xmm0,%xmm1
xchg   %ax,%ax
movdqu -0x30(%rbx,%rsi,2),%xmm2
pmaxsw %xmm0,%xmm2
movdqu -0x20(%rbx,%rsi,2),%xmm3
pmaxsw %xmm1,%xmm3
movdqu -0x10(%rbx,%rsi,2),%xmm0
pmaxsw %xmm2,%xmm0
movdqu (%rbx,%rsi,2),%xmm1
pmaxsw %xmm3,%xmm1
add    $0x20,%rsi
add    $0xfffffffffffffffe,%rax
jne    11d0 <max_svector+0xd0>
test   $0x1,%r11b
je     121d <max_svector+0x11d>
add    %r8,%rsi
movdqu (%rdi,%rsi,2),%xmm2
pmaxsw %xmm2,%xmm0
movdqu 0x10(%rdi,%rsi,2),%xmm2
pmaxsw %xmm2,%xmm1
pmaxsw %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
pmaxsw %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
pmaxsw %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrld  $0x10,%xmm1
pmaxsw %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r10,%r9
je     1156 <max_svector+0x56>
add    %r10,%r8
add    %r10d,%ecx
jmp    1135 <max_svector+0x35>
xor    %esi,%esi
movdqa %xmm0,%xmm1
test   $0x1,%r11b
jne    1207 <max_svector+0x107>
jmp    121d <max_svector+0x11d>

LLVM IR (-O0):
define signext i16 @max_svector(i16* %0, i64 %1, i64 %2) {
%4 = alloca i16*
%5 = alloca i64
%6 = alloca i64
%7 = alloca i32
%8 = alloca i16
store i16* %0, i16** %4
store i64 %1, i64* %5
store i64 %2, i64* %6
%9 = load i16*, i16** %4
%10 = load i64, i64* %5
%11 = getelementptr inbounds i16, i16* %9, i64 %10
%12 = load i16, i16* %11
store i16 %12, i16* %8
%13 = load i64, i64* %5
%14 = add nsw i64 %13, 1
%15 = trunc i64 %14 to i32
store i32 %15, i32* %7
br label %16
16: ; preds = %38, %3
%17 = load i32, i32* %7
%18 = sext i32 %17 to i64
%19 = load i64, i64* %6
%20 = icmp sle i64 %18, %19
br i1 %20, label %21, label %41
21: ; preds = %16
%22 = load i16*, i16** %4
%23 = load i32, i32* %7
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i16, i16* %22, i64 %24
%26 = load i16, i16* %25
%27 = sext i16 %26 to i32
%28 = load i16, i16* %8
%29 = sext i16 %28 to i32
%30 = icmp sgt i32 %27, %29
br i1 %30, label %31, label %37
31: ; preds = %21
%32 = load i16*, i16** %4
%33 = load i32, i32* %7
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i16, i16* %32, i64 %34
%36 = load i16, i16* %35
store i16 %36, i16* %8
br label %37
37: ; preds = %31, %21
br label %38
38: ; preds = %37
%39 = load i32, i32* %7
%40 = add nsw i32 %39, 1
store i32 %40, i32* %7
br label %16
41: ; preds = %16
%42 = load i16, i16* %8
ret i16 %42
}

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