double rdfabsorb(double *r, double *rdf, int n) {
  int j;
  double sum, r0, r1, f0, f1;
  r0 = r1 = 0;
  f1 = rdf[0];
  sum = 0;
  for (j = (r[0] == 0 ? 1 : 0); r1 < 1 && j < n; j++) {
    r0 = r1;
    f0 = f1;
    r1 = r[j];
    f1 = rdf[j];
    sum +=
        3.14159265358979323846 * (f1 - f0) * (r1 + r0) * (r1 * r1 + r0 * r0) +
        4.0 * 3.14159265358979323846 / 3.0 * (r1 * f0 - r0 * f1) *
            (r1 * r1 + r1 * r0 + r0 * r0);
  }
  f0 = 0;
  sum -= 3.14159265358979323846 * (f1 - f0) * (r1 + r0) * (r1 * r1 + r0 * r0) +
         4.0 * 3.14159265358979323846 / 3.0 * (r1 * f0 - r0 * f1) *
             (r1 * r1 + r1 * r0 + r0 * r0);
  for (j -= 2; j >= 0; j--)
    rdf[j] = 0;
  return sum;
}


x86 assembly (clang, -O0):
<rdfabsorb>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
xorps  %xmm1,%xmm1
xor    %eax,%eax
mov    $0x1,%ecx
ucomisd %xmm1,%xmm0
setnp  %sil
sete   %dl
test   %sil,%dl
cmovne %ecx,%eax
mov    %eax,-0x18(%rbp)
xor    %eax,%eax
movsd  0xe9c(%rip),%xmm0
ucomisd -0x30(%rbp),%xmm0
mov    %al,-0x41(%rbp)
jbe    117e <rdfabsorb+0x7e>
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
setl   %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    118e <rdfabsorb+0x8e>
jmp    1297 <rdfabsorb+0x197>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm1
subsd  -0x38(%rbp),%xmm1
movsd  0xe38(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm1
addsd  -0x28(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
mulsd  %xmm3,%xmm2
addsd  %xmm1,%xmm2
movsd  -0x30(%rbp),%xmm3
movsd  -0x38(%rbp),%xmm4
movsd  -0x28(%rbp),%xmm1
mulsd  -0x40(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
movsd  0xdc7(%rip),%xmm1
mulsd  %xmm3,%xmm1
movsd  -0x30(%rbp),%xmm4
movsd  -0x30(%rbp),%xmm5
movsd  -0x30(%rbp),%xmm3
mulsd  -0x28(%rbp),%xmm3
mulsd  %xmm5,%xmm4
addsd  %xmm3,%xmm4
movsd  -0x28(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm5
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    115a <rdfabsorb+0x5a>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x40(%rbp),%xmm0
subsd  -0x38(%rbp),%xmm0
movsd  0xd5f(%rip),%xmm1
mulsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
addsd  -0x28(%rbp),%xmm0
mulsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm2
movsd  -0x30(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm0
mulsd  -0x28(%rbp),%xmm0
mulsd  %xmm3,%xmm2
addsd  %xmm0,%xmm2
movsd  -0x30(%rbp),%xmm3
movsd  -0x38(%rbp),%xmm4
movsd  -0x28(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm4,%xmm3
addsd  %xmm0,%xmm3
movsd  0xcee(%rip),%xmm0
mulsd  %xmm3,%xmm0
movsd  -0x30(%rbp),%xmm4
movsd  -0x30(%rbp),%xmm5
movsd  -0x30(%rbp),%xmm3
mulsd  -0x28(%rbp),%xmm3
mulsd  %xmm5,%xmm4
addsd  %xmm3,%xmm4
movsd  -0x28(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm5
mulsd  %xmm5,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x18(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jl     1397 <rdfabsorb+0x297>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    136f <rdfabsorb+0x26f>
movsd  -0x20(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rdfabsorb>:
sub    $0x28,%rsp
movsd  (%rsi),%xmm12
movsd  (%rdi),%xmm2
xorpd  %xmm8,%xmm8
xorpd  %xmm1,%xmm1
cmpeqsd %xmm2,%xmm1
movq   %xmm1,%rax
and    $0x1,%eax
xorpd  %xmm1,%xmm1
cmp    %edx,%eax
jge    125e <rdfabsorb+0x14e>
cmpeqsd %xmm1,%xmm2
movq   %xmm2,%rax
and    $0x1,%eax
movslq %edx,%rcx
lea    -0x8(,%rax,8),%rdx
ff
movsd  0xea0(%rip),%xmm9
movsd  0xe9f(%rip),%xmm10
movsd  0xe9e(%rip),%xmm11
xorpd  %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
movapd %xmm0,%xmm2
movapd %xmm1,%xmm3
movapd %xmm12,%xmm4
movsd  0x8(%rdi,%rdx,1),%xmm1
movsd  0x8(%rsi,%rdx,1),%xmm12
movapd %xmm12,%xmm5
subsd  %xmm4,%xmm5
mulsd  %xmm9,%xmm5
movapd %xmm3,%xmm6
addsd  %xmm1,%xmm6
mulsd  %xmm5,%xmm6
movapd %xmm3,%xmm5
mulsd  %xmm3,%xmm5
movapd %xmm1,%xmm7
mulsd  %xmm1,%xmm7
movapd %xmm3,%xmm0
mulsd  %xmm1,%xmm0
addsd  %xmm7,%xmm0
addsd  %xmm5,%xmm7
mulsd  %xmm6,%xmm7
movapd %xmm12,%xmm6
mulsd  %xmm3,%xmm6
mulsd  %xmm1,%xmm4
subsd  %xmm6,%xmm4
mulsd  %xmm10,%xmm4
addsd  %xmm5,%xmm0
mulsd  %xmm4,%xmm0
addsd  %xmm7,%xmm0
addsd  %xmm2,%xmm0
add    $0x1,%rax
add    $0x8,%rdx
ucomisd %xmm1,%xmm11
jbe    1216 <rdfabsorb+0x106>
cmp    %rcx,%rax
jl     1180 <rdfabsorb+0x70>
cmp    $0x2,%eax
jl     1266 <rdfabsorb+0x156>
mov    %rsi,%rdi
xor    %esi,%esi
movsd  %xmm12,0x20(%rsp)
movsd  %xmm1,0x18(%rsp)
movsd  %xmm3,0x10(%rsp)
movsd  %xmm0,0x8(%rsp)
call   1030 <memset@plt>
movsd  0x8(%rsp),%xmm0
movsd  0x10(%rsp),%xmm3
movsd  0x18(%rsp),%xmm1
movsd  0x20(%rsp),%xmm12
xorpd  %xmm8,%xmm8
jmp    1266 <rdfabsorb+0x156>
xorpd  %xmm3,%xmm3
xorpd  %xmm0,%xmm0
movsd  0xd92(%rip),%xmm2
mulsd  %xmm12,%xmm2
movapd %xmm3,%xmm4
addsd  %xmm1,%xmm4
mulsd  %xmm2,%xmm4
movapd %xmm3,%xmm5
mulsd  %xmm3,%xmm5
movapd %xmm1,%xmm2
mulsd  %xmm1,%xmm2
mulsd  %xmm3,%xmm12
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
addsd  %xmm5,%xmm2
mulsd  %xmm4,%xmm2
mulsd  %xmm1,%xmm8
subsd  %xmm12,%xmm8
mulsd  0xd51(%rip),%xmm8
addsd  %xmm5,%xmm3
mulsd  %xmm8,%xmm3
addsd  %xmm2,%xmm3
subsd  %xmm3,%xmm0
add    $0x28,%rsp
ret

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

LLVM IR (-O2):
define double @rdfabsorb(double* nocapture %0, double* nocapture %1, i32 %2) {
%4 = bitcast double* %1 to i8*
%5 = load double, double* %1
%6 = load double, double* %0
%7 = fcmp oeq double %6, 0.000000e+00
%8 = zext i1 %7 to i32
%9 = icmp slt i32 %8, %2
br i1 %9, label %10, label %48
10: ; preds = %3
%11 = zext i1 %7 to i64
%12 = sext i32 %2 to i64
br label %13
13: ; preds = %10, %13
%14 = phi i64 [ %11, %10 ], [ %38, %13 ]
%15 = phi double [ %5, %10 ], [ %21, %13 ]
%16 = phi double [ 0.000000e+00, %10 ], [ %19, %13 ]
%17 = phi double [ 0.000000e+00, %10 ], [ %37, %13 ]
%18 = getelementptr inbounds double, double* %0, i64 %14
%19 = load double, double* %18
%20 = getelementptr inbounds double, double* %1, i64 %14
%21 = load double, double* %20
%22 = fsub double %21, %15
%23 = fmul double %22, 0x400921FB54442D18
%24 = fadd double %16, %19
%25 = fmul double %24, %23
%26 = fmul double %16, %16
%27 = tail call double @llvm.fmuladd.f64(double %19, double %19, double %26)
%28 = fneg double %16
%29 = fmul double %21, %28
%30 = tail call double @llvm.fmuladd.f64(double %19, double %15, double %29)
%31 = fmul double %30, 0x4010C152382D7365
%32 = fmul double %16, %19
%33 = tail call double @llvm.fmuladd.f64(double %19, double %19, double %32)
%34 = tail call double @llvm.fmuladd.f64(double %16, double %16, double %33)
%35 = fmul double %34, %31
%36 = tail call double @llvm.fmuladd.f64(double %25, double %27, double %35)
%37 = fadd double %17, %36
%38 = add nuw nsw i64 %14, 1
%39 = fcmp olt double %19, 1.000000e+00
%40 = icmp slt i64 %38, %12
%41 = select i1 %39, i1 %40, i1 false
br i1 %41, label %13, label %42
42: ; preds = %13
%43 = trunc i64 %38 to i32
%44 = icmp sgt i32 %43, 1
br i1 %44, label %45, label %48
45: ; preds = %42
%46 = shl i64 %14, 3
%47 = and i64 %46, 34359738360
br label %48
48: ; preds = %3, %45, %42
%49 = phi double [ %21, %45 ], [ %21, %42 ], [ %5, %3 ]
%50 = phi double [ %19, %45 ], [ %19, %42 ], [ 0.000000e+00, %3 ]
%51 = phi double [ %16, %45 ], [ %16, %42 ], [ 0.000000e+00, %3 ]
%52 = phi double [ %37, %45 ], [ %37, %42 ], [ 0.000000e+00, %3 ]
%53 = fmul double %49, 0x400921FB54442D18
%54 = fadd double %51, %50
%55 = fmul double %54, %53
%56 = fmul double %51, %51
%57 = tail call double @llvm.fmuladd.f64(double %50, double %50, double %56)
%58 = fneg double %51
%59 = fmul double %49, %58
%60 = tail call double @llvm.fmuladd.f64(double %50, double 0.000000e+00, double %59)
%61 = fmul double %60, 0x4010C152382D7365
%62 = fmul double %51, %50
%63 = tail call double @llvm.fmuladd.f64(double %50, double %50, double %62)
%64 = tail call double @llvm.fmuladd.f64(double %51, double %51, double %63)
%65 = fmul double %64, %61
%66 = tail call double @llvm.fmuladd.f64(double %55, double %57, double %65)
%67 = fsub double %52, %66
ret double %67
}