#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 strlen(char *);
int isMatch(char *s, char *p) {
  int i;
  int slen, plen;
  if (!s) {
    if (!p || !p[0])
      return (1);
  }
  if (!p || !p[0]) {
    if (!s || !s[0])
      return (1);
    else
      return (0);
  }
  slen = strlen(s);
  plen = strlen(p);
  for (i = slen - 1; i >= 0; i--) {
    if (p[i] != '?' && p[i] != '*' && p[i] != s[i])
      return (0);
  }
  switch (*p) {
  case '?':
    if (!s || !s[0])
      return (0);
    else
      return (isMatch(s + 1, p + 1));
    break;
  case '*':
    if (!s)
      return (isMatch(s, p + 1));
    for (i = 0; s[i]; i++) {
      if (isMatch(s + i, p + 1))
        return (1);
    }
    return (isMatch(s + i, p + 1));
    break;
  default:
    if (!s)
      return (0);
    if (s[0] != p[0])
      return (0);
    return (isMatch(s + 1, p + 1));
  }
  return (0);
}


x86 assembly (clang, -O0):
<isMatch>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1164 <isMatch+0x44>
cmpq   $0x0,-0x18(%rbp)
je     1153 <isMatch+0x33>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    115f <isMatch+0x3f>
movl   $0x1,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
jmp    1164 <isMatch+0x44>
cmpq   $0x0,-0x18(%rbp)
je     117c <isMatch+0x5c>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    11ac <isMatch+0x8c>
cmpq   $0x0,-0x10(%rbp)
je     1194 <isMatch+0x74>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    11a0 <isMatch+0x80>
movl   $0x1,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
movl   $0x0,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jl     1240 <isMatch+0x120>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3f,%eax
je     122d <isMatch+0x10d>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
je     122d <isMatch+0x10d>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
je     122d <isMatch+0x10d>
movl   $0x0,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
jmp    1232 <isMatch+0x112>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
jmp    11cd <isMatch+0xad>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x28(%rbp)
sub    $0x2a,%eax
je     12aa <isMatch+0x18a>
jmp    1258 <isMatch+0x138>
mov    -0x28(%rbp),%eax
sub    $0x3f,%eax
jne    1347 <isMatch+0x227>
jmp    1269 <isMatch+0x149>
cmpq   $0x0,-0x10(%rbp)
je     1281 <isMatch+0x161>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    128d <isMatch+0x16d>
movl   $0x0,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
mov    -0x10(%rbp),%rdi
add    $0x1,%rdi
mov    -0x18(%rbp),%rsi
add    $0x1,%rsi
call   1030 <isMatch@plt>
mov    %eax,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
cmpq   $0x0,-0x10(%rbp)
jne    12ce <isMatch+0x1ae>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
add    $0x1,%rsi
call   1030 <isMatch@plt>
mov    %eax,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     1327 <isMatch+0x207>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    -0x18(%rbp),%rsi
add    $0x1,%rsi
call   1030 <isMatch@plt>
cmp    $0x0,%eax
je     1314 <isMatch+0x1f4>
movl   $0x1,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
jmp    1319 <isMatch+0x1f9>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12d5 <isMatch+0x1b5>
mov    -0x10(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
mov    -0x18(%rbp),%rsi
add    $0x1,%rsi
call   1030 <isMatch@plt>
mov    %eax,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
cmpq   $0x0,-0x10(%rbp)
jne    135e <isMatch+0x23e>
movl   $0x0,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     1380 <isMatch+0x260>
movl   $0x0,-0x4(%rbp)
jmp    1398 <isMatch+0x278>
mov    -0x10(%rbp),%rdi
add    $0x1,%rdi
mov    -0x18(%rbp),%rsi
add    $0x1,%rsi
call   1030 <isMatch@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<isMatch>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
test   %rbx,%rbx
je     1150 <isMatch+0x30>
test   %r14,%r14
je     1246 <isMatch+0x126>
cmpb   $0x0,(%r14)
jne    1168 <isMatch+0x48>
jmp    1246 <isMatch+0x126>
cs nopw 0x0(%rax,%rax,1)
mov    $0x1,%eax
test   %r14,%r14
je     124e <isMatch+0x12e>
cmpb   $0x0,(%r14)
je     124e <isMatch+0x12e>
mov    %rbx,%rdi
call   1040 <strlen@plt>
mov    %eax,%ebp
mov    %r14,%rdi
call   1040 <strlen@plt>
test   %ebp,%ebp
jle    11c0 <isMatch+0xa0>
mov    %ebp,%eax
add    $0x1,%rax
jmp    119a <isMatch+0x7a>
cs nopw 0x0(%rax,%rax,1)
add    $0xffffffffffffffff,%rax
cmp    $0x1,%rax
jbe    11c0 <isMatch+0xa0>
lea    -0x2(%rax),%ecx
movzbl (%r14,%rcx,1),%edx
cmp    $0x2a,%dl
je     1190 <isMatch+0x70>
cmp    $0x3f,%dl
je     1190 <isMatch+0x70>
cmp    (%rbx,%rcx,1),%dl
je     1190 <isMatch+0x70>
jmp    123b <isMatch+0x11b>
cs nopw 0x0(%rax,%rax,1)
mov    (%r14),%cl
movsbl %cl,%eax
cmp    $0x2a,%eax
je     11e0 <isMatch+0xc0>
cmp    $0x3f,%eax
jne    1210 <isMatch+0xf0>
xor    %eax,%eax
test   %rbx,%rbx
je     124e <isMatch+0x12e>
cmpb   $0x0,(%rbx)
jne    121b <isMatch+0xfb>
jmp    124e <isMatch+0x12e>
xchg   %ax,%ax
test   %rbx,%rbx
je     1237 <isMatch+0x117>
cmpb   $0x0,(%rbx)
je     121f <isMatch+0xff>
lea    0x1(%r14),%r15
xchg   %ax,%ax
mov    %rbx,%rdi
mov    %r15,%rsi
call   1030 <isMatch@plt>
test   %eax,%eax
jne    123f <isMatch+0x11f>
lea    0x1(%rbx),%rax
cmpb   $0x0,0x1(%rbx)
mov    %rax,%rbx
jne    11f0 <isMatch+0xd0>
jmp    1222 <isMatch+0x102>
xchg   %ax,%ax
xor    %eax,%eax
test   %rbx,%rbx
je     124e <isMatch+0x12e>
cmp    %cl,(%rbx)
jne    124e <isMatch+0x12e>
add    $0x1,%rbx
mov    %rbx,%rax
add    $0x1,%r14
mov    %rax,%rbx
test   %rbx,%rbx
jne    1132 <isMatch+0x12>
jmp    1150 <isMatch+0x30>
xor    %eax,%eax
jmp    1222 <isMatch+0x102>
xor    %eax,%eax
jmp    124e <isMatch+0x12e>
mov    $0x1,%eax
jmp    124e <isMatch+0x12e>
xor    %eax,%eax
cmpb   $0x0,(%rbx)
sete   %al
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @isMatch(i8* %0, i8* %1) {
br label %3
3: ; preds = %47, %2
%4 = phi i8* [ %0, %2 ], [ %48, %47 ]
%5 = phi i8* [ %1, %2 ], [ %49, %47 ]
%6 = icmp eq i8* %4, null
%7 = icmp eq i8* %5, null
br i1 %6, label %8, label %12
8: ; preds = %3
br i1 %7, label %72, label %9
9: ; preds = %8
%10 = load i8, i8* %5
%11 = icmp eq i8 %10, 0
br i1 %11, label %72, label %20
12: ; preds = %3
br i1 %7, label %16, label %13
13: ; preds = %12
%14 = load i8, i8* %5
%15 = icmp eq i8 %14, 0
br i1 %15, label %16, label %20
16: ; preds = %12, %13
%17 = load i8, i8* %4
%18 = icmp eq i8 %17, 0
%19 = zext i1 %18 to i32
br label %72
20: ; preds = %9, %13
%21 = tail call i32 @strlen(i8* %4)
%22 = tail call i32 @strlen(i8* %5)
%23 = icmp sgt i32 %21, 0
br i1 %23, label %24, label %38
24: ; preds = %20
%25 = zext i32 %21 to i64
br label %26
26: ; preds = %24, %36
%27 = phi i64 [ %25, %24 ], [ %28, %36 ]
%28 = add nsw i64 %27, -1
%29 = and i64 %28, 4294967295
%30 = getelementptr inbounds i8, i8* %5, i64 %29
%31 = load i8, i8* %30
switch i8 %31, label %32 [
i8 63, label %36
i8 42, label %36
]
32: ; preds = %26
%33 = getelementptr inbounds i8, i8* %4, i64 %29
%34 = load i8, i8* %33
%35 = icmp eq i8 %31, %34
br i1 %35, label %36, label %72
36: ; preds = %26, %26, %32
%37 = icmp ugt i64 %27, 1
br i1 %37, label %26, label %38
38: ; preds = %36, %20
%39 = load i8, i8* %5
%40 = sext i8 %39 to i32
switch i32 %40, label %66 [
i32 63, label %41
i32 42, label %50
]
41: ; preds = %38
br i1 %6, label %72, label %42
42: ; preds = %41
%43 = load i8, i8* %4
%44 = icmp eq i8 %43, 0
br i1 %44, label %72, label %45
45: ; preds = %42
%46 = getelementptr inbounds i8, i8* %4, i64 1
br label %47
47: ; preds = %56, %51, %50, %45, %70
%48 = phi i8* [ %46, %45 ], [ %71, %70 ], [ null, %50 ], [ %4, %51 ], [ %57, %56 ]
%49 = getelementptr inbounds i8, i8* %5, i64 1
br label %3
50: ; preds = %38
br i1 %6, label %47, label %51
51: ; preds = %50
%52 = load i8, i8* %4
%53 = icmp eq i8 %52, 0
br i1 %53, label %47, label %54
54: ; preds = %51
%55 = getelementptr inbounds i8, i8* %5, i64 1
br label %60
56: ; preds = %60
%57 = getelementptr inbounds i8, i8* %4, i64 %65
%58 = load i8, i8* %57
%59 = icmp eq i8 %58, 0
br i1 %59, label %47, label %60
60: ; preds = %54, %56
%61 = phi i64 [ 0, %54 ], [ %65, %56 ]
%62 = phi i8* [ %4, %54 ], [ %57, %56 ]
%63 = tail call i32 @isMatch(i8* %62, i8* %55)
%64 = icmp eq i32 %63, 0
%65 = add nuw i64 %61, 1
br i1 %64, label %56, label %72
66: ; preds = %38
br i1 %6, label %72, label %67
67: ; preds = %66
%68 = load i8, i8* %4
%69 = icmp eq i8 %68, %39
br i1 %69, label %70, label %72
70: ; preds = %67
%71 = getelementptr inbounds i8, i8* %4, i64 1
br label %47
72: ; preds = %67, %66, %41, %42, %8, %9, %32, %60, %16
%73 = phi i32 [ %19, %16 ], [ 1, %60 ], [ 0, %32 ], [ 0, %67 ], [ 0, %66 ], [ 0, %41 ], [ 0, %42 ], [ 1, %8 ], [ 1, %9 ]
ret i32 %73
}