#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 wchar_t;

/* Variables and functions */
int FNM_NOESCAPE;
int mbtowc(int *, char const *, size_t);
int pat_next(const char *pat, size_t m, size_t *step, int flags) {
  int esc = 0;
  if (!m || !*pat) {
    *step = 0;
    return 0;
  }
  *step = 1;
  if (pat[0] == '\\' && pat[1] && !(flags & FNM_NOESCAPE)) {
    *step = 2;
    pat++;
    esc = 1;
    goto escaped;
  }
  if (pat[0] == '[') {
    size_t k = 1;
    if (k < m)
      if (pat[k] == '^' || pat[k] == '!')
        k++;
    if (k < m)
      if (pat[k] == ']')
        k++;
    for (; k < m && pat[k] && pat[k] != ']'; k++) {
      if (k + 1 < m && pat[k + 1] && pat[k] == '[' &&
          (pat[k + 1] == ':' || pat[k + 1] == '.' || pat[k + 1] == '=')) {
        int z = pat[k + 1];
        k += 2;
        if (k < m && pat[k])
          k++;
        while (k < m && pat[k] && (pat[k - 1] != z || pat[k] != ']'))
          k++;
        if (k == m || !pat[k])
          break;
      }
    }
    if (k == m || !pat[k]) {
      *step = 1;
      return '[';
    }
    *step = k + 1;
    return -3;
  }
  if (pat[0] == '*')
    return -5;
  if (pat[0] == '?')
    return -4;
escaped:
  if (pat[0] >= 128U) {
    wchar_t wc;
    int k = mbtowc(&wc, pat, m);
    if (k < 0) {
      *step = 0;
      return -2;
    }
    *step = k + esc;
    return wc;
  }
  return pat[0];
}


x86 assembly (clang, -O0):
<pat_next>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1146 <pat_next+0x36>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    115d <pat_next+0x4d>
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
mov    -0x20(%rbp),%rax
movq   $0x1,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    11c1 <pat_next+0xb1>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     11c1 <pat_next+0xb1>
mov    -0x24(%rbp),%eax
mov    0x2e65(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
jne    11c1 <pat_next+0xb1>
mov    -0x20(%rbp),%rax
movq   $0x2,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
movl   $0x1,-0x28(%rbp)
jmp    14d2 <pat_next+0x3c2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5b,%eax
jne    1495 <pat_next+0x385>
movq   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1222 <pat_next+0x112>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5e,%eax
je     1211 <pat_next+0x101>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x21,%eax
jne    121d <pat_next+0x10d>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1222 <pat_next+0x112>
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1256 <pat_next+0x146>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5d,%eax
jne    1251 <pat_next+0x141>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1256 <pat_next+0x146>
jmp    125b <pat_next+0x14b>
mov    -0x30(%rbp),%rcx
xor    %eax,%eax
cmp    -0x18(%rbp),%rcx
mov    %al,-0x3d(%rbp)
jae    129d <pat_next+0x18d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3d(%rbp)
je     129d <pat_next+0x18d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5d,%eax
setne  %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    12ad <pat_next+0x19d>
jmp    1443 <pat_next+0x333>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
cmp    -0x18(%rbp),%rax
jae    142d <pat_next+0x31d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     142d <pat_next+0x31d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5b,%eax
jne    142d <pat_next+0x31d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x3a,%eax
je     132c <pat_next+0x21c>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     132c <pat_next+0x21c>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x3d,%eax
jne    142d <pat_next+0x31d>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1377 <pat_next+0x267>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1377 <pat_next+0x267>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    137c <pat_next+0x26c>
mov    -0x30(%rbp),%rcx
xor    %eax,%eax
cmp    -0x18(%rbp),%rcx
mov    %al,-0x3e(%rbp)
jae    13e2 <pat_next+0x2d2>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3e(%rbp)
je     13e2 <pat_next+0x2d2>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    -0x34(%rbp),%ecx
mov    %al,-0x3f(%rbp)
jne    13dc <pat_next+0x2cc>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5d,%eax
setne  %al
mov    %al,-0x3f(%rbp)
mov    -0x3f(%rbp),%al
mov    %al,-0x3e(%rbp)
mov    -0x3e(%rbp),%al
test   $0x1,%al
jne    13f2 <pat_next+0x2e2>
jmp    1403 <pat_next+0x2f3>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    137c <pat_next+0x26c>
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
je     1423 <pat_next+0x313>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1428 <pat_next+0x318>
jmp    1443 <pat_next+0x333>
jmp    142d <pat_next+0x31d>
jmp    1432 <pat_next+0x322>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    125b <pat_next+0x14b>
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
je     1463 <pat_next+0x353>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    147a <pat_next+0x36a>
mov    -0x20(%rbp),%rax
movq   $0x1,(%rax)
movl   $0x5b,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
mov    -0x30(%rbp),%rcx
add    $0x1,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
movl   $0xfffffffd,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    14b1 <pat_next+0x3a1>
movl   $0xfffffffb,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
jne    14cd <pat_next+0x3bd>
movl   $0xfffffffc,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
jmp    14d2 <pat_next+0x3c2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x80,%eax
jb     1534 <pat_next+0x424>
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
lea    -0x38(%rbp),%rdi
call   1030 <mbtowc@plt>
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jge    1519 <pat_next+0x409>
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
movl   $0xfffffffe,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
mov    -0x3c(%rbp),%eax
add    -0x28(%rbp),%eax
movslq %eax,%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    153e <pat_next+0x42e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pat_next>:
push   %rbp
push   %rbx
push   %rax
mov    %rdx,%rbp
mov    %rsi,%rdx
test   %rsi,%rsi
je     1145 <pat_next+0x35>
mov    %rdi,%rsi
cmpb   $0x0,(%rdi)
je     1145 <pat_next+0x35>
movq   $0x1,0x0(%rbp)
mov    (%rsi),%al
xor    %ebx,%ebx
cmp    $0x5a,%al
jg     1156 <pat_next+0x46>
cmp    $0x2a,%al
je     1191 <pat_next+0x81>
cmp    $0x3f,%al
jne    1184 <pat_next+0x74>
mov    $0xfffffffc,%eax
jmp    114f <pat_next+0x3f>
movq   $0x0,0x0(%rbp)
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret
cmp    $0x5b,%al
je     1198 <pat_next+0x88>
cmp    $0x5c,%al
jne    1184 <pat_next+0x74>
mov    $0x5c,%al
cmpb   $0x0,0x1(%rsi)
je     118c <pat_next+0x7c>
mov    0x2e8b(%rip),%rdi
test   %ecx,(%rdi)
jne    118c <pat_next+0x7c>
add    $0x1,%rsi
movq   $0x2,0x0(%rbp)
mov    (%rsi),%al
mov    $0x1,%ebx
test   %al,%al
js     12a8 <pat_next+0x198>
movzbl %al,%eax
jmp    114f <pat_next+0x3f>
mov    $0xfffffffb,%eax
jmp    114f <pat_next+0x3f>
mov    $0x1,%edi
cmp    $0x2,%rdx
jb     11c9 <pat_next+0xb9>
mov    0x1(%rsi),%al
cmp    $0x5e,%al
sete   %cl
cmp    $0x21,%al
sete   %al
or     %cl,%al
movzbl %al,%edi
add    $0x1,%rdi
cmp    %rdx,%rdi
jb     11ce <pat_next+0xbe>
cmp    %rdx,%rdi
jae    128d <pat_next+0x17d>
jmp    11e3 <pat_next+0xd3>
cmp    %rdx,%rdi
jae    11be <pat_next+0xae>
xor    %eax,%eax
cmpb   $0x5d,(%rsi,%rdi,1)
sete   %al
add    %rax,%rdi
cmp    %rdx,%rdi
jae    128d <pat_next+0x17d>
movabs $0x2400400000000000,%r8
jmp    120c <pat_next+0xfc>
add    $0x1,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rax,%rdi
cmp    %rdx,%rax
jae    1290 <pat_next+0x180>
mov    (%rsi,%rdi,1),%bl
test   %bl,%bl
je     128d <pat_next+0x17d>
cmp    $0x5d,%bl
je     128d <pat_next+0x17d>
lea    0x1(%rdi),%rax
cmp    %rdx,%rax
jae    1200 <pat_next+0xf0>
mov    (%rsi,%rax,1),%cl
test   %cl,%cl
je     1200 <pat_next+0xf0>
cmp    $0x5b,%bl
jne    1200 <pat_next+0xf0>
cmp    $0x3d,%cl
ja     1200 <pat_next+0xf0>
movzbl %cl,%ebx
bt     %rbx,%r8
jae    1200 <pat_next+0xf0>
lea    0x2(%rdi),%rax
cmp    %rdx,%rax
jae    1251 <pat_next+0x141>
lea    0x3(%rdi),%rbx
cmpb   $0x0,0x2(%rsi,%rdi,1)
cmovne %rbx,%rax
cmp    %rdx,%rax
jb     1269 <pat_next+0x159>
jmp    127c <pat_next+0x16c>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rax
cmp    %rax,%rdx
je     1295 <pat_next+0x185>
movzbl (%rsi,%rax,1),%ebx
test   %bl,%bl
je     127c <pat_next+0x16c>
cmp    %cl,-0x1(%rsi,%rax,1)
jne    1260 <pat_next+0x150>
cmp    $0x5d,%bl
jne    1260 <pat_next+0x150>
cmp    %rdx,%rax
je     1295 <pat_next+0x185>
cmpb   $0x0,(%rsi,%rax,1)
jne    11ef <pat_next+0xdf>
jmp    1290 <pat_next+0x180>
mov    %rdi,%rax
cmp    %rdx,%rax
jne    12c5 <pat_next+0x1b5>
mov    $0x5b,%eax
mov    $0x1,%ecx
mov    %rcx,0x0(%rbp)
jmp    114f <pat_next+0x3f>
lea    0x4(%rsp),%rdi
call   1030 <mbtowc@plt>
test   %eax,%eax
js     12ec <pat_next+0x1dc>
add    %ebx,%eax
mov    %rax,0x0(%rbp)
mov    0x4(%rsp),%eax
jmp    114f <pat_next+0x3f>
cmpb   $0x0,(%rsi,%rax,1)
lea    0x1(%rax),%rax
mov    $0x1,%ecx
cmovne %rax,%rcx
mov    $0x5b,%edx
mov    $0xfffffffd,%eax
cmove  %edx,%eax
mov    %rcx,0x0(%rbp)
jmp    114f <pat_next+0x3f>
movq   $0x0,0x0(%rbp)
mov    $0xfffffffe,%eax
jmp    114f <pat_next+0x3f>

LLVM IR (-O0):
@FNM_NOESCAPE = global i32 0
define i32 @pat_next(i8* %0, i64 %1, i64* %2, i32 %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i64*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i64
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i8* %0, i8** %6
store i64 %1, i64* %7
store i64* %2, i64** %8
store i32 %3, i32* %9
store i32 0, i32* %10
%15 = load i64, i64* %7
%16 = icmp ne i64 %15, 0
br i1 %16, label %17, label %21
17: ; preds = %4
%18 = load i8*, i8** %6
%19 = load i8, i8* %18
%20 = icmp ne i8 %19, 0
br i1 %20, label %23, label %21
21: ; preds = %17, %4
%22 = load i64*, i64** %8
store i64 0, i64* %22
store i32 0, i32* %5
br label %283
23: ; preds = %17
%24 = load i64*, i64** %8
store i64 1, i64* %24
%25 = load i8*, i8** %6
%26 = getelementptr inbounds i8, i8* %25, i64 0
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 92
br i1 %29, label %30, label %45
30: ; preds = %23
%31 = load i8*, i8** %6
%32 = getelementptr inbounds i8, i8* %31, i64 1
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp ne i32 %34, 0
br i1 %35, label %36, label %45
36: ; preds = %30
%37 = load i32, i32* %9
%38 = load i32, i32* @FNM_NOESCAPE
%39 = and i32 %37, %38
%40 = icmp ne i32 %39, 0
br i1 %40, label %45, label %41
41: ; preds = %36
%42 = load i64*, i64** %8
store i64 2, i64* %42
%43 = load i8*, i8** %6
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %6
store i32 1, i32* %10
br label %257
45: ; preds = %36, %30, %23
%46 = load i8*, i8** %6
%47 = getelementptr inbounds i8, i8* %46, i64 0
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
%50 = icmp eq i32 %49, 91
br i1 %50, label %51, label %242
51: ; preds = %45
store i64 1, i64* %11
%52 = load i64, i64* %11
%53 = load i64, i64* %7
%54 = icmp ult i64 %52, %53
br i1 %54, label %55, label %73
55: ; preds = %51
%56 = load i8*, i8** %6
%57 = load i64, i64* %11
%58 = getelementptr inbounds i8, i8* %56, i64 %57
%59 = load i8, i8* %58
%60 = sext i8 %59 to i32
%61 = icmp eq i32 %60, 94
br i1 %61, label %69, label %62
62: ; preds = %55
%63 = load i8*, i8** %6
%64 = load i64, i64* %11
%65 = getelementptr inbounds i8, i8* %63, i64 %64
%66 = load i8, i8* %65
%67 = sext i8 %66 to i32
%68 = icmp eq i32 %67, 33
br i1 %68, label %69, label %72
69: ; preds = %62, %55
%70 = load i64, i64* %11
%71 = add i64 %70, 1
store i64 %71, i64* %11
br label %72
72: ; preds = %69, %62
br label %73
73: ; preds = %72, %51
%74 = load i64, i64* %11
%75 = load i64, i64* %7
%76 = icmp ult i64 %74, %75
br i1 %76, label %77, label %88
77: ; preds = %73
%78 = load i8*, i8** %6
%79 = load i64, i64* %11
%80 = getelementptr inbounds i8, i8* %78, i64 %79
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 93
br i1 %83, label %84, label %87
84: ; preds = %77
%85 = load i64, i64* %11
%86 = add i64 %85, 1
store i64 %86, i64* %11
br label %87
87: ; preds = %84, %77
br label %88
88: ; preds = %87, %73
br label %89
89: ; preds = %223, %88
%90 = load i64, i64* %11
%91 = load i64, i64* %7
%92 = icmp ult i64 %90, %91
br i1 %92, label %93, label %107
93: ; preds = %89
%94 = load i8*, i8** %6
%95 = load i64, i64* %11
%96 = getelementptr inbounds i8, i8* %94, i64 %95
%97 = load i8, i8* %96
%98 = sext i8 %97 to i32
%99 = icmp ne i32 %98, 0
br i1 %99, label %100, label %107
100: ; preds = %93
%101 = load i8*, i8** %6
%102 = load i64, i64* %11
%103 = getelementptr inbounds i8, i8* %101, i64 %102
%104 = load i8, i8* %103
%105 = sext i8 %104 to i32
%106 = icmp ne i32 %105, 93
br label %107
107: ; preds = %100, %93, %89
%108 = phi i1 [ false, %93 ], [ false, %89 ], [ %106, %100 ]
br i1 %108, label %109, label %226
109: ; preds = %107
%110 = load i64, i64* %11
%111 = add i64 %110, 1
%112 = load i64, i64* %7
%113 = icmp ult i64 %111, %112
br i1 %113, label %114, label %222
114: ; preds = %109
%115 = load i8*, i8** %6
%116 = load i64, i64* %11
%117 = add i64 %116, 1
%118 = getelementptr inbounds i8, i8* %115, i64 %117
%119 = load i8, i8* %118
%120 = sext i8 %119 to i32
%121 = icmp ne i32 %120, 0
br i1 %121, label %122, label %222
122: ; preds = %114
%123 = load i8*, i8** %6
%124 = load i64, i64* %11
%125 = getelementptr inbounds i8, i8* %123, i64 %124
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp eq i32 %127, 91
br i1 %128, label %129, label %222
129: ; preds = %122
%130 = load i8*, i8** %6
%131 = load i64, i64* %11
%132 = add i64 %131, 1
%133 = getelementptr inbounds i8, i8* %130, i64 %132
%134 = load i8, i8* %133
%135 = sext i8 %134 to i32
%136 = icmp eq i32 %135, 58
br i1 %136, label %153, label %137
137: ; preds = %129
%138 = load i8*, i8** %6
%139 = load i64, i64* %11
%140 = add i64 %139, 1
%141 = getelementptr inbounds i8, i8* %138, i64 %140
%142 = load i8, i8* %141
%143 = sext i8 %142 to i32
%144 = icmp eq i32 %143, 46
br i1 %144, label %153, label %145
145: ; preds = %137
%146 = load i8*, i8** %6
%147 = load i64, i64* %11
%148 = add i64 %147, 1
%149 = getelementptr inbounds i8, i8* %146, i64 %148
%150 = load i8, i8* %149
%151 = sext i8 %150 to i32
%152 = icmp eq i32 %151, 61
br i1 %152, label %153, label %222
153: ; preds = %145, %137, %129
%154 = load i8*, i8** %6
%155 = load i64, i64* %11
%156 = add i64 %155, 1
%157 = getelementptr inbounds i8, i8* %154, i64 %156
%158 = load i8, i8* %157
%159 = sext i8 %158 to i32
store i32 %159, i32* %12
%160 = load i64, i64* %11
%161 = add i64 %160, 2
store i64 %161, i64* %11
%162 = load i64, i64* %11
%163 = load i64, i64* %7
%164 = icmp ult i64 %162, %163
br i1 %164, label %165, label %175
165: ; preds = %153
%166 = load i8*, i8** %6
%167 = load i64, i64* %11
%168 = getelementptr inbounds i8, i8* %166, i64 %167
%169 = load i8, i8* %168
%170 = sext i8 %169 to i32
%171 = icmp ne i32 %170, 0
br i1 %171, label %172, label %175
172: ; preds = %165
%173 = load i64, i64* %11
%174 = add i64 %173, 1
store i64 %174, i64* %11
br label %175
175: ; preds = %172, %165, %153
br label %176
176: ; preds = %207, %175
%177 = load i64, i64* %11
%178 = load i64, i64* %7
%179 = icmp ult i64 %177, %178
br i1 %179, label %180, label %205
180: ; preds = %176
%181 = load i8*, i8** %6
%182 = load i64, i64* %11
%183 = getelementptr inbounds i8, i8* %181, i64 %182
%184 = load i8, i8* %183
%185 = sext i8 %184 to i32
%186 = icmp ne i32 %185, 0
br i1 %186, label %187, label %205
187: ; preds = %180
%188 = load i8*, i8** %6
%189 = load i64, i64* %11
%190 = sub i64 %189, 1
%191 = getelementptr inbounds i8, i8* %188, i64 %190
%192 = load i8, i8* %191
%193 = sext i8 %192 to i32
%194 = load i32, i32* %12
%195 = icmp ne i32 %193, %194
br i1 %195, label %203, label %196
196: ; preds = %187
%197 = load i8*, i8** %6
%198 = load i64, i64* %11
%199 = getelementptr inbounds i8, i8* %197, i64 %198
%200 = load i8, i8* %199
%201 = sext i8 %200 to i32
%202 = icmp ne i32 %201, 93
br label %203
203: ; preds = %196, %187
%204 = phi i1 [ true, %187 ], [ %202, %196 ]
br label %205
205: ; preds = %203, %180, %176
%206 = phi i1 [ false, %180 ], [ false, %176 ], [ %204, %203 ]
br i1 %206, label %207, label %210
207: ; preds = %205
%208 = load i64, i64* %11
%209 = add i64 %208, 1
store i64 %209, i64* %11
br label %176
210: ; preds = %205
%211 = load i64, i64* %11
%212 = load i64, i64* %7
%213 = icmp eq i64 %211, %212
br i1 %213, label %220, label %214
214: ; preds = %210
%215 = load i8*, i8** %6
%216 = load i64, i64* %11
%217 = getelementptr inbounds i8, i8* %215, i64 %216
%218 = load i8, i8* %217
%219 = icmp ne i8 %218, 0
br i1 %219, label %221, label %220
220: ; preds = %214, %210
br label %226
221: ; preds = %214
br label %222
222: ; preds = %221, %145, %122, %114, %109
br label %223
223: ; preds = %222
%224 = load i64, i64* %11
%225 = add i64 %224, 1
store i64 %225, i64* %11
br label %89
226: ; preds = %220, %107
%227 = load i64, i64* %11
%228 = load i64, i64* %7
%229 = icmp eq i64 %227, %228
br i1 %229, label %236, label %230
230: ; preds = %226
%231 = load i8*, i8** %6
%232 = load i64, i64* %11
%233 = getelementptr inbounds i8, i8* %231, i64 %232
%234 = load i8, i8* %233
%235 = icmp ne i8 %234, 0
br i1 %235, label %238, label %236
236: ; preds = %230, %226
%237 = load i64*, i64** %8
store i64 1, i64* %237
store i32 91, i32* %5
br label %283
238: ; preds = %230
%239 = load i64, i64* %11
%240 = add i64 %239, 1
%241 = load i64*, i64** %8
store i64 %240, i64* %241
store i32 -3, i32* %5
br label %283
242: ; preds = %45
%243 = load i8*, i8** %6
%244 = getelementptr inbounds i8, i8* %243, i64 0
%245 = load i8, i8* %244
%246 = sext i8 %245 to i32
%247 = icmp eq i32 %246, 42
br i1 %247, label %248, label %249
248: ; preds = %242
store i32 -5, i32* %5
br label %283
249: ; preds = %242
%250 = load i8*, i8** %6
%251 = getelementptr inbounds i8, i8* %250, i64 0
%252 = load i8, i8* %251
%253 = sext i8 %252 to i32
%254 = icmp eq i32 %253, 63
br i1 %254, label %255, label %256
255: ; preds = %249
store i32 -4, i32* %5
br label %283
256: ; preds = %249
br label %257
257: ; preds = %256, %41
%258 = load i8*, i8** %6
%259 = getelementptr inbounds i8, i8* %258, i64 0
%260 = load i8, i8* %259
%261 = sext i8 %260 to i32
%262 = icmp uge i32 %261, 128
br i1 %262, label %263, label %278
263: ; preds = %257
%264 = load i8*, i8** %6
%265 = load i64, i64* %7
%266 = call i32 @mbtowc(i32* %13, i8* %264, i64 %265)
store i32 %266, i32* %14
%267 = load i32, i32* %14
%268 = icmp slt i32 %267, 0
br i1 %268, label %269, label %271
269: ; preds = %263
%270 = load i64*, i64** %8
store i64 0, i64* %270
store i32 -2, i32* %5
br label %283
271: ; preds = %263
%272 = load i32, i32* %14
%273 = load i32, i32* %10
%274 = add nsw i32 %272, %273
%275 = sext i32 %274 to i64
%276 = load i64*, i64** %8
store i64 %275, i64* %276
%277 = load i32, i32* %13
store i32 %277, i32* %5
br label %283
278: ; preds = %257
%279 = load i8*, i8** %6
%280 = getelementptr inbounds i8, i8* %279, i64 0
%281 = load i8, i8* %280
%282 = sext i8 %281 to i32
store i32 %282, i32* %5
br label %283
283: ; preds = %278, %271, %269, %255, %248, %238, %236, %21
%284 = load i32, i32* %5
ret i32 %284
}

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