Index: mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td =================================================================== --- mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -980,7 +980,7 @@ } def LLVM_MetadataOp : LLVM_Op<"metadata", [ - NoRegionArguments, SymbolTable, Symbol + NoRegionArguments, NoTerminator, SymbolTable, Symbol ]> { let arguments = (ins SymbolNameAttr:$sym_name @@ -993,10 +993,18 @@ llvm.metadata @metadata { llvm.access_group @group1 llvm.access_group @group2 - llvm.return } }]; let regions = (region SizedRegion<1>:$body); + + let skipDefaultBuilders = 1; + + let builders = [ + OpBuilder<(ins "StringRef":$symName, + CArg<"bool", "true">:$createBodyBlock, + CArg<"ArrayRef", "{}">:$attributes)> + ]; + let assemblyFormat = "$sym_name attr-dict-with-keyword $body"; let hasRegionVerifier = 1; } @@ -1051,7 +1059,6 @@ llvm.alias_scope_domain @domain { description = "Optional domain description"} llvm.alias_scope @scope1 { domain = @domain } llvm.alias_scope @scope2 { domain = @domain, description = "Optional scope description" } - llvm.return } } @@ -1095,7 +1102,6 @@ Example: llvm.metadata @tbaa { llvm.tbaa_root @tbaa_root_0 {identity = "Simple C/C++ TBAA"} - llvm.return } See the following link for more details: @@ -1148,7 +1154,6 @@ members = [@tbaa_type_desc_5, @tbaa_type_desc_5], offsets = array } - llvm.return } See the following link for more details: @@ -1218,7 +1223,6 @@ base_type = @tbaa_type_desc_6, offset = 0 : i64 } - llvm.return } See the following link for more details: Index: mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp =================================================================== --- mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp +++ mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp @@ -2586,6 +2586,17 @@ // Utilities for LLVM::MetadataOp //===----------------------------------------------------------------------===// +void MetadataOp::build(OpBuilder &builder, OperationState &result, + StringRef symName, bool createBodyBlock, + ArrayRef attributes) { + result.addAttribute(getSymNameAttrName(result.name), + builder.getStringAttr(symName)); + result.attributes.append(attributes.begin(), attributes.end()); + Region *body = result.addRegion(); + if (createBodyBlock) + body->emplaceBlock(); +} + namespace { // A node of the TBAA graph. struct TBAAGraphNode { Index: mlir/lib/Target/LLVMIR/ModuleImport.cpp =================================================================== --- mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -349,8 +349,6 @@ builder.setInsertionPointToEnd(mlirModule.getBody()); tbaaMetadataOp = builder.create(loc, getTBAAMetadataOpName()); - builder.createBlock(&tbaaMetadataOp.getBody()); - builder.create(loc, Value{}); return tbaaMetadataOp; } @@ -516,9 +514,9 @@ return true; }; - // Insert new operations before the terminator. + // Insert new operations at the end of the MetadataOp. OpBuilder::InsertionGuard guard(builder); - builder.setInsertionPoint(&getTBAAMetadataOp().getBody().back().back()); + builder.setInsertionPointToEnd(&getTBAAMetadataOp().getBody().back()); StringAttr metadataOpName = SymbolTable::getSymbolName(getTBAAMetadataOp()); // On the first walk, create SymbolRefAttr's and map them @@ -595,7 +593,7 @@ LogicalResult ModuleImport::convertMetadata() { OpBuilder::InsertionGuard guard(builder); - builder.setInsertionPoint(mlirModule.getBody(), mlirModule.getBody()->end()); + builder.setInsertionPointToEnd(mlirModule.getBody()); for (const llvm::Function &func : llvmModule->functions()) for (const llvm::Instruction &inst : llvm::instructions(func)) { llvm::AAMDNodes nodes = inst.getAAMetadata(); Index: mlir/test/Dialect/LLVMIR/invalid.mlir =================================================================== --- mlir/test/Dialect/LLVMIR/invalid.mlir +++ mlir/test/Dialect/LLVMIR/invalid.mlir @@ -867,7 +867,7 @@ llvm.return } llvm.metadata @metadata { - llvm.return + ^bb1: } } @@ -936,7 +936,7 @@ llvm.return } llvm.metadata @metadata { - llvm.return + ^bb1: } } @@ -949,7 +949,7 @@ llvm.return } llvm.metadata @metadata { - llvm.return + ^bb1: } } @@ -964,7 +964,6 @@ llvm.metadata @metadata { llvm.alias_scope_domain @domain llvm.alias_scope @scope { domain = @domain } - llvm.return } } @@ -998,7 +997,6 @@ } llvm.metadata @metadata { llvm.access_group @group - llvm.return } } @@ -1012,7 +1010,6 @@ } llvm.metadata @metadata { llvm.access_group @group - llvm.return } } Index: mlir/test/Dialect/LLVMIR/roundtrip.mlir =================================================================== --- mlir/test/Dialect/LLVMIR/roundtrip.mlir +++ mlir/test/Dialect/LLVMIR/roundtrip.mlir @@ -504,7 +504,6 @@ llvm.metadata @metadata attributes {test_attribute} { // CHECK: llvm.access_group @group1 llvm.access_group @group1 - llvm.return } } Index: mlir/test/Dialect/LLVMIR/tbaa-invalid.mlir =================================================================== --- mlir/test/Dialect/LLVMIR/tbaa-invalid.mlir +++ mlir/test/Dialect/LLVMIR/tbaa-invalid.mlir @@ -4,7 +4,6 @@ llvm.metadata @__tbaa { llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"} llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64} - llvm.return } llvm.func @tbaa(%arg0: !llvm.ptr) { %0 = llvm.mlir.constant(1 : i8) : i8 @@ -34,7 +33,6 @@ } llvm.metadata @metadata { llvm.access_group @group1 - llvm.return } } @@ -48,7 +46,7 @@ llvm.return } llvm.metadata @metadata { - llvm.return + ^bb1: } } @@ -74,7 +72,6 @@ module { llvm.metadata @__tbaa { llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"} - llvm.return } llvm.func @tbaa() { @@ -89,7 +86,6 @@ module { llvm.metadata @__tbaa { llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"} - llvm.return } llvm.func @tbaa() { @@ -105,7 +101,6 @@ llvm.metadata @__tbaa { // expected-error@below {{expected non-empty "identity"}} llvm.tbaa_root @tbaa_root_0 {id = ""} - llvm.return } } @@ -117,7 +112,6 @@ "llvm.tbaa_type_desc"() {identity = "omnipotent char", members = [@tbaa_root_0], offsets = array, sym_name = "tbaa_type_desc_1"} : () -> () // expected-error@below {{expected the same number of elements in "members" and "offsets": 2 != 1}} "llvm.tbaa_type_desc"() {identity = "agg_t", members = [@tbaa_type_desc_1, @tbaa_type_desc_1], offsets = array, sym_name = "tbaa_type_desc_2"} : () -> () - "llvm.return"() : () -> () }) {sym_name = "__tbaa"} : () -> () }) : () -> () @@ -128,7 +122,6 @@ llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"} // expected-error@below {{expected "base_type" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_root_2'}} llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_2, offset = 0 : i64} - llvm.return } } @@ -139,7 +132,6 @@ llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"} // expected-error@below {{expected "access_type" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_root_2'}} llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_2, base_type = @tbaa_root_0, offset = 0 : i64} - llvm.return } } @@ -152,7 +144,6 @@ llvm.tbaa_type_desc @tbaa_type_desc_2 {id = "long long", members = {<@tbaa_type_desc_1, 0>}} // expected-error@below {{expected "members" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_type_desc_4'}} llvm.tbaa_type_desc @tbaa_type_desc_3 {id = "agg2_t", members = {<@tbaa_type_desc_2, 0>, <@tbaa_type_desc_4, 8>}} - llvm.return } } @@ -164,7 +155,6 @@ llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64} // expected-error@below {{expected "access_type" to reference a symbol from 'llvm.metadata @__tbaa' defined by either 'llvm.tbaa_root' or 'llvm.tbaa_type_desc' while it references '@tbaa_tag_1'}} llvm.tbaa_tag @tbaa_tag_2 {access_type = @tbaa_tag_1, base_type = @tbaa_root_0, offset = 0 : i64} - llvm.return } } @@ -176,6 +166,5 @@ llvm.tbaa_root @tbaa_root_0 {id = "Simple C/C++ TBAA"} llvm.tbaa_type_desc @tbaa_type_desc_1 {id = "omnipotent char", members = {<@tbaa_type_desc_2, 0>}} llvm.tbaa_type_desc @tbaa_type_desc_2 {id = "long long", members = {<@tbaa_type_desc_1, 0>}} - llvm.return } } Index: mlir/test/Dialect/LLVMIR/tbaa-roundtrip.mlir =================================================================== --- mlir/test/Dialect/LLVMIR/tbaa-roundtrip.mlir +++ mlir/test/Dialect/LLVMIR/tbaa-roundtrip.mlir @@ -6,7 +6,6 @@ llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64} llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"} llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64} - llvm.return } llvm.func @tbaa1(%arg0: !llvm.ptr, %arg1: !llvm.ptr) { %0 = llvm.mlir.constant(1 : i8) : i8 @@ -21,7 +20,6 @@ // CHECK: llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64} // CHECK: llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"} // CHECK: llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64} -// CHECK: llvm.return // CHECK: } // CHECK: llvm.func @tbaa1(%[[VAL_0:.*]]: !llvm.ptr, %[[VAL_1:.*]]: !llvm.ptr) { // CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i8) : i8 @@ -40,7 +38,6 @@ llvm.tbaa_type_desc @tbaa_type_desc_5 {id = "int", members = {<@tbaa_type_desc_1, 0>}} llvm.tbaa_type_desc @tbaa_type_desc_6 {id = "agg1_t", members = {<@tbaa_type_desc_5, 0>, <@tbaa_type_desc_5, 4>}} llvm.tbaa_tag @tbaa_tag_7 {access_type = @tbaa_type_desc_5, base_type = @tbaa_type_desc_6, offset = 0 : i64} - llvm.return } llvm.func @tbaa2(%arg0: !llvm.ptr, %arg1: !llvm.ptr) { %0 = llvm.mlir.constant(0 : i32) : i32 @@ -63,7 +60,6 @@ // CHECK: llvm.tbaa_type_desc @tbaa_type_desc_5 {id = "int", members = {<@tbaa_type_desc_1, 0>}} // CHECK: llvm.tbaa_type_desc @tbaa_type_desc_6 {id = "agg1_t", members = {<@tbaa_type_desc_5, 0>, <@tbaa_type_desc_5, 4>}} // CHECK: llvm.tbaa_tag @tbaa_tag_7 {access_type = @tbaa_type_desc_5, base_type = @tbaa_type_desc_6, offset = 0 : i64} -// CHECK: llvm.return // CHECK: } // CHECK: llvm.func @tbaa2(%[[VAL_0:.*]]: !llvm.ptr, %[[VAL_1:.*]]: !llvm.ptr) { // CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i32) : i32 @@ -82,7 +78,6 @@ llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64} llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"} llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64} - llvm.return } llvm.func @tbaa1(%arg0: !llvm.ptr) { %0 = llvm.mlir.constant(1 : i8) : i8 @@ -96,7 +91,6 @@ // CHECK: llvm.tbaa_tag @tbaa_tag_1 {access_type = @tbaa_root_0, base_type = @tbaa_root_0, offset = 0 : i64} // CHECK: llvm.tbaa_root @tbaa_root_2 {id = "Other language TBAA"} // CHECK: llvm.tbaa_tag @tbaa_tag_3 {access_type = @tbaa_root_2, base_type = @tbaa_root_2, offset = 0 : i64} -// CHECK: llvm.return // CHECK: } // CHECK: llvm.func @tbaa1(%[[VAL_0:.*]]: !llvm.ptr) { // CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i8) : i8 Index: mlir/test/Target/LLVMIR/Import/tbaa.ll =================================================================== --- mlir/test/Target/LLVMIR/Import/tbaa.ll +++ mlir/test/Target/LLVMIR/Import/tbaa.ll @@ -7,7 +7,6 @@ ; CHECK-NEXT: llvm.tbaa_tag @[[T0:tbaa_tag_[0-9]+]] {access_type = @[[R0]], base_type = @[[R0]], offset = 0 : i64} ; CHECK-NEXT: llvm.tbaa_root @[[R1:tbaa_root_[0-9]+]] {id = "Other language TBAA"} ; CHECK-NEXT: llvm.tbaa_tag @[[T1:tbaa_tag_[0-9]+]] {access_type = @[[R1]], base_type = @[[R1]], offset = 0 : i64} -; CHECK-NEXT: llvm.return ; CHECK-NEXT: } ; CHECK: llvm.func @tbaa1 ; CHECK: llvm.store %{{.*}}, %{{.*}} { @@ -38,7 +37,6 @@ ; CHECK-NEXT: llvm.tbaa_tag @[[T1:tbaa_tag_[0-9]+]] {access_type = @[[D3:tbaa_type_desc_[0-9]+]], base_type = @[[D4:tbaa_type_desc_[0-9]+]], offset = 0 : i64} ; CHECK-NEXT: llvm.tbaa_type_desc @[[D3]] {id = "int", members = {<@[[D0]], 0>}} ; CHECK-NEXT: llvm.tbaa_type_desc @[[D4]] {id = "agg1_t", members = {<@[[D3]], 0>, <@[[D3]], 4>}} -; CHECK-NEXT: llvm.return ; CHECK-NEXT: } ; CHECK: llvm.func @tbaa2 ; CHECK: llvm.load %{{.*}} { Index: mlir/test/Target/LLVMIR/llvmir.mlir =================================================================== --- mlir/test/Target/LLVMIR/llvmir.mlir +++ mlir/test/Target/LLVMIR/llvmir.mlir @@ -1857,7 +1857,6 @@ llvm.metadata @metadata { llvm.access_group @group1 llvm.access_group @group2 - llvm.return } } @@ -1888,7 +1887,6 @@ llvm.alias_scope @scope1 { domain = @domain, description = "The first scope" } llvm.alias_scope @scope2 { domain = @domain } llvm.alias_scope @scope3 { domain = @domain } - llvm.return } } Index: mlir/test/Target/LLVMIR/tbaa.mlir =================================================================== --- mlir/test/Target/LLVMIR/tbaa.mlir +++ mlir/test/Target/LLVMIR/tbaa.mlir @@ -10,7 +10,6 @@ llvm.tbaa_type_desc @tbaa_type_desc_5 {id = "int", members = {<@tbaa_type_desc_1, 0>}} llvm.tbaa_type_desc @tbaa_type_desc_6 {id = "agg1_t", members = {<@tbaa_type_desc_5, 0>, <@tbaa_type_desc_5, 4>}} llvm.tbaa_tag @tbaa_tag_7 {access_type = @tbaa_type_desc_5, base_type = @tbaa_type_desc_6, offset = 0 : i64, constant} - llvm.return } llvm.func @tbaa2(%arg0: !llvm.ptr, %arg1: !llvm.ptr) { %0 = llvm.mlir.constant(0 : i32) : i32