@@ -94,6 +94,64 @@ inline bool is_tensor_contiguous(
9494
9595} // extern "C"
9696
97+ // Utility function to convert sizes pointer to vector
98+ inline std::vector<executorch::aten::SizesType> convert_sizes_to_vector (
99+ int64_t ndim,
100+ const int64_t * sizes_ptr) {
101+ std::vector<executorch::aten::SizesType> sizes (ndim);
102+ for (int i = 0 ; i < ndim; i++) {
103+ sizes[i] = static_cast <executorch::aten::SizesType>(sizes_ptr[i]);
104+ }
105+ return sizes;
106+ }
107+
108+ // Utility function to convert strides pointer to vector or calculate from sizes
109+ inline std::vector<executorch::aten::StridesType> convert_strides_to_vector (
110+ int64_t ndim,
111+ const int64_t * sizes_ptr,
112+ const int64_t * strides_ptr) {
113+ std::vector<executorch::aten::StridesType> strides (ndim);
114+
115+ if (strides_ptr != nullptr ) {
116+ // Use provided strides.
117+ for (int64_t i = 0 ; i < ndim; i++) {
118+ strides[i] = static_cast <executorch::aten::StridesType>(strides_ptr[i]);
119+ }
120+ } else {
121+ // Calculate strides from sizes.
122+ if (ndim > 0 ) {
123+ strides[ndim - 1 ] = static_cast <executorch::aten::StridesType>(
124+ 1 ); // Last dimension has stride 1
125+ for (int64_t i = ndim - 2 ; i >= 0 ; i--) {
126+ if (sizes_ptr[i + 1 ] == 0 ) {
127+ strides[i] = strides[i + 1 ]; // Copy stride when size is 0
128+ } else {
129+ strides[i] = static_cast <executorch::aten::StridesType>(
130+ static_cast <int64_t >(strides[i + 1 ]) * sizes_ptr[i + 1 ]);
131+ }
132+ }
133+ }
134+ }
135+ return strides;
136+ }
137+
138+ // Check if tensor is in contiguous memory format (NCHW for 4D tensors)
139+ // Contiguous format means strides decrease from left to right:
140+ // For NCHW: strides = [C*H*W, H*W, W, 1]
141+ inline bool is_contiguous_tensor (
142+ std::vector<executorch::aten::SizesType>& sizes,
143+ std::vector<executorch::aten::StridesType>& strides) {
144+ int64_t ndim = static_cast <int64_t >(strides.size ());
145+ int64_t expected_stride = 1 ;
146+ for (int64_t i = ndim - 1 ; i >= 0 ; i--) {
147+ if (strides[i] != expected_stride) {
148+ return false ;
149+ }
150+ expected_stride *= sizes[i];
151+ }
152+ return true ;
153+ }
154+
97155} // namespace aoti
98156} // namespace backends
99157} // namespace executorch
0 commit comments