From 621e3fa95420a92c8375654031cfcc4a3ea1a079 Mon Sep 17 00:00:00 2001 From: Alexander Nesterov Date: Fri, 31 Oct 2025 13:59:18 +0100 Subject: [PATCH 1/3] [CPU][Android] Normalize late Convert in PostSnippets and fix FC pass namespace\n\n- Add NormalizeConvertPreLower (Android-only) and register in PostSnippets\n- Use ov::pass::ConvertFullyConnectedToFullyConnectedCompressed to avoid ambiguous namespace\n- No other changes outside intel_cpu; no alias shim --- .../convert_to_cpu_specific_opset.hpp | 2 +- .../snippets/normalize_convert_pre_lower.cpp | 70 +++++++++++++++++++ .../snippets/normalize_convert_pre_lower.hpp | 28 ++++++++ .../transformation_pipeline.cpp | 6 ++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.cpp create mode 100644 src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.hpp 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 9210fe4454e230..570aa7dace4d95 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 @@ -44,7 +44,7 @@ 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) { 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..f9536374f96738 --- /dev/null +++ b/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2025 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +// Android-only integration +#if defined(ANDROID) || defined(__ANDROID__) + +#include "transformations/snippets/normalize_convert_pre_lower.hpp" + +#include +#include +#include +#include +#include + +#include "snippets/op/subgraph.hpp" +#include "snippets/op/convert_truncation.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 + +#endif // defined(ANDROID) || defined(__ANDROID__) 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..9fe9db763ace65 --- /dev/null +++ b/src/plugins/intel_cpu/src/transformations/snippets/normalize_convert_pre_lower.hpp @@ -0,0 +1,28 @@ +// Copyright (C) 2025 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +// Android-only integration +#if defined(ANDROID) || defined(__ANDROID__) + +#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 + +#endif // defined(ANDROID) || defined(__ANDROID__) diff --git a/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp b/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp index 6c9c60414dd444..3fd70b70744b68 100644 --- a/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp +++ b/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp @@ -3,6 +3,9 @@ // #include "transformation_pipeline.h" +#if defined(ANDROID) || defined(__ANDROID__) +# include "transformations/snippets/normalize_convert_pre_lower.hpp" +#endif #include "defs.hpp" @@ -1640,6 +1643,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); } From b54e0856c5add92f7949545ecdc8dfeb7c8d4db0 Mon Sep 17 00:00:00 2001 From: Nesterov Alexander Date: Fri, 31 Oct 2025 14:29:52 +0100 Subject: [PATCH 2/3] Update convert_to_cpu_specific_opset.hpp --- .../transformations/cpu_opset/convert_to_cpu_specific_opset.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 570aa7dace4d95..a53ee2bbfbbd0f 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 @@ -51,7 +51,7 @@ inline void ConvertToCPUSpecificOpset(std::shared_ptr& model, const C 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); From 2c01ea68a98292492f2d9ae22e6711069b948c02 Mon Sep 17 00:00:00 2001 From: Alexander Nesterov Date: Mon, 10 Nov 2025 12:23:52 +0100 Subject: [PATCH 3/3] Fix Android snippets pass build --- .../snippets/normalize_convert_pre_lower.cpp | 11 +++-------- .../snippets/normalize_convert_pre_lower.hpp | 5 ----- .../src/transformations/transformation_pipeline.cpp | 4 +--- 3 files changed, 4 insertions(+), 16 deletions(-) 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 index f9536374f96738..2445cd2a30efab 100644 --- 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 @@ -1,19 +1,16 @@ // Copyright (C) 2025 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -// Android-only integration -#if defined(ANDROID) || defined(__ANDROID__) - #include "transformations/snippets/normalize_convert_pre_lower.hpp" +#include +#include #include #include #include -#include -#include -#include "snippets/op/subgraph.hpp" #include "snippets/op/convert_truncation.hpp" +#include "snippets/op/subgraph.hpp" namespace ov::intel_cpu::pass { @@ -66,5 +63,3 @@ NormalizeConvertPreLower::NormalizeConvertPreLower() { } } // namespace ov::intel_cpu::pass - -#endif // defined(ANDROID) || defined(__ANDROID__) 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 index 9fe9db763ace65..a9995c769a4fd6 100644 --- 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 @@ -3,9 +3,6 @@ #pragma once -// Android-only integration -#if defined(ANDROID) || defined(__ANDROID__) - #include namespace ov { @@ -24,5 +21,3 @@ class NormalizeConvertPreLower final : public ov::pass::MatcherPass { } // namespace pass } // namespace intel_cpu } // namespace ov - -#endif // defined(ANDROID) || defined(__ANDROID__) diff --git a/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp b/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp index bb4e78a17421be..5e68638e7c87b3 100644 --- a/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp +++ b/src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp @@ -3,11 +3,9 @@ // #include "transformation_pipeline.h" -#if defined(ANDROID) || defined(__ANDROID__) -# include "transformations/snippets/normalize_convert_pre_lower.hpp" -#endif #include "defs.hpp" +#include "transformations/snippets/normalize_convert_pre_lower.hpp" // Operations #include