#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 EXIT_SUCCESS;
int atoi(char *);
int /*<<< orphan*/ dgemm_(char const *, char const *, int const *, int const *,
                          int const *, double const *, double *, int const *,
                          double *, int const *, double const *, double *,
                          int const *);
int /*<<< orphan*/ free(double *);
scalar_t__ malloc(int const);
int main(int argc, char *argv[]) {
  const int size = 1 < argc ? atoi(argv[1]) : (1 << 22);
  const int m = 23, n = m, k = m, lda = m, ldb = k, ldc = m, big = 512;
  const double alpha = 1, beta = 1;
  const char notrans = 'N';
  double *a, *b, *c;
  int i, j;
  a = (double *)malloc(big * big * sizeof(double));
  b = (double *)malloc(big * big * sizeof(double));
  c = (double *)malloc(big * big * sizeof(double));
  for (i = 0; i < big; ++i) {
    for (j = 0; j < big; ++j) {
      const int index = i * big + j;
      a[index] = 1.0 / (index + 1);
    }
  }
  for (i = 0; i < big; ++i) {
    for (j = 0; j < big; ++j) {
      const int index = i * big + j;
      b[index] = 2.0 / (index + 1);
    }
  }
  for (i = 0; i < big; ++i) {
    for (j = 0; j < big; ++j) {
      const int index = i * big + j;
      c[index] = -1.0;
    }
  }
  dgemm_(&notrans, &notrans, &big, &big, &big, &alpha, a, &big, b, &big, &beta,
         c, &big);
  for (i = 0; i < size; ++i) {
    dgemm_(&notrans, &notrans, &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c,
           &ldc);
  }
  free(a);
  free(b);
  free(c);
  return EXIT_SUCCESS;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0xb0,%rsp
movl   $0x0,-0x24(%rbp)
mov    %edi,-0x28(%rbp)
mov    %rsi,-0x30(%rbp)
mov    $0x1,%eax
cmp    -0x28(%rbp),%eax
jge    1186 <main+0x46>
mov    -0x30(%rbp),%rax
mov    0x8(%rax),%rdi
call   1060 <atoi@plt>
mov    %eax,-0x98(%rbp)
jmp    1196 <main+0x56>
mov    $0x400000,%eax
mov    %eax,-0x98(%rbp)
jmp    1196 <main+0x56>
mov    -0x98(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x17,-0x38(%rbp)
movl   $0x17,-0x3c(%rbp)
movl   $0x17,-0x40(%rbp)
movl   $0x17,-0x44(%rbp)
movl   $0x17,-0x48(%rbp)
movl   $0x17,-0x4c(%rbp)
movl   $0x200,-0x50(%rbp)
movsd  0xe28(%rip),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xe1b(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movb   $0x4e,-0x61(%rbp)
mov    $0x200000,%edi
call   1050 <malloc@plt>
mov    %rax,-0x70(%rbp)
mov    $0x200000,%edi
call   1050 <malloc@plt>
mov    %rax,-0x78(%rbp)
mov    $0x200000,%edi
call   1050 <malloc@plt>
mov    %rax,-0x80(%rbp)
movl   $0x0,-0x84(%rbp)
cmpl   $0x200,-0x84(%rbp)
jge    12b7 <main+0x177>
movl   $0x0,-0x88(%rbp)
cmpl   $0x200,-0x88(%rbp)
jge    129e <main+0x15e>
mov    -0x84(%rbp),%eax
shl    $0x9,%eax
add    -0x88(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    -0x8c(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm1
movsd  0xd8a(%rip),%xmm0
divsd  %xmm1,%xmm0
mov    -0x70(%rbp),%rax
movslq -0x8c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x88(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x88(%rbp)
jmp    123c <main+0xfc>
jmp    12a3 <main+0x163>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1222 <main+0xe2>
movl   $0x0,-0x84(%rbp)
cmpl   $0x200,-0x84(%rbp)
jge    1356 <main+0x216>
movl   $0x0,-0x88(%rbp)
cmpl   $0x200,-0x88(%rbp)
jge    133d <main+0x1fd>
mov    -0x84(%rbp),%eax
shl    $0x9,%eax
add    -0x88(%rbp),%eax
mov    %eax,-0x90(%rbp)
mov    -0x90(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm1
movsd  0xcfb(%rip),%xmm0
divsd  %xmm1,%xmm0
mov    -0x78(%rbp),%rax
movslq -0x90(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x88(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x88(%rbp)
jmp    12db <main+0x19b>
jmp    1342 <main+0x202>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    12c1 <main+0x181>
movl   $0x0,-0x84(%rbp)
cmpl   $0x200,-0x84(%rbp)
jge    13e4 <main+0x2a4>
movl   $0x0,-0x88(%rbp)
cmpl   $0x200,-0x88(%rbp)
jge    13cb <main+0x28b>
mov    -0x84(%rbp),%eax
shl    $0x9,%eax
add    -0x88(%rbp),%eax
mov    %eax,-0x94(%rbp)
mov    -0x80(%rbp),%rax
movslq -0x94(%rbp),%rcx
movsd  0xc56(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x88(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x88(%rbp)
jmp    137a <main+0x23a>
jmp    13d0 <main+0x290>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1360 <main+0x220>
mov    -0x70(%rbp),%r14
mov    -0x78(%rbp),%rbx
mov    -0x80(%rbp),%r10
lea    -0x61(%rbp),%rsi
lea    -0x50(%rbp),%rax
lea    -0x58(%rbp),%r9
lea    -0x60(%rbp),%r11
mov    %rsi,%rdi
mov    %rax,%rdx
mov    %rax,%rcx
mov    %rax,%r8
mov    %r14,(%rsp)
mov    %rax,0x8(%rsp)
mov    %rbx,0x10(%rsp)
mov    %rax,0x18(%rsp)
mov    %r11,0x20(%rsp)
mov    %r10,0x28(%rsp)
mov    %rax,0x30(%rsp)
call   1040 <dgemm_@plt>
movl   $0x0,-0x84(%rbp)
mov    -0x84(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    14ba <main+0x37a>
mov    -0x70(%rbp),%r12
mov    -0x78(%rbp),%r14
mov    -0x80(%rbp),%r10
lea    -0x61(%rbp),%rsi
lea    -0x38(%rbp),%rdx
lea    -0x3c(%rbp),%rcx
lea    -0x40(%rbp),%r8
lea    -0x58(%rbp),%r9
lea    -0x44(%rbp),%r15
lea    -0x48(%rbp),%rbx
lea    -0x60(%rbp),%r11
lea    -0x4c(%rbp),%rax
mov    %rsi,%rdi
mov    %r12,(%rsp)
mov    %r15,0x8(%rsp)
mov    %r14,0x10(%rsp)
mov    %rbx,0x18(%rsp)
mov    %r11,0x20(%rsp)
mov    %r10,0x28(%rsp)
mov    %rax,0x30(%rsp)
call   1040 <dgemm_@plt>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    143d <main+0x2fd>
mov    -0x70(%rbp),%rdi
call   1030 <free@plt>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
mov    -0x80(%rbp),%rdi
call   1030 <free@plt>
mov    0x2b04(%rip),%rax
mov    (%rax),%eax
add    $0xb0,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    $0x400000,%r14d
cmp    $0x2,%edi
jl     1165 <main+0x25>
mov    0x8(%rsi),%rdi
call   1060 <atoi@plt>
mov    %eax,%r14d
movl   $0x17,0x24(%rsp)
movl   $0x17,0x20(%rsp)
movl   $0x17,0x1c(%rsp)
movl   $0x17,0x18(%rsp)
movl   $0x17,0x14(%rsp)
movl   $0x17,0x10(%rsp)
movl   $0x200,0xc(%rsp)
movabs $0x3ff0000000000000,%rax
mov    %rax,0x30(%rsp)
mov    %rax,0x28(%rsp)
movb   $0x4e,0xb(%rsp)
mov    $0x200000,%edi
call   1050 <malloc@plt>
mov    %rax,%rbx
mov    $0x200000,%edi
call   1050 <malloc@plt>
mov    %rax,%rbp
mov    $0x200000,%edi
call   1050 <malloc@plt>
mov    %rax,%r13
xor    %r8d,%r8d
pcmpeqd %xmm0,%xmm0
movapd 0xe14(%rip),%xmm1
xor    %ecx,%ecx
xchg   %ax,%ax
mov    $0x200,%edx
mov    %r8,%rsi
nopl   0x0(%rax,%rax,1)
movd   %esi,%xmm2
lea    0x1(%rsi),%edi
movd   %edi,%xmm3
punpckldq %xmm3,%xmm2
psubd  %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movapd %xmm1,%xmm3
divpd  %xmm2,%xmm3
movupd %xmm3,(%rbx,%rsi,8)
add    $0x2,%rsi
add    $0xfffffffffffffffe,%rdx
jne    1200 <main+0xc0>
add    $0x1,%rcx
add    $0x200,%r8
cmp    $0x200,%rcx
jne    11f0 <main+0xb0>
xor    %r8d,%r8d
pcmpeqd %xmm0,%xmm0
movapd 0xdbf(%rip),%xmm1
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    $0x200,%edx
mov    %r8,%rsi
nopl   0x0(%rax,%rax,1)
movd   %esi,%xmm2
lea    0x1(%rsi),%edi
movd   %edi,%xmm3
punpckldq %xmm3,%xmm2
psubd  %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movapd %xmm1,%xmm3
divpd  %xmm2,%xmm3
movupd %xmm3,0x0(%rbp,%rsi,8)
add    $0x2,%rsi
add    $0xfffffffffffffffe,%rdx
jne    1270 <main+0x130>
add    $0x1,%rcx
add    $0x200,%r8
cmp    $0x200,%rcx
jne    1260 <main+0x120>
mov    %r13,%rsi
add    $0x70,%rsi
xor    %ecx,%ecx
movaps 0xd5d(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movups %xmm0,-0x70(%rsi,%rdx,8)
movups %xmm0,-0x60(%rsi,%rdx,8)
movups %xmm0,-0x50(%rsi,%rdx,8)
movups %xmm0,-0x40(%rsi,%rdx,8)
movups %xmm0,-0x30(%rsi,%rdx,8)
movups %xmm0,-0x20(%rsi,%rdx,8)
movups %xmm0,-0x10(%rsi,%rdx,8)
movups %xmm0,(%rsi,%rdx,8)
add    $0x10,%rdx
cmp    $0x200,%rdx
jne    12e0 <main+0x1a0>
add    $0x1,%rcx
add    $0x1000,%rsi
cmp    $0x200,%rcx
jne    12d0 <main+0x190>
sub    $0x8,%rsp
lea    0x14(%rsp),%rcx
lea    0x30(%rsp),%r10
lea    0x13(%rsp),%rdi
lea    0x38(%rsp),%r9
mov    %rdi,%rsi
mov    %rcx,%rdx
mov    %rcx,%r8
push   %rcx
push   %r13
push   %r10
push   %rcx
push   %rbp
push   %rcx
push   %rbx
call   1040 <dgemm_@plt>
add    $0x40,%rsp
test   %r14d,%r14d
jle    13b7 <main+0x277>
lea    0xb(%rsp),%r12
lea    0x30(%rsp),%r15
nopw   0x0(%rax,%rax,1)
sub    $0x8,%rsp
mov    %r12,%rdi
mov    %r12,%rsi
lea    0x2c(%rsp),%rdx
lea    0x28(%rsp),%rcx
lea    0x24(%rsp),%r8
mov    %r15,%r9
lea    0x18(%rsp),%rax
push   %rax
push   %r13
lea    0x40(%rsp),%rax
push   %rax
lea    0x34(%rsp),%rax
push   %rax
push   %rbp
lea    0x48(%rsp),%rax
push   %rax
push   %rbx
call   1040 <dgemm_@plt>
add    $0x40,%rsp
add    $0xffffffff,%r14d
jne    1370 <main+0x230>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %rbp,%rdi
call   1030 <free@plt>
mov    %r13,%rdi
call   1030 <free@plt>
mov    0x2c0a(%rip),%rax
mov    (%rax),%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@EXIT_SUCCESS = global i32 0
define i32 @main(i32 %0, i8** nocapture %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca double
%11 = alloca double
%12 = alloca i8
%13 = icmp sgt i32 %0, 1
br i1 %13, label %14, label %18
14: ; preds = %2
%15 = getelementptr inbounds i8*, i8** %1, i64 1
%16 = load i8*, i8** %15
%17 = tail call i32 @atoi(i8* %16)
br label %18
18: ; preds = %2, %14
%19 = phi i32 [ %17, %14 ], [ 4194304, %2 ]
%20 = bitcast i32* %3 to i8*
store i32 23, i32* %3
%21 = bitcast i32* %4 to i8*
store i32 23, i32* %4
%22 = bitcast i32* %5 to i8*
store i32 23, i32* %5
%23 = bitcast i32* %6 to i8*
store i32 23, i32* %6
%24 = bitcast i32* %7 to i8*
store i32 23, i32* %7
%25 = bitcast i32* %8 to i8*
store i32 23, i32* %8
%26 = bitcast i32* %9 to i8*
store i32 512, i32* %9
%27 = bitcast double* %10 to i8*
store double 1.000000e+00, double* %10
%28 = bitcast double* %11 to i8*
store double 1.000000e+00, double* %11
store i8 78, i8* %12
%29 = tail call i64 @malloc(i32 2097152)
%30 = inttoptr i64 %29 to double*
%31 = tail call i64 @malloc(i32 2097152)
%32 = tail call i64 @malloc(i32 2097152)
br label %33
33: ; preds = %18, %51
%34 = phi i64 [ 0, %18 ], [ %52, %51 ]
%35 = shl nsw i64 %34, 9
br label %36
36: ; preds = %36, %33
%37 = phi i64 [ 0, %33 ], [ %49, %36 ]
%38 = or i64 %37, 1
%39 = add nuw nsw i64 %37, %35
%40 = add nuw nsw i64 %38, %35
%41 = insertelement <2 x i64> poison, i64 %39, i64 0
%42 = insertelement <2 x i64> %41, i64 %40, i64 1
%43 = trunc <2 x i64> %42 to <2 x i32>
%44 = add <2 x i32> %43, <i32 1, i32 1>
%45 = sitofp <2 x i32> %44 to <2 x double>
%46 = fdiv <2 x double> <double 1.000000e+00, double 1.000000e+00>, %45
%47 = getelementptr inbounds double, double* %30, i64 %39
%48 = bitcast double* %47 to <2 x double>*
store <2 x double> %46, <2 x double>* %48
%49 = add nuw i64 %37, 2
%50 = icmp eq i64 %49, 512
br i1 %50, label %51, label %36
51: ; preds = %36
%52 = add nuw nsw i64 %34, 1
%53 = icmp eq i64 %52, 512
br i1 %53, label %54, label %33
54: ; preds = %51
%55 = inttoptr i64 %31 to double*
br label %56
56: ; preds = %54, %74
%57 = phi i64 [ 0, %54 ], [ %75, %74 ]
%58 = shl nsw i64 %57, 9
br label %59
59: ; preds = %59, %56
%60 = phi i64 [ 0, %56 ], [ %72, %59 ]
%61 = or i64 %60, 1
%62 = add nuw nsw i64 %60, %58
%63 = add nuw nsw i64 %61, %58
%64 = insertelement <2 x i64> poison, i64 %62, i64 0
%65 = insertelement <2 x i64> %64, i64 %63, i64 1
%66 = trunc <2 x i64> %65 to <2 x i32>
%67 = add <2 x i32> %66, <i32 1, i32 1>
%68 = sitofp <2 x i32> %67 to <2 x double>
%69 = fdiv <2 x double> <double 2.000000e+00, double 2.000000e+00>, %68
%70 = getelementptr inbounds double, double* %55, i64 %62
%71 = bitcast double* %70 to <2 x double>*
store <2 x double> %69, <2 x double>* %71
%72 = add nuw i64 %60, 2
%73 = icmp eq i64 %72, 512
br i1 %73, label %74, label %59
74: ; preds = %59
%75 = add nuw nsw i64 %57, 1
%76 = icmp eq i64 %75, 512
br i1 %76, label %77, label %56
77: ; preds = %74
%78 = inttoptr i64 %32 to double*
br label %79
79: ; preds = %77, %109
%80 = phi i64 [ 0, %77 ], [ %110, %109 ]
%81 = shl nsw i64 %80, 9
br label %82
82: ; preds = %82, %79
%83 = phi i64 [ 0, %79 ], [ %107, %82 ]
%84 = add nuw nsw i64 %83, %81
%85 = getelementptr inbounds double, double* %78, i64 %84
%86 = bitcast double* %85 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %86
%87 = getelementptr inbounds double, double* %85, i64 2
%88 = bitcast double* %87 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %88
%89 = or i64 %83, 4
%90 = add nuw nsw i64 %89, %81
%91 = getelementptr inbounds double, double* %78, i64 %90
%92 = bitcast double* %91 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %92
%93 = getelementptr inbounds double, double* %91, i64 2
%94 = bitcast double* %93 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %94
%95 = or i64 %83, 8
%96 = add nuw nsw i64 %95, %81
%97 = getelementptr inbounds double, double* %78, i64 %96
%98 = bitcast double* %97 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %98
%99 = getelementptr inbounds double, double* %97, i64 2
%100 = bitcast double* %99 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %100
%101 = or i64 %83, 12
%102 = add nuw nsw i64 %101, %81
%103 = getelementptr inbounds double, double* %78, i64 %102
%104 = bitcast double* %103 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %104
%105 = getelementptr inbounds double, double* %103, i64 2
%106 = bitcast double* %105 to <2 x double>*
store <2 x double> <double -1.000000e+00, double -1.000000e+00>, <2 x double>* %106
%107 = add nuw nsw i64 %83, 16
%108 = icmp eq i64 %107, 512
br i1 %108, label %109, label %82
109: ; preds = %82
%110 = add nuw nsw i64 %80, 1
%111 = icmp eq i64 %110, 512
br i1 %111, label %112, label %79
112: ; preds = %109
%113 = call i32 @dgemm_(i8* %12, i8* %12, i32* %9, i32* %9, i32* %9, double* %10, double* %30, i32* %9, double* %55, i32* %9, double* %11, double* %78, i32* %9)
%114 = icmp sgt i32 %19, 0
br i1 %114, label %115, label %120
115: ; preds = %112, %115
%116 = phi i32 [ %118, %115 ], [ 0, %112 ]
%117 = call i32 @dgemm_(i8* %12, i8* %12, i32* %3, i32* %4, i32* %5, double* %10, double* %30, i32* %6, double* %55, i32* %7, double* %11, double* %78, i32* %8)
%118 = add nuw nsw i32 %116, 1
%119 = icmp eq i32 %118, %19
br i1 %119, label %120, label %115
120: ; preds = %115, %112
%121 = call i32 @free(double* %30)
%122 = call i32 @free(double* %55)
%123 = call i32 @free(double* %78)
%124 = load i32, i32* @EXIT_SUCCESS
ret i32 %124
}