unsigned int calculate_packet_size(const unsigned char *buffer) {
  if (buffer[0] != 0 || buffer[1] != 0 || buffer[2] != 1)
    return 0;
  switch (buffer[3]) {
  case 0xBA:
    if ((buffer[4] & 0xc4) == 0x44 && (buffer[6] & 4) == 4 &&
        (buffer[8] & 4) == 4 && (buffer[9] & 1) == 1 && (buffer[12] & 3) == 3)
      return (buffer[13] & 0x7) + 14;
    if ((buffer[4] & 0xF1) == 0x21 && (buffer[6] & 1) == 1 &&
        (buffer[8] & 1) == 1 && (buffer[9] & 0x80) == 0x80 &&
        (buffer[11] & 1) == 1)
      return 12;
    return 0;
  case 0xB3:
    if ((buffer[10] & 0x20) == 0x20) {
      if ((buffer[11] & 3) != 0)
        return 12 + 64;
      return 12;
    }
    return 0;
  case 0xB5:
    if ((buffer[4] & 0xF0) == 0x10 && (buffer[7] & 1) == 1)
      return 10;
    if ((buffer[4] & 0xF0) == 0x20 && (buffer[4] & 1) == 0 &&
        (buffer[6] & 2) == 2)
      return 9;
    if ((buffer[4] & 0xF0) == 0x20 && (buffer[4] & 1) == 1 &&
        (buffer[9] & 2) == 2)
      return 12;
    if ((buffer[4] & 0xF0) == 0x40) {
      if ((buffer[8] & 0x40) == 0)
        return 9;
      else
        return 11;
    }
    return 0;
  case 0xB8:
    if ((buffer[5] & 0x40) == 0x40)
      return 8;
    return 0;
  case 0xB9:
    return 4;
  case 0xBD:
  case 0xC0 ... 0xDF:
  case 0xE0 ... 0xEF:
    return (buffer[4] << 8) + buffer[5] + 6;
  case 0xBB:
  case 0xBE:
  case 0xBF:
    return (buffer[4] << 8) + buffer[5] + 6;
  case 0:
    return 0;
  default:
    return 0;
  }
}


x86 assembly (clang, -O0):
<calculate_packet_size>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
jne    113a <calculate_packet_size+0x3a>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x0,%eax
jne    113a <calculate_packet_size+0x3a>
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
cmp    $0x1,%eax
je     1146 <calculate_packet_size+0x46>
movl   $0x0,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
mov    %rax,-0x18(%rbp)
sub    $0xef,%rax
ja     1462 <calculate_packet_size+0x362>
mov    -0x18(%rbp),%rax
lea    0xe97(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xc4,%eax
cmp    $0x44,%eax
jne    11ee <calculate_packet_size+0xee>
mov    -0x10(%rbp),%rax
movzbl 0x6(%rax),%eax
and    $0x4,%eax
cmp    $0x4,%eax
jne    11ee <calculate_packet_size+0xee>
mov    -0x10(%rbp),%rax
movzbl 0x8(%rax),%eax
and    $0x4,%eax
cmp    $0x4,%eax
jne    11ee <calculate_packet_size+0xee>
mov    -0x10(%rbp),%rax
movzbl 0x9(%rax),%eax
and    $0x1,%eax
cmp    $0x1,%eax
jne    11ee <calculate_packet_size+0xee>
mov    -0x10(%rbp),%rax
movzbl 0xc(%rax),%eax
and    $0x3,%eax
cmp    $0x3,%eax
jne    11ee <calculate_packet_size+0xee>
mov    -0x10(%rbp),%rax
movzbl 0xd(%rax),%eax
and    $0x7,%eax
add    $0xe,%eax
mov    %eax,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xf1,%eax
cmp    $0x21,%eax
jne    1264 <calculate_packet_size+0x164>
mov    -0x10(%rbp),%rax
movzbl 0x6(%rax),%eax
and    $0x1,%eax
cmp    $0x1,%eax
jne    1264 <calculate_packet_size+0x164>
mov    -0x10(%rbp),%rax
movzbl 0x8(%rax),%eax
and    $0x1,%eax
cmp    $0x1,%eax
jne    1264 <calculate_packet_size+0x164>
mov    -0x10(%rbp),%rax
movzbl 0x9(%rax),%eax
and    $0x80,%eax
cmp    $0x80,%eax
jne    1264 <calculate_packet_size+0x164>
mov    -0x10(%rbp),%rax
movzbl 0xb(%rax),%eax
and    $0x1,%eax
cmp    $0x1,%eax
jne    1264 <calculate_packet_size+0x164>
movl   $0xc,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x0,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0xa(%rax),%eax
and    $0x20,%eax
cmp    $0x20,%eax
jne    12b0 <calculate_packet_size+0x1b0>
mov    -0x10(%rbp),%rax
movzbl 0xb(%rax),%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     12a4 <calculate_packet_size+0x1a4>
movl   $0x4c,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0xc,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x0,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xf0,%eax
cmp    $0x10,%eax
jne    12f2 <calculate_packet_size+0x1f2>
mov    -0x10(%rbp),%rax
movzbl 0x7(%rax),%eax
and    $0x1,%eax
cmp    $0x1,%eax
jne    12f2 <calculate_packet_size+0x1f2>
movl   $0xa,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xf0,%eax
cmp    $0x20,%eax
jne    133c <calculate_packet_size+0x23c>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    133c <calculate_packet_size+0x23c>
mov    -0x10(%rbp),%rax
movzbl 0x6(%rax),%eax
and    $0x2,%eax
cmp    $0x2,%eax
jne    133c <calculate_packet_size+0x23c>
movl   $0x9,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xf0,%eax
cmp    $0x20,%eax
jne    1386 <calculate_packet_size+0x286>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0x1,%eax
cmp    $0x1,%eax
jne    1386 <calculate_packet_size+0x286>
mov    -0x10(%rbp),%rax
movzbl 0x9(%rax),%eax
and    $0x2,%eax
cmp    $0x2,%eax
jne    1386 <calculate_packet_size+0x286>
movl   $0xc,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xf0,%eax
cmp    $0x40,%eax
jne    13c8 <calculate_packet_size+0x2c8>
mov    -0x10(%rbp),%rax
movzbl 0x8(%rax),%eax
and    $0x40,%eax
cmp    $0x0,%eax
jne    13bc <calculate_packet_size+0x2bc>
movl   $0x9,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0xb,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x0,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
and    $0x40,%eax
cmp    $0x40,%eax
jne    13f4 <calculate_packet_size+0x2f4>
movl   $0x8,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x0,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x4,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
jmp    1411 <calculate_packet_size+0x311>
jmp    1416 <calculate_packet_size+0x316>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
shl    $0x8,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
add    %ecx,%eax
add    $0x6,%eax
mov    %eax,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
shl    $0x8,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x5(%rcx),%ecx
add    %ecx,%eax
add    $0x6,%eax
mov    %eax,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x0,-0x4(%rbp)
jmp    1469 <calculate_packet_size+0x369>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<calculate_packet_size>:
xor    %eax,%eax
cmpb   $0x0,(%rdi)
je     1108 <calculate_packet_size+0x8>
ret
cmpb   $0x0,0x1(%rdi)
jne    1107 <calculate_packet_size+0x7>
cmpb   $0x1,0x2(%rdi)
jne    1107 <calculate_packet_size+0x7>
mov    0x3(%rdi),%cl
lea    0x40(%rcx),%eax
cmp    $0x30,%al
jae    112b <calculate_packet_size+0x2b>
movzwl 0x4(%rdi),%eax
shl    $0x10,%eax
bswap  %eax
add    $0x6,%eax
ret
add    $0x4d,%cl
cmp    $0x4d,%cl
ja     120e <calculate_packet_size+0x10e>
mov    $0x4,%eax
movzbl %cl,%ecx
lea    0xeba(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
testb  $0x20,0xa(%rdi)
mov    $0x0,%eax
je     1107 <calculate_packet_size+0x7>
xor    %eax,%eax
testb  $0x3,0xb(%rdi)
setne  %al
shl    $0x6,%eax
or     $0xc,%eax
ret
mov    0x4(%rdi),%dl
mov    %edx,%ecx
and    $0xf0,%cl
cmp    $0x10,%cl
jne    1182 <calculate_packet_size+0x82>
mov    $0xa,%eax
testb  $0x1,0x7(%rdi)
jne    1107 <calculate_packet_size+0x7>
and    $0xf1,%dl
cmp    $0x21,%dl
je     1211 <calculate_packet_size+0x111>
cmp    $0x20,%dl
jne    1220 <calculate_packet_size+0x120>
mov    $0x9,%eax
testb  $0x2,0x6(%rdi)
jne    1107 <calculate_packet_size+0x7>
jmp    1220 <calculate_packet_size+0x120>
movzbl 0x5(%rdi),%eax
shr    $0x3,%eax
and    $0x8,%eax
ret
mov    0x4(%rdi),%al
mov    %eax,%ecx
and    $0xc4,%cl
cmp    $0x44,%cl
jne    11e7 <calculate_packet_size+0xe7>
testb  $0x4,0x6(%rdi)
je     11e7 <calculate_packet_size+0xe7>
testb  $0x4,0x8(%rdi)
je     11e7 <calculate_packet_size+0xe7>
testb  $0x1,0x9(%rdi)
je     11e7 <calculate_packet_size+0xe7>
mov    0xc(%rdi),%cl
not    %cl
test   $0x3,%cl
jne    11e7 <calculate_packet_size+0xe7>
movzbl 0xd(%rdi),%eax
and    $0x7,%eax
add    $0xe,%eax
ret
and    $0xf1,%al
cmp    $0x21,%al
jne    120e <calculate_packet_size+0x10e>
testb  $0x1,0x6(%rdi)
je     120e <calculate_packet_size+0x10e>
testb  $0x1,0x8(%rdi)
je     120e <calculate_packet_size+0x10e>
cmpb   $0x0,0x9(%rdi)
jns    120e <calculate_packet_size+0x10e>
mov    $0xc,%eax
testb  $0x1,0xb(%rdi)
jne    1107 <calculate_packet_size+0x7>
xor    %eax,%eax
ret
mov    $0xc,%eax
testb  $0x2,0x9(%rdi)
jne    1107 <calculate_packet_size+0x7>
mov    $0x0,%eax
cmp    $0x40,%cl
jne    1107 <calculate_packet_size+0x7>
mov    0x8(%rdi),%al
and    $0x40,%al
shr    $0x6,%al
movzbl %al,%eax
add    %eax,%eax
add    $0x9,%eax
ret

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

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