From 63202cd2249c9f9d6b87400df0d66c432a4e872f Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Wed, 21 Jan 2026 10:09:07 +0200 Subject: [PATCH 01/15] Fix GatherND division by zero when batch dimensions mismatch Fixes #23828 Added validation to check: - num_batches is not zero - num_slices is divisible by num_batches Before this fix, mismatched batch dimensions caused a crash due to division by zero. --- onnxruntime/core/providers/cpu/tensor/gather_nd.cc | 12 ++++++++++++ .../test/providers/cpu/tensor/gather_nd_op_test.cc | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/onnxruntime/core/providers/cpu/tensor/gather_nd.cc b/onnxruntime/core/providers/cpu/tensor/gather_nd.cc index ad3faa70ed6af..851580117bca0 100644 --- a/onnxruntime/core/providers/cpu/tensor/gather_nd.cc +++ b/onnxruntime/core/providers/cpu/tensor/gather_nd.cc @@ -66,6 +66,18 @@ Status GatherNDBase::PrepareForCompute(const TensorShape& input_shape, const Ten const auto num_slices = indices_shape.SizeToDimension(indices_shape.NumDimensions() - 1); const auto slice_size = input_shape.SizeFromDimension(SafeInt(batch_dims_) + num_slice_dims); const auto num_batches = input_shape.SizeToDimension(SafeInt(batch_dims_)); + + // Validate batch dimensions to prevent division by zero + if (num_batches == 0) { + return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, + "GatherND: input tensor batch dimensions cannot be zero"); + } + if (num_slices % num_batches != 0) { + return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, + "GatherND: indices batch size (", num_slices, + ") must be divisible by input batch size (", num_batches, ")"); + } + const auto input_batch_stride = input_shape.SizeFromDimension(SafeInt(batch_dims_)); const auto num_slices_per_batch = num_slices / num_batches; std::vector sizes_from_slice_dims(onnxruntime::narrow(num_slice_dims)); diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 081b4b484a73b..94a2e7b5cad9b 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -329,5 +329,18 @@ TEST(GatherNDOpTest, GatherND_slice_int64_t) { test.Run(); } +// Test for issue #23828: GatherND should return error instead of crashing +// when batch dimensions mismatch between input and indices +TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { + OpTester test("GatherND", 12, kOnnxDomain); + test.AddAttribute("batch_dims", 1); + // Input has 3 batches, but indices has 2 batches - mismatch! + test.AddInput("data", {3, 3}, {0.f, 1.f, 2.f, 10.f, 11.f, 12.f, 20.f, 21.f, 22.f}); + test.AddInput("indices", {2, 1}, {1, 2}); + test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used + test.Run(OpTester::ExpectResult::kExpectFailure, + "indices batch size (2) must be divisible by input batch size (3)"); +} + } // namespace test } // namespace onnxruntime From 51b36ecc54a1d0bf5f176e2da1f119d65960a997 Mon Sep 17 00:00:00 2001 From: Chaya Date: Thu, 22 Jan 2026 09:22:50 +0200 Subject: [PATCH 02/15] Update onnxruntime/core/providers/cpu/tensor/gather_nd.cc Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- onnxruntime/core/providers/cpu/tensor/gather_nd.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onnxruntime/core/providers/cpu/tensor/gather_nd.cc b/onnxruntime/core/providers/cpu/tensor/gather_nd.cc index 851580117bca0..a0a848eef0dff 100644 --- a/onnxruntime/core/providers/cpu/tensor/gather_nd.cc +++ b/onnxruntime/core/providers/cpu/tensor/gather_nd.cc @@ -75,7 +75,7 @@ Status GatherNDBase::PrepareForCompute(const TensorShape& input_shape, const Ten if (num_slices % num_batches != 0) { return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "GatherND: indices batch size (", num_slices, - ") must be divisible by input batch size (", num_batches, ")"); + ") is not divisible by input batch size (", num_batches, ")"); } const auto input_batch_stride = input_shape.SizeFromDimension(SafeInt(batch_dims_)); From 505ce313a18969d85ffa8d66b51278549aa1a923 Mon Sep 17 00:00:00 2001 From: Chaya Date: Thu, 22 Jan 2026 09:50:19 +0200 Subject: [PATCH 03/15] Update onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 94a2e7b5cad9b..d2ae7aaf548dd 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -339,7 +339,7 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.Run(OpTester::ExpectResult::kExpectFailure, - "indices batch size (2) must be divisible by input batch size (3)"); + "GatherND: indices batch size (2) is not divisible by input batch size (3)"); } } // namespace test From 28aada4033499317866bab231ab0b2945c53d857 Mon Sep 17 00:00:00 2001 From: Chaya Date: Thu, 22 Jan 2026 09:50:34 +0200 Subject: [PATCH 04/15] Update onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index d2ae7aaf548dd..a558382d279d4 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -334,7 +334,7 @@ TEST(GatherNDOpTest, GatherND_slice_int64_t) { TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { OpTester test("GatherND", 12, kOnnxDomain); test.AddAttribute("batch_dims", 1); - // Input has 3 batches, but indices has 2 batches - mismatch! + // Input has 3 batches, but indices has 2 slices (indices batch size 2), which is not divisible by 3 - mismatch! test.AddInput("data", {3, 3}, {0.f, 1.f, 2.f, 10.f, 11.f, 12.f, 20.f, 21.f, 22.f}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used From f34b5d5d7cb0a6869166016b63a1ec56a9675707 Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Thu, 22 Jan 2026 10:05:01 +0200 Subject: [PATCH 05/15] Add test for zero batch dimensions case Address Copilot review: added test case to cover the num_batches == 0 validation path. --- .../test/providers/cpu/tensor/gather_nd_op_test.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index a558382d279d4..826e1f2abad07 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -342,5 +342,17 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { "GatherND: indices batch size (2) is not divisible by input batch size (3)"); } +// Test for issue #23828: GatherND should return error when input batch dimension is zero +TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { + OpTester test("GatherND", 12, kOnnxDomain); + test.AddAttribute("batch_dims", 1); + // Input has 0 batches - should fail with clear error instead of division by zero + test.AddInput("data", {0, 3}, {}); + test.AddInput("indices", {2, 1}, {1, 2}); + test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used + test.Run(OpTester::ExpectResult::kExpectFailure, + "GatherND: input tensor batch dimensions cannot be zero"); +} + } // namespace test } // namespace onnxruntime From 787a241a6fdcdc94ee6782449975849da290dabd Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Mon, 26 Jan 2026 13:17:50 +0200 Subject: [PATCH 06/15] Restrict GatherND batch dims error tests to CPU only --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 826e1f2abad07..e3344385e7bfc 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -339,7 +339,8 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.Run(OpTester::ExpectResult::kExpectFailure, - "GatherND: indices batch size (2) is not divisible by input batch size (3)"); + "GatherND: indices batch size (2) is not divisible by input batch size (3)", + {kCudaExecutionProvider, kRocmExecutionProvider, kDmlExecutionProvider, kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -351,7 +352,8 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.Run(OpTester::ExpectResult::kExpectFailure, - "GatherND: input tensor batch dimensions cannot be zero"); + "GatherND: input tensor batch dimensions cannot be zero", + {kCudaExecutionProvider, kRocmExecutionProvider, kDmlExecutionProvider, kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); } } // namespace test From 05a8565da155e567fc5b6446ff23ea113035282c Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Tue, 27 Jan 2026 13:28:02 +0200 Subject: [PATCH 07/15] Run GatherND error tests only on CPU provider --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index e3344385e7bfc..044c24030a8b8 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -340,7 +340,7 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: indices batch size (2) is not divisible by input batch size (3)", - {kCudaExecutionProvider, kRocmExecutionProvider, kDmlExecutionProvider, kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); + {kCpuExecutionProvider}); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -353,7 +353,7 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: input tensor batch dimensions cannot be zero", - {kCudaExecutionProvider, kRocmExecutionProvider, kDmlExecutionProvider, kTensorrtExecutionProvider, kOpenVINOExecutionProvider}); + {kCpuExecutionProvider}); } } // namespace test From f44bc30427b0536ff66422be0b2d21f3833fa7f4 Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Wed, 28 Jan 2026 11:56:03 +0200 Subject: [PATCH 08/15] Fix GatherND error tests: register CPU provider explicitly using ConfigEp --- .../test/providers/cpu/tensor/gather_nd_op_test.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 044c24030a8b8..aa98f8bc3f464 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -338,9 +338,9 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.AddInput("data", {3, 3}, {0.f, 1.f, 2.f, 10.f, 11.f, 12.f, 20.f, 21.f, 22.f}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used + test.ConfigEp(DefaultCpuExecutionProvider()); test.Run(OpTester::ExpectResult::kExpectFailure, - "GatherND: indices batch size (2) is not divisible by input batch size (3)", - {kCpuExecutionProvider}); + "GatherND: indices batch size (2) is not divisible by input batch size (3)"); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -351,9 +351,9 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { test.AddInput("data", {0, 3}, {}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used + test.ConfigEp(DefaultCpuExecutionProvider()); test.Run(OpTester::ExpectResult::kExpectFailure, - "GatherND: input tensor batch dimensions cannot be zero", - {kCpuExecutionProvider}); + "GatherND: input tensor batch dimensions cannot be zero"); } } // namespace test From 2c87a2b3eb920dc74435e118b4d24758aad2ace9 Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Thu, 29 Jan 2026 12:20:33 +0200 Subject: [PATCH 09/15] Fix GatherND error tests: register CPU provider explicitly using GTEST_SKIP --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index aa98f8bc3f464..c016e90b913e0 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -339,6 +339,9 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.ConfigEp(DefaultCpuExecutionProvider()); + if (!DefaultCpuExecutionProvider()) { + GTEST_SKIP() << "Test only valid for CPU EP"; + } test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: indices batch size (2) is not divisible by input batch size (3)"); } @@ -352,6 +355,9 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used test.ConfigEp(DefaultCpuExecutionProvider()); + if (!DefaultCpuExecutionProvider()) { + GTEST_SKIP() << "Test only valid for CPU EP"; + } test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: input tensor batch dimensions cannot be zero"); } From c6f9ee095fddced4768f906ce6427b1bd9453e3c Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Wed, 4 Feb 2026 13:27:24 +0200 Subject: [PATCH 10/15] Fix GatherND error tests: exclude non-CPU providers from validation tests (Issue #23828) --- .../providers/cpu/tensor/gather_nd_op_test.cc | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index c016e90b913e0..46fb5900aa3e6 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -338,12 +338,12 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.AddInput("data", {3, 3}, {0.f, 1.f, 2.f, 10.f, 11.f, 12.f, 20.f, 21.f, 22.f}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used - test.ConfigEp(DefaultCpuExecutionProvider()); - if (!DefaultCpuExecutionProvider()) { - GTEST_SKIP() << "Test only valid for CPU EP"; - } + // Run only on CPU provider since validation logic is CPU-specific test.Run(OpTester::ExpectResult::kExpectFailure, - "GatherND: indices batch size (2) is not divisible by input batch size (3)"); + "GatherND: indices batch size (2) is not divisible by input batch size (3)", + std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, + kOpenVINOExecutionProvider, kTensorrtExecutionProvider, + kQnnExecutionProvider, kDmlExecutionProvider})); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -354,12 +354,12 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { test.AddInput("data", {0, 3}, {}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used - test.ConfigEp(DefaultCpuExecutionProvider()); - if (!DefaultCpuExecutionProvider()) { - GTEST_SKIP() << "Test only valid for CPU EP"; - } + // Run only on CPU provider since validation logic is CPU-specific test.Run(OpTester::ExpectResult::kExpectFailure, - "GatherND: input tensor batch dimensions cannot be zero"); + "GatherND: input tensor batch dimensions cannot be zero", + std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, + kOpenVINOExecutionProvider, kTensorrtExecutionProvider, + kQnnExecutionProvider, kDmlExecutionProvider})); } } // namespace test From e779e63deba35291f1406abf76c19241d596765d Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Tue, 10 Feb 2026 09:34:43 +0200 Subject: [PATCH 11/15] Fix GatherND tests: adjust formatting for error message sets --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 46fb5900aa3e6..08a6e9039fce6 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -343,7 +343,8 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { "GatherND: indices batch size (2) is not divisible by input batch size (3)", std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider})); + kQnnExecutionProvider, kDmlExecutionProvider + })); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -359,7 +360,8 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { "GatherND: input tensor batch dimensions cannot be zero", std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider})); + kQnnExecutionProvider, kDmlExecutionProvider + })); } } // namespace test From 072f8d0df2bc4352530e0ae71b93ee9e560bf299 Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Tue, 10 Feb 2026 10:27:32 +0200 Subject: [PATCH 12/15] Fix code formatting with clang-format --- .../test/providers/cpu/tensor/gather_nd_op_test.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 08a6e9039fce6..1b3e3e649cf97 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -342,9 +342,8 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: indices batch size (2) is not divisible by input batch size (3)", std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, - kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider - })); + kOpenVINOExecutionProvider, kTensorrtExecutionProvider, + kQnnExecutionProvider, kDmlExecutionProvider})); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -359,9 +358,8 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: input tensor batch dimensions cannot be zero", std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, - kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider - })); + kOpenVINOExecutionProvider, kTensorrtExecutionProvider, + kQnnExecutionProvider, kDmlExecutionProvider})); } } // namespace test From 213b094d3a3f15cf942bbc33fb883c7153a3ba46 Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Tue, 10 Feb 2026 19:57:17 +0200 Subject: [PATCH 13/15] Add WebGPU provider to GatherND error tests for batch dimension checks --- onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 1b3e3e649cf97..6ea6e235994de 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -343,7 +343,8 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { "GatherND: indices batch size (2) is not divisible by input batch size (3)", std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider})); + kQnnExecutionProvider, kDmlExecutionProvider, + kWebGpuExecutionProvider})); } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -359,7 +360,8 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { "GatherND: input tensor batch dimensions cannot be zero", std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider})); + kQnnExecutionProvider, kDmlExecutionProvider, + kWebGpuExecutionProvider})); } } // namespace test From eb6d6c97267cc3a71e03bda4f136ea74ee2dac4b Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Sun, 15 Feb 2026 11:07:29 +0200 Subject: [PATCH 14/15] Fix GatherND tests to handle division by zero errors and enforce CPU execution --- .../providers/cpu/tensor/gather_nd_op_test.cc | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 6ea6e235994de..06ed1a3ebba5b 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -334,35 +334,44 @@ TEST(GatherNDOpTest, GatherND_slice_int64_t) { TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { OpTester test("GatherND", 12, kOnnxDomain); test.AddAttribute("batch_dims", 1); + // Input has 3 batches, but indices has 2 slices (indices batch size 2), which is not divisible by 3 - mismatch! test.AddInput("data", {3, 3}, {0.f, 1.f, 2.f, 10.f, 11.f, 12.f, 20.f, 21.f, 22.f}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used - // Run only on CPU provider since validation logic is CPU-specific + + // Force execution only on CPU + std::vector> cpu_only_ep; + cpu_only_ep.push_back(DefaultCpuExecutionProvider()); + test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: indices batch size (2) is not divisible by input batch size (3)", - std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, - kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider, - kWebGpuExecutionProvider})); + {}, // no excluded providers needed + nullptr, // no RunOptions + &cpu_only_ep); // force CPU } // Test for issue #23828: GatherND should return error when input batch dimension is zero TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { OpTester test("GatherND", 12, kOnnxDomain); test.AddAttribute("batch_dims", 1); + // Input has 0 batches - should fail with clear error instead of division by zero test.AddInput("data", {0, 3}, {}); test.AddInput("indices", {2, 1}, {1, 2}); test.AddOutput("output", {2}, {0.f, 0.f}); // dummy output, won't be used - // Run only on CPU provider since validation logic is CPU-specific + + // Force execution only on CPU + std::vector> cpu_only_ep; + cpu_only_ep.push_back(DefaultCpuExecutionProvider()); + test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: input tensor batch dimensions cannot be zero", - std::unordered_set({kCudaExecutionProvider, kDnnlExecutionProvider, - kOpenVINOExecutionProvider, kTensorrtExecutionProvider, - kQnnExecutionProvider, kDmlExecutionProvider, - kWebGpuExecutionProvider})); + {}, + nullptr, + &cpu_only_ep); // force CPU } + } // namespace test } // namespace onnxruntime From 179017992cbd99b799663122a7a8a3ced083a5dd Mon Sep 17 00:00:00 2001 From: chaya2350 Date: Tue, 17 Feb 2026 09:43:17 +0200 Subject: [PATCH 15/15] Fix formatting in GatherND tests for consistency --- .../test/providers/cpu/tensor/gather_nd_op_test.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc index 06ed1a3ebba5b..a8f3b99b2b3d3 100644 --- a/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/gather_nd_op_test.cc @@ -346,9 +346,9 @@ TEST(GatherNDOpTest, GatherND_batch_dims_mismatch_error) { test.Run(OpTester::ExpectResult::kExpectFailure, "GatherND: indices batch size (2) is not divisible by input batch size (3)", - {}, // no excluded providers needed - nullptr, // no RunOptions - &cpu_only_ep); // force CPU + {}, // no excluded providers needed + nullptr, // no RunOptions + &cpu_only_ep); // force CPU } // Test for issue #23828: GatherND should return error when input batch dimension is zero @@ -369,9 +369,8 @@ TEST(GatherNDOpTest, GatherND_zero_batch_dims_error) { "GatherND: input tensor batch dimensions cannot be zero", {}, nullptr, - &cpu_only_ep); // force CPU + &cpu_only_ep); // force CPU } - } // namespace test } // namespace onnxruntime