#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 */

/* Variables and functions */
int /*<<< orphan*/ fts3PoslistCopy(int /*<<< orphan*/, char **);
int fts3DoclistCountDocids(int isPoslist, char *aList, int nList) {
  int nDoc = 0;
  if (aList) {
    char *aEnd = &aList[nList];
    char *p = aList;
    if (!isPoslist) {
      while (p < aEnd)
        nDoc += (((*p++) & 0x80) == 0);
    } else {
      while (p < aEnd) {
        nDoc++;
        while ((*p++) & 0x80)
          ;
        fts3PoslistCopy(0, &p);
      }
    }
  }
  return nDoc;
}


x86 assembly (clang, -O0):
<fts3DoclistCountDocids>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     11f5 <fts3DoclistCountDocids+0xe5>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpl   $0x0,-0x4(%rbp)
jne    119a <fts3DoclistCountDocids+0x8a>
jmp    115a <fts3DoclistCountDocids+0x4a>
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    1195 <fts3DoclistCountDocids+0x85>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    115a <fts3DoclistCountDocids+0x4a>
jmp    11f0 <fts3DoclistCountDocids+0xe0>
jmp    119f <fts3DoclistCountDocids+0x8f>
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    11eb <fts3DoclistCountDocids+0xdb>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     11db <fts3DoclistCountDocids+0xcb>
jmp    11b6 <fts3DoclistCountDocids+0xa6>
xor    %edi,%edi
lea    -0x28(%rbp),%rsi
call   1030 <fts3PoslistCopy@plt>
jmp    119f <fts3DoclistCountDocids+0x8f>
jmp    11f0 <fts3DoclistCountDocids+0xe0>
jmp    11f5 <fts3DoclistCountDocids+0xe5>
mov    -0x18(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fts3DoclistCountDocids>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
test   %rsi,%rsi
je     12f8 <fts3DoclistCountDocids+0x1e8>
movslq %edx,%r15
add    %rsi,%r15
test   %edi,%edi
je     117b <fts3DoclistCountDocids+0x6b>
xor    %ebx,%ebx
test   %edx,%edx
jle    12fa <fts3DoclistCountDocids+0x1ea>
lea    0x8(%rsp),%r14
nopl   0x0(%rax,%rax,1)
add    $0x1,%rsi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %rsi,0x8(%rsp)
cmpb   $0x0,-0x1(%rsi)
lea    0x1(%rsi),%rsi
js     1150 <fts3DoclistCountDocids+0x40>
add    $0x1,%ebx
xor    %edi,%edi
mov    %r14,%rsi
call   1030 <fts3PoslistCopy@plt>
mov    0x8(%rsp),%rsi
cmp    %r15,%rsi
jb     1140 <fts3DoclistCountDocids+0x30>
jmp    12fa <fts3DoclistCountDocids+0x1ea>
test   %edx,%edx
jle    12f8 <fts3DoclistCountDocids+0x1e8>
lea    0x1(%rsi),%rax
cmp    %rax,%r15
cmova  %r15,%rax
sub    %rsi,%rax
xor    %ebx,%ebx
cmp    $0x8,%rax
jb     12e0 <fts3DoclistCountDocids+0x1d0>
mov    %rax,%rcx
and    $0xfffffffffffffff8,%rcx
lea    -0x8(%rcx),%rdx
mov    %rdx,%rbx
shr    $0x3,%rbx
add    $0x1,%rbx
test   %rdx,%rdx
je     1306 <fts3DoclistCountDocids+0x1f6>
mov    %rbx,%rdx
and    $0xfffffffffffffffe,%rdx
pxor   %xmm2,%xmm2
xor    %edi,%edi
pcmpeqd %xmm3,%xmm3
movdqa 0xe2b(%rip),%xmm4
pxor   %xmm0,%xmm0
pxor   %xmm1,%xmm1
nopl   (%rax)
movd   (%rsi,%rdi,1),%xmm6
movd   0x4(%rsi,%rdi,1),%xmm5
pxor   %xmm3,%xmm6
pxor   %xmm3,%xmm5
psrlw  $0x7,%xmm6
pand   %xmm4,%xmm6
psrlw  $0x7,%xmm5
pand   %xmm4,%xmm5
punpcklbw %xmm2,%xmm6
punpcklwd %xmm2,%xmm6
paddd  %xmm0,%xmm6
punpcklbw %xmm2,%xmm5
punpcklwd %xmm2,%xmm5
paddd  %xmm1,%xmm5
movd   0x8(%rsi,%rdi,1),%xmm0
movd   0xc(%rsi,%rdi,1),%xmm1
pxor   %xmm3,%xmm0
pxor   %xmm3,%xmm1
psrlw  $0x7,%xmm0
pand   %xmm4,%xmm0
psrlw  $0x7,%xmm1
pand   %xmm4,%xmm1
punpcklbw %xmm2,%xmm0
punpcklwd %xmm2,%xmm0
paddd  %xmm6,%xmm0
punpcklbw %xmm2,%xmm1
punpcklwd %xmm2,%xmm1
paddd  %xmm5,%xmm1
add    $0x10,%rdi
add    $0xfffffffffffffffe,%rdx
jne    11e0 <fts3DoclistCountDocids+0xd0>
test   $0x1,%bl
je     12bb <fts3DoclistCountDocids+0x1ab>
movd   (%rsi,%rdi,1),%xmm2
movd   0x4(%rsi,%rdi,1),%xmm3
pcmpeqd %xmm4,%xmm4
pxor   %xmm4,%xmm2
pxor   %xmm4,%xmm3
psrlw  $0x7,%xmm2
movdqa 0xd6e(%rip),%xmm4
pand   %xmm4,%xmm2
psrlw  $0x7,%xmm3
pand   %xmm4,%xmm3
pxor   %xmm4,%xmm4
punpcklbw %xmm4,%xmm2
punpcklwd %xmm4,%xmm2
paddd  %xmm2,%xmm0
punpcklbw %xmm4,%xmm3
punpcklwd %xmm4,%xmm3
paddd  %xmm3,%xmm1
paddd  %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%ebx
cmp    %rcx,%rax
je     12fa <fts3DoclistCountDocids+0x1ea>
add    %rcx,%rsi
nopl   (%rax)
movzbl (%rsi),%eax
add    $0x1,%rsi
not    %al
shr    $0x7,%al
movzbl %al,%eax
add    %eax,%ebx
cmp    %r15,%rsi
jb     12e0 <fts3DoclistCountDocids+0x1d0>
jmp    12fa <fts3DoclistCountDocids+0x1ea>
xor    %ebx,%ebx
mov    %ebx,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret
pxor   %xmm0,%xmm0
xor    %edi,%edi
pxor   %xmm1,%xmm1
test   $0x1,%bl
jne    126e <fts3DoclistCountDocids+0x15e>
jmp    12bb <fts3DoclistCountDocids+0x1ab>

LLVM IR (-O0):
define i32 @fts3DoclistCountDocids(i32 %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i8*
store i32 %0, i32* %4
store i8* %1, i8** %5
store i32 %2, i32* %6
store i32 0, i32* %7
%10 = load i8*, i8** %5
%11 = icmp ne i8* %10, null
br i1 %11, label %12, label %56
12: ; preds = %3
%13 = load i8*, i8** %5
%14 = load i32, i32* %6
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i8, i8* %13, i64 %15
store i8* %16, i8** %8
%17 = load i8*, i8** %5
store i8* %17, i8** %9
%18 = load i32, i32* %4
%19 = icmp ne i32 %18, 0
br i1 %19, label %36, label %20
20: ; preds = %12
br label %21
21: ; preds = %25, %20
%22 = load i8*, i8** %9
%23 = load i8*, i8** %8
%24 = icmp ult i8* %22, %23
br i1 %24, label %25, label %35
25: ; preds = %21
%26 = load i8*, i8** %9
%27 = getelementptr inbounds i8, i8* %26, i32 1
store i8* %27, i8** %9
%28 = load i8, i8* %26
%29 = sext i8 %28 to i32
%30 = and i32 %29, 128
%31 = icmp eq i32 %30, 0
%32 = zext i1 %31 to i32
%33 = load i32, i32* %7
%34 = add nsw i32 %33, %32
store i32 %34, i32* %7
br label %21
35: ; preds = %21
br label %55
36: ; preds = %12
br label %37
37: ; preds = %52, %36
%38 = load i8*, i8** %9
%39 = load i8*, i8** %8
%40 = icmp ult i8* %38, %39
br i1 %40, label %41, label %54
41: ; preds = %37
%42 = load i32, i32* %7
%43 = add nsw i32 %42, 1
store i32 %43, i32* %7
br label %44
44: ; preds = %51, %41
%45 = load i8*, i8** %9
%46 = getelementptr inbounds i8, i8* %45, i32 1
store i8* %46, i8** %9
%47 = load i8, i8* %45
%48 = sext i8 %47 to i32
%49 = and i32 %48, 128
%50 = icmp ne i32 %49, 0
br i1 %50, label %51, label %52
51: ; preds = %44
br label %44
52: ; preds = %44
%53 = call i32 @fts3PoslistCopy(i32 0, i8** %9)
br label %37
54: ; preds = %37
br label %55
55: ; preds = %54, %35
br label %56
56: ; preds = %55, %3
%57 = load i32, i32* %7
ret i32 %57
}

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