unsigned bug(unsigned short value, unsigned short *buffer,
             unsigned short *bufend) {
  unsigned short *tmp;
  for (tmp = buffer; tmp < bufend; tmp++)
    value -= *tmp;
  return value;
}


x86 assembly (clang, -O0):
<bug>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x2(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    114b <bug+0x4b>
mov    -0x20(%rbp),%rax
movzwl (%rax),%ecx
movzwl -0x2(%rbp),%eax
sub    %ecx,%eax
mov    %ax,-0x2(%rbp)
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
jmp    111b <bug+0x1b>
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bug>:
cmp    %rdx,%rsi
jae    123c <bug+0x13c>
lea    0x2(%rsi),%rax
cmp    %rax,%rdx
cmova  %rdx,%rax
mov    %rsi,%r9
not    %r9
add    %rax,%r9
cmp    $0x1e,%r9
jb     1230 <bug+0x130>
shr    %r9
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff0,%r8
movzwl %di,%eax
movd   %eax,%xmm0
lea    -0x10(%r8),%rcx
mov    %rcx,%rdi
shr    $0x4,%rdi
add    $0x1,%rdi
mov    %edi,%eax
and    $0x3,%eax
cmp    $0x30,%rcx
jae    115e <bug+0x5e>
pxor   %xmm1,%xmm1
xor    %ecx,%ecx
jmp    11c9 <bug+0xc9>
and    $0xfffffffffffffffc,%rdi
pxor   %xmm1,%xmm1
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movdqu (%rsi,%rcx,2),%xmm2
movdqu 0x10(%rsi,%rcx,2),%xmm3
movdqu 0x20(%rsi,%rcx,2),%xmm4
paddw  %xmm2,%xmm4
movdqu 0x30(%rsi,%rcx,2),%xmm2
paddw  %xmm3,%xmm2
movdqu 0x40(%rsi,%rcx,2),%xmm3
movdqu 0x50(%rsi,%rcx,2),%xmm5
movdqu 0x60(%rsi,%rcx,2),%xmm6
paddw  %xmm3,%xmm6
paddw  %xmm4,%xmm6
psubw  %xmm6,%xmm0
movdqu 0x70(%rsi,%rcx,2),%xmm3
paddw  %xmm5,%xmm3
paddw  %xmm2,%xmm3
psubw  %xmm3,%xmm1
add    $0x40,%rcx
add    $0xfffffffffffffffc,%rdi
jne    1170 <bug+0x70>
test   %rax,%rax
je     11fc <bug+0xfc>
lea    (%rsi,%rcx,2),%rcx
add    $0x10,%rcx
shl    $0x5,%rax
xor    %edi,%edi
nopl   0x0(%rax)
movdqu -0x10(%rcx,%rdi,1),%xmm2
psubw  %xmm2,%xmm0
movdqu (%rcx,%rdi,1),%xmm2
psubw  %xmm2,%xmm1
add    $0x20,%rdi
cmp    %rdi,%rax
jne    11e0 <bug+0xe0>
paddw  %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddw  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddw  %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrld  $0x10,%xmm1
paddw  %xmm0,%xmm1
movd   %xmm1,%edi
cmp    %r8,%r9
je     123c <bug+0x13c>
lea    (%rsi,%r8,2),%rsi
nopl   0x0(%rax)
sub    (%rsi),%di
add    $0x2,%rsi
cmp    %rdx,%rsi
jb     1230 <bug+0x130>
movzwl %di,%eax
ret

LLVM IR (-O0):
define i32 @bug(i16 zeroext %0, i16* %1, i16* %2) {
%4 = alloca i16
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca i16*
store i16 %0, i16* %4
store i16* %1, i16** %5
store i16* %2, i16** %6
%8 = load i16*, i16** %5
store i16* %8, i16** %7
br label %9
9: ; preds = %21, %3
%10 = load i16*, i16** %7
%11 = load i16*, i16** %6
%12 = icmp ult i16* %10, %11
br i1 %12, label %13, label %24
13: ; preds = %9
%14 = load i16*, i16** %7
%15 = load i16, i16* %14
%16 = zext i16 %15 to i32
%17 = load i16, i16* %4
%18 = zext i16 %17 to i32
%19 = sub nsw i32 %18, %16
%20 = trunc i32 %19 to i16
store i16 %20, i16* %4
br label %21
21: ; preds = %13
%22 = load i16*, i16** %7
%23 = getelementptr inbounds i16, i16* %22, i32 1
store i16* %23, i16** %7
br label %9
24: ; preds = %9
%25 = load i16, i16* %4
%26 = zext i16 %25 to i32
ret i32 %26
}

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