Skip to content

Commit 946078f

Browse files
[MLIR][LLVM] Fix llvm.mlir.global mismatching print and parser order (llvm#138986) (#43)
`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. Co-authored-by: Bruno Cardoso Lopes <[email protected]>
1 parent 6d85777 commit 946078f

File tree

3 files changed

+50
-24
lines changed

3 files changed

+50
-24
lines changed

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

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

2199-
void GlobalOp::print(OpAsmPrinter &p) {
2200-
p << ' ' << stringifyLinkage(getLinkage()) << ' ';
2201-
StringRef visibility = stringifyVisibility(getVisibility_());
2199+
template <typename OpType>
2200+
static void printCommonGlobalAndAlias(OpAsmPrinter &p, OpType op) {
2201+
p << ' ' << stringifyLinkage(op.getLinkage()) << ' ';
2202+
StringRef visibility = stringifyVisibility(op.getVisibility_());
22022203
if (!visibility.empty())
22032204
p << visibility << ' ';
2204-
if (getThreadLocal_())
2205+
if (op.getThreadLocal_())
22052206
p << "thread_local ";
2206-
if (auto unnamedAddr = getUnnamedAddr()) {
2207+
if (auto unnamedAddr = op.getUnnamedAddr()) {
22072208
StringRef str = stringifyUnnamedAddr(*unnamedAddr);
22082209
if (!str.empty())
22092210
p << str << ' ';
22102211
}
2212+
}
2213+
2214+
void GlobalOp::print(OpAsmPrinter &p) {
2215+
printCommonGlobalAndAlias<GlobalOp>(p, *this);
22112216
if (getConstant())
22122217
p << "constant ";
22132218
p.printSymbolName(getSymName());
@@ -2271,16 +2276,16 @@ static ParseResult parseCommonGlobalAndAlias(OpAsmParser &parser,
22712276
parseOptionalLLVMKeyword<LLVM::Visibility, int64_t>(
22722277
parser, result, LLVM::Visibility::Default)));
22732278

2279+
if (succeeded(parser.parseOptionalKeyword("thread_local")))
2280+
result.addAttribute(OpType::getThreadLocal_AttrName(result.name),
2281+
parser.getBuilder().getUnitAttr());
2282+
22742283
// Parse optional UnnamedAddr, default to None.
22752284
result.addAttribute(OpType::getUnnamedAddrAttrName(result.name),
22762285
parser.getBuilder().getI64IntegerAttr(
22772286
parseOptionalLLVMKeyword<UnnamedAddr, int64_t>(
22782287
parser, result, LLVM::UnnamedAddr::None)));
22792288

2280-
if (succeeded(parser.parseOptionalKeyword("thread_local")))
2281-
result.addAttribute(OpType::getThreadLocal_AttrName(result.name),
2282-
parser.getBuilder().getUnitAttr());
2283-
22842289
return success();
22852290
}
22862291

@@ -2543,19 +2548,7 @@ void AliasOp::build(OpBuilder &builder, OperationState &result, Type type,
25432548
}
25442549

25452550
void AliasOp::print(OpAsmPrinter &p) {
2546-
p << ' ' << stringifyLinkage(getLinkage()) << ' ';
2547-
StringRef visibility = stringifyVisibility(getVisibility_());
2548-
if (!visibility.empty())
2549-
p << visibility << ' ';
2550-
2551-
if (std::optional<mlir::LLVM::UnnamedAddr> unnamedAddr = getUnnamedAddr()) {
2552-
StringRef str = stringifyUnnamedAddr(*unnamedAddr);
2553-
if (!str.empty())
2554-
p << str << ' ';
2555-
}
2556-
2557-
if (getThreadLocal_())
2558-
p << "thread_local ";
2551+
printCommonGlobalAndAlias<AliasOp>(p, *this);
25592552

25602553
p.printSymbolName(getSymName());
25612554
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: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,3 +1002,36 @@ llvm.func @intrinsic_call_arg_attrs_bundles(%arg0: i32) -> i32 {
10021002
%0 = llvm.call_intrinsic "llvm.riscv.sha256sig0"(%arg0) ["adazdazd"()] {constant} : (i32 {llvm.signext}) -> (i32)
10031003
llvm.return %0 : i32
10041004
}
1005+
1006+
llvm.mlir.global private @blockaddr_global() {addr_space = 0 : i32, dso_local} : !llvm.ptr {
1007+
%0 = llvm.blockaddress <function = @blockaddr_fn, tag = <id = 0>> : !llvm.ptr
1008+
llvm.return %0 : !llvm.ptr
1009+
}
1010+
1011+
// CHECK: llvm.mlir.global private @blockaddr_global() {{.*}}
1012+
// CHECK-NEXT: %{{.*}} = llvm.blockaddress <function = @blockaddr_fn, tag = <id = 0>> : !llvm.ptr
1013+
// CHECK-NEXT: llvm.return %{{.*}} : !llvm.ptr
1014+
1015+
llvm.func @blockaddr_fn() {
1016+
llvm.br ^bb1
1017+
^bb1:
1018+
llvm.blocktag <id = 0>
1019+
llvm.return
1020+
}
1021+
1022+
// CHECK-LABEL: llvm.func @blockaddr_fn
1023+
// CHECK-NEXT: llvm.br ^bb1
1024+
// CHECK-NEXT:^bb1:
1025+
// CHECK-NEXT: llvm.blocktag <id = 0>
1026+
1027+
llvm.func @callintrin_voidret(%arg0: vector<8xi8>, %arg1: vector<8xi8>, %arg2: vector<8xi8>, %arg3: !llvm.ptr) {
1028+
llvm.call_intrinsic "llvm.aarch64.neon.st3.v8i8.p0"(%arg0, %arg1, %arg2, %arg3) : (vector<8xi8>, vector<8xi8>, vector<8xi8>, !llvm.ptr) -> ()
1029+
llvm.return
1030+
}
1031+
llvm.func @llvm.aarch64.neon.st3.v8i8.p0(vector<8xi8>, vector<8xi8>, vector<8xi8>, !llvm.ptr)
1032+
1033+
// CHECK-LABEL: llvm.func @callintrin_voidret
1034+
// CHECK-NEXT: llvm.call_intrinsic "llvm.aarch64.neon.st3.v8i8.p0"(%arg0, %arg1, %arg2, %arg3) : (vector<8xi8>, vector<8xi8>, vector<8xi8>, !llvm.ptr) -> ()
1035+
1036+
llvm.mlir.global internal thread_local unnamed_addr @myglobal(-1 : i32) {addr_space = 0 : i32, alignment = 4 : i64, dso_local} : i32
1037+
// 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)