[llvm] [AArch64] Support symmetric complex deinterleaving with higher factors (PR #151295)

Igor Kirillov via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 31 09:17:50 PDT 2025


================
@@ -1890,22 +2016,53 @@ ComplexDeinterleavingGraph::identifyRoot(Instruction *RootI) {
 }
 
 ComplexDeinterleavingGraph::NodePtr
-ComplexDeinterleavingGraph::identifyDeinterleave(Instruction *Real,
-                                                 Instruction *Imag) {
-  Instruction *I = nullptr;
-  Value *FinalValue = nullptr;
-  if (match(Real, m_ExtractValue<0>(m_Instruction(I))) &&
-      match(Imag, m_ExtractValue<1>(m_Specific(I))) &&
-      match(I, m_Intrinsic<Intrinsic::vector_deinterleave2>(
-                   m_Value(FinalValue)))) {
+ComplexDeinterleavingGraph::identifyDeinterleave(ComplexValues &Vals) {
+  Instruction *II = nullptr;
+
+  // Must be at least one complex value.
+  for (unsigned Idx = 0; Idx < Vals.size(); Idx++) {
+    auto *EVI = dyn_cast<ExtractValueInst>(Vals[Idx].Real);
----------------
igogo-x86 wrote:

We can make it a bit more readable by extracting duplicate code:

```
  auto CheckExtract = [&](Value *V, unsigned ExpectedIdx) -> ExtractValueInst* {
    auto *EVI = dyn_cast<ExtractValueInst>(V);
    if (!EVI || EVI->getNumIndices() != 1 || EVI->getIndices()[0] != ExpectedIdx)
      return nullptr;
    return EVI;
  };

  ExtractValueInst *RealEVI = CheckExtract(Vals[Idx].Real, Idx * 2);
  ExtractValueInst *ImagEVI = CheckExtract(Vals[Idx].Imag, Idx * 2 + 1);
  if (!RealEVI || !ImagEVI)
    return nullptr;
```

https://github.com/llvm/llvm-project/pull/151295


More information about the llvm-commits mailing list