#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 */
double omp_get_wtime();
int /*<<< orphan*/ printf(char *, double);
int main() {
  int m = 300, n = 300, p = 300, q = 300, c, d, k;
  double first[300][300] = {0};
  double second[300][300] = {0};
  double multiply[300][300] = {0};
  for (c = 0; c < m; c++)
    for (d = 0; d < n; d++)
      first[c][d] = 1;
  for (c = 0; c < p; c++)
    for (d = 0; d < q; d++)
      second[c][d] = 1;
  if (n != p) {
    return -1;
  }
  double start = omp_get_wtime();
  for (c = 0; c < m; c++) {
    for (d = 0; d < q; d++) {
      for (k = 0; k < p; k++) {
        multiply[c][d] += first[c][k] * second[k][d];
      }
    }
  }
  double end = omp_get_wtime();
  printf("start time = %f\n", start);
  printf("end time = %f\n", end);
  printf("diff time = %f\n", end - start);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20f5b0,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0x12c,-0x8(%rbp)
movl   $0x12c,-0xc(%rbp)
movl   $0x12c,-0x10(%rbp)
movl   $0x12c,-0x14(%rbp)
lea    -0xafca0(%rbp),%rdi
xor    %esi,%esi
mov    $0xafc80,%edx
call   1050 <memset@plt>
lea    -0x15f920(%rbp),%rdi
xor    %esi,%esi
mov    $0xafc80,%edx
call   1050 <memset@plt>
lea    -0x20f5a0(%rbp),%rdi
xor    %esi,%esi
mov    $0xafc80,%edx
call   1050 <memset@plt>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1204 <main+0xd4>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11f1 <main+0xc1>
movslq -0x18(%rbp),%rcx
lea    -0xafca0(%rbp),%rax
imul   $0x960,%rcx,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
movsd  0xe22(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11b1 <main+0x81>
jmp    11f6 <main+0xc6>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    119e <main+0x6e>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1271 <main+0x141>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    125e <main+0x12e>
movslq -0x18(%rbp),%rcx
lea    -0x15f920(%rbp),%rax
imul   $0x960,%rcx,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
movsd  0xdb5(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    121e <main+0xee>
jmp    1263 <main+0x133>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    120b <main+0xdb>
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
je     1289 <main+0x159>
movl   $0xffffffff,-0x4(%rbp)
jmp    13c6 <main+0x296>
mov    $0x0,%al
call   1030 <omp_get_wtime@plt>
movsd  %xmm0,-0x20f5a8(%rbp)
ff
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    136c <main+0x23c>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1359 <main+0x229>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1346 <main+0x216>
movslq -0x18(%rbp),%rcx
lea    -0xafca0(%rbp),%rax
imul   $0x960,%rcx,%rcx
add    %rcx,%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movslq -0x20(%rbp),%rcx
lea    -0x15f920(%rbp),%rax
imul   $0x960,%rcx,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movslq -0x18(%rbp),%rcx
lea    -0x20f5a0(%rbp),%rax
imul   $0x960,%rcx,%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12c5 <main+0x195>
jmp    134b <main+0x21b>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12b2 <main+0x182>
jmp    135e <main+0x22e>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    129f <main+0x16f>
mov    $0x0,%al
call   1030 <omp_get_wtime@plt>
movsd  %xmm0,-0x20f5b0(%rbp)
ff
movsd  -0x20f5a8(%rbp),%xmm0
ff
lea    0xc7e(%rip),%rdi
call   1040 <printf@plt>
movsd  -0x20f5b0(%rbp),%xmm0
ff
lea    0xc7b(%rip),%rdi
call   1040 <printf@plt>
movsd  -0x20f5b0(%rbp),%xmm0
ff
subsd  -0x20f5a8(%rbp),%xmm0
ff
lea    0xc6e(%rip),%rdi
call   1040 <printf@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20f5b0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r15
push   %r14
push   %rbx
sub    $0x20f590,%rsp
lea    0x15f910(%rsp),%rbx
xor    %r15d,%r15d
mov    $0xafc80,%edx
mov    %rbx,%rdi
xor    %esi,%esi
call   1050 <memset@plt>
lea    0xafc90(%rsp),%r14
mov    $0xafc80,%edx
mov    %r14,%rdi
xor    %esi,%esi
call   1050 <memset@plt>
lea    0x10(%rsp),%rdi
mov    $0xafc80,%edx
xor    %esi,%esi
call   1050 <memset@plt>
movapd 0xe7a(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
mov    $0x12,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm0,-0x90(%rbx,%rax,8)
ff ff
movapd %xmm0,-0x80(%rbx,%rax,8)
movapd %xmm0,-0x70(%rbx,%rax,8)
movapd %xmm0,-0x60(%rbx,%rax,8)
movapd %xmm0,-0x50(%rbx,%rax,8)
movapd %xmm0,-0x40(%rbx,%rax,8)
movapd %xmm0,-0x30(%rbx,%rax,8)
movapd %xmm0,-0x20(%rbx,%rax,8)
movapd %xmm0,-0x10(%rbx,%rax,8)
movapd %xmm0,(%rbx,%rax,8)
add    $0x14,%rax
cmp    $0x13e,%rax
jne    11a0 <main+0x70>
add    $0x1,%r15
add    $0x960,%rbx
cmp    $0x12c,%r15
jne    1190 <main+0x60>
xor    %eax,%eax
mov    $0x12,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm0,-0x90(%r14,%rcx,8)
ff ff ff
movapd %xmm0,-0x80(%r14,%rcx,8)
movapd %xmm0,-0x70(%r14,%rcx,8)
movapd %xmm0,-0x60(%r14,%rcx,8)
movapd %xmm0,-0x50(%r14,%rcx,8)
movapd %xmm0,-0x40(%r14,%rcx,8)
movapd %xmm0,-0x30(%r14,%rcx,8)
movapd %xmm0,-0x20(%r14,%rcx,8)
movapd %xmm0,-0x10(%r14,%rcx,8)
movapd %xmm0,(%r14,%rcx,8)
add    $0x14,%rcx
cmp    $0x13e,%rcx
jne    1210 <main+0xe0>
add    $0x1,%rax
add    $0x960,%r14
cmp    $0x12c,%rax
jne    1200 <main+0xd0>
xor    %r14d,%r14d
xor    %eax,%eax
call   1030 <omp_get_wtime@plt>
movsd  %xmm0,0x8(%rsp)
lea    0x15f910(%rsp),%rax
lea    0xafc90(%rsp),%r8
nopl   0x0(%rax,%rax,1)
mov    %r8,%rbx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nop
imul   $0x960,%r14,%rcx
add    %rsp,%rcx
add    $0x10,%rcx
lea    (%rcx,%rsi,8),%rdi
movsd  (%rcx,%rsi,8),%xmm0
mov    $0x2,%ecx
mov    %rbx,%rdx
nop
movsd  -0x10(%rax,%rcx,8),%xmm1
mulsd  (%rdx),%xmm1
movsd  -0x8(%rax,%rcx,8),%xmm2
addsd  %xmm0,%xmm1
mulsd  0x960(%rdx),%xmm2
addsd  %xmm1,%xmm2
movsd  (%rax,%rcx,8),%xmm0
mulsd  0x12c0(%rdx),%xmm0
addsd  %xmm2,%xmm0
add    $0x3,%rcx
add    $0x1c20,%rdx
cmp    $0x12e,%rcx
jne    12d0 <main+0x1a0>
movsd  %xmm0,(%rdi)
add    $0x1,%rsi
add    $0x8,%rbx
cmp    $0x12c,%rsi
jne    12b0 <main+0x180>
add    $0x1,%r14
add    $0x960,%rax
cmp    $0x12c,%r14
jne    12a0 <main+0x170>
xor    %eax,%eax
call   1030 <omp_get_wtime@plt>
movsd  %xmm0,(%rsp)
lea    0xcbc(%rip),%rdi
movsd  0x8(%rsp),%xmm0
call   1040 <printf@plt>
lea    0xcbb(%rip),%rdi
movsd  (%rsp),%xmm0
call   1040 <printf@plt>
movsd  (%rsp),%xmm0
subsd  0x8(%rsp),%xmm0
lea    0xcae(%rip),%rdi
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x20f590,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
@.str = [17 x i8] c"start time = %f\0A\00"
@.str.1 = [15 x i8] c"end time = %f\0A\00"
@.str.2 = [16 x i8] c"diff time = %f\0A\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca [300 x [300 x double]]
%10 = alloca [300 x [300 x double]]
%11 = alloca [300 x [300 x double]]
%12 = alloca double
%13 = alloca double
store i32 0, i32* %1
store i32 300, i32* %2
store i32 300, i32* %3
store i32 300, i32* %4
store i32 300, i32* %5
%14 = bitcast [300 x [300 x double]]* %9 to i8*
%15 = bitcast [300 x [300 x double]]* %10 to i8*
%16 = bitcast [300 x [300 x double]]* %11 to i8*
store i32 0, i32* %6
br label %17
17: ; preds = %37, %0
%18 = load i32, i32* %6
%19 = load i32, i32* %2
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %40
21: ; preds = %17
store i32 0, i32* %7
br label %22
22: ; preds = %33, %21
%23 = load i32, i32* %7
%24 = load i32, i32* %3
%25 = icmp slt i32 %23, %24
br i1 %25, label %26, label %36
26: ; preds = %22
%27 = load i32, i32* %6
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %9, i64 0, i64 %28
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [300 x double], [300 x double]* %29, i64 0, i64 %31
store double 1.000000e+00, double* %32
br label %33
33: ; preds = %26
%34 = load i32, i32* %7
%35 = add nsw i32 %34, 1
store i32 %35, i32* %7
br label %22
36: ; preds = %22
br label %37
37: ; preds = %36
%38 = load i32, i32* %6
%39 = add nsw i32 %38, 1
store i32 %39, i32* %6
br label %17
40: ; preds = %17
store i32 0, i32* %6
br label %41
41: ; preds = %61, %40
%42 = load i32, i32* %6
%43 = load i32, i32* %4
%44 = icmp slt i32 %42, %43
br i1 %44, label %45, label %64
45: ; preds = %41
store i32 0, i32* %7
br label %46
46: ; preds = %57, %45
%47 = load i32, i32* %7
%48 = load i32, i32* %5
%49 = icmp slt i32 %47, %48
br i1 %49, label %50, label %60
50: ; preds = %46
%51 = load i32, i32* %6
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %10, i64 0, i64 %52
%54 = load i32, i32* %7
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [300 x double], [300 x double]* %53, i64 0, i64 %55
store double 1.000000e+00, double* %56
br label %57
57: ; preds = %50
%58 = load i32, i32* %7
%59 = add nsw i32 %58, 1
store i32 %59, i32* %7
br label %46
60: ; preds = %46
br label %61
61: ; preds = %60
%62 = load i32, i32* %6
%63 = add nsw i32 %62, 1
store i32 %63, i32* %6
br label %41
64: ; preds = %41
%65 = load i32, i32* %3
%66 = load i32, i32* %4
%67 = icmp ne i32 %65, %66
br i1 %67, label %68, label %69
68: ; preds = %64
store i32 -1, i32* %1
br label %129
69: ; preds = %64
%70 = call double (...) @omp_get_wtime()
store double %70, double* %12
store i32 0, i32* %6
br label %71
71: ; preds = %116, %69
%72 = load i32, i32* %6
%73 = load i32, i32* %2
%74 = icmp slt i32 %72, %73
br i1 %74, label %75, label %119
75: ; preds = %71
store i32 0, i32* %7
br label %76
76: ; preds = %112, %75
%77 = load i32, i32* %7
%78 = load i32, i32* %5
%79 = icmp slt i32 %77, %78
br i1 %79, label %80, label %115
80: ; preds = %76
store i32 0, i32* %8
br label %81
81: ; preds = %108, %80
%82 = load i32, i32* %8
%83 = load i32, i32* %4
%84 = icmp slt i32 %82, %83
br i1 %84, label %85, label %111
85: ; preds = %81
%86 = load i32, i32* %6
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %9, i64 0, i64 %87
%89 = load i32, i32* %8
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds [300 x double], [300 x double]* %88, i64 0, i64 %90
%92 = load double, double* %91
%93 = load i32, i32* %8
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %10, i64 0, i64 %94
%96 = load i32, i32* %7
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds [300 x double], [300 x double]* %95, i64 0, i64 %97
%99 = load double, double* %98
%100 = load i32, i32* %6
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %11, i64 0, i64 %101
%103 = load i32, i32* %7
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds [300 x double], [300 x double]* %102, i64 0, i64 %104
%106 = load double, double* %105
%107 = call double @llvm.fmuladd.f64(double %92, double %99, double %106)
store double %107, double* %105
br label %108
108: ; preds = %85
%109 = load i32, i32* %8
%110 = add nsw i32 %109, 1
store i32 %110, i32* %8
br label %81
111: ; preds = %81
br label %112
112: ; preds = %111
%113 = load i32, i32* %7
%114 = add nsw i32 %113, 1
store i32 %114, i32* %7
br label %76
115: ; preds = %76
br label %116
116: ; preds = %115
%117 = load i32, i32* %6
%118 = add nsw i32 %117, 1
store i32 %118, i32* %6
br label %71
119: ; preds = %71
%120 = call double (...) @omp_get_wtime()
store double %120, double* %13
%121 = load double, double* %12
%122 = call i32 @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i64 0, i64 0), double %121)
%123 = load double, double* %13
%124 = call i32 @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), double %123)
%125 = load double, double* %13
%126 = load double, double* %12
%127 = fsub double %125, %126
%128 = call i32 @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i64 0, i64 0), double %127)
store i32 0, i32* %1
br label %129
129: ; preds = %119, %68
%130 = load i32, i32* %1
ret i32 %130
}

LLVM IR (-O2):
@.str = [17 x i8] c"start time = %f\0A\00"
@.str.1 = [15 x i8] c"end time = %f\0A\00"
@.str.2 = [16 x i8] c"diff time = %f\0A\00"
define i32 @main() {
%1 = alloca [300 x [300 x double]]
%2 = alloca [300 x [300 x double]]
%3 = alloca [300 x [300 x double]]
%4 = bitcast [300 x [300 x double]]* %1 to i8*
%5 = bitcast [300 x [300 x double]]* %2 to i8*
%6 = bitcast [300 x [300 x double]]* %3 to i8*
br label %7
7: ; preds = %37, %0
%8 = phi i64 [ 0, %0 ], [ %38, %37 ]
br label %9
9: ; preds = %9, %7
%10 = phi i64 [ 0, %7 ], [ %35, %9 ]
%11 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %8, i64 %10
%12 = bitcast double* %11 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %12
%13 = getelementptr inbounds double, double* %11, i64 2
%14 = bitcast double* %13 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %14
%15 = add nuw nsw i64 %10, 4
%16 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %8, i64 %15
%17 = bitcast double* %16 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %17
%18 = getelementptr inbounds double, double* %16, i64 2
%19 = bitcast double* %18 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %19
%20 = add nuw nsw i64 %10, 8
%21 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %8, i64 %20
%22 = bitcast double* %21 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %22
%23 = getelementptr inbounds double, double* %21, i64 2
%24 = bitcast double* %23 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %24
%25 = add nuw nsw i64 %10, 12
%26 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %8, i64 %25
%27 = bitcast double* %26 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %27
%28 = getelementptr inbounds double, double* %26, i64 2
%29 = bitcast double* %28 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %29
%30 = add nuw nsw i64 %10, 16
%31 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %8, i64 %30
%32 = bitcast double* %31 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %32
%33 = getelementptr inbounds double, double* %31, i64 2
%34 = bitcast double* %33 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %34
%35 = add nuw nsw i64 %10, 20
%36 = icmp eq i64 %35, 300
br i1 %36, label %37, label %9
37: ; preds = %9
%38 = add nuw nsw i64 %8, 1
%39 = icmp eq i64 %38, 300
br i1 %39, label %40, label %7
40: ; preds = %37, %70
%41 = phi i64 [ %71, %70 ], [ 0, %37 ]
br label %42
42: ; preds = %42, %40
%43 = phi i64 [ 0, %40 ], [ %68, %42 ]
%44 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %41, i64 %43
%45 = bitcast double* %44 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %45
%46 = getelementptr inbounds double, double* %44, i64 2
%47 = bitcast double* %46 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %47
%48 = add nuw nsw i64 %43, 4
%49 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %41, i64 %48
%50 = bitcast double* %49 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %50
%51 = getelementptr inbounds double, double* %49, i64 2
%52 = bitcast double* %51 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %52
%53 = add nuw nsw i64 %43, 8
%54 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %41, i64 %53
%55 = bitcast double* %54 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %55
%56 = getelementptr inbounds double, double* %54, i64 2
%57 = bitcast double* %56 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %57
%58 = add nuw nsw i64 %43, 12
%59 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %41, i64 %58
%60 = bitcast double* %59 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %60
%61 = getelementptr inbounds double, double* %59, i64 2
%62 = bitcast double* %61 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %62
%63 = add nuw nsw i64 %43, 16
%64 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %41, i64 %63
%65 = bitcast double* %64 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %65
%66 = getelementptr inbounds double, double* %64, i64 2
%67 = bitcast double* %66 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %67
%68 = add nuw nsw i64 %43, 20
%69 = icmp eq i64 %68, 300
br i1 %69, label %70, label %42
70: ; preds = %42
%71 = add nuw nsw i64 %41, 1
%72 = icmp eq i64 %71, 300
br i1 %72, label %73, label %40
73: ; preds = %70
%74 = tail call double (...) @omp_get_wtime()
br label %75
75: ; preds = %73, %106
%76 = phi i64 [ 0, %73 ], [ %107, %106 ]
br label %77
77: ; preds = %75, %103
%78 = phi i64 [ 0, %75 ], [ %104, %103 ]
%79 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %3, i64 0, i64 %76, i64 %78
%80 = load double, double* %79
br label %81
81: ; preds = %81, %77
%82 = phi i64 [ 0, %77 ], [ %101, %81 ]
%83 = phi double [ %80, %77 ], [ %100, %81 ]
%84 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %76, i64 %82
%85 = load double, double* %84
%86 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %82, i64 %78
%87 = load double, double* %86
%88 = tail call double @llvm.fmuladd.f64(double %85, double %87, double %83)
%89 = add nuw nsw i64 %82, 1
%90 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %76, i64 %89
%91 = load double, double* %90
%92 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %89, i64 %78
%93 = load double, double* %92
%94 = tail call double @llvm.fmuladd.f64(double %91, double %93, double %88)
%95 = add nuw nsw i64 %82, 2
%96 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %1, i64 0, i64 %76, i64 %95
%97 = load double, double* %96
%98 = getelementptr inbounds [300 x [300 x double]], [300 x [300 x double]]* %2, i64 0, i64 %95, i64 %78
%99 = load double, double* %98
%100 = tail call double @llvm.fmuladd.f64(double %97, double %99, double %94)
%101 = add nuw nsw i64 %82, 3
%102 = icmp eq i64 %101, 300
br i1 %102, label %103, label %81
103: ; preds = %81
store double %100, double* %79
%104 = add nuw nsw i64 %78, 1
%105 = icmp eq i64 %104, 300
br i1 %105, label %106, label %77
106: ; preds = %103
%107 = add nuw nsw i64 %76, 1
%108 = icmp eq i64 %107, 300
br i1 %108, label %109, label %75
109: ; preds = %106
%110 = tail call double (...) @omp_get_wtime()
%111 = tail call i32 @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i64 0, i64 0), double %74)
%112 = tail call i32 @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), double %110)
%113 = fsub double %110, %74
%114 = tail call i32 @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i64 0, i64 0), double %113)
ret i32 0
}