[llvm] r270166 - [RegBankSelect] Refactor assignmentMatch to avoid testing the current

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Thu May 19 17:42:59 PDT 2016


Author: qcolombet
Date: Thu May 19 19:42:57 2016
New Revision: 270166

URL: http://llvm.org/viewvc/llvm-project?rev=270166&view=rev
Log:
[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.

Modified:
    llvm/trunk/include/llvm/CodeGen/GlobalISel/RegBankSelect.h
    llvm/trunk/lib/CodeGen/GlobalISel/RegBankSelect.cpp

Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/RegBankSelect.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/RegBankSelect.h?rev=270166&r1=270165&r2=270166&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/GlobalISel/RegBankSelect.h (original)
+++ llvm/trunk/include/llvm/CodeGen/GlobalISel/RegBankSelect.h Thu May 19 19:42:57 2016
@@ -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

Modified: llvm/trunk/lib/CodeGen/GlobalISel/RegBankSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/RegBankSelect.cpp?rev=270166&r1=270165&r2=270166&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/RegBankSelect.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/RegBankSelect.cpp Thu May 19 19:42:57 2016
@@ -41,7 +41,10 @@ void RegBankSelect::init(MachineFunction
 }
 
 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(MachineI
     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(MachineI
     // 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




More information about the llvm-commits mailing list