#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 */
int /*<<< orphan*/ EXIT_FAILURE;
int /*<<< orphan*/ exit(int /*<<< orphan*/);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *);
int /*<<< orphan*/ stderr;
void copy_pointer(double **src, double *src_vector, int src_row, int src_col,
                  double **dest, double *dest_vector, int dest_row,
                  int dest_col) {
  if (src_col == 1 && dest_col == 0 && src && dest_vector && dest == NULL &&
      src_vector == NULL) {
    for (int i = 0; i < dest_row; i++)
      dest_vector[i] = src[i][0];
  } else if (src_col == 0 && dest_col == 1 && src_vector && dest &&
             dest_vector == NULL && src == NULL) {
    for (int i = 0; i < dest_row; i++)
      dest[i][0] = src_vector[i];
  } else if (src_col == dest_col && src_row == dest_row && src_vector == NULL &&
             dest_vector == NULL) {
    for (int i = 0; i < dest_row; i++)
      for (int j = 0; j < dest_col; j++)
        dest[i][j] = src[i][j];
  } else {
    fprintf(stderr, "ERROR: error in matrices!");
    exit(EXIT_FAILURE);
  }
}


x86 assembly (clang, -O0):
<copy_pointer>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
cmpl   $0x1,-0x18(%rbp)
jne    11c7 <copy_pointer+0xa7>
cmpl   $0x0,0x18(%rbp)
jne    11c7 <copy_pointer+0xa7>
cmpq   $0x0,-0x8(%rbp)
je     11c7 <copy_pointer+0xa7>
cmpq   $0x0,-0x28(%rbp)
je     11c7 <copy_pointer+0xa7>
cmpq   $0x0,-0x20(%rbp)
jne    11c7 <copy_pointer+0xa7>
cmpq   $0x0,-0x10(%rbp)
jne    11c7 <copy_pointer+0xa7>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    11c2 <copy_pointer+0xa2>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    118b <copy_pointer+0x6b>
jmp    131b <copy_pointer+0x1fb>
cmpl   $0x0,-0x18(%rbp)
jne    124a <copy_pointer+0x12a>
cmpl   $0x1,0x18(%rbp)
jne    124a <copy_pointer+0x12a>
cmpq   $0x0,-0x10(%rbp)
je     124a <copy_pointer+0x12a>
cmpq   $0x0,-0x20(%rbp)
je     124a <copy_pointer+0x12a>
cmpq   $0x0,-0x28(%rbp)
jne    124a <copy_pointer+0x12a>
cmpq   $0x0,-0x8(%rbp)
jne    124a <copy_pointer+0x12a>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    1245 <copy_pointer+0x125>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    120e <copy_pointer+0xee>
jmp    1316 <copy_pointer+0x1f6>
mov    -0x18(%rbp),%eax
cmp    0x18(%rbp),%eax
jne    12ee <copy_pointer+0x1ce>
mov    -0x14(%rbp),%eax
cmp    0x10(%rbp),%eax
jne    12ee <copy_pointer+0x1ce>
cmpq   $0x0,-0x10(%rbp)
jne    12ee <copy_pointer+0x1ce>
cmpq   $0x0,-0x28(%rbp)
jne    12ee <copy_pointer+0x1ce>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    0x10(%rbp),%eax
jge    12e9 <copy_pointer+0x1c9>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    12d6 <copy_pointer+0x1b6>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1292 <copy_pointer+0x172>
jmp    12db <copy_pointer+0x1bb>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    127f <copy_pointer+0x15f>
jmp    1311 <copy_pointer+0x1f1>
mov    0x2ceb(%rip),%rax
mov    (%rax),%edi
lea    0xd02(%rip),%rsi
call   1030 <fprintf@plt>
mov    0x2cce(%rip),%rax
mov    (%rax),%edi
call   1040 <exit@plt>
jmp    1316 <copy_pointer+0x1f6>
jmp    131b <copy_pointer+0x1fb>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<copy_pointer>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    0x58(%rsp),%ebp
mov    0x50(%rsp),%eax
test   %rsi,%rsi
jne    1177 <copy_pointer+0x57>
test   %r8,%r8
jne    1177 <copy_pointer+0x57>
test   %r9,%r9
je     1177 <copy_pointer+0x57>
test   %rdi,%rdi
je     1177 <copy_pointer+0x57>
cmp    $0x1,%ecx
jne    1177 <copy_pointer+0x57>
test   %ebp,%ebp
jne    1177 <copy_pointer+0x57>
test   %eax,%eax
jle    14a6 <copy_pointer+0x386>
mov    %eax,%ecx
lea    -0x1(%rcx),%rdx
mov    %ecx,%eax
and    $0x3,%eax
cmp    $0x3,%rdx
jae    139c <copy_pointer+0x27c>
xor    %edx,%edx
jmp    13f7 <copy_pointer+0x2d7>
test   %rdi,%rdi
jne    11b8 <copy_pointer+0x98>
test   %r9,%r9
jne    11b8 <copy_pointer+0x98>
test   %r8,%r8
je     11b8 <copy_pointer+0x98>
test   %rsi,%rsi
je     11b8 <copy_pointer+0x98>
test   %ecx,%ecx
jne    11b8 <copy_pointer+0x98>
cmp    $0x1,%ebp
jne    11b8 <copy_pointer+0x98>
test   %eax,%eax
jle    14a6 <copy_pointer+0x386>
mov    %eax,%ecx
lea    -0x1(%rcx),%rdx
mov    %ecx,%eax
and    $0x3,%eax
cmp    $0x3,%rdx
jae    1428 <copy_pointer+0x308>
xor    %edx,%edx
jmp    1473 <copy_pointer+0x353>
cmp    %ebp,%ecx
jne    14b5 <copy_pointer+0x395>
test   %r9,%r9
jne    14b5 <copy_pointer+0x395>
test   %rsi,%rsi
jne    14b5 <copy_pointer+0x395>
cmp    %eax,%edx
jne    14b5 <copy_pointer+0x395>
test   %edx,%edx
jle    14a6 <copy_pointer+0x386>
mov    %edx,%r15d
mov    %ecx,%r14d
mov    %r14d,%r9d
and    $0xfffffffc,%r9d
lea    -0x4(%r9),%rax
mov    %rax,0x10(%rsp)
shr    $0x2,%rax
add    $0x1,%rax
mov    %eax,%r13d
and    $0x3,%r13d
and    $0xfffffffffffffffc,%rax
mov    %rax,(%rsp)
mov    %r14d,%r12d
and    $0x3,%r12d
mov    %r13,0x8(%rsp)
shl    $0x5,%r13
xor    %r11d,%r11d
jmp    123d <copy_pointer+0x11d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%r11
cmp    %r15,%r11
je     14a6 <copy_pointer+0x386>
test   %ecx,%ecx
jle    1230 <copy_pointer+0x110>
mov    (%rdi,%r11,8),%rbx
mov    (%r8,%r11,8),%rsi
cmp    $0x4,%ecx
jb     1264 <copy_pointer+0x144>
lea    (%rbx,%r14,8),%rax
cmp    %rax,%rsi
jae    12dc <copy_pointer+0x1bc>
lea    (%rsi,%r14,8),%rax
cmp    %rax,%rbx
jae    12dc <copy_pointer+0x1bc>
xor    %ebp,%ebp
mov    %rbp,%rax
not    %rax
add    %r14,%rax
test   %r12,%r12
je     1294 <copy_pointer+0x174>
mov    %r12,%rdx
nopw   0x0(%rax,%rax,1)
movsd  (%rbx,%rbp,8),%xmm0
movsd  %xmm0,(%rsi,%rbp,8)
add    $0x1,%rbp
add    $0xffffffffffffffff,%rdx
jne    1280 <copy_pointer+0x160>
cmp    $0x3,%rax
jb     1230 <copy_pointer+0x110>
nopw   0x0(%rax,%rax,1)
movsd  (%rbx,%rbp,8),%xmm0
movsd  %xmm0,(%rsi,%rbp,8)
movsd  0x8(%rbx,%rbp,8),%xmm0
movsd  %xmm0,0x8(%rsi,%rbp,8)
movsd  0x10(%rbx,%rbp,8),%xmm0
movsd  %xmm0,0x10(%rsi,%rbp,8)
movsd  0x18(%rbx,%rbp,8),%xmm0
movsd  %xmm0,0x18(%rsi,%rbp,8)
add    $0x4,%rbp
cmp    %rbp,%r14
jne    12a0 <copy_pointer+0x180>
jmp    1230 <copy_pointer+0x110>
cmpq   $0xc,0x10(%rsp)
jae    12e8 <copy_pointer+0x1c8>
xor    %ebp,%ebp
jmp    1348 <copy_pointer+0x228>
mov    (%rsp),%r10
xor    %ebp,%ebp
xchg   %ax,%ax
movups (%rbx,%rbp,8),%xmm0
movups 0x10(%rbx,%rbp,8),%xmm1
movups %xmm0,(%rsi,%rbp,8)
movups %xmm1,0x10(%rsi,%rbp,8)
movups 0x20(%rbx,%rbp,8),%xmm0
movups 0x30(%rbx,%rbp,8),%xmm1
movups %xmm0,0x20(%rsi,%rbp,8)
movups %xmm1,0x30(%rsi,%rbp,8)
movups 0x40(%rbx,%rbp,8),%xmm0
movups 0x50(%rbx,%rbp,8),%xmm1
movups %xmm0,0x40(%rsi,%rbp,8)
movups %xmm1,0x50(%rsi,%rbp,8)
movups 0x60(%rbx,%rbp,8),%xmm0
movups 0x70(%rbx,%rbp,8),%xmm1
movups %xmm0,0x60(%rsi,%rbp,8)
movups %xmm1,0x70(%rsi,%rbp,8)
add    $0x10,%rbp
add    $0xfffffffffffffffc,%r10
jne    12f0 <copy_pointer+0x1d0>
cmpq   $0x0,0x8(%rsp)
je     138b <copy_pointer+0x26b>
lea    (%rsi,%rbp,8),%rax
add    $0x10,%rax
lea    (%rbx,%rbp,8),%rdx
add    $0x10,%rdx
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups -0x10(%rdx,%rbp,1),%xmm0
movups (%rdx,%rbp,1),%xmm1
movups %xmm0,-0x10(%rax,%rbp,1)
movups %xmm1,(%rax,%rbp,1)
add    $0x20,%rbp
cmp    %rbp,%r13
jne    1370 <copy_pointer+0x250>
mov    %r9,%rbp
cmp    %r14,%r9
je     1230 <copy_pointer+0x110>
jmp    1266 <copy_pointer+0x146>
and    $0xfffffffc,%ecx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rdi,%rdx,8),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,(%r9,%rdx,8)
mov    0x8(%rdi,%rdx,8),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,0x8(%r9,%rdx,8)
mov    0x10(%rdi,%rdx,8),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,0x10(%r9,%rdx,8)
mov    0x18(%rdi,%rdx,8),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,0x18(%r9,%rdx,8)
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    13b0 <copy_pointer+0x290>
test   %rax,%rax
je     14a6 <copy_pointer+0x386>
lea    (%r9,%rdx,8),%rcx
lea    (%rdi,%rdx,8),%rdx
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
mov    (%rdx,%rsi,8),%rdi
movsd  (%rdi),%xmm0
movsd  %xmm0,(%rcx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%rax
jne    1410 <copy_pointer+0x2f0>
jmp    14a6 <copy_pointer+0x386>
and    $0xfffffffc,%ecx
xor    %edx,%edx
nopl   (%rax)
movsd  (%rsi,%rdx,8),%xmm0
mov    (%r8,%rdx,8),%rdi
movsd  %xmm0,(%rdi)
movsd  0x8(%rsi,%rdx,8),%xmm0
mov    0x8(%r8,%rdx,8),%rdi
movsd  %xmm0,(%rdi)
movsd  0x10(%rsi,%rdx,8),%xmm0
mov    0x10(%r8,%rdx,8),%rdi
movsd  %xmm0,(%rdi)
movsd  0x18(%rsi,%rdx,8),%xmm0
mov    0x18(%r8,%rdx,8),%rdi
movsd  %xmm0,(%rdi)
add    $0x4,%rdx
cmp    %rdx,%rcx
jne    1430 <copy_pointer+0x310>
test   %rax,%rax
je     14a6 <copy_pointer+0x386>
lea    (%r8,%rdx,8),%rcx
lea    (%rsi,%rdx,8),%rdx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%rdx,%rsi,8),%xmm0
mov    (%rcx,%rsi,8),%rdi
movsd  %xmm0,(%rdi)
add    $0x1,%rsi
cmp    %rsi,%rax
jne    1490 <copy_pointer+0x370>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x2b24(%rip),%rax
mov    (%rax),%edi
lea    0xb3b(%rip),%rsi
call   1030 <fprintf@plt>
mov    0x2b07(%rip),%rax
mov    (%rax),%edi
call   1040 <exit@plt>

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

LLVM IR (-O2):
@stderr = global i32 0
@.str = [26 x i8] c"ERROR: error in matrices!\00"
@EXIT_FAILURE = global i32 0
define void @copy_pointer(double** %0, double* %1, i32 %2, i32 %3, double** %4, double* writeonly %5, i32 %6, i32 %7) {
%9 = icmp eq i32 %3, 1
%10 = icmp eq i32 %7, 0
%11 = and i1 %9, %10
%12 = icmp ne double** %0, null
%13 = and i1 %12, %11
%14 = icmp ne double* %5, null
%15 = and i1 %14, %13
%16 = icmp eq double** %4, null
%17 = and i1 %16, %15
%18 = icmp eq double* %1, null
%19 = and i1 %18, %17
br i1 %19, label %20, label %54
20: ; preds = %8
%21 = icmp sgt i32 %6, 0
br i1 %21, label %22, label %276
22: ; preds = %20
%23 = zext i32 %6 to i64
%24 = add nsw i64 %23, -1
%25 = and i64 %23, 3
%26 = icmp ult i64 %24, 3
br i1 %26, label %250, label %27
27: ; preds = %22
%28 = and i64 %23, 4294967292
br label %29
29: ; preds = %29, %27
%30 = phi i64 [ 0, %27 ], [ %51, %29 ]
%31 = phi i64 [ 0, %27 ], [ %52, %29 ]
%32 = getelementptr inbounds double*, double** %0, i64 %30
%33 = load double*, double** %32
%34 = load double, double* %33
%35 = getelementptr inbounds double, double* %5, i64 %30
store double %34, double* %35
%36 = or i64 %30, 1
%37 = getelementptr inbounds double*, double** %0, i64 %36
%38 = load double*, double** %37
%39 = load double, double* %38
%40 = getelementptr inbounds double, double* %5, i64 %36
store double %39, double* %40
%41 = or i64 %30, 2
%42 = getelementptr inbounds double*, double** %0, i64 %41
%43 = load double*, double** %42
%44 = load double, double* %43
%45 = getelementptr inbounds double, double* %5, i64 %41
store double %44, double* %45
%46 = or i64 %30, 3
%47 = getelementptr inbounds double*, double** %0, i64 %46
%48 = load double*, double** %47
%49 = load double, double* %48
%50 = getelementptr inbounds double, double* %5, i64 %46
store double %49, double* %50
%51 = add nuw nsw i64 %30, 4
%52 = add i64 %31, 4
%53 = icmp eq i64 %52, %28
br i1 %53, label %250, label %29
54: ; preds = %8
%55 = icmp eq i32 %3, 0
%56 = icmp eq i32 %7, 1
%57 = and i1 %55, %56
%58 = icmp ne double* %1, null
%59 = and i1 %58, %57
%60 = icmp ne double** %4, null
%61 = and i1 %60, %59
%62 = icmp eq double* %5, null
%63 = and i1 %62, %61
%64 = icmp eq double** %0, null
%65 = and i1 %64, %63
br i1 %65, label %66, label %100
66: ; preds = %54
%67 = icmp sgt i32 %6, 0
br i1 %67, label %68, label %276
68: ; preds = %66
%69 = zext i32 %6 to i64
%70 = add nsw i64 %69, -1
%71 = and i64 %69, 3
%72 = icmp ult i64 %70, 3
br i1 %72, label %263, label %73
73: ; preds = %68
%74 = and i64 %69, 4294967292
br label %75
75: ; preds = %75, %73
%76 = phi i64 [ 0, %73 ], [ %97, %75 ]
%77 = phi i64 [ 0, %73 ], [ %98, %75 ]
%78 = getelementptr inbounds double, double* %1, i64 %76
%79 = load double, double* %78
%80 = getelementptr inbounds double*, double** %4, i64 %76
%81 = load double*, double** %80
store double %79, double* %81
%82 = or i64 %76, 1
%83 = getelementptr inbounds double, double* %1, i64 %82
%84 = load double, double* %83
%85 = getelementptr inbounds double*, double** %4, i64 %82
%86 = load double*, double** %85
store double %84, double* %86
%87 = or i64 %76, 2
%88 = getelementptr inbounds double, double* %1, i64 %87
%89 = load double, double* %88
%90 = getelementptr inbounds double*, double** %4, i64 %87
%91 = load double*, double** %90
store double %89, double* %91
%92 = or i64 %76, 3
%93 = getelementptr inbounds double, double* %1, i64 %92
%94 = load double, double* %93
%95 = getelementptr inbounds double*, double** %4, i64 %92
%96 = load double*, double** %95
store double %94, double* %96
%97 = add nuw nsw i64 %76, 4
%98 = add i64 %77, 4
%99 = icmp eq i64 %98, %74
br i1 %99, label %263, label %75
100: ; preds = %54
%101 = icmp eq i32 %3, %7
br i1 %101, label %102, label %245
102: ; preds = %100
%103 = icmp eq i32 %2, %6
%104 = and i1 %18, %103
%105 = and i1 %62, %104
br i1 %105, label %106, label %245
106: ; preds = %102
%107 = icmp sgt i32 %2, 0
br i1 %107, label %108, label %276
108: ; preds = %106
%109 = icmp sgt i32 %3, 0
%110 = zext i32 %2 to i64
%111 = zext i32 %3 to i64
%112 = and i64 %111, 4294967292
%113 = add nsw i64 %112, -4
%114 = lshr exact i64 %113, 2
%115 = add nuw nsw i64 %114, 1
%116 = icmp ult i32 %3, 4
%117 = and i64 %111, 4294967292
%118 = and i64 %115, 3
%119 = icmp ult i64 %113, 12
%120 = and i64 %115, 9223372036854775804
%121 = icmp eq i64 %118, 0
%122 = icmp eq i64 %117, %111
%123 = and i64 %111, 3
%124 = icmp eq i64 %123, 0
br label %125
125: ; preds = %108, %223
%126 = phi i64 [ 0, %108 ], [ %224, %223 ]
br i1 %109, label %127, label %223
127: ; preds = %125
%128 = getelementptr inbounds double*, double** %0, i64 %126
%129 = load double*, double** %128
%130 = getelementptr inbounds double*, double** %4, i64 %126
%131 = load double*, double** %130
br i1 %116, label %207, label %132
132: ; preds = %127
%133 = getelementptr double, double* %131, i64 %111
%134 = getelementptr double, double* %129, i64 %111
%135 = icmp ult double* %131, %134
%136 = icmp ult double* %129, %133
%137 = and i1 %135, %136
br i1 %137, label %207, label %138
138: ; preds = %132
br i1 %119, label %188, label %139
139: ; preds = %138, %139
%140 = phi i64 [ %185, %139 ], [ 0, %138 ]
%141 = phi i64 [ %186, %139 ], [ 0, %138 ]
%142 = getelementptr inbounds double, double* %129, i64 %140
%143 = bitcast double* %142 to <2 x double>*
%144 = load <2 x double>, <2 x double>* %143
%145 = getelementptr inbounds double, double* %142, i64 2
%146 = bitcast double* %145 to <2 x double>*
%147 = load <2 x double>, <2 x double>* %146
%148 = getelementptr inbounds double, double* %131, i64 %140
%149 = bitcast double* %148 to <2 x double>*
store <2 x double> %144, <2 x double>* %149
%150 = getelementptr inbounds double, double* %148, i64 2
%151 = bitcast double* %150 to <2 x double>*
store <2 x double> %147, <2 x double>* %151
%152 = or i64 %140, 4
%153 = getelementptr inbounds double, double* %129, i64 %152
%154 = bitcast double* %153 to <2 x double>*
%155 = load <2 x double>, <2 x double>* %154
%156 = getelementptr inbounds double, double* %153, i64 2
%157 = bitcast double* %156 to <2 x double>*
%158 = load <2 x double>, <2 x double>* %157
%159 = getelementptr inbounds double, double* %131, i64 %152
%160 = bitcast double* %159 to <2 x double>*
store <2 x double> %155, <2 x double>* %160
%161 = getelementptr inbounds double, double* %159, i64 2
%162 = bitcast double* %161 to <2 x double>*
store <2 x double> %158, <2 x double>* %162
%163 = or i64 %140, 8
%164 = getelementptr inbounds double, double* %129, i64 %163
%165 = bitcast double* %164 to <2 x double>*
%166 = load <2 x double>, <2 x double>* %165
%167 = getelementptr inbounds double, double* %164, i64 2
%168 = bitcast double* %167 to <2 x double>*
%169 = load <2 x double>, <2 x double>* %168
%170 = getelementptr inbounds double, double* %131, i64 %163
%171 = bitcast double* %170 to <2 x double>*
store <2 x double> %166, <2 x double>* %171
%172 = getelementptr inbounds double, double* %170, i64 2
%173 = bitcast double* %172 to <2 x double>*
store <2 x double> %169, <2 x double>* %173
%174 = or i64 %140, 12
%175 = getelementptr inbounds double, double* %129, i64 %174
%176 = bitcast double* %175 to <2 x double>*
%177 = load <2 x double>, <2 x double>* %176
%178 = getelementptr inbounds double, double* %175, i64 2
%179 = bitcast double* %178 to <2 x double>*
%180 = load <2 x double>, <2 x double>* %179
%181 = getelementptr inbounds double, double* %131, i64 %174
%182 = bitcast double* %181 to <2 x double>*
store <2 x double> %177, <2 x double>* %182
%183 = getelementptr inbounds double, double* %181, i64 2
%184 = bitcast double* %183 to <2 x double>*
store <2 x double> %180, <2 x double>* %184
%185 = add nuw i64 %140, 16
%186 = add nuw i64 %141, 4
%187 = icmp eq i64 %186, %120
br i1 %187, label %188, label %139
188: ; preds = %139, %138
%189 = phi i64 [ 0, %138 ], [ %185, %139 ]
br i1 %121, label %206, label %190
190: ; preds = %188, %190
%191 = phi i64 [ %203, %190 ], [ %189, %188 ]
%192 = phi i64 [ %204, %190 ], [ 0, %188 ]
%193 = getelementptr inbounds double, double* %129, i64 %191
%194 = bitcast double* %193 to <2 x double>*
%195 = load <2 x double>, <2 x double>* %194
%196 = getelementptr inbounds double, double* %193, i64 2
%197 = bitcast double* %196 to <2 x double>*
%198 = load <2 x double>, <2 x double>* %197
%199 = getelementptr inbounds double, double* %131, i64 %191
%200 = bitcast double* %199 to <2 x double>*
store <2 x double> %195, <2 x double>* %200
%201 = getelementptr inbounds double, double* %199, i64 2
%202 = bitcast double* %201 to <2 x double>*
store <2 x double> %198, <2 x double>* %202
%203 = add nuw i64 %191, 4
%204 = add i64 %192, 1
%205 = icmp eq i64 %204, %118
br i1 %205, label %206, label %190
206: ; preds = %190, %188
br i1 %122, label %223, label %207
207: ; preds = %132, %127, %206
%208 = phi i64 [ 0, %132 ], [ 0, %127 ], [ %117, %206 ]
%209 = xor i64 %208, -1
%210 = add nsw i64 %209, %111
br i1 %124, label %220, label %211
211: ; preds = %207, %211
%212 = phi i64 [ %217, %211 ], [ %208, %207 ]
%213 = phi i64 [ %218, %211 ], [ 0, %207 ]
%214 = getelementptr inbounds double, double* %129, i64 %212
%215 = load double, double* %214
%216 = getelementptr inbounds double, double* %131, i64 %212
store double %215, double* %216
%217 = add nuw nsw i64 %212, 1
%218 = add i64 %213, 1
%219 = icmp eq i64 %218, %123
br i1 %219, label %220, label %211
220: ; preds = %211, %207
%221 = phi i64 [ %208, %207 ], [ %217, %211 ]
%222 = icmp ult i64 %210, 3
br i1 %222, label %223, label %226
223: ; preds = %220, %226, %206, %125
%224 = add nuw nsw i64 %126, 1
%225 = icmp eq i64 %224, %110
br i1 %225, label %276, label %125
226: ; preds = %220, %226
%227 = phi i64 [ %243, %226 ], [ %221, %220 ]
%228 = getelementptr inbounds double, double* %129, i64 %227
%229 = load double, double* %228
%230 = getelementptr inbounds double, double* %131, i64 %227
store double %229, double* %230
%231 = add nuw nsw i64 %227, 1
%232 = getelementptr inbounds double, double* %129, i64 %231
%233 = load double, double* %232
%234 = getelementptr inbounds double, double* %131, i64 %231
store double %233, double* %234
%235 = add nuw nsw i64 %227, 2
%236 = getelementptr inbounds double, double* %129, i64 %235
%237 = load double, double* %236
%238 = getelementptr inbounds double, double* %131, i64 %235
store double %237, double* %238
%239 = add nuw nsw i64 %227, 3
%240 = getelementptr inbounds double, double* %129, i64 %239
%241 = load double, double* %240
%242 = getelementptr inbounds double, double* %131, i64 %239
store double %241, double* %242
%243 = add nuw nsw i64 %227, 4
%244 = icmp eq i64 %243, %111
br i1 %244, label %223, label %226
245: ; preds = %102, %100
%246 = load i32, i32* @stderr
%247 = tail call i32 @fprintf(i32 %246, i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str, i64 0, i64 0))
%248 = load i32, i32* @EXIT_FAILURE
%249 = tail call i32 @exit(i32 %248)
unreachable
250: ; preds = %29, %22
%251 = phi i64 [ 0, %22 ], [ %51, %29 ]
%252 = icmp eq i64 %25, 0
br i1 %252, label %276, label %253
253: ; preds = %250, %253
%254 = phi i64 [ %260, %253 ], [ %251, %250 ]
%255 = phi i64 [ %261, %253 ], [ 0, %250 ]
%256 = getelementptr inbounds double*, double** %0, i64 %254
%257 = load double*, double** %256
%258 = load double, double* %257
%259 = getelementptr inbounds double, double* %5, i64 %254
store double %258, double* %259
%260 = add nuw nsw i64 %254, 1
%261 = add i64 %255, 1
%262 = icmp eq i64 %261, %25
br i1 %262, label %276, label %253
263: ; preds = %75, %68
%264 = phi i64 [ 0, %68 ], [ %97, %75 ]
%265 = icmp eq i64 %71, 0
br i1 %265, label %276, label %266
266: ; preds = %263, %266
%267 = phi i64 [ %273, %266 ], [ %264, %263 ]
%268 = phi i64 [ %274, %266 ], [ 0, %263 ]
%269 = getelementptr inbounds double, double* %1, i64 %267
%270 = load double, double* %269
%271 = getelementptr inbounds double*, double** %4, i64 %267
%272 = load double*, double** %271
store double %270, double* %272
%273 = add nuw nsw i64 %267, 1
%274 = add i64 %268, 1
%275 = icmp eq i64 %274, %71
br i1 %275, label %276, label %266
276: ; preds = %223, %263, %266, %250, %253, %106, %66, %20
ret void
}