#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 asn1Length(unsigned char **);
int asn1Tag(unsigned char **);
size_t asn1Validate(unsigned char *data, size_t length) {
  size_t ofs;
  int l, rc, tag, tl;
  unsigned char *po;
  if (length < 2) {
    return 1;
  }
  ofs = 0;
  if ((*(data + ofs) & 0x1F) == 0x1F) {
    do {
      ofs++;
      if ((ofs >= length) || (ofs > 4)) {
        return ofs;
      }
    } while (*(data + ofs) & 0x80);
  }
  ofs++;
  if (ofs >= length) {
    return ofs;
  }
  l = *(data + ofs);
  ofs++;
  if (l & 0x80) {
    int c = l & 0x7F;
    if (c > 3) {
      return ofs - 1;
    }
    if (c > 0) {
      l = 0;
    } else {
      l = -1;
    }
    while (c--) {
      if (ofs >= length) {
        return ofs;
      }
      l = (l << 8) | *(data + ofs);
      ofs++;
    }
  }
  if (ofs + l > length) {
    return length;
  }
  if (l == 0) {
    return 0;
  }
  if (*data & 0x20) {
    while (1) {
      po = data + ofs;
      rc = (int)asn1Validate(po, l);
      if (rc != 0) {
        return ofs + rc;
      }
      tag = asn1Tag(&po);
      tl = asn1Length(&po);
      tl += (int)(po - (data + ofs));
      ofs += tl;
      if (l == -1) {
        if ((tag == 0) && (tl == 0)) {
          break;
        }
      } else {
        l -= tl;
        if (l <= 0) {
          break;
        }
      }
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<asn1Validate>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
cmpq   $0x2,-0x18(%rbp)
jae    1158 <asn1Validate+0x28>
movq   $0x1,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
movq   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0x1f,%eax
cmp    $0x1f,%eax
jne    11d3 <asn1Validate+0xa3>
jmp    117d <asn1Validate+0x4d>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    11a2 <asn1Validate+0x72>
cmpq   $0x4,-0x20(%rbp)
jbe    11af <asn1Validate+0x7f>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
jmp    11b4 <asn1Validate+0x84>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    117d <asn1Validate+0x4d>
jmp    11d3 <asn1Validate+0xa3>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     11fa <asn1Validate+0xca>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12c8 <asn1Validate+0x198>
mov    -0x24(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x3,-0x3c(%rbp)
jle    124a <asn1Validate+0x11a>
mov    -0x20(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
cmpl   $0x0,-0x3c(%rbp)
jle    1260 <asn1Validate+0x130>
movl   $0x0,-0x24(%rbp)
jmp    1267 <asn1Validate+0x137>
movl   $0xffffffff,-0x24(%rbp)
jmp    126c <asn1Validate+0x13c>
mov    -0x3c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x3c(%rbp)
cmp    $0x0,%eax
je     12c3 <asn1Validate+0x193>
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     129b <asn1Validate+0x16b>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
mov    -0x24(%rbp),%eax
shl    $0x8,%eax
mov    -0x10(%rbp),%rcx
mov    -0x20(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
or     %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    126c <asn1Validate+0x13c>
jmp    12c8 <asn1Validate+0x198>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
add    %rcx,%rax
cmp    -0x18(%rbp),%rax
jbe    12ea <asn1Validate+0x1ba>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
cmpl   $0x0,-0x24(%rbp)
jne    1301 <asn1Validate+0x1d1>
movq   $0x0,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     13dd <asn1Validate+0x2ad>
jmp    1319 <asn1Validate+0x1e9>
mov    -0x10(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rdi
movslq -0x24(%rbp),%rsi
call   1050 <asn1Validate@plt>
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     1353 <asn1Validate+0x223>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    13e5 <asn1Validate+0x2b5>
lea    -0x38(%rbp),%rdi
call   1030 <asn1Tag@plt>
mov    %eax,-0x2c(%rbp)
lea    -0x38(%rbp),%rdi
call   1040 <asn1Length@plt>
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rcx
add    -0x20(%rbp),%rcx
sub    %rcx,%rax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
movslq -0x30(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0xffffffff,-0x24(%rbp)
jne    13b4 <asn1Validate+0x284>
cmpl   $0x0,-0x2c(%rbp)
jne    13af <asn1Validate+0x27f>
cmpl   $0x0,-0x30(%rbp)
jne    13af <asn1Validate+0x27f>
jmp    13d8 <asn1Validate+0x2a8>
jmp    13d3 <asn1Validate+0x2a3>
mov    -0x30(%rbp),%ecx
mov    -0x24(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     13ce <asn1Validate+0x29e>
jmp    13d8 <asn1Validate+0x2a8>
jmp    13d3 <asn1Validate+0x2a3>
jmp    1319 <asn1Validate+0x1e9>
jmp    13dd <asn1Validate+0x2ad>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<asn1Validate>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    $0x1,%ebx
cmp    $0x2,%rsi
jb     1302 <asn1Validate+0x1d2>
mov    %rdi,%r14
mov    (%rdi),%cl
mov    %ecx,%eax
not    %al
test   $0x1f,%al
jne    11d6 <asn1Validate+0xa6>
lea    -0x1(%rsi),%rdx
cmp    $0x4,%rdx
mov    $0x4,%edi
cmovb  %rdx,%rdi
lea    0x1(%rdi),%rbx
test   %rdi,%rdi
je     1302 <asn1Validate+0x1d2>
mov    $0x1,%eax
cmpb   $0x0,0x1(%r14)
jns    11d8 <asn1Validate+0xa8>
cmp    $0x1,%rdi
je     1302 <asn1Validate+0x1d2>
mov    $0x2,%eax
cmpb   $0x0,0x2(%r14)
jns    11d8 <asn1Validate+0xa8>
cmp    $0x2,%rdi
je     1302 <asn1Validate+0x1d2>
mov    $0x3,%eax
cmpb   $0x0,0x3(%r14)
jns    11d8 <asn1Validate+0xa8>
cmp    $0x3,%rdi
je     1302 <asn1Validate+0x1d2>
mov    $0x4,%eax
cmpb   $0x0,0x4(%r14)
jns    11d8 <asn1Validate+0xa8>
mov    $0x5,%eax
cmp    $0x3,%rdx
jbe    11d8 <asn1Validate+0xa8>
jmp    1302 <asn1Validate+0x1d2>
xor    %eax,%eax
lea    0x1(%rax),%rbx
cmp    %rsi,%rbx
jae    1302 <asn1Validate+0x1d2>
movzbl 0x1(%r14,%rax,1),%r15d
lea    0x2(%rax),%rbp
test   $0x80,%r15b
jne    123f <asn1Validate+0x10f>
movslq %r15d,%rax
lea    (%rax,%rbp,1),%rdx
mov    %rsi,%rbx
cmp    %rsi,%rdx
ja     1302 <asn1Validate+0x1d2>
xor    %ebx,%ebx
test   %r15d,%r15d
je     1302 <asn1Validate+0x1d2>
and    $0x20,%cl
je     1302 <asn1Validate+0x1d2>
lea    (%r14,%rbp,1),%r12
mov    %r12,0x8(%rsp)
mov    %r12,%rdi
mov    %rax,%rsi
call   1050 <asn1Validate@plt>
test   %eax,%eax
je     127b <asn1Validate+0x14b>
movslq %eax,%rbx
add    %rbp,%rbx
jmp    1302 <asn1Validate+0x1d2>
and    $0x7f,%r15d
cmp    $0x3,%r15d
ja     1302 <asn1Validate+0x1d2>
test   %r15d,%r15d
je     1270 <asn1Validate+0x140>
cmp    %rsi,%rbp
je     12ff <asn1Validate+0x1cf>
movzbl 0x2(%r14,%rax,1),%edi
lea    0x3(%rax),%rbp
cmp    $0x1,%r15d
jne    12d8 <asn1Validate+0x1a8>
mov    %edi,%r15d
jmp    11f5 <asn1Validate+0xc5>
mov    $0xffffffff,%r15d
jmp    11f5 <asn1Validate+0xc5>
xor    %ebx,%ebx
jmp    12a9 <asn1Validate+0x179>
mov    $0xffffffff,%r15d
or     %ecx,0x14(%rsp)
je     1302 <asn1Validate+0x1d2>
movslq %ecx,%rax
add    %rax,%rbp
lea    (%r14,%rbp,1),%r12
mov    %r12,0x8(%rsp)
movslq %r15d,%rsi
mov    %r12,%rdi
call   1050 <asn1Validate@plt>
test   %eax,%eax
jne    1234 <asn1Validate+0x104>
lea    0x8(%rsp),%r13
mov    %r13,%rdi
call   1030 <asn1Tag@plt>
mov    %eax,0x14(%rsp)
mov    %r13,%rdi
call   1040 <asn1Length@plt>
mov    0x8(%rsp),%ecx
sub    %r12d,%ecx
add    %eax,%ecx
cmp    $0xffffffff,%r15d
je     127f <asn1Validate+0x14f>
sub    %ecx,%r15d
jg     128b <asn1Validate+0x15b>
jmp    1302 <asn1Validate+0x1d2>
cmp    %rsi,%rbp
je     12ff <asn1Validate+0x1cf>
shl    $0x8,%edi
movzbl 0x3(%r14,%rax,1),%edx
or     %edi,%edx
lea    0x4(%rax),%rbp
cmp    $0x2,%r15d
jne    12fa <asn1Validate+0x1ca>
mov    %edx,%r15d
jmp    11f5 <asn1Validate+0xc5>
cmp    %rsi,%rbp
jne    1314 <asn1Validate+0x1e4>
mov    %rsi,%rbx
mov    %rbx,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
shl    $0x8,%edx
movzbl 0x4(%r14,%rax,1),%r15d
or     %edx,%r15d
add    $0x5,%rax
mov    %rax,%rbp
jmp    11f5 <asn1Validate+0xc5>

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

LLVM IR (-O2):
define i64 @asn1Validate(i8* %0, i64 %1) {
%3 = alloca i8*
%4 = bitcast i8** %3 to i8*
%5 = icmp ult i64 %1, 2
br i1 %5, label %133, label %6
6: ; preds = %2
%7 = load i8, i8* %0
%8 = and i8 %7, 31
%9 = icmp eq i8 %8, 31
br i1 %9, label %10, label %39
10: ; preds = %6
%11 = add i64 %1, -1
%12 = call i64 @llvm.umin.i64(i64 %11, i64 4)
%13 = add nuw nsw i64 %12, 1
%14 = icmp eq i64 %12, 0
br i1 %14, label %133, label %15
15: ; preds = %10
%16 = getelementptr inbounds i8, i8* %0, i64 1
%17 = load i8, i8* %16
%18 = icmp sgt i8 %17, -1
br i1 %18, label %39, label %19
19: ; preds = %15
%20 = icmp eq i64 %12, 1
br i1 %20, label %133, label %21
21: ; preds = %19
%22 = getelementptr inbounds i8, i8* %0, i64 2
%23 = load i8, i8* %22
%24 = icmp sgt i8 %23, -1
br i1 %24, label %39, label %25
25: ; preds = %21
%26 = icmp eq i64 %12, 2
br i1 %26, label %133, label %27
27: ; preds = %25
%28 = getelementptr inbounds i8, i8* %0, i64 3
%29 = load i8, i8* %28
%30 = icmp sgt i8 %29, -1
br i1 %30, label %39, label %31
31: ; preds = %27
%32 = icmp eq i64 %12, 3
br i1 %32, label %133, label %33
33: ; preds = %31
%34 = getelementptr inbounds i8, i8* %0, i64 4
%35 = load i8, i8* %34
%36 = icmp sgt i8 %35, -1
br i1 %36, label %39, label %37
37: ; preds = %33
%38 = icmp ugt i64 %11, 3
br i1 %38, label %133, label %39
39: ; preds = %15, %21, %27, %33, %37, %6
%40 = phi i64 [ 0, %6 ], [ 1, %15 ], [ 2, %21 ], [ 3, %27 ], [ 4, %33 ], [ 5, %37 ]
%41 = add nuw nsw i64 %40, 1
%42 = icmp ult i64 %41, %1
br i1 %42, label %43, label %133
43: ; preds = %39
%44 = getelementptr inbounds i8, i8* %0, i64 %41
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = add nuw nsw i64 %40, 2
%48 = and i32 %46, 128
%49 = icmp eq i32 %48, 0
br i1 %49, label %82, label %50
50: ; preds = %43
%51 = and i32 %46, 127
%52 = icmp ugt i32 %51, 3
br i1 %52, label %133, label %53
53: ; preds = %50
%54 = icmp eq i32 %51, 0
br i1 %54, label %82, label %55
55: ; preds = %53
%56 = icmp eq i64 %47, %1
br i1 %56, label %133, label %57
57: ; preds = %55
%58 = getelementptr inbounds i8, i8* %0, i64 %47
%59 = load i8, i8* %58
%60 = zext i8 %59 to i32
%61 = add nuw nsw i64 %40, 3
%62 = icmp eq i32 %51, 1
br i1 %62, label %82, label %63
63: ; preds = %57
%64 = icmp eq i64 %61, %1
br i1 %64, label %133, label %65
65: ; preds = %63
%66 = shl nuw nsw i32 %60, 8
%67 = getelementptr inbounds i8, i8* %0, i64 %61
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
%70 = or i32 %66, %69
%71 = add nuw nsw i64 %40, 4
%72 = icmp eq i32 %51, 2
br i1 %72, label %82, label %73
73: ; preds = %65
%74 = icmp eq i64 %71, %1
br i1 %74, label %133, label %75
75: ; preds = %73
%76 = shl nuw nsw i32 %70, 8
%77 = getelementptr inbounds i8, i8* %0, i64 %71
%78 = load i8, i8* %77
%79 = zext i8 %78 to i32
%80 = or i32 %76, %79
%81 = add nuw nsw i64 %40, 5
br label %82
82: ; preds = %57, %65, %75, %53, %43
%83 = phi i32 [ %46, %43 ], [ -1, %53 ], [ %60, %57 ], [ %70, %65 ], [ %80, %75 ]
%84 = phi i64 [ %47, %43 ], [ %47, %53 ], [ %61, %57 ], [ %71, %65 ], [ %81, %75 ]
%85 = sext i32 %83 to i64
%86 = add nsw i64 %84, %85
%87 = icmp ugt i64 %86, %1
br i1 %87, label %133, label %88
88: ; preds = %82
%89 = icmp eq i32 %83, 0
%90 = and i8 %7, 32
%91 = icmp eq i8 %90, 0
%92 = select i1 %89, i1 true, i1 %91
br i1 %92, label %133, label %93
93: ; preds = %88
%94 = getelementptr inbounds i8, i8* %0, i64 %84
store i8* %94, i8** %3
%95 = call i64 @asn1Validate(i8* %94, i64 %85)
%96 = trunc i64 %95 to i32
%97 = icmp eq i32 %96, 0
br i1 %97, label %104, label %98
98: ; preds = %126, %93
%99 = phi i64 [ %84, %93 ], [ %117, %126 ]
%100 = phi i64 [ %95, %93 ], [ %130, %126 ]
%101 = shl i64 %100, 32
%102 = ashr exact i64 %101, 32
%103 = add i64 %102, %99
br label %133
104: ; preds = %93, %126
%105 = phi i8* [ %128, %126 ], [ %94, %93 ]
%106 = phi i64 [ %117, %126 ], [ %84, %93 ]
%107 = phi i32 [ %127, %126 ], [ %83, %93 ]
%108 = call i32 @asn1Tag(i8** %3)
%109 = call i32 @asn1Length(i8** %3)
%110 = load i8*, i8** %3
%111 = ptrtoint i8* %110 to i64
%112 = ptrtoint i8* %105 to i64
%113 = sub i64 %111, %112
%114 = trunc i64 %113 to i32
%115 = add nsw i32 %109, %114
%116 = sext i32 %115 to i64
%117 = add i64 %106, %116
%118 = icmp eq i32 %107, -1
br i1 %118, label %119, label %123
119: ; preds = %104
%120 = icmp eq i32 %108, 0
%121 = icmp eq i32 %115, 0
%122 = select i1 %120, i1 %121, i1 false
br i1 %122, label %133, label %126
123: ; preds = %104
%124 = sub nsw i32 %107, %115
%125 = icmp slt i32 %124, 1
br i1 %125, label %133, label %126
126: ; preds = %123, %119
%127 = phi i32 [ -1, %119 ], [ %124, %123 ]
%128 = getelementptr inbounds i8, i8* %0, i64 %117
store i8* %128, i8** %3
%129 = sext i32 %127 to i64
%130 = call i64 @asn1Validate(i8* %128, i64 %129)
%131 = trunc i64 %130 to i32
%132 = icmp eq i32 %131, 0
br i1 %132, label %104, label %98
133: ; preds = %10, %19, %25, %31, %37, %55, %63, %73, %123, %119, %50, %88, %82, %39, %2, %98
%134 = phi i64 [ %103, %98 ], [ 1, %2 ], [ %41, %39 ], [ %1, %82 ], [ 0, %88 ], [ %41, %50 ], [ 0, %119 ], [ 0, %123 ], [ %1, %73 ], [ %1, %63 ], [ %1, %55 ], [ %13, %37 ], [ %13, %31 ], [ %13, %25 ], [ %13, %19 ], [ %13, %10 ]
ret i64 %134
}