diff options
Diffstat (limited to 'llvm/lib/Target/ARM/NEONPreAllocPass.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/NEONPreAllocPass.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/NEONPreAllocPass.cpp b/llvm/lib/Target/ARM/NEONPreAllocPass.cpp index 4440611d801..a8df364d6d9 100644 --- a/llvm/lib/Target/ARM/NEONPreAllocPass.cpp +++ b/llvm/lib/Target/ARM/NEONPreAllocPass.cpp @@ -360,7 +360,7 @@ bool NEONPreAllocPass::FormsRegSequence(MachineInstr *MI, return false; RegSeq = UseMI; } else { - // Extracting from a Q register. + // Extracting from a Q or QQ register. MachineInstr *DefMI = MRI->getVRegDef(VirtReg); if (!DefMI || !DefMI->isExtractSubreg()) return false; @@ -368,8 +368,11 @@ bool NEONPreAllocPass::FormsRegSequence(MachineInstr *MI, if (LastSrcReg && LastSrcReg != VirtReg) return false; const TargetRegisterClass *RC = MRI->getRegClass(VirtReg); - if (RC != ARM::QPRRegisterClass) - return false; + if (NumRegs == 2) { + if (RC != ARM::QPRRegisterClass) + return false; + } else if (RC != ARM::QQPRRegisterClass) + return false; unsigned SubIdx = DefMI->getOperand(2).getImm(); if (LastSubIdx && LastSubIdx != SubIdx-1) return false; |