#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__ strchr(char const *, char const);
int utf8_charcasecmp(char const *, char const *);
char *utf8_next_char(char const *);
int string_strcmp_ignore_chars(const char *string1, const char *string2,
                               const char *chars_ignored, int case_sensitive) {
  int diff;
  if (!string1 || !string2)
    return (string1) ? 1 : ((string2) ? -1 : 0);
  while (string1 && string1[0] && string2 && string2[0]) {
    while (string1 && string1[0] && strchr(chars_ignored, string1[0])) {
      string1 = utf8_next_char(string1);
    }
    while (string2 && string2[0] && strchr(chars_ignored, string2[0])) {
      string2 = utf8_next_char(string2);
    }
    if ((!string1 || !string1[0]) && (!string2 || !string2[0]))
      return 0;
    if ((!string1 || !string1[0]) && string2 && string2[0])
      return -1;
    if (string1 && string1[0] && (!string2 || !string2[0]))
      return 1;
    diff = (case_sensitive) ? (int)string1[0] - (int)string2[0]
                            : utf8_charcasecmp(string1, string2);
    if (diff != 0)
      return (diff < 0) ? -1 : 1;
    string1 = utf8_next_char(string1);
    string2 = utf8_next_char(string2);
    while (string1 && string1[0] && strchr(chars_ignored, string1[0])) {
      string1 = utf8_next_char(string1);
    }
    while (string2 && string2[0] && strchr(chars_ignored, string2[0])) {
      string2 = utf8_next_char(string2);
    }
  }
  if ((!string1 || !string1[0]) && string2 && string2[0])
    return -1;
  if (string1 && string1[0] && (!string2 || !string2[0]))
    return 1;
  return 0;
}


x86 assembly (clang, -O0):
<string_strcmp_ignore_chars>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     115d <string_strcmp_ignore_chars+0x2d>
cmpq   $0x0,-0x18(%rbp)
jne    1195 <string_strcmp_ignore_chars+0x65>
cmpq   $0x0,-0x10(%rbp)
je     1175 <string_strcmp_ignore_chars+0x45>
mov    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    118a <string_strcmp_ignore_chars+0x5a>
mov    -0x18(%rbp),%rdx
xor    %eax,%eax
mov    $0xffffffff,%ecx
cmp    $0x0,%rdx
cmovne %ecx,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
jmp    119a <string_strcmp_ignore_chars+0x6a>
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x2d(%rbp)
je     11df <string_strcmp_ignore_chars+0xaf>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2d(%rbp)
je     11df <string_strcmp_ignore_chars+0xaf>
xor    %eax,%eax
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x2d(%rbp)
je     11df <string_strcmp_ignore_chars+0xaf>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    11ef <string_strcmp_ignore_chars+0xbf>
jmp    14b8 <string_strcmp_ignore_chars+0x388>
jmp    11f4 <string_strcmp_ignore_chars+0xc4>
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x2e(%rbp)
je     1233 <string_strcmp_ignore_chars+0x103>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2e(%rbp)
je     1233 <string_strcmp_ignore_chars+0x103>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rax
movsbl (%rax),%esi
call   1040 <strchr@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x2e(%rbp)
mov    -0x2e(%rbp),%al
test   $0x1,%al
jne    1243 <string_strcmp_ignore_chars+0x113>
jmp    1255 <string_strcmp_ignore_chars+0x125>
mov    -0x10(%rbp),%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,-0x10(%rbp)
jmp    11f4 <string_strcmp_ignore_chars+0xc4>
jmp    125a <string_strcmp_ignore_chars+0x12a>
xor    %eax,%eax
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x2f(%rbp)
je     1299 <string_strcmp_ignore_chars+0x169>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2f(%rbp)
je     1299 <string_strcmp_ignore_chars+0x169>
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rax
movsbl (%rax),%esi
call   1040 <strchr@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x2f(%rbp)
mov    -0x2f(%rbp),%al
test   $0x1,%al
jne    12a9 <string_strcmp_ignore_chars+0x179>
jmp    12bb <string_strcmp_ignore_chars+0x18b>
mov    -0x18(%rbp),%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,-0x18(%rbp)
jmp    125a <string_strcmp_ignore_chars+0x12a>
cmpq   $0x0,-0x10(%rbp)
je     12d3 <string_strcmp_ignore_chars+0x1a3>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    12f7 <string_strcmp_ignore_chars+0x1c7>
cmpq   $0x0,-0x18(%rbp)
je     12eb <string_strcmp_ignore_chars+0x1bb>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    12f7 <string_strcmp_ignore_chars+0x1c7>
movl   $0x0,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
cmpq   $0x0,-0x10(%rbp)
je     130f <string_strcmp_ignore_chars+0x1df>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1336 <string_strcmp_ignore_chars+0x206>
cmpq   $0x0,-0x18(%rbp)
je     1336 <string_strcmp_ignore_chars+0x206>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1336 <string_strcmp_ignore_chars+0x206>
movl   $0xffffffff,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
cmpq   $0x0,-0x10(%rbp)
je     1375 <string_strcmp_ignore_chars+0x245>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1375 <string_strcmp_ignore_chars+0x245>
cmpq   $0x0,-0x18(%rbp)
je     1369 <string_strcmp_ignore_chars+0x239>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1375 <string_strcmp_ignore_chars+0x245>
movl   $0x1,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
cmpl   $0x0,-0x24(%rbp)
je     1397 <string_strcmp_ignore_chars+0x267>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
sub    %ecx,%eax
mov    %eax,-0x34(%rbp)
jmp    13a7 <string_strcmp_ignore_chars+0x277>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <utf8_charcasecmp@plt>
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     13d2 <string_strcmp_ignore_chars+0x2a2>
mov    -0x28(%rbp),%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x0,%edx
cmovl  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
mov    -0x10(%rbp),%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,-0x18(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x10(%rbp)
mov    %al,-0x35(%rbp)
je     142b <string_strcmp_ignore_chars+0x2fb>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x35(%rbp)
je     142b <string_strcmp_ignore_chars+0x2fb>
mov    -0x20(%rbp),%rdi
mov    -0x10(%rbp),%rax
movsbl (%rax),%esi
call   1040 <strchr@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    143b <string_strcmp_ignore_chars+0x30b>
jmp    144d <string_strcmp_ignore_chars+0x31d>
mov    -0x10(%rbp),%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,-0x10(%rbp)
jmp    13ec <string_strcmp_ignore_chars+0x2bc>
jmp    1452 <string_strcmp_ignore_chars+0x322>
xor    %eax,%eax
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x36(%rbp)
je     1491 <string_strcmp_ignore_chars+0x361>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x36(%rbp)
je     1491 <string_strcmp_ignore_chars+0x361>
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rax
movsbl (%rax),%esi
call   1040 <strchr@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x36(%rbp)
mov    -0x36(%rbp),%al
test   $0x1,%al
jne    14a1 <string_strcmp_ignore_chars+0x371>
jmp    14b3 <string_strcmp_ignore_chars+0x383>
mov    -0x18(%rbp),%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,-0x18(%rbp)
jmp    1452 <string_strcmp_ignore_chars+0x322>
jmp    119a <string_strcmp_ignore_chars+0x6a>
cmpq   $0x0,-0x10(%rbp)
je     14d0 <string_strcmp_ignore_chars+0x3a0>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    14f7 <string_strcmp_ignore_chars+0x3c7>
cmpq   $0x0,-0x18(%rbp)
je     14f7 <string_strcmp_ignore_chars+0x3c7>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     14f7 <string_strcmp_ignore_chars+0x3c7>
movl   $0xffffffff,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
cmpq   $0x0,-0x10(%rbp)
je     1536 <string_strcmp_ignore_chars+0x406>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1536 <string_strcmp_ignore_chars+0x406>
cmpq   $0x0,-0x18(%rbp)
je     152a <string_strcmp_ignore_chars+0x3fa>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1536 <string_strcmp_ignore_chars+0x406>
movl   $0x1,-0x4(%rbp)
jmp    153d <string_strcmp_ignore_chars+0x40d>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_strcmp_ignore_chars>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %ecx,0x4(%rsp)
mov    %rsi,%rbx
mov    %rdi,%rbp
test   %rdi,%rdi
je     1334 <string_strcmp_ignore_chars+0x204>
test   %rbx,%rbx
je     1334 <string_strcmp_ignore_chars+0x204>
mov    %rdx,%r15
jmp    116b <string_strcmp_ignore_chars+0x3b>
nopl   0x0(%rax)
xor    %ebx,%ebx
test   %rbp,%rbp
je     1371 <string_strcmp_ignore_chars+0x241>
mov    0x0(%rbp),%al
test   %al,%al
je     1348 <string_strcmp_ignore_chars+0x218>
test   %rbx,%rbx
je     1348 <string_strcmp_ignore_chars+0x218>
mov    $0x1,%r12d
cmpb   $0x0,(%rbx)
je     1393 <string_strcmp_ignore_chars+0x263>
xchg   %ax,%ax
movsbl %al,%esi
mov    %r15,%rdi
call   1040 <strchr@plt>
test   %rax,%rax
je     11b7 <string_strcmp_ignore_chars+0x87>
mov    %rbp,%rdi
call   1050 <utf8_next_char@plt>
test   %rax,%rax
je     11c0 <string_strcmp_ignore_chars+0x90>
mov    %rax,%rbp
movzbl (%rax),%eax
test   %al,%al
jne    1190 <string_strcmp_ignore_chars+0x60>
xor    %r13d,%r13d
jmp    11d0 <string_strcmp_ignore_chars+0xa0>
nopl   0x0(%rax)
mov    $0x1,%r13b
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rbx),%eax
mov    $0x1,%r14b
test   %al,%al
je     11ff <string_strcmp_ignore_chars+0xcf>
movsbl %al,%esi
mov    %r15,%rdi
call   1040 <strchr@plt>
test   %rax,%rax
je     11ff <string_strcmp_ignore_chars+0xcf>
mov    %rbx,%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,%rbx
test   %rax,%rax
jne    11d0 <string_strcmp_ignore_chars+0xa0>
xor    %ebx,%ebx
xor    %r14d,%r14d
test   %r13b,%r13b
jne    1220 <string_strcmp_ignore_chars+0xf0>
mov    0x0(%rbp),%al
test   %al,%al
je     1220 <string_strcmp_ignore_chars+0xf0>
test   %r14b,%r14b
jne    125b <string_strcmp_ignore_chars+0x12b>
jmp    1393 <string_strcmp_ignore_chars+0x263>
cs nopw 0x0(%rax,%rax,1)
nop
test   %r14b,%r14b
je     1381 <string_strcmp_ignore_chars+0x251>
mov    (%rbx),%al
test   %al,%al
sete   %cl
or     %r13b,%cl
jne    1386 <string_strcmp_ignore_chars+0x256>
mov    0x0(%rbp),%cl
test   %cl,%cl
setne  %al
xor    $0x1,%r14b
or     %al,%r14b
mov    %ecx,%eax
jne    1257 <string_strcmp_ignore_chars+0x127>
cmpb   $0x0,(%rbx)
jne    138d <string_strcmp_ignore_chars+0x25d>
xor    %eax,%eax
test   %cl,%cl
je     1264 <string_strcmp_ignore_chars+0x134>
cmpb   $0x0,(%rbx)
je     1393 <string_strcmp_ignore_chars+0x263>
cmpl   $0x0,0x4(%rsp)
je     1280 <string_strcmp_ignore_chars+0x150>
movsbl %al,%r12d
movsbl (%rbx),%eax
sub    %eax,%r12d
test   %r12d,%r12d
je     1297 <string_strcmp_ignore_chars+0x167>
jmp    1367 <string_strcmp_ignore_chars+0x237>
nop
mov    %rbp,%rdi
mov    %rbx,%rsi
call   1030 <utf8_charcasecmp@plt>
mov    %eax,%r12d
test   %r12d,%r12d
jne    1367 <string_strcmp_ignore_chars+0x237>
mov    %rbp,%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,%rbp
mov    %rbx,%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,%rbx
test   %rbp,%rbp
je     12e8 <string_strcmp_ignore_chars+0x1b8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl 0x0(%rbp),%eax
test   %al,%al
je     12ea <string_strcmp_ignore_chars+0x1ba>
movsbl %al,%esi
mov    %r15,%rdi
call   1040 <strchr@plt>
test   %rax,%rax
je     12ea <string_strcmp_ignore_chars+0x1ba>
mov    %rbp,%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,%rbp
test   %rax,%rax
jne    12c0 <string_strcmp_ignore_chars+0x190>
xor    %ebp,%ebp
test   %rbx,%rbx
je     1160 <string_strcmp_ignore_chars+0x30>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%rbx),%eax
test   %al,%al
je     1162 <string_strcmp_ignore_chars+0x32>
movsbl %al,%esi
mov    %r15,%rdi
call   1040 <strchr@plt>
test   %rax,%rax
je     1162 <string_strcmp_ignore_chars+0x32>
mov    %rbx,%rdi
call   1050 <utf8_next_char@plt>
mov    %rax,%rbx
test   %rax,%rax
jne    1300 <string_strcmp_ignore_chars+0x1d0>
jmp    1160 <string_strcmp_ignore_chars+0x30>
neg    %rbx
sbb    %eax,%eax
test   %rbp,%rbp
mov    $0x1,%r12d
cmove  %eax,%r12d
jmp    1393 <string_strcmp_ignore_chars+0x263>
test   %al,%al
jne    1351 <string_strcmp_ignore_chars+0x221>
test   %rbx,%rbx
jne    1376 <string_strcmp_ignore_chars+0x246>
test   %al,%al
je     1381 <string_strcmp_ignore_chars+0x251>
mov    $0x1,%r12d
test   %rbx,%rbx
je     1393 <string_strcmp_ignore_chars+0x263>
cmpb   $0x0,(%rbx)
jne    1381 <string_strcmp_ignore_chars+0x251>
jmp    1393 <string_strcmp_ignore_chars+0x263>
sar    $0x1f,%r12d
or     $0x1,%r12d
jmp    1393 <string_strcmp_ignore_chars+0x263>
test   %rbx,%rbx
je     1381 <string_strcmp_ignore_chars+0x251>
mov    $0xffffffff,%r12d
cmpb   $0x0,(%rbx)
jne    1393 <string_strcmp_ignore_chars+0x263>
xor    %r12d,%r12d
jmp    1393 <string_strcmp_ignore_chars+0x263>
neg    %al
sbb    %r12d,%r12d
jmp    1393 <string_strcmp_ignore_chars+0x263>
mov    $0xffffffff,%r12d
mov    %r12d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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