#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 */
typedef int /*<<< orphan*/ wchar_t;
struct TYPE_3__ {
  int /*<<< orphan*/ member_0;
};
typedef TYPE_1__ mbstate_t;

/* Variables and functions */
int /*<<< orphan*/ CODESET;
int /*<<< orphan*/ LC_CTYPE;
int /*<<< orphan*/ free(char *);
scalar_t__ malloc(int);
scalar_t__ mbrtowc(int /*<<< orphan*/ *, char *, int, TYPE_1__ *);
int /*<<< orphan*/ nl_langinfo(int /*<<< orphan*/);
scalar_t__ setlocale(int /*<<< orphan*/, char *);
scalar_t__ strcmp(int /*<<< orphan*/, char *);
size_t b_utf8_onebyone(void *dummy) {
  char *buf;
  wchar_t wc;
  size_t i, j, k, l;
  size_t cs;
  mbstate_t st = {0};
  setlocale(LC_CTYPE, "C.UTF-8") || setlocale(LC_CTYPE, "en_US.UTF-8") ||
      setlocale(LC_CTYPE, "en_GB.UTF-8") || setlocale(LC_CTYPE, "en.UTF-8") ||
      setlocale(LC_CTYPE, "de_DE-8") || setlocale(LC_CTYPE, "fr_FR-8");
  if (strcmp(nl_langinfo(CODESET), "UTF-8"))
    return -1;
  buf = (char *)malloc(500000);
  l = 0;
  for (i = 0xc3; i < 0xe0; i++)
    for (j = 0x80; j < 0xc0; j++)
      buf[l++] = i, buf[l++] = j;
  for (i = 0xe1; i < 0xed; i++)
    for (j = 0x80; j < 0xc0; j++)
      for (k = 0x80; k < 0xc0; k++)
        buf[l++] = i, buf[l++] = j, buf[l++] = k;
  for (i = 0xf1; i < 0xf4; i++)
    for (j = 0x80; j < 0xc0; j++)
      for (k = 0x80; k < 0xc0; k++)
        buf[l++] = i, buf[l++] = j, buf[l++] = 0x80, buf[l++] = k;
  buf[l++] = 0;
  for (i = 0; i < 50; i++) {
    for (j = 0; buf[j]; j += mbrtowc(&wc, buf + j, 4, &st))
      ;
  }
  free(buf);
  return cs;
}


x86 assembly (clang, -O0):
<b_utf8_onebyone>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
lea    -0x50(%rbp),%rdi
xor    %esi,%esi
mov    $0x4,%edx
call   1050 <memset@plt>
mov    0x2e55(%rip),%rax
mov    (%rax),%edi
lea    0xe64(%rip),%rsi
call   1090 <setlocale@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x51(%rbp)
jne    126e <b_utf8_onebyone+0xfe>
mov    0x2e2e(%rip),%rax
mov    (%rax),%edi
lea    0xe45(%rip),%rsi
call   1090 <setlocale@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x51(%rbp)
jne    126e <b_utf8_onebyone+0xfe>
mov    0x2e07(%rip),%rax
mov    (%rax),%edi
lea    0xe2a(%rip),%rsi
call   1090 <setlocale@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x51(%rbp)
jne    126e <b_utf8_onebyone+0xfe>
mov    0x2de0(%rip),%rax
mov    (%rax),%edi
lea    0xe0f(%rip),%rsi
call   1090 <setlocale@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x51(%rbp)
jne    126e <b_utf8_onebyone+0xfe>
mov    0x2db9(%rip),%rax
mov    (%rax),%edi
lea    0xdf1(%rip),%rsi
call   1090 <setlocale@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x51(%rbp)
jne    126e <b_utf8_onebyone+0xfe>
mov    0x2d92(%rip),%rax
mov    (%rax),%edi
lea    0xdd2(%rip),%rsi
call   1090 <setlocale@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
mov    0x2d68(%rip),%rax
mov    (%rax),%edi
call   1080 <nl_langinfo@plt>
mov    %eax,%edi
lea    0xd92(%rip),%rsi
call   1060 <strcmp@plt>
cmp    $0x0,%rax
je     12a4 <b_utf8_onebyone+0x134>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    1599 <b_utf8_onebyone+0x429>
mov    $0x7a120,%edi
call   1070 <malloc@plt>
mov    %rax,-0x18(%rbp)
movq   $0x0,-0x40(%rbp)
movq   $0xc3,-0x28(%rbp)
cmpq   $0xe0,-0x28(%rbp)
jae    1345 <b_utf8_onebyone+0x1d5>
movq   $0x80,-0x30(%rbp)
cmpq   $0xc0,-0x30(%rbp)
jae    132f <b_utf8_onebyone+0x1bf>
mov    -0x28(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    12d8 <b_utf8_onebyone+0x168>
jmp    1334 <b_utf8_onebyone+0x1c4>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    12c2 <b_utf8_onebyone+0x152>
movq   $0xe1,-0x28(%rbp)
cmpq   $0xed,-0x28(%rbp)
jae    1418 <b_utf8_onebyone+0x2a8>
movq   $0x80,-0x30(%rbp)
cmpq   $0xc0,-0x30(%rbp)
jae    1402 <b_utf8_onebyone+0x292>
movq   $0x80,-0x38(%rbp)
cmpq   $0xc0,-0x38(%rbp)
jae    13ec <b_utf8_onebyone+0x27c>
mov    -0x28(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1379 <b_utf8_onebyone+0x209>
jmp    13f1 <b_utf8_onebyone+0x281>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1363 <b_utf8_onebyone+0x1f3>
jmp    1407 <b_utf8_onebyone+0x297>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    134d <b_utf8_onebyone+0x1dd>
movq   $0xf1,-0x28(%rbp)
cmpq   $0xf4,-0x28(%rbp)
jae    1502 <b_utf8_onebyone+0x392>
movq   $0x80,-0x30(%rbp)
cmpq   $0xc0,-0x30(%rbp)
jae    14ec <b_utf8_onebyone+0x37c>
movq   $0x80,-0x38(%rbp)
cmpq   $0xc0,-0x38(%rbp)
jae    14d6 <b_utf8_onebyone+0x366>
mov    -0x28(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x40(%rbp)
movb   $0x80,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    144c <b_utf8_onebyone+0x2dc>
jmp    14db <b_utf8_onebyone+0x36b>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1436 <b_utf8_onebyone+0x2c6>
jmp    14f1 <b_utf8_onebyone+0x381>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1420 <b_utf8_onebyone+0x2b0>
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x40(%rbp)
movb   $0x0,(%rax,%rcx,1)
movq   $0x0,-0x28(%rbp)
cmpq   $0x32,-0x28(%rbp)
jae    1588 <b_utf8_onebyone+0x418>
movq   $0x0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     1572 <b_utf8_onebyone+0x402>
jmp    154b <b_utf8_onebyone+0x3db>
mov    -0x18(%rbp),%rsi
add    -0x30(%rbp),%rsi
lea    -0x1c(%rbp),%rdi
mov    $0x4,%edx
lea    -0x50(%rbp),%rcx
call   1040 <mbrtowc@plt>
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    1534 <b_utf8_onebyone+0x3c4>
jmp    1577 <b_utf8_onebyone+0x407>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1521 <b_utf8_onebyone+0x3b1>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0x48(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<b_utf8_onebyone>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x10,%rsp
movl   $0x0,0x8(%rsp)
mov    0x2e6c(%rip),%rbx
mov    (%rbx),%edi
lea    0xefb(%rip),%rsi
call   1080 <setlocale@plt>
test   %rax,%rax
jne    11e9 <b_utf8_onebyone+0x89>
mov    (%rbx),%edi
lea    0xef0(%rip),%rsi
call   1080 <setlocale@plt>
test   %rax,%rax
jne    11e9 <b_utf8_onebyone+0x89>
mov    (%rbx),%edi
lea    0xee9(%rip),%rsi
call   1080 <setlocale@plt>
test   %rax,%rax
jne    11e9 <b_utf8_onebyone+0x89>
mov    (%rbx),%edi
lea    0xee2(%rip),%rsi
call   1080 <setlocale@plt>
test   %rax,%rax
jne    11e9 <b_utf8_onebyone+0x89>
mov    (%rbx),%edi
lea    0xed8(%rip),%rsi
call   1080 <setlocale@plt>
test   %rax,%rax
jne    11e9 <b_utf8_onebyone+0x89>
mov    (%rbx),%edi
lea    0xecd(%rip),%rsi
call   1080 <setlocale@plt>
mov    0x2df0(%rip),%rax
mov    (%rax),%edi
call   1070 <nl_langinfo@plt>
lea    0xe9c(%rip),%rsi
mov    %eax,%edi
call   1050 <strcmp@plt>
test   %rax,%rax
jne    1548 <b_utf8_onebyone+0x3e8>
mov    $0x7a120,%edi
call   1060 <malloc@plt>
mov    %rax,%rbx
lea    0x1(%rax),%rcx
mov    $0xc3,%edx
xor    %eax,%eax
movdqa 0xdd1(%rip),%xmm8
movdqa 0xdd8(%rip),%xmm9
movdqa 0xde0(%rip),%xmm2
movdqa 0xde8(%rip),%xmm3
movdqa 0xdf0(%rip),%xmm4
movdqa 0xdf8(%rip),%xmm5
movdqa 0xe00(%rip),%xmm6
movdqa 0xe08(%rip),%xmm7
jmp    1300 <b_utf8_onebyone+0x1a0>
nopl   (%rax)
movzbl %dl,%esi
movd   %esi,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm1
movdqa %xmm1,%xmm0
punpcklbw %xmm8,%xmm0
movdqu %xmm0,(%rbx,%rax,1)
movdqa %xmm1,%xmm0
punpcklbw %xmm9,%xmm0
movdqu %xmm0,0x10(%rbx,%rax,1)
movdqa %xmm1,%xmm0
punpcklbw %xmm2,%xmm0
movdqu %xmm0,0x20(%rbx,%rax,1)
movdqa %xmm1,%xmm0
punpcklbw %xmm3,%xmm0
movdqu %xmm0,0x30(%rbx,%rax,1)
movdqa %xmm1,%xmm0
punpcklbw %xmm4,%xmm0
movdqu %xmm0,0x40(%rbx,%rax,1)
movdqa %xmm1,%xmm0
punpcklbw %xmm5,%xmm0
movdqu %xmm0,0x50(%rbx,%rax,1)
movdqa %xmm1,%xmm0
punpcklbw %xmm6,%xmm0
movdqu %xmm0,0x60(%rbx,%rax,1)
punpcklbw %xmm7,%xmm1
movdqu %xmm1,0x70(%rbx,%rax,1)
add    $0x80,%rax
add    $0x1,%rdx
cmp    $0xe0,%rdx
je     1353 <b_utf8_onebyone+0x1f3>
lea    (%rbx,%rax,1),%rsi
lea    (%rbx,%rax,1),%rdi
add    $0x7e,%rdi
cmp    %rsi,%rdi
jb     1326 <b_utf8_onebyone+0x1c6>
lea    (%rcx,%rax,1),%rsi
lea    (%rcx,%rax,1),%rdi
add    $0x7e,%rdi
cmp    %rsi,%rdi
jae    1270 <b_utf8_onebyone+0x110>
mov    $0xffffffffffffffc0,%rsi
nopl   (%rax)
mov    %dl,(%rbx,%rax,1)
lea    -0x40(%rsi),%edi
mov    %dil,0x1(%rbx,%rax,1)
mov    %dl,0x2(%rbx,%rax,1)
lea    -0x3f(%rsi),%edi
mov    %dil,0x3(%rbx,%rax,1)
add    $0x4,%rax
add    $0x2,%rsi
jne    1330 <b_utf8_onebyone+0x1d0>
jmp    12f3 <b_utf8_onebyone+0x193>
mov    $0xe1,%ecx
nopl   0x0(%rax,%rax,1)
mov    $0x80,%edx
cs nopw 0x0(%rax,%rax,1)
nop
mov    $0xffffffffffffffc0,%rsi
nopw   0x0(%rax,%rax,1)
mov    %cl,(%rbx,%rax,1)
mov    %dl,0x1(%rbx,%rax,1)
lea    -0x40(%rsi),%edi
mov    %dil,0x2(%rbx,%rax,1)
mov    %cl,0x3(%rbx,%rax,1)
mov    %dl,0x4(%rbx,%rax,1)
lea    -0x3f(%rsi),%edi
mov    %dil,0x5(%rbx,%rax,1)
add    $0x6,%rax
add    $0x2,%rsi
jne    1380 <b_utf8_onebyone+0x220>
add    $0x1,%rdx
cmp    $0xc0,%rdx
jne    1370 <b_utf8_onebyone+0x210>
add    $0x1,%rcx
cmp    $0xed,%rcx
jne    1360 <b_utf8_onebyone+0x200>
mov    $0x80,%ecx
nopl   0x0(%rax,%rax,1)
mov    $0xffffffffffffffc0,%rdx
nopw   0x0(%rax,%rax,1)
movb   $0xf1,(%rbx,%rax,1)
mov    %cl,0x1(%rbx,%rax,1)
movb   $0x80,0x2(%rbx,%rax,1)
lea    -0x40(%rdx),%esi
mov    %sil,0x3(%rbx,%rax,1)
movb   $0xf1,0x4(%rbx,%rax,1)
mov    %cl,0x5(%rbx,%rax,1)
movb   $0x80,0x6(%rbx,%rax,1)
lea    -0x3f(%rdx),%esi
mov    %sil,0x7(%rbx,%rax,1)
add    $0x8,%rax
add    $0x2,%rdx
jne    13e0 <b_utf8_onebyone+0x280>
add    $0x1,%rcx
cmp    $0xc0,%rcx
jne    13d0 <b_utf8_onebyone+0x270>
mov    $0x80,%ecx
nopw   0x0(%rax,%rax,1)
mov    $0xffffffffffffffc0,%rdx
nopw   0x0(%rax,%rax,1)
movb   $0xf2,(%rbx,%rax,1)
mov    %cl,0x1(%rbx,%rax,1)
movb   $0x80,0x2(%rbx,%rax,1)
lea    -0x40(%rdx),%esi
mov    %sil,0x3(%rbx,%rax,1)
movb   $0xf2,0x4(%rbx,%rax,1)
mov    %cl,0x5(%rbx,%rax,1)
movb   $0x80,0x6(%rbx,%rax,1)
lea    -0x3f(%rdx),%esi
mov    %sil,0x7(%rbx,%rax,1)
add    $0x8,%rax
add    $0x2,%rdx
jne    1440 <b_utf8_onebyone+0x2e0>
add    $0x1,%rcx
cmp    $0xc0,%rcx
jne    1430 <b_utf8_onebyone+0x2d0>
mov    $0x80,%ecx
nopw   0x0(%rax,%rax,1)
mov    $0xffffffffffffffc0,%rdx
nopw   0x0(%rax,%rax,1)
movb   $0xf3,(%rbx,%rax,1)
mov    %cl,0x1(%rbx,%rax,1)
movb   $0x80,0x2(%rbx,%rax,1)
lea    -0x40(%rdx),%esi
mov    %sil,0x3(%rbx,%rax,1)
movb   $0xf3,0x4(%rbx,%rax,1)
mov    %cl,0x5(%rbx,%rax,1)
movb   $0x80,0x6(%rbx,%rax,1)
lea    -0x3f(%rdx),%esi
mov    %sil,0x7(%rbx,%rax,1)
add    $0x8,%rax
add    $0x2,%rdx
jne    14a0 <b_utf8_onebyone+0x340>
add    $0x1,%rcx
cmp    $0xc0,%rcx
jne    1490 <b_utf8_onebyone+0x330>
movb   $0x0,(%rbx,%rax,1)
xor    %r12d,%r12d
lea    0xc(%rsp),%r14
lea    0x8(%rsp),%r15
jmp    150a <b_utf8_onebyone+0x3aa>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%r12
cmp    $0x32,%r12
je     1540 <b_utf8_onebyone+0x3e0>
cmpb   $0x0,(%rbx)
je     1500 <b_utf8_onebyone+0x3a0>
mov    %rbx,%rsi
xor    %r13d,%r13d
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r14,%rdi
mov    $0x4,%edx
mov    %r15,%rcx
call   1040 <mbrtowc@plt>
add    %rax,%r13
lea    (%rbx,%r13,1),%rsi
cmpb   $0x0,(%rbx,%r13,1)
jne    1520 <b_utf8_onebyone+0x3c0>
jmp    1500 <b_utf8_onebyone+0x3a0>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    $0xffffffffffffffff,%rax
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
%struct.TYPE_3__ = type { i32 }
@LC_CTYPE = global i32 0
@.str = [8 x i8] c"C.UTF-8\00"
@.str.1 = [12 x i8] c"en_US.UTF-8\00"
@.str.2 = [12 x i8] c"en_GB.UTF-8\00"
@.str.3 = [9 x i8] c"en.UTF-8\00"
@.str.4 = [8 x i8] c"de_DE-8\00"
@.str.5 = [8 x i8] c"fr_FR-8\00"
@CODESET = global i32 0
@.str.6 = [6 x i8] c"UTF-8\00"
define i64 @b_utf8_onebyone(i8* %0) {
%2 = alloca i64
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca %struct.TYPE_3__
store i8* %0, i8** %3
%12 = bitcast %struct.TYPE_3__* %11 to i8*
%13 = load i32, i32* @LC_CTYPE
%14 = call i64 @setlocale(i32 %13, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0))
%15 = icmp ne i64 %14, 0
br i1 %15, label %36, label %16
16: ; preds = %1
%17 = load i32, i32* @LC_CTYPE
%18 = call i64 @setlocale(i32 %17, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i64 0, i64 0))
%19 = icmp ne i64 %18, 0
br i1 %19, label %36, label %20
20: ; preds = %16
%21 = load i32, i32* @LC_CTYPE
%22 = call i64 @setlocale(i32 %21, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.2, i64 0, i64 0))
%23 = icmp ne i64 %22, 0
br i1 %23, label %36, label %24
24: ; preds = %20
%25 = load i32, i32* @LC_CTYPE
%26 = call i64 @setlocale(i32 %25, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i64 0, i64 0))
%27 = icmp ne i64 %26, 0
br i1 %27, label %36, label %28
28: ; preds = %24
%29 = load i32, i32* @LC_CTYPE
%30 = call i64 @setlocale(i32 %29, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i64 0, i64 0))
%31 = icmp ne i64 %30, 0
br i1 %31, label %36, label %32
32: ; preds = %28
%33 = load i32, i32* @LC_CTYPE
%34 = call i64 @setlocale(i32 %33, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i64 0, i64 0))
%35 = icmp ne i64 %34, 0
br label %36
36: ; preds = %32, %28, %24, %20, %16, %1
%37 = phi i1 [ true, %28 ], [ true, %24 ], [ true, %20 ], [ true, %16 ], [ true, %1 ], [ %35, %32 ]
%38 = zext i1 %37 to i32
%39 = load i32, i32* @CODESET
%40 = call i32 @nl_langinfo(i32 %39)
%41 = call i64 @strcmp(i32 %40, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
%42 = icmp ne i64 %41, 0
br i1 %42, label %43, label %44
43: ; preds = %36
store i64 -1, i64* %2
br label %193
44: ; preds = %36
%45 = call i64 @malloc(i32 500000)
%46 = inttoptr i64 %45 to i8*
store i8* %46, i8** %4
store i64 0, i64* %9
store i64 195, i64* %6
br label %47
47: ; preds = %71, %44
%48 = load i64, i64* %6
%49 = icmp ult i64 %48, 224
br i1 %49, label %50, label %74
50: ; preds = %47
store i64 128, i64* %7
br label %51
51: ; preds = %67, %50
%52 = load i64, i64* %7
%53 = icmp ult i64 %52, 192
br i1 %53, label %54, label %70
54: ; preds = %51
%55 = load i64, i64* %6
%56 = trunc i64 %55 to i8
%57 = load i8*, i8** %4
%58 = load i64, i64* %9
%59 = add i64 %58, 1
store i64 %59, i64* %9
%60 = getelementptr inbounds i8, i8* %57, i64 %58
store i8 %56, i8* %60
%61 = load i64, i64* %7
%62 = trunc i64 %61 to i8
%63 = load i8*, i8** %4
%64 = load i64, i64* %9
%65 = add i64 %64, 1
store i64 %65, i64* %9
%66 = getelementptr inbounds i8, i8* %63, i64 %64
store i8 %62, i8* %66
br label %67
67: ; preds = %54
%68 = load i64, i64* %7
%69 = add i64 %68, 1
store i64 %69, i64* %7
br label %51
70: ; preds = %51
br label %71
71: ; preds = %70
%72 = load i64, i64* %6
%73 = add i64 %72, 1
store i64 %73, i64* %6
br label %47
74: ; preds = %47
store i64 225, i64* %6
br label %75
75: ; preds = %113, %74
%76 = load i64, i64* %6
%77 = icmp ult i64 %76, 237
br i1 %77, label %78, label %116
78: ; preds = %75
store i64 128, i64* %7
br label %79
79: ; preds = %109, %78
%80 = load i64, i64* %7
%81 = icmp ult i64 %80, 192
br i1 %81, label %82, label %112
82: ; preds = %79
store i64 128, i64* %8
br label %83
83: ; preds = %105, %82
%84 = load i64, i64* %8
%85 = icmp ult i64 %84, 192
br i1 %85, label %86, label %108
86: ; preds = %83
%87 = load i64, i64* %6
%88 = trunc i64 %87 to i8
%89 = load i8*, i8** %4
%90 = load i64, i64* %9
%91 = add i64 %90, 1
store i64 %91, i64* %9
%92 = getelementptr inbounds i8, i8* %89, i64 %90
store i8 %88, i8* %92
%93 = load i64, i64* %7
%94 = trunc i64 %93 to i8
%95 = load i8*, i8** %4
%96 = load i64, i64* %9
%97 = add i64 %96, 1
store i64 %97, i64* %9
%98 = getelementptr inbounds i8, i8* %95, i64 %96
store i8 %94, i8* %98
%99 = load i64, i64* %8
%100 = trunc i64 %99 to i8
%101 = load i8*, i8** %4
%102 = load i64, i64* %9
%103 = add i64 %102, 1
store i64 %103, i64* %9
%104 = getelementptr inbounds i8, i8* %101, i64 %102
store i8 %100, i8* %104
br label %105
105: ; preds = %86
%106 = load i64, i64* %8
%107 = add i64 %106, 1
store i64 %107, i64* %8
br label %83
108: ; preds = %83
br label %109
109: ; preds = %108
%110 = load i64, i64* %7
%111 = add i64 %110, 1
store i64 %111, i64* %7
br label %79
112: ; preds = %79
br label %113
113: ; preds = %112
%114 = load i64, i64* %6
%115 = add i64 %114, 1
store i64 %115, i64* %6
br label %75
116: ; preds = %75
store i64 241, i64* %6
br label %117
117: ; preds = %159, %116
%118 = load i64, i64* %6
%119 = icmp ult i64 %118, 244
br i1 %119, label %120, label %162
120: ; preds = %117
store i64 128, i64* %7
br label %121
121: ; preds = %155, %120
%122 = load i64, i64* %7
%123 = icmp ult i64 %122, 192
br i1 %123, label %124, label %158
124: ; preds = %121
store i64 128, i64* %8
br label %125
125: ; preds = %151, %124
%126 = load i64, i64* %8
%127 = icmp ult i64 %126, 192
br i1 %127, label %128, label %154
128: ; preds = %125
%129 = load i64, i64* %6
%130 = trunc i64 %129 to i8
%131 = load i8*, i8** %4
%132 = load i64, i64* %9
%133 = add i64 %132, 1
store i64 %133, i64* %9
%134 = getelementptr inbounds i8, i8* %131, i64 %132
store i8 %130, i8* %134
%135 = load i64, i64* %7
%136 = trunc i64 %135 to i8
%137 = load i8*, i8** %4
%138 = load i64, i64* %9
%139 = add i64 %138, 1
store i64 %139, i64* %9
%140 = getelementptr inbounds i8, i8* %137, i64 %138
store i8 %136, i8* %140
%141 = load i8*, i8** %4
%142 = load i64, i64* %9
%143 = add i64 %142, 1
store i64 %143, i64* %9
%144 = getelementptr inbounds i8, i8* %141, i64 %142
store i8 -128, i8* %144
%145 = load i64, i64* %8
%146 = trunc i64 %145 to i8
%147 = load i8*, i8** %4
%148 = load i64, i64* %9
%149 = add i64 %148, 1
store i64 %149, i64* %9
%150 = getelementptr inbounds i8, i8* %147, i64 %148
store i8 %146, i8* %150
br label %151
151: ; preds = %128
%152 = load i64, i64* %8
%153 = add i64 %152, 1
store i64 %153, i64* %8
br label %125
154: ; preds = %125
br label %155
155: ; preds = %154
%156 = load i64, i64* %7
%157 = add i64 %156, 1
store i64 %157, i64* %7
br label %121
158: ; preds = %121
br label %159
159: ; preds = %158
%160 = load i64, i64* %6
%161 = add i64 %160, 1
store i64 %161, i64* %6
br label %117
162: ; preds = %117
%163 = load i8*, i8** %4
%164 = load i64, i64* %9
%165 = add i64 %164, 1
store i64 %165, i64* %9
%166 = getelementptr inbounds i8, i8* %163, i64 %164
store i8 0, i8* %166
store i64 0, i64* %6
br label %167
167: ; preds = %186, %162
%168 = load i64, i64* %6
%169 = icmp ult i64 %168, 50
br i1 %169, label %170, label %189
170: ; preds = %167
store i64 0, i64* %7
br label %171
171: ; preds = %178, %170
%172 = load i8*, i8** %4
%173 = load i64, i64* %7
%174 = getelementptr inbounds i8, i8* %172, i64 %173
%175 = load i8, i8* %174
%176 = icmp ne i8 %175, 0
br i1 %176, label %177, label %185
177: ; preds = %171
br label %178
178: ; preds = %177
%179 = load i8*, i8** %4
%180 = load i64, i64* %7
%181 = getelementptr inbounds i8, i8* %179, i64 %180
%182 = call i64 @mbrtowc(i32* %5, i8* %181, i32 4, %struct.TYPE_3__* %11)
%183 = load i64, i64* %7
%184 = add i64 %183, %182
store i64 %184, i64* %7
br label %171
185: ; preds = %171
br label %186
186: ; preds = %185
%187 = load i64, i64* %6
%188 = add i64 %187, 1
store i64 %188, i64* %6
br label %167
189: ; preds = %167
%190 = load i8*, i8** %4
%191 = call i32 @free(i8* %190)
%192 = load i64, i64* %10
store i64 %192, i64* %2
br label %193
193: ; preds = %189, %43
%194 = load i64, i64* %2
ret i64 %194
}

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