From eb43f40ca18ff658b4275127eb2eebfd2a46bc14 Mon Sep 17 00:00:00 2001 From: Ivan Tikhonov Date: Sat, 24 Jun 2023 01:06:12 +0400 Subject: [PATCH] Revert "Enable ResolveNamesCollisions transformation in MOC (#18052)" (#18218) This reverts commit 9630766e038052fc66c409aaa892db967bea1291. --- .../resolve_names_collisions.hpp | 2 +- .../moc_transformations.cpp | 2 - .../resolve_names_collisions.cpp | 92 ++++++++----- .../tests/resolve_names_collisions.cpp | 129 +++++------------- .../openvino/op/util/multi_subgraph_base.hpp | 7 - .../include/openvino/frontend/ir/frontend.hpp | 4 - src/frontends/ir/src/frontend.cpp | 11 +- .../openvino/frontend/onnx/frontend.hpp | 1 - src/frontends/onnx/frontend/src/frontend.cpp | 12 +- .../openvino/frontend/paddle/frontend.hpp | 4 - src/frontends/paddle/src/frontend.cpp | 11 +- src/frontends/pytorch/src/frontend.cpp | 3 +- src/frontends/tensorflow/src/frontend.cpp | 2 - .../tensorflow_lite/src/frontend.cpp | 2 - 14 files changed, 98 insertions(+), 184 deletions(-) diff --git a/src/common/transformations/include/transformations/resolve_names_collisions.hpp b/src/common/transformations/include/transformations/resolve_names_collisions.hpp index b1445dec780..bd2500c0060 100644 --- a/src/common/transformations/include/transformations/resolve_names_collisions.hpp +++ b/src/common/transformations/include/transformations/resolve_names_collisions.hpp @@ -13,7 +13,7 @@ namespace pass { /** * @ingroup ie_transformation_common_api * @brief ResolveNameCollisions transformation helps to fix names collisions - * if nodes with autogenerated names have conflicts with other node names. + * if some internal nodes or nodes with autogenerated names have conflicts with other nodes from the original graph * * Every transformation call can change the graph structure and create some additional operations, * autogenerated name is used if new operation doesn't have friendly name. diff --git a/src/common/transformations/src/transformations/common_optimizations/moc_transformations.cpp b/src/common/transformations/src/transformations/common_optimizations/moc_transformations.cpp index cfd392495b1..a8ac682a490 100644 --- a/src/common/transformations/src/transformations/common_optimizations/moc_transformations.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/moc_transformations.cpp @@ -83,7 +83,6 @@ #include #include "itt.hpp" -#include "transformations/resolve_names_collisions.hpp" bool ov::pass::MOCTransformations::run_on_model(const std::shared_ptr& f) { RUN_ON_FUNCTION_SCOPE(MOCTransformations); @@ -245,7 +244,6 @@ bool ov::pass::MOCTransformations::run_on_model(const std::shared_ptr #include +#include #include "itt.hpp" -#include "openvino/op/util/multi_subgraph_base.hpp" - -namespace { - -void collect_name_collisions_map(const std::shared_ptr& model, - std::unordered_map>& name_collisions_map) { - for (const auto& node : model->get_ordered_ops()) { - // Collect a names collision map for all nodes in the graph - const auto& friendly_name = node->get_friendly_name(); - name_collisions_map[friendly_name].emplace_back(node.get()); - if (auto msn = ov::as_type_ptr(node)) { - for (const auto& body : msn->get_functions()) { - collect_name_collisions_map(body, name_collisions_map); - } - } - } -} - -} // namespace +#include "openvino/op/parameter.hpp" +#include "openvino/op/result.hpp" +#include "openvino/op/sink.hpp" bool ov::pass::ResolveNameCollisions::run_on_model(const std::shared_ptr& model) { // Next containers are used to fix collisions in autogenerated names @@ -35,28 +20,63 @@ bool ov::pass::ResolveNameCollisions::run_on_model(const std::shared_ptr nodes_with_conflicts; std::unordered_map> visited_nodes; - collect_name_collisions_map(model, visited_nodes); + for (const auto& node : model->get_ordered_ops()) { + // Detect names collisions only for nodes with autogenerated names + const auto& friendly_name = node->get_friendly_name(); + visited_nodes[friendly_name].emplace_back(node.get()); + } - for (const auto& it : visited_nodes) { - const auto& same_named_ops = it.second; - if (same_named_ops.size() < 2) { + for (const auto& l_nodes : visited_nodes) { + if (l_nodes.second.size() == 1) continue; - } - - int64_t cnt = 2; - for (const auto& op : same_named_ops) { - // check if op has OV autogenerated friendly name. unique and friendly names have to be equal. - bool is_autogenerated = op->m_friendly_name.empty(); - if (!is_autogenerated) { + const size_t nodes_size = l_nodes.second.size(); + bool has_public_node = false; // Parameter, Result ans Sinks + size_t i(0); + for (auto* node : l_nodes.second) { + i++; + // Skip the last node if we don't have public nodes with collisions + if (i == nodes_size && !has_public_node) + break; + if (dynamic_cast(node)) { + // Result is a service node continue; } - // add a prefix "_counter" to the autogenerated name to make it unique. - auto new_name = op->get_friendly_name() + "_" + std::to_string(cnt++); - while (visited_nodes.find(new_name) != visited_nodes.end()) { - new_name = op->get_friendly_name() + "_" + std::to_string(cnt++); + if (dynamic_cast(node) || dynamic_cast(node)) { + // Resolve names for public ops with autogenerated name + if (node->m_friendly_name.empty()) + nodes_with_conflicts.emplace_back(node); + has_public_node = true; + continue; + } else { + // For result we need to avoid changes in previous operation + bool is_public = false; + for (const auto& output : node->outputs()) { + for (const auto input : output.get_target_inputs()) { + if (dynamic_cast(input.get_node())) { + has_public_node = true; + is_public = true; + break; + } + } + if (is_public) + break; + } + if (is_public) + continue; } - op->set_friendly_name(new_name); + nodes_with_conflicts.emplace_back(node); } } - return false; + + // Resolve names collisions + for (auto* node : nodes_with_conflicts) { + size_t idx = 2; + const auto friendly_name = node->get_friendly_name(); + while (visited_nodes.find(friendly_name + "_" + std::to_string(idx)) != visited_nodes.end()) + idx++; + const auto new_friendly_name = friendly_name + "_" + std::to_string(idx); + node->set_friendly_name(new_friendly_name); + visited_nodes[new_friendly_name].emplace_back(node); + } + return true; } diff --git a/src/common/transformations/tests/resolve_names_collisions.cpp b/src/common/transformations/tests/resolve_names_collisions.cpp index 1db80b6e0a9..c85c9323e1a 100644 --- a/src/common/transformations/tests/resolve_names_collisions.cpp +++ b/src/common/transformations/tests/resolve_names_collisions.cpp @@ -8,11 +8,8 @@ #include "openvino/opsets/opset8.hpp" #include "openvino/pass/manager.hpp" -using namespace ov; -using namespace ov::opset8; - TEST(ResolveNameCollisionsTest, FixGeneratedNames) { - auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); + auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); const auto gen_friendly_name = arg0->get_friendly_name(); std::string name = "Parameter_"; @@ -22,10 +19,10 @@ TEST(ResolveNameCollisionsTest, FixGeneratedNames) { arg0->set_friendly_name(name); - auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); + auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); - auto concat = std::make_shared(ov::NodeVector{arg0, arg1}, 1); - auto result1 = std::make_shared(concat); + auto concat = std::make_shared(ov::NodeVector{arg0, arg1}, 1); + auto result1 = std::make_shared(concat); auto model = std::make_shared(ov::ResultVector{result1}, ov::ParameterVector{arg0, arg1}); @@ -41,20 +38,43 @@ TEST(ResolveNameCollisionsTest, FixGeneratedNames) { EXPECT_EQ(arg1->get_friendly_name(), arg0->get_friendly_name() + "_2"); } -TEST(ResolveNameCollisionsTest, FixFriendlyNamesForAutogeneratedNames) { - auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); +TEST(ResolveNameCollisionsTest, DoNotFixFriendlyNamesForParameters) { + auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); const auto gen_friendly_name = arg0->get_friendly_name(); - auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); - // set the same name as for the first Parameter + arg0->set_friendly_name(gen_friendly_name); + + auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); arg1->set_friendly_name(gen_friendly_name); - auto concat1 = std::make_shared(ov::NodeVector{arg0, arg1}, 1); - concat1->set_friendly_name("concat"); - auto concat = std::make_shared(ov::NodeVector{concat1, arg1}, 1); - concat->set_friendly_name("concat"); + auto concat = std::make_shared(ov::NodeVector{arg0, arg1}, 1); + auto result1 = std::make_shared(concat); - auto result1 = std::make_shared(concat); + auto model = std::make_shared(ov::ResultVector{result1}, ov::ParameterVector{arg0, arg1}); + + EXPECT_EQ(gen_friendly_name, arg0->get_friendly_name()); + EXPECT_EQ(arg1->get_friendly_name(), arg0->get_friendly_name()); + EXPECT_NE(arg1->get_friendly_name(), arg0->get_friendly_name() + "_2"); + + ov::pass::Manager pass_manager; + pass_manager.register_pass(); + pass_manager.run_passes(model); + EXPECT_EQ(gen_friendly_name, arg0->get_friendly_name()); + EXPECT_EQ(arg1->get_friendly_name(), arg0->get_friendly_name()); + EXPECT_NE(arg1->get_friendly_name(), arg0->get_friendly_name() + "_2"); +} + +TEST(ResolveNameCollisionsTest, FixFriendlyNamesForInternalOperations) { + auto arg0 = std::make_shared(ov::element::f32, ov::PartialShape{1, 3, 3, 3}); + const auto gen_friendly_name = arg0->get_friendly_name(); + + auto arg1 = std::make_shared(ov::element::f32, ov::PartialShape{1, 2, 3, 3}); + + auto concat1 = std::make_shared(ov::NodeVector{arg0, arg1}, 1); + concat1->set_friendly_name("concat"); + auto concat = std::make_shared(ov::NodeVector{concat1, arg1}, 1); + concat->set_friendly_name("concat"); + auto result1 = std::make_shared(concat); auto model = std::make_shared(ov::ResultVector{result1}, ov::ParameterVector{arg0, arg1}); @@ -63,80 +83,5 @@ TEST(ResolveNameCollisionsTest, FixFriendlyNamesForAutogeneratedNames) { ov::pass::Manager pass_manager; pass_manager.register_pass(); pass_manager.run_passes(model); - - // these names weren't set automatically, and have to remain the same. - EXPECT_EQ(concat->get_friendly_name(), concat1->get_friendly_name()); - // arg0's name was set automatically and matches with another name in the graph, - // so it have to be changed. - EXPECT_NE(arg0->get_friendly_name(), arg1->get_friendly_name()); - EXPECT_EQ(arg0->get_friendly_name(), arg1->get_friendly_name() + "_2"); -} - -TEST(ResolveNameCollisionsTest, FixFriendlyNamesForAutogeneratedNamesMultiSubgraphOp) { - // external params - auto X = std::make_shared(element::f32, Shape{4}); - auto Y = std::make_shared(element::f32, Shape{4}); - auto Z = std::make_shared(element::f32, Shape{8}); - - auto axis = std::make_shared(element::i32, Shape{}, 0); - auto external_split = std::make_shared(X, axis, 2); - - // internal params - auto Xt = std::make_shared(element::f32, PartialShape::dynamic()); - Xt->set_friendly_name(X->get_friendly_name()); - auto Yt = std::make_shared(element::f32, PartialShape::dynamic()); - Yt->set_friendly_name(Y->get_friendly_name()); - auto Ze = std::make_shared(element::f32, PartialShape::dynamic()); - - // then body - auto cond = std::make_shared(element::boolean, Shape{1}, true); - auto axis_then = std::make_shared(element::i32, Shape{}, 0); - auto split_y = std::make_shared(Yt, axis_then, 2); - split_y->set_friendly_name(external_split->get_friendly_name()); - auto then_op = std::make_shared(Xt, split_y->output(0)); - auto res0 = std::make_shared(then_op); - - // else body - auto axis_else = std::make_shared(element::i32, Shape{}, 0); - auto split_z = std::make_shared(Ze, axis_else, 4); - split_z->set_friendly_name(external_split->get_friendly_name()); - auto else_op = std::make_shared(split_z); - else_op->set_friendly_name(then_op->get_friendly_name()); - auto res1 = std::make_shared(else_op); - - // If set up - auto then_body = std::make_shared(OutputVector{res0}, ParameterVector{Yt, Xt}, "then_body"); - auto else_body = std::make_shared(OutputVector{res1}, ParameterVector{Ze}, "else_body"); - auto if_op = std::make_shared(cond); - if_op->set_then_body(then_body); - if_op->set_else_body(else_body); - if_op->set_input(external_split->output(0), Xt, nullptr); - if_op->set_input(Y, Yt, nullptr); - if_op->set_input(Z, nullptr, Ze); - auto result = if_op->set_output(res0, res1); - - auto res = std::make_shared(result); - auto model = std::make_shared(OutputVector{res}, ParameterVector{X, Y, Z}); - - EXPECT_EQ(external_split->get_friendly_name(), split_y->get_friendly_name()); - EXPECT_EQ(external_split->get_friendly_name(), split_z->get_friendly_name()); - - EXPECT_EQ(X->get_friendly_name(), Xt->get_friendly_name()); - EXPECT_EQ(Y->get_friendly_name(), Yt->get_friendly_name()); - - EXPECT_EQ(then_op->get_friendly_name(), else_op->get_friendly_name()); - - ov::pass::Manager pass_manager; - pass_manager.register_pass(); - pass_manager.run_passes(model); - - EXPECT_EQ(external_split->get_friendly_name(), split_y->get_friendly_name() + "_2"); - - EXPECT_EQ(X->get_friendly_name(), Xt->get_friendly_name() + "_2"); - EXPECT_EQ(Y->get_friendly_name(), Yt->get_friendly_name() + "_2"); - - EXPECT_EQ(then_op->get_friendly_name(), else_op->get_friendly_name() + "_2"); - // remain the same, because they were set via "set_friendly_name" method - // and are not autogenerated. - EXPECT_EQ(split_y->get_friendly_name(), split_z->get_friendly_name()); + EXPECT_NE(concat->get_friendly_name(), concat1->get_friendly_name()); } diff --git a/src/core/include/openvino/op/util/multi_subgraph_base.hpp b/src/core/include/openvino/op/util/multi_subgraph_base.hpp index dbdb7b7d724..578ff258620 100644 --- a/src/core/include/openvino/op/util/multi_subgraph_base.hpp +++ b/src/core/include/openvino/op/util/multi_subgraph_base.hpp @@ -198,13 +198,6 @@ public: virtual const std::shared_ptr& get_function(size_t index) const { return m_bodies[index]; }; - - /// \brief Gets internal sub-graphs - /// \return a vector of pointers to sub-graph Models - virtual const std::vector>& get_functions() const { - return m_bodies; - }; - /// \brief Adds sub-graph to MultiSubGraphOp /// /// \param index index of new sub-graph diff --git a/src/frontends/ir/include/openvino/frontend/ir/frontend.hpp b/src/frontends/ir/include/openvino/frontend/ir/frontend.hpp index b6719ab8a87..974a5eb4d8d 100644 --- a/src/frontends/ir/include/openvino/frontend/ir/frontend.hpp +++ b/src/frontends/ir/include/openvino/frontend/ir/frontend.hpp @@ -33,10 +33,6 @@ public: /// \param extension base extension void add_extension(const ov::Extension::Ptr& extension) override; - /// \brief Runs normalization passes on Model that was loaded with partial conversion - /// \param Model partially converted OV Model - void normalize(const std::shared_ptr& model) const override; - protected: /// \brief Check if FrontEndIR can recognize model from given parts /// \param params Can be path to the model file or std::istream diff --git a/src/frontends/ir/src/frontend.cpp b/src/frontends/ir/src/frontend.cpp index e743e61325b..6e6d49cd7ed 100644 --- a/src/frontends/ir/src/frontend.cpp +++ b/src/frontends/ir/src/frontend.cpp @@ -14,7 +14,6 @@ #include "openvino/core/any.hpp" #include "openvino/util/file_util.hpp" #include "so_extension.hpp" -#include "transformations/resolve_names_collisions.hpp" #include "xml_parse_utils.h" using namespace ov; @@ -235,21 +234,13 @@ InputModel::Ptr FrontEnd::load_impl(const std::vector& variants) const std::shared_ptr FrontEnd::convert(const InputModel::Ptr& model) const { auto ir_model = std::dynamic_pointer_cast(model); OPENVINO_ASSERT(ir_model != nullptr); - const auto& converted_model = ir_model->convert(); - normalize(converted_model); - return converted_model; + return ir_model->convert(); } std::string FrontEnd::get_name() const { return "ir"; } -void FrontEnd::normalize(const std::shared_ptr& model) const { - ov::pass::Manager manager; - manager.register_pass(); - manager.run_passes(model); -} - } // namespace ir } // namespace frontend } // namespace ov diff --git a/src/frontends/onnx/frontend/include/openvino/frontend/onnx/frontend.hpp b/src/frontends/onnx/frontend/include/openvino/frontend/onnx/frontend.hpp index e5b3e3b64a9..fd952d9f7a9 100644 --- a/src/frontends/onnx/frontend/include/openvino/frontend/onnx/frontend.hpp +++ b/src/frontends/onnx/frontend/include/openvino/frontend/onnx/frontend.hpp @@ -24,7 +24,6 @@ public: std::string get_name() const override; bool supported_impl(const std::vector& variants) const override; void add_extension(const std::shared_ptr& extension) override; - void normalize(const std::shared_ptr& model) const override; protected: InputModel::Ptr load_impl(const std::vector& params) const override; diff --git a/src/frontends/onnx/frontend/src/frontend.cpp b/src/frontends/onnx/frontend/src/frontend.cpp index 91086b0295f..4108070c4f2 100644 --- a/src/frontends/onnx/frontend/src/frontend.cpp +++ b/src/frontends/onnx/frontend/src/frontend.cpp @@ -21,7 +21,6 @@ #include "openvino/frontend/extension/telemetry.hpp" #include "ops_bridge.hpp" #include "so_extension.hpp" -#include "transformations/resolve_names_collisions.hpp" using namespace ov; using namespace ov::frontend::onnx; @@ -90,14 +89,11 @@ std::shared_ptr FrontEnd::convert(const InputModel::Ptr& model return function; } - const auto& converted_model = model_onnx->convert(); - normalize(converted_model); - return converted_model; + return model_onnx->convert(); } void FrontEnd::convert(const std::shared_ptr& partially_converted) const { ngraph::onnx_import::detail::convert_decoded_function(partially_converted); - normalize(partially_converted); } std::shared_ptr FrontEnd::decode(const InputModel::Ptr& model) const { @@ -183,9 +179,3 @@ void FrontEnd::add_extension(const std::shared_ptr& extension) { }); } } - -void FrontEnd::normalize(const std::shared_ptr& model) const { - ov::pass::Manager manager; - manager.register_pass(); - manager.run_passes(model); -} diff --git a/src/frontends/paddle/include/openvino/frontend/paddle/frontend.hpp b/src/frontends/paddle/include/openvino/frontend/paddle/frontend.hpp index a4bf013684e..6a804c2b24b 100644 --- a/src/frontends/paddle/include/openvino/frontend/paddle/frontend.hpp +++ b/src/frontends/paddle/include/openvino/frontend/paddle/frontend.hpp @@ -58,10 +58,6 @@ public: void add_extension(const std::shared_ptr& extension) override; - /// \brief Runs normalization passes on Model that was loaded with partial conversion - /// \param Model partially converted OV Model - void normalize(const std::shared_ptr& model) const override; - protected: /// \brief Check if FrontEnd can recognize model from given parts /// \param params Can be path to folder which contains __model__ file or path to diff --git a/src/frontends/paddle/src/frontend.cpp b/src/frontends/paddle/src/frontend.cpp index 18e06b35750..340f3e9722a 100644 --- a/src/frontends/paddle/src/frontend.cpp +++ b/src/frontends/paddle/src/frontend.cpp @@ -27,7 +27,6 @@ #include "paddle_utils.hpp" #include "place.hpp" #include "so_extension.hpp" -#include "transformations/resolve_names_collisions.hpp" using namespace ov::frontend::paddle::op::default_opset; using namespace ov; @@ -450,7 +449,6 @@ std::shared_ptr FrontEnd::convert(const InputModel::Ptr& model) const fuse_fakequantize_ops(f); try_remove_internal_ops(f); - normalize(f[0]); return f[0]; } @@ -466,7 +464,6 @@ void FrontEnd::convert(const std::shared_ptr& partiallyConverted) con fuse_fakequantize_ops({partiallyConverted}); try_remove_internal_ops({partiallyConverted}); - normalize(partiallyConverted); } std::shared_ptr FrontEnd::convert_partially(const InputModel::Ptr& model) const { @@ -499,7 +496,7 @@ std::shared_ptr FrontEnd::convert_partially(const InputModel::Ptr& mo fuse_fakequantize_ops(f); try_remove_internal_ops(f); - normalize(f[0]); + return f[0]; } @@ -537,12 +534,6 @@ void FrontEnd::add_extension(const std::shared_ptr& extension) { } } -void FrontEnd::normalize(const std::shared_ptr& model) const { - ov::pass::Manager manager; - manager.register_pass(); - manager.run_passes(model); -} - } // namespace paddle } // namespace frontend } // namespace ov diff --git a/src/frontends/pytorch/src/frontend.cpp b/src/frontends/pytorch/src/frontend.cpp index 6c8cd908111..75afc85560e 100644 --- a/src/frontends/pytorch/src/frontend.cpp +++ b/src/frontends/pytorch/src/frontend.cpp @@ -18,7 +18,6 @@ #include "transformations/control_flow/unroll_if.hpp" #include "transformations/low_precision/mark_dequantization_subgraph.hpp" #include "transformations/op_conversions/convert_convertlike.hpp" -#include "transformations/resolve_names_collisions.hpp" #include "transforms.hpp" #include "transforms/append_list_unpack_replacer.hpp" #include "transforms/aten_cat_replacer.hpp" @@ -183,7 +182,7 @@ void FrontEnd::normalize(const std::shared_ptr& model) const { manager.register_pass(); manager.register_pass(); manager.register_pass(); - manager.register_pass(); + manager.run_passes(model); apply_pytorch_conversion_transforms(model); diff --git a/src/frontends/tensorflow/src/frontend.cpp b/src/frontends/tensorflow/src/frontend.cpp index b8405bcbdf8..676f6a30c46 100644 --- a/src/frontends/tensorflow/src/frontend.cpp +++ b/src/frontends/tensorflow/src/frontend.cpp @@ -27,7 +27,6 @@ #include "tf_framework_node.hpp" #include "transformations/common_optimizations/remove_concat_zero_dim_input.hpp" #include "transformations/common_optimizations/reverse_shape_and_type_infer.hpp" -#include "transformations/resolve_names_collisions.hpp" #include "transformations/transpose_sinking/ts_general.hpp" #include "translate_session.hpp" #include "utils.hpp" @@ -473,7 +472,6 @@ void FrontEnd::normalize(const std::shared_ptr& model) const { manager.register_pass(); manager.register_pass(); manager.register_pass(); - manager.register_pass(); manager.run_passes(model); } diff --git a/src/frontends/tensorflow_lite/src/frontend.cpp b/src/frontends/tensorflow_lite/src/frontend.cpp index 998be906872..1b7d3615c4b 100644 --- a/src/frontends/tensorflow_lite/src/frontend.cpp +++ b/src/frontends/tensorflow_lite/src/frontend.cpp @@ -16,7 +16,6 @@ #include "tflite_transformations/rfft2d_complex_abs.h" #include "tflite_transformations/tflite_quantize_resolver.hpp" #include "transformations/common_optimizations/transpose_sinking.hpp" -#include "transformations/resolve_names_collisions.hpp" #include "transformations/transpose_sinking/ts_general.hpp" using namespace ov; @@ -292,7 +291,6 @@ void FrontEnd::normalize(const std::shared_ptr& function) const { manager.register_pass(); manager.register_pass(); manager.register_pass(); - manager.register_pass(); manager.run_passes(function); }