Ignore TargetConstant with an illegal type. These
authorDuncan Sands <baldrick@free.fr>
Mon, 14 Jul 2008 17:15:45 +0000 (17:15 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 14 Jul 2008 17:15:45 +0000 (17:15 +0000)
are used for passing huge immediates in inline ASM
from the front-end straight down to the ASM writer.
Of course this is a hack, but it is simple, limited
in scope, works in practice, and is what LegalizeDAG
does.

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

lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
lib/CodeGen/SelectionDAG/LegalizeTypes.h

index 285d797e3517d0328eb023bd7b442c573614b1bd..5c04de912d13019ff836ccf9834bd68d8d715881 100644 (file)
@@ -60,11 +60,12 @@ void DAGTypeLegalizer::run() {
     assert(N->getNodeId() == ReadyToProcess &&
            "Node should be ready if on worklist!");
 
+    if (IgnoreNodeResults(N))
+      goto ScanOperands;
+
     // Scan the values produced by the node, checking to see if any result
     // types are illegal.
-    unsigned i = 0;
-    unsigned NumResults = N->getNumValues();
-    do {
+    for (unsigned i = 0, NumResults = N->getNumValues(); i < NumResults; ++i) {
       MVT ResultVT = N->getValueType(i);
       switch (getTypeAction(ResultVT)) {
       default:
@@ -90,14 +91,19 @@ void DAGTypeLegalizer::run() {
         SplitVectorResult(N, i);
         goto NodeDone;
       }
-    } while (++i < NumResults);
+    }
 
+ScanOperands:
     // Scan the operand list for the node, handling any nodes with operands that
     // are illegal.
     {
     unsigned NumOperands = N->getNumOperands();
     bool NeedsRevisit = false;
+    unsigned i;
     for (i = 0; i != NumOperands; ++i) {
+      if (IgnoreNodeResults(N->getOperand(i).Val))
+        continue;
+
       MVT OpVT = N->getOperand(i).getValueType();
       switch (getTypeAction(OpVT)) {
       default:
@@ -187,15 +193,17 @@ NodeDone:
     bool Failed = false;
 
     // Check that all result types are legal.
-    for (unsigned i = 0, NumVals = I->getNumValues(); i < NumVals; ++i)
-      if (!isTypeLegal(I->getValueType(i))) {
-        cerr << "Result type " << i << " illegal!\n";
-        Failed = true;
-      }
+    if (!IgnoreNodeResults(I))
+      for (unsigned i = 0, NumVals = I->getNumValues(); i < NumVals; ++i)
+        if (!isTypeLegal(I->getValueType(i))) {
+          cerr << "Result type " << i << " illegal!\n";
+          Failed = true;
+        }
 
     // Check that all operand types are legal.
     for (unsigned i = 0, NumOps = I->getNumOperands(); i < NumOps; ++i)
-      if (!isTypeLegal(I->getOperand(i).getValueType())) {
+      if (!IgnoreNodeResults(I->getOperand(i).Val) &&
+          !isTypeLegal(I->getOperand(i).getValueType())) {
         cerr << "Operand type " << i << " illegal!\n";
         Failed = true;
       }
index b60ad2708fa96bec6ac6f218a9db41faf8345554..4063c975877e5eb24f2d69245d55196ece491b07 100644 (file)
@@ -105,6 +105,11 @@ private:
     return ValueTypeActions.getTypeAction(VT) == TargetLowering::Legal;
   }
 
+  /// IgnoreNodeResults - Pretend all of this node's results are legal.
+  bool IgnoreNodeResults(SDNode *N) const {
+    return N->getOpcode() == ISD::TargetConstant;
+  }
+
   /// PromotedIntegers - For integer nodes that are below legal width, this map
   /// indicates what promoted value to use.
   DenseMap<SDOperand, SDOperand> PromotedIntegers;