[RegBankSelect] Refactor assignmentMatch to avoid testing the current

register bank twice.

Prior to this change, we were checking if the assignment for the current
machine operand was matching, then we would check if the mismatch
requires to insert repair code.
We actually already have this information from the first check, so just
pass it along.

NFCI.

llvm-svn: 270166
This commit is contained in:
Quentin Colombet 2016-05-20 00:42:57 +00:00
parent 78d947b4f5
commit 0d77da4ef8
2 changed files with 15 additions and 5 deletions

View File

@ -164,8 +164,12 @@ private:
void init(MachineFunction &MF);
/// Check if \p Reg is already assigned what is described by \p ValMapping.
/// \p OnlyAssign == true means that \p Reg just needs to be assigned a
/// register bank. I.e., no repairing is necessary to have the
/// assignment match.
bool assignmentMatch(unsigned Reg,
const RegisterBankInfo::ValueMapping &ValMapping) const;
const RegisterBankInfo::ValueMapping &ValMapping,
bool &OnlyAssign) const;
/// Insert repairing code for \p Reg as specified by \p ValMapping.
/// The repairing code is inserted before \p DefUseMI if \p IsDef is false

View File

@ -41,7 +41,10 @@ void RegBankSelect::init(MachineFunction &MF) {
}
bool RegBankSelect::assignmentMatch(
unsigned Reg, const RegisterBankInfo::ValueMapping &ValMapping) const {
unsigned Reg, const RegisterBankInfo::ValueMapping &ValMapping,
bool &OnlyAssign) const {
// By default we assume we will have to repair something.
OnlyAssign = false;
// Each part of a break down needs to end up in a different register.
// In other word, Reg assignement does not match.
if (ValMapping.BreakDown.size() > 1)
@ -49,6 +52,9 @@ bool RegBankSelect::assignmentMatch(
const RegisterBank *CurRegBank = RBI->getRegBank(Reg, *MRI, *TRI);
const RegisterBank *DesiredRegBrank = ValMapping.BreakDown[0].RegBank;
// Reg is free of assignment, a simple assignment will make the
// register bank to match.
OnlyAssign = CurRegBank == nullptr;
DEBUG(dbgs() << "Does assignment already match: ";
if (CurRegBank) dbgs() << *CurRegBank; else dbgs() << "none";
dbgs() << " against ";
@ -194,7 +200,8 @@ void RegBankSelect::assignInstr(MachineInstr &MI) {
const RegisterBankInfo::ValueMapping &ValMapping =
DefaultMapping.getOperandMapping(OpIdx);
// If Reg is already properly mapped, move on.
if (assignmentMatch(Reg, ValMapping))
bool OnlyAssign;
if (assignmentMatch(Reg, ValMapping, OnlyAssign))
continue;
// For uses, we may need to create a new temporary.
@ -210,8 +217,7 @@ void RegBankSelect::assignInstr(MachineInstr &MI) {
// Therefore, create a new temporary for Reg.
assert(ValMapping.BreakDown.size() == 1 &&
"Support for complex break down not supported yet");
if (TargetRegisterInfo::isPhysicalRegister(Reg) ||
MRI->getRegClassOrRegBank(Reg)) {
if (!OnlyAssign) {
if (!MO.isDef() && MI.isPHI()) {
// Phis are already copies, so there is nothing to repair.
// Note: This will not hold when we support break downs with