diff --git a/include/diy/detail/algorithms/kdtree.hpp b/include/diy/detail/algorithms/kdtree.hpp
index 733dcbbabd4fed082d843bdfb8f3267f2d887a87..2a46c400100904bec841f12d35f5465050df8b67 100644
--- a/include/diy/detail/algorithms/kdtree.hpp
+++ b/include/diy/detail/algorithms/kdtree.hpp
@@ -445,15 +445,18 @@ enqueue_exchange(Block* b, const diy::ReduceProxy& srp, int dim, const Histogram
     size_t cur   = 0;
     float  width = (link->core().max[dim] - link->core().min[dim])/bins_;
     float  split = 0;
-    for (size_t i = 0; i < histogram.size(); ++i)
+    size_t i = 0;
+    for (; i < histogram.size(); ++i)
     {
         if (cur + histogram[i] > total/2)
-        {
-            split = link->core().min[dim] + width*i;
             break;
-        }
         cur += histogram[i];
     }
+    if (i == 0)
+        ++i;
+    else if (i >= histogram.size() - 1)
+        i = histogram.size() - 2;
+    split = link->core().min[dim] + width*i;
     log->trace("Found split: {} (dim={}) in {} - {}", split, dim, link->core().min[dim], link->core().max[dim]);
 
     // subset and enqueue