@@ -1536,10 +1536,13 @@ StringRef maybeGetValueNameFromLoc(Value value, StringRef name) {
15361536} // namespace
15371537
15381538void SSANameState::numberValuesInRegion (Region ®ion) {
1539+ // Indicates 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,15 @@ 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 the OpAsmOpInterface didn't set a name, get name from the type.
1556+ if (!opAsmOpInterfaceUsed) {
1557+ for (BlockArgument arg : region.getArguments ()) {
1558+ if (auto interface = dyn_cast<OpAsmTypeInterface>(arg.getType ())) {
1559+ interface.getAsmName (
1560+ [&](StringRef name) { setBlockArgNameFn (arg, name); });
1561+ }
1562+ }
1563+ }
15521564 }
15531565 }
15541566
@@ -1598,9 +1610,12 @@ void SSANameState::numberValuesInBlock(Block &block) {
15981610void SSANameState::numberValuesInOp (Operation &op) {
15991611 // Function used to set the special result names for the operation.
16001612 SmallVector<int , 2 > resultGroups (/* Size=*/ 1 , /* Value=*/ 0 );
1613+ // Indicates whether OpAsmOpInterface set a name.
1614+ bool opAsmOpInterfaceUsed = false ;
16011615 auto setResultNameFn = [&](Value result, StringRef name) {
16021616 assert (!valueIDs.count (result) && " result numbered multiple times" );
16031617 assert (result.getDefiningOp () == &op && " result not defined by 'op'" );
1618+ opAsmOpInterfaceUsed = true ;
16041619 if (LLVM_UNLIKELY (printerFlags.shouldUseNameLocAsPrefix ()))
16051620 name = maybeGetValueNameFromLoc (result, name);
16061621 setValueName (result, name);
@@ -1630,6 +1645,21 @@ void SSANameState::numberValuesInOp(Operation &op) {
16301645 asmInterface.getAsmBlockNames (setBlockNameFn);
16311646 asmInterface.getAsmResultNames (setResultNameFn);
16321647 }
1648+ if (!opAsmOpInterfaceUsed) {
1649+ // If the OpAsmOpInterface didn't set a name, and all results have
1650+ // OpAsmTypeInterface, get names from types.
1651+ bool allHaveOpAsmTypeInterface =
1652+ llvm::all_of (op.getResultTypes (), [&](Type type) {
1653+ return isa<OpAsmTypeInterface>(type);
1654+ });
1655+ if (allHaveOpAsmTypeInterface) {
1656+ for (OpResult result : op.getResults ()) {
1657+ auto interface = cast<OpAsmTypeInterface>(result.getType ());
1658+ interface.getAsmName (
1659+ [&](StringRef name) { setResultNameFn (result, name); });
1660+ }
1661+ }
1662+ }
16331663 }
16341664
16351665 unsigned numResults = op.getNumResults ();
0 commit comments