mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 21:29:41 +00:00
ARM: Teach A15 SDOptimizer to properly handle D-reg by-lane.
These instructions, such as vmul.f32, require the second source operand to be in D0-D15 rather than the full D0-D31. When optimizing, make sure to account for that by constraining the register class of a replacement virtual register to be compatible with the virtual register(s) it's replacing. I've been unsuccessful in creating a non-fragile regression test. This issue was detected by the LLVM nightly test suite running on an A15 (Bullet). PR17093: http://llvm.org/bugs/show_bug.cgi?id=17093 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189972 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1d7df349ab
commit
1bfa80359e
@ -657,6 +657,13 @@ bool A15SDOptimizer::runOnInstruction(MachineInstr *MI) {
|
|||||||
Modified = true;
|
Modified = true;
|
||||||
for (SmallVectorImpl<MachineOperand *>::const_iterator I = Uses.begin(),
|
for (SmallVectorImpl<MachineOperand *>::const_iterator I = Uses.begin(),
|
||||||
E = Uses.end(); I != E; ++I) {
|
E = Uses.end(); I != E; ++I) {
|
||||||
|
// Make sure to constrain the register class of the new register to
|
||||||
|
// match what we're replacing. Otherwise we can optimize a DPR_VFP2
|
||||||
|
// reference into a plain DPR, and that will end poorly. NewReg is
|
||||||
|
// always virtual here, so there will always be a matching subclass
|
||||||
|
// to find.
|
||||||
|
MRI->constrainRegClass(NewReg, MRI->getRegClass((*I)->getReg()));
|
||||||
|
|
||||||
DEBUG(dbgs() << "Replacing operand "
|
DEBUG(dbgs() << "Replacing operand "
|
||||||
<< **I << " with "
|
<< **I << " with "
|
||||||
<< PrintReg(NewReg) << "\n");
|
<< PrintReg(NewReg) << "\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user