#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 char uint32_t;

/* Variables and functions */
size_t uread(const char *str, uint32_t *val, size_t length) {
  if (!str)
    return (0);
  if (!length)
    return (0);
  if (*str & 0x80) {
    if (*str & 0x40) {
      if (*str & 0x20) {
        if (*str & 0x10) {
          if (*str & 0x08) {
            if (val)
              *val = 0xdc80 | (*str & 0x7f);
            return (1);
          } else {
            if ((length >= 4) && ((str[1] & 0xc0) == 0x80) &&
                ((str[2] & 0xc0) == 0x80) && ((str[3] & 0xc0) == 0x80)) {
              if (val)
                *val = ((str[0] & 0x0f) << 18) | ((str[1] & 0x3f) << 12) |
                       ((str[2] & 0x3f) << 6) | (str[3] & 0x3f);
              return (4);
            } else {
              if (val)
                *val = 0xdc80 | (*str & 0x7f);
              return (1);
            }
          }
        } else {
          if ((length >= 3) && ((str[1] & 0xc0) == 0x80) &&
              ((str[2] & 0xc0) == 0x80)) {
            if (val)
              *val = ((str[0] & 0x0f) << 12) | ((str[1] & 0x3f) << 6) |
                     (str[2] & 0x3f);
            return (3);
          } else {
            if (val)
              *val = 0xdc80 | (*str & 0x7f);
            return (1);
          }
        }
      } else {
        if ((length >= 2) && ((str[1] & 0xc0) == 0x80)) {
          if (val)
            *val = ((str[0] & 0x1f) << 6) | (str[1] & 0x3f);
          return (2);
        } else {
          if (val)
            *val = 0xdc80 | (*str & 0x7f);
          return (1);
        }
      }
    } else {
      if (val)
        *val = 0xdc80 | (*str & 0x7f);
      return (1);
    }
  } else {
    if (val)
      *val = *str;
    return (1);
  }
}


x86 assembly (clang, -O0):
<uread>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1128 <uread+0x28>
movq   $0x0,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x0,-0x20(%rbp)
jne    1140 <uread+0x40>
movq   $0x0,-0x8(%rbp)
jmp    143a <uread+0x33a>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     141b <uread+0x31b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     13ec <uread+0x2ec>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1360 <uread+0x260>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     12ac <uread+0x1ac>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     11d0 <uread+0xd0>
cmpq   $0x0,-0x18(%rbp)
je     11c3 <uread+0xc3>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7f,%eax
or     $0xdc80,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x4,-0x20(%rbp)
jb     127d <uread+0x17d>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    127d <uread+0x17d>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    127d <uread+0x17d>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    127d <uread+0x17d>
cmpq   $0x0,-0x18(%rbp)
je     1270 <uread+0x170>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xf,%eax
shl    $0x12,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
and    $0x3f,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
and    $0x3f,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x3(%rcx),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x0,-0x18(%rbp)
je     129f <uread+0x19f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7f,%eax
or     $0xdc80,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x3,-0x20(%rbp)
jb     1331 <uread+0x231>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1331 <uread+0x231>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1331 <uread+0x231>
cmpq   $0x0,-0x18(%rbp)
je     1324 <uread+0x224>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xf,%eax
shl    $0xc,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
and    $0x3f,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x2(%rcx),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x3,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x0,-0x18(%rbp)
je     1353 <uread+0x253>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7f,%eax
or     $0xdc80,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x2,-0x20(%rbp)
jb     13bd <uread+0x2bd>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    13bd <uread+0x2bd>
cmpq   $0x0,-0x18(%rbp)
je     13b0 <uread+0x2b0>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x1f,%eax
shl    $0x6,%eax
mov    -0x10(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x2,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x0,-0x18(%rbp)
je     13df <uread+0x2df>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7f,%eax
or     $0xdc80,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x0,-0x18(%rbp)
je     140e <uread+0x30e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7f,%eax
or     $0xdc80,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    143a <uread+0x33a>
cmpq   $0x0,-0x18(%rbp)
je     1432 <uread+0x332>
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movq   $0x1,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<uread>:
xor    %eax,%eax
test   %rdi,%rdi
je     1120 <uread+0x20>
test   %rdx,%rdx
je     1120 <uread+0x20>
mov    (%rdi),%cl
test   $0x80,%cl
jne    1121 <uread+0x21>
mov    $0x1,%eax
test   %rsi,%rsi
je     1120 <uread+0x20>
mov    %cl,(%rsi)
ret
ret
test   $0x40,%cl
jne    1136 <uread+0x36>
test   %rsi,%rsi
je     1166 <uread+0x66>
or     $0x80,%cl
mov    $0x1,%eax
mov    %cl,(%rsi)
ret
test   $0x20,%cl
jne    116c <uread+0x6c>
cmp    $0x2,%rdx
jb     1126 <uread+0x26>
mov    0x1(%rdi),%al
mov    %eax,%edx
and    $0xc0,%dl
cmp    $0x80,%dl
jne    1126 <uread+0x26>
test   %rsi,%rsi
je     1207 <uread+0x107>
shl    $0x6,%cl
and    $0x3f,%al
or     %al,%cl
mov    $0x2,%eax
mov    %cl,(%rsi)
ret
mov    $0x1,%eax
ret
test   $0x10,%cl
jne    11ab <uread+0xab>
cmp    $0x3,%rdx
jb     1126 <uread+0x26>
mov    0x1(%rdi),%al
mov    %eax,%edx
and    $0xc0,%dl
cmp    $0x80,%dl
jne    1126 <uread+0x26>
mov    0x2(%rdi),%dil
mov    %edi,%edx
and    $0xc0,%dl
cmp    $0x80,%dl
jne    1126 <uread+0x26>
test   %rsi,%rsi
je     120d <uread+0x10d>
shl    $0x6,%al
and    $0x3f,%dil
or     %al,%dil
mov    $0x3,%eax
mov    %edi,%ecx
mov    %cl,(%rsi)
ret
test   $0x8,%cl
jne    1126 <uread+0x26>
cmp    $0x4,%rdx
jb     1126 <uread+0x26>
mov    0x1(%rdi),%al
and    $0xc0,%al
cmp    $0x80,%al
jne    1126 <uread+0x26>
mov    0x2(%rdi),%al
mov    %eax,%edx
and    $0xc0,%dl
cmp    $0x80,%dl
jne    1126 <uread+0x26>
mov    0x3(%rdi),%dil
mov    %edi,%edx
and    $0xc0,%dl
cmp    $0x80,%dl
jne    1126 <uread+0x26>
test   %rsi,%rsi
je     1213 <uread+0x113>
shl    $0x6,%al
and    $0x3f,%dil
or     %al,%dil
mov    $0x4,%eax
mov    %edi,%ecx
mov    %cl,(%rsi)
ret
mov    $0x2,%eax
ret
mov    $0x3,%eax
ret
mov    $0x4,%eax
ret

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

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