mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-14 14:24:05 +00:00
Fix machine-cp by having it to check sub-register indicies. e.g.
ecx = mov eax al = mov ch The second copy is not a nop because the sub-indices of ecx,ch is not the same of that of eax/al. Re-enabled machine-cp. PR11940 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151002 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -99,6 +99,31 @@ static bool NoInterveningSideEffect(const MachineInstr *CopyMI,
|
||||
return true;
|
||||
}
|
||||
|
||||
/// isNopCopy - Return true if the specified copy is really a nop. That is
|
||||
/// if the source of the copy is the same of the definition of the copy that
|
||||
/// supplied the source. If the source of the copy is a sub-register than it
|
||||
/// must check the sub-indices match. e.g.
|
||||
/// ecx = mov eax
|
||||
/// al = mov cl
|
||||
/// But not
|
||||
/// ecx = mov eax
|
||||
/// al = mov ch
|
||||
static bool isNopCopy(MachineInstr *CopyMI, unsigned Def, unsigned Src,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
unsigned SrcSrc = CopyMI->getOperand(1).getReg();
|
||||
if (Def == SrcSrc)
|
||||
return true;
|
||||
if (TRI->isSubRegister(SrcSrc, Def)) {
|
||||
unsigned SrcDef = CopyMI->getOperand(0).getReg();
|
||||
unsigned SubIdx = TRI->getSubRegIndex(SrcSrc, Def);
|
||||
if (!SubIdx)
|
||||
return false;
|
||||
return SubIdx == TRI->getSubRegIndex(SrcDef, Src);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
SmallSetVector<MachineInstr*, 8> MaybeDeadCopies; // Candidates for deletion
|
||||
DenseMap<unsigned, MachineInstr*> AvailCopyMap; // Def -> available copies map
|
||||
@ -122,10 +147,9 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
DenseMap<unsigned, MachineInstr*>::iterator CI = AvailCopyMap.find(Src);
|
||||
if (CI != AvailCopyMap.end()) {
|
||||
MachineInstr *CopyMI = CI->second;
|
||||
unsigned SrcSrc = CopyMI->getOperand(1).getReg();
|
||||
if (!ReservedRegs.test(Def) &&
|
||||
(!ReservedRegs.test(Src) || NoInterveningSideEffect(CopyMI, MI)) &&
|
||||
(SrcSrc == Def || TRI->isSubRegister(SrcSrc, Def))) {
|
||||
isNopCopy(CopyMI, Def, Src, TRI)) {
|
||||
// The two copies cancel out and the source of the first copy
|
||||
// hasn't been overridden, eliminate the second one. e.g.
|
||||
// %ECX<def> = COPY %EAX<kill>
|
||||
|
Reference in New Issue
Block a user