int utf8_fix_string(unsigned char *str, int *gl_ind) {
  unsigned char *s = str;
  int w, i = 0, j = 0;
  if (gl_ind)
    gl_ind[0] = 0;
  if (!s)
    return 0;
  while (*s) {
    if (*s <= 0x7f) {
      s++;
      if (gl_ind)
        gl_ind[j++] = i++;
    } else if (*s <= 0xbf) {
      *s++ = '?';
      if (gl_ind)
        gl_ind[j++] = i++;
    } else if (*s <= 0xc1) {
      *s++ = '?';
      if (gl_ind)
        gl_ind[j++] = i++;
    } else if (*s <= 0xdf) {
      if (s[1] >= 0x80 && s[1] <= 0xbf) {
        w = ((s[0] & 0x1f) << 6) | (s[1] & 0x3f);
        if (w < 0x80) {
          *s++ = '?';
          *s++ = '?';
          if (gl_ind) {
            gl_ind[j++] = i++;
            gl_ind[j++] = i++;
          }
        } else {
          s += 2;
          if (gl_ind) {
            gl_ind[j++] = i;
            i += 2;
          }
        }
      } else {
        *s++ = '?';
        if (gl_ind)
          gl_ind[j++] = i++;
      }
    } else if (*s <= 0xef) {
      if (s[1] >= 0x80 && s[1] <= 0xbf) {
        if (s[2] >= 0x80 && s[2] <= 0xbf) {
          w = ((s[0] & 0x0f) << 12) | ((s[1] & 0x3f) << 6) | (s[2] & 0x3f);
          if (w < 0x800) {
            *s++ = '?';
            *s++ = '?';
            *s++ = '?';
            if (gl_ind) {
              gl_ind[j++] = i++;
              gl_ind[j++] = i++;
              gl_ind[j++] = i++;
            }
          } else {
            s += 3;
            if (gl_ind) {
              gl_ind[j++] = i;
              i += 3;
            }
          }
        } else {
          *s++ = '?';
          *s++ = '?';
          if (gl_ind) {
            gl_ind[j++] = i++;
            gl_ind[j++] = i++;
          }
        }
      } else {
        *s++ = '?';
        if (gl_ind)
          gl_ind[j++] = i++;
      }
    } else if (*s <= 0xf7) {
      if (s[1] >= 0x80 && s[1] <= 0xbf) {
        if (s[2] >= 0x80 && s[2] <= 0xbf) {
          if (s[3] >= 0x80 && s[3] <= 0xbf) {
            w = ((s[0] & 0x07) << 18) | ((s[1] & 0x3f) << 12) |
                ((s[2] & 0x3f) << 6) | (s[3] & 0x3f);
            if (w < 0x10000) {
              *s++ = '?';
              *s++ = '?';
              *s++ = '?';
              *s++ = '?';
              if (gl_ind) {
                gl_ind[j++] = i++;
                gl_ind[j++] = i++;
                gl_ind[j++] = i++;
                gl_ind[j++] = i++;
              }
            } else {
              s += 4;
              if (gl_ind) {
                gl_ind[j++] = i;
                i += 4;
              }
            }
          } else {
            *s++ = '?';
            *s++ = '?';
            *s++ = '?';
            if (gl_ind) {
              gl_ind[j++] = i++;
              gl_ind[j++] = i++;
              gl_ind[j++] = i++;
            }
          }
        } else {
          *s++ = '?';
          *s++ = '?';
          if (gl_ind) {
            gl_ind[j++] = i++;
            gl_ind[j++] = i++;
          }
        }
      } else {
        *s++ = '?';
        if (gl_ind)
          gl_ind[j++] = i++;
      }
    } else {
      *s++ = '?';
      if (gl_ind)
        gl_ind[j++] = i++;
    }
  }
  if (gl_ind)
    gl_ind[j] = i;
  return j;
}


x86 assembly (clang, -O0):
<utf8_fix_string>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1137 <utf8_fix_string+0x37>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
cmpq   $0x0,-0x20(%rbp)
jne    114e <utf8_fix_string+0x4e>
movl   $0x0,-0x4(%rbp)
jmp    19c5 <utf8_fix_string+0x8c5>
jmp    1153 <utf8_fix_string+0x53>
mov    -0x20(%rbp),%rax
cmpb   $0x0,(%rax)
je     19a6 <utf8_fix_string+0x8a6>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7f,%eax
jg     11ac <utf8_fix_string+0xac>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     11a7 <utf8_fix_string+0xa7>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    19a1 <utf8_fix_string+0x8a1>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xbf,%eax
jg     1200 <utf8_fix_string+0x100>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     11fb <utf8_fix_string+0xfb>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    199c <utf8_fix_string+0x89c>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xc1,%eax
jg     1254 <utf8_fix_string+0x154>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     124f <utf8_fix_string+0x14f>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1997 <utf8_fix_string+0x897>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xdf,%eax
jg     13b3 <utf8_fix_string+0x2b3>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     136c <utf8_fix_string+0x26c>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     136c <utf8_fix_string+0x26c>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0x1f,%eax
shl    $0x6,%eax
mov    -0x20(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x80,-0x24(%rbp)
jge    132a <utf8_fix_string+0x22a>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     1325 <utf8_fix_string+0x225>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1367 <utf8_fix_string+0x267>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1362 <utf8_fix_string+0x262>
mov    -0x28(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    1367 <utf8_fix_string+0x267>
jmp    13ae <utf8_fix_string+0x2ae>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     13a9 <utf8_fix_string+0x2a9>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    13ae <utf8_fix_string+0x2ae>
jmp    1992 <utf8_fix_string+0x892>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xef,%eax
jg     15f3 <utf8_fix_string+0x4f3>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     15ac <utf8_fix_string+0x4ac>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     15ac <utf8_fix_string+0x4ac>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     1533 <utf8_fix_string+0x433>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     1533 <utf8_fix_string+0x433>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0xf,%eax
shl    $0xc,%eax
mov    -0x20(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
and    $0x3f,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x20(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x800,-0x24(%rbp)
jge    14f1 <utf8_fix_string+0x3f1>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     14ec <utf8_fix_string+0x3ec>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    152e <utf8_fix_string+0x42e>
mov    -0x20(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1529 <utf8_fix_string+0x429>
mov    -0x28(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x28(%rbp)
jmp    152e <utf8_fix_string+0x42e>
jmp    15a7 <utf8_fix_string+0x4a7>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     15a2 <utf8_fix_string+0x4a2>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    15a7 <utf8_fix_string+0x4a7>
jmp    15ee <utf8_fix_string+0x4ee>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     15e9 <utf8_fix_string+0x4e9>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    15ee <utf8_fix_string+0x4ee>
jmp    198d <utf8_fix_string+0x88d>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf7,%eax
jg     1946 <utf8_fix_string+0x846>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x80,%eax
jl     18ff <utf8_fix_string+0x7ff>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xbf,%eax
jg     18ff <utf8_fix_string+0x7ff>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x80,%eax
jl     1886 <utf8_fix_string+0x786>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0xbf,%eax
jg     1886 <utf8_fix_string+0x786>
mov    -0x20(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0x80,%eax
jl     17db <utf8_fix_string+0x6db>
mov    -0x20(%rbp),%rax
movzbl 0x3(%rax),%eax
cmp    $0xbf,%eax
jg     17db <utf8_fix_string+0x6db>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0x7,%eax
shl    $0x12,%eax
mov    -0x20(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
and    $0x3f,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x20(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
and    $0x3f,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x20(%rbp),%rcx
movzbl 0x3(%rcx),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x10000,-0x24(%rbp)
jge    1799 <utf8_fix_string+0x699>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     1794 <utf8_fix_string+0x694>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    17d6 <utf8_fix_string+0x6d6>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     17d1 <utf8_fix_string+0x6d1>
mov    -0x28(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
jmp    17d6 <utf8_fix_string+0x6d6>
jmp    1881 <utf8_fix_string+0x781>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     187c <utf8_fix_string+0x77c>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1881 <utf8_fix_string+0x781>
jmp    18fa <utf8_fix_string+0x7fa>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     18f5 <utf8_fix_string+0x7f5>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18fa <utf8_fix_string+0x7fa>
jmp    1941 <utf8_fix_string+0x841>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     193c <utf8_fix_string+0x83c>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1941 <utf8_fix_string+0x841>
jmp    1988 <utf8_fix_string+0x888>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x3f,(%rax)
cmpq   $0x0,-0x18(%rbp)
je     1983 <utf8_fix_string+0x883>
mov    -0x28(%rbp),%edx
mov    %edx,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x2c(%rbp)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1988 <utf8_fix_string+0x888>
jmp    198d <utf8_fix_string+0x88d>
jmp    1992 <utf8_fix_string+0x892>
jmp    1997 <utf8_fix_string+0x897>
jmp    199c <utf8_fix_string+0x89c>
jmp    19a1 <utf8_fix_string+0x8a1>
jmp    1153 <utf8_fix_string+0x53>
cmpq   $0x0,-0x18(%rbp)
je     19bf <utf8_fix_string+0x8bf>
mov    -0x28(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8_fix_string>:
test   %rsi,%rsi
je     110b <utf8_fix_string+0xb>
movl   $0x0,(%rsi)
test   %rdi,%rdi
je     13fd <utf8_fix_string+0x2fd>
mov    (%rdi),%dl
pxor   %xmm1,%xmm1
test   %dl,%dl
je     13e6 <utf8_fix_string+0x2e6>
pcmpeqd %xmm0,%xmm0
movdqa 0xed2(%rip),%xmm2
movdqa 0xf3a(%rip),%xmm3
movdqa 0xed2(%rip),%xmm4
movdqa 0xeda(%rip),%xmm5
movdqa 0xf12(%rip),%xmm6
movdqa 0xee9(%rip),%xmm8
movdqa 0xef0(%rip),%xmm9
movdqa 0xec7(%rip),%xmm10
nopl   0x0(%rax)
test   %dl,%dl
js     11a0 <utf8_fix_string+0xa0>
add    $0x1,%rdi
test   %rsi,%rsi
je     11ce <utf8_fix_string+0xce>
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%eax
cltq
movd   %xmm1,(%rsi,%rax,4)
psubd  %xmm0,%xmm1
jmp    11ce <utf8_fix_string+0xce>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    $0xbf,%dl
jbe    11aa <utf8_fix_string+0xaa>
cmp    $0xc1,%dl
ja     11e2 <utf8_fix_string+0xe2>
lea    0x1(%rdi),%rax
movb   $0x3f,(%rdi)
test   %rsi,%rsi
je     11cb <utf8_fix_string+0xcb>
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%ecx
movslq %ecx,%rcx
movd   %xmm1,(%rsi,%rcx,4)
psubd  %xmm0,%xmm1
mov    %rax,%rdi
movzbl (%rdi),%ecx
mov    %rdi,%rax
mov    %ecx,%edx
mov    %rax,%rdi
test   %cl,%cl
jne    1170 <utf8_fix_string+0x70>
jmp    13e6 <utf8_fix_string+0x2e6>
cmp    $0xdf,%dl
ja     121c <utf8_fix_string+0x11c>
movzbl 0x1(%rdi),%ecx
cmp    $0xbf,%cl
jg     127a <utf8_fix_string+0x17a>
test   $0x1e,%dl
je     12f9 <utf8_fix_string+0x1f9>
add    $0x2,%rdi
test   %rsi,%rsi
je     11ce <utf8_fix_string+0xce>
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%eax
cltq
movd   %xmm1,(%rsi,%rax,4)
paddd  %xmm3,%xmm1
jmp    11ce <utf8_fix_string+0xce>
movzbl %dl,%r8d
cmp    $0xef,%dl
ja     128f <utf8_fix_string+0x18f>
movzbl 0x1(%rdi),%ecx
cmp    $0xbf,%cl
jg     127a <utf8_fix_string+0x17a>
movzbl 0x2(%rdi),%edx
cmp    $0xbf,%dl
jg     130c <utf8_fix_string+0x20c>
movzbl %cl,%eax
shl    $0xc,%r8d
movzwl %r8w,%ecx
and    $0x20,%eax
shl    $0x6,%eax
or     %ecx,%eax
je     133f <utf8_fix_string+0x23f>
add    $0x3,%rdi
test   %rsi,%rsi
je     11ce <utf8_fix_string+0xce>
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%eax
cltq
movd   %xmm1,(%rsi,%rax,4)
paddd  %xmm6,%xmm1
jmp    11ce <utf8_fix_string+0xce>
lea    0x1(%rdi),%rax
movb   $0x3f,(%rdi)
test   %rsi,%rsi
jne    11b6 <utf8_fix_string+0xb6>
jmp    11d4 <utf8_fix_string+0xd4>
lea    0x1(%rdi),%rax
cmp    $0xf7,%dl
ja     11ae <utf8_fix_string+0xae>
movzbl (%rax),%ecx
cmp    $0xbf,%cl
jg     127e <utf8_fix_string+0x17e>
movzbl 0x2(%rdi),%edx
cmp    $0xbf,%dl
jg     130c <utf8_fix_string+0x20c>
cmpb   $0xbf,0x3(%rdi)
jg     133f <utf8_fix_string+0x23f>
movzbl %cl,%ecx
and    $0x7,%r8d
shl    $0x12,%r8d
and    $0x30,%ecx
shl    $0xc,%ecx
lea    0x4(%rdi),%rax
or     %r8d,%ecx
je     139d <utf8_fix_string+0x29d>
test   %rsi,%rsi
je     11cb <utf8_fix_string+0xcb>
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%ecx
movslq %ecx,%rcx
movd   %xmm1,(%rsi,%rcx,4)
paddd  %xmm10,%xmm1
jmp    11cb <utf8_fix_string+0xcb>
lea    0x2(%rdi),%rax
movw   $0x3f3f,(%rdi)
test   %rsi,%rsi
jne    131a <utf8_fix_string+0x21a>
jmp    11cb <utf8_fix_string+0xcb>
lea    0x2(%rdi),%rax
movw   $0x3f3f,(%rdi)
test   %rsi,%rsi
je     1396 <utf8_fix_string+0x296>
movd   %xmm1,%ecx
add    $0x1,%ecx
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%edx
movslq %edx,%rdx
movd   %xmm1,(%rsi,%rdx,4)
paddd  %xmm2,%xmm1
mov    %ecx,0x4(%rsi,%rdx,4)
jmp    11cb <utf8_fix_string+0xcb>
lea    0x3(%rdi),%rax
movw   $0x3f3f,(%rdi)
movb   $0x3f,0x2(%rdi)
test   %rsi,%rsi
je     11cb <utf8_fix_string+0xcb>
movd   %xmm1,%ecx
lea    0x1(%rcx),%edx
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%edi
movslq %edi,%rdi
movd   %xmm1,(%rsi,%rdi,4)
add    $0x2,%ecx
paddd  %xmm4,%xmm7
movd   %xmm7,%edi
movslq %edi,%rdi
mov    %edx,(%rsi,%rdi,4)
paddd  %xmm5,%xmm1
pshufd $0x55,%xmm7,%xmm7
movd   %xmm7,%edx
movslq %edx,%rdx
mov    %ecx,(%rsi,%rdx,4)
jmp    11cb <utf8_fix_string+0xcb>
mov    %edx,%ecx
jmp    11d4 <utf8_fix_string+0xd4>
movl   $0x3f3f3f3f,(%rdi)
test   %rsi,%rsi
je     11cb <utf8_fix_string+0xcb>
movd   %xmm1,%ecx
lea    0x1(%rcx),%edx
pshufd $0x55,%xmm1,%xmm7
movd   %xmm7,%edi
movslq %edi,%rdi
movd   %xmm1,(%rsi,%rdi,4)
lea    0x2(%rcx),%r8d
mov    %edx,0x4(%rsi,%rdi,4)
add    $0x3,%ecx
paddd  %xmm8,%xmm7
movd   %xmm7,%edx
movslq %edx,%rdx
mov    %r8d,(%rsi,%rdx,4)
paddd  %xmm9,%xmm1
jmp    1382 <utf8_fix_string+0x282>
pshufd $0x55,%xmm1,%xmm0
movd   %xmm0,%eax
test   %rsi,%rsi
je     13fc <utf8_fix_string+0x2fc>
movslq %eax,%rcx
movd   %xmm1,(%rsi,%rcx,4)
ret
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @utf8_fix_string(i8* %0, i32* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %4
store i32* %1, i32** %5
%10 = load i8*, i8** %4
store i8* %10, i8** %6
store i32 0, i32* %8
store i32 0, i32* %9
%11 = load i32*, i32** %5
%12 = icmp ne i32* %11, null
br i1 %12, label %13, label %16
13: ; preds = %2
%14 = load i32*, i32** %5
%15 = getelementptr inbounds i32, i32* %14, i64 0
store i32 0, i32* %15
br label %16
16: ; preds = %13, %2
%17 = load i8*, i8** %6
%18 = icmp ne i8* %17, null
br i1 %18, label %20, label %19
19: ; preds = %16
store i32 0, i32* %3
br label %536
20: ; preds = %16
br label %21
21: ; preds = %524, %20
%22 = load i8*, i8** %6
%23 = load i8, i8* %22
%24 = icmp ne i8 %23, 0
br i1 %24, label %25, label %525
25: ; preds = %21
%26 = load i8*, i8** %6
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = icmp sle i32 %28, 127
br i1 %29, label %30, label %44
30: ; preds = %25
%31 = load i8*, i8** %6
%32 = getelementptr inbounds i8, i8* %31, i32 1
store i8* %32, i8** %6
%33 = load i32*, i32** %5
%34 = icmp ne i32* %33, null
br i1 %34, label %35, label %43
35: ; preds = %30
%36 = load i32, i32* %8
%37 = add nsw i32 %36, 1
store i32 %37, i32* %8
%38 = load i32*, i32** %5
%39 = load i32, i32* %9
%40 = add nsw i32 %39, 1
store i32 %40, i32* %9
%41 = sext i32 %39 to i64
%42 = getelementptr inbounds i32, i32* %38, i64 %41
store i32 %36, i32* %42
br label %43
43: ; preds = %35, %30
br label %524
44: ; preds = %25
%45 = load i8*, i8** %6
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
%48 = icmp sle i32 %47, 191
br i1 %48, label %49, label %63
49: ; preds = %44
%50 = load i8*, i8** %6
%51 = getelementptr inbounds i8, i8* %50, i32 1
store i8* %51, i8** %6
store i8 63, i8* %50
%52 = load i32*, i32** %5
%53 = icmp ne i32* %52, null
br i1 %53, label %54, label %62
54: ; preds = %49
%55 = load i32, i32* %8
%56 = add nsw i32 %55, 1
store i32 %56, i32* %8
%57 = load i32*, i32** %5
%58 = load i32, i32* %9
%59 = add nsw i32 %58, 1
store i32 %59, i32* %9
%60 = sext i32 %58 to i64
%61 = getelementptr inbounds i32, i32* %57, i64 %60
store i32 %55, i32* %61
br label %62
62: ; preds = %54, %49
br label %523
63: ; preds = %44
%64 = load i8*, i8** %6
%65 = load i8, i8* %64
%66 = zext i8 %65 to i32
%67 = icmp sle i32 %66, 193
br i1 %67, label %68, label %82
68: ; preds = %63
%69 = load i8*, i8** %6
%70 = getelementptr inbounds i8, i8* %69, i32 1
store i8* %70, i8** %6
store i8 63, i8* %69
%71 = load i32*, i32** %5
%72 = icmp ne i32* %71, null
br i1 %72, label %73, label %81
73: ; preds = %68
%74 = load i32, i32* %8
%75 = add nsw i32 %74, 1
store i32 %75, i32* %8
%76 = load i32*, i32** %5
%77 = load i32, i32* %9
%78 = add nsw i32 %77, 1
store i32 %78, i32* %9
%79 = sext i32 %77 to i64
%80 = getelementptr inbounds i32, i32* %76, i64 %79
store i32 %74, i32* %80
br label %81
81: ; preds = %73, %68
br label %522
82: ; preds = %63
%83 = load i8*, i8** %6
%84 = load i8, i8* %83
%85 = zext i8 %84 to i32
%86 = icmp sle i32 %85, 223
br i1 %86, label %87, label %168
87: ; preds = %82
%88 = load i8*, i8** %6
%89 = getelementptr inbounds i8, i8* %88, i64 1
%90 = load i8, i8* %89
%91 = zext i8 %90 to i32
%92 = icmp sge i32 %91, 128
br i1 %92, label %93, label %153
93: ; preds = %87
%94 = load i8*, i8** %6
%95 = getelementptr inbounds i8, i8* %94, i64 1
%96 = load i8, i8* %95
%97 = zext i8 %96 to i32
%98 = icmp sle i32 %97, 191
br i1 %98, label %99, label %153
99: ; preds = %93
%100 = load i8*, i8** %6
%101 = getelementptr inbounds i8, i8* %100, i64 0
%102 = load i8, i8* %101
%103 = zext i8 %102 to i32
%104 = and i32 %103, 31
%105 = shl i32 %104, 6
%106 = load i8*, i8** %6
%107 = getelementptr inbounds i8, i8* %106, i64 1
%108 = load i8, i8* %107
%109 = zext i8 %108 to i32
%110 = and i32 %109, 63
%111 = or i32 %105, %110
store i32 %111, i32* %7
%112 = load i32, i32* %7
%113 = icmp slt i32 %112, 128
br i1 %113, label %114, label %137
114: ; preds = %99
%115 = load i8*, i8** %6
%116 = getelementptr inbounds i8, i8* %115, i32 1
store i8* %116, i8** %6
store i8 63, i8* %115
%117 = load i8*, i8** %6
%118 = getelementptr inbounds i8, i8* %117, i32 1
store i8* %118, i8** %6
store i8 63, i8* %117
%119 = load i32*, i32** %5
%120 = icmp ne i32* %119, null
br i1 %120, label %121, label %136
121: ; preds = %114
%122 = load i32, i32* %8
%123 = add nsw i32 %122, 1
store i32 %123, i32* %8
%124 = load i32*, i32** %5
%125 = load i32, i32* %9
%126 = add nsw i32 %125, 1
store i32 %126, i32* %9
%127 = sext i32 %125 to i64
%128 = getelementptr inbounds i32, i32* %124, i64 %127
store i32 %122, i32* %128
%129 = load i32, i32* %8
%130 = add nsw i32 %129, 1
store i32 %130, i32* %8
%131 = load i32*, i32** %5
%132 = load i32, i32* %9
%133 = add nsw i32 %132, 1
store i32 %133, i32* %9
%134 = sext i32 %132 to i64
%135 = getelementptr inbounds i32, i32* %131, i64 %134
store i32 %129, i32* %135
br label %136
136: ; preds = %121, %114
br label %152
137: ; preds = %99
%138 = load i8*, i8** %6
%139 = getelementptr inbounds i8, i8* %138, i64 2
store i8* %139, i8** %6
%140 = load i32*, i32** %5
%141 = icmp ne i32* %140, null
br i1 %141, label %142, label %151
142: ; preds = %137
%143 = load i32, i32* %8
%144 = load i32*, i32** %5
%145 = load i32, i32* %9
%146 = add nsw i32 %145, 1
store i32 %146, i32* %9
%147 = sext i32 %145 to i64
%148 = getelementptr inbounds i32, i32* %144, i64 %147
store i32 %143, i32* %148
%149 = load i32, i32* %8
%150 = add nsw i32 %149, 2
store i32 %150, i32* %8
br label %151
151: ; preds = %142, %137
br label %152
152: ; preds = %151, %136
br label %167
153: ; preds = %93, %87
%154 = load i8*, i8** %6
%155 = getelementptr inbounds i8, i8* %154, i32 1
store i8* %155, i8** %6
store i8 63, i8* %154
%156 = load i32*, i32** %5
%157 = icmp ne i32* %156, null
br i1 %157, label %158, label %166
158: ; preds = %153
%159 = load i32, i32* %8
%160 = add nsw i32 %159, 1
store i32 %160, i32* %8
%161 = load i32*, i32** %5
%162 = load i32, i32* %9
%163 = add nsw i32 %162, 1
store i32 %163, i32* %9
%164 = sext i32 %162 to i64
%165 = getelementptr inbounds i32, i32* %161, i64 %164
store i32 %159, i32* %165
br label %166
166: ; preds = %158, %153
br label %167
167: ; preds = %166, %152
br label %521
168: ; preds = %82
%169 = load i8*, i8** %6
%170 = load i8, i8* %169
%171 = zext i8 %170 to i32
%172 = icmp sle i32 %171, 239
br i1 %172, label %173, label %306
173: ; preds = %168
%174 = load i8*, i8** %6
%175 = getelementptr inbounds i8, i8* %174, i64 1
%176 = load i8, i8* %175
%177 = zext i8 %176 to i32
%178 = icmp sge i32 %177, 128
br i1 %178, label %179, label %291
179: ; preds = %173
%180 = load i8*, i8** %6
%181 = getelementptr inbounds i8, i8* %180, i64 1
%182 = load i8, i8* %181
%183 = zext i8 %182 to i32
%184 = icmp sle i32 %183, 191
br i1 %184, label %185, label %291
185: ; preds = %179
%186 = load i8*, i8** %6
%187 = getelementptr inbounds i8, i8* %186, i64 2
%188 = load i8, i8* %187
%189 = zext i8 %188 to i32
%190 = icmp sge i32 %189, 128
br i1 %190, label %191, label %267
191: ; preds = %185
%192 = load i8*, i8** %6
%193 = getelementptr inbounds i8, i8* %192, i64 2
%194 = load i8, i8* %193
%195 = zext i8 %194 to i32
%196 = icmp sle i32 %195, 191
br i1 %196, label %197, label %267
197: ; preds = %191
%198 = load i8*, i8** %6
%199 = getelementptr inbounds i8, i8* %198, i64 0
%200 = load i8, i8* %199
%201 = zext i8 %200 to i32
%202 = and i32 %201, 15
%203 = shl i32 %202, 12
%204 = load i8*, i8** %6
%205 = getelementptr inbounds i8, i8* %204, i64 1
%206 = load i8, i8* %205
%207 = zext i8 %206 to i32
%208 = and i32 %207, 63
%209 = shl i32 %208, 6
%210 = or i32 %203, %209
%211 = load i8*, i8** %6
%212 = getelementptr inbounds i8, i8* %211, i64 2
%213 = load i8, i8* %212
%214 = zext i8 %213 to i32
%215 = and i32 %214, 63
%216 = or i32 %210, %215
store i32 %216, i32* %7
%217 = load i32, i32* %7
%218 = icmp slt i32 %217, 2048
br i1 %218, label %219, label %251
219: ; preds = %197
%220 = load i8*, i8** %6
%221 = getelementptr inbounds i8, i8* %220, i32 1
store i8* %221, i8** %6
store i8 63, i8* %220
%222 = load i8*, i8** %6
%223 = getelementptr inbounds i8, i8* %222, i32 1
store i8* %223, i8** %6
store i8 63, i8* %222
%224 = load i8*, i8** %6
%225 = getelementptr inbounds i8, i8* %224, i32 1
store i8* %225, i8** %6
store i8 63, i8* %224
%226 = load i32*, i32** %5
%227 = icmp ne i32* %226, null
br i1 %227, label %228, label %250
228: ; preds = %219
%229 = load i32, i32* %8
%230 = add nsw i32 %229, 1
store i32 %230, i32* %8
%231 = load i32*, i32** %5
%232 = load i32, i32* %9
%233 = add nsw i32 %232, 1
store i32 %233, i32* %9
%234 = sext i32 %232 to i64
%235 = getelementptr inbounds i32, i32* %231, i64 %234
store i32 %229, i32* %235
%236 = load i32, i32* %8
%237 = add nsw i32 %236, 1
store i32 %237, i32* %8
%238 = load i32*, i32** %5
%239 = load i32, i32* %9
%240 = add nsw i32 %239, 1
store i32 %240, i32* %9
%241 = sext i32 %239 to i64
%242 = getelementptr inbounds i32, i32* %238, i64 %241
store i32 %236, i32* %242
%243 = load i32, i32* %8
%244 = add nsw i32 %243, 1
store i32 %244, i32* %8
%245 = load i32*, i32** %5
%246 = load i32, i32* %9
%247 = add nsw i32 %246, 1
store i32 %247, i32* %9
%248 = sext i32 %246 to i64
%249 = getelementptr inbounds i32, i32* %245, i64 %248
store i32 %243, i32* %249
br label %250
250: ; preds = %228, %219
br label %266
251: ; preds = %197
%252 = load i8*, i8** %6
%253 = getelementptr inbounds i8, i8* %252, i64 3
store i8* %253, i8** %6
%254 = load i32*, i32** %5
%255 = icmp ne i32* %254, null
br i1 %255, label %256, label %265
256: ; preds = %251
%257 = load i32, i32* %8
%258 = load i32*, i32** %5
%259 = load i32, i32* %9
%260 = add nsw i32 %259, 1
store i32 %260, i32* %9
%261 = sext i32 %259 to i64
%262 = getelementptr inbounds i32, i32* %258, i64 %261
store i32 %257, i32* %262
%263 = load i32, i32* %8
%264 = add nsw i32 %263, 3
store i32 %264, i32* %8
br label %265
265: ; preds = %256, %251
br label %266
266: ; preds = %265, %250
br label %290
267: ; preds = %191, %185
%268 = load i8*, i8** %6
%269 = getelementptr inbounds i8, i8* %268, i32 1
store i8* %269, i8** %6
store i8 63, i8* %268
%270 = load i8*, i8** %6
%271 = getelementptr inbounds i8, i8* %270, i32 1
store i8* %271, i8** %6
store i8 63, i8* %270
%272 = load i32*, i32** %5
%273 = icmp ne i32* %272, null
br i1 %273, label %274, label %289
274: ; preds = %267
%275 = load i32, i32* %8
%276 = add nsw i32 %275, 1
store i32 %276, i32* %8
%277 = load i32*, i32** %5
%278 = load i32, i32* %9
%279 = add nsw i32 %278, 1
store i32 %279, i32* %9
%280 = sext i32 %278 to i64
%281 = getelementptr inbounds i32, i32* %277, i64 %280
store i32 %275, i32* %281
%282 = load i32, i32* %8
%283 = add nsw i32 %282, 1
store i32 %283, i32* %8
%284 = load i32*, i32** %5
%285 = load i32, i32* %9
%286 = add nsw i32 %285, 1
store i32 %286, i32* %9
%287 = sext i32 %285 to i64
%288 = getelementptr inbounds i32, i32* %284, i64 %287
store i32 %282, i32* %288
br label %289
289: ; preds = %274, %267
br label %290
290: ; preds = %289, %266
br label %305
291: ; preds = %179, %173
%292 = load i8*, i8** %6
%293 = getelementptr inbounds i8, i8* %292, i32 1
store i8* %293, i8** %6
store i8 63, i8* %292
%294 = load i32*, i32** %5
%295 = icmp ne i32* %294, null
br i1 %295, label %296, label %304
296: ; preds = %291
%297 = load i32, i32* %8
%298 = add nsw i32 %297, 1
store i32 %298, i32* %8
%299 = load i32*, i32** %5
%300 = load i32, i32* %9
%301 = add nsw i32 %300, 1
store i32 %301, i32* %9
%302 = sext i32 %300 to i64
%303 = getelementptr inbounds i32, i32* %299, i64 %302
store i32 %297, i32* %303
br label %304
304: ; preds = %296, %291
br label %305
305: ; preds = %304, %290
br label %520
306: ; preds = %168
%307 = load i8*, i8** %6
%308 = load i8, i8* %307
%309 = zext i8 %308 to i32
%310 = icmp sle i32 %309, 247
br i1 %310, label %311, label %505
311: ; preds = %306
%312 = load i8*, i8** %6
%313 = getelementptr inbounds i8, i8* %312, i64 1
%314 = load i8, i8* %313
%315 = zext i8 %314 to i32
%316 = icmp sge i32 %315, 128
br i1 %316, label %317, label %490
317: ; preds = %311
%318 = load i8*, i8** %6
%319 = getelementptr inbounds i8, i8* %318, i64 1
%320 = load i8, i8* %319
%321 = zext i8 %320 to i32
%322 = icmp sle i32 %321, 191
br i1 %322, label %323, label %490
323: ; preds = %317
%324 = load i8*, i8** %6
%325 = getelementptr inbounds i8, i8* %324, i64 2
%326 = load i8, i8* %325
%327 = zext i8 %326 to i32
%328 = icmp sge i32 %327, 128
br i1 %328, label %329, label %466
329: ; preds = %323
%330 = load i8*, i8** %6
%331 = getelementptr inbounds i8, i8* %330, i64 2
%332 = load i8, i8* %331
%333 = zext i8 %332 to i32
%334 = icmp sle i32 %333, 191
br i1 %334, label %335, label %466
335: ; preds = %329
%336 = load i8*, i8** %6
%337 = getelementptr inbounds i8, i8* %336, i64 3
%338 = load i8, i8* %337
%339 = zext i8 %338 to i32
%340 = icmp sge i32 %339, 128
br i1 %340, label %341, label %433
341: ; preds = %335
%342 = load i8*, i8** %6
%343 = getelementptr inbounds i8, i8* %342, i64 3
%344 = load i8, i8* %343
%345 = zext i8 %344 to i32
%346 = icmp sle i32 %345, 191
br i1 %346, label %347, label %433
347: ; preds = %341
%348 = load i8*, i8** %6
%349 = getelementptr inbounds i8, i8* %348, i64 0
%350 = load i8, i8* %349
%351 = zext i8 %350 to i32
%352 = and i32 %351, 7
%353 = shl i32 %352, 18
%354 = load i8*, i8** %6
%355 = getelementptr inbounds i8, i8* %354, i64 1
%356 = load i8, i8* %355
%357 = zext i8 %356 to i32
%358 = and i32 %357, 63
%359 = shl i32 %358, 12
%360 = or i32 %353, %359
%361 = load i8*, i8** %6
%362 = getelementptr inbounds i8, i8* %361, i64 2
%363 = load i8, i8* %362
%364 = zext i8 %363 to i32
%365 = and i32 %364, 63
%366 = shl i32 %365, 6
%367 = or i32 %360, %366
%368 = load i8*, i8** %6
%369 = getelementptr inbounds i8, i8* %368, i64 3
%370 = load i8, i8* %369
%371 = zext i8 %370 to i32
%372 = and i32 %371, 63
%373 = or i32 %367, %372
store i32 %373, i32* %7
%374 = load i32, i32* %7
%375 = icmp slt i32 %374, 65536
br i1 %375, label %376, label %417
376: ; preds = %347
%377 = load i8*, i8** %6
%378 = getelementptr inbounds i8, i8* %377, i32 1
store i8* %378, i8** %6
store i8 63, i8* %377
%379 = load i8*, i8** %6
%380 = getelementptr inbounds i8, i8* %379, i32 1
store i8* %380, i8** %6
store i8 63, i8* %379
%381 = load i8*, i8** %6
%382 = getelementptr inbounds i8, i8* %381, i32 1
store i8* %382, i8** %6
store i8 63, i8* %381
%383 = load i8*, i8** %6
%384 = getelementptr inbounds i8, i8* %383, i32 1
store i8* %384, i8** %6
store i8 63, i8* %383
%385 = load i32*, i32** %5
%386 = icmp ne i32* %385, null
br i1 %386, label %387, label %416
387: ; preds = %376
%388 = load i32, i32* %8
%389 = add nsw i32 %388, 1
store i32 %389, i32* %8
%390 = load i32*, i32** %5
%391 = load i32, i32* %9
%392 = add nsw i32 %391, 1
store i32 %392, i32* %9
%393 = sext i32 %391 to i64
%394 = getelementptr inbounds i32, i32* %390, i64 %393
store i32 %388, i32* %394
%395 = load i32, i32* %8
%396 = add nsw i32 %395, 1
store i32 %396, i32* %8
%397 = load i32*, i32** %5
%398 = load i32, i32* %9
%399 = add nsw i32 %398, 1
store i32 %399, i32* %9
%400 = sext i32 %398 to i64
%401 = getelementptr inbounds i32, i32* %397, i64 %400
store i32 %395, i32* %401
%402 = load i32, i32* %8
%403 = add nsw i32 %402, 1
store i32 %403, i32* %8
%404 = load i32*, i32** %5
%405 = load i32, i32* %9
%406 = add nsw i32 %405, 1
store i32 %406, i32* %9
%407 = sext i32 %405 to i64
%408 = getelementptr inbounds i32, i32* %404, i64 %407
store i32 %402, i32* %408
%409 = load i32, i32* %8
%410 = add nsw i32 %409, 1
store i32 %410, i32* %8
%411 = load i32*, i32** %5
%412 = load i32, i32* %9
%413 = add nsw i32 %412, 1
store i32 %413, i32* %9
%414 = sext i32 %412 to i64
%415 = getelementptr inbounds i32, i32* %411, i64 %414
store i32 %409, i32* %415
br label %416
416: ; preds = %387, %376
br label %432
417: ; preds = %347
%418 = load i8*, i8** %6
%419 = getelementptr inbounds i8, i8* %418, i64 4
store i8* %419, i8** %6
%420 = load i32*, i32** %5
%421 = icmp ne i32* %420, null
br i1 %421, label %422, label %431
422: ; preds = %417
%423 = load i32, i32* %8
%424 = load i32*, i32** %5
%425 = load i32, i32* %9
%426 = add nsw i32 %425, 1
store i32 %426, i32* %9
%427 = sext i32 %425 to i64
%428 = getelementptr inbounds i32, i32* %424, i64 %427
store i32 %423, i32* %428
%429 = load i32, i32* %8
%430 = add nsw i32 %429, 4
store i32 %430, i32* %8
br label %431
431: ; preds = %422, %417
br label %432
432: ; preds = %431, %416
br label %465
433: ; preds = %341, %335
%434 = load i8*, i8** %6
%435 = getelementptr inbounds i8, i8* %434, i32 1
store i8* %435, i8** %6
store i8 63, i8* %434
%436 = load i8*, i8** %6
%437 = getelementptr inbounds i8, i8* %436, i32 1
store i8* %437, i8** %6
store i8 63, i8* %436
%438 = load i8*, i8** %6
%439 = getelementptr inbounds i8, i8* %438, i32 1
store i8* %439, i8** %6
store i8 63, i8* %438
%440 = load i32*, i32** %5
%441 = icmp ne i32* %440, null
br i1 %441, label %442, label %464
442: ; preds = %433
%443 = load i32, i32* %8
%444 = add nsw i32 %443, 1
store i32 %444, i32* %8
%445 = load i32*, i32** %5
%446 = load i32, i32* %9
%447 = add nsw i32 %446, 1
store i32 %447, i32* %9
%448 = sext i32 %446 to i64
%449 = getelementptr inbounds i32, i32* %445, i64 %448
store i32 %443, i32* %449
%450 = load i32, i32* %8
%451 = add nsw i32 %450, 1
store i32 %451, i32* %8
%452 = load i32*, i32** %5
%453 = load i32, i32* %9
%454 = add nsw i32 %453, 1
store i32 %454, i32* %9
%455 = sext i32 %453 to i64
%456 = getelementptr inbounds i32, i32* %452, i64 %455
store i32 %450, i32* %456
%457 = load i32, i32* %8
%458 = add nsw i32 %457, 1
store i32 %458, i32* %8
%459 = load i32*, i32** %5
%460 = load i32, i32* %9
%461 = add nsw i32 %460, 1
store i32 %461, i32* %9
%462 = sext i32 %460 to i64
%463 = getelementptr inbounds i32, i32* %459, i64 %462
store i32 %457, i32* %463
br label %464
464: ; preds = %442, %433
br label %465
465: ; preds = %464, %432
br label %489
466: ; preds = %329, %323
%467 = load i8*, i8** %6
%468 = getelementptr inbounds i8, i8* %467, i32 1
store i8* %468, i8** %6
store i8 63, i8* %467
%469 = load i8*, i8** %6
%470 = getelementptr inbounds i8, i8* %469, i32 1
store i8* %470, i8** %6
store i8 63, i8* %469
%471 = load i32*, i32** %5
%472 = icmp ne i32* %471, null
br i1 %472, label %473, label %488
473: ; preds = %466
%474 = load i32, i32* %8
%475 = add nsw i32 %474, 1
store i32 %475, i32* %8
%476 = load i32*, i32** %5
%477 = load i32, i32* %9
%478 = add nsw i32 %477, 1
store i32 %478, i32* %9
%479 = sext i32 %477 to i64
%480 = getelementptr inbounds i32, i32* %476, i64 %479
store i32 %474, i32* %480
%481 = load i32, i32* %8
%482 = add nsw i32 %481, 1
store i32 %482, i32* %8
%483 = load i32*, i32** %5
%484 = load i32, i32* %9
%485 = add nsw i32 %484, 1
store i32 %485, i32* %9
%486 = sext i32 %484 to i64
%487 = getelementptr inbounds i32, i32* %483, i64 %486
store i32 %481, i32* %487
br label %488
488: ; preds = %473, %466
br label %489
489: ; preds = %488, %465
br label %504
490: ; preds = %317, %311
%491 = load i8*, i8** %6
%492 = getelementptr inbounds i8, i8* %491, i32 1
store i8* %492, i8** %6
store i8 63, i8* %491
%493 = load i32*, i32** %5
%494 = icmp ne i32* %493, null
br i1 %494, label %495, label %503
495: ; preds = %490
%496 = load i32, i32* %8
%497 = add nsw i32 %496, 1
store i32 %497, i32* %8
%498 = load i32*, i32** %5
%499 = load i32, i32* %9
%500 = add nsw i32 %499, 1
store i32 %500, i32* %9
%501 = sext i32 %499 to i64
%502 = getelementptr inbounds i32, i32* %498, i64 %501
store i32 %496, i32* %502
br label %503
503: ; preds = %495, %490
br label %504
504: ; preds = %503, %489
br label %519
505: ; preds = %306
%506 = load i8*, i8** %6
%507 = getelementptr inbounds i8, i8* %506, i32 1
store i8* %507, i8** %6
store i8 63, i8* %506
%508 = load i32*, i32** %5
%509 = icmp ne i32* %508, null
br i1 %509, label %510, label %518
510: ; preds = %505
%511 = load i32, i32* %8
%512 = add nsw i32 %511, 1
store i32 %512, i32* %8
%513 = load i32*, i32** %5
%514 = load i32, i32* %9
%515 = add nsw i32 %514, 1
store i32 %515, i32* %9
%516 = sext i32 %514 to i64
%517 = getelementptr inbounds i32, i32* %513, i64 %516
store i32 %511, i32* %517
br label %518
518: ; preds = %510, %505
br label %519
519: ; preds = %518, %504
br label %520
520: ; preds = %519, %305
br label %521
521: ; preds = %520, %167
br label %522
522: ; preds = %521, %81
br label %523
523: ; preds = %522, %62
br label %524
524: ; preds = %523, %43
br label %21
525: ; preds = %21
%526 = load i32*, i32** %5
%527 = icmp ne i32* %526, null
br i1 %527, label %528, label %534
528: ; preds = %525
%529 = load i32, i32* %8
%530 = load i32*, i32** %5
%531 = load i32, i32* %9
%532 = sext i32 %531 to i64
%533 = getelementptr inbounds i32, i32* %530, i64 %532
store i32 %529, i32* %533
br label %534
534: ; preds = %528, %525
%535 = load i32, i32* %9
store i32 %535, i32* %3
br label %536
536: ; preds = %534, %19
%537 = load i32, i32* %3
ret i32 %537
}

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