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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ EINVAL;
int /*<<< orphan*/ errno;
char *jutf8_strncpy(char *dest, unsigned short length, unsigned char *source,
                    int cslen) {
  int size = 0, i, di = 0;
  for (i = 0; di < cslen && i < length; i += size) {
    size = (((source[i] & 0x80) == 0x0) ? 1
            : (source[i] == 0xed && (i + 5) < length &&
               (source[i + 1] & 0xf0) == 0xa0 &&
               (source[i + 2] & 0xc0) == 0x80 && source[i + 3] == 0xed &&
               (source[i + 4] & 0xf0) == 0xb0 && (source[i + 5] & 0xc0) == 0x80)
                ? 6
            : ((source[i] & 0xf0) == 0xe0 && (i + 2) < length &&
               (source[i + 1] & 0xc0) == 0x80 && (source[i + 2] & 0xc0) == 0X80)
                ? 3
            : ((source[i] & 0xe0) == 0xc0 && (i + 1) < length &&
               (source[i + 1] & 0xc0) == 0x80)
                ? 2
                : -1);
    if (size == 1) {
      dest[di++] = source[i];
    } else if (size > 1) {
      dest[di++] = '_';
    } else {
      errno = EINVAL;
      return (char *)NULL;
    }
  }
  if (di < cslen) {
    dest[di] = '\0';
  } else {
    dest[cslen - 1] = '\0';
  }
  return dest;
}


x86 assembly (clang, -O0):
<jutf8_strncpy>:
push   %rbp
mov    %rsp,%rbp
mov    %si,%ax
mov    %rdi,-0x10(%rbp)
mov    %ax,-0x12(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x30(%rbp),%ecx
xor    %eax,%eax
cmp    -0x24(%rbp),%ecx
mov    %al,-0x31(%rbp)
jge    114b <jutf8_strncpy+0x4b>
mov    -0x2c(%rbp),%eax
movzwl -0x12(%rbp),%ecx
cmp    %ecx,%eax
setl   %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    115b <jutf8_strncpy+0x5b>
jmp    13e3 <jutf8_strncpy+0x2e3>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1182 <jutf8_strncpy+0x82>
mov    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1352 <jutf8_strncpy+0x252>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xed,%eax
jne    1258 <jutf8_strncpy+0x158>
mov    -0x2c(%rbp),%eax
add    $0x5,%eax
movzwl -0x12(%rbp),%ecx
cmp    %ecx,%eax
jge    1258 <jutf8_strncpy+0x158>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xf0,%eax
cmp    $0xa0,%eax
jne    1258 <jutf8_strncpy+0x158>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1258 <jutf8_strncpy+0x158>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xed,%eax
jne    1258 <jutf8_strncpy+0x158>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xf0,%eax
cmp    $0xb0,%eax
jne    1258 <jutf8_strncpy+0x158>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1258 <jutf8_strncpy+0x158>
mov    $0x6,%eax
mov    %eax,-0x3c(%rbp)
jmp    134c <jutf8_strncpy+0x24c>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    12d5 <jutf8_strncpy+0x1d5>
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
movzwl -0x12(%rbp),%ecx
cmp    %ecx,%eax
jge    12d5 <jutf8_strncpy+0x1d5>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    12d5 <jutf8_strncpy+0x1d5>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    12d5 <jutf8_strncpy+0x1d5>
mov    $0x3,%eax
mov    %eax,-0x40(%rbp)
jmp    1346 <jutf8_strncpy+0x246>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
and    $0xe0,%ecx
xor    %eax,%eax
cmp    $0xc0,%ecx
mov    %al,-0x41(%rbp)
jne    1330 <jutf8_strncpy+0x230>
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movzwl -0x12(%rbp),%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x41(%rbp)
jge    1330 <jutf8_strncpy+0x230>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
sete   %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%dl
mov    $0xffffffff,%eax
mov    $0x2,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x1,-0x28(%rbp)
jne    1387 <jutf8_strncpy+0x287>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    13d0 <jutf8_strncpy+0x2d0>
cmpl   $0x1,-0x28(%rbp)
jle    13ac <jutf8_strncpy+0x2ac>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x30(%rbp)
movslq %ecx,%rcx
movb   $0x5f,(%rax,%rcx,1)
jmp    13cb <jutf8_strncpy+0x2cb>
mov    0x2c25(%rip),%rax
mov    (%rax),%ecx
mov    0x2c24(%rip),%rax
mov    %ecx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    1419 <jutf8_strncpy+0x319>
jmp    13d0 <jutf8_strncpy+0x2d0>
jmp    13d5 <jutf8_strncpy+0x2d5>
mov    -0x28(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    112b <jutf8_strncpy+0x2b>
mov    -0x30(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1400 <jutf8_strncpy+0x300>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1411 <jutf8_strncpy+0x311>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<jutf8_strncpy>:
push   %r14
push   %rbx
mov    %rdi,%rax
test   %ecx,%ecx
jle    1216 <jutf8_strncpy+0x116>
test   %si,%si
je     1216 <jutf8_strncpy+0x116>
mov    %ecx,%r8d
xor    %r9d,%r9d
xor    %edi,%edi
nop
mov    %edi,%r11d
movzbl (%rdx,%r11,1),%r10d
mov    $0x1,%ebx
test   %r10b,%r10b
jns    11f8 <jutf8_strncpy+0xf8>
cmp    $0xed,%r10b
jne    118b <jutf8_strncpy+0x8b>
lea    0x5(%r11),%r14
cmp    %esi,%r14d
jae    1196 <jutf8_strncpy+0x96>
movzbl 0x1(%r11,%rdx,1),%ebx
and    $0xf0,%bl
cmp    $0xa0,%bl
jne    1196 <jutf8_strncpy+0x96>
movzbl 0x2(%r11,%rdx,1),%ebx
and    $0xc0,%bl
cmp    $0x80,%bl
jne    1196 <jutf8_strncpy+0x96>
cmpb   $0xed,0x3(%r11,%rdx,1)
jne    1196 <jutf8_strncpy+0x96>
movzbl 0x4(%r11,%rdx,1),%ebx
and    $0xf0,%bl
cmp    $0xb0,%bl
jne    1196 <jutf8_strncpy+0x96>
movzbl (%rdx,%r14,1),%ebx
and    $0xc0,%bl
cmp    $0x80,%bl
jne    1196 <jutf8_strncpy+0x96>
mov    $0x6,%ebx
jmp    11f5 <jutf8_strncpy+0xf5>
mov    %r10d,%ebx
and    $0xf0,%bl
cmp    $0xe0,%bl
jne    11d0 <jutf8_strncpy+0xd0>
lea    0x2(%r11),%r14
cmp    %esi,%r14d
jae    11d0 <jutf8_strncpy+0xd0>
movzbl 0x1(%r11,%rdx,1),%ebx
and    $0xc0,%bl
cmp    $0x80,%bl
jne    11d0 <jutf8_strncpy+0xd0>
movzbl (%rdx,%r14,1),%ebx
and    $0xc0,%bl
cmp    $0x80,%bl
jne    11d0 <jutf8_strncpy+0xd0>
mov    $0x3,%ebx
jmp    11f5 <jutf8_strncpy+0xf5>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
and    $0xe0,%r10b
cmp    $0xc0,%r10b
jne    122e <jutf8_strncpy+0x12e>
add    $0x1,%r11
cmp    %esi,%r11d
jae    122e <jutf8_strncpy+0x12e>
movzbl (%rdx,%r11,1),%ebx
and    $0xc0,%bl
cmp    $0x80,%bl
jne    122e <jutf8_strncpy+0x12e>
mov    $0x2,%ebx
mov    $0x5f,%r10b
mov    %r10b,(%rax,%r9,1)
add    $0x1,%r9
cmp    %r8,%r9
jae    120f <jutf8_strncpy+0x10f>
add    %ebx,%edi
cmp    %esi,%edi
jb     1120 <jutf8_strncpy+0x20>
cmp    %r8,%r9
jb     121d <jutf8_strncpy+0x11d>
jmp    1224 <jutf8_strncpy+0x124>
test   %ecx,%ecx
jle    1224 <jutf8_strncpy+0x124>
xor    %r9d,%r9d
movb   $0x0,(%rax,%r9,1)
jmp    1242 <jutf8_strncpy+0x142>
movslq %ecx,%rcx
movb   $0x0,-0x1(%rcx,%rax,1)
jmp    1242 <jutf8_strncpy+0x142>
mov    0x2da3(%rip),%rax
mov    (%rax),%eax
mov    0x2da2(%rip),%rcx
mov    %eax,(%rcx)
xor    %eax,%eax
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
@EINVAL = global i32 0
@errno = global i32 0
define i8* @jutf8_strncpy(i8* writeonly %0, i16 zeroext %1, i8* nocapture %2, i32 %3) {
%5 = zext i16 %1 to i32
%6 = icmp sgt i32 %3, 0
%7 = icmp ne i16 %1, 0
%8 = and i1 %6, %7
br i1 %8, label %9, label %100
9: ; preds = %4
%10 = zext i32 %3 to i64
br label %11
11: ; preds = %9, %89
%12 = phi i64 [ 0, %9 ], [ %93, %89 ]
%13 = phi i32 [ 0, %9 ], [ %94, %89 ]
%14 = zext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %2, i64 %14
%16 = load i8, i8* %15
%17 = icmp sgt i8 %16, -1
br i1 %17, label %89, label %18
18: ; preds = %11
%19 = icmp eq i8 %16, -19
br i1 %19, label %20, label %56
20: ; preds = %18
%21 = add nuw nsw i32 %13, 5
%22 = icmp ult i32 %21, %5
br i1 %22, label %23, label %59
23: ; preds = %20
%24 = add nuw nsw i32 %13, 1
%25 = zext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %2, i64 %25
%27 = load i8, i8* %26
%28 = and i8 %27, -16
%29 = icmp eq i8 %28, -96
br i1 %29, label %30, label %59
30: ; preds = %23
%31 = add nuw nsw i32 %13, 2
%32 = zext i32 %31 to i64
%33 = getelementptr inbounds i8, i8* %2, i64 %32
%34 = load i8, i8* %33
%35 = and i8 %34, -64
%36 = icmp eq i8 %35, -128
br i1 %36, label %37, label %59
37: ; preds = %30
%38 = add nuw nsw i32 %13, 3
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %2, i64 %39
%41 = load i8, i8* %40
%42 = icmp eq i8 %41, -19
br i1 %42, label %43, label %59
43: ; preds = %37
%44 = add nuw nsw i32 %13, 4
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %2, i64 %45
%47 = load i8, i8* %46
%48 = and i8 %47, -16
%49 = icmp eq i8 %48, -80
br i1 %49, label %50, label %59
50: ; preds = %43
%51 = zext i32 %21 to i64
%52 = getelementptr inbounds i8, i8* %2, i64 %51
%53 = load i8, i8* %52
%54 = and i8 %53, -64
%55 = icmp eq i8 %54, -128
br i1 %55, label %89, label %59
56: ; preds = %18
%57 = and i8 %16, -16
%58 = icmp eq i8 %57, -32
br i1 %58, label %59, label %75
59: ; preds = %20, %23, %30, %37, %43, %50, %56
%60 = add nuw nsw i32 %13, 2
%61 = icmp ult i32 %60, %5
br i1 %61, label %62, label %75
62: ; preds = %59
%63 = add nuw nsw i32 %13, 1
%64 = zext i32 %63 to i64
%65 = getelementptr inbounds i8, i8* %2, i64 %64
%66 = load i8, i8* %65
%67 = and i8 %66, -64
%68 = icmp eq i8 %67, -128
br i1 %68, label %69, label %75
69: ; preds = %62
%70 = zext i32 %60 to i64
%71 = getelementptr inbounds i8, i8* %2, i64 %70
%72 = load i8, i8* %71
%73 = and i8 %72, -64
%74 = icmp eq i8 %73, -128
br i1 %74, label %89, label %75
75: ; preds = %69, %62, %59, %56
%76 = and i8 %16, -32
%77 = icmp eq i8 %76, -64
br i1 %77, label %78, label %87
78: ; preds = %75
%79 = add nuw nsw i32 %13, 1
%80 = icmp ult i32 %79, %5
br i1 %80, label %81, label %87
81: ; preds = %78
%82 = zext i32 %79 to i64
%83 = getelementptr inbounds i8, i8* %2, i64 %82
%84 = load i8, i8* %83
%85 = and i8 %84, -64
%86 = icmp eq i8 %85, -128
br i1 %86, label %89, label %87
87: ; preds = %75, %78, %81
%88 = load i32, i32* @EINVAL
store i32 %88, i32* @errno
br label %108
89: ; preds = %50, %69, %81, %11
%90 = phi i8 [ %16, %11 ], [ 95, %81 ], [ 95, %69 ], [ 95, %50 ]
%91 = phi i32 [ 1, %11 ], [ 2, %81 ], [ 3, %69 ], [ 6, %50 ]
%92 = getelementptr inbounds i8, i8* %0, i64 %12
store i8 %90, i8* %92
%93 = add nuw nsw i64 %12, 1
%94 = add nuw nsw i32 %91, %13
%95 = icmp ult i64 %93, %10
%96 = icmp ult i32 %94, %5
%97 = select i1 %95, i1 %96, i1 false
br i1 %97, label %11, label %98
98: ; preds = %89
%99 = and i64 %93, 4294967295
br i1 %95, label %101, label %104
100: ; preds = %4
br i1 %6, label %101, label %104
101: ; preds = %98, %100
%102 = phi i64 [ %99, %98 ], [ 0, %100 ]
%103 = getelementptr inbounds i8, i8* %0, i64 %102
store i8 0, i8* %103
br label %108
104: ; preds = %98, %100
%105 = add nsw i32 %3, -1
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds i8, i8* %0, i64 %106
store i8 0, i8* %107
br label %108
108: ; preds = %101, %104, %87
%109 = phi i8* [ null, %87 ], [ %0, %104 ], [ %0, %101 ]
ret i8* %109
}