#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 */
char *strchr(char const *, char);
int _utils_searchexp(const char *haystack, const char *needleslist,
                     int ignore_case, const char **rest) {
  int ret = -4;
  if (needleslist == NULL || needleslist[0] == '\0')
    return ret;
  if (haystack != NULL) {
    int i = -1;
    const char *needle = needleslist;
    while (needle != NULL) {
      i = 0;
      ret = -2;
      const char *wildcard = &(haystack[i]);
      if (*needle == '^') {
        wildcard = NULL;
        needle++;
      }
      const char *needle_entry = needle;
      do {
        ;
        char hay = haystack[i];
        if (*needle == '*') {
          wildcard = &(haystack[i]);
          needle++;
        }
        if (ignore_case && hay > 0x40 && hay < 0x5b)
          hay += 0x20;
        if (wildcard == NULL) {
          char lneedle = *needle;
          if (ignore_case && lneedle > 0x40 && lneedle < 0x5b)
            lneedle += 0x20;
          if (lneedle != hay) {
            ;
            needle = needle_entry;
            ret = -4;
            break;
          } else if (lneedle == hay) {
            ret = 0;
          }
          needle++;
        } else {
          char lneedle = *needle;
          if (ignore_case && lneedle > 0x40 && lneedle < 0x5b)
            lneedle += 0x20;
          needle_entry = needle;
          ret = 0;
          if (hay != '\0' && lneedle == hay) {
            wildcard = NULL;
            needle++;
          }
        }
        i++;
        if (*needle == ',' || *needle == '\0' || *needle == '$') {
          ;
          break;
        }
      } while (haystack[i] != '\0');
      if (*needle == '*')
        needle++;
      if (*needle == '$') {
        if (haystack[i] != '\0')
          ret = -4;
        needle++;
      };
      if (ret == 0) {
        if (*needle == ',' || *needle == '\0' || *needle == '$') {
          if (wildcard && (*needle != '$') && (rest != NULL))
            *rest = wildcard;
          break;
        } else
          ret = -4;
      }
      needle = strchr(needle, ',');
      if (needle != NULL)
        needle++;
      wildcard = 0;
    }
  }
  return ret;
}


x86 assembly (clang, -O0):
<_utils_searchexp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0xfffffffc,-0x2c(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1149 <_utils_searchexp+0x39>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1154 <_utils_searchexp+0x44>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14a1 <_utils_searchexp+0x391>
cmpq   $0x0,-0x10(%rbp)
je     149b <_utils_searchexp+0x38b>
movl   $0xffffffff,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
je     1496 <_utils_searchexp+0x386>
movl   $0x0,-0x30(%rbp)
movl   $0xfffffffe,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5e,%eax
jne    11ba <_utils_searchexp+0xaa>
movq   $0x0,-0x40(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x49(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    11fb <_utils_searchexp+0xeb>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1229 <_utils_searchexp+0x119>
movsbl -0x49(%rbp),%eax
cmp    $0x40,%eax
jle    1229 <_utils_searchexp+0x119>
movsbl -0x49(%rbp),%eax
cmp    $0x5b,%eax
jge    1229 <_utils_searchexp+0x119>
movsbl -0x49(%rbp),%eax
add    $0x20,%eax
mov    %al,-0x49(%rbp)
cmpq   $0x0,-0x40(%rbp)
jne    12bc <_utils_searchexp+0x1ac>
mov    -0x38(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x4a(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     126b <_utils_searchexp+0x15b>
movsbl -0x4a(%rbp),%eax
cmp    $0x40,%eax
jle    126b <_utils_searchexp+0x15b>
movsbl -0x4a(%rbp),%eax
cmp    $0x5b,%eax
jge    126b <_utils_searchexp+0x15b>
movsbl -0x4a(%rbp),%eax
add    $0x20,%eax
mov    %al,-0x4a(%rbp)
movsbl -0x4a(%rbp),%eax
movsbl -0x49(%rbp),%ecx
cmp    %ecx,%eax
je     128f <_utils_searchexp+0x17f>
mov    -0x48(%rbp),%rax
mov    %rax,-0x38(%rbp)
movl   $0xfffffffc,-0x2c(%rbp)
jmp    1390 <_utils_searchexp+0x280>
movsbl -0x4a(%rbp),%eax
movsbl -0x49(%rbp),%ecx
cmp    %ecx,%eax
jne    12a6 <_utils_searchexp+0x196>
movl   $0x0,-0x2c(%rbp)
jmp    12ab <_utils_searchexp+0x19b>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1338 <_utils_searchexp+0x228>
mov    -0x38(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x4b(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     12f3 <_utils_searchexp+0x1e3>
movsbl -0x4b(%rbp),%eax
cmp    $0x40,%eax
jle    12f3 <_utils_searchexp+0x1e3>
movsbl -0x4b(%rbp),%eax
cmp    $0x5b,%eax
jge    12f3 <_utils_searchexp+0x1e3>
movsbl -0x4b(%rbp),%eax
add    $0x20,%eax
mov    %al,-0x4b(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x2c(%rbp)
movsbl -0x49(%rbp),%eax
cmp    $0x0,%eax
je     1333 <_utils_searchexp+0x223>
movsbl -0x4b(%rbp),%eax
movsbl -0x49(%rbp),%ecx
cmp    %ecx,%eax
jne    1333 <_utils_searchexp+0x223>
movq   $0x0,-0x40(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1338 <_utils_searchexp+0x228>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
je     1371 <_utils_searchexp+0x261>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1371 <_utils_searchexp+0x261>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x24,%eax
jne    1376 <_utils_searchexp+0x266>
jmp    1390 <_utils_searchexp+0x280>
jmp    137b <_utils_searchexp+0x26b>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    11c2 <_utils_searchexp+0xb2>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    13ac <_utils_searchexp+0x29c>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x24,%eax
jne    13e4 <_utils_searchexp+0x2d4>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     13d8 <_utils_searchexp+0x2c8>
movl   $0xfffffffc,-0x2c(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jne    1460 <_utils_searchexp+0x350>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
je     141e <_utils_searchexp+0x30e>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     141e <_utils_searchexp+0x30e>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x24,%eax
jne    1454 <_utils_searchexp+0x344>
cmpq   $0x0,-0x40(%rbp)
je     144f <_utils_searchexp+0x33f>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x24,%eax
je     144f <_utils_searchexp+0x33f>
cmpq   $0x0,-0x28(%rbp)
je     144f <_utils_searchexp+0x33f>
mov    -0x40(%rbp),%rcx
mov    -0x28(%rbp),%rax
mov    %rcx,(%rax)
jmp    1496 <_utils_searchexp+0x386>
movl   $0xfffffffc,-0x2c(%rbp)
jmp    1460 <_utils_searchexp+0x350>
mov    -0x38(%rbp),%rdi
mov    $0x2c,%esi
call   1030 <strchr@plt>
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
je     1489 <_utils_searchexp+0x379>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
jmp    116e <_utils_searchexp+0x5e>
jmp    149b <_utils_searchexp+0x38b>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_utils_searchexp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    $0xfffffffc,%r15d
test   %rsi,%rsi
je     12f8 <_utils_searchexp+0x1e8>
mov    %rdi,%r12
test   %rdi,%rdi
je     12f8 <_utils_searchexp+0x1e8>
mov    %rsi,%rax
mov    %rcx,0x10(%rsp)
mov    (%rsi),%cl
test   %cl,%cl
je     12f8 <_utils_searchexp+0x1e8>
mov    %edx,%r14d
mov    (%r12),%dl
mov    %dl,0xf(%rsp)
xor    %r13d,%r13d
movabs $0x101000000001,%r15
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %esi,%esi
cmp    $0x5e,%cl
mov    %r12,%r10
cmove  %r13,%r10
sete   %sil
lea    (%rax,%rsi,1),%rdx
mov    (%rax,%rsi,1),%r9b
mov    %r9d,%ebp
mov    0xf(%rsp),%al
mov    %eax,%edi
xor    %ecx,%ecx
mov    %rdx,%r8
jmp    11b3 <_utils_searchexp+0xa3>
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%r12,%r11,1),%edi
lea    0x1(%r11),%rcx
test   %dil,%dil
je     125a <_utils_searchexp+0x14a>
mov    %rcx,%r11
add    %r12,%rcx
xor    %esi,%esi
cmp    $0x2a,%bpl
cmovne %r10,%rcx
sete   %sil
lea    0x20(%rdi),%ebp
cmp    $0x5b,%dil
movzbl %dil,%eax
movzbl %bpl,%ebp
cmovge %eax,%ebp
cmp    $0x41,%al
cmovl  %eax,%ebp
movzbl (%rdx,%rsi,1),%edi
lea    0x20(%rdi),%ebx
cmp    $0x5b,%dil
movzbl %bl,%ebx
cmovge %edi,%ebx
cmp    $0x41,%dil
cmovl  %edi,%ebx
test   %r14d,%r14d
cmove  %eax,%ebp
lea    (%rdx,%rsi,1),%rsi
cmove  %edi,%ebx
test   %rcx,%rcx
je     1230 <_utils_searchexp+0x120>
test   %bpl,%bpl
setne  %al
cmp    %bpl,%bl
sete   %dl
and    %al,%dl
movzbl %dl,%eax
lea    (%rsi,%rax,1),%rdx
test   %al,%al
cmovne %r13,%rcx
mov    %edi,%r9d
mov    %rcx,%r10
mov    %rsi,%r8
jmp    1243 <_utils_searchexp+0x133>
xchg   %ax,%ax
xor    %r10d,%r10d
cmp    %bpl,%bl
jne    12d0 <_utils_searchexp+0x1c0>
add    $0x1,%rsi
mov    %rsi,%rdx
movzbl (%rdx),%ebp
cmp    $0x2c,%rbp
ja     11a0 <_utils_searchexp+0x90>
bt     %rbp,%r15
jae    11a0 <_utils_searchexp+0x90>
add    $0x1,%r11
xor    %ecx,%ecx
mov    $0x1,%sil
mov    %r15,%rbx
xor    %eax,%eax
cmp    $0x2a,%bpl
sete   %al
lea    (%rdx,%rax,1),%rdi
cmpb   $0x24,(%rdx,%rax,1)
jne    128d <_utils_searchexp+0x17d>
movslq %r11d,%rax
add    $0x1,%rdi
cmpb   $0x0,(%r12,%rax,1)
mov    $0xfffffffc,%r15d
jne    12b3 <_utils_searchexp+0x1a3>
test   %sil,%sil
je     12b0 <_utils_searchexp+0x1a0>
movzbl (%rdi),%eax
mov    $0xfffffffc,%r15d
cmp    $0x2c,%rax
ja     12b3 <_utils_searchexp+0x1a3>
bt     %rax,%rbx
jae    12b3 <_utils_searchexp+0x1a3>
jmp    12df <_utils_searchexp+0x1cf>
nopl   0x0(%rax)
mov    %ecx,%r15d
mov    $0x2c,%esi
call   1030 <strchr@plt>
test   %rax,%rax
je     12f8 <_utils_searchexp+0x1e8>
add    $0x1,%rax
mov    (%rax),%cl
mov    %rbx,%r15
jmp    1170 <_utils_searchexp+0x60>
mov    $0xfffffffc,%ecx
mov    %r9d,%ebp
mov    %r8,%rdx
xor    %esi,%esi
jmp    1263 <_utils_searchexp+0x153>
xor    %r15d,%r15d
test   %r10,%r10
je     12f8 <_utils_searchexp+0x1e8>
mov    0x10(%rsp),%rcx
test   %rcx,%rcx
je     12f8 <_utils_searchexp+0x1e8>
cmp    $0x24,%al
je     12f8 <_utils_searchexp+0x1e8>
mov    %r10,(%rcx)
mov    %r15d,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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