#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 */
typedef struct TYPE_3__ TYPE_1__;

/* Type definitions */
struct TYPE_3__ {
  scalar_t__ rm_so;
  int rm_eo;
};
typedef TYPE_1__ regmatch_t;

/* Variables and functions */
int /*<<< orphan*/ free(char *);
scalar_t__ isdigit(unsigned char);
char *malloc(int);
int /*<<< orphan*/ memcpy(char *, char const *, int);
int /*<<< orphan*/ memset(char *, char, int);
char *realloc(char *, int);
char *string_strndup(char const *, int);
int strlen(char const *);
int utf8_char_size(char const *);
int utf8_strlen(char *);
char *string_replace_regex_get_replace(const char *string,
                                       regmatch_t *regex_match, int last_match,
                                       const char *replace,
                                       const char reference_char) {
  int length, length_current, length_add, match;
  const char *ptr_replace, *ptr_add;
  char *result, *result2, *modified_replace, *temp, char_replace;
  length = (strlen(string) * 2);
  result = malloc(length + 1);
  if (!result)
    return NULL;
  result[0] = '\0';
  length_current = 0;
  ptr_replace = replace;
  while (ptr_replace && ptr_replace[0]) {
    ptr_add = NULL;
    length_add = 0;
    modified_replace = NULL;
    if ((ptr_replace[0] == '\\') && (ptr_replace[1] == reference_char)) {
      ptr_add = ptr_replace + 1;
      length_add = 1;
      ptr_replace += 2;
    } else if (ptr_replace[0] == reference_char) {
      if ((ptr_replace[1] == '+') || isdigit((unsigned char)ptr_replace[1])) {
        if (ptr_replace[1] == '+') {
          match = last_match;
          ptr_replace += 2;
        } else {
          if (isdigit((unsigned char)ptr_replace[2])) {
            match = ((ptr_replace[1] - '0') * 10) + (ptr_replace[2] - '0');
            ptr_replace += 3;
          } else {
            match = ptr_replace[1] - '0';
            ptr_replace += 2;
          }
        }
        if (regex_match[match].rm_so >= 0) {
          ptr_add = string + regex_match[match].rm_so;
          length_add = regex_match[match].rm_eo - regex_match[match].rm_so;
        }
      } else if ((ptr_replace[1] == '.') && (ptr_replace[2] >= 32) &&
                 (ptr_replace[2] <= 126) &&
                 ((ptr_replace[3] == '+') ||
                  isdigit((unsigned char)ptr_replace[3]))) {
        char_replace = ptr_replace[2];
        if (ptr_replace[3] == '+') {
          match = last_match;
          ptr_replace += 4;
        } else {
          if (isdigit((unsigned char)ptr_replace[4])) {
            match = ((ptr_replace[3] - '0') * 10) + (ptr_replace[4] - '0');
            ptr_replace += 5;
          } else {
            match = ptr_replace[3] - '0';
            ptr_replace += 4;
          }
        }
        if (regex_match[match].rm_so >= 0) {
          temp = string_strndup(string + regex_match[match].rm_so,
                                regex_match[match].rm_eo -
                                    regex_match[match].rm_so);
          if (temp) {
            length_add = utf8_strlen(temp);
            modified_replace = malloc(length_add + 1);
            if (modified_replace) {
              memset(modified_replace, char_replace, length_add);
              modified_replace[length_add] = '\0';
              ptr_add = modified_replace;
            }
            free(temp);
          }
        }
      } else {
        ptr_replace++;
      }
    } else {
      ptr_add = ptr_replace;
      length_add = utf8_char_size(ptr_replace);
      ptr_replace += length_add;
    }
    if (ptr_add) {
      if (length_current + length_add > length) {
        length = (length * 2 >= length_current + length_add)
                     ? length * 2
                     : length_current + length_add;
        result2 = realloc(result, length + 1);
        if (!result2) {
          if (modified_replace)
            free(modified_replace);
          free(result);
          return NULL;
        }
        result = result2;
      }
      memcpy(result + length_current, ptr_add, length_add);
      length_current += length_add;
      result[length_current] = '\0';
    }
    if (modified_replace)
      free(modified_replace);
  }
  return result;
}


x86 assembly (clang, -O0):
<string_replace_regex_get_replace>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %r8b,%al
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %al,-0x29(%rbp)
mov    -0x10(%rbp),%rdi
call   1060 <strlen@plt>
shl    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%edi
add    $0x1,%edi
call   1090 <malloc@plt>
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jne    11f6 <string_replace_regex_get_replace+0x56>
movq   $0x0,-0x8(%rbp)
jmp    16a6 <string_replace_regex_get_replace+0x506>
mov    -0x58(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x34(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x48(%rbp)
mov    %al,-0x72(%rbp)
je     122c <string_replace_regex_get_replace+0x8c>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x72(%rbp)
mov    -0x72(%rbp),%al
test   $0x1,%al
jne    123c <string_replace_regex_get_replace+0x9c>
jmp    169e <string_replace_regex_get_replace+0x4fe>
movq   $0x0,-0x50(%rbp)
movl   $0x0,-0x38(%rbp)
movq   $0x0,-0x68(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    129b <string_replace_regex_get_replace+0xfb>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
movsbl -0x29(%rbp),%ecx
cmp    %ecx,%eax
jne    129b <string_replace_regex_get_replace+0xfb>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
movl   $0x1,-0x38(%rbp)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
jmp    15be <string_replace_regex_get_replace+0x41e>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
movsbl -0x29(%rbp),%ecx
cmp    %ecx,%eax
jne    1594 <string_replace_regex_get_replace+0x3f4>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2b,%eax
je     12d6 <string_replace_regex_get_replace+0x136>
mov    -0x48(%rbp),%rax
movzbl 0x1(%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     13c3 <string_replace_regex_get_replace+0x223>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2b,%eax
jne    12fe <string_replace_regex_get_replace+0x15e>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
jmp    1363 <string_replace_regex_get_replace+0x1c3>
mov    -0x48(%rbp),%rax
movzbl 0x2(%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     1344 <string_replace_regex_get_replace+0x1a4>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x48(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x48(%rbp)
jmp    135e <string_replace_regex_get_replace+0x1be>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x48(%rbp)
jmp    1363 <string_replace_regex_get_replace+0x1c3>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cmpq   $0x0,(%rax)
jl     13be <string_replace_regex_get_replace+0x21e>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rcx
add    (%rcx),%rax
mov    %rax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
movslq 0x8(%rax),%rax
mov    -0x18(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rcx
sub    (%rcx),%rax
mov    %eax,-0x38(%rbp)
jmp    158f <string_replace_regex_get_replace+0x3ef>
mov    -0x48(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    157e <string_replace_regex_get_replace+0x3de>
mov    -0x48(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x20,%eax
jl     157e <string_replace_regex_get_replace+0x3de>
mov    -0x48(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x7e,%eax
jg     157e <string_replace_regex_get_replace+0x3de>
mov    -0x48(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x2b,%eax
je     141e <string_replace_regex_get_replace+0x27e>
mov    -0x48(%rbp),%rax
movzbl 0x3(%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     157e <string_replace_regex_get_replace+0x3de>
mov    -0x48(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x71(%rbp)
mov    -0x48(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x2b,%eax
jne    1450 <string_replace_regex_get_replace+0x2b0>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
jmp    14b5 <string_replace_regex_get_replace+0x315>
mov    -0x48(%rbp),%rax
movzbl 0x4(%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     1496 <string_replace_regex_get_replace+0x2f6>
mov    -0x48(%rbp),%rax
movsbl 0x3(%rax),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
mov    -0x48(%rbp),%rcx
movsbl 0x4(%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x48(%rbp)
jmp    14b0 <string_replace_regex_get_replace+0x310>
mov    -0x48(%rbp),%rax
movsbl 0x3(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x48(%rbp)
jmp    14b5 <string_replace_regex_get_replace+0x315>
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
cmpq   $0x0,(%rax)
jl     1579 <string_replace_regex_get_replace+0x3d9>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
add    (%rax),%rdi
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
shl    $0x4,%rcx
add    %rcx,%rax
movslq 0x8(%rax),%rax
mov    -0x18(%rbp),%rcx
movslq -0x3c(%rbp),%rdx
shl    $0x4,%rdx
add    %rdx,%rcx
sub    (%rcx),%rax
mov    %eax,%esi
call   10b0 <string_strndup@plt>
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     1574 <string_replace_regex_get_replace+0x3d4>
mov    -0x70(%rbp),%rdi
call   1050 <utf8_strlen@plt>
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%edi
add    $0x1,%edi
call   1090 <malloc@plt>
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x68(%rbp)
je     156b <string_replace_regex_get_replace+0x3cb>
mov    -0x68(%rbp),%rdi
mov    -0x71(%rbp),%al
mov    -0x38(%rbp),%edx
movsbl %al,%esi
call   1070 <memset@plt>
mov    -0x68(%rbp),%rax
movslq -0x38(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x68(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x70(%rbp),%rdi
call   1030 <free@plt>
jmp    1579 <string_replace_regex_get_replace+0x3d9>
jmp    158a <string_replace_regex_get_replace+0x3ea>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    158f <string_replace_regex_get_replace+0x3ef>
jmp    15b9 <string_replace_regex_get_replace+0x419>
mov    -0x48(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rdi
call   10c0 <utf8_char_size@plt>
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
jmp    15be <string_replace_regex_get_replace+0x41e>
cmpq   $0x0,-0x50(%rbp)
je     1685 <string_replace_regex_get_replace+0x4e5>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    1659 <string_replace_regex_get_replace+0x4b9>
mov    -0x30(%rbp),%eax
shl    $0x1,%eax
mov    -0x34(%rbp),%ecx
add    -0x38(%rbp),%ecx
cmp    %ecx,%eax
jl     15fa <string_replace_regex_get_replace+0x45a>
mov    -0x30(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x78(%rbp)
jmp    1603 <string_replace_regex_get_replace+0x463>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x78(%rbp)
mov    -0x78(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x58(%rbp),%rdi
mov    -0x30(%rbp),%esi
add    $0x1,%esi
call   10a0 <realloc@plt>
mov    %rax,-0x60(%rbp)
cmpq   $0x0,-0x60(%rbp)
jne    1651 <string_replace_regex_get_replace+0x4b1>
cmpq   $0x0,-0x68(%rbp)
je     163b <string_replace_regex_get_replace+0x49b>
mov    -0x68(%rbp),%rdi
call   1030 <free@plt>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    16a6 <string_replace_regex_get_replace+0x506>
mov    -0x60(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rdi
movslq -0x34(%rbp),%rax
add    %rax,%rdi
mov    -0x50(%rbp),%rsi
mov    -0x38(%rbp),%edx
call   1080 <memcpy@plt>
mov    -0x38(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x58(%rbp),%rax
movslq -0x34(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
cmpq   $0x0,-0x68(%rbp)
je     1699 <string_replace_regex_get_replace+0x4f9>
mov    -0x68(%rbp),%rdi
call   1030 <free@plt>
jmp    120c <string_replace_regex_get_replace+0x6c>
mov    -0x58(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_replace_regex_get_replace>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r8d,0x24(%rsp)
mov    %rcx,%r14
mov    %edx,0x20(%rsp)
mov    %rsi,0x28(%rsp)
mov    %rdi,0x30(%rsp)
call   1060 <strlen@plt>
mov    %rax,%rbx
lea    (%rax,%rax,1),%edi
add    $0x1,%edi
call   1090 <malloc@plt>
test   %rax,%rax
je     152d <string_replace_regex_get_replace+0x38d>
mov    %rax,%r12
movb   $0x0,(%rax)
test   %r14,%r14
je     1530 <string_replace_regex_get_replace+0x390>
mov    %rbx,%rbp
add    %ebp,%ebp
xor    %ebx,%ebx
jmp    120c <string_replace_regex_get_replace+0x6c>
nopl   0x0(%rax,%rax,1)
mov    %r13,%r14
test   %r13,%r13
je     1530 <string_replace_regex_get_replace+0x390>
movzbl (%r14),%eax
cmp    $0x5c,%al
je     1220 <string_replace_regex_get_replace+0x80>
test   %al,%al
jne    1240 <string_replace_regex_get_replace+0xa0>
jmp    1530 <string_replace_regex_get_replace+0x390>
nopl   (%rax)
mov    0x24(%rsp),%ecx
cmp    %cl,0x1(%r14)
jne    1240 <string_replace_regex_get_replace+0xa0>
mov    %r14,%r13
add    $0x1,%r14
add    $0x2,%r13
mov    $0x1,%r15d
jmp    12ea <string_replace_regex_get_replace+0x14a>
cmp    0x24(%rsp),%al
jne    12d0 <string_replace_regex_get_replace+0x130>
movzbl 0x1(%r14),%eax
cmp    $0x2b,%al
je     1280 <string_replace_regex_get_replace+0xe0>
mov    %rbp,0x8(%rsp)
lea    0x1(%r14),%r13
movzbl %al,%edi
call   1040 <isdigit@plt>
movzbl 0x0(%r13),%ecx
test   %rax,%rax
je     1372 <string_replace_regex_get_replace+0x1d2>
cmp    $0x2b,%cl
mov    0x8(%rsp),%rbp
jne    1469 <string_replace_regex_get_replace+0x2c9>
add    $0x2,%r14
mov    0x20(%rsp),%eax
mov    %eax,%ecx
mov    %r14,%r13
mov    0x28(%rsp),%rdx
movslq %ecx,%rcx
shl    $0x4,%rcx
mov    (%rdx,%rcx,1),%rax
test   %rax,%rax
js     11f8 <string_replace_regex_get_replace+0x58>
mov    0x30(%rsp),%rsi
lea    (%rsi,%rax,1),%r14
mov    0x8(%rdx,%rcx,1),%r15d
sub    %eax,%r15d
xor    %edi,%edi
test   %r14,%r14
jne    12ec <string_replace_regex_get_replace+0x14c>
test   %rdi,%rdi
jne    1368 <string_replace_regex_get_replace+0x1c8>
jmp    1200 <string_replace_regex_get_replace+0x60>
nopl   0x0(%rax)
mov    %rbx,%r15
mov    %rbp,%rbx
mov    %r14,%rdi
call   10c0 <utf8_char_size@plt>
mov    %r15,%rbx
mov    %eax,%r15d
movslq %eax,%r13
add    %r14,%r13
xor    %edi,%edi
mov    %rdi,0x8(%rsp)
mov    %r12,%rax
mov    %r13,0x10(%rsp)
mov    %rbx,%r12
add    %r15d,%ebx
cmp    %ebp,%ebx
jle    1330 <string_replace_regex_get_replace+0x190>
add    %ebp,%ebp
cmp    %ebx,%ebp
cmovl  %ebx,%ebp
mov    %rbp,%r13
lea    0x1(%rbp),%esi
mov    %rax,%rbp
mov    %rax,%rdi
call   10a0 <realloc@plt>
mov    %rbp,%rcx
mov    %rax,%rbp
test   %rax,%rax
jne    1336 <string_replace_regex_get_replace+0x196>
jmp    1513 <string_replace_regex_get_replace+0x373>
nopl   0x0(%rax,%rax,1)
mov    %rbp,%r13
mov    %rax,%rbp
movslq %r12d,%rdi
add    %rbp,%rdi
mov    %r14,%rsi
mov    %r15d,%edx
call   1080 <memcpy@plt>
movslq %ebx,%rax
movb   $0x0,0x0(%rbp,%rax,1)
mov    %rbp,%r12
mov    %r13,%rbp
mov    0x10(%rsp),%r13
mov    0x8(%rsp),%rdi
test   %rdi,%rdi
je     1200 <string_replace_regex_get_replace+0x60>
call   1030 <free@plt>
jmp    1200 <string_replace_regex_get_replace+0x60>
cmp    $0x2e,%cl
mov    0x8(%rsp),%rbp
jne    11f8 <string_replace_regex_get_replace+0x58>
mov    %rbx,0x18(%rsp)
mov    %r12,0x10(%rsp)
movzbl 0x2(%r14),%ebx
lea    -0x7f(%rbx),%eax
cmp    $0xa1,%al
jb     1494 <string_replace_regex_get_replace+0x2f4>
movzbl 0x3(%r14),%eax
cmp    $0x2b,%al
je     13c9 <string_replace_regex_get_replace+0x229>
movzbl %al,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     14be <string_replace_regex_get_replace+0x31e>
movzbl 0x2(%r14),%ebx
cmpb   $0x2b,0x3(%r14)
jne    14d4 <string_replace_regex_get_replace+0x334>
mov    0x8(%rsp),%rbp
add    $0x4,%r14
mov    0x20(%rsp),%eax
mov    %eax,%ecx
mov    %r14,%r13
movslq %ecx,%rcx
shl    $0x4,%rcx
mov    0x28(%rsp),%rdx
mov    (%rdx,%rcx,1),%rax
test   %rax,%rax
js     1494 <string_replace_regex_get_replace+0x2f4>
mov    0x30(%rsp),%rsi
lea    (%rsi,%rax,1),%rdi
mov    0x8(%rdx,%rcx,1),%esi
sub    %eax,%esi
call   10b0 <string_strndup@plt>
test   %rax,%rax
je     14be <string_replace_regex_get_replace+0x31e>
mov    %rax,%r12
mov    %rax,%rdi
call   1050 <utf8_strlen@plt>
mov    %eax,%r15d
lea    0x1(%r15),%edi
call   1090 <malloc@plt>
mov    %rax,%r14
test   %rax,%rax
je     1441 <string_replace_regex_get_replace+0x2a1>
movsbl %bl,%esi
mov    %r14,%rdi
mov    %r15d,%edx
call   1070 <memset@plt>
movslq %r15d,%rax
movb   $0x0,(%r14,%rax,1)
mov    %r12,%rdi
call   1030 <free@plt>
mov    %r14,%rdi
mov    0x10(%rsp),%r12
mov    0x8(%rsp),%rbp
mov    0x18(%rsp),%rbx
test   %r14,%r14
jne    12ec <string_replace_regex_get_replace+0x14c>
jmp    12be <string_replace_regex_get_replace+0x11e>
movzbl 0x2(%r14),%edi
call   1040 <isdigit@plt>
movsbl 0x1(%r14),%ecx
test   %rax,%rax
je     14a5 <string_replace_regex_get_replace+0x305>
lea    (%rcx,%rcx,4),%eax
movsbl 0x2(%r14),%ecx
lea    (%rcx,%rax,2),%ecx
add    $0xfffffdf0,%ecx
add    $0x3,%r14
jmp    14ac <string_replace_regex_get_replace+0x30c>
mov    0x18(%rsp),%rax
mov    %eax,%ebx
mov    0x10(%rsp),%r12
jmp    1200 <string_replace_regex_get_replace+0x60>
add    $0x2,%r14
add    $0xffffffd0,%ecx
mov    %r14,%r13
mov    0x28(%rsp),%rdx
mov    0x8(%rsp),%rbp
jmp    1292 <string_replace_regex_get_replace+0xf2>
mov    0x18(%rsp),%rax
mov    %eax,%ebx
mov    0x10(%rsp),%r12
mov    0x8(%rsp),%rbp
jmp    1200 <string_replace_regex_get_replace+0x60>
movzbl 0x4(%r14),%edi
call   1040 <isdigit@plt>
movsbl 0x3(%r14),%ecx
test   %rax,%rax
je     14ff <string_replace_regex_get_replace+0x35f>
lea    (%rcx,%rcx,4),%eax
movsbl 0x4(%r14),%ecx
lea    (%rcx,%rax,2),%ecx
add    $0xfffffdf0,%ecx
add    $0x5,%r14
jmp    1506 <string_replace_regex_get_replace+0x366>
add    $0x4,%r14
add    $0xffffffd0,%ecx
mov    %r14,%r13
mov    0x8(%rsp),%rbp
jmp    13d6 <string_replace_regex_get_replace+0x236>
mov    %rcx,%rbx
mov    0x8(%rsp),%rdi
test   %rdi,%rdi
je     1525 <string_replace_regex_get_replace+0x385>
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
xor    %r12d,%r12d
mov    %r12,%rax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
%struct.TYPE_3__ = type { i64, i32 }
define i8* @string_replace_regex_get_replace(i8* %0, %struct.TYPE_3__* %1, i32 %2, i8* %3, i8 signext %4) {
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca %struct.TYPE_3__*
%9 = alloca i32
%10 = alloca i8*
%11 = alloca i8
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i8*
%17 = alloca i8*
%18 = alloca i8*
%19 = alloca i8*
%20 = alloca i8*
%21 = alloca i8*
%22 = alloca i8
store i8* %0, i8** %7
store %struct.TYPE_3__* %1, %struct.TYPE_3__** %8
store i32 %2, i32* %9
store i8* %3, i8** %10
store i8 %4, i8* %11
%23 = load i8*, i8** %7
%24 = call i32 @strlen(i8* %23)
%25 = mul nsw i32 %24, 2
store i32 %25, i32* %12
%26 = load i32, i32* %12
%27 = add nsw i32 %26, 1
%28 = call i8* @malloc(i32 %27)
store i8* %28, i8** %18
%29 = load i8*, i8** %18
%30 = icmp ne i8* %29, null
br i1 %30, label %32, label %31
31: ; preds = %5
store i8* null, i8** %6
br label %370
32: ; preds = %5
%33 = load i8*, i8** %18
%34 = getelementptr inbounds i8, i8* %33, i64 0
store i8 0, i8* %34
store i32 0, i32* %13
%35 = load i8*, i8** %10
store i8* %35, i8** %16
br label %36
36: ; preds = %367, %32
%37 = load i8*, i8** %16
%38 = icmp ne i8* %37, null
br i1 %38, label %39, label %45
39: ; preds = %36
%40 = load i8*, i8** %16
%41 = getelementptr inbounds i8, i8* %40, i64 0
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = icmp ne i32 %43, 0
br label %45
45: ; preds = %39, %36
%46 = phi i1 [ false, %36 ], [ %44, %39 ]
br i1 %46, label %47, label %368
47: ; preds = %45
store i8* null, i8** %17
store i32 0, i32* %14
store i8* null, i8** %20
%48 = load i8*, i8** %16
%49 = getelementptr inbounds i8, i8* %48, i64 0
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 92
br i1 %52, label %53, label %66
53: ; preds = %47
%54 = load i8*, i8** %16
%55 = getelementptr inbounds i8, i8* %54, i64 1
%56 = load i8, i8* %55
%57 = sext i8 %56 to i32
%58 = load i8, i8* %11
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %57, %59
br i1 %60, label %61, label %66
61: ; preds = %53
%62 = load i8*, i8** %16
%63 = getelementptr inbounds i8, i8* %62, i64 1
store i8* %63, i8** %17
store i32 1, i32* %14
%64 = load i8*, i8** %16
%65 = getelementptr inbounds i8, i8* %64, i64 2
store i8* %65, i8** %16
br label %304
66: ; preds = %53, %47
%67 = load i8*, i8** %16
%68 = getelementptr inbounds i8, i8* %67, i64 0
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = load i8, i8* %11
%72 = sext i8 %71 to i32
%73 = icmp eq i32 %70, %72
br i1 %73, label %74, label %295
74: ; preds = %66
%75 = load i8*, i8** %16
%76 = getelementptr inbounds i8, i8* %75, i64 1
%77 = load i8, i8* %76
%78 = sext i8 %77 to i32
%79 = icmp eq i32 %78, 43
br i1 %79, label %86, label %80
80: ; preds = %74
%81 = load i8*, i8** %16
%82 = getelementptr inbounds i8, i8* %81, i64 1
%83 = load i8, i8* %82
%84 = call i64 @isdigit(i8 zeroext %83)
%85 = icmp ne i64 %84, 0
br i1 %85, label %86, label %159
86: ; preds = %80, %74
%87 = load i8*, i8** %16
%88 = getelementptr inbounds i8, i8* %87, i64 1
%89 = load i8, i8* %88
%90 = sext i8 %89 to i32
%91 = icmp eq i32 %90, 43
br i1 %91, label %92, label %96
92: ; preds = %86
%93 = load i32, i32* %9
store i32 %93, i32* %15
%94 = load i8*, i8** %16
%95 = getelementptr inbounds i8, i8* %94, i64 2
store i8* %95, i8** %16
br label %126
96: ; preds = %86
%97 = load i8*, i8** %16
%98 = getelementptr inbounds i8, i8* %97, i64 2
%99 = load i8, i8* %98
%100 = call i64 @isdigit(i8 zeroext %99)
%101 = icmp ne i64 %100, 0
br i1 %101, label %102, label %117
102: ; preds = %96
%103 = load i8*, i8** %16
%104 = getelementptr inbounds i8, i8* %103, i64 1
%105 = load i8, i8* %104
%106 = sext i8 %105 to i32
%107 = sub nsw i32 %106, 48
%108 = mul nsw i32 %107, 10
%109 = load i8*, i8** %16
%110 = getelementptr inbounds i8, i8* %109, i64 2
%111 = load i8, i8* %110
%112 = sext i8 %111 to i32
%113 = sub nsw i32 %112, 48
%114 = add nsw i32 %108, %113
store i32 %114, i32* %15
%115 = load i8*, i8** %16
%116 = getelementptr inbounds i8, i8* %115, i64 3
store i8* %116, i8** %16
br label %125
117: ; preds = %96
%118 = load i8*, i8** %16
%119 = getelementptr inbounds i8, i8* %118, i64 1
%120 = load i8, i8* %119
%121 = sext i8 %120 to i32
%122 = sub nsw i32 %121, 48
store i32 %122, i32* %15
%123 = load i8*, i8** %16
%124 = getelementptr inbounds i8, i8* %123, i64 2
store i8* %124, i8** %16
br label %125
125: ; preds = %117, %102
br label %126
126: ; preds = %125, %92
%127 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%128 = load i32, i32* %15
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %127, i64 %129
%131 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %130, i32 0, i32 0
%132 = load i64, i64* %131
%133 = icmp sge i64 %132, 0
br i1 %133, label %134, label %158
134: ; preds = %126
%135 = load i8*, i8** %7
%136 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%137 = load i32, i32* %15
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %136, i64 %138
%140 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %139, i32 0, i32 0
%141 = load i64, i64* %140
%142 = getelementptr inbounds i8, i8* %135, i64 %141
store i8* %142, i8** %17
%143 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%144 = load i32, i32* %15
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %143, i64 %145
%147 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %146, i32 0, i32 1
%148 = load i32, i32* %147
%149 = sext i32 %148 to i64
%150 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%151 = load i32, i32* %15
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %150, i64 %152
%154 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %153, i32 0, i32 0
%155 = load i64, i64* %154
%156 = sub nsw i64 %149, %155
%157 = trunc i64 %156 to i32
store i32 %157, i32* %14
br label %158
158: ; preds = %134, %126
br label %294
159: ; preds = %80
%160 = load i8*, i8** %16
%161 = getelementptr inbounds i8, i8* %160, i64 1
%162 = load i8, i8* %161
%163 = sext i8 %162 to i32
%164 = icmp eq i32 %163, 46
br i1 %164, label %165, label %290
165: ; preds = %159
%166 = load i8*, i8** %16
%167 = getelementptr inbounds i8, i8* %166, i64 2
%168 = load i8, i8* %167
%169 = sext i8 %168 to i32
%170 = icmp sge i32 %169, 32
br i1 %170, label %171, label %290
171: ; preds = %165
%172 = load i8*, i8** %16
%173 = getelementptr inbounds i8, i8* %172, i64 2
%174 = load i8, i8* %173
%175 = sext i8 %174 to i32
%176 = icmp sle i32 %175, 126
br i1 %176, label %177, label %290
177: ; preds = %171
%178 = load i8*, i8** %16
%179 = getelementptr inbounds i8, i8* %178, i64 3
%180 = load i8, i8* %179
%181 = sext i8 %180 to i32
%182 = icmp eq i32 %181, 43
br i1 %182, label %189, label %183
183: ; preds = %177
%184 = load i8*, i8** %16
%185 = getelementptr inbounds i8, i8* %184, i64 3
%186 = load i8, i8* %185
%187 = call i64 @isdigit(i8 zeroext %186)
%188 = icmp ne i64 %187, 0
br i1 %188, label %189, label %290
189: ; preds = %183, %177
%190 = load i8*, i8** %16
%191 = getelementptr inbounds i8, i8* %190, i64 2
%192 = load i8, i8* %191
store i8 %192, i8* %22
%193 = load i8*, i8** %16
%194 = getelementptr inbounds i8, i8* %193, i64 3
%195 = load i8, i8* %194
%196 = sext i8 %195 to i32
%197 = icmp eq i32 %196, 43
br i1 %197, label %198, label %202
198: ; preds = %189
%199 = load i32, i32* %9
store i32 %199, i32* %15
%200 = load i8*, i8** %16
%201 = getelementptr inbounds i8, i8* %200, i64 4
store i8* %201, i8** %16
br label %232
202: ; preds = %189
%203 = load i8*, i8** %16
%204 = getelementptr inbounds i8, i8* %203, i64 4
%205 = load i8, i8* %204
%206 = call i64 @isdigit(i8 zeroext %205)
%207 = icmp ne i64 %206, 0
br i1 %207, label %208, label %223
208: ; preds = %202
%209 = load i8*, i8** %16
%210 = getelementptr inbounds i8, i8* %209, i64 3
%211 = load i8, i8* %210
%212 = sext i8 %211 to i32
%213 = sub nsw i32 %212, 48
%214 = mul nsw i32 %213, 10
%215 = load i8*, i8** %16
%216 = getelementptr inbounds i8, i8* %215, i64 4
%217 = load i8, i8* %216
%218 = sext i8 %217 to i32
%219 = sub nsw i32 %218, 48
%220 = add nsw i32 %214, %219
store i32 %220, i32* %15
%221 = load i8*, i8** %16
%222 = getelementptr inbounds i8, i8* %221, i64 5
store i8* %222, i8** %16
br label %231
223: ; preds = %202
%224 = load i8*, i8** %16
%225 = getelementptr inbounds i8, i8* %224, i64 3
%226 = load i8, i8* %225
%227 = sext i8 %226 to i32
%228 = sub nsw i32 %227, 48
store i32 %228, i32* %15
%229 = load i8*, i8** %16
%230 = getelementptr inbounds i8, i8* %229, i64 4
store i8* %230, i8** %16
br label %231
231: ; preds = %223, %208
br label %232
232: ; preds = %231, %198
%233 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%234 = load i32, i32* %15
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %233, i64 %235
%237 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %236, i32 0, i32 0
%238 = load i64, i64* %237
%239 = icmp sge i64 %238, 0
br i1 %239, label %240, label %289
240: ; preds = %232
%241 = load i8*, i8** %7
%242 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%243 = load i32, i32* %15
%244 = sext i32 %243 to i64
%245 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %242, i64 %244
%246 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %245, i32 0, i32 0
%247 = load i64, i64* %246
%248 = getelementptr inbounds i8, i8* %241, i64 %247
%249 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%250 = load i32, i32* %15
%251 = sext i32 %250 to i64
%252 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %249, i64 %251
%253 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %252, i32 0, i32 1
%254 = load i32, i32* %253
%255 = sext i32 %254 to i64
%256 = load %struct.TYPE_3__*, %struct.TYPE_3__** %8
%257 = load i32, i32* %15
%258 = sext i32 %257 to i64
%259 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %256, i64 %258
%260 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %259, i32 0, i32 0
%261 = load i64, i64* %260
%262 = sub nsw i64 %255, %261
%263 = trunc i64 %262 to i32
%264 = call i8* @string_strndup(i8* %248, i32 %263)
store i8* %264, i8** %21
%265 = load i8*, i8** %21
%266 = icmp ne i8* %265, null
br i1 %266, label %267, label %288
267: ; preds = %240
%268 = load i8*, i8** %21
%269 = call i32 @utf8_strlen(i8* %268)
store i32 %269, i32* %14
%270 = load i32, i32* %14
%271 = add nsw i32 %270, 1
%272 = call i8* @malloc(i32 %271)
store i8* %272, i8** %20
%273 = load i8*, i8** %20
%274 = icmp ne i8* %273, null
br i1 %274, label %275, label %285
275: ; preds = %267
%276 = load i8*, i8** %20
%277 = load i8, i8* %22
%278 = load i32, i32* %14
%279 = call i32 @memset(i8* %276, i8 signext %277, i32 %278)
%280 = load i8*, i8** %20
%281 = load i32, i32* %14
%282 = sext i32 %281 to i64
%283 = getelementptr inbounds i8, i8* %280, i64 %282
store i8 0, i8* %283
%284 = load i8*, i8** %20
store i8* %284, i8** %17
br label %285
285: ; preds = %275, %267
%286 = load i8*, i8** %21
%287 = call i32 @free(i8* %286)
br label %288
288: ; preds = %285, %240
br label %289
289: ; preds = %288, %232
br label %293
290: ; preds = %183, %171, %165, %159
%291 = load i8*, i8** %16
%292 = getelementptr inbounds i8, i8* %291, i32 1
store i8* %292, i8** %16
br label %293
293: ; preds = %290, %289
br label %294
294: ; preds = %293, %158
br label %303
295: ; preds = %66
%296 = load i8*, i8** %16
store i8* %296, i8** %17
%297 = load i8*, i8** %16
%298 = call i32 @utf8_char_size(i8* %297)
store i32 %298, i32* %14
%299 = load i32, i32* %14
%300 = load i8*, i8** %16
%301 = sext i32 %299 to i64
%302 = getelementptr inbounds i8, i8* %300, i64 %301
store i8* %302, i8** %16
br label %303
303: ; preds = %295, %294
br label %304
304: ; preds = %303, %61
%305 = load i8*, i8** %17
%306 = icmp ne i8* %305, null
br i1 %306, label %307, label %361
307: ; preds = %304
%308 = load i32, i32* %13
%309 = load i32, i32* %14
%310 = add nsw i32 %308, %309
%311 = load i32, i32* %12
%312 = icmp sgt i32 %310, %311
br i1 %312, label %313, label %346
313: ; preds = %307
%314 = load i32, i32* %12
%315 = mul nsw i32 %314, 2
%316 = load i32, i32* %13
%317 = load i32, i32* %14
%318 = add nsw i32 %316, %317
%319 = icmp sge i32 %315, %318
br i1 %319, label %320, label %323
320: ; preds = %313
%321 = load i32, i32* %12
%322 = mul nsw i32 %321, 2
br label %327
323: ; preds = %313
%324 = load i32, i32* %13
%325 = load i32, i32* %14
%326 = add nsw i32 %324, %325
br label %327
327: ; preds = %323, %320
%328 = phi i32 [ %322, %320 ], [ %326, %323 ]
store i32 %328, i32* %12
%329 = load i8*, i8** %18
%330 = load i32, i32* %12
%331 = add nsw i32 %330, 1
%332 = call i8* @realloc(i8* %329, i32 %331)
store i8* %332, i8** %19
%333 = load i8*, i8** %19
%334 = icmp ne i8* %333, null
br i1 %334, label %344, label %335
335: ; preds = %327
%336 = load i8*, i8** %20
%337 = icmp ne i8* %336, null
br i1 %337, label %338, label %341
338: ; preds = %335
%339 = load i8*, i8** %20
%340 = call i32 @free(i8* %339)
br label %341
341: ; preds = %338, %335
%342 = load i8*, i8** %18
%343 = call i32 @free(i8* %342)
store i8* null, i8** %6
br label %370
344: ; preds = %327
%345 = load i8*, i8** %19
store i8* %345, i8** %18
br label %346
346: ; preds = %344, %307
%347 = load i8*, i8** %18
%348 = load i32, i32* %13
%349 = sext i32 %348 to i64
%350 = getelementptr inbounds i8, i8* %347, i64 %349
%351 = load i8*, i8** %17
%352 = load i32, i32* %14
%353 = call i32 @memcpy(i8* %350, i8* %351, i32 %352)
%354 = load i32, i32* %14
%355 = load i32, i32* %13
%356 = add nsw i32 %355, %354
store i32 %356, i32* %13
%357 = load i8*, i8** %18
%358 = load i32, i32* %13
%359 = sext i32 %358 to i64
%360 = getelementptr inbounds i8, i8* %357, i64 %359
store i8 0, i8* %360
br label %361
361: ; preds = %346, %304
%362 = load i8*, i8** %20
%363 = icmp ne i8* %362, null
br i1 %363, label %364, label %367
364: ; preds = %361
%365 = load i8*, i8** %20
%366 = call i32 @free(i8* %365)
br label %367
367: ; preds = %364, %361
br label %36
368: ; preds = %45
%369 = load i8*, i8** %18
store i8* %369, i8** %6
br label %370
370: ; preds = %368, %341, %31
%371 = load i8*, i8** %6
ret i8* %371
}

LLVM IR (-O2):
%struct.TYPE_3__ = type { i64, i32 }
define i8* @string_replace_regex_get_replace(i8* %0, %struct.TYPE_3__* nocapture %1, i32 %2, i8* %3, i8 signext %4) {
%6 = tail call i32 @strlen(i8* %0)
%7 = shl nsw i32 %6, 1
%8 = or i32 %7, 1
%9 = tail call i8* @malloc(i32 %8)
%10 = icmp eq i8* %9, null
br i1 %10, label %185, label %11
11: ; preds = %5
store i8 0, i8* %9
%12 = icmp eq i8* %3, null
br i1 %12, label %185, label %13
13: ; preds = %11, %179
%14 = phi i32 [ %180, %179 ], [ %7, %11 ]
%15 = phi i32 [ %181, %179 ], [ 0, %11 ]
%16 = phi i8* [ %182, %179 ], [ %9, %11 ]
%17 = phi i8* [ %183, %179 ], [ %3, %11 ]
%18 = load i8, i8* %17
switch i8 %18, label %25 [
i8 0, label %185
i8 92, label %19
]
19: ; preds = %13
%20 = getelementptr inbounds i8, i8* %17, i64 1
%21 = load i8, i8* %20
%22 = icmp eq i8 %21, %4
br i1 %22, label %23, label %25
23: ; preds = %19
%24 = getelementptr inbounds i8, i8* %17, i64 2
br label %142
25: ; preds = %13, %19
%26 = icmp eq i8 %18, %4
br i1 %26, label %27, label %132
27: ; preds = %25
%28 = getelementptr inbounds i8, i8* %17, i64 1
%29 = load i8, i8* %28
%30 = icmp eq i8 %29, 43
br i1 %30, label %37, label %31
31: ; preds = %27
%32 = tail call i64 @isdigit(i8 zeroext %29)
%33 = icmp eq i64 %32, 0
%34 = load i8, i8* %28
br i1 %33, label %68, label %35
35: ; preds = %31
%36 = icmp eq i8 %34, 43
br i1 %36, label %37, label %39
37: ; preds = %27, %35
%38 = getelementptr inbounds i8, i8* %17, i64 2
br label %55
39: ; preds = %35
%40 = getelementptr inbounds i8, i8* %17, i64 2
%41 = load i8, i8* %40
%42 = tail call i64 @isdigit(i8 zeroext %41)
%43 = icmp eq i64 %42, 0
%44 = load i8, i8* %28
%45 = sext i8 %44 to i32
br i1 %43, label %53, label %46
46: ; preds = %39
%47 = mul nsw i32 %45, 10
%48 = load i8, i8* %40
%49 = sext i8 %48 to i32
%50 = add nsw i32 %49, -528
%51 = add nsw i32 %50, %47
%52 = getelementptr inbounds i8, i8* %17, i64 3
br label %55
53: ; preds = %39
%54 = add nsw i32 %45, -48
br label %55
55: ; preds = %46, %53, %37
%56 = phi i32 [ %2, %37 ], [ %51, %46 ], [ %54, %53 ]
%57 = phi i8* [ %38, %37 ], [ %52, %46 ], [ %40, %53 ]
%58 = sext i32 %56 to i64
%59 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %1, i64 %58, i32 0
%60 = load i64, i64* %59
%61 = icmp sgt i64 %60, -1
br i1 %61, label %62, label %179
62: ; preds = %55
%63 = getelementptr inbounds i8, i8* %0, i64 %60
%64 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %1, i64 %58, i32 1
%65 = load i32, i32* %64
%66 = trunc i64 %60 to i32
%67 = sub i32 %65, %66
br label %136
68: ; preds = %31
%69 = icmp eq i8 %34, 46
br i1 %69, label %70, label %179
70: ; preds = %68
%71 = getelementptr inbounds i8, i8* %17, i64 2
%72 = load i8, i8* %71
%73 = add i8 %72, -127
%74 = icmp ult i8 %73, -95
br i1 %74, label %179, label %75
75: ; preds = %70
%76 = getelementptr inbounds i8, i8* %17, i64 3
%77 = load i8, i8* %76
%78 = icmp eq i8 %77, 43
br i1 %78, label %86, label %79
79: ; preds = %75
%80 = tail call i64 @isdigit(i8 zeroext %77)
%81 = icmp eq i64 %80, 0
br i1 %81, label %179, label %82
82: ; preds = %79
%83 = load i8, i8* %76
%84 = load i8, i8* %71
%85 = icmp eq i8 %83, 43
br i1 %85, label %86, label %89
86: ; preds = %75, %82
%87 = phi i8 [ %84, %82 ], [ %72, %75 ]
%88 = getelementptr inbounds i8, i8* %17, i64 4
br label %105
89: ; preds = %82
%90 = getelementptr inbounds i8, i8* %17, i64 4
%91 = load i8, i8* %90
%92 = tail call i64 @isdigit(i8 zeroext %91)
%93 = icmp eq i64 %92, 0
%94 = load i8, i8* %76
%95 = sext i8 %94 to i32
br i1 %93, label %103, label %96
96: ; preds = %89
%97 = mul nsw i32 %95, 10
%98 = load i8, i8* %90
%99 = sext i8 %98 to i32
%100 = add nsw i32 %99, -528
%101 = add nsw i32 %100, %97
%102 = getelementptr inbounds i8, i8* %17, i64 5
br label %105
103: ; preds = %89
%104 = add nsw i32 %95, -48
br label %105
105: ; preds = %96, %103, %86
%106 = phi i8 [ %87, %86 ], [ %84, %96 ], [ %84, %103 ]
%107 = phi i32 [ %2, %86 ], [ %101, %96 ], [ %104, %103 ]
%108 = phi i8* [ %88, %86 ], [ %102, %96 ], [ %90, %103 ]
%109 = sext i32 %107 to i64
%110 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %1, i64 %109, i32 0
%111 = load i64, i64* %110
%112 = icmp sgt i64 %111, -1
br i1 %112, label %113, label %179
113: ; preds = %105
%114 = getelementptr inbounds i8, i8* %0, i64 %111
%115 = getelementptr inbounds %struct.TYPE_3__, %struct.TYPE_3__* %1, i64 %109, i32 1
%116 = load i32, i32* %115
%117 = trunc i64 %111 to i32
%118 = sub i32 %116, %117
%119 = tail call i8* @string_strndup(i8* %114, i32 %118)
%120 = icmp eq i8* %119, null
br i1 %120, label %179, label %121
121: ; preds = %113
%122 = tail call i32 @utf8_strlen(i8* %119)
%123 = add nsw i32 %122, 1
%124 = tail call i8* @malloc(i32 %123)
%125 = icmp eq i8* %124, null
br i1 %125, label %130, label %126
126: ; preds = %121
%127 = tail call i32 @memset(i8* %124, i8 signext %106, i32 %122)
%128 = sext i32 %122 to i64
%129 = getelementptr inbounds i8, i8* %124, i64 %128
store i8 0, i8* %129
br label %130
130: ; preds = %126, %121
%131 = tail call i32 @free(i8* %119)
br label %136
132: ; preds = %25
%133 = tail call i32 @utf8_char_size(i8* %17)
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds i8, i8* %17, i64 %134
br label %142
136: ; preds = %130, %62
%137 = phi i32 [ %67, %62 ], [ %122, %130 ]
%138 = phi i8* [ %57, %62 ], [ %108, %130 ]
%139 = phi i8* [ %63, %62 ], [ %124, %130 ]
%140 = phi i8* [ null, %62 ], [ %124, %130 ]
%141 = icmp eq i8* %139, null
br i1 %141, label %170, label %142
142: ; preds = %132, %23, %136
%143 = phi i8* [ %140, %136 ], [ null, %23 ], [ null, %132 ]
%144 = phi i8* [ %139, %136 ], [ %20, %23 ], [ %17, %132 ]
%145 = phi i8* [ %138, %136 ], [ %24, %23 ], [ %135, %132 ]
%146 = phi i32 [ %137, %136 ], [ 1, %23 ], [ %133, %132 ]
%147 = add nsw i32 %146, %15
%148 = icmp sgt i32 %147, %14
br i1 %148, label %149, label %162
149: ; preds = %142
%150 = shl nsw i32 %14, 1
%151 = icmp slt i32 %150, %147
%152 = select i1 %151, i32 %147, i32 %150
%153 = add nsw i32 %152, 1
%154 = tail call i8* @realloc(i8* %16, i32 %153)
%155 = icmp eq i8* %154, null
br i1 %155, label %156, label %162
156: ; preds = %149
%157 = icmp eq i8* %143, null
br i1 %157, label %160, label %158
158: ; preds = %156
%159 = tail call i32 @free(i8* %143)
br label %160
160: ; preds = %158, %156
%161 = tail call i32 @free(i8* %16)
br label %185
162: ; preds = %149, %142
%163 = phi i8* [ %16, %142 ], [ %154, %149 ]
%164 = phi i32 [ %14, %142 ], [ %152, %149 ]
%165 = sext i32 %15 to i64
%166 = getelementptr inbounds i8, i8* %163, i64 %165
%167 = tail call i32 @memcpy(i8* %166, i8* %144, i32 %146)
%168 = sext i32 %147 to i64
%169 = getelementptr inbounds i8, i8* %163, i64 %168
store i8 0, i8* %169
br label %170
170: ; preds = %162, %136
%171 = phi i8* [ %143, %162 ], [ %140, %136 ]
%172 = phi i8* [ %145, %162 ], [ %138, %136 ]
%173 = phi i8* [ %163, %162 ], [ %16, %136 ]
%174 = phi i32 [ %147, %162 ], [ %15, %136 ]
%175 = phi i32 [ %164, %162 ], [ %14, %136 ]
%176 = icmp eq i8* %171, null
br i1 %176, label %179, label %177
177: ; preds = %170
%178 = tail call i32 @free(i8* %171)
br label %179
179: ; preds = %55, %113, %105, %79, %70, %68, %177, %170
%180 = phi i32 [ %175, %177 ], [ %175, %170 ], [ %14, %68 ], [ %14, %70 ], [ %14, %79 ], [ %14, %105 ], [ %14, %113 ], [ %14, %55 ]
%181 = phi i32 [ %174, %177 ], [ %174, %170 ], [ %15, %68 ], [ %15, %70 ], [ %15, %79 ], [ %15, %105 ], [ %15, %113 ], [ %15, %55 ]
%182 = phi i8* [ %173, %177 ], [ %173, %170 ], [ %16, %68 ], [ %16, %70 ], [ %16, %79 ], [ %16, %105 ], [ %16, %113 ], [ %16, %55 ]
%183 = phi i8* [ %172, %177 ], [ %172, %170 ], [ %28, %68 ], [ %28, %70 ], [ %28, %79 ], [ %108, %105 ], [ %108, %113 ], [ %57, %55 ]
%184 = icmp eq i8* %183, null
br i1 %184, label %185, label %13
185: ; preds = %13, %179, %11, %5, %160
%186 = phi i8* [ null, %160 ], [ null, %5 ], [ %9, %11 ], [ %16, %13 ], [ %182, %179 ]
ret i8* %186
}