#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 int uint8_t;
typedef unsigned long uint32_t;

/* Variables and functions */
char *Railgun7g(char *pbTarget, int cbTarget, char *pbPattern, int cbPattern) {
  char *pbTargetMax = pbTarget + cbTarget;
  register unsigned long ulHashPattern;
  register unsigned long ulHashTarget;
  signed long count;
  signed long countSTATIC;
  unsigned char SINGLET;
  unsigned long Quadruplet2nd;
  unsigned long Quadruplet3rd;
  unsigned long Quadruplet4th;
  int AdvanceHopperGrass;
  long i;
  int a, j;
  unsigned char bm_Sunday_Order2[256 * 256];
  int Gulliver;
  if (cbPattern > cbTarget)
    return (NULL);
  if (cbPattern < 4) {
    pbTarget = pbTarget + cbPattern;
    ulHashPattern =
        ((*(char *)(pbPattern)) << 8) + *(pbPattern + (cbPattern - 1));
    if (cbPattern == 3) {
      for (;;) {
        if (ulHashPattern ==
            (uint32_t)((*(uint8_t const *)(pbTarget - 3)) << 8) +
                *(uint8_t const *)(pbTarget - 1)) {
          if (*(uint8_t const *)(pbPattern + 1) ==
              *(uint8_t const *)(pbTarget - 2))
            return ((pbTarget - 3));
        }
        if ((char)(ulHashPattern >> 8) != *(pbTarget - 2))
          pbTarget++;
        pbTarget++;
        if (pbTarget > pbTargetMax)
          return (NULL);
      }
    } else {
    }
    for (;;) {
      if (ulHashPattern == (uint32_t)((*(uint8_t const *)(pbTarget - 2)) << 8) +
                               *(uint8_t const *)(pbTarget - 1))
        return ((pbTarget - 2));
      if ((char)(ulHashPattern >> 8) != *(pbTarget - 1))
        pbTarget++;
      pbTarget++;
      if (pbTarget > pbTargetMax)
        return (NULL);
    }
  } else {
    if (cbTarget < 961) {
      pbTarget = pbTarget + cbPattern;
      ulHashPattern = *(unsigned long *)(pbPattern);
      SINGLET = ulHashPattern & 0xFF;
      Quadruplet2nd = SINGLET << 8;
      Quadruplet3rd = SINGLET << 16;
      Quadruplet4th = SINGLET << 24;
      for (;;) {
        AdvanceHopperGrass = 0;
        ulHashTarget = *(unsigned long *)(pbTarget - cbPattern);
        if (ulHashPattern == ulHashTarget) {
          count = cbPattern - 1;
          while (count && *(char *)(pbPattern + (cbPattern - count)) ==
                              *(char *)(pbTarget - count)) {
            if (cbPattern - 1 == AdvanceHopperGrass + count &&
                SINGLET != *(char *)(pbTarget - count))
              AdvanceHopperGrass++;
            count--;
          }
          if (count == 0)
            return ((pbTarget - cbPattern));
        } else {
          if (Quadruplet2nd != (ulHashTarget & 0x0000FF00)) {
            AdvanceHopperGrass++;
            if (Quadruplet3rd != (ulHashTarget & 0x00FF0000)) {
              AdvanceHopperGrass++;
              if (Quadruplet4th != (ulHashTarget & 0xFF000000))
                AdvanceHopperGrass++;
            }
          }
        }
        AdvanceHopperGrass++;
        pbTarget = pbTarget + AdvanceHopperGrass;
        if (pbTarget > pbTargetMax)
          return (NULL);
      }
    } else {
      countSTATIC = cbPattern - 2 - 2;
      for (a = 0; a < 256 * 256; a++) {
        bm_Sunday_Order2[a] = cbPattern - 1;
      }
      for (j = 0; j < cbPattern - 1; j++)
        bm_Sunday_Order2[*(unsigned short *)(pbPattern + j)] = j;
      ulHashPattern = *(unsigned short *)(pbPattern + cbPattern - 1 - 1);
      ulHashTarget = *(unsigned long *)(pbPattern);
      AdvanceHopperGrass = 0;
      i = 0;
      while (i <= cbTarget - cbPattern - 1 - 1) {
        Gulliver = bm_Sunday_Order2[*(
            unsigned short *)&pbTarget[i + cbPattern - 1 - 1]];
        if (Gulliver == cbPattern - 2) {
          if (*(unsigned long *)&pbTarget[i] == ulHashTarget) {
            count = countSTATIC;
            while (count != 0 &&
                   *(char *)(pbPattern + (countSTATIC - count) + 4) ==
                       *(char *)(&pbTarget[i] + (countSTATIC - count) + 4))
              count--;
            if (count == 0)
              return (pbTarget + i);
          }
          i = i + 1;
        } else if (Gulliver == cbPattern - 1)
          i = i + Gulliver;
        else
          i = i + cbPattern - Gulliver - 2;
        AdvanceHopperGrass++;
      }
      if (i == cbTarget - cbPattern - 1) {
        if (*(unsigned long *)&pbTarget[i] == ulHashPattern) {
          count = countSTATIC;
          while (count != 0 &&
                 *(char *)(pbPattern + (countSTATIC - count) + 4) ==
                     *(char *)(&pbTarget[i] + (countSTATIC - count) + 4))
            count--;
          if (count == 0)
            return (pbTarget + i);
        }
        i++;
        AdvanceHopperGrass++;
      }
      if (i == cbTarget - cbPattern) {
        if (*(unsigned long *)&pbTarget[i] == ulHashPattern) {
          count = countSTATIC;
          while (count != 0 &&
                 *(char *)(pbPattern + (countSTATIC - count) + 4) ==
                     *(char *)(&pbTarget[i] + (countSTATIC - count) + 4))
            count--;
          if (count == 0)
            return (pbTarget + i);
        }
        AdvanceHopperGrass++;
      }
      return (NULL);
    }
  }
}


x86 assembly (clang, -O0):
<Railgun7g>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10020,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jle    1141 <Railgun7g+0x41>
movq   $0x0,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
cmpl   $0x4,-0x24(%rbp)
jge    12c1 <Railgun7g+0x1c1>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
shl    $0x8,%eax
mov    -0x20(%rbp),%rcx
mov    -0x24(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
cltq
mov    %rax,-0x38(%rbp)
cmpl   $0x3,-0x24(%rbp)
jne    122e <Railgun7g+0x12e>
jmp    118c <Railgun7g+0x8c>
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x3(%rcx),%ecx
shl    $0x8,%ecx
movslq %ecx,%rcx
mov    -0x10(%rbp),%rdx
movslq -0x1(%rdx),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jne    11db <Railgun7g+0xdb>
mov    -0x20(%rbp),%rax
mov    0x1(%rax),%eax
mov    -0x10(%rbp),%rcx
cmp    -0x2(%rcx),%eax
jne    11d6 <Railgun7g+0xd6>
mov    -0x10(%rbp),%rax
add    $0xfffffffffffffffd,%rax
mov    %rax,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    11db <Railgun7g+0xdb>
mov    -0x38(%rbp),%rax
shr    $0x8,%rax
movsbl %al,%eax
mov    -0x10(%rbp),%rcx
movsbl -0x2(%rcx),%ecx
cmp    %ecx,%eax
je     1202 <Railgun7g+0x102>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x30(%rbp),%rax
jbe    1229 <Railgun7g+0x129>
movq   $0x0,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    118c <Railgun7g+0x8c>
jmp    1233 <Railgun7g+0x133>
jmp    1238 <Railgun7g+0x138>
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x2(%rcx),%ecx
shl    $0x8,%ecx
movslq %ecx,%rcx
mov    -0x10(%rbp),%rdx
movslq -0x1(%rdx),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jne    126e <Railgun7g+0x16e>
mov    -0x10(%rbp),%rax
add    $0xfffffffffffffffe,%rax
mov    %rax,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
mov    -0x38(%rbp),%rax
shr    $0x8,%rax
movsbl %al,%eax
mov    -0x10(%rbp),%rcx
movsbl -0x1(%rcx),%ecx
cmp    %ecx,%eax
je     1295 <Railgun7g+0x195>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x30(%rbp),%rax
jbe    12bc <Railgun7g+0x1bc>
movq   $0x0,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    1238 <Railgun7g+0x138>
cmpl   $0x3c1,-0x14(%rbp)
jge    14c4 <Railgun7g+0x3c4>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
and    $0xff,%rax
mov    %al,-0x51(%rbp)
movzbl -0x51(%rbp),%eax
shl    $0x8,%eax
cltq
mov    %rax,-0x60(%rbp)
movzbl -0x51(%rbp),%eax
shl    $0x10,%eax
cltq
mov    %rax,-0x68(%rbp)
movzbl -0x51(%rbp),%eax
shl    $0x18,%eax
cltq
mov    %rax,-0x70(%rbp)
movl   $0x0,-0x74(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
mov    (%rax,%rcx,1),%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x40(%rbp),%rax
jne    1417 <Railgun7g+0x317>
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
cltq
mov    %rax,-0x48(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x48(%rbp)
mov    %al,-0x10095(%rbp)
je     138e <Railgun7g+0x28e>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
sub    -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
xor    %edx,%edx
sub    -0x48(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x10095(%rbp)
mov    -0x10095(%rbp),%al
test   $0x1,%al
jne    13a1 <Railgun7g+0x2a1>
jmp    13ee <Railgun7g+0x2ee>
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
cltq
movslq -0x74(%rbp),%rcx
add    -0x48(%rbp),%rcx
cmp    %rcx,%rax
jne    13dd <Railgun7g+0x2dd>
movzbl -0x51(%rbp),%eax
mov    -0x10(%rbp),%rcx
xor    %edx,%edx
sub    -0x48(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
je     13dd <Railgun7g+0x2dd>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
jmp    1352 <Railgun7g+0x252>
cmpq   $0x0,-0x48(%rbp)
jne    1412 <Railgun7g+0x312>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    148c <Railgun7g+0x38c>
mov    -0x60(%rbp),%rax
mov    -0x40(%rbp),%rcx
and    $0xff00,%rcx
cmp    %rcx,%rax
je     1487 <Railgun7g+0x387>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x68(%rbp),%rax
mov    -0x40(%rbp),%rcx
and    $0xff0000,%rcx
cmp    %rcx,%rax
je     1482 <Railgun7g+0x382>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x70(%rbp),%rax
movabs $0xff000000,%rcx
and    -0x40(%rbp),%rcx
cmp    %rcx,%rax
je     147d <Railgun7g+0x37d>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1482 <Railgun7g+0x382>
jmp    1487 <Railgun7g+0x387>
jmp    148c <Railgun7g+0x38c>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x74(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x30(%rbp),%rax
jbe    14bf <Railgun7g+0x3bf>
movq   $0x0,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    131c <Railgun7g+0x21c>
mov    -0x24(%rbp),%eax
sub    $0x2,%eax
sub    $0x2,%eax
cltq
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x84(%rbp)
cmpl   $0x10000,-0x84(%rbp)
jge    1517 <Railgun7g+0x417>
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
mov    %al,%cl
movslq -0x84(%rbp),%rax
mov    %cl,-0x10090(%rbp,%rax,1)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    14dd <Railgun7g+0x3dd>
movl   $0x0,-0x88(%rbp)
mov    -0x88(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1567 <Railgun7g+0x467>
mov    -0x88(%rbp),%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
movslq -0x88(%rbp),%rdx
movzwl (%rax,%rdx,1),%eax
mov    %cl,-0x10090(%rbp,%rax,1)
mov    -0x88(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x88(%rbp)
jmp    1521 <Railgun7g+0x421>
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzwl -0x2(%rax,%rcx,1),%eax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x74(%rbp)
movq   $0x0,-0x80(%rbp)
mov    -0x80(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x24(%rbp),%ecx
sub    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
jg     16fe <Railgun7g+0x5fe>
mov    -0x10(%rbp),%rax
mov    -0x80(%rbp),%rcx
movslq -0x24(%rbp),%rdx
add    %rdx,%rcx
sub    $0x1,%rcx
sub    $0x1,%rcx
movzwl (%rax,%rcx,1),%eax
movzbl -0x10090(%rbp,%rax,1),%eax
ff
mov    %eax,-0x10094(%rbp)
mov    -0x10094(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jne    16a3 <Railgun7g+0x5a3>
mov    -0x10(%rbp),%rax
mov    -0x80(%rbp),%rcx
mov    (%rax,%rcx,1),%rax
cmp    -0x40(%rbp),%rax
jne    1692 <Railgun7g+0x592>
mov    -0x50(%rbp),%rax
mov    %rax,-0x48(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x48(%rbp)
mov    %al,-0x10096(%rbp)
je     164d <Railgun7g+0x54d>
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    -0x48(%rbp),%rcx
movsbl 0x4(%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
add    -0x80(%rbp),%rcx
mov    -0x50(%rbp),%rdx
sub    -0x48(%rbp),%rdx
movsbl 0x4(%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x10096(%rbp)
mov    -0x10096(%rbp),%al
test   $0x1,%al
jne    1660 <Railgun7g+0x560>
jmp    1671 <Railgun7g+0x571>
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
jmp    1609 <Railgun7g+0x509>
cmpq   $0x0,-0x48(%rbp)
jne    168d <Railgun7g+0x58d>
mov    -0x10(%rbp),%rax
add    -0x80(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    1692 <Railgun7g+0x592>
mov    -0x80(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x80(%rbp)
jmp    16f0 <Railgun7g+0x5f0>
mov    -0x10094(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    16ce <Railgun7g+0x5ce>
mov    -0x80(%rbp),%rax
movslq -0x10094(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x80(%rbp)
jmp    16eb <Railgun7g+0x5eb>
mov    -0x80(%rbp),%rax
movslq -0x24(%rbp),%rcx
add    %rcx,%rax
movslq -0x10094(%rbp),%rcx
sub    %rcx,%rax
sub    $0x2,%rax
mov    %rax,-0x80(%rbp)
jmp    16f0 <Railgun7g+0x5f0>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1592 <Railgun7g+0x492>
mov    -0x80(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
jne    17d3 <Railgun7g+0x6d3>
mov    -0x10(%rbp),%rax
mov    -0x80(%rbp),%rcx
mov    (%rax,%rcx,1),%rax
cmp    -0x38(%rbp),%rax
jne    17be <Railgun7g+0x6be>
mov    -0x50(%rbp),%rax
mov    %rax,-0x48(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x48(%rbp)
mov    %al,-0x10097(%rbp)
je     1779 <Railgun7g+0x679>
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    -0x48(%rbp),%rcx
movsbl 0x4(%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
add    -0x80(%rbp),%rcx
mov    -0x50(%rbp),%rdx
sub    -0x48(%rbp),%rdx
movsbl 0x4(%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x10097(%rbp)
mov    -0x10097(%rbp),%al
test   $0x1,%al
jne    178c <Railgun7g+0x68c>
jmp    179d <Railgun7g+0x69d>
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
jmp    1735 <Railgun7g+0x635>
cmpq   $0x0,-0x48(%rbp)
jne    17b9 <Railgun7g+0x6b9>
mov    -0x10(%rbp),%rax
add    -0x80(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    17be <Railgun7g+0x6be>
mov    -0x80(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x80(%rbp)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
mov    -0x80(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
jne    1899 <Railgun7g+0x799>
mov    -0x10(%rbp),%rax
mov    -0x80(%rbp),%rcx
mov    (%rax,%rcx,1),%rax
cmp    -0x38(%rbp),%rax
jne    1890 <Railgun7g+0x790>
mov    -0x50(%rbp),%rax
mov    %rax,-0x48(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x48(%rbp)
mov    %al,-0x10098(%rbp)
je     184b <Railgun7g+0x74b>
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    -0x48(%rbp),%rcx
movsbl 0x4(%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
add    -0x80(%rbp),%rcx
mov    -0x50(%rbp),%rdx
sub    -0x48(%rbp),%rdx
movsbl 0x4(%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x10098(%rbp)
mov    -0x10098(%rbp),%al
test   $0x1,%al
jne    185e <Railgun7g+0x75e>
jmp    186f <Railgun7g+0x76f>
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
jmp    1807 <Railgun7g+0x707>
cmpq   $0x0,-0x48(%rbp)
jne    188b <Railgun7g+0x78b>
mov    -0x10(%rbp),%rax
add    -0x80(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    18a1 <Railgun7g+0x7a1>
jmp    1890 <Railgun7g+0x790>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x10020,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Railgun7g>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x10028,%rsp
mov    %esi,%r12d
sub    %ecx,%r12d
jge    113d <Railgun7g+0x2d>
xor    %eax,%eax
add    $0x10028,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %ecx,%r15d
mov    %rdx,%r14
mov    %rdi,%rbx
movslq %esi,%r8
add    %rdi,%r8
cmp    $0x3,%ecx
jg     120b <Railgun7g+0xfb>
movslq %r15d,%rax
add    %rax,%rbx
movsbq (%r14),%rsi
shl    $0x8,%rsi
movsbq -0x1(%rax,%r14,1),%rdx
add    %rsi,%rdx
mov    %edx,%esi
shl    $0x10,%esi
xor    %eax,%eax
cmp    $0x3,%r15d
je     11df <Railgun7g+0xcf>
nopl   0x0(%rax)
mov    -0x2(%rbx),%ecx
shl    $0x8,%ecx
movslq %ecx,%rcx
movslq -0x1(%rbx),%rdi
add    %rdi,%rcx
cmp    %rdx,%rcx
je     1349 <Railgun7g+0x239>
shl    $0x18,%edi
xor    %esi,%edi
cmp    $0x1000000,%edi
sbb    $0xffffffffffffffff,%rbx
add    $0x1,%rbx
cmp    %r8,%rbx
jbe    1180 <Railgun7g+0x70>
jmp    112b <Railgun7g+0x1b>
cs nopw 0x0(%rax,%rax,1)
shr    $0x8,%ebp
shl    $0x18,%ebp
xor    %esi,%ebp
cmp    $0x1000000,%ebp
sbb    $0xffffffffffffffff,%rbx
add    $0x1,%rbx
cmp    %r8,%rbx
ja     112b <Railgun7g+0x1b>
mov    -0x3(%rbx),%ebp
mov    %ebp,%edi
shl    $0x8,%edi
movslq %edi,%rdi
movslq -0x1(%rbx),%rcx
add    %rdi,%rcx
cmp    %rdx,%rcx
jne    11c0 <Railgun7g+0xb0>
mov    -0x2(%rbx),%ebp
cmp    %ebp,0x1(%r14)
jne    11c3 <Railgun7g+0xb3>
add    $0xfffffffffffffffd,%rbx
mov    %rbx,%rax
jmp    112b <Railgun7g+0x1b>
cmp    $0x3c0,%esi
jg     125c <Railgun7g+0x14c>
mov    %r15d,%r13d
add    %r13,%rbx
mov    (%r14),%r11
movzbl %r11b,%edi
mov    %edi,%r9d
shl    $0x8,%r9d
mov    %edi,%eax
shl    $0x10,%eax
mov    %rax,0x8(%rsp)
mov    %r11d,%eax
shl    $0x18,%eax
cltq
mov    %rax,(%rsp)
mov    %r13,%r12
neg    %r12
add    $0xffffffff,%r15d
mov    %r15,%rdx
neg    %rdx
sub    %r15,%r13
add    %r14,%r13
xor    %eax,%eax
mov    %r9,0x10(%rsp)
jmp    12ac <Railgun7g+0x19c>
lea    -0x1(%r15),%eax
movzbl %al,%esi
lea    0x20(%rsp),%rdi
mov    $0x10000,%edx
call   1030 <memset@plt>
lea    -0x1(%r15),%r10d
lea    -0x1(%r10),%rcx
mov    %r10d,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    1355 <Railgun7g+0x245>
xor    %esi,%esi
jmp    139d <Railgun7g+0x28d>
mov    0x10(%rsp),%r9
mov    %r14,%rdx
movslq %ebp,%rcx
add    %rcx,%rbx
add    $0x1,%rbx
cmp    %r8,%rbx
ja     112b <Railgun7g+0x1b>
mov    (%rbx,%r12,1),%rsi
cmp    %rsi,%r11
jne    1300 <Railgun7g+0x1f0>
lea    (%rbx,%r12,1),%rcx
mov    %rcx,0x18(%rsp)
mov    %rdx,%r14
lea    (%rbx,%rdx,1),%rsi
xor    %r10d,%r10d
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
movsbl 0x0(%r13,%r10,1),%r9d
cmp    (%rsi,%r10,1),%r9b
jne    1291 <Railgun7g+0x181>
mov    %ebp,%ecx
cmp    %r10,%rcx
sete   %cl
cmp    %r9d,%edi
setne  %dl
and    %cl,%dl
movzbl %dl,%ecx
add    %ecx,%ebp
add    $0x1,%r10
cmp    %r10,%r15
jne    12d0 <Railgun7g+0x1c0>
jmp    133f <Railgun7g+0x22f>
nopl   0x0(%rax)
mov    %esi,%ecx
and    $0xff00,%ecx
xor    %ebp,%ebp
cmp    %r9,%rcx
je     1299 <Railgun7g+0x189>
mov    %esi,%ecx
and    $0xff0000,%ecx
mov    $0x1,%ebp
cmp    0x8(%rsp),%rcx
je     1299 <Railgun7g+0x189>
and    $0xff000000,%esi
xor    %ebp,%ebp
cmp    (%rsp),%rsi
sete   %bpl
xor    $0x3,%ebp
jmp    1299 <Railgun7g+0x189>
mov    0x18(%rsp),%rax
jmp    112b <Railgun7g+0x1b>
add    $0xfffffffffffffffe,%rbx
mov    %rbx,%rax
jmp    112b <Railgun7g+0x1b>
mov    %r10d,%ecx
and    $0xfffffffc,%ecx
xor    %esi,%esi
nopl   (%rax)
movzwl (%r14,%rsi,1),%edx
mov    %sil,0x20(%rsp,%rdx,1)
movzwl 0x1(%r14,%rsi,1),%edx
lea    0x1(%rsi),%edi
mov    %dil,0x20(%rsp,%rdx,1)
movzwl 0x2(%r14,%rsi,1),%edx
lea    0x2(%rsi),%edi
mov    %dil,0x20(%rsp,%rdx,1)
movzwl 0x3(%r14,%rsi,1),%edx
lea    0x3(%rsi),%edi
mov    %dil,0x20(%rsp,%rdx,1)
add    $0x4,%rsi
cmp    %rcx,%rsi
jne    1360 <Railgun7g+0x250>
lea    -0x4(%r15),%r13d
test   %rax,%rax
je     13c4 <Railgun7g+0x2b4>
cs nopw 0x0(%rax,%rax,1)
movzwl (%r14,%rsi,1),%edx
mov    %sil,0x20(%rsp,%rdx,1)
add    $0x1,%rsi
add    $0xffffffffffffffff,%rax
jne    13b0 <Railgun7g+0x2a0>
movslq %r15d,%rsi
movzwl -0x2(%r14,%rsi,1),%r8d
cmp    $0x2,%r12d
jge    141c <Railgun7g+0x30c>
xor    %edi,%edi
lea    -0x1(%r12),%eax
cltq
cmp    %rax,%rdi
jne    149c <Railgun7g+0x38c>
cmp    %r8,(%rbx,%rdi,1)
jne    1498 <Railgun7g+0x388>
lea    (%rbx,%rdi,1),%rax
test   %r13,%r13
je     112b <Railgun7g+0x1b>
xor    %edx,%edx
movzbl 0x4(%r14,%rdx,1),%ecx
cmp    0x4(%rax,%rdx,1),%cl
jne    1498 <Railgun7g+0x388>
add    $0x1,%rdx
cmp    %rdx,%r13
jne    13fe <Railgun7g+0x2ee>
jmp    112b <Railgun7g+0x1b>
add    $0xfffffffe,%r15d
mov    (%r14),%r9
lea    -0x2(%r12),%eax
movslq %eax,%r11
xor    %edi,%edi
jmp    1438 <Railgun7g+0x328>
add    $0x1,%rdi
cmp    %r11,%rdi
jg     13d5 <Railgun7g+0x2c5>
lea    (%rdi,%rsi,1),%rax
movzwl -0x2(%rbx,%rax,1),%eax
movzbl 0x20(%rsp,%rax,1),%ebp
cmp    %ebp,%r15d
jne    1480 <Railgun7g+0x370>
cmp    %r9,(%rbx,%rdi,1)
jne    142f <Railgun7g+0x31f>
lea    (%rbx,%rdi,1),%rax
test   %r13,%r13
je     112b <Railgun7g+0x1b>
xor    %ebp,%ebp
movzbl 0x4(%r14,%rbp,1),%edx
cmp    0x4(%rax,%rbp,1),%dl
jne    142f <Railgun7g+0x31f>
add    $0x1,%rbp
cmp    %rbp,%r13
jne    1460 <Railgun7g+0x350>
jmp    112b <Railgun7g+0x1b>
nopw   0x0(%rax,%rax,1)
mov    %ebp,%eax
cmp    %ebp,%r10d
jne    148c <Railgun7g+0x37c>
add    %rax,%rdi
jmp    1433 <Railgun7g+0x323>
add    %rsi,%rdi
add    $0xfffffffffffffffe,%rdi
sub    %rax,%rdi
jmp    1433 <Railgun7g+0x323>
add    $0x1,%rdi
movslq %r12d,%rax
cmp    %rax,%rdi
jne    1129 <Railgun7g+0x19>
cmp    %r8,(%rbx,%rdi,1)
jne    1129 <Railgun7g+0x19>
add    %rdi,%rbx
test   %r13,%r13
je     14d7 <Railgun7g+0x3c7>
xor    %eax,%eax
xor    %edx,%edx
movzbl 0x4(%r14,%rdx,1),%ecx
cmp    0x4(%rbx,%rdx,1),%cl
jne    112b <Railgun7g+0x1b>
add    $0x1,%rdx
cmp    %rdx,%r13
jne    14be <Railgun7g+0x3ae>
mov    %rbx,%rax
jmp    112b <Railgun7g+0x1b>

LLVM IR (-O0):
define i8* @Railgun7g(i8* %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i8*
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
%15 = alloca i8
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca i32
%20 = alloca i64
%21 = alloca i32
%22 = alloca i32
%23 = alloca [65536 x i8]
%24 = alloca i32
store i8* %0, i8** %6
store i32 %1, i32* %7
store i8* %2, i8** %8
store i32 %3, i32* %9
%25 = load i8*, i8** %6
%26 = load i32, i32* %7
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %25, i64 %27
store i8* %28, i8** %10
%29 = load i32, i32* %9
%30 = load i32, i32* %7
%31 = icmp sgt i32 %29, %30
br i1 %31, label %32, label %33
32: ; preds = %4
store i8* null, i8** %5
br label %549
33: ; preds = %4
%34 = load i32, i32* %9
%35 = icmp slt i32 %34, 4
br i1 %35, label %36, label %148
36: ; preds = %33
%37 = load i8*, i8** %6
%38 = load i32, i32* %9
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
store i8* %40, i8** %6
%41 = load i8*, i8** %8
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = shl i32 %43, 8
%45 = load i8*, i8** %8
%46 = load i32, i32* %9
%47 = sub nsw i32 %46, 1
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %45, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = add nsw i32 %44, %51
%53 = sext i32 %52 to i64
store i64 %53, i64* %11
%54 = load i32, i32* %9
%55 = icmp eq i32 %54, 3
br i1 %55, label %56, label %107
56: ; preds = %36
br label %57
57: ; preds = %106, %56
%58 = load i64, i64* %11
%59 = load i8*, i8** %6
%60 = getelementptr inbounds i8, i8* %59, i64 -3
%61 = bitcast i8* %60 to i32*
%62 = load i32, i32* %61
%63 = shl i32 %62, 8
%64 = sext i32 %63 to i64
%65 = load i8*, i8** %6
%66 = getelementptr inbounds i8, i8* %65, i64 -1
%67 = bitcast i8* %66 to i32*
%68 = load i32, i32* %67
%69 = sext i32 %68 to i64
%70 = add i64 %64, %69
%71 = icmp eq i64 %58, %70
br i1 %71, label %72, label %86
72: ; preds = %57
%73 = load i8*, i8** %8
%74 = getelementptr inbounds i8, i8* %73, i64 1
%75 = bitcast i8* %74 to i32*
%76 = load i32, i32* %75
%77 = load i8*, i8** %6
%78 = getelementptr inbounds i8, i8* %77, i64 -2
%79 = bitcast i8* %78 to i32*
%80 = load i32, i32* %79
%81 = icmp eq i32 %76, %80
br i1 %81, label %82, label %85
82: ; preds = %72
%83 = load i8*, i8** %6
%84 = getelementptr inbounds i8, i8* %83, i64 -3
store i8* %84, i8** %5
br label %549
85: ; preds = %72
br label %86
86: ; preds = %85, %57
%87 = load i64, i64* %11
%88 = lshr i64 %87, 8
%89 = trunc i64 %88 to i8
%90 = sext i8 %89 to i32
%91 = load i8*, i8** %6
%92 = getelementptr inbounds i8, i8* %91, i64 -2
%93 = load i8, i8* %92
%94 = sext i8 %93 to i32
%95 = icmp ne i32 %90, %94
br i1 %95, label %96, label %99
96: ; preds = %86
%97 = load i8*, i8** %6
%98 = getelementptr inbounds i8, i8* %97, i32 1
store i8* %98, i8** %6
br label %99
99: ; preds = %96, %86
%100 = load i8*, i8** %6
%101 = getelementptr inbounds i8, i8* %100, i32 1
store i8* %101, i8** %6
%102 = load i8*, i8** %6
%103 = load i8*, i8** %10
%104 = icmp ugt i8* %102, %103
br i1 %104, label %105, label %106
105: ; preds = %99
store i8* null, i8** %5
br label %549
106: ; preds = %99
br label %57
107: ; preds = %36
br label %108
108: ; preds = %107
br label %109
109: ; preds = %147, %108
%110 = load i64, i64* %11
%111 = load i8*, i8** %6
%112 = getelementptr inbounds i8, i8* %111, i64 -2
%113 = bitcast i8* %112 to i32*
%114 = load i32, i32* %113
%115 = shl i32 %114, 8
%116 = sext i32 %115 to i64
%117 = load i8*, i8** %6
%118 = getelementptr inbounds i8, i8* %117, i64 -1
%119 = bitcast i8* %118 to i32*
%120 = load i32, i32* %119
%121 = sext i32 %120 to i64
%122 = add i64 %116, %121
%123 = icmp eq i64 %110, %122
br i1 %123, label %124, label %127
124: ; preds = %109
%125 = load i8*, i8** %6
%126 = getelementptr inbounds i8, i8* %125, i64 -2
store i8* %126, i8** %5
br label %549
127: ; preds = %109
%128 = load i64, i64* %11
%129 = lshr i64 %128, 8
%130 = trunc i64 %129 to i8
%131 = sext i8 %130 to i32
%132 = load i8*, i8** %6
%133 = getelementptr inbounds i8, i8* %132, i64 -1
%134 = load i8, i8* %133
%135 = sext i8 %134 to i32
%136 = icmp ne i32 %131, %135
br i1 %136, label %137, label %140
137: ; preds = %127
%138 = load i8*, i8** %6
%139 = getelementptr inbounds i8, i8* %138, i32 1
store i8* %139, i8** %6
br label %140
140: ; preds = %137, %127
%141 = load i8*, i8** %6
%142 = getelementptr inbounds i8, i8* %141, i32 1
store i8* %142, i8** %6
%143 = load i8*, i8** %6
%144 = load i8*, i8** %10
%145 = icmp ugt i8* %143, %144
br i1 %145, label %146, label %147
146: ; preds = %140
store i8* null, i8** %5
br label %549
147: ; preds = %140
br label %109
148: ; preds = %33
%149 = load i32, i32* %7
%150 = icmp slt i32 %149, 961
br i1 %150, label %151, label %282
151: ; preds = %148
%152 = load i8*, i8** %6
%153 = load i32, i32* %9
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds i8, i8* %152, i64 %154
store i8* %155, i8** %6
%156 = load i8*, i8** %8
%157 = bitcast i8* %156 to i64*
%158 = load i64, i64* %157
store i64 %158, i64* %11
%159 = load i64, i64* %11
%160 = and i64 %159, 255
%161 = trunc i64 %160 to i8
store i8 %161, i8* %15
%162 = load i8, i8* %15
%163 = zext i8 %162 to i32
%164 = shl i32 %163, 8
%165 = sext i32 %164 to i64
store i64 %165, i64* %16
%166 = load i8, i8* %15
%167 = zext i8 %166 to i32
%168 = shl i32 %167, 16
%169 = sext i32 %168 to i64
store i64 %169, i64* %17
%170 = load i8, i8* %15
%171 = zext i8 %170 to i32
%172 = shl i32 %171, 24
%173 = sext i32 %172 to i64
store i64 %173, i64* %18
br label %174
174: ; preds = %281, %151
store i32 0, i32* %19
%175 = load i8*, i8** %6
%176 = load i32, i32* %9
%177 = sext i32 %176 to i64
%178 = sub i64 0, %177
%179 = getelementptr inbounds i8, i8* %175, i64 %178
%180 = bitcast i8* %179 to i64*
%181 = load i64, i64* %180
store i64 %181, i64* %12
%182 = load i64, i64* %11
%183 = load i64, i64* %12
%184 = icmp eq i64 %182, %183
br i1 %184, label %185, label %245
185: ; preds = %174
%186 = load i32, i32* %9
%187 = sub nsw i32 %186, 1
%188 = sext i32 %187 to i64
store i64 %188, i64* %13
br label %189
189: ; preds = %232, %185
%190 = load i64, i64* %13
%191 = icmp ne i64 %190, 0
br i1 %191, label %192, label %208
192: ; preds = %189
%193 = load i8*, i8** %8
%194 = load i32, i32* %9
%195 = sext i32 %194 to i64
%196 = load i64, i64* %13
%197 = sub nsw i64 %195, %196
%198 = getelementptr inbounds i8, i8* %193, i64 %197
%199 = load i8, i8* %198
%200 = sext i8 %199 to i32
%201 = load i8*, i8** %6
%202 = load i64, i64* %13
%203 = sub i64 0, %202
%204 = getelementptr inbounds i8, i8* %201, i64 %203
%205 = load i8, i8* %204
%206 = sext i8 %205 to i32
%207 = icmp eq i32 %200, %206
br label %208
208: ; preds = %192, %189
%209 = phi i1 [ false, %189 ], [ %207, %192 ]
br i1 %209, label %210, label %235
210: ; preds = %208
%211 = load i32, i32* %9
%212 = sub nsw i32 %211, 1
%213 = sext i32 %212 to i64
%214 = load i32, i32* %19
%215 = sext i32 %214 to i64
%216 = load i64, i64* %13
%217 = add nsw i64 %215, %216
%218 = icmp eq i64 %213, %217
br i1 %218, label %219, label %232
219: ; preds = %210
%220 = load i8, i8* %15
%221 = zext i8 %220 to i32
%222 = load i8*, i8** %6
%223 = load i64, i64* %13
%224 = sub i64 0, %223
%225 = getelementptr inbounds i8, i8* %222, i64 %224
%226 = load i8, i8* %225
%227 = sext i8 %226 to i32
%228 = icmp ne i32 %221, %227
br i1 %228, label %229, label %232
229: ; preds = %219
%230 = load i32, i32* %19
%231 = add nsw i32 %230, 1
store i32 %231, i32* %19
br label %232
232: ; preds = %229, %219, %210
%233 = load i64, i64* %13
%234 = add nsw i64 %233, -1
store i64 %234, i64* %13
br label %189
235: ; preds = %208
%236 = load i64, i64* %13
%237 = icmp eq i64 %236, 0
br i1 %237, label %238, label %244
238: ; preds = %235
%239 = load i8*, i8** %6
%240 = load i32, i32* %9
%241 = sext i32 %240 to i64
%242 = sub i64 0, %241
%243 = getelementptr inbounds i8, i8* %239, i64 %242
store i8* %243, i8** %5
br label %549
244: ; preds = %235
br label %270
245: ; preds = %174
%246 = load i64, i64* %16
%247 = load i64, i64* %12
%248 = and i64 %247, 65280
%249 = icmp ne i64 %246, %248
br i1 %249, label %250, label %269
250: ; preds = %245
%251 = load i32, i32* %19
%252 = add nsw i32 %251, 1
store i32 %252, i32* %19
%253 = load i64, i64* %17
%254 = load i64, i64* %12
%255 = and i64 %254, 16711680
%256 = icmp ne i64 %253, %255
br i1 %256, label %257, label %268
257: ; preds = %250
%258 = load i32, i32* %19
%259 = add nsw i32 %258, 1
store i32 %259, i32* %19
%260 = load i64, i64* %18
%261 = load i64, i64* %12
%262 = and i64 %261, 4278190080
%263 = icmp ne i64 %260, %262
br i1 %263, label %264, label %267
264: ; preds = %257
%265 = load i32, i32* %19
%266 = add nsw i32 %265, 1
store i32 %266, i32* %19
br label %267
267: ; preds = %264, %257
br label %268
268: ; preds = %267, %250
br label %269
269: ; preds = %268, %245
br label %270
270: ; preds = %269, %244
%271 = load i32, i32* %19
%272 = add nsw i32 %271, 1
store i32 %272, i32* %19
%273 = load i8*, i8** %6
%274 = load i32, i32* %19
%275 = sext i32 %274 to i64
%276 = getelementptr inbounds i8, i8* %273, i64 %275
store i8* %276, i8** %6
%277 = load i8*, i8** %6
%278 = load i8*, i8** %10
%279 = icmp ugt i8* %277, %278
br i1 %279, label %280, label %281
280: ; preds = %270
store i8* null, i8** %5
br label %549
281: ; preds = %270
br label %174
282: ; preds = %148
%283 = load i32, i32* %9
%284 = sub nsw i32 %283, 2
%285 = sub nsw i32 %284, 2
%286 = sext i32 %285 to i64
store i64 %286, i64* %14
store i32 0, i32* %21
br label %287
287: ; preds = %297, %282
%288 = load i32, i32* %21
%289 = icmp slt i32 %288, 65536
br i1 %289, label %290, label %300
290: ; preds = %287
%291 = load i32, i32* %9
%292 = sub nsw i32 %291, 1
%293 = trunc i32 %292 to i8
%294 = load i32, i32* %21
%295 = sext i32 %294 to i64
%296 = getelementptr inbounds [65536 x i8], [65536 x i8]* %23, i64 0, i64 %295
store i8 %293, i8* %296
br label %297
297: ; preds = %290
%298 = load i32, i32* %21
%299 = add nsw i32 %298, 1
store i32 %299, i32* %21
br label %287
300: ; preds = %287
store i32 0, i32* %22
br label %301
301: ; preds = %317, %300
%302 = load i32, i32* %22
%303 = load i32, i32* %9
%304 = sub nsw i32 %303, 1
%305 = icmp slt i32 %302, %304
br i1 %305, label %306, label %320
306: ; preds = %301
%307 = load i32, i32* %22
%308 = trunc i32 %307 to i8
%309 = load i8*, i8** %8
%310 = load i32, i32* %22
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds i8, i8* %309, i64 %311
%313 = bitcast i8* %312 to i16*
%314 = load i16, i16* %313
%315 = zext i16 %314 to i64
%316 = getelementptr inbounds [65536 x i8], [65536 x i8]* %23, i64 0, i64 %315
store i8 %308, i8* %316
br label %317
317: ; preds = %306
%318 = load i32, i32* %22
%319 = add nsw i32 %318, 1
store i32 %319, i32* %22
br label %301
320: ; preds = %301
%321 = load i8*, i8** %8
%322 = load i32, i32* %9
%323 = sext i32 %322 to i64
%324 = getelementptr inbounds i8, i8* %321, i64 %323
%325 = getelementptr inbounds i8, i8* %324, i64 -1
%326 = getelementptr inbounds i8, i8* %325, i64 -1
%327 = bitcast i8* %326 to i16*
%328 = load i16, i16* %327
%329 = zext i16 %328 to i64
store i64 %329, i64* %11
%330 = load i8*, i8** %8
%331 = bitcast i8* %330 to i64*
%332 = load i64, i64* %331
store i64 %332, i64* %12
store i32 0, i32* %19
store i64 0, i64* %20
br label %333
333: ; preds = %430, %320
%334 = load i64, i64* %20
%335 = load i32, i32* %7
%336 = load i32, i32* %9
%337 = sub nsw i32 %335, %336
%338 = sub nsw i32 %337, 1
%339 = sub nsw i32 %338, 1
%340 = sext i32 %339 to i64
%341 = icmp sle i64 %334, %340
br i1 %341, label %342, label %433
342: ; preds = %333
%343 = load i8*, i8** %6
%344 = load i64, i64* %20
%345 = load i32, i32* %9
%346 = sext i32 %345 to i64
%347 = add nsw i64 %344, %346
%348 = sub nsw i64 %347, 1
%349 = sub nsw i64 %348, 1
%350 = getelementptr inbounds i8, i8* %343, i64 %349
%351 = bitcast i8* %350 to i16*
%352 = load i16, i16* %351
%353 = zext i16 %352 to i64
%354 = getelementptr inbounds [65536 x i8], [65536 x i8]* %23, i64 0, i64 %353
%355 = load i8, i8* %354
%356 = zext i8 %355 to i32
store i32 %356, i32* %24
%357 = load i32, i32* %24
%358 = load i32, i32* %9
%359 = sub nsw i32 %358, 2
%360 = icmp eq i32 %357, %359
br i1 %360, label %361, label %410
361: ; preds = %342
%362 = load i8*, i8** %6
%363 = load i64, i64* %20
%364 = getelementptr inbounds i8, i8* %362, i64 %363
%365 = bitcast i8* %364 to i64*
%366 = load i64, i64* %365
%367 = load i64, i64* %12
%368 = icmp eq i64 %366, %367
br i1 %368, label %369, label %407
369: ; preds = %361
%370 = load i64, i64* %14
store i64 %370, i64* %13
br label %371
371: ; preds = %396, %369
%372 = load i64, i64* %13
%373 = icmp ne i64 %372, 0
br i1 %373, label %374, label %394
374: ; preds = %371
%375 = load i8*, i8** %8
%376 = load i64, i64* %14
%377 = load i64, i64* %13
%378 = sub nsw i64 %376, %377
%379 = getelementptr inbounds i8, i8* %375, i64 %378
%380 = getelementptr inbounds i8, i8* %379, i64 4
%381 = load i8, i8* %380
%382 = sext i8 %381 to i32
%383 = load i8*, i8** %6
%384 = load i64, i64* %20
%385 = getelementptr inbounds i8, i8* %383, i64 %384
%386 = load i64, i64* %14
%387 = load i64, i64* %13
%388 = sub nsw i64 %386, %387
%389 = getelementptr inbounds i8, i8* %385, i64 %388
%390 = getelementptr inbounds i8, i8* %389, i64 4
%391 = load i8, i8* %390
%392 = sext i8 %391 to i32
%393 = icmp eq i32 %382, %392
br label %394
394: ; preds = %374, %371
%395 = phi i1 [ false, %371 ], [ %393, %374 ]
br i1 %395, label %396, label %399
396: ; preds = %394
%397 = load i64, i64* %13
%398 = add nsw i64 %397, -1
store i64 %398, i64* %13
br label %371
399: ; preds = %394
%400 = load i64, i64* %13
%401 = icmp eq i64 %400, 0
br i1 %401, label %402, label %406
402: ; preds = %399
%403 = load i8*, i8** %6
%404 = load i64, i64* %20
%405 = getelementptr inbounds i8, i8* %403, i64 %404
store i8* %405, i8** %5
br label %549
406: ; preds = %399
br label %407
407: ; preds = %406, %361
%408 = load i64, i64* %20
%409 = add nsw i64 %408, 1
store i64 %409, i64* %20
br label %430
410: ; preds = %342
%411 = load i32, i32* %24
%412 = load i32, i32* %9
%413 = sub nsw i32 %412, 1
%414 = icmp eq i32 %411, %413
br i1 %414, label %415, label %420
415: ; preds = %410
%416 = load i64, i64* %20
%417 = load i32, i32* %24
%418 = sext i32 %417 to i64
%419 = add nsw i64 %416, %418
store i64 %419, i64* %20
br label %429
420: ; preds = %410
%421 = load i64, i64* %20
%422 = load i32, i32* %9
%423 = sext i32 %422 to i64
%424 = add nsw i64 %421, %423
%425 = load i32, i32* %24
%426 = sext i32 %425 to i64
%427 = sub nsw i64 %424, %426
%428 = sub nsw i64 %427, 2
store i64 %428, i64* %20
br label %429
429: ; preds = %420, %415
br label %430
430: ; preds = %429, %407
%431 = load i32, i32* %19
%432 = add nsw i32 %431, 1
store i32 %432, i32* %19
br label %333
433: ; preds = %333
%434 = load i64, i64* %20
%435 = load i32, i32* %7
%436 = load i32, i32* %9
%437 = sub nsw i32 %435, %436
%438 = sub nsw i32 %437, 1
%439 = sext i32 %438 to i64
%440 = icmp eq i64 %434, %439
br i1 %440, label %441, label %492
441: ; preds = %433
%442 = load i8*, i8** %6
%443 = load i64, i64* %20
%444 = getelementptr inbounds i8, i8* %442, i64 %443
%445 = bitcast i8* %444 to i64*
%446 = load i64, i64* %445
%447 = load i64, i64* %11
%448 = icmp eq i64 %446, %447
br i1 %448, label %449, label %487
449: ; preds = %441
%450 = load i64, i64* %14
store i64 %450, i64* %13
br label %451
451: ; preds = %476, %449
%452 = load i64, i64* %13
%453 = icmp ne i64 %452, 0
br i1 %453, label %454, label %474
454: ; preds = %451
%455 = load i8*, i8** %8
%456 = load i64, i64* %14
%457 = load i64, i64* %13
%458 = sub nsw i64 %456, %457
%459 = getelementptr inbounds i8, i8* %455, i64 %458
%460 = getelementptr inbounds i8, i8* %459, i64 4
%461 = load i8, i8* %460
%462 = sext i8 %461 to i32
%463 = load i8*, i8** %6
%464 = load i64, i64* %20
%465 = getelementptr inbounds i8, i8* %463, i64 %464
%466 = load i64, i64* %14
%467 = load i64, i64* %13
%468 = sub nsw i64 %466, %467
%469 = getelementptr inbounds i8, i8* %465, i64 %468
%470 = getelementptr inbounds i8, i8* %469, i64 4
%471 = load i8, i8* %470
%472 = sext i8 %471 to i32
%473 = icmp eq i32 %462, %472
br label %474
474: ; preds = %454, %451
%475 = phi i1 [ false, %451 ], [ %473, %454 ]
br i1 %475, label %476, label %479
476: ; preds = %474
%477 = load i64, i64* %13
%478 = add nsw i64 %477, -1
store i64 %478, i64* %13
br label %451
479: ; preds = %474
%480 = load i64, i64* %13
%481 = icmp eq i64 %480, 0
br i1 %481, label %482, label %486
482: ; preds = %479
%483 = load i8*, i8** %6
%484 = load i64, i64* %20
%485 = getelementptr inbounds i8, i8* %483, i64 %484
store i8* %485, i8** %5
br label %549
486: ; preds = %479
br label %487
487: ; preds = %486, %441
%488 = load i64, i64* %20
%489 = add nsw i64 %488, 1
store i64 %489, i64* %20
%490 = load i32, i32* %19
%491 = add nsw i32 %490, 1
store i32 %491, i32* %19
br label %492
492: ; preds = %487, %433
%493 = load i64, i64* %20
%494 = load i32, i32* %7
%495 = load i32, i32* %9
%496 = sub nsw i32 %494, %495
%497 = sext i32 %496 to i64
%498 = icmp eq i64 %493, %497
br i1 %498, label %499, label %548
499: ; preds = %492
%500 = load i8*, i8** %6
%501 = load i64, i64* %20
%502 = getelementptr inbounds i8, i8* %500, i64 %501
%503 = bitcast i8* %502 to i64*
%504 = load i64, i64* %503
%505 = load i64, i64* %11
%506 = icmp eq i64 %504, %505
br i1 %506, label %507, label %545
507: ; preds = %499
%508 = load i64, i64* %14
store i64 %508, i64* %13
br label %509
509: ; preds = %534, %507
%510 = load i64, i64* %13
%511 = icmp ne i64 %510, 0
br i1 %511, label %512, label %532
512: ; preds = %509
%513 = load i8*, i8** %8
%514 = load i64, i64* %14
%515 = load i64, i64* %13
%516 = sub nsw i64 %514, %515
%517 = getelementptr inbounds i8, i8* %513, i64 %516
%518 = getelementptr inbounds i8, i8* %517, i64 4
%519 = load i8, i8* %518
%520 = sext i8 %519 to i32
%521 = load i8*, i8** %6
%522 = load i64, i64* %20
%523 = getelementptr inbounds i8, i8* %521, i64 %522
%524 = load i64, i64* %14
%525 = load i64, i64* %13
%526 = sub nsw i64 %524, %525
%527 = getelementptr inbounds i8, i8* %523, i64 %526
%528 = getelementptr inbounds i8, i8* %527, i64 4
%529 = load i8, i8* %528
%530 = sext i8 %529 to i32
%531 = icmp eq i32 %520, %530
br label %532
532: ; preds = %512, %509
%533 = phi i1 [ false, %509 ], [ %531, %512 ]
br i1 %533, label %534, label %537
534: ; preds = %532
%535 = load i64, i64* %13
%536 = add nsw i64 %535, -1
store i64 %536, i64* %13
br label %509
537: ; preds = %532
%538 = load i64, i64* %13
%539 = icmp eq i64 %538, 0
br i1 %539, label %540, label %544
540: ; preds = %537
%541 = load i8*, i8** %6
%542 = load i64, i64* %20
%543 = getelementptr inbounds i8, i8* %541, i64 %542
store i8* %543, i8** %5
br label %549
544: ; preds = %537
br label %545
545: ; preds = %544, %499
%546 = load i32, i32* %19
%547 = add nsw i32 %546, 1
store i32 %547, i32* %19
br label %548
548: ; preds = %545, %492
store i8* null, i8** %5
br label %549
549: ; preds = %548, %540, %482, %402, %280, %238, %146, %124, %105, %82, %32
%550 = load i8*, i8** %5
ret i8* %550
}

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