#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 */
scalar_t__ isalnum(char const);
scalar_t__ string_prefix(char const *, char const *);
const char *string_match(const char *src, const char *sub) {
  if (*sub != '\0') {
    while (*src) {
      if (string_prefix(src, sub))
        return src;
      while (*src && isalnum(*src))
        src++;
      while (*src && !isalnum(*src))
        src++;
    }
  }
  return NULL;
}


x86 assembly (clang, -O0):
<string_match>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1224 <string_match+0x104>
jmp    1145 <string_match+0x25>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     121f <string_match+0xff>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <string_prefix@plt>
cmp    $0x0,%rax
je     1176 <string_match+0x56>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    122c <string_match+0x10c>
jmp    117b <string_match+0x5b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x19(%rbp)
je     11a6 <string_match+0x86>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1040 <isalnum@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    11b6 <string_match+0x96>
jmp    11c7 <string_match+0xa7>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    117b <string_match+0x5b>
jmp    11cc <string_match+0xac>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1a(%rbp)
je     11f9 <string_match+0xd9>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1040 <isalnum@plt>
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
test   $0x1,%al
jne    1209 <string_match+0xe9>
jmp    121a <string_match+0xfa>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11cc <string_match+0xac>
jmp    1145 <string_match+0x25>
jmp    1224 <string_match+0x104>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_match>:
push   %r15
push   %r14
push   %rbx
cmpb   $0x0,(%rsi)
je     11a2 <string_match+0x82>
mov    %rdi,%rbx
cmpb   $0x0,(%rdi)
je     11a2 <string_match+0x82>
mov    %rsi,%r15
xor    %r14d,%r14d
mov    %rbx,%rdi
mov    %r15,%rsi
call   1030 <string_prefix@plt>
test   %rax,%rax
jne    11ae <string_match+0x8e>
mov    (%rbx),%al
test   %al,%al
je     11a5 <string_match+0x85>
xchg   %ax,%ax
movsbl %al,%edi
call   1040 <isalnum@plt>
test   %rax,%rax
je     1170 <string_match+0x50>
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jne    1150 <string_match+0x30>
jmp    11a5 <string_match+0x85>
nopl   0x0(%rax,%rax,1)
mov    (%rbx),%al
test   %al,%al
je     11a5 <string_match+0x85>
cs nopw 0x0(%rax,%rax,1)
movsbl %al,%edi
call   1040 <isalnum@plt>
test   %rax,%rax
jne    119b <string_match+0x7b>
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jne    1180 <string_match+0x60>
jmp    11a5 <string_match+0x85>
cmpb   $0x0,(%rbx)
jne    1138 <string_match+0x18>
jmp    11a5 <string_match+0x85>
xor    %r14d,%r14d
mov    %r14,%rax
pop    %rbx
pop    %r14
pop    %r15
ret
mov    %rbx,%r14
jmp    11a5 <string_match+0x85>

LLVM IR (-O0):
define i8* @string_match(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
store i8* %0, i8** %4
store i8* %1, i8** %5
%6 = load i8*, i8** %5
%7 = load i8, i8* %6
%8 = sext i8 %7 to i32
%9 = icmp ne i32 %8, 0
br i1 %9, label %10, label %57
10: ; preds = %2
br label %11
11: ; preds = %55, %10
%12 = load i8*, i8** %4
%13 = load i8, i8* %12
%14 = icmp ne i8 %13, 0
br i1 %14, label %15, label %56
15: ; preds = %11
%16 = load i8*, i8** %4
%17 = load i8*, i8** %5
%18 = call i64 @string_prefix(i8* %16, i8* %17)
%19 = icmp ne i64 %18, 0
br i1 %19, label %20, label %22
20: ; preds = %15
%21 = load i8*, i8** %4
store i8* %21, i8** %3
br label %58
22: ; preds = %15
br label %23
23: ; preds = %35, %22
%24 = load i8*, i8** %4
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = icmp ne i32 %26, 0
br i1 %27, label %28, label %33
28: ; preds = %23
%29 = load i8*, i8** %4
%30 = load i8, i8* %29
%31 = call i64 @isalnum(i8 signext %30)
%32 = icmp ne i64 %31, 0
br label %33
33: ; preds = %28, %23
%34 = phi i1 [ false, %23 ], [ %32, %28 ]
br i1 %34, label %35, label %38
35: ; preds = %33
%36 = load i8*, i8** %4
%37 = getelementptr inbounds i8, i8* %36, i32 1
store i8* %37, i8** %4
br label %23
38: ; preds = %33
br label %39
39: ; preds = %52, %38
%40 = load i8*, i8** %4
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp ne i32 %42, 0
br i1 %43, label %44, label %50
44: ; preds = %39
%45 = load i8*, i8** %4
%46 = load i8, i8* %45
%47 = call i64 @isalnum(i8 signext %46)
%48 = icmp ne i64 %47, 0
%49 = xor i1 %48, true
br label %50
50: ; preds = %44, %39
%51 = phi i1 [ false, %39 ], [ %49, %44 ]
br i1 %51, label %52, label %55
52: ; preds = %50
%53 = load i8*, i8** %4
%54 = getelementptr inbounds i8, i8* %53, i32 1
store i8* %54, i8** %4
br label %39
55: ; preds = %50
br label %11
56: ; preds = %11
br label %57
57: ; preds = %56, %2
store i8* null, i8** %3
br label %58
58: ; preds = %57, %20
%59 = load i8*, i8** %3
ret i8* %59
}

LLVM IR (-O2):
define i8* @string_match(i8* %0, i8* %1) {
%3 = load i8, i8* %1
%4 = icmp eq i8 %3, 0
br i1 %4, label %39, label %5
5: ; preds = %2
%6 = load i8, i8* %0
%7 = icmp eq i8 %6, 0
br i1 %7, label %39, label %8
8: ; preds = %5, %36
%9 = phi i8* [ %29, %36 ], [ %0, %5 ]
%10 = tail call i64 @string_prefix(i8* %9, i8* %1)
%11 = icmp eq i64 %10, 0
br i1 %11, label %12, label %39
12: ; preds = %8
%13 = load i8, i8* %9
%14 = icmp eq i8 %13, 0
br i1 %14, label %39, label %15
15: ; preds = %12, %20
%16 = phi i8 [ %22, %20 ], [ %13, %12 ]
%17 = phi i8* [ %21, %20 ], [ %9, %12 ]
%18 = tail call i64 @isalnum(i8 signext %16)
%19 = icmp eq i64 %18, 0
br i1 %19, label %24, label %20
20: ; preds = %15
%21 = getelementptr inbounds i8, i8* %17, i64 1
%22 = load i8, i8* %21
%23 = icmp eq i8 %22, 0
br i1 %23, label %39, label %15
24: ; preds = %15
%25 = load i8, i8* %17
%26 = icmp eq i8 %25, 0
br i1 %26, label %39, label %27
27: ; preds = %24, %32
%28 = phi i8 [ %34, %32 ], [ %25, %24 ]
%29 = phi i8* [ %33, %32 ], [ %17, %24 ]
%30 = tail call i64 @isalnum(i8 signext %28)
%31 = icmp eq i64 %30, 0
br i1 %31, label %32, label %36
32: ; preds = %27
%33 = getelementptr inbounds i8, i8* %29, i64 1
%34 = load i8, i8* %33
%35 = icmp eq i8 %34, 0
br i1 %35, label %39, label %27
36: ; preds = %27
%37 = load i8, i8* %29
%38 = icmp eq i8 %37, 0
br i1 %38, label %39, label %8
39: ; preds = %12, %24, %8, %36, %20, %32, %5, %2
%40 = phi i8* [ null, %2 ], [ null, %5 ], [ null, %32 ], [ null, %20 ], [ null, %12 ], [ null, %24 ], [ %9, %8 ], [ null, %36 ]
ret i8* %40
}