message: special case for coherent function calls
diff: @@ -138,10 +138,16 @@ template <typename Storage_> struct call_support_base {
  } else {
  Storage instance = self & mask;
  cuda_var_set_comment(instance.index(), "instance");
  + auto partitioned = partition(instance);
  - for (auto [value, perm] : partition(instance)) {
  + if (partitioned.size() == 1 && partitioned[0].first != nullptr) {
  + result = func(partitioned[0].first, true,
  + std::get<Indices>(tuple)...);
  + } else {
  + for (auto [value, perm] : partitioned) {
  if (value == nullptr)
  continue;
  +
  cuda_var_set_comment(perm.index(), "perm");
  Result temp = func(value, true,
  @@ -151,6 +157,7 @@ template <typename Storage_> struct call_support_base {
  scatter(result, temp, perm);
  }
  }
  + }
  return result;
  } else {
  @@ -164,12 +171,18 @@ template <typename Storage_> struct call_support_base {
  } else {
  Storage instance = self & mask;
  cuda_var_set_comment(instance.index(), "instance");
  + auto partitioned = partition(instance);
  + if (partitioned.size() == 1 && partitioned[0].first != nullptr) {
  + func(partitioned[0].first, true,
  + std::get<Indices>(tuple)...);
  + } else {
  for (auto [value, perm] : partition(instance)) {
  if (value == nullptr)
  continue;
  cuda_var_set_comment(perm.index(), "perm");
  +
  func(value, true,
  gather<std::decay_t<std::tuple_element_t<Indices, Tuple>>>(
  std::get<Indices>(tuple), perm)...);
  @@ -177,6 +190,7 @@ template <typename Storage_> struct call_support_base {
  }
  }
  }
  + }
  };
  #if defined(__GNUC__)
  