mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[PowerPC] Don't remove self VSX copies in PPCInstrInfo::copyPhysReg
Because of how the allocation of VSX registers interacts with the call-lowering code, we sometimes end up generating self VSX copies. Specifically, things like this: %VSL2<def> = COPY %F2, %VSL2<imp-use,kill> (where %F2 is really a sub-register of %VSL2, and so this copy is a nop) The problem is that ExpandPostRAPseudos always assumes that *some* instruction has been inserted, and adds implicit defs to it. This is a problem if no copy was inserted because it can cause subtle problems during post-RA scheduling. These self copies will have to be removed some other way. llvm-svn: 204976
This commit is contained in:
parent
dfb76375a4
commit
ee610c3b4d
@ -51,6 +51,10 @@ cl::desc("Disable compare instruction optimization"), cl::Hidden);
|
||||
static cl::opt<bool> DisableVSXFMAMutate("disable-ppc-vsx-fma-mutation",
|
||||
cl::desc("Disable VSX FMA instruction mutation"), cl::Hidden);
|
||||
|
||||
static cl::opt<bool> VSXSelfCopyCrash("crash-on-ppc-vsx-self-copy",
|
||||
cl::desc("Causes the backend to crash instead of generating a nop VSX copy"),
|
||||
cl::Hidden);
|
||||
|
||||
// Pin the vtable to this file.
|
||||
void PPCInstrInfo::anchor() {}
|
||||
|
||||
@ -679,15 +683,15 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
bool KillSrc) const {
|
||||
// We can end up with self copies and similar things as a result of VSX copy
|
||||
// legalization. Promote (or just ignore) them here.
|
||||
// legalization. Promote them here.
|
||||
const TargetRegisterInfo *TRI = &getRegisterInfo();
|
||||
if (PPC::F8RCRegClass.contains(DestReg) &&
|
||||
PPC::VSLRCRegClass.contains(SrcReg)) {
|
||||
unsigned SuperReg =
|
||||
TRI->getMatchingSuperReg(DestReg, PPC::sub_64, &PPC::VSRCRegClass);
|
||||
|
||||
if (SrcReg == SuperReg)
|
||||
return;
|
||||
if (VSXSelfCopyCrash && SrcReg == SuperReg)
|
||||
llvm_unreachable("nop VSX copy");
|
||||
|
||||
DestReg = SuperReg;
|
||||
} else if (PPC::VRRCRegClass.contains(DestReg) &&
|
||||
@ -695,8 +699,8 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
unsigned SuperReg =
|
||||
TRI->getMatchingSuperReg(DestReg, PPC::sub_128, &PPC::VSRCRegClass);
|
||||
|
||||
if (SrcReg == SuperReg)
|
||||
return;
|
||||
if (VSXSelfCopyCrash && SrcReg == SuperReg)
|
||||
llvm_unreachable("nop VSX copy");
|
||||
|
||||
DestReg = SuperReg;
|
||||
} else if (PPC::F8RCRegClass.contains(SrcReg) &&
|
||||
@ -704,8 +708,8 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
unsigned SuperReg =
|
||||
TRI->getMatchingSuperReg(SrcReg, PPC::sub_64, &PPC::VSRCRegClass);
|
||||
|
||||
if (DestReg == SuperReg)
|
||||
return;
|
||||
if (VSXSelfCopyCrash && DestReg == SuperReg)
|
||||
llvm_unreachable("nop VSX copy");
|
||||
|
||||
SrcReg = SuperReg;
|
||||
} else if (PPC::VRRCRegClass.contains(SrcReg) &&
|
||||
@ -713,8 +717,8 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
unsigned SuperReg =
|
||||
TRI->getMatchingSuperReg(SrcReg, PPC::sub_128, &PPC::VSRCRegClass);
|
||||
|
||||
if (DestReg == SuperReg)
|
||||
return;
|
||||
if (VSXSelfCopyCrash && DestReg == SuperReg)
|
||||
llvm_unreachable("nop VSX copy");
|
||||
|
||||
SrcReg = SuperReg;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user