From 1136f56af215477f2e6d877b15a6a09c443f68c6 Mon Sep 17 00:00:00 2001 From: Mateusz Bencer Date: Wed, 19 Mar 2025 17:23:19 +0100 Subject: [PATCH 1/2] [luci] Add additional check of unknown dimension for Reshape This commit adds checking of number of remaining elements in order to confirm if it matches expected output shape. ONE-DCO-1.0-Signed-off-by: Mateusz Bencer --- .../luci/service/src/Nodes/CircleReshape.cpp | 4 +++ .../service/src/Nodes/CircleReshape.test.cpp | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/compiler/luci/service/src/Nodes/CircleReshape.cpp b/compiler/luci/service/src/Nodes/CircleReshape.cpp index 3213213e34c..df14ad59866 100644 --- a/compiler/luci/service/src/Nodes/CircleReshape.cpp +++ b/compiler/luci/service/src/Nodes/CircleReshape.cpp @@ -210,6 +210,10 @@ loco::TensorShape Algorithm::visit(const luci::CircleReshape *node) } if (unknown_dim_index != UINT32_MAX) { + if (input_element_count % output_element_count != 0) + { + INTERNAL_EXN("Unknown output dimension cannot be calculated for inputs"); + } output_shape.dim(unknown_dim_index) = input_element_count / output_element_count; } } diff --git a/compiler/luci/service/src/Nodes/CircleReshape.test.cpp b/compiler/luci/service/src/Nodes/CircleReshape.test.cpp index 653cb690d18..97ecd30664c 100644 --- a/compiler/luci/service/src/Nodes/CircleReshape.test.cpp +++ b/compiler/luci/service/src/Nodes/CircleReshape.test.cpp @@ -135,6 +135,32 @@ TEST(ShapeRuleTest, reshape_should_infer) ASSERT_EQ(4, output_shape.dim(1).value()); } +TEST(ShapeRuleTest, reshape_wrong_target_shape_NEG) +{ + auto g = loco::make_graph(); + auto node_reshape = g->nodes()->create(); + auto tensor_input = g->nodes()->create(); + auto shape_by_input = g->nodes()->create(); + + tensor_input->dtype(loco::DataType::S32); + tensor_input->shape({2, 4}); + tensor_input->shape_status(luci::ShapeStatus::VALID); + + shape_by_input->dtype(loco::DataType::S32); + shape_by_input->size(3); + shape_by_input->at(0) = 6; + shape_by_input->at(2) = -1; + shape_by_input->shape_status(luci::ShapeStatus::VALID); + + node_reshape->tensor(tensor_input); + node_reshape->shape(shape_by_input); + + loco::TensorShape output_shape; + luci::sinf::Rule shape_inf_rule; + + ASSERT_THROW(shape_inf_rule.infer(node_reshape, output_shape), oops::InternalExn); +} + TEST(ShapeRuleTest, reshape_by_input_node) { auto g = loco::make_graph(); From e414ec43b938ebb4c64402d10b3d93e99619e025 Mon Sep 17 00:00:00 2001 From: Mateusz Bencer Date: Wed, 19 Mar 2025 19:32:36 +0100 Subject: [PATCH 2/2] review remarks --- compiler/luci/service/src/Nodes/CircleReshape.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/luci/service/src/Nodes/CircleReshape.cpp b/compiler/luci/service/src/Nodes/CircleReshape.cpp index df14ad59866..b59ab5a1f70 100644 --- a/compiler/luci/service/src/Nodes/CircleReshape.cpp +++ b/compiler/luci/service/src/Nodes/CircleReshape.cpp @@ -212,7 +212,7 @@ loco::TensorShape Algorithm::visit(const luci::CircleReshape *node) { if (input_element_count % output_element_count != 0) { - INTERNAL_EXN("Unknown output dimension cannot be calculated for inputs"); + INTERNAL_EXN("Reshape Op cannot infer unknown dimension from inputs."); } output_shape.dim(unknown_dim_index) = input_element_count / output_element_count; }