1 /*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 * All rights reserved.
4 *
5 * This source code is licensed under the BSD-style license found in the
6 * LICENSE file in the root directory of this source tree.
7 */
8
9 #include <executorch/backends/xnnpack/runtime/XNNExecutor.h>
10 #include <executorch/runtime/core/exec_aten/testing_util/tensor_factory.h>
11 #include <gtest/gtest.h>
12 #include <xnnpack.h>
13
14 using executorch::backends::xnnpack::delegate::XNNExecutor;
15 using executorch::runtime::Error;
16 using executorch::runtime::EValue;
17 using executorch::runtime::testing::TensorFactory;
18
TEST(XNNExecutorTest,ArgumentWithTooManyDimensions)19 TEST(XNNExecutorTest, ArgumentWithTooManyDimensions) {
20 XNNExecutor executor;
21 xnn_subgraph_t subgraph = nullptr;
22 xnn_runtime_t rt = nullptr;
23 et_pal_init();
24 ASSERT_EQ(xnn_initialize(nullptr), xnn_status_success);
25 ASSERT_EQ(xnn_create_subgraph(2, 0, &subgraph), xnn_status_success);
26 std::unique_ptr<xnn_subgraph, decltype(&xnn_delete_subgraph)> auto_subgraph(
27 subgraph, xnn_delete_subgraph);
28
29 auto input_id = XNN_INVALID_VALUE_ID;
30 std::vector<size_t> dims = {
31 1,
32 };
33 ASSERT_EQ(
34 xnn_status_success,
35 xnn_define_quantized_tensor_value(
36 subgraph,
37 xnn_datatype_qint8,
38 0,
39 1,
40 dims.size(),
41 dims.data(),
42 nullptr,
43 /*external_id=*/0,
44 /*flags=*/XNN_VALUE_FLAG_EXTERNAL_INPUT,
45 &input_id));
46 ASSERT_NE(input_id, XNN_INVALID_VALUE_ID);
47
48 auto output_id = XNN_INVALID_VALUE_ID;
49 ASSERT_EQ(
50 xnn_status_success,
51 xnn_define_quantized_tensor_value(
52 subgraph,
53 xnn_datatype_qint8,
54 0,
55 1,
56 dims.size(),
57 dims.data(),
58 nullptr,
59 /*external_id=*/0,
60 /*flags=*/XNN_VALUE_FLAG_EXTERNAL_OUTPUT,
61 &output_id));
62 ASSERT_NE(output_id, XNN_INVALID_VALUE_ID);
63
64 ASSERT_EQ(
65 xnn_status_success,
66 xnn_define_clamp(subgraph, 1, 2, input_id, output_id, 0));
67
68 ASSERT_EQ(xnn_create_runtime(subgraph, &rt), xnn_status_success);
69 EXPECT_EQ(
70 executor.initialize(
71 rt,
72 {
73 0,
74 },
75 {
76 1,
77 }),
78 Error::Ok);
79 TensorFactory<executorch::aten::ScalarType::Int> tf;
80 auto input_tensor = tf.make({1, 1, 1, 1, 1, 1, 1, 1, 1}, {42});
81 ASSERT_EQ(input_tensor.dim(), 9);
82 auto output_tensor = tf.make(
83 {
84 1,
85 },
86 {
87 1,
88 });
89 EValue input_ev(input_tensor);
90 EValue output_ev(output_tensor);
91 std::array<EValue*, 2> args = {&input_ev, &output_ev};
92 // Check for invalid number of dimensions should fail without stack overflow.
93 EXPECT_EQ(executor.prepare_args(args.data()), Error::InvalidArgument);
94 }
95