1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

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
This commit is contained in:
Duncan Sands 2008-07-14 17:15:45 +00:00
parent f5a55301e0
commit a9d2c2042e
2 changed files with 23 additions and 10 deletions

View 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;
}

View 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;