Skip to content

Commit 7f98e5a

Browse files
[MLIR][LLVM] Fix llvm.mlir.global mismatching print and parser order (#138986)
`GlobalOp` was parsing `thread_local` after `unnamed_addr`, but printing in the reverse order. While here, make `AliasOp` match the same behavior and share common parts of global and alias printing.
1 parent 652ab98 commit 7f98e5a

File tree

3 files changed

+20
-24
lines changed

3 files changed

+20
-24
lines changed

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,18 +2215,23 @@ void GlobalOp::build(OpBuilder &builder, OperationState &result, Type type,
22152215
result.addRegion();
22162216
}
22172217

2218-
void GlobalOp::print(OpAsmPrinter &p) {
2219-
p << ' ' << stringifyLinkage(getLinkage()) << ' ';
2220-
StringRef visibility = stringifyVisibility(getVisibility_());
2218+
template <typename OpType>
2219+
static void printCommonGlobalAndAlias(OpAsmPrinter &p, OpType op) {
2220+
p << ' ' << stringifyLinkage(op.getLinkage()) << ' ';
2221+
StringRef visibility = stringifyVisibility(op.getVisibility_());
22212222
if (!visibility.empty())
22222223
p << visibility << ' ';
2223-
if (getThreadLocal_())
2224+
if (op.getThreadLocal_())
22242225
p << "thread_local ";
2225-
if (auto unnamedAddr = getUnnamedAddr()) {
2226+
if (auto unnamedAddr = op.getUnnamedAddr()) {
22262227
StringRef str = stringifyUnnamedAddr(*unnamedAddr);
22272228
if (!str.empty())
22282229
p << str << ' ';
22292230
}
2231+
}
2232+
2233+
void GlobalOp::print(OpAsmPrinter &p) {
2234+
printCommonGlobalAndAlias<GlobalOp>(p, *this);
22302235
if (getConstant())
22312236
p << "constant ";
22322237
p.printSymbolName(getSymName());
@@ -2309,16 +2314,16 @@ static ParseResult parseCommonGlobalAndAlias(OpAsmParser &parser,
23092314
parseOptionalLLVMKeyword<LLVM::Visibility, int64_t>(
23102315
parser, result, LLVM::Visibility::Default)));
23112316

2317+
if (succeeded(parser.parseOptionalKeyword("thread_local")))
2318+
result.addAttribute(OpType::getThreadLocal_AttrName(result.name),
2319+
parser.getBuilder().getUnitAttr());
2320+
23122321
// Parse optional UnnamedAddr, default to None.
23132322
result.addAttribute(OpType::getUnnamedAddrAttrName(result.name),
23142323
parser.getBuilder().getI64IntegerAttr(
23152324
parseOptionalLLVMKeyword<UnnamedAddr, int64_t>(
23162325
parser, result, LLVM::UnnamedAddr::None)));
23172326

2318-
if (succeeded(parser.parseOptionalKeyword("thread_local")))
2319-
result.addAttribute(OpType::getThreadLocal_AttrName(result.name),
2320-
parser.getBuilder().getUnitAttr());
2321-
23222327
return success();
23232328
}
23242329

@@ -2581,19 +2586,7 @@ void AliasOp::build(OpBuilder &builder, OperationState &result, Type type,
25812586
}
25822587

25832588
void AliasOp::print(OpAsmPrinter &p) {
2584-
p << ' ' << stringifyLinkage(getLinkage()) << ' ';
2585-
StringRef visibility = stringifyVisibility(getVisibility_());
2586-
if (!visibility.empty())
2587-
p << visibility << ' ';
2588-
2589-
if (std::optional<mlir::LLVM::UnnamedAddr> unnamedAddr = getUnnamedAddr()) {
2590-
StringRef str = stringifyUnnamedAddr(*unnamedAddr);
2591-
if (!str.empty())
2592-
p << str << ' ';
2593-
}
2594-
2595-
if (getThreadLocal_())
2596-
p << "thread_local ";
2589+
printCommonGlobalAndAlias<AliasOp>(p, *this);
25972590

25982591
p.printSymbolName(getSymName());
25992592
p.printOptionalAttrDict((*this)->getAttrs(),

mlir/test/Dialect/LLVMIR/alias.mlir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,12 @@ llvm.mlir.global internal constant @g3() : !llvm.ptr {
130130

131131
llvm.mlir.global private @g30(0 : i32) {dso_local} : i32
132132

133-
llvm.mlir.alias private unnamed_addr thread_local @a30 {dso_local} : i32 {
133+
llvm.mlir.alias private thread_local unnamed_addr @a30 {dso_local} : i32 {
134134
%0 = llvm.mlir.addressof @g30 : !llvm.ptr
135135
llvm.return %0 : !llvm.ptr
136136
}
137137

138-
// CHECK: llvm.mlir.alias private unnamed_addr thread_local @a30 {dso_local} : i32 {
138+
// CHECK: llvm.mlir.alias private thread_local unnamed_addr @a30 {dso_local} : i32 {
139139
// CHECK: %0 = llvm.mlir.addressof @g30 : !llvm.ptr
140140
// CHECK: llvm.return %0 : !llvm.ptr
141141
// CHECK: }

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,3 +1042,6 @@ llvm.func @llvm.aarch64.neon.st3.v8i8.p0(vector<8xi8>, vector<8xi8>, vector<8xi8
10421042

10431043
// CHECK-LABEL: llvm.func @callintrin_voidret
10441044
// CHECK-NEXT: llvm.call_intrinsic "llvm.aarch64.neon.st3.v8i8.p0"(%arg0, %arg1, %arg2, %arg3) : (vector<8xi8>, vector<8xi8>, vector<8xi8>, !llvm.ptr) -> ()
1045+
1046+
llvm.mlir.global internal thread_local unnamed_addr @myglobal(-1 : i32) {addr_space = 0 : i32, alignment = 4 : i64, dso_local} : i32
1047+
// CHECK: llvm.mlir.global internal thread_local unnamed_addr @myglobal(-1 : i32) {addr_space = 0 : i32, alignment = 4 : i64, dso_local} : i32

0 commit comments

Comments
 (0)