mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-13 08:35:46 +00:00
Fix ARM vector copies of overlapping register tuples.
I have tested the fix, but have not been successfull in generating a robust unit test. This can only be exposed through particular register assignments. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162821 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d79dedd458
commit
f26e43df26
@ -710,10 +710,23 @@ void ARMBaseInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
|
||||
const TargetRegisterInfo *TRI = &getRegisterInfo();
|
||||
MachineInstrBuilder Mov;
|
||||
|
||||
// Copy register tuples backward when the first Dest reg overlaps with SrcReg.
|
||||
if (TRI->regsOverlap(SrcReg, TRI->getSubReg(DestReg, BeginIdx))) {
|
||||
BeginIdx = BeginIdx + ((SubRegs-1)*Spacing);
|
||||
Spacing = -Spacing;
|
||||
}
|
||||
#ifndef NDEBUG
|
||||
SmallSet<unsigned, 4> DstRegs;
|
||||
#endif
|
||||
for (unsigned i = 0; i != SubRegs; ++i) {
|
||||
unsigned Dst = TRI->getSubReg(DestReg, BeginIdx + i*Spacing);
|
||||
unsigned Src = TRI->getSubReg(SrcReg, BeginIdx + i*Spacing);
|
||||
assert(Dst && Src && "Bad sub-register");
|
||||
#ifndef NDEBUG
|
||||
DstRegs.insert(Dst);
|
||||
assert(!DstRegs.count(Src) && "destructive vector copy");
|
||||
#endif
|
||||
Mov = BuildMI(MBB, I, I->getDebugLoc(), get(Opc), Dst)
|
||||
.addReg(Src);
|
||||
// VORR takes two source operands.
|
||||
|
Loading…
x
Reference in New Issue
Block a user