From a9d2c2042ea104098494fcb573ced7b57266a235 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Mon, 14 Jul 2008 17:15:45 +0000 Subject: [PATCH] Ignore TargetConstant with an illegal type. These 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. llvm-svn: 53553 --- lib/CodeGen/SelectionDAG/LegalizeTypes.cpp | 28 ++++++++++++++-------- lib/CodeGen/SelectionDAG/LegalizeTypes.h | 5 ++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index 285d797e351..5c04de912d1 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -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; } diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/lib/CodeGen/SelectionDAG/LegalizeTypes.h index b60ad2708fa..4063c975877 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -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 PromotedIntegers;