#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef scalar_t__ tmp;

/* Variables and functions */
size_t str_len_07(const char *s) {
  size_t len = 0;
  const char *tmp;
  for (tmp = s; ((unsigned long)(tmp) & (15)) != 0; ++tmp) {
    if (!(*tmp)) {
      return tmp - s;
    }
  }
  len += (tmp - s);
  unsigned long long *a = (unsigned long long *)tmp;
  for (;; ++a) {
    if (!((*a - 0x0101010101010101) & ~*a & 0x8080808080808080)) {
      len += 8;
      continue;
    }
    if (!((*a) & (0x00000000000000ff))) {
      break;
    }
    if (!((*a) & (0x000000000000ff00))) {
      len += 1;
      break;
    }
    if (!((*a) & (0x0000000000ff0000))) {
      len += 2;
      break;
    }
    if (!((*a) & (0x00000000ff000000))) {
      len += 3;
      break;
    }
    if (!((*a) & (0x000000ff00000000))) {
      len += 4;
      break;
    }
    if (!((*a) & (0x0000ff0000000000))) {
      len += 5;
      break;
    }
    if (!((*a) & (0x00ff000000000000))) {
      len += 6;
      break;
    }
    if (!((*a) & (0xff00000000000000))) {
      len += 7;
      break;
    }
    len += 8;
  }
  return len;
}


x86 assembly (clang, -O0):
<str_len_07>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    $0xf,%rax
cmp    $0x0,%rax
je     1161 <str_len_07+0x61>
mov    -0x20(%rbp),%rax
cmpb   $0x0,(%rax)
jne    114b <str_len_07+0x4b>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    1333 <str_len_07+0x233>
jmp    1150 <str_len_07+0x50>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1118 <str_len_07+0x18>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
movabs $0x101010101010101,%rcx
01 01 01
sub    %rcx,%rax
mov    -0x28(%rbp),%rcx
mov    (%rcx),%rcx
xor    $0xffffffffffffffff,%rcx
and    %rcx,%rax
movabs $0x8080808080808080,%rcx
80 80 80
and    %rcx,%rax
cmp    $0x0,%rax
jne    11c6 <str_len_07+0xc6>
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
jmp    131a <str_len_07+0x21a>
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
and    $0xff,%rax
cmp    $0x0,%rax
jne    11e2 <str_len_07+0xe2>
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
and    $0xff00,%rax
cmp    $0x0,%rax
jne    120a <str_len_07+0x10a>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
and    $0xff0000,%rax
cmp    $0x0,%rax
jne    1232 <str_len_07+0x132>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rcx
movabs $0xff000000,%rax
and    (%rcx),%rax
cmp    $0x0,%rax
jne    125e <str_len_07+0x15e>
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rcx
movabs $0xff00000000,%rax
and    (%rcx),%rax
cmp    $0x0,%rax
jne    128a <str_len_07+0x18a>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rcx
movabs $0xff0000000000,%rax
and    (%rcx),%rax
cmp    $0x0,%rax
jne    12b6 <str_len_07+0x1b6>
mov    -0x18(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rcx
movabs $0xff000000000000,%rax
and    (%rcx),%rax
cmp    $0x0,%rax
jne    12e2 <str_len_07+0x1e2>
mov    -0x18(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x28(%rbp),%rcx
movabs $0xff00000000000000,%rax
and    (%rcx),%rax
cmp    $0x0,%rax
jne    130e <str_len_07+0x20e>
mov    -0x18(%rbp),%rax
add    $0x7,%rax
mov    %rax,-0x18(%rbp)
jmp    132b <str_len_07+0x22b>
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
jmp    117c <str_len_07+0x7c>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<str_len_07>:
push   %r14
push   %rbx
test   $0xf,%dil
je     1131 <str_len_07+0x31>
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
cmpb   $0x0,(%rdi,%rax,1)
je     11fe <str_len_07+0xfe>
lea    (%rdi,%rax,1),%ecx
add    $0x1,%ecx
add    $0x1,%rax
test   $0xf,%cl
jne    1110 <str_len_07+0x10>
add    %rdi,%rax
mov    %rax,%rdx
jmp    1137 <str_len_07+0x37>
mov    %rdi,%rax
mov    %rdi,%rdx
movabs $0x8080808080808080,%r11
80 80 80
sub    %rdi,%rax
xor    %ecx,%ecx
movabs $0xfefefefefefefeff,%r14
fe fe fe
movabs $0xff00000000,%r8
movabs $0xff0000000000,%r9
movabs $0xff000000000000,%r10
jmp    1174 <str_len_07+0x74>
add    $0x8,%rcx
mov    (%rdx,%rcx,1),%rsi
mov    %rsi,%rbx
not    %rbx
and    %r11,%rbx
lea    (%rsi,%r14,1),%rdi
test   %rdi,%rbx
je     1170 <str_len_07+0x70>
test   %sil,%sil
je     11c5 <str_len_07+0xc5>
test   $0xff00,%esi
je     11ca <str_len_07+0xca>
test   $0xff0000,%esi
je     11d3 <str_len_07+0xd3>
test   $0xff000000,%esi
je     11dc <str_len_07+0xdc>
test   %r8,%rsi
je     11e5 <str_len_07+0xe5>
test   %r9,%rsi
je     11ee <str_len_07+0xee>
test   %r10,%rsi
je     11f7 <str_len_07+0xf7>
shr    $0x38,%rsi
jne    1170 <str_len_07+0x70>
add    %rcx,%rax
add    $0x7,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
add    $0x1,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
add    $0x2,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
add    $0x3,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
add    $0x4,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
add    $0x5,%rax
jmp    11fe <str_len_07+0xfe>
add    %rcx,%rax
add    $0x6,%rax
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define i64 @str_len_07(i8* %0) {
%2 = alloca i64
%3 = alloca i8*
%4 = alloca i64
%5 = alloca i8*
%6 = alloca i64*
store i8* %0, i8** %3
store i64 0, i64* %4
%7 = load i8*, i8** %3
store i8* %7, i8** %5
br label %8
8: ; preds = %24, %1
%9 = load i8*, i8** %5
%10 = ptrtoint i8* %9 to i64
%11 = and i64 %10, 15
%12 = icmp ne i64 %11, 0
br i1 %12, label %13, label %27
13: ; preds = %8
%14 = load i8*, i8** %5
%15 = load i8, i8* %14
%16 = icmp ne i8 %15, 0
br i1 %16, label %23, label %17
17: ; preds = %13
%18 = load i8*, i8** %5
%19 = load i8*, i8** %3
%20 = ptrtoint i8* %18 to i64
%21 = ptrtoint i8* %19 to i64
%22 = sub i64 %20, %21
store i64 %22, i64* %2
br label %120
23: ; preds = %13
br label %24
24: ; preds = %23
%25 = load i8*, i8** %5
%26 = getelementptr inbounds i8, i8* %25, i32 1
store i8* %26, i8** %5
br label %8
27: ; preds = %8
%28 = load i8*, i8** %5
%29 = load i8*, i8** %3
%30 = ptrtoint i8* %28 to i64
%31 = ptrtoint i8* %29 to i64
%32 = sub i64 %30, %31
%33 = load i64, i64* %4
%34 = add i64 %33, %32
store i64 %34, i64* %4
%35 = load i8*, i8** %5
%36 = bitcast i8* %35 to i64*
store i64* %36, i64** %6
br label %37
37: ; preds = %115, %27
%38 = load i64*, i64** %6
%39 = load i64, i64* %38
%40 = sub i64 %39, 72340172838076673
%41 = load i64*, i64** %6
%42 = load i64, i64* %41
%43 = xor i64 %42, -1
%44 = and i64 %40, %43
%45 = and i64 %44, -9187201950435737472
%46 = icmp ne i64 %45, 0
br i1 %46, label %50, label %47
47: ; preds = %37
%48 = load i64, i64* %4
%49 = add i64 %48, 8
store i64 %49, i64* %4
br label %115
50: ; preds = %37
%51 = load i64*, i64** %6
%52 = load i64, i64* %51
%53 = and i64 %52, 255
%54 = icmp ne i64 %53, 0
br i1 %54, label %56, label %55
55: ; preds = %50
br label %118
56: ; preds = %50
%57 = load i64*, i64** %6
%58 = load i64, i64* %57
%59 = and i64 %58, 65280
%60 = icmp ne i64 %59, 0
br i1 %60, label %64, label %61
61: ; preds = %56
%62 = load i64, i64* %4
%63 = add i64 %62, 1
store i64 %63, i64* %4
br label %118
64: ; preds = %56
%65 = load i64*, i64** %6
%66 = load i64, i64* %65
%67 = and i64 %66, 16711680
%68 = icmp ne i64 %67, 0
br i1 %68, label %72, label %69
69: ; preds = %64
%70 = load i64, i64* %4
%71 = add i64 %70, 2
store i64 %71, i64* %4
br label %118
72: ; preds = %64
%73 = load i64*, i64** %6
%74 = load i64, i64* %73
%75 = and i64 %74, 4278190080
%76 = icmp ne i64 %75, 0
br i1 %76, label %80, label %77
77: ; preds = %72
%78 = load i64, i64* %4
%79 = add i64 %78, 3
store i64 %79, i64* %4
br label %118
80: ; preds = %72
%81 = load i64*, i64** %6
%82 = load i64, i64* %81
%83 = and i64 %82, 1095216660480
%84 = icmp ne i64 %83, 0
br i1 %84, label %88, label %85
85: ; preds = %80
%86 = load i64, i64* %4
%87 = add i64 %86, 4
store i64 %87, i64* %4
br label %118
88: ; preds = %80
%89 = load i64*, i64** %6
%90 = load i64, i64* %89
%91 = and i64 %90, 280375465082880
%92 = icmp ne i64 %91, 0
br i1 %92, label %96, label %93
93: ; preds = %88
%94 = load i64, i64* %4
%95 = add i64 %94, 5
store i64 %95, i64* %4
br label %118
96: ; preds = %88
%97 = load i64*, i64** %6
%98 = load i64, i64* %97
%99 = and i64 %98, 71776119061217280
%100 = icmp ne i64 %99, 0
br i1 %100, label %104, label %101
101: ; preds = %96
%102 = load i64, i64* %4
%103 = add i64 %102, 6
store i64 %103, i64* %4
br label %118
104: ; preds = %96
%105 = load i64*, i64** %6
%106 = load i64, i64* %105
%107 = and i64 %106, -72057594037927936
%108 = icmp ne i64 %107, 0
br i1 %108, label %112, label %109
109: ; preds = %104
%110 = load i64, i64* %4
%111 = add i64 %110, 7
store i64 %111, i64* %4
br label %118
112: ; preds = %104
%113 = load i64, i64* %4
%114 = add i64 %113, 8
store i64 %114, i64* %4
br label %115
115: ; preds = %112, %47
%116 = load i64*, i64** %6
%117 = getelementptr inbounds i64, i64* %116, i32 1
store i64* %117, i64** %6
br label %37
118: ; preds = %109, %101, %93, %85, %77, %69, %61, %55
%119 = load i64, i64* %4
store i64 %119, i64* %2
br label %120
120: ; preds = %118, %17
%121 = load i64, i64* %2
ret i64 %121
}

LLVM IR (-O2):
define i64 @str_len_07(i8* %0) {
%2 = ptrtoint i8* %0 to i64
%3 = and i64 %2, 15
%4 = icmp eq i64 %3, 0
br i1 %4, label %19, label %5
5: ; preds = %1, %12
%6 = phi i8* [ %13, %12 ], [ %0, %1 ]
%7 = load i8, i8* %6
%8 = icmp eq i8 %7, 0
br i1 %8, label %9, label %12
9: ; preds = %5
%10 = ptrtoint i8* %6 to i64
%11 = sub i64 %10, %2
br label %73
12: ; preds = %5
%13 = getelementptr inbounds i8, i8* %6, i64 1
%14 = ptrtoint i8* %13 to i64
%15 = and i64 %14, 15
%16 = icmp eq i64 %15, 0
br i1 %16, label %17, label %5
17: ; preds = %12
%18 = ptrtoint i8* %13 to i64
br label %19
19: ; preds = %17, %1
%20 = phi i64 [ %2, %1 ], [ %18, %17 ]
%21 = phi i8* [ %0, %1 ], [ %13, %17 ]
%22 = sub i64 %20, %2
%23 = bitcast i8* %21 to i64*
br label %24
24: ; preds = %70, %19
%25 = phi i64 [ %22, %19 ], [ %71, %70 ]
%26 = phi i64* [ %23, %19 ], [ %72, %70 ]
%27 = load i64, i64* %26
%28 = add i64 %27, -72340172838076673
%29 = and i64 %27, -9187201950435737472
%30 = xor i64 %29, -9187201950435737472
%31 = and i64 %30, %28
%32 = icmp eq i64 %31, 0
br i1 %32, label %70, label %33
33: ; preds = %24
%34 = and i64 %27, 255
%35 = icmp eq i64 %34, 0
br i1 %35, label %73, label %36
36: ; preds = %33
%37 = and i64 %27, 65280
%38 = icmp eq i64 %37, 0
br i1 %38, label %39, label %41
39: ; preds = %36
%40 = add i64 %25, 1
br label %73
41: ; preds = %36
%42 = and i64 %27, 16711680
%43 = icmp eq i64 %42, 0
br i1 %43, label %44, label %46
44: ; preds = %41
%45 = add i64 %25, 2
br label %73
46: ; preds = %41
%47 = and i64 %27, 4278190080
%48 = icmp eq i64 %47, 0
br i1 %48, label %49, label %51
49: ; preds = %46
%50 = add i64 %25, 3
br label %73
51: ; preds = %46
%52 = and i64 %27, 1095216660480
%53 = icmp eq i64 %52, 0
br i1 %53, label %54, label %56
54: ; preds = %51
%55 = add i64 %25, 4
br label %73
56: ; preds = %51
%57 = and i64 %27, 280375465082880
%58 = icmp eq i64 %57, 0
br i1 %58, label %59, label %61
59: ; preds = %56
%60 = add i64 %25, 5
br label %73
61: ; preds = %56
%62 = and i64 %27, 71776119061217280
%63 = icmp eq i64 %62, 0
br i1 %63, label %64, label %66
64: ; preds = %61
%65 = add i64 %25, 6
br label %73
66: ; preds = %61
%67 = icmp ult i64 %27, 72057594037927936
br i1 %67, label %68, label %70
68: ; preds = %66
%69 = add i64 %25, 7
br label %73
70: ; preds = %66, %24
%71 = add i64 %25, 8
%72 = getelementptr inbounds i64, i64* %26, i64 1
br label %24
73: ; preds = %33, %39, %44, %49, %54, %59, %64, %68, %9
%74 = phi i64 [ %11, %9 ], [ %69, %68 ], [ %65, %64 ], [ %60, %59 ], [ %55, %54 ], [ %50, %49 ], [ %45, %44 ], [ %40, %39 ], [ %25, %33 ]
ret i64 %74
}