#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 */
int /*<<< orphan*/ free(int *);
int *generar_histograma(unsigned char *, int, int);
void canal_a_valores_t(unsigned char *canal, int w, int h, float *t0, float *t1,
                       float *t2) {
  int i, a, b;
  int t0_tmp, t1_tmp, t2_tmp;
  int *histograma = generar_histograma(canal, w, h);
  a = b = 0;
  for (i = 0; i < 256; i++) {
    a = a + i * histograma[i];
    b = b + histograma[i];
  }
  t1_tmp = a / b;
  a = b = 0;
  for (i = 0; i < t1_tmp; i++) {
    a = a + i * histograma[i];
    b = b + histograma[i];
  }
  t0_tmp = a / b;
  a = b = 0;
  for (i = t1_tmp; i < 256; i++) {
    a = a + i * histograma[i];
    b = b + histograma[i];
  }
  t2_tmp = a / b;
  free(histograma);
  *t0 = t0_tmp / 255.0;
  *t1 = t1_tmp / 255.0;
  *t2 = t2_tmp / 255.0;
}


x86 assembly (clang, -O0):
<canal_a_valores_t>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0xc(%rbp),%esi
mov    -0x10(%rbp),%edx
call   1040 <generar_histograma@plt>
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpl   $0x100,-0x2c(%rbp)
jge    11a9 <canal_a_valores_t+0x89>
mov    -0x30(%rbp),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x48(%rbp),%rdx
movslq -0x2c(%rbp),%rsi
imul   (%rdx,%rsi,4),%ecx
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x48(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x34(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1166 <canal_a_valores_t+0x46>
mov    -0x30(%rbp),%eax
cltd
idivl  -0x34(%rbp)
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    120a <canal_a_valores_t+0xea>
mov    -0x30(%rbp),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x48(%rbp),%rdx
movslq -0x2c(%rbp),%rsi
imul   (%rdx,%rsi,4),%ecx
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x48(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x34(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11c8 <canal_a_valores_t+0xa8>
mov    -0x30(%rbp),%eax
cltd
idivl  -0x34(%rbp)
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x100,-0x2c(%rbp)
jge    126b <canal_a_valores_t+0x14b>
mov    -0x30(%rbp),%eax
mov    -0x2c(%rbp),%ecx
mov    -0x48(%rbp),%rdx
movslq -0x2c(%rbp),%rsi
imul   (%rdx,%rsi,4),%ecx
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x48(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
mov    %eax,-0x34(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1228 <canal_a_valores_t+0x108>
mov    -0x30(%rbp),%eax
cltd
idivl  -0x34(%rbp)
mov    %eax,-0x40(%rbp)
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
cvtsi2sdl -0x38(%rbp),%xmm0
movsd  0xd75(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
cvtsi2sdl -0x3c(%rbp),%xmm0
movsd  0xd58(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
cvtsi2sdl -0x40(%rbp),%xmm0
movsd  0xd3b(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<canal_a_valores_t>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %r9,%r14
mov    %r8,%r15
mov    %rcx,%r12
call   1040 <generar_histograma@plt>
mov    %rax,%rdi
movdqa 0xebc(%rip),%xmm0
pxor   %xmm6,%xmm6
mov    $0xc,%eax
movdqa 0xeba(%rip),%xmm8
movdqa 0xec1(%rip),%xmm10
movdqa 0xec8(%rip),%xmm11
movdqa 0xecf(%rip),%xmm12
pxor   %xmm7,%xmm7
pxor   %xmm5,%xmm5
pxor   %xmm4,%xmm4
nopl   (%rax)
movdqu -0x30(%rdi,%rax,4),%xmm1
pshufd $0xf5,%xmm1,%xmm2
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm2,%xmm3
movdqa %xmm0,%xmm2
paddd  %xmm8,%xmm2
paddd  %xmm1,%xmm5
pmuludq %xmm0,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
movdqu -0x20(%rdi,%rax,4),%xmm3
paddd  %xmm6,%xmm1
pshufd $0xf5,%xmm3,%xmm9
paddd  %xmm3,%xmm4
pmuludq %xmm2,%xmm3
pshufd $0xf5,%xmm2,%xmm6
pmuludq %xmm9,%xmm6
movdqu -0x10(%rdi,%rax,4),%xmm9
pshufd $0xe8,%xmm3,%xmm2
pshufd $0xe8,%xmm6,%xmm3
punpckldq %xmm3,%xmm2
paddd  %xmm7,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm10,%xmm3
pshufd $0xf5,%xmm9,%xmm6
paddd  %xmm9,%xmm5
pmuludq %xmm3,%xmm9
pshufd $0xf5,%xmm3,%xmm3
pmuludq %xmm6,%xmm3
movdqu (%rdi,%rax,4),%xmm7
pshufd $0xe8,%xmm9,%xmm6
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm6
movdqa %xmm0,%xmm3
paddd  %xmm11,%xmm3
paddd  %xmm1,%xmm6
pshufd $0xf5,%xmm7,%xmm1
paddd  %xmm7,%xmm4
pmuludq %xmm3,%xmm7
pshufd $0xf5,%xmm3,%xmm3
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xe8,%xmm3,%xmm1
punpckldq %xmm1,%xmm7
paddd  %xmm2,%xmm7
paddd  %xmm12,%xmm0
add    $0x10,%rax
cmp    $0x10c,%rax
jne    1180 <canal_a_valores_t+0x60>
paddd  %xmm5,%xmm4
pshufd $0xee,%xmm4,%xmm0
paddd  %xmm4,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%ecx
paddd  %xmm6,%xmm7
pshufd $0xee,%xmm7,%xmm0
paddd  %xmm7,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
cltd
idiv   %ecx
mov    %eax,%r13d
xor    %eax,%eax
mov    $0x0,%ecx
mov    $0x0,%r11d
test   %r13d,%r13d
jle    14e3 <canal_a_valores_t+0x3c3>
mov    %r13d,%r8d
cmp    $0x8,%r13d
jae    12d3 <canal_a_valores_t+0x1b3>
xor    %edx,%edx
xor    %ecx,%ecx
xor    %r11d,%r11d
jmp    14c0 <canal_a_valores_t+0x3a0>
mov    %r8d,%edx
and    $0xfffffff8,%edx
lea    -0x8(%rdx),%rcx
mov    %rcx,%rbp
shr    $0x3,%rbp
add    $0x1,%rbp
test   %rcx,%rcx
je     1787 <canal_a_valores_t+0x667>
mov    %rbp,%rcx
and    $0xfffffffffffffffe,%rcx
movdqa 0xcff(%rip),%xmm13
pxor   %xmm7,%xmm7
xor    %esi,%esi
pxor   %xmm0,%xmm0
pxor   %xmm5,%xmm5
pxor   %xmm6,%xmm6
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%rdi,%rsi,4),%xmm1
pshufd $0xf5,%xmm1,%xmm2
pshufd $0xf5,%xmm13,%xmm3
pmuludq %xmm2,%xmm3
movdqa %xmm13,%xmm2
paddd  %xmm8,%xmm2
paddd  %xmm1,%xmm5
pmuludq %xmm13,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
movdqu 0x10(%rdi,%rsi,4),%xmm3
paddd  %xmm7,%xmm1
pshufd $0xf5,%xmm3,%xmm7
paddd  %xmm3,%xmm6
pmuludq %xmm2,%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm7,%xmm4
movdqu 0x20(%rdi,%rsi,4),%xmm7
pshufd $0xe8,%xmm3,%xmm2
pshufd $0xe8,%xmm4,%xmm3
punpckldq %xmm3,%xmm2
paddd  %xmm0,%xmm2
movdqa %xmm13,%xmm0
paddd  %xmm10,%xmm0
pshufd $0xf5,%xmm7,%xmm3
paddd  %xmm7,%xmm5
pmuludq %xmm0,%xmm7
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm3,%xmm0
movdqu 0x30(%rdi,%rsi,4),%xmm3
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm7
movdqa %xmm13,%xmm0
paddd  %xmm11,%xmm0
paddd  %xmm1,%xmm7
pshufd $0xf5,%xmm3,%xmm1
paddd  %xmm3,%xmm6
pmuludq %xmm0,%xmm3
pshufd $0xf5,%xmm0,%xmm4
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm3,%xmm0
pshufd $0xe8,%xmm4,%xmm1
punpckldq %xmm1,%xmm0
paddd  %xmm2,%xmm0
add    $0x10,%rsi
paddd  %xmm12,%xmm13
add    $0xfffffffffffffffe,%rcx
jne    1320 <canal_a_valores_t+0x200>
test   $0x1,%bpl
je     147d <canal_a_valores_t+0x35d>
movdqa 0xbf7(%rip),%xmm9
paddd  %xmm13,%xmm9
movdqu (%rdi,%rsi,4),%xmm1
movdqu 0x10(%rdi,%rsi,4),%xmm2
pshufd $0xf5,%xmm1,%xmm3
paddd  %xmm1,%xmm5
pmuludq %xmm13,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xf5,%xmm13,%xmm4
pmuludq %xmm3,%xmm4
pshufd $0xe8,%xmm4,%xmm3
punpckldq %xmm3,%xmm1
paddd  %xmm1,%xmm7
pshufd $0xf5,%xmm2,%xmm1
paddd  %xmm2,%xmm6
pmuludq %xmm9,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm9,%xmm3
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm1
punpckldq %xmm1,%xmm2
paddd  %xmm2,%xmm0
paddd  %xmm0,%xmm7
paddd  %xmm6,%xmm5
pshufd $0xee,%xmm5,%xmm0
paddd  %xmm5,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%r11d
pshufd $0xee,%xmm7,%xmm0
paddd  %xmm7,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%ecx
cmp    %r8,%rdx
je     14d6 <canal_a_valores_t+0x3b6>
nopw   0x0(%rax,%rax,1)
mov    (%rdi,%rdx,4),%ebp
mov    %edx,%ebx
imul   %ebp,%ebx
add    %ebx,%ecx
add    %ebp,%r11d
add    $0x1,%rdx
cmp    %rdx,%r8
jne    14c0 <canal_a_valores_t+0x3a0>
cmp    $0xff,%r13d
jg     1727 <canal_a_valores_t+0x607>
movslq %r13d,%rdx
mov    $0xff,%r10d
sub    %r13d,%r10d
cmp    $0x7,%r10d
jae    14fc <canal_a_valores_t+0x3dc>
xor    %ebp,%ebp
jmp    1700 <canal_a_valores_t+0x5e0>
add    $0x1,%r10
mov    %r10,%r8
and    $0xfffffffffffffff8,%r8
movd   %r13d,%xmm0
pshufd $0x0,%xmm0,%xmm9
paddd  0xae5(%rip),%xmm9
lea    -0x8(%r8),%rax
mov    %rax,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rax,%rax
je     17b1 <canal_a_valores_t+0x691>
mov    %r9,%rbp
and    $0xfffffffffffffffe,%rbp
lea    (%rdi,%rdx,4),%rbx
add    $0x30,%rbx
pxor   %xmm7,%xmm7
xor    %eax,%eax
pxor   %xmm0,%xmm0
pxor   %xmm5,%xmm5
pxor   %xmm6,%xmm6
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu -0x30(%rbx,%rax,4),%xmm1
pshufd $0xf5,%xmm1,%xmm2
pshufd $0xf5,%xmm9,%xmm3
pmuludq %xmm2,%xmm3
movdqa %xmm9,%xmm2
paddd  %xmm8,%xmm2
paddd  %xmm1,%xmm5
pmuludq %xmm9,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
movdqu -0x20(%rbx,%rax,4),%xmm3
paddd  %xmm7,%xmm1
pshufd $0xf5,%xmm3,%xmm7
paddd  %xmm3,%xmm6
pmuludq %xmm2,%xmm3
pshufd $0xf5,%xmm2,%xmm4
pmuludq %xmm7,%xmm4
movdqu -0x10(%rbx,%rax,4),%xmm7
pshufd $0xe8,%xmm3,%xmm2
pshufd $0xe8,%xmm4,%xmm3
punpckldq %xmm3,%xmm2
paddd  %xmm0,%xmm2
movdqa %xmm9,%xmm0
paddd  %xmm10,%xmm0
pshufd $0xf5,%xmm7,%xmm3
paddd  %xmm7,%xmm5
pmuludq %xmm0,%xmm7
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm3,%xmm0
movdqu (%rbx,%rax,4),%xmm3
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm7
movdqa %xmm9,%xmm0
paddd  %xmm11,%xmm0
paddd  %xmm1,%xmm7
pshufd $0xf5,%xmm3,%xmm1
paddd  %xmm3,%xmm6
pmuludq %xmm0,%xmm3
pshufd $0xf5,%xmm0,%xmm4
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm3,%xmm0
pshufd $0xe8,%xmm4,%xmm1
punpckldq %xmm1,%xmm0
paddd  %xmm2,%xmm0
add    $0x10,%rax
paddd  %xmm12,%xmm9
add    $0xfffffffffffffffe,%rbp
jne    1560 <canal_a_valores_t+0x440>
test   $0x1,%r9b
je     16bf <canal_a_valores_t+0x59f>
add    %rdx,%rax
movdqa 0x9b5(%rip),%xmm1
paddd  %xmm9,%xmm1
movdqu (%rdi,%rax,4),%xmm2
movdqu 0x10(%rdi,%rax,4),%xmm3
pshufd $0xf5,%xmm2,%xmm8
paddd  %xmm2,%xmm5
pmuludq %xmm9,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm9,%xmm4
pmuludq %xmm8,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm2
paddd  %xmm2,%xmm7
pshufd $0xf5,%xmm3,%xmm2
paddd  %xmm3,%xmm6
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm3
pshufd $0xf5,%xmm1,%xmm1
pmuludq %xmm2,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm3
paddd  %xmm3,%xmm0
paddd  %xmm0,%xmm7
paddd  %xmm6,%xmm5
pshufd $0xee,%xmm5,%xmm0
paddd  %xmm5,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%ebp
pshufd $0xee,%xmm7,%xmm0
paddd  %xmm7,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r8,%r10
je     1718 <canal_a_valores_t+0x5f8>
add    %r8,%rdx
nopl   0x0(%rax,%rax,1)
mov    (%rdi,%rdx,4),%ebx
mov    %edx,%esi
imul   %ebx,%esi
add    %esi,%eax
add    %ebx,%ebp
add    $0x1,%rdx
cmp    $0x100,%edx
jne    1700 <canal_a_valores_t+0x5e0>
cltd
idiv   %ebp
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rsp)
mov    %ecx,%eax
cltd
idiv   %r11d
mov    %eax,%ebx
call   1030 <free@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
movsd  0x90d(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r12)
xorps  %xmm0,%xmm0
cvtsi2sd %r13d,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r15)
movsd  (%rsp),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r14)
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movdqa 0x870(%rip),%xmm13
pxor   %xmm7,%xmm7
xor    %esi,%esi
pxor   %xmm0,%xmm0
pxor   %xmm5,%xmm5
pxor   %xmm6,%xmm6
test   $0x1,%bpl
jne    1410 <canal_a_valores_t+0x2f0>
jmp    147d <canal_a_valores_t+0x35d>
pxor   %xmm7,%xmm7
xor    %eax,%eax
pxor   %xmm0,%xmm0
pxor   %xmm5,%xmm5
pxor   %xmm6,%xmm6
test   $0x1,%r9b
jne    1650 <canal_a_valores_t+0x530>
jmp    16bf <canal_a_valores_t+0x59f>

LLVM IR (-O0):
define void @canal_a_valores_t(i8* %0, i32 %1, i32 %2, float* %3, float* %4, float* %5) {
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca float*
%11 = alloca float*
%12 = alloca float*
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32*
store i8* %0, i8** %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store float* %3, float** %10
store float* %4, float** %11
store float* %5, float** %12
%20 = load i8*, i8** %7
%21 = load i32, i32* %8
%22 = load i32, i32* %9
%23 = call i32* @generar_histograma(i8* %20, i32 %21, i32 %22)
store i32* %23, i32** %19
store i32 0, i32* %15
store i32 0, i32* %14
store i32 0, i32* %13
br label %24
24: ; preds = %44, %6
%25 = load i32, i32* %13
%26 = icmp slt i32 %25, 256
br i1 %26, label %27, label %47
27: ; preds = %24
%28 = load i32, i32* %14
%29 = load i32, i32* %13
%30 = load i32*, i32** %19
%31 = load i32, i32* %13
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i32, i32* %30, i64 %32
%34 = load i32, i32* %33
%35 = mul nsw i32 %29, %34
%36 = add nsw i32 %28, %35
store i32 %36, i32* %14
%37 = load i32, i32* %15
%38 = load i32*, i32** %19
%39 = load i32, i32* %13
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i32, i32* %38, i64 %40
%42 = load i32, i32* %41
%43 = add nsw i32 %37, %42
store i32 %43, i32* %15
br label %44
44: ; preds = %27
%45 = load i32, i32* %13
%46 = add nsw i32 %45, 1
store i32 %46, i32* %13
br label %24
47: ; preds = %24
%48 = load i32, i32* %14
%49 = load i32, i32* %15
%50 = sdiv i32 %48, %49
store i32 %50, i32* %17
store i32 0, i32* %15
store i32 0, i32* %14
store i32 0, i32* %13
br label %51
51: ; preds = %72, %47
%52 = load i32, i32* %13
%53 = load i32, i32* %17
%54 = icmp slt i32 %52, %53
br i1 %54, label %55, label %75
55: ; preds = %51
%56 = load i32, i32* %14
%57 = load i32, i32* %13
%58 = load i32*, i32** %19
%59 = load i32, i32* %13
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i32, i32* %58, i64 %60
%62 = load i32, i32* %61
%63 = mul nsw i32 %57, %62
%64 = add nsw i32 %56, %63
store i32 %64, i32* %14
%65 = load i32, i32* %15
%66 = load i32*, i32** %19
%67 = load i32, i32* %13
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i32, i32* %66, i64 %68
%70 = load i32, i32* %69
%71 = add nsw i32 %65, %70
store i32 %71, i32* %15
br label %72
72: ; preds = %55
%73 = load i32, i32* %13
%74 = add nsw i32 %73, 1
store i32 %74, i32* %13
br label %51
75: ; preds = %51
%76 = load i32, i32* %14
%77 = load i32, i32* %15
%78 = sdiv i32 %76, %77
store i32 %78, i32* %16
store i32 0, i32* %15
store i32 0, i32* %14
%79 = load i32, i32* %17
store i32 %79, i32* %13
br label %80
80: ; preds = %100, %75
%81 = load i32, i32* %13
%82 = icmp slt i32 %81, 256
br i1 %82, label %83, label %103
83: ; preds = %80
%84 = load i32, i32* %14
%85 = load i32, i32* %13
%86 = load i32*, i32** %19
%87 = load i32, i32* %13
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i32, i32* %86, i64 %88
%90 = load i32, i32* %89
%91 = mul nsw i32 %85, %90
%92 = add nsw i32 %84, %91
store i32 %92, i32* %14
%93 = load i32, i32* %15
%94 = load i32*, i32** %19
%95 = load i32, i32* %13
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i32, i32* %94, i64 %96
%98 = load i32, i32* %97
%99 = add nsw i32 %93, %98
store i32 %99, i32* %15
br label %100
100: ; preds = %83
%101 = load i32, i32* %13
%102 = add nsw i32 %101, 1
store i32 %102, i32* %13
br label %80
103: ; preds = %80
%104 = load i32, i32* %14
%105 = load i32, i32* %15
%106 = sdiv i32 %104, %105
store i32 %106, i32* %18
%107 = load i32*, i32** %19
%108 = call i32 @free(i32* %107)
%109 = load i32, i32* %16
%110 = sitofp i32 %109 to double
%111 = fdiv double %110, 2.550000e+02
%112 = fptrunc double %111 to float
%113 = load float*, float** %10
store float %112, float* %113
%114 = load i32, i32* %17
%115 = sitofp i32 %114 to double
%116 = fdiv double %115, 2.550000e+02
%117 = fptrunc double %116 to float
%118 = load float*, float** %11
store float %117, float* %118
%119 = load i32, i32* %18
%120 = sitofp i32 %119 to double
%121 = fdiv double %120, 2.550000e+02
%122 = fptrunc double %121 to float
%123 = load float*, float** %12
store float %122, float* %123
ret void
}

LLVM IR (-O2):
define void @canal_a_valores_t(i8* %0, i32 %1, i32 %2, float* nocapture writeonly %3, float* nocapture writeonly %4, float* nocapture writeonly %5) {
%7 = tail call i32* @generar_histograma(i8* %0, i32 %1, i32 %2)
br label %8
8: ; preds = %8, %6
%9 = phi i64 [ 0, %6 ], [ %43, %8 ]
%10 = phi <4 x i32> [ zeroinitializer, %6 ], [ %39, %8 ]
%11 = phi <4 x i32> [ zeroinitializer, %6 ], [ %40, %8 ]
%12 = phi <4 x i32> [ zeroinitializer, %6 ], [ %41, %8 ]
%13 = phi <4 x i32> [ zeroinitializer, %6 ], [ %42, %8 ]
%14 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %6 ], [ %44, %8 ]
%15 = add <4 x i32> %14, <i32 4, i32 4, i32 4, i32 4>
%16 = getelementptr inbounds i32, i32* %7, i64 %9
%17 = bitcast i32* %16 to <4 x i32>*
%18 = load <4 x i32>, <4 x i32>* %17
%19 = getelementptr inbounds i32, i32* %16, i64 4
%20 = bitcast i32* %19 to <4 x i32>*
%21 = load <4 x i32>, <4 x i32>* %20
%22 = mul nsw <4 x i32> %18, %14
%23 = mul nsw <4 x i32> %21, %15
%24 = add <4 x i32> %22, %10
%25 = add <4 x i32> %23, %11
%26 = add <4 x i32> %18, %12
%27 = add <4 x i32> %21, %13
%28 = or i64 %9, 8
%29 = add <4 x i32> %14, <i32 8, i32 8, i32 8, i32 8>
%30 = add <4 x i32> %14, <i32 12, i32 12, i32 12, i32 12>
%31 = getelementptr inbounds i32, i32* %7, i64 %28
%32 = bitcast i32* %31 to <4 x i32>*
%33 = load <4 x i32>, <4 x i32>* %32
%34 = getelementptr inbounds i32, i32* %31, i64 4
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = mul nsw <4 x i32> %33, %29
%38 = mul nsw <4 x i32> %36, %30
%39 = add <4 x i32> %37, %24
%40 = add <4 x i32> %38, %25
%41 = add <4 x i32> %33, %26
%42 = add <4 x i32> %36, %27
%43 = add nuw nsw i64 %9, 16
%44 = add <4 x i32> %14, <i32 16, i32 16, i32 16, i32 16>
%45 = icmp eq i64 %43, 256
br i1 %45, label %46, label %8
46: ; preds = %8
%47 = add <4 x i32> %42, %41
%48 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %47)
%49 = add <4 x i32> %40, %39
%50 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %49)
%51 = sdiv i32 %50, %48
%52 = icmp sgt i32 %51, 0
br i1 %52, label %53, label %149
53: ; preds = %46
%54 = zext i32 %51 to i64
%55 = icmp ult i32 %51, 8
br i1 %55, label %141, label %56
56: ; preds = %53
%57 = and i64 %54, 4294967288
%58 = add nsw i64 %57, -8
%59 = lshr exact i64 %58, 3
%60 = add nuw nsw i64 %59, 1
%61 = and i64 %60, 1
%62 = icmp eq i64 %58, 0
br i1 %62, label %105, label %63
63: ; preds = %56
%64 = and i64 %60, 4611686018427387902
br label %65
65: ; preds = %65, %63
%66 = phi i64 [ 0, %63 ], [ %101, %65 ]
%67 = phi <4 x i32> [ zeroinitializer, %63 ], [ %97, %65 ]
%68 = phi <4 x i32> [ zeroinitializer, %63 ], [ %98, %65 ]
%69 = phi <4 x i32> [ zeroinitializer, %63 ], [ %99, %65 ]
%70 = phi <4 x i32> [ zeroinitializer, %63 ], [ %100, %65 ]
%71 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %63 ], [ %102, %65 ]
%72 = phi i64 [ 0, %63 ], [ %103, %65 ]
%73 = add <4 x i32> %71, <i32 4, i32 4, i32 4, i32 4>
%74 = getelementptr inbounds i32, i32* %7, i64 %66
%75 = bitcast i32* %74 to <4 x i32>*
%76 = load <4 x i32>, <4 x i32>* %75
%77 = getelementptr inbounds i32, i32* %74, i64 4
%78 = bitcast i32* %77 to <4 x i32>*
%79 = load <4 x i32>, <4 x i32>* %78
%80 = mul nsw <4 x i32> %76, %71
%81 = mul nsw <4 x i32> %79, %73
%82 = add <4 x i32> %80, %67
%83 = add <4 x i32> %81, %68
%84 = add <4 x i32> %76, %69
%85 = add <4 x i32> %79, %70
%86 = or i64 %66, 8
%87 = add <4 x i32> %71, <i32 8, i32 8, i32 8, i32 8>
%88 = add <4 x i32> %71, <i32 12, i32 12, i32 12, i32 12>
%89 = getelementptr inbounds i32, i32* %7, i64 %86
%90 = bitcast i32* %89 to <4 x i32>*
%91 = load <4 x i32>, <4 x i32>* %90
%92 = getelementptr inbounds i32, i32* %89, i64 4
%93 = bitcast i32* %92 to <4 x i32>*
%94 = load <4 x i32>, <4 x i32>* %93
%95 = mul nsw <4 x i32> %91, %87
%96 = mul nsw <4 x i32> %94, %88
%97 = add <4 x i32> %95, %82
%98 = add <4 x i32> %96, %83
%99 = add <4 x i32> %91, %84
%100 = add <4 x i32> %94, %85
%101 = add nuw i64 %66, 16
%102 = add <4 x i32> %71, <i32 16, i32 16, i32 16, i32 16>
%103 = add i64 %72, 2
%104 = icmp eq i64 %103, %64
br i1 %104, label %105, label %65
105: ; preds = %65, %56
%106 = phi <4 x i32> [ undef, %56 ], [ %97, %65 ]
%107 = phi <4 x i32> [ undef, %56 ], [ %98, %65 ]
%108 = phi <4 x i32> [ undef, %56 ], [ %99, %65 ]
%109 = phi <4 x i32> [ undef, %56 ], [ %100, %65 ]
%110 = phi i64 [ 0, %56 ], [ %101, %65 ]
%111 = phi <4 x i32> [ zeroinitializer, %56 ], [ %97, %65 ]
%112 = phi <4 x i32> [ zeroinitializer, %56 ], [ %98, %65 ]
%113 = phi <4 x i32> [ zeroinitializer, %56 ], [ %99, %65 ]
%114 = phi <4 x i32> [ zeroinitializer, %56 ], [ %100, %65 ]
%115 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %56 ], [ %102, %65 ]
%116 = icmp eq i64 %61, 0
br i1 %116, label %131, label %117
117: ; preds = %105
%118 = add <4 x i32> %115, <i32 4, i32 4, i32 4, i32 4>
%119 = getelementptr inbounds i32, i32* %7, i64 %110
%120 = bitcast i32* %119 to <4 x i32>*
%121 = load <4 x i32>, <4 x i32>* %120
%122 = getelementptr inbounds i32, i32* %119, i64 4
%123 = bitcast i32* %122 to <4 x i32>*
%124 = load <4 x i32>, <4 x i32>* %123
%125 = mul nsw <4 x i32> %121, %115
%126 = mul nsw <4 x i32> %124, %118
%127 = add <4 x i32> %125, %111
%128 = add <4 x i32> %126, %112
%129 = add <4 x i32> %121, %113
%130 = add <4 x i32> %124, %114
br label %131
131: ; preds = %105, %117
%132 = phi <4 x i32> [ %106, %105 ], [ %127, %117 ]
%133 = phi <4 x i32> [ %107, %105 ], [ %128, %117 ]
%134 = phi <4 x i32> [ %108, %105 ], [ %129, %117 ]
%135 = phi <4 x i32> [ %109, %105 ], [ %130, %117 ]
%136 = add <4 x i32> %135, %134
%137 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %136)
%138 = add <4 x i32> %133, %132
%139 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %138)
%140 = icmp eq i64 %57, %54
br i1 %140, label %145, label %141
141: ; preds = %53, %131
%142 = phi i64 [ 0, %53 ], [ %57, %131 ]
%143 = phi i32 [ 0, %53 ], [ %139, %131 ]
%144 = phi i32 [ 0, %53 ], [ %137, %131 ]
br label %253
145: ; preds = %253, %131
%146 = phi i32 [ %139, %131 ], [ %261, %253 ]
%147 = phi i32 [ %137, %131 ], [ %262, %253 ]
%148 = icmp slt i32 %51, 256
br i1 %148, label %149, label %283
149: ; preds = %46, %145
%150 = phi i32 [ %146, %145 ], [ 0, %46 ]
%151 = phi i32 [ %147, %145 ], [ 0, %46 ]
%152 = sext i32 %51 to i64
%153 = sub i32 255, %51
%154 = zext i32 %153 to i64
%155 = add nuw nsw i64 %154, 1
%156 = icmp ult i32 %153, 7
br i1 %156, label %249, label %157
157: ; preds = %149
%158 = and i64 %155, 8589934584
%159 = add nsw i64 %158, %152
%160 = insertelement <4 x i32> poison, i32 %51, i64 0
%161 = shufflevector <4 x i32> %160, <4 x i32> poison, <4 x i32> zeroinitializer
%162 = add <4 x i32> %161, <i32 0, i32 1, i32 2, i32 3>
%163 = add nsw i64 %158, -8
%164 = lshr exact i64 %163, 3
%165 = add nuw nsw i64 %164, 1
%166 = and i64 %165, 1
%167 = icmp eq i64 %163, 0
br i1 %167, label %212, label %168
168: ; preds = %157
%169 = and i64 %165, 4611686018427387902
br label %170
170: ; preds = %170, %168
%171 = phi i64 [ 0, %168 ], [ %208, %170 ]
%172 = phi <4 x i32> [ zeroinitializer, %168 ], [ %204, %170 ]
%173 = phi <4 x i32> [ zeroinitializer, %168 ], [ %205, %170 ]
%174 = phi <4 x i32> [ zeroinitializer, %168 ], [ %206, %170 ]
%175 = phi <4 x i32> [ zeroinitializer, %168 ], [ %207, %170 ]
%176 = phi <4 x i32> [ %162, %168 ], [ %209, %170 ]
%177 = phi i64 [ 0, %168 ], [ %210, %170 ]
%178 = add i64 %171, %152
%179 = add <4 x i32> %176, <i32 4, i32 4, i32 4, i32 4>
%180 = getelementptr inbounds i32, i32* %7, i64 %178
%181 = bitcast i32* %180 to <4 x i32>*
%182 = load <4 x i32>, <4 x i32>* %181
%183 = getelementptr inbounds i32, i32* %180, i64 4
%184 = bitcast i32* %183 to <4 x i32>*
%185 = load <4 x i32>, <4 x i32>* %184
%186 = mul nsw <4 x i32> %182, %176
%187 = mul nsw <4 x i32> %185, %179
%188 = add <4 x i32> %186, %172
%189 = add <4 x i32> %187, %173
%190 = add <4 x i32> %182, %174
%191 = add <4 x i32> %185, %175
%192 = or i64 %171, 8
%193 = add <4 x i32> %176, <i32 8, i32 8, i32 8, i32 8>
%194 = add i64 %192, %152
%195 = add <4 x i32> %176, <i32 12, i32 12, i32 12, i32 12>
%196 = getelementptr inbounds i32, i32* %7, i64 %194
%197 = bitcast i32* %196 to <4 x i32>*
%198 = load <4 x i32>, <4 x i32>* %197
%199 = getelementptr inbounds i32, i32* %196, i64 4
%200 = bitcast i32* %199 to <4 x i32>*
%201 = load <4 x i32>, <4 x i32>* %200
%202 = mul nsw <4 x i32> %198, %193
%203 = mul nsw <4 x i32> %201, %195
%204 = add <4 x i32> %202, %188
%205 = add <4 x i32> %203, %189
%206 = add <4 x i32> %198, %190
%207 = add <4 x i32> %201, %191
%208 = add nuw i64 %171, 16
%209 = add <4 x i32> %176, <i32 16, i32 16, i32 16, i32 16>
%210 = add i64 %177, 2
%211 = icmp eq i64 %210, %169
br i1 %211, label %212, label %170
212: ; preds = %170, %157
%213 = phi <4 x i32> [ undef, %157 ], [ %204, %170 ]
%214 = phi <4 x i32> [ undef, %157 ], [ %205, %170 ]
%215 = phi <4 x i32> [ undef, %157 ], [ %206, %170 ]
%216 = phi <4 x i32> [ undef, %157 ], [ %207, %170 ]
%217 = phi i64 [ 0, %157 ], [ %208, %170 ]
%218 = phi <4 x i32> [ zeroinitializer, %157 ], [ %204, %170 ]
%219 = phi <4 x i32> [ zeroinitializer, %157 ], [ %205, %170 ]
%220 = phi <4 x i32> [ zeroinitializer, %157 ], [ %206, %170 ]
%221 = phi <4 x i32> [ zeroinitializer, %157 ], [ %207, %170 ]
%222 = phi <4 x i32> [ %162, %157 ], [ %209, %170 ]
%223 = icmp eq i64 %166, 0
br i1 %223, label %239, label %224
224: ; preds = %212
%225 = add i64 %217, %152
%226 = add <4 x i32> %222, <i32 4, i32 4, i32 4, i32 4>
%227 = getelementptr inbounds i32, i32* %7, i64 %225
%228 = bitcast i32* %227 to <4 x i32>*
%229 = load <4 x i32>, <4 x i32>* %228
%230 = getelementptr inbounds i32, i32* %227, i64 4
%231 = bitcast i32* %230 to <4 x i32>*
%232 = load <4 x i32>, <4 x i32>* %231
%233 = mul nsw <4 x i32> %229, %222
%234 = mul nsw <4 x i32> %232, %226
%235 = add <4 x i32> %233, %218
%236 = add <4 x i32> %234, %219
%237 = add <4 x i32> %229, %220
%238 = add <4 x i32> %232, %221
br label %239
239: ; preds = %212, %224
%240 = phi <4 x i32> [ %213, %212 ], [ %235, %224 ]
%241 = phi <4 x i32> [ %214, %212 ], [ %236, %224 ]
%242 = phi <4 x i32> [ %215, %212 ], [ %237, %224 ]
%243 = phi <4 x i32> [ %216, %212 ], [ %238, %224 ]
%244 = add <4 x i32> %243, %242
%245 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %244)
%246 = add <4 x i32> %241, %240
%247 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %246)
%248 = icmp eq i64 %155, %158
br i1 %248, label %278, label %249
249: ; preds = %149, %239
%250 = phi i64 [ %152, %149 ], [ %159, %239 ]
%251 = phi i32 [ 0, %149 ], [ %247, %239 ]
%252 = phi i32 [ 0, %149 ], [ %245, %239 ]
br label %265
253: ; preds = %141, %253
%254 = phi i64 [ %263, %253 ], [ %142, %141 ]
%255 = phi i32 [ %261, %253 ], [ %143, %141 ]
%256 = phi i32 [ %262, %253 ], [ %144, %141 ]
%257 = getelementptr inbounds i32, i32* %7, i64 %254
%258 = load i32, i32* %257
%259 = trunc i64 %254 to i32
%260 = mul nsw i32 %258, %259
%261 = add nsw i32 %260, %255
%262 = add nsw i32 %258, %256
%263 = add nuw nsw i64 %254, 1
%264 = icmp eq i64 %263, %54
br i1 %264, label %145, label %253
265: ; preds = %249, %265
%266 = phi i64 [ %275, %265 ], [ %250, %249 ]
%267 = phi i32 [ %273, %265 ], [ %251, %249 ]
%268 = phi i32 [ %274, %265 ], [ %252, %249 ]
%269 = getelementptr inbounds i32, i32* %7, i64 %266
%270 = load i32, i32* %269
%271 = trunc i64 %266 to i32
%272 = mul nsw i32 %270, %271
%273 = add nsw i32 %272, %267
%274 = add nsw i32 %270, %268
%275 = add nsw i64 %266, 1
%276 = trunc i64 %275 to i32
%277 = icmp eq i32 %276, 256
br i1 %277, label %278, label %265
278: ; preds = %265, %239
%279 = phi i32 [ %247, %239 ], [ %273, %265 ]
%280 = phi i32 [ %245, %239 ], [ %274, %265 ]
%281 = sdiv i32 %279, %280
%282 = sitofp i32 %281 to double
br label %283
283: ; preds = %278, %145
%284 = phi i32 [ %150, %278 ], [ %146, %145 ]
%285 = phi i32 [ %151, %278 ], [ %147, %145 ]
%286 = phi double [ %282, %278 ], [ poison, %145 ]
%287 = sdiv i32 %284, %285
%288 = tail call i32 @free(i32* %7)
%289 = sitofp i32 %287 to double
%290 = fdiv double %289, 2.550000e+02
%291 = fptrunc double %290 to float
store float %291, float* %3
%292 = sitofp i32 %51 to double
%293 = fdiv double %292, 2.550000e+02
%294 = fptrunc double %293 to float
store float %294, float* %4
%295 = fdiv double %286, 2.550000e+02
%296 = fptrunc double %295 to float
store float %296, float* %5
ret void
}