#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 */
char *strchr(char *, char);
int patmatch(char *buf, char *pat) {
  int match = 1, m, n;
  char *bar = strchr(pat, '|');
  if (bar) {
    if (bar == pat || !bar[1]) {
      return -1;
    }
    *bar = '\0';
    match = patmatch(buf, pat);
    if (!match) {
      match = patmatch(buf, bar + 1);
    }
    *bar = '|';
    return match;
  }
  while (*pat && match) {
    switch (*pat) {
    case '[':
      pat++;
      if (*pat != '^') {
        n = 1;
        match = 0;
      } else {
        pat++;
        n = 0;
      }
      while (*pat != ']') {
        if (*pat == '\\')
          pat++;
        if (!*pat)
          return -1;
        if (pat[1] == '-') {
          m = *pat;
          pat += 2;
          if (*pat == '\\' && *pat)
            pat++;
          if (*buf >= m && *buf <= *pat)
            match = n;
          if (!*pat)
            pat--;
        } else if (*buf == *pat)
          match = n;
        pat++;
      }
      buf++;
      break;
    case '*':
      pat++;
      if (!*pat)
        return 1;
      while (*buf && !(match = patmatch(buf++, pat)))
        ;
      return match;
    case '?':
      if (!*buf)
        return 0;
      buf++;
      break;
    case '\\':
      if (*pat)
        pat++;
    default:
      match = (*buf++ == *pat);
      break;
    }
    pat++;
    if (match < 1)
      return match;
  }
  if (!*buf)
    return match;
  return 0;
}


x86 assembly (clang, -O0):
<patmatch>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x7c,%esi
call   1040 <strchr@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
je     11c3 <patmatch+0xa3>
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
je     1170 <patmatch+0x50>
mov    -0x30(%rbp),%rax
cmpb   $0x0,0x1(%rax)
jne    117c <patmatch+0x5c>
movl   $0xffffffff,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <patmatch@plt>
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    11b1 <patmatch+0x91>
mov    -0x10(%rbp),%rdi
mov    -0x30(%rbp),%rsi
add    $0x1,%rsi
call   1030 <patmatch@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x30(%rbp),%rax
movb   $0x7c,(%rax)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
jmp    11c8 <patmatch+0xa8>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x31(%rbp)
je     11e7 <patmatch+0xc7>
cmpl   $0x0,-0x1c(%rbp)
setne  %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    11f7 <patmatch+0xd7>
jmp    14c7 <patmatch+0x3a7>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x38(%rbp)
sub    $0x2a,%eax
je     13ae <patmatch+0x28e>
jmp    120f <patmatch+0xef>
mov    -0x38(%rbp),%eax
sub    $0x3f,%eax
je     1433 <patmatch+0x313>
jmp    1220 <patmatch+0x100>
mov    -0x38(%rbp),%eax
sub    $0x5b,%eax
je     1242 <patmatch+0x122>
jmp    1231 <patmatch+0x111>
mov    -0x38(%rbp),%eax
sub    $0x5c,%eax
je     145d <patmatch+0x33d>
jmp    147b <patmatch+0x35b>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5e,%eax
je     1271 <patmatch+0x151>
movl   $0x1,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
jmp    1284 <patmatch+0x164>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x24(%rbp)
jmp    1289 <patmatch+0x169>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5d,%eax
je     139d <patmatch+0x27d>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    12b5 <patmatch+0x195>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    12ce <patmatch+0x1ae>
movl   $0xffffffff,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2d,%eax
jne    136b <patmatch+0x24b>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    1321 <patmatch+0x201>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1321 <patmatch+0x201>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    -0x20(%rbp),%eax
jl     134d <patmatch+0x22d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jg     134d <patmatch+0x22d>
mov    -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1366 <patmatch+0x246>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    138c <patmatch+0x26c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    1387 <patmatch+0x267>
mov    -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    138c <patmatch+0x26c>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1289 <patmatch+0x169>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    14a1 <patmatch+0x381>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    13d3 <patmatch+0x2b3>
movl   $0x1,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
jmp    13d8 <patmatch+0x2b8>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x39(%rbp)
je     1413 <patmatch+0x2f3>
mov    -0x10(%rbp),%rdi
mov    %rdi,%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rsi
call   1030 <patmatch@plt>
mov    %eax,-0x1c(%rbp)
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    1423 <patmatch+0x303>
jmp    1428 <patmatch+0x308>
jmp    13d8 <patmatch+0x2b8>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    144c <patmatch+0x32c>
movl   $0x0,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    14a1 <patmatch+0x381>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1476 <patmatch+0x356>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    147b <patmatch+0x35b>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jge    14c2 <patmatch+0x3a2>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
jmp    11c8 <patmatch+0xa8>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    14df <patmatch+0x3bf>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14e6 <patmatch+0x3c6>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<patmatch>:
push   %r15
push   %r14
push   %rbx
mov    %rsi,%rbx
mov    %rdi,%r14
mov    %rsi,%rdi
mov    $0x7c,%esi
call   1040 <strchr@plt>
test   %rax,%rax
je     11b2 <patmatch+0x92>
mov    %rax,%r15
mov    $0xffffffff,%eax
cmp    %rbx,%r15
je     12b8 <patmatch+0x198>
cmpb   $0x0,0x1(%r15)
je     12b8 <patmatch+0x198>
movb   $0x0,(%r15)
mov    %r14,%rdi
mov    %rbx,%rsi
call   1030 <patmatch@plt>
test   %eax,%eax
jne    117b <patmatch+0x5b>
mov    %r15,%rsi
add    $0x1,%rsi
mov    %r14,%rdi
call   1030 <patmatch@plt>
movb   $0x7c,(%r15)
jmp    12b8 <patmatch+0x198>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x1(%rbx),%cl
add    $0x1,%rbx
xor    %r9d,%r9d
cmp    %cl,(%r14)
sete   %r9b
add    $0x1,%r14
add    $0x1,%rbx
test   %r9d,%r9d
jle    12be <patmatch+0x19e>
movsbl (%rbx),%ecx
test   %ecx,%ecx
je     12c2 <patmatch+0x1a2>
cmp    $0x5a,%ecx
jle    1260 <patmatch+0x140>
cmp    $0x5c,%ecx
je     1190 <patmatch+0x70>
cmp    $0x5b,%ecx
jne    1197 <patmatch+0x77>
lea    0x2(%rbx),%rdx
xor    %r8d,%r8d
xor    %r9d,%r9d
cmpb   $0x5e,0x1(%rbx)
lea    0x1(%rbx),%rbx
setne  %r8b
sete   %r9b
cmove  %rdx,%rbx
jmp    1229 <patmatch+0x109>
lea    0x3(%rbx),%rsi
xor    %edi,%edi
cmpb   $0x5c,0x2(%rbx)
sete   %dil
movzbl 0x2(%rdi,%rbx,1),%ecx
lea    0x2(%rbx),%rbx
cmove  %rsi,%rbx
movzbl (%r14),%eax
cmp    %cl,%al
mov    %r8d,%esi
cmovg  %r9d,%esi
cmp    %dl,%al
cmovge %esi,%r9d
cmp    $0x1,%cl
sbb    $0x0,%rbx
add    $0x1,%rbx
movzbl (%rbx),%edx
cmp    $0x5c,%dl
je     1240 <patmatch+0x120>
cmp    $0x5d,%dl
je     11a1 <patmatch+0x81>
test   %dl,%dl
jne    124c <patmatch+0x12c>
jmp    12b3 <patmatch+0x193>
movzbl 0x1(%rbx),%edx
add    $0x1,%rbx
test   %dl,%dl
je     12b3 <patmatch+0x193>
cmpb   $0x2d,0x1(%rbx)
je     11f0 <patmatch+0xd0>
cmp    %dl,(%r14)
cmove  %r8d,%r9d
add    $0x1,%rbx
jmp    1229 <patmatch+0x109>
nop
cmp    $0x3f,%ecx
jne    1277 <patmatch+0x157>
mov    $0x1,%r9d
cmpb   $0x0,(%r14)
jne    11a1 <patmatch+0x81>
jmp    12be <patmatch+0x19e>
cmp    $0x2a,%ecx
jne    1197 <patmatch+0x77>
mov    $0x1,%eax
cmpb   $0x0,0x1(%rbx)
je     12b8 <patmatch+0x198>
cmpb   $0x0,(%r14)
je     12b8 <patmatch+0x198>
add    $0x1,%rbx
mov    %r14,%rdi
mov    %rbx,%rsi
call   1030 <patmatch@plt>
test   %eax,%eax
jne    12b8 <patmatch+0x198>
xor    %eax,%eax
cmpb   $0x0,0x1(%r14)
lea    0x1(%r14),%r14
jne    1295 <patmatch+0x175>
jmp    12b8 <patmatch+0x198>
mov    $0xffffffff,%eax
pop    %rbx
pop    %r14
pop    %r15
ret
xor    %eax,%eax
jmp    12b8 <patmatch+0x198>
xor    %eax,%eax
cmpb   $0x0,(%r14)
sete   %al
jmp    12b8 <patmatch+0x198>

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

LLVM IR (-O2):
define i32 @patmatch(i8* %0, i8* %1) {
%3 = tail call i8* @strchr(i8* dereferenceable(1) %1, i8 signext 124)
%4 = icmp eq i8* %3, null
br i1 %4, label %18, label %5
5: ; preds = %2
%6 = icmp eq i8* %3, %1
br i1 %6, label %109, label %7
7: ; preds = %5
%8 = getelementptr inbounds i8, i8* %3, i64 1
%9 = load i8, i8* %8
%10 = icmp eq i8 %9, 0
br i1 %10, label %109, label %11
11: ; preds = %7
store i8 0, i8* %3
%12 = tail call i32 @patmatch(i8* %0, i8* %1)
%13 = icmp eq i32 %12, 0
br i1 %13, label %14, label %16
14: ; preds = %11
%15 = tail call i32 @patmatch(i8* %0, i8* %8)
br label %16
16: ; preds = %14, %11
%17 = phi i32 [ %12, %11 ], [ %15, %14 ]
store i8 124, i8* %3
br label %109
18: ; preds = %2, %99
%19 = phi i8* [ %103, %99 ], [ %1, %2 ]
%20 = phi i8* [ %102, %99 ], [ %0, %2 ]
%21 = load i8, i8* %19
%22 = icmp eq i8 %21, 0
br i1 %22, label %105, label %23
23: ; preds = %18
%24 = sext i8 %21 to i32
switch i32 %24, label %93 [
i32 91, label %25
i32 42, label %72
i32 63, label %87
i32 92, label %90
]
25: ; preds = %23
%26 = getelementptr inbounds i8, i8* %19, i64 1
%27 = load i8, i8* %26
%28 = icmp eq i8 %27, 94
%29 = getelementptr inbounds i8, i8* %19, i64 2
%30 = select i1 %28, i8* %29, i8* %26
%31 = zext i1 %28 to i32
%32 = xor i1 %28, true
%33 = zext i1 %32 to i32
br label %34
34: ; preds = %68, %25
%35 = phi i8* [ %30, %25 ], [ %71, %68 ]
%36 = phi i32 [ %31, %25 ], [ %70, %68 ]
%37 = load i8, i8* %35
switch i8 %37, label %41 [
i8 93, label %99
i8 92, label %38
]
38: ; preds = %34
%39 = getelementptr inbounds i8, i8* %35, i64 1
%40 = load i8, i8* %39
br label %41
41: ; preds = %34, %38
%42 = phi i8 [ %37, %34 ], [ %40, %38 ]
%43 = phi i8* [ %35, %34 ], [ %39, %38 ]
%44 = icmp eq i8 %42, 0
br i1 %44, label %109, label %45
45: ; preds = %41
%46 = getelementptr inbounds i8, i8* %43, i64 1
%47 = load i8, i8* %46
%48 = icmp eq i8 %47, 45
br i1 %48, label %49, label %64
49: ; preds = %45
%50 = getelementptr inbounds i8, i8* %43, i64 2
%51 = load i8, i8* %50
%52 = icmp eq i8 %51, 92
%53 = getelementptr inbounds i8, i8* %43, i64 3
%54 = select i1 %52, i8* %53, i8* %50
%55 = load i8, i8* %20
%56 = icmp slt i8 %55, %42
%57 = load i8, i8* %54
%58 = icmp sgt i8 %55, %57
%59 = select i1 %56, i1 true, i1 %58
%60 = select i1 %59, i32 %36, i32 %33
%61 = icmp eq i8 %57, 0
%62 = sext i1 %61 to i64
%63 = getelementptr i8, i8* %54, i64 %62
br label %68
64: ; preds = %45
%65 = load i8, i8* %20
%66 = icmp eq i8 %65, %42
%67 = select i1 %66, i32 %33, i32 %36
br label %68
68: ; preds = %64, %49
%69 = phi i8* [ %63, %49 ], [ %43, %64 ]
%70 = phi i32 [ %60, %49 ], [ %67, %64 ]
%71 = getelementptr inbounds i8, i8* %69, i64 1
br label %34
72: ; preds = %23
%73 = getelementptr inbounds i8, i8* %19, i64 1
%74 = load i8, i8* %73
%75 = icmp eq i8 %74, 0
br i1 %75, label %109, label %76
76: ; preds = %72
%77 = load i8, i8* %20
%78 = icmp eq i8 %77, 0
br i1 %78, label %109, label %82
79: ; preds = %82
%80 = load i8, i8* %84
%81 = icmp eq i8 %80, 0
br i1 %81, label %109, label %82
82: ; preds = %76, %79
%83 = phi i8* [ %84, %79 ], [ %20, %76 ]
%84 = getelementptr inbounds i8, i8* %83, i64 1
%85 = tail call i32 @patmatch(i8* %83, i8* %73)
%86 = icmp eq i32 %85, 0
br i1 %86, label %79, label %109
87: ; preds = %23
%88 = load i8, i8* %20
%89 = icmp eq i8 %88, 0
br i1 %89, label %109, label %99
90: ; preds = %23
%91 = getelementptr inbounds i8, i8* %19, i64 1
%92 = load i8, i8* %91
br label %93
93: ; preds = %90, %23
%94 = phi i8 [ %21, %23 ], [ %92, %90 ]
%95 = phi i8* [ %19, %23 ], [ %91, %90 ]
%96 = load i8, i8* %20
%97 = icmp eq i8 %96, %94
%98 = zext i1 %97 to i32
br label %99
99: ; preds = %34, %87, %93
%100 = phi i8* [ %95, %93 ], [ %19, %87 ], [ %35, %34 ]
%101 = phi i32 [ %98, %93 ], [ 1, %87 ], [ %36, %34 ]
%102 = getelementptr inbounds i8, i8* %20, i64 1
%103 = getelementptr inbounds i8, i8* %100, i64 1
%104 = icmp slt i32 %101, 1
br i1 %104, label %109, label %18
105: ; preds = %18
%106 = load i8, i8* %20
%107 = icmp eq i8 %106, 0
%108 = zext i1 %107 to i32
br label %109
109: ; preds = %99, %87, %41, %79, %82, %76, %105, %72, %5, %7, %16
%110 = phi i32 [ %17, %16 ], [ -1, %7 ], [ -1, %5 ], [ 1, %72 ], [ %108, %105 ], [ 1, %76 ], [ 0, %79 ], [ %85, %82 ], [ -1, %41 ], [ 0, %87 ], [ 0, %99 ]
ret i32 %110
}