void _bdf_memmove(char *dest, char *src, unsigned long bytes) {
  long i, j;
  i = (long)bytes;
  j = i & 7;
  i = (i + 7) >> 3;
  if (src < dest) {
    src += bytes;
    dest += bytes;
    switch (j) {
    case 0:
      do {
        *--dest = *--src;
      case 7:
        *--dest = *--src;
      case 6:
        *--dest = *--src;
      case 5:
        *--dest = *--src;
      case 4:
        *--dest = *--src;
      case 3:
        *--dest = *--src;
      case 2:
        *--dest = *--src;
      case 1:
        *--dest = *--src;
      } while (--i > 0);
    }
  } else if (src > dest) {
    switch (j) {
    case 0:
      do {
        *dest++ = *src++;
      case 7:
        *dest++ = *src++;
      case 6:
        *dest++ = *src++;
      case 5:
        *dest++ = *src++;
      case 4:
        *dest++ = *src++;
      case 3:
        *dest++ = *src++;
      case 2:
        *dest++ = *src++;
      case 1:
        *dest++ = *src++;
      } while (--i > 0);
    }
  }
}


x86 assembly (clang, -O0):
<_bdf_memmove>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    $0x7,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
add    $0x7,%rax
sar    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jae    12cb <_bdf_memmove+0x1cb>
mov    -0x18(%rbp),%rcx
mov    -0x10(%rbp),%rax
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rcx
mov    -0x8(%rbp),%rax
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
sub    $0x7,%rax
ja     12c6 <_bdf_memmove+0x1c6>
mov    -0x30(%rbp),%rax
lea    0xea3(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    118b <_bdf_memmove+0x8b>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x1(%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
jg     118b <_bdf_memmove+0x8b>
jmp    12c6 <_bdf_memmove+0x1c6>
jmp    1439 <_bdf_memmove+0x339>
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jbe    1434 <_bdf_memmove+0x334>
mov    -0x28(%rbp),%rax
mov    %rax,-0x38(%rbp)
sub    $0x7,%rax
ja     142f <_bdf_memmove+0x32f>
mov    -0x38(%rbp),%rax
lea    0xd0a(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    1304 <_bdf_memmove+0x204>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
jg     1304 <_bdf_memmove+0x204>
jmp    142f <_bdf_memmove+0x32f>
jmp    1434 <_bdf_memmove+0x334>
jmp    1439 <_bdf_memmove+0x339>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_bdf_memmove>:
mov    %edx,%ecx
and    $0x7,%ecx
lea    0x7(%rdx),%rax
sar    $0x3,%rax
cmp    %rdi,%rsi
jae    1128 <_bdf_memmove+0x28>
add    %rdx,%rsi
add    %rdx,%rdi
lea    0xf01(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
jbe    122a <_bdf_memmove+0x12a>
lea    0xecb(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
mov    -0x1(%rsi),%cl
add    $0xffffffffffffffff,%rsi
mov    %cl,-0x1(%rdi)
add    $0xffffffffffffffff,%rdi
lea    -0x1(%rax),%rcx
cmp    $0x1,%rax
mov    %rcx,%rax
jg     113e <_bdf_memmove+0x3e>
jmp    122a <_bdf_memmove+0x12a>
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
mov    (%rsi),%cl
add    $0x1,%rsi
mov    %cl,(%rdi)
add    $0x1,%rdi
lea    -0x1(%rax),%rcx
cmp    $0x1,%rax
mov    %rcx,%rax
jg     11bd <_bdf_memmove+0xbd>
ret

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

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