diff --git a/onnxruntime/core/optimizer/noop_elimination.cc b/onnxruntime/core/optimizer/noop_elimination.cc index 1421ea7416..c01bdc42bf 100644 --- a/onnxruntime/core/optimizer/noop_elimination.cc +++ b/onnxruntime/core/optimizer/noop_elimination.cc @@ -55,6 +55,10 @@ bool NoopElimination::SatisfyCondition(const Graph& graph, const Node& node, con if (add_init.size() > 1) { return false; } + // handle edge case where the total size of the initializer is 0 + if (add_init.size() == 0) { + return true; + } switch (data_type) { case ONNX_NAMESPACE::TensorProto_DataType_FLOAT: if (*add_init.data() != 0.f) { diff --git a/onnxruntime/test/optimizer/graph_transform_test.cc b/onnxruntime/test/optimizer/graph_transform_test.cc index 3cfc34492d..70256732ba 100644 --- a/onnxruntime/test/optimizer/graph_transform_test.cc +++ b/onnxruntime/test/optimizer/graph_transform_test.cc @@ -195,7 +195,7 @@ TEST_F(GraphTransformationTests, NoopElimination) { ASSERT_STATUS_OK(Model::Load(model_uri, model, nullptr, *logger_)); Graph& graph = model->MainGraph(); std::map op_to_count = CountOpsInGraph(graph); - ASSERT_TRUE(op_to_count["Add"] == 4); + ASSERT_TRUE(op_to_count["Add"] == 5); auto rule_transformer_L1 = std::make_unique("RuleTransformer1"); ASSERT_STATUS_OK(rule_transformer_L1->Register(std::make_unique())); diff --git a/onnxruntime/test/testdata/transform/noop-add.onnx b/onnxruntime/test/testdata/transform/noop-add.onnx index e5793f5fda..b10a87283a 100644 Binary files a/onnxruntime/test/testdata/transform/noop-add.onnx and b/onnxruntime/test/testdata/transform/noop-add.onnx differ diff --git a/onnxruntime/test/testdata/transform/noop-add.py b/onnxruntime/test/testdata/transform/noop-add.py index 0d1bb9801b..3e996d42e6 100644 --- a/onnxruntime/test/testdata/transform/noop-add.py +++ b/onnxruntime/test/testdata/transform/noop-add.py @@ -34,6 +34,10 @@ def GenerateModel(model_name): helper.make_node("Identity", ["X4"], ["id_7"], "id_7"), helper.make_node("Add", ["id_7", "int64_2"], ["add_4"], "add_4"), helper.make_node("Identity", ["add_4"], ["Y4"], "id_8"), + #float + helper.make_node("Identity", ["X5"], ["id_9"], "id_9"), + helper.make_node("Add", ["float_2", "id_9"], ["add_5"], "add_5"), + helper.make_node("Identity", ["add_5"], ["Y5"], "id_10"), ] inputs = [ # inputs @@ -41,6 +45,7 @@ def GenerateModel(model_name): helper.make_tensor_value_info('X2', TensorProto.FLOAT16, ['M', 'K']), helper.make_tensor_value_info('X3', TensorProto.INT64, ['M', 'K']), helper.make_tensor_value_info('X4', TensorProto.INT64, ['M', 'K']), + helper.make_tensor_value_info('X5', TensorProto.FLOAT, ['M', 'K']), ] initializers = [ @@ -50,6 +55,8 @@ def GenerateModel(model_name): helper.make_tensor('int64_1', TensorProto.INT64, (), [0]), # higher rank helper.make_tensor('int64_2', TensorProto.INT64, [1,1,1], [0]), + #float - set initializer size = 0 + helper.make_tensor('float_2', TensorProto.FLOAT, [0], []), ] graph = helper.make_graph( @@ -61,6 +68,7 @@ def GenerateModel(model_name): helper.make_tensor_value_info('Y2', TensorProto.FLOAT16, ['M', 'K']), helper.make_tensor_value_info('Y3', TensorProto.INT64, ['M', 'K']), helper.make_tensor_value_info('Y4', TensorProto.INT64, ['M', 'K', 1]), + helper.make_tensor_value_info('Y5', TensorProto.FLOAT, ['M', 'K']), ], initializers)