Be more clever about regclasses in ScheduleDAGSDNodes::EmitCopyFromReg.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sun, 16 Aug 2009 17:40:59 +0000 (17:40 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sun, 16 Aug 2009 17:40:59 +0000 (17:40 +0000)
If two uses of a CopyFromReg want different regclasses, first try a common
sub-class, then fall back on the copy emitted in AddRegisterOperand. There is
no need for an assert here. The cross-class joiner usually cleans up nicely.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79193 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/ScheduleDAGSDNodesEmit.cpp

index 12b5d143f8f25efb1abdc14262bf2f1308832ca4..17684f528af46e348dfad535d40a8daabfca445d 100644 (file)
@@ -81,11 +81,11 @@ EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone, bool IsCloned,
             if (!UseRC)
               UseRC = RC;
             else if (RC) {
-              if (UseRC->hasSuperClass(RC))
-                UseRC = RC;
-              else
-                assert((UseRC == RC || RC->hasSuperClass(UseRC)) &&
-                       "Multiple uses expecting different register classes!");
+              const TargetRegisterClass *ComRC = getCommonSubClass(UseRC, RC);
+              // If multiple uses expect disjoint register classes, we emit
+              // copies in AddRegisterOperand.
+              if (ComRC)
+                UseRC = ComRC;
             }
           }
         }