diff options
| author | Hal Finkel <hfinkel@anl.gov> | 2014-03-27 22:46:28 +0000 |
|---|---|---|
| committer | Hal Finkel <hfinkel@anl.gov> | 2014-03-27 22:46:28 +0000 |
| commit | 9dcb3583d5743278f53865dc922beca20369e7db (patch) | |
| tree | 2ca5425bb6be0112239c78b41e23652c66ea0c43 | |
| parent | de76f4a39f6af93585a3156907176d848ab2c6e5 (diff) | |
| download | bcm5719-llvm-9dcb3583d5743278f53865dc922beca20369e7db.tar.gz bcm5719-llvm-9dcb3583d5743278f53865dc922beca20369e7db.zip | |
[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
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCInstrInfo.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp index a657869e2b4..be4dafa0e30 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.cpp @@ -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; } |

