#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 int /*<<< orphan*/ longword;

/* Variables and functions */
scalar_t__ __glibc_unlikely(int);
int /*<<< orphan*/ abort();
size_t __strnlen(const char *str, size_t maxlen) {
  const char *char_ptr, *end_ptr = str + maxlen;
  const unsigned long int *longword_ptr;
  unsigned long int longword, himagic, lomagic;
  if (maxlen == 0)
    return 0;
  if (__glibc_unlikely(end_ptr < str))
    end_ptr = (const char *)~0UL;
  for (char_ptr = str;
       ((unsigned long int)char_ptr & (sizeof(longword) - 1)) != 0; ++char_ptr)
    if (*char_ptr == '\0') {
      if (char_ptr > end_ptr)
        char_ptr = end_ptr;
      return char_ptr - str;
    }
  longword_ptr = (unsigned long int *)char_ptr;
  himagic = 0x80808080L;
  lomagic = 0x01010101L;
  if (sizeof(longword) > 4) {
    himagic = ((himagic << 16) << 16) | himagic;
    lomagic = ((lomagic << 16) << 16) | lomagic;
  }
  if (sizeof(longword) > 8)
    abort();
  while (longword_ptr < (unsigned long int *)end_ptr) {
    longword = *longword_ptr++;
    if ((longword - lomagic) & himagic) {
      const char *cp = (const char *)(longword_ptr - 1);
      char_ptr = cp;
      if (cp[0] == 0)
        break;
      char_ptr = cp + 1;
      if (cp[1] == 0)
        break;
      char_ptr = cp + 2;
      if (cp[2] == 0)
        break;
      char_ptr = cp + 3;
      if (cp[3] == 0)
        break;
      if (sizeof(longword) > 4) {
        char_ptr = cp + 4;
        if (cp[4] == 0)
          break;
        char_ptr = cp + 5;
        if (cp[5] == 0)
          break;
        char_ptr = cp + 6;
        if (cp[6] == 0)
          break;
        char_ptr = cp + 7;
        if (cp[7] == 0)
          break;
      }
    }
    char_ptr = end_ptr;
  }
  if (char_ptr > end_ptr)
    char_ptr = end_ptr;
  return char_ptr - str;
}


x86 assembly (clang, -O0):
<__strnlen>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1144 <__strnlen+0x34>
movq   $0x0,-0x8(%rbp)
jmp    13a4 <__strnlen+0x294>
mov    -0x28(%rbp),%rax
cmp    -0x10(%rbp),%rax
setb   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <__glibc_unlikely@plt>
cmp    $0x0,%rax
je     116e <__strnlen+0x5e>
mov    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    $0x7,%rax
cmp    $0x0,%rax
je     11d8 <__strnlen+0xc8>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11c2 <__strnlen+0xb2>
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
jbe    11ae <__strnlen+0x9e>
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    13a4 <__strnlen+0x294>
jmp    11c7 <__strnlen+0xb7>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1176 <__strnlen+0x66>
mov    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    $0x80808080,%eax
mov    %rax,-0x40(%rbp)
movq   $0x1010101,-0x48(%rbp)
01
mov    -0x40(%rbp),%rax
shl    $0x10,%rax
shl    $0x10,%rax
or     -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
shl    $0x10,%rax
shl    $0x10,%rax
or     -0x48(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x28(%rbp),%rcx
cmp    %rcx,%rax
jae    137f <__strnlen+0x26f>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
sub    -0x48(%rbp),%rax
and    -0x40(%rbp),%rax
cmp    $0x0,%rax
je     1372 <__strnlen+0x262>
mov    -0x30(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    127f <__strnlen+0x16f>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
jne    12a1 <__strnlen+0x191>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    12c3 <__strnlen+0x1b3>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x0,%eax
jne    12e5 <__strnlen+0x1d5>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x4(%rax),%eax
cmp    $0x0,%eax
jne    1307 <__strnlen+0x1f7>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x5(%rax),%eax
cmp    $0x0,%eax
jne    1329 <__strnlen+0x219>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x0,%eax
jne    134b <__strnlen+0x23b>
jmp    137f <__strnlen+0x26f>
mov    -0x50(%rbp),%rax
add    $0x7,%rax
mov    %rax,-0x20(%rbp)
mov    -0x50(%rbp),%rax
movsbl 0x7(%rax),%eax
cmp    $0x0,%eax
jne    136d <__strnlen+0x25d>
jmp    137f <__strnlen+0x26f>
jmp    1372 <__strnlen+0x262>
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    1219 <__strnlen+0x109>
mov    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
jbe    1395 <__strnlen+0x285>
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__strnlen>:
push   %r14
push   %rbx
push   %rax
test   %rsi,%rsi
je     125d <__strnlen+0x14d>
mov    %rdi,%r14
lea    (%rdi,%rsi,1),%rbx
shr    $0x3f,%rsi
mov    %esi,%edi
call   1030 <__glibc_unlikely@plt>
neg    %rax
sbb    %rcx,%rcx
or     %rbx,%rcx
mov    %r14,%rax
test   $0x7,%r14b
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%r14)
mov    %r14,%rax
je     1288 <__strnlen+0x178>
lea    0x1(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x2(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x3(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x4(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x5(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x6(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x7(%r14),%rax
test   $0x7,%al
je     11cd <__strnlen+0xbd>
cmpb   $0x0,(%rax)
je     1288 <__strnlen+0x178>
lea    0x8(%r14),%rax
cmp    %rcx,%rax
jae    1288 <__strnlen+0x178>
movabs $0xfefefefefefefeff,%rdx
fe fe fe
movabs $0x8080808080808080,%rsi
80 80 80
movabs $0xff00000000,%r10
movabs $0xff0000000000,%r8
movabs $0xff000000000000,%r9
jmp    1219 <__strnlen+0x109>
nopw   0x0(%rax,%rax,1)
add    $0x8,%rax
cmp    %rcx,%rax
jae    1261 <__strnlen+0x151>
mov    (%rax),%rdi
lea    (%rdi,%rdx,1),%rbx
test   %rsi,%rbx
je     1210 <__strnlen+0x100>
test   %dil,%dil
je     1288 <__strnlen+0x178>
test   $0xff00,%edi
je     1266 <__strnlen+0x156>
test   $0xff0000,%edi
je     126c <__strnlen+0x15c>
test   $0xff000000,%edi
je     1272 <__strnlen+0x162>
test   %r10,%rdi
je     1278 <__strnlen+0x168>
test   %r8,%rdi
je     127e <__strnlen+0x16e>
test   %r9,%rdi
je     1284 <__strnlen+0x174>
shr    $0x38,%rdi
jne    1210 <__strnlen+0x100>
add    $0x7,%rax
jmp    1288 <__strnlen+0x178>
xor    %eax,%eax
jmp    1292 <__strnlen+0x182>
mov    %rcx,%rax
jmp    1288 <__strnlen+0x178>
add    $0x1,%rax
jmp    1288 <__strnlen+0x178>
add    $0x2,%rax
jmp    1288 <__strnlen+0x178>
add    $0x3,%rax
jmp    1288 <__strnlen+0x178>
add    $0x4,%rax
jmp    1288 <__strnlen+0x178>
add    $0x5,%rax
jmp    1288 <__strnlen+0x178>
add    $0x6,%rax
cmp    %rcx,%rax
cmova  %rcx,%rax
sub    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define i64 @__strnlen(i8* %0, i64 %1) {
%3 = alloca i64
%4 = alloca i8*
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i64*
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i8*
store i8* %0, i8** %4
store i64 %1, i64* %5
%13 = load i8*, i8** %4
%14 = load i64, i64* %5
%15 = getelementptr inbounds i8, i8* %13, i64 %14
store i8* %15, i8** %7
%16 = load i64, i64* %5
%17 = icmp eq i64 %16, 0
br i1 %17, label %18, label %19
18: ; preds = %2
store i64 0, i64* %3
br label %172
19: ; preds = %2
%20 = load i8*, i8** %7
%21 = load i8*, i8** %4
%22 = icmp ult i8* %20, %21
%23 = zext i1 %22 to i32
%24 = call i64 @__glibc_unlikely(i32 %23)
%25 = icmp ne i64 %24, 0
br i1 %25, label %26, label %27
26: ; preds = %19
store i8* inttoptr (i64 -1 to i8*), i8** %7
br label %27
27: ; preds = %26, %19
%28 = load i8*, i8** %4
store i8* %28, i8** %6
br label %29
29: ; preds = %52, %27
%30 = load i8*, i8** %6
%31 = ptrtoint i8* %30 to i64
%32 = and i64 %31, 7
%33 = icmp ne i64 %32, 0
br i1 %33, label %34, label %55
34: ; preds = %29
%35 = load i8*, i8** %6
%36 = load i8, i8* %35
%37 = sext i8 %36 to i32
%38 = icmp eq i32 %37, 0
br i1 %38, label %39, label %51
39: ; preds = %34
%40 = load i8*, i8** %6
%41 = load i8*, i8** %7
%42 = icmp ugt i8* %40, %41
br i1 %42, label %43, label %45
43: ; preds = %39
%44 = load i8*, i8** %7
store i8* %44, i8** %6
br label %45
45: ; preds = %43, %39
%46 = load i8*, i8** %6
%47 = load i8*, i8** %4
%48 = ptrtoint i8* %46 to i64
%49 = ptrtoint i8* %47 to i64
%50 = sub i64 %48, %49
store i64 %50, i64* %3
br label %172
51: ; preds = %34
br label %52
52: ; preds = %51
%53 = load i8*, i8** %6
%54 = getelementptr inbounds i8, i8* %53, i32 1
store i8* %54, i8** %6
br label %29
55: ; preds = %29
%56 = load i8*, i8** %6
%57 = bitcast i8* %56 to i64*
store i64* %57, i64** %8
store i64 2155905152, i64* %10
store i64 16843009, i64* %11
%58 = load i64, i64* %10
%59 = shl i64 %58, 16
%60 = shl i64 %59, 16
%61 = load i64, i64* %10
%62 = or i64 %60, %61
store i64 %62, i64* %10
%63 = load i64, i64* %11
%64 = shl i64 %63, 16
%65 = shl i64 %64, 16
%66 = load i64, i64* %11
%67 = or i64 %65, %66
store i64 %67, i64* %11
br label %68
68: ; preds = %158, %55
%69 = load i64*, i64** %8
%70 = load i8*, i8** %7
%71 = bitcast i8* %70 to i64*
%72 = icmp ult i64* %69, %71
br i1 %72, label %73, label %160
73: ; preds = %68
%74 = load i64*, i64** %8
%75 = getelementptr inbounds i64, i64* %74, i32 1
store i64* %75, i64** %8
%76 = load i64, i64* %74
store i64 %76, i64* %9
%77 = load i64, i64* %9
%78 = load i64, i64* %11
%79 = sub i64 %77, %78
%80 = load i64, i64* %10
%81 = and i64 %79, %80
%82 = icmp ne i64 %81, 0
br i1 %82, label %83, label %158
83: ; preds = %73
%84 = load i64*, i64** %8
%85 = getelementptr inbounds i64, i64* %84, i64 -1
%86 = bitcast i64* %85 to i8*
store i8* %86, i8** %12
%87 = load i8*, i8** %12
store i8* %87, i8** %6
%88 = load i8*, i8** %12
%89 = getelementptr inbounds i8, i8* %88, i64 0
%90 = load i8, i8* %89
%91 = sext i8 %90 to i32
%92 = icmp eq i32 %91, 0
br i1 %92, label %93, label %94
93: ; preds = %83
br label %160
94: ; preds = %83
%95 = load i8*, i8** %12
%96 = getelementptr inbounds i8, i8* %95, i64 1
store i8* %96, i8** %6
%97 = load i8*, i8** %12
%98 = getelementptr inbounds i8, i8* %97, i64 1
%99 = load i8, i8* %98
%100 = sext i8 %99 to i32
%101 = icmp eq i32 %100, 0
br i1 %101, label %102, label %103
102: ; preds = %94
br label %160
103: ; preds = %94
%104 = load i8*, i8** %12
%105 = getelementptr inbounds i8, i8* %104, i64 2
store i8* %105, i8** %6
%106 = load i8*, i8** %12
%107 = getelementptr inbounds i8, i8* %106, i64 2
%108 = load i8, i8* %107
%109 = sext i8 %108 to i32
%110 = icmp eq i32 %109, 0
br i1 %110, label %111, label %112
111: ; preds = %103
br label %160
112: ; preds = %103
%113 = load i8*, i8** %12
%114 = getelementptr inbounds i8, i8* %113, i64 3
store i8* %114, i8** %6
%115 = load i8*, i8** %12
%116 = getelementptr inbounds i8, i8* %115, i64 3
%117 = load i8, i8* %116
%118 = sext i8 %117 to i32
%119 = icmp eq i32 %118, 0
br i1 %119, label %120, label %121
120: ; preds = %112
br label %160
121: ; preds = %112
%122 = load i8*, i8** %12
%123 = getelementptr inbounds i8, i8* %122, i64 4
store i8* %123, i8** %6
%124 = load i8*, i8** %12
%125 = getelementptr inbounds i8, i8* %124, i64 4
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp eq i32 %127, 0
br i1 %128, label %129, label %130
129: ; preds = %121
br label %160
130: ; preds = %121
%131 = load i8*, i8** %12
%132 = getelementptr inbounds i8, i8* %131, i64 5
store i8* %132, i8** %6
%133 = load i8*, i8** %12
%134 = getelementptr inbounds i8, i8* %133, i64 5
%135 = load i8, i8* %134
%136 = sext i8 %135 to i32
%137 = icmp eq i32 %136, 0
br i1 %137, label %138, label %139
138: ; preds = %130
br label %160
139: ; preds = %130
%140 = load i8*, i8** %12
%141 = getelementptr inbounds i8, i8* %140, i64 6
store i8* %141, i8** %6
%142 = load i8*, i8** %12
%143 = getelementptr inbounds i8, i8* %142, i64 6
%144 = load i8, i8* %143
%145 = sext i8 %144 to i32
%146 = icmp eq i32 %145, 0
br i1 %146, label %147, label %148
147: ; preds = %139
br label %160
148: ; preds = %139
%149 = load i8*, i8** %12
%150 = getelementptr inbounds i8, i8* %149, i64 7
store i8* %150, i8** %6
%151 = load i8*, i8** %12
%152 = getelementptr inbounds i8, i8* %151, i64 7
%153 = load i8, i8* %152
%154 = sext i8 %153 to i32
%155 = icmp eq i32 %154, 0
br i1 %155, label %156, label %157
156: ; preds = %148
br label %160
157: ; preds = %148
br label %158
158: ; preds = %157, %73
%159 = load i8*, i8** %7
store i8* %159, i8** %6
br label %68
160: ; preds = %156, %147, %138, %129, %120, %111, %102, %93, %68
%161 = load i8*, i8** %6
%162 = load i8*, i8** %7
%163 = icmp ugt i8* %161, %162
br i1 %163, label %164, label %166
164: ; preds = %160
%165 = load i8*, i8** %7
store i8* %165, i8** %6
br label %166
166: ; preds = %164, %160
%167 = load i8*, i8** %6
%168 = load i8*, i8** %4
%169 = ptrtoint i8* %167 to i64
%170 = ptrtoint i8* %168 to i64
%171 = sub i64 %169, %170
store i64 %171, i64* %3
br label %172
172: ; preds = %166, %45, %18
%173 = load i64, i64* %3
ret i64 %173
}

LLVM IR (-O2):
define i64 @__strnlen(i8* %0, i64 %1) {
%3 = icmp eq i64 %1, 0
br i1 %3, label %148, label %4
4: ; preds = %2
%5 = getelementptr inbounds i8, i8* %0, i64 %1
%6 = lshr i64 %1, 63
%7 = trunc i64 %6 to i32
%8 = tail call i64 @__glibc_unlikely(i32 %7)
%9 = icmp eq i64 %8, 0
%10 = select i1 %9, i8* %5, i8* inttoptr (i64 -1 to i8*)
%11 = ptrtoint i8* %0 to i64
%12 = and i64 %11, 7
%13 = icmp eq i64 %12, 0
br i1 %13, label %81, label %14
14: ; preds = %4
%15 = load i8, i8* %0
%16 = icmp eq i8 %15, 0
br i1 %16, label %17, label %23
17: ; preds = %76, %68, %60, %52, %44, %36, %28, %14
%18 = phi i8* [ %0, %14 ], [ %24, %28 ], [ %32, %36 ], [ %40, %44 ], [ %48, %52 ], [ %56, %60 ], [ %64, %68 ], [ %72, %76 ]
%19 = icmp ugt i8* %18, %10
%20 = select i1 %19, i8* %10, i8* %18
%21 = ptrtoint i8* %20 to i64
%22 = sub i64 %21, %11
br label %148
23: ; preds = %14
%24 = getelementptr inbounds i8, i8* %0, i64 1
%25 = ptrtoint i8* %24 to i64
%26 = and i64 %25, 7
%27 = icmp eq i64 %26, 0
br i1 %27, label %81, label %28
28: ; preds = %23
%29 = load i8, i8* %24
%30 = icmp eq i8 %29, 0
br i1 %30, label %17, label %31
31: ; preds = %28
%32 = getelementptr inbounds i8, i8* %0, i64 2
%33 = ptrtoint i8* %32 to i64
%34 = and i64 %33, 7
%35 = icmp eq i64 %34, 0
br i1 %35, label %81, label %36
36: ; preds = %31
%37 = load i8, i8* %32
%38 = icmp eq i8 %37, 0
br i1 %38, label %17, label %39
39: ; preds = %36
%40 = getelementptr inbounds i8, i8* %0, i64 3
%41 = ptrtoint i8* %40 to i64
%42 = and i64 %41, 7
%43 = icmp eq i64 %42, 0
br i1 %43, label %81, label %44
44: ; preds = %39
%45 = load i8, i8* %40
%46 = icmp eq i8 %45, 0
br i1 %46, label %17, label %47
47: ; preds = %44
%48 = getelementptr inbounds i8, i8* %0, i64 4
%49 = ptrtoint i8* %48 to i64
%50 = and i64 %49, 7
%51 = icmp eq i64 %50, 0
br i1 %51, label %81, label %52
52: ; preds = %47
%53 = load i8, i8* %48
%54 = icmp eq i8 %53, 0
br i1 %54, label %17, label %55
55: ; preds = %52
%56 = getelementptr inbounds i8, i8* %0, i64 5
%57 = ptrtoint i8* %56 to i64
%58 = and i64 %57, 7
%59 = icmp eq i64 %58, 0
br i1 %59, label %81, label %60
60: ; preds = %55
%61 = load i8, i8* %56
%62 = icmp eq i8 %61, 0
br i1 %62, label %17, label %63
63: ; preds = %60
%64 = getelementptr inbounds i8, i8* %0, i64 6
%65 = ptrtoint i8* %64 to i64
%66 = and i64 %65, 7
%67 = icmp eq i64 %66, 0
br i1 %67, label %81, label %68
68: ; preds = %63
%69 = load i8, i8* %64
%70 = icmp eq i8 %69, 0
br i1 %70, label %17, label %71
71: ; preds = %68
%72 = getelementptr inbounds i8, i8* %0, i64 7
%73 = ptrtoint i8* %72 to i64
%74 = and i64 %73, 7
%75 = icmp eq i64 %74, 0
br i1 %75, label %81, label %76
76: ; preds = %71
%77 = load i8, i8* %72
%78 = icmp eq i8 %77, 0
br i1 %78, label %17, label %79
79: ; preds = %76
%80 = getelementptr inbounds i8, i8* %0, i64 8
br label %81
81: ; preds = %23, %31, %39, %47, %55, %63, %71, %79, %4
%82 = phi i8* [ %0, %4 ], [ %24, %23 ], [ %32, %31 ], [ %40, %39 ], [ %48, %47 ], [ %56, %55 ], [ %64, %63 ], [ %72, %71 ], [ %80, %79 ]
%83 = bitcast i8* %10 to i64*
%84 = icmp ult i8* %82, %10
br i1 %84, label %85, label %142
85: ; preds = %81
%86 = bitcast i8* %82 to i64*
br label %87
87: ; preds = %85, %117
%88 = phi i64* [ %89, %117 ], [ %86, %85 ]
%89 = getelementptr inbounds i64, i64* %88, i64 1
%90 = load i64, i64* %88
%91 = add i64 %90, -72340172838076673
%92 = and i64 %91, -9187201950435737472
%93 = icmp eq i64 %92, 0
br i1 %93, label %117, label %94
94: ; preds = %87
%95 = trunc i64 %90 to i8
%96 = icmp eq i8 %95, 0
br i1 %96, label %140, label %97
97: ; preds = %94
%98 = and i64 %90, 65280
%99 = icmp eq i64 %98, 0
br i1 %99, label %137, label %100
100: ; preds = %97
%101 = and i64 %90, 16711680
%102 = icmp eq i64 %101, 0
br i1 %102, label %134, label %103
103: ; preds = %100
%104 = and i64 %90, 4278190080
%105 = icmp eq i64 %104, 0
br i1 %105, label %131, label %106
106: ; preds = %103
%107 = and i64 %90, 1095216660480
%108 = icmp eq i64 %107, 0
br i1 %108, label %128, label %109
109: ; preds = %106
%110 = and i64 %90, 280375465082880
%111 = icmp eq i64 %110, 0
br i1 %111, label %125, label %112
112: ; preds = %109
%113 = and i64 %90, 71776119061217280
%114 = icmp eq i64 %113, 0
br i1 %114, label %122, label %115
115: ; preds = %112
%116 = icmp ult i64 %90, 72057594037927936
br i1 %116, label %119, label %117
117: ; preds = %115, %87
%118 = icmp ult i64* %89, %83
br i1 %118, label %87, label %142
119: ; preds = %115
%120 = bitcast i64* %88 to i8*
%121 = getelementptr inbounds i8, i8* %120, i64 7
br label %142
122: ; preds = %112
%123 = bitcast i64* %88 to i8*
%124 = getelementptr inbounds i8, i8* %123, i64 6
br label %142
125: ; preds = %109
%126 = bitcast i64* %88 to i8*
%127 = getelementptr inbounds i8, i8* %126, i64 5
br label %142
128: ; preds = %106
%129 = bitcast i64* %88 to i8*
%130 = getelementptr inbounds i8, i8* %129, i64 4
br label %142
131: ; preds = %103
%132 = bitcast i64* %88 to i8*
%133 = getelementptr inbounds i8, i8* %132, i64 3
br label %142
134: ; preds = %100
%135 = bitcast i64* %88 to i8*
%136 = getelementptr inbounds i8, i8* %135, i64 2
br label %142
137: ; preds = %97
%138 = bitcast i64* %88 to i8*
%139 = getelementptr inbounds i8, i8* %138, i64 1
br label %142
140: ; preds = %94
%141 = bitcast i64* %88 to i8*
br label %142
142: ; preds = %117, %140, %81, %137, %134, %131, %128, %125, %122, %119
%143 = phi i8* [ %121, %119 ], [ %124, %122 ], [ %127, %125 ], [ %130, %128 ], [ %133, %131 ], [ %136, %134 ], [ %139, %137 ], [ %82, %81 ], [ %141, %140 ], [ %10, %117 ]
%144 = icmp ugt i8* %143, %10
%145 = select i1 %144, i8* %10, i8* %143
%146 = ptrtoint i8* %145 to i64
%147 = sub i64 %146, %11
br label %148
148: ; preds = %2, %142, %17
%149 = phi i64 [ %22, %17 ], [ %147, %142 ], [ 0, %2 ]
ret i64 %149
}