unsigned idris_utf8_index(char *s, int idx) {
  int i = 0, j = 0;
  while (j < idx) {
    if ((s[i] & 0xc0) != 0x80)
      j++;
    i++;
  }
  while ((s[i] & 0xc0) == 0x80) {
    i++;
  }
  unsigned bytes = 0;
  unsigned top = 0;
  int init = (int)s[1];
  if ((s[i] & 0x80) == 0) {
    bytes = 1;
    top = (int)(s[i]);
  } else if ((init > 244 && init < 256) || (init == 192) || (init == 193)) {
    bytes = 1;
    top = (int)(s[i]);
  } else if ((s[i] & 0xe0) == 0xc0) {
    bytes = 2;
    top = (int)(s[i] & 0x1f);
  } else if ((s[i] & 0xf0) == 0xe0) {
    bytes = 3;
    top = (int)(s[i] & 0x0f);
  } else if ((s[i] & 0xf8) == 0xf0) {
    bytes = 4;
    top = (int)(s[i] & 0x07);
  } else if ((s[i] & 0xfc) == 0xf8) {
    bytes = 5;
    top = (int)(s[i] & 0x03);
  } else if ((s[i] & 0xfe) == 0xfc) {
    bytes = 6;
    top = (int)(s[i] & 0x01);
  }
  while (bytes > 1) {
    top = top << 6;
    top += s[++i] & 0x3f;
    --bytes;
  }
  return top;
}


x86 assembly (clang, -O0):
<idris_utf8_index>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1158 <idris_utf8_index+0x58>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
je     114a <idris_utf8_index+0x4a>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1119 <idris_utf8_index+0x19>
jmp    115d <idris_utf8_index+0x5d>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1187 <idris_utf8_index+0x87>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    115d <idris_utf8_index+0x5d>
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    11d5 <idris_utf8_index+0xd5>
movl   $0x1,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x1c(%rbp)
jmp    135f <idris_utf8_index+0x25f>
cmpl   $0xf4,-0x20(%rbp)
jle    11ef <idris_utf8_index+0xef>
cmpl   $0x100,-0x20(%rbp)
jl     1209 <idris_utf8_index+0x109>
cmpl   $0xc0,-0x20(%rbp)
je     1209 <idris_utf8_index+0x109>
cmpl   $0xc1,-0x20(%rbp)
jne    1224 <idris_utf8_index+0x124>
movl   $0x1,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x1c(%rbp)
jmp    135a <idris_utf8_index+0x25a>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xe0,%eax
cmp    $0xc0,%eax
jne    125e <idris_utf8_index+0x15e>
movl   $0x2,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x1f,%eax
mov    %eax,-0x1c(%rbp)
jmp    1355 <idris_utf8_index+0x255>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    1298 <idris_utf8_index+0x198>
movl   $0x3,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xf,%eax
mov    %eax,-0x1c(%rbp)
jmp    1350 <idris_utf8_index+0x250>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xf8,%eax
cmp    $0xf0,%eax
jne    12d2 <idris_utf8_index+0x1d2>
movl   $0x4,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x7,%eax
mov    %eax,-0x1c(%rbp)
jmp    134b <idris_utf8_index+0x24b>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xfc,%eax
cmp    $0xf8,%eax
jne    130c <idris_utf8_index+0x20c>
movl   $0x5,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x3,%eax
mov    %eax,-0x1c(%rbp)
jmp    1346 <idris_utf8_index+0x246>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xfe,%eax
cmp    $0xfc,%eax
jne    1341 <idris_utf8_index+0x241>
movl   $0x6,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1346 <idris_utf8_index+0x246>
jmp    134b <idris_utf8_index+0x24b>
jmp    1350 <idris_utf8_index+0x250>
jmp    1355 <idris_utf8_index+0x255>
jmp    135a <idris_utf8_index+0x25a>
jmp    135f <idris_utf8_index+0x25f>
jmp    1364 <idris_utf8_index+0x264>
cmpl   $0x1,-0x18(%rbp)
jbe    13a2 <idris_utf8_index+0x2a2>
mov    -0x1c(%rbp),%eax
shl    $0x6,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x10(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x3f,%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1364 <idris_utf8_index+0x264>
mov    -0x1c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<idris_utf8_index>:
xor    %r11d,%r11d
test   %esi,%esi
jle    112e <idris_utf8_index+0x2e>
xor    %eax,%eax
nopl   0x0(%rax)
movzbl (%rdi,%rax,1),%edx
and    $0xc0,%dl
xor    %ecx,%ecx
cmp    $0x80,%dl
setne  %cl
add    %ecx,%r11d
add    $0x1,%rax
cmp    %esi,%r11d
jl     1110 <idris_utf8_index+0x10>
mov    %eax,%r11d
add    $0xffffffffffffffff,%r11
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsbl 0x1(%rdi,%r11,1),%edx
mov    %edx,%eax
and    $0xc0,%al
add    $0x1,%r11
cmp    $0x80,%al
je     1140 <idris_utf8_index+0x40>
test   $0x80,%dl
jne    115a <idris_utf8_index+0x5a>
mov    %edx,%eax
ret
mov    %edx,%eax
and    $0xe0,%eax
cmp    $0xc0,%eax
jne    1175 <idris_utf8_index+0x75>
and    $0x1f,%edx
mov    $0x1,%r9b
xor    %esi,%esi
xor    %r10d,%r10d
jmp    118f <idris_utf8_index+0x8f>
mov    %edx,%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    11fe <idris_utf8_index+0xfe>
and    $0xf,%edx
mov    $0x1,%sil
xor    %r10d,%r10d
xor    %r9d,%r9d
mov    $0x1,%r8b
mov    %r11d,%ecx
shl    $0x6,%edx
movzbl 0x1(%rcx,%rdi,1),%eax
and    $0x3f,%eax
or     %edx,%eax
test   %sil,%sil
je     1265 <idris_utf8_index+0x165>
mov    %eax,%edx
shl    $0x6,%edx
movzbl 0x2(%rcx,%rdi,1),%eax
and    $0x3f,%eax
or     %edx,%eax
test   %r10b,%r10b
je     1265 <idris_utf8_index+0x165>
mov    %eax,%edx
shl    $0x6,%edx
movzbl 0x3(%rcx,%rdi,1),%eax
and    $0x3f,%eax
or     %edx,%eax
test   %r9b,%r9b
je     1265 <idris_utf8_index+0x165>
mov    %eax,%edx
shl    $0x6,%edx
movzbl 0x4(%rcx,%rdi,1),%eax
and    $0x3f,%eax
or     %edx,%eax
test   %r8b,%r8b
je     1265 <idris_utf8_index+0x165>
shl    $0x6,%eax
movzbl 0x5(%rcx,%rdi,1),%ecx
and    $0x3f,%ecx
or     %ecx,%eax
jmp    1265 <idris_utf8_index+0x165>
mov    %edx,%eax
and    $0xf8,%eax
cmp    $0xf0,%eax
jne    1220 <idris_utf8_index+0x120>
and    $0x7,%edx
mov    $0x1,%sil
xor    %r9d,%r9d
mov    $0x1,%r10b
xor    %r8d,%r8d
jmp    1192 <idris_utf8_index+0x92>
mov    %edx,%eax
and    $0xfc,%eax
cmp    $0xf8,%eax
jne    1242 <idris_utf8_index+0x142>
and    $0x3,%edx
mov    $0x1,%sil
xor    %r8d,%r8d
mov    $0x1,%r10b
mov    $0x1,%r9b
jmp    1192 <idris_utf8_index+0x92>
mov    %edx,%ecx
and    $0xfe,%ecx
xor    %eax,%eax
cmp    $0xfc,%ecx
jne    1265 <idris_utf8_index+0x165>
and    $0x1,%edx
mov    $0x1,%sil
mov    $0x1,%r10b
mov    $0x1,%r9b
jmp    118f <idris_utf8_index+0x8f>
ret

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

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