#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int wchar_t;
typedef int /*<<< orphan*/ mbstate_t;

/* Variables and functions */
size_t wcrtomb(char *, int const, int /*<<< orphan*/);
size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n,
                 mbstate_t *restrict st) {
  const wchar_t *ws2;
  char buf[4];
  size_t N = n, l;
  if (!s) {
    for (n = 0, ws2 = *ws; *ws2; ws2++) {
      if (*ws2 >= 0x80u) {
        l = wcrtomb(buf, *ws2, 0);
        if (!(l + 1))
          return -1;
        n += l;
      } else
        n++;
    }
    return n;
  }
  while (n >= 4) {
    if (**ws - 1u >= 0x7fu) {
      if (!**ws) {
        *s = 0;
        *ws = 0;
        return N - n;
      }
      l = wcrtomb(s, **ws, 0);
      if (!(l + 1))
        return -1;
      s += l;
      n -= l;
    } else {
      *s++ = **ws;
      n--;
    }
    (*ws)++;
  }
  while (n) {
    if (**ws - 1u >= 0x7fu) {
      if (!**ws) {
        *s = 0;
        *ws = 0;
        return N - n;
      }
      l = wcrtomb(buf, **ws, 0);
      if (!(l + 1))
        return -1;
      if (l > n)
        return N - n;
      wcrtomb(s, **ws, 0);
      s += l;
      n -= l;
    } else {
      *s++ = **ws;
      n--;
    }
    (*ws)++;
  }
  return N;
}


x86 assembly (clang, -O0):
<wcsrtombs>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    11df <wcsrtombs+0xcf>
movq   $0x0,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmpl   $0x0,(%rax)
je     11d2 <wcsrtombs+0xc2>
mov    -0x30(%rbp),%rax
cmpl   $0x80,(%rax)
jb     11b0 <wcsrtombs+0xa0>
lea    -0x34(%rbp),%rdi
mov    -0x30(%rbp),%rax
mov    (%rax),%esi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
cmp    $0x0,%rax
jne    119f <wcsrtombs+0x8f>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    13ee <wcsrtombs+0x2de>
mov    -0x48(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    11bc <wcsrtombs+0xac>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11c1 <wcsrtombs+0xb1>
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
jmp    114e <wcsrtombs+0x3e>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13ee <wcsrtombs+0x2de>
jmp    11e4 <wcsrtombs+0xd4>
cmpq   $0x4,-0x20(%rbp)
jb     12c9 <wcsrtombs+0x1b9>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%eax
sub    $0x1,%eax
cmp    $0x7f,%eax
jb     128e <wcsrtombs+0x17e>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
cmpl   $0x0,(%rax)
jne    1237 <wcsrtombs+0x127>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x40(%rbp),%rax
sub    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13ee <wcsrtombs+0x2de>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%esi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
cmp    $0x0,%rax
jne    126e <wcsrtombs+0x15e>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    13ee <wcsrtombs+0x2de>
mov    -0x48(%rbp),%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x48(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
jmp    12b6 <wcsrtombs+0x1a6>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
add    $0x4,%rcx
mov    %rcx,(%rax)
jmp    11e4 <wcsrtombs+0xd4>
jmp    12ce <wcsrtombs+0x1be>
cmpq   $0x0,-0x20(%rbp)
je     13e6 <wcsrtombs+0x2d6>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%eax
sub    $0x1,%eax
cmp    $0x7f,%eax
jb     13ab <wcsrtombs+0x29b>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
cmpl   $0x0,(%rax)
jne    1321 <wcsrtombs+0x211>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x40(%rbp),%rax
sub    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13ee <wcsrtombs+0x2de>
lea    -0x34(%rbp),%rdi
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%esi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
cmp    $0x0,%rax
jne    1358 <wcsrtombs+0x248>
movq   $0xffffffffffffffff,-0x8(%rbp)
ff
jmp    13ee <wcsrtombs+0x2de>
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jbe    1377 <wcsrtombs+0x267>
mov    -0x40(%rbp),%rax
sub    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13ee <wcsrtombs+0x2de>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%esi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
mov    -0x48(%rbp),%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x48(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
jmp    13d3 <wcsrtombs+0x2c3>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    (%rax),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
add    $0x4,%rcx
mov    %rcx,(%rax)
jmp    12ce <wcsrtombs+0x1be>
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wcsrtombs>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%rcx
test   %rdi,%rdi
je     119f <wcsrtombs+0x8f>
mov    %rdx,%r14
mov    %rdi,%r13
cmp    $0x4,%rdx
mov    %rcx,0x10(%rsp)
jb     11fb <wcsrtombs+0xeb>
mov    (%rcx),%rbx
mov    %r14,%r15
jmp    1170 <wcsrtombs+0x60>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %sil,0x0(%r13)
add    $0x1,%r13
add    $0xffffffffffffffff,%r15
mov    (%rcx),%rbx
add    $0x4,%rbx
mov    %rbx,(%rcx)
cmp    $0x3,%r15
jbe    11fe <wcsrtombs+0xee>
mov    (%rbx),%esi
lea    -0x80(%rsi),%eax
cmp    $0xffffff80,%eax
ja     1150 <wcsrtombs+0x40>
test   %esi,%esi
je     127b <wcsrtombs+0x16b>
mov    %r13,%rdi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
cmp    $0xffffffffffffffff,%rax
je     11ef <wcsrtombs+0xdf>
add    %rax,%r13
sub    %rax,%r15
mov    0x10(%rsp),%rcx
jmp    115f <wcsrtombs+0x4f>
mov    (%rcx),%rbp
mov    0x0(%rbp),%esi
test   %esi,%esi
je     1276 <wcsrtombs+0x166>
add    $0x4,%rbp
xor    %r14d,%r14d
lea    0xc(%rsp),%rbx
jmp    11d2 <wcsrtombs+0xc2>
nopl   0x0(%rax,%rax,1)
add    %rax,%r14
mov    0x0(%rbp),%esi
add    $0x4,%rbp
test   %esi,%esi
je     128a <wcsrtombs+0x17a>
mov    $0x1,%eax
cmp    $0x80,%esi
jb     11c0 <wcsrtombs+0xb0>
mov    %rbx,%rdi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
cmp    $0xffffffffffffffff,%rax
jne    11c0 <wcsrtombs+0xb0>
mov    $0xffffffffffffffff,%r14
jmp    128a <wcsrtombs+0x17a>
mov    %r14,%r15
test   %r15,%r15
je     128a <wcsrtombs+0x17a>
mov    (%rcx),%r12
jmp    122e <wcsrtombs+0x11e>
nopl   0x0(%rax)
mov    %sil,0x0(%r13)
add    $0x1,%r13
add    $0xffffffffffffffff,%r15
mov    (%rcx),%r12
mov    %r15,%rbp
add    $0x4,%r12
mov    %r12,(%rcx)
test   %rbp,%rbp
je     128a <wcsrtombs+0x17a>
mov    (%r12),%esi
lea    -0x80(%rsi),%eax
cmp    $0xffffff80,%eax
ja     1210 <wcsrtombs+0x100>
test   %esi,%esi
je     127b <wcsrtombs+0x16b>
lea    0xc(%rsp),%rdi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
cmp    $0xffffffffffffffff,%rax
je     11ef <wcsrtombs+0xdf>
mov    %rax,%rbx
mov    %r15,%rbp
sub    %rax,%rbp
jb     1287 <wcsrtombs+0x177>
mov    (%r12),%esi
mov    %r13,%rdi
xor    %edx,%edx
call   1030 <wcrtomb@plt>
add    %rbx,%r13
mov    %rbp,%r15
mov    0x10(%rsp),%rcx
jmp    1222 <wcsrtombs+0x112>
xor    %r14d,%r14d
jmp    128a <wcsrtombs+0x17a>
movb   $0x0,0x0(%r13)
movq   $0x0,(%rcx)
sub    %r15,%r14
mov    %r14,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i64 @wcsrtombs(i8* noalias %0, i32** noalias %1, i64 %2, i32* noalias %3) {
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i32**
%8 = alloca i64
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca [4 x i8]
%12 = alloca i64
%13 = alloca i64
store i8* %0, i8** %6
store i32** %1, i32*** %7
store i64 %2, i64* %8
store i32* %3, i32** %9
%14 = load i64, i64* %8
store i64 %14, i64* %12
%15 = load i8*, i8** %6
%16 = icmp ne i8* %15, null
br i1 %16, label %50, label %17
17: ; preds = %4
store i64 0, i64* %8
%18 = load i32**, i32*** %7
%19 = load i32*, i32** %18
store i32* %19, i32** %10
br label %20
20: ; preds = %45, %17
%21 = load i32*, i32** %10
%22 = load i32, i32* %21
%23 = icmp ne i32 %22, 0
br i1 %23, label %24, label %48
24: ; preds = %20
%25 = load i32*, i32** %10
%26 = load i32, i32* %25
%27 = icmp uge i32 %26, 128
br i1 %27, label %28, label %41
28: ; preds = %24
%29 = getelementptr inbounds [4 x i8], [4 x i8]* %11, i64 0, i64 0
%30 = load i32*, i32** %10
%31 = load i32, i32* %30
%32 = call i64 @wcrtomb(i8* %29, i32 %31, i32 0)
store i64 %32, i64* %13
%33 = load i64, i64* %13
%34 = add i64 %33, 1
%35 = icmp ne i64 %34, 0
br i1 %35, label %37, label %36
36: ; preds = %28
store i64 -1, i64* %5
br label %167
37: ; preds = %28
%38 = load i64, i64* %13
%39 = load i64, i64* %8
%40 = add i64 %39, %38
store i64 %40, i64* %8
br label %44
41: ; preds = %24
%42 = load i64, i64* %8
%43 = add i64 %42, 1
store i64 %43, i64* %8
br label %44
44: ; preds = %41, %37
br label %45
45: ; preds = %44
%46 = load i32*, i32** %10
%47 = getelementptr inbounds i32, i32* %46, i32 1
store i32* %47, i32** %10
br label %20
48: ; preds = %20
%49 = load i64, i64* %8
store i64 %49, i64* %5
br label %167
50: ; preds = %4
br label %51
51: ; preds = %97, %50
%52 = load i64, i64* %8
%53 = icmp uge i64 %52, 4
br i1 %53, label %54, label %101
54: ; preds = %51
%55 = load i32**, i32*** %7
%56 = load i32*, i32** %55
%57 = load i32, i32* %56
%58 = sub i32 %57, 1
%59 = icmp uge i32 %58, 127
br i1 %59, label %60, label %88
60: ; preds = %54
%61 = load i32**, i32*** %7
%62 = load i32*, i32** %61
%63 = load i32, i32* %62
%64 = icmp ne i32 %63, 0
br i1 %64, label %71, label %65
65: ; preds = %60
%66 = load i8*, i8** %6
store i8 0, i8* %66
%67 = load i32**, i32*** %7
store i32* null, i32** %67
%68 = load i64, i64* %12
%69 = load i64, i64* %8
%70 = sub i64 %68, %69
store i64 %70, i64* %5
br label %167
71: ; preds = %60
%72 = load i8*, i8** %6
%73 = load i32**, i32*** %7
%74 = load i32*, i32** %73
%75 = load i32, i32* %74
%76 = call i64 @wcrtomb(i8* %72, i32 %75, i32 0)
store i64 %76, i64* %13
%77 = load i64, i64* %13
%78 = add i64 %77, 1
%79 = icmp ne i64 %78, 0
br i1 %79, label %81, label %80
80: ; preds = %71
store i64 -1, i64* %5
br label %167
81: ; preds = %71
%82 = load i64, i64* %13
%83 = load i8*, i8** %6
%84 = getelementptr inbounds i8, i8* %83, i64 %82
store i8* %84, i8** %6
%85 = load i64, i64* %13
%86 = load i64, i64* %8
%87 = sub i64 %86, %85
store i64 %87, i64* %8
br label %97
88: ; preds = %54
%89 = load i32**, i32*** %7
%90 = load i32*, i32** %89
%91 = load i32, i32* %90
%92 = trunc i32 %91 to i8
%93 = load i8*, i8** %6
%94 = getelementptr inbounds i8, i8* %93, i32 1
store i8* %94, i8** %6
store i8 %92, i8* %93
%95 = load i64, i64* %8
%96 = add i64 %95, -1
store i64 %96, i64* %8
br label %97
97: ; preds = %88, %81
%98 = load i32**, i32*** %7
%99 = load i32*, i32** %98
%100 = getelementptr inbounds i32, i32* %99, i32 1
store i32* %100, i32** %98
br label %51
101: ; preds = %51
br label %102
102: ; preds = %161, %101
%103 = load i64, i64* %8
%104 = icmp ne i64 %103, 0
br i1 %104, label %105, label %165
105: ; preds = %102
%106 = load i32**, i32*** %7
%107 = load i32*, i32** %106
%108 = load i32, i32* %107
%109 = sub i32 %108, 1
%110 = icmp uge i32 %109, 127
br i1 %110, label %111, label %152
111: ; preds = %105
%112 = load i32**, i32*** %7
%113 = load i32*, i32** %112
%114 = load i32, i32* %113
%115 = icmp ne i32 %114, 0
br i1 %115, label %122, label %116
116: ; preds = %111
%117 = load i8*, i8** %6
store i8 0, i8* %117
%118 = load i32**, i32*** %7
store i32* null, i32** %118
%119 = load i64, i64* %12
%120 = load i64, i64* %8
%121 = sub i64 %119, %120
store i64 %121, i64* %5
br label %167
122: ; preds = %111
%123 = getelementptr inbounds [4 x i8], [4 x i8]* %11, i64 0, i64 0
%124 = load i32**, i32*** %7
%125 = load i32*, i32** %124
%126 = load i32, i32* %125
%127 = call i64 @wcrtomb(i8* %123, i32 %126, i32 0)
store i64 %127, i64* %13
%128 = load i64, i64* %13
%129 = add i64 %128, 1
%130 = icmp ne i64 %129, 0
br i1 %130, label %132, label %131
131: ; preds = %122
store i64 -1, i64* %5
br label %167
132: ; preds = %122
%133 = load i64, i64* %13
%134 = load i64, i64* %8
%135 = icmp ugt i64 %133, %134
br i1 %135, label %136, label %140
136: ; preds = %132
%137 = load i64, i64* %12
%138 = load i64, i64* %8
%139 = sub i64 %137, %138
store i64 %139, i64* %5
br label %167
140: ; preds = %132
%141 = load i8*, i8** %6
%142 = load i32**, i32*** %7
%143 = load i32*, i32** %142
%144 = load i32, i32* %143
%145 = call i64 @wcrtomb(i8* %141, i32 %144, i32 0)
%146 = load i64, i64* %13
%147 = load i8*, i8** %6
%148 = getelementptr inbounds i8, i8* %147, i64 %146
store i8* %148, i8** %6
%149 = load i64, i64* %13
%150 = load i64, i64* %8
%151 = sub i64 %150, %149
store i64 %151, i64* %8
br label %161
152: ; preds = %105
%153 = load i32**, i32*** %7
%154 = load i32*, i32** %153
%155 = load i32, i32* %154
%156 = trunc i32 %155 to i8
%157 = load i8*, i8** %6
%158 = getelementptr inbounds i8, i8* %157, i32 1
store i8* %158, i8** %6
store i8 %156, i8* %157
%159 = load i64, i64* %8
%160 = add i64 %159, -1
store i64 %160, i64* %8
br label %161
161: ; preds = %152, %140
%162 = load i32**, i32*** %7
%163 = load i32*, i32** %162
%164 = getelementptr inbounds i32, i32* %163, i32 1
store i32* %164, i32** %162
br label %102
165: ; preds = %102
%166 = load i64, i64* %12
store i64 %166, i64* %5
br label %167
167: ; preds = %165, %136, %131, %116, %80, %65, %48, %36
%168 = load i64, i64* %5
ret i64 %168
}

LLVM IR (-O2):
define i64 @wcsrtombs(i8* noalias %0, i32** noalias nocapture %1, i64 %2, i32* noalias nocapture readnone %3) {
%5 = alloca [4 x i8]
%6 = getelementptr inbounds [4 x i8], [4 x i8]* %5, i64 0, i64 0
%7 = icmp eq i8* %0, null
br i1 %7, label %12, label %8
8: ; preds = %4
%9 = icmp ugt i64 %2, 3
br i1 %9, label %10, label %30
10: ; preds = %8
%11 = load i32*, i32** %1
br label %36
12: ; preds = %4
%13 = load i32*, i32** %1
%14 = load i32, i32* %13
%15 = icmp eq i32 %14, 0
br i1 %15, label %98, label %16
16: ; preds = %12, %24
%17 = phi i32 [ %28, %24 ], [ %14, %12 ]
%18 = phi i32* [ %27, %24 ], [ %13, %12 ]
%19 = phi i64 [ %26, %24 ], [ 0, %12 ]
%20 = icmp ugt i32 %17, 127
br i1 %20, label %21, label %24
21: ; preds = %16
%22 = call i64 @wcrtomb(i8* %6, i32 %17, i32 0)
%23 = icmp eq i64 %22, -1
br i1 %23, label %98, label %24
24: ; preds = %16, %21
%25 = phi i64 [ %22, %21 ], [ 1, %16 ]
%26 = add i64 %25, %19
%27 = getelementptr inbounds i32, i32* %18, i64 1
%28 = load i32, i32* %27
%29 = icmp eq i32 %28, 0
br i1 %29, label %98, label %16
30: ; preds = %58, %8
%31 = phi i64 [ %2, %8 ], [ %60, %58 ]
%32 = phi i8* [ %0, %8 ], [ %61, %58 ]
%33 = icmp eq i64 %31, 0
br i1 %33, label %98, label %34
34: ; preds = %30
%35 = load i32*, i32** %1
br label %64
36: ; preds = %10, %58
%37 = phi i32* [ %62, %58 ], [ %11, %10 ]
%38 = phi i8* [ %61, %58 ], [ %0, %10 ]
%39 = phi i64 [ %60, %58 ], [ %2, %10 ]
%40 = load i32, i32* %37
%41 = add i32 %40, -128
%42 = icmp ult i32 %41, -127
br i1 %42, label %43, label %53
43: ; preds = %36
%44 = icmp eq i32 %40, 0
br i1 %44, label %45, label %47
45: ; preds = %43
store i8 0, i8* %38
store i32* null, i32** %1
%46 = sub i64 %2, %39
br label %98
47: ; preds = %43
%48 = tail call i64 @wcrtomb(i8* %38, i32 %40, i32 0)
%49 = icmp eq i64 %48, -1
br i1 %49, label %98, label %50
50: ; preds = %47
%51 = getelementptr inbounds i8, i8* %38, i64 %48
%52 = sub i64 %39, %48
br label %58
53: ; preds = %36
%54 = trunc i32 %40 to i8
%55 = getelementptr inbounds i8, i8* %38, i64 1
store i8 %54, i8* %38
%56 = add i64 %39, -1
%57 = load i32*, i32** %1
br label %58
58: ; preds = %53, %50
%59 = phi i32* [ %37, %50 ], [ %57, %53 ]
%60 = phi i64 [ %52, %50 ], [ %56, %53 ]
%61 = phi i8* [ %51, %50 ], [ %55, %53 ]
%62 = getelementptr inbounds i32, i32* %59, i64 1
store i32* %62, i32** %1
%63 = icmp ugt i64 %60, 3
br i1 %63, label %36, label %30
64: ; preds = %34, %92
%65 = phi i32* [ %96, %92 ], [ %35, %34 ]
%66 = phi i8* [ %95, %92 ], [ %32, %34 ]
%67 = phi i64 [ %94, %92 ], [ %31, %34 ]
%68 = load i32, i32* %65
%69 = add i32 %68, -128
%70 = icmp ult i32 %69, -127
br i1 %70, label %71, label %87
71: ; preds = %64
%72 = icmp eq i32 %68, 0
br i1 %72, label %73, label %75
73: ; preds = %71
store i8 0, i8* %66
store i32* null, i32** %1
%74 = sub i64 %2, %67
br label %98
75: ; preds = %71
%76 = call i64 @wcrtomb(i8* %6, i32 %68, i32 0)
%77 = icmp eq i64 %76, -1
br i1 %77, label %98, label %78
78: ; preds = %75
%79 = icmp ult i64 %67, %76
br i1 %79, label %80, label %82
80: ; preds = %78
%81 = sub i64 %2, %67
br label %98
82: ; preds = %78
%83 = load i32, i32* %65
%84 = call i64 @wcrtomb(i8* %66, i32 %83, i32 0)
%85 = getelementptr inbounds i8, i8* %66, i64 %76
%86 = sub i64 %67, %76
br label %92
87: ; preds = %64
%88 = trunc i32 %68 to i8
%89 = getelementptr inbounds i8, i8* %66, i64 1
store i8 %88, i8* %66
%90 = add i64 %67, -1
%91 = load i32*, i32** %1
br label %92
92: ; preds = %87, %82
%93 = phi i32* [ %65, %82 ], [ %91, %87 ]
%94 = phi i64 [ %86, %82 ], [ %90, %87 ]
%95 = phi i8* [ %85, %82 ], [ %89, %87 ]
%96 = getelementptr inbounds i32, i32* %93, i64 1
store i32* %96, i32** %1
%97 = icmp eq i64 %94, 0
br i1 %97, label %98, label %64
98: ; preds = %47, %75, %92, %21, %24, %30, %12, %80, %73, %45
%99 = phi i64 [ %46, %45 ], [ %81, %80 ], [ %74, %73 ], [ 0, %12 ], [ %2, %30 ], [ -1, %21 ], [ %26, %24 ], [ -1, %75 ], [ %2, %92 ], [ -1, %47 ]
ret i64 %99
}