@@ -436,26 +436,33 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
436
436
ResultOperand &ResOp) {
437
437
Init *Arg = Result->getArg (AliasOpNo);
438
438
DefInit *ADI = dyn_cast<DefInit>(Arg);
439
+ Record *ResultRecord = ADI ? ADI->getDef () : 0 ;
439
440
440
441
if (ADI && ADI->getDef () == InstOpRec) {
441
442
// If the operand is a record, it must have a name, and the record type
442
443
// must match up with the instruction's argument type.
443
444
if (Result->getArgName (AliasOpNo).empty ())
444
445
PrintFatalError (Loc, " result argument #" + utostr (AliasOpNo) +
445
446
" must have a name!" );
446
- ResOp = ResultOperand (Result->getArgName (AliasOpNo), ADI-> getDef () );
447
+ ResOp = ResultOperand (Result->getArgName (AliasOpNo), ResultRecord );
447
448
return true ;
448
449
}
449
450
450
451
// For register operands, the source register class can be a subclass
451
452
// of the instruction register class, not just an exact match.
453
+ if (InstOpRec->isSubClassOf (" RegisterOperand" ))
454
+ InstOpRec = InstOpRec->getValueAsDef (" RegClass" );
455
+
456
+ if (ADI && ADI->getDef ()->isSubClassOf (" RegisterOperand" ))
457
+ ADI = ADI->getDef ()->getValueAsDef (" RegClass" )->getDefInit ();
458
+
452
459
if (ADI && ADI->getDef ()->isSubClassOf (" RegisterClass" )) {
453
460
if (!InstOpRec->isSubClassOf (" RegisterClass" ))
454
461
return false ;
455
462
if (!T.getRegisterClass (InstOpRec)
456
463
.hasSubClass (&T.getRegisterClass (ADI->getDef ())))
457
464
return false ;
458
- ResOp = ResultOperand (Result->getArgName (AliasOpNo), ADI-> getDef () );
465
+ ResOp = ResultOperand (Result->getArgName (AliasOpNo), ResultRecord );
459
466
return true ;
460
467
}
461
468
@@ -468,9 +475,6 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
468
475
InstOpRec = cast<DefInit>(DI->getArg (0 ))->getDef ();
469
476
}
470
477
471
- if (InstOpRec->isSubClassOf (" RegisterOperand" ))
472
- InstOpRec = InstOpRec->getValueAsDef (" RegClass" );
473
-
474
478
if (!InstOpRec->isSubClassOf (" RegisterClass" ))
475
479
return false ;
476
480
@@ -484,7 +488,7 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
484
488
PrintFatalError (Loc, " result fixed register argument must "
485
489
" not have a name!" );
486
490
487
- ResOp = ResultOperand (ADI-> getDef () );
491
+ ResOp = ResultOperand (ResultRecord );
488
492
return true ;
489
493
}
490
494
0 commit comments