__attribute__((no)) int addup_wrongly(short *arr) {
  int sum = 0, i;
  for (i = 0; i <= 100; i++)
    sum += (int)arr[i];
  return sum;
}


x86 assembly (clang, -O0):
<addup_wrongly>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
cmpl   $0x64,-0x10(%rbp)
jg     1140 <addup_wrongly+0x40>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1116 <addup_wrongly+0x16>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<addup_wrongly>:
movq   (%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
movq   0x8(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm0,%xmm1
movq   0x10(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
movq   0x18(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm0,%xmm2
paddd  %xmm1,%xmm2
movq   0x20(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
movq   0x28(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm0,%xmm1
movq   0x30(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
paddd  %xmm1,%xmm0
paddd  %xmm2,%xmm0
movq   0x38(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
movq   0x40(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm1,%xmm2
movq   0x48(%rdi),%xmm1
punpcklwd %xmm1,%xmm3
psrad  $0x10,%xmm3
paddd  %xmm2,%xmm3
movq   0x50(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm3,%xmm1
paddd  %xmm0,%xmm1
movq   0x58(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
movq   0x60(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm0,%xmm2
movq   0x68(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
paddd  %xmm2,%xmm0
movq   0x70(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm0,%xmm2
movq   0x78(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
paddd  %xmm2,%xmm0
paddd  %xmm1,%xmm0
movq   0x80(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
movq   0x88(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm1,%xmm2
movq   0x90(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm2,%xmm1
movq   0x98(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm1,%xmm2
movq   0xa0(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm2,%xmm1
movq   0xa8(%rdi),%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
paddd  %xmm1,%xmm2
paddd  %xmm0,%xmm2
movq   0xb0(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
movq   0xb8(%rdi),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
paddd  %xmm0,%xmm1
movq   0xc0(%rdi),%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x10,%xmm0
paddd  %xmm1,%xmm0
paddd  %xmm2,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%ecx
movswl 0xc8(%rdi),%eax
add    %ecx,%eax
ret

LLVM IR (-O0):
define i32 @addup_wrongly(i16* %0) {
%2 = alloca i16*
%3 = alloca i32
%4 = alloca i32
store i16* %0, i16** %2
store i32 0, i32* %3
store i32 0, i32* %4
br label %5
5: ; preds = %17, %1
%6 = load i32, i32* %4
%7 = icmp sle i32 %6, 100
br i1 %7, label %8, label %20
8: ; preds = %5
%9 = load i16*, i16** %2
%10 = load i32, i32* %4
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds i16, i16* %9, i64 %11
%13 = load i16, i16* %12
%14 = sext i16 %13 to i32
%15 = load i32, i32* %3
%16 = add nsw i32 %15, %14
store i32 %16, i32* %3
br label %17
17: ; preds = %8
%18 = load i32, i32* %4
%19 = add nsw i32 %18, 1
store i32 %19, i32* %4
br label %5
20: ; preds = %5
%21 = load i32, i32* %3
ret i32 %21
}

LLVM IR (-O2):
define i32 @addup_wrongly(i16* nocapture %0) {
%2 = bitcast i16* %0 to <4 x i16>*
%3 = load <4 x i16>, <4 x i16>* %2
%4 = sext <4 x i16> %3 to <4 x i32>
%5 = getelementptr inbounds i16, i16* %0, i64 4
%6 = bitcast i16* %5 to <4 x i16>*
%7 = load <4 x i16>, <4 x i16>* %6
%8 = sext <4 x i16> %7 to <4 x i32>
%9 = add nsw <4 x i32> %4, %8
%10 = getelementptr inbounds i16, i16* %0, i64 8
%11 = bitcast i16* %10 to <4 x i16>*
%12 = load <4 x i16>, <4 x i16>* %11
%13 = sext <4 x i16> %12 to <4 x i32>
%14 = add nsw <4 x i32> %9, %13
%15 = getelementptr inbounds i16, i16* %0, i64 12
%16 = bitcast i16* %15 to <4 x i16>*
%17 = load <4 x i16>, <4 x i16>* %16
%18 = sext <4 x i16> %17 to <4 x i32>
%19 = add nsw <4 x i32> %14, %18
%20 = getelementptr inbounds i16, i16* %0, i64 16
%21 = bitcast i16* %20 to <4 x i16>*
%22 = load <4 x i16>, <4 x i16>* %21
%23 = sext <4 x i16> %22 to <4 x i32>
%24 = add nsw <4 x i32> %19, %23
%25 = getelementptr inbounds i16, i16* %0, i64 20
%26 = bitcast i16* %25 to <4 x i16>*
%27 = load <4 x i16>, <4 x i16>* %26
%28 = sext <4 x i16> %27 to <4 x i32>
%29 = add nsw <4 x i32> %24, %28
%30 = getelementptr inbounds i16, i16* %0, i64 24
%31 = bitcast i16* %30 to <4 x i16>*
%32 = load <4 x i16>, <4 x i16>* %31
%33 = sext <4 x i16> %32 to <4 x i32>
%34 = add nsw <4 x i32> %29, %33
%35 = getelementptr inbounds i16, i16* %0, i64 28
%36 = bitcast i16* %35 to <4 x i16>*
%37 = load <4 x i16>, <4 x i16>* %36
%38 = sext <4 x i16> %37 to <4 x i32>
%39 = add <4 x i32> %34, %38
%40 = getelementptr inbounds i16, i16* %0, i64 32
%41 = bitcast i16* %40 to <4 x i16>*
%42 = load <4 x i16>, <4 x i16>* %41
%43 = sext <4 x i16> %42 to <4 x i32>
%44 = add <4 x i32> %39, %43
%45 = getelementptr inbounds i16, i16* %0, i64 36
%46 = bitcast i16* %45 to <4 x i16>*
%47 = load <4 x i16>, <4 x i16>* %46
%48 = sext <4 x i16> %47 to <4 x i32>
%49 = add <4 x i32> %44, %48
%50 = getelementptr inbounds i16, i16* %0, i64 40
%51 = bitcast i16* %50 to <4 x i16>*
%52 = load <4 x i16>, <4 x i16>* %51
%53 = sext <4 x i16> %52 to <4 x i32>
%54 = add <4 x i32> %49, %53
%55 = getelementptr inbounds i16, i16* %0, i64 44
%56 = bitcast i16* %55 to <4 x i16>*
%57 = load <4 x i16>, <4 x i16>* %56
%58 = sext <4 x i16> %57 to <4 x i32>
%59 = add <4 x i32> %54, %58
%60 = getelementptr inbounds i16, i16* %0, i64 48
%61 = bitcast i16* %60 to <4 x i16>*
%62 = load <4 x i16>, <4 x i16>* %61
%63 = sext <4 x i16> %62 to <4 x i32>
%64 = add <4 x i32> %59, %63
%65 = getelementptr inbounds i16, i16* %0, i64 52
%66 = bitcast i16* %65 to <4 x i16>*
%67 = load <4 x i16>, <4 x i16>* %66
%68 = sext <4 x i16> %67 to <4 x i32>
%69 = add <4 x i32> %64, %68
%70 = getelementptr inbounds i16, i16* %0, i64 56
%71 = bitcast i16* %70 to <4 x i16>*
%72 = load <4 x i16>, <4 x i16>* %71
%73 = sext <4 x i16> %72 to <4 x i32>
%74 = add <4 x i32> %69, %73
%75 = getelementptr inbounds i16, i16* %0, i64 60
%76 = bitcast i16* %75 to <4 x i16>*
%77 = load <4 x i16>, <4 x i16>* %76
%78 = sext <4 x i16> %77 to <4 x i32>
%79 = add <4 x i32> %74, %78
%80 = getelementptr inbounds i16, i16* %0, i64 64
%81 = bitcast i16* %80 to <4 x i16>*
%82 = load <4 x i16>, <4 x i16>* %81
%83 = sext <4 x i16> %82 to <4 x i32>
%84 = add <4 x i32> %79, %83
%85 = getelementptr inbounds i16, i16* %0, i64 68
%86 = bitcast i16* %85 to <4 x i16>*
%87 = load <4 x i16>, <4 x i16>* %86
%88 = sext <4 x i16> %87 to <4 x i32>
%89 = add <4 x i32> %84, %88
%90 = getelementptr inbounds i16, i16* %0, i64 72
%91 = bitcast i16* %90 to <4 x i16>*
%92 = load <4 x i16>, <4 x i16>* %91
%93 = sext <4 x i16> %92 to <4 x i32>
%94 = add <4 x i32> %89, %93
%95 = getelementptr inbounds i16, i16* %0, i64 76
%96 = bitcast i16* %95 to <4 x i16>*
%97 = load <4 x i16>, <4 x i16>* %96
%98 = sext <4 x i16> %97 to <4 x i32>
%99 = add <4 x i32> %94, %98
%100 = getelementptr inbounds i16, i16* %0, i64 80
%101 = bitcast i16* %100 to <4 x i16>*
%102 = load <4 x i16>, <4 x i16>* %101
%103 = sext <4 x i16> %102 to <4 x i32>
%104 = add <4 x i32> %99, %103
%105 = getelementptr inbounds i16, i16* %0, i64 84
%106 = bitcast i16* %105 to <4 x i16>*
%107 = load <4 x i16>, <4 x i16>* %106
%108 = sext <4 x i16> %107 to <4 x i32>
%109 = add <4 x i32> %104, %108
%110 = getelementptr inbounds i16, i16* %0, i64 88
%111 = bitcast i16* %110 to <4 x i16>*
%112 = load <4 x i16>, <4 x i16>* %111
%113 = sext <4 x i16> %112 to <4 x i32>
%114 = add <4 x i32> %109, %113
%115 = getelementptr inbounds i16, i16* %0, i64 92
%116 = bitcast i16* %115 to <4 x i16>*
%117 = load <4 x i16>, <4 x i16>* %116
%118 = sext <4 x i16> %117 to <4 x i32>
%119 = add <4 x i32> %114, %118
%120 = getelementptr inbounds i16, i16* %0, i64 96
%121 = bitcast i16* %120 to <4 x i16>*
%122 = load <4 x i16>, <4 x i16>* %121
%123 = sext <4 x i16> %122 to <4 x i32>
%124 = add <4 x i32> %119, %123
%125 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %124)
%126 = getelementptr inbounds i16, i16* %0, i64 100
%127 = load i16, i16* %126
%128 = sext i16 %127 to i32
%129 = add nsw i32 %125, %128
ret i32 %129
}