From 35bb44253d38bd4c62fdc76aba4f5e78f566a6c0 Mon Sep 17 00:00:00 2001 From: Nenad Banfic Date: Wed, 29 Jul 2026 23:57:43 +0000 Subject: [PATCH 1/7] Split tensor fix --- .../core/providers/cpu/tensor/split.cc | 2 + .../providers/cpu/tensor/split_op_test.cc | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/onnxruntime/core/providers/cpu/tensor/split.cc b/onnxruntime/core/providers/cpu/tensor/split.cc index 7f50f3cea0e80..92911103280e7 100644 --- a/onnxruntime/core/providers/cpu/tensor/split.cc +++ b/onnxruntime/core/providers/cpu/tensor/split.cc @@ -79,6 +79,8 @@ Status SplitImpl::Compute(OpKernelContext* context) const { auto nDims = static_cast(split_tensor->Shape()[0]); const auto* data = split_tensor->Data(); split_sizes.assign(data, data + nDims); + ORT_RETURN_IF(std::any_of(split_sizes.cbegin(), split_sizes.cend(), [](int64_t v) { return v < 0; }), + "Invalid value in 'split' input. All values must be >= 0."); } else { split_sizes.assign(split_sizes_.begin(), split_sizes_.end()); } diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index 8db1c4d1fef2e..e8a8e35991a15 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -910,5 +910,59 @@ TEST(SplitOperatorTest, Split3Inner) { do_test(splits); } + +TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_Axis0) { + constexpr int64_t axis = 0; + ShapeAndFloatData input = {{6, 2}, + {1.f, 2.f, + 3.f, 4.f, + 5.f, 6.f, + 7.f, 8.f, + 9.f, 10.f, + 11.f, 12.f}}; + + // Sum equals the axis dim (8 + -2 == 6) and the count equals the number of outputs, so the existing + // count/sum guards do not trigger; only the per-value check can catch this case. + std::vector splits{8, -2}; + + std::vector outputs; + outputs.push_back({{1, 2}, {0.f, 0.f}}); + outputs.push_back({{1, 2}, {0.f, 0.f}}); + + const std::unordered_set excluded_providers{ + kTensorrtExecutionProvider, + kQnnExecutionProvider, + kCoreMLExecutionProvider, + kDmlExecutionProvider, + }; + RunTest(axis, splits, input, outputs, excluded_providers, + true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, + "Invalid value in 'split' input. All values must be >= 0."); +} + +TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_NegativeAxis) { + constexpr int64_t axis = -1; + ShapeAndFloatData input = {{2, 4}, + {1.f, 2.f, 3.f, 4.f, + 5.f, 6.f, 7.f, 8.f}}; + + // Negative entry in the leading position; sum still matches the split-axis dim (-1 + 5 == 4). + std::vector splits{-1, 5}; + + std::vector outputs; + outputs.push_back({{2, 1}, {0.f, 0.f}}); + outputs.push_back({{2, 1}, {0.f, 0.f}}); + + const std::unordered_set excluded_providers{ + kTensorrtExecutionProvider, + kQnnExecutionProvider, + kCoreMLExecutionProvider, + kDmlExecutionProvider, + }; + RunTest(axis, splits, input, outputs, excluded_providers, + true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, + "Invalid value in 'split' input. All values must be >= 0."); +} + } // namespace test } // namespace onnxruntime From 9982249a0977ee71ff65e61b84e22d966187cd50 Mon Sep 17 00:00:00 2001 From: Nenad Banfic <46795300+nenad1002@users.noreply.github.com> Date: Thu, 30 Jul 2026 07:25:33 -0700 Subject: [PATCH 2/7] Update onnxruntime/test/providers/cpu/tensor/split_op_test.cc Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- onnxruntime/test/providers/cpu/tensor/split_op_test.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index e8a8e35991a15..cd51846c79856 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -910,7 +910,6 @@ TEST(SplitOperatorTest, Split3Inner) { do_test(splits); } - TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_Axis0) { constexpr int64_t axis = 0; ShapeAndFloatData input = {{6, 2}, From 926c9074c5c50a77aaef450046f903acad26319b Mon Sep 17 00:00:00 2001 From: Nenad Banfic Date: Thu, 30 Jul 2026 15:18:39 +0000 Subject: [PATCH 3/7] Exclude openvino --- onnxruntime/test/providers/cpu/tensor/split_op_test.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index cd51846c79856..eab3c20b15e20 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -933,6 +933,7 @@ TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_Axis0) { kQnnExecutionProvider, kCoreMLExecutionProvider, kDmlExecutionProvider, + kOpenVINOExecutionProvider, }; RunTest(axis, splits, input, outputs, excluded_providers, true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, @@ -957,6 +958,7 @@ TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_NegativeAxis) { kQnnExecutionProvider, kCoreMLExecutionProvider, kDmlExecutionProvider, + kOpenVINOExecutionProvider, }; RunTest(axis, splits, input, outputs, excluded_providers, true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, From 8a16b7a1bb111e6276e75220081f4478473f6928 Mon Sep 17 00:00:00 2001 From: Nenad Banfic Date: Thu, 30 Jul 2026 18:27:24 +0000 Subject: [PATCH 4/7] Exclude WebGPU EP from negative-split validation tests --- onnxruntime/test/providers/cpu/tensor/split_op_test.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index eab3c20b15e20..8abf888bddd2e 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -934,6 +934,7 @@ TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_Axis0) { kCoreMLExecutionProvider, kDmlExecutionProvider, kOpenVINOExecutionProvider, + kWebGpuExecutionProvider, }; RunTest(axis, splits, input, outputs, excluded_providers, true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, @@ -959,6 +960,7 @@ TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_NegativeAxis) { kCoreMLExecutionProvider, kDmlExecutionProvider, kOpenVINOExecutionProvider, + kWebGpuExecutionProvider, }; RunTest(axis, splits, input, outputs, excluded_providers, true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, From 68e45c4793f88d72b4d7716e2818068d1b8939bd Mon Sep 17 00:00:00 2001 From: Nenad Banfic Date: Thu, 30 Jul 2026 21:42:50 +0000 Subject: [PATCH 5/7] Fix unsupported arch --- onnxruntime/test/providers/cpu/tensor/split_op_test.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index 8abf888bddd2e..af9ea9c1221ce 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -930,11 +930,16 @@ TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_Axis0) { const std::unordered_set excluded_providers{ kTensorrtExecutionProvider, + kCudaExecutionProvider, + kMIGraphXExecutionProvider, kQnnExecutionProvider, kCoreMLExecutionProvider, kDmlExecutionProvider, kOpenVINOExecutionProvider, kWebGpuExecutionProvider, + kNnapiExecutionProvider, + kXnnpackExecutionProvider, + kAclExecutionProvider, }; RunTest(axis, splits, input, outputs, excluded_providers, true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, @@ -956,11 +961,16 @@ TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_NegativeAxis) { const std::unordered_set excluded_providers{ kTensorrtExecutionProvider, + kCudaExecutionProvider, + kMIGraphXExecutionProvider, kQnnExecutionProvider, kCoreMLExecutionProvider, kDmlExecutionProvider, kOpenVINOExecutionProvider, kWebGpuExecutionProvider, + kNnapiExecutionProvider, + kXnnpackExecutionProvider, + kAclExecutionProvider, }; RunTest(axis, splits, input, outputs, excluded_providers, true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, From 9860aee03392090e719978fb652dad1b8210f427 Mon Sep 17 00:00:00 2001 From: Nenad Banfic Date: Fri, 31 Jul 2026 11:48:27 +0000 Subject: [PATCH 6/7] Force CPU only test --- .../providers/cpu/tensor/split_op_test.cc | 89 +++++++------------ 1 file changed, 30 insertions(+), 59 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index af9ea9c1221ce..857567e1ab15a 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -911,70 +911,41 @@ TEST(SplitOperatorTest, Split3Inner) { } TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_Axis0) { - constexpr int64_t axis = 0; - ShapeAndFloatData input = {{6, 2}, - {1.f, 2.f, - 3.f, 4.f, - 5.f, 6.f, - 7.f, 8.f, - 9.f, 10.f, - 11.f, 12.f}}; - - // Sum equals the axis dim (8 + -2 == 6) and the count equals the number of outputs, so the existing + // Force CPU-only execution: the negative-value guard lives in the CPU Split kernel + // Other EPs (CUDA, TensorRT, etc.) have their own Split implementations + // that either fail with a different error or hit the framework's negative-shape check + // downstream. + OpTester test("Split", 13, onnxruntime::kOnnxDomain); + test.AddAttribute("axis", 0); + test.AddInput("input", {6, 2}, {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f}); + // Sum equals axis dim (8 + -2 == 6) and count matches num outputs, so existing // count/sum guards do not trigger; only the per-value check can catch this case. - std::vector splits{8, -2}; + test.AddInput("split", {2}, {8, -2}, /*is_initializer=*/false); + test.AddOutput("output0", {1, 2}, {0.f, 0.f}); + test.AddOutput("output1", {1, 2}, {0.f, 0.f}); - std::vector outputs; - outputs.push_back({{1, 2}, {0.f, 0.f}}); - outputs.push_back({{1, 2}, {0.f, 0.f}}); - - const std::unordered_set excluded_providers{ - kTensorrtExecutionProvider, - kCudaExecutionProvider, - kMIGraphXExecutionProvider, - kQnnExecutionProvider, - kCoreMLExecutionProvider, - kDmlExecutionProvider, - kOpenVINOExecutionProvider, - kWebGpuExecutionProvider, - kNnapiExecutionProvider, - kXnnpackExecutionProvider, - kAclExecutionProvider, - }; - RunTest(axis, splits, input, outputs, excluded_providers, - true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, - "Invalid value in 'split' input. All values must be >= 0."); + std::vector> execution_providers; + execution_providers.push_back(DefaultCpuExecutionProvider()); + test.Run(OpTester::ExpectResult::kExpectFailure, + "Invalid value in 'split' input. All values must be >= 0.", + {}, nullptr, &execution_providers); } TEST(SplitOperatorTest, InvalidValueInSplitInput_NegativeEntry_NegativeAxis) { - constexpr int64_t axis = -1; - ShapeAndFloatData input = {{2, 4}, - {1.f, 2.f, 3.f, 4.f, - 5.f, 6.f, 7.f, 8.f}}; - - // Negative entry in the leading position; sum still matches the split-axis dim (-1 + 5 == 4). - std::vector splits{-1, 5}; - - std::vector outputs; - outputs.push_back({{2, 1}, {0.f, 0.f}}); - outputs.push_back({{2, 1}, {0.f, 0.f}}); - - const std::unordered_set excluded_providers{ - kTensorrtExecutionProvider, - kCudaExecutionProvider, - kMIGraphXExecutionProvider, - kQnnExecutionProvider, - kCoreMLExecutionProvider, - kDmlExecutionProvider, - kOpenVINOExecutionProvider, - kWebGpuExecutionProvider, - kNnapiExecutionProvider, - kXnnpackExecutionProvider, - kAclExecutionProvider, - }; - RunTest(axis, splits, input, outputs, excluded_providers, - true /*expect_failure*/, true /*split_as_input*/, -1 /*num_outputs*/, false /*is_initializer*/, - "Invalid value in 'split' input. All values must be >= 0."); + // Same reason as above: force CPU-only. Negative entry in the leading position; + // sum still matches the split-axis dim (-1 + 5 == 4). + OpTester test("Split", 13, onnxruntime::kOnnxDomain); + test.AddAttribute("axis", -1); + test.AddInput("input", {2, 4}, {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f}); + test.AddInput("split", {2}, {-1, 5}, /*is_initializer=*/false); + test.AddOutput("output0", {2, 1}, {0.f, 0.f}); + test.AddOutput("output1", {2, 1}, {0.f, 0.f}); + + std::vector> execution_providers; + execution_providers.push_back(DefaultCpuExecutionProvider()); + test.Run(OpTester::ExpectResult::kExpectFailure, + "Invalid value in 'split' input. All values must be >= 0.", + {}, nullptr, &execution_providers); } } // namespace test From 3164665a66b78b249058c6a366eb68fe0bd580de Mon Sep 17 00:00:00 2001 From: Nenad Banfic Date: Fri, 31 Jul 2026 12:18:28 +0000 Subject: [PATCH 7/7] Force CPU only test --- onnxruntime/test/providers/cpu/tensor/split_op_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc index 857567e1ab15a..bb0a945612188 100644 --- a/onnxruntime/test/providers/cpu/tensor/split_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/split_op_test.cc @@ -5,6 +5,7 @@ #include "core/framework/to_tensor_proto_element_type.h" #include "test/providers/provider_test_utils.h" #include "test/common/tensor_op_test_utils.h" +#include "test/util/include/default_providers.h" namespace onnxruntime { namespace test {