@@ -1536,10 +1536,13 @@ StringRef maybeGetValueNameFromLoc(Value value, StringRef name) {
15361536} // namespace
15371537
15381538void SSANameState::numberValuesInRegion (Region ®ion) {
1539+ // indicate whether OpAsmOpInterface set a name
1540+ bool opAsmOpInterfaceUsed = false ;
15391541 auto setBlockArgNameFn = [&](Value arg, StringRef name) {
15401542 assert (!valueIDs.count (arg) && " arg numbered multiple times" );
15411543 assert (llvm::cast<BlockArgument>(arg).getOwner ()->getParent () == ®ion &&
15421544 " arg not defined in current region" );
1545+ opAsmOpInterfaceUsed = true ;
15431546 if (LLVM_UNLIKELY (printerFlags.shouldUseNameLocAsPrefix ()))
15441547 name = maybeGetValueNameFromLoc (arg, name);
15451548 setValueName (arg, name);
@@ -1549,6 +1552,23 @@ void SSANameState::numberValuesInRegion(Region ®ion) {
15491552 if (Operation *op = region.getParentOp ()) {
15501553 if (auto asmInterface = dyn_cast<OpAsmOpInterface>(op))
15511554 asmInterface.getAsmBlockArgumentNames (region, setBlockArgNameFn);
1555+ if (!opAsmOpInterfaceUsed) {
1556+ // If the OpAsmOpInterface didn't set a name, and when
1557+ // all arguments have OpAsmTypeInterface, get names from the type
1558+ bool allHaveOpAsmTypeInterface =
1559+ llvm::all_of (region.getArguments (), [&](Value arg) {
1560+ return mlir::isa<OpAsmTypeInterface>(arg.getType ());
1561+ });
1562+ if (allHaveOpAsmTypeInterface) {
1563+ for (auto arg : region.getArguments ()) {
1564+ auto typeInterface = mlir::cast<OpAsmTypeInterface>(arg.getType ());
1565+ auto setNameFn = [&](StringRef name) {
1566+ setBlockArgNameFn (arg, name);
1567+ };
1568+ typeInterface.getAsmName (setNameFn);
1569+ }
1570+ }
1571+ }
15521572 }
15531573 }
15541574
@@ -1598,9 +1618,12 @@ void SSANameState::numberValuesInBlock(Block &block) {
15981618void SSANameState::numberValuesInOp (Operation &op) {
15991619 // Function used to set the special result names for the operation.
16001620 SmallVector<int , 2 > resultGroups (/* Size=*/ 1 , /* Value=*/ 0 );
1621+ // indicating whether OpAsmOpInterface set a name
1622+ bool opAsmOpInterfaceUsed = false ;
16011623 auto setResultNameFn = [&](Value result, StringRef name) {
16021624 assert (!valueIDs.count (result) && " result numbered multiple times" );
16031625 assert (result.getDefiningOp () == &op && " result not defined by 'op'" );
1626+ opAsmOpInterfaceUsed = true ;
16041627 if (LLVM_UNLIKELY (printerFlags.shouldUseNameLocAsPrefix ()))
16051628 name = maybeGetValueNameFromLoc (result, name);
16061629 setValueName (result, name);
@@ -1630,6 +1653,23 @@ void SSANameState::numberValuesInOp(Operation &op) {
16301653 asmInterface.getAsmBlockNames (setBlockNameFn);
16311654 asmInterface.getAsmResultNames (setResultNameFn);
16321655 }
1656+ if (!opAsmOpInterfaceUsed) {
1657+ // If the OpAsmOpInterface didn't set a name, and when
1658+ // all results have OpAsmTypeInterface, get names from the type
1659+ bool allHaveOpAsmTypeInterface =
1660+ llvm::all_of (op.getResults (), [&](Value result) {
1661+ return mlir::isa<OpAsmTypeInterface>(result.getType ());
1662+ });
1663+ if (allHaveOpAsmTypeInterface) {
1664+ for (auto result : op.getResults ()) {
1665+ auto typeInterface = mlir::cast<OpAsmTypeInterface>(result.getType ());
1666+ auto setNameFn = [&](StringRef name) {
1667+ setResultNameFn (result, name);
1668+ };
1669+ typeInterface.getAsmName (setNameFn);
1670+ }
1671+ }
1672+ }
16331673 }
16341674
16351675 unsigned numResults = op.getNumResults ();
0 commit comments