void ma(double *x, int *n, int *n_p, double *ans) {
  int i;
  int nn = *n - *n_p * 2;
  int nn_p = *n_p;
  double *ma, *ma2, *ma3;
  double ma_tmp;
  ma = (double *)malloc((nn + nn_p + 1) * sizeof(double));
  ma2 = (double *)malloc((nn + 2) * sizeof(double));
  ma3 = (double *)malloc(nn * sizeof(double));
  ma_tmp = 0;
  for (i = 0; i < nn_p; ++i) {
    ma_tmp = ma_tmp + *(x + i);
  }
  *(ma) = ma_tmp / nn_p;
  for (i = nn_p; i < nn + 2 * nn_p; ++i) {
    ma_tmp = ma_tmp - *(x + i - nn_p) + *(x + i);
    *(ma + i - nn_p + 1) = ma_tmp / nn_p;
  }
  ma_tmp = 0;
  for (i = 0; i < nn_p; ++i) {
    ma_tmp = ma_tmp + *(ma + i);
  }
  *(ma2) = ma_tmp / nn_p;
  for (i = nn_p; i < nn + nn_p + 1; ++i) {
    ma_tmp = ma_tmp - *(ma + i - nn_p) + *(ma + i);
    *(ma2 + i - nn_p + 1) = ma_tmp / nn_p;
  }
  ma_tmp = 0;
  for (i = 0; i < 3; ++i) {
    ma_tmp = ma_tmp + *(ma2 + i);
  }
  *(ans) = ma_tmp / 3;
  for (i = 3; i < nn + 2; ++i) {
    ma_tmp = ma_tmp - *(ma2 + i - 3) + *(ma2 + i);
    *(ans + i - 2) = ma_tmp / 3;
  }
  free(ma);
  free(ma2);
  free(ma3);
}


x86 assembly (clang, -O0):
<ma>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%ecx
shl    $0x1,%ecx
sub    %ecx,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
add    -0x2c(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rdi
shl    $0x3,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rdi
shl    $0x3,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x40(%rbp)
movslq -0x28(%rbp),%rdi
shl    $0x3,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    11d5 <ma+0xb5>
movsd  -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11a4 <ma+0x84>
movsd  -0x50(%rbp),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
cmp    %ecx,%eax
jge    1275 <ma+0x155>
movsd  -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsd  %xmm0,0x8(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11f1 <ma+0xd1>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    12b5 <ma+0x195>
movsd  -0x50(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1284 <ma+0x164>
movsd  -0x50(%rbp),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x40(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
add    -0x2c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1353 <ma+0x233>
movsd  -0x50(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x40(%rbp),%rax
movslq -0x24(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsd  %xmm0,0x8(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12d1 <ma+0x1b1>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x3,-0x24(%rbp)
jge    1391 <ma+0x271>
movsd  -0x50(%rbp),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1362 <ma+0x242>
movsd  -0x50(%rbp),%xmm0
movsd  0xc62(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x3,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
cmp    %ecx,%eax
jge    1414 <ma+0x2f4>
movsd  -0x50(%rbp),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  -0x18(%rax,%rcx,8),%xmm0
mov    -0x40(%rbp),%rax
movslq -0x24(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  0xc0c(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,-0x10(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13b1 <ma+0x291>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ma>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rcx,0x10(%rsp)
mov    %rdi,%rbx
movslq (%rsi),%r14
movslq (%rdx),%r13
mov    %r14d,%r15d
sub    %r13d,%r15d
sub    %r13d,%r15d
lea    (%r15,%r13,1),%ebp
movslq %ebp,%rax
lea    0x8(,%rax,8),%rdi
call   1040 <malloc@plt>
mov    %rax,%r12
mov    %r15,0x8(%rsp)
movslq %r15d,%rax
lea    0x10(,%rax,8),%rdi
call   1040 <malloc@plt>
mov    %rax,%r15
mov    %r13d,%eax
test   %r13,%r13
jle    1193 <ma+0x73>
lea    -0x1(%rax),%rdx
mov    %eax,%ecx
and    $0x7,%ecx
cmp    $0x7,%rdx
jae    1199 <ma+0x79>
xorpd  %xmm1,%xmm1
xor    %edx,%edx
jmp    11e8 <ma+0xc8>
xorpd  %xmm1,%xmm1
jmp    120e <ma+0xee>
mov    %eax,%esi
and    $0xfffffff8,%esi
xorpd  %xmm1,%xmm1
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  (%rbx,%rdx,8),%xmm1
addsd  0x8(%rbx,%rdx,8),%xmm1
addsd  0x10(%rbx,%rdx,8),%xmm1
addsd  0x18(%rbx,%rdx,8),%xmm1
addsd  0x20(%rbx,%rdx,8),%xmm1
addsd  0x28(%rbx,%rdx,8),%xmm1
addsd  0x30(%rbx,%rdx,8),%xmm1
addsd  0x38(%rbx,%rdx,8),%xmm1
add    $0x8,%rdx
cmp    %rdx,%rsi
jne    11b0 <ma+0x90>
test   %rcx,%rcx
je     120e <ma+0xee>
lea    (%rbx,%rdx,8),%rdx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
addsd  (%rdx,%rsi,8),%xmm1
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    1200 <ma+0xe0>
cvtsi2sd %r13d,%xmm0
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%r12)
cmp    %r14d,%r13d
jge    12db <ma+0x1bb>
lea    0x0(,%r13,8),%rcx
mov    %r14d,%esi
sub    %r13d,%esi
mov    %r13,%rdx
not    %rdx
test   $0x1,%sil
jne    1251 <ma+0x131>
mov    %r13,%rsi
add    %r14,%rdx
jne    127c <ma+0x15c>
jmp    12db <ma+0x1bb>
mov    %r12,%rsi
sub    %rcx,%rsi
subsd  (%rbx),%xmm1
addsd  (%rbx,%r13,8),%xmm1
add    $0x8,%rsi
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rsi,%r13,8)
lea    0x1(%r13),%rsi
add    %r14,%rdx
je     12db <ma+0x1bb>
sub    %rsi,%r14
lea    0x0(,%rsi,8),%rdx
sub    %rcx,%rdx
add    %r12,%rdx
add    $0x10,%rdx
lea    (%rbx,%rsi,8),%rsi
add    $0x8,%rsi
neg    %rcx
nopl   0x0(%rax)
subsd  -0x8(%rsi,%rcx,1),%xmm1
addsd  -0x8(%rsi),%xmm1
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,-0x8(%rdx)
subsd  (%rsi,%rcx,1),%xmm1
addsd  (%rsi),%xmm1
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rdx)
add    $0x10,%rdx
add    $0x10,%rsi
add    $0xfffffffffffffffe,%r14
jne    12a0 <ma+0x180>
test   %eax,%eax
jle    12fb <ma+0x1db>
lea    -0x1(%rax),%rdx
mov    %eax,%ecx
and    $0x7,%ecx
cmp    $0x7,%rdx
mov    0x8(%rsp),%rdi
jae    1306 <ma+0x1e6>
xorpd  %xmm1,%xmm1
xor    %edx,%edx
jmp    1360 <ma+0x240>
xorpd  %xmm1,%xmm1
mov    0x8(%rsp),%rdi
jmp    137e <ma+0x25e>
mov    %eax,%esi
and    $0xfffffff8,%esi
xorpd  %xmm1,%xmm1
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
addsd  (%r12,%rdx,8),%xmm1
addsd  0x8(%r12,%rdx,8),%xmm1
addsd  0x10(%r12,%rdx,8),%xmm1
addsd  0x18(%r12,%rdx,8),%xmm1
addsd  0x20(%r12,%rdx,8),%xmm1
addsd  0x28(%r12,%rdx,8),%xmm1
addsd  0x30(%r12,%rdx,8),%xmm1
addsd  0x38(%r12,%rdx,8),%xmm1
add    $0x8,%rdx
cmp    %rdx,%rsi
jne    1320 <ma+0x200>
test   %rcx,%rcx
je     137e <ma+0x25e>
lea    (%r12,%rdx,8),%rdx
xor    %esi,%esi
nopl   0x0(%rax,%rax,1)
addsd  (%rdx,%rsi,8),%xmm1
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    1370 <ma+0x250>
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%r15)
test   %edi,%edi
js     1516 <ma+0x3f6>
cmp    %ebp,%eax
cmovg  %eax,%ebp
lea    0x0(,%r13,8),%rax
mov    %ebp,%ecx
sub    %r13d,%ecx
add    $0x1,%ecx
test   $0x1,%cl
mov    0x10(%rsp),%rsi
je     13da <ma+0x2ba>
mov    %r15,%rcx
sub    %rax,%rcx
subsd  (%r12),%xmm1
addsd  (%r12,%r13,8),%xmm1
add    $0x8,%rcx
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rcx,%r13,8)
add    $0x1,%r13
test   %edi,%edi
jle    144a <ma+0x32a>
sub    %r13d,%ebp
add    $0x1,%ebp
lea    0x0(,%r13,8),%rcx
sub    %rax,%rcx
add    %r15,%rcx
add    $0x10,%rcx
lea    (%r12,%r13,8),%rdx
add    $0x8,%rdx
neg    %rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
subsd  -0x8(%rdx,%rax,1),%xmm1
addsd  -0x8(%rdx),%xmm1
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
subsd  (%rdx,%rax,1),%xmm1
movsd  %xmm2,-0x8(%rcx)
addsd  (%rdx),%xmm1
movapd %xmm1,%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rcx)
add    $0x10,%rcx
add    $0x10,%rdx
add    $0xfffffffe,%ebp
jne    1410 <ma+0x2f0>
xorpd  %xmm0,%xmm0
addsd  (%r15),%xmm0
addsd  0x8(%r15),%xmm0
addsd  0x10(%r15),%xmm0
movapd %xmm0,%xmm1
divsd  0xb95(%rip),%xmm1
movsd  %xmm1,(%rsi)
cmp    $0x1,%edi
jle    1528 <ma+0x408>
lea    0x2(%rdi),%eax
cmp    $0x5,%eax
mov    $0x4,%ecx
cmovge %eax,%ecx
add    $0xfffffffffffffffd,%rcx
mov    $0x3,%eax
cmp    $0x2,%edi
je     14f4 <ma+0x3d4>
mov    %rcx,%rdx
and    $0xfffffffffffffffe,%rdx
xor    %eax,%eax
movsd  0xb5b(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
subsd  (%r15,%rax,8),%xmm0
addsd  0x18(%r15,%rax,8),%xmm0
movapd %xmm0,%xmm2
divsd  %xmm1,%xmm2
movsd  %xmm2,0x8(%rsi,%rax,8)
subsd  0x8(%r15,%rax,8),%xmm0
addsd  0x20(%r15,%rax,8),%xmm0
movapd %xmm0,%xmm2
divsd  %xmm1,%xmm2
movsd  %xmm2,0x10(%rsi,%rax,8)
add    $0x2,%rax
cmp    %rax,%rdx
jne    14b0 <ma+0x390>
add    $0x3,%rax
test   $0x1,%cl
je     1528 <ma+0x408>
subsd  -0x18(%r15,%rax,8),%xmm0
addsd  (%r15,%rax,8),%xmm0
divsd  0xaf2(%rip),%xmm0
movsd  %xmm0,-0x10(%rsi,%rax,8)
jmp    1528 <ma+0x408>
movabs $0x7ff8000000000000,%rax
mov    0x10(%rsp),%rcx
mov    %rax,(%rcx)
mov    %r12,%rdi
call   1030 <free@plt>
mov    %r15,%rdi
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>

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

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