diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index caecc0f774155..412a5f76d5753 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -677,10 +677,10 @@ llvm::Constant *mlir::LLVM::detail::getLLVMConstant( } } } - // std::vector is used here to accomodate large number of elements that - // exceed SmallVector capacity. - std::vector constants(numElements, child); - return llvm::ConstantArray::get(arrayType, constants); + // std::vector is used here to accomodate large number of elements that + // exceed SmallVector capacity. + std::vector constants(numElements, child); + return llvm::ConstantArray::get(arrayType, constants); } } @@ -2131,8 +2131,16 @@ LogicalResult ModuleTranslation::createTBAAMetadata() { // LLVM metadata instances. AttrTypeWalker walker; walker.addWalk([&](TBAARootAttr root) { - tbaaMetadataMapping.insert( - {root, llvm::MDNode::get(ctx, llvm::MDString::get(ctx, root.getId()))}); + llvm::MDNode *node; + if (StringAttr id = root.getId()) { + node = llvm::MDNode::get(ctx, llvm::MDString::get(ctx, id)); + } else { + // Anonymous root nodes are self-referencing. + auto selfRef = llvm::MDNode::getTemporary(ctx, {}); + node = llvm::MDNode::get(ctx, {selfRef.get()}); + node->replaceOperandWith(0, node); + } + tbaaMetadataMapping.insert({root, node}); }); walker.addWalk([&](TBAATypeDescriptorAttr descriptor) { diff --git a/mlir/test/Target/LLVMIR/anonymous-tbaa.mlir b/mlir/test/Target/LLVMIR/anonymous-tbaa.mlir new file mode 100644 index 0000000000000..b54bfe47e0807 --- /dev/null +++ b/mlir/test/Target/LLVMIR/anonymous-tbaa.mlir @@ -0,0 +1,21 @@ +// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s + +#tbaa_root_0 = #llvm.tbaa_root<> +#tbaa_type_desc_1 = #llvm.tbaa_type_desc}> +#tbaa_type_desc_2 = #llvm.tbaa_type_desc}> +#tbaa_tag_3 = #llvm.tbaa_tag + +// CHECK: define void @tbaa_anonymous_root(ptr %{{.*}}) { +// CHECK: %{{.*}} = load i64, ptr %{{.*}}, align 4, !tbaa ![[TAG:[0-9]+]] +// CHECK: ret void +// CHECK: } +// CHECK: !llvm.module.flags = !{![[FLAGS:[0-9]+]]} +// CHECK: ![[FLAGS]] = !{i32 2, !"Debug Info Version", i32 3} +// CHECK: ![[TAG]] = !{![[TYPE:[0-9]+]], ![[TYPE]], i64 0} +// CHECK: ![[TYPE]] = !{!"long long", ![[BASE:[0-9]+]], i64 0} +// CHECK: ![[BASE]] = !{!"omnipotent char", ![[ROOT:[0-9]+]], i64 0} +// CHECK: ![[ROOT]] = distinct !{![[ROOT]]} +llvm.func @tbaa_anonymous_root(%arg0: !llvm.ptr) { + %0 = llvm.load %arg0 {tbaa = [#tbaa_tag_3]} : !llvm.ptr -> i64 + llvm.return +}