#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
float array_max(float const *, int);
float array_min(float const *, int);
void gray2hsv(const float *gray, float *rgb, int w, int h, float vmin,
              float vmax) {
  float saturation = 1.0;
  float value = 1.0;
  for (int i = 0; i < 3 * w * h; i++)
    rgb[i] = 0;
  float max = array_max(gray, w * h);
  float min = array_min(gray, w * h);
  for (int i = 0; i < w * h; i++) {
    float hue = (gray[i] - min) / (max - min) * 359.0;
    int t = (int)(hue / 60.0);
    float red, green, blue;
    switch (t) {
    case 0:
      red = value;
      green = value * (1.0 - (1.0 - (hue / 60.0 - (float)t)) * saturation);
      blue = value * (1.0 - saturation);
      break;
    case 1:
      red = value * (1.0 - (hue / 60.0 - (float)t) * saturation);
      green = value;
      blue = value * (1.0 - saturation);
      break;
    case 2:
      red = value * (1.0 - saturation);
      green = value;
      blue = value * (1.0 - (1.0 - (hue / 60.0 - (float)t)) * saturation);
      break;
    case 3:
      red = value * (1.0 - saturation);
      green = value * (1.0 - (hue / 60.0 - (float)t) * saturation);
      blue = value;
      break;
    case 4:
      red = value * (1.0 - (1.0 - (hue / 60.0 - (float)t)) * saturation);
      green = value * (1.0 - saturation);
      blue = value;
      break;
    case 5:
      red = value;
      green = value * (1.0 - saturation);
      blue = value * (1.0 - (hue / 60.0 - (float)t) * saturation);
      break;
    default:
      red = 0;
      green = 0;
      blue = 0;
      break;
    }
    rgb[i] = 250 * red;
    rgb[w * h + i] = 250 * green;
    rgb[2 * w * h + i] = 250 * blue;
  }
}


x86 assembly (clang, -O0):
<gray2hsv>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
movss  %xmm1,-0x20(%rbp)
movss  0xeb8(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  0xeab(%rip),%xmm0
movss  %xmm0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
imul   $0x3,-0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
cmp    %ecx,%eax
jge    1192 <gray2hsv+0x72>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1161 <gray2hsv+0x41>
mov    -0x8(%rbp),%rdi
mov    -0x14(%rbp),%esi
imul   -0x18(%rbp),%esi
call   1040 <array_max@plt>
movss  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x14(%rbp),%esi
imul   -0x18(%rbp),%esi
call   1030 <array_min@plt>
movss  %xmm0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
cmp    %ecx,%eax
jge    16cb <gray2hsv+0x5ab>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x34(%rbp),%xmm2
subss  %xmm2,%xmm0
movss  -0x30(%rbp),%xmm1
subss  %xmm2,%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe04(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdee(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
mov    %rax,-0x58(%rbp)
sub    $0x5,%rax
ja     1642 <gray2hsv+0x522>
mov    -0x58(%rbp),%rax
lea    0xdd7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd9a(%rip),%xmm1
divsd  %xmm1,%xmm2
cvtsi2ssl -0x40(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm2
movsd  0xd89(%rip),%xmm1
subsd  %xmm2,%xmm1
movss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xd59(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xd2e(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    165a <gray2hsv+0x53a>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xcf6(%rip),%xmm2
divsd  %xmm2,%xmm1
cvtsi2ssl -0x40(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
subsd  %xmm2,%xmm1
movss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xcc1(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xc8c(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    165a <gray2hsv+0x53a>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xc5c(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xc1f(%rip),%xmm1
divsd  %xmm1,%xmm2
cvtsi2ssl -0x40(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm2
movsd  0xc0e(%rip),%xmm1
subsd  %xmm2,%xmm1
movss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xbde(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    165a <gray2hsv+0x53a>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xbae(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xb7b(%rip),%xmm2
divsd  %xmm2,%xmm1
cvtsi2ssl -0x40(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
subsd  %xmm2,%xmm1
movss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xb46(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    165a <gray2hsv+0x53a>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xb04(%rip),%xmm1
divsd  %xmm1,%xmm2
cvtsi2ssl -0x40(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm2
movsd  0xaf3(%rip),%xmm1
subsd  %xmm2,%xmm1
movss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0xac3(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xa98(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    165a <gray2hsv+0x53a>
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xa54(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x3c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xa21(%rip),%xmm2
divsd  %xmm2,%xmm1
cvtsi2ssl -0x40(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
subsd  %xmm2,%xmm1
movss  -0x24(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
movsd  0x9ec(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
jmp    165a <gray2hsv+0x53a>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  0x9a2(%rip),%xmm0
mulss  -0x44(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  0x988(%rip),%xmm0
mulss  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  0x965(%rip),%xmm0
mulss  -0x4c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
imul   -0x18(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11c3 <gray2hsv+0xa3>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gray2hsv>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    %edx,%r15d
mov    %rsi,%r14
mov    %rdi,%r12
imul   %ecx,%r15d
lea    (%r15,%r15,2),%eax
test   %eax,%eax
jle    115d <gray2hsv+0x2d>
mov    %eax,%edx
shl    $0x2,%rdx
mov    %r14,%rdi
xor    %esi,%esi
call   1030 <memset@plt>
mov    %r12,%rdi
mov    %r15d,%esi
call   1050 <array_max@plt>
movss  %xmm0,0x4(%rsp)
mov    %r12,%rdi
mov    %r15d,%esi
call   1040 <array_min@plt>
movss  0x4(%rsp),%xmm5
test   %r15d,%r15d
jle    1315 <gray2hsv+0x1e5>
subss  %xmm0,%xmm5
lea    (%r15,%r15,1),%eax
movslq %eax,%rcx
mov    %r15d,%eax
lea    (%r14,%rcx,4),%rcx
lea    (%r14,%rax,4),%rdx
xor    %esi,%esi
movss  0xe58(%rip),%xmm1
movsd  0xe60(%rip),%xmm2
movss  0xe50(%rip),%xmm3
lea    0xe89(%rip),%rdi
movsd  0xe68(%rip),%xmm12
movsd  0xe4f(%rip),%xmm13
movss  0xe2a(%rip),%xmm14
movsd  0xe5d(%rip),%xmm8
movsd  0xe4c(%rip),%xmm9
movsd  0xe33(%rip),%xmm10
movsd  0xe1a(%rip),%xmm11
jmp    1243 <gray2hsv+0x113>
addsd  %xmm11,%xmm4
movapd %xmm13,%xmm6
subsd  %xmm4,%xmm6
cvtsd2ss %xmm6,%xmm6
movapd %xmm14,%xmm4
xorps  %xmm7,%xmm7
mulss  %xmm3,%xmm4
movss  %xmm4,(%r14,%rsi,4)
mulss  %xmm3,%xmm7
movss  %xmm7,(%rdx,%rsi,4)
mulss  %xmm3,%xmm6
movss  %xmm6,(%rcx,%rsi,4)
add    $0x1,%rsi
cmp    %rsi,%rax
je     1315 <gray2hsv+0x1e5>
movss  (%r12,%rsi,4),%xmm4
subss  %xmm0,%xmm4
divss  %xmm5,%xmm4
mulss  %xmm1,%xmm4
cvtss2sd %xmm4,%xmm4
divsd  %xmm2,%xmm4
cvttsd2si %xmm4,%ebx
xorps  %xmm6,%xmm6
cmp    $0x5,%ebx
ja     128a <gray2hsv+0x15a>
movslq (%rdi,%rbx,4),%rbx
add    %rdi,%rbx
jmp    *%rbx
addsd  %xmm12,%xmm4
addsd  %xmm13,%xmm4
xorps  %xmm7,%xmm7
cvtsd2ss %xmm4,%xmm7
movapd %xmm14,%xmm4
jmp    121a <gray2hsv+0xea>
xorpd  %xmm4,%xmm4
jmp    1217 <gray2hsv+0xe7>
addsd  %xmm12,%xmm4
movapd %xmm13,%xmm7
subsd  %xmm4,%xmm7
xorps  %xmm4,%xmm4
cvtsd2ss %xmm7,%xmm4
movapd %xmm14,%xmm7
jmp    121a <gray2hsv+0xea>
addsd  %xmm8,%xmm4
addsd  %xmm12,%xmm4
addsd  %xmm13,%xmm4
xorps  %xmm6,%xmm6
cvtsd2ss %xmm4,%xmm6
xorps  %xmm4,%xmm4
movapd %xmm14,%xmm7
jmp    121a <gray2hsv+0xea>
addsd  %xmm9,%xmm4
movapd %xmm13,%xmm6
subsd  %xmm4,%xmm6
xorps  %xmm7,%xmm7
cvtsd2ss %xmm6,%xmm7
xorpd  %xmm4,%xmm4
movapd %xmm14,%xmm6
jmp    121a <gray2hsv+0xea>
addsd  %xmm10,%xmm4
addsd  %xmm12,%xmm4
addsd  %xmm13,%xmm4
cvtsd2ss %xmm4,%xmm4
xorps  %xmm7,%xmm7
movapd %xmm14,%xmm6
jmp    121a <gray2hsv+0xea>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @gray2hsv(float* %0, float* %1, i32 %2, i32 %3, float %4, float %5) {
%7 = alloca float*
%8 = alloca float*
%9 = alloca i32
%10 = alloca i32
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca i32
%16 = alloca float
%17 = alloca float
%18 = alloca i32
%19 = alloca float
%20 = alloca i32
%21 = alloca float
%22 = alloca float
%23 = alloca float
store float* %0, float** %7
store float* %1, float** %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store float %4, float* %11
store float %5, float* %12
store float 1.000000e+00, float* %13
store float 1.000000e+00, float* %14
store i32 0, i32* %15
br label %24
24: ; preds = %36, %6
%25 = load i32, i32* %15
%26 = load i32, i32* %9
%27 = mul nsw i32 3, %26
%28 = load i32, i32* %10
%29 = mul nsw i32 %27, %28
%30 = icmp slt i32 %25, %29
br i1 %30, label %31, label %39
31: ; preds = %24
%32 = load float*, float** %8
%33 = load i32, i32* %15
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds float, float* %32, i64 %34
store float 0.000000e+00, float* %35
br label %36
36: ; preds = %31
%37 = load i32, i32* %15
%38 = add nsw i32 %37, 1
store i32 %38, i32* %15
br label %24
39: ; preds = %24
%40 = load float*, float** %7
%41 = load i32, i32* %9
%42 = load i32, i32* %10
%43 = mul nsw i32 %41, %42
%44 = call float @array_max(float* %40, i32 %43)
store float %44, float* %16
%45 = load float*, float** %7
%46 = load i32, i32* %9
%47 = load i32, i32* %10
%48 = mul nsw i32 %46, %47
%49 = call float @array_min(float* %45, i32 %48)
store float %49, float* %17
store i32 0, i32* %18
br label %50
50: ; preds = %252, %39
%51 = load i32, i32* %18
%52 = load i32, i32* %9
%53 = load i32, i32* %10
%54 = mul nsw i32 %52, %53
%55 = icmp slt i32 %51, %54
br i1 %55, label %56, label %255
56: ; preds = %50
%57 = load float*, float** %7
%58 = load i32, i32* %18
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds float, float* %57, i64 %59
%61 = load float, float* %60
%62 = load float, float* %17
%63 = fsub float %61, %62
%64 = load float, float* %16
%65 = load float, float* %17
%66 = fsub float %64, %65
%67 = fdiv float %63, %66
%68 = fpext float %67 to double
%69 = fmul double %68, 3.590000e+02
%70 = fptrunc double %69 to float
store float %70, float* %19
%71 = load float, float* %19
%72 = fpext float %71 to double
%73 = fdiv double %72, 6.000000e+01
%74 = fptosi double %73 to i32
store i32 %74, i32* %20
%75 = load i32, i32* %20
switch i32 %75, label %223 [
i32 0, label %76
i32 1, label %101
i32 2, label %125
i32 3, label %150
i32 4, label %174
i32 5, label %199
]
76: ; preds = %56
%77 = load float, float* %14
store float %77, float* %21
%78 = load float, float* %14
%79 = fpext float %78 to double
%80 = load float, float* %19
%81 = fpext float %80 to double
%82 = fdiv double %81, 6.000000e+01
%83 = load i32, i32* %20
%84 = sitofp i32 %83 to float
%85 = fpext float %84 to double
%86 = fsub double %82, %85
%87 = fsub double 1.000000e+00, %86
%88 = load float, float* %13
%89 = fpext float %88 to double
%90 = fneg double %87
%91 = call double @llvm.fmuladd.f64(double %90, double %89, double 1.000000e+00)
%92 = fmul double %79, %91
%93 = fptrunc double %92 to float
store float %93, float* %22
%94 = load float, float* %14
%95 = fpext float %94 to double
%96 = load float, float* %13
%97 = fpext float %96 to double
%98 = fsub double 1.000000e+00, %97
%99 = fmul double %95, %98
%100 = fptrunc double %99 to float
store float %100, float* %23
br label %224
101: ; preds = %56
%102 = load float, float* %14
%103 = fpext float %102 to double
%104 = load float, float* %19
%105 = fpext float %104 to double
%106 = fdiv double %105, 6.000000e+01
%107 = load i32, i32* %20
%108 = sitofp i32 %107 to float
%109 = fpext float %108 to double
%110 = fsub double %106, %109
%111 = load float, float* %13
%112 = fpext float %111 to double
%113 = fneg double %110
%114 = call double @llvm.fmuladd.f64(double %113, double %112, double 1.000000e+00)
%115 = fmul double %103, %114
%116 = fptrunc double %115 to float
store float %116, float* %21
%117 = load float, float* %14
store float %117, float* %22
%118 = load float, float* %14
%119 = fpext float %118 to double
%120 = load float, float* %13
%121 = fpext float %120 to double
%122 = fsub double 1.000000e+00, %121
%123 = fmul double %119, %122
%124 = fptrunc double %123 to float
store float %124, float* %23
br label %224
125: ; preds = %56
%126 = load float, float* %14
%127 = fpext float %126 to double
%128 = load float, float* %13
%129 = fpext float %128 to double
%130 = fsub double 1.000000e+00, %129
%131 = fmul double %127, %130
%132 = fptrunc double %131 to float
store float %132, float* %21
%133 = load float, float* %14
store float %133, float* %22
%134 = load float, float* %14
%135 = fpext float %134 to double
%136 = load float, float* %19
%137 = fpext float %136 to double
%138 = fdiv double %137, 6.000000e+01
%139 = load i32, i32* %20
%140 = sitofp i32 %139 to float
%141 = fpext float %140 to double
%142 = fsub double %138, %141
%143 = fsub double 1.000000e+00, %142
%144 = load float, float* %13
%145 = fpext float %144 to double
%146 = fneg double %143
%147 = call double @llvm.fmuladd.f64(double %146, double %145, double 1.000000e+00)
%148 = fmul double %135, %147
%149 = fptrunc double %148 to float
store float %149, float* %23
br label %224
150: ; preds = %56
%151 = load float, float* %14
%152 = fpext float %151 to double
%153 = load float, float* %13
%154 = fpext float %153 to double
%155 = fsub double 1.000000e+00, %154
%156 = fmul double %152, %155
%157 = fptrunc double %156 to float
store float %157, float* %21
%158 = load float, float* %14
%159 = fpext float %158 to double
%160 = load float, float* %19
%161 = fpext float %160 to double
%162 = fdiv double %161, 6.000000e+01
%163 = load i32, i32* %20
%164 = sitofp i32 %163 to float
%165 = fpext float %164 to double
%166 = fsub double %162, %165
%167 = load float, float* %13
%168 = fpext float %167 to double
%169 = fneg double %166
%170 = call double @llvm.fmuladd.f64(double %169, double %168, double 1.000000e+00)
%171 = fmul double %159, %170
%172 = fptrunc double %171 to float
store float %172, float* %22
%173 = load float, float* %14
store float %173, float* %23
br label %224
174: ; preds = %56
%175 = load float, float* %14
%176 = fpext float %175 to double
%177 = load float, float* %19
%178 = fpext float %177 to double
%179 = fdiv double %178, 6.000000e+01
%180 = load i32, i32* %20
%181 = sitofp i32 %180 to float
%182 = fpext float %181 to double
%183 = fsub double %179, %182
%184 = fsub double 1.000000e+00, %183
%185 = load float, float* %13
%186 = fpext float %185 to double
%187 = fneg double %184
%188 = call double @llvm.fmuladd.f64(double %187, double %186, double 1.000000e+00)
%189 = fmul double %176, %188
%190 = fptrunc double %189 to float
store float %190, float* %21
%191 = load float, float* %14
%192 = fpext float %191 to double
%193 = load float, float* %13
%194 = fpext float %193 to double
%195 = fsub double 1.000000e+00, %194
%196 = fmul double %192, %195
%197 = fptrunc double %196 to float
store float %197, float* %22
%198 = load float, float* %14
store float %198, float* %23
br label %224
199: ; preds = %56
%200 = load float, float* %14
store float %200, float* %21
%201 = load float, float* %14
%202 = fpext float %201 to double
%203 = load float, float* %13
%204 = fpext float %203 to double
%205 = fsub double 1.000000e+00, %204
%206 = fmul double %202, %205
%207 = fptrunc double %206 to float
store float %207, float* %22
%208 = load float, float* %14
%209 = fpext float %208 to double
%210 = load float, float* %19
%211 = fpext float %210 to double
%212 = fdiv double %211, 6.000000e+01
%213 = load i32, i32* %20
%214 = sitofp i32 %213 to float
%215 = fpext float %214 to double
%216 = fsub double %212, %215
%217 = load float, float* %13
%218 = fpext float %217 to double
%219 = fneg double %216
%220 = call double @llvm.fmuladd.f64(double %219, double %218, double 1.000000e+00)
%221 = fmul double %209, %220
%222 = fptrunc double %221 to float
store float %222, float* %23
br label %224
223: ; preds = %56
store float 0.000000e+00, float* %21
store float 0.000000e+00, float* %22
store float 0.000000e+00, float* %23
br label %224
224: ; preds = %223, %199, %174, %150, %125, %101, %76
%225 = load float, float* %21
%226 = fmul float 2.500000e+02, %225
%227 = load float*, float** %8
%228 = load i32, i32* %18
%229 = sext i32 %228 to i64
%230 = getelementptr inbounds float, float* %227, i64 %229
store float %226, float* %230
%231 = load float, float* %22
%232 = fmul float 2.500000e+02, %231
%233 = load float*, float** %8
%234 = load i32, i32* %9
%235 = load i32, i32* %10
%236 = mul nsw i32 %234, %235
%237 = load i32, i32* %18
%238 = add nsw i32 %236, %237
%239 = sext i32 %238 to i64
%240 = getelementptr inbounds float, float* %233, i64 %239
store float %232, float* %240
%241 = load float, float* %23
%242 = fmul float 2.500000e+02, %241
%243 = load float*, float** %8
%244 = load i32, i32* %9
%245 = mul nsw i32 2, %244
%246 = load i32, i32* %10
%247 = mul nsw i32 %245, %246
%248 = load i32, i32* %18
%249 = add nsw i32 %247, %248
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds float, float* %243, i64 %250
store float %242, float* %251
br label %252
252: ; preds = %224
%253 = load i32, i32* %18
%254 = add nsw i32 %253, 1
store i32 %254, i32* %18
br label %50
255: ; preds = %50
ret void
}

LLVM IR (-O2):
define void @gray2hsv(float* %0, float* nocapture writeonly %1, i32 %2, i32 %3, float %4, float %5) {
%7 = mul i32 %3, %2
%8 = mul i32 %7, 3
%9 = icmp sgt i32 %8, 0
br i1 %9, label %10, label %14
10: ; preds = %6
%11 = bitcast float* %1 to i8*
%12 = zext i32 %8 to i64
%13 = shl nuw nsw i64 %12, 2
br label %14
14: ; preds = %10, %6
%15 = tail call float @array_max(float* %0, i32 %7)
%16 = tail call float @array_min(float* %0, i32 %7)
%17 = icmp sgt i32 %7, 0
br i1 %17, label %18, label %24
18: ; preds = %14
%19 = fsub float %15, %16
%20 = shl nuw i32 %7, 1
%21 = zext i32 %7 to i64
%22 = sext i32 %20 to i64
%23 = zext i32 %7 to i64
br label %25
24: ; preds = %61, %14
ret void
25: ; preds = %18, %61
%26 = phi i64 [ 0, %18 ], [ %73, %61 ]
%27 = getelementptr inbounds float, float* %0, i64 %26
%28 = load float, float* %27
%29 = fsub float %28, %16
%30 = fdiv float %29, %19
%31 = fmul float %30, 3.590000e+02
%32 = fpext float %31 to double
%33 = fdiv double %32, 6.000000e+01
%34 = fptosi double %33 to i32
switch i32 %34, label %61 [
i32 0, label %35
i32 1, label %39
i32 2, label %43
i32 3, label %48
i32 4, label %52
i32 5, label %57
]
35: ; preds = %25
%36 = fadd double %33, -1.000000e+00
%37 = fadd double %36, 1.000000e+00
%38 = fptrunc double %37 to float
br label %61
39: ; preds = %25
%40 = fadd double %33, -1.000000e+00
%41 = fsub double 1.000000e+00, %40
%42 = fptrunc double %41 to float
br label %61
43: ; preds = %25
%44 = fadd double %33, -2.000000e+00
%45 = fadd double %44, -1.000000e+00
%46 = fadd double %45, 1.000000e+00
%47 = fptrunc double %46 to float
br label %61
48: ; preds = %25
%49 = fadd double %33, -3.000000e+00
%50 = fsub double 1.000000e+00, %49
%51 = fptrunc double %50 to float
br label %61
52: ; preds = %25
%53 = fadd double %33, -4.000000e+00
%54 = fadd double %53, -1.000000e+00
%55 = fadd double %54, 1.000000e+00
%56 = fptrunc double %55 to float
br label %61
57: ; preds = %25
%58 = fadd double %33, -5.000000e+00
%59 = fsub double 1.000000e+00, %58
%60 = fptrunc double %59 to float
br label %61
61: ; preds = %25, %57, %52, %48, %43, %39, %35
%62 = phi float [ 1.000000e+00, %57 ], [ %56, %52 ], [ 0.000000e+00, %48 ], [ 0.000000e+00, %43 ], [ %42, %39 ], [ 1.000000e+00, %35 ], [ 0.000000e+00, %25 ]
%63 = phi float [ 0.000000e+00, %57 ], [ 0.000000e+00, %52 ], [ %51, %48 ], [ 1.000000e+00, %43 ], [ 1.000000e+00, %39 ], [ %38, %35 ], [ 0.000000e+00, %25 ]
%64 = phi float [ %60, %57 ], [ 1.000000e+00, %52 ], [ 1.000000e+00, %48 ], [ %47, %43 ], [ 0.000000e+00, %39 ], [ 0.000000e+00, %35 ], [ 0.000000e+00, %25 ]
%65 = fmul float %62, 2.500000e+02
%66 = getelementptr inbounds float, float* %1, i64 %26
store float %65, float* %66
%67 = fmul float %63, 2.500000e+02
%68 = add nuw nsw i64 %26, %21
%69 = getelementptr inbounds float, float* %1, i64 %68
store float %67, float* %69
%70 = fmul float %64, 2.500000e+02
%71 = add nsw i64 %26, %22
%72 = getelementptr inbounds float, float* %1, i64 %71
store float %70, float* %72
%73 = add nuw nsw i64 %26, 1
%74 = icmp eq i64 %73, %23
br i1 %74, label %24, label %25
}