blob: c1f49d2f4a74ad247ed9fc36d5f1bce0b45af37a [file] [log] [blame]
! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone %s -o - | FileCheck %s
! Simple test that checks that metadata for `t0` is only duplicated once.
! The difficulty is that at the mlir::LLVM::DITypeAttr, because of the
! lack of MLIR attribute true recursion, the mlir::LLVM::DITypeAttr for
! `t0` inside `t1` is special because it is only valid when found
! in an mlir::LLVM::DITypeAttr tree under `base` (it will point to `base`
! via an integer id that is only meanigfu;l when a node with such id has
! been traversed).
! A different node has to be created for `t0` usage in `x0` (will
! point to the actual mlir::LLVM::DITypeAttr for `base` instead of
! an integer id since the cycle is already "taken care of" in `base`
! definition).
! However, the same special `t0` node can be used for both `x1_1` and
! `x1_2` components because they are both under `base` in the
! mlir::LLVM::DITypeAttr tree definition. This used to not be the case,
! leading to a lot of duplicate mlir::LLVM::DITypeAttr and actual LLVM IR
! metadata, causing noticeable compilation slowdowns in apps with non trivial
! derived types.
subroutine duplicate_cycle_branch()
type t0
type(base), pointer :: x
end type
type t1
type(t0) :: x1_1
type(t0) :: x1_2
end type
type base
type(t1) :: x_base
end type
type(base) :: x
type(t0) :: x0
call bar(x, x0)
end subroutine
! CHECK: distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t0",
! CHECK: distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t0",
! CHECK-NOT: distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t0",