#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 scalar_t__ wchar_t;
typedef int uint8_t;
typedef int uint32_t;

/* Variables and functions */
int /*<<< orphan*/ assert(int);
scalar_t__ get_val_utf82uni(int *);
uint8_t *get_utf8_value(uint8_t *pstart, wchar_t *pval) {
  uint32_t val = 0;
  uint8_t *p = pstart;
  assert(NULL != pstart);
  if (0 == (0x80 & *p)) {
    val = (size_t)*p;
    p++;
  } else if (0xC0 == (0xE0 & *p)) {
    val = *p & 0x1F;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xE0 == (0xF0 & *p)) {
    val = *p & 0x0F;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xF0 == (0xF8 & *p)) {
    val = *p & 0x07;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xF8 == (0xFC & *p)) {
    val = *p & 0x03;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0xFC == (0xFE & *p)) {
    val = *p & 0x01;
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    do {
      val <<= 6;
      p++;
      val |= (*p & 0x3F);
    } while (0);
    p++;
    assert((wchar_t)val == get_val_utf82uni(pstart));
  } else if (0x80 == (0xC0 & *p)) {
    for (; 0x80 == (0xC0 & *p); p++)
      ;
  } else {
    for (; ((0xFE & *p) > 0xFC); p++)
      ;
  }
  if (pval)
    *pval = val;
  return p;
}


x86 assembly (clang, -O0):
<get_utf8_value>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
xor    %eax,%eax
cmp    -0x8(%rbp),%rax
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0x80,%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    1183 <get_utf8_value+0x63>
mov    -0x20(%rbp),%rax
movslq (%rax),%rax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
jmp    164d <get_utf8_value+0x52d>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xe0,%ecx
mov    $0xc0,%eax
cmp    %ecx,%eax
jne    1205 <get_utf8_value+0xe5>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x1f,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
movslq -0x14(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <get_val_utf82uni@plt>
mov    %rax,%rcx
mov    -0x28(%rbp),%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
jmp    1648 <get_utf8_value+0x528>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xf0,%ecx
mov    $0xe0,%eax
cmp    %ecx,%eax
jne    12b0 <get_utf8_value+0x190>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0xf,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1253 <get_utf8_value+0x133>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
movslq -0x14(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <get_val_utf82uni@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
jmp    1643 <get_utf8_value+0x523>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xf8,%ecx
mov    $0xf0,%eax
cmp    %ecx,%eax
jne    1384 <get_utf8_value+0x264>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x7,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    12fe <get_utf8_value+0x1de>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1327 <get_utf8_value+0x207>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
movslq -0x14(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <get_val_utf82uni@plt>
mov    %rax,%rcx
mov    -0x38(%rbp),%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
jmp    163e <get_utf8_value+0x51e>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xfc,%ecx
mov    $0xf8,%eax
cmp    %ecx,%eax
jne    1481 <get_utf8_value+0x361>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    13d2 <get_utf8_value+0x2b2>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    13fb <get_utf8_value+0x2db>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1424 <get_utf8_value+0x304>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
movslq -0x14(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <get_val_utf82uni@plt>
mov    %rax,%rcx
mov    -0x40(%rbp),%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
jmp    1639 <get_utf8_value+0x519>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xfe,%ecx
mov    $0xfc,%eax
cmp    %ecx,%eax
jne    15a7 <get_utf8_value+0x487>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    14cf <get_utf8_value+0x3af>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    14f8 <get_utf8_value+0x3d8>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    1521 <get_utf8_value+0x401>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    154a <get_utf8_value+0x42a>
mov    -0x14(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x3f,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
movslq -0x14(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <get_val_utf82uni@plt>
mov    %rax,%rcx
mov    -0x48(%rbp),%rax
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
jmp    1634 <get_utf8_value+0x514>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    15f9 <get_utf8_value+0x4d9>
jmp    15c5 <get_utf8_value+0x4a5>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
and    $0xc0,%ecx
mov    $0x80,%eax
cmp    %ecx,%eax
jne    15f4 <get_utf8_value+0x4d4>
jmp    15e3 <get_utf8_value+0x4c3>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
jmp    15c5 <get_utf8_value+0x4a5>
jmp    162f <get_utf8_value+0x50f>
jmp    15fe <get_utf8_value+0x4de>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0xfe,%eax
cmp    $0xfc,%eax
jle    162a <get_utf8_value+0x50a>
jmp    1619 <get_utf8_value+0x4f9>
mov    -0x20(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x20(%rbp)
jmp    15fe <get_utf8_value+0x4de>
jmp    162f <get_utf8_value+0x50f>
jmp    1634 <get_utf8_value+0x514>
jmp    1639 <get_utf8_value+0x519>
jmp    163e <get_utf8_value+0x51e>
jmp    1643 <get_utf8_value+0x523>
jmp    1648 <get_utf8_value+0x528>
jmp    164d <get_utf8_value+0x52d>
cmpq   $0x0,-0x10(%rbp)
je     1663 <get_utf8_value+0x543>
movslq -0x14(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_utf8_value>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,%r14
mov    %rdi,%r15
xor    %edi,%edi
test   %r15,%r15
setne  %dil
call   1040 <assert@plt>
mov    (%r15),%r13d
test   $0x80,%r13b
jne    114f <get_utf8_value+0x2f>
add    $0x4,%r15
jmp    12fc <get_utf8_value+0x1dc>
mov    %r13d,%eax
and    $0xe0,%eax
cmp    $0xc0,%eax
jne    1195 <get_utf8_value+0x75>
and    $0x1f,%r13d
shl    $0x6,%r13
mov    0x4(%r15),%ebx
and    $0x3f,%ebx
or     %r13,%rbx
lea    0x8(%r15),%r12
mov    %r15,%rdi
call   1030 <get_val_utf82uni@plt>
xor    %edi,%edi
cmp    %rbx,%rax
sete   %dil
call   1040 <assert@plt>
mov    %ebx,%r13d
mov    %r12,%r15
jmp    12fc <get_utf8_value+0x1dc>
mov    %r13d,%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    11e7 <get_utf8_value+0xc7>
and    $0xf,%r13d
shl    $0x6,%r13
mov    0x4(%r15),%eax
mov    0x8(%r15),%r12d
and    $0x3f,%eax
or     %r13,%rax
shl    $0x6,%rax
and    $0x3f,%r12d
or     %rax,%r12
lea    0xc(%r15),%rbx
mov    %r15,%rdi
call   1030 <get_val_utf82uni@plt>
xor    %edi,%edi
cmp    %r12,%rax
sete   %dil
call   1040 <assert@plt>
mov    %r12d,%r13d
jmp    12f9 <get_utf8_value+0x1d9>
mov    %r13d,%eax
and    $0xf8,%eax
cmp    $0xf0,%eax
jne    122e <get_utf8_value+0x10e>
and    $0x7,%r13d
shl    $0x6,%r13
mov    0x4(%r15),%eax
mov    0x8(%r15),%ecx
and    $0x3f,%eax
or     %r13,%rax
shl    $0xc,%rax
and    $0x3f,%ecx
shl    $0x6,%rcx
or     %rax,%rcx
mov    0xc(%r15),%r13d
and    $0x3f,%r13d
or     %rcx,%r13
lea    0x10(%r15),%rbx
jmp    12e3 <get_utf8_value+0x1c3>
mov    %r13d,%eax
and    $0xfc,%eax
cmp    $0xf8,%eax
jne    1280 <get_utf8_value+0x160>
shl    $0x6,%r13d
movzbl %r13b,%eax
mov    0x4(%r15),%ecx
mov    0x8(%r15),%edx
and    $0x3f,%ecx
or     %rax,%rcx
shl    $0xc,%rcx
and    $0x3f,%edx
shl    $0x6,%rdx
or     %rcx,%rdx
mov    0xc(%r15),%eax
and    $0x3f,%eax
or     %rdx,%rax
shl    $0x6,%rax
mov    0x10(%r15),%r13d
and    $0x3f,%r13d
or     %rax,%r13
lea    0x14(%r15),%rbx
jmp    12e3 <get_utf8_value+0x1c3>
mov    %r13d,%eax
and    $0xfe,%eax
cmp    $0xfc,%eax
jne    1314 <get_utf8_value+0x1f4>
movslq %r13d,%rax
shl    $0x6,%eax
and    $0x40,%eax
mov    0x4(%r15),%ecx
mov    0x8(%r15),%edx
and    $0x3f,%ecx
or     %rax,%rcx
shl    $0xc,%rcx
and    $0x3f,%edx
shl    $0x6,%rdx
or     %rcx,%rdx
mov    0xc(%r15),%eax
and    $0x3f,%eax
or     %rdx,%rax
mov    0x10(%r15),%ecx
shl    $0xc,%rax
and    $0x3f,%ecx
shl    $0x6,%rcx
or     %rax,%rcx
mov    0x14(%r15),%r13d
and    $0x3f,%r13d
or     %rcx,%r13
lea    0x18(%r15),%rbx
mov    %r15,%rdi
call   1030 <get_val_utf82uni@plt>
xor    %edi,%edi
cmp    %r13,%rax
sete   %dil
call   1040 <assert@plt>
mov    %rbx,%r15
test   %r14,%r14
je     1307 <get_utf8_value+0x1e7>
movslq %r13d,%rax
mov    %rax,(%r14)
mov    %r15,%rax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
and    $0xc0,%r13d
cmp    $0x80,%r13d
jne    1349 <get_utf8_value+0x229>
cmp    $0x80,%r13d
jne    1344 <get_utf8_value+0x224>
mov    $0xc0,%eax
mov    0x4(%r15),%ecx
and    %eax,%ecx
add    $0x4,%r15
cmp    $0x80,%ecx
je     1332 <get_utf8_value+0x212>
xor    %r13d,%r13d
jmp    12fc <get_utf8_value+0x1dc>
xor    %r13d,%r13d
cmp    $0xfd,%eax
jb     12fc <get_utf8_value+0x1dc>
mov    $0xfe,%eax
mov    0x4(%r15),%ecx
and    %eax,%ecx
add    $0x4,%r15
cmp    $0xfc,%ecx
ja     1358 <get_utf8_value+0x238>
jmp    12fc <get_utf8_value+0x1dc>

LLVM IR (-O0):
define i32* @get_utf8_value(i32* %0, i64* %1) {
%3 = alloca i32*
%4 = alloca i64*
%5 = alloca i32
%6 = alloca i32*
store i32* %0, i32** %3
store i64* %1, i64** %4
store i32 0, i32* %5
%7 = load i32*, i32** %3
store i32* %7, i32** %6
%8 = load i32*, i32** %3
%9 = icmp ne i32* null, %8
%10 = zext i1 %9 to i32
%11 = call i32 @assert(i32 %10)
%12 = load i32*, i32** %6
%13 = load i32, i32* %12
%14 = and i32 128, %13
%15 = icmp eq i32 0, %14
br i1 %15, label %16, label %23
16: ; preds = %2
%17 = load i32*, i32** %6
%18 = load i32, i32* %17
%19 = sext i32 %18 to i64
%20 = trunc i64 %19 to i32
store i32 %20, i32* %5
%21 = load i32*, i32** %6
%22 = getelementptr inbounds i32, i32* %21, i32 1
store i32* %22, i32** %6
br label %311
23: ; preds = %2
%24 = load i32*, i32** %6
%25 = load i32, i32* %24
%26 = and i32 224, %25
%27 = icmp eq i32 192, %26
br i1 %27, label %28, label %52
28: ; preds = %23
%29 = load i32*, i32** %6
%30 = load i32, i32* %29
%31 = and i32 %30, 31
store i32 %31, i32* %5
br label %32
32: ; preds = %28
%33 = load i32, i32* %5
%34 = shl i32 %33, 6
store i32 %34, i32* %5
%35 = load i32*, i32** %6
%36 = getelementptr inbounds i32, i32* %35, i32 1
store i32* %36, i32** %6
%37 = load i32*, i32** %6
%38 = load i32, i32* %37
%39 = and i32 %38, 63
%40 = load i32, i32* %5
%41 = or i32 %40, %39
store i32 %41, i32* %5
br label %42
42: ; preds = %32
%43 = load i32*, i32** %6
%44 = getelementptr inbounds i32, i32* %43, i32 1
store i32* %44, i32** %6
%45 = load i32, i32* %5
%46 = sext i32 %45 to i64
%47 = load i32*, i32** %3
%48 = call i64 @get_val_utf82uni(i32* %47)
%49 = icmp eq i64 %46, %48
%50 = zext i1 %49 to i32
%51 = call i32 @assert(i32 %50)
br label %310
52: ; preds = %23
%53 = load i32*, i32** %6
%54 = load i32, i32* %53
%55 = and i32 240, %54
%56 = icmp eq i32 224, %55
br i1 %56, label %57, label %92
57: ; preds = %52
%58 = load i32*, i32** %6
%59 = load i32, i32* %58
%60 = and i32 %59, 15
store i32 %60, i32* %5
br label %61
61: ; preds = %57
%62 = load i32, i32* %5
%63 = shl i32 %62, 6
store i32 %63, i32* %5
%64 = load i32*, i32** %6
%65 = getelementptr inbounds i32, i32* %64, i32 1
store i32* %65, i32** %6
%66 = load i32*, i32** %6
%67 = load i32, i32* %66
%68 = and i32 %67, 63
%69 = load i32, i32* %5
%70 = or i32 %69, %68
store i32 %70, i32* %5
br label %71
71: ; preds = %61
br label %72
72: ; preds = %71
%73 = load i32, i32* %5
%74 = shl i32 %73, 6
store i32 %74, i32* %5
%75 = load i32*, i32** %6
%76 = getelementptr inbounds i32, i32* %75, i32 1
store i32* %76, i32** %6
%77 = load i32*, i32** %6
%78 = load i32, i32* %77
%79 = and i32 %78, 63
%80 = load i32, i32* %5
%81 = or i32 %80, %79
store i32 %81, i32* %5
br label %82
82: ; preds = %72
%83 = load i32*, i32** %6
%84 = getelementptr inbounds i32, i32* %83, i32 1
store i32* %84, i32** %6
%85 = load i32, i32* %5
%86 = sext i32 %85 to i64
%87 = load i32*, i32** %3
%88 = call i64 @get_val_utf82uni(i32* %87)
%89 = icmp eq i64 %86, %88
%90 = zext i1 %89 to i32
%91 = call i32 @assert(i32 %90)
br label %309
92: ; preds = %52
%93 = load i32*, i32** %6
%94 = load i32, i32* %93
%95 = and i32 248, %94
%96 = icmp eq i32 240, %95
br i1 %96, label %97, label %143
97: ; preds = %92
%98 = load i32*, i32** %6
%99 = load i32, i32* %98
%100 = and i32 %99, 7
store i32 %100, i32* %5
br label %101
101: ; preds = %97
%102 = load i32, i32* %5
%103 = shl i32 %102, 6
store i32 %103, i32* %5
%104 = load i32*, i32** %6
%105 = getelementptr inbounds i32, i32* %104, i32 1
store i32* %105, i32** %6
%106 = load i32*, i32** %6
%107 = load i32, i32* %106
%108 = and i32 %107, 63
%109 = load i32, i32* %5
%110 = or i32 %109, %108
store i32 %110, i32* %5
br label %111
111: ; preds = %101
br label %112
112: ; preds = %111
%113 = load i32, i32* %5
%114 = shl i32 %113, 6
store i32 %114, i32* %5
%115 = load i32*, i32** %6
%116 = getelementptr inbounds i32, i32* %115, i32 1
store i32* %116, i32** %6
%117 = load i32*, i32** %6
%118 = load i32, i32* %117
%119 = and i32 %118, 63
%120 = load i32, i32* %5
%121 = or i32 %120, %119
store i32 %121, i32* %5
br label %122
122: ; preds = %112
br label %123
123: ; preds = %122
%124 = load i32, i32* %5
%125 = shl i32 %124, 6
store i32 %125, i32* %5
%126 = load i32*, i32** %6
%127 = getelementptr inbounds i32, i32* %126, i32 1
store i32* %127, i32** %6
%128 = load i32*, i32** %6
%129 = load i32, i32* %128
%130 = and i32 %129, 63
%131 = load i32, i32* %5
%132 = or i32 %131, %130
store i32 %132, i32* %5
br label %133
133: ; preds = %123
%134 = load i32*, i32** %6
%135 = getelementptr inbounds i32, i32* %134, i32 1
store i32* %135, i32** %6
%136 = load i32, i32* %5
%137 = sext i32 %136 to i64
%138 = load i32*, i32** %3
%139 = call i64 @get_val_utf82uni(i32* %138)
%140 = icmp eq i64 %137, %139
%141 = zext i1 %140 to i32
%142 = call i32 @assert(i32 %141)
br label %308
143: ; preds = %92
%144 = load i32*, i32** %6
%145 = load i32, i32* %144
%146 = and i32 252, %145
%147 = icmp eq i32 248, %146
br i1 %147, label %148, label %205
148: ; preds = %143
%149 = load i32*, i32** %6
%150 = load i32, i32* %149
%151 = and i32 %150, 3
store i32 %151, i32* %5
br label %152
152: ; preds = %148
%153 = load i32, i32* %5
%154 = shl i32 %153, 6
store i32 %154, i32* %5
%155 = load i32*, i32** %6
%156 = getelementptr inbounds i32, i32* %155, i32 1
store i32* %156, i32** %6
%157 = load i32*, i32** %6
%158 = load i32, i32* %157
%159 = and i32 %158, 63
%160 = load i32, i32* %5
%161 = or i32 %160, %159
store i32 %161, i32* %5
br label %162
162: ; preds = %152
br label %163
163: ; preds = %162
%164 = load i32, i32* %5
%165 = shl i32 %164, 6
store i32 %165, i32* %5
%166 = load i32*, i32** %6
%167 = getelementptr inbounds i32, i32* %166, i32 1
store i32* %167, i32** %6
%168 = load i32*, i32** %6
%169 = load i32, i32* %168
%170 = and i32 %169, 63
%171 = load i32, i32* %5
%172 = or i32 %171, %170
store i32 %172, i32* %5
br label %173
173: ; preds = %163
br label %174
174: ; preds = %173
%175 = load i32, i32* %5
%176 = shl i32 %175, 6
store i32 %176, i32* %5
%177 = load i32*, i32** %6
%178 = getelementptr inbounds i32, i32* %177, i32 1
store i32* %178, i32** %6
%179 = load i32*, i32** %6
%180 = load i32, i32* %179
%181 = and i32 %180, 63
%182 = load i32, i32* %5
%183 = or i32 %182, %181
store i32 %183, i32* %5
br label %184
184: ; preds = %174
br label %185
185: ; preds = %184
%186 = load i32, i32* %5
%187 = shl i32 %186, 6
store i32 %187, i32* %5
%188 = load i32*, i32** %6
%189 = getelementptr inbounds i32, i32* %188, i32 1
store i32* %189, i32** %6
%190 = load i32*, i32** %6
%191 = load i32, i32* %190
%192 = and i32 %191, 63
%193 = load i32, i32* %5
%194 = or i32 %193, %192
store i32 %194, i32* %5
br label %195
195: ; preds = %185
%196 = load i32*, i32** %6
%197 = getelementptr inbounds i32, i32* %196, i32 1
store i32* %197, i32** %6
%198 = load i32, i32* %5
%199 = sext i32 %198 to i64
%200 = load i32*, i32** %3
%201 = call i64 @get_val_utf82uni(i32* %200)
%202 = icmp eq i64 %199, %201
%203 = zext i1 %202 to i32
%204 = call i32 @assert(i32 %203)
br label %307
205: ; preds = %143
%206 = load i32*, i32** %6
%207 = load i32, i32* %206
%208 = and i32 254, %207
%209 = icmp eq i32 252, %208
br i1 %209, label %210, label %278
210: ; preds = %205
%211 = load i32*, i32** %6
%212 = load i32, i32* %211
%213 = and i32 %212, 1
store i32 %213, i32* %5
br label %214
214: ; preds = %210
%215 = load i32, i32* %5
%216 = shl i32 %215, 6
store i32 %216, i32* %5
%217 = load i32*, i32** %6
%218 = getelementptr inbounds i32, i32* %217, i32 1
store i32* %218, i32** %6
%219 = load i32*, i32** %6
%220 = load i32, i32* %219
%221 = and i32 %220, 63
%222 = load i32, i32* %5
%223 = or i32 %222, %221
store i32 %223, i32* %5
br label %224
224: ; preds = %214
br label %225
225: ; preds = %224
%226 = load i32, i32* %5
%227 = shl i32 %226, 6
store i32 %227, i32* %5
%228 = load i32*, i32** %6
%229 = getelementptr inbounds i32, i32* %228, i32 1
store i32* %229, i32** %6
%230 = load i32*, i32** %6
%231 = load i32, i32* %230
%232 = and i32 %231, 63
%233 = load i32, i32* %5
%234 = or i32 %233, %232
store i32 %234, i32* %5
br label %235
235: ; preds = %225
br label %236
236: ; preds = %235
%237 = load i32, i32* %5
%238 = shl i32 %237, 6
store i32 %238, i32* %5
%239 = load i32*, i32** %6
%240 = getelementptr inbounds i32, i32* %239, i32 1
store i32* %240, i32** %6
%241 = load i32*, i32** %6
%242 = load i32, i32* %241
%243 = and i32 %242, 63
%244 = load i32, i32* %5
%245 = or i32 %244, %243
store i32 %245, i32* %5
br label %246
246: ; preds = %236
br label %247
247: ; preds = %246
%248 = load i32, i32* %5
%249 = shl i32 %248, 6
store i32 %249, i32* %5
%250 = load i32*, i32** %6
%251 = getelementptr inbounds i32, i32* %250, i32 1
store i32* %251, i32** %6
%252 = load i32*, i32** %6
%253 = load i32, i32* %252
%254 = and i32 %253, 63
%255 = load i32, i32* %5
%256 = or i32 %255, %254
store i32 %256, i32* %5
br label %257
257: ; preds = %247
br label %258
258: ; preds = %257
%259 = load i32, i32* %5
%260 = shl i32 %259, 6
store i32 %260, i32* %5
%261 = load i32*, i32** %6
%262 = getelementptr inbounds i32, i32* %261, i32 1
store i32* %262, i32** %6
%263 = load i32*, i32** %6
%264 = load i32, i32* %263
%265 = and i32 %264, 63
%266 = load i32, i32* %5
%267 = or i32 %266, %265
store i32 %267, i32* %5
br label %268
268: ; preds = %258
%269 = load i32*, i32** %6
%270 = getelementptr inbounds i32, i32* %269, i32 1
store i32* %270, i32** %6
%271 = load i32, i32* %5
%272 = sext i32 %271 to i64
%273 = load i32*, i32** %3
%274 = call i64 @get_val_utf82uni(i32* %273)
%275 = icmp eq i64 %272, %274
%276 = zext i1 %275 to i32
%277 = call i32 @assert(i32 %276)
br label %306
278: ; preds = %205
%279 = load i32*, i32** %6
%280 = load i32, i32* %279
%281 = and i32 192, %280
%282 = icmp eq i32 128, %281
br i1 %282, label %283, label %294
283: ; preds = %278
br label %284
284: ; preds = %290, %283
%285 = load i32*, i32** %6
%286 = load i32, i32* %285
%287 = and i32 192, %286
%288 = icmp eq i32 128, %287
br i1 %288, label %289, label %293
289: ; preds = %284
br label %290
290: ; preds = %289
%291 = load i32*, i32** %6
%292 = getelementptr inbounds i32, i32* %291, i32 1
store i32* %292, i32** %6
br label %284
293: ; preds = %284
br label %305
294: ; preds = %278
br label %295
295: ; preds = %301, %294
%296 = load i32*, i32** %6
%297 = load i32, i32* %296
%298 = and i32 254, %297
%299 = icmp sgt i32 %298, 252
br i1 %299, label %300, label %304
300: ; preds = %295
br label %301
301: ; preds = %300
%302 = load i32*, i32** %6
%303 = getelementptr inbounds i32, i32* %302, i32 1
store i32* %303, i32** %6
br label %295
304: ; preds = %295
br label %305
305: ; preds = %304, %293
br label %306
306: ; preds = %305, %268
br label %307
307: ; preds = %306, %195
br label %308
308: ; preds = %307, %133
br label %309
309: ; preds = %308, %82
br label %310
310: ; preds = %309, %42
br label %311
311: ; preds = %310, %16
%312 = load i64*, i64** %4
%313 = icmp ne i64* %312, null
br i1 %313, label %314, label %318
314: ; preds = %311
%315 = load i32, i32* %5
%316 = sext i32 %315 to i64
%317 = load i64*, i64** %4
store i64 %316, i64* %317
br label %318
318: ; preds = %314, %311
%319 = load i32*, i32** %6
ret i32* %319
}

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