[llvm] [AArch64][GlobalISel] Lower unmerge to extract_subvector (PR #195046)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 30 02:43:45 PDT 2026
================
@@ -830,19 +830,32 @@ bool matchScalarizeVectorUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI) {
if (SrcTy.getSizeInBits() != 128 && SrcTy.getSizeInBits() != 64)
return false;
return SrcTy.isVector() && !SrcTy.isScalable() &&
- Unmerge.getNumOperands() == (unsigned)SrcTy.getNumElements() + 1;
+ (Unmerge.getNumOperands() == (unsigned)SrcTy.getNumElements() + 1 ||
+ (Unmerge.getNumDefs() == 2 && SrcTy.getSizeInBits() == 128 &&
+ MRI.getType(Unmerge.getReg(0)).getSizeInBits() == 64));
}
void applyScalarizeVectorUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
MachineIRBuilder &B) {
auto &Unmerge = cast<GUnmerge>(MI);
Register Src1Reg = Unmerge.getReg(Unmerge.getNumOperands() - 1);
const LLT SrcTy = MRI.getType(Src1Reg);
+ const LLT DstTy = MRI.getType(Unmerge.getReg(0));
assert((SrcTy.isVector() && !SrcTy.isScalable()) &&
"Expected a fixed length vector");
- for (int I = 0; I < SrcTy.getNumElements(); ++I)
- B.buildExtractVectorElementConstant(Unmerge.getReg(I), Src1Reg, I);
+ if (DstTy.isVector()) {
+ assert(Unmerge.getNumDefs() == 2);
+ if (!MRI.use_empty(Unmerge.getReg(0)))
----------------
arsenm wrote:
```suggestion
if (!MRI.use_nondbg_empty(Unmerge.getReg(0)))
```
https://github.com/llvm/llvm-project/pull/195046
More information about the llvm-commits
mailing list