// RUN: fir-opt %s -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' 2>&1 | FileCheck %s // The test was obtained from // bbc test.f90 -emit-fir // module mod // real, pointer :: p0 // real, allocatable :: alloc // real, allocatable, target :: t_alloc // real, target :: t // real :: v // end module // // subroutine test(n) // use mod // integer :: n // real r1 // p0 => t_alloc // v = alloc // r1 = p0 // end subroutine test // Checking that aliasing can only happen with an entity with the target attribute // // CHECK-DAG: r1#0 <-> t_alloc#0: NoAlias // CHECK-DAG: r1#0 <-> alloc#0: NoAlias // CHECK-DAG: t_alloc#0 <-> alloc#0: NoAlias // CHECK-DAG: r1#0 <-> p0.ptr#0: NoAlias // CHECK-DAG: t_alloc#0 <-> p0.ptr#0: MayAlias // CHECK-DAG: alloc#0 <-> p0.ptr#0: NoAlias fir.global @_QMmodEalloc : !fir.box> { %0 = fir.zero_bits !fir.heap %1 = fir.embox %0 : (!fir.heap) -> !fir.box> fir.has_value %1 : !fir.box> } fir.global @_QMmodEp0 : !fir.box> { %0 = fir.zero_bits !fir.ptr %1 = fir.embox %0 : (!fir.ptr) -> !fir.box> fir.has_value %1 : !fir.box> } fir.global @_QMmodEt target : f32 { %0 = fir.zero_bits f32 fir.has_value %0 : f32 } fir.global @_QMmodEt_alloc target : !fir.box> { %0 = fir.zero_bits !fir.heap %1 = fir.embox %0 : (!fir.heap) -> !fir.box> fir.has_value %1 : !fir.box> } fir.global @_QMmodEv : f32 { %0 = fir.zero_bits f32 fir.has_value %0 : f32 } func.func @_QPtest(%arg0: !fir.ref {fir.bindc_name = "n"}) { %0 = fir.dummy_scope : !fir.dscope %1 = fir.address_of(@_QMmodEalloc) : !fir.ref>> %2 = fir.declare %1 {fortran_attrs = #fir.var_attrs, uniq_name = "_QMmodEalloc"} : (!fir.ref>>) -> !fir.ref>> %3 = fir.declare %arg0 dummy_scope %0 {uniq_name = "_QFtestEn"} : (!fir.ref, !fir.dscope) -> !fir.ref %4 = fir.address_of(@_QMmodEp0) : !fir.ref>> %5 = fir.declare %4 {fortran_attrs = #fir.var_attrs, uniq_name = "_QMmodEp0"} : (!fir.ref>>) -> !fir.ref>> %6 = fir.alloca f32 {bindc_name = "r1", uniq_name = "_QFtestEr1"} %7 = fir.declare %6 {test.ptr="r1", uniq_name = "_QFtestEr1"} : (!fir.ref) -> !fir.ref %8 = fir.address_of(@_QMmodEt) : !fir.ref %9 = fir.declare %8 {fortran_attrs = #fir.var_attrs, uniq_name = "_QMmodEt"} : (!fir.ref) -> !fir.ref %10 = fir.address_of(@_QMmodEt_alloc) : !fir.ref>> %11 = fir.declare %10 {fortran_attrs = #fir.var_attrs, uniq_name = "_QMmodEt_alloc"} : (!fir.ref>>) -> !fir.ref>> %12 = fir.address_of(@_QMmodEv) : !fir.ref %13 = fir.declare %12 {uniq_name = "_QMmodEv"} : (!fir.ref) -> !fir.ref %14 = fir.load %11 : !fir.ref>> %15 = fir.box_addr %14 {test.ptr="t_alloc"}: (!fir.box>) -> !fir.heap %16 = fir.embox %15 : (!fir.heap) -> !fir.box> fir.store %16 to %5 : !fir.ref>> %17 = fir.load %2 : !fir.ref>> %18 = fir.box_addr %17 {test.ptr="alloc"} : (!fir.box>) -> !fir.heap %19 = fir.load %18 : !fir.heap fir.store %19 to %13 : !fir.ref %20 = fir.load %5 : !fir.ref>> %21 = fir.box_addr %20 {test.ptr="p0.ptr"} : (!fir.box>) -> !fir.ptr %22 = fir.load %21 : !fir.ptr fir.store %22 to %7 : !fir.ref return }