[NFC] [TargetRegisterInfo] add one use check to lookThruCopyLike.

add one use check to lookThruCopyLike.

The root node is safe to be deleted if we are sure that every
definition in the copy chain only has one use.

Reviewed By: jsji

Differential Revision: https://reviews.llvm.org/D92069
This commit is contained in:
Chen Zheng 2021-01-17 19:56:42 -05:00
parent f855751c12
commit 3bdf4507b6
2 changed files with 19 additions and 7 deletions

View File

@ -410,10 +410,13 @@ public:
/// Returns the original SrcReg unless it is the target of a copy-like
/// operation, in which case we chain backwards through all such operations
/// to the ultimate source register. If a physical register is encountered,
/// to the ultimate source register. If a physical register is encountered,
/// we stop the search.
/// If one definition in the copy chain has multiple uses, set \p
/// AllDefHaveOneUser to false, otherwise set it to true.
virtual Register lookThruCopyLike(Register SrcReg,
const MachineRegisterInfo *MRI) const;
const MachineRegisterInfo *MRI,
bool *AllDefHaveOneUser = nullptr) const;
/// Return a null-terminated list of all of the callee-saved registers on
/// this target. The register should be in the order of desired callee-save

View File

@ -510,13 +510,19 @@ TargetRegisterInfo::getRegSizeInBits(Register Reg,
return getRegSizeInBits(*RC);
}
Register
TargetRegisterInfo::lookThruCopyLike(Register SrcReg,
const MachineRegisterInfo *MRI) const {
Register TargetRegisterInfo::lookThruCopyLike(Register SrcReg,
const MachineRegisterInfo *MRI,
bool *AllDefHaveOneUser) const {
if (AllDefHaveOneUser)
*AllDefHaveOneUser = true;
while (true) {
const MachineInstr *MI = MRI->getVRegDef(SrcReg);
if (!MI->isCopyLike())
if (!MI->isCopyLike()) {
if (AllDefHaveOneUser && !MRI->hasOneNonDBGUse(SrcReg))
*AllDefHaveOneUser = false;
return SrcReg;
}
Register CopySrcReg;
if (MI->isCopy())
@ -526,8 +532,11 @@ TargetRegisterInfo::lookThruCopyLike(Register SrcReg,
CopySrcReg = MI->getOperand(2).getReg();
}
if (!CopySrcReg.isVirtual())
if (!CopySrcReg.isVirtual()) {
if (AllDefHaveOneUser)
*AllDefHaveOneUser = false;
return CopySrcReg;
}
SrcReg = CopySrcReg;
}