From 2f7b6fcd195aa9c2bb0352b372e0aafdfa378674 Mon Sep 17 00:00:00 2001 From: RJ Ascani Date: Fri, 4 Sep 2026 12:00:46 -0700 Subject: [PATCH] Cortex-M: preserve unsupported transpose ranks Keep int8 permutes with ranks outside 1-4 on portable operators because cortex_m::transpose only supports up to four dimensions. Add a rank-5 dialect regression test. Authored with Codex. --- .../cortex_m/passes/aten_to_cortex_m_pass.py | 2 +- backends/cortex_m/test/ops/test_transpose.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backends/cortex_m/passes/aten_to_cortex_m_pass.py b/backends/cortex_m/passes/aten_to_cortex_m_pass.py index 7f0cd2dd434..5799896e17c 100644 --- a/backends/cortex_m/passes/aten_to_cortex_m_pass.py +++ b/backends/cortex_m/passes/aten_to_cortex_m_pass.py @@ -1259,7 +1259,7 @@ def _get_permute_replacement( ) -> DialectNodeSpec | None: del dialect_pass input_tensor = _get_input_tensor_data(node) - if input_tensor.dtype != torch.int8: + if input_tensor.dtype != torch.int8 or not 1 <= input_tensor.dim() <= 4: return None return _transpose_spec(node, input_tensor) diff --git a/backends/cortex_m/test/ops/test_transpose.py b/backends/cortex_m/test/ops/test_transpose.py index 2e5f5112bd9..26a026358df 100644 --- a/backends/cortex_m/test/ops/test_transpose.py +++ b/backends/cortex_m/test/ops/test_transpose.py @@ -24,6 +24,12 @@ "executorch_exir_dialects_edge__ops_cortex_m_dequantize_per_tensor_default": 1, } +RANK5_OPS_AFTER_PASSES = { + "executorch_exir_dialects_edge__ops_cortex_m_quantize_per_tensor_default": 1, + "executorch_exir_dialects_edge__ops_aten_permute_copy_default": 1, + "executorch_exir_dialects_edge__ops_cortex_m_dequantize_per_tensor_default": 1, +} + class CortexMPermute(torch.nn.Module): ops_before_transforms = OPS_BEFORE_PASSES @@ -98,6 +104,19 @@ def test_dialect_transpose(test_case, cortex_m_target): ) +def test_dialect_rank5_permute_stays_portable(cortex_m_target): + tester = CortexMTester( + CortexMPermute((0, 2, 1, 4, 3)), + (ramp_tensor(-1.0, 1.0, (1, 2, 3, 4, 5)),), + target_config=cortex_m_target, + ) + tester.test_dialect( + OPS_BEFORE_PASSES, + RANK5_OPS_AFTER_PASSES, + qtol=1, + ) + + @parametrize("test_case", test_cases) def test_implementation_transpose(test_case, cortex_m_target): tester = CortexMTester(