Cleanup intification
diff --git a/src/core/lib/debug/stats_data.c b/src/core/lib/debug/stats_data.c
index 8ebfb23..4829f78 100644
--- a/src/core/lib/debug/stats_data.c
+++ b/src/core/lib/debug/stats_data.c
@@ -19,6 +19,7 @@
  */
 
 #include "src/core/lib/debug/stats_data.h"
+#include <grpc/support/useful.h>
 #include "src/core/lib/debug/stats.h"
 #include "src/core/lib/iomgr/exec_ctx.h"
 const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT] = {
@@ -80,154 +81,146 @@
     24, 24, 25, 25, 26, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33,
     34, 34, 35, 36, 36, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43,
     44, 45, 45, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51};
-void grpc_stats_inc_tcp_write_size(grpc_exec_ctx *exec_ctx, double value) {
-  union {
-    double dbl;
-    uint64_t uint;
-  } _val;
-  _val.dbl = value;
-  if (_val.dbl < 0) _val.dbl = 0;
-  if (_val.dbl < 5.000000) {
+void grpc_stats_inc_tcp_write_size(grpc_exec_ctx *exec_ctx, int value) {
+  value = GPR_CLAMP(value, 0, 16777216);
+  if (value < 5) {
     GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_SIZE,
-                             (int)_val.dbl);
-  } else {
-    if (_val.uint < 4682617712558473216ull) {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_SIZE,
-          grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
-    } else {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_SIZE,
-          grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl,
-                                            grpc_stats_table_0, 64));
-    }
+                             value);
+    return;
   }
-}
-void grpc_stats_inc_tcp_write_iov_size(grpc_exec_ctx *exec_ctx, double value) {
   union {
     double dbl;
     uint64_t uint;
   } _val;
   _val.dbl = value;
-  if (_val.dbl < 0) _val.dbl = 0;
-  if (_val.dbl < 12.000000) {
+  if (_val.uint < 4682617712558473216ull) {
     GRPC_STATS_INC_HISTOGRAM(
-        (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE, (int)_val.dbl);
-  } else {
-    if (_val.uint < 4637300241308057600ull) {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE,
-          grpc_stats_table_3[((_val.uint - 4622945017495814144ull) >> 48)] +
-              11);
-    } else {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE,
-          grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl,
-                                            grpc_stats_table_2, 64));
-    }
+        (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_SIZE,
+        grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
+    return;
   }
+  GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_SIZE,
+                           grpc_stats_histo_find_bucket_slow(
+                               (exec_ctx), _val.dbl, grpc_stats_table_0, 64));
 }
-void grpc_stats_inc_tcp_read_size(grpc_exec_ctx *exec_ctx, double value) {
+void grpc_stats_inc_tcp_write_iov_size(grpc_exec_ctx *exec_ctx, int value) {
+  value = GPR_CLAMP(value, 0, 1024);
+  if (value < 12) {
+    GRPC_STATS_INC_HISTOGRAM((exec_ctx),
+                             GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE, value);
+    return;
+  }
   union {
     double dbl;
     uint64_t uint;
   } _val;
   _val.dbl = value;
-  if (_val.dbl < 0) _val.dbl = 0;
-  if (_val.dbl < 5.000000) {
+  if (_val.uint < 4637300241308057600ull) {
+    GRPC_STATS_INC_HISTOGRAM(
+        (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE,
+        grpc_stats_table_3[((_val.uint - 4622945017495814144ull) >> 48)] + 11);
+    return;
+  }
+  GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE,
+                           grpc_stats_histo_find_bucket_slow(
+                               (exec_ctx), _val.dbl, grpc_stats_table_2, 64));
+}
+void grpc_stats_inc_tcp_read_size(grpc_exec_ctx *exec_ctx, int value) {
+  value = GPR_CLAMP(value, 0, 16777216);
+  if (value < 5) {
     GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_SIZE,
-                             (int)_val.dbl);
-  } else {
-    if (_val.uint < 4682617712558473216ull) {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_SIZE,
-          grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
-    } else {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_SIZE,
-          grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl,
-                                            grpc_stats_table_0, 64));
-    }
+                             value);
+    return;
   }
-}
-void grpc_stats_inc_tcp_read_offer(grpc_exec_ctx *exec_ctx, double value) {
   union {
     double dbl;
     uint64_t uint;
   } _val;
   _val.dbl = value;
-  if (_val.dbl < 0) _val.dbl = 0;
-  if (_val.dbl < 5.000000) {
+  if (_val.uint < 4682617712558473216ull) {
+    GRPC_STATS_INC_HISTOGRAM(
+        (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_SIZE,
+        grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
+    return;
+  }
+  GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_SIZE,
+                           grpc_stats_histo_find_bucket_slow(
+                               (exec_ctx), _val.dbl, grpc_stats_table_0, 64));
+}
+void grpc_stats_inc_tcp_read_offer(grpc_exec_ctx *exec_ctx, int value) {
+  value = GPR_CLAMP(value, 0, 16777216);
+  if (value < 5) {
     GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_OFFER,
-                             (int)_val.dbl);
-  } else {
-    if (_val.uint < 4682617712558473216ull) {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_OFFER,
-          grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
-    } else {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_OFFER,
-          grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl,
-                                            grpc_stats_table_0, 64));
-    }
+                             value);
+    return;
   }
-}
-void grpc_stats_inc_tcp_read_iov_size(grpc_exec_ctx *exec_ctx, double value) {
   union {
     double dbl;
     uint64_t uint;
   } _val;
   _val.dbl = value;
-  if (_val.dbl < 0) _val.dbl = 0;
-  if (_val.dbl < 12.000000) {
-    GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_IOV_SIZE,
-                             (int)_val.dbl);
-  } else {
-    if (_val.uint < 4637300241308057600ull) {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_IOV_SIZE,
-          grpc_stats_table_3[((_val.uint - 4622945017495814144ull) >> 48)] +
-              11);
-    } else {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_IOV_SIZE,
-          grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl,
-                                            grpc_stats_table_2, 64));
-    }
+  if (_val.uint < 4682617712558473216ull) {
+    GRPC_STATS_INC_HISTOGRAM(
+        (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_OFFER,
+        grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
+    return;
   }
+  GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_OFFER,
+                           grpc_stats_histo_find_bucket_slow(
+                               (exec_ctx), _val.dbl, grpc_stats_table_0, 64));
+}
+void grpc_stats_inc_tcp_read_iov_size(grpc_exec_ctx *exec_ctx, int value) {
+  value = GPR_CLAMP(value, 0, 1024);
+  if (value < 12) {
+    GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_IOV_SIZE,
+                             value);
+    return;
+  }
+  union {
+    double dbl;
+    uint64_t uint;
+  } _val;
+  _val.dbl = value;
+  if (_val.uint < 4637300241308057600ull) {
+    GRPC_STATS_INC_HISTOGRAM(
+        (exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_IOV_SIZE,
+        grpc_stats_table_3[((_val.uint - 4622945017495814144ull) >> 48)] + 11);
+    return;
+  }
+  GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_TCP_READ_IOV_SIZE,
+                           grpc_stats_histo_find_bucket_slow(
+                               (exec_ctx), _val.dbl, grpc_stats_table_2, 64));
 }
 void grpc_stats_inc_http2_send_message_size(grpc_exec_ctx *exec_ctx,
-                                            double value) {
+                                            int value) {
+  value = GPR_CLAMP(value, 0, 16777216);
+  if (value < 5) {
+    GRPC_STATS_INC_HISTOGRAM(
+        (exec_ctx), GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE, value);
+    return;
+  }
   union {
     double dbl;
     uint64_t uint;
   } _val;
   _val.dbl = value;
-  if (_val.dbl < 0) _val.dbl = 0;
-  if (_val.dbl < 5.000000) {
-    GRPC_STATS_INC_HISTOGRAM((exec_ctx),
-                             GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE,
-                             (int)_val.dbl);
-  } else {
-    if (_val.uint < 4682617712558473216ull) {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE,
-          grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
-    } else {
-      GRPC_STATS_INC_HISTOGRAM(
-          (exec_ctx), GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE,
-          grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl,
-                                            grpc_stats_table_0, 64));
-    }
+  if (_val.uint < 4682617712558473216ull) {
+    GRPC_STATS_INC_HISTOGRAM(
+        (exec_ctx), GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE,
+        grpc_stats_table_1[((_val.uint - 4617315517961601024ull) >> 50)] + 4);
+    return;
   }
+  GRPC_STATS_INC_HISTOGRAM((exec_ctx),
+                           GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE,
+                           grpc_stats_histo_find_bucket_slow(
+                               (exec_ctx), _val.dbl, grpc_stats_table_0, 64));
 }
 const int grpc_stats_histo_buckets[6] = {64, 64, 64, 64, 64, 64};
 const int grpc_stats_histo_start[6] = {0, 64, 128, 192, 256, 320};
 const int *const grpc_stats_histo_bucket_boundaries[6] = {
     grpc_stats_table_0, grpc_stats_table_2, grpc_stats_table_0,
     grpc_stats_table_0, grpc_stats_table_2, grpc_stats_table_0};
-void (*const grpc_stats_inc_histogram[6])(grpc_exec_ctx *exec_ctx, double x) = {
+void (*const grpc_stats_inc_histogram[6])(grpc_exec_ctx *exec_ctx, int x) = {
     grpc_stats_inc_tcp_write_size,    grpc_stats_inc_tcp_write_iov_size,
     grpc_stats_inc_tcp_read_size,     grpc_stats_inc_tcp_read_offer,
     grpc_stats_inc_tcp_read_iov_size, grpc_stats_inc_http2_send_message_size};
diff --git a/src/core/lib/debug/stats_data.h b/src/core/lib/debug/stats_data.h
index 13bf9d0..9b2d43a 100644
--- a/src/core/lib/debug/stats_data.h
+++ b/src/core/lib/debug/stats_data.h
@@ -160,7 +160,6 @@
 extern const int grpc_stats_histo_buckets[6];
 extern const int grpc_stats_histo_start[6];
 extern const int *const grpc_stats_histo_bucket_boundaries[6];
-extern const double *const grpc_stats_histo_bucket_boundaries[6];
 extern void (*const grpc_stats_inc_histogram[6])(grpc_exec_ctx *exec_ctx,
                                                  int x);
 
diff --git a/tools/codegen/core/gen_stats_data.py b/tools/codegen/core/gen_stats_data.py
index 857c99d..a15745c 100755
--- a/tools/codegen/core/gen_stats_data.py
+++ b/tools/codegen/core/gen_stats_data.py
@@ -130,30 +130,29 @@
     shift_data = find_ideal_shift(code_bounds[first_nontrivial:], 256 * histogram.buckets)
   #print first_nontrivial, shift_data, bounds
   #if shift_data is not None: print [hex(x >> shift_data[0]) for x in code_bounds[first_nontrivial:]]
-  code = '  union { double dbl; uint64_t uint; } _val;\n'
-  code += '_val.dbl = value;\n'
-  code += 'if (_val.dbl < 0) _val.dbl = 0;\n'
+  code = 'value = GPR_CLAMP(value, 0, %d);\n' % histogram.max
   map_table = gen_map_table(code_bounds[first_nontrivial:], shift_data)
   if first_nontrivial is None:
-    code += ('GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_%s, (int)_val.dbl);\n'
+    code += ('GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_%s, value);\n'
              % histogram.name.upper())
   else:
-    code += 'if (_val.dbl < %f) {\n' % first_nontrivial
-    code += ('GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_%s, (int)_val.dbl);\n'
+    code += 'if (value < %d) {\n' % first_nontrivial
+    code += ('GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_%s, value);\n'
              % histogram.name.upper())
-    code += '} else {'
+    code += 'return;\n'
+    code += '}'
     first_nontrivial_code = dbl2u64(first_nontrivial)
     if shift_data is not None:
       map_table_idx = decl_static_table(map_table, type_for_uint_table(map_table))
+      code += 'union { double dbl; uint64_t uint; } _val;\n'
+      code += '_val.dbl = value;\n'
       code += 'if (_val.uint < %dull) {\n' % ((map_table[-1] << shift_data[0]) + first_nontrivial_code)
       code += 'GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_%s, ' % histogram.name.upper()
       code += 'grpc_stats_table_%d[((_val.uint - %dull) >> %d)] + %d);\n' % (map_table_idx, first_nontrivial_code, shift_data[0], first_nontrivial-1)
-      code += '} else {\n'
+      code += 'return;\n'
+      code += '}\n'
     code += 'GRPC_STATS_INC_HISTOGRAM((exec_ctx), GRPC_STATS_HISTOGRAM_%s, '% histogram.name.upper()
     code += 'grpc_stats_histo_find_bucket_slow((exec_ctx), _val.dbl, grpc_stats_table_%d, %d));\n' % (bounds_idx, len(bounds))
-    if shift_data is not None:
-      code += '}'
-    code += '}'
   return (code, bounds_idx)
 
 # utility: print a big comment block into a set of files
@@ -229,7 +228,6 @@
   print >>H, "extern const int grpc_stats_histo_buckets[%d];" % len(inst_map['Histogram'])
   print >>H, "extern const int grpc_stats_histo_start[%d];" % len(inst_map['Histogram'])
   print >>H, "extern const int *const grpc_stats_histo_bucket_boundaries[%d];" % len(inst_map['Histogram'])
-  print >>H, "extern const double *const grpc_stats_histo_bucket_boundaries[%d];" % len(inst_map['Histogram'])
   print >>H, "extern void (*const grpc_stats_inc_histogram[%d])(grpc_exec_ctx *exec_ctx, int x);" % len(inst_map['Histogram'])
 
   print >>H
@@ -256,6 +254,7 @@
   print >>C, "#include \"src/core/lib/debug/stats_data.h\""
   print >>C, "#include \"src/core/lib/debug/stats.h\""
   print >>C, "#include \"src/core/lib/iomgr/exec_ctx.h\""
+  print >>C, "#include <grpc/support/useful.h>"
 
   histo_code = []
   for histogram in inst_map['Histogram']:
@@ -274,7 +273,7 @@
         tbl[0], i, len(tbl[1]), ','.join('%s' % x for x in tbl[1]))
 
   for histogram, code in zip(inst_map['Histogram'], histo_code):
-    print >>C, ("void grpc_stats_inc_%s(grpc_exec_ctx *exec_ctx, double value) {%s}") % (
+    print >>C, ("void grpc_stats_inc_%s(grpc_exec_ctx *exec_ctx, int value) {%s}") % (
                 histogram.name.lower(),
                 code)
 
@@ -284,5 +283,5 @@
       len(inst_map['Histogram']), ','.join('%s' % x for x in histo_start))
   print >>C, "const int *const grpc_stats_histo_bucket_boundaries[%d] = {%s};" % (
       len(inst_map['Histogram']), ','.join('grpc_stats_table_%d' % x for x in histo_bucket_boundaries))
-  print >>C, "void (*const grpc_stats_inc_histogram[%d])(grpc_exec_ctx *exec_ctx, double x) = {%s};" % (
+  print >>C, "void (*const grpc_stats_inc_histogram[%d])(grpc_exec_ctx *exec_ctx, int x) = {%s};" % (
       len(inst_map['Histogram']), ','.join('grpc_stats_inc_%s' % histogram.name.lower() for histogram in inst_map['Histogram']))