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;
   }
 
   /*!

Reply via email to