#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
void _wordcopy_bwd_aligned(long int dstp, long int srcp, size_t len) {
  unsigned long int a0 = 0;
  unsigned long int a1 = 0;
  switch (len % 8) {
  case 2:
    srcp -= 2 * (sizeof(unsigned long int));
    dstp -= 1 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[1];
    len += 6;
    goto do1;
  case 3:
    srcp -= 3 * (sizeof(unsigned long int));
    dstp -= 2 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[2];
    len += 5;
    goto do2;
  case 4:
    srcp -= 4 * (sizeof(unsigned long int));
    dstp -= 3 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[3];
    len += 4;
    goto do3;
  case 5:
    srcp -= 5 * (sizeof(unsigned long int));
    dstp -= 4 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[4];
    len += 3;
    goto do4;
  case 6:
    srcp -= 6 * (sizeof(unsigned long int));
    dstp -= 5 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[5];
    len += 2;
    goto do5;
  case 7:
    srcp -= 7 * (sizeof(unsigned long int));
    dstp -= 6 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[6];
    len += 1;
    goto do6;
  case 0:
    if (16 <= 3 * (sizeof(unsigned long int)) && len == 0)
      return;
    srcp -= 8 * (sizeof(unsigned long int));
    dstp -= 7 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[7];
    goto do7;
  case 1:
    srcp -= 9 * (sizeof(unsigned long int));
    dstp -= 8 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[8];
    len -= 1;
    if (16 <= 3 * (sizeof(unsigned long int)) && len == 0)
      goto do0;
    goto do8;
  }
  do {
  do8:
    a0 = ((unsigned long int *)srcp)[7];
    ((unsigned long int *)dstp)[7] = a1;
  do7:
    a1 = ((unsigned long int *)srcp)[6];
    ((unsigned long int *)dstp)[6] = a0;
  do6:
    a0 = ((unsigned long int *)srcp)[5];
    ((unsigned long int *)dstp)[5] = a1;
  do5:
    a1 = ((unsigned long int *)srcp)[4];
    ((unsigned long int *)dstp)[4] = a0;
  do4:
    a0 = ((unsigned long int *)srcp)[3];
    ((unsigned long int *)dstp)[3] = a1;
  do3:
    a1 = ((unsigned long int *)srcp)[2];
    ((unsigned long int *)dstp)[2] = a0;
  do2:
    a0 = ((unsigned long int *)srcp)[1];
    ((unsigned long int *)dstp)[1] = a1;
  do1:
    a1 = ((unsigned long int *)srcp)[0];
    ((unsigned long int *)dstp)[0] = a0;
    srcp -= 8 * (sizeof(unsigned long int));
    dstp -= 8 * (sizeof(unsigned long int));
    len -= 8;
  } while (len != 0);
do0:
  ((unsigned long int *)dstp)[7] = a1;
}


x86 assembly (clang, -O0):
<_wordcopy_bwd_aligned>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x18(%rbp),%rax
and    $0x7,%eax
mov    %rax,-0x30(%rbp)
sub    $0x7,%rax
ja     1305 <_wordcopy_bwd_aligned+0x205>
mov    -0x30(%rbp),%rax
lea    0xec0(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
sub    $0x10,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x8,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x18(%rbp)
jmp    13b7 <_wordcopy_bwd_aligned+0x2b7>
mov    -0x10(%rbp),%rax
sub    $0x18,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x10,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x18(%rbp)
jmp    139f <_wordcopy_bwd_aligned+0x29f>
mov    -0x10(%rbp),%rax
sub    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x18,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1387 <_wordcopy_bwd_aligned+0x287>
mov    -0x10(%rbp),%rax
sub    $0x28,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x20,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x20(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
jmp    136f <_wordcopy_bwd_aligned+0x26f>
mov    -0x10(%rbp),%rax
sub    $0x30,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x28,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x28(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    1357 <_wordcopy_bwd_aligned+0x257>
mov    -0x10(%rbp),%rax
sub    $0x38,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x30,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x30(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    133f <_wordcopy_bwd_aligned+0x23f>
cmpq   $0x0,-0x18(%rbp)
jne    1297 <_wordcopy_bwd_aligned+0x197>
jmp    140d <_wordcopy_bwd_aligned+0x30d>
mov    -0x10(%rbp),%rax
sub    $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x38,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x38(%rax),%rax
mov    %rax,-0x20(%rbp)
jmp    1327 <_wordcopy_bwd_aligned+0x227>
mov    -0x10(%rbp),%rax
sub    $0x48,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x40,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
mov    0x40(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1300 <_wordcopy_bwd_aligned+0x200>
jmp    1401 <_wordcopy_bwd_aligned+0x301>
jmp    130f <_wordcopy_bwd_aligned+0x20f>
jmp    130a <_wordcopy_bwd_aligned+0x20a>
jmp    130f <_wordcopy_bwd_aligned+0x20f>
mov    -0x10(%rbp),%rax
mov    0x38(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x38(%rax)
mov    -0x10(%rbp),%rax
mov    0x30(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x30(%rax)
mov    -0x10(%rbp),%rax
mov    0x28(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x28(%rax)
mov    -0x10(%rbp),%rax
mov    0x20(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x20(%rax)
mov    -0x10(%rbp),%rax
mov    0x18(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x18(%rax)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x10(%rax)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x8(%rax)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
sub    $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x40,%rax
mov    %rax,-0x8(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x8,%rax
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    130a <_wordcopy_bwd_aligned+0x20a>
jmp    1401 <_wordcopy_bwd_aligned+0x301>
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x38(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<_wordcopy_bwd_aligned>:
mov    %edx,%eax
and    $0x7,%eax
lea    0xef4(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
test   %rdx,%rdx
je     1141 <_wordcopy_bwd_aligned+0x41>
add    $0xffffffffffffffc8,%rdi
mov    -0x8(%rsi),%rcx
add    $0xffffffffffffffc0,%rsi
jmp    11b9 <_wordcopy_bwd_aligned+0xb9>
add    $0xffffffffffffffc0,%rdi
mov    -0x8(%rsi),%rax
add    $0xffffffffffffffb8,%rsi
add    $0xffffffffffffffff,%rdx
jne    11b1 <_wordcopy_bwd_aligned+0xb1>
mov    %rax,0x38(%rdi)
ret
add    $0xfffffffffffffff8,%rdi
mov    -0x8(%rsi),%rcx
add    $0xfffffffffffffff0,%rsi
add    $0x6,%rdx
jmp    11e9 <_wordcopy_bwd_aligned+0xe9>
add    $0xfffffffffffffff0,%rdi
mov    -0x8(%rsi),%rax
add    $0xffffffffffffffe8,%rsi
add    $0x5,%rdx
jmp    11e1 <_wordcopy_bwd_aligned+0xe1>
add    $0xffffffffffffffe8,%rdi
mov    -0x8(%rsi),%rcx
add    $0xffffffffffffffe0,%rsi
add    $0x4,%rdx
jmp    11d9 <_wordcopy_bwd_aligned+0xd9>
add    $0xffffffffffffffe0,%rdi
mov    -0x8(%rsi),%rax
add    $0xffffffffffffffd8,%rsi
add    $0x3,%rdx
jmp    11d1 <_wordcopy_bwd_aligned+0xd1>
add    $0xffffffffffffffd8,%rdi
mov    -0x8(%rsi),%rcx
add    $0xffffffffffffffd0,%rsi
add    $0x2,%rdx
jmp    11c9 <_wordcopy_bwd_aligned+0xc9>
add    $0xffffffffffffffd0,%rdi
mov    -0x8(%rsi),%rax
add    $0xffffffffffffffc8,%rsi
add    $0x1,%rdx
jmp    11c1 <_wordcopy_bwd_aligned+0xc1>
mov    0x38(%rsi),%rcx
mov    %rax,0x38(%rdi)
mov    0x30(%rsi),%rax
mov    %rcx,0x30(%rdi)
mov    0x28(%rsi),%rcx
mov    %rax,0x28(%rdi)
mov    0x20(%rsi),%rax
mov    %rcx,0x20(%rdi)
mov    0x18(%rsi),%rcx
mov    %rax,0x18(%rdi)
mov    0x10(%rsi),%rax
mov    %rcx,0x10(%rdi)
mov    0x8(%rsi),%rcx
mov    %rax,0x8(%rdi)
mov    (%rsi),%rax
mov    %rcx,(%rdi)
add    $0xffffffffffffffc0,%rsi
add    $0xffffffffffffffc0,%rdi
add    $0xfffffffffffffff8,%rdx
jne    11b1 <_wordcopy_bwd_aligned+0xb1>
jmp    113d <_wordcopy_bwd_aligned+0x3d>

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

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