void lremv(xx, nnn) double *xx;
int nnn;
{
  int i;
  double fln;
  double dc;
  double slope;
  dc = slope = 0.0;
  for (i = 0; i < nnn; i++) {
    dc += xx[i];
    slope += xx[i] * (i + 1);
  }
  dc /= (double)nnn;
  slope *= 12.0 / (nnn * (nnn * (double)nnn - 1.0));
  slope -= 6.0 * dc / (nnn - 1.0);
  fln = dc - 0.5 * (nnn + 1.0) * slope;
  for (i = 0; i < nnn; i++)
    xx[i] -= (i + 1) * slope + fln;
}


x86 assembly (clang, -O0):
<lremv>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    117c <lremv+0x7c>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm2
movsd  -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1122 <lremv+0x22>
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
cvtsi2sdl -0xc(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xe76(%rip),%xmm2
addsd  %xmm2,%xmm0
mulsd  %xmm0,%xmm1
movsd  0xe5e(%rip),%xmm0
divsd  %xmm1,%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xe40(%rip),%xmm1
mulsd  -0x20(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm0
movsd  0xe26(%rip),%xmm2
subsd  %xmm2,%xmm0
divsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x20(%rbp),%xmm1
cvtsi2sdl -0xc(%rbp),%xmm2
movsd  0xdfe(%rip),%xmm0
addsd  %xmm0,%xmm2
movsd  0xdea(%rip),%xmm0
mulsd  %xmm2,%xmm0
movsd  -0x28(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1296 <lremv+0x196>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm1
movsd  -0x28(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    124a <lremv+0x14a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<lremv>:
mov    %esi,%r8d
test   %esi,%esi
jle    1127 <lremv+0x27>
lea    -0x1(%r8),%rax
mov    %r8d,%r9d
and    $0x3,%r9d
cmp    $0x3,%rax
jae    1134 <lremv+0x34>
xorpd  %xmm2,%xmm2
xor    %edx,%edx
xorpd  %xmm0,%xmm0
jmp    11c5 <lremv+0xc5>
xorpd  %xmm0,%xmm0
xorpd  %xmm2,%xmm2
jmp    1205 <lremv+0x105>
mov    %r8d,%eax
and    $0xfffffffc,%eax
xorpd  %xmm2,%xmm2
xor    %edx,%edx
xorpd  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rdi,%rdx,8),%xmm1
movsd  0x8(%rdi,%rdx,8),%xmm3
lea    0x1(%rdx),%ecx
xorps  %xmm4,%xmm4
cvtsi2sd %ecx,%xmm4
addsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm4
addsd  %xmm2,%xmm4
addsd  %xmm3,%xmm0
lea    0x2(%rdx),%ecx
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
mulsd  %xmm3,%xmm1
addsd  %xmm4,%xmm1
movsd  0x10(%rdi,%rdx,8),%xmm2
addsd  %xmm2,%xmm0
lea    0x3(%rdx),%ecx
xorps  %xmm3,%xmm3
cvtsi2sd %ecx,%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
movsd  0x18(%rdi,%rdx,8),%xmm1
add    $0x4,%rdx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
addsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm2
addsd  %xmm3,%xmm2
cmp    %rdx,%rax
jne    1150 <lremv+0x50>
test   %r9,%r9
je     1205 <lremv+0x105>
lea    0x1(%rdx),%r10d
lea    (%rdi,%rdx,8),%rdx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rdx,%rcx,8),%xmm1
addsd  %xmm1,%xmm0
lea    (%r10,%rcx,1),%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm3,%xmm2
add    $0x1,%rcx
cmp    %rcx,%r9
jne    11e0 <lremv+0xe0>
test   %esi,%esi
jle    1349 <lremv+0x249>
xorps  %xmm1,%xmm1
cvtsi2sd %esi,%xmm1
divsd  %xmm1,%xmm0
movapd %xmm1,%xmm3
mulsd  %xmm1,%xmm3
movsd  0xdd8(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm1,%xmm3
movsd  0xdd0(%rip),%xmm5
divsd  %xmm3,%xmm5
mulsd  %xmm2,%xmm5
movsd  0xdc8(%rip),%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm1,%xmm4
divsd  %xmm4,%xmm2
addsd  0xdbc(%rip),%xmm1
mulsd  0xdbc(%rip),%xmm1
addsd  %xmm5,%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
cmp    $0x4,%esi
jae    127c <lremv+0x17c>
xor    %ecx,%ecx
jmp    1320 <lremv+0x220>
mov    %r8d,%ecx
and    $0xfffffffc,%ecx
movapd %xmm2,%xmm0
unpcklpd %xmm2,%xmm0
movapd %xmm1,%xmm3
unpcklpd %xmm1,%xmm3
lea    0x0(,%r8,8),%rax
and    $0xffffffffffffffe0,%rax
movdqa 0xd8a(%rip),%xmm4
xor    %edx,%edx
pcmpeqd %xmm8,%xmm8
movdqa 0xd8a(%rip),%xmm9
movdqa 0xd91(%rip),%xmm10
nop
pshufd $0xe8,%xmm4,%xmm6
movdqa %xmm6,%xmm5
psubd  %xmm8,%xmm5
cvtdq2pd %xmm5,%xmm5
paddd  %xmm9,%xmm6
cvtdq2pd %xmm6,%xmm6
mulpd  %xmm0,%xmm5
addpd  %xmm3,%xmm5
mulpd  %xmm0,%xmm6
addpd  %xmm3,%xmm6
movupd (%rdi,%rdx,1),%xmm7
subpd  %xmm5,%xmm7
movupd 0x10(%rdi,%rdx,1),%xmm5
subpd  %xmm6,%xmm5
movupd %xmm7,(%rdi,%rdx,1)
movupd %xmm5,0x10(%rdi,%rdx,1)
paddq  %xmm10,%xmm4
add    $0x20,%rdx
cmp    %rdx,%rax
jne    12c0 <lremv+0x1c0>
cmp    %r8,%rcx
je     1349 <lremv+0x249>
nopl   0x0(%rax)
lea    0x1(%rcx),%rax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  (%rdi,%rcx,8),%xmm3
subsd  %xmm0,%xmm3
movsd  %xmm3,(%rdi,%rcx,8)
mov    %rax,%rcx
cmp    %rax,%r8
jne    1320 <lremv+0x220>
ret

LLVM IR (-O0):
define void @lremv(double* %0, i32 %1) {
%3 = alloca double*
%4 = alloca i32
%5 = alloca i32
%6 = alloca double
%7 = alloca double
%8 = alloca double
store double* %0, double** %3
store i32 %1, i32* %4
store double 0.000000e+00, double* %8
store double 0.000000e+00, double* %7
store i32 0, i32* %5
br label %9
9: ; preds = %31, %2
%10 = load i32, i32* %5
%11 = load i32, i32* %4
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %34
13: ; preds = %9
%14 = load double*, double** %3
%15 = load i32, i32* %5
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds double, double* %14, i64 %16
%18 = load double, double* %17
%19 = load double, double* %7
%20 = fadd double %19, %18
store double %20, double* %7
%21 = load double*, double** %3
%22 = load i32, i32* %5
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds double, double* %21, i64 %23
%25 = load double, double* %24
%26 = load i32, i32* %5
%27 = add nsw i32 %26, 1
%28 = sitofp i32 %27 to double
%29 = load double, double* %8
%30 = call double @llvm.fmuladd.f64(double %25, double %28, double %29)
store double %30, double* %8
br label %31
31: ; preds = %13
%32 = load i32, i32* %5
%33 = add nsw i32 %32, 1
store i32 %33, i32* %5
br label %9
34: ; preds = %9
%35 = load i32, i32* %4
%36 = sitofp i32 %35 to double
%37 = load double, double* %7
%38 = fdiv double %37, %36
store double %38, double* %7
%39 = load i32, i32* %4
%40 = sitofp i32 %39 to double
%41 = load i32, i32* %4
%42 = sitofp i32 %41 to double
%43 = load i32, i32* %4
%44 = sitofp i32 %43 to double
%45 = call double @llvm.fmuladd.f64(double %42, double %44, double -1.000000e+00)
%46 = fmul double %40, %45
%47 = fdiv double 1.200000e+01, %46
%48 = load double, double* %8
%49 = fmul double %48, %47
store double %49, double* %8
%50 = load double, double* %7
%51 = fmul double 6.000000e+00, %50
%52 = load i32, i32* %4
%53 = sitofp i32 %52 to double
%54 = fsub double %53, 1.000000e+00
%55 = fdiv double %51, %54
%56 = load double, double* %8
%57 = fsub double %56, %55
store double %57, double* %8
%58 = load double, double* %7
%59 = load i32, i32* %4
%60 = sitofp i32 %59 to double
%61 = fadd double %60, 1.000000e+00
%62 = fmul double 5.000000e-01, %61
%63 = load double, double* %8
%64 = fneg double %62
%65 = call double @llvm.fmuladd.f64(double %64, double %63, double %58)
store double %65, double* %6
store i32 0, i32* %5
br label %66
66: ; preds = %83, %34
%67 = load i32, i32* %5
%68 = load i32, i32* %4
%69 = icmp slt i32 %67, %68
br i1 %69, label %70, label %86
70: ; preds = %66
%71 = load i32, i32* %5
%72 = add nsw i32 %71, 1
%73 = sitofp i32 %72 to double
%74 = load double, double* %8
%75 = load double, double* %6
%76 = call double @llvm.fmuladd.f64(double %73, double %74, double %75)
%77 = load double*, double** %3
%78 = load i32, i32* %5
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds double, double* %77, i64 %79
%81 = load double, double* %80
%82 = fsub double %81, %76
store double %82, double* %80
br label %83
83: ; preds = %70
%84 = load i32, i32* %5
%85 = add nsw i32 %84, 1
store i32 %85, i32* %5
br label %66
86: ; preds = %66
ret void
}

LLVM IR (-O2):
define void @lremv(double* nocapture %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
br i1 %3, label %4, label %67
4: ; preds = %2
%5 = zext i32 %1 to i64
%6 = add nsw i64 %5, -1
%7 = and i64 %5, 3
%8 = icmp ult i64 %6, 3
br i1 %8, label %46, label %9
9: ; preds = %4
%10 = and i64 %5, 4294967292
br label %11
11: ; preds = %11, %9
%12 = phi i64 [ 0, %9 ], [ %40, %11 ]
%13 = phi double [ 0.000000e+00, %9 ], [ %43, %11 ]
%14 = phi double [ 0.000000e+00, %9 ], [ %39, %11 ]
%15 = phi i64 [ 0, %9 ], [ %44, %11 ]
%16 = getelementptr inbounds double, double* %0, i64 %12
%17 = load double, double* %16
%18 = fadd double %14, %17
%19 = or i64 %12, 1
%20 = trunc i64 %19 to i32
%21 = sitofp i32 %20 to double
%22 = tail call double @llvm.fmuladd.f64(double %17, double %21, double %13)
%23 = getelementptr inbounds double, double* %0, i64 %19
%24 = load double, double* %23
%25 = fadd double %18, %24
%26 = or i64 %12, 2
%27 = trunc i64 %26 to i32
%28 = sitofp i32 %27 to double
%29 = tail call double @llvm.fmuladd.f64(double %24, double %28, double %22)
%30 = getelementptr inbounds double, double* %0, i64 %26
%31 = load double, double* %30
%32 = fadd double %25, %31
%33 = or i64 %12, 3
%34 = trunc i64 %33 to i32
%35 = sitofp i32 %34 to double
%36 = tail call double @llvm.fmuladd.f64(double %31, double %35, double %29)
%37 = getelementptr inbounds double, double* %0, i64 %33
%38 = load double, double* %37
%39 = fadd double %32, %38
%40 = add nuw nsw i64 %12, 4
%41 = trunc i64 %40 to i32
%42 = sitofp i32 %41 to double
%43 = tail call double @llvm.fmuladd.f64(double %38, double %42, double %36)
%44 = add i64 %15, 4
%45 = icmp eq i64 %44, %10
br i1 %45, label %46, label %11
46: ; preds = %11, %4
%47 = phi double [ undef, %4 ], [ %39, %11 ]
%48 = phi double [ undef, %4 ], [ %43, %11 ]
%49 = phi i64 [ 0, %4 ], [ %40, %11 ]
%50 = phi double [ 0.000000e+00, %4 ], [ %43, %11 ]
%51 = phi double [ 0.000000e+00, %4 ], [ %39, %11 ]
%52 = icmp eq i64 %7, 0
br i1 %52, label %67, label %53
53: ; preds = %46, %53
%54 = phi i64 [ %61, %53 ], [ %49, %46 ]
%55 = phi double [ %64, %53 ], [ %50, %46 ]
%56 = phi double [ %60, %53 ], [ %51, %46 ]
%57 = phi i64 [ %65, %53 ], [ 0, %46 ]
%58 = getelementptr inbounds double, double* %0, i64 %54
%59 = load double, double* %58
%60 = fadd double %56, %59
%61 = add nuw nsw i64 %54, 1
%62 = trunc i64 %61 to i32
%63 = sitofp i32 %62 to double
%64 = tail call double @llvm.fmuladd.f64(double %59, double %63, double %55)
%65 = add i64 %57, 1
%66 = icmp eq i64 %65, %7
br i1 %66, label %67, label %53
67: ; preds = %46, %53, %2
%68 = phi double [ 0.000000e+00, %2 ], [ %47, %46 ], [ %60, %53 ]
%69 = phi double [ 0.000000e+00, %2 ], [ %48, %46 ], [ %64, %53 ]
%70 = sitofp i32 %1 to double
%71 = fdiv double %68, %70
%72 = tail call double @llvm.fmuladd.f64(double %70, double %70, double -1.000000e+00)
%73 = fmul double %72, %70
%74 = fdiv double 1.200000e+01, %73
%75 = fmul double %74, %69
%76 = fmul double %71, 6.000000e+00
%77 = fadd double %70, -1.000000e+00
%78 = fdiv double %76, %77
%79 = fsub double %75, %78
%80 = fadd double %70, 1.000000e+00
%81 = fmul double %80, -5.000000e-01
%82 = tail call double @llvm.fmuladd.f64(double %81, double %79, double %71)
br i1 %3, label %83, label %134
83: ; preds = %67
%84 = zext i32 %1 to i64
%85 = icmp ult i32 %1, 4
br i1 %85, label %122, label %86
86: ; preds = %83
%87 = and i64 %84, 4294967292
%88 = insertelement <2 x double> poison, double %79, i64 0
%89 = shufflevector <2 x double> %88, <2 x double> poison, <2 x i32> zeroinitializer
%90 = insertelement <2 x double> poison, double %82, i64 0
%91 = shufflevector <2 x double> %90, <2 x double> poison, <2 x i32> zeroinitializer
%92 = insertelement <2 x double> poison, double %79, i64 0
%93 = shufflevector <2 x double> %92, <2 x double> poison, <2 x i32> zeroinitializer
%94 = insertelement <2 x double> poison, double %82, i64 0
%95 = shufflevector <2 x double> %94, <2 x double> poison, <2 x i32> zeroinitializer
br label %96
96: ; preds = %96, %86
%97 = phi i64 [ 0, %86 ], [ %117, %96 ]
%98 = phi <2 x i64> [ <i64 0, i64 1>, %86 ], [ %118, %96 ]
%99 = trunc <2 x i64> %98 to <2 x i32>
%100 = add <2 x i32> %99, <i32 1, i32 1>
%101 = trunc <2 x i64> %98 to <2 x i32>
%102 = add <2 x i32> %101, <i32 3, i32 3>
%103 = sitofp <2 x i32> %100 to <2 x double>
%104 = sitofp <2 x i32> %102 to <2 x double>
%105 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %103, <2 x double> %89, <2 x double> %91)
%106 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %104, <2 x double> %93, <2 x double> %95)
%107 = getelementptr inbounds double, double* %0, i64 %97
%108 = bitcast double* %107 to <2 x double>*
%109 = load <2 x double>, <2 x double>* %108
%110 = getelementptr inbounds double, double* %107, i64 2
%111 = bitcast double* %110 to <2 x double>*
%112 = load <2 x double>, <2 x double>* %111
%113 = fsub <2 x double> %109, %105
%114 = fsub <2 x double> %112, %106
%115 = bitcast double* %107 to <2 x double>*
store <2 x double> %113, <2 x double>* %115
%116 = bitcast double* %110 to <2 x double>*
store <2 x double> %114, <2 x double>* %116
%117 = add nuw i64 %97, 4
%118 = add <2 x i64> %98, <i64 4, i64 4>
%119 = icmp eq i64 %117, %87
br i1 %119, label %120, label %96
120: ; preds = %96
%121 = icmp eq i64 %87, %84
br i1 %121, label %134, label %122
122: ; preds = %83, %120
%123 = phi i64 [ 0, %83 ], [ %87, %120 ]
br label %124
124: ; preds = %122, %124
%125 = phi i64 [ %126, %124 ], [ %123, %122 ]
%126 = add nuw nsw i64 %125, 1
%127 = trunc i64 %126 to i32
%128 = sitofp i32 %127 to double
%129 = tail call double @llvm.fmuladd.f64(double %128, double %79, double %82)
%130 = getelementptr inbounds double, double* %0, i64 %125
%131 = load double, double* %130
%132 = fsub double %131, %129
store double %132, double* %130
%133 = icmp eq i64 %126, %84
br i1 %133, label %134, label %124
134: ; preds = %124, %120, %67
ret void
}