summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2016-05-20 00:42:57 +0000
committerQuentin Colombet <qcolombet@apple.com>2016-05-20 00:42:57 +0000
commit0d77da4ef808c8e06b26dd3cc3595e8dcd94c14d (patch)
treefe09873f47836b889cf52de933a7884df385d6bc /llvm/lib
parent78d947b4f59fd12f370e5ab132a36aeb5e6d3bfd (diff)
downloadbcm5719-llvm-0d77da4ef808c8e06b26dd3cc3595e8dcd94c14d.tar.gz
bcm5719-llvm-0d77da4ef808c8e06b26dd3cc3595e8dcd94c14d.zip
[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
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp b/llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp
index 2bd1534d722..76442ad278a 100644
--- a/llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp
@@ -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
OpenPOWER on IntegriCloud