diff options
author | Tobias Gysi <tobias.gysi@nextsilicon.com> | 2024-02-28 14:45:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-28 14:45:18 +0100 |
commit | e39e30e95237bee53346acf16d197de8fdf4825e (patch) | |
tree | 08f83b9e992395e4b6234872d54ad12f3e492a0d /mlir/test/Target | |
parent | 06f775a82f6f562f8de75053f62c9c0dbeaa67d2 (diff) | |
download | llvm-e39e30e95237bee53346acf16d197de8fdf4825e.zip llvm-e39e30e95237bee53346acf16d197de8fdf4825e.tar.gz llvm-e39e30e95237bee53346acf16d197de8fdf4825e.tar.bz2 |
[mlir][llvm] Fix access group translation (#83257)
This commit fixes the translation of access group metadata to LLVM IR.
Previously, it did not use a temporary metadata node to model the
placeholder of the self-referencing access group nodes. This is
dangerous since, the translation may produce a metadata list with a null
entry that is later on changed changed with a self reference. At the
same time, for example the debug info translation may create the same
uniqued node, which after setting the self-reference the suddenly
references the access group metadata. The commit avoids such breakages.
Diffstat (limited to 'mlir/test/Target')
-rw-r--r-- | mlir/test/Target/LLVMIR/attribute-alias-scopes.mlir | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/mlir/test/Target/LLVMIR/attribute-alias-scopes.mlir b/mlir/test/Target/LLVMIR/attribute-alias-scopes.mlir index 4434aea..fa33955 100644 --- a/mlir/test/Target/LLVMIR/attribute-alias-scopes.mlir +++ b/mlir/test/Target/LLVMIR/attribute-alias-scopes.mlir @@ -59,14 +59,48 @@ llvm.func @alias_scopes(%arg1 : !llvm.ptr) { #alias_scope1 = #llvm.alias_scope<id = distinct[1]<>, domain = #alias_scope_domain> // CHECK-LABEL: @noalias_intr_only -llvm.func @noalias_intr_only(%arg1 : !llvm.ptr) { - %0 = llvm.mlir.constant(0 : i32) : i32 - // CHECK: call void @llvm.experimental.noalias.scope.decl(metadata ![[SCOPES1:[0-9]+]]) +llvm.func @noalias_intr_only() { + // CHECK: call void @llvm.experimental.noalias.scope.decl(metadata ![[SCOPES:[0-9]+]]) llvm.intr.experimental.noalias.scope.decl #alias_scope1 llvm.return } // Check the translated metadata. // CHECK-DAG: ![[DOMAIN:[0-9]+]] = distinct !{![[DOMAIN]], !"The domain"} -// CHECK-DAG: ![[SCOPE1:[0-9]+]] = distinct !{![[SCOPE1]], ![[DOMAIN]]} -// CHECK-DAG: ![[SCOPES1]] = !{![[SCOPE1]]} +// CHECK-DAG: ![[SCOPE:[0-9]+]] = distinct !{![[SCOPE]], ![[DOMAIN]]} +// CHECK-DAG: ![[SCOPES]] = !{![[SCOPE]]} + +// ----- + +// This test ensures the alias scope translation creates a temporary metadata +// node as a placeholder for self-references. Without this, the debug info +// translation of a type list with a null entry could inadvertently reference +// access group metadata. This occurs when both translations generate a metadata +// list with a null entry, which are then uniqued to the same metadata node. +// The access group translation subsequently updates the null entry to a +// self-reference, which causes the type list to reference the access +// group node as well. The use of a temporary placeholder node avoids the issue. + +#alias_scope_domain = #llvm.alias_scope_domain<id = distinct[0]<>> +#alias_scope = #llvm.alias_scope<id = distinct[1]<>, domain = #alias_scope_domain> + +#di_null_type = #llvm.di_null_type +#di_subroutine_type = #llvm.di_subroutine_type<types = #di_null_type> +#di_file = #llvm.di_file<"attribute-alias-scope.mlir" in ""> +#di_compile_unit = #llvm.di_compile_unit<id = distinct[3]<>, sourceLanguage = DW_LANG_C11, file = #di_file, isOptimized = true, emissionKind = Full> +#di_subprogram = #llvm.di_subprogram<id = distinct[2]<>, compileUnit = #di_compile_unit, scope = #di_file, file = #di_file, subprogramFlags = "Definition", type = #di_subroutine_type> + +// CHECK-LABEL: @self_reference +llvm.func @self_reference() { + // CHECK: call void @llvm.experimental.noalias.scope.decl(metadata ![[SCOPES:[0-9]+]]) + llvm.intr.experimental.noalias.scope.decl #alias_scope + llvm.return +} loc(fused<#di_subprogram>[unknown]) + +// Check that the translated subroutine types do not reference the access group +// domain since both of them are created as metadata list with a null entry. +// CHECK-DAG: ![[DOMAIN:[0-9]+]] = distinct !{![[DOMAIN]]} +// CHECK-DAG: ![[SCOPE:[0-9]+]] = distinct !{![[SCOPE]], ![[DOMAIN]]} +// CHECK-DAG: ![[SCOPES]] = !{![[SCOPE]]} +// CHECK-DAG: = !DISubroutineType(types: ![[TYPES:[0-9]+]]) +// CHECK-DAG: ![[TYPES]] = !{null} |