int _detect(unsigned char *str, int expected) {
  register int c;
  while ((c = (int)*str) != '\0') {
    if (c == 27) {
      if ((c = (int)*(++str)) == '\0')
        return expected;
      if (c == '$') {
        if ((c = (int)*(++str)) == '\0')
          return expected;
        if (c == 'B' || c == '@')
          return 1;
      }
      str++;
      continue;
    }
    if ((c >= 129 && c <= 141) || (c >= 143 && c <= 159))
      return 3;
    if (c == 142) {
      if ((c = (int)*(++str)) == '\0')
        return expected;
      if ((c >= 64 && c <= 126) || (c >= 128 && c <= 160) ||
          (c >= 224 && c <= 252))
        return 3;
      if (c >= 161 && c <= 223)
        expected = 7;
      str++;
      continue;
    }
    if (c >= 161 && c <= 223) {
      if ((c = (int)*(++str)) == '\0')
        return expected;
      if (c >= 240 && c <= 254)
        return 2;
      if (c >= 161 && c <= 223) {
        expected = 7;
        str++;
        continue;
      }
      if (c <= 159)
        return 3;
      if (c >= 240 && c <= 254)
        return 2;
      if (c >= 224 && c <= 239) {
        expected = 7;
        while (c >= 64) {
          if (c >= 129) {
            if (c <= 141 || (c >= 143 && c <= 159))
              return 3;
            else if (c >= 253 && c <= 254) {
              return 2;
            }
          }
          if ((c = (int)*(++str)) == '\0')
            return 7;
        }
        str++;
        continue;
      }
      if (c >= 224 && c <= 239) {
        if ((c = (int)*(++str)) == '\0')
          return expected;
        if ((c >= 64 && c <= 126) || (c >= 128 && c <= 160))
          return 3;
        if (c >= 253 && c <= 254)
          return 2;
        if (c >= 161 && c <= 252)
          expected = 7;
      }
    }
    str++;
  }
  return expected;
}


x86 assembly (clang, -O0):
<_detect>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
je     1550 <_detect+0x450>
cmpl   $0x1b,-0x18(%rbp)
jne    11bc <_detect+0xbc>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    1152 <_detect+0x52>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0x24,-0x18(%rbp)
jne    11ab <_detect+0xab>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    1186 <_detect+0x86>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0x42,-0x18(%rbp)
je     119a <_detect+0x9a>
cmpl   $0x40,-0x18(%rbp)
jne    11a6 <_detect+0xa6>
movl   $0x1,-0x4(%rbp)
jmp    1556 <_detect+0x456>
jmp    11ab <_detect+0xab>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    110b <_detect+0xb>
cmpl   $0x81,-0x18(%rbp)
jl     11d6 <_detect+0xd6>
cmpl   $0x8d,-0x18(%rbp)
jle    11f0 <_detect+0xf0>
cmpl   $0x8f,-0x18(%rbp)
jl     11fc <_detect+0xfc>
cmpl   $0x9f,-0x18(%rbp)
jg     11fc <_detect+0xfc>
movl   $0x3,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0x8e,-0x18(%rbp)
jne    12b9 <_detect+0x1b9>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    1233 <_detect+0x133>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0x40,-0x18(%rbp)
jl     1247 <_detect+0x147>
cmpl   $0x7e,-0x18(%rbp)
jle    127b <_detect+0x17b>
cmpl   $0x80,-0x18(%rbp)
jl     1261 <_detect+0x161>
cmpl   $0xa0,-0x18(%rbp)
jle    127b <_detect+0x17b>
cmpl   $0xe0,-0x18(%rbp)
jl     1287 <_detect+0x187>
cmpl   $0xfc,-0x18(%rbp)
jg     1287 <_detect+0x187>
movl   $0x3,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xa1,-0x18(%rbp)
jl     12a8 <_detect+0x1a8>
cmpl   $0xdf,-0x18(%rbp)
jg     12a8 <_detect+0x1a8>
movl   $0x7,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    110b <_detect+0xb>
cmpl   $0xa1,-0x18(%rbp)
jl     153f <_detect+0x43f>
cmpl   $0xdf,-0x18(%rbp)
jg     153f <_detect+0x43f>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    12fd <_detect+0x1fd>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xf0,-0x18(%rbp)
jl     1323 <_detect+0x223>
cmpl   $0xfe,-0x18(%rbp)
jg     1323 <_detect+0x223>
movl   $0x2,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xa1,-0x18(%rbp)
jl     1355 <_detect+0x255>
cmpl   $0xdf,-0x18(%rbp)
jg     1355 <_detect+0x255>
movl   $0x7,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    110b <_detect+0xb>
cmpl   $0x9f,-0x18(%rbp)
jg     136e <_detect+0x26e>
movl   $0x3,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xf0,-0x18(%rbp)
jl     1394 <_detect+0x294>
cmpl   $0xfe,-0x18(%rbp)
jg     1394 <_detect+0x294>
movl   $0x2,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xe0,-0x18(%rbp)
jl     1470 <_detect+0x370>
cmpl   $0xef,-0x18(%rbp)
jg     1470 <_detect+0x370>
movl   $0x7,-0x14(%rbp)
cmpl   $0x40,-0x18(%rbp)
jl     145f <_detect+0x35f>
cmpl   $0x81,-0x18(%rbp)
jl     142f <_detect+0x32f>
cmpl   $0x8d,-0x18(%rbp)
jle    13f3 <_detect+0x2f3>
cmpl   $0x8f,-0x18(%rbp)
jl     13ff <_detect+0x2ff>
cmpl   $0x9f,-0x18(%rbp)
jg     13ff <_detect+0x2ff>
movl   $0x3,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xfd,-0x18(%rbp)
jl     1425 <_detect+0x325>
cmpl   $0xfe,-0x18(%rbp)
jg     1425 <_detect+0x325>
movl   $0x2,-0x4(%rbp)
jmp    1556 <_detect+0x456>
jmp    142a <_detect+0x32a>
jmp    142f <_detect+0x32f>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    145a <_detect+0x35a>
movl   $0x7,-0x4(%rbp)
jmp    1556 <_detect+0x456>
jmp    13b5 <_detect+0x2b5>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    110b <_detect+0xb>
cmpl   $0xe0,-0x18(%rbp)
jl     153a <_detect+0x43a>
cmpl   $0xef,-0x18(%rbp)
jg     153a <_detect+0x43a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl 0x1(%rax),%eax
mov    %eax,-0x18(%rbp)
cmp    $0x0,%eax
jne    14b4 <_detect+0x3b4>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0x40,-0x18(%rbp)
jl     14c8 <_detect+0x3c8>
cmpl   $0x7e,-0x18(%rbp)
jle    14e2 <_detect+0x3e2>
cmpl   $0x80,-0x18(%rbp)
jl     14ee <_detect+0x3ee>
cmpl   $0xa0,-0x18(%rbp)
jg     14ee <_detect+0x3ee>
movl   $0x3,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xfd,-0x18(%rbp)
jl     1514 <_detect+0x414>
cmpl   $0xfe,-0x18(%rbp)
jg     1514 <_detect+0x414>
movl   $0x2,-0x4(%rbp)
jmp    1556 <_detect+0x456>
cmpl   $0xa1,-0x18(%rbp)
jl     1535 <_detect+0x435>
cmpl   $0xfc,-0x18(%rbp)
jg     1535 <_detect+0x435>
movl   $0x7,-0x14(%rbp)
jmp    153a <_detect+0x43a>
jmp    153f <_detect+0x43f>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    110b <_detect+0xb>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_detect>:
mov    $0x7,%r8d
jmp    1130 <_detect+0x30>
nopl   0x0(%rax,%rax,1)
mov    0x1(%rdi),%dl
cmp    $0x24,%dl
je     11b0 <_detect+0xb0>
mov    $0x1,%eax
test   %dl,%dl
je     126a <_detect+0x16a>
add    %rax,%rdi
add    $0x1,%rdi
mov    (%rdi),%dl
cmp    $0x1b,%dl
je     1110 <_detect+0x10>
test   %dl,%dl
je     126a <_detect+0x16a>
lea    0x7f(%rdx),%ecx
mov    $0x3,%eax
cmp    $0xd,%cl
jb     126d <_detect+0x16d>
lea    0x71(%rdx),%ecx
cmp    $0x11,%cl
jb     126d <_detect+0x16d>
cmp    $0x8e,%dl
je     11d1 <_detect+0xd1>
add    $0x5f,%dl
cmp    $0x3e,%dl
ja     112c <_detect+0x2c>
mov    0x1(%rdi),%dl
test   %dl,%dl
je     126a <_detect+0x16a>
lea    0x10(%rdx),%eax
cmp    $0xf,%al
jb     1273 <_detect+0x173>
lea    0x5f(%rdx),%eax
cmp    $0x3e,%al
jbe    1215 <_detect+0x115>
cmp    $0xa0,%dl
jb     126d <_detect+0x16d>
mov    %edx,%eax
and    $0xf0,%al
cmp    $0xe0,%al
je     1223 <_detect+0x123>
add    $0x1,%rdi
add    $0x1,%rdi
jmp    1130 <_detect+0x30>
nopl   0x0(%rax)
mov    0x2(%rdi),%dl
test   %dl,%dl
je     126a <_detect+0x16a>
and    $0xfd,%dl
mov    $0x2,%eax
cmp    $0x40,%dl
jne    1129 <_detect+0x29>
jmp    1279 <_detect+0x179>
mov    0x1(%rdi),%dl
test   %dl,%dl
je     126a <_detect+0x16a>
lea    0x20(%rdx),%ecx
cmp    $0x1d,%cl
jb     127f <_detect+0x17f>
cmp    $0xa1,%dl
jl     127f <_detect+0x17f>
lea    -0x40(%rdx),%ecx
mov    $0x3,%eax
cmp    $0x3f,%cl
jb     127f <_detect+0x17f>
add    $0x5f,%dl
cmp    $0x3f,%dl
cmovb  %r8d,%esi
add    $0x2,%rdi
jmp    1130 <_detect+0x30>
add    $0x2,%rdi
mov    $0x7,%esi
jmp    1130 <_detect+0x30>
add    $0x2,%rdi
jmp    1248 <_detect+0x148>
nopl   0x0(%rax)
add    $0x3,%dl
cmp    $0x2,%dl
jb     1273 <_detect+0x173>
movzbl (%rdi),%edx
add    $0x1,%rdi
mov    $0x7,%eax
test   %dl,%dl
je     127f <_detect+0x17f>
cmp    $0x40,%dl
jb     1260 <_detect+0x160>
cmp    $0x81,%dl
jb     1238 <_detect+0x138>
cmp    $0x8e,%dl
jb     126d <_detect+0x16d>
je     1230 <_detect+0x130>
cmp    $0xa0,%dl
jae    1230 <_detect+0x130>
jmp    126d <_detect+0x16d>
mov    $0x7,%esi
jmp    1130 <_detect+0x30>
mov    %esi,%eax
ret
mov    $0x3,%eax
ret
mov    $0x2,%eax
ret
mov    $0x1,%eax
ret
ret

LLVM IR (-O0):
define i32 @_detect(i8* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
br label %7
7: ; preds = %225, %179, %125, %95, %42, %2
%8 = load i8*, i8** %4
%9 = load i8, i8* %8
%10 = zext i8 %9 to i32
store i32 %10, i32* %6
%11 = icmp ne i32 %10, 0
br i1 %11, label %12, label %228
12: ; preds = %7
%13 = load i32, i32* %6
%14 = icmp eq i32 %13, 27
br i1 %14, label %15, label %45
15: ; preds = %12
%16 = load i8*, i8** %4
%17 = getelementptr inbounds i8, i8* %16, i32 1
store i8* %17, i8** %4
%18 = load i8, i8* %17
%19 = zext i8 %18 to i32
store i32 %19, i32* %6
%20 = icmp eq i32 %19, 0
br i1 %20, label %21, label %23
21: ; preds = %15
%22 = load i32, i32* %5
store i32 %22, i32* %3
br label %230
23: ; preds = %15
%24 = load i32, i32* %6
%25 = icmp eq i32 %24, 36
br i1 %25, label %26, label %42
26: ; preds = %23
%27 = load i8*, i8** %4
%28 = getelementptr inbounds i8, i8* %27, i32 1
store i8* %28, i8** %4
%29 = load i8, i8* %28
%30 = zext i8 %29 to i32
store i32 %30, i32* %6
%31 = icmp eq i32 %30, 0
br i1 %31, label %32, label %34
32: ; preds = %26
%33 = load i32, i32* %5
store i32 %33, i32* %3
br label %230
34: ; preds = %26
%35 = load i32, i32* %6
%36 = icmp eq i32 %35, 66
br i1 %36, label %40, label %37
37: ; preds = %34
%38 = load i32, i32* %6
%39 = icmp eq i32 %38, 64
br i1 %39, label %40, label %41
40: ; preds = %37, %34
store i32 1, i32* %3
br label %230
41: ; preds = %37
br label %42
42: ; preds = %41, %23
%43 = load i8*, i8** %4
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %4
br label %7
45: ; preds = %12
%46 = load i32, i32* %6
%47 = icmp sge i32 %46, 129
br i1 %47, label %48, label %51
48: ; preds = %45
%49 = load i32, i32* %6
%50 = icmp sle i32 %49, 141
br i1 %50, label %57, label %51
51: ; preds = %48, %45
%52 = load i32, i32* %6
%53 = icmp sge i32 %52, 143
br i1 %53, label %54, label %58
54: ; preds = %51
%55 = load i32, i32* %6
%56 = icmp sle i32 %55, 159
br i1 %56, label %57, label %58
57: ; preds = %54, %48
store i32 3, i32* %3
br label %230
58: ; preds = %54, %51
%59 = load i32, i32* %6
%60 = icmp eq i32 %59, 142
br i1 %60, label %61, label %98
61: ; preds = %58
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %4
%64 = load i8, i8* %63
%65 = zext i8 %64 to i32
store i32 %65, i32* %6
%66 = icmp eq i32 %65, 0
br i1 %66, label %67, label %69
67: ; preds = %61
%68 = load i32, i32* %5
store i32 %68, i32* %3
br label %230
69: ; preds = %61
%70 = load i32, i32* %6
%71 = icmp sge i32 %70, 64
br i1 %71, label %72, label %75
72: ; preds = %69
%73 = load i32, i32* %6
%74 = icmp sle i32 %73, 126
br i1 %74, label %87, label %75
75: ; preds = %72, %69
%76 = load i32, i32* %6
%77 = icmp sge i32 %76, 128
br i1 %77, label %78, label %81
78: ; preds = %75
%79 = load i32, i32* %6
%80 = icmp sle i32 %79, 160
br i1 %80, label %87, label %81
81: ; preds = %78, %75
%82 = load i32, i32* %6
%83 = icmp sge i32 %82, 224
br i1 %83, label %84, label %88
84: ; preds = %81
%85 = load i32, i32* %6
%86 = icmp sle i32 %85, 252
br i1 %86, label %87, label %88
87: ; preds = %84, %78, %72
store i32 3, i32* %3
br label %230
88: ; preds = %84, %81
%89 = load i32, i32* %6
%90 = icmp sge i32 %89, 161
br i1 %90, label %91, label %95
91: ; preds = %88
%92 = load i32, i32* %6
%93 = icmp sle i32 %92, 223
br i1 %93, label %94, label %95
94: ; preds = %91
store i32 7, i32* %5
br label %95
95: ; preds = %94, %91, %88
%96 = load i8*, i8** %4
%97 = getelementptr inbounds i8, i8* %96, i32 1
store i8* %97, i8** %4
br label %7
98: ; preds = %58
%99 = load i32, i32* %6
%100 = icmp sge i32 %99, 161
br i1 %100, label %101, label %225
101: ; preds = %98
%102 = load i32, i32* %6
%103 = icmp sle i32 %102, 223
br i1 %103, label %104, label %225
104: ; preds = %101
%105 = load i8*, i8** %4
%106 = getelementptr inbounds i8, i8* %105, i32 1
store i8* %106, i8** %4
%107 = load i8, i8* %106
%108 = zext i8 %107 to i32
store i32 %108, i32* %6
%109 = icmp eq i32 %108, 0
br i1 %109, label %110, label %112
110: ; preds = %104
%111 = load i32, i32* %5
store i32 %111, i32* %3
br label %230
112: ; preds = %104
%113 = load i32, i32* %6
%114 = icmp sge i32 %113, 240
br i1 %114, label %115, label %119
115: ; preds = %112
%116 = load i32, i32* %6
%117 = icmp sle i32 %116, 254
br i1 %117, label %118, label %119
118: ; preds = %115
store i32 2, i32* %3
br label %230
119: ; preds = %115, %112
%120 = load i32, i32* %6
%121 = icmp sge i32 %120, 161
br i1 %121, label %122, label %128
122: ; preds = %119
%123 = load i32, i32* %6
%124 = icmp sle i32 %123, 223
br i1 %124, label %125, label %128
125: ; preds = %122
store i32 7, i32* %5
%126 = load i8*, i8** %4
%127 = getelementptr inbounds i8, i8* %126, i32 1
store i8* %127, i8** %4
br label %7
128: ; preds = %122, %119
%129 = load i32, i32* %6
%130 = icmp sle i32 %129, 159
br i1 %130, label %131, label %132
131: ; preds = %128
store i32 3, i32* %3
br label %230
132: ; preds = %128
%133 = load i32, i32* %6
%134 = icmp sge i32 %133, 240
br i1 %134, label %135, label %139
135: ; preds = %132
%136 = load i32, i32* %6
%137 = icmp sle i32 %136, 254
br i1 %137, label %138, label %139
138: ; preds = %135
store i32 2, i32* %3
br label %230
139: ; preds = %135, %132
%140 = load i32, i32* %6
%141 = icmp sge i32 %140, 224
br i1 %141, label %142, label %182
142: ; preds = %139
%143 = load i32, i32* %6
%144 = icmp sle i32 %143, 239
br i1 %144, label %145, label %182
145: ; preds = %142
store i32 7, i32* %5
br label %146
146: ; preds = %178, %145
%147 = load i32, i32* %6
%148 = icmp sge i32 %147, 64
br i1 %148, label %149, label %179
149: ; preds = %146
%150 = load i32, i32* %6
%151 = icmp sge i32 %150, 129
br i1 %151, label %152, label %171
152: ; preds = %149
%153 = load i32, i32* %6
%154 = icmp sle i32 %153, 141
br i1 %154, label %161, label %155
155: ; preds = %152
%156 = load i32, i32* %6
%157 = icmp sge i32 %156, 143
br i1 %157, label %158, label %162
158: ; preds = %155
%159 = load i32, i32* %6
%160 = icmp sle i32 %159, 159
br i1 %160, label %161, label %162
161: ; preds = %158, %152
store i32 3, i32* %3
br label %230
162: ; preds = %158, %155
%163 = load i32, i32* %6
%164 = icmp sge i32 %163, 253
br i1 %164, label %165, label %169
165: ; preds = %162
%166 = load i32, i32* %6
%167 = icmp sle i32 %166, 254
br i1 %167, label %168, label %169
168: ; preds = %165
store i32 2, i32* %3
br label %230
169: ; preds = %165, %162
br label %170
170: ; preds = %169
br label %171
171: ; preds = %170, %149
%172 = load i8*, i8** %4
%173 = getelementptr inbounds i8, i8* %172, i32 1
store i8* %173, i8** %4
%174 = load i8, i8* %173
%175 = zext i8 %174 to i32
store i32 %175, i32* %6
%176 = icmp eq i32 %175, 0
br i1 %176, label %177, label %178
177: ; preds = %171
store i32 7, i32* %3
br label %230
178: ; preds = %171
br label %146
179: ; preds = %146
%180 = load i8*, i8** %4
%181 = getelementptr inbounds i8, i8* %180, i32 1
store i8* %181, i8** %4
br label %7
182: ; preds = %142, %139
%183 = load i32, i32* %6
%184 = icmp sge i32 %183, 224
br i1 %184, label %185, label %224
185: ; preds = %182
%186 = load i32, i32* %6
%187 = icmp sle i32 %186, 239
br i1 %187, label %188, label %224
188: ; preds = %185
%189 = load i8*, i8** %4
%190 = getelementptr inbounds i8, i8* %189, i32 1
store i8* %190, i8** %4
%191 = load i8, i8* %190
%192 = zext i8 %191 to i32
store i32 %192, i32* %6
%193 = icmp eq i32 %192, 0
br i1 %193, label %194, label %196
194: ; preds = %188
%195 = load i32, i32* %5
store i32 %195, i32* %3
br label %230
196: ; preds = %188
%197 = load i32, i32* %6
%198 = icmp sge i32 %197, 64
br i1 %198, label %199, label %202
199: ; preds = %196
%200 = load i32, i32* %6
%201 = icmp sle i32 %200, 126
br i1 %201, label %208, label %202
202: ; preds = %199, %196
%203 = load i32, i32* %6
%204 = icmp sge i32 %203, 128
br i1 %204, label %205, label %209
205: ; preds = %202
%206 = load i32, i32* %6
%207 = icmp sle i32 %206, 160
br i1 %207, label %208, label %209
208: ; preds = %205, %199
store i32 3, i32* %3
br label %230
209: ; preds = %205, %202
%210 = load i32, i32* %6
%211 = icmp sge i32 %210, 253
br i1 %211, label %212, label %216
212: ; preds = %209
%213 = load i32, i32* %6
%214 = icmp sle i32 %213, 254
br i1 %214, label %215, label %216
215: ; preds = %212
store i32 2, i32* %3
br label %230
216: ; preds = %212, %209
%217 = load i32, i32* %6
%218 = icmp sge i32 %217, 161
br i1 %218, label %219, label %223
219: ; preds = %216
%220 = load i32, i32* %6
%221 = icmp sle i32 %220, 252
br i1 %221, label %222, label %223
222: ; preds = %219
store i32 7, i32* %5
br label %223
223: ; preds = %222, %219, %216
br label %224
224: ; preds = %223, %185, %182
br label %225
225: ; preds = %224, %101, %98
%226 = load i8*, i8** %4
%227 = getelementptr inbounds i8, i8* %226, i32 1
store i8* %227, i8** %4
br label %7
228: ; preds = %7
%229 = load i32, i32* %5
store i32 %229, i32* %3
br label %230
230: ; preds = %228, %215, %208, %194, %177, %168, %161, %138, %131, %118, %110, %87, %67, %57, %40, %32, %21
%231 = load i32, i32* %3
ret i32 %231
}

LLVM IR (-O2):
define i32 @_detect(i8* nocapture %0, i32 %1) {
br label %3
3: ; preds = %50, %2
%4 = phi i8* [ %0, %2 ], [ %51, %50 ]
%5 = phi i32 [ %1, %2 ], [ %52, %50 ]
br label %6
6: ; preds = %22, %3
%7 = phi i8* [ %4, %3 ], [ %24, %22 ]
%8 = load i8, i8* %7
switch i8 %8, label %25 [
i8 0, label %94
i8 27, label %9
]
9: ; preds = %6
%10 = getelementptr inbounds i8, i8* %7, i64 1
%11 = load i8, i8* %10
switch i8 %11, label %19 [
i8 0, label %94
i8 36, label %12
]
12: ; preds = %9
%13 = getelementptr inbounds i8, i8* %7, i64 2
%14 = load i8, i8* %13
%15 = icmp eq i8 %14, 0
br i1 %15, label %94, label %16
16: ; preds = %12
%17 = and i8 %14, -3
%18 = icmp eq i8 %17, 64
br i1 %18, label %94, label %19
19: ; preds = %9, %16
%20 = phi i64 [ 2, %16 ], [ 1, %9 ]
%21 = getelementptr inbounds i8, i8* %7, i64 %20
br label %22
22: ; preds = %53, %70, %19
%23 = phi i8* [ %21, %19 ], [ %7, %53 ], [ %57, %70 ]
%24 = getelementptr inbounds i8, i8* %23, i64 1
br label %6
25: ; preds = %6
%26 = add i8 %8, 127
%27 = icmp ult i8 %26, 13
%28 = add i8 %8, 113
%29 = icmp ult i8 %28, 17
%30 = or i1 %27, %29
br i1 %30, label %94, label %31
31: ; preds = %25
%32 = icmp eq i8 %8, -114
br i1 %32, label %33, label %53
33: ; preds = %31
%34 = getelementptr inbounds i8, i8* %7, i64 1
%35 = load i8, i8* %34
%36 = icmp eq i8 %35, 0
br i1 %36, label %94, label %37
37: ; preds = %33
%38 = add i8 %35, -64
%39 = icmp ult i8 %38, 63
%40 = icmp slt i8 %35, -95
%41 = or i1 %40, %39
%42 = add i8 %35, 32
%43 = icmp ult i8 %42, 29
%44 = or i1 %43, %41
br i1 %44, label %94, label %45
45: ; preds = %37
%46 = add i8 %35, 95
%47 = icmp ult i8 %46, 63
%48 = select i1 %47, i32 7, i32 %5
%49 = getelementptr inbounds i8, i8* %7, i64 2
br label %50
50: ; preds = %45, %66, %92
%51 = phi i8* [ %93, %92 ], [ %67, %66 ], [ %49, %45 ]
%52 = phi i32 [ 7, %92 ], [ 7, %66 ], [ %48, %45 ]
br label %3
53: ; preds = %31
%54 = add i8 %8, 95
%55 = icmp ult i8 %54, 63
br i1 %55, label %56, label %22
56: ; preds = %53
%57 = getelementptr inbounds i8, i8* %7, i64 1
%58 = load i8, i8* %57
%59 = icmp eq i8 %58, 0
br i1 %59, label %94, label %60
60: ; preds = %56
%61 = add i8 %58, 16
%62 = icmp ult i8 %61, 15
br i1 %62, label %94, label %63
63: ; preds = %60
%64 = add i8 %58, 95
%65 = icmp ult i8 %64, 63
br i1 %65, label %66, label %68
66: ; preds = %63
%67 = getelementptr inbounds i8, i8* %7, i64 2
br label %50
68: ; preds = %63
%69 = icmp ult i8 %58, -96
br i1 %69, label %94, label %70
70: ; preds = %68
%71 = and i8 %58, -16
%72 = icmp eq i8 %71, -32
br i1 %72, label %73, label %22
73: ; preds = %70, %88
%74 = phi i8* [ %89, %88 ], [ %57, %70 ]
%75 = phi i8 [ %90, %88 ], [ %58, %70 ]
%76 = icmp ugt i8 %75, 63
br i1 %76, label %77, label %92
77: ; preds = %73
%78 = icmp ugt i8 %75, -128
br i1 %78, label %79, label %88
79: ; preds = %77
%80 = icmp ult i8 %75, -114
br i1 %80, label %94, label %81
81: ; preds = %79
%82 = icmp ne i8 %75, -114
%83 = icmp ult i8 %75, -96
%84 = and i1 %82, %83
br i1 %84, label %94, label %85
85: ; preds = %81
%86 = add nsw i8 %75, 3
%87 = icmp ult i8 %86, 2
br i1 %87, label %94, label %88
88: ; preds = %85, %77
%89 = getelementptr inbounds i8, i8* %74, i64 1
%90 = load i8, i8* %89
%91 = icmp eq i8 %90, 0
br i1 %91, label %94, label %73
92: ; preds = %73
%93 = getelementptr inbounds i8, i8* %74, i64 1
br label %50
94: ; preds = %37, %33, %6, %68, %60, %56, %25, %16, %12, %9, %88, %85, %79, %81
%95 = phi i32 [ 7, %88 ], [ 2, %85 ], [ 3, %79 ], [ 3, %81 ], [ %5, %9 ], [ %5, %12 ], [ 1, %16 ], [ 3, %25 ], [ %5, %56 ], [ 2, %60 ], [ 3, %68 ], [ %5, %6 ], [ %5, %33 ], [ 3, %37 ]
ret i32 %95
}