void keys(float *c, float t, float a) {
  float t2 = t * t;
  float at = a * t;
  c[0] = a * t2 * (1 - t);
  c[1] = (2 * a + 3 - (a + 2) * t) * t2 - at;
  c[2] = ((a + 2) * t - a - 3) * t2 + 1;
  c[3] = a * (t - 2) * t2 + at;
}


x86 assembly (clang, -O0):
<keys>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  %xmm1,-0x10(%rbp)
movss  -0xc(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x10(%rbp),%xmm0
mulss  -0x14(%rbp),%xmm0
movss  0xec2(%rip),%xmm1
subss  -0xc(%rbp),%xmm1
mulss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x10(%rbp),%xmm1
addss  %xmm1,%xmm1
movss  0xea4(%rip),%xmm0
addss  %xmm0,%xmm1
movss  0xe90(%rip),%xmm0
addss  -0x10(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x14(%rbp),%xmm2
movss  -0x18(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  0xe41(%rip),%xmm0
addss  -0x10(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x10(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xe1d(%rip),%xmm1
subss  %xmm1,%xmm0
movss  -0x14(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  0xe04(%rip),%xmm1
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x10(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
movss  0xde1(%rip),%xmm2
subss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
movss  -0x14(%rbp),%xmm2
movss  -0x18(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<keys>:
movaps %xmm0,%xmm3
mulss  %xmm0,%xmm3
movaps %xmm0,%xmm2
mulss  %xmm1,%xmm2
movaps %xmm1,%xmm4
addss  %xmm1,%xmm4
addss  0xee7(%rip),%xmm4
movss  0xedb(%rip),%xmm5
movss  0xedb(%rip),%xmm6
addss  %xmm1,%xmm6
mulss  %xmm0,%xmm6
subss  %xmm6,%xmm4
subss  %xmm1,%xmm6
addss  0xec7(%rip),%xmm6
mulss  %xmm3,%xmm6
addss  %xmm5,%xmm6
subss  %xmm0,%xmm5
mulss  %xmm3,%xmm4
addss  0xeb3(%rip),%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm3,%xmm0
mulss  %xmm1,%xmm3
mulss  %xmm3,%xmm5
movss  %xmm5,(%rdi)
subss  %xmm2,%xmm4
movss  %xmm4,0x4(%rdi)
movss  %xmm6,0x8(%rdi)
addss  %xmm2,%xmm0
movss  %xmm0,0xc(%rdi)
ret

LLVM IR (-O0):
define void @keys(float* %0, float %1, float %2) {
%4 = alloca float*
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
store float* %0, float** %4
store float %1, float* %5
store float %2, float* %6
%9 = load float, float* %5
%10 = load float, float* %5
%11 = fmul float %9, %10
store float %11, float* %7
%12 = load float, float* %6
%13 = load float, float* %5
%14 = fmul float %12, %13
store float %14, float* %8
%15 = load float, float* %6
%16 = load float, float* %7
%17 = fmul float %15, %16
%18 = load float, float* %5
%19 = fsub float 1.000000e+00, %18
%20 = fmul float %17, %19
%21 = load float*, float** %4
%22 = getelementptr inbounds float, float* %21, i64 0
store float %20, float* %22
%23 = load float, float* %6
%24 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %23, float 3.000000e+00)
%25 = load float, float* %6
%26 = fadd float %25, 2.000000e+00
%27 = load float, float* %5
%28 = fneg float %26
%29 = call float @llvm.fmuladd.f32(float %28, float %27, float %24)
%30 = load float, float* %7
%31 = load float, float* %8
%32 = fneg float %31
%33 = call float @llvm.fmuladd.f32(float %29, float %30, float %32)
%34 = load float*, float** %4
%35 = getelementptr inbounds float, float* %34, i64 1
store float %33, float* %35
%36 = load float, float* %6
%37 = fadd float %36, 2.000000e+00
%38 = load float, float* %5
%39 = load float, float* %6
%40 = fneg float %39
%41 = call float @llvm.fmuladd.f32(float %37, float %38, float %40)
%42 = fsub float %41, 3.000000e+00
%43 = load float, float* %7
%44 = call float @llvm.fmuladd.f32(float %42, float %43, float 1.000000e+00)
%45 = load float*, float** %4
%46 = getelementptr inbounds float, float* %45, i64 2
store float %44, float* %46
%47 = load float, float* %6
%48 = load float, float* %5
%49 = fsub float %48, 2.000000e+00
%50 = fmul float %47, %49
%51 = load float, float* %7
%52 = load float, float* %8
%53 = call float @llvm.fmuladd.f32(float %50, float %51, float %52)
%54 = load float*, float** %4
%55 = getelementptr inbounds float, float* %54, i64 3
store float %53, float* %55
ret void
}

LLVM IR (-O2):
define void @keys(float* nocapture writeonly %0, float %1, float %2) {
%4 = fmul float %1, %1
%5 = fmul float %1, %2
%6 = fmul float %4, %2
%7 = fsub float 1.000000e+00, %1
%8 = fmul float %7, %6
store float %8, float* %0
%9 = tail call float @llvm.fmuladd.f32(float %2, float 2.000000e+00, float 3.000000e+00)
%10 = fadd float %2, 2.000000e+00
%11 = fneg float %10
%12 = tail call float @llvm.fmuladd.f32(float %11, float %1, float %9)
%13 = fneg float %5
%14 = tail call float @llvm.fmuladd.f32(float %12, float %4, float %13)
%15 = getelementptr inbounds float, float* %0, i64 1
store float %14, float* %15
%16 = fneg float %2
%17 = tail call float @llvm.fmuladd.f32(float %10, float %1, float %16)
%18 = fadd float %17, -3.000000e+00
%19 = tail call float @llvm.fmuladd.f32(float %18, float %4, float 1.000000e+00)
%20 = getelementptr inbounds float, float* %0, i64 2
store float %19, float* %20
%21 = fadd float %1, -2.000000e+00
%22 = fmul float %21, %2
%23 = tail call float @llvm.fmuladd.f32(float %22, float %4, float %5)
%24 = getelementptr inbounds float, float* %0, i64 3
store float %23, float* %24
ret void
}