#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 EXIT_SUCCESS;
int plotHisto(float *img, int n, float *binSize, float *min, float *max,
              int Nbins, long *histogram) {
  int j;
  int bin;
  for (j = 0; j < Nbins; j++)
    histogram[j] = 0;
  for (j = 0; j < n; j++) {
    if (*(img + j) > *max)
      *max = *(img + j);
    if (*(img + j) < *min)
      *min = *(img + j);
  }
  *binSize = (*max - *min) / (float)Nbins;
  for (j = 0; j < n; j++) {
    bin = (*(img + j) - *min) / *binSize;
    histogram[bin]++;
  }
  return (EXIT_SUCCESS);
}


x86 assembly (clang, -O0):
<plotHisto>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1150 <plotHisto+0x50>
mov    0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1126 <plotHisto+0x26>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11d8 <plotHisto+0xd8>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
ucomiss (%rax),%xmm0
jbe    1192 <plotHisto+0x92>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jbe    11c5 <plotHisto+0xc5>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    11ca <plotHisto+0xca>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1157 <plotHisto+0x57>
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
subss  (%rax),%xmm0
cvtsi2ssl -0x2c(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1252 <plotHisto+0x152>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
subss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
divss  (%rax),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
add    $0x1,%rdx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1200 <plotHisto+0x100>
mov    0x2d87(%rip),%rax
mov    (%rax),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<plotHisto>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %r9d,%r14d
mov    %r8,%r12
mov    %rcx,%r15
mov    %rdx,%r13
mov    %esi,%ecx
mov    %rdi,%rbx
mov    0x40(%rsp),%rdi
test   %r9d,%r9d
jle    114d <plotHisto+0x3d>
mov    %r14d,%edx
shl    $0x3,%rdx
xor    %esi,%esi
mov    %ecx,%ebp
call   1030 <memset@plt>
mov    0x40(%rsp),%rdi
mov    %ebp,%ecx
test   %ecx,%ecx
jle    1213 <plotHisto+0x103>
mov    %ecx,%r8d
movss  (%r12),%xmm0
mov    %r8,%rbp
add    $0xffffffffffffffff,%rbp
je     1232 <plotHisto+0x122>
mov    %r8d,%esi
and    $0xfffffffe,%esi
xor    %edx,%edx
jmp    118d <plotHisto+0x7d>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x2,%rdx
cmp    %rdx,%rsi
je     1234 <plotHisto+0x124>
movss  (%rbx,%rdx,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    11b0 <plotHisto+0xa0>
movss  %xmm1,(%r12)
movss  (%rbx,%rdx,4),%xmm2
jmp    11b6 <plotHisto+0xa6>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movaps %xmm1,%xmm2
movaps %xmm0,%xmm1
movss  (%r15),%xmm0
ucomiss %xmm2,%xmm0
jbe    11cb <plotHisto+0xbb>
movss  %xmm2,(%r15)
movss  (%r12),%xmm1
movss  0x4(%rbx,%rdx,4),%xmm0
ucomiss %xmm1,%xmm0
jbe    11f0 <plotHisto+0xe0>
movss  %xmm0,(%r12)
movss  0x4(%rbx,%rdx,4),%xmm2
jmp    11f6 <plotHisto+0xe6>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movaps %xmm0,%xmm2
movaps %xmm1,%xmm0
movss  (%r15),%xmm1
ucomiss %xmm2,%xmm1
jbe    1180 <plotHisto+0x70>
movss  %xmm2,(%r15)
movss  (%r12),%xmm0
movaps %xmm2,%xmm1
jmp    1180 <plotHisto+0x70>
movss  (%r12),%xmm0
cvtsi2ss %r14d,%xmm1
subss  (%r15),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,0x0(%r13)
jmp    12fa <plotHisto+0x1ea>
xor    %edx,%edx
test   $0x1,%r8b
je     126f <plotHisto+0x15f>
movss  (%rbx,%rdx,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    1254 <plotHisto+0x144>
movss  %xmm1,(%r12)
movss  (%rbx,%rdx,4),%xmm2
movaps %xmm1,%xmm0
jmp    1257 <plotHisto+0x147>
movaps %xmm1,%xmm2
movss  (%r15),%xmm1
ucomiss %xmm2,%xmm1
jbe    126f <plotHisto+0x15f>
movss  %xmm2,(%r15)
movss  (%r12),%xmm0
movaps %xmm2,%xmm1
xorps  %xmm2,%xmm2
cvtsi2ss %r14d,%xmm2
subss  %xmm1,%xmm0
divss  %xmm2,%xmm0
movss  %xmm0,0x0(%r13)
test   %ecx,%ecx
jle    12fa <plotHisto+0x1ea>
movss  (%r15),%xmm1
test   %rbp,%rbp
je     1312 <plotHisto+0x202>
mov    %r8d,%edx
and    $0xfffffffe,%edx
xor    %ecx,%ecx
nop
movss  (%rbx,%rcx,4),%xmm2
subss  %xmm1,%xmm2
divss  %xmm0,%xmm2
cvttss2si %xmm2,%esi
movslq %esi,%rsi
addq   $0x1,(%rdi,%rsi,8)
movss  0x4(%rbx,%rcx,4),%xmm2
subss  %xmm1,%xmm2
divss  %xmm0,%xmm2
cvttss2si %xmm2,%esi
movslq %esi,%rsi
addq   $0x1,(%rdi,%rsi,8)
add    $0x2,%rcx
cmp    %rcx,%rdx
jne    12a0 <plotHisto+0x190>
test   $0x1,%r8b
je     12fa <plotHisto+0x1ea>
movss  (%rbx,%rcx,4),%xmm2
subss  %xmm1,%xmm2
divss  %xmm0,%xmm2
cvttss2si %xmm2,%eax
cltq
addq   $0x1,(%rdi,%rax,8)
mov    0x2cdf(%rip),%rax
mov    (%rax),%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ecx,%ecx
test   $0x1,%r8b
jne    12e2 <plotHisto+0x1d2>
jmp    12fa <plotHisto+0x1ea>

LLVM IR (-O0):
@EXIT_SUCCESS = global i32 0
define i32 @plotHisto(float* %0, i32 %1, float* %2, float* %3, float* %4, i32 %5, i64* %6) {
%8 = alloca float*
%9 = alloca i32
%10 = alloca float*
%11 = alloca float*
%12 = alloca float*
%13 = alloca i32
%14 = alloca i64*
%15 = alloca i32
%16 = alloca i32
store float* %0, float** %8
store i32 %1, i32* %9
store float* %2, float** %10
store float* %3, float** %11
store float* %4, float** %12
store i32 %5, i32* %13
store i64* %6, i64** %14
store i32 0, i32* %15
br label %17
17: ; preds = %26, %7
%18 = load i32, i32* %15
%19 = load i32, i32* %13
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %29
21: ; preds = %17
%22 = load i64*, i64** %14
%23 = load i32, i32* %15
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i64, i64* %22, i64 %24
store i64 0, i64* %25
br label %26
26: ; preds = %21
%27 = load i32, i32* %15
%28 = add nsw i32 %27, 1
store i32 %28, i32* %15
br label %17
29: ; preds = %17
store i32 0, i32* %15
br label %30
30: ; preds = %67, %29
%31 = load i32, i32* %15
%32 = load i32, i32* %9
%33 = icmp slt i32 %31, %32
br i1 %33, label %34, label %70
34: ; preds = %30
%35 = load float*, float** %8
%36 = load i32, i32* %15
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds float, float* %35, i64 %37
%39 = load float, float* %38
%40 = load float*, float** %12
%41 = load float, float* %40
%42 = fcmp ogt float %39, %41
br i1 %42, label %43, label %50
43: ; preds = %34
%44 = load float*, float** %8
%45 = load i32, i32* %15
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float, float* %44, i64 %46
%48 = load float, float* %47
%49 = load float*, float** %12
store float %48, float* %49
br label %50
50: ; preds = %43, %34
%51 = load float*, float** %8
%52 = load i32, i32* %15
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds float, float* %51, i64 %53
%55 = load float, float* %54
%56 = load float*, float** %11
%57 = load float, float* %56
%58 = fcmp olt float %55, %57
br i1 %58, label %59, label %66
59: ; preds = %50
%60 = load float*, float** %8
%61 = load i32, i32* %15
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds float, float* %60, i64 %62
%64 = load float, float* %63
%65 = load float*, float** %11
store float %64, float* %65
br label %66
66: ; preds = %59, %50
br label %67
67: ; preds = %66
%68 = load i32, i32* %15
%69 = add nsw i32 %68, 1
store i32 %69, i32* %15
br label %30
70: ; preds = %30
%71 = load float*, float** %12
%72 = load float, float* %71
%73 = load float*, float** %11
%74 = load float, float* %73
%75 = fsub float %72, %74
%76 = load i32, i32* %13
%77 = sitofp i32 %76 to float
%78 = fdiv float %75, %77
%79 = load float*, float** %10
store float %78, float* %79
store i32 0, i32* %15
br label %80
80: ; preds = %103, %70
%81 = load i32, i32* %15
%82 = load i32, i32* %9
%83 = icmp slt i32 %81, %82
br i1 %83, label %84, label %106
84: ; preds = %80
%85 = load float*, float** %8
%86 = load i32, i32* %15
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds float, float* %85, i64 %87
%89 = load float, float* %88
%90 = load float*, float** %11
%91 = load float, float* %90
%92 = fsub float %89, %91
%93 = load float*, float** %10
%94 = load float, float* %93
%95 = fdiv float %92, %94
%96 = fptosi float %95 to i32
store i32 %96, i32* %16
%97 = load i64*, i64** %14
%98 = load i32, i32* %16
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds i64, i64* %97, i64 %99
%101 = load i64, i64* %100
%102 = add nsw i64 %101, 1
store i64 %102, i64* %100
br label %103
103: ; preds = %84
%104 = load i32, i32* %15
%105 = add nsw i32 %104, 1
store i32 %105, i32* %15
br label %80
106: ; preds = %80
%107 = load i32, i32* @EXIT_SUCCESS
ret i32 %107
}

LLVM IR (-O2):
@EXIT_SUCCESS = global i32 0
define i32 @plotHisto(float* nocapture %0, i32 %1, float* nocapture %2, float* nocapture %3, float* nocapture %4, i32 %5, i64* nocapture %6) {
%8 = icmp sgt i32 %5, 0
br i1 %8, label %9, label %13
9: ; preds = %7
%10 = bitcast i64* %6 to i8*
%11 = zext i32 %5 to i64
%12 = shl nuw nsw i64 %11, 3
br label %13
13: ; preds = %9, %7
%14 = icmp sgt i32 %1, 0
br i1 %14, label %21, label %15
15: ; preds = %13
%16 = load float, float* %4
%17 = load float, float* %3
%18 = fsub float %16, %17
%19 = sitofp i32 %5 to float
%20 = fdiv float %18, %19
store float %20, float* %2
br label %135
21: ; preds = %13
%22 = zext i32 %1 to i64
%23 = load float, float* %4
%24 = add nsw i64 %22, -1
%25 = and i64 %22, 1
%26 = icmp eq i64 %24, 0
br i1 %26, label %66, label %27
27: ; preds = %21
%28 = and i64 %22, 4294967294
br label %29
29: ; preds = %60, %27
%30 = phi float [ %23, %27 ], [ %62, %60 ]
%31 = phi i64 [ 0, %27 ], [ %63, %60 ]
%32 = phi i64 [ 0, %27 ], [ %64, %60 ]
%33 = getelementptr inbounds float, float* %0, i64 %31
%34 = load float, float* %33
%35 = fcmp ogt float %34, %30
br i1 %35, label %36, label %38
36: ; preds = %29
store float %34, float* %4
%37 = load float, float* %33
br label %38
38: ; preds = %36, %29
%39 = phi float [ %37, %36 ], [ %34, %29 ]
%40 = phi float [ %34, %36 ], [ %30, %29 ]
%41 = load float, float* %3
%42 = fcmp olt float %39, %41
br i1 %42, label %43, label %45
43: ; preds = %38
store float %39, float* %3
%44 = load float, float* %4
br label %45
45: ; preds = %38, %43
%46 = phi float [ %40, %38 ], [ %44, %43 ]
%47 = or i64 %31, 1
%48 = getelementptr inbounds float, float* %0, i64 %47
%49 = load float, float* %48
%50 = fcmp ogt float %49, %46
br i1 %50, label %51, label %53
51: ; preds = %45
store float %49, float* %4
%52 = load float, float* %48
br label %53
53: ; preds = %51, %45
%54 = phi float [ %52, %51 ], [ %49, %45 ]
%55 = phi float [ %49, %51 ], [ %46, %45 ]
%56 = load float, float* %3
%57 = fcmp olt float %54, %56
br i1 %57, label %58, label %60
58: ; preds = %53
store float %54, float* %3
%59 = load float, float* %4
br label %60
60: ; preds = %58, %53
%61 = phi float [ %56, %53 ], [ %54, %58 ]
%62 = phi float [ %55, %53 ], [ %59, %58 ]
%63 = add nuw nsw i64 %31, 2
%64 = add i64 %32, 2
%65 = icmp eq i64 %64, %28
br i1 %65, label %66, label %29
66: ; preds = %60, %21
%67 = phi float [ undef, %21 ], [ %61, %60 ]
%68 = phi float [ undef, %21 ], [ %62, %60 ]
%69 = phi float [ %23, %21 ], [ %62, %60 ]
%70 = phi i64 [ 0, %21 ], [ %63, %60 ]
%71 = icmp eq i64 %25, 0
br i1 %71, label %85, label %72
72: ; preds = %66
%73 = getelementptr inbounds float, float* %0, i64 %70
%74 = load float, float* %73
%75 = fcmp ogt float %74, %69
br i1 %75, label %76, label %78
76: ; preds = %72
store float %74, float* %4
%77 = load float, float* %73
br label %78
78: ; preds = %76, %72
%79 = phi float [ %77, %76 ], [ %74, %72 ]
%80 = phi float [ %74, %76 ], [ %69, %72 ]
%81 = load float, float* %3
%82 = fcmp olt float %79, %81
br i1 %82, label %83, label %85
83: ; preds = %78
store float %79, float* %3
%84 = load float, float* %4
br label %85
85: ; preds = %78, %83, %66
%86 = phi float [ %67, %66 ], [ %81, %78 ], [ %79, %83 ]
%87 = phi float [ %68, %66 ], [ %80, %78 ], [ %84, %83 ]
%88 = fsub float %87, %86
%89 = sitofp i32 %5 to float
%90 = fdiv float %88, %89
store float %90, float* %2
br i1 %14, label %91, label %135
91: ; preds = %85
%92 = load float, float* %3
%93 = and i64 %22, 1
%94 = icmp eq i64 %24, 0
br i1 %94, label %122, label %95
95: ; preds = %91
%96 = and i64 %22, 4294967294
br label %97
97: ; preds = %97, %95
%98 = phi i64 [ 0, %95 ], [ %119, %97 ]
%99 = phi i64 [ 0, %95 ], [ %120, %97 ]
%100 = getelementptr inbounds float, float* %0, i64 %98
%101 = load float, float* %100
%102 = fsub float %101, %92
%103 = fdiv float %102, %90
%104 = fptosi float %103 to i32
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds i64, i64* %6, i64 %105
%107 = load i64, i64* %106
%108 = add nsw i64 %107, 1
store i64 %108, i64* %106
%109 = or i64 %98, 1
%110 = getelementptr inbounds float, float* %0, i64 %109
%111 = load float, float* %110
%112 = fsub float %111, %92
%113 = fdiv float %112, %90
%114 = fptosi float %113 to i32
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i64, i64* %6, i64 %115
%117 = load i64, i64* %116
%118 = add nsw i64 %117, 1
store i64 %118, i64* %116
%119 = add nuw nsw i64 %98, 2
%120 = add i64 %99, 2
%121 = icmp eq i64 %120, %96
br i1 %121, label %122, label %97
122: ; preds = %97, %91
%123 = phi i64 [ 0, %91 ], [ %119, %97 ]
%124 = icmp eq i64 %93, 0
br i1 %124, label %135, label %125
125: ; preds = %122
%126 = getelementptr inbounds float, float* %0, i64 %123
%127 = load float, float* %126
%128 = fsub float %127, %92
%129 = fdiv float %128, %90
%130 = fptosi float %129 to i32
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i64, i64* %6, i64 %131
%133 = load i64, i64* %132
%134 = add nsw i64 %133, 1
store i64 %134, i64* %132
br label %135
135: ; preds = %125, %122, %15, %85
%136 = load i32, i32* @EXIT_SUCCESS
ret i32 %136
}