[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