int chr_range_cnt(const unsigned char string[], const int length,
                  const unsigned char c1, const unsigned char c2) {
  int count = 0;
  int i;
  if (c1) {
    for (i = 0; i < length; i++) {
      if (string[i] >= c1 && string[i] <= c2) {
        count++;
      }
    }
  } else {
    for (i = 0; i < length; i++) {
      if (string[i] <= c2) {
        count++;
      }
    }
  }
  return count;
}


x86 assembly (clang, -O0):
<chr_range_cnt>:
push   %rbp
mov    %rsp,%rbp
mov    %cl,%al
mov    %dl,%cl
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %cl,-0xd(%rbp)
mov    %al,-0xe(%rbp)
movl   $0x0,-0x14(%rbp)
cmpb   $0x0,-0xd(%rbp)
je     118a <chr_range_cnt+0x8a>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1185 <chr_range_cnt+0x85>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0xd(%rbp),%ecx
cmp    %ecx,%eax
jl     1172 <chr_range_cnt+0x72>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0xe(%rbp),%ecx
cmp    %ecx,%eax
jg     1172 <chr_range_cnt+0x72>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1177 <chr_range_cnt+0x77>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    112d <chr_range_cnt+0x2d>
jmp    11d6 <chr_range_cnt+0xd6>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11d1 <chr_range_cnt+0xd1>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0xe(%rbp),%ecx
cmp    %ecx,%eax
jg     11be <chr_range_cnt+0xbe>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11c3 <chr_range_cnt+0xc3>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1191 <chr_range_cnt+0x91>
jmp    11d6 <chr_range_cnt+0xd6>
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<chr_range_cnt>:
test   %edx,%edx
je     111a <chr_range_cnt+0x1a>
test   %esi,%esi
jle    1133 <chr_range_cnt+0x33>
mov    %esi,%r8d
cmp    $0x8,%esi
jae    1136 <chr_range_cnt+0x36>
xor    %r11d,%r11d
xor    %eax,%eax
jmp    1330 <chr_range_cnt+0x230>
test   %esi,%esi
jle    1133 <chr_range_cnt+0x33>
mov    %esi,%r9d
cmp    $0x8,%esi
jae    135a <chr_range_cnt+0x25a>
xor    %esi,%esi
xor    %eax,%eax
jmp    14c0 <chr_range_cnt+0x3c0>
xor    %eax,%eax
ret
mov    %r8d,%r11d
and    $0xfffffff8,%r11d
movzbl %dl,%eax
movd   %eax,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm9
movzbl %cl,%eax
movd   %eax,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
lea    -0x8(%r11),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     14d0 <chr_range_cnt+0x3d0>
mov    %r9,%r10
and    $0xfffffffffffffffe,%r10
pxor   %xmm2,%xmm2
xor    %eax,%eax
movdqa 0xe74(%rip),%xmm8
pxor   %xmm3,%xmm3
movd   (%rdi,%rax,1),%xmm4
movd   0x4(%rdi,%rax,1),%xmm1
movdqa %xmm4,%xmm6
pmaxub %xmm9,%xmm6
pcmpeqb %xmm4,%xmm6
punpcklbw %xmm6,%xmm6
punpcklwd %xmm6,%xmm6
movdqa %xmm1,%xmm7
pmaxub %xmm9,%xmm7
pcmpeqb %xmm1,%xmm7
punpcklbw %xmm7,%xmm7
punpcklwd %xmm7,%xmm7
movdqa %xmm4,%xmm5
pminub %xmm0,%xmm5
pcmpeqb %xmm4,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
pand   %xmm6,%xmm5
movdqa %xmm1,%xmm6
pminub %xmm0,%xmm6
pcmpeqb %xmm1,%xmm6
punpcklbw %xmm6,%xmm6
punpcklwd %xmm6,%xmm6
pand   %xmm7,%xmm6
pand   %xmm8,%xmm5
paddd  %xmm2,%xmm5
pand   %xmm8,%xmm6
paddd  %xmm3,%xmm6
movd   0x8(%rdi,%rax,1),%xmm1
movd   0xc(%rdi,%rax,1),%xmm4
movdqa %xmm1,%xmm3
pmaxub %xmm9,%xmm3
pcmpeqb %xmm1,%xmm3
punpcklbw %xmm3,%xmm3
punpcklwd %xmm3,%xmm3
movdqa %xmm4,%xmm7
pmaxub %xmm9,%xmm7
pcmpeqb %xmm4,%xmm7
punpcklbw %xmm7,%xmm7
punpcklwd %xmm7,%xmm7
movdqa %xmm1,%xmm2
pminub %xmm0,%xmm2
pcmpeqb %xmm1,%xmm2
punpcklbw %xmm2,%xmm2
punpcklwd %xmm2,%xmm2
pand   %xmm3,%xmm2
movdqa %xmm4,%xmm3
pminub %xmm0,%xmm3
pcmpeqb %xmm4,%xmm3
punpcklbw %xmm3,%xmm3
punpcklwd %xmm3,%xmm3
pand   %xmm7,%xmm3
pand   %xmm8,%xmm2
paddd  %xmm5,%xmm2
pand   %xmm8,%xmm3
paddd  %xmm6,%xmm3
add    $0x10,%rax
add    $0xfffffffffffffffe,%r10
jne    1190 <chr_range_cnt+0x90>
test   $0x1,%r9b
je     130c <chr_range_cnt+0x20c>
movd   (%rdi,%rax,1),%xmm1
movd   0x4(%rdi,%rax,1),%xmm4
movdqa %xmm1,%xmm5
pmaxub %xmm9,%xmm5
pcmpeqb %xmm1,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
pmaxub %xmm4,%xmm9
pcmpeqb %xmm4,%xmm9
punpcklbw %xmm9,%xmm9
punpcklwd %xmm9,%xmm9
movdqa %xmm1,%xmm6
pminub %xmm0,%xmm6
pcmpeqb %xmm1,%xmm6
punpcklbw %xmm6,%xmm6
punpcklwd %xmm6,%xmm6
pand   %xmm5,%xmm6
pminub %xmm4,%xmm0
pcmpeqb %xmm4,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
pand   %xmm9,%xmm0
movdqa 0xd04(%rip),%xmm1
pand   %xmm1,%xmm6
paddd  %xmm6,%xmm2
pand   %xmm1,%xmm0
paddd  %xmm0,%xmm3
paddd  %xmm3,%xmm2
pshufd $0xee,%xmm2,%xmm0
paddd  %xmm2,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r8,%r11
je     14cf <chr_range_cnt+0x3cf>
nop
movzbl (%rdi,%r11,1),%r9d
cmp    %dl,%r9b
setae  %r10b
cmp    %cl,%r9b
setbe  %r9b
and    %r10b,%r9b
movzbl %r9b,%esi
add    %esi,%eax
add    $0x1,%r11
cmp    %r11,%r8
jne    1330 <chr_range_cnt+0x230>
jmp    14cf <chr_range_cnt+0x3cf>
mov    %r9d,%esi
and    $0xfffffff8,%esi
movzbl %cl,%eax
movd   %eax,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
lea    -0x8(%rsi),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     14e9 <chr_range_cnt+0x3e9>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
pxor   %xmm1,%xmm1
xor    %eax,%eax
movdqa 0xc63(%rip),%xmm3
pxor   %xmm2,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movd   (%rdi,%rax,1),%xmm5
movd   0x4(%rdi,%rax,1),%xmm6
movdqa %xmm5,%xmm4
pminub %xmm0,%xmm4
pcmpeqb %xmm5,%xmm4
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
pand   %xmm3,%xmm4
paddd  %xmm1,%xmm4
movdqa %xmm6,%xmm5
pminub %xmm0,%xmm5
pcmpeqb %xmm6,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
pand   %xmm3,%xmm5
paddd  %xmm2,%xmm5
movd   0x8(%rdi,%rax,1),%xmm2
movd   0xc(%rdi,%rax,1),%xmm6
movdqa %xmm2,%xmm1
pminub %xmm0,%xmm1
pcmpeqb %xmm2,%xmm1
punpcklbw %xmm1,%xmm1
punpcklwd %xmm1,%xmm1
pand   %xmm3,%xmm1
paddd  %xmm4,%xmm1
movdqa %xmm6,%xmm2
pminub %xmm0,%xmm2
pcmpeqb %xmm6,%xmm2
punpcklbw %xmm2,%xmm2
punpcklwd %xmm2,%xmm2
pand   %xmm3,%xmm2
paddd  %xmm5,%xmm2
add    $0x10,%rax
add    $0xfffffffffffffffe,%rdx
jne    13b0 <chr_range_cnt+0x2b0>
test   $0x1,%r8b
je     1492 <chr_range_cnt+0x392>
movd   (%rdi,%rax,1),%xmm3
movd   0x4(%rdi,%rax,1),%xmm4
movdqa %xmm3,%xmm5
pminub %xmm0,%xmm5
pcmpeqb %xmm3,%xmm5
punpcklbw %xmm5,%xmm5
punpcklwd %xmm5,%xmm5
movdqa 0xb8e(%rip),%xmm3
pand   %xmm3,%xmm5
paddd  %xmm5,%xmm1
pminub %xmm4,%xmm0
pcmpeqb %xmm4,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
pand   %xmm3,%xmm0
paddd  %xmm0,%xmm2
paddd  %xmm2,%xmm1
pshufd $0xee,%xmm1,%xmm0
paddd  %xmm1,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r9,%rsi
je     14cf <chr_range_cnt+0x3cf>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    (%rdi,%rsi,1),%cl
sbb    $0xffffffff,%eax
add    $0x1,%rsi
cmp    %rsi,%r9
jne    14c0 <chr_range_cnt+0x3c0>
ret
pxor   %xmm2,%xmm2
xor    %eax,%eax
pxor   %xmm3,%xmm3
test   $0x1,%r9b
jne    1293 <chr_range_cnt+0x193>
jmp    130c <chr_range_cnt+0x20c>
pxor   %xmm1,%xmm1
xor    %eax,%eax
pxor   %xmm2,%xmm2
test   $0x1,%r8b
jne    144b <chr_range_cnt+0x34b>
jmp    1492 <chr_range_cnt+0x392>

LLVM IR (-O0):
define i32 @chr_range_cnt(i8* %0, i32 %1, i8 zeroext %2, i8 zeroext %3) {
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i8
%8 = alloca i8
%9 = alloca i32
%10 = alloca i32
store i8* %0, i8** %5
store i32 %1, i32* %6
store i8 %2, i8* %7
store i8 %3, i8* %8
store i32 0, i32* %9
%11 = load i8, i8* %7
%12 = icmp ne i8 %11, 0
br i1 %12, label %13, label %46
13: ; preds = %4
store i32 0, i32* %10
br label %14
14: ; preds = %42, %13
%15 = load i32, i32* %10
%16 = load i32, i32* %6
%17 = icmp slt i32 %15, %16
br i1 %17, label %18, label %45
18: ; preds = %14
%19 = load i8*, i8** %5
%20 = load i32, i32* %10
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %19, i64 %21
%23 = load i8, i8* %22
%24 = zext i8 %23 to i32
%25 = load i8, i8* %7
%26 = zext i8 %25 to i32
%27 = icmp sge i32 %24, %26
br i1 %27, label %28, label %41
28: ; preds = %18
%29 = load i8*, i8** %5
%30 = load i32, i32* %10
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %29, i64 %31
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = load i8, i8* %8
%36 = zext i8 %35 to i32
%37 = icmp sle i32 %34, %36
br i1 %37, label %38, label %41
38: ; preds = %28
%39 = load i32, i32* %9
%40 = add nsw i32 %39, 1
store i32 %40, i32* %9
br label %41
41: ; preds = %38, %28, %18
br label %42
42: ; preds = %41
%43 = load i32, i32* %10
%44 = add nsw i32 %43, 1
store i32 %44, i32* %10
br label %14
45: ; preds = %14
br label %69
46: ; preds = %4
store i32 0, i32* %10
br label %47
47: ; preds = %65, %46
%48 = load i32, i32* %10
%49 = load i32, i32* %6
%50 = icmp slt i32 %48, %49
br i1 %50, label %51, label %68
51: ; preds = %47
%52 = load i8*, i8** %5
%53 = load i32, i32* %10
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %52, i64 %54
%56 = load i8, i8* %55
%57 = zext i8 %56 to i32
%58 = load i8, i8* %8
%59 = zext i8 %58 to i32
%60 = icmp sle i32 %57, %59
br i1 %60, label %61, label %64
61: ; preds = %51
%62 = load i32, i32* %9
%63 = add nsw i32 %62, 1
store i32 %63, i32* %9
br label %64
64: ; preds = %61, %51
br label %65
65: ; preds = %64
%66 = load i32, i32* %10
%67 = add nsw i32 %66, 1
store i32 %67, i32* %10
br label %47
68: ; preds = %47
br label %69
69: ; preds = %68, %45
%70 = load i32, i32* %9
ret i32 %70
}

LLVM IR (-O2):
define i32 @chr_range_cnt(i8* nocapture %0, i32 %1, i8 zeroext %2, i8 zeroext %3) {
%5 = icmp eq i8 %2, 0
%6 = icmp sgt i32 %1, 0
br i1 %5, label %102, label %7
7: ; preds = %4
br i1 %6, label %8, label %203
8: ; preds = %7
%9 = zext i32 %1 to i64
%10 = icmp ult i32 %1, 8
br i1 %10, label %99, label %11
11: ; preds = %8
%12 = and i64 %9, 4294967288
%13 = insertelement <4 x i8> poison, i8 %2, i64 0
%14 = shufflevector <4 x i8> %13, <4 x i8> poison, <4 x i32> zeroinitializer
%15 = insertelement <4 x i8> poison, i8 %2, i64 0
%16 = shufflevector <4 x i8> %15, <4 x i8> poison, <4 x i32> zeroinitializer
%17 = insertelement <4 x i8> poison, i8 %3, i64 0
%18 = shufflevector <4 x i8> %17, <4 x i8> poison, <4 x i32> zeroinitializer
%19 = insertelement <4 x i8> poison, i8 %3, i64 0
%20 = shufflevector <4 x i8> %19, <4 x i8> poison, <4 x i32> zeroinitializer
%21 = add nsw i64 %12, -8
%22 = lshr exact i64 %21, 3
%23 = add nuw nsw i64 %22, 1
%24 = and i64 %23, 1
%25 = icmp eq i64 %21, 0
br i1 %25, label %69, label %26
26: ; preds = %11
%27 = and i64 %23, 4611686018427387902
br label %28
28: ; preds = %28, %26
%29 = phi i64 [ 0, %26 ], [ %66, %28 ]
%30 = phi <4 x i32> [ zeroinitializer, %26 ], [ %64, %28 ]
%31 = phi <4 x i32> [ zeroinitializer, %26 ], [ %65, %28 ]
%32 = phi i64 [ 0, %26 ], [ %67, %28 ]
%33 = getelementptr inbounds i8, i8* %0, i64 %29
%34 = bitcast i8* %33 to <4 x i8>*
%35 = load <4 x i8>, <4 x i8>* %34
%36 = getelementptr inbounds i8, i8* %33, i64 4
%37 = bitcast i8* %36 to <4 x i8>*
%38 = load <4 x i8>, <4 x i8>* %37
%39 = icmp uge <4 x i8> %35, %14
%40 = icmp uge <4 x i8> %38, %16
%41 = icmp ule <4 x i8> %35, %18
%42 = icmp ule <4 x i8> %38, %20
%43 = and <4 x i1> %39, %41
%44 = and <4 x i1> %40, %42
%45 = zext <4 x i1> %43 to <4 x i32>
%46 = zext <4 x i1> %44 to <4 x i32>
%47 = add <4 x i32> %30, %45
%48 = add <4 x i32> %31, %46
%49 = or i64 %29, 8
%50 = getelementptr inbounds i8, i8* %0, i64 %49
%51 = bitcast i8* %50 to <4 x i8>*
%52 = load <4 x i8>, <4 x i8>* %51
%53 = getelementptr inbounds i8, i8* %50, i64 4
%54 = bitcast i8* %53 to <4 x i8>*
%55 = load <4 x i8>, <4 x i8>* %54
%56 = icmp uge <4 x i8> %52, %14
%57 = icmp uge <4 x i8> %55, %16
%58 = icmp ule <4 x i8> %52, %18
%59 = icmp ule <4 x i8> %55, %20
%60 = and <4 x i1> %56, %58
%61 = and <4 x i1> %57, %59
%62 = zext <4 x i1> %60 to <4 x i32>
%63 = zext <4 x i1> %61 to <4 x i32>
%64 = add <4 x i32> %47, %62
%65 = add <4 x i32> %48, %63
%66 = add nuw i64 %29, 16
%67 = add i64 %32, 2
%68 = icmp eq i64 %67, %27
br i1 %68, label %69, label %28
69: ; preds = %28, %11
%70 = phi <4 x i32> [ undef, %11 ], [ %64, %28 ]
%71 = phi <4 x i32> [ undef, %11 ], [ %65, %28 ]
%72 = phi i64 [ 0, %11 ], [ %66, %28 ]
%73 = phi <4 x i32> [ zeroinitializer, %11 ], [ %64, %28 ]
%74 = phi <4 x i32> [ zeroinitializer, %11 ], [ %65, %28 ]
%75 = icmp eq i64 %24, 0
br i1 %75, label %93, label %76
76: ; preds = %69
%77 = getelementptr inbounds i8, i8* %0, i64 %72
%78 = bitcast i8* %77 to <4 x i8>*
%79 = load <4 x i8>, <4 x i8>* %78
%80 = getelementptr inbounds i8, i8* %77, i64 4
%81 = bitcast i8* %80 to <4 x i8>*
%82 = load <4 x i8>, <4 x i8>* %81
%83 = icmp uge <4 x i8> %79, %14
%84 = icmp uge <4 x i8> %82, %16
%85 = icmp ule <4 x i8> %79, %18
%86 = icmp ule <4 x i8> %82, %20
%87 = and <4 x i1> %83, %85
%88 = and <4 x i1> %84, %86
%89 = zext <4 x i1> %87 to <4 x i32>
%90 = zext <4 x i1> %88 to <4 x i32>
%91 = add <4 x i32> %73, %89
%92 = add <4 x i32> %74, %90
br label %93
93: ; preds = %69, %76
%94 = phi <4 x i32> [ %70, %69 ], [ %91, %76 ]
%95 = phi <4 x i32> [ %71, %69 ], [ %92, %76 ]
%96 = add <4 x i32> %95, %94
%97 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %96)
%98 = icmp eq i64 %12, %9
br i1 %98, label %203, label %99
99: ; preds = %8, %93
%100 = phi i64 [ 0, %8 ], [ %12, %93 ]
%101 = phi i32 [ 0, %8 ], [ %97, %93 ]
br label %181
102: ; preds = %4
br i1 %6, label %103, label %203
103: ; preds = %102
%104 = zext i32 %1 to i64
%105 = icmp ult i32 %1, 8
br i1 %105, label %178, label %106
106: ; preds = %103
%107 = and i64 %104, 4294967288
%108 = insertelement <4 x i8> poison, i8 %3, i64 0
%109 = shufflevector <4 x i8> %108, <4 x i8> poison, <4 x i32> zeroinitializer
%110 = insertelement <4 x i8> poison, i8 %3, i64 0
%111 = shufflevector <4 x i8> %110, <4 x i8> poison, <4 x i32> zeroinitializer
%112 = add nsw i64 %107, -8
%113 = lshr exact i64 %112, 3
%114 = add nuw nsw i64 %113, 1
%115 = and i64 %114, 1
%116 = icmp eq i64 %112, 0
br i1 %116, label %152, label %117
117: ; preds = %106
%118 = and i64 %114, 4611686018427387902
br label %119
119: ; preds = %119, %117
%120 = phi i64 [ 0, %117 ], [ %149, %119 ]
%121 = phi <4 x i32> [ zeroinitializer, %117 ], [ %147, %119 ]
%122 = phi <4 x i32> [ zeroinitializer, %117 ], [ %148, %119 ]
%123 = phi i64 [ 0, %117 ], [ %150, %119 ]
%124 = getelementptr inbounds i8, i8* %0, i64 %120
%125 = bitcast i8* %124 to <4 x i8>*
%126 = load <4 x i8>, <4 x i8>* %125
%127 = getelementptr inbounds i8, i8* %124, i64 4
%128 = bitcast i8* %127 to <4 x i8>*
%129 = load <4 x i8>, <4 x i8>* %128
%130 = icmp ule <4 x i8> %126, %109
%131 = icmp ule <4 x i8> %129, %111
%132 = zext <4 x i1> %130 to <4 x i32>
%133 = zext <4 x i1> %131 to <4 x i32>
%134 = add <4 x i32> %121, %132
%135 = add <4 x i32> %122, %133
%136 = or i64 %120, 8
%137 = getelementptr inbounds i8, i8* %0, i64 %136
%138 = bitcast i8* %137 to <4 x i8>*
%139 = load <4 x i8>, <4 x i8>* %138
%140 = getelementptr inbounds i8, i8* %137, i64 4
%141 = bitcast i8* %140 to <4 x i8>*
%142 = load <4 x i8>, <4 x i8>* %141
%143 = icmp ule <4 x i8> %139, %109
%144 = icmp ule <4 x i8> %142, %111
%145 = zext <4 x i1> %143 to <4 x i32>
%146 = zext <4 x i1> %144 to <4 x i32>
%147 = add <4 x i32> %134, %145
%148 = add <4 x i32> %135, %146
%149 = add nuw i64 %120, 16
%150 = add i64 %123, 2
%151 = icmp eq i64 %150, %118
br i1 %151, label %152, label %119
152: ; preds = %119, %106
%153 = phi <4 x i32> [ undef, %106 ], [ %147, %119 ]
%154 = phi <4 x i32> [ undef, %106 ], [ %148, %119 ]
%155 = phi i64 [ 0, %106 ], [ %149, %119 ]
%156 = phi <4 x i32> [ zeroinitializer, %106 ], [ %147, %119 ]
%157 = phi <4 x i32> [ zeroinitializer, %106 ], [ %148, %119 ]
%158 = icmp eq i64 %115, 0
br i1 %158, label %172, label %159
159: ; preds = %152
%160 = getelementptr inbounds i8, i8* %0, i64 %155
%161 = bitcast i8* %160 to <4 x i8>*
%162 = load <4 x i8>, <4 x i8>* %161
%163 = getelementptr inbounds i8, i8* %160, i64 4
%164 = bitcast i8* %163 to <4 x i8>*
%165 = load <4 x i8>, <4 x i8>* %164
%166 = icmp ule <4 x i8> %162, %109
%167 = icmp ule <4 x i8> %165, %111
%168 = zext <4 x i1> %166 to <4 x i32>
%169 = zext <4 x i1> %167 to <4 x i32>
%170 = add <4 x i32> %156, %168
%171 = add <4 x i32> %157, %169
br label %172
172: ; preds = %152, %159
%173 = phi <4 x i32> [ %153, %152 ], [ %170, %159 ]
%174 = phi <4 x i32> [ %154, %152 ], [ %171, %159 ]
%175 = add <4 x i32> %174, %173
%176 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %175)
%177 = icmp eq i64 %107, %104
br i1 %177, label %203, label %178
178: ; preds = %103, %172
%179 = phi i64 [ 0, %103 ], [ %107, %172 ]
%180 = phi i32 [ 0, %103 ], [ %176, %172 ]
br label %193
181: ; preds = %99, %181
%182 = phi i64 [ %191, %181 ], [ %100, %99 ]
%183 = phi i32 [ %190, %181 ], [ %101, %99 ]
%184 = getelementptr inbounds i8, i8* %0, i64 %182
%185 = load i8, i8* %184
%186 = icmp uge i8 %185, %2
%187 = icmp ule i8 %185, %3
%188 = and i1 %186, %187
%189 = zext i1 %188 to i32
%190 = add nuw nsw i32 %183, %189
%191 = add nuw nsw i64 %182, 1
%192 = icmp eq i64 %191, %9
br i1 %192, label %203, label %181
193: ; preds = %178, %193
%194 = phi i64 [ %201, %193 ], [ %179, %178 ]
%195 = phi i32 [ %200, %193 ], [ %180, %178 ]
%196 = getelementptr inbounds i8, i8* %0, i64 %194
%197 = load i8, i8* %196
%198 = icmp ule i8 %197, %3
%199 = zext i1 %198 to i32
%200 = add nuw nsw i32 %195, %199
%201 = add nuw nsw i64 %194, 1
%202 = icmp eq i64 %201, %104
br i1 %202, label %203, label %193
203: ; preds = %181, %193, %93, %172, %7, %102
%204 = phi i32 [ 0, %102 ], [ 0, %7 ], [ %176, %172 ], [ %97, %93 ], [ %200, %193 ], [ %190, %181 ]
ret i32 %204
}