diff --git a/arbor/fvm_layout.cpp b/arbor/fvm_layout.cpp
index 9ca781a205f3cb02173207b517f4c53aa84eecd6..1d5415c7d9297d3c134b3910c63489e90e3b5886 100644
--- a/arbor/fvm_layout.cpp
+++ b/arbor/fvm_layout.cpp
@@ -351,9 +351,10 @@ fvm_cv_discretization fvm_cv_discretize(const cable_cell& cell, const cable_cell
     const auto& dflt = cell.default_parameters;
     fvm_cv_discretization D;
 
-    cv_policy pol = (dflt.discretization | global_dflt.discretization).value_or(default_cv_policy());
-    locset cv_ends = pol.cv_boundary_points(cell);
-    D.geometry = cv_geometry_from_ends(cell, cv_ends);
+    D.geometry = cv_geometry_from_ends(cell,
+        dflt.discretization? dflt.discretization->cv_boundary_points(cell):
+        global_dflt.discretization? global_dflt.discretization->cv_boundary_points(cell):
+        default_cv_policy().cv_boundary_points(cell));
 
     if (D.geometry.empty()) return D;
 
diff --git a/test/ubench/fvm_discretize.cpp b/test/ubench/fvm_discretize.cpp
index 42a39b05c3f8fb9744590ceef0f3b2c0baa57667..0c8263730e544d59793cc18f6ad0d9e639f6bc69 100644
--- a/test/ubench/fvm_discretize.cpp
+++ b/test/ubench/fvm_discretize.cpp
@@ -50,6 +50,19 @@ void run_cv_geom_every_sample(benchmark::State& state) {
     }
 }
 
+void run_cv_geom_explicit(benchmark::State& state) {
+    auto gdflt = neuron_parameter_defaults;
+
+    cable_cell c(from_swc(SWCFILE));
+
+    while (state.KeepRunning()) {
+        auto ends = cv_policy_every_sample().cv_boundary_points(c);
+        auto ends2 = cv_policy_explicit(std::move(ends)).cv_boundary_points(c);
+
+        benchmark::DoNotOptimize(cv_geometry_from_ends(c, ends2));
+    }
+}
+
 void run_discretize(benchmark::State& state) {
     auto gdflt = neuron_parameter_defaults;
     const std::size_t ncv_per_branch = state.range(0);
@@ -73,10 +86,26 @@ void run_discretize_every_sample(benchmark::State& state) {
     }
 }
 
+void run_discretize_explicit(benchmark::State& state) {
+    auto gdflt = neuron_parameter_defaults;
+
+    cable_cell c(from_swc(SWCFILE));
+
+    while (state.KeepRunning()) {
+        auto ends = cv_policy_every_sample().cv_boundary_points(c);
+        c.default_parameters.discretization = cv_policy_explicit(std::move(ends));
+
+        benchmark::DoNotOptimize(fvm_cv_discretize(c, gdflt));
+    }
+}
+
 BENCHMARK(run_cv_geom)->RangeMultiplier(2)->Range(1,32)->Unit(benchmark::kMicrosecond);
 BENCHMARK(run_discretize)->RangeMultiplier(2)->Range(1,32)->Unit(benchmark::kMicrosecond);
 
 BENCHMARK(run_cv_geom_every_sample)->Unit(benchmark::kMillisecond);
 BENCHMARK(run_discretize_every_sample)->Unit(benchmark::kMillisecond);
 
+BENCHMARK(run_cv_geom_explicit)->Unit(benchmark::kMillisecond);
+BENCHMARK(run_discretize_explicit)->Unit(benchmark::kMillisecond);
+
 BENCHMARK_MAIN();