83 lines · plain
1// RUN: fir-opt %s -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' 2>&1 | FileCheck %s2 3// The test was obtained from 4// bbc test.f90 -emit-fir5// module mod6// real, pointer :: p07// real, allocatable :: alloc8// real, allocatable, target :: t_alloc9// real, target :: t10// real :: v11// end module12// 13// subroutine test(n)14// use mod15// integer :: n16// real r117// p0 => t_alloc18// v = alloc19// r1 = p020// end subroutine test21 22// Checking that aliasing can only happen with an entity with the target attribute23// 24// CHECK-DAG: r1#0 <-> t_alloc#0: NoAlias25// CHECK-DAG: r1#0 <-> alloc#0: NoAlias26// CHECK-DAG: t_alloc#0 <-> alloc#0: NoAlias27// CHECK-DAG: r1#0 <-> p0.ptr#0: NoAlias28// CHECK-DAG: t_alloc#0 <-> p0.ptr#0: MayAlias29// CHECK-DAG: alloc#0 <-> p0.ptr#0: NoAlias30 31fir.global @_QMmodEalloc : !fir.box<!fir.heap<f32>> {32 %0 = fir.zero_bits !fir.heap<f32>33 %1 = fir.embox %0 : (!fir.heap<f32>) -> !fir.box<!fir.heap<f32>>34 fir.has_value %1 : !fir.box<!fir.heap<f32>>35}36fir.global @_QMmodEp0 : !fir.box<!fir.ptr<f32>> {37 %0 = fir.zero_bits !fir.ptr<f32>38 %1 = fir.embox %0 : (!fir.ptr<f32>) -> !fir.box<!fir.ptr<f32>>39 fir.has_value %1 : !fir.box<!fir.ptr<f32>>40}41fir.global @_QMmodEt target : f32 {42 %0 = fir.zero_bits f3243 fir.has_value %0 : f3244}45fir.global @_QMmodEt_alloc target : !fir.box<!fir.heap<f32>> {46 %0 = fir.zero_bits !fir.heap<f32>47 %1 = fir.embox %0 : (!fir.heap<f32>) -> !fir.box<!fir.heap<f32>>48 fir.has_value %1 : !fir.box<!fir.heap<f32>>49}50fir.global @_QMmodEv : f32 {51 %0 = fir.zero_bits f3252 fir.has_value %0 : f3253}54func.func @_QPtest(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}) {55 %0 = fir.dummy_scope : !fir.dscope56 %1 = fir.address_of(@_QMmodEalloc) : !fir.ref<!fir.box<!fir.heap<f32>>>57 %2 = fir.declare %1 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMmodEalloc"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>58 %3 = fir.declare %arg0 dummy_scope %0 {uniq_name = "_QFtestEn"} : (!fir.ref<i32>, !fir.dscope) -> !fir.ref<i32>59 %4 = fir.address_of(@_QMmodEp0) : !fir.ref<!fir.box<!fir.ptr<f32>>>60 %5 = fir.declare %4 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QMmodEp0"} : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>61 %6 = fir.alloca f32 {bindc_name = "r1", uniq_name = "_QFtestEr1"}62 %7 = fir.declare %6 {test.ptr="r1", uniq_name = "_QFtestEr1"} : (!fir.ref<f32>) -> !fir.ref<f32>63 %8 = fir.address_of(@_QMmodEt) : !fir.ref<f32>64 %9 = fir.declare %8 {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QMmodEt"} : (!fir.ref<f32>) -> !fir.ref<f32>65 %10 = fir.address_of(@_QMmodEt_alloc) : !fir.ref<!fir.box<!fir.heap<f32>>>66 %11 = fir.declare %10 {fortran_attrs = #fir.var_attrs<allocatable, target>, uniq_name = "_QMmodEt_alloc"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>67 %12 = fir.address_of(@_QMmodEv) : !fir.ref<f32>68 %13 = fir.declare %12 {uniq_name = "_QMmodEv"} : (!fir.ref<f32>) -> !fir.ref<f32>69 %14 = fir.load %11 : !fir.ref<!fir.box<!fir.heap<f32>>>70 %15 = fir.box_addr %14 {test.ptr="t_alloc"}: (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>71 %16 = fir.embox %15 : (!fir.heap<f32>) -> !fir.box<!fir.ptr<f32>>72 fir.store %16 to %5 : !fir.ref<!fir.box<!fir.ptr<f32>>>73 %17 = fir.load %2 : !fir.ref<!fir.box<!fir.heap<f32>>>74 %18 = fir.box_addr %17 {test.ptr="alloc"} : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>75 %19 = fir.load %18 : !fir.heap<f32>76 fir.store %19 to %13 : !fir.ref<f32>77 %20 = fir.load %5 : !fir.ref<!fir.box<!fir.ptr<f32>>>78 %21 = fir.box_addr %20 {test.ptr="p0.ptr"} : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>79 %22 = fir.load %21 : !fir.ptr<f32>80 fir.store %22 to %7 : !fir.ref<f32>81 return82}83