#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*/ m5_dump_stats(int /*<<< orphan*/, int /*<<< orphan*/);
int /*<<< orphan*/ m5_reset_stats(int /*<<< orphan*/, int /*<<< orphan*/);
scalar_t__ malloc(int);
int /*<<< orphan*/ printf(char *, double, double, double);
scalar_t__ spm_malloc(int, int);
int main(int argc, char **argv) {
  int ni = 200;
  int nj = 200;
  int nk = 200;
  int i, j, k;
  double *alpha;
  double *beta;
  double *A = (double *)malloc(ni * nk * sizeof(double));
  double *B = (double *)malloc(nk * nj * sizeof(double));
  double *C = (double *)spm_malloc(1024 * 1024 * 16, 1);
  *alpha = 32412;
  *beta = 2123;
  for (i = 0; i < ni; i++)
    for (j = 0; j < nj; j++)
      C[i * ni + j] = ((double)i * j) / ni;
  for (i = 0; i < ni; i++)
    for (j = 0; j < nk; j++)
      A[i * ni + j] = ((double)i * j) / ni;
  for (i = 0; i < nk; i++)
    for (j = 0; j < nj; j++)
      B[i * nk + j] = ((double)i * j) / ni;
  m5_reset_stats(0, 0);
#pragma scop
  for (i = 0; i < 200; i++)
    for (j = 0; j < 200; j++) {
      C[i * 200 + j] *= *beta;
      for (k = 0; k < 200; ++k)
        C[i * 200 + j] += *alpha * A[i * 200 + k] * B[k * 200 + j];
    }
#pragma endscop
  m5_dump_stats(0, 0);
  printf("%f, %f, %f\n", C[11], A[11], B[11]);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0xc8,-0x14(%rbp)
movl   $0xc8,-0x18(%rbp)
movl   $0xc8,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x1c(%rbp),%eax
cltq
shl    $0x3,%rax
mov    %eax,%edi
call   1060 <malloc@plt>
mov    %rax,-0x40(%rbp)
mov    -0x1c(%rbp),%eax
imul   -0x18(%rbp),%eax
cltq
shl    $0x3,%rax
mov    %eax,%edi
call   1060 <malloc@plt>
mov    %rax,-0x48(%rbp)
mov    $0x1000000,%edi
mov    $0x1,%esi
call   1070 <spm_malloc@plt>
mov    %rax,-0x50(%rbp)
mov    -0x30(%rbp),%rax
movsd  0xe3e(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
movsd  0xe26(%rip),%xmm0
movsd  %xmm0,(%rax)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1252 <main+0x102>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    123f <main+0xef>
cvtsi2sdl -0x20(%rbp),%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x50(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11f8 <main+0xa8>
jmp    1244 <main+0xf4>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11e5 <main+0x95>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12c6 <main+0x176>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12b3 <main+0x163>
cvtsi2sdl -0x20(%rbp),%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x40(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    126c <main+0x11c>
jmp    12b8 <main+0x168>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1259 <main+0x109>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    133a <main+0x1ea>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1327 <main+0x1d7>
cvtsi2sdl -0x20(%rbp),%xmm0
cvtsi2sdl -0x24(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x48(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12e0 <main+0x190>
jmp    132c <main+0x1dc>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12cd <main+0x17d>
xor    %esi,%esi
mov    %esi,%edi
call   1050 <m5_reset_stats@plt>
movl   $0x0,-0x20(%rbp)
cmpl   $0xc8,-0x20(%rbp)
jge    142d <main+0x2dd>
movl   $0x0,-0x24(%rbp)
cmpl   $0xc8,-0x24(%rbp)
jge    141a <main+0x2ca>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x50(%rbp),%rax
imul   $0xc8,-0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x0,-0x28(%rbp)
cmpl   $0xc8,-0x28(%rbp)
jge    1407 <main+0x2b7>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x40(%rbp),%rax
imul   $0xc8,-0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0x48(%rbp),%rax
imul   $0xc8,-0x28(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x50(%rbp),%rax
imul   $0xc8,-0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1395 <main+0x245>
jmp    140c <main+0x2bc>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    135e <main+0x20e>
jmp    141f <main+0x2cf>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    134a <main+0x1fa>
xor    %esi,%esi
mov    %esi,%edi
call   1030 <m5_dump_stats@plt>
mov    -0x50(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x40(%rbp),%rax
movsd  0x58(%rax),%xmm1
mov    -0x48(%rbp),%rax
movsd  0x58(%rax),%xmm2
lea    0xbb8(%rip),%rdi
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rax
mov    $0x4e200,%edi
call   1030 <malloc@plt>
mov    $0x4e200,%edi
call   1030 <malloc@plt>
mov    $0x1000000,%edi
mov    $0x1,%esi
call   1040 <spm_malloc@plt>

LLVM IR (-O0):
@.str = [12 x i8] c"%f, %f, %f\0A\00"
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 double*
%13 = alloca double*
%14 = alloca double*
%15 = alloca double*
%16 = alloca double*
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
store i32 200, i32* %6
store i32 200, i32* %7
store i32 200, i32* %8
%17 = load i32, i32* %6
%18 = load i32, i32* %8
%19 = mul nsw i32 %17, %18
%20 = sext i32 %19 to i64
%21 = mul i64 %20, 8
%22 = trunc i64 %21 to i32
%23 = call i64 @malloc(i32 %22)
%24 = inttoptr i64 %23 to double*
store double* %24, double** %14
%25 = load i32, i32* %8
%26 = load i32, i32* %7
%27 = mul nsw i32 %25, %26
%28 = sext i32 %27 to i64
%29 = mul i64 %28, 8
%30 = trunc i64 %29 to i32
%31 = call i64 @malloc(i32 %30)
%32 = inttoptr i64 %31 to double*
store double* %32, double** %15
%33 = call i64 @spm_malloc(i32 16777216, i32 1)
%34 = inttoptr i64 %33 to double*
store double* %34, double** %16
%35 = load double*, double** %12
store double 3.241200e+04, double* %35
%36 = load double*, double** %13
store double 2.123000e+03, double* %36
store i32 0, i32* %9
br label %37
37: ; preds = %67, %2
%38 = load i32, i32* %9
%39 = load i32, i32* %6
%40 = icmp slt i32 %38, %39
br i1 %40, label %41, label %70
41: ; preds = %37
store i32 0, i32* %10
br label %42
42: ; preds = %63, %41
%43 = load i32, i32* %10
%44 = load i32, i32* %7
%45 = icmp slt i32 %43, %44
br i1 %45, label %46, label %66
46: ; preds = %42
%47 = load i32, i32* %9
%48 = sitofp i32 %47 to double
%49 = load i32, i32* %10
%50 = sitofp i32 %49 to double
%51 = fmul double %48, %50
%52 = load i32, i32* %6
%53 = sitofp i32 %52 to double
%54 = fdiv double %51, %53
%55 = load double*, double** %16
%56 = load i32, i32* %9
%57 = load i32, i32* %6
%58 = mul nsw i32 %56, %57
%59 = load i32, i32* %10
%60 = add nsw i32 %58, %59
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %55, i64 %61
store double %54, double* %62
br label %63
63: ; preds = %46
%64 = load i32, i32* %10
%65 = add nsw i32 %64, 1
store i32 %65, i32* %10
br label %42
66: ; preds = %42
br label %67
67: ; preds = %66
%68 = load i32, i32* %9
%69 = add nsw i32 %68, 1
store i32 %69, i32* %9
br label %37
70: ; preds = %37
store i32 0, i32* %9
br label %71
71: ; preds = %101, %70
%72 = load i32, i32* %9
%73 = load i32, i32* %6
%74 = icmp slt i32 %72, %73
br i1 %74, label %75, label %104
75: ; preds = %71
store i32 0, i32* %10
br label %76
76: ; preds = %97, %75
%77 = load i32, i32* %10
%78 = load i32, i32* %8
%79 = icmp slt i32 %77, %78
br i1 %79, label %80, label %100
80: ; preds = %76
%81 = load i32, i32* %9
%82 = sitofp i32 %81 to double
%83 = load i32, i32* %10
%84 = sitofp i32 %83 to double
%85 = fmul double %82, %84
%86 = load i32, i32* %6
%87 = sitofp i32 %86 to double
%88 = fdiv double %85, %87
%89 = load double*, double** %14
%90 = load i32, i32* %9
%91 = load i32, i32* %6
%92 = mul nsw i32 %90, %91
%93 = load i32, i32* %10
%94 = add nsw i32 %92, %93
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds double, double* %89, i64 %95
store double %88, double* %96
br label %97
97: ; preds = %80
%98 = load i32, i32* %10
%99 = add nsw i32 %98, 1
store i32 %99, i32* %10
br label %76
100: ; preds = %76
br label %101
101: ; preds = %100
%102 = load i32, i32* %9
%103 = add nsw i32 %102, 1
store i32 %103, i32* %9
br label %71
104: ; preds = %71
store i32 0, i32* %9
br label %105
105: ; preds = %135, %104
%106 = load i32, i32* %9
%107 = load i32, i32* %8
%108 = icmp slt i32 %106, %107
br i1 %108, label %109, label %138
109: ; preds = %105
store i32 0, i32* %10
br label %110
110: ; preds = %131, %109
%111 = load i32, i32* %10
%112 = load i32, i32* %7
%113 = icmp slt i32 %111, %112
br i1 %113, label %114, label %134
114: ; preds = %110
%115 = load i32, i32* %9
%116 = sitofp i32 %115 to double
%117 = load i32, i32* %10
%118 = sitofp i32 %117 to double
%119 = fmul double %116, %118
%120 = load i32, i32* %6
%121 = sitofp i32 %120 to double
%122 = fdiv double %119, %121
%123 = load double*, double** %15
%124 = load i32, i32* %9
%125 = load i32, i32* %8
%126 = mul nsw i32 %124, %125
%127 = load i32, i32* %10
%128 = add nsw i32 %126, %127
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds double, double* %123, i64 %129
store double %122, double* %130
br label %131
131: ; preds = %114
%132 = load i32, i32* %10
%133 = add nsw i32 %132, 1
store i32 %133, i32* %10
br label %110
134: ; preds = %110
br label %135
135: ; preds = %134
%136 = load i32, i32* %9
%137 = add nsw i32 %136, 1
store i32 %137, i32* %9
br label %105
138: ; preds = %105
%139 = call i32 @m5_reset_stats(i32 0, i32 0)
store i32 0, i32* %9
br label %140
140: ; preds = %199, %138
%141 = load i32, i32* %9
%142 = icmp slt i32 %141, 200
br i1 %142, label %143, label %202
143: ; preds = %140
store i32 0, i32* %10
br label %144
144: ; preds = %195, %143
%145 = load i32, i32* %10
%146 = icmp slt i32 %145, 200
br i1 %146, label %147, label %198
147: ; preds = %144
%148 = load double*, double** %13
%149 = load double, double* %148
%150 = load double*, double** %16
%151 = load i32, i32* %9
%152 = mul nsw i32 %151, 200
%153 = load i32, i32* %10
%154 = add nsw i32 %152, %153
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds double, double* %150, i64 %155
%157 = load double, double* %156
%158 = fmul double %157, %149
store double %158, double* %156
store i32 0, i32* %11
br label %159
159: ; preds = %191, %147
%160 = load i32, i32* %11
%161 = icmp slt i32 %160, 200
br i1 %161, label %162, label %194
162: ; preds = %159
%163 = load double*, double** %12
%164 = load double, double* %163
%165 = load double*, double** %14
%166 = load i32, i32* %9
%167 = mul nsw i32 %166, 200
%168 = load i32, i32* %11
%169 = add nsw i32 %167, %168
%170 = sext i32 %169 to i64
%171 = getelementptr inbounds double, double* %165, i64 %170
%172 = load double, double* %171
%173 = fmul double %164, %172
%174 = load double*, double** %15
%175 = load i32, i32* %11
%176 = mul nsw i32 %175, 200
%177 = load i32, i32* %10
%178 = add nsw i32 %176, %177
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds double, double* %174, i64 %179
%181 = load double, double* %180
%182 = load double*, double** %16
%183 = load i32, i32* %9
%184 = mul nsw i32 %183, 200
%185 = load i32, i32* %10
%186 = add nsw i32 %184, %185
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds double, double* %182, i64 %187
%189 = load double, double* %188
%190 = call double @llvm.fmuladd.f64(double %173, double %181, double %189)
store double %190, double* %188
br label %191
191: ; preds = %162
%192 = load i32, i32* %11
%193 = add nsw i32 %192, 1
store i32 %193, i32* %11
br label %159
194: ; preds = %159
br label %195
195: ; preds = %194
%196 = load i32, i32* %10
%197 = add nsw i32 %196, 1
store i32 %197, i32* %10
br label %144
198: ; preds = %144
br label %199
199: ; preds = %198
%200 = load i32, i32* %9
%201 = add nsw i32 %200, 1
store i32 %201, i32* %9
br label %140
202: ; preds = %140
%203 = call i32 @m5_dump_stats(i32 0, i32 0)
%204 = load double*, double** %16
%205 = getelementptr inbounds double, double* %204, i64 11
%206 = load double, double* %205
%207 = load double*, double** %14
%208 = getelementptr inbounds double, double* %207, i64 11
%209 = load double, double* %208
%210 = load double*, double** %15
%211 = getelementptr inbounds double, double* %210, i64 11
%212 = load double, double* %211
%213 = call i32 @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), double %206, double %209, double %212)
ret i32 0
}

LLVM IR (-O2):
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = tail call i64 @malloc(i32 320000)
%4 = tail call i64 @malloc(i32 320000)
%5 = tail call i64 @spm_malloc(i32 16777216, i32 1)
unreachable
}