openbsd-ports/devel/llvm/patches/patch-lib_Target_ARM_A15SDOptimizer_cpp
brad 5508a97976 Bring in fixes from 3.4.1 / 3.4.2 that do not already exist in the
3.5 snapshot (which around 60% of them did)..

r203025, r203050, r203054, r203281, r203581, r203719, r203818, r204155, r204304,
r205067, r205630, r205738, r207990, r208501.

ok matthew@
2014-07-10 22:46:37 +00:00

41 lines
1.8 KiB
Plaintext

$OpenBSD: patch-lib_Target_ARM_A15SDOptimizer_cpp,v 1.1 2014/07/10 22:46:37 brad Exp $
r204304
Fix an assertion failure in A15SDOptimizer about DPair reg class by treating DPair as QPR.
--- lib/Target/ARM/A15SDOptimizer.cpp.orig Sun Mar 2 21:57:40 2014
+++ lib/Target/ARM/A15SDOptimizer.cpp Sat Jun 14 04:09:54 2014
@@ -416,7 +416,8 @@ SmallVector<unsigned, 8> A15SDOptimizer::getReadDPRs(M
if (!MO.isReg() || !MO.isUse())
continue;
if (!usesRegClass(MO, &ARM::DPRRegClass) &&
- !usesRegClass(MO, &ARM::QPRRegClass))
+ !usesRegClass(MO, &ARM::QPRRegClass) &&
+ !usesRegClass(MO, &ARM::DPairRegClass)) // Treat DPair as QPR
continue;
Defs.push_back(MO.getReg());
@@ -536,7 +537,10 @@ A15SDOptimizer::optimizeAllLanesPattern(MachineInstr *
InsertPt++;
unsigned Out;
- if (MRI->getRegClass(Reg)->hasSuperClassEq(&ARM::QPRRegClass)) {
+ // DPair has the same length as QPR and also has two DPRs as subreg.
+ // Treat DPair as QPR.
+ if (MRI->getRegClass(Reg)->hasSuperClassEq(&ARM::QPRRegClass) ||
+ MRI->getRegClass(Reg)->hasSuperClassEq(&ARM::DPairRegClass)) {
unsigned DSub0 = createExtractSubreg(MBB, InsertPt, DL, Reg,
ARM::dsub_0, &ARM::DPRRegClass);
unsigned DSub1 = createExtractSubreg(MBB, InsertPt, DL, Reg,
@@ -569,7 +573,9 @@ A15SDOptimizer::optimizeAllLanesPattern(MachineInstr *
default: llvm_unreachable("Unknown preferred lane!");
}
- bool UsesQPR = usesRegClass(MI->getOperand(0), &ARM::QPRRegClass);
+ // Treat DPair as QPR
+ bool UsesQPR = usesRegClass(MI->getOperand(0), &ARM::QPRRegClass) ||
+ usesRegClass(MI->getOperand(0), &ARM::DPairRegClass);
Out = createImplicitDef(MBB, InsertPt, DL);
Out = createInsertSubreg(MBB, InsertPt, DL, Out, PrefLane, Reg);