void HSL2RGB(float h, float s, float l, float *outR, float *outG, float *outB) {
  float temp1, temp2;
  float temp[3];
  int i;
  if (s == 0.0) {
    if (outR)
      *outR = l;
    if (outG)
      *outG = l;
    if (outB)
      *outB = l;
    return;
  }
  if (l < 0.5)
    temp2 = l * (1.0 + s);
  else
    temp2 = l + s - l * s;
  temp1 = 2.0 * l - temp2;
  temp[0] = h + 1.0 / 3.0;
  temp[1] = h;
  temp[2] = h - 1.0 / 3.0;
  for (i = 0; i < 3; ++i) {
    if (temp[i] < 0.0)
      temp[i] += 1.0;
    if (temp[i] > 1.0)
      temp[i] -= 1.0;
    if (6.0 * temp[i] < 1.0)
      temp[i] = temp1 + (temp2 - temp1) * 6.0 * temp[i];
    else {
      if (2.0 * temp[i] < 1.0)
        temp[i] = temp2;
      else {
        if (3.0 * temp[i] < 2.0)
          temp[i] = temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp[i]) * 6.0;
        else
          temp[i] = temp1;
      }
    }
  }
  if (outR)
    *outR = temp[0];
  if (outG)
    *outG = temp[1];
  if (outB)
    *outB = temp[2];
}


x86 assembly (clang, -O0):
<HSL2RGB>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1188 <HSL2RGB+0x88>
jp     1188 <HSL2RGB+0x88>
cmpq   $0x0,-0x18(%rbp)
je     1153 <HSL2RGB+0x53>
movss  -0xc(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
cmpq   $0x0,-0x20(%rbp)
je     116b <HSL2RGB+0x6b>
movss  -0xc(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
cmpq   $0x0,-0x28(%rbp)
je     1183 <HSL2RGB+0x83>
movss  -0xc(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
jmp    14c5 <HSL2RGB+0x3c5>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe67(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11d3 <HSL2RGB+0xd3>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe4b(%rip),%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x30(%rbp)
jmp    1201 <HSL2RGB+0x101>
movss  -0xc(%rbp),%xmm1
addss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x30(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdc4(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd9c(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movl   $0x0,-0x40(%rbp)
cmpl   $0x3,-0x40(%rbp)
jge    147d <HSL2RGB+0x37d>
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    12d1 <HSL2RGB+0x1d1>
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd45(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp,%rax,4)
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd21(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1315 <HSL2RGB+0x215>
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd01(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp,%rax,4)
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xced(%rip),%xmm1
mulsd  %xmm0,%xmm1
movsd  0xcd1(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    138d <HSL2RGB+0x28d>
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x30(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xcb8(%rip),%xmm2
mulsd  %xmm2,%xmm0
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm2
cvtss2sd %xmm2,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movslq -0x40(%rbp),%rax
movss  %xmm0,-0x3c(%rbp,%rax,4)
jmp    146a <HSL2RGB+0x36a>
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xc7d(%rip),%xmm1
mulsd  %xmm0,%xmm1
movsd  0xc59(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    13cd <HSL2RGB+0x2cd>
movss  -0x30(%rbp),%xmm0
movslq -0x40(%rbp),%rax
movss  %xmm0,-0x3c(%rbp,%rax,4)
jmp    1465 <HSL2RGB+0x365>
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xc45(%rip),%xmm1
mulsd  %xmm0,%xmm1
movsd  0xc31(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1451 <HSL2RGB+0x351>
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x30(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movslq -0x40(%rbp),%rax
movss  -0x3c(%rbp,%rax,4),%xmm2
cvtss2sd %xmm2,%xmm3
movsd  0xc0a(%rip),%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm0
movsd  0xbe2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movslq -0x40(%rbp),%rax
movss  %xmm0,-0x3c(%rbp,%rax,4)
jmp    1460 <HSL2RGB+0x360>
movss  -0x2c(%rbp),%xmm0
movslq -0x40(%rbp),%rax
movss  %xmm0,-0x3c(%rbp,%rax,4)
jmp    1465 <HSL2RGB+0x365>
jmp    146a <HSL2RGB+0x36a>
jmp    146f <HSL2RGB+0x36f>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1288 <HSL2RGB+0x188>
cmpq   $0x0,-0x18(%rbp)
je     1495 <HSL2RGB+0x395>
movss  -0x3c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
cmpq   $0x0,-0x20(%rbp)
je     14ad <HSL2RGB+0x3ad>
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
cmpq   $0x0,-0x28(%rbp)
je     14c5 <HSL2RGB+0x3c5>
movss  -0x34(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<HSL2RGB>:
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm1
jne    1125 <HSL2RGB+0x25>
jp     1125 <HSL2RGB+0x25>
test   %rdi,%rdi
je     1113 <HSL2RGB+0x13>
movss  %xmm2,(%rdi)
test   %rsi,%rsi
je     143c <HSL2RGB+0x33c>
movss  %xmm2,(%rsi)
jmp    143c <HSL2RGB+0x33c>
xorps  %xmm3,%xmm3
cvtss2sd %xmm2,%xmm3
movss  0xecc(%rip),%xmm4
ucomiss %xmm2,%xmm4
jbe    1152 <HSL2RGB+0x52>
cvtss2sd %xmm1,%xmm1
addsd  0xecb(%rip),%xmm1
mulsd  %xmm3,%xmm1
xorps  %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm2
jmp    1164 <HSL2RGB+0x64>
movaps %xmm1,%xmm4
addss  %xmm2,%xmm4
mulss  %xmm1,%xmm2
subss  %xmm2,%xmm4
movaps %xmm4,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
addsd  %xmm3,%xmm3
subsd  %xmm1,%xmm3
cvtsd2ss %xmm3,%xmm12
cvtss2sd %xmm0,%xmm13
movsd  0xe93(%rip),%xmm1
addsd  %xmm13,%xmm1
cvtsd2ss %xmm1,%xmm5
movaps %xmm2,%xmm6
subss  %xmm12,%xmm6
movss  0xe66(%rip),%xmm1
movaps %xmm5,%xmm3
addss  %xmm1,%xmm3
xorps  %xmm8,%xmm8
movaps %xmm5,%xmm7
cmpltss %xmm8,%xmm7
andps  %xmm7,%xmm3
andnps %xmm5,%xmm7
orps   %xmm3,%xmm7
ucomiss %xmm1,%xmm7
movaps %xmm1,%xmm3
movaps %xmm7,%xmm4
addss  0xe3c(%rip),%xmm4
cmpltss %xmm7,%xmm3
andps  %xmm3,%xmm4
andnps %xmm7,%xmm3
orps   %xmm4,%xmm3
movaps %xmm3,%xmm7
ja     11e2 <HSL2RGB+0xe2>
movaps %xmm5,%xmm7
cvtss2sd %xmm6,%xmm9
movsd  0xe39(%rip),%xmm6
ucomiss %xmm5,%xmm8
ja     11f8 <HSL2RGB+0xf8>
movaps %xmm7,%xmm3
cvtss2sd %xmm12,%xmm10
movaps %xmm9,%xmm7
mulsd  %xmm6,%xmm7
xorps  %xmm5,%xmm5
cvtss2sd %xmm3,%xmm5
mulsd  %xmm5,%xmm6
movsd  0xdf7(%rip),%xmm11
ucomisd %xmm6,%xmm11
jbe    1234 <HSL2RGB+0x134>
mulsd  %xmm7,%xmm5
addsd  %xmm10,%xmm5
xorps  %xmm8,%xmm8
cvtsd2ss %xmm5,%xmm8
jmp    128c <HSL2RGB+0x18c>
movapd %xmm5,%xmm3
addsd  %xmm5,%xmm3
ucomisd %xmm3,%xmm11
movaps %xmm2,%xmm8
ja     128c <HSL2RGB+0x18c>
movsd  0xde1(%rip),%xmm3
mulsd  %xmm5,%xmm3
movsd  0xddd(%rip),%xmm4
ucomisd %xmm3,%xmm4
movaps %xmm12,%xmm8
jbe    128c <HSL2RGB+0x18c>
movsd  0xdd3(%rip),%xmm3
subsd  %xmm5,%xmm3
mulsd  %xmm9,%xmm3
mulsd  0xdaa(%rip),%xmm3
addsd  %xmm10,%xmm3
xorps  %xmm8,%xmm8
cvtsd2ss %xmm3,%xmm8
movaps %xmm0,%xmm3
addss  %xmm1,%xmm3
xorpd  %xmm6,%xmm6
movaps %xmm0,%xmm4
cmpltss %xmm6,%xmm4
andps  %xmm4,%xmm3
andnps %xmm0,%xmm4
orps   %xmm3,%xmm4
ucomiss %xmm1,%xmm4
movaps %xmm1,%xmm3
cmpltss %xmm4,%xmm3
movaps %xmm4,%xmm5
addss  0xd4a(%rip),%xmm5
andps  %xmm3,%xmm5
andnps %xmm4,%xmm3
orps   %xmm5,%xmm3
xorps  %xmm5,%xmm5
cvtss2sd %xmm3,%xmm5
movaps %xmm5,%xmm3
ja     12d7 <HSL2RGB+0x1d7>
movaps %xmm13,%xmm3
addsd  0xd40(%rip),%xmm13
ucomiss %xmm0,%xmm6
ja     12e8 <HSL2RGB+0x1e8>
movaps %xmm3,%xmm5
xorps  %xmm4,%xmm4
cvtsd2ss %xmm13,%xmm4
movsd  0xd30(%rip),%xmm0
mulsd  %xmm5,%xmm0
ucomisd %xmm0,%xmm11
jbe    1315 <HSL2RGB+0x215>
mulsd  %xmm7,%xmm5
addsd  %xmm10,%xmm5
xorps  %xmm0,%xmm0
cvtsd2ss %xmm5,%xmm0
jmp    1367 <HSL2RGB+0x267>
movapd %xmm5,%xmm0
addsd  %xmm5,%xmm0
ucomisd %xmm0,%xmm11
movaps %xmm2,%xmm0
ja     1367 <HSL2RGB+0x267>
movsd  0xd01(%rip),%xmm0
mulsd  %xmm5,%xmm0
movsd  0xcfd(%rip),%xmm3
ucomisd %xmm0,%xmm3
movaps %xmm12,%xmm0
jbe    1367 <HSL2RGB+0x267>
movsd  0xcf3(%rip),%xmm0
subsd  %xmm5,%xmm0
mulsd  %xmm9,%xmm0
mulsd  0xcca(%rip),%xmm0
addsd  %xmm10,%xmm0
cvtsd2ss %xmm0,%xmm0
movaps %xmm4,%xmm3
addss  %xmm1,%xmm3
xorps  %xmm5,%xmm5
movaps %xmm4,%xmm6
cmpltss %xmm5,%xmm6
andps  %xmm6,%xmm3
andnps %xmm4,%xmm6
orps   %xmm3,%xmm6
ucomiss %xmm1,%xmm6
movaps %xmm6,%xmm3
addss  0xc78(%rip),%xmm3
cmpltss %xmm6,%xmm1
andps  %xmm1,%xmm3
andnps %xmm6,%xmm1
orps   %xmm3,%xmm1
movaps %xmm1,%xmm3
ja     13a6 <HSL2RGB+0x2a6>
movaps %xmm4,%xmm3
ucomiss %xmm4,%xmm5
ja     13ae <HSL2RGB+0x2ae>
movaps %xmm3,%xmm1
xorps  %xmm3,%xmm3
cvtss2sd %xmm1,%xmm3
movsd  0xc6b(%rip),%xmm1
mulsd  %xmm3,%xmm1
ucomisd %xmm1,%xmm11
jbe    13d7 <HSL2RGB+0x2d7>
mulsd  %xmm3,%xmm7
addsd  %xmm10,%xmm7
cvtsd2ss %xmm7,%xmm2
jmp    1429 <HSL2RGB+0x329>
movapd %xmm3,%xmm1
addsd  %xmm3,%xmm1
ucomisd %xmm1,%xmm11
ja     1429 <HSL2RGB+0x329>
movsd  0xc42(%rip),%xmm1
mulsd  %xmm3,%xmm1
movsd  0xc3e(%rip),%xmm2
ucomisd %xmm1,%xmm2
movaps %xmm12,%xmm2
jbe    1429 <HSL2RGB+0x329>
movsd  0xc34(%rip),%xmm1
subsd  %xmm3,%xmm1
mulsd  %xmm9,%xmm1
mulsd  0xc0b(%rip),%xmm1
addsd  %xmm10,%xmm1
xorps  %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm2
test   %rdi,%rdi
je     1433 <HSL2RGB+0x333>
movss  %xmm8,(%rdi)
test   %rsi,%rsi
je     143c <HSL2RGB+0x33c>
movss  %xmm0,(%rsi)
test   %rdx,%rdx
je     1445 <HSL2RGB+0x345>
movss  %xmm2,(%rdx)
ret

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

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