forked from OSchip/llvm-project
TableGen: avoid dereferencing nullptr variable
ARM64 ended up reaching odder parts of TableGen alias generation than current backends and caused a segfault. llvm-svn: 205089
This commit is contained in:
parent
753eca0f78
commit
3e38d290c8
|
@ -436,6 +436,7 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
|||
ResultOperand &ResOp) {
|
||||
Init *Arg = Result->getArg(AliasOpNo);
|
||||
DefInit *ADI = dyn_cast<DefInit>(Arg);
|
||||
Record *ResultRecord = ADI ? ADI->getDef() : 0;
|
||||
|
||||
if (ADI && ADI->getDef() == InstOpRec) {
|
||||
// If the operand is a record, it must have a name, and the record type
|
||||
|
@ -443,19 +444,25 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
|||
if (Result->getArgName(AliasOpNo).empty())
|
||||
PrintFatalError(Loc, "result argument #" + utostr(AliasOpNo) +
|
||||
" must have a name!");
|
||||
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ADI->getDef());
|
||||
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ResultRecord);
|
||||
return true;
|
||||
}
|
||||
|
||||
// For register operands, the source register class can be a subclass
|
||||
// of the instruction register class, not just an exact match.
|
||||
if (InstOpRec->isSubClassOf("RegisterOperand"))
|
||||
InstOpRec = InstOpRec->getValueAsDef("RegClass");
|
||||
|
||||
if (ADI && ADI->getDef()->isSubClassOf("RegisterOperand"))
|
||||
ADI = ADI->getDef()->getValueAsDef("RegClass")->getDefInit();
|
||||
|
||||
if (ADI && ADI->getDef()->isSubClassOf("RegisterClass")) {
|
||||
if (!InstOpRec->isSubClassOf("RegisterClass"))
|
||||
return false;
|
||||
if (!T.getRegisterClass(InstOpRec)
|
||||
.hasSubClass(&T.getRegisterClass(ADI->getDef())))
|
||||
return false;
|
||||
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ADI->getDef());
|
||||
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ResultRecord);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -468,9 +475,6 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
|||
InstOpRec = cast<DefInit>(DI->getArg(0))->getDef();
|
||||
}
|
||||
|
||||
if (InstOpRec->isSubClassOf("RegisterOperand"))
|
||||
InstOpRec = InstOpRec->getValueAsDef("RegClass");
|
||||
|
||||
if (!InstOpRec->isSubClassOf("RegisterClass"))
|
||||
return false;
|
||||
|
||||
|
@ -484,7 +488,7 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
|
|||
PrintFatalError(Loc, "result fixed register argument must "
|
||||
"not have a name!");
|
||||
|
||||
ResOp = ResultOperand(ADI->getDef());
|
||||
ResOp = ResultOperand(ResultRecord);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue