unsigned long str$match_wild(const struct dsc$descriptor_s *candidate_string,
                             const struct dsc$descriptor_s *pattern_string) {
  int s1_pos, s2_pos;
  char *s1_ptr, *s2_ptr, *s1_copy, *s2_copy;
  unsigned short s1_len, s2_len;
  unsigned long result;
  result = 0;
  str$analyze_sdesc(candidate_string, &s1_len, &s1_ptr);
  str$analyze_sdesc(pattern_string, &s2_len, &s2_ptr);
  s1_copy = calloc(s1_len, 1);
  s2_copy = calloc(s2_len, 1);
  strcpy(s1_copy, s1_ptr);
  strcpy(s2_copy, s2_ptr);
  s1_pos = 0;
  s2_pos = 0;
  result = 2393113;
  for (s1_pos = 0; s1_pos < s1_len; s1_pos++) {
    if (s1_copy[s1_pos] == s2_copy[s2_pos]) {
      result = 2393113;
      s2_pos++;
    } else if (s2_copy[s2_pos] == '%') {
      result = 2393113;
      s2_pos++;
    } else if (s2_copy[s2_pos] == '*') {
      if (s2_pos + 1 >= s2_len) {
        s1_pos = s1_len;
        s2_pos++;
        result = 2393113;
      } else {
        if (s1_copy[s1_pos] == s2_copy[s2_pos + 1]) {
          s2_pos += 2;
        }
      }
    } else {
      result = 2392584;
      s1_pos = s1_len;
    }
  }
  if ((s2_copy[s2_pos] == '*') && (s2_pos + 1 == s2_len))
    s2_pos++;
  if (s2_pos != s2_len) {
    result = 2392584;
  }
  free(s1_copy);
  free(s2_copy);
  return result;
}


x86 assembly (clang, -O0):
<str$match_wild>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x8(%rbp),%rdi
lea    -0x3a(%rbp),%rsi
lea    -0x20(%rbp),%rdx
mov    $0x0,%al
call   1050 <str$analyze_sdesc@plt>
mov    -0x10(%rbp),%rdi
lea    -0x3c(%rbp),%rsi
lea    -0x28(%rbp),%rdx
mov    $0x0,%al
call   1050 <str$analyze_sdesc@plt>
movzwl -0x3a(%rbp),%eax
mov    %eax,%edi
mov    $0x1,%esi
call   1060 <calloc@plt>
mov    %rax,-0x30(%rbp)
movzwl -0x3c(%rbp),%eax
mov    %eax,%edi
mov    $0x1,%esi
call   1060 <calloc@plt>
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1040 <strcpy@plt>
mov    -0x38(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1040 <strcpy@plt>
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movq   $0x248419,-0x48(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
movzwl -0x3a(%rbp),%ecx
cmp    %ecx,%eax
jge    12f5 <str$match_wild+0x1b5>
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x38(%rbp),%rcx
movslq -0x18(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    1222 <str$match_wild+0xe2>
movq   $0x248419,-0x48(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12e2 <str$match_wild+0x1a2>
mov    -0x38(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    124d <str$match_wild+0x10d>
movq   $0x248419,-0x48(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12dd <str$match_wild+0x19d>
mov    -0x38(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
jne    12c9 <str$match_wild+0x189>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
movzwl -0x3c(%rbp),%ecx
cmp    %ecx,%eax
jl     1291 <str$match_wild+0x151>
movzwl -0x3a(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
movq   $0x248419,-0x48(%rbp)
jmp    12c4 <str$match_wild+0x184>
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x38(%rbp),%rcx
mov    -0x18(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    12bf <str$match_wild+0x17f>
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
jmp    12c4 <str$match_wild+0x184>
jmp    12d8 <str$match_wild+0x198>
movq   $0x248208,-0x48(%rbp)
movzwl -0x3a(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    12dd <str$match_wild+0x19d>
jmp    12e2 <str$match_wild+0x1a2>
jmp    12e7 <str$match_wild+0x1a7>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11dd <str$match_wild+0x9d>
mov    -0x38(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2a,%eax
jne    1325 <str$match_wild+0x1e5>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
movzwl -0x3c(%rbp),%ecx
cmp    %ecx,%eax
jne    1325 <str$match_wild+0x1e5>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
movzwl -0x3c(%rbp),%ecx
cmp    %ecx,%eax
je     133c <str$match_wild+0x1fc>
movq   $0x248208,-0x48(%rbp)
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x48(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<str$match_wild>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%r14
xor    %ebp,%ebp
lea    0x6(%rsp),%rsi
lea    0x10(%rsp),%rdx
xor    %eax,%eax
call   1050 <str$analyze_sdesc@plt>
lea    0x4(%rsp),%rsi
lea    0x8(%rsp),%rdx
mov    %r14,%rdi
xor    %eax,%eax
call   1050 <str$analyze_sdesc@plt>
movzwl 0x6(%rsp),%r13d
mov    $0x1,%esi
mov    %r13,%rdi
call   1060 <calloc@plt>
mov    %rax,%r14
movzwl 0x4(%rsp),%r15d
mov    $0x1,%esi
mov    %r15,%rdi
call   1060 <calloc@plt>
mov    %rax,%r12
mov    0x10(%rsp),%rsi
mov    %r14,%rdi
call   1040 <strcpy@plt>
mov    0x8(%rsp),%rsi
mov    %r12,%rdi
call   1040 <strcpy@plt>
test   %r13d,%r13d
je     123b <str$match_wild+0xfb>
xor    %eax,%eax
mov    $0x248419,%esi
xor    %edx,%edx
jmp    11ec <str$match_wild+0xac>
xchg   %ax,%ax
add    $0x1,%edx
mov    $0x248419,%r8d
mov    %edx,%ebp
mov    %eax,%edi
add    $0x1,%edi
mov    %r8,%rsi
mov    %edi,%eax
mov    %ebp,%edx
cmp    %r13d,%edi
jge    1241 <str$match_wild+0x101>
movslq %eax,%rcx
movzbl (%r14,%rcx,1),%ecx
movslq %edx,%rbp
movzbl (%r12,%rbp,1),%ebx
cmp    %bl,%cl
je     11d0 <str$match_wild+0x90>
cmp    $0x2a,%bl
je     1217 <str$match_wild+0xd7>
mov    $0x248208,%r8d
cmp    $0x25,%bl
je     11d0 <str$match_wild+0x90>
mov    %edx,%ebp
mov    %r13d,%edi
jmp    11dd <str$match_wild+0x9d>
add    $0x1,%rbp
mov    $0x248419,%r8d
mov    %r13d,%edi
cmp    %r15d,%ebp
jge    11dd <str$match_wild+0x9d>
cmp    (%r12,%rbp,1),%cl
jne    1232 <str$match_wild+0xf2>
add    $0x2,%edx
mov    %edx,%ebp
mov    %eax,%edi
mov    %rsi,%r8
jmp    11dd <str$match_wild+0x9d>
mov    $0x248419,%r8d
movslq %ebp,%rax
lea    0x1(%rax),%ecx
cmp    %r15d,%ecx
cmovne %eax,%ecx
cmpb   $0x2a,(%r12,%rax,1)
cmovne %eax,%ecx
cmp    %r15d,%ecx
mov    $0x248208,%ebx
cmove  %r8,%rbx
mov    %r14,%rdi
call   1030 <free@plt>
mov    %r12,%rdi
call   1030 <free@plt>
mov    %rbx,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
%"struct.dsc$descriptor_s" = type opaque
define i64 @"str$match_wild"(%"struct.dsc$descriptor_s"* %0, %"struct.dsc$descriptor_s"* %1) {
%3 = alloca %"struct.dsc$descriptor_s"*
%4 = alloca %"struct.dsc$descriptor_s"*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i16
%12 = alloca i16
%13 = alloca i64
store %"struct.dsc$descriptor_s"* %0, %"struct.dsc$descriptor_s"** %3
store %"struct.dsc$descriptor_s"* %1, %"struct.dsc$descriptor_s"** %4
store i64 0, i64* %13
%14 = load %"struct.dsc$descriptor_s"*, %"struct.dsc$descriptor_s"** %3
%15 = call i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...) bitcast (i32 (...)* @"str$analyze_sdesc" to i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...)*)(%"struct.dsc$descriptor_s"* %14, i16* %11, i8** %7)
%16 = load %"struct.dsc$descriptor_s"*, %"struct.dsc$descriptor_s"** %4
%17 = call i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...) bitcast (i32 (...)* @"str$analyze_sdesc" to i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...)*)(%"struct.dsc$descriptor_s"* %16, i16* %12, i8** %8)
%18 = load i16, i16* %11
%19 = zext i16 %18 to i64
%20 = call i8* @calloc(i64 %19, i64 1)
store i8* %20, i8** %9
%21 = load i16, i16* %12
%22 = zext i16 %21 to i64
%23 = call i8* @calloc(i64 %22, i64 1)
store i8* %23, i8** %10
%24 = load i8*, i8** %9
%25 = load i8*, i8** %7
%26 = call i8* @strcpy(i8* %24, i8* %25)
%27 = load i8*, i8** %10
%28 = load i8*, i8** %8
%29 = call i8* @strcpy(i8* %27, i8* %28)
store i32 0, i32* %5
store i32 0, i32* %6
store i64 2393113, i64* %13
store i32 0, i32* %5
br label %30
30: ; preds = %108, %2
%31 = load i32, i32* %5
%32 = load i16, i16* %11
%33 = zext i16 %32 to i32
%34 = icmp slt i32 %31, %33
br i1 %34, label %35, label %111
35: ; preds = %30
%36 = load i8*, i8** %9
%37 = load i32, i32* %5
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i8, i8* %36, i64 %38
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = load i8*, i8** %10
%43 = load i32, i32* %6
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %41, %47
br i1 %48, label %49, label %52
49: ; preds = %35
store i64 2393113, i64* %13
%50 = load i32, i32* %6
%51 = add nsw i32 %50, 1
store i32 %51, i32* %6
br label %107
52: ; preds = %35
%53 = load i8*, i8** %10
%54 = load i32, i32* %6
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %53, i64 %55
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 37
br i1 %59, label %60, label %63
60: ; preds = %52
store i64 2393113, i64* %13
%61 = load i32, i32* %6
%62 = add nsw i32 %61, 1
store i32 %62, i32* %6
br label %106
63: ; preds = %52
%64 = load i8*, i8** %10
%65 = load i32, i32* %6
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds i8, i8* %64, i64 %66
%68 = load i8, i8* %67
%69 = sext i8 %68 to i32
%70 = icmp eq i32 %69, 42
br i1 %70, label %71, label %102
71: ; preds = %63
%72 = load i32, i32* %6
%73 = add nsw i32 %72, 1
%74 = load i16, i16* %12
%75 = zext i16 %74 to i32
%76 = icmp sge i32 %73, %75
br i1 %76, label %77, label %82
77: ; preds = %71
%78 = load i16, i16* %11
%79 = zext i16 %78 to i32
store i32 %79, i32* %5
%80 = load i32, i32* %6
%81 = add nsw i32 %80, 1
store i32 %81, i32* %6
store i64 2393113, i64* %13
br label %101
82: ; preds = %71
%83 = load i8*, i8** %9
%84 = load i32, i32* %5
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %83, i64 %85
%87 = load i8, i8* %86
%88 = sext i8 %87 to i32
%89 = load i8*, i8** %10
%90 = load i32, i32* %6
%91 = add nsw i32 %90, 1
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i8, i8* %89, i64 %92
%94 = load i8, i8* %93
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %88, %95
br i1 %96, label %97, label %100
97: ; preds = %82
%98 = load i32, i32* %6
%99 = add nsw i32 %98, 2
store i32 %99, i32* %6
br label %100
100: ; preds = %97, %82
br label %101
101: ; preds = %100, %77
br label %105
102: ; preds = %63
store i64 2392584, i64* %13
%103 = load i16, i16* %11
%104 = zext i16 %103 to i32
store i32 %104, i32* %5
br label %105
105: ; preds = %102, %101
br label %106
106: ; preds = %105, %60
br label %107
107: ; preds = %106, %49
br label %108
108: ; preds = %107
%109 = load i32, i32* %5
%110 = add nsw i32 %109, 1
store i32 %110, i32* %5
br label %30
111: ; preds = %30
%112 = load i8*, i8** %10
%113 = load i32, i32* %6
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i8, i8* %112, i64 %114
%116 = load i8, i8* %115
%117 = sext i8 %116 to i32
%118 = icmp eq i32 %117, 42
br i1 %118, label %119, label %128
119: ; preds = %111
%120 = load i32, i32* %6
%121 = add nsw i32 %120, 1
%122 = load i16, i16* %12
%123 = zext i16 %122 to i32
%124 = icmp eq i32 %121, %123
br i1 %124, label %125, label %128
125: ; preds = %119
%126 = load i32, i32* %6
%127 = add nsw i32 %126, 1
store i32 %127, i32* %6
br label %128
128: ; preds = %125, %119, %111
%129 = load i32, i32* %6
%130 = load i16, i16* %12
%131 = zext i16 %130 to i32
%132 = icmp ne i32 %129, %131
br i1 %132, label %133, label %134
133: ; preds = %128
store i64 2392584, i64* %13
br label %134
134: ; preds = %133, %128
%135 = load i8*, i8** %9
%136 = load i8*, i8** %10
%137 = load i64, i64* %13
ret i64 %137
}

LLVM IR (-O2):
%"struct.dsc$descriptor_s" = type opaque
define i64 @"str$match_wild"(%"struct.dsc$descriptor_s"* %0, %"struct.dsc$descriptor_s"* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i16
%6 = alloca i16
%7 = bitcast i8** %3 to i8*
%8 = bitcast i8** %4 to i8*
%9 = bitcast i16* %5 to i8*
%10 = bitcast i16* %6 to i8*
%11 = call i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...) bitcast (i32 (...)* @"str$analyze_sdesc" to i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...)*)(%"struct.dsc$descriptor_s"* %0, i16* %5, i8** %3)
%12 = call i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...) bitcast (i32 (...)* @"str$analyze_sdesc" to i32 (%"struct.dsc$descriptor_s"*, i16*, i8**, ...)*)(%"struct.dsc$descriptor_s"* %1, i16* %6, i8** %4)
%13 = load i16, i16* %5
%14 = zext i16 %13 to i64
%15 = call i8* @calloc(i64 %14, i64 1)
%16 = load i16, i16* %6
%17 = zext i16 %16 to i64
%18 = call i8* @calloc(i64 %17, i64 1)
%19 = load i8*, i8** %3
%20 = call i8* @strcpy(i8* dereferenceable(1) %15, i8* dereferenceable(1) %19)
%21 = load i8*, i8** %4
%22 = call i8* @strcpy(i8* dereferenceable(1) %18, i8* dereferenceable(1) %21)
%23 = zext i16 %13 to i32
%24 = icmp eq i16 %13, 0
%25 = zext i16 %16 to i32
br i1 %24, label %58, label %26
26: ; preds = %2, %52
%27 = phi i64 [ %55, %52 ], [ 2393113, %2 ]
%28 = phi i32 [ %56, %52 ], [ 0, %2 ]
%29 = phi i32 [ %53, %52 ], [ 0, %2 ]
%30 = sext i32 %28 to i64
%31 = getelementptr inbounds i8, i8* %15, i64 %30
%32 = load i8, i8* %31
%33 = sext i32 %29 to i64
%34 = getelementptr inbounds i8, i8* %18, i64 %33
%35 = load i8, i8* %34
%36 = icmp eq i8 %32, %35
br i1 %36, label %37, label %39
37: ; preds = %26
%38 = add nsw i32 %29, 1
br label %52
39: ; preds = %26
switch i8 %35, label %52 [
i8 37, label %40
i8 42, label %42
]
40: ; preds = %39
%41 = add nsw i32 %29, 1
br label %52
42: ; preds = %39
%43 = add nsw i32 %29, 1
%44 = icmp slt i32 %43, %25
br i1 %44, label %45, label %52
45: ; preds = %42
%46 = sext i32 %43 to i64
%47 = getelementptr inbounds i8, i8* %18, i64 %46
%48 = load i8, i8* %47
%49 = icmp eq i8 %32, %48
%50 = add nsw i32 %29, 2
%51 = select i1 %49, i32 %50, i32 %29
br label %52
52: ; preds = %45, %39, %42, %37, %40
%53 = phi i32 [ %38, %37 ], [ %41, %40 ], [ %43, %42 ], [ %51, %45 ], [ %29, %39 ]
%54 = phi i32 [ %28, %37 ], [ %28, %40 ], [ %23, %42 ], [ %28, %45 ], [ %23, %39 ]
%55 = phi i64 [ 2393113, %37 ], [ 2393113, %40 ], [ 2393113, %42 ], [ %27, %45 ], [ 2392584, %39 ]
%56 = add nsw i32 %54, 1
%57 = icmp slt i32 %56, %23
br i1 %57, label %26, label %58
58: ; preds = %52, %2
%59 = phi i32 [ 0, %2 ], [ %53, %52 ]
%60 = phi i64 [ 2393113, %2 ], [ %55, %52 ]
%61 = sext i32 %59 to i64
%62 = getelementptr inbounds i8, i8* %18, i64 %61
%63 = load i8, i8* %62
%64 = icmp eq i8 %63, 42
%65 = add nsw i32 %59, 1
%66 = icmp eq i32 %65, %25
%67 = select i1 %64, i1 %66, i1 false
%68 = select i1 %67, i32 %65, i32 %59
%69 = icmp eq i32 %68, %25
%70 = select i1 %69, i64 %60, i64 2392584
ret i64 %70
}