This is an automated email from the ASF dual-hosted git repository. tqchen pushed a commit to branch codex/tvm-ffi-as-inline-predict-false in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git
commit 46d2c1b2c68decc9ebdf166d0abcd6c42060e87c Author: tqchen <[email protected]> AuthorDate: Sat Jun 20 21:39:00 2026 +0000 tvm-ffi: streamline as and object downcast paths --- include/tvm/ffi/any.h | 45 ++++++++++++++++++--------------------------- include/tvm/ffi/object.h | 11 ++++++----- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/include/tvm/ffi/any.h b/include/tvm/ffi/any.h index 9d7ccee5..4d59ea56 100644 --- a/include/tvm/ffi/any.h +++ b/include/tvm/ffi/any.h @@ -115,11 +115,8 @@ class AnyView { */ template <typename T, typename = std::enable_if_t<TypeTraits<T>::convert_enabled>> TVM_FFI_INLINE std::optional<T> as() const { - if (TypeTraits<T>::CheckAnyStrict(&data_)) { - return TypeTraits<T>::CopyFromAnyViewAfterCheck(&data_); - } else { - return std::optional<T>(std::nullopt); - } + if (TypeTraits<T>::CheckAnyStrict(&data_)) return TypeTraits<T>::CopyFromAnyViewAfterCheck(&data_); + return std::nullopt; } /*! * \brief Shortcut of as Object to cast to a const pointer when T is an Object. @@ -141,7 +138,7 @@ class AnyView { template <typename T, typename = std::enable_if_t<TypeTraits<T>::convert_enabled>> TVM_FFI_INLINE T cast() const { std::optional<T> opt = TypeTraits<T>::TryCastFromAnyView(&data_); - if (!opt.has_value()) { + if (TVM_FFI_PREDICT_FALSE(!opt.has_value())) { TVM_FFI_THROW(TypeError) << "Cannot convert from type `" << TypeTraits<T>::GetMismatchTypeInfo(&data_) << "` to `" << TypeTraits<T>::TypeStr() << "`"; @@ -353,11 +350,8 @@ class Any { if constexpr (std::is_same_v<T, Any>) { return std::move(*this); } else { - if (TypeTraits<T>::CheckAnyStrict(&data_)) { - return TypeTraits<T>::MoveFromAnyAfterCheck(&data_); - } else { - return std::optional<T>(std::nullopt); - } + if (TypeTraits<T>::CheckAnyStrict(&data_)) return TypeTraits<T>::MoveFromAnyAfterCheck(&data_); + return std::nullopt; } } @@ -374,11 +368,8 @@ class Any { if constexpr (std::is_same_v<T, Any>) { return *this; } else { - if (TypeTraits<T>::CheckAnyStrict(&data_)) { - return TypeTraits<T>::CopyFromAnyViewAfterCheck(&data_); - } else { - return std::optional<T>(std::nullopt); - } + if (TypeTraits<T>::CheckAnyStrict(&data_)) return TypeTraits<T>::CopyFromAnyViewAfterCheck(&data_); + return std::nullopt; } } @@ -401,7 +392,7 @@ class Any { template <typename T, typename = std::enable_if_t<TypeTraits<T>::convert_enabled>> TVM_FFI_INLINE T cast() const& { std::optional<T> opt = TypeTraits<T>::TryCastFromAnyView(&data_); - if (!opt.has_value()) { + if (TVM_FFI_PREDICT_FALSE(!opt.has_value())) { TVM_FFI_THROW(TypeError) << "Cannot convert from type `" << TypeTraits<T>::GetMismatchTypeInfo(&data_) << "` to `" << TypeTraits<T>::TypeStr() << "`"; @@ -416,17 +407,17 @@ class Any { */ template <typename T, typename = std::enable_if_t<TypeTraits<T>::storage_enabled>> TVM_FFI_INLINE T cast() && { - if (TypeTraits<T>::CheckAnyStrict(&data_)) { - return TypeTraits<T>::MoveFromAnyAfterCheck(&data_); - } - // slow path, try to do fallback convert - std::optional<T> opt = TypeTraits<T>::TryCastFromAnyView(&data_); - if (!opt.has_value()) { - TVM_FFI_THROW(TypeError) << "Cannot convert from type `" - << TypeTraits<T>::GetMismatchTypeInfo(&data_) << "` to `" - << TypeTraits<T>::TypeStr() << "`"; + if (TVM_FFI_PREDICT_FALSE(!TypeTraits<T>::CheckAnyStrict(&data_))) { + // slow path, try to do fallback convert + std::optional<T> opt = TypeTraits<T>::TryCastFromAnyView(&data_); + if (TVM_FFI_PREDICT_FALSE(!opt.has_value())) { + TVM_FFI_THROW(TypeError) << "Cannot convert from type `" + << TypeTraits<T>::GetMismatchTypeInfo(&data_) << "` to `" + << TypeTraits<T>::TypeStr() << "`"; + } + return *std::move(opt); } - return *std::move(opt); + return TypeTraits<T>::MoveFromAnyAfterCheck(&data_); } /** diff --git a/include/tvm/ffi/object.h b/include/tvm/ffi/object.h index 9b22636b..9c663182 100644 --- a/include/tvm/ffi/object.h +++ b/include/tvm/ffi/object.h @@ -826,12 +826,13 @@ class ObjectRef { * \return The pointer to the requested type. */ template <typename ObjectType, typename = std::enable_if_t<std::is_base_of_v<Object, ObjectType>>> - const ObjectType* as() const { - if (data_ != nullptr && data_->IsInstance<ObjectType>()) { - return static_cast<ObjectType*>(data_.get()); - } else { - return nullptr; + TVM_FFI_INLINE const ObjectType* as() const { + if (data_ != nullptr) { + if (data_->IsInstance<ObjectType>()) { + return static_cast<ObjectType*>(data_.get()); + } } + return nullptr; } /*!
