aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorVladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com>2023-09-01 18:38:26 +0200
committerVladislav Dzhidzhoev <vdzhidzhoev@accesssoftek.com>2023-09-07 14:08:20 +0200
commit0de6baab91645d305b0e87fd8e347009bc607ee4 (patch)
tree961e0e46dddbfb14c57c9ed5da21a843977c81c3 /llvm/lib
parent69036eb7358b4fec7cf23e372c68852a02aed988 (diff)
downloadllvm-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.cpp28
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;