#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 */
int glob_match_after_star(char *, char *);
int glob_match(char *pattern, char *text) {
  register char *p = pattern, *t = text;
  register char c;
  while ((c = *p++) != '\0') {
    switch (c) {
    case '?':
      if (*t == '\0') {
        return 0;
      } else {
        ++t;
      }
      break;
    case '\\':
      if (*p++ != *t++) {
        return 0;
      }
      break;
    case '*':
      return glob_match_after_star(p, t);
    case '[': {
      register char c1 = *t++;
      int invert;
      if (!c1) {
        return 0;
      }
      invert = ((*p == '!') || (*p == '^'));
      if (invert) {
        p++;
      }
      c = *p++;
      while (1) {
        register char cstart = c, cend = c;
        if (c == '\\') {
          cstart = *p++;
          cend = cstart;
        }
        if (c == '\0') {
          return 0;
        }
        c = *p++;
        if ((c == '-') && (*p != ']')) {
          cend = *p++;
          if (cend == '\\') {
            cend = *p++;
          }
          if (cend == '\0') {
            return 0;
          }
          c = *p++;
        }
        if ((c1 >= cstart) && (c1 <= cend)) {
          goto match;
        }
        if (c == ']') {
          break;
        }
      }
      if (!invert) {
        return 0;
      }
      break;
    match:
      while (c != ']') {
        if (c == '\0') {
          return 0;
        }
        c = *p++;
        if (c == '\0') {
          return 0;
        } else if (c == '\\') {
          ++p;
        }
      }
      if (invert) {
        return 0;
      }
      break;
    }
    default:
      if (c != *t++) {
        return 0;
      }
    }
  }
  return *t == '\0';
}


x86 assembly (clang, -O0):
<glob_match>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
je     149b <glob_match+0x38b>
movsbl -0x29(%rbp),%eax
mov    %eax,-0x38(%rbp)
sub    $0x2a,%eax
je     1202 <glob_match+0xf2>
jmp    1165 <glob_match+0x55>
mov    -0x38(%rbp),%eax
sub    $0x3f,%eax
je     1198 <glob_match+0x88>
jmp    1176 <glob_match+0x66>
mov    -0x38(%rbp),%eax
sub    $0x5b,%eax
je     1217 <glob_match+0x107>
jmp    1187 <glob_match+0x77>
mov    -0x38(%rbp),%eax
sub    $0x5c,%eax
je     11c5 <glob_match+0xb5>
jmp    1467 <glob_match+0x357>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11b4 <glob_match+0xa4>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1496 <glob_match+0x386>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%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     11fd <glob_match+0xed>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
jmp    1496 <glob_match+0x386>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1030 <glob_match_after_star@plt>
mov    %eax,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x2a(%rbp)
cmpb   $0x0,-0x2a(%rbp)
jne    1241 <glob_match+0x131>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x21,%ecx
mov    %al,-0x39(%rbp)
je     1266 <glob_match+0x156>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5e,%eax
sete   %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x0,-0x30(%rbp)
je     1287 <glob_match+0x177>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
mov    %al,-0x31(%rbp)
mov    -0x29(%rbp),%al
mov    %al,-0x32(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x5c,%eax
jne    12ce <glob_match+0x1be>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
mov    %al,-0x32(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x0,%eax
jne    12e7 <glob_match+0x1d7>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x2d,%eax
jne    137a <glob_match+0x26a>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5d,%eax
je     137a <glob_match+0x26a>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x32(%rbp)
movsbl -0x32(%rbp),%eax
cmp    $0x5c,%eax
jne    134d <glob_match+0x23d>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x32(%rbp)
movsbl -0x32(%rbp),%eax
cmp    $0x0,%eax
jne    1366 <glob_match+0x256>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x2a(%rbp),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
jl     139f <glob_match+0x28f>
movsbl -0x2a(%rbp),%eax
movsbl -0x32(%rbp),%ecx
cmp    %ecx,%eax
jg     139f <glob_match+0x28f>
jmp    13d1 <glob_match+0x2c1>
movsbl -0x29(%rbp),%eax
cmp    $0x5d,%eax
jne    13b1 <glob_match+0x2a1>
jmp    13b6 <glob_match+0x2a6>
jmp    129b <glob_match+0x18b>
cmpl   $0x0,-0x30(%rbp)
jne    13cc <glob_match+0x2bc>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
jmp    1496 <glob_match+0x386>
jmp    13d6 <glob_match+0x2c6>
movsbl -0x29(%rbp),%eax
cmp    $0x5d,%eax
je     144c <glob_match+0x33c>
movsbl -0x29(%rbp),%eax
cmp    $0x0,%eax
jne    13fc <glob_match+0x2ec>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x0,%eax
jne    1429 <glob_match+0x319>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
movsbl -0x29(%rbp),%eax
cmp    $0x5c,%eax
jne    1442 <glob_match+0x332>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1447 <glob_match+0x337>
jmp    13d6 <glob_match+0x2c6>
cmpl   $0x0,-0x30(%rbp)
je     1462 <glob_match+0x352>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
jmp    1496 <glob_match+0x386>
movsbl -0x29(%rbp),%eax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     1491 <glob_match+0x381>
movl   $0x0,-0x4(%rbp)
jmp    14b0 <glob_match+0x3a0>
jmp    1496 <glob_match+0x386>
jmp    1130 <glob_match+0x20>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<glob_match>:
mov    (%rdi),%al
test   %al,%al
je     12c6 <glob_match+0x1b6>
mov    %rdi,%rcx
jmp    1143 <glob_match+0x33>
nop
cmp    $0x3f,%edx
jne    128f <glob_match+0x17f>
cmpb   $0x0,(%rsi)
je     12cf <glob_match+0x1bf>
add    $0x1,%rsi
mov    (%rdi),%al
mov    %rdi,%rcx
test   %al,%al
je     12c6 <glob_match+0x1b6>
lea    0x1(%rcx),%rdi
movsbl %al,%edx
cmp    $0x5a,%edx
jle    1120 <glob_match+0x10>
cmp    $0x5b,%edx
je     1180 <glob_match+0x70>
cmp    $0x5c,%edx
jne    1294 <glob_match+0x184>
mov    0x1(%rcx),%al
cmp    (%rsi),%al
jne    12cf <glob_match+0x1bf>
add    $0x2,%rcx
mov    %rcx,%rdi
jmp    1132 <glob_match+0x22>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rsi),%r9b
xor    %eax,%eax
test   %r9b,%r9b
je     12d1 <glob_match+0x1c1>
mov    0x1(%rcx),%r8b
cmp    $0x21,%r8b
sete   %r10b
cmp    $0x5e,%r8b
sete   %dl
or     %r10b,%dl
lea    0x2(%rcx),%r10
movzbl %dl,%edx
test   %dl,%dl
cmovne %r10,%rdi
add    $0x1,%rdi
mov    0x1(%rdx,%rcx,1),%cl
jmp    11c9 <glob_match+0xb9>
nopl   0x0(%rax,%rax,1)
cmp    $0x5d,%cl
je     129e <glob_match+0x18e>
cmp    $0x5c,%cl
je     11e0 <glob_match+0xd0>
mov    %ecx,%r11d
test   %cl,%cl
jne    11e8 <glob_match+0xd8>
jmp    12d1 <glob_match+0x1c1>
nopw   0x0(%rax,%rax,1)
movzbl (%rdi),%r11d
add    $0x1,%rdi
lea    0x1(%rdi),%rdx
movzbl (%rdi),%ecx
cmp    $0x2d,%cl
jne    1210 <glob_match+0x100>
movzbl (%rdx),%r10d
cmp    $0x5d,%r10b
jne    1220 <glob_match+0x110>
mov    $0x2d,%cl
mov    %rdx,%rdi
cmp    %r11b,%r9b
jne    11c9 <glob_match+0xb9>
jmp    1262 <glob_match+0x152>
nopw   0x0(%rax,%rax,1)
mov    %rdx,%rdi
mov    %r11d,%r10d
cmp    %r11b,%r9b
jge    1256 <glob_match+0x146>
jmp    11c0 <glob_match+0xb0>
nopl   (%rax)
cmp    $0x5c,%r10b
jne    1239 <glob_match+0x129>
movzbl 0x2(%rdi),%r10d
add    $0x3,%rdi
test   %r10b,%r10b
jne    1246 <glob_match+0x136>
jmp    12d1 <glob_match+0x1c1>
add    $0x2,%rdi
test   %r10b,%r10b
je     12d1 <glob_match+0x1c1>
movzbl (%rdi),%ecx
add    $0x1,%rdi
cmp    %r11b,%r9b
jl     11c0 <glob_match+0xb0>
cmp    %r10b,%r9b
jg     11c0 <glob_match+0xb0>
mov    %rdi,%rdx
mov    %rdx,%rdi
jmp    1274 <glob_match+0x164>
nopw   0x0(%rax,%rax,1)
add    $0x2,%rdi
test   %cl,%cl
je     12d1 <glob_match+0x1c1>
cmp    $0x5d,%cl
je     12b4 <glob_match+0x1a4>
movzbl (%rdi),%ecx
cmp    $0x5c,%cl
je     1270 <glob_match+0x160>
add    $0x1,%rdi
test   %cl,%cl
jne    1274 <glob_match+0x164>
jmp    12d1 <glob_match+0x1c1>
cmp    $0x2a,%edx
je     12d2 <glob_match+0x1c2>
cmp    (%rsi),%al
je     1132 <glob_match+0x22>
jmp    12cf <glob_match+0x1bf>
cmp    $0x21,%r8b
je     1132 <glob_match+0x22>
cmp    $0x5e,%r8b
je     1132 <glob_match+0x22>
jmp    12d1 <glob_match+0x1c1>
cmp    $0x21,%r8b
je     12d1 <glob_match+0x1c1>
cmp    $0x5e,%r8b
jne    1132 <glob_match+0x22>
jmp    12d1 <glob_match+0x1c1>
xor    %eax,%eax
cmpb   $0x0,(%rsi)
sete   %al
ret
xor    %eax,%eax
ret
jmp    1030 <glob_match_after_star@plt>

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

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