float nextN(float r, float x, int steps) {
  while (steps > 0) {
    steps--;
    x = r * x * (1 - x);
  }
  return x;
}


x86 assembly (clang, -O0):
<nextN>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jle    1149 <nextN+0x49>
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  0xeca(%rip),%xmm1
subss  -0x8(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1111 <nextN+0x11>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<nextN>:
test   %edi,%edi
jle    1194 <nextN+0x94>
lea    -0x1(%rdi),%eax
mov    %edi,%ecx
and    $0x3,%ecx
je     1138 <nextN+0x38>
xor    %edx,%edx
movss  0xee4(%rip),%xmm2
nopl   0x0(%rax)
movaps %xmm2,%xmm3
subss  %xmm1,%xmm3
mulss  %xmm0,%xmm1
mulss  %xmm3,%xmm1
add    $0x1,%edx
cmp    %edx,%ecx
jne    1120 <nextN+0x20>
sub    %edx,%edi
cmp    $0x3,%eax
jb     1194 <nextN+0x94>
add    $0xffffffff,%edi
movss  0xeb8(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movaps %xmm2,%xmm3
subss  %xmm1,%xmm3
mulss  %xmm0,%xmm1
mulss  %xmm3,%xmm1
movaps %xmm2,%xmm3
subss  %xmm1,%xmm3
mulss  %xmm0,%xmm1
mulss  %xmm3,%xmm1
movaps %xmm2,%xmm3
subss  %xmm1,%xmm3
mulss  %xmm0,%xmm1
mulss  %xmm3,%xmm1
movaps %xmm2,%xmm3
subss  %xmm1,%xmm3
mulss  %xmm0,%xmm1
mulss  %xmm3,%xmm1
add    $0xfffffffc,%edi
cmp    $0xfffffffe,%edi
jb     1150 <nextN+0x50>
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @nextN(float %0, float %1, i32 %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca i32
store float %0, float* %4
store float %1, float* %5
store i32 %2, i32* %6
br label %7
7: ; preds = %10, %3
%8 = load i32, i32* %6
%9 = icmp sgt i32 %8, 0
br i1 %9, label %10, label %19
10: ; preds = %7
%11 = load i32, i32* %6
%12 = add nsw i32 %11, -1
store i32 %12, i32* %6
%13 = load float, float* %4
%14 = load float, float* %5
%15 = fmul float %13, %14
%16 = load float, float* %5
%17 = fsub float 1.000000e+00, %16
%18 = fmul float %15, %17
store float %18, float* %5
br label %7
19: ; preds = %7
%20 = load float, float* %5
ret float %20
}

LLVM IR (-O2):
define float @nextN(float %0, float %1, i32 %2) {
%4 = icmp sgt i32 %2, 0
br i1 %4, label %5, label %42
5: ; preds = %3
%6 = add i32 %2, -1
%7 = and i32 %2, 3
%8 = icmp eq i32 %7, 0
br i1 %8, label %19, label %9
9: ; preds = %5, %9
%10 = phi i32 [ %13, %9 ], [ %2, %5 ]
%11 = phi float [ %16, %9 ], [ %1, %5 ]
%12 = phi i32 [ %17, %9 ], [ 0, %5 ]
%13 = add nsw i32 %10, -1
%14 = fmul float %11, %0
%15 = fsub float 1.000000e+00, %11
%16 = fmul float %14, %15
%17 = add i32 %12, 1
%18 = icmp eq i32 %17, %7
br i1 %18, label %19, label %9
19: ; preds = %9, %5
%20 = phi i32 [ %2, %5 ], [ %13, %9 ]
%21 = phi float [ %1, %5 ], [ %16, %9 ]
%22 = phi float [ undef, %5 ], [ %16, %9 ]
%23 = icmp ult i32 %6, 3
br i1 %23, label %42, label %24
24: ; preds = %19, %24
%25 = phi i32 [ %36, %24 ], [ %20, %19 ]
%26 = phi float [ %39, %24 ], [ %21, %19 ]
%27 = fmul float %26, %0
%28 = fsub float 1.000000e+00, %26
%29 = fmul float %27, %28
%30 = fmul float %29, %0
%31 = fsub float 1.000000e+00, %29
%32 = fmul float %30, %31
%33 = fmul float %32, %0
%34 = fsub float 1.000000e+00, %32
%35 = fmul float %33, %34
%36 = add nsw i32 %25, -4
%37 = fmul float %35, %0
%38 = fsub float 1.000000e+00, %35
%39 = fmul float %37, %38
%40 = add i32 %25, -5
%41 = icmp ult i32 %40, -2
br i1 %41, label %24, label %42
42: ; preds = %19, %24, %3
%43 = phi float [ %1, %3 ], [ %22, %19 ], [ %39, %24 ]
ret float %43
}