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:
parent
f5a55301e0
commit
a9d2c2042e
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user