#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 /*<<< orphan*/ uint64_t;

/* Variables and functions */
void *memmove64(void *dest, const void *src, size_t n) {
  if (dest < src)
    do {
      const uint64_t *isrc = (const uint64_t *)src;
      uint64_t *idst = (uint64_t *)dest;
      for (; n >= sizeof(uint64_t); n -= sizeof(uint64_t))
        *idst++ = *isrc++;
    } while (0);
  else
    do {
      const uint64_t *isrc = (const uint64_t *)src;
      uint64_t *idst = (uint64_t *)dest;
      for (; n >= sizeof(uint64_t); n -= sizeof(uint64_t))
        *idst++ = *isrc++;
    } while (0);
  return (dest);
}


x86 assembly (clang, -O0):
<memmove64>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    117b <memmove64+0x7b>
jmp    1123 <memmove64+0x23>
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x4,-0x18(%rbp)
jb     1171 <memmove64+0x71>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%ecx
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x28(%rbp)
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
sub    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1133 <memmove64+0x33>
jmp    1176 <memmove64+0x76>
jmp    11d8 <memmove64+0xd8>
jmp    1180 <memmove64+0x80>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x4,-0x18(%rbp)
jb     11ce <memmove64+0xce>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%ecx
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x38(%rbp)
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
sub    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1190 <memmove64+0x90>
jmp    11d3 <memmove64+0xd3>
jmp    11d8 <memmove64+0xd8>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<memmove64>:
mov    %rdi,%rax
cmp    %rsi,%rdi
jae    1157 <memmove64+0x57>
cmp    $0x4,%rdx
jb     11a5 <memmove64+0xa5>
lea    -0x4(%rdx),%r9
cmp    $0x1c,%r9
jb     1134 <memmove64+0x34>
mov    %rdx,%rcx
and    $0xfffffffffffffffc,%rcx
lea    (%rsi,%rcx,1),%rdi
cmp    %rax,%rdi
jbe    11a6 <memmove64+0xa6>
add    %rax,%rcx
cmp    %rsi,%rcx
jbe    11a6 <memmove64+0xa6>
mov    %rax,%r9
xor    %edi,%edi
nopl   0x0(%rax)
mov    (%rsi,%rdi,1),%ecx
mov    %ecx,(%r9,%rdi,1)
add    $0xfffffffffffffffc,%rdx
add    $0x4,%rdi
cmp    $0x3,%rdx
ja     1140 <memmove64+0x40>
jmp    11a5 <memmove64+0xa5>
cmp    $0x4,%rdx
jb     11a5 <memmove64+0xa5>
lea    -0x4(%rdx),%r9
cmp    $0x1c,%r9
jb     117f <memmove64+0x7f>
mov    %rdx,%rcx
and    $0xfffffffffffffffc,%rcx
lea    (%rsi,%rcx,1),%rdi
cmp    %rax,%rdi
jbe    11d8 <memmove64+0xd8>
add    %rax,%rcx
cmp    %rsi,%rcx
jbe    11d8 <memmove64+0xd8>
mov    %rax,%r9
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    (%rsi,%rdi,1),%ecx
mov    %ecx,(%r9,%rdi,1)
add    $0xfffffffffffffffc,%rdx
add    $0x4,%rdi
cmp    $0x3,%rdx
ja     1190 <memmove64+0x90>
ret
shr    $0x2,%r9
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
lea    -0x8(%r8),%rcx
mov    %rcx,%rdi
shr    $0x3,%rdi
add    $0x1,%rdi
mov    %edi,%r10d
and    $0x3,%r10d
cmp    $0x18,%rcx
jae    120e <memmove64+0x10e>
xor    %ecx,%ecx
jmp    1278 <memmove64+0x178>
shr    $0x2,%r9
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
lea    -0x8(%r8),%rcx
mov    %rcx,%rdi
shr    $0x3,%rdi
add    $0x1,%rdi
mov    %edi,%r10d
and    $0x3,%r10d
cmp    $0x18,%rcx
jae    12de <memmove64+0x1de>
xor    %ecx,%ecx
jmp    1348 <memmove64+0x248>
and    $0xfffffffffffffffc,%rdi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups (%rsi,%rcx,4),%xmm0
movups 0x10(%rsi,%rcx,4),%xmm1
movups %xmm0,(%rax,%rcx,4)
movups %xmm1,0x10(%rax,%rcx,4)
movups 0x20(%rsi,%rcx,4),%xmm0
movups 0x30(%rsi,%rcx,4),%xmm1
movups %xmm0,0x20(%rax,%rcx,4)
movups %xmm1,0x30(%rax,%rcx,4)
movups 0x40(%rsi,%rcx,4),%xmm0
movups 0x50(%rsi,%rcx,4),%xmm1
movups %xmm0,0x40(%rax,%rcx,4)
movups %xmm1,0x50(%rax,%rcx,4)
movups 0x60(%rsi,%rcx,4),%xmm0
movups 0x70(%rsi,%rcx,4),%xmm1
movups %xmm0,0x60(%rax,%rcx,4)
movups %xmm1,0x70(%rax,%rcx,4)
add    $0x20,%rcx
add    $0xfffffffffffffffc,%rdi
jne    1220 <memmove64+0x120>
test   %r10,%r10
je     12bd <memmove64+0x1bd>
lea    (%rsi,%rcx,4),%r11
add    $0x10,%r11
lea    (%rax,%rcx,4),%rcx
add    $0x10,%rcx
shl    $0x5,%r10
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%r11,%rdi,1),%xmm0
movups (%r11,%rdi,1),%xmm1
movups %xmm0,-0x10(%rcx,%rdi,1)
movups %xmm1,(%rcx,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%r10
jne    12a0 <memmove64+0x1a0>
cmp    %r8,%r9
je     11a5 <memmove64+0xa5>
lea    0x0(,%r8,4),%rdi
lea    (%rax,%r8,4),%r9
lea    (%rsi,%r8,4),%rsi
sub    %rdi,%rdx
jmp    1137 <memmove64+0x37>
and    $0xfffffffffffffffc,%rdi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups (%rsi,%rcx,4),%xmm0
movups 0x10(%rsi,%rcx,4),%xmm1
movups %xmm0,(%rax,%rcx,4)
movups %xmm1,0x10(%rax,%rcx,4)
movups 0x20(%rsi,%rcx,4),%xmm0
movups 0x30(%rsi,%rcx,4),%xmm1
movups %xmm0,0x20(%rax,%rcx,4)
movups %xmm1,0x30(%rax,%rcx,4)
movups 0x40(%rsi,%rcx,4),%xmm0
movups 0x50(%rsi,%rcx,4),%xmm1
movups %xmm0,0x40(%rax,%rcx,4)
movups %xmm1,0x50(%rax,%rcx,4)
movups 0x60(%rsi,%rcx,4),%xmm0
movups 0x70(%rsi,%rcx,4),%xmm1
movups %xmm0,0x60(%rax,%rcx,4)
movups %xmm1,0x70(%rax,%rcx,4)
add    $0x20,%rcx
add    $0xfffffffffffffffc,%rdi
jne    12f0 <memmove64+0x1f0>
test   %r10,%r10
je     138d <memmove64+0x28d>
lea    (%rsi,%rcx,4),%r11
add    $0x10,%r11
lea    (%rax,%rcx,4),%rcx
add    $0x10,%rcx
shl    $0x5,%r10
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%r11,%rdi,1),%xmm0
movups (%r11,%rdi,1),%xmm1
movups %xmm0,-0x10(%rcx,%rdi,1)
movups %xmm1,(%rcx,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%r10
jne    1370 <memmove64+0x270>
cmp    %r8,%r9
je     11a5 <memmove64+0xa5>
lea    0x0(,%r8,4),%rdi
lea    (%rax,%r8,4),%r9
lea    (%rsi,%r8,4),%rsi
sub    %rdi,%rdx
jmp    1182 <memmove64+0x82>

LLVM IR (-O0):
define i8* @memmove64(i8* %0, i8* %1, i64 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i64
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32*
store i8* %0, i8** %4
store i8* %1, i8** %5
store i64 %2, i64* %6
%11 = load i8*, i8** %4
%12 = load i8*, i8** %5
%13 = icmp ult i8* %11, %12
br i1 %13, label %14, label %34
14: ; preds = %3
br label %15
15: ; preds = %14
%16 = load i8*, i8** %5
%17 = bitcast i8* %16 to i32*
store i32* %17, i32** %7
%18 = load i8*, i8** %4
%19 = bitcast i8* %18 to i32*
store i32* %19, i32** %8
br label %20
20: ; preds = %29, %15
%21 = load i64, i64* %6
%22 = icmp uge i64 %21, 4
br i1 %22, label %23, label %32
23: ; preds = %20
%24 = load i32*, i32** %7
%25 = getelementptr inbounds i32, i32* %24, i32 1
store i32* %25, i32** %7
%26 = load i32, i32* %24
%27 = load i32*, i32** %8
%28 = getelementptr inbounds i32, i32* %27, i32 1
store i32* %28, i32** %8
store i32 %26, i32* %27
br label %29
29: ; preds = %23
%30 = load i64, i64* %6
%31 = sub i64 %30, 4
store i64 %31, i64* %6
br label %20
32: ; preds = %20
br label %33
33: ; preds = %32
br label %54
34: ; preds = %3
br label %35
35: ; preds = %34
%36 = load i8*, i8** %5
%37 = bitcast i8* %36 to i32*
store i32* %37, i32** %9
%38 = load i8*, i8** %4
%39 = bitcast i8* %38 to i32*
store i32* %39, i32** %10
br label %40
40: ; preds = %49, %35
%41 = load i64, i64* %6
%42 = icmp uge i64 %41, 4
br i1 %42, label %43, label %52
43: ; preds = %40
%44 = load i32*, i32** %9
%45 = getelementptr inbounds i32, i32* %44, i32 1
store i32* %45, i32** %9
%46 = load i32, i32* %44
%47 = load i32*, i32** %10
%48 = getelementptr inbounds i32, i32* %47, i32 1
store i32* %48, i32** %10
store i32 %46, i32* %47
br label %49
49: ; preds = %43
%50 = load i64, i64* %6
%51 = sub i64 %50, 4
store i64 %51, i64* %6
br label %40
52: ; preds = %40
br label %53
53: ; preds = %52
br label %54
54: ; preds = %53, %33
%55 = load i8*, i8** %4
ret i8* %55
}

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