diff options
| author | Vladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com> | 2023-09-01 18:38:26 +0200 |
|---|---|---|
| committer | Vladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com> | 2023-09-07 14:08:20 +0200 |
| commit | 0de6baab91645d305b0e87fd8e347009bc607ee4 (patch) | |
| tree | 961e0e46dddbfb14c57c9ed5da21a843977c81c3 /llvm/lib | |
| parent | 69036eb7358b4fec7cf23e372c68852a02aed988 (diff) | |
| download | llvm-0de6baab91645d305b0e87fd8e347009bc607ee4.zip llvm-0de6baab91645d305b0e87fd8e347009bc607ee4.tar.gz llvm-0de6baab91645d305b0e87fd8e347009bc607ee4.tar.bz2 | |
[AArch64][GlobalISel] Look through COPY and G_BITCAST while selecting fcvtl2 (fpext)
It tackles some regressions introduced in
https://reviews.llvm.org/D144670.
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp index 57e6bb9..3f55ade 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp @@ -6777,11 +6777,29 @@ AArch64InstructionSelector::selectExtractHigh(MachineOperand &Root) const { MachineRegisterInfo &MRI = Root.getParent()->getParent()->getParent()->getRegInfo(); - MachineInstr *Extract = getDefIgnoringCopies(Root.getReg(), MRI); - if (Extract && Extract->getOpcode() == TargetOpcode::G_UNMERGE_VALUES && - Root.getReg() == Extract->getOperand(1).getReg()) { - Register ExtReg = Extract->getOperand(2).getReg(); - return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(ExtReg); }}}; + auto Extract = getDefSrcRegIgnoringCopies(Root.getReg(), MRI); + while (Extract && Extract->MI->getOpcode() == TargetOpcode::G_BITCAST && + STI.isLittleEndian()) + Extract = + getDefSrcRegIgnoringCopies(Extract->MI->getOperand(1).getReg(), MRI); + if (!Extract) + return std::nullopt; + + if (Extract->MI->getOpcode() == TargetOpcode::G_UNMERGE_VALUES) { + if (Extract->Reg == Extract->MI->getOperand(1).getReg()) { + Register ExtReg = Extract->MI->getOperand(2).getReg(); + return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(ExtReg); }}}; + } + } + if (Extract->MI->getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT) { + LLT SrcTy = MRI.getType(Extract->MI->getOperand(1).getReg()); + auto LaneIdx = getIConstantVRegValWithLookThrough( + Extract->MI->getOperand(2).getReg(), MRI); + if (LaneIdx && SrcTy == LLT::fixed_vector(2, 64) && + LaneIdx->Value.getSExtValue() == 1) { + Register ExtReg = Extract->MI->getOperand(1).getReg(); + return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(ExtReg); }}}; + } } return std::nullopt; |
