diff --git a/src/plugins/intel_cpu/src/transformations/cpu_opset/convert_to_cpu_specific_opset.hpp b/src/plugins/intel_cpu/src/transformations/cpu_opset/convert_to_cpu_specific_opset.hpp index be9935c6d00a35..9346b57ffaa16c 100644 --- a/src/plugins/intel_cpu/src/transformations/cpu_opset/convert_to_cpu_specific_opset.hpp +++ b/src/plugins/intel_cpu/src/transformations/cpu_opset/convert_to_cpu_specific_opset.hpp @@ -61,14 +61,14 @@ inline void ConvertToCPUSpecificOpset(std::shared_ptr& model, const C CPU_REGISTER_PASS_COMMON( manager, - pass::ConvertFullyConnectedToFullyConnectedCompressed, + ov::pass::ConvertFullyConnectedToFullyConnectedCompressed, ov::intel_cpu::node::FullyConnected::getSupportedCompressedActivationsTypes(), ov::intel_cpu::node::FullyConnected::getSupportedCompressedWeightsTypes(), [&config](const std::shared_ptr& fc, size_t IC, size_t OC, size_t G) { return ov::intel_cpu::node::FullyConnected::isSupportedCompressedOperation(fc, IC, OC, G, config); }); - CPU_REGISTER_PASS_X64(manager, pass::ConvertFCToFCQuantizedLegacy); + CPU_REGISTER_PASS_X64(manager, ov::pass::ConvertFCToFCQuantizedLegacy); CPU_REGISTER_PASS_COMMON(manager, MoveFCReshapeToWeights); CPU_REGISTER_PASS_COMMON(manager, ov::pass::Validate); CPU_REGISTER_PASS_COMMON(manager, AlignMatMulInputRanks); diff --git a/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.cpp b/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.cpp new file mode 100644 index 00000000000000..2445cd2a30efab --- /dev/null +++ b/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.cpp @@ -0,0 +1,65 @@ +// Copyright (C) 2025 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "transformations/snippets/normalize_convert_pre_lower.hpp" + +#include +#include +#include +#include +#include + +#include "snippets/op/convert_truncation.hpp" +#include "snippets/op/subgraph.hpp" + +namespace ov::intel_cpu::pass { + +namespace { +class ReplaceConvertInBody : public ov::pass::MatcherPass { +public: + OPENVINO_MATCHER_PASS_RTTI("CPU::ReplaceConvertInBody"); + ReplaceConvertInBody() { + auto m_v0 = ov::pass::pattern::wrap_type(); + auto m_v1 = ov::pass::pattern::wrap_type(); + + auto callback = [](ov::pass::pattern::Matcher& m) { + const auto root = m.get_match_root(); + std::shared_ptr cv = root; + ov::element::Type dst; + if (auto c0 = std::dynamic_pointer_cast(cv)) { + dst = c0->get_destination_type(); + } else if (auto c1 = std::dynamic_pointer_cast(cv)) { + dst = c1->get_destination_type(); + } else { + return false; + } + auto in = cv->input_value(0); + auto ct = std::make_shared(in, dst); + ct->set_friendly_name(cv->get_friendly_name()); + ov::copy_runtime_info(cv, ct); + ov::replace_node(cv, ct); + return true; + }; + + register_matcher(std::make_shared(m_v0, "CPUReplaceConvertV0"), callback); + register_matcher(std::make_shared(m_v1, "CPUReplaceConvertV1"), callback); + } +}; +} // namespace + +NormalizeConvertPreLower::NormalizeConvertPreLower() { + auto m_subgraph = ov::pass::pattern::wrap_type(); + register_matcher(std::make_shared(m_subgraph, get_type_info_static().name), + [](ov::pass::pattern::Matcher& m) { + auto s = std::dynamic_pointer_cast(m.get_match_root()); + if (!s) + return false; + ov::pass::Manager body_mgr("CPU::NormalizeConvertPreLowerBody"); + body_mgr.set_per_pass_validation(false); + body_mgr.register_pass(); + body_mgr.run_passes(s->body_ptr()); + return true; + }); +} + +} // namespace ov::intel_cpu::pass diff --git a/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.hpp b/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.hpp new file mode 100644 index 00000000000000..a9995c769a4fd6 --- /dev/null +++ b/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.hpp @@ -0,0 +1,23 @@ +// Copyright (C) 2025 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include + +namespace ov { +namespace intel_cpu { +namespace pass { + +// CPU-side pass: for every ov::snippets::op::Subgraph, replace any remaining +// ov::op::v0::Convert / opset1::Convert inside subgraph body with +// ov::snippets::op::ConvertTruncation right before lowering in CPU pipeline. +class NormalizeConvertPreLower final : public ov::pass::MatcherPass { +public: + OPENVINO_MATCHER_PASS_RTTI("CPU::NormalizeConvertPreLower"); + NormalizeConvertPreLower(); +}; + +} // namespace pass +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp b/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp index 3ba13106ea71b8..5e68638e7c87b3 100644 --- a/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp +++ b/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp @@ -5,6 +5,7 @@ #include "transformation_pipeline.h" #include "defs.hpp" +#include "transformations/snippets/normalize_convert_pre_lower.hpp" // Operations #include @@ -1651,6 +1652,9 @@ void Transformations::PostSnippets() { ov::pass::FakeQuantizeDecomposition); CPU_REGISTER_PASS_COMMON(postSnippetsManager, ov::pass::FakeConvertDecomposition); CPU_REGISTER_PASS_COMMON(postSnippetsManager, ov::pass::ConstantFolding); +#if defined(ANDROID) || defined(__ANDROID__) + CPU_REGISTER_PASS_COMMON(postSnippetsManager, ov::intel_cpu::pass::NormalizeConvertPreLower); +#endif postSnippetsManager.run_passes(model); }