void gp_pt_mma(double *to, const double *p, int cnt, int siz, int rem) {
  double x, y, z, acc, sz_1;
  int i, j;
  switch (siz) {
  case 1:
    for (i = 0; i < cnt; i++, to += 8)
      *to = p[i];
    return;
  case 2:
    for (i = 0; i < cnt; i++, to += 8, p += 2)
      to[0] = .5 * ((x = p[0]) + (y = p[1])),
      (x < y) ? (to[1] = x, to[2] = y) : (to[1] = y, to[2] = x);
    if (rem)
      to[0] = to[1] = to[2] = p[0];
    return;
  default:
    break;
  }
  for (i = 0, sz_1 = 1.0 / (double)siz; i < cnt; i++, to += 8, p += siz) {
    for (j = 1, x = y = acc = p[0]; j < (siz); j++) {
      acc += (z = p[j]);
      if (z < x)
        x = z;
      else if (z > y)
        y = z;
    }
    to[0] = (sz_1)*acc;
    to[1] = x;
    to[2] = y;
  }
  if (rem) {
    for (j = 1, x = y = acc = p[0]; j < (rem); j++) {
      acc += (z = p[j]);
      if (z < x)
        x = z;
      else if (z > y)
        y = z;
    }
    to[0] = (1.0 / (double)rem) * acc;
    to[1] = x;
    to[2] = y;
  }
}


x86 assembly (clang, -O0):
<gp_pt_mma>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x54(%rbp)
sub    $0x1,%eax
je     113b <gp_pt_mma+0x3b>
jmp    112a <gp_pt_mma+0x2a>
mov    -0x54(%rbp),%eax
sub    $0x2,%eax
je     1182 <gp_pt_mma+0x82>
jmp    1270 <gp_pt_mma+0x170>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    117d <gp_pt_mma+0x7d>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x8(%rbp)
jmp    1142 <gp_pt_mma+0x42>
jmp    1475 <gp_pt_mma+0x375>
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    123f <gp_pt_mma+0x13f>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  %xmm1,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x30(%rbp)
addsd  %xmm0,%xmm1
movsd  0xe44(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x28(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11fd <gp_pt_mma+0xfd>
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
jmp    1219 <gp_pt_mma+0x119>
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    1189 <gp_pt_mma+0x89>
cmpl   $0x0,-0x1c(%rbp)
je     126b <gp_pt_mma+0x16b>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1475 <gp_pt_mma+0x375>
jmp    1275 <gp_pt_mma+0x175>
movl   $0x0,-0x4c(%rbp)
cvtsi2sdl -0x18(%rbp),%xmm1
movsd  0xd7f(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1396 <gp_pt_mma+0x296>
movl   $0x1,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  %xmm0,-0x30(%rbp)
movsd  %xmm0,-0x28(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1339 <gp_pt_mma+0x239>
mov    -0x10(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1307 <gp_pt_mma+0x207>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1326 <gp_pt_mma+0x226>
movsd  -0x38(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    1321 <gp_pt_mma+0x221>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1326 <gp_pt_mma+0x226>
jmp    132b <gp_pt_mma+0x22b>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    12bc <gp_pt_mma+0x1bc>
movsd  -0x48(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x8(%rbp)
mov    -0x18(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    1292 <gp_pt_mma+0x192>
cmpl   $0x0,-0x1c(%rbp)
je     1475 <gp_pt_mma+0x375>
movl   $0x1,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  %xmm0,-0x30(%rbp)
movsd  %xmm0,-0x28(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    143b <gp_pt_mma+0x33b>
mov    -0x10(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1409 <gp_pt_mma+0x309>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1428 <gp_pt_mma+0x328>
movsd  -0x38(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    1423 <gp_pt_mma+0x323>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1428 <gp_pt_mma+0x328>
jmp    142d <gp_pt_mma+0x32d>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    13be <gp_pt_mma+0x2be>
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xbc0(%rip),%xmm0
divsd  %xmm1,%xmm0
mulsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,0x10(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<gp_pt_mma>:
push   %r14
push   %rbx
cmp    $0x1,%ecx
je     120d <gp_pt_mma+0x10d>
cmp    $0x2,%ecx
jne    1231 <gp_pt_mma+0x131>
test   %edx,%edx
jle    11ed <gp_pt_mma+0xed>
cmp    $0x1,%edx
je     11ad <gp_pt_mma+0xad>
mov    %edx,%eax
and    $0xfffffffe,%eax
movsd  0xecd(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rsi),%xmm1
movsd  0x8(%rsi),%xmm2
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm0,%xmm3
movsd  %xmm3,(%rdi)
movapd %xmm1,%xmm3
minsd  %xmm2,%xmm3
maxsd  %xmm1,%xmm2
movsd  %xmm3,0x8(%rdi)
movsd  %xmm2,0x10(%rdi)
movsd  0x10(%rsi),%xmm1
movsd  0x18(%rsi),%xmm2
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm0,%xmm3
movsd  %xmm3,0x40(%rdi)
movapd %xmm1,%xmm3
minsd  %xmm2,%xmm3
maxsd  %xmm1,%xmm2
movsd  %xmm3,0x48(%rdi)
movsd  %xmm2,0x50(%rdi)
sub    $0xffffffffffffff80,%rdi
add    $0x20,%rsi
add    $0xfffffffe,%eax
jne    1140 <gp_pt_mma+0x40>
test   $0x1,%dl
je     11ed <gp_pt_mma+0xed>
movsd  (%rsi),%xmm0
movsd  0x8(%rsi),%xmm1
movapd %xmm0,%xmm2
addsd  %xmm1,%xmm2
mulsd  0xe35(%rip),%xmm2
movsd  %xmm2,(%rdi)
movapd %xmm0,%xmm2
minsd  %xmm1,%xmm2
maxsd  %xmm0,%xmm1
movsd  %xmm2,0x8(%rdi)
movsd  %xmm1,0x10(%rdi)
add    $0x40,%rdi
add    $0x10,%rsi
test   %r8d,%r8d
je     151a <gp_pt_mma+0x41a>
movsd  (%rsi),%xmm0
movsd  %xmm0,0x10(%rdi)
movsd  %xmm0,0x8(%rdi)
movsd  %xmm0,(%rdi)
jmp    151a <gp_pt_mma+0x41a>
test   %edx,%edx
jle    151a <gp_pt_mma+0x41a>
mov    %edx,%edx
lea    -0x1(%rdx),%rcx
mov    %edx,%eax
and    $0x7,%eax
cmp    $0x7,%rcx
jae    13b2 <gp_pt_mma+0x2b2>
xor    %ecx,%ecx
jmp    1438 <gp_pt_mma+0x338>
movsd  0xdcf(%rip),%xmm0
test   %edx,%edx
jle    1355 <gp_pt_mma+0x255>
cvtsi2sd %ecx,%xmm2
movapd %xmm0,%xmm1
divsd  %xmm2,%xmm1
movslq %ecx,%r10
mov    %ecx,%r9d
add    $0xffffffffffffffff,%r9
shl    $0x3,%r10
mov    %r9,%r14
and    $0xfffffffffffffffe,%r14
neg    %r14
xor    %r11d,%r11d
jmp    129e <gp_pt_mma+0x19e>
nopw   0x0(%rax,%rax,1)
movapd %xmm2,%xmm3
movapd %xmm2,%xmm5
mulsd  %xmm1,%xmm2
movsd  %xmm2,(%rdi)
movsd  %xmm3,0x8(%rdi)
movsd  %xmm5,0x10(%rdi)
add    $0x1,%r11d
add    $0x40,%rdi
add    %r10,%rsi
cmp    %edx,%r11d
je     1355 <gp_pt_mma+0x255>
movsd  (%rsi),%xmm2
cmp    $0x2,%ecx
jl     1270 <gp_pt_mma+0x170>
mov    $0x1,%ebx
jne    12e0 <gp_pt_mma+0x1e0>
movapd %xmm2,%xmm4
movapd %xmm2,%xmm3
movapd %xmm4,%xmm5
test   $0x1,%r9b
je     1278 <gp_pt_mma+0x178>
movsd  (%rsi,%rbx,8),%xmm5
addsd  %xmm5,%xmm2
ucomisd %xmm5,%xmm3
jbe    1342 <gp_pt_mma+0x242>
movapd %xmm5,%xmm3
jmp    134c <gp_pt_mma+0x24c>
cs nopw 0x0(%rax,%rax,1)
nop
mov    $0x1,%ebx
movapd %xmm2,%xmm4
movapd %xmm2,%xmm3
jmp    130e <gp_pt_mma+0x20e>
nop
movapd %xmm6,%xmm3
addsd  %xmm5,%xmm2
addsd  %xmm6,%xmm2
lea    (%r14,%rbx,1),%rax
add    $0x2,%rax
add    $0x2,%rbx
cmp    $0x1,%rax
je     12b6 <gp_pt_mma+0x1b6>
movsd  (%rsi,%rbx,8),%xmm5
ucomisd %xmm5,%xmm3
jbe    1320 <gp_pt_mma+0x220>
movapd %xmm5,%xmm3
jmp    132a <gp_pt_mma+0x22a>
nop
ucomisd %xmm4,%xmm5
jbe    132a <gp_pt_mma+0x22a>
movapd %xmm5,%xmm4
movsd  0x8(%rsi,%rbx,8),%xmm6
ucomisd %xmm6,%xmm3
ja     12f0 <gp_pt_mma+0x1f0>
ucomisd %xmm4,%xmm6
jbe    12f4 <gp_pt_mma+0x1f4>
movapd %xmm6,%xmm4
jmp    12f4 <gp_pt_mma+0x1f4>
ucomisd %xmm4,%xmm5
ja     1278 <gp_pt_mma+0x178>
movapd %xmm4,%xmm5
jmp    1278 <gp_pt_mma+0x178>
test   %r8d,%r8d
je     151a <gp_pt_mma+0x41a>
movsd  (%rsi),%xmm1
cmp    $0x2,%r8d
jl     1468 <gp_pt_mma+0x368>
mov    %r8d,%eax
add    $0xffffffffffffffff,%rax
cmp    $0x2,%r8d
jne    1475 <gp_pt_mma+0x375>
mov    $0x1,%ecx
movapd %xmm1,%xmm3
movapd %xmm1,%xmm2
movapd %xmm3,%xmm4
test   $0x1,%al
je     14fc <gp_pt_mma+0x3fc>
movsd  (%rsi,%rcx,8),%xmm4
addsd  %xmm4,%xmm1
ucomisd %xmm4,%xmm2
jbe    14f2 <gp_pt_mma+0x3f2>
movapd %xmm4,%xmm2
jmp    14f8 <gp_pt_mma+0x3f8>
and    $0xfffffff8,%edx
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movsd  (%rsi,%rcx,8),%xmm0
movsd  %xmm0,(%rdi)
movsd  0x8(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x40(%rdi)
movsd  0x10(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x80(%rdi)
movsd  0x18(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0xc0(%rdi)
movsd  0x20(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x100(%rdi)
movsd  0x28(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x140(%rdi)
movsd  0x30(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x180(%rdi)
movsd  0x38(%rsi,%rcx,8),%xmm0
movsd  %xmm0,0x1c0(%rdi)
add    $0x8,%rcx
add    $0x200,%rdi
cmp    %rcx,%rdx
jne    13c0 <gp_pt_mma+0x2c0>
test   %rax,%rax
je     151a <gp_pt_mma+0x41a>
lea    (%rsi,%rcx,8),%rcx
shl    $0x3,%rax
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movsd  (%rcx,%rdx,1),%xmm0
movsd  %xmm0,(%rdi,%rdx,8)
add    $0x8,%rdx
cmp    %rdx,%rax
jne    1450 <gp_pt_mma+0x350>
jmp    151a <gp_pt_mma+0x41a>
movapd %xmm1,%xmm2
movapd %xmm1,%xmm4
jmp    14fc <gp_pt_mma+0x3fc>
mov    %rax,%rdx
and    $0xfffffffffffffffe,%rdx
neg    %rdx
mov    $0x1,%ecx
movapd %xmm1,%xmm3
movapd %xmm1,%xmm2
jmp    14b2 <gp_pt_mma+0x3b2>
xchg   %ax,%ax
movapd %xmm5,%xmm2
addsd  %xmm4,%xmm1
addsd  %xmm5,%xmm1
lea    (%rdx,%rcx,1),%rbx
add    $0x2,%rbx
add    $0x2,%rcx
cmp    $0x1,%rbx
je     138a <gp_pt_mma+0x28a>
movsd  (%rsi,%rcx,8),%xmm4
ucomisd %xmm4,%xmm2
jbe    14d0 <gp_pt_mma+0x3d0>
movapd %xmm4,%xmm2
jmp    14da <gp_pt_mma+0x3da>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
ucomisd %xmm3,%xmm4
jbe    14da <gp_pt_mma+0x3da>
movapd %xmm4,%xmm3
movsd  0x8(%rsi,%rcx,8),%xmm5
ucomisd %xmm5,%xmm2
ja     1490 <gp_pt_mma+0x390>
ucomisd %xmm3,%xmm5
jbe    1494 <gp_pt_mma+0x394>
movapd %xmm5,%xmm3
jmp    1494 <gp_pt_mma+0x394>
ucomisd %xmm3,%xmm4
ja     14fc <gp_pt_mma+0x3fc>
movapd %xmm3,%xmm4
xorps  %xmm3,%xmm3
cvtsi2sd %r8d,%xmm3
divsd  %xmm3,%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,(%rdi)
movsd  %xmm2,0x8(%rdi)
movsd  %xmm4,0x10(%rdi)
pop    %rbx
pop    %r14
ret

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

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