int glob_match(char *cmp1, char *cmp2) {
  for (;;) {
    while (*cmp1 && *cmp1 == *cmp2) {
      ++cmp1;
      ++cmp2;
    }
    if (*cmp2) {
      if (*cmp1 == '*') {
        while (*cmp1 == '*')
          ++cmp1;
        if (*cmp1) {
          int count = 0, settmp = 1;
          char *tmp = cmp2, *sav2;
          while (*cmp1 && *cmp1 == '?') {
            ++cmp1;
            ++count;
          }
          while (*cmp2 && *cmp2 != *cmp1)
            ++cmp2;
          if (!*cmp1 && cmp2 - tmp < count)
            return (0);
          sav2 = cmp2;
          while (*sav2 && sav2 - tmp < count)
            ++sav2;
          for (; *cmp2;) {
            if (settmp)
              tmp = cmp2;
            else
              settmp = 1;
            while (*cmp2 && *cmp2 != *cmp1)
              ++cmp2;
            if (cmp2 - tmp < count) {
              if (*cmp2)
                ++cmp2;
              settmp = 0;
              continue;
            }
            if (*cmp2) {
              if (glob_match(cmp1, cmp2))
                return (1);
              ++cmp2;
            }
          }
          cmp2 = sav2;
        } else {
          while (*cmp2)
            ++cmp2;
          break;
        }
      } else if (*cmp1 == '?') {
        while (*cmp1 == '?' && *cmp2) {
          ++cmp1;
          ++cmp2;
        }
        continue;
      } else
        break;
    } else {
      while (*cmp1 == '*')
        ++cmp1;
      break;
    }
  }
  return (*cmp1 == '\0' && *cmp2 == '\0');
}


x86 assembly (clang, -O0):
<glob_match>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
jmp    1125 <glob_match+0x15>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x31(%rbp)
je     1150 <glob_match+0x40>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    1160 <glob_match+0x50>
jmp    117d <glob_match+0x6d>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1125 <glob_match+0x15>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     14b8 <glob_match+0x3a8>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    1442 <glob_match+0x332>
jmp    119f <glob_match+0x8f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    11c0 <glob_match+0xb0>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    119f <glob_match+0x8f>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1415 <glob_match+0x305>
movl   $0x0,-0x1c(%rbp)
movl   $0x1,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x32(%rbp)
je     1208 <glob_match+0xf8>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
sete   %al
mov    %al,-0x32(%rbp)
mov    -0x32(%rbp),%al
test   $0x1,%al
jne    1218 <glob_match+0x108>
jmp    1232 <glob_match+0x122>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11e3 <glob_match+0xd3>
jmp    1237 <glob_match+0x127>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x33(%rbp)
je     1262 <glob_match+0x152>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x33(%rbp)
mov    -0x33(%rbp),%al
test   $0x1,%al
jne    1272 <glob_match+0x162>
jmp    1283 <glob_match+0x173>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1237 <glob_match+0x127>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    12b4 <glob_match+0x1a4>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    %rcx,%rax
movslq -0x1c(%rbp),%rcx
cmp    %rcx,%rax
jge    12b4 <glob_match+0x1a4>
movl   $0x0,-0x4(%rbp)
jmp    1518 <glob_match+0x408>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x34(%rbp)
je     12e9 <glob_match+0x1d9>
mov    -0x30(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    %rcx,%rax
movslq -0x1c(%rbp),%rcx
cmp    %rcx,%rax
setl   %al
mov    %al,-0x34(%rbp)
mov    -0x34(%rbp),%al
test   $0x1,%al
jne    12f9 <glob_match+0x1e9>
jmp    130a <glob_match+0x1fa>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    12bc <glob_match+0x1ac>
jmp    130f <glob_match+0x1ff>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1408 <glob_match+0x2f8>
cmpl   $0x0,-0x20(%rbp)
je     1333 <glob_match+0x223>
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    133a <glob_match+0x22a>
movl   $0x1,-0x20(%rbp)
jmp    133f <glob_match+0x22f>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x35(%rbp)
je     136a <glob_match+0x25a>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    137a <glob_match+0x26a>
jmp    138b <glob_match+0x27b>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    133f <glob_match+0x22f>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    %rcx,%rax
movslq -0x1c(%rbp),%rcx
cmp    %rcx,%rax
jge    13c8 <glob_match+0x2b8>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     13bc <glob_match+0x2ac>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
jmp    130f <glob_match+0x1ff>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1403 <glob_match+0x2f3>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <glob_match@plt>
cmp    $0x0,%eax
je     13f7 <glob_match+0x2e7>
movl   $0x1,-0x4(%rbp)
jmp    1518 <glob_match+0x408>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    130f <glob_match+0x1ff>
mov    -0x30(%rbp),%rax
mov    %rax,-0x18(%rbp)
jmp    143d <glob_match+0x32d>
jmp    141a <glob_match+0x30a>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1438 <glob_match+0x328>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    141a <glob_match+0x30a>
jmp    14e8 <glob_match+0x3d8>
jmp    14b3 <glob_match+0x3a3>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
jne    14ae <glob_match+0x39e>
jmp    1457 <glob_match+0x347>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x3f,%ecx
mov    %al,-0x36(%rbp)
jne    147c <glob_match+0x36c>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x36(%rbp)
mov    -0x36(%rbp),%al
test   $0x1,%al
jne    148c <glob_match+0x37c>
jmp    14a9 <glob_match+0x399>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1457 <glob_match+0x347>
jmp    1120 <glob_match+0x10>
jmp    14e8 <glob_match+0x3d8>
jmp    14e3 <glob_match+0x3d3>
jmp    14bd <glob_match+0x3ad>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    14de <glob_match+0x3ce>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    14bd <glob_match+0x3ad>
jmp    14e8 <glob_match+0x3d8>
jmp    1120 <glob_match+0x10>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x37(%rbp)
jne    150d <glob_match+0x3fd>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
sete   %al
mov    %al,-0x37(%rbp)
mov    -0x37(%rbp),%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>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %rsi,%r15
mov    %rdi,%r14
mov    (%rdi),%bpl
mov    %ebp,%edx
test   %dl,%dl
je     1168 <glob_match+0x58>
mov    (%r15),%al
cmp    %al,%dl
jne    116d <glob_match+0x5d>
add    $0x1,%r14
add    $0x1,%r15
cs nopw 0x0(%rax,%rax,1)
movzbl (%r14),%ebp
test   %bpl,%bpl
je     1166 <glob_match+0x56>
movzbl (%r15),%eax
add    $0x1,%r14
add    $0x1,%r15
cmp    %al,%bpl
je     1140 <glob_match+0x30>
add    $0xffffffffffffffff,%r14
add    $0xffffffffffffffff,%r15
mov    %ebp,%edx
jmp    116d <glob_match+0x5d>
xor    %ebp,%ebp
mov    (%r15),%al
xor    %edx,%edx
test   %al,%al
je     134f <glob_match+0x23f>
cmp    $0x3f,%dl
je     1250 <glob_match+0x140>
cmp    $0x2a,%dl
je     1199 <glob_match+0x89>
jmp    136e <glob_match+0x25e>
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%r14),%ebp
add    $0x1,%r14
cmp    $0x2a,%bpl
je     1190 <glob_match+0x80>
test   %bpl,%bpl
je     1322 <glob_match+0x212>
xor    %edx,%edx
cmp    $0x3f,%bpl
jne    11c3 <glob_match+0xb3>
movzbl 0x1(%r14,%rdx,1),%ebp
add    $0x1,%rdx
cmp    $0x3f,%bpl
je     11b0 <glob_match+0xa0>
add    %rdx,%r14
add    $0xffffffffffffffff,%r15
mov    $0xffffffffffffffff,%rdi
mov    $0x1,%esi
mov    %r15,%rax
cs nopw 0x0(%rax,%rax,1)
mov    %rsi,%rbx
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
add    $0x1,%rdi
test   %cl,%cl
je     11fc <glob_match+0xec>
lea    0x1(%rbx),%rsi
cmp    %bpl,%cl
jne    11e0 <glob_match+0xd0>
mov    %edx,%r12d
test   %bpl,%bpl
jne    120d <glob_match+0xfd>
cmp    %r12,%rdi
jl     1377 <glob_match+0x267>
mov    %rax,%r15
test   %cl,%cl
je     1237 <glob_match+0x127>
mov    %rax,%r15
cmp    %r12,%rdi
jge    1237 <glob_match+0x127>
mov    %rax,%r15
nop
cmpb   $0x0,0x1(%r15)
lea    0x1(%r15),%r15
je     1237 <glob_match+0x127>
lea    0x1(%rbx),%rdx
cmp    %r12,%rbx
mov    %rdx,%rbx
jl     1220 <glob_match+0x110>
mov    %ebp,%edx
test   %cl,%cl
jne    12a0 <glob_match+0x190>
jmp    1123 <glob_match+0x13>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    $0x3f,%dl
cmpb   $0x0,(%r15)
je     1123 <glob_match+0x13>
add    $0x1,%r14
add    $0x1,%r15
mov    %r15,%rax
mov    %r14,%rcx
nopw   0x0(%rax,%rax,1)
mov    %rcx,%r14
mov    %rax,%r15
movzbl (%rcx),%ebp
cmp    $0x3f,%bpl
jne    1121 <glob_match+0x11>
lea    0x1(%r14),%rcx
lea    0x1(%r15),%rax
cmpb   $0x0,(%r15)
jne    1270 <glob_match+0x160>
mov    $0x3f,%bpl
mov    $0x3f,%dl
jmp    1123 <glob_match+0x13>
nopl   0x0(%rax,%rax,1)
mov    %rax,%rbx
jmp    12d3 <glob_match+0x1c3>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbx,%rcx
sub    %rax,%rcx
cmp    %r12,%rcx
jge    1300 <glob_match+0x1f0>
xor    %esi,%esi
cmp    %bpl,%dl
sete   %sil
movzbl (%rbx,%rsi,1),%ecx
add    %rsi,%rbx
test   %cl,%cl
je     1121 <glob_match+0x11>
mov    %ecx,%edx
cmp    %bpl,%cl
je     12b0 <glob_match+0x1a0>
movzbl 0x1(%rbx),%ecx
add    $0x1,%rbx
test   %cl,%cl
jne    12d3 <glob_match+0x1c3>
mov    %rbx,%rcx
sub    %rax,%rcx
cmp    %r12,%rcx
jl     12bb <glob_match+0x1ab>
jmp    1121 <glob_match+0x11>
cs nopw 0x0(%rax,%rax,1)
mov    %r14,%rdi
mov    %rbx,%rsi
call   1030 <glob_match@plt>
test   %eax,%eax
jne    137b <glob_match+0x26b>
mov    0x1(%rbx),%cl
add    $0x1,%rbx
mov    %rbx,%rax
test   %cl,%cl
jne    12a0 <glob_match+0x190>
jmp    1121 <glob_match+0x11>
add    $0xffffffffffffffff,%r15
mov    %r15,%rax
nopl   0x0(%rax)
lea    0x1(%rax),%r15
cmpb   $0x0,0x1(%rax)
mov    %r15,%rax
jne    1330 <glob_match+0x220>
xor    %eax,%eax
cmpb   $0x0,(%r15)
sete   %al
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
cmp    $0x2a,%bpl
jne    136e <glob_match+0x25e>
add    $0x1,%r14
nopl   0x0(%rax)
movzbl (%r14),%ebp
add    $0x1,%r14
cmp    $0x2a,%bpl
je     1360 <glob_match+0x250>
xor    %eax,%eax
test   %bpl,%bpl
jne    1346 <glob_match+0x236>
jmp    133d <glob_match+0x22d>
xor    %eax,%eax
jmp    1346 <glob_match+0x236>
mov    $0x1,%eax
jmp    1346 <glob_match+0x236>

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

LLVM IR (-O2):
define i32 @glob_match(i8* nocapture %0, i8* %1) {
%3 = load i8, i8* %0
br label %4
4: ; preds = %41, %2
%5 = phi i8 [ %3, %2 ], [ %42, %41 ]
%6 = phi i8 [ %3, %2 ], [ %43, %41 ]
%7 = phi i8* [ %0, %2 ], [ %44, %41 ]
%8 = phi i8* [ %1, %2 ], [ %45, %41 ]
%9 = icmp eq i8 %6, 0
br i1 %9, label %23, label %10
10: ; preds = %4
%11 = load i8, i8* %8
%12 = icmp eq i8 %6, %11
br i1 %12, label %16, label %28
13: ; preds = %16
%14 = load i8, i8* %20
%15 = icmp eq i8 %21, %14
br i1 %15, label %16, label %28
16: ; preds = %10, %13
%17 = phi i8* [ %19, %13 ], [ %7, %10 ]
%18 = phi i8* [ %20, %13 ], [ %8, %10 ]
%19 = getelementptr inbounds i8, i8* %17, i64 1
%20 = getelementptr inbounds i8, i8* %18, i64 1
%21 = load i8, i8* %19
%22 = icmp eq i8 %21, 0
br i1 %22, label %23, label %13
23: ; preds = %16, %4
%24 = phi i8 [ %5, %4 ], [ 0, %16 ]
%25 = phi i8* [ %7, %4 ], [ %19, %16 ]
%26 = phi i8* [ %8, %4 ], [ %20, %16 ]
%27 = load i8, i8* %26
br label %28
28: ; preds = %13, %10, %23
%29 = phi i8 [ %24, %23 ], [ %5, %10 ], [ %21, %13 ]
%30 = phi i8 [ 0, %23 ], [ %6, %10 ], [ %21, %13 ]
%31 = phi i8* [ %25, %23 ], [ %7, %10 ], [ %19, %13 ]
%32 = phi i8* [ %26, %23 ], [ %8, %10 ], [ %20, %13 ]
%33 = phi i8 [ %27, %23 ], [ %11, %10 ], [ %14, %13 ]
%34 = icmp eq i8 %33, 0
br i1 %34, label %35, label %37
35: ; preds = %28
%36 = icmp eq i8 %29, 42
br i1 %36, label %146, label %151
37: ; preds = %28
switch i8 %30, label %151 [
i8 42, label %46
i8 63, label %38
]
38: ; preds = %37
%39 = load i8, i8* %32
%40 = icmp eq i8 %39, 0
br i1 %40, label %41, label %139
41: ; preds = %139, %136, %123, %114, %106, %38, %93
%42 = phi i8 [ %53, %93 ], [ %29, %38 ], [ %53, %106 ], [ %53, %114 ], [ %53, %123 ], [ %144, %139 ], [ 63, %136 ]
%43 = phi i8 [ %53, %93 ], [ 63, %38 ], [ %53, %106 ], [ %53, %114 ], [ %53, %123 ], [ %144, %139 ], [ 63, %136 ]
%44 = phi i8* [ %54, %93 ], [ %31, %38 ], [ %54, %106 ], [ %54, %114 ], [ %54, %123 ], [ %142, %136 ], [ %142, %139 ]
%45 = phi i8* [ %94, %93 ], [ %32, %38 ], [ %94, %106 ], [ %94, %114 ], [ %94, %123 ], [ %143, %136 ], [ %143, %139 ]
br label %4
46: ; preds = %37, %49
%47 = phi i8 [ %51, %49 ], [ %29, %37 ]
%48 = phi i8* [ %50, %49 ], [ %31, %37 ]
switch i8 %47, label %52 [
i8 42, label %49
i8 0, label %131
i8 63, label %56
]
49: ; preds = %46
%50 = getelementptr inbounds i8, i8* %48, i64 1
%51 = load i8, i8* %50
br label %46
52: ; preds = %46, %56
%53 = phi i8 [ %61, %56 ], [ %47, %46 ]
%54 = phi i8* [ %59, %56 ], [ %48, %46 ]
%55 = phi i32 [ %60, %56 ], [ 0, %46 ]
br label %63
56: ; preds = %46, %56
%57 = phi i32 [ %60, %56 ], [ 0, %46 ]
%58 = phi i8* [ %59, %56 ], [ %48, %46 ]
%59 = getelementptr inbounds i8, i8* %58, i64 1
%60 = add nuw nsw i32 %57, 1
%61 = load i8, i8* %59
%62 = icmp eq i8 %61, 63
br i1 %62, label %56, label %52
63: ; preds = %63, %52
%64 = phi i8* [ %69, %63 ], [ %32, %52 ]
%65 = load i8, i8* %64
%66 = icmp eq i8 %65, 0
%67 = icmp eq i8 %65, %53
%68 = select i1 %66, i1 true, i1 %67
%69 = getelementptr inbounds i8, i8* %64, i64 1
br i1 %68, label %70, label %63
70: ; preds = %63
%71 = icmp eq i8 %53, 0
%72 = ptrtoint i8* %64 to i64
%73 = ptrtoint i8* %32 to i64
%74 = sub i64 %72, %73
%75 = zext i32 %55 to i64
%76 = icmp slt i64 %74, %75
%77 = select i1 %71, i1 %76, i1 false
br i1 %77, label %159, label %78
78: ; preds = %70
%79 = icmp ne i8 %65, 0
%80 = ptrtoint i8* %64 to i64
%81 = sub i64 %80, %73
%82 = icmp slt i64 %81, %75
%83 = select i1 %79, i1 %82, i1 false
br i1 %83, label %84, label %93
84: ; preds = %78, %84
%85 = phi i8* [ %86, %84 ], [ %64, %78 ]
%86 = getelementptr inbounds i8, i8* %85, i64 1
%87 = load i8, i8* %86
%88 = icmp ne i8 %87, 0
%89 = ptrtoint i8* %86 to i64
%90 = sub i64 %89, %73
%91 = icmp slt i64 %90, %75
%92 = select i1 %88, i1 %91, i1 false
br i1 %92, label %84, label %93
93: ; preds = %84, %78
%94 = phi i8* [ %64, %78 ], [ %86, %84 ]
br i1 %66, label %41, label %127
95: ; preds = %103, %127
%96 = phi i8* [ %129, %127 ], [ %104, %103 ]
%97 = phi i8 [ %128, %127 ], [ %105, %103 ]
%98 = icmp eq i8 %97, %53
br i1 %98, label %110, label %99
99: ; preds = %95
%100 = getelementptr inbounds i8, i8* %96, i64 1
%101 = load i8, i8* %100
%102 = icmp eq i8 %101, 0
br i1 %102, label %106, label %103
103: ; preds = %99, %114
%104 = phi i8* [ %100, %99 ], [ %117, %114 ]
%105 = phi i8 [ %101, %99 ], [ %118, %114 ]
br label %95
106: ; preds = %99
%107 = ptrtoint i8* %100 to i64
%108 = sub i64 %107, %130
%109 = icmp slt i64 %108, %75
br i1 %109, label %114, label %41
110: ; preds = %95
%111 = ptrtoint i8* %96 to i64
%112 = sub i64 %111, %130
%113 = icmp slt i64 %112, %75
br i1 %113, label %114, label %120
114: ; preds = %110, %106
%115 = phi i8* [ %96, %110 ], [ %100, %106 ]
%116 = zext i1 %98 to i64
%117 = getelementptr i8, i8* %115, i64 %116
%118 = load i8, i8* %117
%119 = icmp eq i8 %118, 0
br i1 %119, label %41, label %103
120: ; preds = %110
%121 = tail call i32 @glob_match(i8* %54, i8* %96)
%122 = icmp eq i32 %121, 0
br i1 %122, label %123, label %159
123: ; preds = %120
%124 = getelementptr inbounds i8, i8* %96, i64 1
%125 = load i8, i8* %124
%126 = icmp eq i8 %125, 0
br i1 %126, label %41, label %127
127: ; preds = %93, %123
%128 = phi i8 [ %125, %123 ], [ %65, %93 ]
%129 = phi i8* [ %124, %123 ], [ %64, %93 ]
%130 = ptrtoint i8* %129 to i64
br label %95
131: ; preds = %46, %131
%132 = phi i8* [ %135, %131 ], [ %32, %46 ]
%133 = load i8, i8* %132
%134 = icmp eq i8 %133, 0
%135 = getelementptr inbounds i8, i8* %132, i64 1
br i1 %134, label %154, label %131
136: ; preds = %139
%137 = load i8, i8* %143
%138 = icmp eq i8 %137, 0
br i1 %138, label %41, label %139
139: ; preds = %38, %136
%140 = phi i8* [ %142, %136 ], [ %31, %38 ]
%141 = phi i8* [ %143, %136 ], [ %32, %38 ]
%142 = getelementptr inbounds i8, i8* %140, i64 1
%143 = getelementptr inbounds i8, i8* %141, i64 1
%144 = load i8, i8* %142
%145 = icmp eq i8 %144, 63
br i1 %145, label %136, label %41
146: ; preds = %35, %146
%147 = phi i8* [ %148, %146 ], [ %31, %35 ]
%148 = getelementptr inbounds i8, i8* %147, i64 1
%149 = load i8, i8* %148
%150 = icmp eq i8 %149, 42
br i1 %150, label %146, label %151
151: ; preds = %37, %146, %35
%152 = phi i8 [ %29, %35 ], [ %149, %146 ], [ %29, %37 ]
%153 = icmp eq i8 %152, 0
br i1 %153, label %154, label %159
154: ; preds = %131, %151
%155 = phi i8* [ %32, %151 ], [ %132, %131 ]
%156 = load i8, i8* %155
%157 = icmp eq i8 %156, 0
%158 = zext i1 %157 to i32
br label %159
159: ; preds = %70, %120, %151, %154
%160 = phi i32 [ 0, %151 ], [ %158, %154 ], [ 1, %120 ], [ 0, %70 ]
ret i32 %160
}