int xpmatch(pattern, string, ncase)
char *pattern;
char *string;
int ncase;
{
  register char *p, *q;
  register char c;
  p = pattern;
  q = string;
  for (;;) {
    switch (c = *p++) {
    case '\0':
      goto breakloop;
    case '\\':
      if (*q++ != *p++)
        return 0;
      break;
    case '?':
      if (*q++ == '\0')
        return 0;
      break;
    case '*':
      c = *p;
      if (c != '\\' && c != '?' && c != '*' && c != '[') {
        while (*q != c) {
          if (ncase && toupper(*q) == toupper(c))
            break;
          if (*q == '\0')
            return 0;
          q++;
        }
      }
      do {
        if (xpmatch(p, q, ncase))
          return 1;
      } while (*q++ != '\0');
      return 0;
    case '[': {
      char *endp;
      int invert, found;
      char chr;
      endp = p;
      if (*endp == '!')
        endp++;
      for (;;) {
        if (*endp == '\0')
          goto dft;
        if (*endp == '\\')
          endp++;
        if (*++endp == ']')
          break;
      }
      invert = 0;
      if (*p == '!') {
        invert++;
        p++;
      }
      found = 0;
      chr = *q++;
      c = *p++;
      do {
        if (c == '\\')
          c = *p++;
        if (*p == '-' && p[1] != ']') {
          p++;
          if (*p == '\\')
            p++;
          if (chr >= c && chr <= *p)
            found = 1;
          p++;
        } else {
          if (chr == c)
            found = 1;
        }
      } while ((c = *p++) != ']');
      if (found == invert)
        return 0;
      break;
    }
    dft:
    default:
      if (ncase) {
        if (toupper(*q++) != toupper(c))
          return 0;
      } else if (*q++ != c)
        return 0;
      break;
    }
  }
breakloop:
  if (*q != '\0')
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<xpmatch>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x50(%rbp)
mov    %al,%cl
mov    %cl,-0x31(%rbp)
test   %eax,%eax
je     11ae <xpmatch+0x8e>
jmp    116a <xpmatch+0x4a>
mov    -0x50(%rbp),%eax
sub    $0x2a,%eax
je     121c <xpmatch+0xfc>
jmp    117b <xpmatch+0x5b>
mov    -0x50(%rbp),%eax
sub    $0x3f,%eax
je     11f0 <xpmatch+0xd0>
jmp    118c <xpmatch+0x6c>
mov    -0x50(%rbp),%eax
sub    $0x5b,%eax
je     132d <xpmatch+0x20d>
jmp    119d <xpmatch+0x7d>
mov    -0x50(%rbp),%eax
sub    $0x5c,%eax
je     11b3 <xpmatch+0x93>
jmp    1510 <xpmatch+0x3f0>
jmp    1594 <xpmatch+0x474>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movsbl (%rax),%eax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     11eb <xpmatch+0xcb>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
jmp    158f <xpmatch+0x46f>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1217 <xpmatch+0xf7>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
jmp    158f <xpmatch+0x46f>
mov    -0x28(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x5c,%eax
je     12d7 <xpmatch+0x1b7>
movsbl -0x31(%rbp),%eax
cmp    $0x3f,%eax
je     12d7 <xpmatch+0x1b7>
movsbl -0x31(%rbp),%eax
cmp    $0x2a,%eax
je     12d7 <xpmatch+0x1b7>
movsbl -0x31(%rbp),%eax
cmp    $0x5b,%eax
je     12d7 <xpmatch+0x1b7>
jmp    125e <xpmatch+0x13e>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
je     12d2 <xpmatch+0x1b2>
cmpl   $0x0,-0x1c(%rbp)
je     12a5 <xpmatch+0x185>
mov    -0x30(%rbp),%rax
movsbl (%rax),%edi
call   1030 <toupper@plt>
mov    %eax,-0x54(%rbp)
movsbl -0x31(%rbp),%edi
call   1030 <toupper@plt>
mov    %eax,%ecx
mov    -0x54(%rbp),%eax
cmp    %ecx,%eax
jne    12a5 <xpmatch+0x185>
jmp    12d2 <xpmatch+0x1b2>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    12c1 <xpmatch+0x1a1>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    125e <xpmatch+0x13e>
jmp    12d7 <xpmatch+0x1b7>
jmp    12dc <xpmatch+0x1bc>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
mov    -0x1c(%rbp),%edx
call   1040 <xpmatch@plt>
cmp    $0x0,%eax
je     1301 <xpmatch+0x1e1>
movl   $0x1,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
jmp    1306 <xpmatch+0x1e6>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    12dc <xpmatch+0x1bc>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
mov    -0x28(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x21,%eax
jne    1351 <xpmatch+0x231>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1356 <xpmatch+0x236>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    136b <xpmatch+0x24b>
jmp    150b <xpmatch+0x3eb>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    1387 <xpmatch+0x267>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x40(%rbp)
movsbl 0x1(%rax),%eax
cmp    $0x5d,%eax
jne    13a8 <xpmatch+0x288>
jmp    13ad <xpmatch+0x28d>
jmp    1356 <xpmatch+0x236>
movl   $0x0,-0x44(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x21,%eax
jne    13d9 <xpmatch+0x2b9>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x48(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x49(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x5c,%eax
jne    1429 <xpmatch+0x309>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    14ad <xpmatch+0x38d>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x5d,%eax
je     14ad <xpmatch+0x38d>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    1472 <xpmatch+0x352>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
movsbl -0x49(%rbp),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
jl     149c <xpmatch+0x37c>
movsbl -0x49(%rbp),%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jg     149c <xpmatch+0x37c>
movl   $0x1,-0x48(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    14c9 <xpmatch+0x3a9>
movsbl -0x49(%rbp),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
jne    14c4 <xpmatch+0x3a4>
movl   $0x1,-0x48(%rbp)
jmp    14c9 <xpmatch+0x3a9>
jmp    14ce <xpmatch+0x3ae>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%eax
cmp    $0x5d,%eax
jne    1408 <xpmatch+0x2e8>
mov    -0x48(%rbp),%eax
cmp    -0x44(%rbp),%eax
jne    1506 <xpmatch+0x3e6>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
jmp    158f <xpmatch+0x46f>
jmp    1510 <xpmatch+0x3f0>
cmpl   $0x0,-0x1c(%rbp)
je     155b <xpmatch+0x43b>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movsbl (%rax),%edi
call   1030 <toupper@plt>
mov    %eax,-0x58(%rbp)
movsbl -0x31(%rbp),%edi
call   1030 <toupper@plt>
mov    %eax,%ecx
mov    -0x58(%rbp),%eax
cmp    %ecx,%eax
je     1556 <xpmatch+0x436>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
jmp    158a <xpmatch+0x46a>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movsbl (%rax),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
je     1585 <xpmatch+0x465>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
jmp    158a <xpmatch+0x46a>
jmp    158f <xpmatch+0x46f>
jmp    1143 <xpmatch+0x23>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     15b0 <xpmatch+0x490>
movl   $0x0,-0x4(%rbp)
jmp    15b7 <xpmatch+0x497>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<xpmatch>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %edx,%r12d
mov    %rsi,%r15
mov    $0x1,%r13d
mov    %edx,0x4(%rsp)
jmp    1157 <xpmatch+0x37>
xor    %eax,%eax
cmp    $0x21,%r8b
sete   %al
cmp    %eax,%ecx
je     12ec <xpmatch+0x1cc>
xchg   %ax,%ax
add    $0x1,%r15
mov    %rbp,%rdi
lea    0x1(%rdi),%rbp
movsbl (%rdi),%r14d
cmp    $0x5a,%r14d
jle    1190 <xpmatch+0x70>
cmp    $0x5b,%r14d
je     11b0 <xpmatch+0x90>
cmp    $0x5c,%r14d
jne    1264 <xpmatch+0x144>
mov    (%r15),%al
cmp    0x1(%rdi),%al
jne    12ec <xpmatch+0x1cc>
add    $0x2,%rdi
mov    %rdi,%rbp
jmp    1150 <xpmatch+0x30>
nopw   0x0(%rax,%rax,1)
cmp    $0x3f,%r14d
jne    1259 <xpmatch+0x139>
cmpb   $0x0,(%r15)
jne    1150 <xpmatch+0x30>
jmp    12ec <xpmatch+0x1cc>
cs nopw 0x0(%rax,%rax,1)
nop
mov    0x1(%rdi),%r8b
lea    0x2(%rdi),%rsi
xor    %eax,%eax
cmp    $0x21,%r8b
sete   %al
cmovne %rbp,%rsi
mov    0x1(%rax,%rdi,1),%bl
mov    %ebx,%ecx
mov    %rsi,%rax
jmp    11e1 <xpmatch+0xc1>
add    $0x1,%rax
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
cmp    $0x5d,%cl
je     11ec <xpmatch+0xcc>
cmp    $0x5c,%cl
je     11d0 <xpmatch+0xb0>
test   %cl,%cl
jne    11d4 <xpmatch+0xb4>
jmp    1264 <xpmatch+0x144>
mov    (%r15),%dil
add    $0x1,%rsi
xor    %ecx,%ecx
mov    %rsi,%rbp
jmp    1215 <xpmatch+0xf5>
nopw   0x0(%rax,%rax,1)
cmp    %bl,%dil
cmove  %r13d,%ecx
add    $0x1,%rbp
mov    %eax,%ebx
cmp    $0x5d,%al
je     113d <xpmatch+0x1d>
cmp    $0x5c,%bl
jne    1222 <xpmatch+0x102>
movzbl 0x0(%rbp),%ebx
add    $0x1,%rbp
movzbl 0x0(%rbp),%eax
cmp    $0x2d,%al
jne    1200 <xpmatch+0xe0>
movzbl 0x1(%rbp),%edx
cmp    $0x5d,%dl
je     1200 <xpmatch+0xe0>
lea    0x1(%rbp),%rax
add    $0x2,%rbp
cmp    $0x5c,%dl
cmovne %rax,%rbp
cmp    %bl,%dil
jl     124f <xpmatch+0x12f>
cmp    0x0(%rbp),%dil
cmovle %r13d,%ecx
movzbl 0x1(%rbp),%eax
add    $0x1,%rbp
jmp    1207 <xpmatch+0xe7>
test   %r14d,%r14d
je     1298 <xpmatch+0x178>
cmp    $0x2a,%r14d
je     12a3 <xpmatch+0x183>
movsbl (%r15),%edi
test   %r12d,%r12d
je     128d <xpmatch+0x16d>
call   1030 <toupper@plt>
mov    %eax,%r12d
mov    %r14d,%edi
call   1030 <toupper@plt>
cmp    %eax,%r12d
mov    0x4(%rsp),%r12d
je     1150 <xpmatch+0x30>
jmp    12ec <xpmatch+0x1cc>
cmp    %r14b,%dil
je     1150 <xpmatch+0x30>
jmp    12ec <xpmatch+0x1cc>
xor    %eax,%eax
cmpb   $0x0,(%r15)
sete   %al
jmp    12ee <xpmatch+0x1ce>
movsbl 0x0(%rbp),%r13d
lea    -0x2a(%r13),%eax
cmp    $0x32,%al
ja     1304 <xpmatch+0x1e4>
movzbl %al,%eax
movabs $0x6000000200001,%rcx
bt     %rax,%rcx
jae    1304 <xpmatch+0x1e4>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rbp,%rdi
mov    %r15,%rsi
mov    %r12d,%edx
call   1040 <xpmatch@plt>
test   %eax,%eax
jne    12fd <xpmatch+0x1dd>
cmpb   $0x0,(%r15)
lea    0x1(%r15),%r15
jne    12d0 <xpmatch+0x1b0>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x1,%eax
jmp    12ee <xpmatch+0x1ce>
mov    (%r15),%bl
cmp    %r13b,%bl
je     12d0 <xpmatch+0x1b0>
nopl   0x0(%rax)
test   %r12d,%r12d
je     1332 <xpmatch+0x212>
movsbl %bl,%edi
call   1030 <toupper@plt>
mov    %eax,%r12d
mov    %r13d,%edi
call   1030 <toupper@plt>
cmp    %eax,%r12d
mov    0x4(%rsp),%r12d
je     12d0 <xpmatch+0x1b0>
test   %bl,%bl
je     12ec <xpmatch+0x1cc>
movzbl 0x1(%r15),%ebx
add    $0x1,%r15
cmp    %r13b,%bl
jne    1310 <xpmatch+0x1f0>
jmp    12d0 <xpmatch+0x1b0>

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

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