unsigned char checksum(unsigned char *buf, unsigned char len) {
  unsigned char tmp = 0, i;
  for (i = 0; i < len; i++)
    tmp += buf[i];
  return tmp;
}


x86 assembly (clang, -O0):
<checksum>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %rdi,-0x8(%rbp)
mov    %al,-0x9(%rbp)
movb   $0x0,-0xa(%rbp)
movb   $0x0,-0xb(%rbp)
movzbl -0xb(%rbp),%eax
movzbl -0x9(%rbp),%ecx
cmp    %ecx,%eax
jge    1148 <checksum+0x48>
mov    -0x8(%rbp),%rax
movzbl -0xb(%rbp),%ecx
movzbl (%rax,%rcx,1),%ecx
movzbl -0xa(%rbp),%eax
add    %ecx,%eax
mov    %al,-0xa(%rbp)
mov    -0xb(%rbp),%al
add    $0x1,%al
mov    %al,-0xb(%rbp)
jmp    1116 <checksum+0x16>
movzbl -0xa(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<checksum>:
test   %esi,%esi
je     1116 <checksum+0x16>
movzbl %sil,%ecx
cmp    $0x8,%cl
jae    1119 <checksum+0x19>
xor    %edx,%edx
xor    %eax,%eax
jmp    1250 <checksum+0x150>
xor    %eax,%eax
ret
cmp    $0x20,%sil
jae    1128 <checksum+0x28>
xor    %eax,%eax
xor    %edx,%edx
jmp    1207 <checksum+0x107>
mov    %ecx,%edx
and    $0xffffffe0,%edx
movdqu (%rdi),%xmm0
movdqu 0x10(%rdi),%xmm1
cmp    $0x20,%rdx
je     11e4 <checksum+0xe4>
movdqu 0x20(%rdi),%xmm2
movdqu 0x30(%rdi),%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm3,%xmm1
cmp    $0x40,%edx
je     11e4 <checksum+0xe4>
movdqu 0x40(%rdi),%xmm2
movdqu 0x50(%rdi),%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm3,%xmm1
cmp    $0x60,%edx
je     11e4 <checksum+0xe4>
movdqu 0x60(%rdi),%xmm2
movdqu 0x70(%rdi),%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm3,%xmm1
cmp    $0x80,%edx
je     11e4 <checksum+0xe4>
movdqu 0x80(%rdi),%xmm2
movdqu 0x90(%rdi),%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm3,%xmm1
cmp    $0xa0,%edx
je     11e4 <checksum+0xe4>
movdqu 0xa0(%rdi),%xmm2
movdqu 0xb0(%rdi),%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm3,%xmm1
cmp    $0xc0,%edx
je     11e4 <checksum+0xe4>
movdqu 0xc0(%rdi),%xmm2
movdqu 0xd0(%rdi),%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm3,%xmm1
paddb  %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddb  %xmm0,%xmm1
pxor   %xmm0,%xmm0
psadbw %xmm1,%xmm0
movd   %xmm0,%eax
cmp    %rcx,%rdx
je     125c <checksum+0x15c>
test   $0x18,%cl
je     1250 <checksum+0x150>
mov    %rdx,%rsi
mov    %ecx,%edx
and    $0xfffffff8,%edx
movzbl %al,%eax
movd   %eax,%xmm0
cs nopw 0x0(%rax,%rax,1)
movq   (%rdi,%rsi,1),%xmm1
paddb  %xmm1,%xmm0
add    $0x8,%rsi
cmp    %rsi,%rdx
jne    1220 <checksum+0x120>
pxor   %xmm1,%xmm1
psadbw %xmm1,%xmm0
movd   %xmm0,%eax
cmp    %rcx,%rdx
je     125c <checksum+0x15c>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    (%rdi,%rdx,1),%al
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    1250 <checksum+0x150>
ret

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

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