[llvm-dev] InstrEmitter::CreateVirtualRegisters handling of	CopyToReg
    Jonas Paulsson via llvm-dev 
    llvm-dev at lists.llvm.org
       
    Wed May 30 06:02:57 PDT 2018
    
    
  
Hi,
I wonder if anyone has any comment on a patch like:
diff --git a/lib/CodeGen/SelectionDAG/InstrEmitter.cpp 
b/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
index 65ee3816f84..4780f6f0e59 100644
--- a/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
+++ b/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
@@ -243,18 +243,21 @@ void InstrEmitter::CreateVirtualRegisters(SDNode 
*Node,
      if (!VRBase && !IsClone && !IsCloned)
        for (SDNode *User : Node->uses()) {
          if (User->getOpcode() == ISD::CopyToReg &&
              User->getOperand(2).getNode() == Node &&
              User->getOperand(2).getResNo() == i) {
            unsigned Reg = 
cast<RegisterSDNode>(User->getOperand(1))->getReg();
            if (TargetRegisterInfo::isVirtualRegister(Reg)) {
-            const TargetRegisterClass *RegRC = MRI->getRegClass(Reg);
-            if (RegRC == RC) {
+            // Allow constraining the virtual register's class within 
reason,
+            // just like what AddRegisterOperand will allow.
+            const TargetRegisterClass *ConstrainedRC
+              = MRI->constrainRegClass(Reg, RC, MinRCSize);
+            if (ConstrainedRC) {
                VRBase = Reg;
                MIB.addReg(VRBase, RegState::Define);
                break;
              }
            }
          }
        }
Why do the register classes currently have to match exactly in this case?
It seems that these COPYs that now remain may end up in the same 
register class, if the users require it. So why not constrain also here 
directly, if this is done generally when the register is used as input?
/Jonas
    
    
More information about the llvm-dev
mailing list